@caupulican/pi-agent-core 0.93.18 → 0.94.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.map +1 -1
- package/dist/agent-loop.js +50 -17
- 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/provider-request-estimator.d.ts.map +1 -1
- package/dist/provider-request-estimator.js +27 -17
- package/dist/provider-request-estimator.js.map +1 -1
- package/dist/provider-request-planner.d.ts +7 -1
- package/dist/provider-request-planner.d.ts.map +1 -1
- package/dist/provider-request-planner.js +20 -1
- package/dist/provider-request-planner.js.map +1 -1
- package/dist/session/lifecycle-ledger.d.ts +173 -0
- package/dist/session/lifecycle-ledger.d.ts.map +1 -0
- package/dist/session/lifecycle-ledger.js +648 -0
- package/dist/session/lifecycle-ledger.js.map +1 -0
- package/dist/session/session-manager.d.ts +52 -4
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +434 -39
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/session-tree.d.ts +10 -0
- package/dist/session/session-tree.d.ts.map +1 -0
- package/dist/session/session-tree.js +33 -0
- package/dist/session/session-tree.js.map +1 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
package/dist/agent.js
CHANGED
|
@@ -90,6 +90,7 @@ export class Agent {
|
|
|
90
90
|
this.transformContext = options.transformContext;
|
|
91
91
|
this.planContext = options.planContext;
|
|
92
92
|
this.admitProviderRequest = options.admitProviderRequest;
|
|
93
|
+
this.onProviderRequestSnapshot = options.onProviderRequestSnapshot;
|
|
93
94
|
this.resolveRequestReasoning = options.resolveRequestReasoning;
|
|
94
95
|
this.streamFn = options.streamFn ?? streamSimple;
|
|
95
96
|
this.getApiKey = options.getApiKey;
|
|
@@ -98,6 +99,7 @@ export class Agent {
|
|
|
98
99
|
this.textToolCallProtocol = options.textToolCallProtocol;
|
|
99
100
|
this.onTextToolProtocolParse = options.onTextToolProtocolParse;
|
|
100
101
|
this.beforeToolCall = options.beforeToolCall;
|
|
102
|
+
this.onToolCallStart = options.onToolCallStart;
|
|
101
103
|
this.afterToolCall = options.afterToolCall;
|
|
102
104
|
this.backgroundToolCallAfterMs = options.backgroundToolCallAfterMs;
|
|
103
105
|
this.handoffToolCall = options.handoffToolCall;
|
|
@@ -295,6 +297,7 @@ export class Agent {
|
|
|
295
297
|
toolValidationEscalationThreshold: this.toolValidationEscalationThreshold,
|
|
296
298
|
onToolValidationEscalation: this.onToolValidationEscalation,
|
|
297
299
|
beforeToolCall: this.beforeToolCall,
|
|
300
|
+
onToolCallStart: this.onToolCallStart,
|
|
298
301
|
afterToolCall: this.afterToolCall,
|
|
299
302
|
backgroundToolCallAfterMs: this.backgroundToolCallAfterMs,
|
|
300
303
|
handoffToolCall: this.handoffToolCall,
|
|
@@ -307,6 +310,7 @@ export class Agent {
|
|
|
307
310
|
transformContext: this.transformContext,
|
|
308
311
|
planContext: this.planContext,
|
|
309
312
|
admitProviderRequest: this.admitProviderRequest,
|
|
313
|
+
onProviderRequestSnapshot: this.onProviderRequestSnapshot,
|
|
310
314
|
resolveRequestReasoning: this.resolveRequestReasoning,
|
|
311
315
|
getApiKey: this.getApiKey,
|
|
312
316
|
getSteeringMessages: async () => {
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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","sourcesContent":["import { streamSimple } from \"@caupulican/pi-ai/stream\";\nimport type {\n\tImageContent,\n\tMessage,\n\tModel,\n\tSimpleStreamOptions,\n\tTextContent,\n\tThinkingBudgets,\n\tTransport,\n} from \"@caupulican/pi-ai/types\";\nimport type { ToolArgumentValidationTelemetryEvent } from \"@caupulican/pi-ai/validation\";\nimport {\n\ttype AgentLoopContinuationState,\n\tcreateAgentLoopContinuationState,\n\trunAgentLoop,\n\trunAgentLoopContinue,\n} from \"./agent-loop.ts\";\nimport type {\n\tAfterToolCallContext,\n\tAfterToolCallResult,\n\tAgentContext,\n\tAgentContextPlan,\n\tAgentContextPlanRequest,\n\tAgentEvent,\n\tAgentLoopConfig,\n\tAgentLoopTurnUpdate,\n\tAgentMessage,\n\tAgentState,\n\tAgentTool,\n\tBeforeToolCallContext,\n\tBeforeToolCallResult,\n\tProviderRequestAdmissionContext,\n\tProviderRequestAdmissionResult,\n\tQueueMode,\n\tStreamFn,\n\tToolExecutionMode,\n} from \"./types.ts\";\nimport { createEmptyUsage } from \"./usage.ts\";\n\nexport type { QueueMode } from \"./types.ts\";\n\nfunction defaultConvertToLlm(messages: AgentMessage[]): Message[] {\n\treturn messages.filter(\n\t\t(message) => message.role === \"user\" || message.role === \"assistant\" || message.role === \"toolResult\",\n\t);\n}\n\nconst DEFAULT_MODEL = {\n\tid: \"unknown\",\n\tname: \"unknown\",\n\tapi: \"unknown\",\n\tprovider: \"unknown\",\n\tbaseUrl: \"\",\n\treasoning: false,\n\tinput: [],\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\tcontextWindow: 0,\n\tmaxTokens: 0,\n} satisfies Model<any>;\n\ntype MutableAgentState = Omit<AgentState, \"isStreaming\" | \"streamingMessage\" | \"pendingToolCalls\" | \"errorMessage\"> & {\n\tisStreaming: boolean;\n\tstreamingMessage?: AgentMessage;\n\tpendingToolCalls: Set<string>;\n\terrorMessage?: string;\n};\n\nfunction createMutableAgentState(\n\tinitialState?: Partial<Omit<AgentState, \"pendingToolCalls\" | \"isStreaming\" | \"streamingMessage\" | \"errorMessage\">>,\n): MutableAgentState {\n\tlet tools = initialState?.tools?.slice() ?? [];\n\tlet messages = initialState?.messages?.slice() ?? [];\n\n\treturn {\n\t\tsystemPrompt: initialState?.systemPrompt ?? \"\",\n\t\tmodel: initialState?.model ?? DEFAULT_MODEL,\n\t\tthinkingLevel: initialState?.thinkingLevel ?? \"off\",\n\t\tget tools() {\n\t\t\treturn tools;\n\t\t},\n\t\tset tools(nextTools: AgentTool<any>[]) {\n\t\t\ttools = nextTools.slice();\n\t\t},\n\t\tget messages() {\n\t\t\treturn messages;\n\t\t},\n\t\tset messages(nextMessages: AgentMessage[]) {\n\t\t\tmessages = nextMessages.slice();\n\t\t},\n\t\tisStreaming: false,\n\t\tstreamingMessage: undefined,\n\t\tpendingToolCalls: new Set<string>(),\n\t\terrorMessage: undefined,\n\t};\n}\n\n/** Options for constructing an {@link Agent}. */\nexport interface AgentOptions {\n\tinitialState?: Partial<Omit<AgentState, \"pendingToolCalls\" | \"isStreaming\" | \"streamingMessage\" | \"errorMessage\">>;\n\tconvertToLlm?: (messages: AgentMessage[]) => Message[] | Promise<Message[]>;\n\ttransformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>;\n\tplanContext?: (request: AgentContextPlanRequest, signal?: AbortSignal) => Promise<AgentContextPlan>;\n\tadmitProviderRequest?: (\n\t\trequest: ProviderRequestAdmissionContext,\n\t\tsignal?: AbortSignal,\n\t) => ProviderRequestAdmissionResult | Promise<ProviderRequestAdmissionResult>;\n\tresolveRequestReasoning?: AgentLoopConfig[\"resolveRequestReasoning\"];\n\tstreamFn?: StreamFn;\n\tgetApiKey?: (provider: string) => Promise<string | undefined> | string | undefined;\n\tonPayload?: SimpleStreamOptions[\"onPayload\"];\n\tonResponse?: SimpleStreamOptions[\"onResponse\"];\n\ttextToolCallProtocol?: SimpleStreamOptions[\"textToolCallProtocol\"];\n\tonTextToolProtocolParse?: SimpleStreamOptions[\"onTextToolProtocolParse\"];\n\tbeforeToolCall?: (context: BeforeToolCallContext, signal?: AbortSignal) => Promise<BeforeToolCallResult | undefined>;\n\tafterToolCall?: (context: AfterToolCallContext, signal?: AbortSignal) => Promise<AfterToolCallResult | undefined>;\n\tbackgroundToolCallAfterMs?: AgentLoopConfig[\"backgroundToolCallAfterMs\"];\n\thandoffToolCall?: AgentLoopConfig[\"handoffToolCall\"];\n\tsubscribeToolCallHandoffRequest?: AgentLoopConfig[\"subscribeToolCallHandoffRequest\"];\n\tonToolArgumentValidation?: (event: ToolArgumentValidationTelemetryEvent) => void;\n\ttoolArgumentTeachEnabled?: boolean;\n\ttoolValidationEscalationThreshold?: number;\n\tonToolValidationEscalation?: AgentLoopConfig[\"onToolValidationEscalation\"];\n\tprepareNextTurn?: (\n\t\tsignal?: AbortSignal,\n\t) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined;\n\tshouldStopAfterTurn?: (signal?: AbortSignal) => boolean | Promise<boolean>;\n\tsteeringMode?: QueueMode;\n\tfollowUpMode?: QueueMode;\n\tsessionId?: string;\n\tthinkingBudgets?: ThinkingBudgets;\n\ttransport?: Transport;\n\tmaxRetryDelayMs?: number;\n\tmaxStallTurns?: number;\n\tmaxProviderTurns?: number;\n\tonRunawayStop?: AgentLoopConfig[\"onRunawayStop\"];\n\ttoolExecution?: ToolExecutionMode;\n}\n\nclass PendingMessageQueue {\n\tprivate messages: AgentMessage[] = [];\n\tpublic mode: QueueMode;\n\n\tconstructor(mode: QueueMode) {\n\t\tthis.mode = mode;\n\t}\n\n\tenqueue(message: AgentMessage): void {\n\t\tthis.messages.push(message);\n\t}\n\n\thasItems(): boolean {\n\t\treturn this.messages.length > 0;\n\t}\n\n\tdrain(): AgentMessage[] {\n\t\tif (this.mode === \"all\") {\n\t\t\tconst drained = this.messages.slice();\n\t\t\tthis.messages = [];\n\t\t\treturn drained;\n\t\t}\n\n\t\tconst first = this.messages[0];\n\t\tif (!first) {\n\t\t\treturn [];\n\t\t}\n\t\tthis.messages = this.messages.slice(1);\n\t\treturn [first];\n\t}\n\n\tclear(): void {\n\t\tthis.messages = [];\n\t}\n}\n\ntype ActiveRun = {\n\tpromise: Promise<void>;\n\tresolve: () => void;\n\tabortController: AbortController;\n};\n\n/** A second foreground operation tried to acquire an Agent that still owns an active run. */\nexport class AgentBusyError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"AgentBusyError\";\n\t}\n}\n\n/**\n * Stateful wrapper around the low-level agent loop.\n *\n * `Agent` owns the current transcript, emits lifecycle events, executes tools,\n * and exposes queueing APIs for steering and follow-up messages.\n */\nexport class Agent {\n\tprivate _state: MutableAgentState;\n\tprivate readonly listeners = new Set<(event: AgentEvent, signal: AbortSignal) => Promise<void> | void>();\n\tprivate readonly steeringQueue: PendingMessageQueue;\n\tprivate readonly followUpQueue: PendingMessageQueue;\n\n\tpublic convertToLlm: (messages: AgentMessage[]) => Message[] | Promise<Message[]>;\n\tpublic transformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>;\n\tpublic planContext?: (request: AgentContextPlanRequest, signal?: AbortSignal) => Promise<AgentContextPlan>;\n\tpublic admitProviderRequest?: (\n\t\trequest: ProviderRequestAdmissionContext,\n\t\tsignal?: AbortSignal,\n\t) => ProviderRequestAdmissionResult | Promise<ProviderRequestAdmissionResult>;\n\tpublic resolveRequestReasoning?: AgentLoopConfig[\"resolveRequestReasoning\"];\n\tpublic streamFn: StreamFn;\n\tpublic getApiKey?: (provider: string) => Promise<string | undefined> | string | undefined;\n\tpublic onPayload?: SimpleStreamOptions[\"onPayload\"];\n\tpublic onResponse?: SimpleStreamOptions[\"onResponse\"];\n\tpublic textToolCallProtocol?: SimpleStreamOptions[\"textToolCallProtocol\"];\n\tpublic onTextToolProtocolParse?: SimpleStreamOptions[\"onTextToolProtocolParse\"];\n\tpublic beforeToolCall?: (\n\t\tcontext: BeforeToolCallContext,\n\t\tsignal?: AbortSignal,\n\t) => Promise<BeforeToolCallResult | undefined>;\n\tpublic afterToolCall?: (\n\t\tcontext: AfterToolCallContext,\n\t\tsignal?: AbortSignal,\n\t) => Promise<AfterToolCallResult | undefined>;\n\tpublic backgroundToolCallAfterMs?: AgentLoopConfig[\"backgroundToolCallAfterMs\"];\n\tpublic handoffToolCall?: AgentLoopConfig[\"handoffToolCall\"];\n\tpublic subscribeToolCallHandoffRequest?: AgentLoopConfig[\"subscribeToolCallHandoffRequest\"];\n\tpublic onToolArgumentValidation?: (event: ToolArgumentValidationTelemetryEvent) => void;\n\tpublic toolArgumentTeachEnabled?: boolean;\n\tpublic toolValidationEscalationThreshold?: number;\n\tpublic onToolValidationEscalation?: AgentLoopConfig[\"onToolValidationEscalation\"];\n\tpublic prepareNextTurn?: (\n\t\tsignal?: AbortSignal,\n\t) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined;\n\tpublic shouldStopAfterTurn?: (signal?: AbortSignal) => boolean | Promise<boolean>;\n\tprivate activeRun?: ActiveRun;\n\t/** No-progress gates shared only by host continuations of the current logical prompt. */\n\tprivate loopContinuationState: AgentLoopContinuationState | undefined;\n\t/** Session identifier forwarded to providers for cache-aware backends. */\n\tpublic sessionId?: string;\n\t/** Optional per-level thinking token budgets forwarded to the stream function. */\n\tpublic thinkingBudgets?: ThinkingBudgets;\n\t/** Preferred transport forwarded to the stream function. */\n\tpublic transport: Transport;\n\t/** Optional cap for provider-requested retry delays. */\n\tpublic maxRetryDelayMs?: number;\n\t/** Runaway-loop backstop for repeated identical tool-call turns. */\n\tpublic maxStallTurns?: number;\n\t/** Optional provider-request fuse for one logical prompt; disabled when omitted or zero. */\n\tpublic maxProviderTurns?: number;\n\t/** Observability hook fired once if a repeated-call or provider-turn guard trips. */\n\tpublic onRunawayStop?: AgentLoopConfig[\"onRunawayStop\"];\n\t/** Tool execution strategy for assistant messages that contain multiple tool calls. */\n\tpublic toolExecution: ToolExecutionMode;\n\n\tconstructor(options: AgentOptions = {}) {\n\t\tthis._state = createMutableAgentState(options.initialState);\n\t\tthis.convertToLlm = options.convertToLlm ?? defaultConvertToLlm;\n\t\tthis.transformContext = options.transformContext;\n\t\tthis.planContext = options.planContext;\n\t\tthis.admitProviderRequest = options.admitProviderRequest;\n\t\tthis.resolveRequestReasoning = options.resolveRequestReasoning;\n\t\tthis.streamFn = options.streamFn ?? streamSimple;\n\t\tthis.getApiKey = options.getApiKey;\n\t\tthis.onPayload = options.onPayload;\n\t\tthis.onResponse = options.onResponse;\n\t\tthis.textToolCallProtocol = options.textToolCallProtocol;\n\t\tthis.onTextToolProtocolParse = options.onTextToolProtocolParse;\n\t\tthis.beforeToolCall = options.beforeToolCall;\n\t\tthis.afterToolCall = options.afterToolCall;\n\t\tthis.backgroundToolCallAfterMs = options.backgroundToolCallAfterMs;\n\t\tthis.handoffToolCall = options.handoffToolCall;\n\t\tthis.subscribeToolCallHandoffRequest = options.subscribeToolCallHandoffRequest;\n\t\tthis.onToolArgumentValidation = options.onToolArgumentValidation;\n\t\tthis.toolArgumentTeachEnabled = options.toolArgumentTeachEnabled;\n\t\tthis.toolValidationEscalationThreshold = options.toolValidationEscalationThreshold;\n\t\tthis.onToolValidationEscalation = options.onToolValidationEscalation;\n\t\tthis.prepareNextTurn = options.prepareNextTurn;\n\t\tthis.shouldStopAfterTurn = options.shouldStopAfterTurn;\n\t\tthis.steeringQueue = new PendingMessageQueue(options.steeringMode ?? \"one-at-a-time\");\n\t\tthis.followUpQueue = new PendingMessageQueue(options.followUpMode ?? \"one-at-a-time\");\n\t\tthis.sessionId = options.sessionId;\n\t\tthis.thinkingBudgets = options.thinkingBudgets;\n\t\tthis.transport = options.transport ?? \"auto\";\n\t\tthis.maxRetryDelayMs = options.maxRetryDelayMs;\n\t\tthis.maxStallTurns = options.maxStallTurns;\n\t\tthis.maxProviderTurns = options.maxProviderTurns;\n\t\tthis.onRunawayStop = options.onRunawayStop;\n\t\tthis.toolExecution = options.toolExecution ?? \"parallel\";\n\t}\n\n\t/**\n\t * Subscribe to agent lifecycle events.\n\t *\n\t * Listener promises are awaited in subscription order and are included in\n\t * the current run's settlement. Listeners also receive the active abort\n\t * signal for the current run.\n\t *\n\t * `agent_end` is the final emitted event for a run, but the agent does not\n\t * become idle until all awaited listeners for that event have settled.\n\t */\n\tsubscribe(listener: (event: AgentEvent, signal: AbortSignal) => Promise<void> | void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\t/**\n\t * Current agent state.\n\t *\n\t * Assigning `state.tools` or `state.messages` copies the provided top-level array.\n\t */\n\tget state(): AgentState {\n\t\treturn this._state;\n\t}\n\n\t/** Controls how queued steering messages are drained. */\n\tset steeringMode(mode: QueueMode) {\n\t\tthis.steeringQueue.mode = mode;\n\t}\n\n\tget steeringMode(): QueueMode {\n\t\treturn this.steeringQueue.mode;\n\t}\n\n\t/** Controls how queued follow-up messages are drained. */\n\tset followUpMode(mode: QueueMode) {\n\t\tthis.followUpQueue.mode = mode;\n\t}\n\n\tget followUpMode(): QueueMode {\n\t\treturn this.followUpQueue.mode;\n\t}\n\n\t/** Queue a message to be injected after the current assistant turn finishes. */\n\tsteer(message: AgentMessage): void {\n\t\tthis.steeringQueue.enqueue(message);\n\t}\n\n\t/** Queue a message to run only after the agent would otherwise stop. */\n\tfollowUp(message: AgentMessage): void {\n\t\tthis.followUpQueue.enqueue(message);\n\t}\n\n\t/** Remove all queued steering messages. */\n\tclearSteeringQueue(): void {\n\t\tthis.steeringQueue.clear();\n\t}\n\n\t/** Remove all queued follow-up messages. */\n\tclearFollowUpQueue(): void {\n\t\tthis.followUpQueue.clear();\n\t}\n\n\t/** Remove all queued steering and follow-up messages. */\n\tclearAllQueues(): void {\n\t\tthis.clearSteeringQueue();\n\t\tthis.clearFollowUpQueue();\n\t}\n\n\t/** Returns true when either queue still contains pending messages. */\n\thasQueuedMessages(): boolean {\n\t\treturn this.steeringQueue.hasItems() || this.followUpQueue.hasItems();\n\t}\n\n\t/** Active abort signal for the current run, if any. */\n\tget signal(): AbortSignal | undefined {\n\t\treturn this.activeRun?.abortController.signal;\n\t}\n\n\t/** Abort the current run, if one is active. */\n\tabort(): void {\n\t\tthis.activeRun?.abortController.abort();\n\t}\n\n\t/**\n\t * Resolve when the current run and all awaited event listeners have finished.\n\t *\n\t * This resolves after `agent_end` listeners settle.\n\t */\n\twaitForIdle(): Promise<void> {\n\t\treturn this.activeRun?.promise ?? Promise.resolve();\n\t}\n\n\t/** Clear transcript state, runtime state, and queued messages. */\n\treset(): void {\n\t\tthis._state.messages = [];\n\t\tthis._state.isStreaming = false;\n\t\tthis._state.streamingMessage = undefined;\n\t\tthis._state.pendingToolCalls = new Set<string>();\n\t\tthis._state.errorMessage = undefined;\n\t\tthis.loopContinuationState = undefined;\n\t\tthis.clearFollowUpQueue();\n\t\tthis.clearSteeringQueue();\n\t}\n\n\t/** Start a new prompt from text, a single message, or a batch of messages. */\n\tasync prompt(message: AgentMessage | AgentMessage[]): Promise<void>;\n\tasync prompt(input: string, images?: ImageContent[]): Promise<void>;\n\tasync prompt(input: string | AgentMessage | AgentMessage[], images?: ImageContent[]): Promise<void> {\n\t\tif (this.activeRun) {\n\t\t\tthrow new AgentBusyError(\n\t\t\t\t\"Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.\",\n\t\t\t);\n\t\t}\n\t\tconst messages = this.normalizePromptInput(input, images);\n\t\tawait this.runPromptMessages(messages);\n\t}\n\n\t/** Continue from the current transcript. The last message must be a user or tool-result message. */\n\tasync continue(): Promise<void> {\n\t\tif (this.activeRun) {\n\t\t\tthrow new AgentBusyError(\"Agent is already processing. Wait for completion before continuing.\");\n\t\t}\n\n\t\tconst lastMessage = this._state.messages[this._state.messages.length - 1];\n\t\tif (!lastMessage) {\n\t\t\tthrow new Error(\"No messages to continue from\");\n\t\t}\n\n\t\tif (lastMessage.role === \"assistant\") {\n\t\t\tconst queuedSteering = this.steeringQueue.drain();\n\t\t\tif (queuedSteering.length > 0) {\n\t\t\t\tawait this.runPromptMessages(queuedSteering, { skipInitialSteeringPoll: true });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst queuedFollowUps = this.followUpQueue.drain();\n\t\t\tif (queuedFollowUps.length > 0) {\n\t\t\t\tawait this.runPromptMessages(queuedFollowUps);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t\t}\n\n\t\tawait this.runContinuation();\n\t}\n\n\tprivate normalizePromptInput(\n\t\tinput: string | AgentMessage | AgentMessage[],\n\t\timages?: ImageContent[],\n\t): AgentMessage[] {\n\t\tif (Array.isArray(input)) {\n\t\t\treturn input;\n\t\t}\n\n\t\tif (typeof input !== \"string\") {\n\t\t\treturn [input];\n\t\t}\n\n\t\tconst content: Array<TextContent | ImageContent> = [{ type: \"text\", text: input }];\n\t\tif (images && images.length > 0) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\treturn [{ role: \"user\", content, timestamp: Date.now() }];\n\t}\n\n\tprivate async runPromptMessages(\n\t\tmessages: AgentMessage[],\n\t\toptions: { skipInitialSteeringPoll?: boolean } = {},\n\t): Promise<void> {\n\t\tconst continuationState = createAgentLoopContinuationState();\n\t\tthis.loopContinuationState = continuationState;\n\t\tawait this.runWithLifecycle(async (signal) => {\n\t\t\tawait runAgentLoop(\n\t\t\t\tmessages,\n\t\t\t\tthis.createContextSnapshot(),\n\t\t\t\tthis.createLoopConfig(options),\n\t\t\t\t(event) => this.processEvents(event),\n\t\t\t\tsignal,\n\t\t\t\tthis.streamFn,\n\t\t\t\tcontinuationState,\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate async runContinuation(): Promise<void> {\n\t\tconst continuationState = this.loopContinuationState ?? createAgentLoopContinuationState();\n\t\tthis.loopContinuationState = continuationState;\n\t\tawait this.runWithLifecycle(async (signal) => {\n\t\t\tawait runAgentLoopContinue(\n\t\t\t\tthis.createContextSnapshot(),\n\t\t\t\tthis.createLoopConfig(),\n\t\t\t\t(event) => this.processEvents(event),\n\t\t\t\tsignal,\n\t\t\t\tthis.streamFn,\n\t\t\t\tcontinuationState,\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate createContextSnapshot(): AgentContext {\n\t\treturn {\n\t\t\tsystemPrompt: this._state.systemPrompt,\n\t\t\tmessages: this._state.messages.slice(),\n\t\t\ttools: this._state.tools.slice(),\n\t\t};\n\t}\n\n\tprivate createLoopConfig(options: { skipInitialSteeringPoll?: boolean } = {}): AgentLoopConfig {\n\t\tlet skipInitialSteeringPoll = options.skipInitialSteeringPoll === true;\n\t\treturn {\n\t\t\tmodel: this._state.model,\n\t\t\treasoning: this._state.thinkingLevel,\n\t\t\ttemperature: this.textToolCallProtocol ? 0 : undefined,\n\t\t\tsessionId: this.sessionId,\n\t\t\tonPayload: this.onPayload,\n\t\t\tonResponse: this.onResponse,\n\t\t\ttextToolCallProtocol: this.textToolCallProtocol,\n\t\t\tonTextToolProtocolParse: this.onTextToolProtocolParse,\n\t\t\ttransport: this.transport,\n\t\t\tthinkingBudgets: this.thinkingBudgets,\n\t\t\tmaxRetryDelayMs: this.maxRetryDelayMs,\n\t\t\tmaxStallTurns: this.maxStallTurns,\n\t\t\tmaxProviderTurns: this.maxProviderTurns,\n\t\t\tonRunawayStop: this.onRunawayStop,\n\t\t\ttoolExecution: this.toolExecution,\n\t\t\ttoolArgumentTeachEnabled: this.toolArgumentTeachEnabled,\n\t\t\tonToolArgumentValidation: this.onToolArgumentValidation,\n\t\t\ttoolValidationEscalationThreshold: this.toolValidationEscalationThreshold,\n\t\t\tonToolValidationEscalation: this.onToolValidationEscalation,\n\t\t\tbeforeToolCall: this.beforeToolCall,\n\t\t\tafterToolCall: this.afterToolCall,\n\t\t\tbackgroundToolCallAfterMs: this.backgroundToolCallAfterMs,\n\t\t\thandoffToolCall: this.handoffToolCall,\n\t\t\tsubscribeToolCallHandoffRequest: this.subscribeToolCallHandoffRequest,\n\t\t\tprepareNextTurn: this.prepareNextTurn ? async () => await this.prepareNextTurn?.(this.signal) : undefined,\n\t\t\tshouldStopAfterTurn: this.shouldStopAfterTurn\n\t\t\t\t? async () => (await this.shouldStopAfterTurn?.(this.signal)) ?? false\n\t\t\t\t: undefined,\n\t\t\tconvertToLlm: this.convertToLlm,\n\t\t\ttransformContext: this.transformContext,\n\t\t\tplanContext: this.planContext,\n\t\t\tadmitProviderRequest: this.admitProviderRequest,\n\t\t\tresolveRequestReasoning: this.resolveRequestReasoning,\n\t\t\tgetApiKey: this.getApiKey,\n\t\t\tgetSteeringMessages: async () => {\n\t\t\t\tif (skipInitialSteeringPoll) {\n\t\t\t\t\tskipInitialSteeringPoll = false;\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\treturn this.steeringQueue.drain();\n\t\t\t},\n\t\t\tgetFollowUpMessages: async () => this.followUpQueue.drain(),\n\t\t};\n\t}\n\n\tprivate async runWithLifecycle(executor: (signal: AbortSignal) => Promise<void>): Promise<void> {\n\t\tif (this.activeRun) {\n\t\t\tthrow new AgentBusyError(\"Agent is already processing.\");\n\t\t}\n\n\t\tconst abortController = new AbortController();\n\t\tlet resolvePromise = () => {};\n\t\tconst promise = new Promise<void>((resolve) => {\n\t\t\tresolvePromise = resolve;\n\t\t});\n\t\tthis.activeRun = { promise, resolve: resolvePromise, abortController };\n\n\t\tthis._state.isStreaming = true;\n\t\tthis._state.streamingMessage = undefined;\n\t\tthis._state.errorMessage = undefined;\n\n\t\ttry {\n\t\t\tawait executor(abortController.signal);\n\t\t} catch (error) {\n\t\t\tawait this.handleRunFailure(error, abortController.signal.aborted);\n\t\t} finally {\n\t\t\tthis.finishRun();\n\t\t}\n\t}\n\n\tprivate async handleRunFailure(error: unknown, aborted: boolean): Promise<void> {\n\t\tconst failureMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [{ type: \"text\", text: \"\" }],\n\t\t\tapi: this._state.model.api,\n\t\t\tprovider: this._state.model.provider,\n\t\t\tmodel: this._state.model.id,\n\t\t\tusage: createEmptyUsage(),\n\t\t\tstopReason: aborted ? \"aborted\" : \"error\",\n\t\t\terrorMessage: error instanceof Error ? error.message : String(error),\n\t\t\ttimestamp: Date.now(),\n\t\t} satisfies AgentMessage;\n\t\tawait this.processEvents({ type: \"message_start\", message: failureMessage, origin: \"local\" });\n\t\tawait this.processEvents({ type: \"message_end\", message: failureMessage, origin: \"local\" });\n\t\tawait this.processEvents({ type: \"turn_end\", message: failureMessage, toolResults: [] });\n\t\tawait this.processEvents({ type: \"agent_end\", messages: [failureMessage] });\n\t}\n\n\tprivate finishRun(): void {\n\t\tthis._state.isStreaming = false;\n\t\tthis._state.streamingMessage = undefined;\n\t\tthis._state.pendingToolCalls = new Set<string>();\n\t\tthis.activeRun?.resolve();\n\t\tthis.activeRun = undefined;\n\t}\n\n\t/**\n\t * Reduce internal state for a loop event, then await listeners.\n\t *\n\t * `agent_end` only means no further loop events will be emitted. The run is\n\t * considered idle later, after all awaited listeners for `agent_end` finish\n\t * and `finishRun()` clears runtime-owned state.\n\t */\n\tprivate async processEvents(event: AgentEvent): Promise<void> {\n\t\tswitch (event.type) {\n\t\t\tcase \"message_start\":\n\t\t\t\tthis._state.streamingMessage = event.message;\n\t\t\t\tbreak;\n\n\t\t\tcase \"message_update\":\n\t\t\t\tthis._state.streamingMessage = event.message;\n\t\t\t\tbreak;\n\n\t\t\tcase \"message_end\":\n\t\t\t\tthis._state.streamingMessage = undefined;\n\t\t\t\tthis._state.messages.push(event.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"tool_execution_start\": {\n\t\t\t\tconst pendingToolCalls = new Set(this._state.pendingToolCalls);\n\t\t\t\tpendingToolCalls.add(event.toolCallId);\n\t\t\t\tthis._state.pendingToolCalls = pendingToolCalls;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"tool_execution_end\": {\n\t\t\t\tconst pendingToolCalls = new Set(this._state.pendingToolCalls);\n\t\t\t\tpendingToolCalls.delete(event.toolCallId);\n\t\t\t\tthis._state.pendingToolCalls = pendingToolCalls;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"turn_end\":\n\t\t\t\tif (event.message.role === \"assistant\" && event.message.errorMessage) {\n\t\t\t\t\tthis._state.errorMessage = event.message.errorMessage;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"agent_end\":\n\t\t\t\tthis._state.streamingMessage = undefined;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tconst signal = this.activeRun?.abortController.signal;\n\t\tif (!signal) {\n\t\t\tthrow new Error(\"Agent listener invoked outside active run\");\n\t\t}\n\t\tfor (const listener of this.listeners) {\n\t\t\tawait listener(event, signal);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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","sourcesContent":["import { streamSimple } from \"@caupulican/pi-ai/stream\";\nimport type {\n\tImageContent,\n\tMessage,\n\tModel,\n\tSimpleStreamOptions,\n\tTextContent,\n\tThinkingBudgets,\n\tTransport,\n} from \"@caupulican/pi-ai/types\";\nimport type { ToolArgumentValidationTelemetryEvent } from \"@caupulican/pi-ai/validation\";\nimport {\n\ttype AgentLoopContinuationState,\n\tcreateAgentLoopContinuationState,\n\trunAgentLoop,\n\trunAgentLoopContinue,\n} from \"./agent-loop.ts\";\nimport type {\n\tAfterToolCallContext,\n\tAfterToolCallResult,\n\tAgentContext,\n\tAgentContextPlan,\n\tAgentContextPlanRequest,\n\tAgentEvent,\n\tAgentLoopConfig,\n\tAgentLoopTurnUpdate,\n\tAgentMessage,\n\tAgentState,\n\tAgentTool,\n\tBeforeToolCallContext,\n\tBeforeToolCallResult,\n\tProviderRequestAdmissionContext,\n\tProviderRequestAdmissionResult,\n\tQueueMode,\n\tStreamFn,\n\tToolCallStartHook,\n\tToolExecutionMode,\n} from \"./types.ts\";\nimport { createEmptyUsage } from \"./usage.ts\";\n\nexport type { QueueMode } from \"./types.ts\";\n\nfunction defaultConvertToLlm(messages: AgentMessage[]): Message[] {\n\treturn messages.filter(\n\t\t(message) => message.role === \"user\" || message.role === \"assistant\" || message.role === \"toolResult\",\n\t);\n}\n\nconst DEFAULT_MODEL = {\n\tid: \"unknown\",\n\tname: \"unknown\",\n\tapi: \"unknown\",\n\tprovider: \"unknown\",\n\tbaseUrl: \"\",\n\treasoning: false,\n\tinput: [],\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\tcontextWindow: 0,\n\tmaxTokens: 0,\n} satisfies Model<any>;\n\ntype MutableAgentState = Omit<AgentState, \"isStreaming\" | \"streamingMessage\" | \"pendingToolCalls\" | \"errorMessage\"> & {\n\tisStreaming: boolean;\n\tstreamingMessage?: AgentMessage;\n\tpendingToolCalls: Set<string>;\n\terrorMessage?: string;\n};\n\nfunction createMutableAgentState(\n\tinitialState?: Partial<Omit<AgentState, \"pendingToolCalls\" | \"isStreaming\" | \"streamingMessage\" | \"errorMessage\">>,\n): MutableAgentState {\n\tlet tools = initialState?.tools?.slice() ?? [];\n\tlet messages = initialState?.messages?.slice() ?? [];\n\n\treturn {\n\t\tsystemPrompt: initialState?.systemPrompt ?? \"\",\n\t\tmodel: initialState?.model ?? DEFAULT_MODEL,\n\t\tthinkingLevel: initialState?.thinkingLevel ?? \"off\",\n\t\tget tools() {\n\t\t\treturn tools;\n\t\t},\n\t\tset tools(nextTools: AgentTool<any>[]) {\n\t\t\ttools = nextTools.slice();\n\t\t},\n\t\tget messages() {\n\t\t\treturn messages;\n\t\t},\n\t\tset messages(nextMessages: AgentMessage[]) {\n\t\t\tmessages = nextMessages.slice();\n\t\t},\n\t\tisStreaming: false,\n\t\tstreamingMessage: undefined,\n\t\tpendingToolCalls: new Set<string>(),\n\t\terrorMessage: undefined,\n\t};\n}\n\n/** Options for constructing an {@link Agent}. */\nexport interface AgentOptions {\n\tinitialState?: Partial<Omit<AgentState, \"pendingToolCalls\" | \"isStreaming\" | \"streamingMessage\" | \"errorMessage\">>;\n\tconvertToLlm?: (messages: AgentMessage[]) => Message[] | Promise<Message[]>;\n\ttransformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>;\n\tplanContext?: (request: AgentContextPlanRequest, signal?: AbortSignal) => Promise<AgentContextPlan>;\n\tadmitProviderRequest?: (\n\t\trequest: ProviderRequestAdmissionContext,\n\t\tsignal?: AbortSignal,\n\t) => ProviderRequestAdmissionResult | Promise<ProviderRequestAdmissionResult>;\n\tonProviderRequestSnapshot?: AgentLoopConfig[\"onProviderRequestSnapshot\"];\n\tresolveRequestReasoning?: AgentLoopConfig[\"resolveRequestReasoning\"];\n\tstreamFn?: StreamFn;\n\tgetApiKey?: (provider: string) => Promise<string | undefined> | string | undefined;\n\tonPayload?: SimpleStreamOptions[\"onPayload\"];\n\tonResponse?: SimpleStreamOptions[\"onResponse\"];\n\ttextToolCallProtocol?: SimpleStreamOptions[\"textToolCallProtocol\"];\n\tonTextToolProtocolParse?: SimpleStreamOptions[\"onTextToolProtocolParse\"];\n\tbeforeToolCall?: (context: BeforeToolCallContext, signal?: AbortSignal) => Promise<BeforeToolCallResult | undefined>;\n\tonToolCallStart?: ToolCallStartHook;\n\tafterToolCall?: (context: AfterToolCallContext, signal?: AbortSignal) => Promise<AfterToolCallResult | undefined>;\n\tbackgroundToolCallAfterMs?: AgentLoopConfig[\"backgroundToolCallAfterMs\"];\n\thandoffToolCall?: AgentLoopConfig[\"handoffToolCall\"];\n\tsubscribeToolCallHandoffRequest?: AgentLoopConfig[\"subscribeToolCallHandoffRequest\"];\n\tonToolArgumentValidation?: (event: ToolArgumentValidationTelemetryEvent) => void;\n\ttoolArgumentTeachEnabled?: boolean;\n\ttoolValidationEscalationThreshold?: number;\n\tonToolValidationEscalation?: AgentLoopConfig[\"onToolValidationEscalation\"];\n\tprepareNextTurn?: (\n\t\tsignal?: AbortSignal,\n\t) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined;\n\tshouldStopAfterTurn?: (signal?: AbortSignal) => boolean | Promise<boolean>;\n\tsteeringMode?: QueueMode;\n\tfollowUpMode?: QueueMode;\n\tsessionId?: string;\n\tthinkingBudgets?: ThinkingBudgets;\n\ttransport?: Transport;\n\tmaxRetryDelayMs?: number;\n\tmaxStallTurns?: number;\n\tmaxProviderTurns?: number;\n\tonRunawayStop?: AgentLoopConfig[\"onRunawayStop\"];\n\ttoolExecution?: ToolExecutionMode;\n}\n\nclass PendingMessageQueue {\n\tprivate messages: AgentMessage[] = [];\n\tpublic mode: QueueMode;\n\n\tconstructor(mode: QueueMode) {\n\t\tthis.mode = mode;\n\t}\n\n\tenqueue(message: AgentMessage): void {\n\t\tthis.messages.push(message);\n\t}\n\n\thasItems(): boolean {\n\t\treturn this.messages.length > 0;\n\t}\n\n\tdrain(): AgentMessage[] {\n\t\tif (this.mode === \"all\") {\n\t\t\tconst drained = this.messages.slice();\n\t\t\tthis.messages = [];\n\t\t\treturn drained;\n\t\t}\n\n\t\tconst first = this.messages[0];\n\t\tif (!first) {\n\t\t\treturn [];\n\t\t}\n\t\tthis.messages = this.messages.slice(1);\n\t\treturn [first];\n\t}\n\n\tclear(): void {\n\t\tthis.messages = [];\n\t}\n}\n\ntype ActiveRun = {\n\tpromise: Promise<void>;\n\tresolve: () => void;\n\tabortController: AbortController;\n};\n\n/** A second foreground operation tried to acquire an Agent that still owns an active run. */\nexport class AgentBusyError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"AgentBusyError\";\n\t}\n}\n\n/**\n * Stateful wrapper around the low-level agent loop.\n *\n * `Agent` owns the current transcript, emits lifecycle events, executes tools,\n * and exposes queueing APIs for steering and follow-up messages.\n */\nexport class Agent {\n\tprivate _state: MutableAgentState;\n\tprivate readonly listeners = new Set<(event: AgentEvent, signal: AbortSignal) => Promise<void> | void>();\n\tprivate readonly steeringQueue: PendingMessageQueue;\n\tprivate readonly followUpQueue: PendingMessageQueue;\n\n\tpublic convertToLlm: (messages: AgentMessage[]) => Message[] | Promise<Message[]>;\n\tpublic transformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>;\n\tpublic planContext?: (request: AgentContextPlanRequest, signal?: AbortSignal) => Promise<AgentContextPlan>;\n\tpublic admitProviderRequest?: (\n\t\trequest: ProviderRequestAdmissionContext,\n\t\tsignal?: AbortSignal,\n\t) => ProviderRequestAdmissionResult | Promise<ProviderRequestAdmissionResult>;\n\tpublic onProviderRequestSnapshot?: AgentLoopConfig[\"onProviderRequestSnapshot\"];\n\tpublic resolveRequestReasoning?: AgentLoopConfig[\"resolveRequestReasoning\"];\n\tpublic streamFn: StreamFn;\n\tpublic getApiKey?: (provider: string) => Promise<string | undefined> | string | undefined;\n\tpublic onPayload?: SimpleStreamOptions[\"onPayload\"];\n\tpublic onResponse?: SimpleStreamOptions[\"onResponse\"];\n\tpublic textToolCallProtocol?: SimpleStreamOptions[\"textToolCallProtocol\"];\n\tpublic onTextToolProtocolParse?: SimpleStreamOptions[\"onTextToolProtocolParse\"];\n\tpublic beforeToolCall?: (\n\t\tcontext: BeforeToolCallContext,\n\t\tsignal?: AbortSignal,\n\t) => Promise<BeforeToolCallResult | undefined>;\n\tpublic onToolCallStart?: ToolCallStartHook;\n\tpublic afterToolCall?: (\n\t\tcontext: AfterToolCallContext,\n\t\tsignal?: AbortSignal,\n\t) => Promise<AfterToolCallResult | undefined>;\n\tpublic backgroundToolCallAfterMs?: AgentLoopConfig[\"backgroundToolCallAfterMs\"];\n\tpublic handoffToolCall?: AgentLoopConfig[\"handoffToolCall\"];\n\tpublic subscribeToolCallHandoffRequest?: AgentLoopConfig[\"subscribeToolCallHandoffRequest\"];\n\tpublic onToolArgumentValidation?: (event: ToolArgumentValidationTelemetryEvent) => void;\n\tpublic toolArgumentTeachEnabled?: boolean;\n\tpublic toolValidationEscalationThreshold?: number;\n\tpublic onToolValidationEscalation?: AgentLoopConfig[\"onToolValidationEscalation\"];\n\tpublic prepareNextTurn?: (\n\t\tsignal?: AbortSignal,\n\t) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined;\n\tpublic shouldStopAfterTurn?: (signal?: AbortSignal) => boolean | Promise<boolean>;\n\tprivate activeRun?: ActiveRun;\n\t/** No-progress gates shared only by host continuations of the current logical prompt. */\n\tprivate loopContinuationState: AgentLoopContinuationState | undefined;\n\t/** Session identifier forwarded to providers for cache-aware backends. */\n\tpublic sessionId?: string;\n\t/** Optional per-level thinking token budgets forwarded to the stream function. */\n\tpublic thinkingBudgets?: ThinkingBudgets;\n\t/** Preferred transport forwarded to the stream function. */\n\tpublic transport: Transport;\n\t/** Optional cap for provider-requested retry delays. */\n\tpublic maxRetryDelayMs?: number;\n\t/** Runaway-loop backstop for repeated identical tool-call turns. */\n\tpublic maxStallTurns?: number;\n\t/** Optional provider-request fuse for one logical prompt; disabled when omitted or zero. */\n\tpublic maxProviderTurns?: number;\n\t/** Observability hook fired once if a repeated-call or provider-turn guard trips. */\n\tpublic onRunawayStop?: AgentLoopConfig[\"onRunawayStop\"];\n\t/** Tool execution strategy for assistant messages that contain multiple tool calls. */\n\tpublic toolExecution: ToolExecutionMode;\n\n\tconstructor(options: AgentOptions = {}) {\n\t\tthis._state = createMutableAgentState(options.initialState);\n\t\tthis.convertToLlm = options.convertToLlm ?? defaultConvertToLlm;\n\t\tthis.transformContext = options.transformContext;\n\t\tthis.planContext = options.planContext;\n\t\tthis.admitProviderRequest = options.admitProviderRequest;\n\t\tthis.onProviderRequestSnapshot = options.onProviderRequestSnapshot;\n\t\tthis.resolveRequestReasoning = options.resolveRequestReasoning;\n\t\tthis.streamFn = options.streamFn ?? streamSimple;\n\t\tthis.getApiKey = options.getApiKey;\n\t\tthis.onPayload = options.onPayload;\n\t\tthis.onResponse = options.onResponse;\n\t\tthis.textToolCallProtocol = options.textToolCallProtocol;\n\t\tthis.onTextToolProtocolParse = options.onTextToolProtocolParse;\n\t\tthis.beforeToolCall = options.beforeToolCall;\n\t\tthis.onToolCallStart = options.onToolCallStart;\n\t\tthis.afterToolCall = options.afterToolCall;\n\t\tthis.backgroundToolCallAfterMs = options.backgroundToolCallAfterMs;\n\t\tthis.handoffToolCall = options.handoffToolCall;\n\t\tthis.subscribeToolCallHandoffRequest = options.subscribeToolCallHandoffRequest;\n\t\tthis.onToolArgumentValidation = options.onToolArgumentValidation;\n\t\tthis.toolArgumentTeachEnabled = options.toolArgumentTeachEnabled;\n\t\tthis.toolValidationEscalationThreshold = options.toolValidationEscalationThreshold;\n\t\tthis.onToolValidationEscalation = options.onToolValidationEscalation;\n\t\tthis.prepareNextTurn = options.prepareNextTurn;\n\t\tthis.shouldStopAfterTurn = options.shouldStopAfterTurn;\n\t\tthis.steeringQueue = new PendingMessageQueue(options.steeringMode ?? \"one-at-a-time\");\n\t\tthis.followUpQueue = new PendingMessageQueue(options.followUpMode ?? \"one-at-a-time\");\n\t\tthis.sessionId = options.sessionId;\n\t\tthis.thinkingBudgets = options.thinkingBudgets;\n\t\tthis.transport = options.transport ?? \"auto\";\n\t\tthis.maxRetryDelayMs = options.maxRetryDelayMs;\n\t\tthis.maxStallTurns = options.maxStallTurns;\n\t\tthis.maxProviderTurns = options.maxProviderTurns;\n\t\tthis.onRunawayStop = options.onRunawayStop;\n\t\tthis.toolExecution = options.toolExecution ?? \"parallel\";\n\t}\n\n\t/**\n\t * Subscribe to agent lifecycle events.\n\t *\n\t * Listener promises are awaited in subscription order and are included in\n\t * the current run's settlement. Listeners also receive the active abort\n\t * signal for the current run.\n\t *\n\t * `agent_end` is the final emitted event for a run, but the agent does not\n\t * become idle until all awaited listeners for that event have settled.\n\t */\n\tsubscribe(listener: (event: AgentEvent, signal: AbortSignal) => Promise<void> | void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\t/**\n\t * Current agent state.\n\t *\n\t * Assigning `state.tools` or `state.messages` copies the provided top-level array.\n\t */\n\tget state(): AgentState {\n\t\treturn this._state;\n\t}\n\n\t/** Controls how queued steering messages are drained. */\n\tset steeringMode(mode: QueueMode) {\n\t\tthis.steeringQueue.mode = mode;\n\t}\n\n\tget steeringMode(): QueueMode {\n\t\treturn this.steeringQueue.mode;\n\t}\n\n\t/** Controls how queued follow-up messages are drained. */\n\tset followUpMode(mode: QueueMode) {\n\t\tthis.followUpQueue.mode = mode;\n\t}\n\n\tget followUpMode(): QueueMode {\n\t\treturn this.followUpQueue.mode;\n\t}\n\n\t/** Queue a message to be injected after the current assistant turn finishes. */\n\tsteer(message: AgentMessage): void {\n\t\tthis.steeringQueue.enqueue(message);\n\t}\n\n\t/** Queue a message to run only after the agent would otherwise stop. */\n\tfollowUp(message: AgentMessage): void {\n\t\tthis.followUpQueue.enqueue(message);\n\t}\n\n\t/** Remove all queued steering messages. */\n\tclearSteeringQueue(): void {\n\t\tthis.steeringQueue.clear();\n\t}\n\n\t/** Remove all queued follow-up messages. */\n\tclearFollowUpQueue(): void {\n\t\tthis.followUpQueue.clear();\n\t}\n\n\t/** Remove all queued steering and follow-up messages. */\n\tclearAllQueues(): void {\n\t\tthis.clearSteeringQueue();\n\t\tthis.clearFollowUpQueue();\n\t}\n\n\t/** Returns true when either queue still contains pending messages. */\n\thasQueuedMessages(): boolean {\n\t\treturn this.steeringQueue.hasItems() || this.followUpQueue.hasItems();\n\t}\n\n\t/** Active abort signal for the current run, if any. */\n\tget signal(): AbortSignal | undefined {\n\t\treturn this.activeRun?.abortController.signal;\n\t}\n\n\t/** Abort the current run, if one is active. */\n\tabort(): void {\n\t\tthis.activeRun?.abortController.abort();\n\t}\n\n\t/**\n\t * Resolve when the current run and all awaited event listeners have finished.\n\t *\n\t * This resolves after `agent_end` listeners settle.\n\t */\n\twaitForIdle(): Promise<void> {\n\t\treturn this.activeRun?.promise ?? Promise.resolve();\n\t}\n\n\t/** Clear transcript state, runtime state, and queued messages. */\n\treset(): void {\n\t\tthis._state.messages = [];\n\t\tthis._state.isStreaming = false;\n\t\tthis._state.streamingMessage = undefined;\n\t\tthis._state.pendingToolCalls = new Set<string>();\n\t\tthis._state.errorMessage = undefined;\n\t\tthis.loopContinuationState = undefined;\n\t\tthis.clearFollowUpQueue();\n\t\tthis.clearSteeringQueue();\n\t}\n\n\t/** Start a new prompt from text, a single message, or a batch of messages. */\n\tasync prompt(message: AgentMessage | AgentMessage[]): Promise<void>;\n\tasync prompt(input: string, images?: ImageContent[]): Promise<void>;\n\tasync prompt(input: string | AgentMessage | AgentMessage[], images?: ImageContent[]): Promise<void> {\n\t\tif (this.activeRun) {\n\t\t\tthrow new AgentBusyError(\n\t\t\t\t\"Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.\",\n\t\t\t);\n\t\t}\n\t\tconst messages = this.normalizePromptInput(input, images);\n\t\tawait this.runPromptMessages(messages);\n\t}\n\n\t/** Continue from the current transcript. The last message must be a user or tool-result message. */\n\tasync continue(): Promise<void> {\n\t\tif (this.activeRun) {\n\t\t\tthrow new AgentBusyError(\"Agent is already processing. Wait for completion before continuing.\");\n\t\t}\n\n\t\tconst lastMessage = this._state.messages[this._state.messages.length - 1];\n\t\tif (!lastMessage) {\n\t\t\tthrow new Error(\"No messages to continue from\");\n\t\t}\n\n\t\tif (lastMessage.role === \"assistant\") {\n\t\t\tconst queuedSteering = this.steeringQueue.drain();\n\t\t\tif (queuedSteering.length > 0) {\n\t\t\t\tawait this.runPromptMessages(queuedSteering, { skipInitialSteeringPoll: true });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst queuedFollowUps = this.followUpQueue.drain();\n\t\t\tif (queuedFollowUps.length > 0) {\n\t\t\t\tawait this.runPromptMessages(queuedFollowUps);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t\t}\n\n\t\tawait this.runContinuation();\n\t}\n\n\tprivate normalizePromptInput(\n\t\tinput: string | AgentMessage | AgentMessage[],\n\t\timages?: ImageContent[],\n\t): AgentMessage[] {\n\t\tif (Array.isArray(input)) {\n\t\t\treturn input;\n\t\t}\n\n\t\tif (typeof input !== \"string\") {\n\t\t\treturn [input];\n\t\t}\n\n\t\tconst content: Array<TextContent | ImageContent> = [{ type: \"text\", text: input }];\n\t\tif (images && images.length > 0) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\treturn [{ role: \"user\", content, timestamp: Date.now() }];\n\t}\n\n\tprivate async runPromptMessages(\n\t\tmessages: AgentMessage[],\n\t\toptions: { skipInitialSteeringPoll?: boolean } = {},\n\t): Promise<void> {\n\t\tconst continuationState = createAgentLoopContinuationState();\n\t\tthis.loopContinuationState = continuationState;\n\t\tawait this.runWithLifecycle(async (signal) => {\n\t\t\tawait runAgentLoop(\n\t\t\t\tmessages,\n\t\t\t\tthis.createContextSnapshot(),\n\t\t\t\tthis.createLoopConfig(options),\n\t\t\t\t(event) => this.processEvents(event),\n\t\t\t\tsignal,\n\t\t\t\tthis.streamFn,\n\t\t\t\tcontinuationState,\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate async runContinuation(): Promise<void> {\n\t\tconst continuationState = this.loopContinuationState ?? createAgentLoopContinuationState();\n\t\tthis.loopContinuationState = continuationState;\n\t\tawait this.runWithLifecycle(async (signal) => {\n\t\t\tawait runAgentLoopContinue(\n\t\t\t\tthis.createContextSnapshot(),\n\t\t\t\tthis.createLoopConfig(),\n\t\t\t\t(event) => this.processEvents(event),\n\t\t\t\tsignal,\n\t\t\t\tthis.streamFn,\n\t\t\t\tcontinuationState,\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate createContextSnapshot(): AgentContext {\n\t\treturn {\n\t\t\tsystemPrompt: this._state.systemPrompt,\n\t\t\tmessages: this._state.messages.slice(),\n\t\t\ttools: this._state.tools.slice(),\n\t\t};\n\t}\n\n\tprivate createLoopConfig(options: { skipInitialSteeringPoll?: boolean } = {}): AgentLoopConfig {\n\t\tlet skipInitialSteeringPoll = options.skipInitialSteeringPoll === true;\n\t\treturn {\n\t\t\tmodel: this._state.model,\n\t\t\treasoning: this._state.thinkingLevel,\n\t\t\ttemperature: this.textToolCallProtocol ? 0 : undefined,\n\t\t\tsessionId: this.sessionId,\n\t\t\tonPayload: this.onPayload,\n\t\t\tonResponse: this.onResponse,\n\t\t\ttextToolCallProtocol: this.textToolCallProtocol,\n\t\t\tonTextToolProtocolParse: this.onTextToolProtocolParse,\n\t\t\ttransport: this.transport,\n\t\t\tthinkingBudgets: this.thinkingBudgets,\n\t\t\tmaxRetryDelayMs: this.maxRetryDelayMs,\n\t\t\tmaxStallTurns: this.maxStallTurns,\n\t\t\tmaxProviderTurns: this.maxProviderTurns,\n\t\t\tonRunawayStop: this.onRunawayStop,\n\t\t\ttoolExecution: this.toolExecution,\n\t\t\ttoolArgumentTeachEnabled: this.toolArgumentTeachEnabled,\n\t\t\tonToolArgumentValidation: this.onToolArgumentValidation,\n\t\t\ttoolValidationEscalationThreshold: this.toolValidationEscalationThreshold,\n\t\t\tonToolValidationEscalation: this.onToolValidationEscalation,\n\t\t\tbeforeToolCall: this.beforeToolCall,\n\t\t\tonToolCallStart: this.onToolCallStart,\n\t\t\tafterToolCall: this.afterToolCall,\n\t\t\tbackgroundToolCallAfterMs: this.backgroundToolCallAfterMs,\n\t\t\thandoffToolCall: this.handoffToolCall,\n\t\t\tsubscribeToolCallHandoffRequest: this.subscribeToolCallHandoffRequest,\n\t\t\tprepareNextTurn: this.prepareNextTurn ? async () => await this.prepareNextTurn?.(this.signal) : undefined,\n\t\t\tshouldStopAfterTurn: this.shouldStopAfterTurn\n\t\t\t\t? async () => (await this.shouldStopAfterTurn?.(this.signal)) ?? false\n\t\t\t\t: undefined,\n\t\t\tconvertToLlm: this.convertToLlm,\n\t\t\ttransformContext: this.transformContext,\n\t\t\tplanContext: this.planContext,\n\t\t\tadmitProviderRequest: this.admitProviderRequest,\n\t\t\tonProviderRequestSnapshot: this.onProviderRequestSnapshot,\n\t\t\tresolveRequestReasoning: this.resolveRequestReasoning,\n\t\t\tgetApiKey: this.getApiKey,\n\t\t\tgetSteeringMessages: async () => {\n\t\t\t\tif (skipInitialSteeringPoll) {\n\t\t\t\t\tskipInitialSteeringPoll = false;\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\treturn this.steeringQueue.drain();\n\t\t\t},\n\t\t\tgetFollowUpMessages: async () => this.followUpQueue.drain(),\n\t\t};\n\t}\n\n\tprivate async runWithLifecycle(executor: (signal: AbortSignal) => Promise<void>): Promise<void> {\n\t\tif (this.activeRun) {\n\t\t\tthrow new AgentBusyError(\"Agent is already processing.\");\n\t\t}\n\n\t\tconst abortController = new AbortController();\n\t\tlet resolvePromise = () => {};\n\t\tconst promise = new Promise<void>((resolve) => {\n\t\t\tresolvePromise = resolve;\n\t\t});\n\t\tthis.activeRun = { promise, resolve: resolvePromise, abortController };\n\n\t\tthis._state.isStreaming = true;\n\t\tthis._state.streamingMessage = undefined;\n\t\tthis._state.errorMessage = undefined;\n\n\t\ttry {\n\t\t\tawait executor(abortController.signal);\n\t\t} catch (error) {\n\t\t\tawait this.handleRunFailure(error, abortController.signal.aborted);\n\t\t} finally {\n\t\t\tthis.finishRun();\n\t\t}\n\t}\n\n\tprivate async handleRunFailure(error: unknown, aborted: boolean): Promise<void> {\n\t\tconst failureMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [{ type: \"text\", text: \"\" }],\n\t\t\tapi: this._state.model.api,\n\t\t\tprovider: this._state.model.provider,\n\t\t\tmodel: this._state.model.id,\n\t\t\tusage: createEmptyUsage(),\n\t\t\tstopReason: aborted ? \"aborted\" : \"error\",\n\t\t\terrorMessage: error instanceof Error ? error.message : String(error),\n\t\t\ttimestamp: Date.now(),\n\t\t} satisfies AgentMessage;\n\t\tawait this.processEvents({ type: \"message_start\", message: failureMessage, origin: \"local\" });\n\t\tawait this.processEvents({ type: \"message_end\", message: failureMessage, origin: \"local\" });\n\t\tawait this.processEvents({ type: \"turn_end\", message: failureMessage, toolResults: [] });\n\t\tawait this.processEvents({ type: \"agent_end\", messages: [failureMessage] });\n\t}\n\n\tprivate finishRun(): void {\n\t\tthis._state.isStreaming = false;\n\t\tthis._state.streamingMessage = undefined;\n\t\tthis._state.pendingToolCalls = new Set<string>();\n\t\tthis.activeRun?.resolve();\n\t\tthis.activeRun = undefined;\n\t}\n\n\t/**\n\t * Reduce internal state for a loop event, then await listeners.\n\t *\n\t * `agent_end` only means no further loop events will be emitted. The run is\n\t * considered idle later, after all awaited listeners for `agent_end` finish\n\t * and `finishRun()` clears runtime-owned state.\n\t */\n\tprivate async processEvents(event: AgentEvent): Promise<void> {\n\t\tswitch (event.type) {\n\t\t\tcase \"message_start\":\n\t\t\t\tthis._state.streamingMessage = event.message;\n\t\t\t\tbreak;\n\n\t\t\tcase \"message_update\":\n\t\t\t\tthis._state.streamingMessage = event.message;\n\t\t\t\tbreak;\n\n\t\t\tcase \"message_end\":\n\t\t\t\tthis._state.streamingMessage = undefined;\n\t\t\t\tthis._state.messages.push(event.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"tool_execution_start\": {\n\t\t\t\tconst pendingToolCalls = new Set(this._state.pendingToolCalls);\n\t\t\t\tpendingToolCalls.add(event.toolCallId);\n\t\t\t\tthis._state.pendingToolCalls = pendingToolCalls;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"tool_execution_end\": {\n\t\t\t\tconst pendingToolCalls = new Set(this._state.pendingToolCalls);\n\t\t\t\tpendingToolCalls.delete(event.toolCallId);\n\t\t\t\tthis._state.pendingToolCalls = pendingToolCalls;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"turn_end\":\n\t\t\t\tif (event.message.role === \"assistant\" && event.message.errorMessage) {\n\t\t\t\t\tthis._state.errorMessage = event.message.errorMessage;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"agent_end\":\n\t\t\t\tthis._state.streamingMessage = undefined;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tconst signal = this.activeRun?.abortController.signal;\n\t\tif (!signal) {\n\t\t\tthrow new Error(\"Agent listener invoked outside active run\");\n\t\t}\n\t\tfor (const listener of this.listeners) {\n\t\t\tawait listener(event, signal);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-request-estimator.d.ts","sourceRoot":"","sources":["../src/provider-request-estimator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAyB,KAAK,EAAe,MAAM,yBAAyB,CAAC;AAGvG,eAAO,MAAM,sBAAsB,OAAQ,CAAC;AAC5C,eAAO,MAAM,qBAAqB,QAAoD,CAAC;AA+CvF,kGAAkG;AAClG,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,SAA2B,GAAG,MAAM,CAEzG;AA4DD,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEpE;AAED,uGAAuG;AACvG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEvE;
|
|
1
|
+
{"version":3,"file":"provider-request-estimator.d.ts","sourceRoot":"","sources":["../src/provider-request-estimator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAyB,KAAK,EAAe,MAAM,yBAAyB,CAAC;AAGvG,eAAO,MAAM,sBAAsB,OAAQ,CAAC;AAC5C,eAAO,MAAM,qBAAqB,QAAoD,CAAC;AA+CvF,kGAAkG;AAClG,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,SAA2B,GAAG,MAAM,CAEzG;AA4DD,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEpE;AAED,uGAAuG;AACvG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEvE;AAgDD,mGAAmG;AACnG,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAY1F"}
|
|
@@ -129,25 +129,35 @@ function semanticImageContent(content, addImageChars) {
|
|
|
129
129
|
return changed ? projected : content;
|
|
130
130
|
}
|
|
131
131
|
function semanticMessages(messages, addImageChars) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
132
|
+
return messages.map((message) => {
|
|
133
|
+
switch (message.role) {
|
|
134
|
+
case "user":
|
|
135
|
+
return {
|
|
136
|
+
role: message.role,
|
|
137
|
+
content: Array.isArray(message.content)
|
|
138
|
+
? semanticImageContent(message.content, addImageChars)
|
|
139
|
+
: message.content,
|
|
140
|
+
};
|
|
141
|
+
case "assistant":
|
|
142
|
+
return {
|
|
143
|
+
role: message.role,
|
|
144
|
+
content: message.content,
|
|
145
|
+
api: message.api,
|
|
146
|
+
provider: message.provider,
|
|
147
|
+
model: message.model,
|
|
148
|
+
};
|
|
149
|
+
case "toolResult":
|
|
150
|
+
return {
|
|
151
|
+
role: message.role,
|
|
152
|
+
toolCallId: message.toolCallId,
|
|
153
|
+
toolName: message.toolName,
|
|
154
|
+
content: semanticImageContent(message.content, addImageChars),
|
|
155
|
+
isError: message.isError,
|
|
156
|
+
};
|
|
147
157
|
}
|
|
148
|
-
|
|
158
|
+
const exhaustive = message;
|
|
159
|
+
return exhaustive;
|
|
149
160
|
});
|
|
150
|
-
return changed ? projected : messages;
|
|
151
161
|
}
|
|
152
162
|
/** Bounded semantic planning estimate over the complete, already-materialized provider Context. */
|
|
153
163
|
export function estimateProviderRequestTokens(context, model) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-request-estimator.js","sourceRoot":"","sources":["../src/provider-request-estimator.ts"],"names":[],"mappings":"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","sourcesContent":["import { projectMessagesForModelImageSupport } from \"@caupulican/pi-ai\";\nimport type { Api, Context, ImageContent, Message, Model, TextContent } from \"@caupulican/pi-ai/types\";\n\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\nexport const ESTIMATED_IMAGE_TOKENS = 1_200;\nexport const ESTIMATED_IMAGE_CHARS = ESTIMATED_IMAGE_TOKENS * CHARS_PER_TOKEN_ESTIMATE;\n\ntype JsonStringMeasure = (value: string) => number;\n\nfunction measureJsonString(value: string, utf8: boolean, maximumLength: number): number {\n\tlet length = 2;\n\tif (length > maximumLength) return maximumLength + 1;\n\tfor (let index = 0; index < value.length; index++) {\n\t\tconst code = value.charCodeAt(index);\n\t\tif (\n\t\t\tcode === 0x22 ||\n\t\t\tcode === 0x5c ||\n\t\t\tcode === 0x08 ||\n\t\t\tcode === 0x09 ||\n\t\t\tcode === 0x0a ||\n\t\t\tcode === 0x0c ||\n\t\t\tcode === 0x0d\n\t\t) {\n\t\t\tlength += 2;\n\t\t} else if (code < 0x20) {\n\t\t\tlength += 6;\n\t\t} else if (code >= 0xd800 && code <= 0xdbff) {\n\t\t\tconst next = value.charCodeAt(index + 1);\n\t\t\tif (next >= 0xdc00 && next <= 0xdfff) {\n\t\t\t\tlength += utf8 ? 4 : 2;\n\t\t\t\tindex++;\n\t\t\t} else {\n\t\t\t\tlength += 6;\n\t\t\t}\n\t\t} else if (code >= 0xdc00 && code <= 0xdfff) {\n\t\t\tlength += 6;\n\t\t} else if (!utf8 || code <= 0x7f) {\n\t\t\tlength++;\n\t\t} else if (code <= 0x7ff) {\n\t\t\tlength += 2;\n\t\t} else {\n\t\t\tlength += 3;\n\t\t}\n\t\tif (length > maximumLength) return maximumLength + 1;\n\t}\n\treturn length;\n}\n\nfunction jsonStringUtf16Length(value: string): number {\n\treturn measureJsonString(value, false, Number.POSITIVE_INFINITY);\n}\n\n/** Exact UTF-8 byte length of a JSON string, or `maximumBytes + 1` once its bound is exceeded. */\nexport function measureJsonStringUtf8Bytes(value: string, maximumBytes = Number.POSITIVE_INFINITY): number {\n\treturn measureJsonString(value, true, maximumBytes);\n}\n\nfunction measuredJsonValue(\n\tvalue: unknown,\n\tkey: string,\n\tactive: Set<object>,\n\tmeasureString: JsonStringMeasure,\n): number | undefined {\n\tif (typeof value === \"object\" && value !== null) {\n\t\tconst toJSON = Reflect.get(value, \"toJSON\");\n\t\tif (typeof toJSON === \"function\") value = Reflect.apply(toJSON, value, [key]) as unknown;\n\t}\n\n\tswitch (typeof value) {\n\t\tcase \"string\":\n\t\t\treturn measureString(value);\n\t\tcase \"number\":\n\t\t\treturn Number.isFinite(value) ? (Object.is(value, -0) ? 1 : String(value).length) : 4;\n\t\tcase \"boolean\":\n\t\t\treturn value ? 4 : 5;\n\t\tcase \"bigint\":\n\t\t\tthrow new TypeError(\"Do not know how to serialize a BigInt\");\n\t\tcase \"undefined\":\n\t\tcase \"function\":\n\t\tcase \"symbol\":\n\t\t\treturn undefined;\n\t\tcase \"object\":\n\t\t\tbreak;\n\t}\n\n\tif (value === null) return 4;\n\tif (value instanceof String || value instanceof Number || value instanceof Boolean) {\n\t\treturn measuredJsonValue(value.valueOf(), key, active, measureString);\n\t}\n\tif (active.has(value)) throw new TypeError(\"Converting circular structure to JSON\");\n\tactive.add(value);\n\ttry {\n\t\tif (Array.isArray(value)) {\n\t\t\tlet length = 2 + Math.max(0, value.length - 1);\n\t\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\t\tlength += measuredJsonValue(value[index], String(index), active, measureString) ?? 4;\n\t\t\t}\n\t\t\treturn length;\n\t\t}\n\n\t\tlet length = 2;\n\t\tlet fields = 0;\n\t\tfor (const field of Object.keys(value)) {\n\t\t\tconst fieldLength = measuredJsonValue(Reflect.get(value, field), field, active, measureString);\n\t\t\tif (fieldLength === undefined) continue;\n\t\t\tif (fields > 0) length++;\n\t\t\tlength += measureString(field) + 1 + fieldLength;\n\t\t\tfields++;\n\t\t}\n\t\treturn length;\n\t} finally {\n\t\tactive.delete(value);\n\t}\n}\n\n/** Exact UTF-16 length of standard JSON-compatible data without allocating its serialized copy. */\nexport function measureJsonLength(value: unknown): number | undefined {\n\treturn measuredJsonValue(value, \"\", new Set(), jsonStringUtf16Length);\n}\n\n/** Exact UTF-8 byte length of standard JSON-compatible data without allocating its serialized copy. */\nexport function measureJsonUtf8Bytes(value: unknown): number | undefined {\n\treturn measuredJsonValue(value, \"\", new Set(), measureJsonStringUtf8Bytes);\n}\n\nfunction semanticImageContent(\n\tcontent: (TextContent | ImageContent)[],\n\taddImageChars: () => void,\n): (TextContent | ImageContent)[] {\n\tlet changed = false;\n\tconst projected = content.map((block) => {\n\t\tif (block.type !== \"image\") return block;\n\t\tchanged = true;\n\t\taddImageChars();\n\t\treturn { type: \"image\" as const, data: \"\", mimeType: block.mimeType };\n\t});\n\treturn changed ? projected : content;\n}\n\nfunction semanticMessages(messages: Message[], addImageChars: () => void): Message[] {\n\tlet changed = false;\n\tconst projected = messages.map((message) => {\n\t\tif (message.role === \"user\" && Array.isArray(message.content)) {\n\t\t\tconst content = semanticImageContent(message.content, addImageChars);\n\t\t\tif (content === message.content) return message;\n\t\t\tchanged = true;\n\t\t\treturn { ...message, content };\n\t\t}\n\t\tif (message.role === \"toolResult\") {\n\t\t\tconst content = semanticImageContent(message.content, addImageChars);\n\t\t\tif (content === message.content) return message;\n\t\t\tchanged = true;\n\t\t\treturn { ...message, content };\n\t\t}\n\t\treturn message;\n\t});\n\treturn changed ? projected : messages;\n}\n\n/** Bounded semantic planning estimate over the complete, already-materialized provider Context. */\nexport function estimateProviderRequestTokens(context: Context, model?: Model<Api>): number {\n\tlet imageChars = 0;\n\tconst imageAwareMessages = model ? projectMessagesForModelImageSupport(context.messages, model) : context.messages;\n\tconst messages = semanticMessages(imageAwareMessages, () => {\n\t\timageChars += ESTIMATED_IMAGE_CHARS;\n\t});\n\tconst serializedLength = measureJsonLength({\n\t\tsystemPrompt: context.systemPrompt,\n\t\tmessages,\n\t\ttools: context.tools,\n\t});\n\treturn serializedLength === undefined ? 0 : Math.ceil((serializedLength + imageChars) / CHARS_PER_TOKEN_ESTIMATE);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"provider-request-estimator.js","sourceRoot":"","sources":["../src/provider-request-estimator.ts"],"names":[],"mappings":"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","sourcesContent":["import { projectMessagesForModelImageSupport } from \"@caupulican/pi-ai\";\nimport type { Api, Context, ImageContent, Message, Model, TextContent } from \"@caupulican/pi-ai/types\";\n\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\nexport const ESTIMATED_IMAGE_TOKENS = 1_200;\nexport const ESTIMATED_IMAGE_CHARS = ESTIMATED_IMAGE_TOKENS * CHARS_PER_TOKEN_ESTIMATE;\n\ntype JsonStringMeasure = (value: string) => number;\n\nfunction measureJsonString(value: string, utf8: boolean, maximumLength: number): number {\n\tlet length = 2;\n\tif (length > maximumLength) return maximumLength + 1;\n\tfor (let index = 0; index < value.length; index++) {\n\t\tconst code = value.charCodeAt(index);\n\t\tif (\n\t\t\tcode === 0x22 ||\n\t\t\tcode === 0x5c ||\n\t\t\tcode === 0x08 ||\n\t\t\tcode === 0x09 ||\n\t\t\tcode === 0x0a ||\n\t\t\tcode === 0x0c ||\n\t\t\tcode === 0x0d\n\t\t) {\n\t\t\tlength += 2;\n\t\t} else if (code < 0x20) {\n\t\t\tlength += 6;\n\t\t} else if (code >= 0xd800 && code <= 0xdbff) {\n\t\t\tconst next = value.charCodeAt(index + 1);\n\t\t\tif (next >= 0xdc00 && next <= 0xdfff) {\n\t\t\t\tlength += utf8 ? 4 : 2;\n\t\t\t\tindex++;\n\t\t\t} else {\n\t\t\t\tlength += 6;\n\t\t\t}\n\t\t} else if (code >= 0xdc00 && code <= 0xdfff) {\n\t\t\tlength += 6;\n\t\t} else if (!utf8 || code <= 0x7f) {\n\t\t\tlength++;\n\t\t} else if (code <= 0x7ff) {\n\t\t\tlength += 2;\n\t\t} else {\n\t\t\tlength += 3;\n\t\t}\n\t\tif (length > maximumLength) return maximumLength + 1;\n\t}\n\treturn length;\n}\n\nfunction jsonStringUtf16Length(value: string): number {\n\treturn measureJsonString(value, false, Number.POSITIVE_INFINITY);\n}\n\n/** Exact UTF-8 byte length of a JSON string, or `maximumBytes + 1` once its bound is exceeded. */\nexport function measureJsonStringUtf8Bytes(value: string, maximumBytes = Number.POSITIVE_INFINITY): number {\n\treturn measureJsonString(value, true, maximumBytes);\n}\n\nfunction measuredJsonValue(\n\tvalue: unknown,\n\tkey: string,\n\tactive: Set<object>,\n\tmeasureString: JsonStringMeasure,\n): number | undefined {\n\tif (typeof value === \"object\" && value !== null) {\n\t\tconst toJSON = Reflect.get(value, \"toJSON\");\n\t\tif (typeof toJSON === \"function\") value = Reflect.apply(toJSON, value, [key]) as unknown;\n\t}\n\n\tswitch (typeof value) {\n\t\tcase \"string\":\n\t\t\treturn measureString(value);\n\t\tcase \"number\":\n\t\t\treturn Number.isFinite(value) ? (Object.is(value, -0) ? 1 : String(value).length) : 4;\n\t\tcase \"boolean\":\n\t\t\treturn value ? 4 : 5;\n\t\tcase \"bigint\":\n\t\t\tthrow new TypeError(\"Do not know how to serialize a BigInt\");\n\t\tcase \"undefined\":\n\t\tcase \"function\":\n\t\tcase \"symbol\":\n\t\t\treturn undefined;\n\t\tcase \"object\":\n\t\t\tbreak;\n\t}\n\n\tif (value === null) return 4;\n\tif (value instanceof String || value instanceof Number || value instanceof Boolean) {\n\t\treturn measuredJsonValue(value.valueOf(), key, active, measureString);\n\t}\n\tif (active.has(value)) throw new TypeError(\"Converting circular structure to JSON\");\n\tactive.add(value);\n\ttry {\n\t\tif (Array.isArray(value)) {\n\t\t\tlet length = 2 + Math.max(0, value.length - 1);\n\t\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\t\tlength += measuredJsonValue(value[index], String(index), active, measureString) ?? 4;\n\t\t\t}\n\t\t\treturn length;\n\t\t}\n\n\t\tlet length = 2;\n\t\tlet fields = 0;\n\t\tfor (const field of Object.keys(value)) {\n\t\t\tconst fieldLength = measuredJsonValue(Reflect.get(value, field), field, active, measureString);\n\t\t\tif (fieldLength === undefined) continue;\n\t\t\tif (fields > 0) length++;\n\t\t\tlength += measureString(field) + 1 + fieldLength;\n\t\t\tfields++;\n\t\t}\n\t\treturn length;\n\t} finally {\n\t\tactive.delete(value);\n\t}\n}\n\n/** Exact UTF-16 length of standard JSON-compatible data without allocating its serialized copy. */\nexport function measureJsonLength(value: unknown): number | undefined {\n\treturn measuredJsonValue(value, \"\", new Set(), jsonStringUtf16Length);\n}\n\n/** Exact UTF-8 byte length of standard JSON-compatible data without allocating its serialized copy. */\nexport function measureJsonUtf8Bytes(value: unknown): number | undefined {\n\treturn measuredJsonValue(value, \"\", new Set(), measureJsonStringUtf8Bytes);\n}\n\nfunction semanticImageContent(\n\tcontent: (TextContent | ImageContent)[],\n\taddImageChars: () => void,\n): (TextContent | ImageContent)[] {\n\tlet changed = false;\n\tconst projected = content.map((block) => {\n\t\tif (block.type !== \"image\") return block;\n\t\tchanged = true;\n\t\taddImageChars();\n\t\treturn { type: \"image\" as const, data: \"\", mimeType: block.mimeType };\n\t});\n\treturn changed ? projected : content;\n}\n\nfunction semanticMessages(messages: Message[], addImageChars: () => void): unknown[] {\n\treturn messages.map((message) => {\n\t\tswitch (message.role) {\n\t\t\tcase \"user\":\n\t\t\t\treturn {\n\t\t\t\t\trole: message.role,\n\t\t\t\t\tcontent: Array.isArray(message.content)\n\t\t\t\t\t\t? semanticImageContent(message.content, addImageChars)\n\t\t\t\t\t\t: message.content,\n\t\t\t\t};\n\t\t\tcase \"assistant\":\n\t\t\t\treturn {\n\t\t\t\t\trole: message.role,\n\t\t\t\t\tcontent: message.content,\n\t\t\t\t\tapi: message.api,\n\t\t\t\t\tprovider: message.provider,\n\t\t\t\t\tmodel: message.model,\n\t\t\t\t};\n\t\t\tcase \"toolResult\":\n\t\t\t\treturn {\n\t\t\t\t\trole: message.role,\n\t\t\t\t\ttoolCallId: message.toolCallId,\n\t\t\t\t\ttoolName: message.toolName,\n\t\t\t\t\tcontent: semanticImageContent(message.content, addImageChars),\n\t\t\t\t\tisError: message.isError,\n\t\t\t\t};\n\t\t}\n\t\tconst exhaustive: never = message;\n\t\treturn exhaustive;\n\t});\n}\n\n/** Bounded semantic planning estimate over the complete, already-materialized provider Context. */\nexport function estimateProviderRequestTokens(context: Context, model?: Model<Api>): number {\n\tlet imageChars = 0;\n\tconst imageAwareMessages = model ? projectMessagesForModelImageSupport(context.messages, model) : context.messages;\n\tconst messages = semanticMessages(imageAwareMessages, () => {\n\t\timageChars += ESTIMATED_IMAGE_CHARS;\n\t});\n\tconst serializedLength = measureJsonLength({\n\t\tsystemPrompt: context.systemPrompt,\n\t\tmessages,\n\t\ttools: context.tools,\n\t});\n\treturn serializedLength === undefined ? 0 : Math.ceil((serializedLength + imageChars) / CHARS_PER_TOKEN_ESTIMATE);\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentContext, AgentLoopConfig, RequestPreflightContext, RequestPreflightResult, StreamFn } from "./types.ts";
|
|
1
|
+
import type { AgentContext, AgentLoopConfig, AgentRequestId, RequestPreflightContext, RequestPreflightResult, StreamFn } from "./types.ts";
|
|
2
2
|
/** Compose request-local host instructions without representing them as conversation history. */
|
|
3
3
|
export declare function composeRequestSystemPrompt(base: string | undefined, transient: string | undefined): string | undefined;
|
|
4
4
|
/**
|
|
@@ -17,9 +17,15 @@ export declare function resolveRequestPreflightMaxTokens(options: {
|
|
|
17
17
|
maxTokens?: number;
|
|
18
18
|
signal?: AbortSignal;
|
|
19
19
|
}): Promise<number | undefined>;
|
|
20
|
+
export interface StartedAgentProviderRequest {
|
|
21
|
+
requestId: AgentRequestId;
|
|
22
|
+
stream: Awaited<ReturnType<StreamFn>>;
|
|
23
|
+
}
|
|
20
24
|
/**
|
|
21
25
|
* Canonical two-phase provider boundary: plan replay-safe context, materialize once, admit the exact
|
|
22
26
|
* payload, commit only the accepted plan, then send the admitted object unchanged.
|
|
23
27
|
*/
|
|
24
28
|
export declare function startPlannedAgentProviderRequest(initialContext: AgentContext, config: AgentLoopConfig, signal: AbortSignal | undefined, streamFn?: StreamFn): Promise<Awaited<ReturnType<StreamFn>>>;
|
|
29
|
+
/** Start one accepted request while retaining its opaque lifecycle identity for the agent loop. */
|
|
30
|
+
export declare function startPlannedAgentProviderRequestWithId(initialContext: AgentContext, config: AgentLoopConfig, signal: AbortSignal | undefined, streamFn?: StreamFn): Promise<StartedAgentProviderRequest>;
|
|
25
31
|
//# sourceMappingURL=provider-request-planner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-request-planner.d.ts","sourceRoot":"","sources":["../src/provider-request-planner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACX,YAAY,EAEZ,eAAe,EAEf,uBAAuB,EACvB,sBAAsB,EACtB,QAAQ,EACR,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-request-planner.d.ts","sourceRoot":"","sources":["../src/provider-request-planner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACX,YAAY,EAEZ,eAAe,EAEf,cAAc,EACd,uBAAuB,EACvB,sBAAsB,EACtB,QAAQ,EACR,MAAM,YAAY,CAAC;AAMpB,iGAAiG;AACjG,wBAAgB,0BAA0B,CACzC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,GAAG,SAAS,CAGpB;AAUD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACrC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAYpB;AAED,wFAAwF;AACxF,wBAAsB,gCAAgC,CAAC,OAAO,EAAE;IAC/D,gBAAgB,CAAC,EAAE,CAClB,OAAO,EAAE,uBAAuB,EAChC,MAAM,CAAC,EAAE,WAAW,KAChB,sBAAsB,GAAG,SAAS,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IACtF,KAAK,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO9B;AAED,MAAM,WAAW,2BAA2B;IAC3C,SAAS,EAAE,cAAc,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;CACtC;AAiDD;;;GAGG;AACH,wBAAsB,gCAAgC,CACrD,cAAc,EAAE,YAAY,EAC5B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAGxC;AAED,mGAAmG;AACnG,wBAAsB,sCAAsC,CAC3D,cAAc,EAAE,YAAY,EAC5B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,2BAA2B,CAAC,CAkItC"}
|
|
@@ -2,6 +2,7 @@ import { materializeProviderRequest, startMaterializedProviderStream, streamSimp
|
|
|
2
2
|
import { applyProviderRequestImageBudget } from "./provider-request-image-budget.js";
|
|
3
3
|
import { projectToolsForProvider } from "./provider-tool-projection.js";
|
|
4
4
|
import { sanitizeToolFailureContext } from "./tool-failure-memory.js";
|
|
5
|
+
import { uuidv7 } from "./uuid.js";
|
|
5
6
|
const MAX_STALE_PROVIDER_REQUEST_PLANS = 3;
|
|
6
7
|
const MAX_PROVIDER_REQUEST_REPLANS = 2;
|
|
7
8
|
/** Compose request-local host instructions without representing them as conversation history. */
|
|
@@ -90,6 +91,11 @@ function adoptReplannedMessages(target, accepted) {
|
|
|
90
91
|
* payload, commit only the accepted plan, then send the admitted object unchanged.
|
|
91
92
|
*/
|
|
92
93
|
export async function startPlannedAgentProviderRequest(initialContext, config, signal, streamFn) {
|
|
94
|
+
const started = await startPlannedAgentProviderRequestWithId(initialContext, config, signal, streamFn);
|
|
95
|
+
return started.stream;
|
|
96
|
+
}
|
|
97
|
+
/** Start one accepted request while retaining its opaque lifecycle identity for the agent loop. */
|
|
98
|
+
export async function startPlannedAgentProviderRequestWithId(initialContext, config, signal, streamFn) {
|
|
93
99
|
let sourceContext = initialContext;
|
|
94
100
|
let admissionAttempt = 0;
|
|
95
101
|
let stalePlanCount = 0;
|
|
@@ -166,16 +172,29 @@ export async function startPlannedAgentProviderRequest(initialContext, config, s
|
|
|
166
172
|
stalePlanCount = nextStalePlanCount(stalePlanCount);
|
|
167
173
|
continue;
|
|
168
174
|
}
|
|
175
|
+
const requestId = uuidv7();
|
|
169
176
|
plan.commit?.();
|
|
170
177
|
adoptReplannedMessages(initialContext, sourceContext);
|
|
171
178
|
keepPlan = true;
|
|
172
|
-
|
|
179
|
+
await config.onProviderRequestSnapshot?.({
|
|
180
|
+
model: config.model,
|
|
181
|
+
context: materialized.context,
|
|
182
|
+
nonCompactableContext,
|
|
183
|
+
sourceContext,
|
|
184
|
+
maxTokens: requestMaxTokens,
|
|
185
|
+
requestId,
|
|
186
|
+
reasoning: requestReasoning,
|
|
187
|
+
attempt: admissionAttempt,
|
|
188
|
+
}, signal);
|
|
189
|
+
signal?.throwIfAborted();
|
|
190
|
+
const stream = (await startMaterializedProviderStream(config.model, materialized, {
|
|
173
191
|
...config,
|
|
174
192
|
apiKey: resolvedApiKey,
|
|
175
193
|
maxTokens: requestMaxTokens,
|
|
176
194
|
reasoning: requestReasoning,
|
|
177
195
|
signal,
|
|
178
196
|
}, (providerContext, providerOptions) => streamFunction(config.model, providerContext, providerOptions)));
|
|
197
|
+
return { requestId, stream };
|
|
179
198
|
}
|
|
180
199
|
finally {
|
|
181
200
|
if (!keepPlan)
|
|
@@ -1 +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 { applyProviderRequestImageBudget } from \"./provider-request-image-budget.ts\";\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\n/** Compose request-local host instructions without representing them as conversation history. */\nexport function composeRequestSystemPrompt(\n\tbase: string | undefined,\n\ttransient: string | undefined,\n): string | undefined {\n\tif (!transient) return base;\n\treturn base ? `${base}\\n\\n${transient}` : transient;\n}\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\n/**\n * Narrow an owner-selected output cap by one more requested ceiling and the model's own limit,\n * validating each supplied value is a positive safe integer. Exported so hosts computing their own\n * ceiling (e.g. a goal's remaining token budget) can route it through the SAME validated narrowing\n * this module applies just before transport, instead of hand-rolling an unvalidated min-merge that\n * only fails loudly here, several layers away from where the degenerate value was actually computed.\n */\nexport function 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: composeRequestSystemPrompt(sanitized.systemPrompt, plan.transientSystemPrompt),\n\t\t\t\tmessages: llmMessages,\n\t\t\t\ttools: projectToolsForProvider(sourceContext.tools),\n\t\t\t};\n\t\t\tconst protocolMaterialized = materializeProviderRequest(sourceProviderContext, config);\n\t\t\tconst budgeted = applyProviderRequestImageBudget(protocolMaterialized.context, config.model);\n\t\t\tconst materialized =\n\t\t\t\tbudgeted.context === protocolMaterialized.context\n\t\t\t\t\t? protocolMaterialized\n\t\t\t\t\t: { ...protocolMaterialized, context: budgeted.context };\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"]}
|
|
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 { applyProviderRequestImageBudget } from \"./provider-request-image-budget.ts\";\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\tAgentRequestId,\n\tRequestPreflightContext,\n\tRequestPreflightResult,\n\tStreamFn,\n} from \"./types.ts\";\nimport { uuidv7 } from \"./uuid.ts\";\n\nconst MAX_STALE_PROVIDER_REQUEST_PLANS = 3;\nconst MAX_PROVIDER_REQUEST_REPLANS = 2;\n\n/** Compose request-local host instructions without representing them as conversation history. */\nexport function composeRequestSystemPrompt(\n\tbase: string | undefined,\n\ttransient: string | undefined,\n): string | undefined {\n\tif (!transient) return base;\n\treturn base ? `${base}\\n\\n${transient}` : transient;\n}\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\n/**\n * Narrow an owner-selected output cap by one more requested ceiling and the model's own limit,\n * validating each supplied value is a positive safe integer. Exported so hosts computing their own\n * ceiling (e.g. a goal's remaining token budget) can route it through the SAME validated narrowing\n * this module applies just before transport, instead of hand-rolling an unvalidated min-merge that\n * only fails loudly here, several layers away from where the degenerate value was actually computed.\n */\nexport function 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\nexport interface StartedAgentProviderRequest {\n\trequestId: AgentRequestId;\n\tstream: Awaited<ReturnType<StreamFn>>;\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\tconst started = await startPlannedAgentProviderRequestWithId(initialContext, config, signal, streamFn);\n\treturn started.stream;\n}\n\n/** Start one accepted request while retaining its opaque lifecycle identity for the agent loop. */\nexport async function startPlannedAgentProviderRequestWithId(\n\tinitialContext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstreamFn?: StreamFn,\n): Promise<StartedAgentProviderRequest> {\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: composeRequestSystemPrompt(sanitized.systemPrompt, plan.transientSystemPrompt),\n\t\t\t\tmessages: llmMessages,\n\t\t\t\ttools: projectToolsForProvider(sourceContext.tools),\n\t\t\t};\n\t\t\tconst protocolMaterialized = materializeProviderRequest(sourceProviderContext, config);\n\t\t\tconst budgeted = applyProviderRequestImageBudget(protocolMaterialized.context, config.model);\n\t\t\tconst materialized =\n\t\t\t\tbudgeted.context === protocolMaterialized.context\n\t\t\t\t\t? protocolMaterialized\n\t\t\t\t\t: { ...protocolMaterialized, context: budgeted.context };\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\tconst requestId = uuidv7() as AgentRequestId;\n\t\t\tplan.commit?.();\n\t\t\tadoptReplannedMessages(initialContext, sourceContext);\n\t\t\tkeepPlan = true;\n\t\t\tawait config.onProviderRequestSnapshot?.(\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: requestMaxTokens,\n\t\t\t\t\trequestId,\n\t\t\t\t\treasoning: requestReasoning,\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\tconst stream = (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\treturn { requestId, stream };\n\t\t} finally {\n\t\t\tif (!keepPlan) plan.discard?.();\n\t\t}\n\t}\n}\n"]}
|