veryfront 0.1.1122 → 0.1.1124

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 (205) hide show
  1. package/esm/deno.js +1 -1
  2. package/esm/extensions/ext-llm-openai/src/openai-responses-request-builder.d.ts.map +1 -1
  3. package/esm/extensions/ext-llm-openai/src/openai-responses-request-builder.js +5 -0
  4. package/esm/src/agent/hosted/child-lifecycle.d.ts.map +1 -1
  5. package/esm/src/agent/hosted/child-lifecycle.js +1 -12
  6. package/esm/src/agent/hosted/cloud-agent-chat-execution.d.ts +38 -0
  7. package/esm/src/agent/hosted/cloud-agent-chat-execution.d.ts.map +1 -0
  8. package/esm/src/agent/hosted/cloud-agent-chat-execution.js +349 -0
  9. package/esm/src/agent/hosted/cloud-agent-child-tools.d.ts +80 -0
  10. package/esm/src/agent/hosted/cloud-agent-child-tools.d.ts.map +1 -0
  11. package/esm/src/agent/hosted/cloud-agent-child-tools.js +280 -0
  12. package/esm/src/agent/hosted/cloud-agent-config.d.ts +69 -0
  13. package/esm/src/agent/hosted/cloud-agent-config.d.ts.map +1 -0
  14. package/esm/src/agent/hosted/cloud-agent-config.js +129 -0
  15. package/esm/src/agent/hosted/cloud-agent-paths.d.ts +42 -0
  16. package/esm/src/agent/hosted/cloud-agent-paths.d.ts.map +1 -0
  17. package/esm/src/agent/hosted/cloud-agent-paths.js +117 -0
  18. package/esm/src/agent/hosted/cloud-agent-provider-bootstrap.d.ts +49 -0
  19. package/esm/src/agent/hosted/cloud-agent-provider-bootstrap.d.ts.map +1 -0
  20. package/esm/src/agent/hosted/cloud-agent-provider-bootstrap.js +96 -0
  21. package/esm/src/agent/hosted/durable-child-fork-execution.d.ts.map +1 -1
  22. package/esm/src/agent/hosted/durable-child-fork-execution.js +1 -12
  23. package/esm/src/agent/hosted/runtime-request-config.js +2 -2
  24. package/esm/src/agent/hosted/stream-finalization.d.ts.map +1 -1
  25. package/esm/src/agent/hosted/stream-finalization.js +2 -26
  26. package/esm/src/agent/hosted/veryfront-cloud-agent-service.d.ts +11 -93
  27. package/esm/src/agent/hosted/veryfront-cloud-agent-service.d.ts.map +1 -1
  28. package/esm/src/agent/hosted/veryfront-cloud-agent-service.js +8 -901
  29. package/esm/src/agent/project/agent-runtime.d.ts.map +1 -1
  30. package/esm/src/agent/project/agent-runtime.js +3 -0
  31. package/esm/src/agent/runtime/chat-stream-handler.d.ts.map +1 -1
  32. package/esm/src/agent/runtime/chat-stream-handler.js +1 -28
  33. package/esm/src/agent/streaming/stream-outcome.d.ts +30 -0
  34. package/esm/src/agent/streaming/stream-outcome.d.ts.map +1 -0
  35. package/esm/src/agent/streaming/stream-outcome.js +62 -0
  36. package/esm/src/agent/types.d.ts +3 -0
  37. package/esm/src/agent/types.d.ts.map +1 -1
  38. package/esm/src/chat/message-prep.d.ts.map +1 -1
  39. package/esm/src/chat/message-prep.js +3 -6
  40. package/esm/src/chat/provider-errors.d.ts +3 -10
  41. package/esm/src/chat/provider-errors.d.ts.map +1 -1
  42. package/esm/src/chat/provider-errors.js +2 -9
  43. package/esm/src/embedding/veryfront-cloud/rag-store.d.ts.map +1 -1
  44. package/esm/src/embedding/veryfront-cloud/rag-store.js +5 -2
  45. package/esm/src/eval/studio.d.ts +1 -1
  46. package/esm/src/html/styles-builder/plugin-loader.d.ts.map +1 -1
  47. package/esm/src/html/styles-builder/plugin-loader.js +4 -2
  48. package/esm/src/modules/server/classify.d.ts +54 -0
  49. package/esm/src/modules/server/classify.d.ts.map +1 -0
  50. package/esm/src/modules/server/classify.js +50 -0
  51. package/esm/src/modules/server/fs-probe.d.ts +14 -0
  52. package/esm/src/modules/server/fs-probe.d.ts.map +1 -0
  53. package/esm/src/modules/server/fs-probe.js +17 -0
  54. package/esm/src/modules/server/module-batch-handler.d.ts.map +1 -1
  55. package/esm/src/modules/server/module-batch-handler.js +31 -45
  56. package/esm/src/modules/server/module-server.d.ts.map +1 -1
  57. package/esm/src/modules/server/module-server.js +77 -93
  58. package/esm/src/modules/server/module-transform.d.ts +73 -0
  59. package/esm/src/modules/server/module-transform.d.ts.map +1 -0
  60. package/esm/src/modules/server/module-transform.js +64 -0
  61. package/esm/src/modules/server/ssr-import-rewriter.d.ts +1 -1
  62. package/esm/src/modules/server/ssr-import-rewriter.d.ts.map +1 -1
  63. package/esm/src/observability/error-collector.d.ts.map +1 -1
  64. package/esm/src/observability/error-collector.js +4 -11
  65. package/esm/src/observability/log-buffer.d.ts.map +1 -1
  66. package/esm/src/observability/log-buffer.js +4 -11
  67. package/esm/src/observability/request-profiler.d.ts +4 -0
  68. package/esm/src/observability/request-profiler.d.ts.map +1 -1
  69. package/esm/src/observability/request-profiler.js +9 -4
  70. package/esm/src/platform/adapters/veryfront-api-client/operations.d.ts +3 -3
  71. package/esm/src/platform/adapters/veryfront-api-client/operations.d.ts.map +1 -1
  72. package/esm/src/platform/adapters/veryfront-api-client/operations.js +4 -4
  73. package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts +4 -15
  74. package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts.map +1 -1
  75. package/esm/src/platform/adapters/veryfront-api-client/retry-handler.js +6 -110
  76. package/esm/src/platform/adapters/veryfront-api-transport.d.ts +40 -0
  77. package/esm/src/platform/adapters/veryfront-api-transport.d.ts.map +1 -0
  78. package/esm/src/platform/adapters/veryfront-api-transport.js +142 -0
  79. package/esm/src/provider/runtime-loader/provider-http.d.ts.map +1 -1
  80. package/esm/src/provider/runtime-loader/provider-http.js +5 -1
  81. package/esm/src/proxy/server-timing.d.ts.map +1 -1
  82. package/esm/src/proxy/server-timing.js +2 -14
  83. package/esm/src/react/components/chat/agent-card.d.ts +2 -3
  84. package/esm/src/react/components/chat/agent-card.d.ts.map +1 -1
  85. package/esm/src/react/components/chat/agent-card.js +3 -12
  86. package/esm/src/react/components/chat/agent-picker-context.d.ts +2 -3
  87. package/esm/src/react/components/chat/agent-picker-context.d.ts.map +1 -1
  88. package/esm/src/react/components/chat/agent-picker-context.js +3 -13
  89. package/esm/src/react/components/chat/chat/components/attachment-pill.d.ts +2 -6
  90. package/esm/src/react/components/chat/chat/components/attachment-pill.d.ts.map +1 -1
  91. package/esm/src/react/components/chat/chat/components/attachment-pill.js +3 -15
  92. package/esm/src/react/components/chat/chat/components/attachments-panel.d.ts +2 -12
  93. package/esm/src/react/components/chat/chat/components/attachments-panel.d.ts.map +1 -1
  94. package/esm/src/react/components/chat/chat/components/attachments-panel.js +3 -21
  95. package/esm/src/react/components/chat/chat/components/branch-picker.d.ts.map +1 -1
  96. package/esm/src/react/components/chat/chat/components/branch-picker.js +2 -11
  97. package/esm/src/react/components/chat/chat/components/inline-citation.d.ts.map +1 -1
  98. package/esm/src/react/components/chat/chat/components/inline-citation.js +2 -11
  99. package/esm/src/react/components/chat/chat/components/message-actions.d.ts.map +1 -1
  100. package/esm/src/react/components/chat/chat/components/message-actions.js +2 -11
  101. package/esm/src/react/components/chat/chat/components/message-feedback.d.ts.map +1 -1
  102. package/esm/src/react/components/chat/chat/components/message-feedback.js +2 -11
  103. package/esm/src/react/components/chat/chat/components/reasoning.d.ts +2 -3
  104. package/esm/src/react/components/chat/chat/components/reasoning.d.ts.map +1 -1
  105. package/esm/src/react/components/chat/chat/components/reasoning.js +3 -12
  106. package/esm/src/react/components/chat/chat/components/sidebar.d.ts +2 -3
  107. package/esm/src/react/components/chat/chat/components/sidebar.d.ts.map +1 -1
  108. package/esm/src/react/components/chat/chat/components/sidebar.js +4 -22
  109. package/esm/src/react/components/chat/chat/components/sources.d.ts +2 -3
  110. package/esm/src/react/components/chat/chat/components/sources.d.ts.map +1 -1
  111. package/esm/src/react/components/chat/chat/components/sources.js +3 -12
  112. package/esm/src/react/components/chat/chat/components/step-indicator.d.ts +2 -6
  113. package/esm/src/react/components/chat/chat/components/step-indicator.d.ts.map +1 -1
  114. package/esm/src/react/components/chat/chat/components/step-indicator.js +3 -15
  115. package/esm/src/react/components/chat/chat/components/tool-ui.d.ts +2 -3
  116. package/esm/src/react/components/chat/chat/components/tool-ui.d.ts.map +1 -1
  117. package/esm/src/react/components/chat/chat/components/tool-ui.js +3 -12
  118. package/esm/src/react/components/chat/chat/composition/chat-message-list.d.ts.map +1 -1
  119. package/esm/src/react/components/chat/chat/composition/chat-message-list.js +2 -11
  120. package/esm/src/react/components/chat/chat/contexts/chat-context.d.ts +2 -2
  121. package/esm/src/react/components/chat/chat/contexts/chat-context.d.ts.map +1 -1
  122. package/esm/src/react/components/chat/chat/contexts/chat-context.js +3 -12
  123. package/esm/src/react/components/chat/chat/contexts/composer-context.d.ts +2 -2
  124. package/esm/src/react/components/chat/chat/contexts/composer-context.d.ts.map +1 -1
  125. package/esm/src/react/components/chat/chat/contexts/composer-context.js +3 -12
  126. package/esm/src/react/components/chat/chat/contexts/conversations-context.d.ts +2 -2
  127. package/esm/src/react/components/chat/chat/contexts/conversations-context.d.ts.map +1 -1
  128. package/esm/src/react/components/chat/chat/contexts/conversations-context.js +3 -12
  129. package/esm/src/react/components/chat/chat/contexts/message-context.d.ts +2 -2
  130. package/esm/src/react/components/chat/chat/contexts/message-context.d.ts.map +1 -1
  131. package/esm/src/react/components/chat/chat/contexts/message-context.js +3 -12
  132. package/esm/src/react/components/chat/chat-actions.d.ts +2 -6
  133. package/esm/src/react/components/chat/chat-actions.d.ts.map +1 -1
  134. package/esm/src/react/components/chat/chat-actions.js +3 -15
  135. package/esm/src/react/components/chat/model-selector.d.ts +2 -6
  136. package/esm/src/react/components/chat/model-selector.d.ts.map +1 -1
  137. package/esm/src/react/components/chat/model-selector.js +3 -15
  138. package/esm/src/react/components/create-strict-context.d.ts +44 -0
  139. package/esm/src/react/components/create-strict-context.d.ts.map +1 -0
  140. package/esm/src/react/components/create-strict-context.js +56 -0
  141. package/esm/src/react/components/ui/anchored-surface.d.ts +44 -0
  142. package/esm/src/react/components/ui/anchored-surface.d.ts.map +1 -0
  143. package/esm/src/react/components/ui/anchored-surface.js +58 -0
  144. package/esm/src/react/components/ui/app-shell.d.ts +2 -2
  145. package/esm/src/react/components/ui/app-shell.d.ts.map +1 -1
  146. package/esm/src/react/components/ui/app-shell.js +3 -7
  147. package/esm/src/react/components/ui/collapsible.d.ts.map +1 -1
  148. package/esm/src/react/components/ui/collapsible.js +3 -9
  149. package/esm/src/react/components/ui/color-mode.d.ts +2 -2
  150. package/esm/src/react/components/ui/color-mode.d.ts.map +1 -1
  151. package/esm/src/react/components/ui/color-mode.js +3 -11
  152. package/esm/src/react/components/ui/command.d.ts.map +1 -1
  153. package/esm/src/react/components/ui/command.js +2 -7
  154. package/esm/src/react/components/ui/dialog.d.ts +4 -7
  155. package/esm/src/react/components/ui/dialog.d.ts.map +1 -1
  156. package/esm/src/react/components/ui/dialog.js +13 -59
  157. package/esm/src/react/components/ui/disclosure.d.ts +12 -0
  158. package/esm/src/react/components/ui/disclosure.d.ts.map +1 -0
  159. package/esm/src/react/components/ui/disclosure.js +22 -0
  160. package/esm/src/react/components/ui/drawer.d.ts +5 -7
  161. package/esm/src/react/components/ui/drawer.d.ts.map +1 -1
  162. package/esm/src/react/components/ui/drawer.js +13 -57
  163. package/esm/src/react/components/ui/dropdown-menu.d.ts +4 -7
  164. package/esm/src/react/components/ui/dropdown-menu.d.ts.map +1 -1
  165. package/esm/src/react/components/ui/dropdown-menu.js +12 -31
  166. package/esm/src/react/components/ui/modal-surface.d.ts +43 -0
  167. package/esm/src/react/components/ui/modal-surface.d.ts.map +1 -0
  168. package/esm/src/react/components/ui/modal-surface.js +83 -0
  169. package/esm/src/react/components/ui/popover.d.ts +4 -7
  170. package/esm/src/react/components/ui/popover.d.ts.map +1 -1
  171. package/esm/src/react/components/ui/popover.js +11 -31
  172. package/esm/src/react/components/ui/select.d.ts.map +1 -1
  173. package/esm/src/react/components/ui/select.js +2 -7
  174. package/esm/src/react/components/ui/tabs.d.ts.map +1 -1
  175. package/esm/src/react/components/ui/tabs.js +3 -4
  176. package/esm/src/runs/schemas.d.ts +9 -9
  177. package/esm/src/server/handlers/dev/framework-candidates.generated.d.ts.map +1 -1
  178. package/esm/src/server/handlers/dev/framework-candidates.generated.js +253 -154
  179. package/esm/src/server/reload-notifier.d.ts +0 -1
  180. package/esm/src/server/reload-notifier.d.ts.map +1 -1
  181. package/esm/src/server/reload-notifier.js +7 -25
  182. package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.d.ts.map +1 -1
  183. package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +1 -1
  184. package/esm/src/utils/base64url.d.ts +9 -1
  185. package/esm/src/utils/base64url.d.ts.map +1 -1
  186. package/esm/src/utils/base64url.js +25 -11
  187. package/esm/src/utils/index.d.ts +3 -1
  188. package/esm/src/utils/index.d.ts.map +1 -1
  189. package/esm/src/utils/index.js +3 -1
  190. package/esm/src/utils/json.d.ts +19 -0
  191. package/esm/src/utils/json.d.ts.map +1 -0
  192. package/esm/src/utils/json.js +17 -0
  193. package/esm/src/utils/logger/redact.d.ts.map +1 -1
  194. package/esm/src/utils/logger/redact.js +7 -3
  195. package/esm/src/utils/subscriber-set.d.ts +19 -0
  196. package/esm/src/utils/subscriber-set.d.ts.map +1 -0
  197. package/esm/src/utils/subscriber-set.js +38 -0
  198. package/esm/src/utils/version-constant.d.ts +1 -1
  199. package/esm/src/utils/version-constant.js +1 -1
  200. package/esm/src/workflow/backends/redis/index.d.ts.map +1 -1
  201. package/esm/src/workflow/backends/redis/index.js +6 -7
  202. package/esm/src/workflow/claude-code/websocket-publisher.d.ts.map +1 -1
  203. package/esm/src/workflow/claude-code/websocket-publisher.js +8 -15
  204. package/esm/src/workflow/schemas/workflow.schema.d.ts +4 -4
  205. package/package.json +5 -5
