@agent-native/core 0.7.19 → 0.7.21

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 (263) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  3. package/dist/agent/engine/builder-engine.js +45 -2
  4. package/dist/agent/engine/builder-engine.js.map +1 -1
  5. package/dist/agent/loop-settings.d.ts +37 -0
  6. package/dist/agent/loop-settings.d.ts.map +1 -0
  7. package/dist/agent/loop-settings.js +127 -0
  8. package/dist/agent/loop-settings.js.map +1 -0
  9. package/dist/agent/production-agent.d.ts +8 -0
  10. package/dist/agent/production-agent.d.ts.map +1 -1
  11. package/dist/agent/production-agent.js +268 -29
  12. package/dist/agent/production-agent.js.map +1 -1
  13. package/dist/agent/run-manager.d.ts.map +1 -1
  14. package/dist/agent/run-manager.js +76 -3
  15. package/dist/agent/run-manager.js.map +1 -1
  16. package/dist/agent/run-store.d.ts +1 -1
  17. package/dist/agent/run-store.d.ts.map +1 -1
  18. package/dist/agent/run-store.js +65 -2
  19. package/dist/agent/run-store.js.map +1 -1
  20. package/dist/agent/thread-data-builder.d.ts +3 -0
  21. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  22. package/dist/agent/thread-data-builder.js +52 -10
  23. package/dist/agent/thread-data-builder.js.map +1 -1
  24. package/dist/agent/tool-search.d.ts +37 -0
  25. package/dist/agent/tool-search.d.ts.map +1 -0
  26. package/dist/agent/tool-search.js +201 -0
  27. package/dist/agent/tool-search.js.map +1 -0
  28. package/dist/agent/types.d.ts +8 -1
  29. package/dist/agent/types.d.ts.map +1 -1
  30. package/dist/agent/types.js.map +1 -1
  31. package/dist/cli/create.d.ts.map +1 -1
  32. package/dist/cli/create.js +44 -9
  33. package/dist/cli/create.js.map +1 -1
  34. package/dist/cli/workspacify.d.ts +2 -0
  35. package/dist/cli/workspacify.d.ts.map +1 -1
  36. package/dist/cli/workspacify.js +34 -1
  37. package/dist/cli/workspacify.js.map +1 -1
  38. package/dist/client/AssistantChat.d.ts.map +1 -1
  39. package/dist/client/AssistantChat.js +277 -18
  40. package/dist/client/AssistantChat.js.map +1 -1
  41. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  42. package/dist/client/ConnectBuilderCard.js +1 -1
  43. package/dist/client/ConnectBuilderCard.js.map +1 -1
  44. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  45. package/dist/client/MultiTabAssistantChat.js +14 -6
  46. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  47. package/dist/client/NewWorkspaceAppFlow.d.ts +14 -0
  48. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -0
  49. package/dist/client/NewWorkspaceAppFlow.js +198 -0
  50. package/dist/client/NewWorkspaceAppFlow.js.map +1 -0
  51. package/dist/client/PoweredByBadge.d.ts +10 -1
  52. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  53. package/dist/client/PoweredByBadge.js +120 -8
  54. package/dist/client/PoweredByBadge.js.map +1 -1
  55. package/dist/client/agent-chat-adapter.d.ts +3 -5
  56. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  57. package/dist/client/agent-chat-adapter.js +26 -19
  58. package/dist/client/agent-chat-adapter.js.map +1 -1
  59. package/dist/client/agent-chat.d.ts.map +1 -1
  60. package/dist/client/agent-chat.js +15 -3
  61. package/dist/client/agent-chat.js.map +1 -1
  62. package/dist/client/analytics.d.ts +1 -1
  63. package/dist/client/analytics.d.ts.map +1 -1
  64. package/dist/client/analytics.js +141 -1
  65. package/dist/client/analytics.js.map +1 -1
  66. package/dist/client/builder-frame.d.ts +10 -0
  67. package/dist/client/builder-frame.d.ts.map +1 -0
  68. package/dist/client/builder-frame.js +94 -0
  69. package/dist/client/builder-frame.js.map +1 -0
  70. package/dist/client/composer/MentionPopover.d.ts.map +1 -1
  71. package/dist/client/composer/MentionPopover.js +5 -1
  72. package/dist/client/composer/MentionPopover.js.map +1 -1
  73. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  74. package/dist/client/composer/TiptapComposer.js +11 -6
  75. package/dist/client/composer/TiptapComposer.js.map +1 -1
  76. package/dist/client/error-format.d.ts +20 -1
  77. package/dist/client/error-format.d.ts.map +1 -1
  78. package/dist/client/error-format.js +53 -5
  79. package/dist/client/error-format.js.map +1 -1
  80. package/dist/client/index.d.ts +3 -1
  81. package/dist/client/index.d.ts.map +1 -1
  82. package/dist/client/index.js +3 -1
  83. package/dist/client/index.js.map +1 -1
  84. package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
  85. package/dist/client/notifications/NotificationsBell.js +28 -1
  86. package/dist/client/notifications/NotificationsBell.js.map +1 -1
  87. package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
  88. package/dist/client/onboarding/OnboardingPanel.js +88 -6
  89. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  90. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  91. package/dist/client/settings/SettingsPanel.js +145 -9
  92. package/dist/client/settings/SettingsPanel.js.map +1 -1
  93. package/dist/client/settings/useBuilderStatus.d.ts +13 -0
  94. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  95. package/dist/client/settings/useBuilderStatus.js +50 -9
  96. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  97. package/dist/client/sse-event-processor.d.ts +3 -0
  98. package/dist/client/sse-event-processor.d.ts.map +1 -1
  99. package/dist/client/sse-event-processor.js +88 -7
  100. package/dist/client/sse-event-processor.js.map +1 -1
  101. package/dist/client/tools/ToolsListPage.d.ts.map +1 -1
  102. package/dist/client/tools/ToolsListPage.js +16 -1
  103. package/dist/client/tools/ToolsListPage.js.map +1 -1
  104. package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -1
  105. package/dist/client/tools/ToolsSidebarSection.js +63 -8
  106. package/dist/client/tools/ToolsSidebarSection.js.map +1 -1
  107. package/dist/client/tools/tool-order.d.ts +7 -0
  108. package/dist/client/tools/tool-order.d.ts.map +1 -0
  109. package/dist/client/tools/tool-order.js +47 -0
  110. package/dist/client/tools/tool-order.js.map +1 -0
  111. package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
  112. package/dist/client/transcription/BuilderTranscriptionCta.js +71 -6
  113. package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -1
  114. package/dist/client/use-send-to-agent-chat.d.ts.map +1 -1
  115. package/dist/client/use-send-to-agent-chat.js +11 -3
  116. package/dist/client/use-send-to-agent-chat.js.map +1 -1
  117. package/dist/client/useProductionAgent.d.ts.map +1 -1
  118. package/dist/client/useProductionAgent.js +1 -1
  119. package/dist/client/useProductionAgent.js.map +1 -1
  120. package/dist/db/client.d.ts.map +1 -1
  121. package/dist/db/client.js +5 -1
  122. package/dist/db/client.js.map +1 -1
  123. package/dist/deploy/build.d.ts +1 -0
  124. package/dist/deploy/build.d.ts.map +1 -1
  125. package/dist/deploy/build.js +4 -1
  126. package/dist/deploy/build.js.map +1 -1
  127. package/dist/oauth-tokens/index.d.ts +1 -1
  128. package/dist/oauth-tokens/index.d.ts.map +1 -1
  129. package/dist/oauth-tokens/index.js +1 -1
  130. package/dist/oauth-tokens/index.js.map +1 -1
  131. package/dist/oauth-tokens/store.d.ts.map +1 -1
  132. package/dist/oauth-tokens/store.js +6 -0
  133. package/dist/oauth-tokens/store.js.map +1 -1
  134. package/dist/observability/store.d.ts.map +1 -1
  135. package/dist/observability/store.js +19 -19
  136. package/dist/observability/store.js.map +1 -1
  137. package/dist/onboarding/default-steps.d.ts.map +1 -1
  138. package/dist/onboarding/default-steps.js +95 -61
  139. package/dist/onboarding/default-steps.js.map +1 -1
  140. package/dist/onboarding/plugin.d.ts.map +1 -1
  141. package/dist/onboarding/plugin.js +17 -8
  142. package/dist/onboarding/plugin.js.map +1 -1
  143. package/dist/org/migrations.js +2 -2
  144. package/dist/org/migrations.js.map +1 -1
  145. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  146. package/dist/scripts/agent-engines/list-agent-engines.js +2 -3
  147. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  148. package/dist/scripts/db/exec.d.ts +2 -1
  149. package/dist/scripts/db/exec.d.ts.map +1 -1
  150. package/dist/scripts/db/exec.js +264 -61
  151. package/dist/scripts/db/exec.js.map +1 -1
  152. package/dist/scripts/db/schema.d.ts.map +1 -1
  153. package/dist/scripts/db/schema.js +16 -4
  154. package/dist/scripts/db/schema.js.map +1 -1
  155. package/dist/scripts/dev/index.d.ts.map +1 -1
  156. package/dist/scripts/dev/index.js +36 -11
  157. package/dist/scripts/dev/index.js.map +1 -1
  158. package/dist/scripts/manage-agent-loop-settings.d.ts +7 -0
  159. package/dist/scripts/manage-agent-loop-settings.d.ts.map +1 -0
  160. package/dist/scripts/manage-agent-loop-settings.js +63 -0
  161. package/dist/scripts/manage-agent-loop-settings.js.map +1 -0
  162. package/dist/scripts/runner.d.ts.map +1 -1
  163. package/dist/scripts/runner.js +11 -0
  164. package/dist/scripts/runner.js.map +1 -1
  165. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  166. package/dist/server/agent-chat-plugin.js +60 -18
  167. package/dist/server/agent-chat-plugin.js.map +1 -1
  168. package/dist/server/app-url.d.ts +5 -4
  169. package/dist/server/app-url.d.ts.map +1 -1
  170. package/dist/server/app-url.js +8 -4
  171. package/dist/server/app-url.js.map +1 -1
  172. package/dist/server/auth.d.ts +8 -0
  173. package/dist/server/auth.d.ts.map +1 -1
  174. package/dist/server/auth.js +82 -29
  175. package/dist/server/auth.js.map +1 -1
  176. package/dist/server/better-auth-instance.d.ts.map +1 -1
  177. package/dist/server/better-auth-instance.js +16 -5
  178. package/dist/server/better-auth-instance.js.map +1 -1
  179. package/dist/server/builder-browser.d.ts +12 -0
  180. package/dist/server/builder-browser.d.ts.map +1 -1
  181. package/dist/server/builder-browser.js +36 -4
  182. package/dist/server/builder-browser.js.map +1 -1
  183. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  184. package/dist/server/core-routes-plugin.js +350 -53
  185. package/dist/server/core-routes-plugin.js.map +1 -1
  186. package/dist/server/credential-provider.d.ts +21 -3
  187. package/dist/server/credential-provider.d.ts.map +1 -1
  188. package/dist/server/credential-provider.js +51 -21
  189. package/dist/server/credential-provider.js.map +1 -1
  190. package/dist/server/google-oauth.d.ts +3 -0
  191. package/dist/server/google-oauth.d.ts.map +1 -1
  192. package/dist/server/google-oauth.js +27 -3
  193. package/dist/server/google-oauth.js.map +1 -1
  194. package/dist/server/index.d.ts +4 -3
  195. package/dist/server/index.d.ts.map +1 -1
  196. package/dist/server/index.js +4 -3
  197. package/dist/server/index.js.map +1 -1
  198. package/dist/server/onboarding-html.js +2 -2
  199. package/dist/server/onboarding-html.js.map +1 -1
  200. package/dist/server/schema-prompt.d.ts.map +1 -1
  201. package/dist/server/schema-prompt.js +2 -1
  202. package/dist/server/schema-prompt.js.map +1 -1
  203. package/dist/server/security-headers.d.ts +3 -0
  204. package/dist/server/security-headers.d.ts.map +1 -1
  205. package/dist/server/security-headers.js +7 -1
  206. package/dist/server/security-headers.js.map +1 -1
  207. package/dist/server/ssr-handler.d.ts.map +1 -1
  208. package/dist/server/ssr-handler.js +31 -6
  209. package/dist/server/ssr-handler.js.map +1 -1
  210. package/dist/templates/default/_gitignore +5 -1
  211. package/dist/templates/default/app/root.tsx +1 -0
  212. package/dist/templates/default/public/favicon.svg +3 -3
  213. package/dist/templates/default/public/icon-180.svg +3 -3
  214. package/dist/templates/default/public/icon-192.svg +3 -3
  215. package/dist/templates/default/public/icon-512.svg +3 -3
  216. package/dist/templates/workspace-core/AGENTS.md +23 -7
  217. package/dist/templates/workspace-core/package.json +2 -1
  218. package/dist/templates/workspace-core/src/credentials.ts +22 -11
  219. package/dist/templates/workspace-root/.env.example +7 -0
  220. package/dist/templates/workspace-root/README.md +6 -3
  221. package/dist/templates/workspace-root/_gitignore +3 -0
  222. package/dist/templates/workspace-root/package.json +3 -1
  223. package/dist/templates/workspace-root/scripts/workspace-dev.ts +375 -0
  224. package/dist/tools/actions.d.ts.map +1 -1
  225. package/dist/tools/actions.js +2 -0
  226. package/dist/tools/actions.js.map +1 -1
  227. package/dist/tools/html-shell.d.ts.map +1 -1
  228. package/dist/tools/html-shell.js +13 -1
  229. package/dist/tools/html-shell.js.map +1 -1
  230. package/dist/tools/store.d.ts.map +1 -1
  231. package/dist/tools/store.js +10 -10
  232. package/dist/tools/store.js.map +1 -1
  233. package/dist/tracking/providers.d.ts +1 -0
  234. package/dist/tracking/providers.d.ts.map +1 -1
  235. package/dist/tracking/providers.js +72 -0
  236. package/dist/tracking/providers.js.map +1 -1
  237. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  238. package/dist/vite/action-types-plugin.js +106 -9
  239. package/dist/vite/action-types-plugin.js.map +1 -1
  240. package/dist/vite/client.d.ts.map +1 -1
  241. package/dist/vite/client.js +62 -1
  242. package/dist/vite/client.js.map +1 -1
  243. package/docs/content/authentication.md +17 -13
  244. package/docs/content/deployment.md +11 -11
  245. package/docs/content/mcp-clients.md +2 -2
  246. package/docs/content/onboarding.md +32 -30
  247. package/docs/content/security.md +1 -1
  248. package/docs/content/tools.md +4 -0
  249. package/package.json +2 -2
  250. package/src/templates/default/_gitignore +5 -1
  251. package/src/templates/default/app/root.tsx +1 -0
  252. package/src/templates/default/public/favicon.svg +3 -3
  253. package/src/templates/default/public/icon-180.svg +3 -3
  254. package/src/templates/default/public/icon-192.svg +3 -3
  255. package/src/templates/default/public/icon-512.svg +3 -3
  256. package/src/templates/workspace-core/AGENTS.md +23 -7
  257. package/src/templates/workspace-core/package.json +2 -1
  258. package/src/templates/workspace-core/src/credentials.ts +22 -11
  259. package/src/templates/workspace-root/.env.example +7 -0
  260. package/src/templates/workspace-root/README.md +6 -3
  261. package/src/templates/workspace-root/_gitignore +3 -0
  262. package/src/templates/workspace-root/package.json +3 -1
  263. package/src/templates/workspace-root/scripts/workspace-dev.ts +375 -0
