@rarebit-one/harness-kernel 0.7.0 → 0.8.0

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 (97) hide show
  1. package/README.md +65 -7
  2. package/dist/agent.d.ts +12 -3
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +191 -94
  5. package/dist/agent.js.map +1 -1
  6. package/dist/connectors/mcpClient.d.ts +6 -1
  7. package/dist/connectors/mcpClient.d.ts.map +1 -1
  8. package/dist/connectors/mcpClient.js +1 -1
  9. package/dist/connectors/mcpClient.js.map +1 -1
  10. package/dist/engines/acp.d.ts +22 -0
  11. package/dist/engines/acp.d.ts.map +1 -1
  12. package/dist/engines/acp.js +45 -10
  13. package/dist/engines/acp.js.map +1 -1
  14. package/dist/engines/acpDriver.d.ts +7 -0
  15. package/dist/engines/acpDriver.d.ts.map +1 -1
  16. package/dist/engines/acpDriver.js +60 -17
  17. package/dist/engines/acpDriver.js.map +1 -1
  18. package/dist/engines/claudeCode.d.ts +6 -0
  19. package/dist/engines/claudeCode.d.ts.map +1 -1
  20. package/dist/engines/claudeCode.js +32 -10
  21. package/dist/engines/claudeCode.js.map +1 -1
  22. package/dist/engines/claudeCodeDriver.d.ts +11 -0
  23. package/dist/engines/claudeCodeDriver.d.ts.map +1 -1
  24. package/dist/engines/claudeCodeDriver.js +35 -5
  25. package/dist/engines/claudeCodeDriver.js.map +1 -1
  26. package/dist/engines/codex.d.ts +12 -0
  27. package/dist/engines/codex.d.ts.map +1 -1
  28. package/dist/engines/codex.js +15 -1
  29. package/dist/engines/codex.js.map +1 -1
  30. package/dist/engines/codexDriver.d.ts.map +1 -1
  31. package/dist/engines/codexDriver.js +51 -12
  32. package/dist/engines/codexDriver.js.map +1 -1
  33. package/dist/engines/native.d.ts.map +1 -1
  34. package/dist/engines/native.js +59 -4
  35. package/dist/engines/native.js.map +1 -1
  36. package/dist/engines/types.d.ts +16 -1
  37. package/dist/engines/types.d.ts.map +1 -1
  38. package/dist/events.d.ts +55 -10
  39. package/dist/events.d.ts.map +1 -1
  40. package/dist/events.js.map +1 -1
  41. package/dist/index.d.ts +5 -5
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/loop.d.ts +21 -2
  46. package/dist/loop.d.ts.map +1 -1
  47. package/dist/loop.js +7 -2
  48. package/dist/loop.js.map +1 -1
  49. package/dist/models/chat.d.ts +6 -2
  50. package/dist/models/chat.d.ts.map +1 -1
  51. package/dist/models/chat.js +15 -9
  52. package/dist/models/chat.js.map +1 -1
  53. package/dist/models/types.d.ts +15 -1
  54. package/dist/models/types.d.ts.map +1 -1
  55. package/dist/models/types.js.map +1 -1
  56. package/dist/primitives/codeExec.d.ts +7 -0
  57. package/dist/primitives/codeExec.d.ts.map +1 -1
  58. package/dist/primitives/codeExec.js +32 -4
  59. package/dist/primitives/codeExec.js.map +1 -1
  60. package/dist/primitives/http.d.ts +6 -0
  61. package/dist/primitives/http.d.ts.map +1 -1
  62. package/dist/primitives/http.js +28 -11
  63. package/dist/primitives/http.js.map +1 -1
  64. package/dist/processGroup.d.ts +16 -0
  65. package/dist/processGroup.d.ts.map +1 -0
  66. package/dist/processGroup.js +39 -0
  67. package/dist/processGroup.js.map +1 -0
  68. package/dist/providers/anthropic.d.ts +12 -2
  69. package/dist/providers/anthropic.d.ts.map +1 -1
  70. package/dist/providers/anthropic.js +30 -3
  71. package/dist/providers/anthropic.js.map +1 -1
  72. package/dist/providers/mock.d.ts +2 -2
  73. package/dist/providers/mock.d.ts.map +1 -1
  74. package/dist/providers/mock.js +5 -1
  75. package/dist/providers/mock.js.map +1 -1
  76. package/dist/providers/openai.d.ts +11 -2
  77. package/dist/providers/openai.d.ts.map +1 -1
  78. package/dist/providers/openai.js +25 -5
  79. package/dist/providers/openai.js.map +1 -1
  80. package/dist/providers/types.d.ts +21 -1
  81. package/dist/providers/types.d.ts.map +1 -1
  82. package/dist/signals.d.ts +46 -0
  83. package/dist/signals.d.ts.map +1 -0
  84. package/dist/signals.js +72 -0
  85. package/dist/signals.js.map +1 -0
  86. package/dist/tools/metadata.d.ts +18 -2
  87. package/dist/tools/metadata.d.ts.map +1 -1
  88. package/dist/tools/metadata.js +7 -0
  89. package/dist/tools/metadata.js.map +1 -1
  90. package/dist/tools/modelTool.d.ts.map +1 -1
  91. package/dist/tools/modelTool.js +7 -3
  92. package/dist/tools/modelTool.js.map +1 -1
  93. package/dist/tools/registry.d.ts +24 -5
  94. package/dist/tools/registry.d.ts.map +1 -1
  95. package/dist/tools/registry.js +43 -12
  96. package/dist/tools/registry.js.map +1 -1
  97. package/package.json +3 -3
@@ -45,8 +45,31 @@ export function parseAnthropicContent(content) {
45
45
  }
46
46
  return { text, toolCalls };
47
47
  }
