@agent-native/core 0.111.4 → 0.113.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 (574) hide show
  1. package/corpus/README.md +4 -2
  2. package/corpus/core/CHANGELOG.md +34 -0
  3. package/corpus/core/docs/AGENTS.md +7 -0
  4. package/corpus/core/docs/content/integrations.mdx +63 -2
  5. package/corpus/core/docs/design/provider-integration-authority.md +117 -0
  6. package/corpus/core/package.json +8 -1
  7. package/corpus/core/scripts/materialize-source-corpus.mjs +9 -2
  8. package/corpus/core/src/cli/atomic-json-file.ts +324 -0
  9. package/corpus/core/src/cli/claude-code-participant.ts +515 -0
  10. package/corpus/core/src/cli/code-agent-executor.ts +35 -15
  11. package/corpus/core/src/cli/code-agent-runs.concurrent-worker.ts +33 -0
  12. package/corpus/core/src/cli/code-agent-runs.ts +70 -36
  13. package/corpus/core/src/cli/codex-cli-participant.ts +496 -0
  14. package/corpus/core/src/cli/multi-frontier-runs.ts +1952 -0
  15. package/corpus/core/src/client/chat/ChatHistoryList.tsx +7 -404
  16. package/corpus/core/src/coding-tools/index.ts +27 -8
  17. package/corpus/core/src/embeddings/index.ts +233 -0
  18. package/corpus/core/src/index.ts +2 -0
  19. package/corpus/core/src/integrations/index.ts +10 -0
  20. package/corpus/core/src/integrations/slack-oauth.ts +1 -0
  21. package/corpus/core/src/integrations/webhook-delivery.ts +55 -0
  22. package/corpus/core/src/notifications/channels.ts +4 -10
  23. package/corpus/core/src/provider-api/actions/custom-provider-registration.ts +197 -0
  24. package/corpus/core/src/provider-api/actions/delete-staged-dataset.ts +3 -42
  25. package/corpus/core/src/provider-api/actions/list-staged-datasets.ts +3 -45
  26. package/corpus/core/src/provider-api/actions/provider-api-audit.ts +88 -0
  27. package/corpus/core/src/provider-api/actions/provider-api.ts +460 -0
  28. package/corpus/core/src/provider-api/actions/query-staged-dataset.ts +3 -140
  29. package/corpus/core/src/provider-api/actions/staged-datasets.ts +359 -0
  30. package/corpus/core/src/provider-api/gong.ts +108 -0
  31. package/corpus/core/src/scripts/docs/source-search.ts +2 -1
  32. package/corpus/core/src/search/index.ts +413 -0
  33. package/corpus/core/src/server/google-oauth-credentials.ts +80 -3
  34. package/corpus/core/src/server/index.ts +6 -0
  35. package/corpus/core/src/styles/chat-history-list.css +1 -313
  36. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +32 -12
  37. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +10 -0
  38. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  39. package/corpus/core/src/templates/default/.agents/skills/integration-webhooks/SKILL.md +323 -0
  40. package/corpus/core/src/templates/default/.agents/skills/onboarding/SKILL.md +56 -0
  41. package/corpus/core/src/templates/default/.agents/skills/secrets/SKILL.md +273 -0
  42. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +11 -2
  43. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  44. package/corpus/core/src/templates/default/AGENTS.md +25 -18
  45. package/corpus/core/src/templates/headless/.agents/skills/actions/SKILL.md +512 -0
  46. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +10 -0
  47. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  48. package/corpus/core/src/templates/headless/.agents/skills/integration-webhooks/SKILL.md +323 -0
  49. package/corpus/core/src/templates/headless/.agents/skills/secrets/SKILL.md +273 -0
  50. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  51. package/corpus/core/src/templates/headless/AGENTS.md +7 -0
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +32 -12
  53. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +10 -0
  54. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  55. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  56. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +11 -2
  57. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  58. package/corpus/core/src/templates/workspace-core/AGENTS.md +4 -0
  59. package/corpus/core/src/templates/workspace-root/AGENTS.md +4 -0
  60. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +32 -12
  61. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  62. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +11 -2
  63. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  64. package/corpus/templates/analytics/actions/delete-staged-dataset.ts +3 -23
  65. package/corpus/templates/analytics/actions/list-staged-datasets.ts +3 -27
  66. package/corpus/templates/analytics/actions/provider-api-catalog.ts +16 -19
  67. package/corpus/templates/analytics/actions/provider-api-docs.ts +3 -5
  68. package/corpus/templates/analytics/actions/provider-api-request.ts +162 -185
  69. package/corpus/templates/analytics/actions/query-staged-dataset.ts +3 -47
  70. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +52 -161
  71. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +32 -12
  72. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  73. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +11 -2
  74. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  75. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +63 -160
  76. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +32 -12
  77. package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +48 -5
  78. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +46 -14
  79. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  80. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +11 -2
  81. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  82. package/corpus/templates/brain/README.md +34 -3
  83. package/corpus/templates/brain/actions/_schemas.ts +13 -7
  84. package/corpus/templates/brain/actions/approve-proposal.ts +2 -0
  85. package/corpus/templates/brain/actions/claim-distillation.ts +24 -27
  86. package/corpus/templates/brain/actions/create-source.ts +1 -1
  87. package/corpus/templates/brain/actions/delete-staged-dataset.ts +3 -24
  88. package/corpus/templates/brain/actions/get-knowledge.ts +6 -2
  89. package/corpus/templates/brain/actions/get-pilot-report.ts +44 -8
  90. package/corpus/templates/brain/actions/import-capture.ts +21 -9
  91. package/corpus/templates/brain/actions/import-transcript.ts +42 -14
  92. package/corpus/templates/brain/actions/list-captures.ts +10 -1
  93. package/corpus/templates/brain/actions/list-distillation-queue.ts +39 -14
  94. package/corpus/templates/brain/actions/list-projects.ts +51 -0
  95. package/corpus/templates/brain/actions/list-proposals.ts +80 -4
  96. package/corpus/templates/brain/actions/list-sources.ts +17 -3
  97. package/corpus/templates/brain/actions/list-staged-datasets.ts +3 -28
  98. package/corpus/templates/brain/actions/manage-project.ts +118 -0
  99. package/corpus/templates/brain/actions/mark-capture-distilled.ts +68 -20
  100. package/corpus/templates/brain/actions/navigate.ts +1 -0
  101. package/corpus/templates/brain/actions/provider-api-catalog.ts +5 -11
  102. package/corpus/templates/brain/actions/provider-api-docs.ts +3 -5
  103. package/corpus/templates/brain/actions/provider-api-request.ts +3 -37
  104. package/corpus/templates/brain/actions/query-staged-dataset.ts +3 -48
  105. package/corpus/templates/brain/actions/reject-proposal.ts +6 -1
  106. package/corpus/templates/brain/actions/resanitize-captures.ts +159 -33
  107. package/corpus/templates/brain/actions/review-proposal.ts +2 -0
  108. package/corpus/templates/brain/actions/search-everything.ts +10 -1
  109. package/corpus/templates/brain/actions/search-knowledge.ts +1 -1
  110. package/corpus/templates/brain/actions/set-settings.ts +36 -1
  111. package/corpus/templates/brain/actions/update-proposal.ts +2 -0
  112. package/corpus/templates/brain/actions/update-source.ts +5 -1
  113. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +48 -154
  114. package/corpus/templates/brain/app/hooks/use-distillation-bridge.ts +18 -9
  115. package/corpus/templates/brain/app/hooks/use-navigation-state.ts +3 -0
  116. package/corpus/templates/brain/app/i18n-data.ts +731 -2
  117. package/corpus/templates/brain/app/lib/brain.ts +88 -1
  118. package/corpus/templates/brain/app/lib/ingest-handoff.ts +35 -0
  119. package/corpus/templates/brain/app/routes/ops.tsx +47 -0
  120. package/corpus/templates/brain/app/routes/review.tsx +41 -2
  121. package/corpus/templates/brain/app/routes/search.tsx +33 -2
  122. package/corpus/templates/brain/app/routes/settings.tsx +158 -0
  123. package/corpus/templates/brain/app/routes/sources.tsx +31 -0
  124. package/corpus/templates/brain/changelog/2026-07-19-added-private-source-safe-semantic-search.md +6 -0
  125. package/corpus/templates/brain/changelog/2026-07-19-slack-backfills-can-now-join-configured-public-channels-befo.md +6 -0
  126. package/corpus/templates/brain/changelog/2026-07-19-slack-backfills-now-continue-across-the-configured-number-of.md +6 -0
  127. package/corpus/templates/brain/changelog/2026-07-19-slack-backfills-now-start-with-a-safe-four-week-window-and-r.md +6 -0
  128. package/corpus/templates/brain/jobs/process-ingest-queue.ts +270 -36
  129. package/corpus/templates/brain/package.json +1 -0
  130. package/corpus/templates/brain/server/db/index.ts +18 -0
  131. package/corpus/templates/brain/server/db/schema.ts +197 -1
  132. package/corpus/templates/brain/server/jobs/distillation-queue.ts +12 -5
  133. package/corpus/templates/brain/server/lib/audiences.ts +708 -0
  134. package/corpus/templates/brain/server/lib/brain-health.ts +251 -38
  135. package/corpus/templates/brain/server/lib/brain.ts +877 -50
  136. package/corpus/templates/brain/server/lib/capture-sanitization.ts +217 -53
  137. package/corpus/templates/brain/server/lib/connectors.ts +609 -72
  138. package/corpus/templates/brain/server/lib/demo.ts +17 -4
  139. package/corpus/templates/brain/server/lib/hybrid-search.ts +363 -0
  140. package/corpus/templates/brain/server/lib/ingest-queue.ts +104 -0
  141. package/corpus/templates/brain/server/lib/privacy-readiness.ts +24 -0
  142. package/corpus/templates/brain/server/lib/search-index-contracts.ts +72 -0
  143. package/corpus/templates/brain/server/lib/search-index.ts +714 -0
  144. package/corpus/templates/brain/server/lib/search.ts +120 -4
  145. package/corpus/templates/brain/server/lib/sensitivity-policy.ts +174 -0
  146. package/corpus/templates/brain/server/lib/slack-channel-membership.ts +44 -0
  147. package/corpus/templates/brain/server/lib/slack-events.ts +281 -0
  148. package/corpus/templates/brain/server/onboarding.ts +29 -0
  149. package/corpus/templates/brain/server/plugins/db.ts +204 -0
  150. package/corpus/templates/brain/server/register-secrets.ts +46 -0
  151. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +36 -16
  152. package/corpus/templates/brain/server/routes/api/_agent-native/brain/slack-events.post.ts +28 -0
  153. package/corpus/templates/brain/shared/slack-source-config.ts +60 -0
  154. package/corpus/templates/brain/shared/types.ts +10 -0
  155. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +32 -12
  156. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  157. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +11 -2
  158. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  159. package/corpus/templates/calendar/actions/delete-staged-dataset.ts +3 -24
  160. package/corpus/templates/calendar/actions/list-staged-datasets.ts +3 -28
  161. package/corpus/templates/calendar/actions/provider-api-catalog.ts +5 -11
  162. package/corpus/templates/calendar/actions/provider-api-docs.ts +3 -5
  163. package/corpus/templates/calendar/actions/provider-api-request.ts +3 -37
  164. package/corpus/templates/calendar/actions/query-staged-dataset.ts +3 -48
  165. package/corpus/templates/calendar/server/handlers/gong.ts +6 -61
  166. package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -8
  167. package/corpus/templates/calendar/server/lib/google-calendar.ts +7 -45
  168. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +32 -12
  169. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +10 -0
  170. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  171. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +11 -2
  172. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  173. package/corpus/templates/chat/AGENTS.md +5 -2
  174. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +51 -157
  175. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +32 -12
  176. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  177. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +11 -2
  178. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  179. package/corpus/templates/clips/AGENTS.md +11 -0
  180. package/corpus/templates/clips/actions/export-to-brain.ts +505 -171
  181. package/corpus/templates/clips/changelog/2026-07-19-ready-clips-transcripts-can-be-backfilled-to-brain-for-a-bou.md +6 -0
  182. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +1 -1
  183. package/corpus/templates/clips/server/lib/google-calendar-client.ts +12 -22
  184. package/corpus/templates/clips/server/lib/google-calendar-oauth.ts +9 -6
  185. package/corpus/templates/clips/server/lib/slack-oauth.ts +12 -47
  186. package/corpus/templates/clips/server/routes/_agent-native/google/auth-url.get.ts +2 -6
  187. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +4 -4
  188. package/corpus/templates/content/.agents/skills/actions/SKILL.md +32 -12
  189. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  190. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +11 -2
  191. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  192. package/corpus/templates/content/actions/delete-staged-dataset.ts +3 -24
  193. package/corpus/templates/content/actions/list-staged-datasets.ts +3 -28
  194. package/corpus/templates/content/actions/provider-api-catalog.ts +5 -11
  195. package/corpus/templates/content/actions/provider-api-docs.ts +3 -5
  196. package/corpus/templates/content/actions/provider-api-request.ts +3 -37
  197. package/corpus/templates/content/actions/query-staged-dataset.ts +3 -48
  198. package/corpus/templates/design/.agents/skills/actions/SKILL.md +32 -12
  199. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  200. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +11 -2
  201. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  202. package/corpus/templates/design/actions/delete-staged-dataset.ts +4 -23
  203. package/corpus/templates/design/actions/list-staged-datasets.ts +4 -27
  204. package/corpus/templates/design/actions/provider-api-catalog.ts +15 -18
  205. package/corpus/templates/design/actions/provider-api-docs.ts +57 -48
  206. package/corpus/templates/design/actions/provider-api-request.ts +140 -164
  207. package/corpus/templates/design/actions/query-staged-dataset.ts +4 -47
  208. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +32 -12
  209. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  210. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +11 -2
  211. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  212. package/corpus/templates/dispatch/actions/delete-staged-dataset.ts +4 -23
  213. package/corpus/templates/dispatch/actions/list-staged-datasets.ts +4 -30
  214. package/corpus/templates/dispatch/actions/provider-api-catalog.ts +15 -18
  215. package/corpus/templates/dispatch/actions/provider-api-docs.ts +57 -48
  216. package/corpus/templates/dispatch/actions/provider-api-request.ts +138 -163
  217. package/corpus/templates/dispatch/actions/query-staged-dataset.ts +4 -47
  218. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +32 -12
  219. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  220. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +11 -2
  221. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  222. package/corpus/templates/forms/server/lib/integrations.ts +23 -22
  223. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  224. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  225. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +32 -12
  226. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  227. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +11 -2
  228. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  229. package/corpus/templates/mail/actions/delete-staged-dataset.ts +4 -23
  230. package/corpus/templates/mail/actions/list-staged-datasets.ts +4 -27
  231. package/corpus/templates/mail/actions/provider-api-catalog.ts +15 -18
  232. package/corpus/templates/mail/actions/provider-api-docs.ts +57 -48
  233. package/corpus/templates/mail/actions/provider-api-request.ts +146 -173
  234. package/corpus/templates/mail/actions/query-staged-dataset.ts +4 -47
  235. package/corpus/templates/mail/server/handlers/gong.ts +6 -61
  236. package/corpus/templates/mail/server/lib/google-auth.ts +10 -13
  237. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +32 -12
  238. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  239. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +11 -2
  240. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  241. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +47 -156
  242. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +32 -12
  243. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  244. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +11 -2
  245. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  246. package/corpus/templates/slides/actions/delete-staged-dataset.ts +4 -23
  247. package/corpus/templates/slides/actions/list-staged-datasets.ts +4 -27
  248. package/corpus/templates/slides/actions/provider-api-catalog.ts +15 -18
  249. package/corpus/templates/slides/actions/provider-api-docs.ts +57 -48
  250. package/corpus/templates/slides/actions/provider-api-request.ts +145 -172
  251. package/corpus/templates/slides/actions/query-staged-dataset.ts +4 -47
  252. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +11 -36
  253. package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +32 -12
  254. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +10 -0
  255. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  256. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +11 -2
  257. package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  258. package/corpus/toolkit/CHANGELOG.md +125 -0
  259. package/corpus/toolkit/README.md +60 -0
  260. package/corpus/toolkit/export-snapshot.json +35 -0
  261. package/corpus/toolkit/migration-manifest.json +4 -0
  262. package/corpus/toolkit/package.json +281 -0
  263. package/corpus/toolkit/scripts/finalize-build.mjs +55 -0
  264. package/corpus/toolkit/src/app-shell/header-actions.tsx +84 -0
  265. package/corpus/toolkit/src/app-shell/index.ts +1 -0
  266. package/corpus/toolkit/src/chat-history/ChatHistoryList.tsx +469 -0
  267. package/corpus/toolkit/src/chat-history/index.ts +7 -0
  268. package/corpus/toolkit/src/chat-history.css +314 -0
  269. package/corpus/toolkit/src/collab-ui/AgentPresenceChip.tsx +69 -0
  270. package/corpus/toolkit/src/collab-ui/LiveCursorOverlay.tsx +241 -0
  271. package/corpus/toolkit/src/collab-ui/PresenceBar.tsx +346 -0
  272. package/corpus/toolkit/src/collab-ui/RecentEditHighlights.tsx +225 -0
  273. package/corpus/toolkit/src/collab-ui/RemoteSelectionRings.tsx +227 -0
  274. package/corpus/toolkit/src/collab-ui/agent-identity.ts +16 -0
  275. package/corpus/toolkit/src/collab-ui/index.ts +39 -0
  276. package/corpus/toolkit/src/collab-ui/lead-client.ts +32 -0
  277. package/corpus/toolkit/src/collab-ui/types.ts +96 -0
  278. package/corpus/toolkit/src/composer/AgentComposerFrame.tsx +59 -0
  279. package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +983 -0
  280. package/corpus/toolkit/src/composer/MentionPopover.tsx +412 -0
  281. package/corpus/toolkit/src/composer/PastedTextChip.tsx +150 -0
  282. package/corpus/toolkit/src/composer/PromptComposer.tsx +718 -0
  283. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +856 -0
  284. package/corpus/toolkit/src/composer/TiptapComposer.tsx +2936 -0
  285. package/corpus/toolkit/src/composer/VoiceButton.tsx +255 -0
  286. package/corpus/toolkit/src/composer/asset-picker-url.ts +80 -0
  287. package/corpus/toolkit/src/composer/attachment-accept.ts +71 -0
  288. package/corpus/toolkit/src/composer/draft-key.ts +7 -0
  289. package/corpus/toolkit/src/composer/extensions/FileReference.tsx +55 -0
  290. package/corpus/toolkit/src/composer/extensions/MentionReference.tsx +93 -0
  291. package/corpus/toolkit/src/composer/extensions/SkillReference.tsx +56 -0
  292. package/corpus/toolkit/src/composer/index.ts +79 -0
  293. package/corpus/toolkit/src/composer/pasted-text.ts +160 -0
  294. package/corpus/toolkit/src/composer/prompt-attachments.ts +93 -0
  295. package/corpus/toolkit/src/composer/realtime-voice-audio-level.ts +64 -0
  296. package/corpus/toolkit/src/composer/realtime-voice-transcript.ts +134 -0
  297. package/corpus/toolkit/src/composer/runtime-adapters.tsx +343 -0
  298. package/corpus/toolkit/src/composer/types.ts +66 -0
  299. package/corpus/toolkit/src/composer/use-file-search.ts +64 -0
  300. package/corpus/toolkit/src/composer/use-mention-search.ts +90 -0
  301. package/corpus/toolkit/src/composer/use-skills.ts +45 -0
  302. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +2117 -0
  303. package/corpus/toolkit/src/composer/useVoiceDictation.ts +1191 -0
  304. package/corpus/toolkit/src/context-ui/ContextMeter.tsx +101 -0
  305. package/corpus/toolkit/src/context-ui/ContextSegmentRow.tsx +184 -0
  306. package/corpus/toolkit/src/context-ui/ContextTreemap.tsx +125 -0
  307. package/corpus/toolkit/src/context-ui/ContextXRayPanel.tsx +377 -0
  308. package/corpus/toolkit/src/context-ui/format.ts +42 -0
  309. package/corpus/toolkit/src/context-ui/index.ts +15 -0
  310. package/corpus/toolkit/src/context-ui/types.ts +43 -0
  311. package/corpus/toolkit/src/design-tweaks/index.ts +1 -0
  312. package/corpus/toolkit/src/design-tweaks/visual-style-controls.tsx +1084 -0
  313. package/corpus/toolkit/src/editor/BubbleToolbar.tsx +253 -0
  314. package/corpus/toolkit/src/editor/CodeBlockNode.tsx +254 -0
  315. package/corpus/toolkit/src/editor/DragHandle.ts +1437 -0
  316. package/corpus/toolkit/src/editor/ImageExtension.ts +306 -0
  317. package/corpus/toolkit/src/editor/RegistryBlockContext.tsx +107 -0
  318. package/corpus/toolkit/src/editor/RegistryBlockNode.tsx +652 -0
  319. package/corpus/toolkit/src/editor/RichMarkdownEditor.tsx +81 -0
  320. package/corpus/toolkit/src/editor/RunId.ts +61 -0
  321. package/corpus/toolkit/src/editor/SharedRichEditor.tsx +321 -0
  322. package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +310 -0
  323. package/corpus/toolkit/src/editor/extensions.ts +402 -0
  324. package/corpus/toolkit/src/editor/gfmDoc.ts +92 -0
  325. package/corpus/toolkit/src/editor/index.ts +93 -0
  326. package/corpus/toolkit/src/editor/registrySlashCommands.ts +131 -0
  327. package/corpus/toolkit/src/editor/surgical-apply.ts +192 -0
  328. package/corpus/toolkit/src/editor/useCollabReconcile.ts +589 -0
  329. package/corpus/toolkit/src/editor.css +510 -0
  330. package/corpus/toolkit/src/hooks/index.ts +2 -0
  331. package/corpus/toolkit/src/hooks/use-mobile.tsx +21 -0
  332. package/corpus/toolkit/src/hooks/use-toast.ts +188 -0
  333. package/corpus/toolkit/src/index.ts +8 -0
  334. package/corpus/toolkit/src/onboarding/index.ts +1 -0
  335. package/corpus/toolkit/src/provider.tsx +47 -0
  336. package/corpus/toolkit/src/sharing/VisibilityBadge.tsx +37 -0
  337. package/corpus/toolkit/src/sharing/index.ts +4 -0
  338. package/corpus/toolkit/src/styles.css +21 -0
  339. package/corpus/toolkit/src/ui/accordion.tsx +56 -0
  340. package/corpus/toolkit/src/ui/alert-dialog.tsx +141 -0
  341. package/corpus/toolkit/src/ui/alert.tsx +59 -0
  342. package/corpus/toolkit/src/ui/aspect-ratio.tsx +5 -0
  343. package/corpus/toolkit/src/ui/avatar.tsx +48 -0
  344. package/corpus/toolkit/src/ui/badge.tsx +37 -0
  345. package/corpus/toolkit/src/ui/breadcrumb.tsx +115 -0
  346. package/corpus/toolkit/src/ui/button.tsx +78 -0
  347. package/corpus/toolkit/src/ui/calendar.tsx +214 -0
  348. package/corpus/toolkit/src/ui/card.tsx +86 -0
  349. package/corpus/toolkit/src/ui/carousel.tsx +260 -0
  350. package/corpus/toolkit/src/ui/chart.tsx +375 -0
  351. package/corpus/toolkit/src/ui/checkbox.tsx +28 -0
  352. package/corpus/toolkit/src/ui/collapsible.tsx +9 -0
  353. package/corpus/toolkit/src/ui/command.tsx +174 -0
  354. package/corpus/toolkit/src/ui/context-menu.tsx +202 -0
  355. package/corpus/toolkit/src/ui/date-picker.tsx +64 -0
  356. package/corpus/toolkit/src/ui/dialog.tsx +146 -0
  357. package/corpus/toolkit/src/ui/drawer.tsx +126 -0
  358. package/corpus/toolkit/src/ui/dropdown-menu.tsx +218 -0
  359. package/corpus/toolkit/src/ui/form.tsx +177 -0
  360. package/corpus/toolkit/src/ui/hover-card.tsx +27 -0
  361. package/corpus/toolkit/src/ui/index.ts +52 -0
  362. package/corpus/toolkit/src/ui/input-otp.tsx +69 -0
  363. package/corpus/toolkit/src/ui/input.tsx +22 -0
  364. package/corpus/toolkit/src/ui/label.tsx +24 -0
  365. package/corpus/toolkit/src/ui/logo.tsx +36 -0
  366. package/corpus/toolkit/src/ui/menubar.tsx +235 -0
  367. package/corpus/toolkit/src/ui/navigation-menu.tsx +128 -0
  368. package/corpus/toolkit/src/ui/pagination.tsx +121 -0
  369. package/corpus/toolkit/src/ui/popover.tsx +44 -0
  370. package/corpus/toolkit/src/ui/progress.tsx +26 -0
  371. package/corpus/toolkit/src/ui/radio-group.tsx +42 -0
  372. package/corpus/toolkit/src/ui/resizable.tsx +43 -0
  373. package/corpus/toolkit/src/ui/scroll-area.tsx +46 -0
  374. package/corpus/toolkit/src/ui/select.tsx +158 -0
  375. package/corpus/toolkit/src/ui/separator.tsx +29 -0
  376. package/corpus/toolkit/src/ui/sheet.tsx +160 -0
  377. package/corpus/toolkit/src/ui/sidebar.tsx +777 -0
  378. package/corpus/toolkit/src/ui/skeleton.tsx +18 -0
  379. package/corpus/toolkit/src/ui/slider.tsx +26 -0
  380. package/corpus/toolkit/src/ui/sonner.tsx +58 -0
  381. package/corpus/toolkit/src/ui/spinner.tsx +17 -0
  382. package/corpus/toolkit/src/ui/switch.tsx +27 -0
  383. package/corpus/toolkit/src/ui/table.tsx +117 -0
  384. package/corpus/toolkit/src/ui/tabs.tsx +53 -0
  385. package/corpus/toolkit/src/ui/textarea.tsx +23 -0
  386. package/corpus/toolkit/src/ui/toast.tsx +127 -0
  387. package/corpus/toolkit/src/ui/toaster.tsx +33 -0
  388. package/corpus/toolkit/src/ui/toggle-group.tsx +59 -0
  389. package/corpus/toolkit/src/ui/toggle.tsx +43 -0
  390. package/corpus/toolkit/src/ui/tooltip.tsx +53 -0
  391. package/corpus/toolkit/src/ui/use-toast.ts +3 -0
  392. package/corpus/toolkit/src/utils.ts +8 -0
  393. package/corpus/toolkit/tsconfig.json +23 -0
  394. package/dist/cli/atomic-json-file.d.ts +30 -0
  395. package/dist/cli/atomic-json-file.d.ts.map +1 -0
  396. package/dist/cli/atomic-json-file.js +240 -0
  397. package/dist/cli/atomic-json-file.js.map +1 -0
  398. package/dist/cli/claude-code-participant.d.ts +77 -0
  399. package/dist/cli/claude-code-participant.d.ts.map +1 -0
  400. package/dist/cli/claude-code-participant.js +355 -0
  401. package/dist/cli/claude-code-participant.js.map +1 -0
  402. package/dist/cli/code-agent-executor.d.ts +8 -9
  403. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  404. package/dist/cli/code-agent-executor.js +27 -13
  405. package/dist/cli/code-agent-executor.js.map +1 -1
  406. package/dist/cli/code-agent-runs.concurrent-worker.d.ts +2 -0
  407. package/dist/cli/code-agent-runs.concurrent-worker.d.ts.map +1 -0
  408. package/dist/cli/code-agent-runs.concurrent-worker.js +32 -0
  409. package/dist/cli/code-agent-runs.concurrent-worker.js.map +1 -0
  410. package/dist/cli/code-agent-runs.d.ts +5 -0
  411. package/dist/cli/code-agent-runs.d.ts.map +1 -1
  412. package/dist/cli/code-agent-runs.js +51 -33
  413. package/dist/cli/code-agent-runs.js.map +1 -1
  414. package/dist/cli/codex-cli-participant.d.ts +77 -0
  415. package/dist/cli/codex-cli-participant.d.ts.map +1 -0
  416. package/dist/cli/codex-cli-participant.js +354 -0
  417. package/dist/cli/codex-cli-participant.js.map +1 -0
  418. package/dist/cli/multi-frontier-runs.d.ts +246 -0
  419. package/dist/cli/multi-frontier-runs.d.ts.map +1 -0
  420. package/dist/cli/multi-frontier-runs.js +1247 -0
  421. package/dist/cli/multi-frontier-runs.js.map +1 -0
  422. package/dist/client/chat/ChatHistoryList.d.ts +1 -87
  423. package/dist/client/chat/ChatHistoryList.d.ts.map +1 -1
  424. package/dist/client/chat/ChatHistoryList.js +1 -82
  425. package/dist/client/chat/ChatHistoryList.js.map +1 -1
  426. package/dist/coding-tools/index.d.ts +1 -0
  427. package/dist/coding-tools/index.d.ts.map +1 -1
  428. package/dist/coding-tools/index.js +25 -7
  429. package/dist/coding-tools/index.js.map +1 -1
  430. package/dist/collab/awareness.d.ts +2 -2
  431. package/dist/collab/awareness.d.ts.map +1 -1
  432. package/dist/embeddings/index.d.ts +24 -0
  433. package/dist/embeddings/index.d.ts.map +1 -0
  434. package/dist/embeddings/index.js +172 -0
  435. package/dist/embeddings/index.js.map +1 -0
  436. package/dist/index.d.ts +2 -0
  437. package/dist/index.d.ts.map +1 -1
  438. package/dist/index.js +2 -0
  439. package/dist/index.js.map +1 -1
  440. package/dist/integrations/index.d.ts +2 -1
  441. package/dist/integrations/index.d.ts.map +1 -1
  442. package/dist/integrations/index.js +2 -1
  443. package/dist/integrations/index.js.map +1 -1
  444. package/dist/integrations/slack-manifest.d.ts +1 -1
  445. package/dist/integrations/slack-oauth.d.ts +1 -1
  446. package/dist/integrations/slack-oauth.d.ts.map +1 -1
  447. package/dist/integrations/slack-oauth.js +1 -0
  448. package/dist/integrations/slack-oauth.js.map +1 -1
  449. package/dist/integrations/webhook-delivery.d.ts +23 -0
  450. package/dist/integrations/webhook-delivery.d.ts.map +1 -0
  451. package/dist/integrations/webhook-delivery.js +32 -0
  452. package/dist/integrations/webhook-delivery.js.map +1 -0
  453. package/dist/notifications/channels.d.ts.map +1 -1
  454. package/dist/notifications/channels.js +4 -9
  455. package/dist/notifications/channels.js.map +1 -1
  456. package/dist/notifications/routes.d.ts +3 -3
  457. package/dist/progress/routes.d.ts +1 -1
  458. package/dist/provider-api/actions/custom-provider-registration.d.ts +136 -0
  459. package/dist/provider-api/actions/custom-provider-registration.d.ts.map +1 -0
  460. package/dist/provider-api/actions/custom-provider-registration.js +154 -0
  461. package/dist/provider-api/actions/custom-provider-registration.js.map +1 -0
  462. package/dist/provider-api/actions/delete-staged-dataset.d.ts +1 -1
  463. package/dist/provider-api/actions/delete-staged-dataset.d.ts.map +1 -1
  464. package/dist/provider-api/actions/delete-staged-dataset.js +3 -34
  465. package/dist/provider-api/actions/delete-staged-dataset.js.map +1 -1
  466. package/dist/provider-api/actions/list-staged-datasets.d.ts +2 -3
  467. package/dist/provider-api/actions/list-staged-datasets.d.ts.map +1 -1
  468. package/dist/provider-api/actions/list-staged-datasets.js +3 -40
  469. package/dist/provider-api/actions/list-staged-datasets.js.map +1 -1
  470. package/dist/provider-api/actions/provider-api-audit.d.ts +7 -0
  471. package/dist/provider-api/actions/provider-api-audit.d.ts.map +1 -0
  472. package/dist/provider-api/actions/provider-api-audit.js +74 -0
  473. package/dist/provider-api/actions/provider-api-audit.js.map +1 -0
  474. package/dist/provider-api/actions/provider-api.d.ts +370 -0
  475. package/dist/provider-api/actions/provider-api.d.ts.map +1 -0
  476. package/dist/provider-api/actions/provider-api.js +280 -0
  477. package/dist/provider-api/actions/provider-api.js.map +1 -0
  478. package/dist/provider-api/actions/query-staged-dataset.d.ts +1 -1
  479. package/dist/provider-api/actions/query-staged-dataset.d.ts.map +1 -1
  480. package/dist/provider-api/actions/query-staged-dataset.js +3 -116
  481. package/dist/provider-api/actions/query-staged-dataset.js.map +1 -1
  482. package/dist/provider-api/actions/staged-datasets.d.ts +190 -0
  483. package/dist/provider-api/actions/staged-datasets.d.ts.map +1 -0
  484. package/dist/provider-api/actions/staged-datasets.js +210 -0
  485. package/dist/provider-api/actions/staged-datasets.js.map +1 -0
  486. package/dist/provider-api/gong.d.ts +44 -0
  487. package/dist/provider-api/gong.d.ts.map +1 -0
  488. package/dist/provider-api/gong.js +56 -0
  489. package/dist/provider-api/gong.js.map +1 -0
  490. package/dist/resources/handlers.d.ts +1 -1
  491. package/dist/scripts/docs/source-search.d.ts +2 -1
  492. package/dist/scripts/docs/source-search.d.ts.map +1 -1
  493. package/dist/scripts/docs/source-search.js +2 -1
  494. package/dist/scripts/docs/source-search.js.map +1 -1
  495. package/dist/search/index.d.ts +88 -0
  496. package/dist/search/index.d.ts.map +1 -0
  497. package/dist/search/index.js +267 -0
  498. package/dist/search/index.js.map +1 -0
  499. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  500. package/dist/server/google-oauth-credentials.d.ts +35 -0
  501. package/dist/server/google-oauth-credentials.d.ts.map +1 -1
  502. package/dist/server/google-oauth-credentials.js +48 -2
  503. package/dist/server/google-oauth-credentials.js.map +1 -1
  504. package/dist/server/index.d.ts +1 -1
  505. package/dist/server/index.d.ts.map +1 -1
  506. package/dist/server/index.js +1 -1
  507. package/dist/server/index.js.map +1 -1
  508. package/dist/styles/chat-history-list.css +1 -313
  509. package/dist/templates/chat/.agents/skills/actions/SKILL.md +32 -12
  510. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +10 -0
  511. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  512. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +11 -2
  513. package/dist/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  514. package/dist/templates/chat/AGENTS.md +5 -2
  515. package/dist/templates/chat/app/components/layout/Sidebar.tsx +51 -157
  516. package/dist/templates/default/.agents/skills/actions/SKILL.md +32 -12
  517. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +10 -0
  518. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  519. package/dist/templates/default/.agents/skills/integration-webhooks/SKILL.md +323 -0
  520. package/dist/templates/default/.agents/skills/onboarding/SKILL.md +56 -0
  521. package/dist/templates/default/.agents/skills/secrets/SKILL.md +273 -0
  522. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +11 -2
  523. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  524. package/dist/templates/default/AGENTS.md +25 -18
  525. package/dist/templates/headless/.agents/skills/actions/SKILL.md +512 -0
  526. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +10 -0
  527. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  528. package/dist/templates/headless/.agents/skills/integration-webhooks/SKILL.md +323 -0
  529. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +273 -0
  530. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  531. package/dist/templates/headless/AGENTS.md +7 -0
  532. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +32 -12
  533. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +10 -0
  534. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  535. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  536. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +11 -2
  537. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  538. package/dist/templates/workspace-core/AGENTS.md +4 -0
  539. package/dist/templates/workspace-root/AGENTS.md +4 -0
  540. package/docs/AGENTS.md +7 -0
  541. package/docs/content/integrations.mdx +63 -2
  542. package/docs/design/provider-integration-authority.md +117 -0
  543. package/package.json +9 -2
  544. package/src/templates/chat/.agents/skills/actions/SKILL.md +32 -12
  545. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +10 -0
  546. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  547. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +11 -2
  548. package/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  549. package/src/templates/chat/AGENTS.md +5 -2
  550. package/src/templates/chat/app/components/layout/Sidebar.tsx +51 -157
  551. package/src/templates/default/.agents/skills/actions/SKILL.md +32 -12
  552. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +10 -0
  553. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  554. package/src/templates/default/.agents/skills/integration-webhooks/SKILL.md +323 -0
  555. package/src/templates/default/.agents/skills/onboarding/SKILL.md +56 -0
  556. package/src/templates/default/.agents/skills/secrets/SKILL.md +273 -0
  557. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +11 -2
  558. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  559. package/src/templates/default/AGENTS.md +25 -18
  560. package/src/templates/headless/.agents/skills/actions/SKILL.md +512 -0
  561. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +10 -0
  562. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  563. package/src/templates/headless/.agents/skills/integration-webhooks/SKILL.md +323 -0
  564. package/src/templates/headless/.agents/skills/secrets/SKILL.md +273 -0
  565. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  566. package/src/templates/headless/AGENTS.md +7 -0
  567. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +32 -12
  568. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +10 -0
  569. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  570. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +102 -0
  571. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +11 -2
  572. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  573. package/src/templates/workspace-core/AGENTS.md +4 -0
  574. package/src/templates/workspace-root/AGENTS.md +4 -0
