@agent-native/core 0.137.7 → 0.138.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. package/agent-native.eject.json +2 -0
  2. package/corpus/README.md +1 -1
  3. package/corpus/templates/analytics/.agents/skills/agent-native-docs/SKILL.md +23 -3
  4. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  5. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +15 -0
  6. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +23 -2
  7. package/corpus/templates/analytics/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  8. package/corpus/templates/analytics/AGENTS.md +2 -2
  9. package/corpus/templates/analytics/actions/get-first-party-analytics-health.ts +65 -0
  10. package/corpus/templates/analytics/actions/provider-api-catalog.ts +3 -6
  11. package/corpus/templates/analytics/actions/provider-api-docs.ts +3 -6
  12. package/corpus/templates/analytics/actions/provider-api-request.ts +3 -6
  13. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +3 -3
  14. package/corpus/templates/analytics/agent-native.json +12 -0
  15. package/corpus/templates/analytics/app/i18n-data.ts +162 -0
  16. package/corpus/templates/analytics/app/pages/DataSources.tsx +126 -1
  17. package/corpus/templates/analytics/changelog/2026-08-05-analytics-now-flags-neon-pressure-and-guides-high-volume-tra.md +6 -0
  18. package/corpus/templates/analytics/changelog/2026-08-05-first-party-analytics-uses-compact-rollups-for-faster-usage-.md +6 -0
  19. package/corpus/templates/analytics/server/db/schema.ts +52 -0
  20. package/corpus/templates/analytics/server/lib/credential-keys.ts +3 -0
  21. package/corpus/templates/analytics/server/lib/first-party-analytics-health.ts +397 -0
  22. package/corpus/templates/analytics/server/lib/first-party-analytics-rollups.ts +182 -0
  23. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +86 -15
  24. package/corpus/templates/analytics/server/lib/provider-api.ts +20 -1
  25. package/corpus/templates/analytics/server/lib/replay-storage.ts +1 -1
  26. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  27. package/corpus/templates/analytics/server/plugins/db.ts +60 -0
  28. package/corpus/templates/assets/.agents/skills/agent-native-docs/SKILL.md +23 -3
  29. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  30. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +23 -2
  31. package/corpus/templates/assets/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  32. package/corpus/templates/assets/agent-native.json +12 -0
  33. package/corpus/templates/assets/server/lib/generation.ts +8 -8
  34. package/corpus/templates/assets/server/lib/storage.ts +1 -1
  35. package/corpus/templates/assets/server/plugins/onboarding.ts +1 -1
  36. package/corpus/templates/brain/.agents/skills/agent-native-docs/SKILL.md +23 -3
  37. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  38. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +23 -2
  39. package/corpus/templates/brain/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  40. package/corpus/templates/brain/agent-native.json +12 -0
  41. package/corpus/templates/calendar/.agents/skills/agent-native-docs/SKILL.md +23 -3
  42. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  43. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +23 -2
  44. package/corpus/templates/calendar/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  45. package/corpus/templates/calendar/agent-native.json +12 -0
  46. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +23 -3
  47. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  48. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +23 -2
  49. package/corpus/templates/chat/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  50. package/corpus/templates/chat/AGENTS.md +3 -0
  51. package/corpus/templates/chat/DESIGN.md +28 -0
  52. package/corpus/templates/chat/agent-native.json +12 -0
  53. package/corpus/templates/clips/.agents/skills/agent-native-docs/SKILL.md +23 -3
  54. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  55. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +23 -2
  56. package/corpus/templates/clips/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  57. package/corpus/templates/clips/actions/cleanup-transcript.ts +2 -2
  58. package/corpus/templates/clips/actions/delete-recording-permanent.ts +3 -0
  59. package/corpus/templates/clips/actions/get-playback-position.ts +68 -0
  60. package/corpus/templates/clips/actions/import-loom-recording.ts +2 -2
  61. package/corpus/templates/clips/actions/save-playback-position.ts +80 -0
  62. package/corpus/templates/clips/actions/set-thumbnail.ts +1 -1
  63. package/corpus/templates/clips/agent-native.json +12 -0
  64. package/corpus/templates/clips/app/components/player/video-player.tsx +54 -5
  65. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +65 -18
  66. package/corpus/templates/clips/app/hooks/use-playback-position.ts +188 -0
  67. package/corpus/templates/clips/app/hooks/use-view-tracking.ts +6 -24
  68. package/corpus/templates/clips/app/i18n/en-US.ts +4 -0
  69. package/corpus/templates/clips/app/lib/playback-position.ts +99 -0
  70. package/corpus/templates/clips/app/lib/viewer-session.ts +29 -0
  71. package/corpus/templates/clips/changelog/2026-08-05-clip-buffering-now-uses-buffering-copy-after-playback.md +6 -0
  72. package/corpus/templates/clips/changelog/2026-08-05-clips-remembers-your-playback-position-when-you-reopen-a-cli.md +6 -0
  73. package/corpus/templates/clips/desktop/package.json +1 -0
  74. package/corpus/templates/clips/desktop/src/app.tsx +70 -6
  75. package/corpus/templates/clips/desktop/src/components/AlertDialog.tsx +131 -0
  76. package/corpus/templates/clips/desktop/src/styles.css +129 -0
  77. package/corpus/templates/clips/learnings.defaults.md +1 -1
  78. package/corpus/templates/clips/server/db/schema.ts +18 -0
  79. package/corpus/templates/clips/server/lib/public-agent-context.ts +1 -1
  80. package/corpus/templates/clips/server/lib/video-storage.ts +1 -1
  81. package/corpus/templates/clips/server/plugins/db.ts +15 -0
  82. package/corpus/templates/clips/server/routes/api/media/index.post.ts +1 -1
  83. package/corpus/templates/content/.agents/skills/agent-native-docs/SKILL.md +23 -3
  84. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  85. package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +13 -0
  86. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +23 -2
  87. package/corpus/templates/content/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  88. package/corpus/templates/content/AGENTS.md +1 -0
  89. package/corpus/templates/content/actions/_content-database-mutation-lock.ts +41 -0
  90. package/corpus/templates/content/actions/_content-database-row-migration.ts +569 -0
  91. package/corpus/templates/content/actions/_database-source-utils.ts +82 -36
  92. package/corpus/templates/content/actions/_database-utils.ts +5 -0
  93. package/corpus/templates/content/actions/_delete-content-space.ts +25 -11
  94. package/corpus/templates/content/actions/add-database-item.ts +60 -42
  95. package/corpus/templates/content/actions/attach-content-database-source.ts +2 -0
  96. package/corpus/templates/content/actions/configure-document-property.ts +99 -104
  97. package/corpus/templates/content/actions/delete-content-database.ts +19 -7
  98. package/corpus/templates/content/actions/delete-document-property.ts +47 -58
  99. package/corpus/templates/content/actions/delete-document.ts +390 -167
  100. package/corpus/templates/content/actions/disconnect-content-database-source.ts +41 -24
  101. package/corpus/templates/content/actions/duplicate-database-item.ts +63 -31
  102. package/corpus/templates/content/actions/duplicate-database-items.ts +86 -43
  103. package/corpus/templates/content/actions/duplicate-document-property.ts +37 -14
  104. package/corpus/templates/content/actions/migrate-content-database-rows.ts +830 -0
  105. package/corpus/templates/content/actions/move-database-item.ts +14 -0
  106. package/corpus/templates/content/actions/permanently-delete-document.ts +27 -6
  107. package/corpus/templates/content/actions/remove-database-items.ts +13 -0
  108. package/corpus/templates/content/actions/reorder-document-property.ts +45 -46
  109. package/corpus/templates/content/actions/set-document-property.ts +68 -28
  110. package/corpus/templates/content/actions/submit-content-database-form.ts +49 -0
  111. package/corpus/templates/content/actions/transcribe-media.ts +1 -1
  112. package/corpus/templates/content/agent-native.json +12 -0
  113. package/corpus/templates/content/app/components/editor/image-upload.ts +2 -2
  114. package/corpus/templates/content/app/i18n-data.ts +1 -1
  115. package/corpus/templates/content/changelog/2026-08-01-content-can-reorganize-every-row-in-an-existing-database-as-.md +6 -0
  116. package/corpus/templates/content/parity/matrix.md +1 -1
  117. package/corpus/templates/content/parity/matrix.ts +4 -2
  118. package/corpus/templates/content/server/db/schema.ts +30 -0
  119. package/corpus/templates/content/server/plugins/db.ts +24 -0
  120. package/corpus/templates/content/server/plugins/onboarding.ts +2 -2
  121. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +23 -3
  122. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  123. package/corpus/templates/crm/agent-native.json +12 -0
  124. package/corpus/templates/design/.agents/skills/agent-native-docs/SKILL.md +23 -3
  125. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  126. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +2 -0
  127. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +23 -2
  128. package/corpus/templates/design/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  129. package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +2 -2
  130. package/corpus/templates/design/DESIGN-STUDIO-PLAN.md +2 -2
  131. package/corpus/templates/design/actions/apply-design-token-edit.ts +1 -1
  132. package/corpus/templates/design/actions/capture-design-state.ts +1 -1
  133. package/corpus/templates/design/actions/connect-builder-app.ts +2 -2
  134. package/corpus/templates/design/actions/create-design-branch.ts +1 -1
  135. package/corpus/templates/design/actions/create-fusion-app.ts +3 -3
  136. package/corpus/templates/design/actions/deploy-design-preview.ts +1 -1
  137. package/corpus/templates/design/actions/generate-design.ts +3 -2
  138. package/corpus/templates/design/actions/get-component-details.ts +1 -1
  139. package/corpus/templates/design/actions/get-design-branch-diff.ts +1 -1
  140. package/corpus/templates/design/actions/index-components.ts +3 -3
  141. package/corpus/templates/design/actions/index-design-system-with-builder.ts +1 -1
  142. package/corpus/templates/design/actions/migrate-inline-design-to-app.ts +3 -3
  143. package/corpus/templates/design/actions/open-component-source.ts +1 -1
  144. package/corpus/templates/design/actions/update-design.ts +96 -14
  145. package/corpus/templates/design/agent-native.json +12 -0
  146. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +7 -2
  147. package/corpus/templates/design/app/components/design/FigmaHydrationDialog.tsx +11 -2
  148. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +1 -1
  149. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +8 -1
  150. package/corpus/templates/design/app/i18n-data.ts +53 -22
  151. package/corpus/templates/design/app/lib/design-file-upload.ts +2 -3
  152. package/corpus/templates/design/app/lib/upload-limits.ts +4 -0
  153. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +1 -1
  154. package/corpus/templates/design/changelog/2026-08-05-chat-attachments-now-warn-before-upload-when-they-exceed-the.md +6 -0
  155. package/corpus/templates/design/changelog/2026-08-05-figma-fig-uploads-now-show-a-clear-4-mb-limit-up-front-inste.md +6 -0
  156. package/corpus/templates/design/scripts/qa-figma-stress-import.ts +1 -1
  157. package/corpus/templates/design/server/handlers/import-design-file.ts +9 -5
  158. package/corpus/templates/design/server/handlers/uploads.ts +13 -9
  159. package/corpus/templates/design/server/lib/fig-file-limits.ts +2 -1
  160. package/corpus/templates/design/server/lib/figma-image-hydration.ts +1 -1
  161. package/corpus/templates/design/server/lib/figma-node-import.ts +1 -1
  162. package/corpus/templates/design/server/lib/request-body-limits.ts +11 -0
  163. package/corpus/templates/design/shared/canvas-frames.ts +81 -0
  164. package/corpus/templates/design/shared/design-source-capabilities.ts +25 -9
  165. package/corpus/templates/dispatch/.agents/skills/agent-native-docs/SKILL.md +23 -3
  166. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  167. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +23 -2
  168. package/corpus/templates/dispatch/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  169. package/corpus/templates/dispatch/agent-native.json +12 -0
  170. package/corpus/templates/factory/.agents/skills/agent-native-docs/SKILL.md +23 -3
  171. package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  172. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +23 -2
  173. package/corpus/templates/factory/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  174. package/corpus/templates/factory/agent-native.json +12 -0
  175. package/corpus/templates/forms/.agents/skills/agent-native-docs/SKILL.md +23 -3
  176. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  177. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +23 -2
  178. package/corpus/templates/forms/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  179. package/corpus/templates/forms/actions/export-responses.ts +1 -1
  180. package/corpus/templates/forms/agent-native.json +12 -0
  181. package/corpus/templates/macros/.agents/skills/agent-native-docs/SKILL.md +23 -3
  182. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  183. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +23 -2
  184. package/corpus/templates/macros/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  185. package/corpus/templates/macros/agent-native.json +12 -0
  186. package/corpus/templates/mail/.agents/skills/agent-native-docs/SKILL.md +23 -3
  187. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  188. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +23 -2
  189. package/corpus/templates/mail/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  190. package/corpus/templates/mail/agent-native.json +12 -0
  191. package/corpus/templates/mail/app/i18n/en-US.ts +1 -1
  192. package/corpus/templates/mail/server/lib/media-upload.ts +1 -1
  193. package/corpus/templates/plan/.agents/skills/agent-native-docs/SKILL.md +23 -3
  194. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  195. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +23 -2
  196. package/corpus/templates/plan/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  197. package/corpus/templates/plan/agent-native.json +12 -0
  198. package/corpus/templates/plan/server/lib/plan-assets.ts +1 -1
  199. package/corpus/templates/slides/.agents/skills/agent-native-docs/SKILL.md +23 -3
  200. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  201. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +23 -2
  202. package/corpus/templates/slides/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  203. package/corpus/templates/slides/actions/generate-image-api.ts +1 -1
  204. package/corpus/templates/slides/actions/generate-slides-ai.ts +1 -1
  205. package/corpus/templates/slides/actions/import-file.ts +2 -2
  206. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
  207. package/corpus/templates/slides/agent-native.json +12 -0
  208. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +1 -1
  209. package/corpus/templates/slides/app/i18n/en-US.ts +2 -2
  210. package/corpus/templates/slides/app/lib/deck-sorting.ts +19 -0
  211. package/corpus/templates/slides/app/lib/image-drop-to-agent.ts +1 -1
  212. package/corpus/templates/slides/app/pages/Index.tsx +7 -2
  213. package/corpus/templates/slides/changelog/2026-08-05-decks-are-now-sorted-by-most-recently-updated.md +6 -0
  214. package/corpus/templates/slides/server/handlers/assets.ts +1 -1
  215. package/corpus/templates/slides/server/handlers/uploads.ts +1 -1
  216. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +23 -3
  217. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  218. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +23 -2
  219. package/corpus/templates/tasks/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  220. package/corpus/templates/tasks/agent-native.json +12 -0
  221. package/dist/action.d.ts +6 -0
  222. package/dist/agent/engine/builder-engine.js +2 -2
  223. package/dist/agent/engine/credential-errors.d.ts +1 -1
  224. package/dist/agent/engine/credential-errors.js +2 -2
  225. package/dist/agent/production-agent.js +3 -2
  226. package/dist/brand-kit/fig/index.js +1 -1
  227. package/dist/cli/agent.js +45 -3
  228. package/dist/cli/code-agent-executor.js +2 -1
  229. package/dist/cli/create.d.ts +9 -1
  230. package/dist/cli/create.js +94 -1
  231. package/dist/cli/doctor.d.ts +8 -11
  232. package/dist/cli/doctor.js +92 -24
  233. package/dist/cli/index.js +6 -5
  234. package/dist/client/AgentAskPopover.d.ts +3 -1
  235. package/dist/client/AgentAskPopover.js +2 -2
  236. package/dist/client/AgentPanel.js +9 -3
  237. package/dist/client/AssistantChat.js +54 -33
  238. package/dist/client/MultiTabAssistantChat.js +1 -1
  239. package/dist/client/RouteTransitionIndicator.d.ts +7 -0
  240. package/dist/client/RouteTransitionIndicator.js +31 -0
  241. package/dist/client/agent-engine-key.js +1 -1
  242. package/dist/client/app-providers.js +11 -2
  243. package/dist/client/chat/message-components.js +1 -1
  244. package/dist/client/chat/run-recovery.js +1 -1
  245. package/dist/client/chat/tool-call-display.d.ts +3 -1
  246. package/dist/client/chat/tool-call-display.js +4 -3
  247. package/dist/client/chat-model-groups.d.ts +6 -0
  248. package/dist/client/chat-model-groups.js +11 -0
  249. package/dist/client/error-format.js +1 -1
  250. package/dist/client/i18n.js +1 -1
  251. package/dist/client/onboarding/FirstRunOnboarding.d.ts +5 -1
  252. package/dist/client/onboarding/FirstRunOnboarding.js +29 -13
  253. package/dist/client/onboarding/first-run-enabled.d.ts +6 -1
  254. package/dist/client/onboarding/first-run-enabled.js +33 -3
  255. package/dist/client/onboarding/use-onboarding.js +16 -11
  256. package/dist/client/require-session.js +13 -4
  257. package/dist/client/resources/mcp-integration-catalog.js +26 -0
  258. package/dist/client/resources/mcp-integration-logos.js +4 -0
  259. package/dist/client/route-warmup.js +56 -10
  260. package/dist/client/settings/AccountSettingsCard.js +78 -3
  261. package/dist/client/settings/SettingsPanel.js +1 -1
  262. package/dist/client/settings/VoiceTranscriptionSection.js +2 -2
  263. package/dist/client/settings/useBuilderStatus.js +1 -1
  264. package/dist/client/setup-connections/useBuilderConnectCardController.js +1 -1
  265. package/dist/client/ui/index.d.ts +1 -0
  266. package/dist/client/ui/index.js +1 -0
  267. package/dist/client/uploads/upload-editor-image.js +1 -1
  268. package/dist/client/use-chat-threads.js +3 -0
  269. package/dist/client/use-session.d.ts +11 -0
  270. package/dist/client/use-session.js +34 -6
  271. package/dist/collab/routes.d.ts +2 -2
  272. package/dist/config.d.ts +48 -0
  273. package/dist/config.js +111 -0
  274. package/dist/db/migrations.js +5 -0
  275. package/dist/eject/provider-api-definitions.d.ts +1 -1
  276. package/dist/eject/provider-api-definitions.js +1 -0
  277. package/dist/eject/remote-mcp-presets.js +1 -0
  278. package/dist/extensions/web-search-tool.js +2 -2
  279. package/dist/file-upload/actions/upload-image.js +1 -1
  280. package/dist/file-upload/registry.js +1 -1
  281. package/dist/guards/index.d.ts +3 -0
  282. package/dist/guards/index.js +2 -0
  283. package/dist/guards/no-empty-migrations.d.ts +14 -0
  284. package/dist/guards/no-empty-migrations.js +126 -0
  285. package/dist/index.browser.d.ts +1 -0
  286. package/dist/index.browser.js +3 -0
  287. package/dist/index.d.ts +1 -0
  288. package/dist/index.js +1 -0
  289. package/dist/localization/default-messages.d.ts +24 -0
  290. package/dist/localization/default-messages.js +26 -2
  291. package/dist/notifications/routes.d.ts +6 -6
  292. package/dist/onboarding/app-profile.js +1 -1
  293. package/dist/onboarding/plugin.d.ts +2 -0
  294. package/dist/onboarding/plugin.js +29 -2
  295. package/dist/progress/routes.d.ts +1 -1
  296. package/dist/provider-api/actions/custom-provider-registration.d.ts +16 -16
  297. package/dist/provider-api/actions/provider-api.d.ts +13 -13
  298. package/dist/provider-api/index.d.ts +4 -4
  299. package/dist/provider-api/index.js +35 -0
  300. package/dist/resources/handlers.d.ts +1 -1
  301. package/dist/resources/handlers.js +1 -1
  302. package/dist/scripts/docs/framework-search.d.ts +9 -0
  303. package/dist/scripts/docs/framework-search.js +239 -0
  304. package/dist/scripts/docs/index.js +1 -0
  305. package/dist/scripts/docs/search.d.ts +10 -0
  306. package/dist/scripts/docs/search.js +1 -1
  307. package/dist/scripts/docs/source-search.d.ts +10 -2
  308. package/dist/scripts/docs/source-search.js +108 -41
  309. package/dist/search-utils/index.d.ts +11 -0
  310. package/dist/search-utils/index.js +72 -0
  311. package/dist/server/action-change.d.ts +6 -0
  312. package/dist/server/action-change.js +28 -14
  313. package/dist/server/action-discovery.js +9 -0
  314. package/dist/server/action-routes.js +1 -0
  315. package/dist/server/agent-chat/browser-team-tools.js +1 -1
  316. package/dist/server/agent-chat/script-entries.js +43 -2
  317. package/dist/server/auth-login-mode.d.ts +8 -0
  318. package/dist/server/auth-login-mode.js +17 -0
  319. package/dist/server/auth.js +100 -15
  320. package/dist/server/better-auth-instance.d.ts +36 -0
  321. package/dist/server/better-auth-instance.js +25 -3
  322. package/dist/server/builder-design-systems.js +1 -1
  323. package/dist/server/core-routes-plugin.js +17 -14
  324. package/dist/server/credential-provider.js +3 -3
  325. package/dist/server/email-templates.d.ts +7 -0
  326. package/dist/server/email-templates.js +24 -0
  327. package/dist/server/email.d.ts +17 -0
  328. package/dist/server/email.js +22 -1
  329. package/dist/server/framework-request-handler.js +6 -0
  330. package/dist/server/onboarding-html.d.ts +2 -0
  331. package/dist/server/onboarding-html.js +169 -8
  332. package/dist/server/realtime-token.d.ts +1 -1
  333. package/dist/server/realtime-voice.js +1 -1
  334. package/dist/server/sentry.d.ts +1 -1
  335. package/dist/server/transcribe-voice.js +3 -3
  336. package/dist/shared/first-run-onboarding.d.ts +1 -0
  337. package/dist/shared/first-run-onboarding.js +1 -0
  338. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +23 -3
  339. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  340. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +23 -2
  341. package/dist/templates/chat/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  342. package/dist/templates/chat/AGENTS.md +3 -0
  343. package/dist/templates/chat/DESIGN.md +28 -0
  344. package/dist/templates/chat/agent-native.json +12 -0
  345. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +23 -3
  346. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  347. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +23 -2
  348. package/dist/templates/default/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  349. package/dist/templates/default/AGENTS.md +4 -0
  350. package/dist/templates/default/DESIGN.md +30 -0
  351. package/dist/templates/default/agent-native.json +9 -0
  352. package/dist/templates/default/app/i18n/ar-SA.ts +2 -2
  353. package/dist/templates/default/app/i18n/de-DE.ts +2 -2
  354. package/dist/templates/default/app/i18n/en-US.ts +2 -2
  355. package/dist/templates/default/app/i18n/es-ES.ts +2 -2
  356. package/dist/templates/default/app/i18n/fr-FR.ts +2 -2
  357. package/dist/templates/default/app/i18n/hi-IN.ts +2 -2
  358. package/dist/templates/default/app/i18n/ja-JP.ts +2 -2
  359. package/dist/templates/default/app/i18n/ko-KR.ts +2 -2
  360. package/dist/templates/default/app/i18n/pt-BR.ts +2 -2
  361. package/dist/templates/default/app/i18n/zh-CN.ts +2 -2
  362. package/dist/templates/default/app/i18n/zh-TW.ts +1 -1
  363. package/dist/templates/default/package.json +1 -0
  364. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +23 -3
  365. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  366. package/dist/templates/headless/agent-native.json +9 -0
  367. package/dist/templates/headless/package.json +2 -0
  368. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +23 -3
  369. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  370. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +23 -2
  371. package/dist/templates/workspace-core/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  372. package/dist/templates/workspace-core/AGENTS.md +3 -0
  373. package/dist/templates/workspace-core/DESIGN.md +35 -0
  374. package/dist/templates/workspace-root/AGENTS.md +3 -0
  375. package/dist/templates/workspace-root/DESIGN.md +35 -0
  376. package/dist/templates/workspace-root/agent-native.json +9 -0
  377. package/dist/templates/workspace-root/package.json +3 -0
  378. package/dist/transcription/builder-transcription.js +1 -1
  379. package/dist/user-profile/actions/change-password.d.ts +8 -0
  380. package/dist/user-profile/actions/change-password.js +24 -0
  381. package/dist/user-profile/actions/get-auth-methods.d.ts +6 -0
  382. package/dist/user-profile/actions/get-auth-methods.js +23 -0
  383. package/dist/user-profile/actions/set-password.d.ts +7 -0
  384. package/dist/user-profile/actions/set-password.js +23 -0
  385. package/dist/vite/client.d.ts +8 -1
  386. package/dist/vite/client.js +63 -12
  387. package/dist/vite/index.d.ts +1 -0
  388. package/dist/vite/index.js +1 -0
  389. package/docs/AGENTS.md +7 -2
  390. package/docs/SKILL.md +7 -5
  391. package/docs/content/agent-native-config.mdx +165 -0
  392. package/docs/content/agent-native-toolkit.mdx +1 -1
  393. package/docs/content/deployment.mdx +7 -2
  394. package/docs/content/doctor.mdx +21 -13
  395. package/docs/content/environment-variables.mdx +158 -0
  396. package/docs/content/file-uploads.mdx +1 -1
  397. package/docs/content/getting-started.mdx +1 -1
  398. package/docs/content/key-concepts.mdx +1 -1
  399. package/docs/content/multi-app-workspace.mdx +1 -1
  400. package/docs/content/template-clips-ai-and-editing.mdx +6 -6
  401. package/docs/content/template-clips-developers.mdx +3 -3
  402. package/docs/content/toolkit-settings.mdx +1 -1
  403. package/docs/content/voice-input.mdx +4 -4
  404. package/package.json +6 -2
  405. package/src/eject/provider-api-definitions.ts +1 -0
  406. package/src/eject/remote-mcp-presets.ts +1 -0
  407. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +23 -3
  408. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  409. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +23 -2
  410. package/src/templates/chat/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  411. package/src/templates/chat/AGENTS.md +3 -0
  412. package/src/templates/chat/DESIGN.md +28 -0
  413. package/src/templates/chat/agent-native.json +12 -0
  414. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +23 -3
  415. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  416. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +23 -2
  417. package/src/templates/default/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  418. package/src/templates/default/AGENTS.md +4 -0
  419. package/src/templates/default/DESIGN.md +30 -0
  420. package/src/templates/default/agent-native.json +9 -0
  421. package/src/templates/default/app/i18n/ar-SA.ts +2 -2
  422. package/src/templates/default/app/i18n/de-DE.ts +2 -2
  423. package/src/templates/default/app/i18n/en-US.ts +2 -2
  424. package/src/templates/default/app/i18n/es-ES.ts +2 -2
  425. package/src/templates/default/app/i18n/fr-FR.ts +2 -2
  426. package/src/templates/default/app/i18n/hi-IN.ts +2 -2
  427. package/src/templates/default/app/i18n/ja-JP.ts +2 -2
  428. package/src/templates/default/app/i18n/ko-KR.ts +2 -2
  429. package/src/templates/default/app/i18n/pt-BR.ts +2 -2
  430. package/src/templates/default/app/i18n/zh-CN.ts +2 -2
  431. package/src/templates/default/app/i18n/zh-TW.ts +1 -1
  432. package/src/templates/default/package.json +1 -0
  433. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +23 -3
  434. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  435. package/src/templates/headless/agent-native.json +9 -0
  436. package/src/templates/headless/package.json +2 -0
  437. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +23 -3
  438. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  439. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +23 -2
  440. package/src/templates/workspace-core/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  441. package/src/templates/workspace-core/AGENTS.md +3 -0
  442. package/src/templates/workspace-core/DESIGN.md +35 -0
  443. package/src/templates/workspace-root/AGENTS.md +3 -0
  444. package/src/templates/workspace-root/DESIGN.md +35 -0
  445. package/src/templates/workspace-root/agent-native.json +9 -0
  446. package/src/templates/workspace-root/package.json +3 -0
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Core script: framework-search
3
+ *
4
+ * Search the version-matched framework docs and readable source together.
5
+ * This is intentionally bounded and read-only so every app chat can use the
6
+ * same fallback when a question is not answered by the docs alone.
7
+ */
8
+ import fs from "node:fs";
9
+ import { createTextMatcher, } from "../../search-utils/index.js";
10
+ import { parseArgs } from "../utils.js";
11
+ import { loadAllDocs } from "./search.js";
12
+ import { listSourceFiles } from "./source-search.js";
13
+ const DEFAULT_LIMIT = 30;
14
+ const MAX_LIMIT = 50;
15
+ const MAX_SNIPPETS_PER_RESULT = 3;
16
+ function parseScope(value) {
17
+ if (!value)
18
+ return { value: "all" };
19
+ if (value === "all" || value === "docs" || value === "source") {
20
+ return { value };
21
+ }
22
+ return { error: `Invalid scope "${value}". Use all, docs, or source.` };
23
+ }
24
+ function parseMode(value) {
25
+ if (!value)
26
+ return { value: "substring" };
27
+ if (value === "substring" ||
28
+ value === "glob" ||
29
+ value === "sql-like" ||
30
+ value === "regex") {
31
+ return { value };
32
+ }
33
+ return {
34
+ error: `Invalid mode "${value}". Use substring, glob, sql-like, or regex.`,
35
+ };
36
+ }
37
+ function parseLimit(value) {
38
+ if (!value)
39
+ return { value: DEFAULT_LIMIT };
40
+ const parsed = Number(value);
41
+ if (!Number.isInteger(parsed) || parsed < 1) {
42
+ return { error: "Limit must be a positive integer." };
43
+ }
44
+ return { value: Math.min(parsed, MAX_LIMIT) };
45
+ }
46
+ function docsAsEntries(docs) {
47
+ return docs.map((doc) => ({
48
+ kind: "doc",
49
+ path: `docs/${doc.slug}`,
50
+ title: doc.title,
51
+ body: `${doc.title}\n${doc.description}\n${doc.body}`,
52
+ }));
53
+ }
54
+ function sourceAsEntries(files) {
55
+ const entries = [];
56
+ let unreadable = 0;
57
+ for (const file of files) {
58
+ try {
59
+ entries.push({
60
+ kind: "source",
61
+ path: file.relativePath,
62
+ body: fs.readFileSync(file.absolutePath, "utf-8"),
63
+ file,
64
+ });
65
+ }
66
+ catch {
67
+ unreadable += 1;
68
+ }
69
+ }
70
+ return { entries, unreadable };
71
+ }
72
+ function snippetsForEntry(entry, matcher, pathMatch) {
73
+ const snippets = [];
74
+ const lines = entry.body.split(/\r?\n/);
75
+ for (let index = 0; index < lines.length; index += 1) {
76
+ if (!matcher.matches(lines[index]))
77
+ continue;
78
+ const line = lines[index].trim();
79
+ if (!line)
80
+ continue;
81
+ snippets.push(`${index + 1}: ${line.slice(0, 260)}`);
82
+ if (snippets.length >= MAX_SNIPPETS_PER_RESULT)
83
+ break;
84
+ }
85
+ if (snippets.length === 0 && pathMatch) {
86
+ const firstLine = lines.find((line) => line.trim());
87
+ if (firstLine)
88
+ snippets.push(`1: ${firstLine.trim().slice(0, 260)}`);
89
+ }
90
+ return snippets;
91
+ }
92
+ function pathMatches(path, filter) {
93
+ if (!filter)
94
+ return { matches: true };
95
+ const matcher = createTextMatcher(filter, "glob");
96
+ return { matches: matcher.matches(path), error: matcher.error };
97
+ }
98
+ async function searchFramework(options) {
99
+ const [docs, sourceResult] = await Promise.all([
100
+ options.scope === "source" ? Promise.resolve([]) : loadAllDocs(),
101
+ options.scope === "docs"
102
+ ? Promise.resolve({ entries: [], unreadable: 0 })
103
+ : Promise.resolve(sourceAsEntries(listSourceFiles())),
104
+ ]);
105
+ const entries = [
106
+ ...(options.scope === "source" ? [] : docsAsEntries(docs)),
107
+ ...(options.scope === "docs" ? [] : sourceResult.entries),
108
+ ];
109
+ const matcher = createTextMatcher(options.pattern, options.mode);
110
+ if (matcher.error) {
111
+ return { hits: [], total: 0, unreadable: 0 };
112
+ }
113
+ const hits = [];
114
+ for (const entry of entries) {
115
+ const pathResult = pathMatches(entry.path, options.pathFilter);
116
+ if (pathResult.error)
117
+ continue;
118
+ if (!pathResult.matches)
119
+ continue;
120
+ const pathMatch = matcher.matches(entry.path);
121
+ const contentMatch = matcher.matches(entry.body);
122
+ if (!pathMatch && !contentMatch)
123
+ continue;
124
+ const snippets = snippetsForEntry(entry, matcher, pathMatch);
125
+ hits.push({ entry, pathMatch, snippets });
126
+ }
127
+ // Keep the result deterministic and favor docs titles and exact path hits.
128
+ hits.sort((a, b) => {
129
+ const aScore = (a.pathMatch ? 2 : 0) + (a.entry.kind === "doc" ? 1 : 0);
130
+ const bScore = (b.pathMatch ? 2 : 0) + (b.entry.kind === "doc" ? 1 : 0);
131
+ return bScore - aScore || a.entry.path.localeCompare(b.entry.path);
132
+ });
133
+ return {
134
+ hits: hits.slice(0, options.limit),
135
+ total: hits.length,
136
+ unreadable: sourceResult.unreadable,
137
+ };
138
+ }
139
+ function printHelp() {
140
+ console.log(`Usage: pnpm action framework-search [options]
141
+
142
+ Options:
143
+ --pattern <text> Text, wildcard, SQL-like, or regex pattern to search
144
+ --query <text> Alias for --pattern
145
+ --scope <scope> all, docs, or source (default: all)
146
+ --mode <mode> substring, glob, sql-like, or regex (default: substring)
147
+ --path <glob> Optional glob to limit matching paths
148
+ --limit <number> Maximum files to return (default: ${DEFAULT_LIMIT}, max: ${MAX_LIMIT})
149
+ --list List the searchable docs and source roots
150
+ --help Show this help message`);
151
+ }
152
+ export default async function frameworkSearchScript(args) {
153
+ const parsed = parseArgs(args);
154
+ if (parsed.help === "true") {
155
+ printHelp();
156
+ return;
157
+ }
158
+ const scopeResult = parseScope(parsed.scope);
159
+ if (scopeResult.error) {
160
+ console.log(scopeResult.error);
161
+ return;
162
+ }
163
+ const scope = scopeResult.value;
164
+ const modeResult = parseMode(parsed.mode);
165
+ if (modeResult.error) {
166
+ console.log(modeResult.error);
167
+ return;
168
+ }
169
+ const mode = modeResult.value;
170
+ const limitResult = parseLimit(parsed.limit);
171
+ if (limitResult.error) {
172
+ console.log(limitResult.error);
173
+ return;
174
+ }
175
+ const limit = limitResult.value;
176
+ if (parsed.list === "true") {
177
+ const [docs, sourceFiles] = await Promise.all([
178
+ scope === "source" ? Promise.resolve([]) : loadAllDocs(),
179
+ scope === "docs"
180
+ ? Promise.resolve([])
181
+ : Promise.resolve(listSourceFiles()),
182
+ ]);
183
+ console.log(JSON.stringify({
184
+ docs: docs.map((doc) => ({ slug: doc.slug, title: doc.title })),
185
+ source: {
186
+ files: sourceFiles.length,
187
+ roots: Array.from(new Set(sourceFiles.map((file) => file.relativePath.split("/")[0]))),
188
+ },
189
+ }, null, 2));
190
+ return;
191
+ }
192
+ const pattern = parsed.pattern ?? parsed.query;
193
+ if (!pattern) {
194
+ printHelp();
195
+ return;
196
+ }
197
+ const matcher = createTextMatcher(pattern, mode);
198
+ if (matcher.error) {
199
+ console.log(matcher.error);
200
+ return;
201
+ }
202
+ if (parsed.path) {
203
+ const pathMatcher = createTextMatcher(parsed.path, "glob");
204
+ if (pathMatcher.error) {
205
+ console.log(pathMatcher.error);
206
+ return;
207
+ }
208
+ }
209
+ const result = await searchFramework({
210
+ pattern,
211
+ mode,
212
+ scope,
213
+ pathFilter: parsed.path,
214
+ limit,
215
+ });
216
+ if (result.total === 0) {
217
+ console.log(`No matches in the indexed ${scope} corpus for ${JSON.stringify(pattern)}.`);
218
+ console.log("The search covers version-matched framework docs, runtime-visible skills, and readable Core, Toolkit, and first-party template source. A miss is not proof that an implementation is absent if the relevant package source is not published in this app.");
219
+ if (result.unreadable > 0) {
220
+ console.log(`Skipped ${result.unreadable} unreadable source file(s).`);
221
+ }
222
+ return;
223
+ }
224
+ console.log(`Found ${result.total} matching file(s) in ${scope} using ${mode} mode for ${JSON.stringify(pattern)}:\n`);
225
+ for (const hit of result.hits) {
226
+ const label = hit.entry.kind === "doc" ? "doc" : "source";
227
+ console.log(`[${label}] ${hit.entry.path}${hit.entry.title ? ` - ${hit.entry.title}` : ""}`);
228
+ for (const snippet of hit.snippets)
229
+ console.log(` ${snippet}`);
230
+ console.log("");
231
+ }
232
+ if (result.total > result.hits.length) {
233
+ console.log(`Showing ${result.hits.length} of ${result.total} matching files. Refine --path, --pattern, or --limit for more targeted evidence.`);
234
+ }
235
+ if (result.unreadable > 0) {
236
+ console.log(`Skipped ${result.unreadable} unreadable source file(s).`);
237
+ }
238
+ }
239
+ //# sourceMappingURL=framework-search.js.map
@@ -1,4 +1,5 @@
1
1
  export const coreDocsScripts = {
2
+ "framework-search": (args) => import("./framework-search.js").then((m) => m.default(args)),
2
3
  "docs-search": (args) => import("./search.js").then((m) => m.default(args)),
3
4
  "source-search": (args) => import("./source-search.js").then((m) => m.default(args)),
4
5
  };
