@kindgi/agents 0.0.0-bootstrap.0 → 0.1.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/LICENSE +201 -0
- package/README.md +131 -2
- package/dist/agent-turn-flow.d.ts +57 -0
- package/dist/agent-turn-flow.d.ts.map +1 -0
- package/dist/agent-turn-flow.js +172 -0
- package/dist/agent-turn-flow.js.map +1 -0
- package/dist/conversation-binding.d.ts +111 -0
- package/dist/conversation-binding.d.ts.map +1 -0
- package/dist/conversation-binding.js +4 -0
- package/dist/conversation-binding.js.map +1 -0
- package/dist/define.d.ts +180 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +361 -0
- package/dist/define.js.map +1 -0
- package/dist/errors.d.ts +62 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +4 -0
- package/dist/errors.js.map +1 -0
- package/dist/guardrails-gate.d.ts +169 -0
- package/dist/guardrails-gate.d.ts.map +1 -0
- package/dist/guardrails-gate.js +202 -0
- package/dist/guardrails-gate.js.map +1 -0
- package/dist/handlers/budget-check.d.ts +22 -0
- package/dist/handlers/budget-check.d.ts.map +1 -0
- package/dist/handlers/budget-check.js +109 -0
- package/dist/handlers/budget-check.js.map +1 -0
- package/dist/handlers/build-initial-messages.d.ts +17 -0
- package/dist/handlers/build-initial-messages.d.ts.map +1 -0
- package/dist/handlers/build-initial-messages.js +86 -0
- package/dist/handlers/build-initial-messages.js.map +1 -0
- package/dist/handlers/compose-result.d.ts +10 -0
- package/dist/handlers/compose-result.d.ts.map +1 -0
- package/dist/handlers/compose-result.js +79 -0
- package/dist/handlers/compose-result.js.map +1 -0
- package/dist/handlers/constants.d.ts +8 -0
- package/dist/handlers/constants.d.ts.map +1 -0
- package/dist/handlers/constants.js +10 -0
- package/dist/handlers/constants.js.map +1 -0
- package/dist/handlers/context.d.ts +210 -0
- package/dist/handlers/context.d.ts.map +1 -0
- package/dist/handlers/context.js +4 -0
- package/dist/handlers/context.js.map +1 -0
- package/dist/handlers/dispatch-tools.d.ts +15 -0
- package/dist/handlers/dispatch-tools.d.ts.map +1 -0
- package/dist/handlers/dispatch-tools.js +511 -0
- package/dist/handlers/dispatch-tools.js.map +1 -0
- package/dist/handlers/errors.d.ts +133 -0
- package/dist/handlers/errors.d.ts.map +1 -0
- package/dist/handlers/errors.js +134 -0
- package/dist/handlers/errors.js.map +1 -0
- package/dist/handlers/evaluate-guardrails.d.ts +14 -0
- package/dist/handlers/evaluate-guardrails.d.ts.map +1 -0
- package/dist/handlers/evaluate-guardrails.js +128 -0
- package/dist/handlers/evaluate-guardrails.js.map +1 -0
- package/dist/handlers/final-iteration.d.ts +7 -0
- package/dist/handlers/final-iteration.d.ts.map +1 -0
- package/dist/handlers/final-iteration.js +26 -0
- package/dist/handlers/final-iteration.js.map +1 -0
- package/dist/handlers/index.d.ts +5 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +41 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/model-call.d.ts +13 -0
- package/dist/handlers/model-call.d.ts.map +1 -0
- package/dist/handlers/model-call.js +136 -0
- package/dist/handlers/model-call.js.map +1 -0
- package/dist/handlers/persist-final-message.d.ts +14 -0
- package/dist/handlers/persist-final-message.d.ts.map +1 -0
- package/dist/handlers/persist-final-message.js +54 -0
- package/dist/handlers/persist-final-message.js.map +1 -0
- package/dist/handlers/persist-provenance.d.ts +12 -0
- package/dist/handlers/persist-provenance.d.ts.map +1 -0
- package/dist/handlers/persist-provenance.js +34 -0
- package/dist/handlers/persist-provenance.js.map +1 -0
- package/dist/handlers/persist-user-message.d.ts +15 -0
- package/dist/handlers/persist-user-message.d.ts.map +1 -0
- package/dist/handlers/persist-user-message.js +59 -0
- package/dist/handlers/persist-user-message.js.map +1 -0
- package/dist/handlers/public-types.d.ts +201 -0
- package/dist/handlers/public-types.d.ts.map +1 -0
- package/dist/handlers/public-types.js +4 -0
- package/dist/handlers/public-types.js.map +1 -0
- package/dist/handlers/rehydrate.d.ts +8 -0
- package/dist/handlers/rehydrate.d.ts.map +1 -0
- package/dist/handlers/rehydrate.js +94 -0
- package/dist/handlers/rehydrate.js.map +1 -0
- package/dist/handlers/render-prompt.d.ts +12 -0
- package/dist/handlers/render-prompt.d.ts.map +1 -0
- package/dist/handlers/render-prompt.js +41 -0
- package/dist/handlers/render-prompt.js.map +1 -0
- package/dist/handlers/resolve-tools.d.ts +10 -0
- package/dist/handlers/resolve-tools.d.ts.map +1 -0
- package/dist/handlers/resolve-tools.js +55 -0
- package/dist/handlers/resolve-tools.js.map +1 -0
- package/dist/handlers/result-shape.d.ts +94 -0
- package/dist/handlers/result-shape.d.ts.map +1 -0
- package/dist/handlers/result-shape.js +19 -0
- package/dist/handlers/result-shape.js.map +1 -0
- package/dist/handlers/run-retrievals.d.ts +10 -0
- package/dist/handlers/run-retrievals.d.ts.map +1 -0
- package/dist/handlers/run-retrievals.js +64 -0
- package/dist/handlers/run-retrievals.js.map +1 -0
- package/dist/handlers/run-snapshot.d.ts +4 -0
- package/dist/handlers/run-snapshot.d.ts.map +1 -0
- package/dist/handlers/run-snapshot.js +26 -0
- package/dist/handlers/run-snapshot.js.map +1 -0
- package/dist/handlers/setup.d.ts +25 -0
- package/dist/handlers/setup.d.ts.map +1 -0
- package/dist/handlers/setup.js +231 -0
- package/dist/handlers/setup.js.map +1 -0
- package/dist/handlers/structured-output.d.ts +38 -0
- package/dist/handlers/structured-output.d.ts.map +1 -0
- package/dist/handlers/structured-output.js +89 -0
- package/dist/handlers/structured-output.js.map +1 -0
- package/dist/handlers/tool-errors.d.ts +56 -0
- package/dist/handlers/tool-errors.d.ts.map +1 -0
- package/dist/handlers/tool-errors.js +73 -0
- package/dist/handlers/tool-errors.js.map +1 -0
- package/dist/handlers/tool-hitl.d.ts +45 -0
- package/dist/handlers/tool-hitl.d.ts.map +1 -0
- package/dist/handlers/tool-hitl.js +81 -0
- package/dist/handlers/tool-hitl.js.map +1 -0
- package/dist/handlers/turn-environment.d.ts +26 -0
- package/dist/handlers/turn-environment.d.ts.map +1 -0
- package/dist/handlers/turn-environment.js +154 -0
- package/dist/handlers/turn-environment.js.map +1 -0
- package/dist/hitl-policy.d.ts +45 -0
- package/dist/hitl-policy.d.ts.map +1 -0
- package/dist/hitl-policy.js +74 -0
- package/dist/hitl-policy.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/invoke.d.ts +36 -0
- package/dist/invoke.d.ts.map +1 -0
- package/dist/invoke.js +228 -0
- package/dist/invoke.js.map +1 -0
- package/dist/migrations-dir.d.ts +11 -0
- package/dist/migrations-dir.d.ts.map +1 -0
- package/dist/migrations-dir.js +14 -0
- package/dist/migrations-dir.js.map +1 -0
- package/dist/project-run-result.d.ts +23 -0
- package/dist/project-run-result.d.ts.map +1 -0
- package/dist/project-run-result.js +116 -0
- package/dist/project-run-result.js.map +1 -0
- package/dist/prompt.d.ts +83 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +119 -0
- package/dist/prompt.js.map +1 -0
- package/dist/provenance-emit.d.ts +44 -0
- package/dist/provenance-emit.d.ts.map +1 -0
- package/dist/provenance-emit.js +51 -0
- package/dist/provenance-emit.js.map +1 -0
- package/dist/registry.d.ts +38 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +125 -0
- package/dist/registry.js.map +1 -0
- package/dist/retrieval.d.ts +47 -0
- package/dist/retrieval.d.ts.map +1 -0
- package/dist/retrieval.js +155 -0
- package/dist/retrieval.js.map +1 -0
- package/dist/run-snapshot-binding.d.ts +77 -0
- package/dist/run-snapshot-binding.d.ts.map +1 -0
- package/dist/run-snapshot-binding.js +4 -0
- package/dist/run-snapshot-binding.js.map +1 -0
- package/dist/schema.d.ts +497 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +133 -0
- package/dist/schema.js.map +1 -0
- package/dist/streaming.d.ts +118 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +17 -0
- package/dist/streaming.js.map +1 -0
- package/dist/tenant-policy.d.ts +16 -0
- package/dist/tenant-policy.d.ts.map +1 -0
- package/dist/tenant-policy.js +77 -0
- package/dist/tenant-policy.js.map +1 -0
- package/dist/types.d.ts +435 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/versioning.d.ts +29 -0
- package/dist/versioning.d.ts.map +1 -0
- package/dist/versioning.js +58 -0
- package/dist/versioning.js.map +1 -0
- package/migrations/0000_sparkling_talkback.sql +18 -0
- package/migrations/0001_tired_warhawk.sql +16 -0
- package/migrations/0002_violet_ezekiel.sql +2 -0
- package/migrations/meta/0000_snapshot.json +172 -0
- package/migrations/meta/0001_snapshot.json +275 -0
- package/migrations/meta/0002_snapshot.json +287 -0
- package/migrations/meta/_journal.json +27 -0
- package/package.json +76 -4
- package/src/agent-turn-flow.ts +183 -0
- package/src/conversation-binding.ts +147 -0
- package/src/define.ts +572 -0
- package/src/errors.ts +80 -0
- package/src/guardrails-gate.ts +342 -0
- package/src/handlers/budget-check.ts +143 -0
- package/src/handlers/build-initial-messages.ts +103 -0
- package/src/handlers/compose-result.ts +90 -0
- package/src/handlers/constants.ts +10 -0
- package/src/handlers/context.ts +226 -0
- package/src/handlers/dispatch-tools.ts +633 -0
- package/src/handlers/errors.ts +282 -0
- package/src/handlers/evaluate-guardrails.ts +153 -0
- package/src/handlers/final-iteration.ts +30 -0
- package/src/handlers/index.ts +63 -0
- package/src/handlers/model-call.ts +151 -0
- package/src/handlers/persist-final-message.ts +67 -0
- package/src/handlers/persist-provenance.ts +39 -0
- package/src/handlers/persist-user-message.ts +70 -0
- package/src/handlers/public-types.ts +209 -0
- package/src/handlers/rehydrate.ts +161 -0
- package/src/handlers/render-prompt.ts +46 -0
- package/src/handlers/resolve-tools.ts +68 -0
- package/src/handlers/result-shape.ts +113 -0
- package/src/handlers/run-retrievals.ts +77 -0
- package/src/handlers/run-snapshot.ts +44 -0
- package/src/handlers/setup.ts +269 -0
- package/src/handlers/structured-output.ts +117 -0
- package/src/handlers/tool-errors.ts +122 -0
- package/src/handlers/tool-hitl.ts +126 -0
- package/src/handlers/turn-environment.ts +191 -0
- package/src/hitl-policy.ts +128 -0
- package/src/index.ts +154 -0
- package/src/invoke.ts +299 -0
- package/src/migrations-dir.ts +17 -0
- package/src/project-run-result.ts +131 -0
- package/src/prompt.ts +185 -0
- package/src/provenance-emit.ts +100 -0
- package/src/registry.ts +164 -0
- package/src/retrieval.ts +219 -0
- package/src/run-snapshot-binding.ts +87 -0
- package/src/schema.ts +154 -0
- package/src/streaming.ts +153 -0
- package/src/tenant-policy.ts +78 -0
- package/src/types.ts +453 -0
- package/src/versioning.ts +77 -0
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
import { WaitpointCancelledError } from '@kindgi/handler';
|
|
4
|
+
import { stricterToolHitlRule } from '@kindgi/policy-contract';
|
|
5
|
+
import { invokeTool } from '@kindgi/tools';
|
|
6
|
+
import { emitTurnEvent } from '../streaming.js';
|
|
7
|
+
import { throwAgentTurnFailure, } from './errors.js';
|
|
8
|
+
import { effectiveToolErrorPolicy, toolErrorKindOf, toolErrorResult, toolRetriesSoFar, } from './tool-errors.js';
|
|
9
|
+
import { computeToolCallWaitToken, hashToolArgs } from './tool-hitl.js';
|
|
10
|
+
/**
|
|
11
|
+
* Resolves the effective HITL mode + reviewer role for a specific
|
|
12
|
+
* tool from the pre-resolved effective policy. Mirrors the standalone
|
|
13
|
+
* `resolveToolHitl(agent, tool)` in tool-hitl.ts but consumes the
|
|
14
|
+
* resolver's output.
|
|
15
|
+
*/
|
|
16
|
+
function resolveEffectiveToolHitl(effective, tool) {
|
|
17
|
+
const gate = agentToolHitl(effective, tool);
|
|
18
|
+
// The tenant's floor for this tool, when it names one: the stricter wins.
|
|
19
|
+
const floor = effective.toolFloors?.get(tool.id);
|
|
20
|
+
if (floor === undefined)
|
|
21
|
+
return gate;
|
|
22
|
+
const stricter = stricterToolHitlRule(gate, floor);
|
|
23
|
+
return { mode: stricter.mode, requiredRole: stricter.requiredRole ?? gate.requiredRole };
|
|
24
|
+
}
|
|
25
|
+
/** The agent's own gate for `tool`. */
|
|
26
|
+
function agentToolHitl(effective, tool) {
|
|
27
|
+
const toolsPolicy = effective.tools;
|
|
28
|
+
const defaultRole = effective.defaultReviewerRole;
|
|
29
|
+
// Opt-in: no `hitl.tools` block → never gate.
|
|
30
|
+
if (toolsPolicy === undefined) {
|
|
31
|
+
return { mode: 'never_ask', requiredRole: defaultRole };
|
|
32
|
+
}
|
|
33
|
+
const rawOverride = toolsPolicy.overrides.get(tool.id);
|
|
34
|
+
if (rawOverride !== undefined) {
|
|
35
|
+
const rule = typeof rawOverride === 'string'
|
|
36
|
+
? { mode: rawOverride }
|
|
37
|
+
: rawOverride;
|
|
38
|
+
return {
|
|
39
|
+
mode: rule.mode,
|
|
40
|
+
requiredRole: rule.requiredRole ?? defaultRole,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (toolsPolicy.default !== undefined) {
|
|
44
|
+
return { mode: toolsPolicy.default, requiredRole: defaultRole };
|
|
45
|
+
}
|
|
46
|
+
// Per-tool default from Tool.mutating (opt-in scope only).
|
|
47
|
+
const mode = tool.mutating === false ? 'never_ask' : 'ask_on_first_use';
|
|
48
|
+
return { mode, requiredRole: defaultRole };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Loop-body node #2. If the model returned `finishReason='tool-use'`
|
|
52
|
+
* with a non-empty tool-call list, persist the assistant tool-call
|
|
53
|
+
* message + dispatch every tool + persist every tool result. Update
|
|
54
|
+
* `nextMessages` so the next iteration's model call sees the tool
|
|
55
|
+
* outputs.
|
|
56
|
+
*
|
|
57
|
+
* When the model returned a terminal `finishReason` (or `tool-use`
|
|
58
|
+
* with no calls), pass through unchanged so
|
|
59
|
+
* `budget-check` marks the iteration finished.
|
|
60
|
+
*/
|
|
61
|
+
export function buildDispatchToolsHandler(ctx) {
|
|
62
|
+
return async (input, kctx) => {
|
|
63
|
+
if (ctx.tools === undefined) {
|
|
64
|
+
throwAgentTurnFailure({
|
|
65
|
+
code: 'model-invocation-failed',
|
|
66
|
+
message: 'dispatch-tools invoked before setup completed',
|
|
67
|
+
cause: null,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const partial = input;
|
|
71
|
+
const assistantMsg = partial.message;
|
|
72
|
+
const hasToolCalls = partial.finishReason === 'tool-use' &&
|
|
73
|
+
assistantMsg.toolCalls !== undefined &&
|
|
74
|
+
assistantMsg.toolCalls.length > 0;
|
|
75
|
+
if (!hasToolCalls) {
|
|
76
|
+
// No tool calls this iteration — pass through. `budget-check`
|
|
77
|
+
// will finalize with `finishedTurn=true` and the loop exits.
|
|
78
|
+
const forwarded = {
|
|
79
|
+
step: partial.step,
|
|
80
|
+
finishReason: partial.finishReason,
|
|
81
|
+
message: assistantMsg,
|
|
82
|
+
iterationAppended: [],
|
|
83
|
+
iterationUsage: partial.iterationUsage,
|
|
84
|
+
provider: partial.provider,
|
|
85
|
+
nextMessages: partial.nextMessages,
|
|
86
|
+
hasToolCalls: false,
|
|
87
|
+
};
|
|
88
|
+
return forwarded;
|
|
89
|
+
}
|
|
90
|
+
const iterationAppended = [
|
|
91
|
+
await persistToolCallMessage(ctx, assistantMsg, partial.step),
|
|
92
|
+
];
|
|
93
|
+
let nextMessages = [...partial.nextMessages, assistantMsg];
|
|
94
|
+
for (const call of assistantMsg.toolCalls ?? []) {
|
|
95
|
+
// Resumed after an approval further down this list: a call that
|
|
96
|
+
// already ran keeps the result it stored.
|
|
97
|
+
const stored = takeStoredBeforePark(ctx, (m) => m.role === 'tool' && m.toolCall?.invocationId === call.id);
|
|
98
|
+
if (stored !== undefined) {
|
|
99
|
+
iterationAppended.push(stored);
|
|
100
|
+
nextMessages = [...nextMessages, toolMessageOf(stored, call.id)];
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// Look up the resolved binding before emitting `tool.started` so
|
|
104
|
+
// the event can carry `toolVersion` + `toolVersionRange` alongside
|
|
105
|
+
// the id. Model-requested tools the
|
|
106
|
+
// agent didn't declare emit a bare `tool.failed` with no version.
|
|
107
|
+
const binding = ctx.tools.byName.get(call.name);
|
|
108
|
+
if (binding === undefined) {
|
|
109
|
+
const unresolved = {
|
|
110
|
+
code: 'unresolved-tool',
|
|
111
|
+
message: `Model requested tool "${call.name}" not registered for agent "${ctx.input.agent.id}"`,
|
|
112
|
+
toolId: call.name,
|
|
113
|
+
};
|
|
114
|
+
await emitTurnEvent(ctx.bindings.onEvent, {
|
|
115
|
+
kind: 'tool.failed',
|
|
116
|
+
step: partial.step,
|
|
117
|
+
toolId: call.name,
|
|
118
|
+
invocationId: call.id,
|
|
119
|
+
error: { code: unresolved.code, message: unresolved.message },
|
|
120
|
+
});
|
|
121
|
+
nextMessages = await retryOrFail(ctx, call, unresolved, undefined, {
|
|
122
|
+
toolId: call.name,
|
|
123
|
+
nextMessages,
|
|
124
|
+
iterationAppended,
|
|
125
|
+
});
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const { tool, resolvedVersion, requestedRange } = binding;
|
|
129
|
+
// Tool-level HITL gate. Resolves the effective mode
|
|
130
|
+
// for this (agent, tool) pair via the effective-policy
|
|
131
|
+
// resolver (framework defaults → agent → tenant cap), then parks +
|
|
132
|
+
// enqueues an approval when required BEFORE dispatch. On reject,
|
|
133
|
+
// returns a synthetic negative tool result so the LLM can adapt
|
|
134
|
+
// without terminating the run. Same run, same conversation, same
|
|
135
|
+
// provenance record across the park-and-resume — the same
|
|
136
|
+
// framework guarantee as the session-level gate.
|
|
137
|
+
//
|
|
138
|
+
// Kernel replay: within one run, waitForToken with the same
|
|
139
|
+
// deterministic tokenId returns the resolved decision from the
|
|
140
|
+
// journal — no re-park. Cross-turn `ask_on_first_use` caching
|
|
141
|
+
// (via conversation metadata) is not implemented.
|
|
142
|
+
const effectiveHitl = ctx.hitlPolicy;
|
|
143
|
+
if (effectiveHitl === undefined) {
|
|
144
|
+
throwAgentTurnFailure({
|
|
145
|
+
code: 'model-invocation-failed',
|
|
146
|
+
message: 'dispatch-tools invoked before the turn resolved its approval rules',
|
|
147
|
+
cause: null,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const resolvedHitl = resolveEffectiveToolHitl(effectiveHitl, tool);
|
|
151
|
+
let toolRejectionPayload = null;
|
|
152
|
+
if (resolvedHitl.mode !== 'never_ask') {
|
|
153
|
+
const argsHash = hashToolArgs(call.arguments);
|
|
154
|
+
const waitTokenId = computeToolCallWaitToken({
|
|
155
|
+
runId: kctx.runId,
|
|
156
|
+
callId: call.id,
|
|
157
|
+
argsHash,
|
|
158
|
+
});
|
|
159
|
+
const timeoutMs = effectiveHitl.timeoutMs;
|
|
160
|
+
const expiresAt = new Date(Date.now() + timeoutMs).toISOString();
|
|
161
|
+
if (ctx.bindings.hitl?.enqueue !== undefined) {
|
|
162
|
+
try {
|
|
163
|
+
await ctx.bindings.hitl.enqueue({
|
|
164
|
+
tenantId: ctx.input.tenantId,
|
|
165
|
+
subjectKind: 'tool-call:pending',
|
|
166
|
+
subjectRef: {
|
|
167
|
+
conversationId: ctx.input.conversationId,
|
|
168
|
+
agentId: ctx.input.agent.id,
|
|
169
|
+
agentVersion: ctx.input.agent.version,
|
|
170
|
+
toolId: tool.id,
|
|
171
|
+
toolVersion: resolvedVersion,
|
|
172
|
+
callId: call.id,
|
|
173
|
+
argsHash,
|
|
174
|
+
arguments: call.arguments,
|
|
175
|
+
},
|
|
176
|
+
requiredRole: resolvedHitl.requiredRole,
|
|
177
|
+
title: `HITL review: ${call.name}`,
|
|
178
|
+
description: `Tool call ${call.name} awaiting reviewer approval before dispatch.`,
|
|
179
|
+
waitTokenId,
|
|
180
|
+
provenanceRef: { runId: kctx.runId },
|
|
181
|
+
expiresAt: expiresAt,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Enqueue failure is soft — waitForToken parks either way.
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
const decision = await kctx.waitForToken(waitTokenId, {
|
|
190
|
+
timeoutMs,
|
|
191
|
+
});
|
|
192
|
+
if (decision.decided === 'reject') {
|
|
193
|
+
toolRejectionPayload =
|
|
194
|
+
decision.rationale !== undefined ? { rationale: decision.rationale } : {};
|
|
195
|
+
}
|
|
196
|
+
// approve → fall through to dispatch
|
|
197
|
+
}
|
|
198
|
+
catch (cause) {
|
|
199
|
+
if (cause instanceof WaitpointCancelledError) {
|
|
200
|
+
throwAgentTurnFailure({
|
|
201
|
+
code: 'hitl-cancelled',
|
|
202
|
+
message: `Tool-call HITL cancelled for ${call.name}: ${cause.reason}`,
|
|
203
|
+
reason: cause.reason,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
throw cause;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const toolStarted = Date.now();
|
|
210
|
+
await emitTurnEvent(ctx.bindings.onEvent, {
|
|
211
|
+
kind: 'tool.started',
|
|
212
|
+
step: partial.step,
|
|
213
|
+
toolId: call.name,
|
|
214
|
+
toolVersion: resolvedVersion,
|
|
215
|
+
toolVersionRange: requestedRange,
|
|
216
|
+
invocationId: call.id,
|
|
217
|
+
arguments: call.arguments,
|
|
218
|
+
});
|
|
219
|
+
// If the reviewer rejected, synthesize a tool-result message
|
|
220
|
+
// carrying the rationale — the LLM reads it in the next
|
|
221
|
+
// iteration and can adapt (retry with different args, ask the
|
|
222
|
+
// user, apologize). NOT a run failure — reject is feedback, not
|
|
223
|
+
// termination.
|
|
224
|
+
if (toolRejectionPayload !== null) {
|
|
225
|
+
const rejectResult = {
|
|
226
|
+
status: 'rejected',
|
|
227
|
+
...(toolRejectionPayload.rationale !== undefined && {
|
|
228
|
+
rationale: toolRejectionPayload.rationale,
|
|
229
|
+
}),
|
|
230
|
+
};
|
|
231
|
+
nextMessages = await appendToolResult(ctx, call, rejectResult, {
|
|
232
|
+
toolId: tool.id,
|
|
233
|
+
nextMessages,
|
|
234
|
+
iterationAppended,
|
|
235
|
+
});
|
|
236
|
+
await emitTurnEvent(ctx.bindings.onEvent, {
|
|
237
|
+
kind: 'tool.completed',
|
|
238
|
+
step: partial.step,
|
|
239
|
+
toolId: call.name,
|
|
240
|
+
toolVersion: resolvedVersion,
|
|
241
|
+
toolVersionRange: requestedRange,
|
|
242
|
+
invocationId: call.id,
|
|
243
|
+
output: rejectResult,
|
|
244
|
+
durationMs: Date.now() - toolStarted,
|
|
245
|
+
});
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
const dispatched = await dispatchOne(ctx, tool, call, kctx.runId);
|
|
249
|
+
if (dispatched.kind === 'err') {
|
|
250
|
+
await emitTurnEvent(ctx.bindings.onEvent, {
|
|
251
|
+
kind: 'tool.failed',
|
|
252
|
+
step: partial.step,
|
|
253
|
+
toolId: call.name,
|
|
254
|
+
invocationId: call.id,
|
|
255
|
+
error: {
|
|
256
|
+
code: dispatched.error.code,
|
|
257
|
+
message: dispatched.error.message,
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
nextMessages = await retryOrFail(ctx, call, dispatched.error, dispatched.error.validationIssues, { toolId: tool.id, nextMessages, iterationAppended });
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
ctx.appended.push(dispatched.value.persisted);
|
|
264
|
+
iterationAppended.push(dispatched.value.persisted);
|
|
265
|
+
nextMessages = [...nextMessages, dispatched.value.toolMessage];
|
|
266
|
+
await emitTurnEvent(ctx.bindings.onEvent, {
|
|
267
|
+
kind: 'tool.completed',
|
|
268
|
+
step: partial.step,
|
|
269
|
+
toolId: call.name,
|
|
270
|
+
toolVersion: resolvedVersion,
|
|
271
|
+
toolVersionRange: requestedRange,
|
|
272
|
+
invocationId: call.id,
|
|
273
|
+
output: dispatched.value.persisted.content,
|
|
274
|
+
durationMs: Date.now() - toolStarted,
|
|
275
|
+
});
|
|
276
|
+
if (ctx.provenance !== undefined) {
|
|
277
|
+
const modelCallNodeId = `model-call:${partial.step}`;
|
|
278
|
+
const toolCallNodeId = `tool-call:${call.id}`;
|
|
279
|
+
const toolResultNodeId = `tool-result:${call.id}`;
|
|
280
|
+
ctx.provenance.addNode({
|
|
281
|
+
id: toolCallNodeId,
|
|
282
|
+
kind: 'tool-call',
|
|
283
|
+
timestamp: dispatched.value.persisted.createdAt,
|
|
284
|
+
attributes: {
|
|
285
|
+
toolId: call.name,
|
|
286
|
+
invocationId: call.id,
|
|
287
|
+
// Capture the exact version the
|
|
288
|
+
// registry picked at run start + the range the agent asked
|
|
289
|
+
// for, so a replay can pin against the same version.
|
|
290
|
+
toolVersion: resolvedVersion,
|
|
291
|
+
toolVersionRange: requestedRange,
|
|
292
|
+
},
|
|
293
|
+
});
|
|
294
|
+
ctx.provenance.addNode({
|
|
295
|
+
id: toolResultNodeId,
|
|
296
|
+
kind: 'tool-result',
|
|
297
|
+
timestamp: dispatched.value.persisted.createdAt,
|
|
298
|
+
});
|
|
299
|
+
ctx.provenance.addEdge({
|
|
300
|
+
from: toolCallNodeId,
|
|
301
|
+
to: modelCallNodeId,
|
|
302
|
+
kind: 'invoked',
|
|
303
|
+
});
|
|
304
|
+
ctx.provenance.addEdge({
|
|
305
|
+
from: toolResultNodeId,
|
|
306
|
+
to: toolCallNodeId,
|
|
307
|
+
kind: 'produced',
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
const forwarded = {
|
|
312
|
+
step: partial.step,
|
|
313
|
+
finishReason: partial.finishReason,
|
|
314
|
+
message: assistantMsg,
|
|
315
|
+
iterationAppended,
|
|
316
|
+
iterationUsage: partial.iterationUsage,
|
|
317
|
+
provider: partial.provider,
|
|
318
|
+
nextMessages,
|
|
319
|
+
hasToolCalls: true,
|
|
320
|
+
};
|
|
321
|
+
return forwarded;
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Store the assistant message that makes the calls — or, resumed after a
|
|
326
|
+
* park in this step, take the one stored before the park.
|
|
327
|
+
*/
|
|
328
|
+
async function persistToolCallMessage(ctx, assistantMsg, step) {
|
|
329
|
+
const callIds = (assistantMsg.toolCalls ?? []).map((tc) => tc.id);
|
|
330
|
+
const stored = takeStoredBeforePark(ctx, (m) => m.role === 'agent' && sameCalls(m, callIds));
|
|
331
|
+
if (stored !== undefined)
|
|
332
|
+
return stored;
|
|
333
|
+
const persisted = await ctx.bindings.conversationBinding.appendMessage({
|
|
334
|
+
tenantId: ctx.input.tenantId,
|
|
335
|
+
conversationId: ctx.input.conversationId,
|
|
336
|
+
role: 'agent',
|
|
337
|
+
content: {
|
|
338
|
+
text: assistantMsg.content,
|
|
339
|
+
toolCalls: (assistantMsg.toolCalls ?? []).map((tc) => ({ ...tc })),
|
|
340
|
+
},
|
|
341
|
+
actor: ctx.input.agent.id,
|
|
342
|
+
isIntermediate: true,
|
|
343
|
+
});
|
|
344
|
+
if (persisted.kind === 'err')
|
|
345
|
+
throwAgentTurnFailure(persisted.error);
|
|
346
|
+
ctx.appended.push(persisted.value);
|
|
347
|
+
await emitTurnEvent(ctx.bindings.onEvent, {
|
|
348
|
+
kind: 'agent.message',
|
|
349
|
+
step,
|
|
350
|
+
isFinal: false,
|
|
351
|
+
message: persisted.value,
|
|
352
|
+
});
|
|
353
|
+
return persisted.value;
|
|
354
|
+
}
|
|
355
|
+
/** Take the first message stored before the park that matches. */
|
|
356
|
+
function takeStoredBeforePark(ctx, matches) {
|
|
357
|
+
const index = ctx.storedBeforePark?.findIndex(matches) ?? -1;
|
|
358
|
+
if (index < 0)
|
|
359
|
+
return undefined;
|
|
360
|
+
return ctx.storedBeforePark?.splice(index, 1)[0];
|
|
361
|
+
}
|
|
362
|
+
function sameCalls(m, callIds) {
|
|
363
|
+
const calls = m.content
|
|
364
|
+
.toolCalls;
|
|
365
|
+
return (Array.isArray(calls) &&
|
|
366
|
+
calls.length === callIds.length &&
|
|
367
|
+
calls.every((c, i) => c.id === callIds[i]));
|
|
368
|
+
}
|
|
369
|
+
/** A stored tool result, as the model sees it. */
|
|
370
|
+
function toolMessageOf(stored, callId) {
|
|
371
|
+
return {
|
|
372
|
+
role: 'tool',
|
|
373
|
+
content: typeof stored.content === 'string' ? stored.content : JSON.stringify(stored.content),
|
|
374
|
+
toolCallId: callId,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Record a result the framework writes for a call (a rejection, a failed
|
|
379
|
+
* call sent back to the model) the way a tool's own result is recorded:
|
|
380
|
+
* persisted to the conversation with the call it answers, and added to
|
|
381
|
+
* the messages the next model call sees.
|
|
382
|
+
*/
|
|
383
|
+
async function appendToolResult(ctx, call, output, target) {
|
|
384
|
+
const persisted = await ctx.bindings.conversationBinding.appendMessage({
|
|
385
|
+
tenantId: ctx.input.tenantId,
|
|
386
|
+
conversationId: ctx.input.conversationId,
|
|
387
|
+
role: 'tool',
|
|
388
|
+
content: output,
|
|
389
|
+
toolCall: { toolId: target.toolId, invocationId: call.id },
|
|
390
|
+
});
|
|
391
|
+
if (persisted.kind === 'err')
|
|
392
|
+
throwAgentTurnFailure(persisted.error);
|
|
393
|
+
ctx.appended.push(persisted.value);
|
|
394
|
+
target.iterationAppended.push(persisted.value);
|
|
395
|
+
return [
|
|
396
|
+
...target.nextMessages,
|
|
397
|
+
{ role: 'tool', content: JSON.stringify(output), toolCallId: call.id },
|
|
398
|
+
];
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* A failed call the turn's policy retries goes back to the model as its
|
|
402
|
+
* result, while retries are left; anything else fails the turn, with the
|
|
403
|
+
* retries it took when the kind is one the policy retries.
|
|
404
|
+
*/
|
|
405
|
+
async function retryOrFail(ctx, call, error, issues, target) {
|
|
406
|
+
const policy = ctx.toolErrorPolicy ?? effectiveToolErrorPolicy(ctx.input.agent.toolErrors, undefined);
|
|
407
|
+
const kind = toolErrorKindOf(error);
|
|
408
|
+
const used = toolRetriesSoFar(target.nextMessages);
|
|
409
|
+
if (!policy.retryOn.has(kind))
|
|
410
|
+
throwAgentTurnFailure(error);
|
|
411
|
+
if (used >= policy.maxRetries)
|
|
412
|
+
throwAgentTurnFailure({ ...error, toolRetries: used });
|
|
413
|
+
return appendToolResult(ctx, call, toolErrorResult(kind, error.message, issues), target);
|
|
414
|
+
}
|
|
415
|
+
async function dispatchOne(ctx, tool, call, runId) {
|
|
416
|
+
const toolCtx = {
|
|
417
|
+
tenantId: ctx.input.tenantId,
|
|
418
|
+
runId,
|
|
419
|
+
requestId: call.id,
|
|
420
|
+
abortSignal: ctx.turnAbort.signal,
|
|
421
|
+
// HTTP tools built via defineTool({spec: {kind: 'http'}}) resolve declared
|
|
422
|
+
// secret_refs at invoke time. Present iff the caller wired
|
|
423
|
+
// `bindings.resolveSecret` from a tenant-scoped `SecretBinding`.
|
|
424
|
+
...(ctx.bindings.resolveSecret !== undefined && { resolveSecret: ctx.bindings.resolveSecret }),
|
|
425
|
+
};
|
|
426
|
+
const result = await invokeTool(tool, call.arguments, toolCtx);
|
|
427
|
+
if (result.kind === 'err') {
|
|
428
|
+
// Hoist AJV validation detail from the inner error so it survives
|
|
429
|
+
// `toWireError` (which filters `cause` to avoid Error-instance /
|
|
430
|
+
// cycle hazards). Two validation paths emit different field names
|
|
431
|
+
// for the AJV array:
|
|
432
|
+
// - `packages/handler-runtime/src/handler-runner.ts` (pack code,
|
|
433
|
+
// run by the pack service) → `issues`
|
|
434
|
+
// - `packages/tools/src/invoke.ts` (in-process dispatch) → `errors`
|
|
435
|
+
// Accept either. If neither shape is present, no hoisting —
|
|
436
|
+
// the outer `tool-invocation-failed` stays minimal.
|
|
437
|
+
const inner = result.error;
|
|
438
|
+
const rawIssues = Array.isArray(inner.issues)
|
|
439
|
+
? inner.issues
|
|
440
|
+
: Array.isArray(inner.errors)
|
|
441
|
+
? inner.errors
|
|
442
|
+
: undefined;
|
|
443
|
+
const isValidationFailure = inner.code === 'input-validation-failed' && rawIssues !== undefined;
|
|
444
|
+
return {
|
|
445
|
+
kind: 'err',
|
|
446
|
+
error: {
|
|
447
|
+
code: 'tool-invocation-failed',
|
|
448
|
+
message: result.error.message,
|
|
449
|
+
toolId: call.name,
|
|
450
|
+
cause: result.error,
|
|
451
|
+
...(isValidationFailure && {
|
|
452
|
+
validationIssues: rawIssues,
|
|
453
|
+
receivedInput: truncateForWire(call.arguments),
|
|
454
|
+
}),
|
|
455
|
+
},
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
const persist = await ctx.bindings.conversationBinding.appendMessage({
|
|
459
|
+
tenantId: ctx.input.tenantId,
|
|
460
|
+
conversationId: ctx.input.conversationId,
|
|
461
|
+
role: 'tool',
|
|
462
|
+
content: result.value ?? '',
|
|
463
|
+
toolCall: { toolId: tool.id, invocationId: call.id },
|
|
464
|
+
});
|
|
465
|
+
if (persist.kind === 'err') {
|
|
466
|
+
// A DB failure persisting the tool result surfaces as the more
|
|
467
|
+
// generic invocation-failed to keep the caller's error shape stable.
|
|
468
|
+
return {
|
|
469
|
+
kind: 'err',
|
|
470
|
+
error: {
|
|
471
|
+
code: 'tool-invocation-failed',
|
|
472
|
+
message: persist.error.message,
|
|
473
|
+
toolId: tool.id,
|
|
474
|
+
cause: persist.error,
|
|
475
|
+
},
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
return {
|
|
479
|
+
kind: 'ok',
|
|
480
|
+
value: {
|
|
481
|
+
persisted: persist.value,
|
|
482
|
+
toolMessage: {
|
|
483
|
+
role: 'tool',
|
|
484
|
+
content: typeof result.value === 'string' ? result.value : JSON.stringify(result.value),
|
|
485
|
+
toolCallId: call.id,
|
|
486
|
+
},
|
|
487
|
+
},
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Cap `receivedInput` on validation errors so a huge tool-arg blob
|
|
492
|
+
* doesn't bloat the wire response body. 4 KiB stringified is
|
|
493
|
+
* comfortably larger than a typical LLM tool-call payload
|
|
494
|
+
* (place-name, query, message) but small enough that a
|
|
495
|
+
* pathological array/document truncates rather than round-trips
|
|
496
|
+
* megabytes. Truncated payloads land as a string with a trailing
|
|
497
|
+
* marker so callers can tell the value was elided.
|
|
498
|
+
*/
|
|
499
|
+
function truncateForWire(input, maxBytes = 4096) {
|
|
500
|
+
let serialized;
|
|
501
|
+
try {
|
|
502
|
+
serialized = JSON.stringify(input);
|
|
503
|
+
}
|
|
504
|
+
catch {
|
|
505
|
+
return '<unserializable input>';
|
|
506
|
+
}
|
|
507
|
+
if (Buffer.byteLength(serialized, 'utf8') <= maxBytes)
|
|
508
|
+
return input;
|
|
509
|
+
return `${serialized.slice(0, maxBytes)}… (truncated at ${maxBytes} bytes)`;
|
|
510
|
+
}
|
|
511
|
+
//# sourceMappingURL=dispatch-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-tools.js","sourceRoot":"","sources":["../../src/handlers/dispatch-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { EvaluationResult } from '@kindgi/guardrails';
|
|
2
|
+
import type { PolicyKind } from '@kindgi/policy-contract';
|
|
3
|
+
import type { AgentError } from '../errors.js';
|
|
4
|
+
import type { GuardrailViolationError, HitlRequiredError, UnresolvedGuardrailError } from '../guardrails-gate.js';
|
|
5
|
+
/** Structured error returned to the caller when an agent turn fails. */
|
|
6
|
+
export type InvokeAgentError = AgentError | UnresolvedToolError | ToolVersionUnresolvableError | CapabilityRoutingError | ModelInvocationError | ToolInvocationError | BudgetExceededError | AgentTurnAbortedError | HitlRequiredError | GuardrailViolationError | UnresolvedGuardrailError | OutputSchemaViolationError | TenantPolicyUnavailableError;
|
|
7
|
+
/**
|
|
8
|
+
* A tenant policy the turn must apply couldn't be: its spec doesn't
|
|
9
|
+
* validate, or the policy registry failed. The turn doesn't run without
|
|
10
|
+
* it — skipping a tenant's `hitl` policy would skip its approvals.
|
|
11
|
+
*/
|
|
12
|
+
export interface TenantPolicyUnavailableError {
|
|
13
|
+
readonly code: 'tenant-policy-unavailable';
|
|
14
|
+
readonly message: string;
|
|
15
|
+
readonly policyKind: PolicyKind;
|
|
16
|
+
}
|
|
17
|
+
export interface UnresolvedToolError {
|
|
18
|
+
readonly code: 'unresolved-tool';
|
|
19
|
+
readonly message: string;
|
|
20
|
+
readonly toolId: string;
|
|
21
|
+
/**
|
|
22
|
+
* Failed tool calls sent back to the model this turn before this one
|
|
23
|
+
* ended it (see `Agent.toolErrors`). Present when the failure is a
|
|
24
|
+
* kind the turn retries and its retries ran out.
|
|
25
|
+
*/
|
|
26
|
+
readonly toolRetries?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The agent references a tool that is registered but whose semver range
|
|
30
|
+
* does not match any registered version, or whose range is grammatically
|
|
31
|
+
* broken. Distinct from `unresolved-tool` (no id registered).
|
|
32
|
+
*/
|
|
33
|
+
export interface ToolVersionUnresolvableError {
|
|
34
|
+
readonly code: 'tool-version-unresolvable';
|
|
35
|
+
readonly message: string;
|
|
36
|
+
readonly toolId: string;
|
|
37
|
+
readonly requestedRange: string;
|
|
38
|
+
readonly availableVersions?: readonly string[];
|
|
39
|
+
}
|
|
40
|
+
export interface CapabilityRoutingError {
|
|
41
|
+
readonly code: 'capability-routing-failed';
|
|
42
|
+
readonly message: string;
|
|
43
|
+
readonly cause: unknown;
|
|
44
|
+
}
|
|
45
|
+
export interface ModelInvocationError {
|
|
46
|
+
readonly code: 'model-invocation-failed';
|
|
47
|
+
readonly message: string;
|
|
48
|
+
readonly cause: unknown;
|
|
49
|
+
}
|
|
50
|
+
export interface ToolInvocationError {
|
|
51
|
+
readonly code: 'tool-invocation-failed';
|
|
52
|
+
readonly message: string;
|
|
53
|
+
readonly toolId: string;
|
|
54
|
+
readonly cause: unknown;
|
|
55
|
+
/**
|
|
56
|
+
* When the inner failure was an AJV input-schema validation, the
|
|
57
|
+
* validator's `errors[]` array. Hoisted from `cause` to the top
|
|
58
|
+
* level so it survives `toWireError` (which filters `cause` to
|
|
59
|
+
* avoid Error-instance / cycle serialization hazards). Consumers
|
|
60
|
+
* inspecting *which* field failed *how* read this; `fromWire` in
|
|
61
|
+
* `@kindgi/client` projects it back onto the client-side error.
|
|
62
|
+
*/
|
|
63
|
+
readonly validationIssues?: readonly Readonly<Record<string, unknown>>[];
|
|
64
|
+
/**
|
|
65
|
+
* The exact payload the model produced that failed validation.
|
|
66
|
+
* Included so authors debugging LLM-tool-arg drift can see whether
|
|
67
|
+
* the model sent `{}`, `{ location: "" }`, `{ city: "…" }`
|
|
68
|
+
* (wrong field name), etc. without instrumenting their handler.
|
|
69
|
+
* Size-capped at ~4KiB stringified — larger payloads truncate
|
|
70
|
+
* with a trailing `…`; sensitive tools should sanitize inputs
|
|
71
|
+
* upstream.
|
|
72
|
+
*/
|
|
73
|
+
readonly receivedInput?: unknown;
|
|
74
|
+
/**
|
|
75
|
+
* Failed tool calls sent back to the model this turn before this one
|
|
76
|
+
* ended it (see `Agent.toolErrors`). Present when the failure is a
|
|
77
|
+
* kind the turn retries and its retries ran out.
|
|
78
|
+
*/
|
|
79
|
+
readonly toolRetries?: number;
|
|
80
|
+
}
|
|
81
|
+
export interface BudgetExceededError {
|
|
82
|
+
readonly code: 'budget-exceeded';
|
|
83
|
+
readonly message: string;
|
|
84
|
+
readonly kind: 'steps' | 'cost' | 'wall-time';
|
|
85
|
+
readonly limit: number;
|
|
86
|
+
readonly observed: number;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The agent declares an `output` schema and its final answer still
|
|
90
|
+
* didn't fit after the allowed repairs. `errors` lists the last
|
|
91
|
+
* attempt's problems; `attempts` counts the answers checked.
|
|
92
|
+
*/
|
|
93
|
+
export interface OutputSchemaViolationError {
|
|
94
|
+
readonly code: 'output-schema-violation';
|
|
95
|
+
readonly message: string;
|
|
96
|
+
readonly errors: readonly string[];
|
|
97
|
+
readonly attempts: number;
|
|
98
|
+
}
|
|
99
|
+
export interface AgentTurnAbortedError {
|
|
100
|
+
readonly code: 'agent-turn-aborted';
|
|
101
|
+
readonly message: string;
|
|
102
|
+
readonly reason: 'external' | 'timeout';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Thrown by a node handler when a precondition fails or a runtime step
|
|
106
|
+
* short-circuits with a structured error. The kernel captures
|
|
107
|
+
* `Error.message` into `step.failed.payload.message`; we serialize the
|
|
108
|
+
* full structured error as JSON so `projectRunResult` can recover the
|
|
109
|
+
* discriminated union shape on the way out.
|
|
110
|
+
*
|
|
111
|
+
* Deliberately narrowed to `Error` subclass so `cause` becomes a plain
|
|
112
|
+
* property (JSON-round-trippable) instead of the native ErrorOptions
|
|
113
|
+
* behavior.
|
|
114
|
+
*/
|
|
115
|
+
export declare class AgentTurnFailure extends Error {
|
|
116
|
+
readonly payload: InvokeAgentError;
|
|
117
|
+
constructor(payload: InvokeAgentError);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Attempt to reconstruct a structured `InvokeAgentError` from a run's
|
|
121
|
+
* `failureMessage`. Returns `undefined` when the message is not one of
|
|
122
|
+
* ours (e.g. a raw kernel-level exception message).
|
|
123
|
+
*/
|
|
124
|
+
export declare function parseFailureMessage(raw: string | undefined): InvokeAgentError | undefined;
|
|
125
|
+
/** Helper for handlers to short-circuit with a structured error. */
|
|
126
|
+
export declare function throwAgentTurnFailure(error: InvokeAgentError): never;
|
|
127
|
+
/**
|
|
128
|
+
* Placeholder to satisfy TS-strict "declared but unused" on
|
|
129
|
+
* `EvaluationResult` in ambient imports elsewhere; the type is used
|
|
130
|
+
* transitively via `GuardrailViolationError`.
|
|
131
|
+
*/
|
|
132
|
+
export type _EvaluationResultAlias = EvaluationResult;
|
|
133
|
+
//# sourceMappingURL=errors.d.ts.map
|