@taco-ai/pi-harness 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +11 -3
  2. package/README.zh-CN.md +10 -3
  3. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  4. package/dist/harness/compaction/branch-summarization.js +2 -1
  5. package/dist/harness/compaction/branch-summarization.js.map +1 -1
  6. package/dist/harness/compaction/compaction.d.ts +1 -1
  7. package/dist/harness/compaction/compaction.d.ts.map +1 -1
  8. package/dist/harness/compaction/compaction.js +8 -6
  9. package/dist/harness/compaction/compaction.js.map +1 -1
  10. package/dist/harness/context.d.ts +4 -1
  11. package/dist/harness/context.d.ts.map +1 -1
  12. package/dist/harness/context.js +14 -4
  13. package/dist/harness/context.js.map +1 -1
  14. package/dist/harness/execution/assistant.d.ts +1 -1
  15. package/dist/harness/execution/assistant.d.ts.map +1 -1
  16. package/dist/harness/execution/assistant.js +30 -7
  17. package/dist/harness/execution/assistant.js.map +1 -1
  18. package/dist/harness/execution/model-telemetry.d.ts +4 -0
  19. package/dist/harness/execution/model-telemetry.d.ts.map +1 -0
  20. package/dist/harness/execution/model-telemetry.js +9 -0
  21. package/dist/harness/execution/model-telemetry.js.map +1 -0
  22. package/dist/harness/pico3/types.d.ts +5 -2
  23. package/dist/harness/pico3/types.d.ts.map +1 -1
  24. package/dist/harness/pico3/types.js.map +1 -1
  25. package/dist/harness/runtime/drive/deferred.d.ts.map +1 -1
  26. package/dist/harness/runtime/drive/deferred.js +28 -24
  27. package/dist/harness/runtime/drive/deferred.js.map +1 -1
  28. package/dist/harness/runtime/drive/generation.js +2 -2
  29. package/dist/harness/runtime/drive/generation.js.map +1 -1
  30. package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -1
  31. package/dist/harness/runtime/drive/reconcile.js +4 -4
  32. package/dist/harness/runtime/drive/reconcile.js.map +1 -1
  33. package/dist/harness/runtime/drive/structural.js +2 -2
  34. package/dist/harness/runtime/drive/structural.js.map +1 -1
  35. package/dist/harness/telemetry.d.ts +24 -0
  36. package/dist/harness/telemetry.d.ts.map +1 -1
  37. package/dist/harness/telemetry.js +7 -0
  38. package/dist/harness/telemetry.js.map +1 -1
  39. package/docs/telemetry-schema.md +26 -0
  40. package/package.json +4 -4
@@ -1,5 +1,6 @@
1
- import { getTelemetryContext, withAbortSignal } from "../../context.js";
1
+ import { withAbortSignal } from "../../context.js";
2
2
  import { consumeAssistantStream } from "../../execution/assistant.js";
3
+ import { withModelTelemetry } from "../../execution/model-telemetry.js";
3
4
  import { applyStreamOptionsPatch } from "../../hooks.js";
4
5
  import { SessionInvariantError } from "../../session/session.js";
5
6
  import { operationScopeOf, } from "../../session/types.js";
