UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

352 lines (351 loc) • 9.22 kB
{ "repo": "core", "version": "7.33.0", "from": "a36eb21ebe39f5191f30102623e1570c3eb77f41", "to": "v7.33.0", "added": [], "removed": [], "changed": [], "narrowed": [ { "id": "F4", "source": "behaviorFlips.summary", "text": "Behaviour change with a NARROWING (#1121; +0 exports): ONE resolution chain for every model-call watchdog (`resolveWatchdogMs`): construction config (an explicit `0` is OFF) > per-call advisory > the engine default constant (`STALL_FIRST_BYTE_MS` 300 000 + the upload allowance / `STALL_FIRST_TOKEN_MS` 600 000 / `STALL_IDLE_MS` 300 000, F5). The old third level \"both absent ⇒ off\" is retired: a first-party brain built with no timeout fields and driven without the Runner's advisory (a bare SDK brain; compaction and side-query calls) now arms all three — a call that never gets headers ends after 301 s + a widened 601 s retry, one with no delta after 600 s, silence after a delta after 300 s (the same 300 s the transport's body clock used to give such a call, now the engine's own watchdog announcing a `stall` instead of a transport failure; an Anthropic `ping` is not a content delta, so with text already streamed the call is committed by tier A, \"Response stalled mid-stream. The response above may be incomplete.\"). `0` on a watchdog now means no bound at all on that segment, the transport's included (F2). NARROWING: such a brain whose fetch keeps no clock of its own (a `fetchImpl` that is not undici's, a test double) waited indefinitely on every segment and is now cut at those defaults; on Node's fetch it was bounded by the transport's 300 s clocks — the header cut reported `transport` and re-sent through the shared ladder up to `maxRetries` times — and is now bounded by the engine's (headers 301 s + one widened 601 s retry; first token 600 s, wider; idle 300 s, the same bound under a new announcer). WHO IS HURT: a deployment that constructed a first-party brain with no timeout fields and relied on it having none. COMPENSATION: `0` on the field it wants off, or a larger value." } ], "closedSetMembers": [], "closedSetsUnreadable": [], "typeKeys": [ { "type": "AnthropicBrainConfig", "at": [ "src/brain/anthropic.ts:25" ], "added": [ "firstByteTimeoutMs" ], "addedDetail": [ { "key": "firstByteTimeoutMs", "optional": true } ], "addedRequired": [], "removed": [ "connectTimeoutMs" ], "breaking": true, "criteriaCovered": true }, { "type": "BrainTimeoutConfig", "at": [ "src/brain/timeout.ts:166" ], "added": [ "firstByteTimeoutMs" ], "addedDetail": [ { "key": "firstByteTimeoutMs", "optional": true } ], "addedRequired": [], "removed": [ "connectTimeoutMs" ], "breaking": true, "criteriaCovered": true }, { "type": "OpenAIBrainConfig", "at": [ "src/brain/openai.ts:27" ], "added": [ "firstByteTimeoutMs" ], "addedDetail": [ { "key": "firstByteTimeoutMs", "optional": true } ], "addedRequired": [], "removed": [ "connectTimeoutMs" ], "breaking": true, "criteriaCovered": true }, { "type": "OpenResponsesBrainConfig", "at": [ "src/brain/open-responses.ts:101" ], "added": [ "firstByteTimeoutMs" ], "addedDetail": [ { "key": "firstByteTimeoutMs", "optional": true } ], "addedRequired": [], "removed": [ "connectTimeoutMs" ], "breaking": true, "criteriaCovered": true }, { "type": "StallTimeouts", "at": [ "src/engine/llm/types.ts:70" ], "via": "CompleteSimpleFn.SimpleStreamOptions.StreamOptions.stallTimeouts", "added": [ "firstByteMs" ], "addedDetail": [ { "key": "firstByteMs", "optional": true } ], "addedRequired": [], "removed": [ "connectMs" ], "breaking": true, "criteriaCovered": false }, { "type": "StreamEngineConfig", "at": [ "src/brain/stream-engine.ts:45" ], "via": "AnthropicBrainConfig.StreamEngineConfig", "added": [ "firstByteTimeoutMs" ], "addedDetail": [ { "key": "firstByteTimeoutMs", "optional": true } ], "addedRequired": [], "removed": [ "connectTimeoutMs" ], "breaking": true, "criteriaCovered": false } ], "typeKeysUnreadableArms": [], "typeKeysFlattenedCount": 217, "declarationMoves": [], "mintMoves": [], "criteriaObserves": [ { "kind": "taskEventField", "name": "status.attempt", "assertions": [ "G1.b" ] }, { "kind": "taskEventField", "name": "status.detail", "assertions": [ "G1.a" ] }, { "kind": "taskEventField", "name": "status.errClass", "assertions": [ "G1.a" ] }, { "kind": "taskEventField", "name": "status.maxRetries", "assertions": [ "G1.b" ] }, { "kind": "taskEventField", "name": "status.timeoutMs", "assertions": [ "G1.a", "G2.a" ] }, { "kind": "typeMember", "name": "AnthropicBrainConfig.firstByteTimeoutMs", "assertions": [ "G3.a" ] }, { "kind": "typeMember", "name": "AssistantMessage.errorMessage", "assertions": [ "G3.a", "G4.a" ] }, { "kind": "typeMember", "name": "AssistantMessage.partialFinalized", "assertions": [ "G4.c" ] }, { "kind": "typeMember", "name": "AssistantMessage.stopReason", "assertions": [ "G3.a", "G4.a", "G4.b" ] }, { "kind": "typeMember", "name": "Brain.stream", "assertions": [ "G3.a", "G4.a", "G4.c" ] }, { "kind": "typeMember", "name": "BrainTimeoutConfig.firstByteTimeoutMs", "assertions": [ "G1.a", "G2.a", "G3.a", "G4.a", "G4.b" ] }, { "kind": "typeMember", "name": "BrainTimeoutConfig.firstTokenTimeoutMs", "assertions": [ "G2.a", "G4.a", "G4.b" ] }, { "kind": "typeMember", "name": "BrainTimeoutConfig.idleTimeoutMs", "assertions": [ "G4.b", "G4.c" ] }, { "kind": "typeMember", "name": "OpenAIBrainConfig.fetchImpl", "assertions": [ "G1.b", "G2.a", "G2.b" ] }, { "kind": "typeMember", "name": "OpenAIBrainConfig.firstByteTimeoutMs", "assertions": [ "G1.a" ] }, { "kind": "typeMember", "name": "OpenAIBrainConfig.maxRetries", "assertions": [ "G1.b" ] }, { "kind": "typeMember", "name": "OpenResponsesBrainConfig.firstByteTimeoutMs", "assertions": [ "G3.a" ] }, { "kind": "typeMember", "name": "RunWorkflowOptions.stallMs", "assertions": [ "G5.a" ] }, { "kind": "typeMember", "name": "RunWorkflowOptions.timers", "assertions": [ "G5.a" ] }, { "kind": "typeMember", "name": "TaskRegistry.list", "assertions": [ "G3.b" ] }, { "kind": "typeMember", "name": "TaskRegistry.runningShellIds", "assertions": [ "G3.b" ] }, { "kind": "typeMember", "name": "TaskResult.result", "assertions": [ "G2.b", "G4.c" ] }, { "kind": "typeMember", "name": "TaskResult.terminal", "assertions": [ "G1.a", "G1.b", "G2.a", "G2.b", "G4.c" ] } ], "consumersHint": { "cli": [], "server": [], "sdk": [], "note": "scanned cli@4e593722 server@907e1c76 sdk@4fe310e — a name listed is MENTIONED there today, which is evidence of consumption, not proof of it. Ledger files (**/docs/core-consumption/**, **/docs/wire-consumption/**, **/*LEDGER*.json) are not evidence of use — server: 4 name(s) matched ONLY in bookkeeping files and were set aside (AnthropicBrainConfig, BrainTimeoutConfig, OpenAIBrainConfig, OpenResponsesBrainConfig)" }, "breakingCount": 6, "breakingItems": [ "type lost keys: AnthropicBrainConfig -connectTimeoutMs", "type lost keys: BrainTimeoutConfig -connectTimeoutMs", "type lost keys: OpenAIBrainConfig -connectTimeoutMs", "type lost keys: OpenResponsesBrainConfig -connectTimeoutMs", "type lost keys: StallTimeouts -connectMs", "type lost keys: StreamEngineConfig -connectTimeoutMs" ], "toResolvedAt": "0ce5bb4b0d729b70f84bdd3ed2ea93bbdaedb68a" }