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.
Files changed (28) hide show
  1. package/esm/deno.js +1 -1
  2. package/esm/src/agent/hosted/chat-runtime-tool-assembly.d.ts +2 -0
  3. package/esm/src/agent/hosted/chat-runtime-tool-assembly.d.ts.map +1 -1
  4. package/esm/src/agent/hosted/chat-runtime-tool-assembly.js +11 -1
  5. package/esm/src/agent/hosted/runtime-state-resolver.d.ts +1 -0
  6. package/esm/src/agent/hosted/runtime-state-resolver.d.ts.map +1 -1
  7. package/esm/src/agent/hosted/runtime-state-resolver.js +4 -0
  8. package/esm/src/agent/runtime/agent-runtime-step.d.ts.map +1 -1
  9. package/esm/src/agent/runtime/agent-runtime-step.js +2 -0
  10. package/esm/src/agent/runtime/chat-stream-handler.d.ts +5 -0
  11. package/esm/src/agent/runtime/chat-stream-handler.d.ts.map +1 -1
  12. package/esm/src/agent/runtime/chat-stream-handler.js +39 -0
  13. package/esm/src/agent/runtime/index.d.ts.map +1 -1
  14. package/esm/src/agent/runtime/index.js +99 -6
  15. package/esm/src/agent/runtime/skill-policy-enforcement.d.ts +5 -1
  16. package/esm/src/agent/runtime/skill-policy-enforcement.d.ts.map +1 -1
  17. package/esm/src/agent/runtime/skill-policy-enforcement.js +40 -5
  18. package/esm/src/agent/runtime/tool-result-continuation.d.ts +1 -1
  19. package/esm/src/agent/runtime/tool-result-continuation.d.ts.map +1 -1
  20. package/esm/src/agent/runtime/tool-result-continuation.js +1 -1
  21. package/esm/src/rendering/cache/stores/api-store.d.ts.map +1 -1
  22. package/esm/src/rendering/cache/stores/api-store.js +7 -9
  23. package/esm/src/rendering/renderer.d.ts +2 -0
  24. package/esm/src/rendering/renderer.d.ts.map +1 -1
  25. package/esm/src/rendering/renderer.js +38 -6
  26. package/esm/src/utils/version-constant.d.ts +1 -1
  27. package/esm/src/utils/version-constant.js +1 -1
  28. package/package.json +1 -1
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.848",
3
+ "version": "0.1.850",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "minimumDependencyAge": {
@@ -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":"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"}
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;AAU3D,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;CACxB,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,CAmEvF"}
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;AAEzD,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,CA6BnC"}
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,CASnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,mBAAmB,EAC/B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CA8nBf"}
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":"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"}
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: currentRuntimeContext,
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
- allowSubmittedFormInputReuse: hasSubmittedFormInputResult(currentMessages),
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: currentRuntimeContext,
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
- allowSubmittedFormInputReuse: hasSubmittedFormInputResult(currentMessages),
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
- allowSubmittedFormInputReuse?: boolean;
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;AAO3C,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAO/C,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;AAOD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAQjF;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,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC,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,CAsBnB"}
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 Boolean(result) && typeof result === "object" &&
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 (toolName === FORM_INPUT_TOOL_ID &&
102
- options.allowSubmittedFormInputReuse === true) {
103
- return { allowed: true };
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,EAAE,IAAI,CAAC,eAAe,EAAE,iBAAiB,GAAG,cAAc,GAAG,WAAW,GAAG,aAAa,CAAC,GAC7F,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"}
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 false;
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;IAkBpD,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"}
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
- void (async () => {
115
- try {
116
- const backend = await this.getBackend();
117
- await backend.set(key, this.serialize(value), this.ttlSeconds);
118
- }
119
- catch (error) {
120
- logger.debug("[APICacheStore] Failed to store in distributed cache (no fallback)", { key, error });
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;AA4ED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,oBAAoB,CAAgC;IAC5D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,qBAAqB,CAA8B;IAE3D;;;;OAIG;IACH,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,yBAAyB,CAAoC;gBAEzD,OAAO,GAAE,eAAoB;IAInC,UAAU,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YAqG9E,2BAA2B;IAWzC,OAAO,CAAC,uBAAuB;IAiB/B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;;;;;;;;OASG;IACH,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,+BAA+B;IAoCvC,OAAO,CAAC,+BAA+B;IAcvC,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,yBAAyB;IASjC,OAAO,CAAC,4BAA4B;YAgBtB,0BAA0B;YAgD1B,YAAY;IAoF1B,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,aAAa,EAClB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,gBAAgB,CAAC;IA4B5B,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAU5C,UAAU,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5D,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,OAAO,CAAC,wBAAwB;CA4FjC;AAED,OAAO,EACL,mBAAmB,EACnB,+BAA+B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,aAAa,GACnB,CAAC;AAMF,wBAAgB,WAAW,IAAI,QAAQ,CAOtC;AAED,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsBrF;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAQrD;AAED,wBAAsB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnF;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,cAAc,EAC1B,OAAO,CAAC,EAAE,aAAa,EACvB,cAAc,CAAC,EAAE,0BAA0B,GAC1C,OAAO,CAAC,YAAY,CAAC,CAIvB"}
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, maxRoutes) {
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({ slug: page, comparable });
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.slice(0, maxRoutes).map(({ slug }) => slug);
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 slugs = selectPrewarmSlugs(currentSlug, pages, RENDER_PREWARM_MAX_ROUTES);
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);
@@ -1,3 +1,3 @@
1
1
  /** Shared version value. */
2
- export declare const VERSION = "0.1.848";
2
+ export declare const VERSION = "0.1.850";
3
3
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
3
  /** Shared version value. */
4
- export const VERSION = "0.1.848";
4
+ export const VERSION = "0.1.850";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.848",
3
+ "version": "0.1.850",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",