48
+ /**
49
+ * Map an Anthropic `usage` block to the kernel's token accounting (pure; tested).
50
+ *
51
+ * Anthropic's `input_tokens` counts only UNCACHED input; cache reads and cache
52
+ * writes are reported separately. Total input is the sum of all three, so that
53
+ * is what `inputTokens` carries, with the cache split out alongside.
54
+ */
55
+ export function anthropicUsage(usage) {
56
+ if (!usage)
57
+ return undefined;
58
+ const cacheRead = "cache_read_input_tokens" in usage ? (usage.cache_read_input_tokens ?? 0) : 0;
59
+ const cacheWrite = "cache_creation_input_tokens" in usage ? (usage.cache_creation_input_tokens ?? 0) : 0;
60
+ const inputTokens = usage.input_tokens + cacheRead + cacheWrite;
61
+ const outputTokens = usage.output_tokens;
62
+ return {
63
+ inputTokens,
64
+ outputTokens,
65
+ totalTokens: inputTokens + outputTokens,
66
+ ...(cacheRead > 0 ? { cacheReadTokens: cacheRead } : {}),
67
+ ...(cacheWrite > 0 ? { cacheWriteTokens: cacheWrite } : {}),
68
+ };
69
+ }
48
70
  export class AnthropicProvider {
49
71
  name = "anthropic";
72
+ reportsUsage = true;
50
73
  client;
51
74
  model;
52
75
  constructor(apiKey, model = process.env.ANTHROPIC_MODEL ?? "claude-sonnet-4-6") {
@@ -72,7 +95,7 @@ export class AnthropicProvider {
72
95
  .map((block) => block.text)
73
96
  .join("\n");
74
97
  }
75
- async converse(req) {
98
+ async converse(req, opts) {
76
99
  const message = await this.client.messages.create({
77
100
  model: this.model,
78
101
  max_tokens: maxTokens(),
@@ -83,8 +106,12 @@ export class AnthropicProvider {
83
106
  input_schema: t.inputSchema,
84
107
  })),
85
108
  messages: toAnthropicMessages(req.messages),
86
- });
87
- return parseAnthropicContent(message.content);
109
+ },
110
+ // Per-request, so an abort cancels THIS call (retries included) and
111
+ // leaves the shared client untouched.
112
+ opts?.signal ? { signal: opts.signal } : undefined);
113
+ const usage = anthropicUsage(message.usage);
114
+ return { ...parseAnthropicContent(message.content), ...(usage ? { usage } : {}) };
88
115
  }
89
116
  }
90
117
  //# sourceMappingURL=anthropic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAUrF,kFAAkF;AAClF,MAAM,UAAU,mBAAmB,CAAC,QAAwB;IAC1D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAA0B,EAAE;QAChD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAC1C,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAkC,EAAE,CAAA;YAChD,IAAI,CAAC,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YACvD,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;YAC9E,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;QAC/C,CAAC;QACD,mEAAmE;QACnE,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,CAAC,CAAC,UAAU;gBACzB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,QAAQ,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK;aAC7B,CAAC,CAAC;SACJ,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,qBAAqB,CAAC,OAAiC;IACrE,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,MAAM,SAAS,GAAe,EAAE,CAAA;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;QAC/C,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACrC,SAAS,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAA4B;aACtD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;AAC5B,CAAC;AAED,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,WAAW,CAAA;IACnB,MAAM,CAAW;IACjB,KAAK,CAAQ;IAErB,YAAY,MAAc,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,mBAAmB;QACpF,4EAA4E;QAC5E,0EAA0E;QAC1E,qCAAqC;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC;YAC1B,MAAM;YACN,OAAO,EAAE,iBAAiB,EAAE;YAC5B,UAAU,EAAE,kBAAkB,EAAE;SACjC,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAsB;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAChD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,SAAS,EAAE;YACvB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;SAClD,CAAC,CAAA;QAEF,OAAO,OAAO,CAAC,OAAO;aACnB,MAAM,CAAC,CAAC,KAAK,EAAgC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;aACtE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC1B,IAAI,CAAC,IAAI,CAAC,CAAA;IACf,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAoB;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAChD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,SAAS,EAAE;YACvB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,YAAY,EAAE,CAAC,CAAC,WAAyC;aAC1D,CAAC,CAAC;YACH,QAAQ,EAAE,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC;SAC5C,CAAC,CAAA;QAEF,OAAO,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/C,CAAC;CACF"}
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { CompletionRequest, ConverseRequest, ConverseResult, Provider } from "./types.js";
1
+ import type { CompletionRequest, ConverseOptions, ConverseRequest, ConverseResult, Provider } from "./types.js";
2
2
  import type { ProviderSelection } from "./index.js";
