eve 0.52.3 → 0.52.5

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 (192) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/src/cli/commands/init-agent-workspace.d.ts +2 -0
  3. package/dist/src/cli/commands/init-agent-workspace.js +1 -1
  4. package/dist/src/cli/commands/init-install.d.ts +8 -0
  5. package/dist/src/cli/commands/init-install.js +1 -0
  6. package/dist/src/cli/commands/init.d.ts +3 -4
  7. package/dist/src/cli/commands/init.js +1 -1
  8. package/dist/src/cli/commands/registry-add-command.d.ts +3 -0
  9. package/dist/src/cli/commands/registry-add-command.js +1 -0
  10. package/dist/src/cli/commands/registry-metadata.d.ts +4 -1
  11. package/dist/src/cli/commands/registry-metadata.js +1 -1
  12. package/dist/src/cli/commands/registry.d.ts +1 -2
  13. package/dist/src/cli/commands/registry.js +1 -1
  14. package/dist/src/cli/run.js +2 -2
  15. package/dist/src/cli/telemetry/index.d.ts +3 -0
  16. package/dist/src/cli/telemetry/index.js +1 -1
  17. package/dist/src/compiled/.vendor-stamp.json +3 -2
  18. package/dist/src/compiled/@workflow/world-local/index.js +1 -1
  19. package/dist/src/compiler/extension-compatibility.d.ts +4 -4
  20. package/dist/src/compiler/extension-compatibility.js +1 -1
  21. package/dist/src/context/dynamic-model-lifecycle.js +1 -1
  22. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  23. package/dist/src/context/keys.d.ts +11 -2
  24. package/dist/src/context/keys.js +1 -1
  25. package/dist/src/evals/mock-model.js +1 -1
  26. package/dist/src/evals/reporters/index.d.ts +1 -0
  27. package/dist/src/evals/reporters/index.js +1 -1
  28. package/dist/src/evals/runner/reporters/datadog.d.ts +137 -0
  29. package/dist/src/evals/runner/reporters/datadog.js +3 -0
  30. package/dist/src/evals/runner/run-evals.d.ts +1 -1
  31. package/dist/src/evals/runner/run-evals.js +1 -1
  32. package/dist/src/execution/activity-cohort.d.ts +20 -0
  33. package/dist/src/execution/activity-cohort.js +1 -0
  34. package/dist/src/execution/authorization-callback-match.d.ts +1 -0
  35. package/dist/src/execution/authorization-callback-match.js +1 -1
  36. package/dist/src/execution/parked-delivery-wait.js +1 -1
  37. package/dist/src/execution/sandbox/bindings/vercel-options.d.ts +10 -0
  38. package/dist/src/execution/sandbox/bindings/vercel-options.js +1 -0
  39. package/dist/src/execution/sandbox/bindings/vercel.js +2 -1
  40. package/dist/src/execution/sandbox/shell-quote.d.ts +1 -12
  41. package/dist/src/execution/sandbox/shell-quote.js +1 -1
  42. package/dist/src/execution/session-activity-projection.d.ts +2 -0
  43. package/dist/src/execution/session-activity-projection.js +1 -1
  44. package/dist/src/execution/session-command-inbox.js +1 -1
  45. package/dist/src/execution/skills/instructions.js +1 -1
  46. package/dist/src/execution/tasks/child/workflow.js +1 -1
  47. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  48. package/dist/src/execution/tool-auth.d.ts +4 -32
  49. package/dist/src/execution/tool-auth.js +1 -1
  50. package/dist/src/execution/tools/connection-search.js +2 -2
  51. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  52. package/dist/src/execution/tools/subagent/accept-event-step.d.ts +1 -1
  53. package/dist/src/execution/tools/subagent/accept-event-step.js +1 -1
  54. package/dist/src/execution/tools/subagent/invoke-agent.js +1 -1
  55. package/dist/src/execution/tools/subagent/invoke-step.js +1 -1
  56. package/dist/src/execution/tools/workflow/ask.d.ts +3 -2
  57. package/dist/src/execution/tools/workflow/ask.js +1 -1
  58. package/dist/src/execution/tools/workflow/authorization-completion.d.ts +3 -0
  59. package/dist/src/execution/tools/workflow/authorization-completion.js +1 -0
  60. package/dist/src/execution/tools/workflow/body.d.ts +2 -0
  61. package/dist/src/execution/tools/workflow/body.js +1 -1
  62. package/dist/src/execution/tools/workflow/step-context.d.ts +31 -0
  63. package/dist/src/execution/tools/workflow/step-context.js +1 -0
  64. package/dist/src/execution/tools/workflow/step-execution.d.ts +3 -0
  65. package/dist/src/execution/tools/workflow/step-execution.js +1 -0
  66. package/dist/src/execution/tools/workflow/step.d.ts +3 -0
  67. package/dist/src/execution/tools/workflow/step.js +1 -0
  68. package/dist/src/execution/turn-workflow-tool-run.js +1 -1
  69. package/dist/src/execution/wire/session-inbox-contract.d.ts +7 -0
  70. package/dist/src/execution/wire/session-inbox-contract.js +1 -1
  71. package/dist/src/execution/wire/session-inbox-resume.d.ts +2 -0
  72. package/dist/src/execution/wire/session-inbox-resume.js +1 -1
  73. package/dist/src/execution/workflow-steps.js +1 -1
  74. package/dist/src/harness/approval-delivery-coordinator.js +1 -1
  75. package/dist/src/harness/authorization.d.ts +6 -2
  76. package/dist/src/harness/authorization.js +1 -1
  77. package/dist/src/harness/compaction.js +1 -1
  78. package/dist/src/harness/current-messages.d.ts +8 -2
  79. package/dist/src/harness/current-messages.js +1 -1
  80. package/dist/src/harness/hitl/approval-input-requests.js +1 -1
  81. package/dist/src/harness/input-requests.js +1 -1
  82. package/dist/src/harness/pending-input-batches.d.ts +4 -0
  83. package/dist/src/harness/pending-input-batches.js +1 -1
  84. package/dist/src/harness/tool-loop.js +2 -2
  85. package/dist/src/harness/turn-client-context.d.ts +1 -1
  86. package/dist/src/internal/application/package.js +1 -1
  87. package/dist/src/internal/authored-definition/connection.js +1 -1
  88. package/dist/src/internal/authored-package-boundary.js +1 -1
  89. package/dist/src/internal/mock-model-identity.d.ts +2 -0
  90. package/dist/src/internal/mock-model-identity.js +1 -0
  91. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  92. package/dist/src/internal/vercel/build-command.d.ts +2 -1
  93. package/dist/src/internal/vercel/build-command.js +1 -1
  94. package/dist/src/internal/workflow-bundle/builder-support.js +1 -1
  95. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  96. package/dist/src/internal/workflow-bundle/workflow-transformer.d.ts +3 -5
  97. package/dist/src/internal/workflow-bundle/workflow-transformer.js +4 -3
  98. package/dist/src/public/channels/github/checkout.js +1 -1
  99. package/dist/src/public/channels/slack/activity.js +1 -1
  100. package/dist/src/public/tools/index.d.ts +1 -0
  101. package/dist/src/public/tools/index.js +1 -1
  102. package/dist/src/runtime/authorization-context.d.ts +14 -0
  103. package/dist/src/runtime/authorization-context.js +1 -0
  104. package/dist/src/runtime/connections/mcp-client.js +1 -1
  105. package/dist/src/runtime/connections/scoped-authorization.d.ts +18 -2
  106. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  107. package/dist/src/runtime/resolve-connection.js +1 -1
  108. package/dist/src/runtime/sandbox/keys.js +1 -1
  109. package/dist/src/sandbox/backends/default.d.ts +2 -0
  110. package/dist/src/sandbox/backends/default.js +1 -1
  111. package/dist/src/self-modification/agent.d.ts +5 -2
  112. package/dist/src/self-modification/agent.js +1 -1
  113. package/dist/src/self-modification/config.d.ts +52 -0
  114. package/dist/src/self-modification/config.js +1 -0
  115. package/dist/src/self-modification/credentials.d.ts +18 -0
  116. package/dist/src/self-modification/credentials.js +1 -0
  117. package/dist/src/self-modification/extension/eve-add.d.ts +7 -2
  118. package/dist/src/self-modification/extension/eve-add.js +1 -1
  119. package/dist/src/self-modification/extension/extension.d.ts +46 -1
  120. package/dist/src/self-modification/extension/extension.js +1 -1
  121. package/dist/src/self-modification/extension/instructions.js +23 -9
  122. package/dist/src/self-modification/extension/production-registry-add.d.ts +42 -0
  123. package/dist/src/self-modification/extension/production-registry-add.js +1 -0
  124. package/dist/src/self-modification/extension/tools/edit_file.js +1 -1
  125. package/dist/src/self-modification/extension/tools/publish.d.ts +7 -0
  126. package/dist/src/self-modification/extension/tools/publish.js +1 -0
  127. package/dist/src/self-modification/extension/tools/registry_add.d.ts +39 -7
  128. package/dist/src/self-modification/extension/tools/registry_add.js +1 -1
  129. package/dist/src/self-modification/extension/tools/search_registry.d.ts +1 -0
  130. package/dist/src/self-modification/extension/tools/search_registry.js +1 -1
  131. package/dist/src/self-modification/filesystem.js +1 -1
  132. package/dist/src/self-modification/git-workspace.d.ts +31 -0
  133. package/dist/src/self-modification/git-workspace.js +1 -0
  134. package/dist/src/self-modification/git.d.ts +6 -0
  135. package/dist/src/self-modification/git.js +1 -0
  136. package/dist/src/self-modification/github-publisher.d.ts +27 -0
  137. package/dist/src/self-modification/github-publisher.js +2 -0
  138. package/dist/src/self-modification/identifiers.d.ts +4 -0
  139. package/dist/src/self-modification/identifiers.js +1 -0
  140. package/dist/src/self-modification/mode.d.ts +4 -0
  141. package/dist/src/self-modification/mode.js +1 -0
  142. package/dist/src/self-modification/network-policy.d.ts +1 -0
  143. package/dist/src/self-modification/network-policy.js +1 -0
  144. package/dist/src/self-modification/proposal.d.ts +39 -0
  145. package/dist/src/self-modification/proposal.js +2 -0
  146. package/dist/src/self-modification/sandbox.d.ts +25 -1
  147. package/dist/src/self-modification/sandbox.js +1 -1
  148. package/dist/src/self-modification/setup.d.ts +34 -0
  149. package/dist/src/self-modification/setup.js +22 -0
  150. package/dist/src/self-modification/workspace-lock.d.ts +2 -0
  151. package/dist/src/self-modification/workspace-lock.js +1 -0
  152. package/dist/src/setup/integrations/registry.js +1 -1
  153. package/dist/src/setup/integrations/runner.js +1 -1
  154. package/dist/src/setup/integrations/self-modification/setup.d.ts +29 -0
  155. package/dist/src/setup/integrations/self-modification/setup.js +1 -0
  156. package/dist/src/setup/integrations/types.d.ts +2 -0
  157. package/dist/src/setup/integrations/types.js +1 -1
  158. package/dist/src/setup/scaffold/create/project.js +1 -1
  159. package/dist/src/shared/empty-delivery.js +1 -1
  160. package/dist/src/shared/git.d.ts +16 -0
  161. package/dist/src/shared/git.js +1 -0
  162. package/dist/src/shared/shell-quote.d.ts +2 -0
  163. package/dist/src/shared/shell-quote.js +1 -0
  164. package/dist/src/shared/vercel-services.js +1 -1
  165. package/dist/src/tasks/delivery-context.d.ts +2 -2
  166. package/dist/src/tasks/delivery-context.js +2 -18
  167. package/dist/src/tasks/delivery-policy.js +1 -1
  168. package/dist/src/tasks/session-index.d.ts +1 -1
  169. package/dist/src/tasks/session-index.js +1 -1
  170. package/dist/src/tasks/session-task-cohorts.d.ts +10 -0
  171. package/dist/src/tasks/session-task-cohorts.js +1 -0
  172. package/dist/src/tools/durable-callbacks.d.ts +18 -1
  173. package/dist/src/tools/durable-callbacks.js +1 -1
  174. package/dist/src/tools/workflow-definition.d.ts +5 -2
  175. package/docs/channels/overview.mdx +2 -0
  176. package/docs/channels/slack.mdx +2 -0
  177. package/docs/concepts/sessions-runs-and-streaming.md +2 -0
  178. package/docs/evals/reporters.mdx +20 -1
  179. package/docs/evals/running.mdx +3 -1
  180. package/docs/guides/dynamic-capabilities.md +36 -1
  181. package/docs/guides/instrumentation.md +3 -2
  182. package/docs/instructions.mdx +1 -1
  183. package/docs/reference/cli.md +1 -1
  184. package/docs/reference/telemetry.md +1 -1
  185. package/docs/reference/typescript-api.md +36 -35
  186. package/docs/sandbox.mdx +2 -0
  187. package/docs/subagents/index.mdx +10 -0
  188. package/docs/tools/overview.mdx +4 -2
  189. package/docs/tools/workflows.mdx +61 -2
  190. package/package.json +17 -1
  191. package/dist/src/self-modification/extension/source-lock.d.ts +0 -2
  192. package/dist/src/self-modification/extension/source-lock.js +0 -1
