@caupulican/pi-agent-core 0.86.14 → 0.90.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/dist/agent-loop.d.ts +2 -13
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +279 -146
- package/dist/agent-loop.js.map +1 -1
- package/dist/agent.d.ts +5 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +4 -0
- package/dist/agent.js.map +1 -1
- package/dist/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/compaction/branch-summarization.js +11 -15
- package/dist/compaction/branch-summarization.js.map +1 -1
- package/dist/compaction/compaction.d.ts +3 -0
- package/dist/compaction/compaction.d.ts.map +1 -1
- package/dist/compaction/compaction.js +37 -46
- package/dist/compaction/compaction.js.map +1 -1
- package/dist/compaction/loop.d.ts +4 -0
- package/dist/compaction/loop.d.ts.map +1 -1
- package/dist/compaction/loop.js +7 -2
- package/dist/compaction/loop.js.map +1 -1
- package/dist/compaction/utils.d.ts +1 -1
- package/dist/compaction/utils.d.ts.map +1 -1
- package/dist/compaction/utils.js +13 -41
- package/dist/compaction/utils.js.map +1 -1
- package/dist/compaction/verification.js +2 -2
- package/dist/compaction/verification.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/provider-request-estimator.d.ts +6 -0
- package/dist/provider-request-estimator.d.ts.map +1 -0
- package/dist/provider-request-estimator.js +105 -0
- package/dist/provider-request-estimator.js.map +1 -0
- package/dist/provider-request-planner.d.ts +15 -0
- package/dist/provider-request-planner.d.ts.map +1 -0
- package/dist/provider-request-planner.js +168 -0
- package/dist/provider-request-planner.js.map +1 -0
- package/dist/provider-tool-projection.d.ts +7 -0
- package/dist/provider-tool-projection.d.ts.map +1 -0
- package/dist/provider-tool-projection.js +140 -0
- package/dist/provider-tool-projection.js.map +1 -0
- package/dist/tool-failure-memory.d.ts +8 -0
- package/dist/tool-failure-memory.d.ts.map +1 -1
- package/dist/tool-failure-memory.js +163 -70
- package/dist/tool-failure-memory.js.map +1 -1
- package/dist/tool-failure-recovery-gate.d.ts +60 -0
- package/dist/tool-failure-recovery-gate.d.ts.map +1 -0
- package/dist/tool-failure-recovery-gate.js +386 -0
- package/dist/tool-failure-recovery-gate.js.map +1 -0
- package/dist/tool-failure-recovery-protocol.d.ts +15 -0
- package/dist/tool-failure-recovery-protocol.d.ts.map +1 -0
- package/dist/tool-failure-recovery-protocol.js +43 -0
- package/dist/tool-failure-recovery-protocol.js.map +1 -0
- package/dist/types.d.ts +115 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { materializeProviderRequest, startMaterializedProviderStream, streamSimple } from "@caupulican/pi-ai/stream";
|
|
2
|
+
import { projectToolsForProvider } from "./provider-tool-projection.js";
|
|
3
|
+
import { sanitizeToolFailureContext } from "./tool-failure-memory.js";
|
|
4
|
+
const MAX_STALE_PROVIDER_REQUEST_PLANS = 3;
|
|
5
|
+
const MAX_PROVIDER_REQUEST_REPLANS = 2;
|
|
6
|
+
function nextStalePlanCount(count) {
|
|
7
|
+
const next = count + 1;
|
|
8
|
+
if (next >= MAX_STALE_PROVIDER_REQUEST_PLANS) {
|
|
9
|
+
throw new Error(`Provider request plan stayed stale after ${MAX_STALE_PROVIDER_REQUEST_PLANS} attempts`);
|
|
10
|
+
}
|
|
11
|
+
return next;
|
|
12
|
+
}
|
|
13
|
+
function narrowRequestMaxTokens(ownerMaxTokens, requestedMaxTokens, modelMaxTokens, label) {
|
|
14
|
+
if (ownerMaxTokens !== undefined && (!Number.isSafeInteger(ownerMaxTokens) || ownerMaxTokens <= 0)) {
|
|
15
|
+
throw new TypeError("request maxTokens must be a positive safe integer");
|
|
16
|
+
}
|
|
17
|
+
if (requestedMaxTokens === undefined)
|
|
18
|
+
return ownerMaxTokens;
|
|
19
|
+
if (!Number.isSafeInteger(requestedMaxTokens) || requestedMaxTokens <= 0) {
|
|
20
|
+
throw new TypeError(`${label}.maxTokens must be a positive safe integer`);
|
|
21
|
+
}
|
|
22
|
+
const ceilings = [requestedMaxTokens];
|
|
23
|
+
if (ownerMaxTokens !== undefined)
|
|
24
|
+
ceilings.push(ownerMaxTokens);
|
|
25
|
+
if (Number.isSafeInteger(modelMaxTokens) && modelMaxTokens > 0)
|
|
26
|
+
ceilings.push(modelMaxTokens);
|
|
27
|
+
return Math.min(...ceilings);
|
|
28
|
+
}
|
|
29
|
+
/** Apply one request-local preflight without mutating persistent loop configuration. */
|
|
30
|
+
export async function resolveRequestPreflightMaxTokens(options) {
|
|
31
|
+
if (!options.requestPreflight)
|
|
32
|
+
return options.maxTokens;
|
|
33
|
+
const preflight = await options.requestPreflight({ model: options.model, context: options.context, maxTokens: options.maxTokens }, options.signal);
|
|
34
|
+
return narrowRequestMaxTokens(options.maxTokens, preflight?.maxTokens, options.model.maxTokens, "requestPreflight");
|
|
35
|
+
}
|
|
36
|
+
async function buildContextPlan(messages, attempt, config, signal) {
|
|
37
|
+
if (config.planContext)
|
|
38
|
+
return await config.planContext({ messages, attempt }, signal);
|
|
39
|
+
return {
|
|
40
|
+
messages: config.transformContext ? await config.transformContext(messages, signal) : messages,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function nonCompactableProviderContext(context, compactableMessageCount, usesTextToolProtocol) {
|
|
44
|
+
const protocolGuardCount = usesTextToolProtocol && context.messages.length > 0 ? 1 : 0;
|
|
45
|
+
return {
|
|
46
|
+
...context,
|
|
47
|
+
messages: [
|
|
48
|
+
...context.messages.slice(0, protocolGuardCount),
|
|
49
|
+
...context.messages.slice(protocolGuardCount + compactableMessageCount),
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function sameToolSurface(left, right) {
|
|
54
|
+
if (left === right)
|
|
55
|
+
return true;
|
|
56
|
+
if (!left || !right || left.length !== right.length)
|
|
57
|
+
return false;
|
|
58
|
+
return left.every((tool, index) => tool === right[index]);
|
|
59
|
+
}
|
|
60
|
+
function validateReplannedSourceContext(previous, next) {
|
|
61
|
+
if (previous.systemPrompt !== next.systemPrompt || !sameToolSurface(previous.tools, next.tools)) {
|
|
62
|
+
throw new TypeError("Provider request admission may replan durable messages only");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Preserve the loop-owned messages array so shallow response-context projections observe compaction. */
|
|
66
|
+
function adoptReplannedMessages(target, accepted) {
|
|
67
|
+
if (target.messages === accepted.messages)
|
|
68
|
+
return;
|
|
69
|
+
const messages = accepted.messages.slice();
|
|
70
|
+
target.messages.length = 0;
|
|
71
|
+
for (const message of messages)
|
|
72
|
+
target.messages.push(message);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Canonical two-phase provider boundary: plan replay-safe context, materialize once, admit the exact
|
|
76
|
+
* payload, commit only the accepted plan, then send the admitted object unchanged.
|
|
77
|
+
*/
|
|
78
|
+
export async function startPlannedAgentProviderRequest(initialContext, config, signal, streamFn) {
|
|
79
|
+
let sourceContext = initialContext;
|
|
80
|
+
let admissionAttempt = 0;
|
|
81
|
+
let stalePlanCount = 0;
|
|
82
|
+
while (true) {
|
|
83
|
+
signal?.throwIfAborted();
|
|
84
|
+
const sanitized = sanitizeToolFailureContext(sourceContext.messages, sourceContext.systemPrompt);
|
|
85
|
+
const plan = await buildContextPlan(sanitized.messages, admissionAttempt, config, signal);
|
|
86
|
+
let keepPlan = false;
|
|
87
|
+
try {
|
|
88
|
+
signal?.throwIfAborted();
|
|
89
|
+
if (plan.isCurrent?.() === false) {
|
|
90
|
+
stalePlanCount = nextStalePlanCount(stalePlanCount);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const transientMessages = plan.transientMessages ?? [];
|
|
94
|
+
const compactableMessages = await config.convertToLlm(plan.messages);
|
|
95
|
+
const providerTransients = transientMessages.length > 0 ? await config.convertToLlm(transientMessages) : [];
|
|
96
|
+
const llmMessages = [...compactableMessages, ...providerTransients];
|
|
97
|
+
signal?.throwIfAborted();
|
|
98
|
+
const sourceProviderContext = {
|
|
99
|
+
systemPrompt: sanitized.systemPrompt,
|
|
100
|
+
messages: llmMessages,
|
|
101
|
+
tools: projectToolsForProvider(sourceContext.tools),
|
|
102
|
+
};
|
|
103
|
+
const materialized = materializeProviderRequest(sourceProviderContext, config);
|
|
104
|
+
const nonCompactableContext = nonCompactableProviderContext(materialized.context, compactableMessages.length, materialized.usesTextToolProtocol);
|
|
105
|
+
if (plan.isCurrent?.() === false) {
|
|
106
|
+
stalePlanCount = nextStalePlanCount(stalePlanCount);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const admission = await config.admitProviderRequest?.({
|
|
110
|
+
model: config.model,
|
|
111
|
+
context: materialized.context,
|
|
112
|
+
nonCompactableContext,
|
|
113
|
+
sourceContext,
|
|
114
|
+
maxTokens: config.maxTokens,
|
|
115
|
+
attempt: admissionAttempt,
|
|
116
|
+
}, signal);
|
|
117
|
+
signal?.throwIfAborted();
|
|
118
|
+
if (admission?.action === "replan") {
|
|
119
|
+
validateReplannedSourceContext(sourceContext, admission.context);
|
|
120
|
+
if (admissionAttempt >= MAX_PROVIDER_REQUEST_REPLANS) {
|
|
121
|
+
throw new Error(`Provider request admission exceeded ${MAX_PROVIDER_REQUEST_REPLANS} replans`);
|
|
122
|
+
}
|
|
123
|
+
sourceContext = admission.context;
|
|
124
|
+
admissionAttempt++;
|
|
125
|
+
stalePlanCount = 0;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
let requestMaxTokens = narrowRequestMaxTokens(config.maxTokens, admission?.maxTokens, config.model.maxTokens, "admitProviderRequest");
|
|
129
|
+
requestMaxTokens = await resolveRequestPreflightMaxTokens({
|
|
130
|
+
requestPreflight: config.requestPreflight,
|
|
131
|
+
model: config.model,
|
|
132
|
+
context: materialized.context,
|
|
133
|
+
maxTokens: requestMaxTokens,
|
|
134
|
+
signal,
|
|
135
|
+
});
|
|
136
|
+
signal?.throwIfAborted();
|
|
137
|
+
const resolvedApiKey = (config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;
|
|
138
|
+
signal?.throwIfAborted();
|
|
139
|
+
const requestReasoning = config.resolveRequestReasoning
|
|
140
|
+
? config.resolveRequestReasoning(config.reasoning, {
|
|
141
|
+
model: config.model,
|
|
142
|
+
context: materialized.context,
|
|
143
|
+
maxTokens: requestMaxTokens,
|
|
144
|
+
})
|
|
145
|
+
: config.reasoning;
|
|
146
|
+
const streamFunction = streamFn ?? streamSimple;
|
|
147
|
+
if (plan.isCurrent?.() === false || plan.prepareCommit?.() === false) {
|
|
148
|
+
stalePlanCount = nextStalePlanCount(stalePlanCount);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
plan.commit?.();
|
|
152
|
+
adoptReplannedMessages(initialContext, sourceContext);
|
|
153
|
+
keepPlan = true;
|
|
154
|
+
return (await startMaterializedProviderStream(config.model, materialized, {
|
|
155
|
+
...config,
|
|
156
|
+
apiKey: resolvedApiKey,
|
|
157
|
+
maxTokens: requestMaxTokens,
|
|
158
|
+
reasoning: requestReasoning,
|
|
159
|
+
signal,
|
|
160
|
+
}, (providerContext, providerOptions) => streamFunction(config.model, providerContext, providerOptions)));
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
if (!keepPlan)
|
|
164
|
+
plan.discard?.();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=provider-request-planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-request-planner.js","sourceRoot":"","sources":["../src/provider-request-planner.ts"],"names":[],"mappings":"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","sourcesContent":["import { materializeProviderRequest, startMaterializedProviderStream, streamSimple } from \"@caupulican/pi-ai/stream\";\nimport type { Context, Message } from \"@caupulican/pi-ai/types\";\nimport { projectToolsForProvider } from \"./provider-tool-projection.ts\";\nimport { sanitizeToolFailureContext } from \"./tool-failure-memory.ts\";\nimport type {\n\tAgentContext,\n\tAgentContextPlan,\n\tAgentLoopConfig,\n\tAgentMessage,\n\tRequestPreflightContext,\n\tRequestPreflightResult,\n\tStreamFn,\n} from \"./types.ts\";\n\nconst MAX_STALE_PROVIDER_REQUEST_PLANS = 3;\nconst MAX_PROVIDER_REQUEST_REPLANS = 2;\n\nfunction nextStalePlanCount(count: number): number {\n\tconst next = count + 1;\n\tif (next >= MAX_STALE_PROVIDER_REQUEST_PLANS) {\n\t\tthrow new Error(`Provider request plan stayed stale after ${MAX_STALE_PROVIDER_REQUEST_PLANS} attempts`);\n\t}\n\treturn next;\n}\n\nfunction narrowRequestMaxTokens(\n\townerMaxTokens: number | undefined,\n\trequestedMaxTokens: number | undefined,\n\tmodelMaxTokens: number,\n\tlabel: string,\n): number | undefined {\n\tif (ownerMaxTokens !== undefined && (!Number.isSafeInteger(ownerMaxTokens) || ownerMaxTokens <= 0)) {\n\t\tthrow new TypeError(\"request maxTokens must be a positive safe integer\");\n\t}\n\tif (requestedMaxTokens === undefined) return ownerMaxTokens;\n\tif (!Number.isSafeInteger(requestedMaxTokens) || requestedMaxTokens <= 0) {\n\t\tthrow new TypeError(`${label}.maxTokens must be a positive safe integer`);\n\t}\n\tconst ceilings = [requestedMaxTokens];\n\tif (ownerMaxTokens !== undefined) ceilings.push(ownerMaxTokens);\n\tif (Number.isSafeInteger(modelMaxTokens) && modelMaxTokens > 0) ceilings.push(modelMaxTokens);\n\treturn Math.min(...ceilings);\n}\n\n/** Apply one request-local preflight without mutating persistent loop configuration. */\nexport async function resolveRequestPreflightMaxTokens(options: {\n\trequestPreflight?: (\n\t\tcontext: RequestPreflightContext,\n\t\tsignal?: AbortSignal,\n\t) => RequestPreflightResult | undefined | Promise<RequestPreflightResult | undefined>;\n\tmodel: RequestPreflightContext[\"model\"];\n\tcontext: RequestPreflightContext[\"context\"];\n\tmaxTokens?: number;\n\tsignal?: AbortSignal;\n}): Promise<number | undefined> {\n\tif (!options.requestPreflight) return options.maxTokens;\n\tconst preflight = await options.requestPreflight(\n\t\t{ model: options.model, context: options.context, maxTokens: options.maxTokens },\n\t\toptions.signal,\n\t);\n\treturn narrowRequestMaxTokens(options.maxTokens, preflight?.maxTokens, options.model.maxTokens, \"requestPreflight\");\n}\n\nasync function buildContextPlan(\n\tmessages: AgentMessage[],\n\tattempt: number,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentContextPlan> {\n\tif (config.planContext) return await config.planContext({ messages, attempt }, signal);\n\treturn {\n\t\tmessages: config.transformContext ? await config.transformContext(messages, signal) : messages,\n\t};\n}\n\nfunction nonCompactableProviderContext(\n\tcontext: Context,\n\tcompactableMessageCount: number,\n\tusesTextToolProtocol: boolean,\n): Context {\n\tconst protocolGuardCount = usesTextToolProtocol && context.messages.length > 0 ? 1 : 0;\n\treturn {\n\t\t...context,\n\t\tmessages: [\n\t\t\t...context.messages.slice(0, protocolGuardCount),\n\t\t\t...context.messages.slice(protocolGuardCount + compactableMessageCount),\n\t\t],\n\t};\n}\n\nfunction sameToolSurface(left: AgentContext[\"tools\"], right: AgentContext[\"tools\"]): boolean {\n\tif (left === right) return true;\n\tif (!left || !right || left.length !== right.length) return false;\n\treturn left.every((tool, index) => tool === right[index]);\n}\n\nfunction validateReplannedSourceContext(previous: AgentContext, next: AgentContext): void {\n\tif (previous.systemPrompt !== next.systemPrompt || !sameToolSurface(previous.tools, next.tools)) {\n\t\tthrow new TypeError(\"Provider request admission may replan durable messages only\");\n\t}\n}\n\n/** Preserve the loop-owned messages array so shallow response-context projections observe compaction. */\nfunction adoptReplannedMessages(target: AgentContext, accepted: AgentContext): void {\n\tif (target.messages === accepted.messages) return;\n\tconst messages = accepted.messages.slice();\n\ttarget.messages.length = 0;\n\tfor (const message of messages) target.messages.push(message);\n}\n\n/**\n * Canonical two-phase provider boundary: plan replay-safe context, materialize once, admit the exact\n * payload, commit only the accepted plan, then send the admitted object unchanged.\n */\nexport async function startPlannedAgentProviderRequest(\n\tinitialContext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstreamFn?: StreamFn,\n): Promise<Awaited<ReturnType<StreamFn>>> {\n\tlet sourceContext = initialContext;\n\tlet admissionAttempt = 0;\n\tlet stalePlanCount = 0;\n\twhile (true) {\n\t\tsignal?.throwIfAborted();\n\t\tconst sanitized = sanitizeToolFailureContext(sourceContext.messages, sourceContext.systemPrompt);\n\t\tconst plan = await buildContextPlan(sanitized.messages, admissionAttempt, config, signal);\n\t\tlet keepPlan = false;\n\t\ttry {\n\t\t\tsignal?.throwIfAborted();\n\t\t\tif (plan.isCurrent?.() === false) {\n\t\t\t\tstalePlanCount = nextStalePlanCount(stalePlanCount);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst transientMessages = plan.transientMessages ?? [];\n\t\t\tconst compactableMessages = await config.convertToLlm(plan.messages);\n\t\t\tconst providerTransients = transientMessages.length > 0 ? await config.convertToLlm(transientMessages) : [];\n\t\t\tconst llmMessages: Message[] = [...compactableMessages, ...providerTransients];\n\t\t\tsignal?.throwIfAborted();\n\n\t\t\tconst sourceProviderContext: Context = {\n\t\t\t\tsystemPrompt: sanitized.systemPrompt,\n\t\t\t\tmessages: llmMessages,\n\t\t\t\ttools: projectToolsForProvider(sourceContext.tools),\n\t\t\t};\n\t\t\tconst materialized = materializeProviderRequest(sourceProviderContext, config);\n\t\t\tconst nonCompactableContext = nonCompactableProviderContext(\n\t\t\t\tmaterialized.context,\n\t\t\t\tcompactableMessages.length,\n\t\t\t\tmaterialized.usesTextToolProtocol,\n\t\t\t);\n\n\t\t\tif (plan.isCurrent?.() === false) {\n\t\t\t\tstalePlanCount = nextStalePlanCount(stalePlanCount);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst admission = await config.admitProviderRequest?.(\n\t\t\t\t{\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tcontext: materialized.context,\n\t\t\t\t\tnonCompactableContext,\n\t\t\t\t\tsourceContext,\n\t\t\t\t\tmaxTokens: config.maxTokens,\n\t\t\t\t\tattempt: admissionAttempt,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tsignal?.throwIfAborted();\n\t\t\tif (admission?.action === \"replan\") {\n\t\t\t\tvalidateReplannedSourceContext(sourceContext, admission.context);\n\t\t\t\tif (admissionAttempt >= MAX_PROVIDER_REQUEST_REPLANS) {\n\t\t\t\t\tthrow new Error(`Provider request admission exceeded ${MAX_PROVIDER_REQUEST_REPLANS} replans`);\n\t\t\t\t}\n\t\t\t\tsourceContext = admission.context;\n\t\t\t\tadmissionAttempt++;\n\t\t\t\tstalePlanCount = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet requestMaxTokens = narrowRequestMaxTokens(\n\t\t\t\tconfig.maxTokens,\n\t\t\t\tadmission?.maxTokens,\n\t\t\t\tconfig.model.maxTokens,\n\t\t\t\t\"admitProviderRequest\",\n\t\t\t);\n\t\t\trequestMaxTokens = await resolveRequestPreflightMaxTokens({\n\t\t\t\trequestPreflight: config.requestPreflight,\n\t\t\t\tmodel: config.model,\n\t\t\t\tcontext: materialized.context,\n\t\t\t\tmaxTokens: requestMaxTokens,\n\t\t\t\tsignal,\n\t\t\t});\n\t\t\tsignal?.throwIfAborted();\n\n\t\t\tconst resolvedApiKey =\n\t\t\t\t(config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\t\t\tsignal?.throwIfAborted();\n\t\t\tconst requestReasoning = config.resolveRequestReasoning\n\t\t\t\t? config.resolveRequestReasoning(config.reasoning, {\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\tcontext: materialized.context,\n\t\t\t\t\t\tmaxTokens: requestMaxTokens,\n\t\t\t\t\t})\n\t\t\t\t: config.reasoning;\n\t\t\tconst streamFunction = streamFn ?? streamSimple;\n\t\t\tif (plan.isCurrent?.() === false || plan.prepareCommit?.() === false) {\n\t\t\t\tstalePlanCount = nextStalePlanCount(stalePlanCount);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tplan.commit?.();\n\t\t\tadoptReplannedMessages(initialContext, sourceContext);\n\t\t\tkeepPlan = true;\n\t\t\treturn (await startMaterializedProviderStream(\n\t\t\t\tconfig.model,\n\t\t\t\tmaterialized,\n\t\t\t\t{\n\t\t\t\t\t...config,\n\t\t\t\t\tapiKey: resolvedApiKey,\n\t\t\t\t\tmaxTokens: requestMaxTokens,\n\t\t\t\t\treasoning: requestReasoning,\n\t\t\t\t\tsignal,\n\t\t\t\t},\n\t\t\t\t(providerContext, providerOptions) => streamFunction(config.model, providerContext, providerOptions),\n\t\t\t)) as Awaited<ReturnType<StreamFn>>;\n\t\t} finally {\n\t\t\tif (!keepPlan) plan.discard?.();\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Tool } from "@caupulican/pi-ai";
|
|
2
|
+
export declare function normalizeProviderToolDescription(description: string): string;
|
|
3
|
+
export declare function projectToolSchemaForProvider(schema: unknown): unknown;
|
|
4
|
+
export declare function projectToolsForProvider(tools: undefined): undefined;
|
|
5
|
+
export declare function projectToolsForProvider(tools: readonly Tool[]): Tool[];
|
|
6
|
+
export declare function projectToolsForProvider(tools: readonly Tool[] | undefined): Tool[] | undefined;
|
|
7
|
+
//# sourceMappingURL=provider-tool-projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-tool-projection.d.ts","sourceRoot":"","sources":["../src/provider-tool-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AA6H9C,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAErE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;AACrE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;AACxE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-only tool projection.
|
|
3
|
+
*
|
|
4
|
+
* Execution and validation retain the authoritative AgentTool and full TypeBox schema. Providers
|
|
5
|
+
* receive the same names, required fields, alternatives, defaults, and validation constraints, but
|
|
6
|
+
* not recursive schema annotations already available through deterministic validation teaching.
|
|
7
|
+
* This is one request-boundary path for native and text tool protocols.
|
|
8
|
+
*/
|
|
9
|
+
const OMITTED_SCHEMA_ANNOTATIONS = new Set([
|
|
10
|
+
"$comment",
|
|
11
|
+
"deprecated",
|
|
12
|
+
"description",
|
|
13
|
+
"examples",
|
|
14
|
+
"readOnly",
|
|
15
|
+
"title",
|
|
16
|
+
"writeOnly",
|
|
17
|
+
]);
|
|
18
|
+
const SCHEMA_MAP_KEYS = new Set(["$defs", "definitions", "dependentSchemas", "patternProperties", "properties"]);
|
|
19
|
+
const SCHEMA_ARRAY_KEYS = new Set(["allOf", "anyOf", "oneOf", "prefixItems"]);
|
|
20
|
+
const SCHEMA_SINGLE_KEYS = new Set([
|
|
21
|
+
"additionalProperties",
|
|
22
|
+
"contains",
|
|
23
|
+
"else",
|
|
24
|
+
"if",
|
|
25
|
+
"items",
|
|
26
|
+
"not",
|
|
27
|
+
"propertyNames",
|
|
28
|
+
"then",
|
|
29
|
+
"unevaluatedItems",
|
|
30
|
+
"unevaluatedProperties",
|
|
31
|
+
]);
|
|
32
|
+
function isRecord(value) {
|
|
33
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
34
|
+
}
|
|
35
|
+
function createProviderRecord() {
|
|
36
|
+
// Null prototype preserves a legitimate schema property named "__proto__". Object.keys below
|
|
37
|
+
// matches the JSON wire surface and never promotes TypeBox's non-enumerable ~kind/~optional data.
|
|
38
|
+
return Object.create(null);
|
|
39
|
+
}
|
|
40
|
+
function projectSchemaMap(value) {
|
|
41
|
+
if (!isRecord(value))
|
|
42
|
+
return value;
|
|
43
|
+
const projected = createProviderRecord();
|
|
44
|
+
for (const key of Object.keys(value)) {
|
|
45
|
+
projected[key] = projectSchemaNode(value[key]);
|
|
46
|
+
}
|
|
47
|
+
return projected;
|
|
48
|
+
}
|
|
49
|
+
function isJsonPrimitive(value) {
|
|
50
|
+
return (value === null ||
|
|
51
|
+
typeof value === "string" ||
|
|
52
|
+
typeof value === "boolean" ||
|
|
53
|
+
(typeof value === "number" && Number.isFinite(value)));
|
|
54
|
+
}
|
|
55
|
+
function compactLiteralUnion(projected) {
|
|
56
|
+
const branches = projected.anyOf;
|
|
57
|
+
if (!Array.isArray(branches) || branches.length < 2)
|
|
58
|
+
return projected;
|
|
59
|
+
const values = [];
|
|
60
|
+
const types = [];
|
|
61
|
+
const identities = new Set();
|
|
62
|
+
for (const branch of branches) {
|
|
63
|
+
if (!isRecord(branch) || !Object.hasOwn(branch, "const") || !isJsonPrimitive(branch.const))
|
|
64
|
+
return projected;
|
|
65
|
+
if (Object.keys(branch).some((key) => key !== "const" && key !== "type"))
|
|
66
|
+
return projected;
|
|
67
|
+
if (typeof branch.type !== "string")
|
|
68
|
+
return projected;
|
|
69
|
+
const identity = `${typeof branch.const}:${JSON.stringify(branch.const)}`;
|
|
70
|
+
if (identities.has(identity))
|
|
71
|
+
return projected;
|
|
72
|
+
identities.add(identity);
|
|
73
|
+
values.push(branch.const);
|
|
74
|
+
types.push(branch.type);
|
|
75
|
+
}
|
|
76
|
+
// Keep mixed-type or branch-constrained unions intact. A same-type primitive literal union is
|
|
77
|
+
// validation-equivalent to type+enum and is supported by every provider already accepting enums.
|
|
78
|
+
if (!types.every((type) => type === types[0]))
|
|
79
|
+
return projected;
|
|
80
|
+
const compacted = createProviderRecord();
|
|
81
|
+
for (const key of Object.keys(projected)) {
|
|
82
|
+
if (key !== "anyOf")
|
|
83
|
+
compacted[key] = projected[key];
|
|
84
|
+
}
|
|
85
|
+
if (compacted.type === undefined)
|
|
86
|
+
compacted.type = types[0];
|
|
87
|
+
compacted.enum = values;
|
|
88
|
+
return compacted;
|
|
89
|
+
}
|
|
90
|
+
function projectSchemaNode(value) {
|
|
91
|
+
if (!isRecord(value))
|
|
92
|
+
return value;
|
|
93
|
+
const projected = createProviderRecord();
|
|
94
|
+
for (const key of Object.keys(value)) {
|
|
95
|
+
if (OMITTED_SCHEMA_ANNOTATIONS.has(key))
|
|
96
|
+
continue;
|
|
97
|
+
const child = value[key];
|
|
98
|
+
if (SCHEMA_MAP_KEYS.has(key)) {
|
|
99
|
+
projected[key] = projectSchemaMap(child);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (SCHEMA_ARRAY_KEYS.has(key)) {
|
|
103
|
+
projected[key] = Array.isArray(child) ? child.map(projectSchemaNode) : child;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (key === "dependencies" && isRecord(child)) {
|
|
107
|
+
const dependencies = createProviderRecord();
|
|
108
|
+
for (const dependencyKey of Object.keys(child)) {
|
|
109
|
+
const dependency = child[dependencyKey];
|
|
110
|
+
dependencies[dependencyKey] = Array.isArray(dependency) ? dependency : projectSchemaNode(dependency);
|
|
111
|
+
}
|
|
112
|
+
projected[key] = dependencies;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (SCHEMA_SINGLE_KEYS.has(key)) {
|
|
116
|
+
projected[key] = Array.isArray(child) ? child.map(projectSchemaNode) : projectSchemaNode(child);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
projected[key] = child;
|
|
120
|
+
}
|
|
121
|
+
return compactLiteralUnion(projected);
|
|
122
|
+
}
|
|
123
|
+
export function normalizeProviderToolDescription(description) {
|
|
124
|
+
return description.replace(/\s+/g, " ").trim();
|
|
125
|
+
}
|
|
126
|
+
export function projectToolSchemaForProvider(schema) {
|
|
127
|
+
return projectSchemaNode(schema);
|
|
128
|
+
}
|
|
129
|
+
export function projectToolsForProvider(tools) {
|
|
130
|
+
if (!tools)
|
|
131
|
+
return undefined;
|
|
132
|
+
return tools.map((tool) => ({
|
|
133
|
+
name: tool.name,
|
|
134
|
+
description: normalizeProviderToolDescription("providerDescription" in tool && typeof tool.providerDescription === "string"
|
|
135
|
+
? tool.providerDescription
|
|
136
|
+
: tool.description),
|
|
137
|
+
parameters: projectSchemaNode(tool.parameters),
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=provider-tool-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-tool-projection.js","sourceRoot":"","sources":["../src/provider-tool-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Tool } from \"@caupulican/pi-ai\";\nimport type { TSchema } from \"typebox\";\n\n/**\n * Provider-only tool projection.\n *\n * Execution and validation retain the authoritative AgentTool and full TypeBox schema. Providers\n * receive the same names, required fields, alternatives, defaults, and validation constraints, but\n * not recursive schema annotations already available through deterministic validation teaching.\n * This is one request-boundary path for native and text tool protocols.\n */\n\nconst OMITTED_SCHEMA_ANNOTATIONS = new Set([\n\t\"$comment\",\n\t\"deprecated\",\n\t\"description\",\n\t\"examples\",\n\t\"readOnly\",\n\t\"title\",\n\t\"writeOnly\",\n]);\nconst SCHEMA_MAP_KEYS = new Set([\"$defs\", \"definitions\", \"dependentSchemas\", \"patternProperties\", \"properties\"]);\nconst SCHEMA_ARRAY_KEYS = new Set([\"allOf\", \"anyOf\", \"oneOf\", \"prefixItems\"]);\nconst SCHEMA_SINGLE_KEYS = new Set([\n\t\"additionalProperties\",\n\t\"contains\",\n\t\"else\",\n\t\"if\",\n\t\"items\",\n\t\"not\",\n\t\"propertyNames\",\n\t\"then\",\n\t\"unevaluatedItems\",\n\t\"unevaluatedProperties\",\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction createProviderRecord(): Record<string, unknown> {\n\t// Null prototype preserves a legitimate schema property named \"__proto__\". Object.keys below\n\t// matches the JSON wire surface and never promotes TypeBox's non-enumerable ~kind/~optional data.\n\treturn Object.create(null) as Record<string, unknown>;\n}\n\nfunction projectSchemaMap(value: unknown): unknown {\n\tif (!isRecord(value)) return value;\n\tconst projected = createProviderRecord();\n\tfor (const key of Object.keys(value)) {\n\t\tprojected[key] = projectSchemaNode(value[key]);\n\t}\n\treturn projected;\n}\n\nfunction isJsonPrimitive(value: unknown): value is string | number | boolean | null {\n\treturn (\n\t\tvalue === null ||\n\t\ttypeof value === \"string\" ||\n\t\ttypeof value === \"boolean\" ||\n\t\t(typeof value === \"number\" && Number.isFinite(value))\n\t);\n}\n\nfunction compactLiteralUnion(projected: Record<string, unknown>): Record<string, unknown> {\n\tconst branches = projected.anyOf;\n\tif (!Array.isArray(branches) || branches.length < 2) return projected;\n\tconst values: Array<string | number | boolean | null> = [];\n\tconst types: string[] = [];\n\tconst identities = new Set<string>();\n\tfor (const branch of branches) {\n\t\tif (!isRecord(branch) || !Object.hasOwn(branch, \"const\") || !isJsonPrimitive(branch.const)) return projected;\n\t\tif (Object.keys(branch).some((key) => key !== \"const\" && key !== \"type\")) return projected;\n\t\tif (typeof branch.type !== \"string\") return projected;\n\t\tconst identity = `${typeof branch.const}:${JSON.stringify(branch.const)}`;\n\t\tif (identities.has(identity)) return projected;\n\t\tidentities.add(identity);\n\t\tvalues.push(branch.const);\n\t\ttypes.push(branch.type);\n\t}\n\t// Keep mixed-type or branch-constrained unions intact. A same-type primitive literal union is\n\t// validation-equivalent to type+enum and is supported by every provider already accepting enums.\n\tif (!types.every((type) => type === types[0])) return projected;\n\n\tconst compacted = createProviderRecord();\n\tfor (const key of Object.keys(projected)) {\n\t\tif (key !== \"anyOf\") compacted[key] = projected[key];\n\t}\n\tif (compacted.type === undefined) compacted.type = types[0];\n\tcompacted.enum = values;\n\treturn compacted;\n}\n\nfunction projectSchemaNode(value: unknown): unknown {\n\tif (!isRecord(value)) return value;\n\tconst projected = createProviderRecord();\n\tfor (const key of Object.keys(value)) {\n\t\tif (OMITTED_SCHEMA_ANNOTATIONS.has(key)) continue;\n\t\tconst child = value[key];\n\t\tif (SCHEMA_MAP_KEYS.has(key)) {\n\t\t\tprojected[key] = projectSchemaMap(child);\n\t\t\tcontinue;\n\t\t}\n\t\tif (SCHEMA_ARRAY_KEYS.has(key)) {\n\t\t\tprojected[key] = Array.isArray(child) ? child.map(projectSchemaNode) : child;\n\t\t\tcontinue;\n\t\t}\n\t\tif (key === \"dependencies\" && isRecord(child)) {\n\t\t\tconst dependencies = createProviderRecord();\n\t\t\tfor (const dependencyKey of Object.keys(child)) {\n\t\t\t\tconst dependency = child[dependencyKey];\n\t\t\t\tdependencies[dependencyKey] = Array.isArray(dependency) ? dependency : projectSchemaNode(dependency);\n\t\t\t}\n\t\t\tprojected[key] = dependencies;\n\t\t\tcontinue;\n\t\t}\n\t\tif (SCHEMA_SINGLE_KEYS.has(key)) {\n\t\t\tprojected[key] = Array.isArray(child) ? child.map(projectSchemaNode) : projectSchemaNode(child);\n\t\t\tcontinue;\n\t\t}\n\t\tprojected[key] = child;\n\t}\n\treturn compactLiteralUnion(projected);\n}\n\nexport function normalizeProviderToolDescription(description: string): string {\n\treturn description.replace(/\\s+/g, \" \").trim();\n}\n\nexport function projectToolSchemaForProvider(schema: unknown): unknown {\n\treturn projectSchemaNode(schema);\n}\n\nexport function projectToolsForProvider(tools: undefined): undefined;\nexport function projectToolsForProvider(tools: readonly Tool[]): Tool[];\nexport function projectToolsForProvider(tools: readonly Tool[] | undefined): Tool[] | undefined;\nexport function projectToolsForProvider(tools: readonly Tool[] | undefined): Tool[] | undefined {\n\tif (!tools) return undefined;\n\treturn tools.map((tool) => ({\n\t\tname: tool.name,\n\t\tdescription: normalizeProviderToolDescription(\n\t\t\t\"providerDescription\" in tool && typeof tool.providerDescription === \"string\"\n\t\t\t\t? tool.providerDescription\n\t\t\t\t: tool.description,\n\t\t),\n\t\tparameters: projectSchemaNode(tool.parameters) as TSchema,\n\t}));\n}\n"]}
|
|
@@ -2,10 +2,13 @@ import { type ToolFailurePhase } from "@caupulican/pi-ai/tool-repair-registry";
|
|
|
2
2
|
import type { AgentMessage, AgentToolResult } from "./types.ts";
|
|
3
3
|
declare const TOOL_FAILURE_MEMORY_VERSION = 1;
|
|
4
4
|
declare const TOOL_FAILURE_DIRECTIVE_VERSION = 1;
|
|
5
|
+
declare const TOOL_FAILURE_EXECUTION_KEY: unique symbol;
|
|
5
6
|
export type ToolFailureState = "failed" | "rejected";
|
|
6
7
|
export interface ToolFailureMemoryRecord {
|
|
7
8
|
version: typeof TOOL_FAILURE_MEMORY_VERSION;
|
|
8
9
|
failureKey: string;
|
|
10
|
+
/** Exact identity is process-internal and omitted from serialized failure memory. */
|
|
11
|
+
readonly [TOOL_FAILURE_EXECUTION_KEY]?: string;
|
|
9
12
|
tool: string;
|
|
10
13
|
operation: string;
|
|
11
14
|
occurrence: number;
|
|
@@ -38,6 +41,9 @@ export type ToolFailureMemoryTracker = Map<string, ToolFailureMemoryRecord>;
|
|
|
38
41
|
* Volatile identifiers normalize before hashing; short numbers and ordinary paths remain significant.
|
|
39
42
|
*/
|
|
40
43
|
export declare function normalizeToolSignature(pairs: Array<[string, unknown]>): string;
|
|
44
|
+
export declare function getToolExecutionKey(tool: string, args: unknown): string;
|
|
45
|
+
export declare function getToolFailureRecordExecutionKey(record: ToolFailureMemoryRecord): string | undefined;
|
|
46
|
+
export declare function getUnresolvedToolFailure(tracker: ToolFailureMemoryTracker, tool: string, args: unknown): ToolFailureMemoryRecord | undefined;
|
|
41
47
|
export declare function classifyToolFailure(message: string, errorClass?: string): string;
|
|
42
48
|
export declare function toolFailureCorrection(message: string, state: ToolFailureState, phase?: ToolFailurePhase): string;
|
|
43
49
|
export interface ToolFailureAssessment {
|
|
@@ -61,6 +67,8 @@ export declare function createToolFailureMemoryTracker(messages: AgentMessage[])
|
|
|
61
67
|
export declare function rememberToolFailure(tracker: ToolFailureMemoryTracker, tool: string, args: unknown, state: ToolFailureState, failureCode: string, correction: string, diagnostic?: string, phase?: ToolFailurePhase): ToolFailureMemoryRecord;
|
|
62
68
|
export declare function clearToolFailure(tracker: ToolFailureMemoryTracker, tool: string, args: unknown): void;
|
|
63
69
|
export declare function createToolFailureResult(record: ToolFailureMemoryRecord, terminate?: boolean): AgentToolResult<ToolFailureResultDetails>;
|
|
70
|
+
export declare function createRepeatedToolFailureResult(record: ToolFailureMemoryRecord): AgentToolResult<ToolFailureMemoryDetails>;
|
|
71
|
+
export declare function createToolFailureRecoveryExhaustedResult(record: ToolFailureMemoryRecord, diagnostic: string): AgentToolResult<ToolFailureMemoryDetails>;
|
|
64
72
|
export declare function sanitizeToolFailureContext(messages: AgentMessage[], systemPrompt: string): {
|
|
65
73
|
messages: AgentMessage[];
|
|
66
74
|
systemPrompt: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-failure-memory.d.ts","sourceRoot":"","sources":["../src/tool-failure-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,gBAAgB,EACrB,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-failure-memory.d.ts","sourceRoot":"","sources":["../src/tool-failure-memory.ts"],"names":[],"mappings":"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"}
|