@@ -1,52 +1,14 @@
1
- import * as dntShim from "../../../_dnt.shims.js";
2
- import { existsSync, readFileSync } from "node:fs";
3
- import { fileURLToPath } from "node:url";
4
- import { createAgentServiceSandboxTools } from "../../sandbox/index.js";
5
- import { register, tryResolve } from "../../extensions/contracts.js";
6
- import { MISSING_EXTENSION_ERROR } from "../../extensions/errors.js";
7
- import { importFirstPartyExtensionModule, isMissingFirstPartyExtensionModule, } from "../../extensions/first-party-import.js";
8
- import { dirname, resolve } from "../../platform/compat/path/index.js";
9
- import { cwd, env, getEnv } from "../../platform/compat/process.js";
10
- import { defineSchema } from "../../schemas/index.js";
11
- import { NodeTelemetryProviderName, } from "../../extensions/observability/index.js";
12
- import { SandboxShellToolsProviderName, } from "../../extensions/sandbox/index.js";
13
- import { createRemoteMCPToolSource, createToolsFromRemoteDefinitions, isToolVisibleTo, sleepTool, toolRegistry, } from "../../tool/index.js";
14
- import { SKILL_TOOL_IDS } from "../../skill/types.js";
15
- import { parseProviderError } from "../../chat/provider-errors.js";
16
- import { DEFAULT_PROJECT_DISCOVERY_DIRS } from "../../discovery/index.js";
17
- import { nodeAdapter } from "../../platform/adapters/node.js";
18
- import { getVeryfrontCloudProviderFromModelId, resolveVeryfrontCloudModelId, resolveVeryfrontCloudModelThinking, resolveVeryfrontCloudReasoningOption, resolveVeryfrontCloudThinkingProviderOptions, } from "../../provider/veryfront-cloud/model-catalog.js";
19
- import { __registerTraceContextGetter } from "../../utils/logger/logger.js";
20
- import { AGENT_NOT_FOUND, CONFIG_INVALID, INITIALIZATION_ERROR } from "../../errors/index.js";
21
1
  import { agentLogger } from "../../utils/index.js";