@@ -0,0 +1,137 @@
1
+ import type { EvalReporter } from "#evals/runner/reporters/types.js";
2
+ /** Configuration for the Datadog reporter. */
3
+ export interface DatadogReporterConfig {
4
+ /** Datadog LLM Observability project name. Defaults to `DD_LLMOBS_PROJECT_NAME`, the configured ml_app, `DD_SERVICE`, or the first eval id. */
5
+ readonly projectName?: string;
6
+ /** Name for the dataset used by the experiment. Defaults to `<experimentName> dataset`. */
7
+ readonly datasetName?: string;
8
+ /** Name for the created experiment. Defaults to a timestamped eve eval run name. */
9
+ readonly experimentName?: string;
10
+ /** Optional experiment description. */
11
+ readonly description?: string;
12
+ /** Datadog service name used when the reporter initializes `dd-trace`. */
13
+ readonly service?: string;
14
+ /** Datadog env used when the reporter initializes `dd-trace`. */
15
+ readonly env?: string;
16
+ /** Datadog site used when the reporter initializes `dd-trace`. */
17
+ readonly site?: string;
18
+ /** LLM Observability ml_app used when the reporter initializes `dd-trace`. Defaults to `projectName`. */
19
+ readonly mlApp?: string;
20
+ /** Tags attached to the Datadog Experiment. */
21
+ readonly tags?: Readonly<Record<string, string>>;
22
+ /** JSON-serializable metadata attached to the Datadog Experiment. */
23
+ readonly metadata?: Readonly<Record<string, unknown>>;
24
+ /** JSON-serializable Datadog Experiment config. */
25
+ readonly config?: Readonly<Record<string, unknown>>;
26
+ /** Include the first sent message, falling back to the eval description, in the experiment row and a linked dataset record. Defaults to false. */
27
+ readonly recordInputs?: boolean;
28
+ /** Include eval outputs in the synthetic experiment row output. Defaults to false. */
29
+ readonly recordOutputs?: boolean;
30
+ /** Include `metadata.expectedOutput`, `metadata.expected`, or `metadata.expected_output` on experiment rows. Defaults to false. */
31
+ readonly recordExpectedOutputs?: boolean;
32
+ /** Include raw assertion names as metric tags and failure messages in row metadata. Defaults to false. */
33
+ readonly recordAssertionDetails?: boolean;
34
+ /** Include execution error messages, which may contain application data. Defaults to false. */
35
+ readonly recordErrors?: boolean;
36
+ /** Console hook used for tests. */
37
+ readonly log?: (line: string) => void;
38
+ /** eve-owned client seam for tests and custom Datadog SDK wiring. */
39
+ readonly client?: DatadogExperimentsClient;
40
+ }
41
+ type DatadogJsonValue = string | number | boolean | null | DatadogJsonValue[] | {
42
+ [key: string]: DatadogJsonValue;
43
+ };
44
+ interface DatadogDatasetRecordInput {
45
+ inputData: DatadogJsonValue;
46
+ expectedOutput?: DatadogJsonValue;
47
+ metadata?: Record<string, DatadogJsonValue>;
48
+ tags?: string[];
49
+ }
50
+ interface DatadogDatasetRecord {
51
+ readonly id: string | null;
52
+ }
53
+ interface DatadogDataset {
54
+ id(): string | null;
55
+ name(): string;
56
+ version(): number | null;
57
+ records(): readonly DatadogDatasetRecord[];
58
+ url(): string | null;
59
+ push(): Promise<{
60
+ pushedCount: number;
61
+ totalCount: number;
62
+ }>;
63
+ }
64
+ interface DatadogExperimentsClient {
65
+ createDataset?(name: string, options?: {
66
+ projectName?: string;
67
+ description?: string;
68
+ records?: DatadogDatasetRecordInput[];
69
+ }): DatadogDataset;
70
+ startExperiment(options: DatadogStartExperimentOptions): Promise<DatadogExternalExperiment>;
71
+ }
72
+ interface DatadogStartExperimentOptions {
73
+ name: string;
74
+ projectName?: string;
75
+ description?: string;
76
+ tags?: Record<string, string>;
77
+ metadata?: Record<string, DatadogJsonValue>;
78
+ config?: Record<string, DatadogJsonValue>;
79
+ dataset?: {
80
+ id?: string;
81
+ version?: number;
82
+ name?: string;
83
+ description?: string;
84
+ };
85
+ }
86
+ interface DatadogExternalExperiment {
87
+ experimentId(): string;
88
+ url(): string | null;
89
+ submitSpan(row: DatadogExternalExperimentSpanInput): Promise<DatadogExternalExperimentSpan>;
90
+ submitEvaluationMetrics(span: Pick<DatadogExternalExperimentSpan, "experimentId" | "spanId" | "traceId">, metrics: DatadogEvaluationMetricInput[]): Promise<void>;
91
+ close(options?: {
92
+ status?: string;
93
+ error?: string | Error;
94
+ }): Promise<void>;
95
+ }
96
+ interface DatadogExternalExperimentSpanInput {
97
+ name?: string;
98
+ input?: DatadogJsonValue;
99
+ output?: DatadogJsonValue;
100
+ expectedOutput?: DatadogJsonValue;
101
+ metadata?: Record<string, DatadogJsonValue>;
102
+ tags?: Record<string, string>;
103
+ startedAt?: Date | string | number;
104
+ completedAt?: Date | string | number;
105
+ durationMs?: number;
106
+ error?: string | Error | {
107
+ type?: string;
108
+ name?: string;
109
+ message?: string;
110
+ stack?: string;
111
+ };
112
+ datasetRecordId?: string;
113
+ runId?: string;
114
+ runIteration?: number;
115
+ }
116
+ interface DatadogExternalExperimentSpan {
117
+ experimentId: string;
118
+ spanId: string;
119
+ traceId: string;
120
+ url: string | null;
121
+ }
122
+ interface DatadogEvaluationMetricInput {
123
+ label: string;
124
+ value?: DatadogJsonValue;
125
+ error?: string | Error;
126
+ timestamp?: Date | string | number;
127
+ tags?: Record<string, string>;
128
+ source?: string;
129
+ }
130
+ /**
131
+ * Creates an {@link EvalReporter} that uploads eval assertion scores to a
132
+ * Datadog LLM Observability Experiment. Requires the optional `dd-trace`
133
+ * package and `DD_API_KEY`/`DD_APP_KEY` credentials unless `config.client` is
134
+ * provided.
135
+ */
136
+ export declare function Datadog(config?: DatadogReporterConfig): EvalReporter;
137
+ export {};
@@ -0,0 +1,3 @@
1
+ import{createRequire}from"node:module";import{parseJsonValue}from"#shared/json.js";import{resolveLocalGitMetadata}from"#evals/runner/resolve-git-metadata.js";function Datadog(e={}){return new DatadogReporter(e)}var DatadogReporter=class{#e;#t=new Map;#n;#r;#i;#a;constructor(e){this.#e=e}async onRunStart(e,t){this.#n=void 0,this.#r=void 0,this.#i=void 0,this.#a=void 0,this.#t.clear();for(let t of e)this.#t.set(t.id,t);let n=await resolveDatadogClient(this.#e,e),r=resolveLocalGitMetadata(process.cwd()),i=this.#e.experimentName??defaultExperimentName(),a=resolveExperimentMetadata(e,t);r.sha&&(a.eveGitCommit=r.sha,a.eveGitBranch=r.branch),Object.assign(a,this.#e.metadata);let o={name:i,projectName:resolveProjectName(this.#e,e),description:this.#e.description,dataset:{name:this.#e.datasetName??`${i} dataset`},tags:resolveExperimentTags(this.#e,t),metadata:toDatadogJsonRecord(a),config:toDatadogJsonRecord(this.#e.config)};if(this.#e.recordInputs){if(!n.createDataset)throw Error(`The installed 'dd-trace' package does not expose tracer.llmobs.experiments.createDataset().`);this.#n=n,this.#r=o;return}this.#i=await n.startExperiment(o)}async onEvalComplete(e){!this.#e.recordInputs&&this.#i&&await this.#s(e)}async onRunComplete(e){try{if(this.#e.recordInputs&&await this.#o(e.results),!this.#i)return;let t=e.failed>0||e.errored>0;await this.#i.close({status:t?`failed`:`completed`,error:t?`${e.failed} failed, ${e.errored} errored`:void 0});let n=this.#e.log??console.log;this.#a&&n(`Datadog dataset URL: ${this.#a}\n`);let r=this.#i.url();r&&n(`Datadog experiment URL: ${r}\n`)}finally{this.#n=void 0,this.#r=void 0,this.#i=void 0,this.#a=void 0}}async#o(e){let t=this.#n,n=this.#r;if(!t?.createDataset||!n)return;let r=n.dataset?.name??`${n.name} dataset`,i=e.map(e=>{let t=this.#t.get(e.id),n={inputData:toDatadogJsonValue(resolveInput(e,t)),metadata:{eveEvalId:e.id}};if(this.#e.recordExpectedOutputs){let e=toOptionalDatadogJsonValue(resolveExpectedOutput(t));e!==void 0&&(n.expectedOutput=e)}return n}),a=t.createDataset(r,{projectName:n.projectName,description:this.#e.description??`Eve eval inputs for experiment '${n.name}'.`,records:i});await a.push();let o=a.id();if(!o)throw Error(`Datadog dataset '${r}' has no id after push().`);let s=a.records();if(s.length!==e.length)throw Error(`Datadog dataset '${r}' has ${s.length} records for ${e.length} eval results.`);let c={id:o,name:a.name()},l=a.version();l!==null&&(c.version=l),this.#a=a.url()??void 0,this.#i=await t.startExperiment({...n,dataset:c});for(let[t,n]of e.entries()){let e=s[t]?.id;if(!e)throw Error(`Datadog dataset record ${t+1} has no id after push().`);await this.#s(n,e)}}async#s(e,t){if(!this.#i)return;let n=this.#t.get(e.id),r={name:e.id,metadata:toDatadogJsonRecord(resolveResultMetadata(e,n,this.#e.recordAssertionDetails===!0)),tags:resolveResultTags(e,n),startedAt:e.startedAt,completedAt:e.completedAt,durationMs:elapsedMs(e.startedAt,e.completedAt)};this.#e.recordInputs&&(r.input=toOptionalDatadogJsonValue(resolveInput(e,n))),this.#e.recordOutputs&&(r.output=toOptionalDatadogJsonValue(e.result.output)),this.#e.recordExpectedOutputs&&(r.expectedOutput=toOptionalDatadogJsonValue(resolveExpectedOutput(n))),this.#e.recordErrors&&e.error!==void 0&&(r.error=e.error),t!==void 0&&(r.datasetRecordId=t);let i=await this.#i.submitSpan(r);await this.#i.submitEvaluationMetrics(i,resolveEvaluationMetrics(e,this.#e.recordAssertionDetails===!0))}};const DD_TRACE_PACKAGE=`dd-trace`,EXPECTED_OUTPUT_METADATA_KEYS=new Set([`expectedOutput`,`expected`,`expected_output`]),BUILT_IN_METRIC_LABELS=[`eve_tool_call_count`,`eve_subagent_call_count`,`eve_message_count`,`eve_reasoning_block_count`];async function resolveDatadogClient(e,t){if(e.client)return e.client;let n=await loadDatadogSdk(),r=resolveProjectName(e,t),i=n.init({service:e.service??process.env.DD_SERVICE??r,env:e.env??process.env.DD_ENV,site:e.site??process.env.DD_SITE,llmobs:{projectName:r,mlApp:e.mlApp??r,agentlessEnabled:!0}}).llmobs?.experiments;if(!i?.startExperiment)throw Error([`The installed 'dd-trace' package does not expose tracer.llmobs.experiments.startExperiment().`,`Update to a release compatible with dd-trace@6.13.0.`].join(`
2
+ `));return i}async function loadDatadogSdk(){try{return createRequire(`${process.cwd()}/package.json`)(DD_TRACE_PACKAGE)}catch{try{let e=await import(DD_TRACE_PACKAGE);return e.default??e}catch{throw Error([`The 'dd-trace' package is required for Datadog reporting but was not found.`,``,`Install the tested release with:`,` npm install dd-trace@6.13.0`].join(`
3
+ `))}}}function resolveProjectName(e,t){return e.projectName??process.env.DD_LLMOBS_PROJECT_NAME??e.mlApp??process.env.DD_LLMOBS_ML_APP??process.env.DD_SERVICE??t[0]?.id??`eve evals`}function defaultExperimentName(){return`eve evals ${new Date().toISOString()}`}function resolveExperimentTags(e,t){return{source:`eve`,target_kind:t.kind,...e.tags}}function resolveExperimentMetadata(e,t){let n={eveEvalIds:e.map(e=>e.id),eveTargetKind:t.kind,eveTimestamp:new Date().toISOString()},r=resolveTargetOrigin(t.url);return r!==void 0&&(n.eveTargetOrigin=r),n}function resolveTargetOrigin(e){try{let t=new URL(e).origin;return t===`null`?void 0:t}catch{return}}function resolveResultTags(e,t){let n={eval_id:e.id,eval_verdict:e.verdict,eval_status:e.result.status};return t?.tags?.length&&(n.eval_tags=t.tags.join(`,`)),n}function resolveInput(e,t){for(let t of e.result.events)if(t.type===`message.received`)return t.data.message;return t?.description??``}function resolveExpectedOutput(e){if(e?.metadata)return e.metadata.expectedOutput??e.metadata.expected??e.metadata.expected_output}function resolveResultMetadata(e,t,n){let r={};for(let[e,n]of Object.entries(t?.metadata??{}))EXPECTED_OUTPUT_METADATA_KEYS.has(e)||(r[e]=n);if(Object.assign(r,{eveSessionId:e.result.sessionId,eveStatus:e.result.status,eveVerdict:e.verdict,eveSkipReason:e.skipReason,eveToolCalls:e.result.derived.toolCalls.map(e=>e.name),eveSubagentCalls:e.result.derived.subagentCalls.map(e=>e.name),eveParked:e.result.derived.parked}),n){let t=e.assertions.filter(e=>!e.passed).map(e=>({name:e.name,message:e.message}));t.length>0&&(r.eveFailedAssertions=t)}return e.result.derived.failureCode&&(r.eveFailureCode=e.result.derived.failureCode),r}function resolveEvaluationMetrics(e,t){let n=[],r=new Set(BUILT_IN_METRIC_LABELS);for(let[i,a]of e.assertions.entries()){let e=a.severity===`gate`?`gate_${a.name}`:a.name,o={assertion_index:String(i+1),assertion_severity:a.severity,assertion_passed:String(a.passed)};t&&(o.assertion_name=a.name,o.assertion_label=e),n.push({label:reserveDatadogMetricLabel(toDatadogMetricLabel(e),r),value:a.score,tags:o})}return n.push({label:`eve_tool_call_count`,value:e.result.derived.toolCallCount},{label:`eve_subagent_call_count`,value:e.result.derived.subagentCallCount},{label:`eve_message_count`,value:e.result.derived.messageCount},{label:`eve_reasoning_block_count`,value:e.result.derived.reasoningBlockCount}),n}function toDatadogMetricLabel(e){return e.replace(/[^a-zA-Z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``)||`metric`}function reserveDatadogMetricLabel(e,t){let n=e,r=2;for(;t.has(n);)n=`${e}_${r}`,r+=1;return t.add(n),n}function elapsedMs(e,t){let n=Date.parse(e),r=Date.parse(t);if(Number.isFinite(n)&&Number.isFinite(r))return Math.max(0,r-n)}function toOptionalDatadogJsonValue(e){return e===void 0?void 0:toDatadogJsonValue(e)}function toDatadogJsonRecord(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=toDatadogJsonValue(r));return t}function toDatadogJsonValue(e){return cloneDatadogJsonValue(parseJsonValue(e))}function cloneDatadogJsonValue(e){if(Array.isArray(e))return e.map(e=>cloneDatadogJsonValue(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=cloneDatadogJsonValue(r);return t}return e}export{Datadog};
@@ -22,7 +22,7 @@ export interface RunEvalsOptions {
22
22
  readonly maxConcurrency?: number;
23
23
  /** Overrides every eval's `timeoutMs` when set (CLI `--timeout`). */
24
24
  readonly timeoutMs?: number;
25
- /** Receives `t.log` lines as evals run (used by `--verbose`). */
25
+ /** Receives verbose activity lines as evals run. */
26
26
  readonly onEvalLog?: (evalId: string, message: string) => void;
27
27
  }
28
28
  /**
@@ -1 +1 @@
1
- import{resolveArtifactDirectory,writeArtifacts}from"#evals/runner/artifacts.js";import{executeEval}from"#evals/runner/execute-eval.js";async function runEvals(e){let{config:t,target:n,client:r,appRoot:i}=e,a=e.maxConcurrency??t.maxConcurrency??8;if(!Number.isInteger(a)||a<1)throw Error(`Eval maxConcurrency must be a positive integer; got ${String(e.maxConcurrency??t.maxConcurrency)}.`);let o=e.evaluations.map(e=>applyConfigDefaults(e,t)),s=new Date().toISOString(),c=buildReporterBindings({...e,evaluations:o});for(let e of c)await e.reporter.onRunStart(o.filter(t=>e.evalIds.has(t.id)),n);let l=[],u=[...o],d=new Set,f=Promise.resolve(),enqueueReporterCallback=(e,t)=>{f=f.then(async()=>{for(let n of c)n.evalIds.has(e.id)&&await t(n.reporter)})};for(;u.length>0||d.size>0;){for(;u.length>0&&d.size<a;){let t=u.shift();if(t===void 0)break;let i=new Date().toISOString();enqueueReporterCallback(t,async e=>{await e.onEvalStart?.({evaluation:t,startedAt:i,target:n})});let a=(async()=>{let a=await executeEval({client:r,evaluation:t,onLog:e.onEvalLog===void 0?void 0:n=>e.onEvalLog?.(t.id,n),onSessionStart:e=>{enqueueReporterCallback(t,async r=>{await r.onSessionStart?.({evaluation:t,primary:e.primary,sessionId:e.sessionId,startedAt:e.startedAt,target:n,traceContext:e.traceContext})})},startedAt:i,target:n,timeoutMs:e.timeoutMs});l.push(a),enqueueReporterCallback(t,async e=>{await e.onEvalComplete(a,{evaluation:t,target:n,traceContexts:a.result.traceContexts})})})().finally(()=>{d.delete(a)});d.add(a)}d.size>0&&await Promise.race(d)}await f;let p=new Map(o.map((e,t)=>[e.id,t]));l.sort((e,t)=>(p.get(e.id)??0)-(p.get(t.id)??0));let m=buildSummary(n,l,s),h=resolveArtifactDirectory(i);await writeArtifacts(h,m);for(let e of c)await e.reporter.onRunComplete(scopeSummary(m,e.evalIds));return m}function buildReporterBindings(e){let t=new Set(e.evaluations.map(e=>e.id)),n=new Set(e.reporters);if(e.includeEvalReporters!==!1)for(let t of e.config.reporters??[])n.add(t);let r=[...n].map(e=>({reporter:e,evalIds:t}));if(e.includeEvalReporters===!1)return r;let i=new Map;for(let t of e.evaluations)for(let e of t.reporters??[]){if(n.has(e))continue;let r=i.get(e)??new Set;r.add(t.id),i.set(e,r)}for(let[e,t]of i)r.push({reporter:e,evalIds:t});return r}function applyConfigDefaults(e,t){let n=e.judge??t.judge,r=e.timeoutMs??t.timeoutMs;return n===e.judge&&r===e.timeoutMs?e:{...e,judge:n,timeoutMs:r}}function buildSummary(e,t,n){return{target:e,results:t,startedAt:n,completedAt:new Date().toISOString(),passed:countVerdicts(t,`passed`),failed:countVerdicts(t,`failed`),scored:countVerdicts(t,`scored`),skipped:countVerdicts(t,`skipped`),errored:t.filter(e=>e.error!==void 0).length}}function scopeSummary(e,t){if(e.results.every(e=>t.has(e.id)))return e;let n=e.results.filter(e=>t.has(e.id));return{...e,results:n,passed:countVerdicts(n,`passed`),failed:countVerdicts(n,`failed`),scored:countVerdicts(n,`scored`),skipped:countVerdicts(n,`skipped`),errored:n.filter(e=>e.error!==void 0).length}}function countVerdicts(e,t){return e.filter(e=>e.verdict===t).length}export{runEvals};
1
+ import{resolveArtifactDirectory,writeArtifacts}from"#evals/runner/artifacts.js";import{executeEval}from"#evals/runner/execute-eval.js";async function runEvals(e){let{config:t,target:n,client:r,appRoot:i}=e,a=e.maxConcurrency??t.maxConcurrency??8;if(!Number.isInteger(a)||a<1)throw Error(`Eval maxConcurrency must be a positive integer; got ${String(e.maxConcurrency??t.maxConcurrency)}.`);let o=e.evaluations.map(e=>applyConfigDefaults(e,t)),s=new Date().toISOString(),c=buildReporterBindings({...e,evaluations:o});for(let e of c)await e.reporter.onRunStart(o.filter(t=>e.evalIds.has(t.id)),n);let l=[],u=[...o],d=new Set,f=Promise.resolve(),enqueueReporterCallback=(e,t)=>{f=f.then(async()=>{for(let n of c)n.evalIds.has(e.id)&&await t(n.reporter)})};for(;u.length>0||d.size>0;){for(;u.length>0&&d.size<a;){let t=u.shift();if(t===void 0)break;let i=new Date().toISOString();enqueueReporterCallback(t,async e=>{await e.onEvalStart?.({evaluation:t,startedAt:i,target:n})});let a=(async()=>{let a=await executeEval({client:r,evaluation:t,onLog:e.onEvalLog===void 0?void 0:n=>e.onEvalLog?.(t.id,n),onSessionStart:e=>{enqueueReporterCallback(t,async r=>{await r.onSessionStart?.({evaluation:t,primary:e.primary,sessionId:e.sessionId,startedAt:e.startedAt,target:n,traceContext:e.traceContext})})},startedAt:i,target:n,timeoutMs:e.timeoutMs});l.push(a);for(let n of a.result.sessions??[]){if(n.sessionId===void 0)continue;let r=n.primary?`primary session`:`secondary session`;e.onEvalLog?.(t.id,`workflow run id (${r}): ${n.sessionId}`)}enqueueReporterCallback(t,async e=>{await e.onEvalComplete(a,{evaluation:t,target:n,traceContexts:a.result.traceContexts})})})().finally(()=>{d.delete(a)});d.add(a)}d.size>0&&await Promise.race(d)}await f;let p=new Map(o.map((e,t)=>[e.id,t]));l.sort((e,t)=>(p.get(e.id)??0)-(p.get(t.id)??0));let m=buildSummary(n,l,s),h=resolveArtifactDirectory(i);await writeArtifacts(h,m);for(let e of c)await e.reporter.onRunComplete(scopeSummary(m,e.evalIds));return m}function buildReporterBindings(e){let t=new Set(e.evaluations.map(e=>e.id)),n=new Set(e.reporters);if(e.includeEvalReporters!==!1)for(let t of e.config.reporters??[])n.add(t);let r=[...n].map(e=>({reporter:e,evalIds:t}));if(e.includeEvalReporters===!1)return r;let i=new Map;for(let t of e.evaluations)for(let e of t.reporters??[]){if(n.has(e))continue;let r=i.get(e)??new Set;r.add(t.id),i.set(e,r)}for(let[e,t]of i)r.push({reporter:e,evalIds:t});return r}function applyConfigDefaults(e,t){let n=e.judge??t.judge,r=e.timeoutMs??t.timeoutMs;return n===e.judge&&r===e.timeoutMs?e:{...e,judge:n,timeoutMs:r}}function buildSummary(e,t,n){return{target:e,results:t,startedAt:n,completedAt:new Date().toISOString(),passed:countVerdicts(t,`passed`),failed:countVerdicts(t,`failed`),scored:countVerdicts(t,`scored`),skipped:countVerdicts(t,`skipped`),errored:t.filter(e=>e.error!==void 0).length}}function scopeSummary(e,t){if(e.results.every(e=>t.has(e.id)))return e;let n=e.results.filter(e=>t.has(e.id));return{...e,results:n,passed:countVerdicts(n,`passed`),failed:countVerdicts(n,`failed`),scored:countVerdicts(n,`scored`),skipped:countVerdicts(n,`skipped`),errored:n.filter(e=>e.error!==void 0).length}}function countVerdicts(e,t){return e.filter(e=>e.verdict===t).length}export{runEvals};
@@ -0,0 +1,20 @@
1
+ import type { DeliverHookPayload } from "#channel/types.js";
2
+ import type { MatchedAuthorizationCallback } from "#execution/authorization-callback-match.js";
3
+ import type { PendingAuthorizationState } from "#harness/authorization.js";
4
+ import type { ContextContainer } from "#context/container.js";
5
+ import type { SessionStateMap } from "#harness/types.js";
6
+ import type { UnstampedMessageStreamEvent } from "#protocol/message.js";
7
+ export declare function updateActivityRootForDelivery(input: {
8
+ readonly activeTurnId: string;
9
+ readonly ctx: ContextContainer;
10
+ readonly delivery?: DeliverHookPayload;
11
+ readonly sessionState: SessionStateMap | undefined;
12
+ readonly taskRootTurnId?: string;
13
+ }): void;
14
+ export declare function restoreAuthorizationActivity(input: {
15
+ readonly ctx: ContextContainer;
16
+ readonly matches: readonly MatchedAuthorizationCallback[];
17
+ readonly pending: PendingAuthorizationState;
18
+ }): readonly string[];
19
+ export declare function updateActivityBlockers(ctx: ContextContainer, event: UnstampedMessageStreamEvent): void;
20
+ export declare function clearActivityBlockers(ctx: ContextContainer, ids: readonly string[]): void;
@@ -0,0 +1 @@
1
+ import{ActivityObserverKey,ActivityPendingBlockersKey,ActivityRootTurnIdKey}from"#context/keys.js";import{activityRequestIdsForRootTurn,activityRootTurnIdForInputResponses}from"#harness/pending-input-batches.js";function updateActivityRootForDelivery(e){if(!e.ctx.has(ActivityObserverKey))return;if(e.taskRootTurnId!==void 0){e.ctx.set(ActivityRootTurnIdKey,e.taskRootTurnId);return}let t=e.delivery;if(t===void 0)return;if(t.payloads.some(e=>e.message!==void 0)&&t.taskDeliveryId===void 0){e.ctx.set(ActivityRootTurnIdKey,e.activeTurnId),e.ctx.delete(ActivityPendingBlockersKey);return}let n=new Set(t.payloads.flatMap(e=>(e.inputResponses??[]).map(e=>e.requestId)));if(n.size===0)return;let r=activityRootTurnIdForInputResponses(e.sessionState,n)??e.ctx.get(ActivityRootTurnIdKey)??e.activeTurnId;e.ctx.set(ActivityRootTurnIdKey,r),e.ctx.set(ActivityPendingBlockersKey,activityRequestIdsForRootTurn(e.sessionState,r))}function restoreAuthorizationActivity(e){let t=e.matches.map(e=>e.result.attemptId??e.candidateId??e.result.name),n=t.map(t=>e.pending.activityRootTurnIds?.[t]).find(Boolean);return n!==void 0&&(e.ctx.set(ActivityRootTurnIdKey,n),e.ctx.set(ActivityPendingBlockersKey,Object.entries(e.pending.activityRootTurnIds??{}).flatMap(([e,t])=>t===n?[e]:[]))),clearActivityBlockers(e.ctx,t),t}function updateActivityBlockers(e,t){e.has(ActivityObserverKey)&&(t.type===`input.requested`?addActivityBlockers(e,t.data.requests.map(e=>e.requestId)):t.type===`input.resolved`?clearActivityBlockers(e,t.data.resolutions.map(e=>e.requestId)):t.type===`authorization.required`?addActivityBlockers(e,[authorizationBlockerId(t)]):t.type===`authorization.completed`&&clearActivityBlockers(e,[authorizationBlockerId(t)]))}function clearActivityBlockers(e,t){let n=new Set(t),r=(e.get(ActivityPendingBlockersKey)??[]).filter(e=>!n.has(e));r.length===0?e.delete(ActivityPendingBlockersKey):e.set(ActivityPendingBlockersKey,r)}function addActivityBlockers(e,t){e.set(ActivityPendingBlockersKey,[...new Set([...e.get(ActivityPendingBlockersKey)??[],...t])])}function authorizationBlockerId(e){return e.data.attemptId??e.data.candidateId??`${e.data.turnId}:${String(e.data.stepIndex)}:${e.data.name}`}export{clearActivityBlockers,restoreAuthorizationActivity,updateActivityBlockers,updateActivityRootForDelivery};
@@ -3,6 +3,7 @@ import type { AuthorizationResult, PendingAuthorizationState } from "#harness/au
3
3
  import type { ConnectionAuthorizationChallenge } from "#connections/errors.js";
4
4
  export interface MatchedAuthorizationCallback {
5
5
  readonly authorization: ConnectionAuthorizationChallenge;
6
+ readonly candidateId?: string;
6
7
  readonly result: {
7
8
  readonly name: string;
8
9
  } & AuthorizationResult;
@@ -1 +1 @@
1
- function matchAuthorizationCallbacks(e,t){let n=[],r=[],i=new Set;for(let a of t){let t=a.authorizationCallback;if(t===void 0){r.push(a);continue}let o=e.challenges.find(e=>e.name===t.connectionName?t.legacy===!0?e.attemptId===void 0:e.attemptId===t.attemptId:!1),s=o?.attemptId??o?.name;o===void 0||s===void 0||o.principal===void 0&&t.legacy!==!0||i.has(s)||(i.add(s),n.push({authorization:o.challenge,result:{attemptId:o.attemptId,callback:t.callback,hookUrl:o.hookUrl,instanceId:o.instanceId,name:o.name,principal:o.principal,resume:o.resume}}))}return{matches:n,remainingPayloads:r}}export{matchAuthorizationCallbacks};
1
+ function matchAuthorizationCallbacks(e,t){let n=[],r=[],i=new Set;for(let a of t){let t=a.authorizationCallback;if(t===void 0){r.push(a);continue}let o=e.challenges.find(e=>e.name===t.connectionName?t.legacy===!0?e.attemptId===void 0:e.attemptId===t.attemptId:!1),s=o?.attemptId??o?.candidateId??o?.name;o===void 0||s===void 0||o.principal===void 0&&t.legacy!==!0||i.has(s)||(i.add(s),n.push({authorization:o.challenge,candidateId:o.candidateId,result:{attemptId:o.attemptId,callback:t.callback,hookUrl:o.hookUrl,instanceId:o.instanceId,name:o.name,principal:o.principal,resume:o.resume}}))}return{matches:n,remainingPayloads:r}}export{matchAuthorizationCallbacks};
@@ -1 +1 @@
1
- import{coalesceDeliveries}from"#harness/messages.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";async function nextTurnDelivery(e){if(e.awaitAuthorizationCallbacks!==!0)return await awaitNextTurnDelivery(e);e.commandInbox.setAuthorizationWindow(!0);try{return await awaitNextTurnDelivery(e)}finally{e.commandInbox.setAuthorizationWindow(!1)}}async function awaitNextTurnDelivery(e){let t=e.cancelledTaskIds??new Set,n=e.seenTaskDeliveries??new Set;for(;;){let r=await waitForNextSessionAction({bufferedDeliveries:e.bufferedDeliveries,bufferedSessionControls:e.bufferedSessionControls,cancelledTaskIds:t,commandInbox:e.commandInbox,deferDeliveries:e.deferDeliveries,seenTaskDeliveries:n,stateCursor:e.stateCursor});if(r.kind===`authorization`)return r;if(r.kind!==`delivery`)return{kind:r.kind};let i=r.delivery;if(i===null)return{kind:`closed`};let a=await routeDeliverToChildren({delivery:i,parentWritable:e.driverWritable,serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState});if(e.stateCursor.adoptState(a),a.kind===`cancel-turn`)return{kind:`cancel-turn`};if(a.remainder!==void 0)return{delivery:a.remainder,kind:`turn`}}}async function waitForNextSessionAction(e){let t=e.bufferedSessionControls.shift();if(t!==void 0)return{kind:t};for(;e.bufferedDeliveries[0]!==void 0&&isCancelledTaskDelivery(e.bufferedDeliveries[0],e.cancelledTaskIds);)e.bufferedDeliveries.shift();if(e.deferDeliveries!==!0&&!e.commandInbox.hasReadyAuthorization()&&e.bufferedDeliveries.length>0)return{delivery:takeBufferedTurnDelivery(e.bufferedDeliveries),kind:`delivery`};for(;;){let{result:t,source:n}=await e.commandInbox.nextWithSource();if(e.commandInbox.consumeNext(),n===`authorization`)return t.done?{closed:!0,kind:`authorization`,payloads:[]}:{closed:!1,kind:`authorization`,payloads:t.value.kind===`deliver`?t.value.payloads:[]};if(t.done)return{delivery:null,kind:`delivery`};if(t.value.kind===`runtime-action-result`)continue;let r;try{r=sessionInboxWire.decode(t.value)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});continue}if(r.kind===`session-timeout`)return{kind:`expired`};if(r.kind===`clear`||r.kind===`compact`||r.kind===`reset`)return{kind:r.kind};if(r.kind===`cancel`){if(`tasks`in r&&r.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState}),r.taskId!==void 0){e.cancelledTaskIds.add(r.taskId);let t=e.bufferedDeliveries.filter(t=>!isCancelledTaskDelivery(t,e.cancelledTaskIds));e.bufferedDeliveries.splice(0,e.bufferedDeliveries.length,...t)}continue}let i=r.taskDeliveryId??r.caller?.taskId;if(!(i!==void 0&&isCancelledTaskDeliveryId(i,e.cancelledTaskIds))){if(i!==void 0){if(e.seenTaskDeliveries.has(i))continue;e.seenTaskDeliveries.add(i)}if(e.deferDeliveries===!0){e.bufferedDeliveries.push(r);continue}return{delivery:r,kind:`delivery`}}}}function isCancelledTaskDelivery(e,t){let n=e.taskDeliveryId??e.caller?.taskId;return n!==void 0&&isCancelledTaskDeliveryId(n,t)}function isCancelledTaskDeliveryId(e,t){return[...t].some(t=>e===t||e.startsWith(`${t}:`))}function takeBufferedTurnDelivery(e){let t=e.shift();if(t===void 0)throw Error(`Cannot take a turn delivery from an empty buffer.`);let n=[t],r=t.caller;for(;e.length>0;){let i=e[0];if(i===void 0||t.taskDeliveryId!==void 0||i.taskDeliveryId!==void 0||r!==void 0&&i.caller!==void 0)break;let a=e.shift();if(a===void 0)throw Error(`Buffered turn delivery disappeared while partitioning.`);n.push(a),r??=a.caller}return coalesceDeliveries(n)}export{nextTurnDelivery};
1
+ import{jsonValuesEqual}from"#shared/json.js";import{coalesceDeliveries}from"#harness/messages.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{getSessionTaskCohorts}from"#tasks/session-task-cohorts.js";async function nextTurnDelivery(e){if(e.awaitAuthorizationCallbacks!==!0)return await awaitNextTurnDelivery(e);e.commandInbox.setAuthorizationWindow(!0);try{return await awaitNextTurnDelivery(e)}finally{e.commandInbox.setAuthorizationWindow(!1)}}async function awaitNextTurnDelivery(e){let t=e.cancelledTaskIds??new Set,n=e.seenTaskDeliveries??new Set;for(;;){let r=await waitForNextSessionAction({bufferedDeliveries:e.bufferedDeliveries,bufferedSessionControls:e.bufferedSessionControls,cancelledTaskIds:t,commandInbox:e.commandInbox,deferDeliveries:e.deferDeliveries,seenTaskDeliveries:n,stateCursor:e.stateCursor});if(r.kind===`authorization`)return r;if(r.kind!==`delivery`)return{kind:r.kind};let i=r.delivery;if(i===null)return{kind:`closed`};let a=await routeDeliverToChildren({delivery:i,parentWritable:e.driverWritable,serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState});if(e.stateCursor.adoptState(a),a.kind===`cancel-turn`)return{kind:`cancel-turn`};if(a.remainder!==void 0)return{delivery:a.remainder,kind:`turn`}}}async function waitForNextSessionAction(e){let t=e.bufferedSessionControls.shift();if(t!==void 0)return{kind:t};for(;e.bufferedDeliveries[0]!==void 0&&isCancelledTaskDelivery(e.bufferedDeliveries[0],e.cancelledTaskIds);)e.bufferedDeliveries.shift();if(e.deferDeliveries!==!0&&!e.commandInbox.hasReadyAuthorization()&&e.bufferedDeliveries.length>0)return{delivery:takeBufferedTurnDelivery(e.bufferedDeliveries,getSessionTaskCohorts(e.stateCursor.sessionState.snapshot?.session.state)),kind:`delivery`};for(;;){let{result:t,source:n}=await e.commandInbox.nextWithSource();if(e.commandInbox.consumeNext(),n===`authorization`)return t.done?{closed:!0,kind:`authorization`,payloads:[]}:{closed:!1,kind:`authorization`,payloads:t.value.kind===`deliver`?t.value.payloads:[]};if(t.done)return{delivery:null,kind:`delivery`};if(t.value.kind===`runtime-action-result`)continue;let r;try{r=sessionInboxWire.decode(t.value)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});continue}if(r.kind===`session-timeout`)return{kind:`expired`};if(r.kind===`clear`||r.kind===`compact`||r.kind===`reset`)return{kind:r.kind};if(r.kind===`cancel`){if(`tasks`in r&&r.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState}),r.taskId!==void 0){e.cancelledTaskIds.add(r.taskId);let t=e.bufferedDeliveries.filter(t=>!isCancelledTaskDelivery(t,e.cancelledTaskIds));e.bufferedDeliveries.splice(0,e.bufferedDeliveries.length,...t)}continue}let i=r.taskDeliveryId??r.caller?.taskId;if(!(i!==void 0&&isCancelledTaskDeliveryId(i,e.cancelledTaskIds))){if(i!==void 0){if(e.seenTaskDeliveries.has(i))continue;e.seenTaskDeliveries.add(i)}if(e.deferDeliveries===!0){e.bufferedDeliveries.push(r);continue}return{delivery:r,kind:`delivery`}}}}function isCancelledTaskDelivery(e,t){let n=e.taskDeliveryId??e.caller?.taskId;return n!==void 0&&isCancelledTaskDeliveryId(n,t)}function isCancelledTaskDeliveryId(e,t){return[...t].some(t=>e===t||e.startsWith(`${t}:`))}function takeBufferedTurnDelivery(e,t){let n=e.shift();if(n===void 0)throw Error(`Cannot take a turn delivery from an empty buffer.`);let r=completionCohort(n,t),i=n.auth!=null&&n.auth.principalType!==`anonymous`,a=[n],o=n.caller;for(;e.length>0;){let s=e[0];if(s===void 0||(n.taskDeliveryId!==void 0||s.taskDeliveryId!==void 0)&&(r===void 0||completionCohort(s,t)!==r)||n.taskDeliveryId===void 0&&(!i||!jsonValuesEqual(n.auth,s.auth))||o!==void 0&&s.caller!==void 0)break;let c=e.shift();if(c===void 0)throw Error(`Buffered turn delivery disappeared while partitioning.`);a.push(c),o??=c.caller}return coalesceDeliveries(a)}function completionCohort(e,t){if(e.caller===void 0&&e.taskDeliveryId?.endsWith(`:ready:completed`))return t.get(e.taskDeliveryId.slice(0,-16))}export{nextTurnDelivery};
@@ -0,0 +1,10 @@
1
+ import type { VercelCreateOptions } from "#execution/sandbox/bindings/vercel-sdk-types.js";
2
+ import type { SandboxBackendTags } from "#public/definitions/sandbox-backend.js";
3
+ export declare function resolveVercelSandboxTags(userTags: VercelCreateOptions["tags"], eveTags: SandboxBackendTags | undefined): Record<string, string> | undefined;
4
+ export declare function ensureVercelSandboxTags(sandbox: {
5
+ readonly tags?: Record<string, string>;
6
+ update(options: {
7
+ tags: Record<string, string>;
8
+ }): Promise<unknown>;
9
+ }, tags: Record<string, string> | undefined): Promise<void>;
10
+ export declare function errorMessage(error: unknown): string;
@@ -0,0 +1 @@
1
+ function resolveVercelSandboxTags(e,t){let n={};if(e!==void 0)for(let[t,r]of Object.entries(e))n[t]=r;if(t!==void 0)for(let[e,r]of Object.entries(t))n[e]=r;let r=Object.keys(n).length;if(r!==0){if(r>5)throw Error(`Vercel Sandbox supports at most 5 tags. eve reserves "agent", "channel", and "sessionId"; remove or consolidate custom tags passed to vercel().`);return n}}async function ensureVercelSandboxTags(e,t){t===void 0||areVercelSandboxTagsEqual(e.tags,t)||await e.update({tags:t})}function areVercelSandboxTagsEqual(e,t){let n=e??{},r=Object.entries(n),i=Object.entries(t);return r.length===i.length&&i.every(([e,t])=>n[e]===t)}function errorMessage(e){if(e instanceof Error){let t=e.json,n=e.text,r=typeof n==`string`&&n.length>0?n:t===void 0?void 0:JSON.stringify(t);return r===void 0?e.message:`${e.message}: ${r}`}return String(e)}export{ensureVercelSandboxTags,errorMessage,resolveVercelSandboxTags};
@@ -1 +1,2 @@
1
- import{resolveSandboxModelPath}from"#shared/skill-paths.js";import{WORKSPACE_ROOT}from"#runtime/workspace/types.js";import{streamToBuffer}from"#execution/sandbox/stream-utils.js";import{createLoggingSandboxSession}from"#execution/sandbox/logging-session.js";import{buildSandboxSession}from"#execution/sandbox/session.js";import{SandboxTemplateNotProvisionedError}from"#public/definitions/sandbox-backend.js";import{adaptMultiplexedCommandToSandboxProcess}from"#execution/sandbox/multiplexed-command.js";import{applyInitialVercelNetworkPolicy,createVercelNetworkPolicySetter,ensureVercelSandboxBaseRuntime,withBaseSetupNetworkPolicy}from"#execution/sandbox/bindings/vercel-base-runtime.js";import{createVercelEveImageSandbox}from"#execution/sandbox/bindings/vercel-create-sdk.js";import{isVercelSandboxMissingError,isVercelSnapshotUnavailableError}from"#execution/sandbox/bindings/vercel-errors.js";import{getNamedVercelSandbox}from"#execution/sandbox/bindings/vercel-lookup.js";import{deleteVercelSandbox,stopVercelSandbox}from"#execution/sandbox/bindings/vercel-lifecycle.js";import{normalizeVercelReadStream}from"#execution/sandbox/bindings/vercel-read-stream.js";function createVercelSandbox(e={}){let t=e.loadSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox-drives/index.js`)),n=e.loadDeleteSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox/index.js`)),r={timeout:DEFAULT_SANDBOX_TIMEOUT_MS,...e.createOptions},i=e.createSandbox??createVercelEveImageSandbox,a=new Map;return{name:`vercel`,async create(o){let s=resolveVercelSandboxTags(r.tags,o.tags),c=o.templateKey===null?null:await readTemplateForCreate({createOptions:r,loadSandboxModule:t,prewarmedTemplates:a,templateKey:o.templateKey}),l=await t(),u;try{u=await ensureSession({createOptions:r,createSandbox:i,existingMetadata:o.existingMetadata,resolveSessionCreateOptions:e.resolveSessionCreateOptions,sandboxModule:l,sessionId:o.tags?.sessionId??o.sessionKey,sessionKey:o.sessionKey,snapshotId:c?.snapshotId,tags:s})}catch(e){throw c!==null&&(isVercelSnapshotUnavailableError(e)||isVercelSandboxMissingError(e))?(a.delete(c.templateKey),await(await getNamedVercelSandbox({createOptions:r,sandboxModule:l,sandboxName:c.sandboxName}))?.delete(),new SandboxTemplateNotProvisionedError({backendName:`vercel`,templateKey:c.templateKey})):Error(`Failed to create sandbox session "${o.sessionKey}": ${errorMessage(e)}`,{cause:e})}return await ensureVercelSandboxBaseRuntime(u.sandbox),c===null&&u.created&&await applyInitialVercelNetworkPolicy(u.sandbox,r.networkPolicy),createHandle({createOptions:r,loadDeleteSandboxModule:n,sandbox:u.sandbox,sessionKey:o.sessionKey})},async prewarm(e){let n;try{n=await ensureTemplateWithUnavailableRetry({bootstrap:e.bootstrap,createOptions:r,createSandbox:i,loadSandboxModule:t,log:e.log,seedFiles:e.seedFiles,templateKey:e.templateKey})}catch(t){throw Error(`Failed to prewarm Vercel sandbox template "${e.templateKey}": ${errorMessage(t)}`,{cause:t})}return a.set(e.templateKey,n.template),{reused:n.reused}}}}async function ensureTemplateWithUnavailableRetry(e){try{return await ensureTemplate(e)}catch(t){if(!isVercelSnapshotUnavailableError(t)&&!isVercelSandboxMissingError(t))throw t;return e.log?.(`cached template disappeared; rebuilding sandbox template`),await ensureTemplate(e)}}async function readTemplate(e){let t=e.prewarmedTemplates.get(e.templateKey);if(t!==void 0)return t;let n=await e.loadSandboxModule(),r=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:n,sandboxName:e.templateKey});if(r===null||typeof r.currentSnapshotId!=`string`)throw new SandboxTemplateNotProvisionedError({backendName:`vercel`,templateKey:e.templateKey});return{sandboxName:r.name,snapshotId:r.currentSnapshotId,templateKey:e.templateKey}}async function readTemplateForCreate(e){try{return await readTemplate(e)}catch(t){throw SandboxTemplateNotProvisionedError.is(t)?t:Error(`Failed to read sandbox template "${e.templateKey}": ${errorMessage(t)}`,{cause:t})}}async function ensureTemplate(e){let t=await e.loadSandboxModule(),n=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:t,sandboxName:e.templateKey}),r=resolveVercelSandboxTags(e.createOptions.tags,e.tags),i=extractAuthorSnapshotId(e.createOptions);if(n!==null&&isUnprovisionedTerminalTemplateSandbox(n,i)&&(await n.delete(),n=null),n===null?n=await e.createSandbox({sandboxModule:t,createOptions:withBaseSetupNetworkPolicy({...e.createOptions,name:e.templateKey,persistent:!1,tags:r})}):await ensureVercelSandboxTags(n,r),typeof n.currentSnapshotId==`string`&&n.currentSnapshotId.length>0&&n.currentSnapshotId!==i)return{reused:!0,template:{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey}};e.log?.(`preparing base runtime inside sandbox`),await ensureVercelSandboxBaseRuntime(n),await applyInitialVercelNetworkPolicy(n,e.createOptions.networkPolicy);let a=buildSandboxSession(createVercelInternalSandboxSession(n,e.templateKey),createVercelNetworkPolicySetter(n));await writeVercelSandboxSeedFiles({sandbox:n,seedFiles:e.seedFiles,session:a}),e.bootstrap!==void 0&&(e.log?.(`running sandbox bootstrap`),await e.bootstrap({use:async t=>(t!==void 0&&await n.update(t),createLoggingSandboxSession({log:e.log,session:a}))}));let o=await n.snapshot();return{reused:!1,template:{sandboxName:n.name,snapshotId:o.snapshotId,templateKey:e.templateKey}}}async function ensureSession(e){let t=getVercelSandboxName(e.existingMetadata)??e.sessionKey,n=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:e.sandboxModule,sandboxName:t});if(n!==null)return await ensureVercelSandboxTags(n,e.tags),{created:!1,sandbox:n};let r=createSessionCreateParams(e,t,await e.resolveSessionCreateOptions?.({session:{id:e.sessionId}}));return e.tags!==void 0&&(r.tags=e.tags),{created:!0,sandbox:await e.createSandbox({createOptions:r,sandboxModule:e.sandboxModule})}}function createSessionCreateParams(e,t,n={}){let r={...e.createOptions,...n};if(e.snapshotId===void 0)return withBaseSetupNetworkPolicy({...r,name:t,persistent:!0});let{image:i,runtime:a,source:o,...s}=r;return{...s,name:t,persistent:!0,source:{snapshotId:e.snapshotId,type:`snapshot`}}}function createHandle(e){let{sandbox:t,sessionKey:n}=e;return{session:buildSandboxSession(createVercelInternalSandboxSession(t,n),createVercelNetworkPolicySetter(t)),useSessionFn:async e=>(e!==void 0&&await t.update(e),buildSandboxSession(createVercelInternalSandboxSession(t,n),createVercelNetworkPolicySetter(t))),async captureState(){return{backendName:`vercel`,metadata:{sandboxName:t.name},sessionKey:n}},async delete(n){await deleteVercelSandbox({createOptions:e.createOptions,loadDeleteSandboxModule:e.loadDeleteSandboxModule,sandbox:t,signal:n?.abortSignal})},async stop(){await stopVercelSandbox(t)},async shutdown(){try{await stopVercelSandbox(t)}catch{}}}}function createVercelInternalSandboxSession(e,t){return{id:t,resolvePath:resolveVercelSandboxPath,async spawn(t){let n=await e.runCommand({args:[`-lc`,t.command],cmd:`bash`,cwd:t.workingDirectory??WORKSPACE_ROOT,detached:!0,env:t.env,signal:t.abortSignal});return adaptMultiplexedCommandToSandboxProcess({command:n,getOutput:e=>e.stream})},async readFile(t){return normalizeVercelReadStream(await e.readFile({path:t.path}))},async writeFile(t){let n=await streamToBuffer(t.content);await e.writeFiles([{content:n,path:t.path}])},async removePath(t){await e.fs.rm(t.path,{force:t.force,recursive:t.recursive,signal:t.abortSignal})}}}async function writeVercelSandboxSeedFiles(e){if(e.seedFiles.length===0)return;let t=await Promise.all(e.seedFiles.map(async t=>({content:typeof t.content==`string`?Buffer.from(t.content):t.content,path:await resolveSandboxModelPath({path:t.path,sandbox:e.session})})));await e.sandbox.writeFiles(t)}function resolveVercelSandboxPath(e){return e.startsWith(`/`)?e:`${WORKSPACE_ROOT}/${e}`}function isUnprovisionedTerminalTemplateSandbox(e,t){let n=e.currentSnapshotId;return typeof n==`string`&&n.length>0&&n!==t?!1:e.status===`aborted`||e.status===`failed`||e.status===`stopped`}function extractAuthorSnapshotId(e){let t=e.source;if(t?.type===`snapshot`&&typeof t.snapshotId==`string`)return t.snapshotId}function getVercelSandboxName(e){let t=e?.sandboxName;return typeof t==`string`?t:void 0}function resolveVercelSandboxTags(e,t){let n={};if(e!==void 0)for(let[t,r]of Object.entries(e))n[t]=r;if(t!==void 0)for(let[e,r]of Object.entries(t))n[e]=r;let r=Object.keys(n).length;if(r!==0){if(r>VERCEL_SANDBOX_TAG_LIMIT)throw Error(`Vercel Sandbox supports at most ${VERCEL_SANDBOX_TAG_LIMIT} tags. eve reserves "agent", "channel", and "sessionId"; remove or consolidate custom tags passed to vercel().`);return n}}async function ensureVercelSandboxTags(e,t){t===void 0||areVercelSandboxTagsEqual(e.tags,t)||await e.update({tags:t})}function areVercelSandboxTagsEqual(e,t){let n=e??{},r=Object.entries(n),i=Object.entries(t);return r.length===i.length&&i.every(([e,t])=>n[e]===t)}function errorMessage(e){if(e instanceof Error){let t=e.json,n=e.text,r=typeof n==`string`&&n.length>0?n:t===void 0?void 0:JSON.stringify(t);return r===void 0?e.message:`${e.message}: ${r}`}return String(e)}const DEFAULT_SANDBOX_TIMEOUT_MS=18e5,VERCEL_SANDBOX_TAG_LIMIT=5;export{createVercelSandbox};
1
+ import{resolveSandboxModelPath}from"#shared/skill-paths.js";import{WORKSPACE_ROOT}from"#runtime/workspace/types.js";import{streamToBuffer}from"#execution/sandbox/stream-utils.js";import{createLoggingSandboxSession}from"#execution/sandbox/logging-session.js";import{buildSandboxSession}from"#execution/sandbox/session.js";import{SandboxTemplateNotProvisionedError}from"#public/definitions/sandbox-backend.js";import{adaptMultiplexedCommandToSandboxProcess}from"#execution/sandbox/multiplexed-command.js";import{applyInitialVercelNetworkPolicy,createVercelNetworkPolicySetter,ensureVercelSandboxBaseRuntime,withBaseSetupNetworkPolicy}from"#execution/sandbox/bindings/vercel-base-runtime.js";import{createVercelEveImageSandbox}from"#execution/sandbox/bindings/vercel-create-sdk.js";import{ensureVercelSandboxTags,errorMessage,resolveVercelSandboxTags}from"#execution/sandbox/bindings/vercel-options.js";import{isVercelSandboxMissingError,isVercelSnapshotUnavailableError}from"#execution/sandbox/bindings/vercel-errors.js";import{getNamedVercelSandbox}from"#execution/sandbox/bindings/vercel-lookup.js";import{deleteVercelSandbox,stopVercelSandbox}from"#execution/sandbox/bindings/vercel-lifecycle.js";import{normalizeVercelReadStream}from"#execution/sandbox/bindings/vercel-read-stream.js";function createVercelSandbox(e={}){let t=e.loadSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox-drives/index.js`)),n=e.loadDeleteSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox/index.js`)),r={timeout:DEFAULT_SANDBOX_TIMEOUT_MS,...e.createOptions},i=e.createSandbox??createVercelEveImageSandbox,a=new Map;return{name:`vercel`,async create(o){let s=resolveVercelSandboxTags(r.tags,o.tags),c=o.templateKey===null?null:await readTemplateForCreate({createOptions:r,loadSandboxModule:t,prewarmedTemplates:a,templateKey:o.templateKey}),l=await t(),u;try{u=await ensureSession({createOptions:r,createSandbox:i,existingMetadata:o.existingMetadata,resolveSessionCreateOptions:e.resolveSessionCreateOptions,sandboxModule:l,sessionId:o.tags?.sessionId??o.sessionKey,sessionKey:o.sessionKey,snapshotId:c?.snapshotId,tags:s})}catch(e){throw c!==null&&(isVercelSnapshotUnavailableError(e)||isVercelSandboxMissingError(e))?(a.delete(c.templateKey),await(await getNamedVercelSandbox({createOptions:r,sandboxModule:l,sandboxName:c.sandboxName}))?.delete(),new SandboxTemplateNotProvisionedError({backendName:`vercel`,templateKey:c.templateKey})):Error(`Failed to create sandbox session "${o.sessionKey}": ${errorMessage(e)}`,{cause:e})}return await ensureVercelSandboxBaseRuntime(u.sandbox),c===null&&u.created&&await applyInitialVercelNetworkPolicy(u.sandbox,r.networkPolicy),createHandle({createOptions:r,loadDeleteSandboxModule:n,sandbox:u.sandbox,sessionKey:o.sessionKey})},async prewarm(e){let n;try{n=await ensureTemplateWithUnavailableRetry({bootstrap:e.bootstrap,createOptions:r,createSandbox:i,loadSandboxModule:t,log:e.log,seedFiles:e.seedFiles,templateKey:e.templateKey})}catch(t){throw Error(`Failed to prewarm Vercel sandbox template "${e.templateKey}": ${errorMessage(t)}`,{cause:t})}return a.set(e.templateKey,n.template),{reused:n.reused}}}}async function ensureTemplateWithUnavailableRetry(e){try{return await ensureTemplate(e)}catch(t){if(!isVercelSnapshotUnavailableError(t)&&!isVercelSandboxMissingError(t))throw t;return e.log?.(`cached template disappeared; rebuilding sandbox template`),await ensureTemplate(e)}}async function readTemplate(e){let t=e.prewarmedTemplates.get(e.templateKey);if(t!==void 0)return t;let n=await e.loadSandboxModule(),r=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:n,sandboxName:e.templateKey});if(r===null||typeof r.currentSnapshotId!=`string`)throw new SandboxTemplateNotProvisionedError({backendName:`vercel`,templateKey:e.templateKey});return{sandboxName:r.name,snapshotId:r.currentSnapshotId,templateKey:e.templateKey}}async function readTemplateForCreate(e){try{return await readTemplate(e)}catch(t){throw SandboxTemplateNotProvisionedError.is(t)?t:Error(`Failed to read sandbox template "${e.templateKey}": ${errorMessage(t)}`,{cause:t})}}async function ensureTemplate(e){let t=await e.loadSandboxModule(),n=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:t,sandboxName:e.templateKey}),r=resolveVercelSandboxTags(e.createOptions.tags,e.tags),i=extractAuthorSnapshotId(e.createOptions);if(n!==null&&isUnprovisionedTerminalTemplateSandbox(n,i)&&(await n.delete(),n=null),n===null?n=await e.createSandbox({sandboxModule:t,createOptions:withBaseSetupNetworkPolicy({...e.createOptions,name:e.templateKey,persistent:!1,tags:r})}):await ensureVercelSandboxTags(n,r),typeof n.currentSnapshotId==`string`&&n.currentSnapshotId.length>0&&n.currentSnapshotId!==i)return{reused:!0,template:{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey}};e.log?.(`preparing base runtime inside sandbox`),await ensureVercelSandboxBaseRuntime(n),await applyInitialVercelNetworkPolicy(n,e.createOptions.networkPolicy);let a=buildSandboxSession(createVercelInternalSandboxSession(n,e.templateKey),createVercelNetworkPolicySetter(n));await writeVercelSandboxSeedFiles({sandbox:n,seedFiles:e.seedFiles,session:a}),e.bootstrap!==void 0&&(e.log?.(`running sandbox bootstrap`),await e.bootstrap({use:async t=>(t!==void 0&&await n.update(t),createLoggingSandboxSession({log:e.log,session:a}))}));let o=await n.snapshot();return{reused:!1,template:{sandboxName:n.name,snapshotId:o.snapshotId,templateKey:e.templateKey}}}async function ensureSession(e){let t=getVercelSandboxName(e.existingMetadata)??e.sessionKey,n=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:e.sandboxModule,sandboxName:t});if(n!==null)return await ensureVercelSandboxTags(n,e.tags),{created:!1,sandbox:n};let r=createSessionCreateParams(e,t,await e.resolveSessionCreateOptions?.({session:{id:e.sessionId}}));return e.tags!==void 0&&(r.tags=e.tags),{created:!0,sandbox:await e.createSandbox({createOptions:r,sandboxModule:e.sandboxModule})}}function createSessionCreateParams(e,t,n={}){let r={...e.createOptions,...n};if(e.snapshotId===void 0)return withBaseSetupNetworkPolicy({...r,name:t,persistent:!0});let{image:i,runtime:a,source:o,...s}=r;return{...s,name:t,persistent:!0,source:{snapshotId:e.snapshotId,type:`snapshot`}}}function createHandle(e){let{sandbox:t,sessionKey:n}=e;return{session:buildSandboxSession(createVercelInternalSandboxSession(t,n),createVercelNetworkPolicySetter(t)),useSessionFn:async e=>(e!==void 0&&await t.update(e),buildSandboxSession(createVercelInternalSandboxSession(t,n),createVercelNetworkPolicySetter(t))),async captureState(){return{backendName:`vercel`,metadata:{sandboxName:t.name},sessionKey:n}},async delete(n){await deleteVercelSandbox({createOptions:e.createOptions,loadDeleteSandboxModule:e.loadDeleteSandboxModule,sandbox:t,signal:n?.abortSignal})},async stop(){await stopVercelSandbox(t)},async shutdown(){try{await stopVercelSandbox(t)}catch{}}}}function createVercelInternalSandboxSession(e,t){return{id:t,resolvePath:resolveVercelSandboxPath,async spawn(t){let n=await e.runCommand({args:[`-lc`,t.command],cmd:`bash`,cwd:t.workingDirectory??WORKSPACE_ROOT,detached:!0,env:t.env,signal:t.abortSignal});return adaptMultiplexedCommandToSandboxProcess({command:n,getOutput:e=>e.stream})},async readFile(t){return normalizeVercelReadStream(await e.readFile({path:t.path}))},async writeFile(t){let n=await streamToBuffer(t.content),r=await resolveVercelWritePath(e,t.path,t.abortSignal);await e.writeFiles([{content:n,path:r}],{signal:t.abortSignal})},async removePath(t){await e.fs.rm(t.path,{force:t.force,recursive:t.recursive,signal:t.abortSignal})}}}async function writeVercelSandboxSeedFiles(e){if(e.seedFiles.length===0)return;let t=await Promise.all(e.seedFiles.map(async t=>({content:typeof t.content==`string`?Buffer.from(t.content):t.content,path:await resolveSandboxModelPath({path:t.path,sandbox:e.session})})));await e.sandbox.writeFiles(t)}function resolveVercelSandboxPath(e){return e.startsWith(`/`)?e:`${WORKSPACE_ROOT}/${e}`}async function resolveVercelWritePath(e,t,n){let r=await e.runCommand({args:[`-m`,`--`,t],cmd:`realpath`,signal:n}),i=(await r.stdout()).trim();if(r.exitCode!==0||!i.startsWith(`/`)||i.includes(`
2
+ `))throw Error(`Failed to resolve Vercel Sandbox write path: ${t}`);return i}function isUnprovisionedTerminalTemplateSandbox(e,t){let n=e.currentSnapshotId;return typeof n==`string`&&n.length>0&&n!==t?!1:e.status===`aborted`||e.status===`failed`||e.status===`stopped`}function extractAuthorSnapshotId(e){let t=e.source;if(t?.type===`snapshot`&&typeof t.snapshotId==`string`)return t.snapshotId}function getVercelSandboxName(e){let t=e?.sandboxName;return typeof t==`string`?t:void 0}const DEFAULT_SANDBOX_TIMEOUT_MS=18e5;export{createVercelSandbox};
@@ -1,12 +1 @@
1
- /**
2
- * Wraps a value in POSIX single-quotes, escaping any embedded single-quotes.
3
- *
4
- * Used by the `glob` and `grep` execution cores to safely embed model-supplied
5
- * patterns, paths, and globs into shell commands run via `sandbox.run`.
6
- *
7
- * The quoting strategy is the standard POSIX approach: wrap the value in
8
- * single-quotes and replace each embedded `'` with `'\''` (end the
9
- * single-quoted string, insert an escaped single-quote, re-open
10
- * single-quoting).
11
- */
12
- export declare function shellQuote(value: string): string;
1
+ export { shellQuote } from "#shared/shell-quote.js";
@@ -1 +1 @@
1
- function shellQuote(e){return`'${e.replace(/'/g,`'\\''`)}'`}export{shellQuote};
1
+ import{shellQuote}from"#shared/shell-quote.js";export{shellQuote};
@@ -9,6 +9,8 @@ export declare function observeSessionActivity(input: {
9
9
  }): Promise<void>;
