anchor-ai-sdk 0.1.7 → 0.1.8

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 (191) hide show
  1. package/README.md +91 -4
  2. package/dist/agents/coding/index.d.ts +1 -0
  3. package/dist/agents/coding/index.d.ts.map +1 -1
  4. package/dist/agents/coding/index.js +3 -0
  5. package/dist/agents/coding/index.js.map +1 -1
  6. package/dist/agents/index.d.ts +1 -0
  7. package/dist/agents/index.d.ts.map +1 -1
  8. package/dist/agents/index.js +1 -0
  9. package/dist/agents/index.js.map +1 -1
  10. package/dist/agents/terminal/index.d.ts +10 -0
  11. package/dist/agents/terminal/index.d.ts.map +1 -0
  12. package/dist/agents/terminal/index.js +20 -0
  13. package/dist/agents/terminal/index.js.map +1 -0
  14. package/dist/agents/terminal/phases.d.ts +4 -0
  15. package/dist/agents/terminal/phases.d.ts.map +1 -0
  16. package/dist/agents/terminal/phases.js +29 -0
  17. package/dist/agents/terminal/phases.js.map +1 -0
  18. package/dist/agents/terminal/prompt.d.ts +13 -0
  19. package/dist/agents/terminal/prompt.d.ts.map +1 -0
  20. package/dist/agents/terminal/prompt.js +33 -0
  21. package/dist/agents/terminal/prompt.js.map +1 -0
  22. package/dist/agents/terminal/strategy.d.ts +3 -0
  23. package/dist/agents/terminal/strategy.d.ts.map +1 -0
  24. package/dist/agents/terminal/strategy.js +12 -0
  25. package/dist/agents/terminal/strategy.js.map +1 -0
  26. package/dist/agents/types.d.ts +6 -0
  27. package/dist/agents/types.d.ts.map +1 -1
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +188 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/engine/budgets.d.ts +1 -0
  33. package/dist/engine/budgets.d.ts.map +1 -1
  34. package/dist/engine/budgets.js +3 -0
  35. package/dist/engine/budgets.js.map +1 -1
  36. package/dist/engine/dispatch.d.ts +35 -0
  37. package/dist/engine/dispatch.d.ts.map +1 -1
  38. package/dist/engine/dispatch.js +87 -10
  39. package/dist/engine/dispatch.js.map +1 -1
  40. package/dist/engine/events.d.ts +26 -2
  41. package/dist/engine/events.d.ts.map +1 -1
  42. package/dist/engine/intent.d.ts +8 -0
  43. package/dist/engine/intent.d.ts.map +1 -0
  44. package/dist/engine/intent.js +22 -0
  45. package/dist/engine/intent.js.map +1 -0
  46. package/dist/engine/loop.d.ts.map +1 -1
  47. package/dist/engine/loop.js +480 -8
  48. package/dist/engine/loop.js.map +1 -1
  49. package/dist/engine/operations.d.ts +82 -0
  50. package/dist/engine/operations.d.ts.map +1 -0
  51. package/dist/engine/operations.js +143 -0
  52. package/dist/engine/operations.js.map +1 -0
  53. package/dist/engine/thread.d.ts +3 -0
  54. package/dist/engine/thread.d.ts.map +1 -1
  55. package/dist/engine/thread.js.map +1 -1
  56. package/dist/engine/types.d.ts +54 -2
  57. package/dist/engine/types.d.ts.map +1 -1
  58. package/dist/index.d.ts +2 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +2 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/ledger/alignment.d.ts +30 -0
  63. package/dist/ledger/alignment.d.ts.map +1 -0
  64. package/dist/ledger/alignment.js +116 -0
  65. package/dist/ledger/alignment.js.map +1 -0
  66. package/dist/ledger/compiler.d.ts +23 -0
  67. package/dist/ledger/compiler.d.ts.map +1 -0
  68. package/dist/ledger/compiler.js +134 -0
  69. package/dist/ledger/compiler.js.map +1 -0
  70. package/dist/ledger/config.d.ts +15 -0
  71. package/dist/ledger/config.d.ts.map +1 -0
  72. package/dist/ledger/config.js +2 -0
  73. package/dist/ledger/config.js.map +1 -0
  74. package/dist/ledger/index.d.ts +6 -0
  75. package/dist/ledger/index.d.ts.map +1 -0
  76. package/dist/ledger/index.js +6 -0
  77. package/dist/ledger/index.js.map +1 -0
  78. package/dist/ledger/ledger.d.ts +45 -0
  79. package/dist/ledger/ledger.d.ts.map +1 -0
  80. package/dist/ledger/ledger.js +181 -0
  81. package/dist/ledger/ledger.js.map +1 -0
  82. package/dist/ledger/types.d.ts +97 -0
  83. package/dist/ledger/types.d.ts.map +1 -0
  84. package/dist/ledger/types.js +12 -0
  85. package/dist/ledger/types.js.map +1 -0
  86. package/dist/llm/index.d.ts +13 -0
  87. package/dist/llm/index.d.ts.map +1 -1
  88. package/dist/llm/index.js +4 -1
  89. package/dist/llm/index.js.map +1 -1
  90. package/dist/llm/openai-compatible.d.ts +15 -1
  91. package/dist/llm/openai-compatible.d.ts.map +1 -1
  92. package/dist/llm/openai-compatible.js +25 -0
  93. package/dist/llm/openai-compatible.js.map +1 -1
  94. package/dist/llm/structured.d.ts +36 -0
  95. package/dist/llm/structured.d.ts.map +1 -0
  96. package/dist/llm/structured.js +44 -0
  97. package/dist/llm/structured.js.map +1 -0
  98. package/dist/llm/types.d.ts +24 -0
  99. package/dist/llm/types.d.ts.map +1 -1
  100. package/dist/lsp/client.d.ts +33 -0
  101. package/dist/lsp/client.d.ts.map +1 -0
  102. package/dist/lsp/client.js +137 -0
  103. package/dist/lsp/client.js.map +1 -0
  104. package/dist/lsp/index.d.ts +15 -0
  105. package/dist/lsp/index.d.ts.map +1 -0
  106. package/dist/lsp/index.js +13 -0
  107. package/dist/lsp/index.js.map +1 -0
  108. package/dist/lsp/protocol.d.ts +25 -0
  109. package/dist/lsp/protocol.d.ts.map +1 -0
  110. package/dist/lsp/protocol.js +45 -0
  111. package/dist/lsp/protocol.js.map +1 -0
  112. package/dist/lsp/tools.d.ts +6 -0
  113. package/dist/lsp/tools.d.ts.map +1 -0
  114. package/dist/lsp/tools.js +198 -0
  115. package/dist/lsp/tools.js.map +1 -0
  116. package/dist/lsp/typescript.d.ts +67 -0
  117. package/dist/lsp/typescript.d.ts.map +1 -0
  118. package/dist/lsp/typescript.js +266 -0
  119. package/dist/lsp/typescript.js.map +1 -0
  120. package/dist/sandbox/command.d.ts +7 -0
  121. package/dist/sandbox/command.d.ts.map +1 -0
  122. package/dist/sandbox/command.js +60 -0
  123. package/dist/sandbox/command.js.map +1 -0
  124. package/dist/sandbox/docker/image.d.ts +12 -0
  125. package/dist/sandbox/docker/image.d.ts.map +1 -0
  126. package/dist/sandbox/docker/image.js +52 -0
  127. package/dist/sandbox/docker/image.js.map +1 -0
  128. package/dist/sandbox/docker/index.d.ts +14 -1
  129. package/dist/sandbox/docker/index.d.ts.map +1 -1
  130. package/dist/sandbox/docker/index.js +211 -24
  131. package/dist/sandbox/docker/index.js.map +1 -1
  132. package/dist/sandbox/e2b/image.d.ts +13 -0
  133. package/dist/sandbox/e2b/image.d.ts.map +1 -0
  134. package/dist/sandbox/e2b/image.js +57 -0
  135. package/dist/sandbox/e2b/image.js.map +1 -0
  136. package/dist/sandbox/e2b/index.d.ts +3 -1
  137. package/dist/sandbox/e2b/index.d.ts.map +1 -1
  138. package/dist/sandbox/e2b/index.js +100 -0
  139. package/dist/sandbox/e2b/index.js.map +1 -1
  140. package/dist/sandbox/heyo/exec.d.ts +2 -0
  141. package/dist/sandbox/heyo/exec.d.ts.map +1 -1
  142. package/dist/sandbox/heyo/exec.js +11 -0
  143. package/dist/sandbox/heyo/exec.js.map +1 -1
  144. package/dist/sandbox/heyo/image.d.ts +15 -0
  145. package/dist/sandbox/heyo/image.d.ts.map +1 -0
  146. package/dist/sandbox/heyo/image.js +74 -0
  147. package/dist/sandbox/heyo/image.js.map +1 -0
  148. package/dist/sandbox/heyo/index.d.ts +21 -3
  149. package/dist/sandbox/heyo/index.d.ts.map +1 -1
  150. package/dist/sandbox/heyo/index.js +190 -16
  151. package/dist/sandbox/heyo/index.js.map +1 -1
  152. package/dist/sandbox/image.d.ts +62 -0
  153. package/dist/sandbox/image.d.ts.map +1 -0
  154. package/dist/sandbox/image.js +23 -0
  155. package/dist/sandbox/image.js.map +1 -0
  156. package/dist/sandbox/index.d.ts +1 -0
  157. package/dist/sandbox/index.d.ts.map +1 -1
  158. package/dist/sandbox/index.js +1 -0
  159. package/dist/sandbox/index.js.map +1 -1
  160. package/dist/sandbox/local/index.d.ts +3 -1
  161. package/dist/sandbox/local/index.d.ts.map +1 -1
  162. package/dist/sandbox/local/index.js +31 -0
  163. package/dist/sandbox/local/index.js.map +1 -1
  164. package/dist/sandbox/process.d.ts +55 -0
  165. package/dist/sandbox/process.d.ts.map +1 -0
  166. package/dist/sandbox/process.js +165 -0
  167. package/dist/sandbox/process.js.map +1 -0
  168. package/dist/sandbox/provider.d.ts +12 -0
  169. package/dist/sandbox/provider.d.ts.map +1 -1
  170. package/dist/sandbox/types.d.ts +46 -3
  171. package/dist/sandbox/types.d.ts.map +1 -1
  172. package/dist/sandbox/types.js.map +1 -1
  173. package/dist/testing.d.ts.map +1 -1
  174. package/dist/testing.js +108 -3
  175. package/dist/testing.js.map +1 -1
  176. package/dist/tools/finish.d.ts +14 -0
  177. package/dist/tools/finish.d.ts.map +1 -1
  178. package/dist/tools/finish.js +13 -3
  179. package/dist/tools/finish.js.map +1 -1
  180. package/dist/tools/index.d.ts +3 -2
  181. package/dist/tools/index.d.ts.map +1 -1
  182. package/dist/tools/index.js +1 -1
  183. package/dist/tools/index.js.map +1 -1
  184. package/dist/tools/truncate.d.ts +7 -0
  185. package/dist/tools/truncate.d.ts.map +1 -1
  186. package/dist/tools/truncate.js +12 -0
  187. package/dist/tools/truncate.js.map +1 -1
  188. package/dist/tools/types.d.ts +57 -1
  189. package/dist/tools/types.d.ts.map +1 -1
  190. package/dist/tools/types.js.map +1 -1
  191. package/package.json +8 -1
