@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.
- package/README.md +65 -7
- package/dist/agent.d.ts +12 -3
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +191 -94
- package/dist/agent.js.map +1 -1
- package/dist/connectors/mcpClient.d.ts +6 -1
- package/dist/connectors/mcpClient.d.ts.map +1 -1
- package/dist/connectors/mcpClient.js +1 -1
- package/dist/connectors/mcpClient.js.map +1 -1
- package/dist/engines/acp.d.ts +22 -0
- package/dist/engines/acp.d.ts.map +1 -1
- package/dist/engines/acp.js +45 -10
- package/dist/engines/acp.js.map +1 -1
- package/dist/engines/acpDriver.d.ts +7 -0
- package/dist/engines/acpDriver.d.ts.map +1 -1
- package/dist/engines/acpDriver.js +60 -17
- package/dist/engines/acpDriver.js.map +1 -1
- package/dist/engines/claudeCode.d.ts +6 -0
- package/dist/engines/claudeCode.d.ts.map +1 -1
- package/dist/engines/claudeCode.js +32 -10
- package/dist/engines/claudeCode.js.map +1 -1
- package/dist/engines/claudeCodeDriver.d.ts +11 -0
- package/dist/engines/claudeCodeDriver.d.ts.map +1 -1
- package/dist/engines/claudeCodeDriver.js +35 -5
- package/dist/engines/claudeCodeDriver.js.map +1 -1
- package/dist/engines/codex.d.ts +12 -0
- package/dist/engines/codex.d.ts.map +1 -1
- package/dist/engines/codex.js +15 -1
- package/dist/engines/codex.js.map +1 -1
- package/dist/engines/codexDriver.d.ts.map +1 -1
- package/dist/engines/codexDriver.js +51 -12
- package/dist/engines/codexDriver.js.map +1 -1
- package/dist/engines/native.d.ts.map +1 -1
- package/dist/engines/native.js +59 -4
- package/dist/engines/native.js.map +1 -1
- package/dist/engines/types.d.ts +16 -1
- package/dist/engines/types.d.ts.map +1 -1
- package/dist/events.d.ts +55 -10
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loop.d.ts +21 -2
- package/dist/loop.d.ts.map +1 -1
- package/dist/loop.js +7 -2
- package/dist/loop.js.map +1 -1
- package/dist/models/chat.d.ts +6 -2
- package/dist/models/chat.d.ts.map +1 -1
- package/dist/models/chat.js +15 -9
- package/dist/models/chat.js.map +1 -1
- package/dist/models/types.d.ts +15 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js.map +1 -1
- package/dist/primitives/codeExec.d.ts +7 -0
- package/dist/primitives/codeExec.d.ts.map +1 -1
- package/dist/primitives/codeExec.js +32 -4
- package/dist/primitives/codeExec.js.map +1 -1
- package/dist/primitives/http.d.ts +6 -0
- package/dist/primitives/http.d.ts.map +1 -1
- package/dist/primitives/http.js +28 -11
- package/dist/primitives/http.js.map +1 -1
- package/dist/processGroup.d.ts +16 -0
- package/dist/processGroup.d.ts.map +1 -0
- package/dist/processGroup.js +39 -0
- package/dist/processGroup.js.map +1 -0
- package/dist/providers/anthropic.d.ts +12 -2
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +30 -3
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/mock.d.ts +2 -2
- package/dist/providers/mock.d.ts.map +1 -1
- package/dist/providers/mock.js +5 -1
- package/dist/providers/mock.js.map +1 -1
- package/dist/providers/openai.d.ts +11 -2
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +25 -5
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/types.d.ts +21 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/signals.d.ts +46 -0
- package/dist/signals.d.ts.map +1 -0
- package/dist/signals.js +72 -0
- package/dist/signals.js.map +1 -0
- package/dist/tools/metadata.d.ts +18 -2
- package/dist/tools/metadata.d.ts.map +1 -1
- package/dist/tools/metadata.js +7 -0
- package/dist/tools/metadata.js.map +1 -1
- package/dist/tools/modelTool.d.ts.map +1 -1
- package/dist/tools/modelTool.js +7 -3
- package/dist/tools/modelTool.js.map +1 -1
- package/dist/tools/registry.d.ts +24 -5
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +43 -12
- package/dist/tools/registry.js.map +1 -1
- 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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
package/dist/providers/mock.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/providers/mock.js
CHANGED
|
@@ -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
|
-
|
|
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":"
|
|
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 {
|
|
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;
|
|
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"}
|
package/dist/providers/openai.js
CHANGED
|
@@ -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
|
-
|
|
109
|
-
|
|
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;
|
|
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;
|
|
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"}
|
package/dist/signals.js
ADDED
|
@@ -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"}
|
package/dist/tools/metadata.d.ts
CHANGED
|
@@ -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
|
|
38
|
-
*
|
|
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
|
|
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"}
|
package/dist/tools/metadata.js
CHANGED
|
@@ -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":"
|
|
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,
|
|
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"}
|
package/dist/tools/modelTool.js
CHANGED
|
@@ -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
|
-
...(
|
|
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,
|
|
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"}
|
package/dist/tools/registry.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
}>;
|