10
10
  export declare function projectSessionActivity(input: {
11
11
  readonly event: MessageStreamEvent;
12
+ readonly rootTurnId?: string;
12
13
  readonly sessionId: string;
14
+ readonly suppressRootSettlement?: boolean;
13
15
  readonly workIdentity?: ActivityWorkIdentityV1;
14
16
  }): readonly ActivityEventV1[];
@@ -1 +1 @@
1
- import{ActivityObserverKey,TurnTaskDeliveryKey}from"#context/keys.js";import{deriveRootTurnActivityWorkId}from"#execution/activity-work-id.js";import{projectActivityEvents}from"#execution/activity-events.js";import{submitActivity}from"#execution/submit-activity.js";async function observeSessionActivity(e){let t=e.ctx.get(ActivityObserverKey);if(t===void 0)return;let n=e.ctx.get(TurnTaskDeliveryKey);(t.workIdentity!==void 0||n!==`pending`&&n!==`settled`)&&await submitActivity({events:projectSessionActivity({event:e.event,sessionId:e.sessionId,workIdentity:t.workIdentity}),sink:t.sink})}function projectSessionActivity(e){let t=workFor(e);if(t===void 0)return[];let n=[];return(t.kind===`root-turn`&&e.event.type===`turn.started`||t.kind!==`root-turn`&&(e.event.type===`session.started`||e.event.type===`turn.started`))&&n.push({eventId:`${t.id}:started`,kind:`work.started`,startedAt:e.event.meta.at,work:t}),n.push(...projectActivityEvents({at:e.event.meta.at,event:e.event,eventId:e.event.meta.id,lineage:t})),n}function workFor(e){let t=eventTurnId(e.event);if(e.workIdentity!==void 0)return{...e.workIdentity,sessionId:e.sessionId,turnId:t??e.workIdentity.turnId};if(t!==void 0)return{id:deriveRootTurnActivityWorkId({sessionId:e.sessionId,turnId:t}),kind:`root-turn`,rootSessionId:e.sessionId,rootTurnId:t,sessionId:e.sessionId,turnId:t}}function eventTurnId(e){if(`data`in e&&`turnId`in e.data&&typeof e.data.turnId==`string`)return e.data.turnId}export{observeSessionActivity,projectSessionActivity};
1
+ import{ActivityObserverKey,ActivityPendingBlockersKey,ActivityRootTurnIdKey,TurnTaskDeliveryKey}from"#context/keys.js";import{deriveRootTurnActivityWorkId}from"#execution/activity-work-id.js";import{projectActivityEvents}from"#execution/activity-events.js";import{submitActivity}from"#execution/submit-activity.js";async function observeSessionActivity(e){let t=e.ctx.get(ActivityObserverKey);if(t===void 0)return;let n=e.ctx.get(TurnTaskDeliveryKey);(t.workIdentity!==void 0||e.ctx.get(ActivityRootTurnIdKey)!==void 0||n!==`pending`&&n!==`settled`)&&await submitActivity({events:projectSessionActivity({event:e.event,rootTurnId:e.ctx.get(ActivityRootTurnIdKey),sessionId:e.sessionId,suppressRootSettlement:n===`initiating`||n===`pending`||(e.ctx.get(ActivityPendingBlockersKey)?.length??0)>0,workIdentity:t.workIdentity}),sink:t.sink})}function projectSessionActivity(e){let t=workFor(e);if(t===void 0)return[];let n=[];return(t.kind===`root-turn`&&e.event.type===`turn.started`||t.kind!==`root-turn`&&(e.event.type===`session.started`||e.event.type===`turn.started`))&&n.push({eventId:`${t.id}:started`,kind:`work.started`,startedAt:e.event.meta.at,work:t}),e.suppressRootSettlement===!0&&t.kind===`root-turn`&&(e.event.type===`turn.completed`||e.event.type===`turn.failed`||e.event.type===`turn.cancelled`)||n.push(...projectActivityEvents({at:e.event.meta.at,event:e.event,eventId:e.event.meta.id,lineage:t})),n}function workFor(e){let t=eventTurnId(e.event);if(e.workIdentity!==void 0)return{...e.workIdentity,sessionId:e.sessionId,turnId:t??e.workIdentity.turnId};if(t===void 0)return;let n=e.rootTurnId??t;return{id:deriveRootTurnActivityWorkId({sessionId:e.sessionId,turnId:n}),kind:`root-turn`,rootSessionId:e.sessionId,rootTurnId:n,sessionId:e.sessionId,turnId:t}}function eventTurnId(e){if(`data`in e&&`turnId`in e.data&&typeof e.data.turnId==`string`)return e.data.turnId}export{observeSessionActivity,projectSessionActivity};
@@ -1 +1 @@
1
- import{SESSION_INBOX_WIRE_VERSION,SESSION_INBOX_WIRE_VERSION_METADATA_KEY}from"#execution/wire/session-inbox-contract.js";import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook}from"#execution/hook-ownership.js";function createSessionCommandInbox(){let e,t,n,r=[],i=[],a=0,o=null,s,c,enqueue=e=>{i.push(e),i.sort((e,t)=>e.order-t.order),c?.(),c=void 0},arm=e=>{e.closed||e.pending||(e.pending=!0,e.resolved=void 0,(e.retired?Promise.resolve(e.hook).then(e=>({done:!1,value:e})):e.iterator.next()).then(t=>{let n={order:a++,result:t,state:e};e.resolved=n,e.enabled&&enqueue(n)},()=>{}))},enable=e=>{e.enabled=!0,e.resolved!==void 0&&enqueue(e.resolved)},createState=e=>{let t=createHook({metadata:{[SESSION_INBOX_WIRE_VERSION_METADATA_KEY]:SESSION_INBOX_WIRE_VERSION},token:e});return{closed:!1,enabled:!1,hook:t,iterator:t[Symbol.asyncIterator](),pending:!1,retired:!1}},states=()=>[e,t,n,...r].filter(e=>e!==void 0),nextRead=()=>{if(e===void 0)throw Error(`Cannot wait for session commands before claiming the stable inbox.`);if(o!==null)return o;let t=states();for(let e of t)arm(e);return t.every(e=>e.closed)?(s={order:a++,result:{done:!0,value:void 0},state:e},o=Promise.resolve(s.result),o):(o=(async()=>{for(;i.length===0;)await new Promise(e=>{c=e});let e=i.shift();return s=e,e.result})(),o)};return{async claimAuthorization(e){if(n!==void 0){if(n.hook.token===e)return;throw Error(`A session command inbox cannot change its authorization token.`)}let t=createState(e);await claimHookOwnership(t.hook),n=t},async claimStable(t){if(e!==void 0){if(e.hook.token===t)return;throw Error(`A session command inbox cannot change its stable token.`)}let n=createState(t);await claimHookOwnership(n.hook),enable(n),e=n},consumeNext(){if(s===void 0)throw Error(`Cannot consume a session command before it resolves.`);s.state.pending=!1,s.state.resolved=void 0,s.result.done&&(s.state.closed=!0),s=void 0,o=null},async dispose(){let r=[t,e,n].filter(e=>e!==void 0);t=void 0,e=void 0,n=void 0,await Promise.all(r.map(async e=>await disposeHook(e.hook)))},hasReadyAuthorization(){return n?.enabled!==!0||n.resolved===void 0?!1:s===void 0?i[0]?.state===n:s.state===n},next:nextRead,async nextWithSource(){return{result:await nextRead(),source:s!==void 0&&s.state===n?`authorization`:`session`}},setAuthorizationWindow(e){if(n===void 0){if(e)throw Error(`Cannot open the authorization window before claiming its hook.`);return}if(e){n.enabled||enable(n),s!==void 0&&s.state!==n&&n.resolved!==void 0&&n.resolved.order<s.order&&(enqueue(s),s=void 0,o=null),o!==null&&arm(n);return}n.enabled=!1;let t=i.findIndex(e=>e.state===n);t!==-1&&i.splice(t,1)},async rekeyContinuation(e){if(!e||t?.hook.token===e)return;let n=createState(e);if(t===void 0){await claimHookOwnership(n.hook),enable(n),t=n,o!==null&&arm(n);return}arm(n),await claimHookOwnership(n.hook),enable(n);let i=t;t=n,arm(i);try{await disposeHook(i.hook)}catch(e){t=void 0;try{await disposeHook(n.hook)}catch{}throw e}i.retired=!0,r.push(i)}}}export{createSessionCommandInbox};
1
+ import{SESSION_INBOX_WIRE_VERSION,SESSION_INBOX_WIRE_VERSION_METADATA_KEY,WORKFLOW_TASK_AUTHORIZATION_METADATA_KEY}from"#execution/wire/session-inbox-contract.js";import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook}from"#execution/hook-ownership.js";function createSessionCommandInbox(){let e,t,n,r=[],i=[],a=0,o=null,s,c,enqueue=e=>{i.push(e),i.sort((e,t)=>e.order-t.order),c?.(),c=void 0},arm=e=>{e.closed||e.pending||(e.pending=!0,e.resolved=void 0,(e.retired?Promise.resolve(e.hook).then(e=>({done:!1,value:e})):e.iterator.next()).then(t=>{let n={order:a++,result:t,state:e};e.resolved=n,e.enabled&&enqueue(n)},()=>{}))},enable=e=>{e.enabled=!0,e.resolved!==void 0&&enqueue(e.resolved)},createState=e=>{let t=createHook({metadata:{[SESSION_INBOX_WIRE_VERSION_METADATA_KEY]:SESSION_INBOX_WIRE_VERSION,[WORKFLOW_TASK_AUTHORIZATION_METADATA_KEY]:!0},token:e});return{closed:!1,enabled:!1,hook:t,iterator:t[Symbol.asyncIterator](),pending:!1,retired:!1}},states=()=>[e,t,n,...r].filter(e=>e!==void 0),nextRead=()=>{if(e===void 0)throw Error(`Cannot wait for session commands before claiming the stable inbox.`);if(o!==null)return o;let t=states();for(let e of t)arm(e);return t.every(e=>e.closed)?(s={order:a++,result:{done:!0,value:void 0},state:e},o=Promise.resolve(s.result),o):(o=(async()=>{for(;i.length===0;)await new Promise(e=>{c=e});let e=i.shift();return s=e,e.result})(),o)};return{async claimAuthorization(e){if(n!==void 0){if(n.hook.token===e)return;throw Error(`A session command inbox cannot change its authorization token.`)}let t=createState(e);await claimHookOwnership(t.hook),n=t},async claimStable(t){if(e!==void 0){if(e.hook.token===t)return;throw Error(`A session command inbox cannot change its stable token.`)}let n=createState(t);await claimHookOwnership(n.hook),enable(n),e=n},consumeNext(){if(s===void 0)throw Error(`Cannot consume a session command before it resolves.`);s.state.pending=!1,s.state.resolved=void 0,s.result.done&&(s.state.closed=!0),s=void 0,o=null},async dispose(){let r=[t,e,n].filter(e=>e!==void 0);t=void 0,e=void 0,n=void 0,await Promise.all(r.map(async e=>await disposeHook(e.hook)))},hasReadyAuthorization(){return n?.enabled!==!0||n.resolved===void 0?!1:s===void 0?i[0]?.state===n:s.state===n},next:nextRead,async nextWithSource(){return{result:await nextRead(),source:s!==void 0&&s.state===n?`authorization`:`session`}},setAuthorizationWindow(e){if(n===void 0){if(e)throw Error(`Cannot open the authorization window before claiming its hook.`);return}if(e){n.enabled||enable(n),s!==void 0&&s.state!==n&&n.resolved!==void 0&&n.resolved.order<s.order&&(enqueue(s),s=void 0,o=null),o!==null&&arm(n);return}n.enabled=!1;let t=i.findIndex(e=>e.state===n);t!==-1&&i.splice(t,1)},async rekeyContinuation(e){if(!e||t?.hook.token===e)return;let n=createState(e);if(t===void 0){await claimHookOwnership(n.hook),enable(n),t=n,o!==null&&arm(n);return}arm(n),await claimHookOwnership(n.hook),enable(n);let i=t;t=n,arm(i);try{await disposeHook(i.hook)}catch(e){t=void 0;try{await disposeHook(n.hook)}catch{}throw e}i.retired=!0,r.push(i)}}}export{createSessionCommandInbox};
@@ -1,2 +1,2 @@
1
- import{FALLBACK_SKILL_ROOT,MODEL_SKILL_ROOT}from"#shared/skill-paths.js";function formatAvailableSkillsSection(e,t={}){return e.length===0?null:[`Available skills`,`Listed skills are available in this run. Do not claim a listed skill is inaccessible unless activation or workspace inspection actually fails.`,`If the user names a skill or the request clearly matches one of the descriptions below, call load_skill before proceeding.`,`If multiple skills match, activate the minimal set that covers the task. After activation, follow the returned instructions instead of improvising around them.`,`If activation fails, say so briefly and continue with the best available alternative.`,formatSkillLocationLine(t),"When a loaded SKILL.md mentions sibling files such as `references/foo.md`, resolve them relative to the directory containing that specific SKILL.md.",...e.map(e=>formatAvailableSkillLine({skill:e,skillRoot:t.skillRoot}))].join(`
1
+ import{FALLBACK_SKILL_ROOT,MODEL_SKILL_ROOT}from"#shared/skill-paths.js";function formatAvailableSkillsSection(e,t={}){return e.length===0?null:[`Available skills`,`Listed skills are available in this run. Do not claim a listed skill is inaccessible unless activation or workspace inspection actually fails.`,`Dynamic skill announcements update this list. They replace earlier dynamic skills and override static skills with the same name.`,`If the user names a skill or the request clearly matches one of the descriptions below, call load_skill before proceeding.`,`If multiple skills match, activate the minimal set that covers the task. After activation, follow the returned instructions instead of improvising around them.`,`If activation fails, say so briefly and continue with the best available alternative.`,formatSkillLocationLine(t),"When a loaded SKILL.md mentions sibling files such as `references/foo.md`, resolve them relative to the directory containing that specific SKILL.md.",...e.map(e=>formatAvailableSkillLine({skill:e,skillRoot:t.skillRoot}))].join(`
2
2
  `)}function formatSkillLocationLine(e){return e.skillRoot===void 0?`Skill files live under \`${MODEL_SKILL_ROOT}/<skill>/\`, with \`${FALLBACK_SKILL_ROOT}/<skill>/\` as the fallback when \`$HOME\` is unavailable.`:`Skill files live under \`${e.skillRoot}/<skill>/\`.`}function formatAvailableSkillLine(e){return`${`- ${e.skill.name}: ${e.skill.description}`} (path: ${e.skillRoot??MODEL_SKILL_ROOT}/${e.skill.name}/SKILL.md)`}export{formatAvailableSkillsSection};
@@ -1 +1 @@
1
- import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,isHookConflictError}from"#execution/hook-ownership.js";import{isReadyTaskStatus,isTerminalTaskStatus,readTaskInputRequestId}from"#tasks/types.js";import{appendTaskProgressStep,appendTaskViewStep,deliverTaskInputResponsesStep,wakeTaskAgentRequestParentStep,wakeTaskAuthorizationParentStep,wakeTaskMessageParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep,wakeWorkflowTaskInputRequestParentStep}from"#execution/tasks/child/steps.js";import{createWorkflowBodyRef,executeWorkflowBody}from"#execution/tools/workflow/body.js";import{createChannelReader,raceChannelReads}from"#execution/tools/workflow/owner-channels.js";import{openWorkflowToolRunOwnerInbox}from"#execution/tools/workflow/owner.js";import{workflowToolRunOutcomeToTaskCommand,workflowToolRunReportToTaskPayload,workflowToolRunRequestToTaskInputRequest}from"#execution/tools/workflow/owner-inbox.js";import{applyTaskTransition}from"#tasks/transitions.js";async function taskRunWorkflow(e){"use workflow";let t=createHook({token:e.taskInboxToken}),n=openWorkflowToolRunOwnerInbox(),r=[n.reader,createChannelReader(`commands`,t)],i=e.initialView,a=!1,o=!1,s,c=[],l=0,u={messages:[],ownerRequests:[]},d=new Map,f=new AbortController,p,m=e.workflow===void 0,h;try{await claimHookOwnership(t)}catch(e){if(isHookConflictError(e))return;throw e}for(await appendTaskViewStep({activityObserver:e.activityObserver,view:i});h!==void 0&&l>=h.reportCount&&(m=!0,await applyPayload({command:workflowToolRunOutcomeToTaskCommand({from:createWorkflowBodyRef({...e.workflow,execution:`background`}),result:h.outcome}),kind:`task-command`}),h=void 0,i.status===`cancelled`&&a&&!o&&await wakeTaskParentStep({token:e.parentContinuationToken,view:i})),!isFinished();){let e=await raceChannelReads(p===void 0?r:[...r,p]);if(e.channel===`body`){if(p=void 0,e.next.done)continue;h=e.next.value;continue}if(e.next.done)return;if(e.channel===`workflow`){let t=e.next.value;if(t.kind===`report`){await applyPayload(workflowToolRunReportToTaskPayload(t,i.taskId,l++));continue}if(t.kind===`outcome`){await applyPayload({command:workflowToolRunOutcomeToTaskCommand(t),kind:`task-command`});continue}let n=t,r=n.request.kind;if(r===`agent-invoke`||r===`agent-settled`||r===`authorization-request`){await handleOwnerRequest(n);continue}n.requestCoordinates===void 0&&d.set(n.replyTo,{runId:n.from.runId}),await applyPayload(workflowToolRunRequestToTaskInputRequest(n));continue}await applyPayload(e.next.value)}function isFinished(){return isTerminalTaskStatus(i.status)&&a&&m}async function handleUpdate(t){if(i.metadata.kind===`subagent`){if(o)return;a&&!isTerminalTaskStatus(i.status)?await wakeTaskUpdateParentStep({token:e.parentContinuationToken,update:t,view:i}):c.push(t);return}await appendTaskProgressStep({progress:{callId:t.callId,kind:`task-progress`,taskId:i.taskId,update:t.message,updateIndex:t.updateIndex}})}async function handleMessage(t){if(!(o||isTerminalTaskStatus(i.status))){if(!a){u.messages.push(t);return}await wakeTaskMessageParentStep({message:t,taskId:i.taskId,token:e.parentContinuationToken})}}async function applyPayload(t){let r=t.kind===`task-command`&&t.command.kind===`ready`,c=t.kind===`task-command`&&t.command.kind===`reject-dispatch`;if((r||c)&&(a=!0),c&&(o=!0),(r||c)&&(c||isTerminalTaskStatus(i.status)?m=!0:e.workflow!==void 0&&p===void 0&&h===void 0&&!m&&(p=createChannelReader(`body`,awaitBodyResult(executeWorkflowBody({...e.workflow,execution:`background`,owner:n.owner},f.signal)))),await flushPendingTraffic()),t.kind===`task-input-request`&&(s=t),t.kind===`task-message`){await handleMessage(t);return}if(t.kind===`task-update`){await handleUpdate(t);return}let l;if(t.kind===`input-response`)l=i.status===`input_required`?await resolveAnsweredCommand(i,t,d.get(t.childContinuationToken)):void 0;else if(t.kind===`task-input-request`)l={inputRequests:t.requests??[t.request],kind:`require-input`};else if(t.kind===`task-command`)l=t.command;else return;if(l===void 0)return;if(r&&isTerminalTaskStatus(i.status)){await flushUpdates(!0),await wakeTaskParentStep({token:e.parentContinuationToken,view:i});return}let u=i,g=applyTaskTransition(i,l);g.action===`accepted`&&(i=g.view,await appendTaskViewStep({activityObserver:e.activityObserver,view:i}),l.kind===`cancel`&&(f.abort(Error(`Task ${i.taskId} was cancelled.`)),p===void 0&&(m=!0)),isTerminalTaskStatus(i.status)||await flushUpdates(),s!==void 0&&a&&i.status===`input_required`?(await wakeWorkflowTaskInputRequestParentStep({request:s,taskId:i.taskId,token:e.parentContinuationToken}),s=void 0):!o&&a&&(l.kind!==`cancel`||m)&&(!isTerminalTaskStatus(u.status)&&isTerminalTaskStatus(i.status)||!isReadyTaskStatus(u.status)&&isReadyTaskStatus(i.status)&&s===void 0)&&await wakeTaskParentStep({token:e.parentContinuationToken,view:i}),i.status!==`input_required`&&(s=void 0))}async function flushUpdates(t=!1){if(!(!a||isTerminalTaskStatus(i.status)&&!t)){for(let t of c)await wakeTaskUpdateParentStep({token:e.parentContinuationToken,update:t,view:i});c=[]}}async function handleOwnerRequest(e){if(!(o||isTerminalTaskStatus(i.status))){if(!a){u.ownerRequests.push(e);return}await wakeTaskOwnerRequestParent(e)}}async function flushPendingTraffic(){if(!o){for(let t of u.messages)await wakeTaskMessageParentStep({message:t,taskId:i.taskId,token:e.parentContinuationToken});for(let e of u.ownerRequests)await wakeTaskOwnerRequestParent(e)}u.messages.length=0,u.ownerRequests.length=0}async function wakeTaskOwnerRequestParent(t){if(t.request.kind===`authorization-request`){await wakeTaskAuthorizationParentStep({request:t.request,taskId:i.taskId,token:e.parentContinuationToken});return}await wakeTaskAgentRequestParentStep({request:t,taskId:i.taskId,token:e.parentContinuationToken})}}async function*awaitBodyResult(e){yield await e}async function resolveAnsweredCommand(e,t,n){if(t.taskId!==e.taskId)return;let r=new Set(e.inputRequests.flatMap(e=>{let t=readTaskInputRequestId(e);return t===void 0?[]:[t]})),i=t.inputResponses.map(e=>e.requestId).filter(e=>r.has(e));if(i.length!==0)return await deliverTaskInputResponsesStep({answer:t,answerHook:n,requestIds:i})===`delivered`?{kind:`answered`,requestIds:i}:void 0}taskRunWorkflow.workflowId=`workflow//eve//taskRunWorkflow`;export{taskRunWorkflow};
1
+ import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,isHookConflictError}from"#execution/hook-ownership.js";import{isReadyTaskStatus,isTerminalTaskStatus,readTaskInputRequestId}from"#tasks/types.js";import{appendTaskProgressStep,appendTaskViewStep,deliverTaskInputResponsesStep,wakeTaskAgentRequestParentStep,wakeTaskAuthorizationParentStep,wakeTaskMessageParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep,wakeWorkflowTaskInputRequestParentStep}from"#execution/tasks/child/steps.js";import{createWorkflowBodyRef,executeWorkflowBody}from"#execution/tools/workflow/body.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";import{createChannelReader,raceChannelReads}from"#execution/tools/workflow/owner-channels.js";import{openWorkflowToolRunOwnerInbox}from"#execution/tools/workflow/owner.js";import{workflowToolRunOutcomeToTaskCommand,workflowToolRunReportToTaskPayload,workflowToolRunRequestToTaskInputRequest}from"#execution/tools/workflow/owner-inbox.js";import{applyTaskTransition}from"#tasks/transitions.js";async function taskRunWorkflow(e){"use workflow";let t=createHook({token:e.taskInboxToken}),n=openWorkflowToolRunOwnerInbox(),r=[n.reader,createChannelReader(`commands`,t)],i=e.initialView,a=!1,o=!1,s,c=[],l=0,u={messages:[],ownerRequests:[]},d=new Map,f=new AbortController,p,m=e.workflow===void 0,h;try{await claimHookOwnership(t)}catch(e){if(isHookConflictError(e))return;throw e}for(await appendTaskViewStep({activityObserver:e.activityObserver,view:i});h!==void 0&&l>=h.reportCount&&(m=!0,await applyPayload({command:workflowToolRunOutcomeToTaskCommand({from:createWorkflowBodyRef({...e.workflow,execution:`background`}),result:h.outcome}),kind:`task-command`}),h=void 0,i.status===`cancelled`&&a&&!o&&await wakeTaskParentStep({token:e.parentContinuationToken,view:i})),!isFinished();){let e=await raceChannelReads(p===void 0?r:[...r,p]);if(e.channel===`body`){if(p=void 0,e.next.done)continue;h=e.next.value;continue}if(e.next.done)return;if(e.channel===`workflow`){let t=e.next.value;if(t.kind===`report`){await applyPayload(workflowToolRunReportToTaskPayload(t,i.taskId,l++));continue}if(t.kind===`outcome`){await applyPayload({command:workflowToolRunOutcomeToTaskCommand(t),kind:`task-command`});continue}let n=t,r=n.request.kind;if(r===`agent-invoke`||r===`agent-settled`||r===`authorization-request`){await handleOwnerRequest(n);continue}n.requestCoordinates===void 0&&d.set(n.replyTo,{runId:n.from.runId}),await applyPayload(workflowToolRunRequestToTaskInputRequest(n));continue}await applyPayload(e.next.value)}function isFinished(){return isTerminalTaskStatus(i.status)&&a&&m}async function handleUpdate(t){if(i.metadata.kind===`subagent`){if(o)return;a&&!isTerminalTaskStatus(i.status)?await wakeTaskUpdateParentStep({token:e.parentContinuationToken,update:t,view:i}):c.push(t);return}await appendTaskProgressStep({progress:{callId:t.callId,kind:`task-progress`,taskId:i.taskId,update:t.message,updateIndex:t.updateIndex}})}async function handleMessage(t){if(!(o||isTerminalTaskStatus(i.status))){if(!a){u.messages.push(t);return}await wakeTaskMessageParentStep({message:t,taskId:i.taskId,token:e.parentContinuationToken})}}async function applyPayload(t){let r=t.kind===`task-command`&&t.command.kind===`ready`,c=t.kind===`task-command`&&t.command.kind===`reject-dispatch`;if((r||c)&&(a=!0),c&&(o=!0),(r||c)&&(c||isTerminalTaskStatus(i.status)?m=!0:e.workflow!==void 0&&p===void 0&&h===void 0&&!m&&(p=createChannelReader(`body`,awaitBodyResult(executeWorkflowBody({...e.workflow,execution:`background`,owner:n.owner},f.signal)))),await flushPendingTraffic()),t.kind===`task-input-request`&&(s=t),t.kind===`task-message`){await handleMessage(t);return}if(t.kind===`task-update`){await handleUpdate(t);return}let l;if(t.kind===`input-response`)l=i.status===`input_required`?await resolveAnsweredCommand(i,t,d.get(t.childContinuationToken)):void 0;else if(t.kind===`task-input-request`)l={inputRequests:t.requests??[t.request],kind:`require-input`};else if(t.kind===`task-command`)l=t.command;else return;if(l===void 0)return;if(r&&isTerminalTaskStatus(i.status)){await flushUpdates(!0),await wakeTaskParentStep({token:e.parentContinuationToken,view:i});return}let u=i;await transitionTask(l)&&(l.kind===`cancel`&&(f.abort(Error(`Task ${i.taskId} was cancelled.`)),p===void 0&&(m=!0)),isTerminalTaskStatus(i.status)||await flushUpdates(),s!==void 0&&a&&i.status===`input_required`?(await wakeWorkflowTaskInputRequestParentStep({request:s,taskId:i.taskId,token:e.parentContinuationToken}),s=void 0):!o&&a&&(l.kind!==`cancel`||m)&&(!isTerminalTaskStatus(u.status)&&isTerminalTaskStatus(i.status)||!isReadyTaskStatus(u.status)&&isReadyTaskStatus(i.status)&&s===void 0)&&await wakeTaskParentStep({token:e.parentContinuationToken,view:i}),i.status!==`input_required`&&(s=void 0))}async function flushUpdates(t=!1){if(!(!a||isTerminalTaskStatus(i.status)&&!t)){for(let t of c)await wakeTaskUpdateParentStep({token:e.parentContinuationToken,update:t,view:i});c=[]}}async function transitionTask(t){let n=applyTaskTransition(i,t);return n.action===`accepted`&&(i=n.view,await appendTaskViewStep({activityObserver:e.activityObserver,view:i}),!0)}async function handleOwnerRequest(t){if(!a){u.ownerRequests.push(t);return}let{request:n,replyTo:r}=t;if(n.kind===`authorization-request`&&n.event.childSessionId===t.from.runId){await handleStepAuthorization(n,r);return}if(!(o||isTerminalTaskStatus(i.status))){if(n.kind===`authorization-request`){await wakeTaskAuthorizationParentStep({request:n,taskId:i.taskId,token:e.parentContinuationToken});return}await wakeTaskAgentRequestParentStep({request:t,taskId:i.taskId,token:e.parentContinuationToken})}}async function handleStepAuthorization(t,n){let r=t.event.event,a=r.type===`authorization.completed`;if(!o&&(!isTerminalTaskStatus(i.status)||a)){let n=`attemptId`in r.data?r.data.attemptId:void 0;n!==void 0&&r.type===`authorization.required`?await transitionTask({kind:`require-input`,inputRequests:[...i.status===`input_required`?i.inputRequests:[],{kind:`authorization`,requestId:n,name:r.data.name}]}):n!==void 0&&await transitionTask({kind:`answered`,requestIds:[n]}),await wakeTaskAuthorizationParentStep({request:t,taskId:i.taskId,token:e.parentContinuationToken})}await resumeHookStep(n,null,{ifPresent:!0})}async function flushPendingTraffic(){if(!o)for(let t of u.messages)await wakeTaskMessageParentStep({message:t,taskId:i.taskId,token:e.parentContinuationToken});for(let e of u.ownerRequests)await handleOwnerRequest(e);u.messages.length=0,u.ownerRequests.length=0}}async function*awaitBodyResult(e){yield await e}async function resolveAnsweredCommand(e,t,n){if(t.taskId!==e.taskId)return;let r=new Set(e.inputRequests.flatMap(e=>{let t=readTaskInputRequestId(e);return t===void 0?[]:[t]})),i=t.inputResponses.map(e=>e.requestId).filter(e=>r.has(e));if(i.length!==0)return await deliverTaskInputResponsesStep({answer:t,answerHook:n,requestIds:i})===`delivered`?{kind:`answered`,requestIds:i}:void 0}taskRunWorkflow.workflowId=`workflow//eve//taskRunWorkflow`;export{taskRunWorkflow};
@@ -1 +1 @@
1
- import{sessionCommandHookToken}from"#execution/session-command-token.js";import{loadContext}from"#context/container.js";import{ActivityObserverKey}from"#context/keys.js";import{parseJsonValue}from"#shared/json.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{parseWorkflowToolInput}from"#execution/tools/workflow/background.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deriveAgentOperationId}from"#subagents/handles/operation-id.js";import{serializeContext}from"#context/serialize.js";import{getAgentHandleStore,writeHandles}from"#subagents/handles/store.js";import{cancelOwnedTask}from"#execution/tasks/parent/dispatch.js";import{cancelBackgroundAgentTask}from"#execution/tools/subagent/task-cancel.js";import{findSessionTaskEntry,recordSessionTask}from"#tasks/session-index.js";import{runStep}from"#context/run-step.js";import{activeTurnId}from"#harness/active-turn-id.js";import{AGENT_BUSY,AGENT_MISMATCH,AGENT_UNREACHABLE,formatAgentBusyMessage}from"#subagents/agent-handle-errors.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{isAuthorizationSignal}from"#harness/authorization.js";import{sendTaskCommand,sendTaskInboundPayload,startTaskRun,waitForTaskCommandOwner}from"#execution/tasks/parent/run-parent.js";import{applyTaskAgentHandleCommand}from"#subagents/handles/transitions.js";import{BackgroundToolExecutorKey}from"#harness/background-tools.js";import{deriveBackgroundTaskActivityObserver}from"#execution/activity-work.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{createTaskMessage,isTaskMessage}from"#tools/task.js";import{beginBackgroundTask,prepareBackgroundTask,rejectDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{projectSubagentTask}from"#execution/tasks/parent/subagent-task-projection.js";const IN_PROCESS_WORKFLOW_EXECUTOR={data:{},kind:`workflow-task`};function runBackgroundStep(e,t,n){return runStep(e,t,n,[backgroundToolExecutionProvider])}const backgroundToolExecutionProvider={key:BackgroundToolExecutorKey,create(e,t){return{value:new BackgroundToolExecutionScope(t)}},async commit(e,t){return await requireExecutionScope(e).commit(t)},async rollback(e,t){await requireExecutionScope(e).rollback(t)},decorateStepResult(e,t){return requireExecutionScope(e).decorate(t)}};function readRetainedBackgroundToolResult(e){let t=e.get(BackgroundToolExecutorKey);return t instanceof BackgroundToolExecutionScope?t.retainedResult():void 0}var BackgroundToolExecutionScope=class{executions=new Map;records=[];steeringAgents=new Set;agentHandleSession;agentHandlesChanged=!1;retained=!1;initialSession;constructor(e){this.initialSession=e,this.agentHandleSession=e}execute(e){let t=this.executions.get(e.options.toolCallId);if(t!==void 0)return t;if(!e.batch.calls.some(t=>t.callId===e.options.toolCallId))throw Error(`Background tool call "${e.options.toolCallId}" was not registered before execution.`);let n=this.start(e);return this.executions.set(e.options.toolCallId,n),n}async readAgentViews(){return(getAgentHandleStore(this.agentHandleSession.state)?.handles??[]).flatMap(e=>e.phase===`reserved`?[]:e.phase===`available`?[{availability:`available`,id:e.identity.id,name:e.identity.name}]:e.phase===`claimed`?[{availability:`busy`,id:e.identity.id,name:e.identity.name,taskId:e.ownerId,taskStatus:`working`}]:[])}async commit(e){let t=this.records.filter(e=>!e.settled);return t.length>0&&await this.compensate(t,Error(`Background tool execution did not delegate or complete its task.`)),this.apply(e)}decorate(e){let t=this.resultFields();return t===void 0?e:{...e,...t}}async rollback(e){let t=this.records.filter(e=>e.settled),n=this.records.filter(e=>!e.settled);if(n.length>0&&await this.compensate(n,e),t.length===0){this.retained=this.agentHandlesChanged&&isTurnCancellation(e);return}if(isTurnCancellation(e)){this.retained=!0;return}await this.compensate(t,e)}retainedResult(){return this.retained?this.resultFields():void 0}apply(e){let t=e;for(let e of this.records)e.settled&&e.task!==void 0&&(t=recordSessionTask(t,e.task));return this.agentHandlesChanged&&(t=writeHandles(t,getAgentHandleStore(this.agentHandleSession.state)?.handles??[])),t}resultFields(){let e=this.records.flatMap(e=>e.settled&&e.task!==void 0?[e.task]:[]);if(e.length!==0||this.agentHandlesChanged)return{backgroundTaskSession:this.apply(this.initialSession),backgroundTasks:e.map(({taskInboxToken:e,taskId:t,taskRunId:n})=>({taskInboxToken:e,taskId:t,taskRunId:n}))}}async start(e){let t={settled:!1};this.records.push(t);let n=getHarnessEmissionState(this.initialSession.state),r=loadContext(),i=await this.startTask({ctx:r,emission:n,input:e,record:t}),a=i.task;t.task=a;let o={binding:{taskId:a.taskId,token:a.taskInboxToken},postMessage:createTaskMessage,send(){throw Error(`task.send() was replaced by yielded task descriptors.`)},session:this.initialSession,task:a,taskId:a.taskId};if(e.definition.workflowId!==void 0)return t.settled=!0,{...i.receipt,status:`working`,taskId:a.taskId};let s=e.definition.execute(e.toolInput,e.options,o),c=isAsyncIterable(s)?await executeBackgroundIterable({callId:e.options.toolCallId,output:s,task:a}):await s;return isAuthorizationSignal(c)?c:(await deliverTaskCommand(a,{data:parseJsonValue(c),kind:`complete`}),t.settled=!0,{status:`working`,taskId:a.taskId})}async startTask(e){let t=e.input.definition.workflowId===void 0?void 0:{...e.input.definition,workflowId:e.input.definition.workflowId},n=t===void 0?void 0:parseWorkflowToolInput(e.input.toolInput,e.input.definition.name),r=activeTurnId(e.emission),i=t?.resultKind===`subagent`&&n!==void 0?projectSubagentTask({ctx:e.ctx,input:n,name:e.input.definition.name,nodeId:t.nodeId??e.input.definition.name,taskInput:{callId:e.input.options.toolCallId,parentSessionId:this.initialSession.sessionId,parentTurnId:r}}):void 0;if(i!==void 0&&i.identity===void 0&&!hasAgentHandle(this.agentHandleSession,i.metadata.agentId)){let{agentId:a,...o}=n;n=o,i=projectSubagentTask({ctx:e.ctx,input:o,name:e.input.definition.name,nodeId:t.nodeId??e.input.definition.name,taskInput:{callId:e.input.options.toolCallId,parentSessionId:this.initialSession.sessionId,parentTurnId:r}})}let a=i?.metadata??{kind:`tool`,name:e.input.definition.name},o={activityObserver:deriveBackgroundTaskActivityObserver({activityObserver:e.ctx.get(ActivityObserverKey),callId:e.input.options.toolCallId,name:a.name,parentSessionId:this.initialSession.sessionId,parentTurnId:r,rootSessionId:this.initialSession.rootSessionId??this.initialSession.sessionId}),callId:e.input.options.toolCallId,metadata:a,parentSessionId:this.initialSession.sessionId,parentStepIndex:e.emission.stepIndex,parentTurnId:r,session:this.initialSession};if(t===void 0)return{task:await beginBackgroundTask({activityObserver:o.activityObserver,callId:o.callId,metadata:o.metadata,parentSessionId:o.parentSessionId,parentStepIndex:o.parentStepIndex,parentTurnId:o.parentTurnId,session:o.session})};if(n===void 0)throw Error(`Background workflow tool "${e.input.definition.name}" has no input.`);let s=prepareBackgroundTask(o);if(t.resultKind===`subagent`&&i!==void 0&&i.identity!==void 0){let t=i.identity;if(this.applyAgentHandleCommand({identity:t.identity,callId:o.callId,kind:`reserve`,operationId:t.operation.id,ownerId:s.taskId}).kind!==`ready`)throw Error(`Agent handle store rejected start operation "${t.operation.id}".`);e.record.reservation={agentId:t.identity.id,operationId:t.operation.id}}if(t.resultKind===`subagent`&&i!==void 0&&i.identity===void 0){let t=deriveAgentOperationId({callId:o.callId,parentSessionId:o.parentSessionId,parentTurnId:r}),n=await this.claimAgentForSteering({agentId:i.metadata.agentId,callId:o.callId,expectedTarget:i.metadata.mode,invokedName:i.metadata.name,kind:`claim`,operationId:t,ownerId:s.taskId},e.ctx);readClaimedHandle(n)?e.record.claim={operationId:t,taskId:s.taskId}:throwAgentClaimError(i.metadata.agentId,n)}await startTaskRun({activityObserver:o.activityObserver,initialView:{metadata:s.metadata,status:`working`,taskId:s.taskId},parentContinuationToken:sessionCommandHookToken(this.initialSession.sessionId),taskInboxToken:s.taskInboxToken,workflow:{callId:o.callId,executeInput:t.executeInput?.(n),input:n,resultKind:t.resultKind,session:buildCallbackContext().session,stepIndex:e.emission.stepIndex,toolName:e.input.definition.name,taskId:s.taskId,workflowId:t.workflowId}});let c=await waitForTaskCommandOwner({taskInboxToken:s.taskInboxToken}),l={...s,executor:IN_PROCESS_WORKFLOW_EXECUTOR,taskRunId:c.runId};return e.record.task=l,t.resultKind!==`subagent`||i===void 0?{task:l}:(i.identity,{receipt:i.receipt,task:l})}async claimAgentForSteering(e,t){let n=this.applyAgentHandleCommand(e);if(n.kind!==`busy`||n.handle.phase!==`claimed`)return n;let r=n.handle;if(this.steeringAgents.has(r.identity.id))return n;let i=findSessionTaskEntry(this.agentHandleSession.state,r.ownerId);if(i?.metadata.kind!==`subagent`||i.metadata.agentId!==r.identity.id||i.metadata.name!==r.identity.name)return n;this.steeringAgents.add(r.identity.id);try{return await cancelOwnedTask({cancelOwnedWork:cancelBackgroundAgentTask,entry:i,serializedContext:serializeContext(t),session:this.agentHandleSession}),this.applyAgentHandleCommand({kind:`release-owner`,ownerId:r.ownerId}),this.applyAgentHandleCommand(e)}finally{this.steeringAgents.delete(r.identity.id)}}applyAgentHandleCommand(e){let t=applyTaskAgentHandleCommand(this.agentHandleSession,e);return t.session!==this.agentHandleSession&&(this.agentHandleSession=t.session,this.agentHandlesChanged=!0),t.result}async compensate(e,t){let n=[];for(let r of e.toReversed()){if(r.task!==void 0)try{await rejectDelegatedDispatch({error:{code:`PARENT_STEP_FAILED`,message:t instanceof Error?t.message:String(t)},task:r.task})}catch(e){n.push(e)}r.claim!==void 0&&this.applyAgentHandleCommand({kind:`release-owner`,ownerId:r.claim.taskId}),r.reservation!==void 0&&r.task!==void 0&&this.applyAgentHandleCommand({agentId:r.reservation.agentId,kind:`remove`,ownerId:r.task.taskId})}if(n.length>0)throw AggregateError([t,...n],`Background tool execution failed and its tasks could not all be rejected.`,{cause:t})}};async function executeBackgroundIterable(e){let t=e.output[Symbol.asyncIterator](),n=0,r=await t.next();for(;!r.done;){let i=isTaskMessage(r.value)?{callId:e.callId,kind:`task-message`,message:r.value.message,messageEpoch:e.task.taskId,messageIndex:n++}:{callId:e.callId,kind:`task-update`,message:typeof r.value==`string`?r.value:JSON.stringify(r.value),updateEpoch:e.task.taskId,updateIndex:n++};if(await sendTaskInboundPayload({payload:i,taskInboxToken:e.task.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.task.taskId}" did not accept "${i.kind}".`);r=await t.next()}return r.value??null}function hasAgentHandle(e,t){return getAgentHandleStore(e.state)?.handles.some(e=>e.identity.id===t)===!0}function requireExecutionScope(e){if(!(e instanceof BackgroundToolExecutionScope))throw Error(`The background tool executor is not owned by the task runtime.`);return e}async function deliverTaskCommand(e,t){if(await sendTaskCommand({command:t,taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${t.kind}".`)}function readClaimedHandle(e){return e.kind===`ready`&&e.handle?.phase===`claimed`}function throwAgentClaimError(e,t){throw t.kind===`mismatch`?Error(JSON.stringify({code:AGENT_MISMATCH,message:`Agent "${e}" no longer matches this subagent definition. Start a new agent instead.`})):t.kind===`busy`?Error(JSON.stringify({code:AGENT_BUSY,message:formatAgentBusyMessage({agentId:e,agentName:t.handle.identity.name,ownerId:`ownerId`in t.handle?t.handle.ownerId:void 0})})):Error(JSON.stringify({code:AGENT_UNREACHABLE,message:`Agent with id "${e}" is no longer reachable.`}))}export{backgroundToolExecutionProvider,readRetainedBackgroundToolResult,runBackgroundStep};
1
+ import{sessionCommandHookToken}from"#execution/session-command-token.js";import{loadContext}from"#context/container.js";import{ActivityObserverKey}from"#context/keys.js";import{parseJsonValue}from"#shared/json.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{parseWorkflowToolInput}from"#execution/tools/workflow/background.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deriveAgentOperationId}from"#subagents/handles/operation-id.js";import{serializeContext}from"#context/serialize.js";import{getAgentHandleStore,writeHandles}from"#subagents/handles/store.js";import{cancelOwnedTask}from"#execution/tasks/parent/dispatch.js";import{cancelBackgroundAgentTask}from"#execution/tools/subagent/task-cancel.js";import{findSessionTaskEntry,recordSessionTask}from"#tasks/session-index.js";import{sessionDriverSupportsWorkflowTaskAuthorization}from"#execution/wire/session-inbox-resume.js";import{runStep}from"#context/run-step.js";import{activeTurnId}from"#harness/active-turn-id.js";import{AGENT_BUSY,AGENT_MISMATCH,AGENT_UNREACHABLE,formatAgentBusyMessage}from"#subagents/agent-handle-errors.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{isAuthorizationSignal}from"#harness/authorization.js";import{sendTaskCommand,sendTaskInboundPayload,startTaskRun,waitForTaskCommandOwner}from"#execution/tasks/parent/run-parent.js";import{applyTaskAgentHandleCommand}from"#subagents/handles/transitions.js";import{BackgroundToolExecutorKey}from"#harness/background-tools.js";import{deriveBackgroundTaskActivityObserver}from"#execution/activity-work.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{createTaskMessage,isTaskMessage}from"#tools/task.js";import{beginBackgroundTask,prepareBackgroundTask,rejectDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{projectSubagentTask}from"#execution/tasks/parent/subagent-task-projection.js";const IN_PROCESS_WORKFLOW_EXECUTOR={data:{},kind:`workflow-task`};function runBackgroundStep(e,t,n){return runStep(e,t,n,[backgroundToolExecutionProvider])}const backgroundToolExecutionProvider={key:BackgroundToolExecutorKey,create(e,t){return{value:new BackgroundToolExecutionScope(t)}},async commit(e,t){return await requireExecutionScope(e).commit(t)},async rollback(e,t){await requireExecutionScope(e).rollback(t)},decorateStepResult(e,t){return requireExecutionScope(e).decorate(t)}};function readRetainedBackgroundToolResult(e){let t=e.get(BackgroundToolExecutorKey);return t instanceof BackgroundToolExecutionScope?t.retainedResult():void 0}var BackgroundToolExecutionScope=class{executions=new Map;records=[];steeringAgents=new Set;agentHandleSession;agentHandlesChanged=!1;retained=!1;initialSession;constructor(e){this.initialSession=e,this.agentHandleSession=e}execute(e){let t=this.executions.get(e.options.toolCallId);if(t!==void 0)return t;if(!e.batch.calls.some(t=>t.callId===e.options.toolCallId))throw Error(`Background tool call "${e.options.toolCallId}" was not registered before execution.`);let n=this.start(e);return this.executions.set(e.options.toolCallId,n),n}async readAgentViews(){return(getAgentHandleStore(this.agentHandleSession.state)?.handles??[]).flatMap(e=>e.phase===`reserved`?[]:e.phase===`available`?[{availability:`available`,id:e.identity.id,name:e.identity.name}]:e.phase===`claimed`?[{availability:`busy`,id:e.identity.id,name:e.identity.name,taskId:e.ownerId,taskStatus:`working`}]:[])}async commit(e){let t=this.records.filter(e=>!e.settled);return t.length>0&&await this.compensate(t,Error(`Background tool execution did not delegate or complete its task.`)),this.apply(e)}decorate(e){let t=this.resultFields();return t===void 0?e:{...e,...t}}async rollback(e){let t=this.records.filter(e=>e.settled),n=this.records.filter(e=>!e.settled);if(n.length>0&&await this.compensate(n,e),t.length===0){this.retained=this.agentHandlesChanged&&isTurnCancellation(e);return}if(isTurnCancellation(e)){this.retained=!0;return}await this.compensate(t,e)}retainedResult(){return this.retained?this.resultFields():void 0}apply(e){let t=e;for(let e of this.records)e.settled&&e.task!==void 0&&(t=recordSessionTask(t,e.task));return this.agentHandlesChanged&&(t=writeHandles(t,getAgentHandleStore(this.agentHandleSession.state)?.handles??[])),t}resultFields(){let e=this.records.flatMap(e=>e.settled&&e.task!==void 0?[e.task]:[]);if(e.length!==0||this.agentHandlesChanged)return{backgroundTaskSession:this.apply(this.initialSession),backgroundTasks:e.map(({taskInboxToken:e,taskId:t,taskRunId:n})=>({taskInboxToken:e,taskId:t,taskRunId:n}))}}async start(e){let t={settled:!1};this.records.push(t);let n=getHarnessEmissionState(this.initialSession.state),r=loadContext(),i=await this.startTask({ctx:r,emission:n,input:e,record:t}),a=i.task;t.task=a;let o={binding:{taskId:a.taskId,token:a.taskInboxToken},postMessage:createTaskMessage,send(){throw Error(`task.send() was replaced by yielded task descriptors.`)},session:this.initialSession,task:a,taskId:a.taskId};if(e.definition.workflowId!==void 0)return t.settled=!0,{...i.receipt,status:`working`,taskId:a.taskId};let s=e.definition.execute(e.toolInput,e.options,o),c=isAsyncIterable(s)?await executeBackgroundIterable({callId:e.options.toolCallId,output:s,task:a}):await s;return isAuthorizationSignal(c)?c:(await deliverTaskCommand(a,{data:parseJsonValue(c),kind:`complete`}),t.settled=!0,{status:`working`,taskId:a.taskId})}async startTask(e){let t=e.input.definition.workflowId===void 0?void 0:{...e.input.definition,workflowId:e.input.definition.workflowId},n=t===void 0?void 0:parseWorkflowToolInput(e.input.toolInput,e.input.definition.name),r=activeTurnId(e.emission),i=t?.resultKind===`subagent`&&n!==void 0?projectSubagentTask({ctx:e.ctx,input:n,name:e.input.definition.name,nodeId:t.nodeId??e.input.definition.name,taskInput:{callId:e.input.options.toolCallId,parentSessionId:this.initialSession.sessionId,parentTurnId:r}}):void 0;if(i!==void 0&&i.identity===void 0&&!hasAgentHandle(this.agentHandleSession,i.metadata.agentId)){let{agentId:a,...o}=n;n=o,i=projectSubagentTask({ctx:e.ctx,input:o,name:e.input.definition.name,nodeId:t.nodeId??e.input.definition.name,taskInput:{callId:e.input.options.toolCallId,parentSessionId:this.initialSession.sessionId,parentTurnId:r}})}let a=i?.metadata??{kind:`tool`,name:e.input.definition.name},o={activityObserver:deriveBackgroundTaskActivityObserver({activityObserver:e.ctx.get(ActivityObserverKey),callId:e.input.options.toolCallId,name:a.name,parentSessionId:this.initialSession.sessionId,parentTurnId:r,rootSessionId:this.initialSession.rootSessionId??this.initialSession.sessionId}),callId:e.input.options.toolCallId,metadata:a,parentSessionId:this.initialSession.sessionId,parentStepIndex:e.emission.stepIndex,parentTurnId:r,session:this.initialSession};if(t===void 0)return{task:await beginBackgroundTask({activityObserver:o.activityObserver,callId:o.callId,metadata:o.metadata,parentSessionId:o.parentSessionId,parentStepIndex:o.parentStepIndex,parentTurnId:o.parentTurnId,session:o.session})};if(n===void 0)throw Error(`Background workflow tool "${e.input.definition.name}" has no input.`);let s=prepareBackgroundTask(o);if(t.resultKind===`subagent`&&i!==void 0&&i.identity!==void 0){let t=i.identity;if(this.applyAgentHandleCommand({identity:t.identity,callId:o.callId,kind:`reserve`,operationId:t.operation.id,ownerId:s.taskId}).kind!==`ready`)throw Error(`Agent handle store rejected start operation "${t.operation.id}".`);e.record.reservation={agentId:t.identity.id,operationId:t.operation.id}}if(t.resultKind===`subagent`&&i!==void 0&&i.identity===void 0){let t=deriveAgentOperationId({callId:o.callId,parentSessionId:o.parentSessionId,parentTurnId:r}),n=await this.claimAgentForSteering({agentId:i.metadata.agentId,callId:o.callId,expectedTarget:i.metadata.mode,invokedName:i.metadata.name,kind:`claim`,operationId:t,ownerId:s.taskId},e.ctx);readClaimedHandle(n)?e.record.claim={operationId:t,taskId:s.taskId}:throwAgentClaimError(i.metadata.agentId,n)}await startTaskRun({activityObserver:o.activityObserver,initialView:{metadata:s.metadata,status:`working`,taskId:s.taskId},parentContinuationToken:sessionCommandHookToken(this.initialSession.sessionId),taskInboxToken:s.taskInboxToken,workflow:{authorizationSupported:await sessionDriverSupportsWorkflowTaskAuthorization(this.initialSession.sessionId),callId:o.callId,executeInput:t.executeInput?.(n),input:n,resultKind:t.resultKind,session:buildCallbackContext().session,stepIndex:e.emission.stepIndex,toolName:e.input.definition.name,taskId:s.taskId,workflowId:t.workflowId}});let c=await waitForTaskCommandOwner({taskInboxToken:s.taskInboxToken}),l={...s,executor:IN_PROCESS_WORKFLOW_EXECUTOR,taskRunId:c.runId};return e.record.task=l,t.resultKind!==`subagent`||i===void 0?{task:l}:(i.identity,{receipt:i.receipt,task:l})}async claimAgentForSteering(e,t){let n=this.applyAgentHandleCommand(e);if(n.kind!==`busy`||n.handle.phase!==`claimed`)return n;let r=n.handle;if(this.steeringAgents.has(r.identity.id))return n;let i=findSessionTaskEntry(this.agentHandleSession.state,r.ownerId);if(i?.metadata.kind!==`subagent`||i.metadata.agentId!==r.identity.id||i.metadata.name!==r.identity.name)return n;this.steeringAgents.add(r.identity.id);try{return await cancelOwnedTask({cancelOwnedWork:cancelBackgroundAgentTask,entry:i,serializedContext:serializeContext(t),session:this.agentHandleSession}),this.applyAgentHandleCommand({kind:`release-owner`,ownerId:r.ownerId}),this.applyAgentHandleCommand(e)}finally{this.steeringAgents.delete(r.identity.id)}}applyAgentHandleCommand(e){let t=applyTaskAgentHandleCommand(this.agentHandleSession,e);return t.session!==this.agentHandleSession&&(this.agentHandleSession=t.session,this.agentHandlesChanged=!0),t.result}async compensate(e,t){let n=[];for(let r of e.toReversed()){if(r.task!==void 0)try{await rejectDelegatedDispatch({error:{code:`PARENT_STEP_FAILED`,message:t instanceof Error?t.message:String(t)},task:r.task})}catch(e){n.push(e)}r.claim!==void 0&&this.applyAgentHandleCommand({kind:`release-owner`,ownerId:r.claim.taskId}),r.reservation!==void 0&&r.task!==void 0&&this.applyAgentHandleCommand({agentId:r.reservation.agentId,kind:`remove`,ownerId:r.task.taskId})}if(n.length>0)throw AggregateError([t,...n],`Background tool execution failed and its tasks could not all be rejected.`,{cause:t})}};async function executeBackgroundIterable(e){let t=e.output[Symbol.asyncIterator](),n=0,r=await t.next();for(;!r.done;){let i=isTaskMessage(r.value)?{callId:e.callId,kind:`task-message`,message:r.value.message,messageEpoch:e.task.taskId,messageIndex:n++}:{callId:e.callId,kind:`task-update`,message:typeof r.value==`string`?r.value:JSON.stringify(r.value),updateEpoch:e.task.taskId,updateIndex:n++};if(await sendTaskInboundPayload({payload:i,taskInboxToken:e.task.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.task.taskId}" did not accept "${i.kind}".`);r=await t.next()}return r.value??null}function hasAgentHandle(e,t){return getAgentHandleStore(e.state)?.handles.some(e=>e.identity.id===t)===!0}function requireExecutionScope(e){if(!(e instanceof BackgroundToolExecutionScope))throw Error(`The background tool executor is not owned by the task runtime.`);return e}async function deliverTaskCommand(e,t){if(await sendTaskCommand({command:t,taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${t.kind}".`)}function readClaimedHandle(e){return e.kind===`ready`&&e.handle?.phase===`claimed`}function throwAgentClaimError(e,t){throw t.kind===`mismatch`?Error(JSON.stringify({code:AGENT_MISMATCH,message:`Agent "${e}" no longer matches this subagent definition. Start a new agent instead.`})):t.kind===`busy`?Error(JSON.stringify({code:AGENT_BUSY,message:formatAgentBusyMessage({agentId:e,agentName:t.handle.identity.name,ownerId:`ownerId`in t.handle?t.handle.ownerId:void 0})})):Error(JSON.stringify({code:AGENT_UNREACHABLE,message:`Agent with id "${e}" is no longer reachable.`}))}export{backgroundToolExecutionProvider,readRetainedBackgroundToolResult,runBackgroundStep};
@@ -1,36 +1,7 @@
1
- /**
2
- * Tool-hosted authorization wiring for authored tools that resolve auth
3
- * providers inline with {@link ToolContext.getToken} and
4
- * {@link ToolContext.requireAuth}.
5
- *
6
- * Mirrors the connection authorization flow used by connection search but scopes the
7
- * per-step token cache and framework-owned callback URL by the tool's
8
- * path-derived name and provider key instead of a connection name. All the shared
9
- * machinery — principal resolution, cache reads/writes, the park/resume
10
- * webhook dance, and the loop guard — lives in
11
- * `runtime/connections/scoped-authorization.ts`; this module is the thin
12
- * execution-layer adapter that wraps one tool's `execute`.
13
- */
14
1
  import type { SessionAuthContext } from "#channel/types.js";