22
- import { buildAgentRunTraceAttributes, buildExecuteToolTraceAttributes, buildProjectServiceTraceAttributes, buildScheduleTraceAttributes, filterAgentTraceAttributes, } from "./trace-attributes.js";
2
+ import { __registerTraceContextGetter } from "../../utils/logger/logger.js";
23
3
  import { runAgentServiceMain, } from "../service/bootstrap.js";
24
4
  import { loadAgentServiceEnvFiles } from "../service/env-files.js";
25
- import { createHostedFormInputTool } from "./form-input-tool.js";
26
- import { createHostedWebFetchTool } from "./web-fetch-tool.js";
27
- import { createHostedAgentProjectSteering, } from "./agent-project-steering.js";
28
- import { createLiveStudioMcpTools } from "../project/live-studio-mcp-tools.js";
29
- import { createDefaultHostedChatRuntime, } from "./default-chat-runtime.js";
30
- import { createHostedRootLocalToolRuntime } from "./root-sandbox-tool-source.js";
31
- import { createVeryfrontCloudContextSummaryGenerator } from "./context-summary-generator.js";
32
- import { createDefaultHostedInvokeAgentTool } from "./default-invoke-agent-tool.js";
33
- import { createDefaultHostedProjectSteeringRefresh, fetchDefaultHostedProjectSteering, } from "./default-project-steering-refresh.js";
34
- import { defaultAgentServiceMcpServers, } from "../service/mcp-server-config.js";
35
- import { resolveRuntimeSkillsForAgent, } from "../runtime/skill-metadata.js";
36
- import { buildAgentDelegateTools } from "../runtime/agent-delegation.js";
37
- import { createRuntimeAgentDefinitionFromAgent, describeProjectAgentRuntimeAgentIdCandidates, discoverProjectAgentRuntime, doesProjectAgentRuntimeAgentMatchSource, getProjectAgentRuntimeAgentIdCandidates, resolveSingleProjectAgentRuntimeAgentId, runWithProjectAgentRuntime, } from "../project/agent-runtime.js";
38
- import { buildVeryfrontCloudRuntimeInstructions } from "./cloud-runtime-system-messages.js";
39
- import { flattenSystemInstructions } from "../runtime/tool-inventory.js";
40
- import { createNodeAgentServiceRuntimeInfrastructure, } from "../service/node-runtime-infrastructure.js";
41
5
  import { createAgentServiceRuntime, startAgentServiceRuntime, startNodeAgentService, } from "../service/runtime.js";
42
- import { createAgentServiceRegistrationLifecycle, resolveAgentServiceRegistrationInput, } from "../service/registration.js";
43
- import { createDetachedRunTracker } from "../service/detached-run-tracker.js";
44
- import { runPreparedHostedChatExecutionDetached, streamPreparedHostedChatExecutionToAgUiResponse, } from "./prepared-chat-execution.js";
45
- import { createVeryfrontCloudPreparedHostedChatExecutionRuntimeOptions, } from "./cloud-prepared-chat-execution-runtime.js";
46
- import { prepareVeryfrontCloudHostedChatExecution } from "./cloud-chat-execution-preparation.js";
47
- import { applyAgentProjectContextChange } from "../project/context.js";
48
- import { getRuntimeAgentSourceContextSchema } from "../runtime/agent-invocation-contract.js";
49
- import { snapshotHostedRuntimeSourceIdentity, } from "./runtime-source-binding.js";
6
+ import { resolveDefaultProcessTarget } from "./cloud-agent-paths.js";
7
+ import { resolveNodeVeryfrontCloudAgentServiceOptions } from "./cloud-agent-provider-bootstrap.js";
8
+ import { createNodeVeryfrontCloudAgentServiceContext, initializeNodeVeryfrontCloudAgentServiceContext, } from "./cloud-agent-config.js";
9
+ import { buildHostedChildToolContext, getDiscoveredHostTools, resolveHostedChildAgentExecutionConfig, resolveHostedChildToolNames, resolveHostedDelegationBinding, resolveMcpServers, } from "./cloud-agent-child-tools.js";
10
+ import { createControlPlaneRegistrationLifecycle, createNodeVeryfrontCloudAgentServiceRuntimeOptions, } from "./cloud-agent-chat-execution.js";
11
+ const DEFAULT_HARD_SHUTDOWN_TIMEOUT_MS = 20_000;
50
12
  /** Veryfront API MCP server helper. */
