veryfront 0.1.848 → 0.1.850
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/esm/deno.js +1 -1
- package/esm/src/agent/hosted/chat-runtime-tool-assembly.d.ts +2 -0
- package/esm/src/agent/hosted/chat-runtime-tool-assembly.d.ts.map +1 -1
- package/esm/src/agent/hosted/chat-runtime-tool-assembly.js +11 -1
- package/esm/src/agent/hosted/runtime-state-resolver.d.ts +1 -0
- package/esm/src/agent/hosted/runtime-state-resolver.d.ts.map +1 -1
- package/esm/src/agent/hosted/runtime-state-resolver.js +4 -0
- package/esm/src/agent/runtime/agent-runtime-step.d.ts.map +1 -1
- package/esm/src/agent/runtime/agent-runtime-step.js +2 -0
- package/esm/src/agent/runtime/chat-stream-handler.d.ts +5 -0
- package/esm/src/agent/runtime/chat-stream-handler.d.ts.map +1 -1
- package/esm/src/agent/runtime/chat-stream-handler.js +39 -0
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +99 -6
- package/esm/src/agent/runtime/skill-policy-enforcement.d.ts +5 -1
- package/esm/src/agent/runtime/skill-policy-enforcement.d.ts.map +1 -1
- package/esm/src/agent/runtime/skill-policy-enforcement.js +40 -5
- package/esm/src/agent/runtime/tool-result-continuation.d.ts +1 -1
- package/esm/src/agent/runtime/tool-result-continuation.d.ts.map +1 -1
- package/esm/src/agent/runtime/tool-result-continuation.js +1 -1
- package/esm/src/rendering/cache/stores/api-store.d.ts.map +1 -1
- package/esm/src/rendering/cache/stores/api-store.js +7 -9
- package/esm/src/rendering/renderer.d.ts +2 -0
- package/esm/src/rendering/renderer.d.ts.map +1 -1
- package/esm/src/rendering/renderer.js +38 -6
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
package/esm/deno.js
CHANGED
|
@@ -5,6 +5,7 @@ import { type AgentServiceMcpServerConfig } from "../service/mcp-server-config.j
|
|
|
5
5
|
import { type HostedProjectRemoteToolSourceMutationHandler, type HostedProjectRemoteToolSourcePrepareToolInput, type HostedProjectRemoteToolSourceProjectSwitchHandler, type HostedProjectRemoteToolSourceRetryPolicy } from "./project-remote-tool-source.js";
|
|
6
6
|
import { type RuntimeClientProfile } from "../runtime/client-profile.js";
|
|
7
7
|
import { type HostedRuntimeAllowedToolNames } from "./runtime-essential-tools.js";
|
|
8
|
+
import type { HostedSubmittedFormInputResult } from "./chat-runtime-contract.js";
|
|
8
9
|
/** Context for hosted chat runtime tool assembly. */
|
|
9
10
|
export type HostedChatRuntimeToolAssemblyContext = DefaultResearchArtifactContext & {
|
|
10
11
|
authToken: string;
|
|
@@ -15,6 +16,7 @@ export type HostedChatRuntimeToolAssemblyContext = DefaultResearchArtifactContex
|
|
|
15
16
|
availableToolNames?: string[];
|
|
16
17
|
availableSkillIds?: readonly string[];
|
|
17
18
|
userId?: string | null;
|
|
19
|
+
submittedFormInputResult?: HostedSubmittedFormInputResult;
|
|
18
20
|
};
|
|
19
21
|
/** Public API contract for hosted chat runtime allowed tool names. */
|
|
20
22
|
export type HostedChatRuntimeAllowedToolNames = HostedRuntimeAllowedToolNames;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-runtime-tool-assembly.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/chat-runtime-tool-assembly.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,uBAAuB,EAE5B,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,OAAO,EAEZ,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,8BAA8B,EAGpC,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAEL,KAAK,4CAA4C,EACjD,KAAK,6CAA6C,EAClD,KAAK,iDAAiD,EACtD,KAAK,wCAAwC,EAC9C,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAIzE,OAAO,EACL,KAAK,6BAA6B,EAGnC,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-runtime-tool-assembly.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/chat-runtime-tool-assembly.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,16 @@ function activeProjectId(taskContext) {
|
|
|
11
11
|
function activeBranchId(taskContext) {
|
|
12
12
|
return taskContext.branchId ?? null;
|
|
13
13
|
}
|
|
14
|
+
function hasSubmittedFormInputResult(taskContext) {
|
|
15
|
+
return taskContext.submittedFormInputResult !== undefined;
|
|
16
|
+
}
|
|
17
|
+
function filterPostFormInputLocalTools(tools, taskContext) {
|
|
18
|
+
if (!hasSubmittedFormInputResult(taskContext)) {
|
|
19
|
+
return tools;
|
|
20
|
+
}
|
|
21
|
+
const blockedToolNames = new Set(["form_input", "load_skill", "invoke_agent"]);
|
|
22
|
+
return Object.fromEntries(Object.entries(tools).filter(([toolName]) => !blockedToolNames.has(toolName)));
|
|
23
|
+
}
|
|
14
24
|
/** Filter hosted chat runtime local tools. */
|
|
15
25
|
export function filterHostedChatRuntimeLocalTools(input) {
|
|
16
26
|
const allowedToolNames = normalizeHostedRuntimeAllowedToolNames(input.allowedToolNames);
|
|
@@ -25,7 +35,7 @@ export async function prepareHostedChatRuntimeToolAssembly(input) {
|
|
|
25
35
|
availableSkillIds: input.taskContext.availableSkillIds,
|
|
26
36
|
});
|
|
27
37
|
const sortedLocalTools = filterHostedChatRuntimeLocalTools({
|
|
28
|
-
tools: input.localTools,
|
|
38
|
+
tools: filterPostFormInputLocalTools(input.localTools, input.taskContext),
|
|
29
39
|
allowedToolNames,
|
|
30
40
|
});
|
|
31
41
|
const localHostTools = input.traceLocalTools
|
|
@@ -6,6 +6,7 @@ export type HostedRuntimeStateResolverContext = DefaultResearchArtifactContext &
|
|
|
6
6
|
steeringRevision?: number;
|
|
7
7
|
slashCommandArtifactPathSeen?: boolean;
|
|
8
8
|
userId?: string | null;
|
|
9
|
+
submittedFormInputResult?: unknown;
|
|
9
10
|
};
|
|
10
11
|
/** Input payload for hosted runtime state resolver. */
|
|
11
12
|
export type HostedRuntimeStateResolverInput = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-state-resolver.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/runtime-state-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,8BAA8B,EAGpC,MAAM,mDAAmD,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-state-resolver.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/runtime-state-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,8BAA8B,EAGpC,MAAM,mDAAmD,CAAC;AAW3D,iDAAiD;AACjD,MAAM,MAAM,iCAAiC,GAAG,8BAA8B,GAAG;IAC/E,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,uDAAuD;AACvD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,0DAA0D;AAC1D,MAAM,MAAM,gCAAgC,GAAG;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,uDAAuD;AACvD,MAAM,MAAM,+BAA+B,CAAC,QAAQ,SAAS,iCAAiC,IAAI;IAChG,WAAW,EAAE,QAAQ,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,6DAA6D;AAC7D,MAAM,MAAM,0BAA0B,CAAC,QAAQ,SAAS,iCAAiC,IAAI,CAC3F,KAAK,EAAE,+BAA+B,CAAC,QAAQ,CAAC,KAC7C,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAE9B,gEAAgE;AAChE,MAAM,MAAM,uCAAuC,CACjD,QAAQ,SAAS,iCAAiC,IAChD;IACF,WAAW,EAAE,QAAQ,CAAC;IACtB,aAAa,CAAC,EAAE,0BAA0B,CAAC,QAAQ,CAAC,CAAC;CACtD,CAAC;AAcF,4CAA4C;AAC5C,wBAAgB,gCAAgC,CAC9C,QAAQ,SAAS,iCAAiC,EAElD,OAAO,EAAE,uCAAuC,CAAC,QAAQ,CAAC,GACzD,CAAC,KAAK,EAAE,+BAA+B,KAAK,OAAO,CAAC,gCAAgC,CAAC,CAsEvF"}
|
|
@@ -2,6 +2,7 @@ import { extractLatestUserText, updateDefaultResearchArtifacts, } from "../artif
|
|
|
2
2
|
import { addFirstTurnStarterIntentRootOwnershipReminder, addSlashCommandArtifactReminder, evaluateStarterIntentTurnPolicy, FIRST_TURN_STARTER_INTENT_ROOT_OWNERSHIP_CONTEXT_KEY, } from "../conversation/delegation-policy.js";
|
|
3
3
|
import { evaluateSlashCommandArtifactPolicy } from "../artifacts/slash-command-artifact-policy.js";
|
|
4
4
|
import { flattenSystemInstructions } from "../runtime/tool-inventory.js";
|
|
5
|
+
import { SUBMITTED_FORM_INPUT_CONTEXT_KEY } from "../runtime/skill-policy-enforcement.js";
|
|
5
6
|
function activeProjectId(context) {
|
|
6
7
|
return context.projectId ?? null;
|
|
7
8
|
}
|
|
@@ -25,6 +26,9 @@ export function createHostedRuntimeStateResolver(options) {
|
|
|
25
26
|
currentBranchId !== lastAppliedBranchId;
|
|
26
27
|
let nextSystem = system;
|
|
27
28
|
const nextContextRecord = { ...(context ?? {}) };
|
|
29
|
+
if (options.taskContext.submittedFormInputResult) {
|
|
30
|
+
nextContextRecord[SUBMITTED_FORM_INPUT_CONTEXT_KEY] = true;
|
|
31
|
+
}
|
|
28
32
|
if (steeringChanged && options.refreshSystem) {
|
|
29
33
|
nextSystem = await options.refreshSystem({
|
|
30
34
|
taskContext: options.taskContext,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runtime-step.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/agent-runtime-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-runtime-step.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/agent-runtime-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEzD,MAAM,MAAM,qBAAqB,GAAG,CAClC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,SAAS,EAC/D,OAAO,CAAC,EAAE;IACR,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,8BAA8B,CAAC,EAAE,cAAc,EAAE,CAAC;IAClD,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,iBAAiB,CAAC,EAAE,oBAAoB,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,KACE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;AAE/B,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,MAAM,wBAAwB,GAAG,CACrC,QAAQ,EAAE,OAAO,EAAE,EACnB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACnD,IAAI,EAAE,oBAAoB,EAC1B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,sBAAsB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7C,MAAM,EAAE,WAAW,CAAC;IACpB,8BAA8B,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IAC7D,iBAAiB,EAAE,qBAAqB,CAAC;IACzC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,iBAAiB,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAClD,mBAAmB,EAAE,wBAAwB,CAAC;IAC9C,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,oBAAoB,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,oBAAoB,CAAC;IAClC,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,0EAA0E;AAC1E,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,wBAAwB,CAAC,CA8BnC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { filterToolsForSkill } from "../../skill/allowed-tools.js";
|
|
2
|
+
import { filterToolsAfterSubmittedFormInput } from "./skill-policy-enforcement.js";
|
|
2
3
|
/** Resolve per-step runtime state and the tools visible for that step. */
|
|
3
4
|
export async function prepareAgentRuntimeStep(input) {
|
|
4
5
|
const runtimeState = await input.resolveRuntimeState(input.messages, input.runtimeContext, input.mode, input.step, input.systemPrompt);
|
|
@@ -14,6 +15,7 @@ export async function prepareAgentRuntimeStep(input) {
|
|
|
14
15
|
if (input.activeSkillPolicy) {
|
|
15
16
|
tools = filterToolsForSkill(tools, input.activeSkillPolicy);
|
|
16
17
|
}
|
|
18
|
+
tools = filterToolsAfterSubmittedFormInput(tools, input.messages, runtimeState.context);
|
|
17
19
|
return {
|
|
18
20
|
runtimeContext: runtimeState.context,
|
|
19
21
|
systemPrompt: runtimeState.systemPrompt,
|
|
@@ -30,6 +30,10 @@ export interface ChatStreamState {
|
|
|
30
30
|
finishReason: string | null;
|
|
31
31
|
toolCalls: Map<string, StreamingToolCall>;
|
|
32
32
|
toolResults: StreamingToolResult[];
|
|
33
|
+
suppressedToolCalls: {
|
|
34
|
+
id: string;
|
|
35
|
+
name: string;
|
|
36
|
+
}[];
|
|
33
37
|
usage: {
|
|
34
38
|
promptTokens: number;
|
|
35
39
|
completionTokens: number;
|
|
@@ -52,6 +56,7 @@ export interface ChatStreamCallbacks {
|
|
|
52
56
|
reasoningTokens?: number;
|
|
53
57
|
}) => void;
|
|
54
58
|
providerExecutedToolNames?: readonly string[];
|
|
59
|
+
availableToolNames?: readonly string[];
|
|
55
60
|
localToolInputIdleTimeoutMs?: number;
|
|
56
61
|
streamIdleTimeoutMs?: number;
|
|
57
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AA0BtF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,sBAAsB,EAAE,CAAC;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,KAAK,IAAI,CAAC;IACX,yBAAyB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAuBD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAevE;AAmKD,wBAAgB,iBAAiB,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -180,6 +180,7 @@ export function createStreamState() {
|
|
|
180
180
|
finishReason: null,
|
|
181
181
|
toolCalls: new Map(),
|
|
182
182
|
toolResults: [],
|
|
183
|
+
suppressedToolCalls: [],
|
|
183
184
|
usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
|
|
184
185
|
};
|
|
185
186
|
}
|
|
@@ -202,6 +203,18 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
202
203
|
let shouldStopForCommittedLocalToolCall = false;
|
|
203
204
|
let hasActiveLocalToolInput = false;
|
|
204
205
|
const providerExecutedToolNames = new Set(callbacks?.providerExecutedToolNames ?? []);
|
|
206
|
+
const availableToolNames = callbacks?.availableToolNames
|
|
207
|
+
? new Set(callbacks.availableToolNames)
|
|
208
|
+
: null;
|
|
209
|
+
const suppressedToolCallIds = new Set();
|
|
210
|
+
const isUnavailableTool = (toolName) => availableToolNames !== null && !availableToolNames.has(toolName);
|
|
211
|
+
const suppressToolCall = (toolCallId, toolName) => {
|
|
212
|
+
if (!toolCallId || suppressedToolCallIds.has(toolCallId)) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
suppressedToolCallIds.add(toolCallId);
|
|
216
|
+
state.suppressedToolCalls.push({ id: toolCallId, name: toolName });
|
|
217
|
+
};
|
|
205
218
|
const resolveProviderExecuted = (toolName, providerExecuted) => providerExecuted ?? (providerExecutedToolNames.has(toolName) ? true : undefined);
|
|
206
219
|
const normalizeReasoningId = (part) => typeof part.id === "string" && part.id.length > 0 ? part.id : "reasoning";
|
|
207
220
|
const openTextSegment = () => {
|
|
@@ -467,6 +480,11 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
467
480
|
closeReasoningSegment();
|
|
468
481
|
shouldStopForCommittedLocalToolCall = false;
|
|
469
482
|
const toolId = typedPart.id;
|
|
483
|
+
if (isUnavailableTool(typedPart.toolName)) {
|
|
484
|
+
suppressToolCall(toolId, typedPart.toolName);
|
|
485
|
+
hasActiveLocalToolInput = false;
|
|
486
|
+
break;
|
|
487
|
+
}
|
|
470
488
|
const providerExecuted = resolveProviderExecuted(typedPart.toolName, typedPart.providerExecuted);
|
|
471
489
|
hasActiveLocalToolInput = providerExecuted !== true;
|
|
472
490
|
state.toolCalls.set(toolId, {
|
|
@@ -484,6 +502,8 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
484
502
|
case "tool-input-delta": {
|
|
485
503
|
closeReasoningSegment();
|
|
486
504
|
const toolId = typedPart.id;
|
|
505
|
+
if (suppressedToolCallIds.has(toolId))
|
|
506
|
+
break;
|
|
487
507
|
const tc = state.toolCalls.get(toolId);
|
|
488
508
|
if (!tc)
|
|
489
509
|
break;
|
|
@@ -496,6 +516,10 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
496
516
|
closeTextSegment();
|
|
497
517
|
closeReasoningSegment();
|
|
498
518
|
const toolId = typedPart.id;
|
|
519
|
+
if (suppressedToolCallIds.has(toolId)) {
|
|
520
|
+
hasActiveLocalToolInput = false;
|
|
521
|
+
break;
|
|
522
|
+
}
|
|
499
523
|
const tc = state.toolCalls.get(toolId);
|
|
500
524
|
if (!tc)
|
|
501
525
|
break;
|
|
@@ -526,6 +550,11 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
526
550
|
if (!toolId) {
|
|
527
551
|
break;
|
|
528
552
|
}
|
|
553
|
+
if (isUnavailableTool(typedPart.toolName)) {
|
|
554
|
+
suppressToolCall(toolId, typedPart.toolName);
|
|
555
|
+
hasActiveLocalToolInput = false;
|
|
556
|
+
break;
|
|
557
|
+
}
|
|
529
558
|
const providerExecuted = resolveProviderExecuted(typedPart.toolName, typedPart.providerExecuted);
|
|
530
559
|
hasActiveLocalToolInput = false;
|
|
531
560
|
const inputStr = normalizeToolInputString(typedPart.input);
|
|
@@ -562,6 +591,11 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
562
591
|
closeReasoningSegment();
|
|
563
592
|
// tool-call fires when the full tool call is available
|
|
564
593
|
const toolId = typedPart.toolCallId;
|
|
594
|
+
if (isUnavailableTool(typedPart.toolName)) {
|
|
595
|
+
suppressToolCall(toolId, typedPart.toolName);
|
|
596
|
+
hasActiveLocalToolInput = false;
|
|
597
|
+
break;
|
|
598
|
+
}
|
|
565
599
|
const providerExecuted = resolveProviderExecuted(typedPart.toolName, typedPart.providerExecuted);
|
|
566
600
|
hasActiveLocalToolInput = false;
|
|
567
601
|
const inputStr = normalizeToolInputString(typedPart.input);
|
|
@@ -601,6 +635,11 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
601
635
|
case "tool-result": {
|
|
602
636
|
closeTextSegment();
|
|
603
637
|
closeReasoningSegment();
|
|
638
|
+
if (suppressedToolCallIds.has(typedPart.toolCallId) ||
|
|
639
|
+
isUnavailableTool(typedPart.toolName)) {
|
|
640
|
+
suppressToolCall(typedPart.toolCallId, typedPart.toolName);
|
|
641
|
+
break;
|
|
642
|
+
}
|
|
604
643
|
const providerExecuted = resolveProviderExecuted(typedPart.toolName, typedPart.providerExecuted);
|
|
605
644
|
ensureToolLifecycle({
|
|
606
645
|
toolCallId: typedPart.toolCallId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,aAAa,EAGlB,KAAK,OAAO,EAGZ,KAAK,QAAQ,EAGd,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAqB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ import { tryGetCacheKeyContext } from "../../cache/cache-key-builder.js";
|
|
|
27
27
|
import { isLocalModelRuntime } from "../../provider/runtime-inspection.js";
|
|
28
28
|
import { generateText, streamText } from "../../runtime/runtime-bridge.js";
|
|
29
29
|
import { captureStreamedToolCallInput, collectFinalStreamToolResults, collectGeneratedToolResults, createToolErrorMessage, createToolResultMessage, getProviderExecutedToolNames, getToolResultError, isRecoverablePlaceholderToolCall, isStreamedToolCallIncomplete, materializeStreamedToolCall, shouldContinueAfterStreamStep, } from "./tool-result-continuation.js";
|
|
30
|
-
import { enforceSkillPolicy, extractSkillId, extractSkillPolicy, hasSubmittedFormInputResult, hydrateActiveSkillStateFromMessages, LOAD_SKILL_TOOL_ID, removeFormInputAfterSubmission, } from "./skill-policy-enforcement.js";
|
|
30
|
+
import { enforceSkillPolicy, extractSkillId, extractSkillPolicy, FORM_INPUT_TOOL_ID, hasSubmittedFormInputResult, hydrateActiveSkillStateFromMessages, LOAD_SKILL_TOOL_ID, removeFormInputAfterSubmission, SUBMITTED_FORM_INPUT_CONTEXT_KEY, } from "./skill-policy-enforcement.js";
|
|
31
31
|
import { getRuntimeAllowedRemoteTools, getRuntimeForwardedIntegrationToolDefs, getRuntimeProviderTools, } from "./runtime-tool-config.js";
|
|
32
32
|
import { prepareAgentRuntimeStep } from "./agent-runtime-step.js";
|
|
33
33
|
import { buildStreamedAssistantMessage } from "./streamed-assistant-message.js";
|
|
@@ -51,6 +51,33 @@ import { supportsTemperatureParameter } from "./model-capabilities.js";
|
|
|
51
51
|
import { applySkillDelegationOverridesToToolInput, extractSkillDelegationOverrides, } from "./skill-delegation-overrides.js";
|
|
52
52
|
import { resolveAgentModelTransport } from "./model-transport.js";
|
|
53
53
|
const logger = serverLogger.component("agent");
|
|
54
|
+
function parseToolResultJson(result) {
|
|
55
|
+
try {
|
|
56
|
+
return JSON.parse(result);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function containsSubmittedFormInputExecutionResult(result, depth = 0) {
|
|
63
|
+
const normalized = typeof result === "string" ? parseToolResultJson(result) : result;
|
|
64
|
+
if (!normalized || typeof normalized !== "object" || depth > 3) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (normalized.submitted === true) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
return Object.values(normalized).some((value) => containsSubmittedFormInputExecutionResult(value, depth + 1));
|
|
71
|
+
}
|
|
72
|
+
function isSubmittedFormInputExecutionResult(toolName, result) {
|
|
73
|
+
return toolName === FORM_INPUT_TOOL_ID && containsSubmittedFormInputExecutionResult(result);
|
|
74
|
+
}
|
|
75
|
+
function markSubmittedFormInputRuntimeContext(runtimeContext) {
|
|
76
|
+
return {
|
|
77
|
+
...(runtimeContext ?? {}),
|
|
78
|
+
[SUBMITTED_FORM_INPUT_CONTEXT_KEY]: true,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
54
81
|
function isAbortError(error, abortSignal) {
|
|
55
82
|
if (abortSignal?.aborted && error === abortSignal.reason) {
|
|
56
83
|
return true;
|
|
@@ -300,6 +327,8 @@ export class AgentRuntime {
|
|
|
300
327
|
let activeSkillId = hydratedSkillState.activeSkillId;
|
|
301
328
|
let activeSkillPolicy = hydratedSkillState.activeSkillPolicy;
|
|
302
329
|
let activeSkillDelegationOverrides = hydratedSkillState.activeSkillDelegationOverrides;
|
|
330
|
+
const hasSubmittedFormInputInLoop = hasSubmittedFormInputResult(currentMessages) ||
|
|
331
|
+
runtimeContext?.[SUBMITTED_FORM_INPUT_CONTEXT_KEY] === true;
|
|
303
332
|
const allowedRemoteToolNames = getRuntimeAllowedRemoteTools(this.config);
|
|
304
333
|
const providerTools = getRuntimeProviderTools(this.config);
|
|
305
334
|
const forwardedRemoteToolDefinitions = getRuntimeForwardedIntegrationToolDefs(this.config);
|
|
@@ -309,6 +338,9 @@ export class AgentRuntime {
|
|
|
309
338
|
for (let step = 0; step < maxSteps; step++) {
|
|
310
339
|
this.status = "thinking";
|
|
311
340
|
addSpanEvent(loopSpan, "step_start", { step });
|
|
341
|
+
const stepRuntimeContext = hasSubmittedFormInputInLoop
|
|
342
|
+
? markSubmittedFormInputRuntimeContext(currentRuntimeContext)
|
|
343
|
+
: currentRuntimeContext;
|
|
312
344
|
const preparedStep = await prepareAgentRuntimeStep({
|
|
313
345
|
agentId: this.id,
|
|
314
346
|
activeSkillPolicy,
|
|
@@ -321,7 +353,7 @@ export class AgentRuntime {
|
|
|
321
353
|
mode: "generate",
|
|
322
354
|
remoteToolSources,
|
|
323
355
|
resolveRuntimeState: this.resolveRuntimeState.bind(this),
|
|
324
|
-
runtimeContext:
|
|
356
|
+
runtimeContext: stepRuntimeContext,
|
|
325
357
|
step,
|
|
326
358
|
systemPrompt: currentSystemPrompt,
|
|
327
359
|
toolContextBase,
|
|
@@ -433,7 +465,7 @@ export class AgentRuntime {
|
|
|
433
465
|
return;
|
|
434
466
|
}
|
|
435
467
|
const policyCheck = enforceSkillPolicy(tc.toolName, activeSkillPolicy, mustLoadSkillFirst, {
|
|
436
|
-
|
|
468
|
+
hasSubmittedFormInput: hasSubmittedFormInputInLoop,
|
|
437
469
|
});
|
|
438
470
|
if (!policyCheck.allowed) {
|
|
439
471
|
toolCall.status = "error";
|
|
@@ -539,6 +571,8 @@ export class AgentRuntime {
|
|
|
539
571
|
let activeSkillId = hydratedSkillState.activeSkillId;
|
|
540
572
|
let activeSkillPolicy = hydratedSkillState.activeSkillPolicy;
|
|
541
573
|
let activeSkillDelegationOverrides = hydratedSkillState.activeSkillDelegationOverrides;
|
|
574
|
+
let hasSubmittedFormInputInLoop = hasSubmittedFormInputResult(currentMessages) ||
|
|
575
|
+
runtimeContext?.[SUBMITTED_FORM_INPUT_CONTEXT_KEY] === true;
|
|
542
576
|
let finalFinishReason;
|
|
543
577
|
let latestAssistantText = "";
|
|
544
578
|
const allowedRemoteToolNames = getRuntimeAllowedRemoteTools(this.config);
|
|
@@ -547,10 +581,14 @@ export class AgentRuntime {
|
|
|
547
581
|
const remoteToolSources = getRuntimeRemoteToolSources(this.config);
|
|
548
582
|
let currentSystemPrompt = systemPrompt;
|
|
549
583
|
let currentRuntimeContext = runtimeContext;
|
|
584
|
+
let toolsDisabledForFinalResponse = false;
|
|
550
585
|
for (let step = 0; step < maxSteps; step++) {
|
|
551
586
|
throwIfAborted(abortSignal);
|
|
552
587
|
sendSSE(controller, encoder, { type: "step-start" });
|
|
553
588
|
const currentStepToolResults = new Map();
|
|
589
|
+
const stepRuntimeContext = hasSubmittedFormInputInLoop
|
|
590
|
+
? markSubmittedFormInputRuntimeContext(currentRuntimeContext)
|
|
591
|
+
: currentRuntimeContext;
|
|
554
592
|
const preparedStep = await prepareAgentRuntimeStep({
|
|
555
593
|
agentId: this.id,
|
|
556
594
|
activeSkillPolicy,
|
|
@@ -563,7 +601,7 @@ export class AgentRuntime {
|
|
|
563
601
|
mode: "stream",
|
|
564
602
|
remoteToolSources,
|
|
565
603
|
resolveRuntimeState: this.resolveRuntimeState.bind(this),
|
|
566
|
-
runtimeContext:
|
|
604
|
+
runtimeContext: stepRuntimeContext,
|
|
567
605
|
step,
|
|
568
606
|
systemPrompt: currentSystemPrompt,
|
|
569
607
|
toolContextBase,
|
|
@@ -571,11 +609,12 @@ export class AgentRuntime {
|
|
|
571
609
|
currentSystemPrompt = preparedStep.systemPrompt;
|
|
572
610
|
currentRuntimeContext = preparedStep.runtimeContext;
|
|
573
611
|
const toolContext = preparedStep.toolContext;
|
|
574
|
-
const tools = preparedStep.tools;
|
|
612
|
+
const tools = toolsDisabledForFinalResponse ? [] : preparedStep.tools;
|
|
575
613
|
const runtimeTools = convertToolsToRuntimeTools(tools, {
|
|
576
614
|
model: effectiveModel,
|
|
577
615
|
providerTools,
|
|
578
616
|
});
|
|
617
|
+
const runtimeToolNames = Object.keys(runtimeTools ?? {});
|
|
579
618
|
const temperature = this.resolveTemperature(temperatureModelString ?? effectiveModel);
|
|
580
619
|
const result = streamText({
|
|
581
620
|
model: languageModel,
|
|
@@ -594,6 +633,7 @@ export class AgentRuntime {
|
|
|
594
633
|
onChunk: callbacks?.onChunk,
|
|
595
634
|
onUsage: (usage) => accumulateUsage(totalUsage, usage),
|
|
596
635
|
providerExecutedToolNames: getProviderExecutedToolNames(runtimeTools),
|
|
636
|
+
availableToolNames: runtimeToolNames,
|
|
597
637
|
}, abortSignal);
|
|
598
638
|
throwIfAborted(abortSignal);
|
|
599
639
|
finalFinishReason = state.finishReason ?? finalFinishReason;
|
|
@@ -643,6 +683,20 @@ export class AgentRuntime {
|
|
|
643
683
|
latestAssistantText = getTextFromParts(assistantMessage.parts);
|
|
644
684
|
currentMessages.push(assistantMessage);
|
|
645
685
|
await this.memory.add(assistantMessage);
|
|
686
|
+
if (state.suppressedToolCalls.length > 0) {
|
|
687
|
+
const unavailableNames = [
|
|
688
|
+
...new Set(state.suppressedToolCalls.map((toolCall) => toolCall.name)),
|
|
689
|
+
];
|
|
690
|
+
currentMessages.push({
|
|
691
|
+
id: `runtime_note_${Date.now()}_${step}`,
|
|
692
|
+
role: "system",
|
|
693
|
+
parts: [{
|
|
694
|
+
type: "text",
|
|
695
|
+
text: `Runtime recovery: ignored unavailable tool call(s): ${unavailableNames.join(", ")}. Continue using only currently available tools: ${runtimeToolNames.join(", ")}.`,
|
|
696
|
+
}],
|
|
697
|
+
timestamp: Date.now(),
|
|
698
|
+
});
|
|
699
|
+
}
|
|
646
700
|
const finalToolResults = collectFinalStreamToolResults(state);
|
|
647
701
|
const persistToolResult = async (toolResult) => {
|
|
648
702
|
if (currentStepToolResults.has(toolResult.toolCallId)) {
|
|
@@ -711,6 +765,22 @@ export class AgentRuntime {
|
|
|
711
765
|
? undefined
|
|
712
766
|
: stringifyToolError(matchingResult.error);
|
|
713
767
|
toolCalls.push(toolCall);
|
|
768
|
+
if (matchingResult.error === undefined) {
|
|
769
|
+
if (tc.name === LOAD_SKILL_TOOL_ID) {
|
|
770
|
+
activeSkillId = extractSkillId(matchingResult.output);
|
|
771
|
+
activeSkillPolicy = extractSkillPolicy(matchingResult.output);
|
|
772
|
+
activeSkillDelegationOverrides = extractSkillDelegationOverrides(matchingResult.output);
|
|
773
|
+
mustLoadSkillFirst = false;
|
|
774
|
+
}
|
|
775
|
+
activeSkillPolicy = removeFormInputAfterSubmission(tc.name, matchingResult.output, activeSkillId, activeSkillPolicy);
|
|
776
|
+
if (isSubmittedFormInputExecutionResult(tc.name, matchingResult.output)) {
|
|
777
|
+
hasSubmittedFormInputInLoop = true;
|
|
778
|
+
currentRuntimeContext = markSubmittedFormInputRuntimeContext(currentRuntimeContext);
|
|
779
|
+
}
|
|
780
|
+
if (tc.name === "create_agent") {
|
|
781
|
+
toolsDisabledForFinalResponse = true;
|
|
782
|
+
}
|
|
783
|
+
}
|
|
714
784
|
continue;
|
|
715
785
|
}
|
|
716
786
|
if (persistedResult) {
|
|
@@ -719,6 +789,22 @@ export class AgentRuntime {
|
|
|
719
789
|
toolCall.result = persistedResult.result;
|
|
720
790
|
toolCall.error = persistedError;
|
|
721
791
|
toolCalls.push(toolCall);
|
|
792
|
+
if (persistedError === undefined) {
|
|
793
|
+
if (tc.name === LOAD_SKILL_TOOL_ID) {
|
|
794
|
+
activeSkillId = extractSkillId(persistedResult.result);
|
|
795
|
+
activeSkillPolicy = extractSkillPolicy(persistedResult.result);
|
|
796
|
+
activeSkillDelegationOverrides = extractSkillDelegationOverrides(persistedResult.result);
|
|
797
|
+
mustLoadSkillFirst = false;
|
|
798
|
+
}
|
|
799
|
+
activeSkillPolicy = removeFormInputAfterSubmission(tc.name, persistedResult.result, activeSkillId, activeSkillPolicy);
|
|
800
|
+
if (isSubmittedFormInputExecutionResult(tc.name, persistedResult.result)) {
|
|
801
|
+
hasSubmittedFormInputInLoop = true;
|
|
802
|
+
currentRuntimeContext = markSubmittedFormInputRuntimeContext(currentRuntimeContext);
|
|
803
|
+
}
|
|
804
|
+
if (tc.name === "create_agent") {
|
|
805
|
+
toolsDisabledForFinalResponse = true;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
722
808
|
continue;
|
|
723
809
|
}
|
|
724
810
|
if (tc.providerExecuted === true) {
|
|
@@ -742,7 +828,7 @@ export class AgentRuntime {
|
|
|
742
828
|
continue;
|
|
743
829
|
}
|
|
744
830
|
const policyCheck = enforceSkillPolicy(tc.name, activeSkillPolicy, mustLoadSkillFirst, {
|
|
745
|
-
|
|
831
|
+
hasSubmittedFormInput: hasSubmittedFormInputInLoop,
|
|
746
832
|
});
|
|
747
833
|
if (!policyCheck.allowed) {
|
|
748
834
|
await this.recordToolError(toolCall, policyCheck.error, controller, encoder, currentMessages, toolCalls);
|
|
@@ -782,6 +868,13 @@ export class AgentRuntime {
|
|
|
782
868
|
mustLoadSkillFirst = false;
|
|
783
869
|
}
|
|
784
870
|
activeSkillPolicy = removeFormInputAfterSubmission(tc.name, result, activeSkillId, activeSkillPolicy);
|
|
871
|
+
if (isSubmittedFormInputExecutionResult(tc.name, result)) {
|
|
872
|
+
hasSubmittedFormInputInLoop = true;
|
|
873
|
+
currentRuntimeContext = markSubmittedFormInputRuntimeContext(currentRuntimeContext);
|
|
874
|
+
}
|
|
875
|
+
if (tc.name === "create_agent") {
|
|
876
|
+
toolsDisabledForFinalResponse = true;
|
|
877
|
+
}
|
|
785
878
|
const dynamic = isDynamicTool(tc.name);
|
|
786
879
|
sendSSE(controller, encoder, {
|
|
787
880
|
type: "tool-output-available",
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { Message } from "../types.js";
|
|
2
|
+
import type { ToolDefinition } from "../../tool/index.js";
|
|
2
3
|
import { type SkillDelegationOverrides } from "./skill-delegation-overrides.js";
|
|
3
4
|
export declare const LOAD_SKILL_TOOL_ID = "load_skill";
|
|
4
5
|
export declare const FORM_INPUT_TOOL_ID = "form_input";
|
|
6
|
+
export declare const INVOKE_AGENT_TOOL_ID = "invoke_agent";
|
|
7
|
+
export declare const SUBMITTED_FORM_INPUT_CONTEXT_KEY = "hasSubmittedFormInputResult";
|
|
5
8
|
export declare function hydrateActiveSkillStateFromMessages(messages: readonly Message[]): {
|
|
6
9
|
activeSkillId: string | undefined;
|
|
7
10
|
activeSkillPolicy: string[] | undefined;
|
|
@@ -10,6 +13,7 @@ export declare function hydrateActiveSkillStateFromMessages(messages: readonly M
|
|
|
10
13
|
export declare function extractSkillId(result: unknown): string | undefined;
|
|
11
14
|
export declare function extractSkillPolicy(result: unknown): string[] | undefined;
|
|
12
15
|
export declare function hasSubmittedFormInputResult(messages: readonly Message[]): boolean;
|
|
16
|
+
export declare function filterToolsAfterSubmittedFormInput(tools: readonly ToolDefinition[], messages: readonly Message[], runtimeContext?: Record<string, unknown>): ToolDefinition[];
|
|
13
17
|
export declare function removeFormInputAfterSubmission(toolName: string, result: unknown, activeSkillId: string | undefined, activeSkillPolicy: string[] | undefined): string[] | undefined;
|
|
14
18
|
export declare function narrowPolicyAfterSubmittedForm(activeSkillId: string | undefined, activeSkillPolicy: string[] | undefined): string[] | undefined;
|
|
15
19
|
export type SkillPolicyResult = {
|
|
@@ -19,7 +23,7 @@ export type SkillPolicyResult = {
|
|
|
19
23
|
error: string;
|
|
20
24
|
};
|
|
21
25
|
export type SkillPolicyOptions = {
|
|
22
|
-
|
|
26
|
+
hasSubmittedFormInput?: boolean;
|
|
23
27
|
};
|
|
24
28
|
export declare function enforceSkillPolicy(toolName: string, activeSkillPolicy: string[] | undefined, mustLoadSkillFirst: boolean, options?: SkillPolicyOptions): SkillPolicyResult;
|
|
25
29
|
//# sourceMappingURL=skill-policy-enforcement.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-policy-enforcement.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/skill-policy-enforcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-policy-enforcement.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/skill-policy-enforcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AACnD,eAAO,MAAM,gCAAgC,gCAAgC,CAAC;AAa9E,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC3B;IACD,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,8BAA8B,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACtE,CAeA;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAyBxE;AA2BD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAQjF;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,cAAc,EAAE,CAQlB;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAStB;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAoCtB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,EACvC,kBAAkB,EAAE,OAAO,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CA0BnB"}
|
|
@@ -5,6 +5,13 @@ import { extractSkillDelegationOverrides, } from "./skill-delegation-overrides.j
|
|
|
5
5
|
const logger = serverLogger.component("agent");
|
|
6
6
|
export const LOAD_SKILL_TOOL_ID = "load_skill";
|
|
7
7
|
export const FORM_INPUT_TOOL_ID = "form_input";
|
|
8
|
+
export const INVOKE_AGENT_TOOL_ID = "invoke_agent";
|
|
9
|
+
export const SUBMITTED_FORM_INPUT_CONTEXT_KEY = "hasSubmittedFormInputResult";
|
|
10
|
+
const POST_SUBMITTED_FORM_INPUT_BLOCKED_TOOL_IDS = new Set([
|
|
11
|
+
FORM_INPUT_TOOL_ID,
|
|
12
|
+
LOAD_SKILL_TOOL_ID,
|
|
13
|
+
INVOKE_AGENT_TOOL_ID,
|
|
14
|
+
]);
|
|
8
15
|
function getSkillActivationRequiredError(toolName) {
|
|
9
16
|
return `Tool "${toolName}" cannot run before load_skill succeeds in the same step. ` +
|
|
10
17
|
`Call "${LOAD_SKILL_TOOL_ID}" first to establish the active skill context.`;
|
|
@@ -50,15 +57,40 @@ export function extractSkillPolicy(result) {
|
|
|
50
57
|
return [];
|
|
51
58
|
}
|
|
52
59
|
}
|
|
60
|
+
function parseToolResultJson(result) {
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(result);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function containsSubmittedFormInputResult(result, depth = 0) {
|
|
69
|
+
const normalized = typeof result === "string" ? parseToolResultJson(result) : result;
|
|
70
|
+
if (!normalized || typeof normalized !== "object" || depth > 3) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
if (normalized.submitted === true) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
return Object.values(normalized).some((value) => containsSubmittedFormInputResult(value, depth + 1));
|
|
77
|
+
}
|
|
53
78
|
function isSubmittedFormInputResult(result) {
|
|
54
|
-
return
|
|
55
|
-
result.submitted === true;
|
|
79
|
+
return containsSubmittedFormInputResult(result);
|
|
56
80
|
}
|
|
57
81
|
export function hasSubmittedFormInputResult(messages) {
|
|
58
82
|
return messages.some((message) => message.parts.some((part) => isToolResultPart(part) &&
|
|
59
83
|
part.toolName === FORM_INPUT_TOOL_ID &&
|
|
60
84
|
isSubmittedFormInputResult(part.result)));
|
|
61
85
|
}
|
|
86
|
+
export function filterToolsAfterSubmittedFormInput(tools, messages, runtimeContext) {
|
|
87
|
+
const hasSubmittedFormInput = hasSubmittedFormInputResult(messages) ||
|
|
88
|
+
runtimeContext?.[SUBMITTED_FORM_INPUT_CONTEXT_KEY] === true;
|
|
89
|
+
if (!hasSubmittedFormInput) {
|
|
90
|
+
return [...tools];
|
|
91
|
+
}
|
|
92
|
+
return tools.filter((tool) => !POST_SUBMITTED_FORM_INPUT_BLOCKED_TOOL_IDS.has(tool.name));
|
|
93
|
+
}
|
|
62
94
|
export function removeFormInputAfterSubmission(toolName, result, activeSkillId, activeSkillPolicy) {
|
|
63
95
|
if (toolName !== FORM_INPUT_TOOL_ID || !isSubmittedFormInputResult(result) ||
|
|
64
96
|
activeSkillPolicy === undefined) {
|
|
@@ -98,9 +130,12 @@ export function enforceSkillPolicy(toolName, activeSkillPolicy, mustLoadSkillFir
|
|
|
98
130
|
if (mustLoadSkillFirst && toolName !== LOAD_SKILL_TOOL_ID) {
|
|
99
131
|
return { allowed: false, error: getSkillActivationRequiredError(toolName) };
|
|
100
132
|
}
|
|
101
|
-
if (
|
|
102
|
-
|
|
103
|
-
return {
|
|
133
|
+
if (options.hasSubmittedFormInput === true &&
|
|
134
|
+
POST_SUBMITTED_FORM_INPUT_BLOCKED_TOOL_IDS.has(toolName)) {
|
|
135
|
+
return {
|
|
136
|
+
allowed: false,
|
|
137
|
+
error: `Tool "${toolName}" cannot run after a submitted form_input result exists. Continue with the submitted values.`,
|
|
138
|
+
};
|
|
104
139
|
}
|
|
105
140
|
if (activeSkillPolicy && !isToolAllowedBySkill(toolName, activeSkillPolicy)) {
|
|
106
141
|
return {
|
|
@@ -8,7 +8,7 @@ export declare function getProviderExecutedToolNames(runtimeTools: RuntimeToolSe
|
|
|
8
8
|
export declare function collectFinalStreamToolResults(state: Pick<ChatStreamState, "toolResults">): Map<string, StreamingToolResult>;
|
|
9
9
|
export declare function collectPersistedToolResults(messages: Message[]): Map<string, ToolResultPart>;
|
|
10
10
|
export declare function collectGeneratedToolResults(toolResults: RuntimeGenerateToolResult[] | undefined): Map<string, RuntimeGenerateToolResult>;
|
|
11
|
-
export declare function shouldContinueAfterStreamStep(state: Pick<ChatStreamState, "accumulatedText" | "finishReason" | "toolCalls" | "toolResults">): boolean;
|
|
11
|
+
export declare function shouldContinueAfterStreamStep(state: Pick<ChatStreamState, "accumulatedText" | "finishReason" | "toolCalls" | "toolResults"> & Partial<Pick<ChatStreamState, "suppressedToolCalls">>): boolean;
|
|
12
12
|
export declare function captureStreamedToolCallInput(toolCall: Pick<StreamingToolCall, "arguments">): {
|
|
13
13
|
args: Record<string, unknown>;
|
|
14
14
|
inputText?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-result-continuation.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/tool-result-continuation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAK,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAMtE;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,gBAAgB,UAAQ,GACvB,OAAO,CAeT;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAcT;AAED,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,EAAE,CAiB/F;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAC1C,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAYlC;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,OAAO,EAAE,GAClB,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAkB7B;AAED,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,yBAAyB,EAAE,GAAG,SAAS,GACnD,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAQxC;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,
|
|
1
|
+
{"version":3,"file":"tool-result-continuation.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/tool-result-continuation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAK,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAMtE;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,gBAAgB,UAAQ,GACvB,OAAO,CAeT;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAcT;AAED,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,EAAE,CAiB/F;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAC1C,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAYlC;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,OAAO,EAAE,GAClB,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAkB7B;AAED,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,yBAAyB,EAAE,GAAG,SAAS,GACnD,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAQxC;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EACD,IAAI,CAAC,eAAe,EAAE,iBAAiB,GAAG,cAAc,GAAG,WAAW,GAAG,aAAa,CAAC,GACvF,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC,GACxD,OAAO,CAqET;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,GAC7C;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAOA;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,GAClD,OAAO,CAET;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,GAAG,WAAW,CAAC,GAChE,OAAO,CAMT;AAED,MAAM,MAAM,+BAA+B,GACvC;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GACzD;IACA,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;CAC1C,CAAC;AAEJ,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,iBAAiB,GACpB,+BAA+B,CAoCjC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,cAAc,CAE1E"}
|
|
@@ -86,7 +86,7 @@ export function collectGeneratedToolResults(toolResults) {
|
|
|
86
86
|
}
|
|
87
87
|
export function shouldContinueAfterStreamStep(state) {
|
|
88
88
|
if (!state.toolCalls.size) {
|
|
89
|
-
return
|
|
89
|
+
return state.finishReason === "tool-calls" && Boolean(state.suppressedToolCalls?.length);
|
|
90
90
|
}
|
|
91
91
|
const streamedToolCalls = Array.from(state.toolCalls.values());
|
|
92
92
|
const hasIncompleteToolCall = streamedToolCalls.some(isStreamedToolCallIncomplete);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-store.d.ts","sourceRoot":"","sources":["../../../../../src/src/rendering/cache/stores/api-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAY7E,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAwBD,qBAAa,aAAc,YAAW,UAAU;IAC9C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,kBAAkB,CAAsC;IAChE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,GAAE,oBAAyB;IAa9C,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,WAAW;IAqBb,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAsBnD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"api-store.d.ts","sourceRoot":"","sources":["../../../../../src/src/rendering/cache/stores/api-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAY7E,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAwBD,qBAAa,aAAc,YAAW,UAAU;IAC9C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,kBAAkB,CAAsC;IAChE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,GAAE,oBAAyB;IAa9C,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,WAAW;IAqBb,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAsBnD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,QAAQ,IAAI,eAAe;CAG5B"}
|
|
@@ -111,15 +111,13 @@ export class APICacheStore {
|
|
|
111
111
|
if (value.result.stream)
|
|
112
112
|
return;
|
|
113
113
|
await this.localCache?.set(key, value);
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
})();
|
|
114
|
+
try {
|
|
115
|
+
const backend = await this.getBackend();
|
|
116
|
+
await backend.set(key, this.serialize(value), this.ttlSeconds);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
logger.debug("[APICacheStore] Failed to store in distributed cache (no fallback)", { key, error });
|
|
120
|
+
}
|
|
123
121
|
}
|
|
124
122
|
async delete(key) {
|
|
125
123
|
await this.localCache?.delete(key);
|
|
@@ -72,6 +72,8 @@ export declare class Renderer {
|
|
|
72
72
|
private doRenderPage;
|
|
73
73
|
resolvePageData(slug: string, ctx: RenderContext, options?: RenderOptions): Promise<PageDataResponse>;
|
|
74
74
|
getAllPages(ctx: RenderContext): Promise<string[]>;
|
|
75
|
+
pageExists(slug: string, ctx: RenderContext): Promise<boolean>;
|
|
76
|
+
private filterResolvablePrewarmSlugs;
|
|
75
77
|
clearCache(ctx: RenderContext, slug?: string): Promise<void>;
|
|
76
78
|
clearCacheForProject(projectId: string): Promise<void>;
|
|
77
79
|
destroy(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/src/rendering/renderer.ts"],"names":[],"mappings":"AA8CA,OAAO,EACL,mBAAmB,EACnB,+BAA+B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAgBzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA4CxD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,oBAAoB;IACpB,KAAK,CAAC,EAAE,wBAAwB,CAAC;CAClC;
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/src/rendering/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -94,9 +94,7 @@ function prewarmSlugDepth(slug) {
|
|
|
94
94
|
return 0;
|
|
95
95
|
return comparable.split("/").filter(Boolean).length;
|
|
96
96
|
}
|
|
97
|
-
function selectPrewarmSlugs(currentSlug, pages
|
|
98
|
-
if (maxRoutes <= 0)
|
|
99
|
-
return [];
|
|
97
|
+
function selectPrewarmSlugs(currentSlug, pages) {
|
|
100
98
|
const currentComparable = normalizeComparableSlug(currentSlug);
|
|
101
99
|
const seen = new Set();
|
|
102
100
|
const candidates = [];
|
|
@@ -107,11 +105,11 @@ function selectPrewarmSlugs(currentSlug, pages, maxRoutes) {
|
|
|
107
105
|
if (comparable === currentComparable || seen.has(comparable))
|
|
108
106
|
continue;
|
|
109
107
|
seen.add(comparable);
|
|
110
|
-
candidates.push({
|
|
108
|
+
candidates.push({ comparable });
|
|
111
109
|
}
|
|
112
110
|
candidates.sort((a, b) => prewarmSlugDepth(a.comparable) - prewarmSlugDepth(b.comparable) ||
|
|
113
111
|
a.comparable.localeCompare(b.comparable));
|
|
114
|
-
return candidates.
|
|
112
|
+
return candidates.map(({ comparable }) => comparable);
|
|
115
113
|
}
|
|
116
114
|
/**
|
|
117
115
|
* Renderer - Shared renderer for all projects
|
|
@@ -360,8 +358,11 @@ export class Renderer {
|
|
|
360
358
|
};
|
|
361
359
|
}
|
|
362
360
|
async runProductionRenderPrewarm(currentSlug, ctx, options) {
|
|
361
|
+
if (RENDER_PREWARM_MAX_ROUTES <= 0)
|
|
362
|
+
return;
|
|
363
363
|
const pages = await this.getAllPages(ctx);
|
|
364
|
-
const
|
|
364
|
+
const candidateSlugs = selectPrewarmSlugs(currentSlug, pages);
|
|
365
|
+
const slugs = await this.filterResolvablePrewarmSlugs(ctx, candidateSlugs, RENDER_PREWARM_MAX_ROUTES);
|
|
365
366
|
if (slugs.length === 0)
|
|
366
367
|
return;
|
|
367
368
|
logger.debug("Production render prewarm started", {
|
|
@@ -498,6 +499,37 @@ export class Renderer {
|
|
|
498
499
|
}
|
|
499
500
|
return createPageResolver(ctx).getAllPages();
|
|
500
501
|
}
|
|
502
|
+
async pageExists(slug, ctx) {
|
|
503
|
+
if (!this.initialized) {
|
|
504
|
+
throw INITIALIZATION_ERROR.create({
|
|
505
|
+
detail: "Renderer not initialized. Call initialize() first.",
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
return createPageResolver(ctx).pageExists(slug);
|
|
509
|
+
}
|
|
510
|
+
async filterResolvablePrewarmSlugs(ctx, slugs, maxRoutes) {
|
|
511
|
+
if (maxRoutes <= 0)
|
|
512
|
+
return [];
|
|
513
|
+
const resolvable = [];
|
|
514
|
+
for (const slug of slugs) {
|
|
515
|
+
try {
|
|
516
|
+
if (await this.pageExists(slug, ctx)) {
|
|
517
|
+
resolvable.push(slug);
|
|
518
|
+
if (resolvable.length >= maxRoutes)
|
|
519
|
+
break;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
catch (error) {
|
|
523
|
+
logger.warn("Production render prewarm route validation failed", {
|
|
524
|
+
slug,
|
|
525
|
+
projectId: ctx.projectId,
|
|
526
|
+
releaseId: ctx.releaseId,
|
|
527
|
+
error: error instanceof Error ? error.message : String(error),
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
return resolvable;
|
|
532
|
+
}
|
|
501
533
|
async clearCache(ctx, slug) {
|
|
502
534
|
if (slug) {
|
|
503
535
|
await this.cache.clearSlug(slug, ctx);
|