3
3
  /**
4
4
  * Deterministic, offline provider. Used when no API key is configured — or when a
@@ -20,6 +20,6 @@ export declare class MockProvider implements Provider {
20
20
  private byoKeyMarker;
21
21
  private selectionLines;
22
22
  complete(req: CompletionRequest): Promise<string>;
23
- converse(req: ConverseRequest): Promise<ConverseResult>;
23
+ converse(req: ConverseRequest, opts?: ConverseOptions): Promise<ConverseResult>;
24
24
  }
25
25
  //# sourceMappingURL=mock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD;;;;;;;;;;;GAWG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,IAAI,UAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;gBAEjC,SAAS,GAAE,iBAAsB;IAS7C,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,cAAc;IAWtB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB3C,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAS9D"}
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,cAAc,EACd,QAAQ,EACT,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD;;;;;;;;;;;GAWG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,IAAI,UAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;gBAEjC,SAAS,GAAE,iBAAsB;IAS7C,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,cAAc;IAWtB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B3C,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAWtF"}
@@ -72,13 +72,17 @@ export class MockProvider {
72
72
  }
73
73
  // The mock never calls tools, so the agent loop terminates after one turn. It
74
74
  // echoes which tools were available, which is handy when running offline.
75
- async converse(req) {
75
+ // It honours `signal` the way a real adapter does: an aborted call rejects
76
+ // with the signal's reason instead of returning a turn.
77
+ async converse(req, opts) {
78
+ opts?.signal?.throwIfAborted();
76
79
  const lastUser = [...req.messages].reverse().find((m) => m.role === "user");
77
80
  const prompt = lastUser && lastUser.role === "user" ? lastUser.text : "";
78
81
  const text = await this.complete({
79
82
  system: `${req.system}\n\nAvailable tools: ${req.tools.map((t) => t.name).join(", ") || "(none)"}`,
80
83
  prompt,
81
84
  });
85
+ opts?.signal?.throwIfAborted();
82
86
  return { text, toolCalls: [] };
83
87
  }
84
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,MAAM,CAAA;IACL,SAAS,CAAmB;IAE7C,YAAY,YAA+B,EAAE;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,6EAA6E;IAC7E,0DAA0D;IAC1D,sEAAsE;IACtE,+EAA+E;IAC/E,gFAAgF;IACxE,aAAa;QACnB,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;QACpF,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAA;QACzF,IAAI,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;QACtE,OAAO,EAAE,KAAK,EAAE,6BAA6B,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAA;IACtF,CAAC;IAED,gFAAgF;IAChF,gFAAgF;IAChF,sCAAsC;IAC9B,YAAY;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAA;QAC9C,MAAM,OAAO,GAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAW;aAC7D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,uCAAuC,CAAA;IACtF,CAAC;IAED,gFAAgF;IACxE,cAAc;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QAClC,OAAO;YACL,wCAAwC;YACxC,EAAE;YACF,UAAU,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,kBAAkB;YACxD,gBAAgB,IAAI,CAAC,YAAY,EAAE,EAAE;YACrC,EAAE;SACH,CAAA;IACH,CAAC;IAED,QAAQ,CAAC,GAAsB;QAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACxC,OAAO,OAAO,CAAC,OAAO,CACpB;YACE,mCAAmC;YACnC,EAAE;YACF,+EAA+E;YAC/E,yCAAyC;YACzC,EAAE;YACF,GAAG,IAAI,CAAC,cAAc,EAAE;YACxB,WAAW;YACX,EAAE;YACF,GAAG,CAAC,MAAM;YACV,EAAE;YACF,+BAA+B;YAC/B,EAAE;YACF,KAAK;YACL,OAAO;YACP,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;IACH,CAAC;IAED,8EAA8E;IAC9E,0EAA0E;IAC1E,KAAK,CAAC,QAAQ,CAAC,GAAoB;QACjC,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;QAC3E,MAAM,MAAM,GAAG,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QACxE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;YAC/B,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;YAClG,MAAM;SACP,CAAC,CAAA;QACF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;IAChC,CAAC;CACF"}
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,17 @@
1
1
  import OpenAI from "openai";
2
- import type { AgentMessage, CompletionRequest, ConverseRequest, ConverseResult, Provider } from "./types.js";
2
+ import type { TokenUsage } from "../models/types.js";
3
+ import type { AgentMessage, CompletionRequest, ConverseOptions, ConverseRequest, ConverseResult, Provider } from "./types.js";
3
4
  /** Map provider-neutral messages to OpenAI chat messages (pure; tested). */
4
5
  export declare function toOpenAIMessages(messages: AgentMessage[]): OpenAI.Chat.Completions.ChatCompletionMessageParam[];
5
6
  /** Reduce an OpenAI response message to text + tool calls (pure; tested). */
6
7
  export declare function parseOpenAIMessage(message: OpenAI.Chat.Completions.ChatCompletionMessage): ConverseResult;
8
+ /**
9
+ * Map an OpenAI `usage` block to the kernel's token accounting (pure; tested).
10
+ * `prompt_tokens` already includes cached input, so it maps to `inputTokens`
11
+ * as-is and `cached_tokens` is the cache-read breakdown. OpenAI's automatic
12
+ * caching reports no separate write count.
13
+ */
14
+ export declare function openAIUsage(usage: OpenAI.Completions.CompletionUsage | null | undefined): TokenUsage | undefined;
7
15
  /** Constructor options for an OpenAI-compatible (chat.completions) provider. */