package/README.md CHANGED
@@ -77,11 +77,47 @@ No sandbox is needed for this chat example. Model calls may incur cost.
77
77
  pass its returned `compaction` settings to the engine as shown. Catalog lookup is
78
78
  best-effort; configure overrides and fallbacks for endpoints without this metadata.
79
79
 
80
+ ## Task verification
81
+
82
+ For tasks that need evidence before completion, enable the opt-in verifier:
83
+
84
+ ```ts
85
+ const result = await runAgent(
86
+ { task: "Investigate where auth is refreshed" },
87
+ {
88
+ llm,
89
+ sandbox,
90
+ thread: { store, id: threadId },
91
+ verifier: true,
92
+ },
93
+ );
94
+ ```
95
+
96
+ The SDK owns the ledger, intent routing, evidence capture, and phase/finish
97
+ checks. The consumer supplies only the normal `ThreadStore` (the ledger is an
98
+ optional field on `StoredThread`) and the model. Greetings and other chat turns
99
+ create no ledger and make no verifier call. A separate cheap verifier model is
100
+ optional:
101
+
102
+ ```ts
103
+ verifier: {
104
+ llm: cheapLlm,
105
+ gates: ["phase", "finish"],
106
+ allowWaived: true,
107
+ }
108
+ ```
109
+
110
+ `finish` is rejected while a required ledger item is open or lacks linked
111
+ evidence; the agent loops with the missing-evidence feedback. Compiler and
112
+ verifier token usage is counted against the run budget.
113
+
80
114
  ## One sandbox interface