51
13
  export function veryfrontApiMcpServer() {
52
14
  return { kind: "veryfront-api" };
@@ -55,432 +17,7 @@ export function veryfrontApiMcpServer() {
55
17
  export function veryfrontStudioMcpServer() {
56
18
  return { kind: "veryfront-studio" };
57
19
  }
58
- const DEFAULT_FORWARDED_CONFIG_NAMESPACE = "veryfront";
59
- const DEFAULT_DRAIN_TIMEOUT_MS = 15_000;
60
- const DEFAULT_HARD_SHUTDOWN_TIMEOUT_MS = 20_000;
61
- const DEFAULT_AGENT_SERVICE_NAME = "veryfront-agent-service";
62
- const DEFAULT_PROJECT_NAVIGATION_TOOL_NAMES = ["studio_open_project"];
63
- const HOSTED_CHILD_LOCAL_SKILL_TOOL_NAMES = new Set([
64
- "execute_skill_script",
65
- "load_skill_reference",
66
- ]);
67
- const PROJECT_CONFIG_FILES = [
68
- "veryfront.config.js",
69
- "veryfront.config.ts",
70
- "veryfront.config.mjs",
71
- ];
72
- function pathOptionToPath(pathOption) {
73
- return pathOption instanceof URL ? fileURLToPath(pathOption) : pathOption;
74
- }
75
- function resolveBaseDir(options) {
76
- if (options.baseDir !== undefined) {
77
- return pathOptionToPath(options.baseDir);
78
- }
79
- if (options.entrypointUrl !== undefined) {
80
- return dirname(pathOptionToPath(options.entrypointUrl));
81
- }
82
- return cwd();
83
- }
84
- function hasDiscoveryRoot(baseDir) {
85
- const discoveryDirs = [
86
- ...DEFAULT_PROJECT_DISCOVERY_DIRS.agentDirs,
87
- ...DEFAULT_PROJECT_DISCOVERY_DIRS.toolDirs,
88
- ...DEFAULT_PROJECT_DISCOVERY_DIRS.skillDirs,
89
- ...DEFAULT_PROJECT_DISCOVERY_DIRS.resourceDirs,
90
- ...DEFAULT_PROJECT_DISCOVERY_DIRS.promptDirs,
91
- ...DEFAULT_PROJECT_DISCOVERY_DIRS.workflowDirs,
92
- ...DEFAULT_PROJECT_DISCOVERY_DIRS.taskDirs,
93
- ];
94
- return discoveryDirs.some((dir) => existsSync(resolve(baseDir, dir))) ||
95
- PROJECT_CONFIG_FILES.some((file) => existsSync(resolve(baseDir, file)));
96
- }
97
- function uniquePaths(paths) {
98
- return [...new Set(paths.map((path) => resolve(path)))];
99
- }
100
- function resolveProjectDir(options) {
101
- if (options.projectDir) {
102
- return options.projectDir;
103
- }
104
- const baseDir = resolveBaseDir(options);
105
- const candidates = uniquePaths([baseDir, dirname(baseDir), dirname(dirname(baseDir))]);
106
- return candidates.find(hasDiscoveryRoot) ?? baseDir;
107
- }
108
- /**
109
- * Schema for the subset of a project manifest (package.json / deno.json) we
110
- * read. Only `name` is consumed; extra fields are tolerated via passthrough so
111
- * arbitrary manifests validate. Defined lazily via `defineSchema` so the zod
112
- * extension is resolved at call time — the cloud-agent options resolver calls
113
- * `ensureDefaultSchemaValidator()` before reaching service-name resolution, so
114
- * a validator is registered by the time this runs.
115
- */
116
- const getProjectManifestSchema = defineSchema((v) => v.object({
117
- name: v.string().optional(),
118
- }).passthrough());
119
- function readProjectManifestName(projectDir) {
120
- const manifestSchema = getProjectManifestSchema();
121
- for (const fileName of ["package.json", "deno.json"]) {
122
- const filePath = resolve(projectDir, fileName);
123
- if (!existsSync(filePath)) {
124
- continue;
125
- }
126
- try {
127
- const result = manifestSchema.safeParse(JSON.parse(readFileSync(filePath, "utf8")));
128
- if (!result.success)
129
- continue;
130
- const name = result.data.name;
131
- if (typeof name !== "string")
132
- continue;
133
- const trimmedName = name.trim();
134
- if (trimmedName)
135
- return trimmedName;
136
- }
137
- catch {
138
- continue;
139
- }
140
- }
141
- return null;
142
- }
143
- function resolveServiceName(options) {
144
- if (options.serviceName?.trim()) {
145
- return options.serviceName.trim();
146
- }
147
- const env = resolveEnvironment(options);
148
- const envServiceName = env.VERYFRONT_AGENT_SERVICE_NAME?.trim();
149
- if (envServiceName) {
150
- return envServiceName;
151
- }
152
- return readProjectManifestName(resolveProjectDir(options)) ?? DEFAULT_AGENT_SERVICE_NAME;
153
- }
154
- function resolveDefaultProcessTarget() {
155
- if (typeof process === "undefined") {
156
- return undefined;
157
- }
158
- return process;
159
- }
160
- function resolveMcpServers(options, agentConfig) {
161
- if (options.mcpServers !== undefined) {
162
- if (agentConfig?.mcpServers === undefined) {
163
- return options.mcpServers;
164
- }
165
- return agentConfig.mcpServers.flatMap((agentServer) => {
166
- const hostServer = options.mcpServers?.find((server) => server.kind === agentServer.kind && server.id === agentServer.id);
167
- if (!hostServer) {
168
- return [];
169
- }
170
- const toolPolicy = mergeMcpToolPolicies(hostServer.toolPolicy, agentServer.toolPolicy);
171
- return [{
172
- ...hostServer,
173
- ...(toolPolicy === undefined ? {} : { toolPolicy }),
174
- }];
175
- });
176
- }
177
- if (agentConfig?.mcpServers !== undefined) {
178
- return agentConfig.mcpServers;
179
- }
180
- return defaultAgentServiceMcpServers();
181
- }
182
- function mergeMcpToolPolicies(hostPolicy, agentPolicy) {
183
- if (hostPolicy === undefined) {
184
- return agentPolicy;
185
- }
186
- if (agentPolicy === undefined) {
187
- return hostPolicy;
188
- }
189
- const allow = hostPolicy.allow === undefined
190
- ? agentPolicy.allow
191
- : agentPolicy.allow === undefined
192
- ? hostPolicy.allow
193
- : hostPolicy.allow.filter((toolName) => agentPolicy.allow?.includes(toolName));
194
- const deny = [
195
- ...new Set([
196
- ...(hostPolicy.deny ?? []),
197
- ...(agentPolicy.deny ?? []),
198
- ]),
199
- ];
200
- const approval = hostPolicy.approval ?? agentPolicy.approval;
201
- return {
202
- ...(allow === undefined ? {} : { allow }),
203
- ...(deny.length === 0 ? {} : { deny }),
204
- ...(approval === undefined ? {} : { approval }),
205
- };
206
- }
207
- async function loadDefaultCreateBashTool() {
208
- const provider = tryResolve(SandboxShellToolsProviderName);
209
- if (provider)
210
- return provider;
211
- try {
212
- const { createBashSandboxShellToolsProvider } = await importFirstPartyExtensionModule("ext-sandbox-shell-tools", "@veryfront/ext-sandbox-shell-tools");
213
- return createBashSandboxShellToolsProvider;
214
- }
215
- catch (error) {
216
- throw MISSING_EXTENSION_ERROR.create({
217
- message: 'Missing extension for contract "SandboxShellToolsProvider". Install @veryfront/ext-sandbox-shell-tools or pass createBashTool explicitly.',
218
- detail: `Veryfront cloud agent sandbox shell tools require a SandboxShellToolsProvider implementation: ${error instanceof Error ? error.message : String(error)}`,
219
- });
220
- }
221
- }
222
- async function resolveNodeVeryfrontCloudAgentServiceOptions(options) {
223
- await ensureDefaultSchemaValidator();
224
- await ensureDefaultAuthProvider();
225
- await ensureDefaultNodeTelemetryProvider();
226
- return {
227
- ...options,
228
- runtimeSource: resolveHostedRuntimeSourceIdentity(options.runtimeSource),
229
- serviceName: resolveServiceName(options),
230
- createBashTool: options.createBashTool ?? await loadDefaultCreateBashTool(),
231
- };
232
- }
233
- function resolveHostedRuntimeSourceIdentity(input) {
234
- if (input === undefined)
235
- return undefined;
236
- const source = getRuntimeAgentSourceContextSchema().parse(input);
237
- if (source.type === "branch") {
238
- throw new Error("Agent service runtimeSource must identify an immutable release or environment source.");
239
- }
240
- return snapshotHostedRuntimeSourceIdentity(source);
241
- }
242
- async function ensureDefaultSchemaValidator() {
243
- if (tryResolve("SchemaValidator"))
244
- return;
245
- const { createZodAdapter } = await import("../../../extensions/ext-schema-zod/src/adapter.js");
246
- register("SchemaValidator", createZodAdapter());
247
- }
248
- async function ensureDefaultAuthProvider() {
249
- if (tryResolve("AuthProvider"))
250
- return;
251
- const { createAuthProvider } = await importFirstPartyExtensionModule("ext-auth-jwt", "@veryfront/ext-auth-jwt");
252
- register("AuthProvider", createAuthProvider({}));
253
- }
254
- async function ensureDefaultNodeTelemetryProvider() {
255
- if (tryResolve(NodeTelemetryProviderName))
256
- return;
257
- const OpenTelemetryNodeTelemetryProvider = await importOpenTelemetryNodeTelemetryProvider();
258
- if (!OpenTelemetryNodeTelemetryProvider)
259
- return;
260
- register(NodeTelemetryProviderName, new OpenTelemetryNodeTelemetryProvider());
261
- }
262
- async function importOpenTelemetryNodeTelemetryProvider() {
263
- try {
264
- const { OpenTelemetryNodeTelemetryProvider } = await importFirstPartyExtensionModule("ext-observability-opentelemetry", "@veryfront/ext-observability-opentelemetry");
265
- return OpenTelemetryNodeTelemetryProvider;
266
- }
267
- catch (error) {
268
- if (!isMissingOptionalPackageError(error) && !isMissingFirstPartyExtensionModule(error)) {
269
- throw error;
270
- }
271
- return null;
272
- }
273
- }
274
- // Runtime heuristic: detects a missing optional npm/Deno package by error message text.
275
- // These strings come from Node, Deno, and bundler runtimes and can vary by version.
276
- // If the wording changes, a missing optional package will throw instead of returning null,
277
- // turning an optional dependency into a hard startup failure — the safe fallback.
278
- function isMissingOptionalPackageError(error) {
279
- const message = error instanceof Error ? error.message : String(error);
280
- return message.includes("Cannot find package") ||
281
- message.includes("Cannot find module") ||
282
- message.includes("ERR_MODULE_NOT_FOUND") ||
283
- message.includes("Module not found");
284
- }
285
- function resolveEnvironment(options) {
286
- if (options.env) {
287
- return options.env;
288
- }
289
- if (options.processTarget?.env) {
290
- return options.processTarget.env;
291
- }
292
- return env();
293
- }
294
- function createNodeVeryfrontCloudAgentServiceContext(options) {
295
- const processTarget = options.processTarget ?? resolveDefaultProcessTarget();
296
- const infrastructure = createNodeAgentServiceRuntimeInfrastructure({
297
- serviceName: options.serviceName,
298
- env: resolveEnvironment({ env: options.env, processTarget }),
299
- processTarget,
300
- });
301
- function trace(operationName, operation) {
302
- return infrastructure.tracer.trace(operationName, operation);
303
- }
304
- return {
305
- options,
306
- processTarget,
307
- projectDir: resolveProjectDir(options),
308
- infrastructure,
309
- trace,
310
- defaultAgentId: null,
311
- projectSteeringByAgentId: new Map(),
312
- tracker: createDetachedRunTracker(),
313
- discoveryResult: null,
314
- agentConfig: null,
315
- agentConfigs: new Map(),
316
- };
317
- }
318
- function getMarkdownAgentConfig(context, agentId) {
319
- return getProjectSteering(context, agentId).getAgentConfig();
320
- }
321
- function loadMarkdownAgentConfig(context, agentId) {
322
- return getMarkdownAgentConfig(context, agentId);
323
- }
324
- async function resolveAgentConfig(context, agentId) {
325
- const cachedAgentConfig = context.agentConfigs.get(agentId);
326
- if (cachedAgentConfig) {
327
- return cachedAgentConfig;
328
- }
329
- const source = context.options.agentSource ?? "auto";
330
- const codeAgent = getProjectAgentRuntime(context).agents.get(agentId);
331
- if (codeAgent && doesProjectAgentRuntimeAgentMatchSource(codeAgent, source)) {
332
- const agentConfig = await createRuntimeAgentDefinitionFromAgent(codeAgent);
333
- context.agentConfigs.set(agentConfig.id, agentConfig);
334
- return agentConfig;
335
- }
336
- if (source === "code") {
337
- throw AGENT_NOT_FOUND.create({ detail: `Code agent "${agentId}" was not discovered.` });
338
- }
339
- const agentConfig = loadMarkdownAgentConfig(context, agentId);
340
- context.agentConfigs.set(agentConfig.id, agentConfig);
341
- return agentConfig;
342
- }
343
- function getResolvedAgentConfig(context) {
344
- if (!context.agentConfig) {
345
- throw INITIALIZATION_ERROR.create({
346
- detail: "Agent service context has not been initialized.",
347
- });
348
- }
349
- return context.agentConfig;
350
- }
351
- function getProjectAgentRuntime(context) {
352
- if (!context.discoveryResult) {
353
- throw new Error("Agent service context has not been initialized.");
354
- }
355
- return context.discoveryResult;
356
- }
357
- async function discoverProjectPrimitives(context) {
358
- context.discoveryResult = await discoverProjectAgentRuntime({
359
- projectDir: context.projectDir,
360
- adapter: nodeAdapter,
361
- });
362
- }
363
- function resolveDefaultAgentId(context) {
364
- if (context.options.agentId) {
365
- return context.options.agentId;
366
- }
367
- const source = context.options.agentSource ?? "auto";
368
- const candidates = getProjectAgentRuntimeAgentIdCandidates(context.discoveryResult);
369
- const agentId = resolveSingleProjectAgentRuntimeAgentId({ candidates, source });
370
- if (agentId) {
371
- return agentId;
372
- }
373
- throw CONFIG_INVALID.create({
374
- detail: [
375
- "agentId is required when agent discovery does not resolve to exactly one agent.",
376
- `Discovered agents: ${describeProjectAgentRuntimeAgentIdCandidates(candidates)}.`,
377
- ].join(" "),
378
- });
379
- }
380
- async function initializeNodeVeryfrontCloudAgentServiceContext(context) {
381
- await discoverProjectPrimitives(context);
382
- context.defaultAgentId = resolveDefaultAgentId(context);
383
- context.agentConfig = await resolveAgentConfig(context, context.defaultAgentId);
384
- }
385
- function getDefaultAgentId(context) {
386
- if (!context.defaultAgentId) {
387
- throw INITIALIZATION_ERROR.create({
388
- detail: "Agent service context has not been initialized.",
389
- });
390
- }
391
- return context.defaultAgentId;
392
- }
393
- function getProjectSteering(context, agentId = getDefaultAgentId(context)) {
394
- const cachedProjectSteering = context.projectSteeringByAgentId.get(agentId);
395
- if (cachedProjectSteering) {
396
- return cachedProjectSteering;
397
- }
398
- const projectSteering = createHostedAgentProjectSteering({
399
- baseDir: resolveBaseDir(context.options),
400
- agentId,
401
- getApiUrl: () => context.infrastructure.getConfig().VERYFRONT_API_URL,
402
- logger: context.infrastructure.logger,
403
- trace: context.trace,
404
- });
405
- context.projectSteeringByAgentId.set(agentId, projectSteering);
406
- return projectSteering;
407
- }
408
- export function getDiscoveredHostTools(scope) {
409
- // Without an agent identity, this remains the project-level host tool spread
410
- // and matches MCP tools/list: project-level callers see only unowned tools.
411
- // Hosted per-agent runs pass their task context identity so owned colocated
412
- // tools are available to their owner and hidden from other agents.
413
- // Shared skill tools use local registry and filesystem state. Hosted runs
414
- // instead add the request-scoped load_skill tool below; its optional file
415
- // input reads references with project, branch, auth, and owner context.
416
- // Hosted runs do not execute skill scripts directly.
417
- return Object.fromEntries([...toolRegistry.getAll()]
418
- .filter(([toolId, registryTool]) => !SKILL_TOOL_IDS.has(toolId) && isToolVisibleTo(registryTool, scope))
419
- .sort(([left], [right]) => left.localeCompare(right)));
420
- }
421
- function getProjectInstructions(context, lookup, agentId) {
422
- return context.trace("chat.getProjectInstructions", async () => {
423
- return await getProjectSteering(context, agentId).getProjectInstructions(lookup);
424
- });
425
- }
426
- function getSkillsConfig(context, lookup, agentId) {
427
- return context.trace("chat.getSkillsConfig", async () => {
428
- return await getProjectSteering(context, agentId).getSkillsConfig(lookup);
429
- });
430
- }
431
- function createLoadSkillTool(context, toolContext) {
432
- return getProjectSteering(context, toolContext.agentId).createLoadSkillTool(toolContext);
433
- }
434
- async function refreshProjectSkillIds(context, skillContext) {
435
- await getProjectSteering(context, skillContext.agentId).refreshProjectSkillIds(skillContext);
436
- }
437
- function setFilteredTraceAttributes(context, attributes) {
438
- context.infrastructure.setActiveSpanAttributes(filterAgentTraceAttributes(attributes));
439
- }
440
- function getInvokeAgentConfig(context) {
441
- const config = context.infrastructure.getConfig();
442
- return {
443
- apiUrl: config.VERYFRONT_API_URL,
444
- apiMcpUrl: config.VERYFRONT_MCP_URL,
445
- studioMcpUrl: config.VERYFRONT_STUDIO_MCP_URL,
446
- mcpServers: resolveMcpServers(context.options),
447
- enableDurableInvokeAgent: config.VERYFRONT_ENABLE_DURABLE_INVOKE_AGENT,
448
- };
449
- }
450
- function shouldRethrowInvokeAgentError(error) {
451
- return parseProviderError(error).code === "INSUFFICIENT_CREDITS";
452
- }
453
- function resolveHostedChildToolNames(agentConfig) {
454
- if (agentConfig.tools === true) {
455
- return undefined;
456
- }
457
- return [
458
- ...new Set([
459
- ...(agentConfig.tools ?? []).filter((toolName) => !HOSTED_CHILD_LOCAL_SKILL_TOOL_NAMES.has(toolName)),
460
- ...(agentConfig.providerTools ?? []),
461
- ...(agentConfig.delegates ?? []).map((id) => `agent_${id}`),
462
- "load_skill",
463
- ]),
464
- ];
465
- }
466
- function buildHostedChildToolContext(globalToolContext, childAgentId, childConfig, durableChildRun) {
467
- return {
468
- ...globalToolContext,
469
- agentId: childAgentId,
470
- ...(childConfig?.availableSkillIds ? { availableSkillIds: childConfig.availableSkillIds } : {}),
471
- ...(childConfig?.skillSourcePaths ? { skillSourcePaths: childConfig.skillSourcePaths } : {}),
472
- ...(childConfig?.toolNames ? { availableToolNames: childConfig.toolNames } : {}),
473
- loadedSkillResponses: {},
474
- loadedSkillReferenceResponses: {},
475
- ...(durableChildRun
476
- ? {
477
- conversationId: durableChildRun.childConversationId,
478
- parentRunId: durableChildRun.childRunId,
479
- parentMessageId: durableChildRun.childMessageId,
480
- }
481
- : {}),
482
- };
483
- }
20
+ export { getDiscoveredHostTools };
484
21
  /** Internal test seams for hosted project-agent materialization. */
485
22
  export const veryfrontCloudAgentServiceInternals = {
486
23
  buildHostedChildToolContext,
@@ -489,436 +26,6 @@ export const veryfrontCloudAgentServiceInternals = {
489
26
  resolveHostedChildToolNames,
490
27
  resolveMcpServers,
491
28
  };
492
- async function resolveHostedChildAgentExecutionConfig(context, taskContext, childAgentId, projectId) {
493
- if (!getProjectAgentRuntime(context).agents.has(childAgentId)) {
494
- return undefined;
495
- }
496
- const agentConfig = await resolveAgentConfig(context, childAgentId);
497
- const branchId = projectId === taskContext.projectId ? taskContext.branchId : null;
498
- const steering = await fetchProjectSteering(context, {
499
- projectId: projectId || null,
500
- authToken: taskContext.authToken,
501
- branchId,
502
- }, childAgentId);
503
- const advertisedSkills = resolveRuntimeSkillsForAgent({
504
- skills: steering.skills,
505
- agentId: childAgentId,
506
- selector: agentConfig.skills,
507
- });
508
- const loadableSkills = resolveRuntimeSkillsForAgent({
509
- skills: steering.skills,
510
- agentId: childAgentId,
511
- selector: true,
512
- });
513
- const skillSourcePaths = Object.fromEntries(loadableSkills
514
- .filter((skill) => skill.sourcePath)
515
- .map((skill) => [skill.id, skill.sourcePath]));
516
- const toolNames = resolveHostedChildToolNames(agentConfig);
517
- const thinking = agentConfig.thinking?.enabled === false ? 0 : agentConfig.thinking?.budgetTokens;
518
- return {
519
- system: flattenSystemInstructions(buildVeryfrontCloudRuntimeInstructions({
520
- agentConfig,
521
- projectId: projectId || null,
522
- branchId,
523
- instructions: steering.instructions,
524
- skills: advertisedSkills,
525
- availableToolNames: toolNames,
526
- })),
527
- ...(agentConfig.model ? { model: agentConfig.model } : {}),
528
- ...(agentConfig.temperature === undefined ? {} : { temperature: agentConfig.temperature }),
529
- ...(agentConfig.maxSteps === undefined ? {} : { maxSteps: agentConfig.maxSteps }),
530
- ...(thinking === undefined ? {} : { thinking }),
531
- ...(toolNames === undefined ? {} : { toolNames }),
532
- mcpServers: resolveMcpServers(context.options, agentConfig),
533
- availableSkillIds: loadableSkills.map((skill) => skill.id),
534
- ...(Object.keys(skillSourcePaths).length > 0 ? { skillSourcePaths } : {}),
535
- ...(agentConfig.delegates === undefined ? {} : { delegateIds: agentConfig.delegates }),
536
- };
537
- }
538
- function createInvokeAgentTool(context, childContext, options) {
539
- return createDefaultHostedInvokeAgentTool({
540
- context: childContext,
541
- getConfig: () => getInvokeAgentConfig(context),
542
- logger: context.infrastructure.logger,
543
- trace: context.trace,
544
- setTraceAttributes: context.infrastructure.setActiveSpanAttributes,
545
- createBashTool: context.options.createBashTool,
546
- resolveModelId: resolveVeryfrontCloudModelId,
547
- resolveProvider: getVeryfrontCloudProviderFromModelId,
548
- resolveModelThinking: resolveVeryfrontCloudModelThinking,
549
- resolveProviderOptions: resolveVeryfrontCloudThinkingProviderOptions,
550
- resolveReasoning: resolveVeryfrontCloudReasoningOption,
551
- shouldRethrowError: shouldRethrowInvokeAgentError,
552
- buildGlobalTools: (globalToolContext, childAgentId, childConfig, durableChildRun) => {
553
- const childToolContext = buildHostedChildToolContext(globalToolContext, childAgentId, childConfig, durableChildRun);
554
- return {
555
- ...(childConfig ? getDiscoveredHostTools({ agentId: childAgentId }) : {}),
556
- load_skill: createLoadSkillTool(context, childToolContext),
557
- ...(childConfig?.delegateIds?.length
558
- ? buildHostedDelegateTools(context, {
559
- delegates: childConfig.delegateIds,
560
- selfId: childAgentId,
561
- taskContext: childToolContext,
562
- })
563
- : {}),
564
- };
565
- },
566
- resolveChildAgentExecutionConfig: (childAgentId, projectId) => resolveHostedChildAgentExecutionConfig(context, childContext, childAgentId, projectId),
567
- refreshProjectSkillIds: (projectSkillContext) => refreshProjectSkillIds(context, projectSkillContext),
568
- createAgentServiceSandboxTools,
569
- createLiveStudioTools: createLiveStudioMcpTools,
570
- createRemoteToolSource: createRemoteMCPToolSource,
571
- createToolsFromRemoteDefinitions,
572
- requireDurableInvokeAgent: options?.requireDurable,
573
- });
574
- }
575
- function buildHostedDelegateTools(context, input) {
576
- const invokeAgent = createInvokeAgentTool(context, input.taskContext, { requireDurable: true });
577
- return buildAgentDelegateTools({
578
- delegates: input.delegates,
579
- selfId: input.selfId,
580
- resolveAgent: (delegateId) => getProjectAgentRuntime(context).agents.get(delegateId),
581
- executeDelegate: ({ delegateId, toolInput, context: executionContext }) => invokeAgent.execute({
582
- agent_id: delegateId,
583
- description: `Run ${delegateId} specialist task`,
584
- prompt: toolInput.input,
585
- }, executionContext),
586
- });
587
- }
588
- function resolveHostedDelegationBinding(agentConfig) {
589
- if (agentConfig?.delegates !== undefined) {
590
- return { kind: "scoped", delegateIds: agentConfig.delegates };
591
- }
592
- return { kind: "legacy" };
593
- }
594
- function buildLocalTools(context, options, taskContext) {
595
- const config = context.infrastructure.getConfig();
596
- const tools = {
597
- ...getDiscoveredHostTools({ agentId: taskContext.agentId }),
598
- form_input: createHostedFormInputTool(taskContext, config.VERYFRONT_API_URL),
599
- load_skill: createLoadSkillTool(context, taskContext),
600
- sleep: sleepTool,
601
- web_fetch: createHostedWebFetchTool(),
602
- };
603
- if (options.allowDelegation !== false) {
604
- const agentConfig = options.liveProjectSteering?.agent;
605
- const binding = resolveHostedDelegationBinding(agentConfig);
606
- if (binding.kind === "scoped") {
607
- Object.assign(tools, buildHostedDelegateTools(context, {
608
- delegates: binding.delegateIds,
609
- selfId: agentConfig?.id ?? taskContext.agentId ?? "veryfront",
610
- taskContext,
611
- }));
612
- }
613
- else {
614
- // Agents authored before declarative delegates retain the legacy hosted
615
- // child-fork tool. Explicit scoped delegate bindings opt out.
616
- tools.invoke_agent = createInvokeAgentTool(context, taskContext);
617
- }
618
- }
619
- return tools;
620
- }
621
- function createProjectSteeringRefresh(context) {
622
- return createDefaultHostedProjectSteeringRefresh({
623
- fetchProjectInstructions: (lookup) => getProjectInstructions(context, lookup),
624
- fetchSkills: (lookup) => getSkillsConfig(context, lookup),
625
- buildInstructions: buildVeryfrontCloudRuntimeInstructions,
626
- projectScopedRemoteToolOptions: {
627
- projectNavigationToolNames: DEFAULT_PROJECT_NAVIGATION_TOOL_NAMES,
628
- },
629
- logger: context.infrastructure.logger,
630
- });
631
- }
632
- function createAgentRuntime(context, options) {
633
- const config = context.infrastructure.getConfig();
634
- const projectRuntime = getProjectAgentRuntime(context);
635
- const refreshSystem = createProjectSteeringRefresh(context);
636
- const localToolRuntime = createHostedRootLocalToolRuntime({
637
- allowedToolNames: options.allowedTools,
638
- apiUrl: config.VERYFRONT_API_URL,
639
- authToken: options.authToken,
640
- createBashTool: context.options.createBashTool,
641
- buildBaseTools: (taskContext) => buildLocalTools(context, options, taskContext),
642
- });
643
- return createDefaultHostedChatRuntime({
644
- options,
645
- sourceIntegrationPolicy: projectRuntime.sourceIntegrationPolicy,
646
- config: {
647
- apiUrl: config.VERYFRONT_API_URL,
648
- apiMcpUrl: config.VERYFRONT_MCP_URL,
649
- studioMcpUrl: config.VERYFRONT_STUDIO_MCP_URL,
650
- mcpServers: resolveMcpServers(context.options, options.liveProjectSteering?.agent),
651
- },
652
- buildLocalTools: localToolRuntime.buildLocalTools,
653
- cleanup: localToolRuntime.cleanup,
654
- refreshSystem,
655
- onSteeringMutation: async ({ mutation, taskContext }) => {
656
- if (mutation.skillsChanged) {
657
- // Pass the live task context (not a spread copy) so the refreshed
658
- // owner-scoped skill ids and source paths actually land on the run.
659
- await refreshProjectSkillIds(context, taskContext);
660
- }
661
- },
662
- onStudioProjectSwitch: async ({ projectId, taskContext }) => {
663
- if (!applyAgentProjectContextChange(taskContext, projectId)) {
664
- return false;
665
- }
666
- await refreshProjectSkillIds(context, taskContext);
667
- return true;
668
- },
669
- projectScopedRemoteToolOptions: {
670
- projectNavigationToolNames: DEFAULT_PROJECT_NAVIGATION_TOOL_NAMES,
671
- },
672
- createRemoteToolSource: createRemoteMCPToolSource,
673
- traceLocalTools: {
674
- trace: (spanName, operation) => context.infrastructure.tracer.trace(spanName, operation),
675
- buildAttributes: ({ toolName, toolCallId }) => buildExecuteToolTraceAttributes({
676
- toolName,
677
- toolCallId,
678
- }),
679
- setAttributes: (attributes) => setFilteredTraceAttributes(context, attributes),
680
- },
681
- logger: context.infrastructure.logger,
682
- });
683
- }
684
- function setPrepareChatExecutionStartAttributes(context, input) {
685
- const span = context.infrastructure.tracer.scope().active();
686
- span?.setAttributes({
687
- "chat.projectId": input.projectId ?? "none",
688
- "chat.userId": input.userId,
689
- });
690
- }
691
- function setPrepareChatExecutionResultAttributes(context, input) {
692
- const scheduleTraceAttributes = buildScheduleTraceAttributes(input.forwardedProps);
693
- const span = context.infrastructure.tracer.scope().active();
694
- span?.setAttributes(buildAgentRunTraceAttributes({
695
- operationName: "invoke_agent",
696
- conversationId: input.conversationId,
697
- projectId: input.projectId,
698
- userId: input.userId,
699
- agentId: input.agentId,
700
- agentName: input.agentName,
701
- modelId: input.modelId,
702
- runId: input.runId,
703
- parentConversationId: input.upstreamParentConversationId,
704
- parentRunId: input.upstreamParentRunId,
705
- toolCallId: input.spawnedFromToolCallId,
706
- scheduleId: typeof scheduleTraceAttributes["schedule.id"] === "string"
707
- ? scheduleTraceAttributes["schedule.id"]
708
- : null,
709
- scheduleName: typeof scheduleTraceAttributes["schedule.name"] === "string"
710
- ? scheduleTraceAttributes["schedule.name"]
711
- : null,
712
- }));
713
- span?.setAttributes({
714
- "agent.runtime.kind": input.runtimeKind,
715
- ...input.projectServiceTraceAttributes,
716
- ...scheduleTraceAttributes,
717
- });
718
- }
719
- function fetchProjectSteering(context, input, agentId) {
720
- return fetchDefaultHostedProjectSteering({
721
- ...input,
722
- fetchProjectInstructions: (lookup) => getProjectInstructions(context, lookup, agentId),
723
- fetchSkills: (lookup) => getSkillsConfig(context, lookup, agentId),
724
- trace: context.trace,
725
- traceOperationName: "chat.fetchSteering",
726
- });
727
- }
728
- function createHostedChatContextBudgetOptions(context, req, agentConfig, abortSignal) {
729
- const config = context.infrastructure.getConfig();
730
- if (!config.VERYFRONT_CONTEXT_COMPACTION_ENABLED || !req.durableRootRun) {
731
- return undefined;
732
- }
733
- return {
734
- tokenBudget: config.VERYFRONT_CONTEXT_COMPACTION_TOKEN_BUDGET,
735
- reserveTokens: config.VERYFRONT_CONTEXT_COMPACTION_RESERVE_TOKENS,
736
- recentTailTokens: config.VERYFRONT_CONTEXT_COMPACTION_RECENT_TAIL_TOKENS,
737
- minimumRecentTurns: config.VERYFRONT_CONTEXT_COMPACTION_MINIMUM_RECENT_TURNS,
738
- maxSummaryTokens: config.VERYFRONT_CONTEXT_COMPACTION_MAX_SUMMARY_TOKENS,
739
- summaryGenerator: createVeryfrontCloudContextSummaryGenerator({
740
- apiUrl: config.VERYFRONT_API_URL,
741
- authToken: req.authToken,
742
- projectSlug: req.projectSlug,
743
- model: config.VERYFRONT_CONTEXT_COMPACTION_SUMMARY_MODEL ?? agentConfig.model,
744
- maxOutputTokens: config.VERYFRONT_CONTEXT_COMPACTION_MAX_SUMMARY_TOKENS,
745
- maxInputTokens: config.VERYFRONT_CONTEXT_COMPACTION_SUMMARY_INPUT_TOKENS,
746
- abortSignal,
747
- }),
748
- logger: {
749
- debug: (message, metadata) => context.infrastructure.logger.debug(message, metadata),
750
- error: (message, metadata) => context.infrastructure.logger.error(message, metadata),
751
- },
752
- };
753
- }
754
- async function prepareChatExecutionWithinProjectRuntime(context, req) {
755
- const { userId, authToken, projectId, conversationId, upstreamParentConversationId, upstreamParentRunId, spawnedFromToolCallId, } = req;
756
- const config = context.infrastructure.getConfig();
757
- const projectServiceTraceAttributes = buildProjectServiceTraceAttributes({
758
- projectSlug: req.projectSlug,
759
- readEnv: getEnv,
760
- });
761
- setPrepareChatExecutionStartAttributes(context, { projectId, userId });
762
- const requestedAgentId = req.agentId ?? getDefaultAgentId(context);
763
- // veryfront-api is the trusted caller for request-scoped project-agent config.
764
- const agentConfig = req.agentConfig ?? await resolveAgentConfig(context, requestedAgentId);
765
- const abortController = new AbortController();
766
- const { effectiveMessages, rootRunContext, runtime: { agent, runtimeKind, modelId, cleanup }, finalMessages, } = await prepareVeryfrontCloudHostedChatExecution({
767
- request: req,
768
- agentConfig,
769
- apiUrl: config.VERYFRONT_API_URL,
770
- abortSignal: abortController.signal,
771
- logger: context.infrastructure.logger,
772
- rootRun: {
773
- instrumentation: {
774
- trace: context.trace,
775
- setTraceAttributes: context.infrastructure.setActiveSpanAttributes,
776
- debug: (message, metadata) => context.infrastructure.logger.debug(message, metadata),
777
- warn: (message, metadata) => context.infrastructure.logger.warn(message, metadata),
778
- error: (message, metadata) => context.infrastructure.logger.error(message, metadata),
779
- },
780
- },
781
- fetchSteering: (steeringInput) => fetchProjectSteering(context, steeringInput),
782
- buildInstructions: buildVeryfrontCloudRuntimeInstructions,
783
- contextBudget: createHostedChatContextBudgetOptions(context, req, agentConfig, abortController.signal),
784
- createRuntime: (creationOptions) => context.trace("chat.createRuntime", () => createAgentRuntime(context, {
785
- ...creationOptions,
786
- userId: req.userId,
787
- })),
788
- });
789
- setPrepareChatExecutionResultAttributes(context, {
790
- conversationId,
791
- projectId,
792
- userId,
793
- agentId: agentConfig.id,
794
- agentName: agentConfig.name,
795
- modelId,
796
- runId: rootRunContext.durableRootRun?.runId,
797
- upstreamParentConversationId,
798
- upstreamParentRunId,
799
- spawnedFromToolCallId,
800
- runtimeKind,
801
- forwardedProps: req.forwardedProps,
802
- projectServiceTraceAttributes,
803
- });
804
- return {
805
- config,
806
- agent,
807
- agentId: agentConfig.id,
808
- runtimeKind,
809
- modelId,
810
- cleanup,
811
- messages: effectiveMessages,
812
- finalMessages,
813
- conversationId,
814
- authToken,
815
- projectId,
816
- userId,
817
- rootRunContext,
818
- upstreamParentConversationId,
819
- upstreamParentRunId,
820
- spawnedFromToolCallId,
821
- traceAttributes: {
822
- ...projectServiceTraceAttributes,
823
- ...buildScheduleTraceAttributes(req.forwardedProps),
824
- },
825
- };
826
- }
827
- async function prepareChatExecution(context, req) {
828
- return await runWithProjectAgentRuntime(getProjectAgentRuntime(context), () => prepareChatExecutionWithinProjectRuntime(context, req));
829
- }
830
- function createPreparedExecutionRuntimeOptions(context, config) {
831
- return createVeryfrontCloudPreparedHostedChatExecutionRuntimeOptions({
832
- apiUrl: config.VERYFRONT_API_URL,
833
- tracer: context.infrastructure.tracer,
834
- trace: context.trace,
835
- traceStream: (operation) => context.infrastructure.tracer.trace("chat.stream", operation),
836
- logger: context.infrastructure.logger,
837
- setActiveSpanAttributes: context.infrastructure.setActiveSpanAttributes,
838
- });
839
- }
840
- function resolveAgentServiceRuntimeName() {
841
- if (Reflect.get(dntShim.dntGlobalThis, "Bun")) {
842
- return "bun";
843
- }
844
- if (Reflect.get(dntShim.dntGlobalThis, "Deno")) {
845
- return "deno";
846
- }
847
- return "node";
848
- }
849
- function getAgentServiceVersion(context) {
850
- return context.options.env?.npm_package_version;
851
- }
852
- async function createControlPlaneRegistrationLifecycle(context) {
853
- const config = context.infrastructure.getConfig();
854
- const registrationInput = await resolveAgentServiceRegistrationInput({
855
- config,
856
- serviceName: context.options.serviceName,
857
- agentId: getDefaultAgentId(context),
858
- version: getAgentServiceVersion(context),
859
- runtime: resolveAgentServiceRuntimeName(),
860
- });
861
- if (!registrationInput) {
862
- return undefined;
863
- }
864
- if (!context.options.runtimeSource) {
865
- throw new Error("runtimeSource is required when agent service control-plane registration is enabled.");
866
- }
867
- try {
868
- const lifecycle = await createAgentServiceRegistrationLifecycle({
869
- ...registrationInput,
870
- logger: context.infrastructure.logger,
871
- });
872
- return {
873
- stop: () => lifecycle.stop(),
874
- };
875
- }
876
- catch (error) {
877
- if (config.VERYFRONT_AGENT_SERVICE_REGISTRATION === "enabled") {
878
- throw error;
879
- }
880
- context.infrastructure.logger.warn("Agent service registration skipped", {
881
- error: error instanceof Error ? error.message : String(error),
882
- });
883
- return undefined;
884
- }
885
- }
886
- function createNodeVeryfrontCloudAgentServiceRuntimeOptions(context) {
887
- return {
888
- serviceName: context.options.serviceName,
889
- runtimeSource: context.options.runtimeSource,
890
- forwardedConfigNamespace: context.options.forwardedConfigNamespace ??
891
- DEFAULT_FORWARDED_CONFIG_NAMESPACE,
892
- getConfig: context.infrastructure.getConfig,
893
- getAgentConfig: () => getResolvedAgentConfig(context),
894
- tracker: context.tracker,
895
- prepareExecution: (request) => prepareChatExecution(context, request),
896
- streamExecutionToAgUiResponse: (execution) => streamPreparedHostedChatExecutionToAgUiResponse({
897
- execution,
898
- runtime: createPreparedExecutionRuntimeOptions(context, execution.config),
899
- }),
900
- startDetachedExecution: ({ execution, abortSignal }) => runPreparedHostedChatExecutionDetached({
901
- execution: {
902
- ...execution,
903
- abortSignal,
904
- },
905
- runtime: createPreparedExecutionRuntimeOptions(context, execution.config),
906
- }),
907
- cleanupExecution: async ({ execution, runId, conversationId }) => {
908
- await execution.cleanup().catch((error) => {
909
- context.infrastructure.logger.error("Detached durable run cleanup failed after duplicate start", {
910
- runId,
911
- conversationId,
912
- error: error instanceof Error ? error.message : String(error),
913
- });
914
- });
915
- },
916
- setActiveSpanAttributes: context.infrastructure.setActiveSpanAttributes,
917
- trace: context.trace,
918
- logger: context.infrastructure.logger,
919
- drainTimeoutMs: context.options.drainTimeoutMs ?? DEFAULT_DRAIN_TIMEOUT_MS,
920
- };
921
- }
922
29
  /** Create node Veryfront Cloud agent service runtime. */
923
30
  export async function createNodeVeryfrontCloudAgentServiceRuntime(options = {}) {
924
31
  const resolvedOptions = await resolveNodeVeryfrontCloudAgentServiceOptions(options);