8
16
  export interface OpenAICompatibleOptions {
9
17
  apiKey: string;
@@ -24,11 +32,12 @@ export interface OpenAICompatibleOptions {
24
32
  */
25
33
  export declare class OpenAICompatibleProvider implements Provider {
26
34
  readonly name: string;
35
+ readonly reportsUsage = true;
27
36
  private client;
28
37
  private model;
29
38
  constructor(name: string, opts: OpenAICompatibleOptions);
30
39
  complete(req: CompletionRequest): Promise<string>;
31
- converse(req: ConverseRequest): Promise<ConverseResult>;
40
+ converse(req: ConverseRequest, opts?: ConverseOptions): Promise<ConverseResult>;
32
41
  }
33
42
  export declare class OpenAIProvider extends OpenAICompatibleProvider {
34
43
  constructor(apiKey: string, model?: string);
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,QAAQ,EAET,MAAM,YAAY,CAAA;AAEnB,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EAAE,GACvB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,0BAA0B,EAAE,CA0BtD;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,qBAAqB,GACrD,cAAc,CAchB;AAaD,gFAAgF;AAChF,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;CAC/C;AAED;;;;GAIG;AACH,qBAAa,wBAAyB,YAAW,QAAQ;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,KAAK,CAAQ;gBAET,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB;IAejD,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAajD,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAiB9D;AAED,qBAAa,cAAe,SAAQ,wBAAwB;gBAC9C,MAAM,EAAE,MAAM,EAAE,KAAK,SAAwC;CAG1E"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,cAAc,EACd,QAAQ,EAET,MAAM,YAAY,CAAA;AAEnB,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EAAE,GACvB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,0BAA0B,EAAE,CA0BtD;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,qBAAqB,GACrD,cAAc,CAchB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,eAAe,GAAG,IAAI,GAAG,SAAS,GAC3D,UAAU,GAAG,SAAS,CASxB;AAaD,gFAAgF;AAChF,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;CAC/C;AAED;;;;GAIG;AACH,qBAAa,wBAAyB,YAAW,QAAQ;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,QAAO;IAC5B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,KAAK,CAAQ;gBAET,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB;IAejD,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAajD,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAsBtF;AAED,qBAAa,cAAe,SAAQ,wBAAwB;gBAC9C,MAAM,EAAE,MAAM,EAAE,KAAK,SAAwC;CAG1E"}
@@ -47,6 +47,23 @@ export function parseOpenAIMessage(message) {
47
47
  }
48
48
  return { text, toolCalls };
49
49
  }
50
+ /**
51
+ * Map an OpenAI `usage` block to the kernel's token accounting (pure; tested).
52
+ * `prompt_tokens` already includes cached input, so it maps to `inputTokens`
53
+ * as-is and `cached_tokens` is the cache-read breakdown. OpenAI's automatic
54
+ * caching reports no separate write count.
55
+ */
56
+ export function openAIUsage(usage) {
57
+ if (!usage)
58
+ return undefined;
59
+ const cached = usage.prompt_tokens_details?.cached_tokens ?? 0;
60
+ return {
61
+ inputTokens: usage.prompt_tokens,
62
+ outputTokens: usage.completion_tokens,
63
+ totalTokens: usage.total_tokens,
64
+ ...(cached > 0 ? { cacheReadTokens: cached } : {}),
65
+ };
66
+ }
50
67
  /** Parse a tool-call arguments JSON string, tolerating empty/invalid input. */
51
68
  function parseArguments(raw) {
52
69
  if (!raw)
@@ -66,6 +83,7 @@ function parseArguments(raw) {
66
83
  */
67
84
  export class OpenAICompatibleProvider {
68
85
  name;
86
+ reportsUsage = true;
69
87
  client;
70
88
  model;
71
89
  constructor(name, opts) {
@@ -93,7 +111,7 @@ export class OpenAICompatibleProvider {
93
111
  });
94
112
  return completion.choices[0]?.message?.content ?? "";
95
113
  }
96
- async converse(req) {
114
+ async converse(req, opts) {
97
115
  const tools = req.tools.map((t) => ({
98
116
  type: "function",
99
117
  function: { name: t.name, description: t.description, parameters: t.inputSchema },
@@ -103,11 +121,13 @@ export class OpenAICompatibleProvider {
103
121
  max_tokens: maxTokens(), // match AnthropicProvider rather than the model default
104
122
  messages: [{ role: "system", content: req.system }, ...toOpenAIMessages(req.messages)],
105
123
  ...(tools.length > 0 ? { tools } : {}),
106
- });
124
+ },
125
+ // Per-request, so an abort cancels THIS call (retries included).
126
+ opts?.signal ? { signal: opts.signal } : undefined);
127
+ const usage = openAIUsage(completion.usage);
107
128
  const message = completion.choices[0]?.message;
108
- if (!message)
109
- return { text: "", toolCalls: [] };
110
- return parseOpenAIMessage(message);
129
+ const parsed = message ? parseOpenAIMessage(message) : { text: "", toolCalls: [] };
130
+ return { ...parsed, ...(usage ? { usage } : {}) };
111
131
  }
112
132
  }
113
133
  export class OpenAIProvider extends OpenAICompatibleProvider {
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAUrF,4EAA4E;AAC5E,MAAM,UAAU,gBAAgB,CAC9B,QAAwB;IAExB,MAAM,GAAG,GAAyD,EAAE,CAAA;IACpE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAC7C,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,GAAG,GAAgE;gBACvE,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,CAAC,CAAC,IAAI;aAChB,CAAA;YACD,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBACxC,EAAE,EAAE,EAAE,CAAC,EAAE;oBACT,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;iBACjE,CAAC,CAAC,CAAA;YACL,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACf,CAAC;aAAM,CAAC;YACN,wEAAwE;YACxE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC1B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;YAC5E,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAChC,OAAsD;IAEtD,+EAA+E;IAC/E,+EAA+E;IAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACtF,MAAM,SAAS,GAAe,EAAE,CAAA;IAChC,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC1C,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU;YAAE,SAAQ;QACpC,SAAS,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;YACtB,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;SAC7C,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;AAC5B,CAAC;AAED,+EAA+E;AAC/E,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACvC,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAkC,CAAC,CAAC,CAAC,EAAE,CAAA;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAgBD;;;;GAIG;AACH,MAAM,OAAO,wBAAwB;IAC1B,IAAI,CAAQ;IACb,MAAM,CAAQ;IACd,KAAK,CAAQ;IAErB,YAAY,IAAY,EAAE,IAA6B;QACrD,4EAA4E;QAC5E,0EAA0E;QAC1E,qCAAqC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,iBAAiB,EAAE;YAC5B,UAAU,EAAE,kBAAkB,EAAE;YAChC,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtF,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAsB;QACnC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAC3D,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,SAAS,EAAE,EAAE,wDAAwD;YACjF,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;gBACvC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;aACtC;SACF,CAAC,CAAA;QAEF,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;IACtD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAoB;QACjC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAA8C,EAAE,CAAC,CAAC;YAC9E,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE;SAClF,CAAC,CAAC,CAAA;QAEH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAC3D,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,SAAS,EAAE,EAAE,wDAAwD;YACjF,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtF,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvC,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAA;QAC9C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;QAChD,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,wBAAwB;IAC1D,YAAY,MAAc,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,SAAS;QACvE,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACpC,CAAC;CACF"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { TokenUsage } from "../models/types.js";
1
2
  export interface CompletionRequest {
2
3
  system: string;
3
4
  prompt: string;
@@ -49,12 +50,31 @@ export interface ConverseResult {
49
50
  text: string;
50
51
  /** Tools the model wants run; empty means the turn is final. */
51
52
  toolCalls: ToolCall[];
53
+ /** Token accounting for this call, when the provider's API reports it. */
54
+ usage?: TokenUsage;
55
+ }
56
+ /**
57
+ * Per-call options for {@link Provider.converse}.
58
+ *
59
+ * `signal` aborts the in-flight HTTP request rather than waiting it out: the
60
+ * SDK-backed adapters hand it to the SDK as a per-request option, so a caller
61
+ * cancel (or the loop's own deadline) stops a long generation mid-flight. A
62
+ * provider that cannot honour it should still check it before starting.
63
+ */
64
+ export interface ConverseOptions {
65
+ signal?: AbortSignal;
52
66
  }
53
67
  export interface Provider {
54
68
  readonly name: string;
69
+ /**
70
+ * True when `converse` always populates `ConverseResult.usage`. `chatModel`
71
+ * declares `caps.usage` from this, so a provider that reports nothing (the
72
+ * mock, most custom providers) never advertises usage it will not deliver.
73
+ */
74
+ readonly reportsUsage?: boolean;
55
75
  /** One-shot completion (no tools) — kept for simple callers. */
56
76
  complete(req: CompletionRequest): Promise<string>;
57
77
  /** One step of a tool-use conversation; the agent loop drives the rest. */
58
- converse(req: ConverseRequest): Promise<ConverseResult>;
78
+ converse(req: ConverseRequest, opts?: ConverseOptions): Promise<ConverseResult>;
59
79
  }
60
80
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,2EAA2E;AAC3E,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,4CAA4C;AAC5C,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,+BAA+B;AAC/B,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,qFAAqF;IACrF,OAAO,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,kFAAkF;AAClF,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,CAAA;AAE3C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAA;IACZ,gEAAgE;IAChE,SAAS,EAAE,QAAQ,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,gEAAgE;IAChE,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACjD,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CACxD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,2EAA2E;AAC3E,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,4CAA4C;AAC5C,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,+BAA+B;AAC/B,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,qFAAqF;IACrF,OAAO,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,kFAAkF;AAClF,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,CAAA;AAE3C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAA;IACZ,gEAAgE;IAChE,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,UAAU,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACjD,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CAChF"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Internal helpers for the run's cancellation signals: a caller's cancel and a
3
+ * wall-clock deadline, merged into one signal whose `reason` still says which
4
+ * of the two fired. Not exported from `index.ts`.
5
+ */
6
+ import type { RunOutcome } from "./events.js";
7
+ /**
8
+ * A signal that fires when a wall-clock budget runs out. Clamped to what a
9
+ * timer can represent, so an "effectively unlimited" budget stays unlimited
10
+ * rather than overflowing into an immediate abort, and a negative one fires at
11
+ * once.
12
+ */
13
+ export declare function deadlineSignal(maxDurationMs: number): AbortSignal;
14
+ /**
15
+ * Map an external harness's ending onto the run outcome vocabulary: its own
16
+ * timer → `timed_out`, the caller's signal → `canceled`, otherwise the
17
+ * harness's error flag decides between `failed` and `completed`.
18
+ */
19
+ export declare function harnessOutcome(isError: boolean, stoppedBy?: StoppedBy): RunOutcome;
20
+ /**
21
+ * True when `err` is the run's abort surfacing, not an unrelated failure that
22
+ * merely happened after it. Requires the signal to have fired, and the error to
23
+ * be its reason, to carry it as `cause` (how `run_code` and `http_fetch` wrap
24
+ * it), or to be one of the abort errors the platform and the provider SDKs
25
+ * raise (`AbortError`, `TimeoutError`, the Anthropic/OpenAI SDKs'
26
+ * `APIUserAbortError`, matched by name or class name).
27
+ */
28
+ export declare function isAbortError(err: unknown, signal: AbortSignal | undefined): boolean;
29
+ /** What stopped a run early: its own deadline, or the caller's signal. */
30
+ export type StoppedBy = "deadline" | "signal";
31
+ /** A run's merged stop signal, plus which source fired. */
32
+ export interface RunStop {
33
+ /** Fires on the deadline or the caller's abort; absent when neither exists. */
34
+ signal?: AbortSignal;
35
+ /** Which source fired, or `undefined` while the run has not been stopped. */
36
+ stoppedBy(): StoppedBy | undefined;
37
+ }
38
+ /**
39
+ * Merge an optional wall-clock budget with an optional caller signal.
40
+ *
41
+ * `AbortSignal.any` carries the first source's `reason` through by identity,
42
+ * so comparing it against the deadline's own reason tells a timeout from a
43
+ * cancel without a second flag that could drift from the signal.
44
+ */
45
+ export declare function runStop(maxDurationMs: number | undefined, external?: AbortSignal): RunStop;
46
+ //# sourceMappingURL=signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAK7C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAKjE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,CAIlF;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAMnF;AAID,0EAA0E;AAC1E,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAA;AAE7C,2DAA2D;AAC3D,MAAM,WAAW,OAAO;IACtB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,6EAA6E;IAC7E,SAAS,IAAI,SAAS,GAAG,SAAS,CAAA;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,CAY1F"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Internal helpers for the run's cancellation signals: a caller's cancel and a
3
+ * wall-clock deadline, merged into one signal whose `reason` still says which
4
+ * of the two fired. Not exported from `index.ts`.
5
+ */
6
+ /** Node's timers cap at 2^31-1 ms; a longer delay would fire after 1ms instead. */
7
+ const MAX_TIMER_MS = 2 ** 31 - 1;
8
+ /**
9
+ * A signal that fires when a wall-clock budget runs out. Clamped to what a
10
+ * timer can represent, so an "effectively unlimited" budget stays unlimited
11
+ * rather than overflowing into an immediate abort, and a negative one fires at
12
+ * once.
13
+ */
14
+ export function deadlineSignal(maxDurationMs) {
15
+ const ms = Number.isFinite(maxDurationMs)
16
+ ? Math.min(Math.max(0, Math.ceil(maxDurationMs)), MAX_TIMER_MS)
17
+ : MAX_TIMER_MS;
18
+ return AbortSignal.timeout(ms);
19
+ }
20
+ /**
21
+ * Map an external harness's ending onto the run outcome vocabulary: its own
22
+ * timer → `timed_out`, the caller's signal → `canceled`, otherwise the
23
+ * harness's error flag decides between `failed` and `completed`.
24
+ */
25
+ export function harnessOutcome(isError, stoppedBy) {
26
+ if (stoppedBy === "deadline")
27
+ return "timed_out";
28
+ if (stoppedBy === "signal")
29
+ return "canceled";
30
+ return isError ? "failed" : "completed";
31
+ }
32
+ /**
33
+ * True when `err` is the run's abort surfacing, not an unrelated failure that
34
+ * merely happened after it. Requires the signal to have fired, and the error to
35
+ * be its reason, to carry it as `cause` (how `run_code` and `http_fetch` wrap
36
+ * it), or to be one of the abort errors the platform and the provider SDKs
37
+ * raise (`AbortError`, `TimeoutError`, the Anthropic/OpenAI SDKs'
38
+ * `APIUserAbortError`, matched by name or class name).
39
+ */
40
+ export function isAbortError(err, signal) {
41
+ if (!signal?.aborted)
42
+ return false;
43
+ if (err === signal.reason)
44
+ return true;
45
+ if (!(err instanceof Error))
46
+ return false;
47
+ if (err.cause !== undefined && err.cause === signal.reason)
48
+ return true;
49
+ return ABORT_ERROR_NAMES.has(err.name) || ABORT_ERROR_NAMES.has(err.constructor.name);
50
+ }
51
+ const ABORT_ERROR_NAMES = new Set(["AbortError", "TimeoutError", "APIUserAbortError"]);
52
+ /**
53
+ * Merge an optional wall-clock budget with an optional caller signal.
54
+ *
55
+ * `AbortSignal.any` carries the first source's `reason` through by identity,
56
+ * so comparing it against the deadline's own reason tells a timeout from a
57
+ * cancel without a second flag that could drift from the signal.
58
+ */
59
+ export function runStop(maxDurationMs, external) {
60
+ const deadline = maxDurationMs !== undefined && maxDurationMs > 0 ? deadlineSignal(maxDurationMs) : undefined;
61
+ const sources = [deadline, external].filter((s) => s !== undefined);
62
+ const signal = sources.length > 1 ? AbortSignal.any(sources) : sources[0];
63
+ return {
64
+ ...(signal ? { signal } : {}),
65
+ stoppedBy: () => {
66
+ if (!signal?.aborted)
67
+ return undefined;
68
+ return deadline !== undefined && signal.reason === deadline.reason ? "deadline" : "signal";
69
+ },
70
+ };
71
+ }
72
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,mFAAmF;AACnF,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AAEhC;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,YAAY,CAAC;QAC/D,CAAC,CAAC,YAAY,CAAA;IAChB,OAAO,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,SAAqB;IACpE,IAAI,SAAS,KAAK,UAAU;QAAE,OAAO,WAAW,CAAA;IAChD,IAAI,SAAS,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAA;IAC7C,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAA;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY,EAAE,MAA+B;IACxE,IAAI,CAAC,MAAM,EAAE,OAAO;QAAE,OAAO,KAAK,CAAA;IAClC,IAAI,GAAG,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACtC,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACzC,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACvE,OAAO,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;AACvF,CAAC;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC,CAAA;AAatF;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,aAAiC,EAAE,QAAsB;IAC/E,MAAM,QAAQ,GACZ,aAAa,KAAK,SAAS,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC9F,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAA;IACrF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACzE,OAAO;QACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,SAAS,EAAE,GAAG,EAAE;YACd,IAAI,CAAC,MAAM,EAAE,OAAO;gBAAE,OAAO,SAAS,CAAA;YACtC,OAAO,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC5F,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -34,8 +34,9 @@ export type ResultRetention = "ephemeral" | "standard" | "persistent";
34
34
  export type ClientResultVisibility = "full" | "suppressed";
35
35
  /**
36
36
  * Optional descriptive metadata on a {@link Tool}. Every field is optional and
37
- * an absent field always means "no restriction", so a tool that declares no
38
- * metadata behaves exactly as it did before this existed.
37
+ * an absent field means "no restriction" — except `replay`, where absent means
38
+ * `"unsafe"` (see the field). A tool that declares no metadata behaves exactly
39
+ * as it did before this existed.
39
40
  */
40
41
  export interface ToolMetadata {
41
42
  /** Human-facing label, where a UI wants something friendlier than `name`. */
@@ -60,6 +61,16 @@ export interface ToolMetadata {
60
61
  undoToolName?: string | null;
61
62
  /** How long undo stays available. */
62
63
  undoWindowSeconds?: number | null;
64
+ /**
65
+ * Whether the tool may be executed again after an interruption — e.g. when
66
+ * a run is resumed and this call was in flight. `"safe"` declares the effect
67
+ * idempotent (a read, or a write keyed so a repeat is a no-op); `"unsafe"`
68
+ * declares it is not. **Absent means unsafe**: this is the one field where
69
+ * "no claim" is NOT "no restriction", because re-running an effect nobody
70
+ * vouched for is exactly the failure a replay consumer must avoid. The
71
+ * kernel only records the claim; deciding to replay is the application's.
72
+ */
73
+ replay?: "safe" | "unsafe";
63
74
  resultRetention?: ResultRetention;
64
75
  clientResultVisibility?: ClientResultVisibility;
65
76
  }
@@ -88,6 +99,11 @@ export declare function selectTools(tools: Tool[], selection?: ToolSelection): T
88
99
  export declare function toToolSpecs(tools: Tool[]): ToolSpec[];
89
100
  /** Tools that must not execute until a human has approved them. */
90
101
  export declare function toolsRequiringConfirmation(tools: Tool[]): Tool[];
102
+ /**
103
+ * Tools that declared `replay: "safe"` — the only ones a consumer may re-run
104
+ * after an interruption. An undeclared tool is excluded: absent means unsafe.
105
+ */
106
+ export declare function replaySafeTools(tools: Tool[]): Tool[];
91
107
  /** Look up the tool that undoes `name`, when one is declared and reversible. */
92
108
  export declare function undoToolFor(tools: Tool[], name: string): Tool | undefined;
93
109
  //# sourceMappingURL=metadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/tools/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEzC;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,kBAAkB,CAAA;AAElE,iEAAiE;AACjE,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAA;AAErE;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,YAAY,CAAA;AAE1D;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACpC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,CAAA;IACzC,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,gCAAgC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,sBAAsB,CAAC,EAAE,sBAAsB,CAAA;CAChD;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,sEAAsE;IACtE,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,GAAE,aAAkB,GAAG,OAAO,CAmBhF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,SAAS,GAAE,aAAkB,GAAG,IAAI,EAAE,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAErD;AAED,mEAAmE;AACnE,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAEhE;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAIzE"}
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/tools/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEzC;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,kBAAkB,CAAA;AAElE,iEAAiE;AACjE,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAA;AAErE;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,YAAY,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACpC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,CAAA;IACzC,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,gCAAgC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IAC1B,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,sBAAsB,CAAC,EAAE,sBAAsB,CAAA;CAChD;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,sEAAsE;IACtE,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,GAAE,aAAkB,GAAG,OAAO,CAmBhF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,SAAS,GAAE,aAAkB,GAAG,IAAI,EAAE,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAErD;AAED,mEAAmE;AACnE,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAEhE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAErD;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAIzE"}
@@ -39,6 +39,13 @@ export function toToolSpecs(tools) {
39
39
  export function toolsRequiringConfirmation(tools) {
40
40
  return tools.filter((tool) => tool.meta?.requiresConfirmation === true);
41
41
  }
42
+ /**
43
+ * Tools that declared `replay: "safe"` — the only ones a consumer may re-run
44
+ * after an interruption. An undeclared tool is excluded: absent means unsafe.
45
+ */
46
+ export function replaySafeTools(tools) {
47
+ return tools.filter((tool) => tool.meta?.replay === "safe");
48
+ }
42
49
  /** Look up the tool that undoes `name`, when one is declared and reversible. */
43
50
  export function undoToolFor(tools, name) {
44
51
  const tool = tools.find((t) => t.spec.name === name);
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/tools/metadata.ts"],"names":[],"mappings":"AAiFA,qDAAqD;AACrD,MAAM,UAAU,aAAa,CAAC,IAAU,EAAE,YAA2B,EAAE;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;IACtB,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IAClF,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAEtB,0EAA0E;IAC1E,6EAA6E;IAC7E,4CAA4C;IAC5C,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YACrF,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAA;IACrF,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,YAA2B,EAAE;IACtE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACvC,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,0BAA0B,CAAC,KAAa;IACtD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC,CAAA;AACzE,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,IAAY;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACpD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY;QAAE,OAAO,SAAS,CAAA;IACxE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;AACnE,CAAC"}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/tools/metadata.ts"],"names":[],"mappings":"AA4FA,qDAAqD;AACrD,MAAM,UAAU,aAAa,CAAC,IAAU,EAAE,YAA2B,EAAE;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;IACtB,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IAClF,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAEtB,0EAA0E;IAC1E,6EAA6E;IAC7E,4CAA4C;IAC5C,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YACrF,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAA;IACrF,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,YAA2B,EAAE;IACtE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACvC,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,0BAA0B,CAAC,KAAa;IACtD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC,CAAA;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,CAAA;AAC7D,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,IAAY;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACpD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY;QAAE,OAAO,SAAS,CAAA;IACxE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;AACnE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"modelTool.d.ts","sourceRoot":"","sources":["../../src/tools/modelTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,eAAe,CAAA;AAErD,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB,CAAC,GAAG,EAAE,GAAG;IACxC,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,uEAAuE;IACvE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,CAAA;IAClD;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,MAAM,CAAA;IAChD,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAClC,KAAK,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAChC,OAAO,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EACnC,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GACnC,IAAI,CAwBN"}
1
+ {"version":3,"file":"modelTool.d.ts","sourceRoot":"","sources":["../../src/tools/modelTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAA;AAElE,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB,CAAC,GAAG,EAAE,GAAG;IACxC,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,uEAAuE;IACvE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,CAAA;IAClD;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,MAAM,CAAA;IAChD,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAClC,KAAK,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAChC,OAAO,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EACnC,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GACnC,IAAI,CAiCN"}
@@ -13,10 +13,14 @@
13
13
  */
14
14
  export function modelAsTool(model, options, context = {}) {
15
15
  const project = options.toContent ?? ((result) => JSON.stringify(result.value));
16
- const run = async (input) => {
16
+ const run = async (input, toolCtx) => {
17
+ // The run's signal (from the loop) and any signal bound at construction
18
+ // both cancel the call; either one firing is enough.
19
+ const signals = [context.signal, toolCtx?.signal].filter((s) => s !== undefined);
20
+ const signal = signals.length > 1 ? AbortSignal.any(signals) : signals[0];
17
21
  const ctx = {
18
22
  log: context.log ?? (() => { }),
19
- ...(context.signal ? { signal: context.signal } : {}),
23
+ ...(signal ? { signal } : {}),
20
24
  ...(context.correlationId ? { correlationId: context.correlationId } : {}),
21
25
  ...(context.budget ? { budget: context.budget } : {}),
22
26
  };
@@ -30,7 +34,7 @@ export function modelAsTool(model, options, context = {}) {
30
34
  inputSchema: options.inputSchema,
31
35
  },
32
36
  ...(options.meta ? { meta: options.meta } : {}),
33
- execute: async (input) => (await run(input)).content,
37
+ execute: async (input, toolCtx) => (await run(input, toolCtx)).content,
34
38
  executeStructured: run,
35
39
  };
36
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"modelTool.js","sourceRoot":"","sources":["../../src/tools/modelTool.ts"],"names":[],"mappings":"AAsBA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CACzB,KAAgC,EAChC,OAAmC,EACnC,UAAkC,EAAE;IAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,MAAwB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAEjG,MAAM,GAAG,GAAG,KAAK,EAAE,KAA8B,EAAuB,EAAE;QACxE,MAAM,GAAG,GAAkB;YACzB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC9B,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAA;QACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAA;QAChE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;IAC/D,CAAC,CAAA;IAED,OAAO;QACL,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC;QACD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;QACpD,iBAAiB,EAAE,GAAG;KACvB,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"modelTool.js","sourceRoot":"","sources":["../../src/tools/modelTool.ts"],"names":[],"mappings":"AAsBA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CACzB,KAAgC,EAChC,OAAmC,EACnC,UAAkC,EAAE;IAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,MAAwB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAEjG,MAAM,GAAG,GAAG,KAAK,EACf,KAA8B,EAC9B,OAAqB,EACA,EAAE;QACvB,wEAAwE;QACxE,qDAAqD;QACrD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CACtD,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,KAAK,SAAS,CACzC,CAAA;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACzE,MAAM,GAAG,GAAkB;YACzB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC9B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAA;QACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAA;QAChE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;IAC/D,CAAC,CAAA;IAED,OAAO;QACL,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC;QACD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO;QACtE,iBAAiB,EAAE,GAAG;KACvB,CAAA;AACH,CAAC"}
@@ -17,6 +17,23 @@ export interface ToolOutput {
17
17
  /** The typed payload, preserved for callers and clients. */
18
18
  structured?: unknown;
19
19
  }
20
+ /**
21
+ * What the loop hands a tool alongside its input.
22
+ *
23
+ * `signal` fires when the run is canceled or its deadline passes; a tool that
24
+ * does real work (a subprocess, an HTTP call, a remote MCP call) should stop
25
+ * when it does. `callId` is the model's id for this call — the same id the
26
+ * `tool.called` event carries — so a tool can key an idempotency token or a log
27
+ * line to it. `runId` is present when the caller supplied one.
28
+ *
29
+ * Optional on both executors, so a tool written before this existed, and a
30
+ * caller that invokes a tool directly, keep working unchanged.
31
+ */
32
+ export interface ToolContext {
33
+ signal: AbortSignal;
34
+ callId: string;
35
+ runId?: string;
36
+ }
20
37
  /** A tool the agent can call: its public spec plus a server-side executor. */
21
38
  export interface Tool {
22
39
  spec: ToolSpec;
@@ -26,7 +43,7 @@ export interface Tool {
26
43
  * Execute and return the model-facing string. This is the required contract
27
44
  * every tool implements, and the only one the loop needs.
28
45
  */
29
- execute(input: Record<string, unknown>): Promise<string>;
46
+ execute(input: Record<string, unknown>, ctx?: ToolContext): Promise<string>;
30
47
  /**
31
48
  * Optional richer executor. When present the loop calls this instead and
32
49
  * keeps the typed payload alongside the string; when absent nothing changes.
@@ -36,10 +53,10 @@ export interface Tool {
36
53
  * types `execute` as returning a plain `string`, and widening it to a union
37
54
  * would break them at the type level for a payload most tools never produce.
38
55
  */
39
- executeStructured?(input: Record<string, unknown>): Promise<ToolOutput>;
56
+ executeStructured?(input: Record<string, unknown>, ctx?: ToolContext): Promise<ToolOutput>;
40
57
  }
41
- /** Run a tool through its richest available executor. */
42
- export declare function executeTool(tool: Tool, input: Record<string, unknown>): Promise<ToolOutput>;
58
+ /** Run a tool through its richest available executor, handing it `ctx` when given. */
59
+ export declare function executeTool(tool: Tool, input: Record<string, unknown>, ctx?: ToolContext): Promise<ToolOutput>;
43
60
  /**
44
61
  * General-purpose primitives, scoped to the run sandbox. `env` carries the
45
62
  * resolved secrets (see secretsToEnv) into executed code. Domain logic is the
@@ -58,7 +75,9 @@ export declare function primitiveTools(sandboxDir: string, env: NodeJS.ProcessEn
58
75
  * namespaced `<connector>__<tool>` to avoid collisions. Returns a `close` to
59
76
  * tear down the connections when the run ends.
60
77
  */
61
- export declare function connectorTools(connectors: ConnectorConfig[], connect?: (config: ConnectorConfig) => Promise<McpConnection>): Promise<{
78
+ export declare function connectorTools(connectors: ConnectorConfig[], connect?: (config: ConnectorConfig) => Promise<McpConnection>, opts?: {
79
+ signal?: AbortSignal;
80
+ }): Promise<{
62
81
  tools: Tool[];
63
82
  close: () => Promise<void>;
64
83
  }>;