81
115
 
82
116
  **Configure the provider once. Keep the agent-facing machine interface the same.**
83
117
  The same layer works with the built-in coding tools, custom agents, or direct
84
- `sandbox.exec()` calls without an agent.
118
+ `sandbox.exec()` calls without an agent. For long-lived consumers — LSPs, REPLs,
119
+ dev servers, watchers — `sandbox.openProcess()` is the optional persistent
120
+ stdin/stdout primitive; check `provider.capabilities.processStream` first.
85
121
 
86
122
  | Provider | Import | Boot configuration |
87
123
  | --- | --- | --- |
@@ -193,16 +229,26 @@ try {
193
229
  }
194
230
  ```
195
231
 
196
- Provider boot settings and optional capabilities differ. Retention needs a cleanup
197
- policy; remote machines and model calls can cost money. Private HTTPS repositories
232
+ Provider boot settings and optional capabilities differ. Per-sandbox
233
+ `spec.image` is supported by Docker and E2B (as a template name), and by Heyo
234
+ for artifact refs; Local rejects it. Providers that can build/publish expose
235
+ `imagePublisher`, also available as `anchor image publish`.
236
+ Retention needs a cleanup policy; remote machines and model calls can cost money. Private HTTPS repositories
198
237
  can use `spec.git.token`, a caller-supplied credential callback.
199
238
 
200
239
  The latest Docker adapter also supports `spec.egress: "none"`: it disconnects
201
240
  container networks after `start()` setup. Other adapters reject that setting.
202
241
  This is not a claim that all providers offer equivalent isolation.
203
242
 
243
+ Providers that can build images expose the common `imagePublisher` contract and
244
+ the `anchor image publish` command, so Docker, E2B, and Heyo each use their own
245
+ native registry while the caller keeps one shape. `anchor image publish --help`
246
+ shows the flags. Per-provider instructions are in
247
+ [docs/sandbox-image-publishing.md](docs/sandbox-image-publishing.md).
248
+
204
249
  **[Configuration examples](https://anchor-sdk.dev/docs.html#machine)** ·
205
- **[Provider contract and image guide](https://github.com/hrithikkoduri/anchor-ai-sdk/blob/main/src/sandbox/README.md)**
250
+ **[Provider contract and image guide](https://github.com/hrithikkoduri/anchor-ai-sdk/blob/main/src/sandbox/README.md)** ·
251
+ **[Optional LSP tools](docs/lsp.md)**
206
252
 
207
253
  ## Make the agent yours
208
254
 
@@ -278,11 +324,13 @@ Validate inputs and enforce permissions in your implementation.
278
324
  | Capability | Your controls |
279
325
  | --- | --- |
280
326
  | **Budgets and correction** | Step/token/known-dollar budgets, repeated-call detection, silent-tool and visible-verbosity nudges, prose checkpoints, and per-call output requests. |
327
+ | **Reasoning budget** | Per-run `reasoningEffort` (`minimal`–`xhigh`) or an agent-bundle default, sent in the provider's native shape (`reasoning.effort` on OpenRouter, `reasoning_effort` on OpenAI). |
281
328
  | **Context and memory** | Catalog-derived or explicit compaction, supplied thread stores, agent-authored notes, and best-effort output spill. |
282
329
  | **Revival and resume** | Opt-in budget warnings, `request_revival`, `planRevival`, and `ThreadBudget`. Your app persists state and decides whether to fund or enqueue another run. |
283
330
  | **Snapshots and lifecycle** | Git-backed or custom snapshot hooks, optional push, phase-boundary pauses, heartbeats, and cancellation. |
284
331
  | **Streaming and traces** | Raw `onEvent` updates; sequenced, pattern-redacted `traceSinks`; NDJSON files, custom sinks, live projection, and replay. |
285
332
  | **Execution evidence** | Tool names/status/metadata plus recorded test-command outcomes and optional post-run Git freshness checks. Your app defines verification and release gates. |
333
+ | **External effects** | Declared effects, a write-ahead operation journal, stable operation ids, reconciliation on resume, and a stop on unknown outcomes. |
286
334
 
287
335
  <details>
288
336
  <summary><strong>Example: limits, nudges, compaction, and a recorded trace</strong></summary>
@@ -331,6 +379,45 @@ are not redacted. Use distinct trace files/IDs per run in your application.
331
379
  > `latestEvidenceForTree` can compare it with the current tree, but does not prove
332
380
  > an immutable tested snapshot, require a full suite, or inspect assertions.
333
381
 
382
+ ## Recovering external writes
383
+
384
+ A crash between "the target accepted the write" and "the thread saved the
385
+ result" must not become a duplicate write. A tool that changes something outside
386
+ the workspace declares an effect; the engine then records the intent before the
387
+ call and settles it after:
388
+
389
+ ```js
390
+ const createIssue = defineTool({ name: "create_issue", /* ... */ }, async (input, ctx) => {
391
+ const issue = await github.createIssue(input, {
392
+ idempotencyKey: ctx.operationId, // stable across retries
393
+ });
394
+ await ctx.acknowledge?.({ issue: issue.number });
395
+ return { ok: true, content: `Created #${issue.number}` };
396
+ }, {
397
+ effect: {
398
+ async reconcile({ operationId }) {
399
+ const found = await github.findByKey(operationId);
400
+ return found
401
+ ? { status: "applied", result: { ok: true, content: found.url } }
402
+ : { status: "unknown" };
403
+ },
404
+ },
405
+ });
406
+
407
+ await runAgent(task, {
408
+ llm, agent, sandbox,
409
+ operations: { store }, // a durable table in production
410
+ });
411
+ ```
412
+
413
+ On resume, a pending operation is reconciled, never replayed. An unknowable
414
+ outcome ends the run with `reason: "recovery_required"` and
415
+ `AgentResult.pendingOperations`. `MemoryOperationStore` is for tests; production
416
+ needs a durable table with a unique `operation_id`. The target's participation
417
+ (an idempotency key or a status lookup) is what turns this into
418
+ effectively-once; without it, the harness surfaces the ambiguity instead of
419
+ guessing.
420
+
334
421
  ## Test the machine contract
335
422
 
336
423
  `runSandboxConformance(provider)` from `anchor-ai-sdk/testing` exercises the
@@ -16,6 +16,7 @@ export { codingPhases } from "./phases.js";
16
16
  export declare function createCodingAgent(opts?: {
17
17
  testCommand?: string;
18
18
  maxOutputTokens?: number | false;
19
+ reasoningEffort?: Agent["reasoningEffort"];
19
20
  }): Agent;
20
21
  /** The zero-config coding agent — detection instead of a configured suite. */
21
22
  export declare const codingAgent: Agent;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/coding/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CAAO,GACpE,KAAK,CASP;AAED,8EAA8E;AAC9E,eAAO,MAAM,WAAW,EAAE,KAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/coding/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,GAAE;IACJ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACjC,eAAe,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;CACvC,GACL,KAAK,CAYP;AAED,8EAA8E;AAC9E,eAAO,MAAM,WAAW,EAAE,KAA2B,CAAC"}
@@ -21,6 +21,9 @@ export function createCodingAgent(opts = {}) {
21
21
  ...(opts.maxOutputTokens !== undefined
22
22
  ? { maxOutputTokens: opts.maxOutputTokens }
23
23
  : {}),
24
+ ...(opts.reasoningEffort !== undefined
25
+ ? { reasoningEffort: opts.reasoningEffort }
26
+ : {}),
24
27
  };
25
28
  }
26
29
  /** The zero-config coding agent — detection instead of a configured suite. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/coding/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAe,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAI,GAA+D,EAAE;IAErE,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,cAAc;QACxB,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;YAC3C,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAU,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/coding/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAe,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAI,GAIA,EAAE;IAEN,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,cAAc;QACxB,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;YAC3C,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;YAC3C,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAU,iBAAiB,EAAE,CAAC"}
@@ -7,4 +7,5 @@
7
7
  export * from "./types.js";
8
8
  export * from "./coding/index.js";
9
9
  export * from "./chat/index.js";
10
+ export * from "./terminal/index.js";
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC"}
@@ -7,4 +7,5 @@
7
7
  export * from "./types.js";
8
8
  export * from "./coding/index.js";
9
9
  export * from "./chat/index.js";
10
+ export * from "./terminal/index.js";
10
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Agent } from "../types.js";
2
+ export { terminalStrategy } from "./strategy.js";
3
+ export { terminalPhases } from "./phases.js";
4
+ export { buildTerminalPrompt } from "./prompt.js";
5
+ export declare function createTerminalAgent(opts?: {
6
+ maxOutputTokens?: number | false;
7
+ reasoningEffort?: Agent["reasoningEffort"];
8
+ }): Agent;
9
+ export declare const terminalAgent: Agent;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/terminal/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,mBAAmB,CAAC,IAAI,GAAE;IACxC,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACjC,eAAe,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;CACvC,GAAG,KAAK,CAYb;AAED,eAAO,MAAM,aAAa,EAAE,KAA6B,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { createCodingTools } from "../coding/tools.js";
2
+ import { terminalStrategy } from "./strategy.js";
3
+ export { terminalStrategy } from "./strategy.js";
4
+ export { terminalPhases } from "./phases.js";
5
+ export { buildTerminalPrompt } from "./prompt.js";
6
+ export function createTerminalAgent(opts = {}) {
7
+ return {
8
+ name: "terminal",
9
+ strategy: terminalStrategy,
10
+ tools: createCodingTools(),
11
+ ...(opts.maxOutputTokens !== undefined
12
+ ? { maxOutputTokens: opts.maxOutputTokens }
13
+ : {}),
14
+ ...(opts.reasoningEffort !== undefined
15
+ ? { reasoningEffort: opts.reasoningEffort }
16
+ : {}),
17
+ };
18
+ }
19
+ export const terminalAgent = createTerminalAgent();
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/terminal/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,UAAU,mBAAmB,CAAC,IAAI,GAGpC,EAAE;IACJ,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,gBAAgB;QAC1B,KAAK,EAAE,iBAAiB,EAAE;QAC1B,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;YAC3C,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;YAC3C,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAU,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { StrategyPhase } from "../../engine/strategy.js";
2
+ /** Terminal work: inspect the machine, act, prove, report. No repo assumption. */
3
+ export declare const terminalPhases: StrategyPhase[];
4
+ //# sourceMappingURL=phases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phases.d.ts","sourceRoot":"","sources":["../../../src/agents/terminal/phases.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,kFAAkF;AAClF,eAAO,MAAM,cAAc,EAAE,aAAa,EA+BzC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /** Terminal work: inspect the machine, act, prove, report. No repo assumption. */
2
+ export const terminalPhases = [
3
+ {
4
+ id: "inspect",
5
+ goal: "Establish the machine state, task artifacts, and available tooling.",
6
+ guidance: "Use the shell. Check the working directory, installed runtimes, task files, and any verifier/tests. Do not assume a git repository, /testbed, or a project test command.",
7
+ },
8
+ {
9
+ id: "plan",
10
+ goal: "Choose the shortest reliable path to the task's own success condition.",
11
+ guidance: "Name the concrete commands, installs, edits, and checks. Prefer the task's own verifier over generic repo tests.",
12
+ },
13
+ {
14
+ id: "act",
15
+ goal: "Execute the task with terminal-native steps.",
16
+ guidance: "Run commands, install missing tools, modify files, and adjust when output changes the picture. Keep the workspace clean of scratch artifacts.",
17
+ },
18
+ {
19
+ id: "verify",
20
+ goal: "Run the task's verifier and inspect its actual output.",
21
+ guidance: "The task's test/verifier is the source of truth. Re-run after the final change. Report missing or flaky checks honestly.",
22
+ },
23
+ {
24
+ id: "respond",
25
+ goal: "Deliver the outcome with the commands and evidence that prove it.",
26
+ guidance: "State what changed and what was actually verified. Do not claim a pass you did not observe.",
27
+ },
28
+ ];
29
+ //# sourceMappingURL=phases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phases.js","sourceRoot":"","sources":["../../../src/agents/terminal/phases.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,qEAAqE;QAC3E,QAAQ,EACN,0KAA0K;KAC7K;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,wEAAwE;QAC9E,QAAQ,EACN,kHAAkH;KACrH;IACD;QACE,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,8CAA8C;QACpD,QAAQ,EACN,+IAA+I;KAClJ;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,wDAAwD;QAC9D,QAAQ,EACN,0HAA0H;KAC7H;IACD;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,mEAAmE;QACzE,QAAQ,EACN,6FAA6F;KAChG;CACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { StrategyPhase } from "../../engine/strategy.js";
2
+ export interface TerminalPromptOptions {
3
+ phases?: StrategyPhase[];
4
+ context?: string;
5
+ summary?: string;
6
+ }
7
+ /**
8
+ * Terminal-native prompt. Deliberately does not tell the model to inspect a
9
+ * git diff, run a repository test suite, or trust a provisioned conda env.
10
+ * Terminal-Bench tasks are stateful shell problems with their own verifier.
11
+ */
12
+ export declare function buildTerminalPrompt(options?: TerminalPromptOptions): string;
13
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/agents/terminal/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9D,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,qBAA0B,GAAG,MAAM,CA4B/E"}
@@ -0,0 +1,33 @@
1
+ import { terminalPhases } from "./phases.js";
2
+ /**
3
+ * Terminal-native prompt. Deliberately does not tell the model to inspect a
4
+ * git diff, run a repository test suite, or trust a provisioned conda env.
5
+ * Terminal-Bench tasks are stateful shell problems with their own verifier.
6
+ */
7
+ export function buildTerminalPrompt(options = {}) {
8
+ const phases = options.phases ?? terminalPhases;
9
+ return [
10
+ "# Character",
11
+ "You are a capable terminal operator. You work directly on the machine: inspect it, install what is missing, change what is needed, and prove the result with the task's own verifier.",
12
+ "# Operating rules",
13
+ [
14
+ "- The shell is your primary tool. Use it to inspect the real state; do not assume a repository layout, a git diff, or a pre-provisioned Python environment.",
15
+ "- The task instruction and its verifier are the contract. If the task supplies tests, run them and read the actual output.",
16
+ "- Install missing tools only when needed, with the system package manager or the language's package manager.",
17
+ "- Keep the final state focused: no unrelated edits, no scratch files left behind unless the task requires them.",
18
+ "- Never claim a command or test passed unless you observed its exit code/output. Report flaky or unavailable checks honestly.",
19
+ ].join("\n"),
20
+ "# Approach phases",
21
+ [
22
+ "These describe an approach, not a prerequisite itinerary. Skip or revisit phases as the actual environment requires.",
23
+ ...phases.map((phase) => `- ${phase.id}: ${phase.goal}${phase.guidance ? ` ${phase.guidance}` : ""}`),
24
+ ].join("\n"),
25
+ options.context ? `# Environment observations\n${options.context}` : "",
26
+ options.summary
27
+ ? `# Earlier thread context (may describe obsolete plans)\n${options.summary}`
28
+ : "",
29
+ ]
30
+ .filter((part) => part.trim())
31
+ .join("\n\n");
32
+ }
33
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/agents/terminal/prompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7C;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAO,GAA0B,EAAE;IACrE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;IAChD,OAAO;QACL,aAAa;QACb,uLAAuL;QACvL,mBAAmB;QACnB;YACE,6JAA6J;YAC7J,4HAA4H;YAC5H,8GAA8G;YAC9G,iHAAiH;YACjH,+HAA+H;SAChI,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,mBAAmB;QACnB;YACE,sHAAsH;YACtH,GAAG,MAAM,CAAC,GAAG,CACX,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9E;SACF,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;QACvE,OAAO,CAAC,OAAO;YACb,CAAC,CAAC,2DAA2D,OAAO,CAAC,OAAO,EAAE;YAC9E,CAAC,CAAC,EAAE;KACP;SACE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC7B,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AgentStrategy } from "../../engine/strategy.js";
2
+ export declare const terminalStrategy: AgentStrategy;
3
+ //# sourceMappingURL=strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../../src/agents/terminal/strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D,eAAO,MAAM,gBAAgB,EAAE,aAQ9B,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { terminalPhases } from "./phases.js";
2
+ import { buildTerminalPrompt } from "./prompt.js";
3
+ export const terminalStrategy = {
4
+ name: "terminal",
5
+ phases: terminalPhases,
6
+ requiresSandbox: true,
7
+ requiredTools: ["bash", "read_file", "edit_file"],
8
+ systemPrompt({ context, summary }) {
9
+ return buildTerminalPrompt({ context, summary });
10
+ },
11
+ };
12
+ //# sourceMappingURL=strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../../src/agents/terminal/strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAkB;IAC7C,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,cAAc;IACtB,eAAe,EAAE,IAAI;IACrB,aAAa,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC;IACjD,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;QAC/B,OAAO,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;CACF,CAAC"}
@@ -11,6 +11,7 @@
11
11
  * per-field. Custom agents are just objects built from the same primitives.