@@ -0,0 +1,413 @@
1
+ import type { DbExec } from "../db/index.js";
2
+ import { isPostgres } from "../db/index.js";
3
+
4
+ export const DEFAULT_SEARCH_NAMESPACE = "creative_context";
5
+ export const PGVECTOR_REQUIRED_MESSAGE =
6
+ "Vector search requires Postgres with the pgvector extension in the configured DATABASE_URL database.";
7
+
8
+ export interface SearchNamespaceIdentifiers {
9
+ namespace: string;
10
+ ftsTable: string;
11
+ ftsIndex: string;
12
+ ftsAudienceIndex: string;
13
+ vectorTable: string;
14
+ vectorIndex: string;
15
+ vectorAudienceIndex: string;
16
+ }
17
+
18
+ export interface PgVectorHit {
19
+ vectorKey: string;
20
+ embeddingSetId: string;
21
+ score: number;
22
+ }
23
+
24
+ export interface PostgresFtsHit {
25
+ chunkId: string;
26
+ itemVersionId: string;
27
+ score: number;
28
+ }
29
+
30
+ export interface RankedCandidate<T> {
31
+ key: string;
32
+ value: T;
33
+ score: number;
34
+ reason?: string;
35
+ }
36
+
37
+ export interface FusedCandidate<T> extends RankedCandidate<T> {
38
+ laneRanks: Record<string, number>;
39
+ reasons: string[];
40
+ }
41
+
42
+ type PgVectorOptions =
43
+ | boolean
44
+ | {
45
+ namespace?: string;
46
+ postgres?: boolean;
47
+ /** The caller has already provisioned this namespace and dimension. */
48
+ indexInitialized?: boolean;
49
+ };
50
+
51
+ function pgVectorOptions(options: PgVectorOptions | undefined) {
52
+ return typeof options === "boolean" ? { postgres: options } : (options ?? {});
53
+ }
54
+
55
+ export function searchNamespaceIdentifiers(
56
+ namespace = DEFAULT_SEARCH_NAMESPACE,
57
+ dimensions?: number,
58
+ ): SearchNamespaceIdentifiers {
59
+ if (!/^[a-z][a-z0-9_]{0,62}$/.test(namespace)) {
60
+ throw new Error(
61
+ "Search namespace must start with a lowercase letter and contain only lowercase letters, numbers, and underscores.",
62
+ );
63
+ }
64
+ const suffix =
65
+ dimensions === undefined ? "" : `_${checkedDimensions(dimensions)}`;
66
+ return {
67
+ namespace,
68
+ ftsTable: `${namespace}_search_documents`,
69
+ ftsIndex: `${namespace}_search_documents_gin`,
70
+ ftsAudienceIndex: `${namespace}_search_documents_audience_gin`,
71
+ vectorTable: `${namespace}_vectors${suffix}`,
72
+ vectorIndex: `${namespace}_vectors${suffix}_hnsw`,
73
+ vectorAudienceIndex: `${namespace}_vectors${suffix}_audience_gin`,
74
+ };
75
+ }
76
+
77
+ function checkedDimensions(value: number): number {
78
+ if (!Number.isInteger(value) || value < 1 || value > 16_000) {
79
+ throw new Error("Embedding dimensions must be an integer from 1 to 16000.");
80
+ }
81
+ return value;
82
+ }
83
+
84
+ function vectorLiteral(vector: readonly number[], dimensions: number): string {
85
+ if (vector.length !== dimensions) {
86
+ throw new Error(
87
+ `Embedding has ${vector.length} values; expected ${dimensions}.`,
88
+ );
89
+ }
90
+ for (const value of vector) {
91
+ if (!Number.isFinite(value)) {
92
+ throw new Error("Embedding vectors may contain only finite numbers.");
93
+ }
94
+ }
95
+ return `[${vector.join(",")}]`;
96
+ }
97
+
98
+ function audienceClause(
99
+ audienceIds: readonly string[] | undefined,
100
+ column = "audience_ids",
101
+ ): { sql: string; args: string[] } {
102
+ if (!audienceIds?.length) return { sql: "", args: [] };
103
+ return {
104
+ sql: ` AND ${column} && ARRAY[${audienceIds.map(() => "?").join(", ")}]::TEXT[]`,
105
+ args: [...audienceIds],
106
+ };
107
+ }
108
+
109
+ export function assertPgVectorAvailable(postgres = isPostgres()): void {
110
+ if (!postgres) throw new Error(PGVECTOR_REQUIRED_MESSAGE);
111
+ }
112
+
113
+ export async function ensurePgVectorIndex(
114
+ db: DbExec,
115
+ dimensions: number,
116
+ options?: PgVectorOptions,
117
+ ): Promise<void> {
118
+ const resolved = pgVectorOptions(options);
119
+ const names = searchNamespaceIdentifiers(resolved.namespace, dimensions);
120
+ assertPgVectorAvailable(resolved.postgres);
121
+ try {
122
+ await db.execute("CREATE EXTENSION IF NOT EXISTS vector");
123
+ await db.execute(`
124
+ CREATE TABLE IF NOT EXISTS ${names.vectorTable} (
125
+ vector_key TEXT PRIMARY KEY,
126
+ embedding_set_id TEXT NOT NULL,
127
+ audience_ids TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[],
128
+ embedding vector(${checkedDimensions(dimensions)}) NOT NULL,
129
+ updated_at TEXT NOT NULL
130
+ )
131
+ `);
132
+ await db.execute(
133
+ `ALTER TABLE ${names.vectorTable} ADD COLUMN IF NOT EXISTS audience_ids TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[]`,
134
+ );
135
+ await db.execute(
136
+ `CREATE INDEX IF NOT EXISTS ${names.vectorIndex} ON ${names.vectorTable} USING hnsw (embedding vector_cosine_ops)`,
137
+ );
138
+ await db.execute(
139
+ `CREATE INDEX IF NOT EXISTS ${names.vectorAudienceIndex} ON ${names.vectorTable} USING GIN (audience_ids)`,
140
+ );
141
+ } catch (error) {
142
+ throw new Error(PGVECTOR_REQUIRED_MESSAGE, { cause: error });
143
+ }
144
+ }
145
+
146
+ export async function upsertPgVector(
147
+ db: DbExec,
148
+ input: {
149
+ vectorKey: string;
150
+ embeddingSetId: string;
151
+ dimensions: number;
152
+ vector: readonly number[];
153
+ audienceIds?: readonly string[];
154
+ updatedAt?: string;
155
+ },
156
+ options?: PgVectorOptions,
157
+ ): Promise<void> {
158
+ const resolved = pgVectorOptions(options);
159
+ const names = searchNamespaceIdentifiers(
160
+ resolved.namespace,
161
+ input.dimensions,
162
+ );
163
+ assertPgVectorAvailable(resolved.postgres);
164
+ if (!resolved.indexInitialized) {
165
+ await ensurePgVectorIndex(db, input.dimensions, resolved);
166
+ }
167
+ await db.execute({
168
+ sql: `
169
+ INSERT INTO ${names.vectorTable} (vector_key, embedding_set_id, audience_ids, embedding, updated_at)
170
+ VALUES (?, ?, ARRAY[${(input.audienceIds ?? []).map(() => "?").join(", ")}]::TEXT[], ?::vector, ?)
171
+ ON CONFLICT (vector_key) DO UPDATE SET
172
+ embedding_set_id = EXCLUDED.embedding_set_id,
173
+ audience_ids = EXCLUDED.audience_ids,
174
+ embedding = EXCLUDED.embedding,
175
+ updated_at = EXCLUDED.updated_at
176
+ `,
177
+ args: [
178
+ input.vectorKey,
179
+ input.embeddingSetId,
180
+ ...(input.audienceIds ?? []),
181
+ vectorLiteral(input.vector, input.dimensions),
182
+ input.updatedAt ?? new Date().toISOString(),
183
+ ],
184
+ });
185
+ }
186
+
187
+ export async function deletePgVectors(
188
+ db: DbExec,
189
+ input: {
190
+ dimensions: number;
191
+ vectorKeys: readonly string[];
192
+ namespace?: string;
193
+ },
194
+ postgres = isPostgres(),
195
+ ): Promise<number> {
196
+ const names = searchNamespaceIdentifiers(input.namespace, input.dimensions);
197
+ assertPgVectorAvailable(postgres);
198
+ if (!input.vectorKeys.length) return 0;
199
+ const result = await db.execute({
200
+ sql: `DELETE FROM ${names.vectorTable} WHERE vector_key IN (${input.vectorKeys.map(() => "?").join(", ")})`,
201
+ args: [...input.vectorKeys],
202
+ });
203
+ return result.rowsAffected;
204
+ }
205
+
206
+ export async function queryPgVectorIndex(
207
+ db: DbExec,
208
+ input: {
209
+ embeddingSetId: string;
210
+ dimensions: number;
211
+ vector: readonly number[];
212
+ limit?: number;
213
+ allowedVectorKeys?: readonly string[];
214
+ allowedAudienceIds?: readonly string[];
215
+ namespace?: string;
216
+ },
217
+ postgres = isPostgres(),
218
+ ): Promise<PgVectorHit[]> {
219
+ const names = searchNamespaceIdentifiers(input.namespace, input.dimensions);
220
+ assertPgVectorAvailable(postgres);
221
+ if (
222
+ input.allowedVectorKeys?.length === 0 ||
223
+ input.allowedAudienceIds?.length === 0
224
+ )
225
+ return [];
226
+ const limit = Math.max(1, Math.min(200, Math.floor(input.limit ?? 40)));
227
+ const literal = vectorLiteral(input.vector, input.dimensions);
228
+ const keySql = input.allowedVectorKeys?.length
229
+ ? ` AND vector_key IN (${input.allowedVectorKeys.map(() => "?").join(", ")})`
230
+ : "";
231
+ const audiences = audienceClause(input.allowedAudienceIds);
232
+ try {
233
+ await db.execute("SET hnsw.iterative_scan = strict_order");
234
+ } catch {}
235
+ const result = await db.execute({
236
+ sql: `
237
+ SELECT vector_key, embedding_set_id, 1 - (embedding <=> ?::vector) AS score
238
+ FROM ${names.vectorTable}
239
+ WHERE embedding_set_id = ?${keySql}${audiences.sql}
240
+ ORDER BY embedding <=> ?::vector
241
+ LIMIT ?
242
+ `,
243
+ args: [
244
+ literal,
245
+ input.embeddingSetId,
246
+ ...(input.allowedVectorKeys ?? []),
247
+ ...audiences.args,
248
+ literal,
249
+ limit,
250
+ ],
251
+ });
252
+ return result.rows.map((row) => ({
253
+ vectorKey: String(row.vector_key),
254
+ embeddingSetId: String(row.embedding_set_id),
255
+ score: Number(row.score),
256
+ }));
257
+ }
258
+
259
+ export async function ensurePostgresFts(
260
+ db: DbExec,
261
+ namespace = DEFAULT_SEARCH_NAMESPACE,
262
+ ): Promise<boolean> {
263
+ const names = searchNamespaceIdentifiers(namespace);
264
+ if (!isPostgres()) return false;
265
+ await db.execute(`
266
+ CREATE TABLE IF NOT EXISTS ${names.ftsTable} (
267
+ chunk_id TEXT PRIMARY KEY,
268
+ item_version_id TEXT NOT NULL,
269
+ audience_ids TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[],
270
+ document TSVECTOR NOT NULL,
271
+ updated_at TEXT NOT NULL
272
+ )
273
+ `);
274
+ await db.execute(
275
+ `ALTER TABLE ${names.ftsTable} ADD COLUMN IF NOT EXISTS audience_ids TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[]`,
276
+ );
277
+ await db.execute(
278
+ `CREATE INDEX IF NOT EXISTS ${names.ftsIndex} ON ${names.ftsTable} USING GIN (document)`,
279
+ );
280
+ await db.execute(
281
+ `CREATE INDEX IF NOT EXISTS ${names.ftsAudienceIndex} ON ${names.ftsTable} USING GIN (audience_ids)`,
282
+ );
283
+ return true;
284
+ }
285
+
286
+ export async function upsertPostgresFtsDocument(
287
+ db: DbExec,
288
+ input: {
289
+ chunkId: string;
290
+ itemVersionId: string;
291
+ title: string;
292
+ summary?: string | null;
293
+ body: string;
294
+ audienceIds?: readonly string[];
295
+ updatedAt?: string;
296
+ namespace?: string;
297
+ },
298
+ ): Promise<boolean> {
299
+ const namespace = input.namespace ?? DEFAULT_SEARCH_NAMESPACE;
300
+ if (!(await ensurePostgresFts(db, namespace))) return false;
301
+ const names = searchNamespaceIdentifiers(namespace);
302
+ await db.execute({
303
+ sql: `
304
+ INSERT INTO ${names.ftsTable} (chunk_id, item_version_id, audience_ids, document, updated_at)
305
+ VALUES (?, ?, ARRAY[${(input.audienceIds ?? []).map(() => "?").join(", ")}]::TEXT[], setweight(to_tsvector('simple', ?), 'A') || setweight(to_tsvector('simple', ?), 'B') || setweight(to_tsvector('simple', ?), 'C'), ?)
306
+ ON CONFLICT (chunk_id) DO UPDATE SET item_version_id = EXCLUDED.item_version_id, audience_ids = EXCLUDED.audience_ids, document = EXCLUDED.document, updated_at = EXCLUDED.updated_at
307
+ `,
308
+ args: [
309
+ input.chunkId,
310
+ input.itemVersionId,
311
+ ...(input.audienceIds ?? []),
312
+ input.title,
313
+ input.summary ?? "",
314
+ input.body,
315
+ input.updatedAt ?? new Date().toISOString(),
316
+ ],
317
+ });
318
+ return true;
319
+ }
320
+
321
+ export async function queryPostgresFts(
322
+ db: DbExec,
323
+ input: {
324
+ query: string;
325
+ allowedChunkIds?: readonly string[];
326
+ allowedAudienceIds?: readonly string[];
327
+ limit?: number;
328
+ namespace?: string;
329
+ },
330
+ ): Promise<PostgresFtsHit[]> {
331
+ const namespace = input.namespace ?? DEFAULT_SEARCH_NAMESPACE;
332
+ const names = searchNamespaceIdentifiers(namespace);
333
+ if (
334
+ !isPostgres() ||
335
+ input.allowedChunkIds?.length === 0 ||
336
+ input.allowedAudienceIds?.length === 0
337
+ )
338
+ return [];
339
+ const keys = input.allowedChunkIds?.length
340
+ ? `chunk_id IN (${input.allowedChunkIds.map(() => "?").join(", ")}) AND`
341
+ : "";
342
+ const audiences = audienceClause(input.allowedAudienceIds);
343
+ const limit = Math.max(1, Math.min(200, Math.floor(input.limit ?? 40)));
344
+ try {
345
+ const result = await db.execute({
346
+ sql: `SELECT chunk_id, item_version_id, ts_rank_cd(document, websearch_to_tsquery('simple', ?)) AS score FROM ${names.ftsTable} WHERE ${keys} document @@ websearch_to_tsquery('simple', ?)${audiences.sql} ORDER BY score DESC, chunk_id ASC LIMIT ?`,
347
+ args: [
348
+ input.query,
349
+ ...(input.allowedChunkIds ?? []),
350
+ input.query,
351
+ ...audiences.args,
352
+ limit,
353
+ ],
354
+ });
355
+ return result.rows.map((row) => ({
356
+ chunkId: String(row.chunk_id),
357
+ itemVersionId: String(row.item_version_id),
358
+ score: Number(row.score),
359
+ }));
360
+ } catch (error) {
361
+ // A read can race the first write for a tenant-specific namespace. Writers
362
+ // provision it; an absent lane simply contributes no candidates.
363
+ if (isMissingPostgresRelation(error)) return [];
364
+ throw error;
365
+ }
366
+ }
367
+
368
+ function isMissingPostgresRelation(error: unknown): boolean {
369
+ if (!error || typeof error !== "object") return false;
370
+ return (error as { code?: unknown }).code === "42P01";
371
+ }
372
+
373
+ export async function deletePostgresFtsDocuments(
374
+ db: DbExec,
375
+ chunkIds: readonly string[],
376
+ namespace = DEFAULT_SEARCH_NAMESPACE,
377
+ ): Promise<number> {
378
+ const names = searchNamespaceIdentifiers(namespace);
379
+ if (!isPostgres() || !chunkIds.length) return 0;
380
+ await ensurePostgresFts(db, namespace);
381
+ const result = await db.execute({
382
+ sql: `DELETE FROM ${names.ftsTable} WHERE chunk_id IN (${chunkIds.map(() => "?").join(", ")})`,
383
+ args: [...chunkIds],
384
+ });
385
+ return result.rowsAffected;
386
+ }
387
+
388
+ export function reciprocalRankFusion<T>(
389
+ lanes: Readonly<Record<string, readonly RankedCandidate<T>[]>>,
390
+ options: { rankConstant?: number; limit?: number } = {},
391
+ ): FusedCandidate<T>[] {
392
+ const rankConstant = Math.max(1, options.rankConstant ?? 60);
393
+ const fused = new Map<string, FusedCandidate<T>>();
394
+ for (const [lane, candidates] of Object.entries(lanes)) {
395
+ candidates.forEach((candidate, index) => {
396
+ const rank = index + 1;
397
+ const current = fused.get(candidate.key) ?? {
398
+ ...candidate,
399
+ score: 0,
400
+ laneRanks: {},
401
+ reasons: [],
402
+ };
403
+ current.score += 1 / (rankConstant + rank);
404
+ current.laneRanks[lane] = rank;
405
+ if (candidate.reason && !current.reasons.includes(candidate.reason))
406
+ current.reasons.push(candidate.reason);
407
+ fused.set(candidate.key, current);
408
+ });
409
+ }
410
+ return [...fused.values()]
411
+ .sort((a, b) => b.score - a.score || a.key.localeCompare(b.key))
412
+ .slice(0, Math.max(1, options.limit ?? 40));
413
+ }
@@ -3,6 +3,30 @@ export interface GoogleOAuthCredentials {
3
3
  clientSecret: string;
4
4
  }