@@ -114,29 +115,32 @@ async function publishPollIntent(lane, drive, deferred, prepared, recovery) {
114
115
  async function performDeferredPoll(lane, drive, prepared, intent, recovery) {
115
116
  const response = openAssistantResponse(lane, drive, intent.responseEntryId, recovery);
116
117
  let metadata = {};
117
- const admitted = withAbortSignal(drive.gate.signal, drive.context);
118
- const stream = drive.gate.admit(() => lane.models.streamDeferred(prepared.model, prepared.source, {
119
- wait: 0,
120
- signal: admitted.abortSignal,
121
- telemetryContext: getTelemetryContext(admitted),
122
- timeoutMs: prepared.streamOptions.timeoutMs,
123
- maxRetries: prepared.streamOptions.maxRetries,
124
- maxRetryDelayMs: prepared.streamOptions.maxRetryDelayMs,
125
- headers: prepared.streamOptions.headers,
126
- onPayload: async (payload, requestModel) => {
127
- const result = await lane.hooks.runWithGate("before_payload", { lane: lane.name, runId: drive.operationId, model: requestModel, payload }, drive.gate, drive.context);
128
- return result?.payload;
129
- },
130
- onResponse: (response) => {
131
- metadata = { status: response.status, headers: response.headers };
132
- },
133
- }));
134
- try {
135
- return await consumeAssistantStream(stream, response.observer, (message, context) => response.afterResponse(message, metadata, context), drive.context);
136
- }
137
- finally {
138
- await response.close();
139
- }
118
+ return withModelTelemetry(drive.context, async (requestContext) => {
119
+ const controller = new AbortController();
120
+ const admitted = withAbortSignal(controller.signal, withAbortSignal(drive.gate.signal, requestContext));
121
+ const stream = drive.gate.admit(() => lane.models.streamDeferred(prepared.model, prepared.source, {
122
+ wait: 0,
123
+ signal: admitted.abortSignal,
124
+ telemetry: admitted.telemetry,
125
+ timeoutMs: prepared.streamOptions.timeoutMs,
126
+ maxRetries: prepared.streamOptions.maxRetries,
127
+ maxRetryDelayMs: prepared.streamOptions.maxRetryDelayMs,
128
+ headers: prepared.streamOptions.headers,
129
+ onPayload: async (payload, requestModel) => {
130
+ const result = await lane.hooks.runWithGate("before_payload", { lane: lane.name, runId: drive.operationId, model: requestModel, payload }, drive.gate, requestContext);
131
+ return result?.payload;
132
+ },
133
+ onResponse: (response) => {
134
+ metadata = { status: response.status, headers: response.headers };
135
+ },
136
+ }));
137
+ try {
138
+ return await consumeAssistantStream(stream, response.observer, (message, context) => response.afterResponse(message, metadata, context), requestContext, (error) => controller.abort(error));
139
+ }
140
+ finally {
141
+ await response.close();
142
+ }
143
+ });
140
144
  }
141
145
  async function pollDeferred(lane, drive, expected, recovery) {
142
146
  const prepared = await prepareDeferredPoll(lane, drive, expected);
@@ -1 +1 @@
1
- {"version":3,"file":"deferred.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/deferred.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, DeferredHandle, Model } from \"@earendil-works/pi-ai\";\nimport { type Context, getTelemetryContext, withAbortSignal } from \"../../context.ts\";\nimport { consumeAssistantStream } from \"../../execution/assistant.ts\";\nimport { applyStreamOptionsPatch } from \"../../hooks.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport {\n\ttype DeferredEffectPendingOperation,\n\ttype DeferredSuspendedOperation,\n\ttype LaneConfiguration,\n\ttype OperationError,\n\ttype OperationScope,\n\toperationScopeOf,\n\ttype SessionReader,\n\ttype SettledAssistantMessage,\n} from \"../../session/types.ts\";\nimport { deleteList, pendingAssistantFrames } from \"../../session/values.ts\";\nimport type { AgentHarnessStreamOptions } from \"../../types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport type { ContinueOperationResult, Drive, ProcedureResult } from \"../types.ts\";\nimport { openAssistantResponse, publishConfigurationFailure, publishResponse } from \"./response.ts\";\n\ntype DeferredLeaf = DeferredSuspendedOperation | DeferredEffectPendingOperation;\n/** Deferred effect payload without the run-wide scope fields. */\ntype EffectPendingFields = Omit<DeferredEffectPendingOperation, keyof OperationScope>;\n\ntype PreparedDeferredPoll = {\n\tkind: \"ready\";\n\tsource: DeferredHandle;\n\tmodel: Model<Api>;\n\tpoll: number;\n\tstreamOptions: AgentHarnessStreamOptions;\n};\n\ntype DeferredPreparation =\n\t| PreparedDeferredPoll\n\t| { kind: \"cancel_requested\" }\n\t| { kind: \"waiting\"; source: DeferredHandle }\n\t| { kind: \"configuration_failure\" };\n\nfunction configurationError(identity: LaneConfiguration[\"model\"]): OperationError {\n\treturn {\n\t\tcode: \"model_unavailable\",\n\t\tmessage: \"The configured model is unavailable in this process\",\n\t\tdetails: identity,\n\t};\n}\n\nexport async function readDeferredSourceHandle(\n\treader: SessionReader,\n\tdeferred: DeferredLeaf,\n\tcontext: Context,\n): Promise<DeferredHandle> {\n\tconst source = (await reader.getEntries([deferred.sourceEntryId], context)).get(deferred.sourceEntryId);\n\tif (\n\t\tsource?.type !== \"message\" ||\n\t\tsource.message.role !== \"assistant\" ||\n\t\tsource.message.stopReason !== \"deferred\" ||\n\t\tsource.message.deferred === undefined\n\t) {\n\t\tthrow new SessionInvariantError(`Deferred source ${deferred.sourceEntryId} is missing its assistant handle`);\n\t}\n\tconst handle = source.message.deferred;\n\tconst identity = deferred.configuration.model;\n\tif (\n\t\thandle.id.length === 0 ||\n\t\thandle.provider !== identity.provider ||\n\t\thandle.modelId !== identity.modelId ||\n\t\thandle.api !== source.message.api\n\t) {\n\t\tthrow new SessionInvariantError(`Deferred source ${deferred.sourceEntryId} has an invalid handle`);\n\t}\n\treturn handle;\n}\n\nasync function readSourceHandle<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredLeaf,\n): Promise<ContinueOperationResult<DeferredHandle>> {\n\treturn lane.continueOperation(\n\t\tdeferred,\n\t\tasync (_state, _current, _meta, reader) => ({\n\t\t\tkind: \"return\",\n\t\t\tresult: await readDeferredSourceHandle(reader, deferred, drive.context),\n\t\t}),\n\t\tdrive.context,\n\t);\n}\n\nasync function prepareDeferredPoll<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\texpected: DeferredLeaf,\n): Promise<DeferredPreparation> {\n\tconst source = await readSourceHandle(lane, drive, expected);\n\tif (source.kind === \"cancel_requested\") return source;\n\tif (drive.deferredPermits === 0) return { kind: \"waiting\", source: source.value };\n\n\tconst identity = expected.configuration.model;\n\tconst model = lane.models.getModel(identity.provider, identity.modelId);\n\tif (model === undefined) return { kind: \"configuration_failure\" };\n\tconst baseOptions: AgentHarnessStreamOptions = { ...expected.streamOptions, deferred: false };\n\tconst poll = expected.at === \"deferred.suspended\" ? expected.poll + 1 : expected.poll;\n\tconst beforeRequest = await lane.hooks.runWithGate(\n\t\t\"before_request\",\n\t\t{\n\t\t\tlane: lane.name,\n\t\t\trunId: drive.operationId,\n\t\t\tmodel,\n\t\t\tstep: \"deferred\",\n\t\t\tattempt: poll,\n\t\t\tstreamOptions: baseOptions,\n\t\t},\n\t\tdrive.gate,\n\t\tdrive.context,\n\t);\n\treturn {\n\t\tkind: \"ready\",\n\t\tsource: source.value,\n\t\tmodel,\n\t\tpoll,\n\t\tstreamOptions: {\n\t\t\t...(beforeRequest?.streamOptions === undefined\n\t\t\t\t? baseOptions\n\t\t\t\t: applyStreamOptionsPatch(baseOptions, beforeRequest.streamOptions)),\n\t\t\tdeferred: false,\n\t\t},\n\t};\n}\n\nasync function publishPollIntent<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredLeaf,\n\tprepared: PreparedDeferredPoll,\n\trecovery: boolean,\n): Promise<ContinueOperationResult<DeferredEffectPendingOperation>> {\n\tconst at = Date.now();\n\tconst next: EffectPendingFields = {\n\t\tat: \"deferred.effect_pending\",\n\t\tstepId: deferred.stepId,\n\t\tsourceEntryId: deferred.sourceEntryId,\n\t\tpoll: prepared.poll,\n\t\tresponseEntryId: lane.session.idGenerator.next(at),\n\t\tusageId: lane.session.idGenerator.next(at),\n\t\tconfiguration: deferred.configuration,\n\t\tstreamOptions: deferred.streamOptions,\n\t};\n\treturn lane.continueOperation(\n\t\tdeferred,\n\t\t(_state, current) => {\n\t\t\tconst nextState: DeferredEffectPendingOperation = { ...operationScopeOf(current), ...next };\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites:\n\t\t\t\t\tdeferred.at === \"deferred.effect_pending\"\n\t\t\t\t\t\t? [deleteList(pendingAssistantFrames(drive.operationId, deferred.responseEntryId))]\n\t\t\t\t\t\t: [],\n\t\t\t\toperationState: nextState,\n\t\t\t\tmaterialize: () => {\n\t\t\t\t\tdrive.deferredPermits--;\n\t\t\t\t\treturn nextState;\n\t\t\t\t},\n\t\t\t\tevents: () => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"run_resume\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"turn_start\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: `${next.stepId}:poll:${next.poll}`,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function performDeferredPoll<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tprepared: PreparedDeferredPoll,\n\tintent: DeferredEffectPendingOperation,\n\trecovery: boolean,\n): Promise<SettledAssistantMessage> {\n\tconst response = openAssistantResponse(lane, drive, intent.responseEntryId, recovery);\n\tlet metadata: { status?: number; headers?: Record<string, string> } = {};\n\tconst admitted = withAbortSignal(drive.gate.signal, drive.context);\n\tconst stream = drive.gate.admit(() =>\n\t\tlane.models.streamDeferred(prepared.model, prepared.source, {\n\t\t\twait: 0,\n\t\t\tsignal: admitted.abortSignal,\n\t\t\ttelemetryContext: getTelemetryContext(admitted),\n\t\t\ttimeoutMs: prepared.streamOptions.timeoutMs,\n\t\t\tmaxRetries: prepared.streamOptions.maxRetries,\n\t\t\tmaxRetryDelayMs: prepared.streamOptions.maxRetryDelayMs,\n\t\t\theaders: prepared.streamOptions.headers,\n\t\t\tonPayload: async (payload, requestModel) => {\n\t\t\t\tconst result = await lane.hooks.runWithGate(\n\t\t\t\t\t\"before_payload\",\n\t\t\t\t\t{ lane: lane.name, runId: drive.operationId, model: requestModel, payload },\n\t\t\t\t\tdrive.gate,\n\t\t\t\t\tdrive.context,\n\t\t\t\t);\n\t\t\t\treturn result?.payload;\n\t\t\t},\n\t\t\tonResponse: (response) => {\n\t\t\t\tmetadata = { status: response.status, headers: response.headers };\n\t\t\t},\n\t\t}),\n\t);\n\n\ttry {\n\t\treturn await consumeAssistantStream(\n\t\t\tstream,\n\t\t\tresponse.observer,\n\t\t\t(message, context) => response.afterResponse(message, metadata, context),\n\t\t\tdrive.context,\n\t\t);\n\t} finally {\n\t\tawait response.close();\n\t}\n}\n\nasync function pollDeferred<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\texpected: DeferredLeaf,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst prepared = await prepareDeferredPoll(lane, drive, expected);\n\tif (prepared.kind === \"cancel_requested\") return { kind: \"continue\" };\n\tif (prepared.kind === \"waiting\") {\n\t\treturn {\n\t\t\tkind: \"waiting\",\n\t\t\toutcome: {\n\t\t\t\tkind: \"waiting\",\n\t\t\t\toperationId: drive.operationId,\n\t\t\t\treason: \"deferred\",\n\t\t\t\tdeferred: prepared.source,\n\t\t\t},\n\t\t};\n\t}\n\tif (prepared.kind === \"configuration_failure\") {\n\t\treturn publishConfigurationFailure(lane, drive, expected, configurationError(expected.configuration.model));\n\t}\n\n\tconst intent = await publishPollIntent(lane, drive, expected, prepared, recovery);\n\tif (intent.kind === \"cancel_requested\") return { kind: \"continue\" };\n\tconst response = await performDeferredPoll(lane, drive, prepared, intent.value, recovery);\n\treturn publishResponse(lane, drive, intent.value, response, recovery ? { recovery: true } : {});\n}\n\n/** Poll one durably suspended deferred response when this pass carries a permit. */\nexport function runDeferredSuspended<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredSuspendedOperation,\n): Promise<ProcedureResult> {\n\treturn pollDeferred(lane, drive, deferred, false);\n}\n\n/** Replace one orphaned unknown-outcome poll under fresh ids when this pass carries a permit. */\nexport function recoverDeferredPoll<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredEffectPendingOperation,\n): Promise<ProcedureResult> {\n\treturn pollDeferred(lane, drive, deferred, true);\n}\n\n/** Advance or report the wait for one deferred run phase. */\nexport function runDeferred<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredSuspendedOperation | DeferredEffectPendingOperation,\n): Promise<ProcedureResult> {\n\treturn deferred.at === \"deferred.suspended\"\n\t\t? runDeferredSuspended(lane, drive, deferred)\n\t\t: recoverDeferredPoll(lane, drive, deferred);\n}\n"]}
1
+ {"version":3,"file":"deferred.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/deferred.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, DeferredHandle, Model } from \"@earendil-works/pi-ai\";\nimport { type Context, withAbortSignal } from \"../../context.ts\";\nimport { consumeAssistantStream } from \"../../execution/assistant.ts\";\nimport { withModelTelemetry } from \"../../execution/model-telemetry.ts\";\nimport { applyStreamOptionsPatch } from \"../../hooks.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport {\n\ttype DeferredEffectPendingOperation,\n\ttype DeferredSuspendedOperation,\n\ttype LaneConfiguration,\n\ttype OperationError,\n\ttype OperationScope,\n\toperationScopeOf,\n\ttype SessionReader,\n\ttype SettledAssistantMessage,\n} from \"../../session/types.ts\";\nimport { deleteList, pendingAssistantFrames } from \"../../session/values.ts\";\nimport type { AgentHarnessStreamOptions } from \"../../types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport type { ContinueOperationResult, Drive, ProcedureResult } from \"../types.ts\";\nimport { openAssistantResponse, publishConfigurationFailure, publishResponse } from \"./response.ts\";\n\ntype DeferredLeaf = DeferredSuspendedOperation | DeferredEffectPendingOperation;\n/** Deferred effect payload without the run-wide scope fields. */\ntype EffectPendingFields = Omit<DeferredEffectPendingOperation, keyof OperationScope>;\n\ntype PreparedDeferredPoll = {\n\tkind: \"ready\";\n\tsource: DeferredHandle;\n\tmodel: Model<Api>;\n\tpoll: number;\n\tstreamOptions: AgentHarnessStreamOptions;\n};\n\ntype DeferredPreparation =\n\t| PreparedDeferredPoll\n\t| { kind: \"cancel_requested\" }\n\t| { kind: \"waiting\"; source: DeferredHandle }\n\t| { kind: \"configuration_failure\" };\n\nfunction configurationError(identity: LaneConfiguration[\"model\"]): OperationError {\n\treturn {\n\t\tcode: \"model_unavailable\",\n\t\tmessage: \"The configured model is unavailable in this process\",\n\t\tdetails: identity,\n\t};\n}\n\nexport async function readDeferredSourceHandle(\n\treader: SessionReader,\n\tdeferred: DeferredLeaf,\n\tcontext: Context,\n): Promise<DeferredHandle> {\n\tconst source = (await reader.getEntries([deferred.sourceEntryId], context)).get(deferred.sourceEntryId);\n\tif (\n\t\tsource?.type !== \"message\" ||\n\t\tsource.message.role !== \"assistant\" ||\n\t\tsource.message.stopReason !== \"deferred\" ||\n\t\tsource.message.deferred === undefined\n\t) {\n\t\tthrow new SessionInvariantError(`Deferred source ${deferred.sourceEntryId} is missing its assistant handle`);\n\t}\n\tconst handle = source.message.deferred;\n\tconst identity = deferred.configuration.model;\n\tif (\n\t\thandle.id.length === 0 ||\n\t\thandle.provider !== identity.provider ||\n\t\thandle.modelId !== identity.modelId ||\n\t\thandle.api !== source.message.api\n\t) {\n\t\tthrow new SessionInvariantError(`Deferred source ${deferred.sourceEntryId} has an invalid handle`);\n\t}\n\treturn handle;\n}\n\nasync function readSourceHandle<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredLeaf,\n): Promise<ContinueOperationResult<DeferredHandle>> {\n\treturn lane.continueOperation(\n\t\tdeferred,\n\t\tasync (_state, _current, _meta, reader) => ({\n\t\t\tkind: \"return\",\n\t\t\tresult: await readDeferredSourceHandle(reader, deferred, drive.context),\n\t\t}),\n\t\tdrive.context,\n\t);\n}\n\nasync function prepareDeferredPoll<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\texpected: DeferredLeaf,\n): Promise<DeferredPreparation> {\n\tconst source = await readSourceHandle(lane, drive, expected);\n\tif (source.kind === \"cancel_requested\") return source;\n\tif (drive.deferredPermits === 0) return { kind: \"waiting\", source: source.value };\n\n\tconst identity = expected.configuration.model;\n\tconst model = lane.models.getModel(identity.provider, identity.modelId);\n\tif (model === undefined) return { kind: \"configuration_failure\" };\n\tconst baseOptions: AgentHarnessStreamOptions = { ...expected.streamOptions, deferred: false };\n\tconst poll = expected.at === \"deferred.suspended\" ? expected.poll + 1 : expected.poll;\n\tconst beforeRequest = await lane.hooks.runWithGate(\n\t\t\"before_request\",\n\t\t{\n\t\t\tlane: lane.name,\n\t\t\trunId: drive.operationId,\n\t\t\tmodel,\n\t\t\tstep: \"deferred\",\n\t\t\tattempt: poll,\n\t\t\tstreamOptions: baseOptions,\n\t\t},\n\t\tdrive.gate,\n\t\tdrive.context,\n\t);\n\treturn {\n\t\tkind: \"ready\",\n\t\tsource: source.value,\n\t\tmodel,\n\t\tpoll,\n\t\tstreamOptions: {\n\t\t\t...(beforeRequest?.streamOptions === undefined\n\t\t\t\t? baseOptions\n\t\t\t\t: applyStreamOptionsPatch(baseOptions, beforeRequest.streamOptions)),\n\t\t\tdeferred: false,\n\t\t},\n\t};\n}\n\nasync function publishPollIntent<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredLeaf,\n\tprepared: PreparedDeferredPoll,\n\trecovery: boolean,\n): Promise<ContinueOperationResult<DeferredEffectPendingOperation>> {\n\tconst at = Date.now();\n\tconst next: EffectPendingFields = {\n\t\tat: \"deferred.effect_pending\",\n\t\tstepId: deferred.stepId,\n\t\tsourceEntryId: deferred.sourceEntryId,\n\t\tpoll: prepared.poll,\n\t\tresponseEntryId: lane.session.idGenerator.next(at),\n\t\tusageId: lane.session.idGenerator.next(at),\n\t\tconfiguration: deferred.configuration,\n\t\tstreamOptions: deferred.streamOptions,\n\t};\n\treturn lane.continueOperation(\n\t\tdeferred,\n\t\t(_state, current) => {\n\t\t\tconst nextState: DeferredEffectPendingOperation = { ...operationScopeOf(current), ...next };\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites:\n\t\t\t\t\tdeferred.at === \"deferred.effect_pending\"\n\t\t\t\t\t\t? [deleteList(pendingAssistantFrames(drive.operationId, deferred.responseEntryId))]\n\t\t\t\t\t\t: [],\n\t\t\t\toperationState: nextState,\n\t\t\t\tmaterialize: () => {\n\t\t\t\t\tdrive.deferredPermits--;\n\t\t\t\t\treturn nextState;\n\t\t\t\t},\n\t\t\t\tevents: () => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"run_resume\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"turn_start\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: `${next.stepId}:poll:${next.poll}`,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function performDeferredPoll<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tprepared: PreparedDeferredPoll,\n\tintent: DeferredEffectPendingOperation,\n\trecovery: boolean,\n): Promise<SettledAssistantMessage> {\n\tconst response = openAssistantResponse(lane, drive, intent.responseEntryId, recovery);\n\tlet metadata: { status?: number; headers?: Record<string, string> } = {};\n\treturn withModelTelemetry(drive.context, async (requestContext) => {\n\t\tconst controller = new AbortController();\n\t\tconst admitted = withAbortSignal(controller.signal, withAbortSignal(drive.gate.signal, requestContext));\n\t\tconst stream = drive.gate.admit(() =>\n\t\t\tlane.models.streamDeferred(prepared.model, prepared.source, {\n\t\t\t\twait: 0,\n\t\t\t\tsignal: admitted.abortSignal,\n\t\t\t\ttelemetry: admitted.telemetry,\n\t\t\t\ttimeoutMs: prepared.streamOptions.timeoutMs,\n\t\t\t\tmaxRetries: prepared.streamOptions.maxRetries,\n\t\t\t\tmaxRetryDelayMs: prepared.streamOptions.maxRetryDelayMs,\n\t\t\t\theaders: prepared.streamOptions.headers,\n\t\t\t\tonPayload: async (payload, requestModel) => {\n\t\t\t\t\tconst result = await lane.hooks.runWithGate(\n\t\t\t\t\t\t\"before_payload\",\n\t\t\t\t\t\t{ lane: lane.name, runId: drive.operationId, model: requestModel, payload },\n\t\t\t\t\t\tdrive.gate,\n\t\t\t\t\t\trequestContext,\n\t\t\t\t\t);\n\t\t\t\t\treturn result?.payload;\n\t\t\t\t},\n\t\t\t\tonResponse: (response) => {\n\t\t\t\t\tmetadata = { status: response.status, headers: response.headers };\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\ttry {\n\t\t\treturn await consumeAssistantStream(\n\t\t\t\tstream,\n\t\t\t\tresponse.observer,\n\t\t\t\t(message, context) => response.afterResponse(message, metadata, context),\n\t\t\t\trequestContext,\n\t\t\t\t(error) => controller.abort(error),\n\t\t\t);\n\t\t} finally {\n\t\t\tawait response.close();\n\t\t}\n\t});\n}\n\nasync function pollDeferred<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\texpected: DeferredLeaf,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst prepared = await prepareDeferredPoll(lane, drive, expected);\n\tif (prepared.kind === \"cancel_requested\") return { kind: \"continue\" };\n\tif (prepared.kind === \"waiting\") {\n\t\treturn {\n\t\t\tkind: \"waiting\",\n\t\t\toutcome: {\n\t\t\t\tkind: \"waiting\",\n\t\t\t\toperationId: drive.operationId,\n\t\t\t\treason: \"deferred\",\n\t\t\t\tdeferred: prepared.source,\n\t\t\t},\n\t\t};\n\t}\n\tif (prepared.kind === \"configuration_failure\") {\n\t\treturn publishConfigurationFailure(lane, drive, expected, configurationError(expected.configuration.model));\n\t}\n\n\tconst intent = await publishPollIntent(lane, drive, expected, prepared, recovery);\n\tif (intent.kind === \"cancel_requested\") return { kind: \"continue\" };\n\tconst response = await performDeferredPoll(lane, drive, prepared, intent.value, recovery);\n\treturn publishResponse(lane, drive, intent.value, response, recovery ? { recovery: true } : {});\n}\n\n/** Poll one durably suspended deferred response when this pass carries a permit. */\nexport function runDeferredSuspended<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredSuspendedOperation,\n): Promise<ProcedureResult> {\n\treturn pollDeferred(lane, drive, deferred, false);\n}\n\n/** Replace one orphaned unknown-outcome poll under fresh ids when this pass carries a permit. */\nexport function recoverDeferredPoll<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredEffectPendingOperation,\n): Promise<ProcedureResult> {\n\treturn pollDeferred(lane, drive, deferred, true);\n}\n\n/** Advance or report the wait for one deferred run phase. */\nexport function runDeferred<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredSuspendedOperation | DeferredEffectPendingOperation,\n): Promise<ProcedureResult> {\n\treturn deferred.at === \"deferred.suspended\"\n\t\t? runDeferredSuspended(lane, drive, deferred)\n\t\t: recoverDeferredPoll(lane, drive, deferred);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { getTelemetryContext, withAbortSignal } from "../../context.js";
1
+ import { withAbortSignal } from "../../context.js";
2
2
  import { streamHarnessAssistant } from "../../execution/assistant.js";
3
3
  import { applyStreamOptionsPatch } from "../../hooks.js";
4
4
  import { SessionInvariantError } from "../../session/session.js";
@@ -135,7 +135,7 @@ async function performGeneration(lane, drive, intent, prepared) {
135
135
  ...options,
136
136
  sessionId: `${lane.session.metadata.id}:${lane.name}`,
137
137
  signal: admitted.abortSignal,
138
- telemetryContext: getTelemetryContext(admitted),
138
+ telemetry: admitted.telemetry,
139
139
  }));