12
12
  */
13
13
  import type { AgentStrategy } from "../engine/strategy.js";
14
+ import type { ReasoningEffort } from "../llm/types.js";
14
15
  import type { Tool } from "../tools/types.js";
15
16
  export interface Agent {
16
17
  /** Short display name ("coding", "chat") — logs, dashboards, traces. */
@@ -24,5 +25,10 @@ export interface Agent {
24
25
  * An explicit engine option wins; absent, the engine default applies.
25
26
  */
26
27
  maxOutputTokens?: number | false;
28
+ /**
29
+ * Reasoning budget this bundle suggests. An explicit
30
+ * `EngineOptions.reasoningEffort` wins; absent, the provider default applies.
31
+ */
32
+ reasoningEffort?: ReasoningEffort;
27
33
  }
28
34
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,KAAK;IACpB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,QAAQ,EAAE,aAAa,CAAC;IACxB,6EAA6E;IAC7E,KAAK,EAAE,IAAI,EAAE,CAAC;IACd;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAClC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,KAAK;IACpB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,QAAQ,EAAE,aAAa,CAAC;IACxB,6EAA6E;IAC7E,KAAK,EAAE,IAAI,EAAE,CAAC;IACd;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACjC;;;OAGG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env node
2
+ const PUBLISHERS = ["docker", "e2b", "heyo"];
3
+ const PROVIDERS = ["docker", "e2b", "heyo", "daytona", "local"];
4
+ function usage() {
5
+ return `usage:
6
+ anchor image publish --provider <docker|e2b|heyo> --name <tag>
7
+ (--dockerfile <path> [--context <dir>] | --from-image <image> | --rootfs <path>)
8
+ [--build-arg KEY=VALUE]... [--no-push] [--public] [--json]
9
+
10
+ anchor <provider> image publish ... # provider-first alias
11
+
12
+ Providers:
13
+ docker build/tag and push a container image
14
+ e2b build/publish an E2B template (from a Dockerfile or image)
15
+ heyo push a rootfs or Dockerfile manifest with heyctl
16
+
17
+ Credentials:
18
+ Docker uses the Docker CLI's existing login
19
+ E2B E2B_API_KEY (and optional E2B_DOMAIN)
20
+ Heyo heyctl's saved login (optional HEYCTL_BIN, HEYO_IMAGE_STORE)
21
+ `;
22
+ }
23
+ function isProvider(value) {
24
+ return !!value && PROVIDERS.includes(value);
25
+ }
26
+ function parse(argv) {
27
+ const out = {
28
+ buildArgs: {},
29
+ push: true,
30
+ public: false,
31
+ json: false,
32
+ help: false,
33
+ };
34
+ let args = [...argv];
35
+ if (args[0] === "image" && args[1] === "publish") {
36
+ args = args.slice(2);
37
+ }
38
+ else if (isProvider(args[0]) && args[1] === "image" && args[2] === "publish") {
39
+ out.provider = args[0];
40
+ args = args.slice(3);
41
+ }
42
+ else if (isProvider(args[0]) && args[1] === "publish" && args[2] === "image") {
43
+ out.provider = args[0];
44
+ args = args.slice(3);
45
+ }
46
+ else if (args[0] === "--help" || args[0] === "-h" || args[0] === "help") {
47
+ out.help = true;
48
+ return out;
49
+ }
50
+ else {
51
+ throw new Error(`unknown command\n\n${usage()}`);
52
+ }
53
+ let fromImage;
54
+ let rootfs;
55
+ let dockerfile;
56
+ let context;
57
+ for (let i = 0; i < args.length; i += 1) {
58
+ const arg = args[i];
59
+ const value = () => {
60
+ const v = args[i + 1];
61
+ if (!v)
62
+ throw new Error(`missing value for ${arg}`);
63
+ i += 1;
64
+ return v;
65
+ };
66
+ if (arg === "--help" || arg === "-h")
67
+ out.help = true;
68
+ else if (arg === "--json")
69
+ out.json = true;
70
+ else if (arg === "--no-push")
71
+ out.push = false;
72
+ else if (arg === "--public")
73
+ out.public = true;
74
+ else if (arg === "--provider")
75
+ out.provider = value();
76
+ else if (arg === "--name")
77
+ out.name = value();
78
+ else if (arg === "--from-image")
79
+ fromImage = value();
80
+ else if (arg === "--rootfs")
81
+ rootfs = value();
82
+ else if (arg === "--dockerfile")
83
+ dockerfile = value();
84
+ else if (arg === "--context")
85
+ context = value();
86
+ else if (arg === "--build-arg") {
87
+ const pair = value();
88
+ const equals = pair.indexOf("=");
89
+ if (equals <= 0)
90
+ throw new Error(`--build-arg needs KEY=VALUE, got ${pair}`);
91
+ out.buildArgs[pair.slice(0, equals)] = pair.slice(equals + 1);
92
+ }
93
+ else {
94
+ throw new Error(`unknown option ${arg}\n\n${usage()}`);
95
+ }
96
+ }
97
+ if (out.help)
98
+ return out;
99
+ const sources = [
100
+ fromImage ? { kind: "image", image: fromImage } : undefined,
101
+ rootfs ? { kind: "rootfs", path: rootfs } : undefined,
102
+ dockerfile ? { kind: "dockerfile", path: dockerfile } : undefined,
103
+ ].filter((source) => source !== undefined);
104
+ if (sources.length !== 1) {
105
+ throw new Error(`choose exactly one of --dockerfile, --from-image, or --rootfs\n\n${usage()}`);
106
+ }
107
+ if (context && !dockerfile) {
108
+ throw new Error("--context requires --dockerfile");
109
+ }
110
+ if (dockerfile)
111
+ out.source = { kind: "dockerfile", path: dockerfile, ...(context ? { context } : {}) };
112
+ else if (rootfs)
113
+ out.source = { kind: "rootfs", path: rootfs };
114
+ else
115
+ out.source = { kind: "image", image: fromImage };
116
+ return out;
117
+ }
118
+ async function loadPublisher(provider) {
119
+ if (provider === "docker") {
120
+ const { dockerImagePublisher } = await import("./sandbox/docker/image.js");
121
+ return dockerImagePublisher({
122
+ dockerBin: process.env.ANCHOR_DOCKER_BIN ?? process.env.DOCKER_BIN,
123
+ });
124
+ }
125
+ if (provider === "e2b") {
126
+ const { e2bImagePublisher } = await import("./sandbox/e2b/image.js");
127
+ const cpu = process.env.E2B_CPU_COUNT;
128
+ const memory = process.env.E2B_MEMORY_MB;
129
+ return e2bImagePublisher({
130
+ apiKey: process.env.E2B_API_KEY,
131
+ domain: process.env.E2B_DOMAIN,
132
+ ...(cpu ? { cpuCount: Number(cpu) } : {}),
133
+ ...(memory ? { memoryMB: Number(memory) } : {}),
134
+ });
135
+ }
136
+ if (provider === "heyo") {
137
+ const { heyoImagePublisher } = await import("./sandbox/heyo/image.js");
138
+ return heyoImagePublisher({
139
+ heyctlBin: process.env.HEYCTL_BIN,
140
+ imageStore: process.env.HEYO_IMAGE_STORE,
141
+ });
142
+ }
143
+ throw new Error(`provider "${provider}" has no image publisher (supported: ${PUBLISHERS.join(", ")})`);
144
+ }
145
+ function printResult(result) {
146
+ console.log(`published ${result.kind} via ${result.provider}: ${result.ref}`);
147
+ if (result.target === "sandbox-spec") {
148
+ console.log(`use at sandbox init: { image: ${JSON.stringify(result.ref)} }`);
149
+ }
150
+ else {
151
+ console.log(`use in provider config: ${JSON.stringify(result.providerConfig, null, 2)}`);
152
+ }
153
+ }
154
+ async function main() {
155
+ const parsed = parse(process.argv.slice(2));
156
+ if (parsed.help) {
157
+ process.stdout.write(usage());
158
+ return;
159
+ }
160
+ if (!parsed.provider)
161
+ throw new Error(`--provider is required\n\n${usage()}`);
162
+ if (!parsed.name)
163
+ throw new Error(`--name is required\n\n${usage()}`);
164
+ if (!parsed.source) {
165
+ throw new Error(`one of --dockerfile, --from-image, or --rootfs is required\n\n${usage()}`);
166
+ }
167
+ const publisher = await loadPublisher(parsed.provider);
168
+ const request = {
169
+ name: parsed.name,
170
+ source: parsed.source,
171
+ buildArgs: parsed.buildArgs,
172
+ push: parsed.push,
173
+ public: parsed.public,
174
+ };
175
+ const result = await publisher.publish(request, {
176
+ log: (line) => process.stderr.write(line),
177
+ });
178
+ if (parsed.json)
179
+ console.log(JSON.stringify(result, null, 2));
180
+ else
181
+ printResult(result);
182
+ }
183
+ main().catch((error) => {
184
+ console.error(error instanceof Error ? error.message : String(error));
185
+ process.exitCode = 1;
186
+ });
187
+ export {};
188
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,7 @@ export declare class BudgetTracker {
32
32
  promptTokens: number;
33
33
  completionTokens: number;
34
34
  reasoningTokens: number | undefined;
35
+ cachedTokens: number;
35
36
  costUsd: number;
36
37
  costsKnown: boolean;
37
38
  constructor(limits?: Partial<BudgetLimits>);
@@ -1 +1 @@
1
- {"version":3,"file":"budgets.d.ts","sourceRoot":"","sources":["../../src/engine/budgets.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,qBAAqB,EAAE,YAInC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,YAAY,SAAK;IACjB,gBAAgB,SAAK;IACrB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,OAAO,SAAK;IACZ,UAAU,UAAQ;IAElB,YAAY,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM,EAE7C;IAED,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAS5B;IAED,WAAW,IAAI,MAAM,CAEpB;IAED,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAc7C;CACF"}
1
+ {"version":3,"file":"budgets.d.ts","sourceRoot":"","sources":["../../src/engine/budgets.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,qBAAqB,EAAE,YAInC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,YAAY,SAAK;IACjB,gBAAgB,SAAK;IACrB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,YAAY,SAAK;IACjB,OAAO,SAAK;IACZ,UAAU,UAAQ;IAElB,YAAY,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM,EAE7C;IAED,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAU5B;IAED,WAAW,IAAI,MAAM,CAEpB;IAED,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAc7C;CACF"}
@@ -18,6 +18,7 @@ export class BudgetTracker {
18
18
  promptTokens = 0;
19
19
  completionTokens = 0;
20
20
  reasoningTokens;
21
+ cachedTokens = 0;
21
22
  costUsd = 0;
22
23
  costsKnown = true;
23
24
  constructor(limits = {}) {
@@ -28,6 +29,8 @@ export class BudgetTracker {
28
29
  this.completionTokens += usage.completionTokens;
29
30
  if (usage.reasoningTokens !== undefined)
30
31
  this.reasoningTokens = (this.reasoningTokens ?? 0) + usage.reasoningTokens;
32
+ if (usage.cachedTokens !== undefined)
33
+ this.cachedTokens += usage.cachedTokens;
31
34
  if (usage.costUsd !== undefined) {
32
35
  this.costUsd += usage.costUsd;
33
36
  }