@@ -6,6 +6,17 @@
6
6
  export function buildAssistantMessage(events, runId) {
7
7
  const content = [];
8
8
  let toolCallCounter = 0;
9
+ let loopLimit = null;
10
+ let runError = null;
11
+ const appendText = (text) => {
12
+ const last = content[content.length - 1];
13
+ if (last && last.type === "text") {
14
+ last.text = (last.text ?? "") + text;
15
+ }
16
+ else {
17
+ content.push({ type: "text", text });
18
+ }
19
+ };
9
20
  for (const { event } of events) {
10
21
  if (event.type === "clear") {
11
22
  content.length = 0;
@@ -13,13 +24,7 @@ export function buildAssistantMessage(events, runId) {
13
24
  continue;
14
25
  }
15
26
  if (event.type === "text") {
16
- const last = content[content.length - 1];
17
- if (last && last.type === "text") {
18
- last.text = (last.text ?? "") + (event.text ?? "");
19
- }
20
- else {
21
- content.push({ type: "text", text: event.text ?? "" });
22
- }
27
+ appendText(event.text ?? "");
23
28
  continue;
24
29
  }
25
30
  if (event.type === "tool_start") {
@@ -46,16 +51,53 @@ export function buildAssistantMessage(events, runId) {
46
51
  }
47
52
  continue;
48
53
  }
49
- // done, error, missing_api_key, loop_limit — terminal signals, not content
54
+ if (event.type === "loop_limit") {
55
+ loopLimit = {
56
+ ...(event.maxIterations ? { maxIterations: event.maxIterations } : {}),
57
+ };
58
+ appendText(`${content.length > 0 ? "\n\n" : ""}${event.maxIterations
59
+ ? `I reached the ${event.maxIterations}-step limit before finishing.`
60
+ : "I reached the step limit before finishing."}`);
61
+ continue;
62
+ }
63
+ if (event.type === "error") {
64
+ runError = {
65
+ message: event.error,
66
+ ...(event.errorCode ? { errorCode: event.errorCode } : {}),
67
+ ...(event.details ? { details: event.details } : {}),
68
+ ...(event.recoverable ? { recoverable: event.recoverable } : {}),
69
+ };
70
+ appendText(`${content.length > 0 ? "\n\n" : ""}Error: ${event.error}`);
71
+ continue;
72
+ }
73
+ // done, missing_api_key — terminal signals, not content
50
74
  }
51
75
  if (content.length === 0)
52
76
  return null;
77
+ const metadata = {};
78
+ if (runId)
79
+ metadata.runId = runId;
80
+ if (loopLimit || runError) {
81
+ metadata.custom = {
82
+ ...(loopLimit ? { loopLimit } : {}),
83
+ ...(runError
84
+ ? {
85
+ runError: {
86
+ ...runError,
87
+ ...(runId ? { runId } : {}),
88
+ },
89
+ }
90
+ : {}),
91
+ };
92
+ }
53
93
  return {
54
94
  id: `server-${runId ?? Date.now()}`,
55
95
  role: "assistant",
56
96
  content,
57
- status: { type: "complete", reason: "stop" },
58
- metadata: runId ? { runId } : {},
97
+ status: runError
98
+ ? { type: "incomplete", reason: "error" }
99
+ : { type: "complete", reason: "stop" },
100
+ metadata,
59
101
  };
60
102
  }
61
103
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"thread-data-builder.js","sourceRoot":"","sources":["../../src/agent/thread-data-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RunEvent } from \"./types.js\";\n\ninterface ContentPart {\n type: string;\n text?: string;\n toolCallId?: string;\n toolName?: string;\n argsText?: string;\n args?: Record<string, string>;\n result?: string;\n}\n\n/**\n * Reconstruct an assistant-ui message from raw agent run events.\n * Mirrors the client-side processEvent logic so the server can persist\n * the assistant's response even if the frontend is disconnected.\n */\nexport function buildAssistantMessage(\n events: RunEvent[],\n runId?: string,\n): {\n id: string;\n role: \"assistant\";\n content: ContentPart[];\n status: { type: \"complete\"; reason: \"stop\" };\n metadata: Record<string, unknown>;\n} | null {\n const content: ContentPart[] = [];\n let toolCallCounter = 0;\n\n for (const { event } of events) {\n if (event.type === \"clear\") {\n content.length = 0;\n toolCallCounter = 0;\n continue;\n }\n\n if (event.type === \"text\") {\n const last = content[content.length - 1];\n if (last && last.type === \"text\") {\n last.text = (last.text ?? \"\") + (event.text ?? \"\");\n } else {\n content.push({ type: \"text\", text: event.text ?? \"\" });\n }\n continue;\n }\n\n if (event.type === \"tool_start\") {\n const toolCallId = `tc_${++toolCallCounter}`;\n const args = (event.input ?? {}) as Record<string, string>;\n content.push({\n type: \"tool-call\",\n toolCallId,\n toolName: event.tool ?? \"unknown\",\n argsText: JSON.stringify(args),\n args,\n });\n continue;\n }\n\n if (event.type === \"tool_done\") {\n for (let i = content.length - 1; i >= 0; i--) {\n const part = content[i];\n if (\n part.type === \"tool-call\" &&\n part.toolName === event.tool &&\n part.result === undefined\n ) {\n part.result = event.result ?? \"\";\n break;\n }\n }\n continue;\n }\n\n // done, error, missing_api_key, loop_limit — terminal signals, not content\n }\n\n if (content.length === 0) return null;\n\n return {\n id: `server-${runId ?? Date.now()}`,\n role: \"assistant\",\n content,\n status: { type: \"complete\" as const, reason: \"stop\" as const },\n metadata: runId ? { runId } : {},\n };\n}\n\n/**\n * Extract title and preview from a thread runtime export.\n * Isomorphic — works on both server and client.\n */\nexport function extractThreadMeta(repo: any): {\n title: string;\n preview: string;\n} {\n const msgs = repo?.messages;\n if (!Array.isArray(msgs) || msgs.length === 0)\n return { title: \"\", preview: \"\" };\n\n let title = \"\";\n let preview = \"\";\n for (const entry of msgs) {\n // Support both wrapped ({ message: { role, content } }) and flat ({ role, content }) formats\n const msg = entry?.message ?? entry;\n if (msg.role !== \"user\") continue;\n const textParts = Array.isArray(msg.content)\n ? msg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\" \")\n : typeof msg.content === \"string\"\n ? msg.content\n : \"\";\n if (textParts.trim()) {\n if (!title) title = textParts.trim().slice(0, 80);\n preview = textParts.trim().slice(0, 120);\n }\n }\n return { title, preview };\n}\n"]}
1
+ {"version":3,"file":"thread-data-builder.js","sourceRoot":"","sources":["../../src/agent/thread-data-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RunEvent } from \"./types.js\";\n\ninterface ContentPart {\n type: string;\n text?: string;\n toolCallId?: string;\n toolName?: string;\n argsText?: string;\n args?: Record<string, string>;\n result?: string;\n}\n\n/**\n * Reconstruct an assistant-ui message from raw agent run events.\n * Mirrors the client-side processEvent logic so the server can persist\n * the assistant's response even if the frontend is disconnected.\n */\nexport function buildAssistantMessage(\n events: RunEvent[],\n runId?: string,\n): {\n id: string;\n role: \"assistant\";\n content: ContentPart[];\n status:\n | { type: \"complete\"; reason: \"stop\" }\n | { type: \"incomplete\"; reason: \"error\" };\n metadata: Record<string, unknown>;\n} | null {\n const content: ContentPart[] = [];\n let toolCallCounter = 0;\n let loopLimit: { maxIterations?: number } | null = null;\n let runError: {\n message: string;\n errorCode?: string;\n details?: string;\n recoverable?: boolean;\n } | null = null;\n\n const appendText = (text: string) => {\n const last = content[content.length - 1];\n if (last && last.type === \"text\") {\n last.text = (last.text ?? \"\") + text;\n } else {\n content.push({ type: \"text\", text });\n }\n };\n\n for (const { event } of events) {\n if (event.type === \"clear\") {\n content.length = 0;\n toolCallCounter = 0;\n continue;\n }\n\n if (event.type === \"text\") {\n appendText(event.text ?? \"\");\n continue;\n }\n\n if (event.type === \"tool_start\") {\n const toolCallId = `tc_${++toolCallCounter}`;\n const args = (event.input ?? {}) as Record<string, string>;\n content.push({\n type: \"tool-call\",\n toolCallId,\n toolName: event.tool ?? \"unknown\",\n argsText: JSON.stringify(args),\n args,\n });\n continue;\n }\n\n if (event.type === \"tool_done\") {\n for (let i = content.length - 1; i >= 0; i--) {\n const part = content[i];\n if (\n part.type === \"tool-call\" &&\n part.toolName === event.tool &&\n part.result === undefined\n ) {\n part.result = event.result ?? \"\";\n break;\n }\n }\n continue;\n }\n\n if (event.type === \"loop_limit\") {\n loopLimit = {\n ...(event.maxIterations ? { maxIterations: event.maxIterations } : {}),\n };\n appendText(\n `${content.length > 0 ? \"\\n\\n\" : \"\"}${\n event.maxIterations\n ? `I reached the ${event.maxIterations}-step limit before finishing.`\n : \"I reached the step limit before finishing.\"\n }`,\n );\n continue;\n }\n\n if (event.type === \"error\") {\n runError = {\n message: event.error,\n ...(event.errorCode ? { errorCode: event.errorCode } : {}),\n ...(event.details ? { details: event.details } : {}),\n ...(event.recoverable ? { recoverable: event.recoverable } : {}),\n };\n appendText(`${content.length > 0 ? \"\\n\\n\" : \"\"}Error: ${event.error}`);\n continue;\n }\n\n // done, missing_api_key — terminal signals, not content\n }\n\n if (content.length === 0) return null;\n\n const metadata: Record<string, unknown> = {};\n if (runId) metadata.runId = runId;\n if (loopLimit || runError) {\n metadata.custom = {\n ...(loopLimit ? { loopLimit } : {}),\n ...(runError\n ? {\n runError: {\n ...runError,\n ...(runId ? { runId } : {}),\n },\n }\n : {}),\n };\n }\n\n return {\n id: `server-${runId ?? Date.now()}`,\n role: \"assistant\",\n content,\n status: runError\n ? { type: \"incomplete\" as const, reason: \"error\" as const }\n : { type: \"complete\" as const, reason: \"stop\" as const },\n metadata,\n };\n}\n\n/**\n * Extract title and preview from a thread runtime export.\n * Isomorphic — works on both server and client.\n */\nexport function extractThreadMeta(repo: any): {\n title: string;\n preview: string;\n} {\n const msgs = repo?.messages;\n if (!Array.isArray(msgs) || msgs.length === 0)\n return { title: \"\", preview: \"\" };\n\n let title = \"\";\n let preview = \"\";\n for (const entry of msgs) {\n // Support both wrapped ({ message: { role, content } }) and flat ({ role, content }) formats\n const msg = entry?.message ?? entry;\n if (msg.role !== \"user\") continue;\n const textParts = Array.isArray(msg.content)\n ? msg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\" \")\n : typeof msg.content === \"string\"\n ? msg.content\n : \"\";\n if (textParts.trim()) {\n if (!title) title = textParts.trim().slice(0, 80);\n preview = textParts.trim().slice(0, 120);\n }\n }\n return { title, preview };\n}\n"]}
@@ -0,0 +1,37 @@
1
+ import type { ActionEntry } from "./production-agent.js";
2
+ export declare const TOOL_SEARCH_ACTION_NAME = "tool-search";
3
+ type ToolSearchArgs = {
4
+ query?: unknown;
5
+ limit?: unknown;
6
+ includeSchemas?: unknown;
7
+ };
8
+ type ToolParameterSummary = {
9
+ name: string;
10
+ type?: string;
11
+ required: boolean;
12
+ description?: string;
13
+ enum?: string[];
14
+ };
15
+ type ToolSearchResult = {
16
+ name: string;
17
+ kind: "action" | "mcp";
18
+ source?: string;
19
+ description: string;
20
+ score: number;
21
+ parameters: ToolParameterSummary[];
22
+ inputSchema?: unknown;
23
+ };
24
+ type ToolSearchOptions = {
25
+ defaultLimit?: number;
26
+ maxLimit?: number;
27
+ };
28
+ export declare function createToolSearchEntry(getRegistry: () => Record<string, ActionEntry>, options?: ToolSearchOptions): ActionEntry;
29
+ export declare function attachToolSearch(registry: Record<string, ActionEntry>, options?: ToolSearchOptions): Record<string, ActionEntry>;
30
+ export declare function searchToolRegistry(registry: Record<string, ActionEntry>, args?: ToolSearchArgs, options?: ToolSearchOptions): {
31
+ query: string;
32
+ totalTools: number;
33
+ count: number;
34
+ results: ToolSearchResult[];
35
+ };
36
+ export {};
37
+ //# sourceMappingURL=tool-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-search.d.ts","sourceRoot":"","sources":["../../src/agent/tool-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIzD,eAAO,MAAM,uBAAuB,gBAAgB,CAAC;AAErD,KAAK,cAAc,GAAG;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAKF,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAC9C,OAAO,GAAE,iBAAsB,GAC9B,WAAW,CA+Bb;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACrC,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAM7B;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACrC,IAAI,GAAE,cAAmB,EACzB,OAAO,GAAE,iBAAsB,GAC9B;IACD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B,CA2DA"}
@@ -0,0 +1,201 @@
1
+ import { parseMcpToolName } from "../mcp-client/manager.js";
2
+ import { isMcpToolAllowedForRequest } from "../mcp-client/visibility.js";
3
+ export const TOOL_SEARCH_ACTION_NAME = "tool-search";
4
+ const DEFAULT_LIMIT = 8;
5
+ const MAX_LIMIT = 25;
6
+ export function createToolSearchEntry(getRegistry, options = {}) {
7
+ return {
8
+ tool: {
9
+ description: "Search the live registry of callable tools/actions, including connected MCP server tools named `mcp__<server>__<tool>`. Use this when you need a capability but are not sure which tool to call, especially after users connect new MCP servers. Returns exact tool names and parameter summaries so you can call the matching tool directly.",
10
+ parameters: {
11
+ type: "object",
12
+ properties: {
13
+ query: {
14
+ type: "string",
15
+ description: "What capability to find, e.g. `send slack message`, `create calendar event`, `zapier gmail`, or `browser screenshot`.",
16
+ },
17
+ limit: {
18
+ type: "number",
19
+ description: `Maximum results to return. Defaults to ${options.defaultLimit ?? DEFAULT_LIMIT}.`,
20
+ },
21
+ includeSchemas: {
22
+ type: "boolean",
23
+ description: "When true, include each matching tool's full input schema. Default false.",
24
+ },
25
+ },
26
+ required: ["query"],
27
+ },
28
+ },
29
+ http: false,
30
+ readOnly: true,
31
+ run: async (args) => searchToolRegistry(getRegistry(), args, options),
32
+ };
33
+ }
34
+ export function attachToolSearch(registry, options = {}) {
35
+ registry[TOOL_SEARCH_ACTION_NAME] = createToolSearchEntry(() => registry, options);
36
+ return registry;
37
+ }
38
+ export function searchToolRegistry(registry, args = {}, options = {}) {
39
+ const query = String(args.query ?? "").trim();
40
+ const includeSchemas = parseBoolean(args.includeSchemas);
41
+ const limit = parseLimit(args.limit, options.defaultLimit ?? DEFAULT_LIMIT, options.maxLimit ?? MAX_LIMIT);
42
+ const queryTokens = tokenize(query);
43
+ const candidates = [];
44
+ let totalTools = 0;
45
+ for (const [name, entry] of Object.entries(registry)) {
46
+ if (!entry?.tool || name === TOOL_SEARCH_ACTION_NAME)
47
+ continue;
48
+ if (name.startsWith("mcp__") && !isMcpToolAllowedForRequest(name)) {
49
+ continue;
50
+ }
51
+ totalTools++;
52
+ const description = normalizeWhitespace(entry.tool.description ?? "");
53
+ const parameters = summarizeParameters(entry.tool.parameters);
54
+ const parsedMcp = parseMcpToolName(name);
55
+ const kind = parsedMcp ? "mcp" : "action";
56
+ const source = parsedMcp?.serverId;
57
+ const score = scoreTool({
58
+ query,
59
+ queryTokens,
60
+ name,
61
+ source,
62
+ description,
63
+ parameters,
64
+ kind,
65
+ });
66
+ if (queryTokens.length > 0 && score <= 0)
67
+ continue;
68
+ candidates.push({
69
+ name,
70
+ kind,
71
+ ...(source ? { source } : {}),
72
+ description,
73
+ score,
74
+ parameters,
75
+ ...(includeSchemas ? { inputSchema: entry.tool.parameters ?? {} } : {}),
76
+ });
77
+ }
78
+ candidates.sort((a, b) => {
79
+ if (b.score !== a.score)
80
+ return b.score - a.score;
81
+ return a.name.localeCompare(b.name);
82
+ });
83
+ return {
84
+ query,
85
+ totalTools,
86
+ count: Math.min(candidates.length, limit),
87
+ results: candidates.slice(0, limit),
88
+ };
89
+ }
90
+ function parseLimit(value, fallback, max) {
91
+ const n = typeof value === "number"
92
+ ? value
93
+ : typeof value === "string" && value.trim()
94
+ ? Number(value)
95
+ : fallback;
96
+ if (!Number.isFinite(n) || n <= 0)
97
+ return fallback;
98
+ return Math.max(1, Math.min(max, Math.floor(n)));
99
+ }
100
+ function parseBoolean(value) {
101
+ if (typeof value === "boolean")
102
+ return value;
103
+ if (typeof value !== "string")
104
+ return false;
105
+ const normalized = value.trim().toLowerCase();
106
+ return normalized === "true" || normalized === "1" || normalized === "yes";
107
+ }
108
+ function summarizeParameters(schema) {
109
+ if (!schema || typeof schema !== "object")
110
+ return [];
111
+ const obj = schema;
112
+ const properties = obj.properties;
113
+ if (!properties || typeof properties !== "object")
114
+ return [];
115
+ const required = new Set(Array.isArray(obj.required)
116
+ ? obj.required.filter((value) => typeof value === "string")
117
+ : []);
118
+ return Object.entries(properties).map(([name, raw]) => {
119
+ const prop = raw && typeof raw === "object" ? raw : {};
120
+ const enumValues = Array.isArray(prop.enum)
121
+ ? prop.enum.map((value) => String(value)).slice(0, 20)
122
+ : undefined;
123
+ return {
124
+ name,
125
+ type: summarizeType(prop.type),
126
+ required: required.has(name),
127
+ description: typeof prop.description === "string"
128
+ ? normalizeWhitespace(prop.description)
129
+ : undefined,
130
+ ...(enumValues && enumValues.length > 0 ? { enum: enumValues } : {}),
131
+ };
132
+ });
133
+ }
134
+ function summarizeType(value) {
135
+ if (typeof value === "string")
136
+ return value;
137
+ if (Array.isArray(value)) {
138
+ const parts = value.filter((v) => typeof v === "string");
139
+ return parts.length > 0 ? parts.join(" | ") : undefined;
140
+ }
141
+ return undefined;
142
+ }
143
+ function scoreTool(input) {
144
+ if (input.queryTokens.length === 0)
145
+ return 1;
146
+ const name = searchableText(input.name);
147
+ const source = searchableText(input.source ?? "");
148
+ const description = searchableText(input.description);
149
+ const params = searchableText(input.parameters
150
+ .map((p) => `${p.name} ${p.type ?? ""} ${p.description ?? ""}`)
151
+ .join(" "));
152
+ const all = `${name} ${source} ${description} ${params} ${input.kind}`;
153
+ const phrase = searchableText(input.query);
154
+ let score = 0;
155
+ if (name.includes(phrase))
156
+ score += 14;
157
+ if (source && source.includes(phrase))
158
+ score += 10;
159
+ if (description.includes(phrase))
160
+ score += 8;
161
+ if (params.includes(phrase))
162
+ score += 5;
163
+ for (const token of input.queryTokens) {
164
+ if (name.split(" ").includes(token))
165
+ score += 9;
166
+ else if (name.includes(token))
167
+ score += 6;
168
+ if (source) {
169
+ if (source.split(" ").includes(token))
170
+ score += 6;
171
+ else if (source.includes(token))
172
+ score += 3;
173
+ }
174
+ if (description.includes(token))
175
+ score += 3;
176
+ if (params.includes(token))
177
+ score += 2;
178
+ if (all.includes(token))
179
+ score += 1;
180
+ }
181
+ return score;
182
+ }
183
+ function tokenize(value) {
184
+ const seen = new Set();
185
+ for (const token of searchableText(value).split(" ")) {
186
+ if (token.length > 0)
187
+ seen.add(token);
188
+ }
189
+ return Array.from(seen);
190
+ }
191
+ function searchableText(value) {
192
+ return value
193
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
194
+ .toLowerCase()
195
+ .replace(/[^a-z0-9]+/g, " ")
196
+ .trim();
197
+ }
198
+ function normalizeWhitespace(value) {
199
+ return value.replace(/\s+/g, " ").trim();
200
+ }
201
+ //# sourceMappingURL=tool-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-search.js","sourceRoot":"","sources":["../../src/agent/tool-search.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionEntry } from \"./production-agent.js\";\nimport { parseMcpToolName } from \"../mcp-client/manager.js\";\nimport { isMcpToolAllowedForRequest } from \"../mcp-client/visibility.js\";\n\nexport const TOOL_SEARCH_ACTION_NAME = \"tool-search\";\n\ntype ToolSearchArgs = {\n query?: unknown;\n limit?: unknown;\n includeSchemas?: unknown;\n};\n\ntype ToolParameterSummary = {\n name: string;\n type?: string;\n required: boolean;\n description?: string;\n enum?: string[];\n};\n\ntype ToolSearchResult = {\n name: string;\n kind: \"action\" | \"mcp\";\n source?: string;\n description: string;\n score: number;\n parameters: ToolParameterSummary[];\n inputSchema?: unknown;\n};\n\ntype ToolSearchOptions = {\n defaultLimit?: number;\n maxLimit?: number;\n};\n\nconst DEFAULT_LIMIT = 8;\nconst MAX_LIMIT = 25;\n\nexport function createToolSearchEntry(\n getRegistry: () => Record<string, ActionEntry>,\n options: ToolSearchOptions = {},\n): ActionEntry {\n return {\n tool: {\n description:\n \"Search the live registry of callable tools/actions, including connected MCP server tools named `mcp__<server>__<tool>`. Use this when you need a capability but are not sure which tool to call, especially after users connect new MCP servers. Returns exact tool names and parameter summaries so you can call the matching tool directly.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"What capability to find, e.g. `send slack message`, `create calendar event`, `zapier gmail`, or `browser screenshot`.\",\n },\n limit: {\n type: \"number\",\n description: `Maximum results to return. Defaults to ${options.defaultLimit ?? DEFAULT_LIMIT}.`,\n } as any,\n includeSchemas: {\n type: \"boolean\",\n description:\n \"When true, include each matching tool's full input schema. Default false.\",\n } as any,\n },\n required: [\"query\"],\n },\n },\n http: false,\n readOnly: true,\n run: async (args: Record<string, string>) =>\n searchToolRegistry(getRegistry(), args, options),\n };\n}\n\nexport function attachToolSearch(\n registry: Record<string, ActionEntry>,\n options: ToolSearchOptions = {},\n): Record<string, ActionEntry> {\n registry[TOOL_SEARCH_ACTION_NAME] = createToolSearchEntry(\n () => registry,\n options,\n );\n return registry;\n}\n\nexport function searchToolRegistry(\n registry: Record<string, ActionEntry>,\n args: ToolSearchArgs = {},\n options: ToolSearchOptions = {},\n): {\n query: string;\n totalTools: number;\n count: number;\n results: ToolSearchResult[];\n} {\n const query = String(args.query ?? \"\").trim();\n const includeSchemas = parseBoolean(args.includeSchemas);\n const limit = parseLimit(\n args.limit,\n options.defaultLimit ?? DEFAULT_LIMIT,\n options.maxLimit ?? MAX_LIMIT,\n );\n const queryTokens = tokenize(query);\n\n const candidates: ToolSearchResult[] = [];\n let totalTools = 0;\n\n for (const [name, entry] of Object.entries(registry)) {\n if (!entry?.tool || name === TOOL_SEARCH_ACTION_NAME) continue;\n if (name.startsWith(\"mcp__\") && !isMcpToolAllowedForRequest(name)) {\n continue;\n }\n\n totalTools++;\n const description = normalizeWhitespace(entry.tool.description ?? \"\");\n const parameters = summarizeParameters(entry.tool.parameters);\n const parsedMcp = parseMcpToolName(name);\n const kind = parsedMcp ? \"mcp\" : \"action\";\n const source = parsedMcp?.serverId;\n const score = scoreTool({\n query,\n queryTokens,\n name,\n source,\n description,\n parameters,\n kind,\n });\n\n if (queryTokens.length > 0 && score <= 0) continue;\n\n candidates.push({\n name,\n kind,\n ...(source ? { source } : {}),\n description,\n score,\n parameters,\n ...(includeSchemas ? { inputSchema: entry.tool.parameters ?? {} } : {}),\n });\n }\n\n candidates.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.name.localeCompare(b.name);\n });\n\n return {\n query,\n totalTools,\n count: Math.min(candidates.length, limit),\n results: candidates.slice(0, limit),\n };\n}\n\nfunction parseLimit(value: unknown, fallback: number, max: number): number {\n const n =\n typeof value === \"number\"\n ? value\n : typeof value === \"string\" && value.trim()\n ? Number(value)\n : fallback;\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.max(1, Math.min(max, Math.floor(n)));\n}\n\nfunction parseBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value !== \"string\") return false;\n const normalized = value.trim().toLowerCase();\n return normalized === \"true\" || normalized === \"1\" || normalized === \"yes\";\n}\n\nfunction summarizeParameters(schema: unknown): ToolParameterSummary[] {\n if (!schema || typeof schema !== \"object\") return [];\n const obj = schema as {\n properties?: Record<string, unknown>;\n required?: unknown;\n };\n const properties = obj.properties;\n if (!properties || typeof properties !== \"object\") return [];\n const required = new Set(\n Array.isArray(obj.required)\n ? obj.required.filter(\n (value): value is string => typeof value === \"string\",\n )\n : [],\n );\n\n return Object.entries(properties).map(([name, raw]) => {\n const prop =\n raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : {};\n const enumValues = Array.isArray(prop.enum)\n ? prop.enum.map((value) => String(value)).slice(0, 20)\n : undefined;\n return {\n name,\n type: summarizeType(prop.type),\n required: required.has(name),\n description:\n typeof prop.description === \"string\"\n ? normalizeWhitespace(prop.description)\n : undefined,\n ...(enumValues && enumValues.length > 0 ? { enum: enumValues } : {}),\n };\n });\n}\n\nfunction summarizeType(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) {\n const parts = value.filter((v): v is string => typeof v === \"string\");\n return parts.length > 0 ? parts.join(\" | \") : undefined;\n }\n return undefined;\n}\n\nfunction scoreTool(input: {\n query: string;\n queryTokens: string[];\n name: string;\n source?: string;\n description: string;\n parameters: ToolParameterSummary[];\n kind: \"action\" | \"mcp\";\n}): number {\n if (input.queryTokens.length === 0) return 1;\n\n const name = searchableText(input.name);\n const source = searchableText(input.source ?? \"\");\n const description = searchableText(input.description);\n const params = searchableText(\n input.parameters\n .map((p) => `${p.name} ${p.type ?? \"\"} ${p.description ?? \"\"}`)\n .join(\" \"),\n );\n const all = `${name} ${source} ${description} ${params} ${input.kind}`;\n const phrase = searchableText(input.query);\n\n let score = 0;\n if (name.includes(phrase)) score += 14;\n if (source && source.includes(phrase)) score += 10;\n if (description.includes(phrase)) score += 8;\n if (params.includes(phrase)) score += 5;\n\n for (const token of input.queryTokens) {\n if (name.split(\" \").includes(token)) score += 9;\n else if (name.includes(token)) score += 6;\n\n if (source) {\n if (source.split(\" \").includes(token)) score += 6;\n else if (source.includes(token)) score += 3;\n }\n\n if (description.includes(token)) score += 3;\n if (params.includes(token)) score += 2;\n if (all.includes(token)) score += 1;\n }\n\n return score;\n}\n\nfunction tokenize(value: string): string[] {\n const seen = new Set<string>();\n for (const token of searchableText(value).split(\" \")) {\n if (token.length > 0) seen.add(token);\n }\n return Array.from(seen);\n}\n\nfunction searchableText(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \" \")\n .trim();\n}\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n"]}
@@ -53,6 +53,8 @@ export interface AgentChatRequest {
53
53
  references?: AgentChatReference[];
54
54
  threadId?: string;
55
55
  attachments?: AgentChatAttachment[];
56
+ /** Execution mode for this turn. Plan mode is read-only and proposes before acting. */
57
+ mode?: "act" | "plan";
56
58
  /** Per-request model override (ephemeral, from the composer model picker). */
57
59
  model?: string;
58
60
  /** Per-request engine override (sent alongside model for cross-provider switches). */
@@ -107,10 +109,15 @@ export type AgentChatEvent = {
107
109
  errorCode?: string;
108
110
  /** Optional link paired with errorCode — e.g. Builder billing page. */
109
111
  upgradeUrl?: string;
112
+ /** Optional details for expandable UI/debugging. */
113
+ details?: string;
114
+ /** True when the user can reasonably continue/retry from partial work. */
115
+ recoverable?: boolean;
110
116
  } | {
111
117
  type: "missing_api_key";
112
118
  } | {
113
119
  type: "loop_limit";
120
+ maxIterations?: number;
114
121
  } | {
115
122
  type: "clear";
116
123
  };
@@ -118,5 +125,5 @@ export interface RunEvent {
118
125
  seq: number;
119
126
  event: AgentChatEvent;
120
127
  }
121
- export type RunStatus = "running" | "completed" | "errored";
128
+ export type RunStatus = "running" | "completed" | "errored" | "aborted";
122
129
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface ActionTool {\n description: string;\n parameters?: {\n type: \"object\";\n properties: Record<\n string,\n {\n type: string;\n description?: string;\n enum?: string[];\n }\n >;\n required?: string[];\n };\n}\n\n/** @deprecated Use `ActionTool` instead */\nexport type ScriptTool = ActionTool;\n\nexport interface AgentMessage {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface AgentChatReference {\n type: \"file\" | \"skill\" | \"mention\" | \"agent\" | \"custom-agent\";\n path: string;\n name: string;\n source: string;\n refType?: string;\n refId?: string;\n}\n\nexport interface MentionProviderItem {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n refType: string;\n refId?: string;\n refPath?: string;\n}\n\nexport interface MentionProvider {\n label: string;\n icon?: string;\n search: (\n query: string,\n /** The H3 event for the current request — use to make internal API calls */\n event?: any,\n ) => MentionProviderItem[] | Promise<MentionProviderItem[]>;\n}\n\nexport interface AgentChatAttachment {\n type: string;\n name: string;\n data?: string;\n contentType?: string;\n text?: string;\n}\n\nexport interface AgentChatRequest {\n message: string;\n history?: AgentMessage[];\n references?: AgentChatReference[];\n threadId?: string;\n attachments?: AgentChatAttachment[];\n /** Per-request model override (ephemeral, from the composer model picker). */\n model?: string;\n /** Per-request engine override (sent alongside model for cross-provider switches). */\n engine?: string;\n /** Usage-tracking label for this call (e.g. \"chat\", \"summarize\"). Default: \"chat\". */\n usageLabel?: string;\n}\n\nexport type AgentChatEvent =\n | { type: \"text\"; text: string }\n | { type: \"tool_start\"; tool: string; input: Record<string, string> }\n | { type: \"tool_done\"; tool: string; result: string }\n | {\n type: \"agent_call\";\n agent: string;\n status: \"start\" | \"done\" | \"error\";\n }\n | { type: \"agent_call_text\"; agent: string; text: string }\n | {\n type: \"agent_task\";\n taskId: string;\n threadId: string;\n description: string;\n status: \"running\" | \"completed\" | \"errored\";\n }\n | {\n type: \"agent_task_update\";\n taskId: string;\n preview: string;\n currentStep?: string;\n }\n | {\n type: \"agent_task_complete\";\n taskId: string;\n summary: string;\n }\n | { type: \"done\" }\n | {\n type: \"error\";\n error: string;\n /**\n * Optional machine-readable error code. Builder gateway uses codes\n * like \"credits-limit-monthly\" / \"unauthorized\" / \"gateway_not_enabled\"\n * so the chat UI can render a structured CTA (e.g. upgrade button).\n */\n errorCode?: string;\n /** Optional link paired with errorCode — e.g. Builder billing page. */\n upgradeUrl?: string;\n }\n | { type: \"missing_api_key\" }\n | { type: \"loop_limit\" }\n | { type: \"clear\" };\n\nexport interface RunEvent {\n seq: number;\n event: AgentChatEvent;\n}\n\nexport type RunStatus = \"running\" | \"completed\" | \"errored\";\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface ActionTool {\n description: string;\n parameters?: {\n type: \"object\";\n properties: Record<\n string,\n {\n type: string;\n description?: string;\n enum?: string[];\n }\n >;\n required?: string[];\n };\n}\n\n/** @deprecated Use `ActionTool` instead */\nexport type ScriptTool = ActionTool;\n\nexport interface AgentMessage {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface AgentChatReference {\n type: \"file\" | \"skill\" | \"mention\" | \"agent\" | \"custom-agent\";\n path: string;\n name: string;\n source: string;\n refType?: string;\n refId?: string;\n}\n\nexport interface MentionProviderItem {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n refType: string;\n refId?: string;\n refPath?: string;\n}\n\nexport interface MentionProvider {\n label: string;\n icon?: string;\n search: (\n query: string,\n /** The H3 event for the current request — use to make internal API calls */\n event?: any,\n ) => MentionProviderItem[] | Promise<MentionProviderItem[]>;\n}\n\nexport interface AgentChatAttachment {\n type: string;\n name: string;\n data?: string;\n contentType?: string;\n text?: string;\n}\n\nexport interface AgentChatRequest {\n message: string;\n history?: AgentMessage[];\n references?: AgentChatReference[];\n threadId?: string;\n attachments?: AgentChatAttachment[];\n /** Execution mode for this turn. Plan mode is read-only and proposes before acting. */\n mode?: \"act\" | \"plan\";\n /** Per-request model override (ephemeral, from the composer model picker). */\n model?: string;\n /** Per-request engine override (sent alongside model for cross-provider switches). */\n engine?: string;\n /** Usage-tracking label for this call (e.g. \"chat\", \"summarize\"). Default: \"chat\". */\n usageLabel?: string;\n}\n\nexport type AgentChatEvent =\n | { type: \"text\"; text: string }\n | { type: \"tool_start\"; tool: string; input: Record<string, string> }\n | { type: \"tool_done\"; tool: string; result: string }\n | {\n type: \"agent_call\";\n agent: string;\n status: \"start\" | \"done\" | \"error\";\n }\n | { type: \"agent_call_text\"; agent: string; text: string }\n | {\n type: \"agent_task\";\n taskId: string;\n threadId: string;\n description: string;\n status: \"running\" | \"completed\" | \"errored\";\n }\n | {\n type: \"agent_task_update\";\n taskId: string;\n preview: string;\n currentStep?: string;\n }\n | {\n type: \"agent_task_complete\";\n taskId: string;\n summary: string;\n }\n | { type: \"done\" }\n | {\n type: \"error\";\n error: string;\n /**\n * Optional machine-readable error code. Builder gateway uses codes\n * like \"credits-limit-monthly\" / \"unauthorized\" / \"gateway_not_enabled\"\n * so the chat UI can render a structured CTA (e.g. upgrade button).\n */\n errorCode?: string;\n /** Optional link paired with errorCode — e.g. Builder billing page. */\n upgradeUrl?: string;\n /** Optional details for expandable UI/debugging. */\n details?: string;\n /** True when the user can reasonably continue/retry from partial work. */\n recoverable?: boolean;\n }\n | { type: \"missing_api_key\" }\n | { type: \"loop_limit\"; maxIterations?: number }\n | { type: \"clear\" };\n\nexport interface RunEvent {\n seq: number;\n event: AgentChatEvent;\n}\n\nexport type RunStatus = \"running\" | \"completed\" | \"errored\" | \"aborted\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/cli/create.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAgCvE,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CA6Bf;AA+FD,iBAAe,qBAAqB,CAClC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAoCf;AAMD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CAkCf;AAmHD;;;;;GAKG;AACH,iBAAe,mBAAmB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAuCf;AAsCD;;;;GAIG;AACH,iBAAe,wBAAwB,CACrC,aAAa,EAAE,MAAM,EAAE,EACvB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA2Ef;AAED;;;GAGG;AACH,iBAAS,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAgEpE;AAwGD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,GACf;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkB7D;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B,yCAAyC;AACzC,OAAO,EACL,qBAAqB,IAAI,sBAAsB,EAC/C,mBAAmB,IAAI,oBAAoB,EAC3C,wBAAwB,IAAI,yBAAyB,EACrD,qBAAqB,IAAI,sBAAsB,EAC/C,WAAW,IAAI,YAAY,EAC3B,kBAAkB,IAAI,mBAAmB,EACzC,eAAe,IAAI,gBAAgB,EACnC,wBAAwB,IAAI,yBAAyB,EACrD,oBAAoB,IAAI,qBAAqB,GAC9C,CAAC;AAkEF;;;;;GAKG;AACH,iBAAS,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+B7C;AASD,iBAAS,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQ9D;AAED,iBAAS,wBAAwB,IAAI,MAAM,CAc1C;AAcD,iBAAS,oBAAoB,IAAI,MAAM,CAMtC;AA4DD,iBAAS,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI1C"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/cli/create.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAgCvE,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAmGD,iBAAe,qBAAqB,CAClC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAoCf;AAMD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CAkCf;AA8HD;;;;;GAKG;AACH,iBAAe,mBAAmB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAuCf;AAsCD;;;;GAIG;AACH,iBAAe,wBAAwB,CACrC,aAAa,EAAE,MAAM,EAAE,EACvB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA2Ef;AAED;;;GAGG;AACH,iBAAS,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAiEpE;AAgHD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,GACf;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkB7D;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B,yCAAyC;AACzC,OAAO,EACL,qBAAqB,IAAI,sBAAsB,EAC/C,mBAAmB,IAAI,oBAAoB,EAC3C,wBAAwB,IAAI,yBAAyB,EACrD,qBAAqB,IAAI,sBAAsB,EAC/C,WAAW,IAAI,YAAY,EAC3B,kBAAkB,IAAI,mBAAmB,EACzC,eAAe,IAAI,gBAAgB,EACnC,wBAAwB,IAAI,yBAAyB,EACrD,oBAAoB,IAAI,qBAAqB,GAC9C,CAAC;AAkEF;;;;;GAKG;AACH,iBAAS,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+B7C;AASD,iBAAS,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQ9D;AAED,iBAAS,wBAAwB,IAAI,MAAM,CAc1C;AAcD,iBAAS,oBAAoB,IAAI,MAAM,CAMtC;AA0FD,iBAAS,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI1C"}
@@ -78,7 +78,9 @@ async function createWorkspaceInteractive(name, opts, clack) {
78
78
  const preselected = parseTemplateList(opts?.template);
79
79
  const templates = preselected.length > 0
80
80
  ? preselected
81
- : await promptTemplatePicker(preselected, clack);
81
+ : await promptTemplatePicker(preselected, clack, {
82
+ defaultTemplates: ["starter", "dispatch"],
83
+ });
82
84
  if (templates.length === 0) {
83
85
  clack.cancel("No apps selected. Cancelled.");
84
86
  process.exit(0);
@@ -94,7 +96,7 @@ async function createWorkspaceInteractive(name, opts, clack) {
94
96
  try {
95
97
  await scaffoldWorkspaceRoot(targetDir, name);
96
98
  const workspaceCoreName = `@${name}/core-module`;
97
- updateWorkspaceDevScript(targetDir, firstApp);
99
+ ensureWorkspaceGatewayDevScript(targetDir);
98
100
  for (const t of templates) {
99
101
  const appDir = path.join(targetDir, "apps", t);
100
102
  await scaffoldAppTemplate(appDir, t);
@@ -102,11 +104,13 @@ async function createWorkspaceInteractive(name, opts, clack) {
102
104
  workspacifyApp({
103
105
  appDir,
104
106
  appName: t,
107
+ templateName: t,
105
108
  workspaceRoot: targetDir,
106
109
  workspaceCoreName,
107
110
  coreDependencyVersion: getCoreDependencyVersion(),
108
111
  });
109
112
  fixPackageJsonName(appDir, t);
113
+ rewriteNetlifyToml(appDir, t, "workspace");
110
114
  renameGitignore(appDir);
111
115
  // Each app owns its own .claude / .agents symlinks.
112
116
  setupAgentSymlinks(appDir);
@@ -125,7 +129,7 @@ async function createWorkspaceInteractive(name, opts, clack) {
125
129
  ``,
126
130
  ` cd ${name}`,
127
131
  ` pnpm install`,
128
- ` pnpm --filter ${firstApp} dev`,
132
+ ` pnpm dev`,
129
133
  ``,
130
134
  `Add another app later: agent-native add-app`,
131
135
  `Deploy the whole workspace: agent-native deploy`,
@@ -216,11 +220,13 @@ async function scaffoldOneAppIntoWorkspace(workspace, appName, templateName, cla
216
220
  workspacifyApp({
217
221
  appDir,
218
222
  appName,
223
+ templateName,
219
224
  workspaceRoot: workspace.workspaceRoot,
220
225
  workspaceCoreName: workspace.workspaceCoreName,
221
226
  coreDependencyVersion: getCoreDependencyVersion(),
222
227
  });
223
228
  fixPackageJsonName(appDir, appName);
229
+ rewriteNetlifyToml(appDir, appName, "workspace");
224
230
  renameGitignore(appDir);
225
231
  setupAgentSymlinks(appDir);
226
232
  await scaffoldRequiredPackages([templateName], workspace.workspaceRoot);
@@ -231,7 +237,14 @@ async function scaffoldOneAppIntoWorkspace(workspace, appName, templateName, cla
231
237
  clack.cancel(err?.message ?? String(err));
232
238
  process.exit(1);
233
239
  }
234
- clack.outro(`Done!\n\n pnpm install\n pnpm --filter ${appName} dev`);
240
+ clack.outro([
241
+ `Done!`,
242
+ ``,
243
+ ` pnpm install`,
244
+ ` pnpm dev`,
245
+ ``,
246
+ `The workspace gateway will detect apps/${appName} and serve it at /${appName}.`,
247
+ ].join("\n"));
235
248
  }
236
249
  /* ─────────────────────────────────────────────────────────────────────────
237
250
  * Standalone creation (escape hatch)
@@ -449,6 +462,7 @@ function postProcessStandalone(name, targetDir) {
449
462
  const appTitle = titleCase(name);
450
463
  replacePlaceholders(targetDir, name, appTitle);
451
464
  fixPackageJsonName(targetDir, name);
465
+ rewriteNetlifyToml(targetDir, name, "standalone");
452
466
  for (const base of ["learnings"]) {
453
467
  const defaultsFile = path.join(targetDir, `${base}.defaults.md`);
454
468
  const targetFile = path.join(targetDir, `${base}.md`);
@@ -556,9 +570,11 @@ async function promptTemplatePicker(preselected, clack, opts) {
556
570
  // back to "starter" when that's available and nothing else is pre-picked.
557
571
  const defaults = preselected.length > 0
558
572
  ? preselected.filter((p) => options.some((o) => o.value === p))
559
- : options.some((o) => o.value === "starter")
560
- ? ["starter"]
561
- : [];
573
+ : opts?.defaultTemplates
574
+ ? opts.defaultTemplates.filter((p) => options.some((o) => o.value === p))
575
+ : options.some((o) => o.value === "starter")
576
+ ? ["starter"]
577
+ : [];
562
578
  const baseMessage = opts?.message ?? "Which apps would you like to include?";
563
579
  const result = await clack.multiselect({
564
580
  message: `${baseMessage}\n (↑/↓ move · space to toggle · enter to confirm)`,
@@ -777,18 +793,37 @@ function rewriteCoreDependencyVersions(projectDir) {
777
793
  }
778
794
  catch { }
779
795
  }
780
- function updateWorkspaceDevScript(workspaceRoot, appName) {
796
+ function ensureWorkspaceGatewayDevScript(workspaceRoot) {
781
797
  const pkgPath = path.join(workspaceRoot, "package.json");
782
798
  if (!fs.existsSync(pkgPath))
783
799
  return;
784
800
  try {
785
801
  const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
786
802
  pkg.scripts = pkg.scripts ?? {};
787
- pkg.scripts.dev = `pnpm --filter ${appName} dev`;
803
+ pkg.scripts.dev = "tsx scripts/workspace-dev.ts";
788
804
  fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
789
805
  }
790
806
  catch { }
791
807
  }
808
+ function rewriteNetlifyToml(appDir, appName, mode) {
809
+ const netlifyPath = path.join(appDir, "netlify.toml");
810
+ if (!fs.existsSync(netlifyPath))
811
+ return;
812
+ try {
813
+ let content = fs.readFileSync(netlifyPath, "utf-8");
814
+ const buildCommand = mode === "workspace" ? `pnpm --filter ${appName} build` : "pnpm build";
815
+ const publishPath = mode === "workspace" ? `apps/${appName}/dist` : "dist";
816
+ const functionsPath = mode === "workspace"
817
+ ? `apps/${appName}/.netlify/functions-internal`
818
+ : ".netlify/functions-internal";
819
+ content = content
820
+ .replace(/pnpm --filter [^ ]+ build/g, buildCommand)
821
+ .replace(/publish = "templates\/[^"]+\/dist"/g, `publish = "${publishPath}"`)
822
+ .replace(/functions = "templates\/[^"]+\/\.netlify\/functions-internal"/g, `functions = "${functionsPath}"`);
823
+ fs.writeFileSync(netlifyPath, content);
824
+ }
825
+ catch { }
826
+ }
792
827
  function tryGitInit(dir) {
793
828
  try {
794
829
  execFileSync("git", ["init"], { cwd: dir, stdio: "pipe" });