140
140
  },
141
141
  observer: response.observer,
@@ -1 +1 @@
1
- {"version":3,"file":"generation.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/generation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model, Tool } from \"@earendil-works/pi-ai\";\nimport type { AgentMessage } from \"../../../types.ts\";\nimport { type Context, getTelemetryContext, withAbortSignal } from \"../../context.ts\";\nimport { type HarnessAssistantStreamConfig, streamHarnessAssistant } from \"../../execution/assistant.ts\";\nimport { applyStreamOptionsPatch } from \"../../hooks.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport {\n\ttype AssistantEffectPendingOperation,\n\ttype AssistantReadyOperation,\n\ttype AssistantRetryWaitOperation,\n\ttype JsonValue,\n\ttype OperationError,\n\ttype OperationScope,\n\toperationScopeOf,\n\ttype SettledAssistantMessage,\n} from \"../../session/types.ts\";\nimport type { AgentHarnessStreamOptions } from \"../../types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport { readBoundedContext } from \"../transcript.ts\";\nimport type { ContinueOperationResult, Drive, ProcedureResult } from \"../types.ts\";\nimport { openAssistantResponse, publishConfigurationFailure, publishResponse } from \"./response.ts\";\nimport { waitUntil } from \"./retry.ts\";\n\n/** Assistant effect-pending payload without the run-wide scope fields. */\ntype AssistantEffectPending = Omit<AssistantEffectPendingOperation, keyof OperationScope>;\n\ntype PreparedGeneration = {\n\tkind: \"ready\";\n\tmodel: Model<Api>;\n\ttools: Tool[];\n\tmessages: AgentMessage[];\n\tsystemPrompt: string;\n\tstreamOptions: AgentHarnessStreamOptions;\n\ttoProviderMessages: HarnessAssistantStreamConfig[\"toProviderMessages\"];\n};\n\ntype GenerationPreparation =\n\t| PreparedGeneration\n\t| { kind: \"configuration_failure\"; error: OperationError }\n\t| { kind: \"cancel_requested\" };\n\nfunction configurationError(\n\tcode: \"model_unavailable\" | \"configured_tools_unavailable\",\n\tdetails: JsonValue,\n): OperationError {\n\treturn {\n\t\tcode,\n\t\tmessage:\n\t\t\tcode === \"model_unavailable\"\n\t\t\t\t? \"The configured model is unavailable in this process\"\n\t\t\t\t: \"One or more configured tools are unavailable in this process\",\n\t\tdetails,\n\t};\n}\n\nasync function resolveSystemPrompt<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tcontext: Context,\n): Promise<string> {\n\tconst config = lane.readConfig();\n\tif (config.systemPrompt === undefined) return \"\";\n\tif (typeof config.systemPrompt === \"string\") return config.systemPrompt;\n\tconst source = config.toolContext;\n\tconst toolContext = typeof source === \"function\" ? await source(context) : source;\n\treturn config.systemPrompt(toolContext as TContext, context);\n}\n\nasync function prepareGeneration<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tgeneration: AssistantReadyOperation,\n): Promise<GenerationPreparation> {\n\tconst identity = generation.generationContext.configuration.model;\n\tconst model = lane.models.getModel(identity.provider, identity.modelId);\n\tif (model === undefined) {\n\t\treturn { kind: \"configuration_failure\", error: configurationError(\"model_unavailable\", identity) };\n\t}\n\n\tconst config = lane.readConfig();\n\tconst toolsByName = new Map(config.tools.map((tool) => [tool.name, tool]));\n\tconst missingTools = generation.generationContext.configuration.activeToolNames.filter(\n\t\t(name) => !toolsByName.has(name),\n\t);\n\tif (missingTools.length !== 0) {\n\t\treturn {\n\t\t\tkind: \"configuration_failure\",\n\t\t\terror: configurationError(\"configured_tools_unavailable\", { tools: missingTools }),\n\t\t};\n\t}\n\tconst tools: Tool[] = generation.generationContext.configuration.activeToolNames.map((name) => {\n\t\tconst tool = toolsByName.get(name);\n\t\tif (tool === undefined) throw new SessionInvariantError(`Configured tool ${name} disappeared during resolution`);\n\t\treturn {\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: tool.parameters,\n\t\t\t...(tool.constrainedSampling === undefined ? {} : { constrainedSampling: tool.constrainedSampling }),\n\t\t};\n\t});\n\n\tconst messages = await readBoundedContext(lane, drive, generation);\n\tif (messages.kind === \"cancel_requested\") return messages;\n\tconst systemPrompt = await resolveSystemPrompt(lane, drive.context);\n\tconst beforeRequest = await lane.hooks.runWithGate(\n\t\t\"before_request\",\n\t\t{\n\t\t\tlane: lane.name,\n\t\t\trunId: drive.operationId,\n\t\t\tmodel,\n\t\t\tstep: \"assistant\",\n\t\t\tattempt: generation.nextAttempt,\n\t\t\tstreamOptions: generation.generationContext.streamOptions,\n\t\t},\n\t\tdrive.gate,\n\t\tdrive.context,\n\t);\n\tconst streamOptions =\n\t\tbeforeRequest?.streamOptions === undefined\n\t\t\t? generation.generationContext.streamOptions\n\t\t\t: applyStreamOptionsPatch(generation.generationContext.streamOptions, beforeRequest.streamOptions);\n\treturn {\n\t\tkind: \"ready\",\n\t\tmodel,\n\t\ttools,\n\t\tmessages: messages.value,\n\t\tsystemPrompt,\n\t\tstreamOptions,\n\t\ttoProviderMessages: config.toProviderMessages,\n\t};\n}\n\nasync function publishGenerationIntent<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tready: AssistantReadyOperation,\n\tprepared: PreparedGeneration,\n): Promise<ContinueOperationResult<AssistantEffectPendingOperation>> {\n\tconst at = Date.now();\n\tconst pending: AssistantEffectPending = {\n\t\tat: \"assistant.effect_pending\",\n\t\tgenerationContext: ready.generationContext,\n\t\tattempt: ready.nextAttempt,\n\t\tresponseEntryId: lane.session.idGenerator.next(at),\n\t\tusageId: lane.session.idGenerator.next(at),\n\t\tintendedOutputLimit: prepared.model.maxTokens,\n\t\tcontextWindow: prepared.model.contextWindow,\n\t};\n\treturn lane.continueOperation(\n\t\tready,\n\t\t(_state, current) => {\n\t\t\tconst nextState: AssistantEffectPendingOperation = { ...operationScopeOf(current), ...pending };\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [],\n\t\t\t\toperationState: nextState,\n\t\t\t\tmaterialize: () => nextState,\n\t\t\t\tevents: () =>\n\t\t\t\t\tready.nextAttempt === 1\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"turn_start\",\n\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\tturnId: ready.generationContext.stepId,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function performGeneration<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tintent: AssistantEffectPendingOperation,\n\tprepared: PreparedGeneration,\n): Promise<SettledAssistantMessage> {\n\tconst response = openAssistantResponse(lane, drive, intent.responseEntryId);\n\ttry {\n\t\treturn await streamHarnessAssistant(\n\t\t\tprepared.messages,\n\t\t\t{\n\t\t\t\tmodel: prepared.model,\n\t\t\t\tsystemPrompt: prepared.systemPrompt,\n\t\t\t\ttools: prepared.tools,\n\t\t\t\tthinkingLevel: intent.generationContext.configuration.thinkingLevel,\n\t\t\t\tstreamOptions: prepared.streamOptions,\n\t\t\t\ttransformContext: async (requestContext, context) => {\n\t\t\t\t\tconst result = await lane.hooks.runWithGate(\n\t\t\t\t\t\t\"transform_context\",\n\t\t\t\t\t\t{ lane: lane.name, runId: drive.operationId, ...requestContext },\n\t\t\t\t\t\tdrive.gate,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessages: result?.messages ?? requestContext.messages,\n\t\t\t\t\t\tsystemPrompt: result?.systemPrompt ?? requestContext.systemPrompt,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\ttoProviderMessages: prepared.toProviderMessages,\n\t\t\t\tbeforePayload: async (payload, requestModel, context) => {\n\t\t\t\t\tconst result = await lane.hooks.runWithGate(\n\t\t\t\t\t\t\"before_payload\",\n\t\t\t\t\t\t{ lane: lane.name, runId: drive.operationId, model: requestModel, payload },\n\t\t\t\t\t\tdrive.gate,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t);\n\t\t\t\t\treturn result?.payload;\n\t\t\t\t},\n\t\t\t\tafterResponse: response.afterResponse,\n\t\t\t\trequest: (aiContext, options, context) => {\n\t\t\t\t\tconst admitted = withAbortSignal(drive.gate.signal, context);\n\t\t\t\t\treturn drive.gate.admit(() =>\n\t\t\t\t\t\tlane.models.streamSimple(prepared.model, aiContext, {\n\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\tsessionId: `${lane.session.metadata.id}:${lane.name}`,\n\t\t\t\t\t\t\tsignal: admitted.abortSignal,\n\t\t\t\t\t\t\ttelemetryContext: getTelemetryContext(admitted),\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tobserver: response.observer,\n\t\t\t},\n\t\t\tdrive.context,\n\t\t);\n\t} finally {\n\t\tawait response.close();\n\t}\n}\n\n/** Advance one durable assistant retry wait according to this pass's local wait policy. */\nexport async function runRetryWait<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tgeneration: AssistantRetryWaitOperation,\n): Promise<ProcedureResult> {\n\tif (Date.now() < generation.notBefore) {\n\t\tif (!drive.waitForRetry) {\n\t\t\treturn {\n\t\t\t\tkind: \"waiting\",\n\t\t\t\toutcome: {\n\t\t\t\t\tkind: \"waiting\",\n\t\t\t\t\toperationId: drive.operationId,\n\t\t\t\t\treason: \"retry\",\n\t\t\t\t\tnotBefore: generation.notBefore,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tawait drive.gate.admit(() => waitUntil(generation.notBefore, drive.gate.signal));\n\t}\n\n\tconst result = await lane.continueOperation(\n\t\tgeneration,\n\t\t(_state, current) => {\n\t\t\tconst nextState: AssistantReadyOperation = {\n\t\t\t\t...operationScopeOf(current),\n\t\t\t\tat: \"assistant.ready\",\n\t\t\t\tgenerationContext: generation.generationContext,\n\t\t\t\tnextAttempt: generation.nextAttempt,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [],\n\t\t\t\toperationState: nextState,\n\t\t\t\tmaterialize: () => ({ kind: \"continue\" }) as const,\n\t\t\t\tevents: () => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"retry_start\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tstep: generation.generationContext.stepId,\n\t\t\t\t\t\tattempt: generation.nextAttempt,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n\treturn result.kind === \"cancel_requested\" ? { kind: \"continue\" } : result.value;\n}\n\n/** Execute one ready assistant generation or advance its durable retry wait. */\nexport async function runGeneration<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tgeneration: AssistantReadyOperation | AssistantRetryWaitOperation,\n): Promise<ProcedureResult> {\n\tif (generation.at === \"assistant.retry_wait\") return runRetryWait(lane, drive, generation);\n\n\tconst prepared = await prepareGeneration(lane, drive, generation);\n\tif (prepared.kind === \"configuration_failure\") {\n\t\treturn publishConfigurationFailure(lane, drive, generation, prepared.error);\n\t}\n\tif (prepared.kind === \"cancel_requested\") return { kind: \"continue\" };\n\n\tconst intent = await publishGenerationIntent(lane, drive, generation, prepared);\n\tif (intent.kind === \"cancel_requested\") return { kind: \"continue\" };\n\tconst response = await performGeneration(lane, drive, intent.value, prepared);\n\treturn publishResponse(lane, drive, intent.value, response);\n}\n"]}
1
+ {"version":3,"file":"generation.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/generation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model, Tool } from \"@earendil-works/pi-ai\";\nimport type { AgentMessage } from \"../../../types.ts\";\nimport { type Context, withAbortSignal } from \"../../context.ts\";\nimport { type HarnessAssistantStreamConfig, streamHarnessAssistant } from \"../../execution/assistant.ts\";\nimport { applyStreamOptionsPatch } from \"../../hooks.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport {\n\ttype AssistantEffectPendingOperation,\n\ttype AssistantReadyOperation,\n\ttype AssistantRetryWaitOperation,\n\ttype JsonValue,\n\ttype OperationError,\n\ttype OperationScope,\n\toperationScopeOf,\n\ttype SettledAssistantMessage,\n} from \"../../session/types.ts\";\nimport type { AgentHarnessStreamOptions } from \"../../types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport { readBoundedContext } from \"../transcript.ts\";\nimport type { ContinueOperationResult, Drive, ProcedureResult } from \"../types.ts\";\nimport { openAssistantResponse, publishConfigurationFailure, publishResponse } from \"./response.ts\";\nimport { waitUntil } from \"./retry.ts\";\n\n/** Assistant effect-pending payload without the run-wide scope fields. */\ntype AssistantEffectPending = Omit<AssistantEffectPendingOperation, keyof OperationScope>;\n\ntype PreparedGeneration = {\n\tkind: \"ready\";\n\tmodel: Model<Api>;\n\ttools: Tool[];\n\tmessages: AgentMessage[];\n\tsystemPrompt: string;\n\tstreamOptions: AgentHarnessStreamOptions;\n\ttoProviderMessages: HarnessAssistantStreamConfig[\"toProviderMessages\"];\n};\n\ntype GenerationPreparation =\n\t| PreparedGeneration\n\t| { kind: \"configuration_failure\"; error: OperationError }\n\t| { kind: \"cancel_requested\" };\n\nfunction configurationError(\n\tcode: \"model_unavailable\" | \"configured_tools_unavailable\",\n\tdetails: JsonValue,\n): OperationError {\n\treturn {\n\t\tcode,\n\t\tmessage:\n\t\t\tcode === \"model_unavailable\"\n\t\t\t\t? \"The configured model is unavailable in this process\"\n\t\t\t\t: \"One or more configured tools are unavailable in this process\",\n\t\tdetails,\n\t};\n}\n\nasync function resolveSystemPrompt<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tcontext: Context,\n): Promise<string> {\n\tconst config = lane.readConfig();\n\tif (config.systemPrompt === undefined) return \"\";\n\tif (typeof config.systemPrompt === \"string\") return config.systemPrompt;\n\tconst source = config.toolContext;\n\tconst toolContext = typeof source === \"function\" ? await source(context) : source;\n\treturn config.systemPrompt(toolContext as TContext, context);\n}\n\nasync function prepareGeneration<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tgeneration: AssistantReadyOperation,\n): Promise<GenerationPreparation> {\n\tconst identity = generation.generationContext.configuration.model;\n\tconst model = lane.models.getModel(identity.provider, identity.modelId);\n\tif (model === undefined) {\n\t\treturn { kind: \"configuration_failure\", error: configurationError(\"model_unavailable\", identity) };\n\t}\n\n\tconst config = lane.readConfig();\n\tconst toolsByName = new Map(config.tools.map((tool) => [tool.name, tool]));\n\tconst missingTools = generation.generationContext.configuration.activeToolNames.filter(\n\t\t(name) => !toolsByName.has(name),\n\t);\n\tif (missingTools.length !== 0) {\n\t\treturn {\n\t\t\tkind: \"configuration_failure\",\n\t\t\terror: configurationError(\"configured_tools_unavailable\", { tools: missingTools }),\n\t\t};\n\t}\n\tconst tools: Tool[] = generation.generationContext.configuration.activeToolNames.map((name) => {\n\t\tconst tool = toolsByName.get(name);\n\t\tif (tool === undefined) throw new SessionInvariantError(`Configured tool ${name} disappeared during resolution`);\n\t\treturn {\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: tool.parameters,\n\t\t\t...(tool.constrainedSampling === undefined ? {} : { constrainedSampling: tool.constrainedSampling }),\n\t\t};\n\t});\n\n\tconst messages = await readBoundedContext(lane, drive, generation);\n\tif (messages.kind === \"cancel_requested\") return messages;\n\tconst systemPrompt = await resolveSystemPrompt(lane, drive.context);\n\tconst beforeRequest = await lane.hooks.runWithGate(\n\t\t\"before_request\",\n\t\t{\n\t\t\tlane: lane.name,\n\t\t\trunId: drive.operationId,\n\t\t\tmodel,\n\t\t\tstep: \"assistant\",\n\t\t\tattempt: generation.nextAttempt,\n\t\t\tstreamOptions: generation.generationContext.streamOptions,\n\t\t},\n\t\tdrive.gate,\n\t\tdrive.context,\n\t);\n\tconst streamOptions =\n\t\tbeforeRequest?.streamOptions === undefined\n\t\t\t? generation.generationContext.streamOptions\n\t\t\t: applyStreamOptionsPatch(generation.generationContext.streamOptions, beforeRequest.streamOptions);\n\treturn {\n\t\tkind: \"ready\",\n\t\tmodel,\n\t\ttools,\n\t\tmessages: messages.value,\n\t\tsystemPrompt,\n\t\tstreamOptions,\n\t\ttoProviderMessages: config.toProviderMessages,\n\t};\n}\n\nasync function publishGenerationIntent<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tready: AssistantReadyOperation,\n\tprepared: PreparedGeneration,\n): Promise<ContinueOperationResult<AssistantEffectPendingOperation>> {\n\tconst at = Date.now();\n\tconst pending: AssistantEffectPending = {\n\t\tat: \"assistant.effect_pending\",\n\t\tgenerationContext: ready.generationContext,\n\t\tattempt: ready.nextAttempt,\n\t\tresponseEntryId: lane.session.idGenerator.next(at),\n\t\tusageId: lane.session.idGenerator.next(at),\n\t\tintendedOutputLimit: prepared.model.maxTokens,\n\t\tcontextWindow: prepared.model.contextWindow,\n\t};\n\treturn lane.continueOperation(\n\t\tready,\n\t\t(_state, current) => {\n\t\t\tconst nextState: AssistantEffectPendingOperation = { ...operationScopeOf(current), ...pending };\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [],\n\t\t\t\toperationState: nextState,\n\t\t\t\tmaterialize: () => nextState,\n\t\t\t\tevents: () =>\n\t\t\t\t\tready.nextAttempt === 1\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"turn_start\",\n\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\tturnId: ready.generationContext.stepId,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function performGeneration<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tintent: AssistantEffectPendingOperation,\n\tprepared: PreparedGeneration,\n): Promise<SettledAssistantMessage> {\n\tconst response = openAssistantResponse(lane, drive, intent.responseEntryId);\n\ttry {\n\t\treturn await streamHarnessAssistant(\n\t\t\tprepared.messages,\n\t\t\t{\n\t\t\t\tmodel: prepared.model,\n\t\t\t\tsystemPrompt: prepared.systemPrompt,\n\t\t\t\ttools: prepared.tools,\n\t\t\t\tthinkingLevel: intent.generationContext.configuration.thinkingLevel,\n\t\t\t\tstreamOptions: prepared.streamOptions,\n\t\t\t\ttransformContext: async (requestContext, context) => {\n\t\t\t\t\tconst result = await lane.hooks.runWithGate(\n\t\t\t\t\t\t\"transform_context\",\n\t\t\t\t\t\t{ lane: lane.name, runId: drive.operationId, ...requestContext },\n\t\t\t\t\t\tdrive.gate,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessages: result?.messages ?? requestContext.messages,\n\t\t\t\t\t\tsystemPrompt: result?.systemPrompt ?? requestContext.systemPrompt,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\ttoProviderMessages: prepared.toProviderMessages,\n\t\t\t\tbeforePayload: async (payload, requestModel, context) => {\n\t\t\t\t\tconst result = await lane.hooks.runWithGate(\n\t\t\t\t\t\t\"before_payload\",\n\t\t\t\t\t\t{ lane: lane.name, runId: drive.operationId, model: requestModel, payload },\n\t\t\t\t\t\tdrive.gate,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t);\n\t\t\t\t\treturn result?.payload;\n\t\t\t\t},\n\t\t\t\tafterResponse: response.afterResponse,\n\t\t\t\trequest: (aiContext, options, context) => {\n\t\t\t\t\tconst admitted = withAbortSignal(drive.gate.signal, context);\n\t\t\t\t\treturn drive.gate.admit(() =>\n\t\t\t\t\t\tlane.models.streamSimple(prepared.model, aiContext, {\n\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\tsessionId: `${lane.session.metadata.id}:${lane.name}`,\n\t\t\t\t\t\t\tsignal: admitted.abortSignal,\n\t\t\t\t\t\t\ttelemetry: admitted.telemetry,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tobserver: response.observer,\n\t\t\t},\n\t\t\tdrive.context,\n\t\t);\n\t} finally {\n\t\tawait response.close();\n\t}\n}\n\n/** Advance one durable assistant retry wait according to this pass's local wait policy. */\nexport async function runRetryWait<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tgeneration: AssistantRetryWaitOperation,\n): Promise<ProcedureResult> {\n\tif (Date.now() < generation.notBefore) {\n\t\tif (!drive.waitForRetry) {\n\t\t\treturn {\n\t\t\t\tkind: \"waiting\",\n\t\t\t\toutcome: {\n\t\t\t\t\tkind: \"waiting\",\n\t\t\t\t\toperationId: drive.operationId,\n\t\t\t\t\treason: \"retry\",\n\t\t\t\t\tnotBefore: generation.notBefore,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tawait drive.gate.admit(() => waitUntil(generation.notBefore, drive.gate.signal));\n\t}\n\n\tconst result = await lane.continueOperation(\n\t\tgeneration,\n\t\t(_state, current) => {\n\t\t\tconst nextState: AssistantReadyOperation = {\n\t\t\t\t...operationScopeOf(current),\n\t\t\t\tat: \"assistant.ready\",\n\t\t\t\tgenerationContext: generation.generationContext,\n\t\t\t\tnextAttempt: generation.nextAttempt,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [],\n\t\t\t\toperationState: nextState,\n\t\t\t\tmaterialize: () => ({ kind: \"continue\" }) as const,\n\t\t\t\tevents: () => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"retry_start\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tstep: generation.generationContext.stepId,\n\t\t\t\t\t\tattempt: generation.nextAttempt,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n\treturn result.kind === \"cancel_requested\" ? { kind: \"continue\" } : result.value;\n}\n\n/** Execute one ready assistant generation or advance its durable retry wait. */\nexport async function runGeneration<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tgeneration: AssistantReadyOperation | AssistantRetryWaitOperation,\n): Promise<ProcedureResult> {\n\tif (generation.at === \"assistant.retry_wait\") return runRetryWait(lane, drive, generation);\n\n\tconst prepared = await prepareGeneration(lane, drive, generation);\n\tif (prepared.kind === \"configuration_failure\") {\n\t\treturn publishConfigurationFailure(lane, drive, generation, prepared.error);\n\t}\n\tif (prepared.kind === \"cancel_requested\") return { kind: \"continue\" };\n\n\tconst intent = await publishGenerationIntent(lane, drive, generation, prepared);\n\tif (intent.kind === \"cancel_requested\") return { kind: \"continue\" };\n\tconst response = await performGeneration(lane, drive, intent.value, prepared);\n\treturn publishResponse(lane, drive, intent.value, response);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/reconcile.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAwH1D,6EAA6E;AAC7E,wBAAsB,kBAAkB,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EAC3E,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,GACV,OAAO,CAAC,eAAe,CAAC,CAsC1B"}
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/reconcile.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA0H1D,6EAA6E;AAC7E,wBAAsB,kBAAkB,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EAC3E,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,GACV,OAAO,CAAC,eAAe,CAAC,CAsC1B"}
@@ -1,4 +1,4 @@
1
- import { getTelemetryContext } from "../../context.js";
1
+ import { withModelTelemetry } from "../../execution/model-telemetry.js";
2
2
  import { SessionInvariantError } from "../../session/session.js";
