@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
@@ -478,7 +478,7 @@ const retrievalEvalCases: RetrievalEvalCase[] = [
478
478
  "For a stale Fusion branch, should the agent checkout, reset, stash, or repair the branch automatically?",
479
479
  requiredTerms: [
480
480
  "fusion",
481
- ["do not", "don't", "never"],
481
+ ["do not", "don't", "never", "avoid"],
482
482
  "git checkout",
483
483
  "reset",
484
484
  ],
@@ -568,7 +568,6 @@ const retrievalEvalCases: RetrievalEvalCase[] = [
568
568
  label: "PII is redacted from retrieval output",
569
569
  question:
570
570
  "What does the #dev-fusion privacy redaction output say about durable escalation rotation?",
571
- expectedTitle: "#dev-fusion privacy redaction output",
572
571
  requiredTerms: [
573
572
  "durable escalation rotation",
574
573
  "[redacted]",
@@ -694,13 +693,27 @@ function evidence(
694
693
  const metadata = parseJson<Record<string, unknown>>(capture.metadataJson, {});
695
694
  return {
696
695
  captureId: capture.id,
697
- quote,
696
+ quote: exactPersistedEvidenceQuote(capture.content, quote),
698
697
  note,
699
698
  sourceUrl:
700
699
  typeof metadata.sourceUrl === "string" ? metadata.sourceUrl : undefined,
701
700
  };
702
701
  }
703
702
 
703
+ function exactPersistedEvidenceQuote(content: string, preferred: string) {
704
+ const exactPreferred = preferred.trim();
705
+ if (exactPreferred && content.includes(exactPreferred)) return exactPreferred;
706
+
707
+ const longestLine = content
708
+ .split(/\r?\n/)
709
+ .map((line) => line.trim())
710
+ .filter(Boolean)
711
+ .sort((a, b) => b.length - a.length)[0];
712
+ if (longestLine) return longestLine;
713
+
714
+ return content.slice(0, 280).trim();
715
+ }
716
+
704
717
  function serializeSeedCapture(
705
718
  row: typeof schema.brainRawCaptures.$inferSelect,
706
719
  ) {
@@ -1615,7 +1628,7 @@ export async function runBrainDemoEval(
1615
1628
  "pii-redaction",
1616
1629
  "PII is redacted before queryable storage",
1617
1630
  !!redacted &&
1618
- redacted.status === "redacted" &&
1631
+ ["published", "redacted"].includes(redacted.status) &&
1619
1632
  !redactedText.includes("ava.cho@example.com") &&
1620
1633
  !redactedText.includes("+1 415 555 1212"),
1621
1634
  redacted
@@ -0,0 +1,363 @@
1
+ import { getDbExec, isPostgres } from "@agent-native/core/db";
2
+ import {
3
+ availableEmbeddingFamilies,
4
+ defaultEmbeddingFamily,
5
+ } from "@agent-native/core/embeddings";
6
+ import {
7
+ queryPgVectorIndex,
8
+ queryPostgresFts,
9
+ } from "@agent-native/core/search";
10
+ import { normalizeSearchTerms } from "@agent-native/core/search-utils";
11
+ import { accessFilter } from "@agent-native/core/sharing";
12
+ import { and, desc, eq, inArray } from "drizzle-orm";
13
+
14
+ import type {
15
+ BrainCaptureKind,
16
+ BrainSourceProvider,
17
+ } from "../../shared/types.js";
18
+ import { getDb, schema } from "../db/index.js";
19
+ import { listAccessibleAudienceIds } from "./audiences.js";
20
+ import { BRAIN_SEARCH_INDEX_VERSION } from "./search-index-contracts.js";
21
+
22
+ export interface HybridCandidate {
23
+ id: string;
24
+ artifactId: string;
25
+ captureId: string;
26
+ sourceId: string;
27
+ audienceId: string;
28
+ title: string;
29
+ text: string;
30
+ capturedAt: string;
31
+ lexicalRank?: number;
32
+ semanticRank?: number;
33
+ authority?: number;
34
+ freshness?: number;
35
+ lane: "lexical" | "semantic" | "hybrid";
36
+ }
37
+
38
+ export interface HybridSearchResult extends HybridCandidate {
39
+ score: number;
40
+ reasons: string[];
41
+ }
42
+
43
+ export const RRF_K = 60;
44
+ const SEARCH_NAMESPACE = "brain";
45
+
46
+ export function reciprocalRankFusion(
47
+ candidates: HybridCandidate[],
48
+ k = RRF_K,
49
+ ): HybridSearchResult[] {
50
+ return candidates
51
+ .map((candidate) => {
52
+ const lexical = candidate.lexicalRank
53
+ ? 1 / (k + candidate.lexicalRank)
54
+ : 0;
55
+ const semantic = candidate.semanticRank
56
+ ? 1 / (k + candidate.semanticRank)
57
+ : 0;
58
+ const authority = candidate.authority ?? 0;
59
+ const freshness = candidate.freshness ?? 0;
60
+ const reasons = [
61
+ ...(candidate.lexicalRank ? ["lexical-match"] : []),
62
+ ...(candidate.semanticRank ? ["semantic-match"] : []),
63
+ ...(authority > 0 ? ["authority"] : []),
64
+ ...(freshness > 0 ? ["fresh"] : []),
65
+ ];
66
+ return {
67
+ ...candidate,
68
+ score: lexical + semantic + authority * 0.01 + freshness * 0.005,
69
+ reasons,
70
+ };
71
+ })
72
+ .sort(
73
+ (a, b) => b.score - a.score || b.capturedAt.localeCompare(a.capturedAt),
74
+ );
75
+ }
76
+
77
+ export function incrementalIdf(
78
+ term: string,
79
+ documents: readonly string[],
80
+ ): number {
81
+ const normalized = term.toLowerCase();
82
+ const count = documents.filter((document) =>
83
+ document.toLowerCase().includes(normalized),
84
+ ).length;
85
+ return Math.log((documents.length + 1) / (count + 1)) + 1;
86
+ }
87
+
88
+ export function lexicalScore(
89
+ text: string,
90
+ terms: string[],
91
+ corpus: readonly string[],
92
+ ): number {
93
+ const lower = text.toLowerCase();
94
+ return terms.reduce(
95
+ (score, term) =>
96
+ score + (lower.includes(term) ? incrementalIdf(term, corpus) : 0),
97
+ 0,
98
+ );
99
+ }
100
+
101
+ /** Audience membership is the first database predicate for every index lane. */
102
+ export async function hybridSearchArtifacts(input: {
103
+ query: string;
104
+ provider?: string;
105
+ kind?: string;
106
+ projectId?: string;
107
+ limit?: number;
108
+ rerank?: boolean;
109
+ }): Promise<HybridSearchResult[]> {
110
+ const terms = normalizeSearchTerms(input.query);
111
+ if (!terms.length) return [];
112
+ const db = getDb();
113
+ const projectSourceIds = input.projectId
114
+ ? (
115
+ await db
116
+ .select({ sourceId: schema.brainProjectSources.sourceId })
117
+ .from(schema.brainProjectSources)
118
+ .innerJoin(
119
+ schema.brainProjects,
120
+ eq(schema.brainProjects.id, schema.brainProjectSources.projectId),
121
+ )
122
+ .where(
123
+ and(
124
+ eq(schema.brainProjectSources.projectId, input.projectId),
125
+ accessFilter(schema.brainProjects, schema.brainProjectShares),
126
+ ),
127
+ )
128
+ ).map((row) => row.sourceId)
129
+ : undefined;
130
+ if (projectSourceIds && !projectSourceIds.length) return [];
131
+ const audienceIds = await listAccessibleAudienceIds(projectSourceIds);
132
+ if (!audienceIds.length) return [];
133
+ const baseFilter = and(
134
+ eq(schema.brainSearchArtifacts.status, "active"),
135
+ eq(schema.brainRawCaptures.sensitivityDisposition, "allowed"),
136
+ eq(
137
+ schema.brainSearchArtifacts.contentHash,
138
+ schema.brainRawCaptures.contentHash,
139
+ ),
140
+ eq(
141
+ schema.brainSearchArtifacts.aclHash,
142
+ schema.brainRawCaptures.audienceAclHash,
143
+ ),
144
+ eq(
145
+ schema.brainSearchArtifacts.sensitivityPolicyVersion,
146
+ schema.brainRawCaptures.sensitivityPolicyVersion,
147
+ ),
148
+ eq(schema.brainSearchArtifacts.indexVersion, BRAIN_SEARCH_INDEX_VERSION),
149
+ inArray(schema.brainSearchArtifacts.audienceId, audienceIds),
150
+ accessFilter(schema.brainSources, schema.brainSourceShares),
151
+ projectSourceIds
152
+ ? inArray(schema.brainSearchArtifacts.sourceId, projectSourceIds)
153
+ : undefined,
154
+ input.provider
155
+ ? eq(schema.brainSources.provider, input.provider as BrainSourceProvider)
156
+ : undefined,
157
+ input.kind
158
+ ? eq(schema.brainRawCaptures.kind, input.kind as BrainCaptureKind)
159
+ : undefined,
160
+ );
161
+ const selectArtifacts = (artifactIds?: string[]) =>
162
+ db
163
+ .select({
164
+ id: schema.brainSearchArtifacts.id,
165
+ captureId: schema.brainSearchArtifacts.captureId,
166
+ sourceId: schema.brainSearchArtifacts.sourceId,
167
+ audienceId: schema.brainSearchArtifacts.audienceId,
168
+ title: schema.brainSearchArtifacts.title,
169
+ question: schema.brainSearchArtifacts.question,
170
+ summary: schema.brainSearchArtifacts.summary,
171
+ resolution: schema.brainSearchArtifacts.resolution,
172
+ capturedAt: schema.brainSearchArtifacts.capturedAt,
173
+ })
174
+ .from(schema.brainSearchArtifacts)
175
+ .innerJoin(
176
+ schema.brainSources,
177
+ eq(schema.brainSources.id, schema.brainSearchArtifacts.sourceId),
178
+ )
179
+ .innerJoin(
180
+ schema.brainRawCaptures,
181
+ eq(schema.brainRawCaptures.id, schema.brainSearchArtifacts.captureId),
182
+ )
183
+ .where(
184
+ and(
185
+ baseFilter,
186
+ artifactIds?.length
187
+ ? inArray(schema.brainSearchArtifacts.id, artifactIds)
188
+ : undefined,
189
+ ),
190
+ );
191
+ const recentRows = await selectArtifacts()
192
+ .orderBy(desc(schema.brainSearchArtifacts.capturedAt))
193
+ .limit(Math.max((input.limit ?? 25) * 5, 50));
194
+ let ftsRanks = new Map<string, number>();
195
+ let semanticRanks = new Map<string, number>();
196
+ if (isPostgres()) {
197
+ try {
198
+ const fts = await queryPostgresFts(getDbExec(), {
199
+ query: input.query,
200
+ allowedAudienceIds: audienceIds,
201
+ limit: Math.max((input.limit ?? 25) * 3, 30),
202
+ namespace: SEARCH_NAMESPACE,
203
+ });
204
+ ftsRanks = new Map(fts.map((hit, index) => [hit.chunkId, index + 1]));
205
+ const family = defaultEmbeddingFamily(await availableEmbeddingFamilies());
206
+ if (family) {
207
+ const [queryVector] = await family.embed(
208
+ [{ text: input.query }],
209
+ "query",
210
+ );
211
+ if (queryVector) {
212
+ const vectorHits = await queryPgVectorIndex(
213
+ getDbExec(),
214
+ {
215
+ embeddingSetId: family.id,
216
+ dimensions: family.dimensions,
217
+ vector: queryVector,
218
+ allowedAudienceIds: audienceIds,
219
+ limit: Math.max((input.limit ?? 25) * 3, 30),
220
+ namespace: SEARCH_NAMESPACE,
221
+ },
222
+ true,
223
+ );
224
+ const vectorKeys = vectorHits.map((hit) => hit.vectorKey);
225
+ const embeddingRows = vectorKeys.length
226
+ ? await db
227
+ .select({
228
+ vectorKey: schema.brainSearchEmbeddings.vectorKey,
229
+ targetType: schema.brainSearchEmbeddings.targetType,
230
+ targetId: schema.brainSearchEmbeddings.targetId,
231
+ })
232
+ .from(schema.brainSearchEmbeddings)
233
+ .where(
234
+ and(
235
+ eq(schema.brainSearchEmbeddings.status, "active"),
236
+ inArray(
237
+ schema.brainSearchEmbeddings.audienceId,
238
+ audienceIds,
239
+ ),
240
+ inArray(schema.brainSearchEmbeddings.vectorKey, vectorKeys),
241
+ ),
242
+ )
243
+ : [];
244
+ const burstIds = embeddingRows
245
+ .filter((row) => row.targetType === "burst")
246
+ .map((row) => row.targetId);
247
+ const burstArtifacts = burstIds.length
248
+ ? await db
249
+ .select({
250
+ id: schema.brainSearchBursts.id,
251
+ artifactId: schema.brainSearchBursts.artifactId,
252
+ })
253
+ .from(schema.brainSearchBursts)
254
+ .where(inArray(schema.brainSearchBursts.id, burstIds))
255
+ : [];
256
+ const burstToArtifact = new Map(
257
+ burstArtifacts.map((row) => [row.id, row.artifactId]),
258
+ );
259
+ const keyToArtifact = new Map(
260
+ embeddingRows.map((row) => [
261
+ row.vectorKey,
262
+ row.targetType === "artifact"
263
+ ? row.targetId
264
+ : burstToArtifact.get(row.targetId),
265
+ ]),
266
+ );
267
+ semanticRanks = new Map();
268
+ vectorHits.forEach((hit, index) => {
269
+ const artifactId = keyToArtifact.get(hit.vectorKey);
270
+ if (artifactId && !semanticRanks.has(artifactId))
271
+ semanticRanks.set(artifactId, index + 1);
272
+ });
273
+ }
274
+ }
275
+ } catch {
276
+ ftsRanks = new Map();
277
+ semanticRanks = new Map();
278
+ }
279
+ }
280
+ const externalIds = Array.from(
281
+ new Set([...ftsRanks.keys(), ...semanticRanks.keys()]),
282
+ );
283
+ const externalRows = externalIds.length
284
+ ? await selectArtifacts(externalIds)
285
+ : [];
286
+ const rowMap = new Map(
287
+ [...recentRows, ...externalRows].map((row) => [row.id, row]),
288
+ );
289
+ const rows = [...rowMap.values()];
290
+ const corpus = rows.map(
291
+ (row) => `${row.title} ${row.question} ${row.summary} ${row.resolution}`,
292
+ );
293
+ const lexicalCandidates = rows
294
+ .map((row) => ({
295
+ id: row.id,
296
+ artifactId: row.id,
297
+ captureId: row.captureId,
298
+ sourceId: row.sourceId,
299
+ audienceId: row.audienceId,
300
+ title: row.title,
301
+ text: `${row.question} ${row.summary} ${row.resolution}`,
302
+ capturedAt: row.capturedAt,
303
+ lexicalRank: undefined,
304
+ authority: 1,
305
+ freshness: Math.max(
306
+ 0,
307
+ 1 -
308
+ (Date.now() - Date.parse(row.capturedAt)) /
309
+ (1000 * 60 * 60 * 24 * 365),
310
+ ),
311
+ lane: "lexical" as const,
312
+ }))
313
+ .map((candidate) => ({
314
+ candidate,
315
+ lexical: lexicalScore(
316
+ `${candidate.title} ${candidate.text}`,
317
+ terms,
318
+ corpus,
319
+ ),
320
+ }))
321
+ .filter(({ lexical }) => lexical > 0)
322
+ .sort((a, b) => b.lexical - a.lexical)
323
+ .map(({ candidate }, index) => ({ ...candidate, lexicalRank: index + 1 }));
324
+ const lexicalRanks = new Map(
325
+ lexicalCandidates.map((candidate) => [candidate.id, candidate.lexicalRank]),
326
+ );
327
+ const candidates = rows
328
+ .filter(
329
+ (row) =>
330
+ lexicalRanks.has(row.id) ||
331
+ ftsRanks.has(row.id) ||
332
+ semanticRanks.has(row.id),
333
+ )
334
+ .map((row) => {
335
+ const lexicalRank = ftsRanks.get(row.id) ?? lexicalRanks.get(row.id);
336
+ const semanticRank = semanticRanks.get(row.id);
337
+ return {
338
+ id: row.id,
339
+ artifactId: row.id,
340
+ captureId: row.captureId,
341
+ sourceId: row.sourceId,
342
+ audienceId: row.audienceId,
343
+ title: row.title,
344
+ text: `${row.question} ${row.summary} ${row.resolution}`,
345
+ capturedAt: row.capturedAt,
346
+ lexicalRank,
347
+ semanticRank,
348
+ authority: 1,
349
+ freshness: Math.max(
350
+ 0,
351
+ 1 -
352
+ (Date.now() - Date.parse(row.capturedAt)) /
353
+ (1000 * 60 * 60 * 24 * 365),
354
+ ),
355
+ lane: semanticRank
356
+ ? lexicalRank
357
+ ? ("hybrid" as const)
358
+ : ("semantic" as const)
359
+ : ("lexical" as const),
360
+ };
361
+ });
362
+ return reciprocalRankFusion(candidates).slice(0, input.limit ?? 25);
363
+ }
@@ -0,0 +1,104 @@
1
+ import { and, eq, isNull, lt, ne, or } from "drizzle-orm";
2
+
3
+ import { getDb, schema } from "../db/index.js";
4
+ import { nanoid, nowIso, stableJson } from "./brain.js";
5
+ import type {
6
+ BrainCaptureInvalidation,
7
+ BrainIngestOperation,
8
+ } from "./search-index-contracts.js";
9
+
10
+ export async function enqueueBrainOperation(input: {
11
+ operation: BrainIngestOperation;
12
+ dedupeKey: string;
13
+ sourceId?: string | null;
14
+ captureId?: string | null;
15
+ priority?: number;
16
+ runAfter?: string | null;
17
+ payload?: Record<string, unknown>;
18
+ }) {
19
+ const db = getDb();
20
+ const now = nowIso();
21
+ const id = nanoid();
22
+ await db
23
+ .insert(schema.brainIngestQueue)
24
+ .values({
25
+ id,
26
+ sourceId: input.sourceId ?? null,
27
+ captureId: input.captureId ?? null,
28
+ operation: input.operation,
29
+ status: "queued",
30
+ priority: input.priority ?? 50,
31
+ attempts: 0,
32
+ payloadJson: stableJson(input.payload ?? {}),
33
+ dedupeKey: input.dedupeKey,
34
+ leaseToken: null,
35
+ leaseExpiresAt: null,
36
+ error: null,
37
+ runAfter: input.runAfter ?? null,
38
+ createdAt: now,
39
+ updatedAt: now,
40
+ })
41
+ .onConflictDoUpdate({
42
+ target: schema.brainIngestQueue.dedupeKey,
43
+ set: {
44
+ sourceId: input.sourceId ?? null,
45
+ captureId: input.captureId ?? null,
46
+ operation: input.operation,
47
+ status: "queued",
48
+ priority: input.priority ?? 50,
49
+ payloadJson: stableJson(input.payload ?? {}),
50
+ leaseToken: null,
51
+ leaseExpiresAt: null,
52
+ error: null,
53
+ runAfter: input.runAfter ?? null,
54
+ updatedAt: now,
55
+ },
56
+ setWhere: or(
57
+ ne(schema.brainIngestQueue.status, "processing"),
58
+ isNull(schema.brainIngestQueue.leaseExpiresAt),
59
+ lt(schema.brainIngestQueue.leaseExpiresAt, now),
60
+ ),
61
+ });
62
+ const [row] = await db
63
+ .select()
64
+ .from(schema.brainIngestQueue)
65
+ .where(eq(schema.brainIngestQueue.dedupeKey, input.dedupeKey))
66
+ .limit(1);
67
+ return row;
68
+ }
69
+
70
+ export async function enqueueCaptureInvalidation(
71
+ invalidation: BrainCaptureInvalidation,
72
+ ) {
73
+ const version =
74
+ invalidation.next?.contentHash ??
75
+ invalidation.previous?.contentHash ??
76
+ "deleted";
77
+ const operation = invalidation.next ? "search-index" : "search-unindex";
78
+ return enqueueBrainOperation({
79
+ operation,
80
+ dedupeKey: `${operation}:${invalidation.captureId}:${version}`,
81
+ sourceId: invalidation.sourceId,
82
+ captureId: invalidation.captureId,
83
+ priority: operation === "search-unindex" ? 10 : 40,
84
+ payload: { invalidation },
85
+ });
86
+ }
87
+
88
+ export async function markBrainOperationDone(id: string, leaseToken: string) {
89
+ return getDb()
90
+ .update(schema.brainIngestQueue)
91
+ .set({
92
+ status: "done",
93
+ leaseToken: null,
94
+ leaseExpiresAt: null,
95
+ updatedAt: nowIso(),
96
+ })
97
+ .where(
98
+ and(
99
+ eq(schema.brainIngestQueue.id, id),
100
+ eq(schema.brainIngestQueue.status, "processing"),
101
+ eq(schema.brainIngestQueue.leaseToken, leaseToken),
102
+ ),
103
+ );
104
+ }
@@ -0,0 +1,24 @@
1
+ import type { BrainSettings } from "../../shared/types.js";
2
+
3
+ export interface BrainPrivacyReadiness {
4
+ configured: boolean;
5
+ model: string | null;
6
+ engine: string | null;
7
+ warning: string | null;
8
+ }
9
+
10
+ export function brainPrivacyReadiness(
11
+ settings: BrainSettings,
12
+ ): BrainPrivacyReadiness {
13
+ const model = settings.privacyClassifierModel?.trim() || null;
14
+ const engine = settings.privacyClassifierEngine?.trim() || null;
15
+ const configured = Boolean(model && engine);
16
+ return {
17
+ configured,
18
+ model: configured ? model : null,
19
+ engine: configured ? engine : null,
20
+ warning: configured
21
+ ? null
22
+ : "No approved privacy classifier is configured. Deterministic-clean captures may be stored; uncertain captures are quarantined and deterministic hard-category captures are suppressed. Neither can be searched, cited, distilled, or exposed to agents.",
23
+ };
24
+ }
@@ -0,0 +1,72 @@
1
+ export const BRAIN_SEARCH_INDEX_VERSION = "1";
2
+ export const BRAIN_SENSITIVITY_POLICY_VERSION = "1";
3
+
4
+ export type BrainSensitivityCategory =
5
+ | "performance"
6
+ | "discipline"
7
+ | "termination"
8
+ | "layoff-reorg"
9
+ | "compensation"
10
+ | "recruiting"
11
+ | "health-accommodation"
12
+ | "investigation"
13
+ | "privileged-legal"
14
+ | "secret-credential"
15
+ | "personal";
16
+
17
+ export type BrainSensitivityDisposition =
18
+ | "allowed"
19
+ | "suppressed"
20
+ | "quarantined";
21
+
22
+ export interface BrainSafeSegment {
23
+ id: string;
24
+ authorKey?: string;
25
+ capturedAt: string;
26
+ sourceUrl?: string;
27
+ text: string;
28
+ reactionCount: number;
29
+ }
30
+
31
+ export interface BrainSensitivityDecision {
32
+ disposition: BrainSensitivityDisposition;
33
+ categories: BrainSensitivityCategory[];
34
+ confidenceBand: "deterministic" | "high" | "medium" | "uncertain";
35
+ policyVersion: string;
36
+ safeSegments: BrainSafeSegment[];
37
+ safeContent: string;
38
+ classifier: "deterministic" | "approved-model";
39
+ }
40
+
41
+ export interface BrainAudienceAssignment {
42
+ audienceId: string;
43
+ aclHash: string;
44
+ kind: "org" | "slack-private-channel" | "meeting" | "restricted";
45
+ }
46
+
47
+ export interface BrainSearchStalenessKey {
48
+ contentHash: string;
49
+ indexVersion: string;
50
+ sensitivityPolicyVersion: string;
51
+ aclHash: string;
52
+ }
53
+
54
+ export type BrainIngestOperation =
55
+ | "distill"
56
+ | "sync"
57
+ | "search-index"
58
+ | "search-unindex"
59
+ | "slack-thread-refresh";
60
+
61
+ export interface BrainCaptureInvalidation {
62
+ captureId: string;
63
+ sourceId: string;
64
+ reason:
65
+ | "content-changed"
66
+ | "sensitivity-changed"
67
+ | "access-changed"
68
+ | "source-deleted"
69
+ | "upstream-deleted";
70
+ previous?: Partial<BrainSearchStalenessKey>;
71
+ next?: Partial<BrainSearchStalenessKey>;
72
+ }