@sema-agent/core
Version:
Stateless, task-oriented AI agent core
352 lines (351 loc) • 9.22 kB
JSON
{
"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"
}