5
5
 
6
+ export interface GoogleOAuthCredentialKeyPair {
7
+ clientIdKey: string;
8
+ clientSecretKey: string;
9
+ }
10
+
11
+ export type ReadGoogleOAuthCredential = (
12
+ key: string,
13
+ ) => string | null | undefined | Promise<string | null | undefined>;
14
+
15
+ export const GOOGLE_PRIMARY_PROVIDER_CREDENTIAL_KEYS = {
16
+ clientIdKey: "GOOGLE_CLIENT_ID",
17
+ clientSecretKey: "GOOGLE_CLIENT_SECRET",
18
+ } as const satisfies GoogleOAuthCredentialKeyPair;
19
+
20
+ export const GOOGLE_LEGACY_PROVIDER_CREDENTIAL_KEYS = {
21
+ clientIdKey: "GOOGLE_LEGACY_CLIENT_ID",
22
+ clientSecretKey: "GOOGLE_LEGACY_CLIENT_SECRET",
23
+ } as const satisfies GoogleOAuthCredentialKeyPair;
24
+
25
+ export const GOOGLE_PROVIDER_CREDENTIAL_KEY_PAIRS = [
26
+ GOOGLE_PRIMARY_PROVIDER_CREDENTIAL_KEYS,
27
+ GOOGLE_LEGACY_PROVIDER_CREDENTIAL_KEYS,
28
+ ] as const satisfies readonly GoogleOAuthCredentialKeyPair[];
29
+
6
30
  function readCredentialPair(
7
31
  clientIdKey: string,
8
32
  clientSecretKey: string,
@@ -13,6 +37,56 @@ function readCredentialPair(
13
37
  return { clientId, clientSecret };
14
38
  }
15
39
 
40
+ async function readInjectedCredentialPair(
41
+ readCredential: ReadGoogleOAuthCredential,
42
+ keys: GoogleOAuthCredentialKeyPair,
43
+ ): Promise<GoogleOAuthCredentials | null> {
44
+ const [clientId, clientSecret] = await Promise.all([
45
+ readCredential(keys.clientIdKey),
46
+ readCredential(keys.clientSecretKey),
47
+ ]);
48
+ if (!clientId || !clientSecret) return null;
49
+ return { clientId, clientSecret };
50
+ }
51
+
52
+ /**
53
+ * Resolve Google provider credentials from an app-owned credential source.
54
+ *
55
+ * Templates pass their scoped secret reader so Core does not choose an app's
56
+ * secret store or request context. An optional fallback reader preserves
57
+ * deployments that still keep the same credential pair in environment vars.
58
+ * Each candidate pair is read atomically and de-duped by client id, which lets
59
+ * refresh paths retry tokens minted by a previous Google OAuth client without
60
+ * ever mixing an id and secret from different sources.
61
+ */
62
+ export async function resolveGoogleProviderCredentialCandidatesWithReader(options: {
63
+ readCredential: ReadGoogleOAuthCredential;
64
+ fallbackReadCredential?: ReadGoogleOAuthCredential;
65
+ credentialKeyPairs?: readonly GoogleOAuthCredentialKeyPair[];
66
+ }): Promise<GoogleOAuthCredentials[]> {
67
+ const pairs =
68
+ options.credentialKeyPairs ?? GOOGLE_PROVIDER_CREDENTIAL_KEY_PAIRS;
69
+ const candidates: GoogleOAuthCredentials[] = [];
70
+
71
+ for (const keys of pairs) {
72
+ const credentials =
73
+ (await readInjectedCredentialPair(options.readCredential, keys)) ??
74
+ (options.fallbackReadCredential
75
+ ? await readInjectedCredentialPair(options.fallbackReadCredential, keys)
76
+ : null);
77
+ if (
78
+ credentials &&
79
+ !candidates.some(
80
+ (candidate) => candidate.clientId === credentials.clientId,
81
+ )
82
+ ) {
83
+ candidates.push(credentials);
84
+ }
85
+ }
86
+
87
+ return candidates;
88
+ }
89
+
16
90
  /**
17
91
  * Credentials for identity-only Google sign-in. Deploys that also use Google
18
92
  * product APIs can set these separately from GOOGLE_CLIENT_ID/SECRET, which
@@ -32,13 +106,16 @@ export function hasGoogleSignInCredentials(): boolean {
32
106
  }
33
107
 
34
108
  export function resolveGoogleProviderCredentials(): GoogleOAuthCredentials | null {
35
- return readCredentialPair("GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET");
109
+ return readCredentialPair(
110
+ GOOGLE_PRIMARY_PROVIDER_CREDENTIAL_KEYS.clientIdKey,
111
+ GOOGLE_PRIMARY_PROVIDER_CREDENTIAL_KEYS.clientSecretKey,
112
+ );
36
113
  }
37
114
 
38
115
  export function resolveGoogleLegacyProviderCredentials(): GoogleOAuthCredentials | null {
39
116
  return readCredentialPair(
40
- "GOOGLE_LEGACY_CLIENT_ID",
41
- "GOOGLE_LEGACY_CLIENT_SECRET",
117
+ GOOGLE_LEGACY_PROVIDER_CREDENTIAL_KEYS.clientIdKey,
118
+ GOOGLE_LEGACY_PROVIDER_CREDENTIAL_KEYS.clientSecretKey,
42
119
  );
43
120
  }
44
121
 
@@ -303,11 +303,17 @@ export {
303
303
  export { isOAuthConnected, getOAuthAccounts } from "./oauth-helpers.js";
304
304
  export {
305
305
  hasGoogleSignInCredentials,
306
+ GOOGLE_LEGACY_PROVIDER_CREDENTIAL_KEYS,
307
+ GOOGLE_PRIMARY_PROVIDER_CREDENTIAL_KEYS,
308
+ GOOGLE_PROVIDER_CREDENTIAL_KEY_PAIRS,
306
309
  resolveGoogleLegacyProviderCredentials,
310
+ resolveGoogleProviderCredentialCandidatesWithReader,
307
311
  resolveGoogleProviderCredentialCandidates,
308
312
  resolveGoogleProviderCredentials,
309
313
  resolveGoogleSignInCredentials,
314
+ type GoogleOAuthCredentialKeyPair,
310
315
  type GoogleOAuthCredentials,
316
+ type ReadGoogleOAuthCredential,
311
317
  } from "./google-oauth-credentials.js";
312
318
  export { wrapWithAnalytics } from "./analytics.js";
313
319
  export {