15
2
  import type { ApprovalResponseAuth } from "#approval/definition.js";
16
- import type { ToolContext } from "#tools/definition.js";
17
- import type { ToolExecuteOptions } from "#tools/definition.js";
3
+ import type { ToolContext, ToolExecuteOptions } from "#tools/definition.js";
18
4
  import type { TaskExec } from "#tools/task.js";
19
- /**
20
- * Wraps one authored tool's `execute` with a context that supports inline
21
- * provider auth (`ctx.getToken(connect("..."))`).
22
- *
23
- * On a thrown provider-scoped authorization request — implicit from
24
- * `ctx.getToken(provider)` or explicit via `ctx.requireAuth(provider)` — the
25
- * wrapper either fails terminally (token rejected immediately after sign-in)
26
- * or evicts the rejected token from the per-step cache and starts the
27
- * interactive flow, returning an `AuthorizationSignal` to park the turn.
28
- * Interactive strategies never rethrow the raw `Required` into the model: if
29
- * no callback URL can be minted, they fail with a classified
30
- * {@link ConnectionAuthorizationFailedError} instead. Non-interactive
31
- * strategies rethrow the original error because they have no consent flow to
32
- * park on.
33
- */
34
5
  type ToolExecuteWithAuthInput<TInput> = {
35
6
  readonly scope: string;
36
7
  } & ({
@@ -40,8 +11,9 @@ type ToolExecuteWithAuthInput<TInput> = {
40
11
  readonly execution?: never;
41
12
  readonly execute: (toolInput: TInput, ctx: ToolContext, task?: TaskExec) => unknown;
42
13
  });
43
- export declare function createToolExecuteWithAuth<TInput>(input: ToolExecuteWithAuthInput<TInput>): (toolInput: TInput, options: ToolExecuteOptions, task?: TaskExec) => Promise<unknown> | AsyncIterable<unknown>;
44
- /** Builds the narrow token capability used by approval response authorizers. */
14
+ /** Supplies the shared auth capability to one authored tool execution. */
15
+ export declare function createToolExecuteWithAuth<TInput>(input: ToolExecuteWithAuthInput<TInput>): (toolInput: TInput, options: ToolExecuteOptions, task?: TaskExec) => AsyncIterable<unknown> | Promise<unknown>;
16
+ /** Binds the same capability to the person responding to an approval. */
45
17
  export declare function buildApprovalResponseAuth(input: {
46
18
  readonly responder: SessionAuthContext;
47
19
  readonly scope: string;
@@ -1 +1 @@
1
- import{requestAuthorization}from"#harness/authorization.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{buildBaseToolContext}from"#context/build-base-tool-context.js";import{ConnectionAuthorizationFailedError,ConnectionAuthorizationRequiredError,isConnectionAuthorizationRequiredError}from"#connections/errors.js";import{supportsInteractiveAuthorization}from"#shared/connection-types.js";import{normalizeAuthorizationSpec}from"#shared/validate-authorization.js";import{completeScopedAuthorization,evictScopedToken,resolveScopedToken,startScopedAuthorization}from"#runtime/connections/scoped-authorization.js";function createToolExecuteWithAuth(e){let{scope:t}=e;return(n,r,i)=>{let a=buildToolContext({inlineAuthState:{},justAuthorizedScopes:new Set,options:r,scope:t});try{let t;if(e.execution===`background`){if(i===void 0)throw Error(`Background tool execution requires a task runtime.`);t=e.execute(n,a,i)}else t=e.execute(n,a,i);return isAsyncIterable(t)?handleToolIterableErrors(t):Promise.resolve(t).catch(handleToolError)}catch(e){return handleToolError(e)}async function handleToolError(e){if(isToolAuthorizationRequiredError(e))return await handleAuthorizationRequests(e.requests);throw e}async function*handleToolIterableErrors(e){try{for await(let t of e)yield t}catch(e){yield await handleToolError(e)}}}}function buildApprovalResponseAuth(e){let t={},n=new Set;return{async getToken(r,i){if(r===void 0)throw missingProviderError(`ctx.getToken`);return await resolveInlineToken({boundResponder:e.responder,inlineAuthState:t,justAuthorizedScopes:n,options:namespaceApprovalAuthOptions(e.scope,i),provider:r,toolScope:e.scope})},requireAuth(r,i){if(r===void 0)throw missingProviderError(`ctx.requireAuth`);let a=buildInlineScopedAuthorization({boundResponder:e.responder,inlineAuthState:t,options:namespaceApprovalAuthOptions(e.scope,i),provider:r,toolScope:e.scope});throw new ToolAuthorizationRequiredError([{justAuthorized:n.has(a.scope),scoped:a}])}}}function namespaceApprovalAuthOptions(e,t){return t?.authKey===void 0?t:{...t,authKey:`${e}:${t.authKey}`}}async function handleApprovalResponsePolicyError(e){if(!isToolAuthorizationRequiredError(e))throw e;return await handleAuthorizationRequests(e.requests)}function buildToolContext(e){let{scope:t,justAuthorizedScopes:n,inlineAuthState:r}=e;return{...buildBaseToolContext({options:e.options,toolName:t}),async getToken(e,i){if(e===void 0)throw missingProviderError(`ctx.getToken`);return await resolveInlineToken({inlineAuthState:r,justAuthorizedScopes:n,options:i,provider:e,toolScope:t})},requireAuth(e,i){if(e===void 0)throw missingProviderError(`ctx.requireAuth`);let a=buildInlineScopedAuthorization({inlineAuthState:r,options:i,provider:e,toolScope:t});throw new ToolAuthorizationRequiredError([{justAuthorized:n.has(a.scope),scoped:a}])}}}async function resolveInlineToken(e){let{justAuthorizedScopes:t}=e,n=buildInlineScopedAuthorization(e);!t.has(n.scope)&&await completeScopedAuthorization(n)&&t.add(n.scope);try{return await resolveScopedToken(n)}catch(e){throw isConnectionAuthorizationRequiredError(e)?new ToolAuthorizationRequiredError([{cause:e,justAuthorized:t.has(n.scope),scoped:n}]):e}}async function handleAuthorizationRequests(e){let t=[],n;for(let r of e){let{scoped:e}=r;if(r.justAuthorized)throw new ConnectionAuthorizationFailedError(e.scope,{message:`Tool "${e.scope}" rejected the token immediately after authorization.`,reason:`token_rejected_after_authorization`,retryable:!1});await evictScopedToken(e);let i=await startScopedAuthorization(e);if(i!==void 0){t.push(...i.challenges);continue}if(supportsInteractiveAuthorization(e.authorization))throw new ConnectionAuthorizationFailedError(e.scope,{message:`Tool "${e.scope}" requires sign-in, but no authorization callback URL could be minted for this run (missing session context).`,reason:`authorization_callback_unavailable`,retryable:!1});n??=r.cause instanceof Error?r.cause:new ConnectionAuthorizationRequiredError(e.scope)}if(t.length>0)return requestAuthorization(t);throw n??Error(`Tool authorization is required.`)}function buildInlineScopedAuthorization(e){let t=normalizeInlineProvider(e.provider,e.options);return{authorization:t,boundResponder:e.boundResponder,connection:e.options?.connection??{url:``},scope:e.options?.authKey===void 0?deriveInlineScope({authorization:t,inlineAuthState:e.inlineAuthState,provider:e.provider,toolScope:e.toolScope}):validateInlineAuthKey(e.options.authKey)}}function normalizeInlineProvider(e,t){let n=normalizeAuthorizationSpec(e,`ctx.getToken:`,`provider`);if(t?.displayName===void 0)return n;if(t.displayName.length===0)throw Error(`ctx.getToken: The "options.displayName" field must be a non-empty string.`);return{...n,displayName:t.displayName}}function deriveInlineScope(e){let t=e.authorization.vercelConnect?.connector;if(t!==void 0)return`${e.toolScope}__${sanitizeScopeSegment(t)}`;if(e.inlineAuthState.anonymousProvider===void 0)e.inlineAuthState.anonymousProvider=e.provider;else if(e.inlineAuthState.anonymousProvider!==e.provider)throw Error(`ctx.getToken: Multiple inline auth providers without provider metadata need explicit auth keys. Pass options.authKey for each provider, for example ctx.getToken(auth, { authKey: "github" }).`);return`${e.toolScope}__inline_auth`}function validateInlineAuthKey(e){if(!/^[A-Za-z0-9_.:-]+$/u.test(e))throw Error(`ctx.getToken: The "options.authKey" field must contain only letters, digits, "_", "-", ".", or ":".`);return e}function sanitizeScopeSegment(e){let t=e.replace(/[^A-Za-z0-9_.:-]+/gu,`_`).replace(/^_+|_+$/gu,``);return t.length>0?t:`provider`}var ToolAuthorizationRequiredError=class extends Error{requests;constructor(e){super(`Tool authorization required.`),this.name=`ToolAuthorizationRequiredError`,this.requests=e}};function isToolAuthorizationRequiredError(e){return e instanceof Error&&e.name===`ToolAuthorizationRequiredError`}function missingProviderError(e){return Error(`${e}: Pass an auth provider, for example ${e}(connect("github/myagent")).`)}export{buildApprovalResponseAuth,createToolExecuteWithAuth,handleApprovalResponsePolicyError};
1
+ import{buildBaseToolContext}from"#context/build-base-tool-context.js";import{createAuthorizationContext}from"#runtime/authorization-context.js";import{handleAuthorizationError}from"#runtime/connections/scoped-authorization.js";function createToolExecuteWithAuth(e){return(t,n,r)=>{let i=createAuthorizationContext({scope:e.scope}),a={...buildBaseToolContext({options:n,toolName:e.scope}),getToken:i.getToken,requireAuth:i.requireAuth};return i.run(()=>{if(e.execution===`background`){if(r===void 0)throw Error(`Background tool execution requires a task runtime.`);return e.execute(t,a,r)}return e.execute(t,a,r)})}}function buildApprovalResponseAuth(e){let t=createAuthorizationContext({scope:e.scope,boundResponder:e.responder});return{getToken:(n,r)=>t.getToken(n,namespaceApprovalAuthOptions(e.scope,r)),requireAuth:(n,r)=>t.requireAuth(n,namespaceApprovalAuthOptions(e.scope,r))}}function namespaceApprovalAuthOptions(e,t){return t?.authKey===void 0?t:{...t,authKey:`${e}:${t.authKey}`}}async function handleApprovalResponsePolicyError(e){return await handleAuthorizationError(e)}export{buildApprovalResponseAuth,createToolExecuteWithAuth,handleApprovalResponsePolicyError};