@@ -9,5 +9,15 @@
9
9
  * pnpm action docs-search --slug authentication
10
10
  * pnpm action docs-search --list
11
11
  */
12
+ interface DocMeta {
13
+ slug: string;
14
+ title: string;
15
+ description: string;
16
+ }
17
+ export interface DocFull extends DocMeta {
18
+ body: string;
19
+ }
20
+ export declare function loadAllDocs(): Promise<DocFull[]>;
12
21
  export default function docsSearchScript(args: string[]): Promise<void>;
22
+ export {};
13
23
  //# sourceMappingURL=search.d.ts.map
@@ -164,7 +164,7 @@ async function loadAgentBundleDocs() {
164
164
  return [];
165
165
  }
166
166
  }
167
- async function loadAllDocs() {
167
+ export async function loadAllDocs() {
168
168
  return [...loadFilesystemDocs(), ...(await loadAgentBundleDocs())];
169
169
  }
170
170
  async function searchDocs(query) {
@@ -1,15 +1,22 @@
1
1
  /**
2
2
  * Core script: source-search
3
3
  *
4
- * Search and read the packaged Agent Native first-party template corpus.
5
- * The corpus is generated into @agent-native/core/corpus during package build.
4
+ * Search and read version-matched framework source.
5
+ * First-party templates are generated into @agent-native/core/corpus during
6
+ * package build; Core and Toolkit source are read from their installed roots.
6
7
  *
7
8
  * Usage:
8
9
  * pnpm action source-search --query "defineAction"
9
10
  * pnpm action source-search --path templates/chat/actions/hello.ts
11
+ * pnpm action source-search --path core/src/action.ts
10
12
  * pnpm action source-search --path templates/plan/AGENTS.md
11
13
  * pnpm action source-search --list
12
14
  */
15
+ export interface SourceFile {
16
+ relativePath: string;
17
+ absolutePath: string;
18
+ visibilityRoot?: string;
19
+ }
13
20
  /**
14
21
  * The corpus is a sibling of the package root, so a bundled serverless deploy
15
22
  * never carries it. Callers register this tool conditionally: advertising a
@@ -17,5 +24,6 @@
17
24
  * and reads to it like the code genuinely does not exist.
18
25
  */
19
26
  export declare function hasSourceCorpus(): boolean;
27
+ export declare function listSourceFiles(): SourceFile[];
20
28
  export default function sourceSearchScript(args: string[]): Promise<void>;
21
29
  //# sourceMappingURL=source-search.d.ts.map
@@ -1,12 +1,14 @@
1
1
  /**
2
2
  * Core script: source-search
3
3
  *
4
- * Search and read the packaged Agent Native first-party template corpus.
5
- * The corpus is generated into @agent-native/core/corpus during package build.
4
+ * Search and read version-matched framework source.
5
+ * First-party templates are generated into @agent-native/core/corpus during
6
+ * package build; Core and Toolkit source are read from their installed roots.
6
7
  *
7
8
  * Usage:
8
9
  * pnpm action source-search --query "defineAction"
9
10
  * pnpm action source-search --path templates/chat/actions/hello.ts
11
+ * pnpm action source-search --path core/src/action.ts
10
12
  * pnpm action source-search --path templates/plan/AGENTS.md
11
13
  * pnpm action source-search --list
12
14
  */
@@ -57,6 +59,40 @@ function getCorpusRoot() {
57
59
  // dist/scripts/docs/source-search.js -> corpus/
58
60
  return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../../corpus");
59
61
  }
62
+ function getPackageRoot() {
63
+ return path.dirname(getCorpusRoot());
64
+ }
65
+ function getToolkitSourceRoot() {
66
+ const candidates = [
67
+ path.resolve(getPackageRoot(), "../toolkit/src"),
68
+ path.resolve(process.cwd(), "node_modules/@agent-native/toolkit/src"),
69
+ ];
70
+ return candidates.find((candidate) => fs.existsSync(candidate)) ?? null;
71
+ }
72
+ function getSourceRoots() {
73
+ const corpusRoot = getCorpusRoot();
74
+ const roots = [
75
+ {
76
+ prefix: "templates",
77
+ directory: path.join(corpusRoot, "templates"),
78
+ visibilityRoot: corpusRoot,
79
+ },
80
+ ];
81
+ // A monorepo checkout has the authored Core source. Published packages do
82
+ // not carry the whole source tree, so use their readable dist output.
83
+ const coreSourceRoot = path.join(getPackageRoot(), "src");
84
+ roots.push(fs.existsSync(path.join(coreSourceRoot, "server"))
85
+ ? { prefix: "core/src", directory: coreSourceRoot }
86
+ : { prefix: "core/dist", directory: path.join(getPackageRoot(), "dist") });
87
+ const toolkitSourceRoot = getToolkitSourceRoot();
88
+ if (toolkitSourceRoot) {
89
+ roots.push({
90
+ prefix: "toolkit/src",
91
+ directory: toolkitSourceRoot,
92
+ });
93
+ }
94
+ return roots;
95
+ }
60
96
  /**
61
97
  * The corpus is a sibling of the package root, so a bundled serverless deploy
62
98
  * never carries it. Callers register this tool conditionally: advertising a
@@ -125,29 +161,52 @@ function isRuntimeVisibleCorpusPath(corpusRoot, absolutePath) {
125
161
  return true;
126
162
  }
127
163
  }
128
- function listFiles(dir, base = dir, corpusRoot = getCorpusRoot()) {
164
+ function listFiles(dir, base = dir, visibilityRoot) {
129
165
  if (!fs.existsSync(dir))
130
166
  return [];
131
167
  const files = [];
132
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
168
+ let entries;
169
+ try {
170
+ entries = fs.readdirSync(dir, { withFileTypes: true });
171
+ }
172
+ catch {
173
+ return files;
174
+ }
175
+ for (const entry of entries) {
133
176
  const abs = path.join(dir, entry.name);
134
- if (!isRuntimeVisibleCorpusPath(corpusRoot, abs))
177
+ if (visibilityRoot && !isRuntimeVisibleCorpusPath(visibilityRoot, abs)) {
135
178
  continue;
179
+ }
136
180
  if (entry.isDirectory()) {
137
- files.push(...listFiles(abs, base, corpusRoot));
181
+ files.push(...listFiles(abs, base, visibilityRoot));
138
182
  }
139
183
  else if (entry.isFile() && isProbablyTextFile(abs)) {
140
- const stat = fs.statSync(abs);
184
+ let stat;
185
+ try {
186
+ stat = fs.statSync(abs);
187
+ }
188
+ catch {
189
+ continue;
190
+ }
141
191
  if (stat.size <= MAX_FILE_BYTES) {
142
192
  files.push({
143
193
  absolutePath: abs,
144
194
  relativePath: path.relative(base, abs).split(path.sep).join("/"),
195
+ visibilityRoot,
145
196
  });
146
197
  }
147
198
  }
148
199
  }
149
200
  return files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
150
201
  }
202
+ export function listSourceFiles() {
203
+ return getSourceRoots()
204
+ .flatMap((root) => listFiles(root.directory, root.directory, root.visibilityRoot).map((file) => ({
205
+ ...file,
206
+ relativePath: `${root.prefix}/${file.relativePath}`,
207
+ })))
208
+ .sort((a, b) => a.relativePath.localeCompare(b.relativePath));
209
+ }
151
210
  function lineSnippet(line, terms) {
152
211
  const trimmed = line.trim();
153
212
  if (trimmed.length <= 220)
@@ -162,7 +221,6 @@ function lineSnippet(line, terms) {
162
221
  return `${start > 0 ? "..." : ""}${trimmed.slice(start, end)}${end < trimmed.length ? "..." : ""}`;
163
222
  }
164
223
  function searchCorpus(query) {
165
- const corpusRoot = getCorpusRoot();
166
224
  const terms = query
167
225
  .toLowerCase()
168
226
  .split(/\s+/)
@@ -171,7 +229,9 @@ function searchCorpus(query) {
171
229
  if (terms.length === 0)
172
230
  return [];
173
231
  const results = [];
174
- for (const file of listFiles(corpusRoot)) {
232
+ for (const file of listSourceFiles()) {
233
+ if (/\.(?:spec|test)\.[cm]?[jt]sx?$/.test(file.relativePath))
234
+ continue;
175
235
  let raw = "";
176
236
  try {
177
237
  raw = fs.readFileSync(file.absolutePath, "utf-8");
@@ -204,26 +264,37 @@ function searchCorpus(query) {
204
264
  }
205
265
  return results.sort((a, b) => b.score - a.score || a.file.localeCompare(b.file));
206
266
  }
207
- function readCorpusPath(relative) {
267
+ function readSourcePath(relative) {
208
268
  if (!isValidPath(relative)) {
209
- return `Invalid corpus path: ${relative}`;
269
+ return `Invalid source path: ${relative}`;
210
270
  }
211
- const corpusRoot = getCorpusRoot();
212
- const target = path.resolve(corpusRoot, relative);
213
- if (!target.startsWith(corpusRoot + path.sep) && target !== corpusRoot) {
214
- return `Invalid corpus path: ${relative}`;
271
+ const sourceRoot = getSourceRoots().find((root) => relative === root.prefix || relative.startsWith(`${root.prefix}/`));
272
+ if (!sourceRoot)
273
+ return `Source path not found: ${relative}`;
274
+ const rootRelativePath = relative
275
+ .slice(sourceRoot.prefix.length)
276
+ .replace(/^\//, "");
277
+ const target = path.resolve(sourceRoot.directory, rootRelativePath);
278
+ if (!target.startsWith(sourceRoot.directory + path.sep) &&
279
+ target !== sourceRoot.directory) {
280
+ return `Invalid source path: ${relative}`;
215
281
  }
216
282
  if (!fs.existsSync(target)) {
217
- return `Corpus path not found: ${relative}`;
283
+ return `Source path not found: ${relative}`;
218
284
  }
219
- if (!isRuntimeVisibleCorpusPath(corpusRoot, target)) {
220
- return `Corpus path is not available to runtime source-search: ${relative}`;
285
+ if (sourceRoot.visibilityRoot &&
286
+ !isRuntimeVisibleCorpusPath(sourceRoot.visibilityRoot, target)) {
287
+ return `Source path is not available to runtime source-search: ${relative}`;
221
288
  }
222
289
  const stat = fs.statSync(target);
223
290
  if (stat.isDirectory()) {
224
291
  const entries = fs
225
292
  .readdirSync(target, { withFileTypes: true })
226
- .filter((entry) => isRuntimeVisibleCorpusPath(corpusRoot, path.join(target, entry.name)))
293
+ .filter((entry) => {
294
+ if (!sourceRoot.visibilityRoot)
295
+ return true;
296
+ return isRuntimeVisibleCorpusPath(sourceRoot.visibilityRoot, path.join(target, entry.name));
297
+ })
227
298
  .map((entry) => `${entry.isDirectory() ? "dir " : "file"} ${entry.name}`)
228
299
  .sort();
229
300
  const shown = entries.slice(0, 200);
@@ -239,33 +310,30 @@ function readCorpusPath(relative) {
239
310
  .join("\n");
240
311
  }
241
312
  if (!stat.isFile())
242
- return `Unsupported corpus path: ${relative}`;
313
+ return `Unsupported source path: ${relative}`;
243
314
  if (!isProbablyTextFile(target))
244
- return `Not a text corpus file: ${relative}`;
315
+ return `Not a text source file: ${relative}`;
245
316
  if (stat.size > MAX_FILE_BYTES) {
246
- return `Corpus file is too large to read through source-search: ${relative}`;
317
+ return `Source file is too large to read through source-search: ${relative}`;
247
318
  }
248
319
  const raw = fs.readFileSync(target, "utf-8");
249
320
  if (raw.length <= MAX_READ_CHARS)
250
321
  return raw;
251
322
  return `${raw.slice(0, MAX_READ_CHARS)}\n\n... truncated at ${MAX_READ_CHARS} characters. Use a narrower path or direct rg for more context.`;
252
323
  }
253
- function listCorpus() {
254
- const corpusRoot = getCorpusRoot();
255
- const sections = ["templates"];
256
- return sections.map((section) => {
257
- const sectionRoot = path.join(corpusRoot, section);
258
- const files = listFiles(sectionRoot);
259
- const children = fs.existsSync(sectionRoot)
324
+ function listSourceRoots() {
325
+ return getSourceRoots().map((root) => {
326
+ const files = listFiles(root.directory, root.directory, root.visibilityRoot);
327
+ const children = fs.existsSync(root.directory)
260
328
  ? fs
261
- .readdirSync(sectionRoot, { withFileTypes: true })
329
+ .readdirSync(root.directory, { withFileTypes: true })
262
330
  .filter((entry) => entry.isDirectory())
263
331
  .map((entry) => entry.name)
264
332
  .sort()
265
333
  : [];
266
334
  return {
267
- section,
268
- path: section,
335
+ section: root.prefix,
336
+ path: root.prefix,
269
337
  files: files.length,
270
338
  directories: children,
271
339
  };
@@ -273,27 +341,26 @@ function listCorpus() {
273
341
  }
274
342
  export default async function sourceSearchScript(args) {
275
343
  const parsed = parseArgs(args);
276
- const corpusRoot = getCorpusRoot();
277
344
  if (parsed.help === "true") {
278
345
  console.log(`Usage: pnpm action source-search [options]
279
346
 
280
347
  Options:
281
- --query <text> Search source corpus by keyword
282
- --path <path> Read a corpus file or list a corpus directory
283
- --list List corpus sections
348
+ --query <text> Search readable framework source by keyword
349
+ --path <path> Read a source file or list a source directory
350
+ --list List source roots
284
351
  --help Show this help message`);
285
352
  return;
286
353
  }
287
- if (!fs.existsSync(corpusRoot)) {
288
- console.log(`Source corpus not found at ${corpusRoot}. Build or reinstall @agent-native/core so node_modules/@agent-native/core/corpus exists.`);
354
+ if (!hasSourceCorpus()) {
355
+ console.log("Version-matched source is not available. Build or reinstall @agent-native/core so its source corpus and readable package sources are present.");
289
356
  return;
290
357
  }
291
358
  if (parsed.list === "true") {
292
- console.log(JSON.stringify(listCorpus(), null, 2));
359
+ console.log(JSON.stringify(listSourceRoots(), null, 2));
293
360
  return;
294
361
  }
295
362
  if (parsed.path) {
296
- console.log(readCorpusPath(parsed.path));
363
+ console.log(readSourcePath(parsed.path));
297
364
  return;
298
365
  }
299
366
  if (parsed.query) {
@@ -310,7 +377,7 @@ Options:
310
377
  }
311
378
  console.log("");
312
379
  }
313
- console.log("Use --path <file> to read a specific corpus file.");
380
+ console.log("Use --path <file> to read a specific source file.");
314
381
  return;
315
382
  }
316
383
  console.log("Provide --query, --path, or --list. Use --help for details.");
@@ -1,7 +1,18 @@
1
1
  export type SearchMatchMode = "allTerms" | "anyTerm" | "phrase" | "regex";
2
+ export type TextSearchMode = "substring" | "glob" | "sql-like" | "regex";
3
+ export interface TextMatcher {
4
+ matches(value: string): boolean;
5
+ error?: string;
6
+ }
2
7
  export declare function escapeLikeTerm(value: string): string;
3
8
  export declare function normalizeSearchTerms(query: string): string[];
4
9
  export declare function matchesSearchMode(value: string, query: string, mode: SearchMatchMode): boolean;
10
+ /**
11
+ * Build a bounded, case-insensitive matcher for agent-facing text search.
12
+ * Regexes are deliberately constrained because these matchers may scan a
13
+ * packaged source corpus during a single agent turn.
14
+ */
15
+ export declare function createTextMatcher(pattern: string, mode?: TextSearchMode): TextMatcher;
5
16
  export declare function buildSearchSnippet(value: string, terms: string[], maxLength?: number): string;
6
17
  export declare function scoreSearchText(fields: {
7
18
  title?: string | null;
@@ -1,4 +1,5 @@
1
1
  import safeRegex from "safe-regex2";
2
+ const MAX_TEXT_SEARCH_PATTERN_LENGTH = 240;
2
3
  const STOPWORDS = new Set([
3
4
  "about",
4
5
  "and",
@@ -57,6 +58,77 @@ export function matchesSearchMode(value, query, mode) {
57
58
  ? tokens.every((term) => normalizedValue.includes(term))
58
59
  : tokens.some((term) => normalizedValue.includes(term));
59
60
  }
61
+ /**
62
+ * Build a bounded, case-insensitive matcher for agent-facing text search.
63
+ * Regexes are deliberately constrained because these matchers may scan a
64
+ * packaged source corpus during a single agent turn.
65
+ */
66
+ export function createTextMatcher(pattern, mode = "substring") {
67
+ if (!pattern) {
68
+ return { matches: () => false, error: "Search pattern cannot be empty." };
69
+ }
70
+ if (pattern.length > MAX_TEXT_SEARCH_PATTERN_LENGTH) {
71
+ return {
72
+ matches: () => false,
73
+ error: `Search pattern is limited to ${MAX_TEXT_SEARCH_PATTERN_LENGTH} characters.`,
74
+ };
75
+ }
76
+ if (mode === "substring") {
77
+ const normalized = pattern.toLowerCase();
78
+ return {
79
+ matches: (value) => value.toLowerCase().includes(normalized),
80
+ };
81
+ }
82
+ const regexSource = mode === "regex" ? pattern : wildcardPatternToRegex(pattern, mode);
83
+ try {
84
+ const matcher = new RegExp(regexSource, "isu");
85
+ if (mode === "regex" && !safeRegex(pattern)) {
86
+ return {
87
+ matches: () => false,
88
+ error: "Regex pattern is too complex for a bounded source search.",
89
+ };
90
+ }
91
+ return { matches: (value) => matcher.test(value) };
92
+ }
93
+ catch {
94
+ return {
95
+ matches: () => false,
96
+ error: `Invalid ${mode} search pattern.`,
97
+ };
98
+ }
99
+ }
100
+ function wildcardPatternToRegex(pattern, mode) {
101
+ let source = "";
102
+ let escaped = false;
103
+ for (const character of pattern) {
104
+ if (escaped) {
105
+ source += escapeRegexCharacter(character);
106
+ escaped = false;
107
+ continue;
108
+ }
109
+ if (character === "\\") {
110
+ escaped = true;
111
+ continue;
112
+ }
113
+ const isMany = mode === "glob" ? character === "*" : character === "%";
114
+ const isOne = mode === "glob" ? character === "?" : character === "_";
115
+ if (isMany) {
116
+ source += "[\\s\\S]*";
117
+ }
118
+ else if (isOne) {
119
+ source += "[\\s\\S]";
120
+ }
121
+ else {
122
+ source += escapeRegexCharacter(character);
123
+ }
124
+ }
125
+ if (escaped)
126
+ source += "\\\\";
127
+ return source;
128
+ }
129
+ function escapeRegexCharacter(value) {
130
+ return value.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
131
+ }
60
132
  export function buildSearchSnippet(value, terms, maxLength = 260) {
61
133
  const text = normalizeText(value);
62
134
  if (text.length <= maxLength)