3
3
  import { readDeferredSourceHandle } from "./deferred.js";
4
4
  import { recoverCancelledAssistantEffect } from "./recovery.js";
@@ -10,14 +10,14 @@ async function cancelDeferredBestEffort(lane, drive, deferred, handle) {
10
10
  if (model === undefined)
11
11
  return;
12
12
  try {
13
- await lane.models.cancelDeferred(model, handle, {
13
+ await withModelTelemetry(drive.context, (requestContext) => lane.models.cancelDeferred(model, handle, {
14
14
  signal: drive.closeSignal,
15
- telemetryContext: getTelemetryContext(drive.context),
15
+ telemetry: requestContext.telemetry,
16
16
  timeoutMs: deferred.streamOptions.timeoutMs,
17
17
  maxRetries: deferred.streamOptions.maxRetries,
18
18
  maxRetryDelayMs: deferred.streamOptions.maxRetryDelayMs,
19
19
  headers: deferred.streamOptions.headers,
20
- });
20
+ }));
21
21
  }
22
22
  catch {
23
23
  // Remote cancellation is best-effort; durable local reconciliation must continue.
@@ -1 +1 @@
1
- {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/reconcile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAQjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,KAAK,UAAU,wBAAwB,CACtC,IAAoB,EACpB,KAAY,EACZ,QAAqE,EACrE,MAAsB;IAEtB,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IAChC,IAAI,CAAC;QACJ,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE;YAC/C,MAAM,EAAE,KAAK,CAAC,WAAW;YACzB,gBAAgB,EAAE,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC;YACpD,SAAS,EAAE,QAAQ,CAAC,aAAa,CAAC,SAAS;YAC3C,UAAU,EAAE,QAAQ,CAAC,aAAa,CAAC,UAAU;YAC7C,eAAe,EAAE,QAAQ,CAAC,aAAa,CAAC,eAAe;YACvD,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,OAAO;SACvC,CAAC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACR,kFAAkF;IACnF,CAAC;AACF,CAAC;AAED,KAAK,UAAU,kBAAkB,CAChC,IAAoB,EACpB,KAAY,EACZ,QAAqE;IAErE,OAAO,IAAI,CAAC,eAAe,CAC1B,QAAQ,EACR,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,MAAM,wBAAwB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;KACvE,CAAC,EACF,KAAK,CAAC,OAAO,CACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CACpC,IAAoB,EACpB,KAAY,EACZ,UAA0B;IAE1B,OAAO,IAAI,CAAC,eAAe,CAC1B,UAAU,EACV,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QACtC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;YACnD,MAAM,IAAI,qBAAqB,CAAC,gEAAgE,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAChG,MAAM,MAAM,GAAmB,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAChC,QAAQ,OAAO,CAAC,EAAE,EAAE,CAAC;gBACpB,KAAK,kBAAkB,CAAC;gBACxB,KAAK,eAAe,CAAC;gBACrB,KAAK,wBAAwB,CAAC;gBAC9B,KAAK,oBAAoB;oBACxB,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;wBAC7F,MAAM,IAAI,qBAAqB,CAAC,sDAAsD,CAAC,CAAC;oBACzF,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,gBAAgB;wBACtB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,KAAK,EAAE,KAAK,CAAC,WAAW;wBACxB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;wBAC3B,MAAM,EAAE,SAAS;wBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;qBACvB,CAAC,CAAC;oBACH,MAAM;gBACP;oBACC,MAAM;YACR,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,KAAK,CAAC,WAAW;gBACxB,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,IAAI,CAAC,WAAW;gBAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,MAAM,CAAC,OAAO;aACvB,CAAC,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,KAAK,CAAC,WAAW;gBACxB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;aACvB,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,KAAK,CAAC,WAAW;gBACxB,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,IAAI,CAAC,WAAW;gBAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,MAAM,CAAC,OAAO;aACvB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO;YACN,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,OAAO;YACf,MAAM;YACN,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAU;YAClE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM;SACpB,CAAC;IACH,CAAC,EACD,KAAK,CAAC,OAAO,CACb,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,IAAoB,EACpB,KAAY;IAEZ,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IACvC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;QAC5E,MAAM,IAAI,qBAAqB,CAAC,SAAS,KAAK,CAAC,WAAW,yCAAyC,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;QAC3D,MAAM,IAAI,qBAAqB,CAAC,aAAa,KAAK,CAAC,WAAW,mBAAmB,CAAC,CAAC;IACpF,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpC,KAAK,CAAC,WAAW,EAAE,CAAC;IAEpB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IAC9B,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,0BAA0B;YAC9B,OAAO,+BAA+B,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5D,KAAK,OAAO;YACX,OAAO,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACrC,KAAK,oBAAoB,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5D,MAAM,wBAAwB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAC3D,OAAO,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,yBAAyB,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5D,MAAM,wBAAwB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAC3D,OAAO,+BAA+B,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,UAAU,CAAC;QAChB,KAAK,YAAY,CAAC;QAClB,KAAK,iBAAiB,CAAC;QACvB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,kBAAkB,CAAC;QACxB,KAAK,eAAe,CAAC;QACrB,KAAK,wBAAwB,CAAC;QAC9B,KAAK,oBAAoB,CAAC;QAC1B,KAAK,4BAA4B;YAChC,OAAO,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;AACF,CAAC","sourcesContent":["import type { DeferredHandle } from \"@earendil-works/pi-ai\";\nimport type { HarnessEvent } from \"../../agent-harness.ts\";\nimport { getTelemetryContext } from \"../../context.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport type {\n\tDeferredEffectPendingOperation,\n\tDeferredSuspendedOperation,\n\tOperationState,\n} from \"../../session/types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport type { Drive, ProcedureResult } from \"../types.ts\";\nimport { readDeferredSourceHandle } from \"./deferred.ts\";\nimport { recoverCancelledAssistantEffect } from \"./recovery.ts\";\nimport { operationCleanupWrites, operationResultRecord } from \"./terminal.ts\";\nimport { runTools } from \"./tools.ts\";\n\nasync function cancelDeferredBestEffort<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredSuspendedOperation | DeferredEffectPendingOperation,\n\thandle: DeferredHandle,\n): Promise<void> {\n\tconst identity = deferred.configuration.model;\n\tconst model = lane.models.getModel(identity.provider, identity.modelId);\n\tif (model === undefined) return;\n\ttry {\n\t\tawait lane.models.cancelDeferred(model, handle, {\n\t\t\tsignal: drive.closeSignal,\n\t\t\ttelemetryContext: getTelemetryContext(drive.context),\n\t\t\ttimeoutMs: deferred.streamOptions.timeoutMs,\n\t\t\tmaxRetries: deferred.streamOptions.maxRetries,\n\t\t\tmaxRetryDelayMs: deferred.streamOptions.maxRetryDelayMs,\n\t\t\theaders: deferred.streamOptions.headers,\n\t\t});\n\t} catch {\n\t\t// Remote cancellation is best-effort; durable local reconciliation must continue.\n\t}\n}\n\nasync function readDeferredHandle<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredSuspendedOperation | DeferredEffectPendingOperation,\n): Promise<DeferredHandle> {\n\treturn lane.settleOperation(\n\t\tdeferred,\n\t\tasync (_state, _current, _meta, reader) => ({\n\t\t\tkind: \"return\",\n\t\t\tresult: await readDeferredSourceHandle(reader, deferred, drive.context),\n\t\t}),\n\t\tdrive.context,\n\t);\n}\n\nasync function publishAbortedTerminal<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: OperationState,\n): Promise<ProcedureResult> {\n\treturn lane.settleOperation(\n\t\tcapability,\n\t\tasync (state, current, meta, reader) => {\n\t\t\tif (current.control.status !== \"cancel_requested\") {\n\t\t\t\tthrow new SessionInvariantError(\"Cancellation reconciliation requires cancelled durable control\");\n\t\t\t}\n\t\t\tconst record = operationResultRecord(meta, \"aborted\", state.tipId);\n\t\t\tconst cleanup = await operationCleanupWrites(reader, drive.operationId, current, drive.context);\n\t\t\tconst events: HarnessEvent[] = [];\n\t\t\tif (meta.intent.kind === \"run\") {\n\t\t\t\tswitch (current.at) {\n\t\t\t\t\tcase \"summary.deciding\":\n\t\t\t\t\tcase \"summary.ready\":\n\t\t\t\t\tcase \"summary.effect_pending\":\n\t\t\t\t\tcase \"summary.retry_wait\":\n\t\t\t\t\t\tif (current.task.boundary.kind !== \"resume_checkpoint\" || current.task.reason === undefined) {\n\t\t\t\t\t\t\tthrow new SessionInvariantError(\"Cancelled run summary has an invalid result boundary\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tevents.push({\n\t\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\treason: current.task.reason,\n\t\t\t\t\t\t\tstatus: \"aborted\",\n\t\t\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: \"run_end\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tstatus: \"aborted\",\n\t\t\t\t\tfromTipId: meta.sourceTipId,\n\t\t\t\t\ttipId: state.tipId,\n\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t});\n\t\t\t} else if (meta.intent.kind === \"compaction\") {\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\treason: \"manual\",\n\t\t\t\t\tstatus: \"aborted\",\n\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: \"navigation_end\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tstatus: \"aborted\",\n\t\t\t\t\tfromTipId: meta.sourceTipId,\n\t\t\t\t\ttipId: state.tipId,\n\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"finish\",\n\t\t\t\twrites: cleanup,\n\t\t\t\trecord,\n\t\t\t\tmaterialize: () => ({ kind: \"settled\", outcome: record }) as const,\n\t\t\t\tevents: () => events,\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\n/** Advance one cancelled durable leaf without starting new ordinary work. */\nexport async function reconcileOperation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n): Promise<ProcedureResult> {\n\tconst operation = lane.state.operation;\n\tif (operation === null || operation.meta.operationId !== drive.operationId) {\n\t\tthrow new SessionInvariantError(`Drive ${drive.operationId} has no matching operation to reconcile`);\n\t}\n\tif (operation.state.control.status !== \"cancel_requested\") {\n\t\tthrow new SessionInvariantError(`Operation ${drive.operationId} is not cancelled`);\n\t}\n\tdrive.beginAbort(Promise.resolve());\n\tdrive.signalAbort();\n\n\tconst state = operation.state;\n\tswitch (state.at) {\n\t\tcase \"assistant.effect_pending\":\n\t\t\treturn recoverCancelledAssistantEffect(lane, drive, state);\n\t\tcase \"tools\":\n\t\t\treturn runTools(lane, drive, state);\n\t\tcase \"deferred.suspended\": {\n\t\t\tconst handle = await readDeferredHandle(lane, drive, state);\n\t\t\tawait cancelDeferredBestEffort(lane, drive, state, handle);\n\t\t\treturn publishAbortedTerminal(lane, drive, state);\n\t\t}\n\t\tcase \"deferred.effect_pending\": {\n\t\t\tconst handle = await readDeferredHandle(lane, drive, state);\n\t\t\tawait cancelDeferredBestEffort(lane, drive, state, handle);\n\t\t\treturn recoverCancelledAssistantEffect(lane, drive, state);\n\t\t}\n\t\tcase \"starting\":\n\t\tcase \"checkpoint\":\n\t\tcase \"assistant.ready\":\n\t\tcase \"assistant.retry_wait\":\n\t\tcase \"summary.deciding\":\n\t\tcase \"summary.ready\":\n\t\tcase \"summary.effect_pending\":\n\t\tcase \"summary.retry_wait\":\n\t\tcase \"navigation.ready_to_commit\":\n\t\t\treturn publishAbortedTerminal(lane, drive, state);\n\t}\n}\n"]}
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/reconcile.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DeferredHandle } from \"@earendil-works/pi-ai\";\nimport type { HarnessEvent } from \"../../agent-harness.ts\";\nimport { withModelTelemetry } from \"../../execution/model-telemetry.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport type {\n\tDeferredEffectPendingOperation,\n\tDeferredSuspendedOperation,\n\tOperationState,\n} from \"../../session/types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport type { Drive, ProcedureResult } from \"../types.ts\";\nimport { readDeferredSourceHandle } from \"./deferred.ts\";\nimport { recoverCancelledAssistantEffect } from \"./recovery.ts\";\nimport { operationCleanupWrites, operationResultRecord } from \"./terminal.ts\";\nimport { runTools } from \"./tools.ts\";\n\nasync function cancelDeferredBestEffort<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredSuspendedOperation | DeferredEffectPendingOperation,\n\thandle: DeferredHandle,\n): Promise<void> {\n\tconst identity = deferred.configuration.model;\n\tconst model = lane.models.getModel(identity.provider, identity.modelId);\n\tif (model === undefined) return;\n\ttry {\n\t\tawait withModelTelemetry(drive.context, (requestContext) =>\n\t\t\tlane.models.cancelDeferred(model, handle, {\n\t\t\t\tsignal: drive.closeSignal,\n\t\t\t\ttelemetry: requestContext.telemetry,\n\t\t\t\ttimeoutMs: deferred.streamOptions.timeoutMs,\n\t\t\t\tmaxRetries: deferred.streamOptions.maxRetries,\n\t\t\t\tmaxRetryDelayMs: deferred.streamOptions.maxRetryDelayMs,\n\t\t\t\theaders: deferred.streamOptions.headers,\n\t\t\t}),\n\t\t);\n\t} catch {\n\t\t// Remote cancellation is best-effort; durable local reconciliation must continue.\n\t}\n}\n\nasync function readDeferredHandle<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeferred: DeferredSuspendedOperation | DeferredEffectPendingOperation,\n): Promise<DeferredHandle> {\n\treturn lane.settleOperation(\n\t\tdeferred,\n\t\tasync (_state, _current, _meta, reader) => ({\n\t\t\tkind: \"return\",\n\t\t\tresult: await readDeferredSourceHandle(reader, deferred, drive.context),\n\t\t}),\n\t\tdrive.context,\n\t);\n}\n\nasync function publishAbortedTerminal<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: OperationState,\n): Promise<ProcedureResult> {\n\treturn lane.settleOperation(\n\t\tcapability,\n\t\tasync (state, current, meta, reader) => {\n\t\t\tif (current.control.status !== \"cancel_requested\") {\n\t\t\t\tthrow new SessionInvariantError(\"Cancellation reconciliation requires cancelled durable control\");\n\t\t\t}\n\t\t\tconst record = operationResultRecord(meta, \"aborted\", state.tipId);\n\t\t\tconst cleanup = await operationCleanupWrites(reader, drive.operationId, current, drive.context);\n\t\t\tconst events: HarnessEvent[] = [];\n\t\t\tif (meta.intent.kind === \"run\") {\n\t\t\t\tswitch (current.at) {\n\t\t\t\t\tcase \"summary.deciding\":\n\t\t\t\t\tcase \"summary.ready\":\n\t\t\t\t\tcase \"summary.effect_pending\":\n\t\t\t\t\tcase \"summary.retry_wait\":\n\t\t\t\t\t\tif (current.task.boundary.kind !== \"resume_checkpoint\" || current.task.reason === undefined) {\n\t\t\t\t\t\t\tthrow new SessionInvariantError(\"Cancelled run summary has an invalid result boundary\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tevents.push({\n\t\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\treason: current.task.reason,\n\t\t\t\t\t\t\tstatus: \"aborted\",\n\t\t\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: \"run_end\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tstatus: \"aborted\",\n\t\t\t\t\tfromTipId: meta.sourceTipId,\n\t\t\t\t\ttipId: state.tipId,\n\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t});\n\t\t\t} else if (meta.intent.kind === \"compaction\") {\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\treason: \"manual\",\n\t\t\t\t\tstatus: \"aborted\",\n\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: \"navigation_end\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tstatus: \"aborted\",\n\t\t\t\t\tfromTipId: meta.sourceTipId,\n\t\t\t\t\ttipId: state.tipId,\n\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"finish\",\n\t\t\t\twrites: cleanup,\n\t\t\t\trecord,\n\t\t\t\tmaterialize: () => ({ kind: \"settled\", outcome: record }) as const,\n\t\t\t\tevents: () => events,\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\n/** Advance one cancelled durable leaf without starting new ordinary work. */\nexport async function reconcileOperation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n): Promise<ProcedureResult> {\n\tconst operation = lane.state.operation;\n\tif (operation === null || operation.meta.operationId !== drive.operationId) {\n\t\tthrow new SessionInvariantError(`Drive ${drive.operationId} has no matching operation to reconcile`);\n\t}\n\tif (operation.state.control.status !== \"cancel_requested\") {\n\t\tthrow new SessionInvariantError(`Operation ${drive.operationId} is not cancelled`);\n\t}\n\tdrive.beginAbort(Promise.resolve());\n\tdrive.signalAbort();\n\n\tconst state = operation.state;\n\tswitch (state.at) {\n\t\tcase \"assistant.effect_pending\":\n\t\t\treturn recoverCancelledAssistantEffect(lane, drive, state);\n\t\tcase \"tools\":\n\t\t\treturn runTools(lane, drive, state);\n\t\tcase \"deferred.suspended\": {\n\t\t\tconst handle = await readDeferredHandle(lane, drive, state);\n\t\t\tawait cancelDeferredBestEffort(lane, drive, state, handle);\n\t\t\treturn publishAbortedTerminal(lane, drive, state);\n\t\t}\n\t\tcase \"deferred.effect_pending\": {\n\t\t\tconst handle = await readDeferredHandle(lane, drive, state);\n\t\t\tawait cancelDeferredBestEffort(lane, drive, state, handle);\n\t\t\treturn recoverCancelledAssistantEffect(lane, drive, state);\n\t\t}\n\t\tcase \"starting\":\n\t\tcase \"checkpoint\":\n\t\tcase \"assistant.ready\":\n\t\tcase \"assistant.retry_wait\":\n\t\tcase \"summary.deciding\":\n\t\tcase \"summary.ready\":\n\t\tcase \"summary.effect_pending\":\n\t\tcase \"summary.retry_wait\":\n\t\tcase \"navigation.ready_to_commit\":\n\t\t\treturn publishAbortedTerminal(lane, drive, state);\n\t}\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { isRetryableAssistantError, retryDelayMs, } from "@earendil-works/pi-ai";
2
2
  import { generateBranchSummaryWithRequest } from "../../compaction/branch-summarization.js";
3
3
  import { compactWithRequest, prepareCompaction, shouldCompact } from "../../compaction/compaction.js";
4
- import { getTelemetryContext, withAbortSignal } from "../../context.js";
4
+ import { withAbortSignal } from "../../context.js";
5
5
  import { AbortRequested } from "../../execution/effect-gate.js";
6
6
  import { applyStreamOptionsPatch } from "../../hooks.js";
7
7
  import { insertEntry, insertUsage } from "../../session/commit.js";
@@ -588,7 +588,7 @@ function requestStreamOptions(options, streamOptions, context, onPayload) {
588
588
  cacheRetention: "none",
589
589
  deferred: false,
590
590
  signal: context.abortSignal,
591
- telemetryContext: getTelemetryContext(context),
591
+ telemetry: context.telemetry,
592
592
  onPayload,
593
593
  };
594
594
  }