@vellumai/assistant 0.5.5 → 0.5.7

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 (382) hide show
  1. package/.env.example +16 -2
  2. package/ARCHITECTURE.md +6 -75
  3. package/Dockerfile +4 -5
  4. package/README.md +0 -2
  5. package/bun.lock +0 -414
  6. package/docs/architecture/keychain-broker.md +45 -240
  7. package/docs/architecture/security.md +0 -17
  8. package/docs/credential-execution-service.md +2 -2
  9. package/node_modules/@vellumai/ces-contracts/package.json +1 -0
  10. package/node_modules/@vellumai/ces-contracts/src/rpc.ts +119 -0
  11. package/node_modules/@vellumai/credential-storage/package.json +1 -0
  12. package/node_modules/@vellumai/egress-proxy/package.json +1 -0
  13. package/package.json +2 -3
  14. package/src/__tests__/actor-token-service.test.ts +1 -2
  15. package/src/__tests__/assistant-feature-flags-integration.test.ts +30 -29
  16. package/src/__tests__/browser-skill-endstate.test.ts +6 -5
  17. package/src/__tests__/btw-routes.test.ts +0 -39
  18. package/src/__tests__/call-domain.test.ts +0 -128
  19. package/src/__tests__/ces-rpc-credential-backend.test.ts +199 -0
  20. package/src/__tests__/channel-approval-routes.test.ts +0 -5
  21. package/src/__tests__/channel-readiness-service.test.ts +1 -60
  22. package/src/__tests__/checker.test.ts +4 -2
  23. package/src/__tests__/cli-command-risk-guard.test.ts +112 -0
  24. package/src/__tests__/config-schema-cmd.test.ts +0 -1
  25. package/src/__tests__/config-schema.test.ts +3 -3
  26. package/src/__tests__/context-window-manager.test.ts +78 -0
  27. package/src/__tests__/conversation-attention-telegram.test.ts +0 -5
  28. package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
  29. package/src/__tests__/conversation-skill-tools.test.ts +0 -54
  30. package/src/__tests__/conversation-title-service.test.ts +117 -1
  31. package/src/__tests__/credential-execution-feature-gates.test.ts +28 -14
  32. package/src/__tests__/credential-execution-managed-contract.test.ts +33 -18
  33. package/src/__tests__/credential-security-e2e.test.ts +0 -66
  34. package/src/__tests__/credential-security-invariants.test.ts +4 -45
  35. package/src/__tests__/credentials-cli.test.ts +78 -0
  36. package/src/__tests__/db-migration-rollback.test.ts +2015 -1
  37. package/src/__tests__/docker-signing-key-bootstrap.test.ts +98 -0
  38. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +6 -4
  39. package/src/__tests__/guardian-routing-state.test.ts +0 -5
  40. package/src/__tests__/host-shell-tool.test.ts +6 -7
  41. package/src/__tests__/http-user-message-parity.test.ts +3 -103
  42. package/src/__tests__/inbound-invite-redemption.test.ts +0 -4
  43. package/src/__tests__/inline-skill-load-permissions.test.ts +6 -8
  44. package/src/__tests__/intent-routing.test.ts +0 -13
  45. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +178 -0
  46. package/src/__tests__/keychain-broker-client.test.ts +161 -22
  47. package/src/__tests__/memory-jobs-worker-backoff.test.ts +150 -0
  48. package/src/__tests__/memory-regressions.test.ts +8 -30
  49. package/src/__tests__/migration-export-http.test.ts +2 -2
  50. package/src/__tests__/migration-import-commit-http.test.ts +2 -2
  51. package/src/__tests__/migration-import-preflight-http.test.ts +2 -2
  52. package/src/__tests__/migration-validate-http.test.ts +2 -2
  53. package/src/__tests__/non-member-access-request.test.ts +0 -5
  54. package/src/__tests__/notification-decision-fallback.test.ts +4 -0
  55. package/src/__tests__/notification-decision-identity.test.ts +4 -0
  56. package/src/__tests__/permission-types.test.ts +1 -0
  57. package/src/__tests__/provider-managed-proxy-integration.test.ts +5 -6
  58. package/src/__tests__/qdrant-manager.test.ts +28 -2
  59. package/src/__tests__/registry.test.ts +0 -6
  60. package/src/__tests__/require-fresh-approval.test.ts +4 -0
  61. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -4
  62. package/src/__tests__/secret-routes-managed-proxy.test.ts +0 -4
  63. package/src/__tests__/secure-keys.test.ts +83 -263
  64. package/src/__tests__/shell-identity.test.ts +96 -6
  65. package/src/__tests__/skill-feature-flags-integration.test.ts +22 -14
  66. package/src/__tests__/skill-feature-flags.test.ts +46 -45
  67. package/src/__tests__/skill-load-feature-flag.test.ts +7 -10
  68. package/src/__tests__/skill-load-inline-command.test.ts +8 -12
  69. package/src/__tests__/skill-load-inline-includes.test.ts +6 -10
  70. package/src/__tests__/skill-load-tool.test.ts +0 -2
  71. package/src/__tests__/skill-projection-feature-flag.test.ts +33 -29
  72. package/src/__tests__/skills.test.ts +0 -2
  73. package/src/__tests__/slack-inbound-verification.test.ts +0 -4
  74. package/src/__tests__/suggestion-routes.test.ts +1 -32
  75. package/src/__tests__/system-prompt.test.ts +0 -1
  76. package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -0
  77. package/src/__tests__/tool-executor-shell-integration.test.ts +5 -3
  78. package/src/__tests__/tool-executor.test.ts +4 -0
  79. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -5
  80. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -4
  81. package/src/__tests__/update-bulletin.test.ts +0 -2
  82. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +6 -9
  83. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -6
  84. package/src/__tests__/workspace-migration-015-migrate-credentials-to-keychain.test.ts +252 -0
  85. package/src/__tests__/workspace-migration-016-migrate-credentials-from-keychain.test.ts +218 -0
  86. package/src/__tests__/workspace-migration-down-functions.test.ts +1009 -0
  87. package/src/__tests__/workspace-migrations-runner.test.ts +114 -0
  88. package/src/calls/audio-store.test.ts +97 -0
  89. package/src/calls/audio-store.ts +205 -0
  90. package/src/calls/call-controller.ts +85 -7
  91. package/src/calls/call-domain.ts +3 -0
  92. package/src/calls/call-store.ts +10 -3
  93. package/src/calls/fish-audio-client.ts +117 -0
  94. package/src/calls/relay-server.ts +27 -0
  95. package/src/calls/twilio-routes.ts +2 -1
  96. package/src/calls/types.ts +1 -0
  97. package/src/calls/voice-ingress-preflight.ts +0 -42
  98. package/src/calls/voice-quality.ts +26 -5
  99. package/src/calls/voice-session-bridge.ts +6 -12
  100. package/src/cli/commands/config.ts +1 -4
  101. package/src/cli/commands/conversations.ts +0 -18
  102. package/src/cli/commands/credentials.ts +34 -4
  103. package/src/cli/commands/oauth/index.ts +7 -0
  104. package/src/cli/commands/oauth/platform.ts +179 -0
  105. package/src/cli/commands/platform.ts +3 -3
  106. package/src/config/assistant-feature-flags.ts +186 -5
  107. package/src/config/bundled-skills/messaging/SKILL.md +5 -5
  108. package/src/config/bundled-skills/phone-calls/TOOLS.json +4 -0
  109. package/src/config/bundled-skills/settings/TOOLS.json +2 -2
  110. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +42 -0
  111. package/src/config/bundled-tool-registry.ts +1 -11
  112. package/src/config/env-registry.ts +1 -1
  113. package/src/config/env.ts +16 -16
  114. package/src/config/feature-flag-registry.json +48 -16
  115. package/src/config/loader.ts +98 -31
  116. package/src/config/schema.ts +4 -25
  117. package/src/config/schemas/calls.ts +13 -0
  118. package/src/config/schemas/fish-audio.ts +39 -0
  119. package/src/config/schemas/memory.ts +0 -4
  120. package/src/config/schemas/platform.ts +1 -1
  121. package/src/config/schemas/security.ts +4 -4
  122. package/src/config/types.ts +0 -1
  123. package/src/contacts/contact-store.ts +39 -0
  124. package/src/contacts/types.ts +2 -0
  125. package/src/context/window-manager.ts +53 -2
  126. package/src/credential-execution/approval-bridge.ts +1 -0
  127. package/src/credential-execution/executable-discovery.ts +28 -4
  128. package/src/credential-execution/feature-gates.ts +16 -0
  129. package/src/credential-execution/process-manager.ts +38 -0
  130. package/src/daemon/assistant-attachments.ts +9 -0
  131. package/src/daemon/config-watcher.ts +6 -4
  132. package/src/daemon/conversation-agent-loop.ts +0 -60
  133. package/src/daemon/conversation-memory.ts +0 -117
  134. package/src/daemon/conversation-runtime-assembly.ts +0 -2
  135. package/src/daemon/conversation-tool-setup.ts +0 -105
  136. package/src/daemon/conversation.ts +10 -1
  137. package/src/daemon/handlers/config-vercel.ts +92 -0
  138. package/src/daemon/handlers/conversations.ts +0 -11
  139. package/src/daemon/handlers/skills.ts +2 -15
  140. package/src/daemon/install-symlink.ts +195 -0
  141. package/src/daemon/lifecycle.ts +229 -96
  142. package/src/daemon/message-types/conversations.ts +3 -4
  143. package/src/daemon/message-types/diagnostics.ts +3 -22
  144. package/src/daemon/message-types/messages.ts +0 -2
  145. package/src/daemon/message-types/upgrades.ts +8 -0
  146. package/src/daemon/server.ts +30 -92
  147. package/src/events/domain-events.ts +2 -1
  148. package/src/followups/followup-store.ts +5 -2
  149. package/src/inbound/platform-callback-registration.ts +3 -3
  150. package/src/instrument.ts +8 -5
  151. package/src/memory/conversation-crud.ts +0 -236
  152. package/src/memory/conversation-title-service.ts +76 -11
  153. package/src/memory/db-init.ts +15 -11
  154. package/src/memory/indexer.ts +15 -106
  155. package/src/memory/items-extractor.ts +15 -1
  156. package/src/memory/job-handlers/conversation-starters.ts +4 -1
  157. package/src/memory/job-handlers/embedding.ts +0 -79
  158. package/src/memory/job-utils.ts +1 -1
  159. package/src/memory/jobs-store.ts +30 -13
  160. package/src/memory/jobs-worker.ts +31 -27
  161. package/src/memory/migrations/001-job-deferrals.ts +19 -0
  162. package/src/memory/migrations/004-entity-relation-dedup.ts +10 -0
  163. package/src/memory/migrations/005-fingerprint-scope-unique.ts +76 -0
  164. package/src/memory/migrations/006-scope-salted-fingerprints.ts +50 -0
  165. package/src/memory/migrations/007-assistant-id-to-self.ts +10 -0
  166. package/src/memory/migrations/008-remove-assistant-id-columns.ts +34 -0
  167. package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +26 -0
  168. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +10 -0
  169. package/src/memory/migrations/015-drop-active-search-index.ts +17 -0
  170. package/src/memory/migrations/019-notification-tables-schema-migration.ts +12 -0
  171. package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +121 -0
  172. package/src/memory/migrations/024-embedding-vector-blob.ts +74 -0
  173. package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +82 -0
  174. package/src/memory/migrations/036-normalize-phone-identities.ts +11 -0
  175. package/src/memory/migrations/116-messages-fts.ts +106 -1
  176. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +52 -0
  177. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +77 -0
  178. package/src/memory/migrations/134-contacts-notes-column.ts +13 -0
  179. package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +20 -0
  180. package/src/memory/migrations/136-drop-assistant-id-columns.ts +52 -0
  181. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +13 -0
  182. package/src/memory/migrations/141-rename-verification-table.ts +54 -0
  183. package/src/memory/migrations/142-rename-verification-session-id-column.ts +25 -0
  184. package/src/memory/migrations/143-rename-guardian-verification-values.ts +35 -0
  185. package/src/memory/migrations/144-rename-voice-to-phone.ts +136 -0
  186. package/src/memory/migrations/145-drop-accounts-table.ts +32 -0
  187. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +14 -1
  188. package/src/memory/migrations/148-drop-reminders-table.ts +35 -1
  189. package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +69 -1
  190. package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +290 -0
  191. package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +51 -1
  192. package/src/memory/migrations/174-rename-thread-starters-table.ts +47 -1
  193. package/src/memory/migrations/176-drop-capability-card-state.ts +13 -0
  194. package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +16 -0
  195. package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +28 -1
  196. package/src/memory/migrations/189-drop-simplified-memory.ts +42 -0
  197. package/src/memory/migrations/190-call-session-skip-disclosure.ts +15 -0
  198. package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +64 -0
  199. package/src/memory/migrations/192-contacts-user-file-column.ts +15 -0
  200. package/src/memory/migrations/index.ts +5 -3
  201. package/src/memory/migrations/registry.ts +90 -0
  202. package/src/memory/migrations/validate-migration-state.ts +137 -11
  203. package/src/memory/qdrant-circuit-breaker.ts +9 -0
  204. package/src/memory/qdrant-client.ts +4 -6
  205. package/src/memory/qdrant-manager.ts +64 -7
  206. package/src/memory/schema/calls.ts +1 -0
  207. package/src/memory/schema/contacts.ts +1 -0
  208. package/src/memory/schema/conversations.ts +0 -3
  209. package/src/memory/schema/index.ts +0 -2
  210. package/src/messaging/draft-store.ts +2 -2
  211. package/src/notifications/decision-engine.ts +4 -1
  212. package/src/oauth/connection-resolver.ts +6 -4
  213. package/src/permissions/checker.ts +0 -38
  214. package/src/permissions/defaults.ts +3 -3
  215. package/src/permissions/shell-identity.ts +76 -22
  216. package/src/permissions/trust-client.ts +2 -13
  217. package/src/permissions/trust-store.ts +8 -3
  218. package/src/permissions/types.ts +4 -2
  219. package/src/platform/client.ts +35 -7
  220. package/src/prompts/persona-resolver.ts +138 -0
  221. package/src/prompts/system-prompt.ts +36 -4
  222. package/src/prompts/templates/users/default.md +1 -0
  223. package/src/providers/registry.ts +27 -40
  224. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  225. package/src/runtime/auth/__tests__/external-assistant-id.test.ts +13 -68
  226. package/src/runtime/auth/external-assistant-id.ts +13 -59
  227. package/src/runtime/auth/route-policy.ts +29 -1
  228. package/src/runtime/auth/token-service.ts +53 -15
  229. package/src/runtime/channel-readiness-service.ts +1 -16
  230. package/src/runtime/http-server.ts +29 -2
  231. package/src/runtime/middleware/error-handler.ts +1 -9
  232. package/src/runtime/routes/audio-routes.ts +40 -0
  233. package/src/runtime/routes/btw-routes.ts +0 -17
  234. package/src/runtime/routes/conversation-management-routes.ts +0 -36
  235. package/src/runtime/routes/conversation-query-routes.ts +106 -2
  236. package/src/runtime/routes/conversation-routes.ts +4 -43
  237. package/src/runtime/routes/diagnostics-routes.ts +1 -477
  238. package/src/runtime/routes/identity-routes.ts +18 -29
  239. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -33
  240. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +1 -1
  241. package/src/runtime/routes/integrations/vercel.ts +89 -0
  242. package/src/runtime/routes/log-export-routes.ts +5 -0
  243. package/src/runtime/routes/memory-item-routes.test.ts +221 -3
  244. package/src/runtime/routes/memory-item-routes.ts +144 -4
  245. package/src/runtime/routes/migration-rollback-routes.ts +209 -0
  246. package/src/runtime/routes/migration-routes.ts +17 -1
  247. package/src/runtime/routes/notification-routes.ts +58 -0
  248. package/src/runtime/routes/schedule-routes.ts +65 -0
  249. package/src/runtime/routes/settings-routes.ts +41 -1
  250. package/src/runtime/routes/tts-routes.ts +86 -0
  251. package/src/runtime/routes/upgrade-broadcast-routes.ts +175 -0
  252. package/src/runtime/routes/workspace-commit-routes.ts +62 -0
  253. package/src/runtime/routes/workspace-routes.test.ts +22 -1
  254. package/src/runtime/routes/workspace-routes.ts +1 -1
  255. package/src/runtime/routes/workspace-utils.ts +86 -2
  256. package/src/schedule/schedule-store.ts +0 -21
  257. package/src/security/ces-credential-client.ts +59 -22
  258. package/src/security/ces-rpc-credential-backend.ts +85 -0
  259. package/src/security/credential-backend.ts +12 -88
  260. package/src/security/keychain-broker-client.ts +10 -2
  261. package/src/security/secure-keys.ts +94 -113
  262. package/src/skills/catalog-install.ts +13 -7
  263. package/src/skills/inline-command-render.ts +5 -1
  264. package/src/skills/inline-command-runner.ts +30 -2
  265. package/src/telemetry/usage-telemetry-reporter.ts +4 -2
  266. package/src/tools/calls/call-start.ts +1 -0
  267. package/src/tools/executor.ts +0 -4
  268. package/src/tools/memory/handlers.ts +1 -129
  269. package/src/tools/network/script-proxy/session-manager.ts +19 -4
  270. package/src/tools/network/web-fetch.ts +3 -1
  271. package/src/tools/permission-checker.ts +18 -0
  272. package/src/tools/skills/execute.ts +1 -1
  273. package/src/tools/skills/load.ts +9 -2
  274. package/src/tools/types.ts +0 -8
  275. package/src/util/errors.ts +0 -12
  276. package/src/util/platform.ts +8 -55
  277. package/src/util/xml.ts +8 -0
  278. package/src/workspace/git-service.ts +5 -2
  279. package/src/workspace/heartbeat-service.ts +5 -24
  280. package/src/workspace/migrations/001-avatar-rename.ts +15 -0
  281. package/src/workspace/migrations/003-seed-device-id.ts +17 -1
  282. package/src/workspace/migrations/004-extract-collect-usage-data.ts +33 -0
  283. package/src/workspace/migrations/005-add-send-diagnostics.ts +3 -0
  284. package/src/workspace/migrations/006-services-config.ts +49 -0
  285. package/src/workspace/migrations/007-web-search-provider-rename.ts +27 -0
  286. package/src/workspace/migrations/008-voice-timeout-and-max-steps.ts +3 -0
  287. package/src/workspace/migrations/009-backfill-conversation-disk-view.ts +4 -0
  288. package/src/workspace/migrations/010-app-dir-rename.ts +78 -0
  289. package/src/workspace/migrations/011-backfill-installation-id.ts +11 -0
  290. package/src/workspace/migrations/012-rename-conversation-disk-view-dirs.ts +44 -0
  291. package/src/workspace/migrations/013-repair-conversation-disk-view.ts +5 -0
  292. package/src/workspace/migrations/015-migrate-credentials-to-keychain.ts +153 -0
  293. package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +156 -0
  294. package/src/workspace/migrations/016-migrate-credentials-from-keychain.ts +150 -0
  295. package/src/workspace/migrations/017-seed-persona-dirs.ts +95 -0
  296. package/src/workspace/migrations/migrate-to-workspace-volume.ts +23 -1
  297. package/src/workspace/migrations/registry.ts +8 -0
  298. package/src/workspace/migrations/runner.ts +106 -2
  299. package/src/workspace/migrations/types.ts +4 -0
  300. package/src/__tests__/archive-recall.test.ts +0 -560
  301. package/src/__tests__/claude-code-skill-regression.test.ts +0 -206
  302. package/src/__tests__/claude-code-tool-profiles.test.ts +0 -99
  303. package/src/__tests__/conversation-memory-dirty-tail.test.ts +0 -150
  304. package/src/__tests__/conversation-switch-memory-reduction.test.ts +0 -474
  305. package/src/__tests__/db-memory-archive-migration.test.ts +0 -372
  306. package/src/__tests__/db-memory-brief-state-migration.test.ts +0 -213
  307. package/src/__tests__/db-memory-reducer-checkpoints.test.ts +0 -273
  308. package/src/__tests__/diagnostics-export.test.ts +0 -288
  309. package/src/__tests__/local-gateway-health.test.ts +0 -209
  310. package/src/__tests__/memory-brief-open-loops.test.ts +0 -530
  311. package/src/__tests__/memory-brief-time.test.ts +0 -285
  312. package/src/__tests__/memory-brief-wrapper.test.ts +0 -311
  313. package/src/__tests__/memory-chunk-archive.test.ts +0 -400
  314. package/src/__tests__/memory-chunk-dual-write.test.ts +0 -453
  315. package/src/__tests__/memory-episode-archive.test.ts +0 -370
  316. package/src/__tests__/memory-episode-dual-write.test.ts +0 -626
  317. package/src/__tests__/memory-observation-archive.test.ts +0 -375
  318. package/src/__tests__/memory-observation-dual-write.test.ts +0 -318
  319. package/src/__tests__/memory-reducer-job.test.ts +0 -538
  320. package/src/__tests__/memory-reducer-scheduling.test.ts +0 -473
  321. package/src/__tests__/memory-reducer-store.test.ts +0 -728
  322. package/src/__tests__/memory-reducer-types.test.ts +0 -707
  323. package/src/__tests__/memory-reducer.test.ts +0 -704
  324. package/src/__tests__/memory-simplified-config.test.ts +0 -281
  325. package/src/__tests__/secret-ingress-handler.test.ts +0 -120
  326. package/src/__tests__/simplified-memory-e2e.test.ts +0 -666
  327. package/src/__tests__/simplified-memory-runtime.test.ts +0 -616
  328. package/src/__tests__/swarm-conversation-integration.test.ts +0 -358
  329. package/src/__tests__/swarm-dag-pathological.test.ts +0 -547
  330. package/src/__tests__/swarm-orchestrator.test.ts +0 -463
  331. package/src/__tests__/swarm-plan-validator.test.ts +0 -384
  332. package/src/__tests__/swarm-recursion.test.ts +0 -197
  333. package/src/__tests__/swarm-router-planner.test.ts +0 -234
  334. package/src/__tests__/swarm-tool.test.ts +0 -185
  335. package/src/__tests__/swarm-worker-backend.test.ts +0 -144
  336. package/src/__tests__/swarm-worker-runner.test.ts +0 -288
  337. package/src/commands/__tests__/cc-command-registry.test.ts +0 -396
  338. package/src/commands/cc-command-registry.ts +0 -248
  339. package/src/config/bundled-skills/claude-code/SKILL.md +0 -53
  340. package/src/config/bundled-skills/claude-code/TOOLS.json +0 -47
  341. package/src/config/bundled-skills/claude-code/tools/claude-code.ts +0 -12
  342. package/src/config/bundled-skills/orchestration/SKILL.md +0 -33
  343. package/src/config/bundled-skills/orchestration/TOOLS.json +0 -35
  344. package/src/config/bundled-skills/orchestration/tools/swarm-delegate.ts +0 -12
  345. package/src/config/schemas/memory-simplified.ts +0 -101
  346. package/src/config/schemas/swarm.ts +0 -82
  347. package/src/logfire.ts +0 -135
  348. package/src/memory/archive-recall.ts +0 -516
  349. package/src/memory/archive-store.ts +0 -400
  350. package/src/memory/brief-formatting.ts +0 -33
  351. package/src/memory/brief-open-loops.ts +0 -266
  352. package/src/memory/brief-time.ts +0 -162
  353. package/src/memory/brief.ts +0 -75
  354. package/src/memory/job-handlers/backfill-simplified-memory.ts +0 -462
  355. package/src/memory/job-handlers/reduce-conversation-memory.ts +0 -229
  356. package/src/memory/migrations/185-memory-brief-state.ts +0 -52
  357. package/src/memory/migrations/186-memory-archive.ts +0 -109
  358. package/src/memory/migrations/187-memory-reducer-checkpoints.ts +0 -19
  359. package/src/memory/reducer-scheduler.ts +0 -242
  360. package/src/memory/reducer-store.ts +0 -271
  361. package/src/memory/reducer-types.ts +0 -106
  362. package/src/memory/reducer.ts +0 -467
  363. package/src/memory/schema/memory-archive.ts +0 -121
  364. package/src/memory/schema/memory-brief.ts +0 -55
  365. package/src/runtime/local-gateway-health.ts +0 -275
  366. package/src/security/secret-ingress.ts +0 -68
  367. package/src/swarm/backend-claude-code.ts +0 -225
  368. package/src/swarm/checkpoint.ts +0 -137
  369. package/src/swarm/graph-utils.ts +0 -53
  370. package/src/swarm/index.ts +0 -55
  371. package/src/swarm/limits.ts +0 -66
  372. package/src/swarm/orchestrator.ts +0 -424
  373. package/src/swarm/plan-validator.ts +0 -117
  374. package/src/swarm/router-planner.ts +0 -162
  375. package/src/swarm/router-prompts.ts +0 -39
  376. package/src/swarm/synthesizer.ts +0 -81
  377. package/src/swarm/types.ts +0 -72
  378. package/src/swarm/worker-backend.ts +0 -131
  379. package/src/swarm/worker-prompts.ts +0 -80
  380. package/src/swarm/worker-runner.ts +0 -170
  381. package/src/tools/claude-code/claude-code.ts +0 -610
  382. package/src/tools/swarm/delegate.ts +0 -205
@@ -538,12 +538,12 @@ export class ContextWindowManager {
538
538
  }
539
539
 
540
540
  const keepTurns = lo;
541
- const keepFromIndex =
541
+ const rawKeepFromIndex =
542
542
  keepTurns === 0
543
543
  ? messages.length
544
544
  : (userTurnStarts[userTurnStarts.length - keepTurns] ??
545
545
  messages.length);
546
-
546
+ const keepFromIndex = adjustForToolPairs(messages, rawKeepFromIndex);
547
547
  return { keepFromIndex, keepTurns };
548
548
  }
549
549
 
@@ -703,6 +703,57 @@ function isToolResultOnly(message: Message): boolean {
703
703
  );
704
704
  }
705
705
 
706
+ /**
707
+ * Walk the keep boundary backward to ensure tool_use/tool_result pairs are
708
+ * never split across the compaction boundary. If the first kept message is
709
+ * a user message containing tool_result blocks whose matching tool_use blocks
710
+ * live in the preceding (compacted-away) assistant message, include that
711
+ * assistant message in the kept set.
712
+ */
713
+ function adjustForToolPairs(
714
+ messages: Message[],
715
+ keepFromIndex: number,
716
+ ): number {
717
+ let idx = keepFromIndex;
718
+ while (idx > 0) {
719
+ const msg = messages[idx];
720
+ if (!msg || msg.role !== "user") break;
721
+
722
+ // Collect tool_use_ids referenced by tool_results in this user message
723
+ const referencedIds = new Set<string>();
724
+ for (const block of msg.content) {
725
+ if ((block.type === "tool_result" || block.type === "web_search_tool_result") && "tool_use_id" in block) {
726
+ referencedIds.add((block as { tool_use_id: string }).tool_use_id);
727
+ }
728
+ }
729
+ if (referencedIds.size === 0) break;
730
+
731
+ // Check if the preceding assistant message contains matching tool_uses
732
+ const prev = messages[idx - 1];
733
+ if (!prev || prev.role !== "assistant") break;
734
+
735
+ const hasOrphanedPair = prev.content.some(
736
+ (block) =>
737
+ (block.type === "tool_use" || block.type === "server_tool_use") &&
738
+ "id" in block &&
739
+ referencedIds.has((block as { id: string }).id),
740
+ );
741
+ if (!hasOrphanedPair) break;
742
+
743
+ // Include the assistant message
744
+ idx--;
745
+
746
+ // The assistant message may itself be preceded by a tool_result user
747
+ // message that pairs with an even earlier assistant — continue the check
748
+ if (idx > 0 && messages[idx - 1]?.role === "user") {
749
+ idx--;
750
+ } else {
751
+ break;
752
+ }
753
+ }
754
+ return idx;
755
+ }
756
+
706
757
  export function getSummaryFromContextMessage(
707
758
  message: Message | undefined,
708
759
  ): string | null {
@@ -103,6 +103,7 @@ function mapUserDecisionToCesDecision(
103
103
  userDecision: decision,
104
104
  };
105
105
  case "temporary_override":
106
+ case "dangerously_skip_permissions":
106
107
  return {
107
108
  grantDecision: "approved",
108
109
  ttl: undefined,
@@ -79,6 +79,11 @@ export interface LocalDiscoverySuccess {
79
79
  executablePath: string;
80
80
  }
81
81
 
82
+ export interface LocalSourceDiscoverySuccess {
83
+ mode: "local-source";
84
+ sourcePath: string;
85
+ }
86
+
82
87
  export interface ManagedDiscoverySuccess {
83
88
  mode: "managed";
84
89
  socketPath: string;
@@ -91,6 +96,7 @@ export interface DiscoveryFailure {
91
96
 
92
97
  export type DiscoveryResult =
93
98
  | LocalDiscoverySuccess
99
+ | LocalSourceDiscoverySuccess
94
100
  | ManagedDiscoverySuccess
95
101
  | DiscoveryFailure;
96
102
 
@@ -101,11 +107,16 @@ export type DiscoveryResult =
101
107
  /**
102
108
  * Discover the local CES executable.
103
109
  *
104
- * Searches well-known paths for the `credential-executor` binary. Returns
105
- * a structured result never throws. If the binary is not found, returns
110
+ * Searches well-known paths for the `credential-executor` binary. If the
111
+ * compiled binary is not found, falls back to the TypeScript source entry
112
+ * point in the monorepo. Returns a structured result — never throws. If
113
+ * neither the binary nor the source entry point is found, returns
106
114
  * `{ mode: "unavailable" }` so the caller can fail closed.
107
115
  */
108
- export function discoverLocalCes(): LocalDiscoverySuccess | DiscoveryFailure {
116
+ export function discoverLocalCes():
117
+ | LocalDiscoverySuccess
118
+ | LocalSourceDiscoverySuccess
119
+ | DiscoveryFailure {
109
120
  const searchPaths = getLocalBinarySearchPaths();
110
121
 
111
122
  for (const candidate of searchPaths) {
@@ -115,7 +126,20 @@ export function discoverLocalCes(): LocalDiscoverySuccess | DiscoveryFailure {
115
126
  }
116
127
  }
117
128
 
118
- const reason = `CES executable not found. Searched: ${searchPaths.join(", ")}`;
129
+ // Fallback: check for source entry point in the monorepo
130
+ const monorepoRoot = join(import.meta.dir, "..", "..", "..", "..");
131
+ const sourceEntry = join(
132
+ monorepoRoot,
133
+ "credential-executor",
134
+ "src",
135
+ "main.ts",
136
+ );
137
+ if (existsSync(sourceEntry)) {
138
+ log.info({ path: sourceEntry }, "Found local CES source entry point");
139
+ return { mode: "local-source", sourcePath: sourceEntry };
140
+ }
141
+
142
+ const reason = `CES executable not found. Searched: ${searchPaths.join(", ")}; also checked source at ${sourceEntry}`;
119
143
  log.warn(reason);
120
144
  return { mode: "unavailable", reason };
121
145
  }
@@ -35,6 +35,10 @@ export const CES_GRANT_AUDIT_FLAG_KEY =
35
35
  export const CES_MANAGED_SIDECAR_FLAG_KEY =
36
36
  "feature_flags.ces-managed-sidecar.enabled" as const;
37
37
 
38
+ /** Gate for routing credential reads/writes through the CES process. */
39
+ export const CES_CREDENTIAL_BACKEND_FLAG_KEY =
40
+ "feature_flags.ces-credential-backend.enabled" as const;
41
+
38
42
  // ---------------------------------------------------------------------------
39
43
  // Public API — predicate functions
40
44
  // ---------------------------------------------------------------------------
@@ -73,3 +77,15 @@ export function isCesGrantAuditEnabled(config: AssistantConfig): boolean {
73
77
  export function isCesManagedSidecarEnabled(config: AssistantConfig): boolean {
74
78
  return isAssistantFeatureFlagEnabled(CES_MANAGED_SIDECAR_FLAG_KEY, config);
75
79
  }
80
+
81
+ /**
82
+ * Whether credential reads and writes should be routed through the CES process.
83
+ */
84
+ export function isCesCredentialBackendEnabled(
85
+ config: AssistantConfig,
86
+ ): boolean {
87
+ return isAssistantFeatureFlagEnabled(
88
+ CES_CREDENTIAL_BACKEND_FLAG_KEY,
89
+ config,
90
+ );
91
+ }
@@ -38,6 +38,7 @@ import {
38
38
  discoverLocalCes,
39
39
  type DiscoveryResult,
40
40
  type LocalDiscoverySuccess,
41
+ type LocalSourceDiscoverySuccess,
41
42
  type ManagedDiscoverySuccess,
42
43
  } from "./executable-discovery.js";
43
44
  import { isCesManagedSidecarEnabled } from "./feature-gates.js";
@@ -156,6 +157,12 @@ export function createCesProcessManager(
156
157
  return transport;
157
158
  }
158
159
 
160
+ if (discoveryResult.mode === "local-source") {
161
+ const transport = await startLocalSourceProcess(discoveryResult);
162
+ running = true;
163
+ return transport;
164
+ }
165
+
159
166
  // managed mode
160
167
  const transport = await connectManagedSocket(discoveryResult);
161
168
  running = true;
@@ -235,6 +242,37 @@ export function createCesProcessManager(
235
242
  return createStdioTransport(proc);
236
243
  }
237
244
 
245
+ // -------------------------------------------------------------------------
246
+ // Local source mode — child process over stdio (bun run)
247
+ // -------------------------------------------------------------------------
248
+
249
+ async function startLocalSourceProcess(
250
+ discovery: LocalSourceDiscoverySuccess,
251
+ ): Promise<CesTransport> {
252
+ log.info(
253
+ { sourcePath: discovery.sourcePath },
254
+ "Spawning CES child process from source",
255
+ );
256
+
257
+ const proc = Bun.spawn({
258
+ cmd: ["bun", "run", discovery.sourcePath],
259
+ stdin: "pipe",
260
+ stdout: "pipe",
261
+ stderr: "ignore",
262
+ env: {
263
+ ...process.env,
264
+ // Signal to CES that it was launched by the assistant
265
+ CES_LAUNCHED_BY: "assistant",
266
+ },
267
+ });
268
+
269
+ childProcess = proc;
270
+
271
+ log.info({ pid: proc.pid }, "CES child process started (from source)");
272
+
273
+ return createStdioTransport(proc);
274
+ }
275
+
238
276
  // -------------------------------------------------------------------------
239
277
  // Managed mode — Unix socket connection
240
278
  // -------------------------------------------------------------------------
@@ -76,6 +76,15 @@ const EXTENSION_MIME_MAP: Record<string, string> = {
76
76
  js: "text/javascript",
77
77
  ts: "text/typescript",
78
78
 
79
+ // Audio
80
+ mp3: "audio/mpeg",
81
+ wav: "audio/wav",
82
+ ogg: "audio/ogg",
83
+ flac: "audio/flac",
84
+ aac: "audio/aac",
85
+ m4a: "audio/x-m4a",
86
+ opus: "audio/opus",
87
+
79
88
  // Video
80
89
  mp4: "video/mp4",
81
90
  webm: "video/webm",
@@ -12,7 +12,7 @@ import {
12
12
  } from "node:fs";
13
13
  import { join } from "node:path";
14
14
 
15
- import { getIsContainerized } from "../config/env-registry.js";
15
+ import { clearFeatureFlagOverridesCache } from "../config/assistant-feature-flags.js";
16
16
  import { getConfig, invalidateConfigCache } from "../config/loader.js";
17
17
  import { clearEmbeddingBackendCache } from "../memory/embedding-backend.js";
18
18
  import { clearCache as clearTrustCache } from "../permissions/trust-store.js";
@@ -154,6 +154,10 @@ export class ConfigWatcher {
154
154
  "trust.json": () => {
155
155
  clearTrustCache();
156
156
  },
157
+ "feature-flags.json": () => {
158
+ clearFeatureFlagOverridesCache();
159
+ onConversationEvict();
160
+ },
157
161
  "secret-allowlist.json": () => {
158
162
  resetAllowlist();
159
163
  try {
@@ -210,9 +214,7 @@ export class ConfigWatcher {
210
214
  );
211
215
  }
212
216
 
213
- if (!getIsContainerized()) {
214
- this.startSignalsWatcher();
215
- }
217
+ this.startSignalsWatcher();
216
218
  this.startSkillsWatchers(onConversationEvict);
217
219
  }
218
220
 
@@ -33,7 +33,6 @@ import {
33
33
  } from "../instrument.js";
34
34
  import { commitAppTurnChanges } from "../memory/app-git-service.js";
35
35
  import { getApp, listAppFiles, resolveAppDir } from "../memory/app-store.js";
36
- import { insertCompactionEpisode } from "../memory/archive-store.js";
37
36
  import {
38
37
  addMessage,
39
38
  deleteMessageById,
@@ -514,12 +513,6 @@ export async function runAgentLoopImpl(
514
513
  compacted.summaryText,
515
514
  ctx.contextCompactedMessageCount,
516
515
  );
517
- dualWriteCompactionEpisode(
518
- ctx.conversationId,
519
- ctx.memoryPolicy.scopeId,
520
- compacted.summaryText,
521
- compacted.summaryOutputTokens,
522
- );
523
516
  onEvent({
524
517
  type: "context_compacted",
525
518
  previousEstimatedInputTokens: compacted.previousEstimatedInputTokens,
@@ -787,12 +780,6 @@ export async function runAgentLoopImpl(
787
780
  step.compactionResult.summaryText,
788
781
  ctx.contextCompactedMessageCount,
789
782
  );
790
- dualWriteCompactionEpisode(
791
- ctx.conversationId,
792
- ctx.memoryPolicy.scopeId,
793
- step.compactionResult.summaryText,
794
- step.compactionResult.summaryOutputTokens,
795
- );
796
783
  onEvent({
797
784
  type: "context_compacted",
798
785
  previousEstimatedInputTokens:
@@ -977,12 +964,6 @@ export async function runAgentLoopImpl(
977
964
  midLoopCompact.summaryText,
978
965
  ctx.contextCompactedMessageCount,
979
966
  );
980
- dualWriteCompactionEpisode(
981
- ctx.conversationId,
982
- ctx.memoryPolicy.scopeId,
983
- midLoopCompact.summaryText,
984
- midLoopCompact.summaryOutputTokens,
985
- );
986
967
  onEvent({
987
968
  type: "context_compacted",
988
969
  previousEstimatedInputTokens:
@@ -1179,12 +1160,6 @@ export async function runAgentLoopImpl(
1179
1160
  step.compactionResult.summaryText,
1180
1161
  ctx.contextCompactedMessageCount,
1181
1162
  );
1182
- dualWriteCompactionEpisode(
1183
- ctx.conversationId,
1184
- ctx.memoryPolicy.scopeId,
1185
- step.compactionResult.summaryText,
1186
- step.compactionResult.summaryOutputTokens,
1187
- );
1188
1163
  onEvent({
1189
1164
  type: "context_compacted",
1190
1165
  previousEstimatedInputTokens:
@@ -1292,12 +1267,6 @@ export async function runAgentLoopImpl(
1292
1267
  emergencyCompact.summaryText,
1293
1268
  ctx.contextCompactedMessageCount,
1294
1269
  );
1295
- dualWriteCompactionEpisode(
1296
- ctx.conversationId,
1297
- ctx.memoryPolicy.scopeId,
1298
- emergencyCompact.summaryText,
1299
- emergencyCompact.summaryOutputTokens,
1300
- );
1301
1270
  onEvent({
1302
1271
  type: "context_compacted",
1303
1272
  previousEstimatedInputTokens:
@@ -1402,12 +1371,6 @@ export async function runAgentLoopImpl(
1402
1371
  emergencyCompact.summaryText,
1403
1372
  ctx.contextCompactedMessageCount,
1404
1373
  );
1405
- dualWriteCompactionEpisode(
1406
- ctx.conversationId,
1407
- ctx.memoryPolicy.scopeId,
1408
- emergencyCompact.summaryText,
1409
- emergencyCompact.summaryOutputTokens,
1410
- );
1411
1374
  onEvent({
1412
1375
  type: "context_compacted",
1413
1376
  previousEstimatedInputTokens:
@@ -1873,26 +1836,3 @@ function collapseRawResponses(rawResponses?: unknown[]): unknown | undefined {
1873
1836
  if (!rawResponses || rawResponses.length === 0) return undefined;
1874
1837
  return rawResponses.length === 1 ? rawResponses[0] : rawResponses;
1875
1838
  }
1876
-
1877
- /**
1878
- * Dual-write a compaction summary as an archive episode so it becomes
1879
- * searchable via vector recall. Called after each successful compaction
1880
- * that produces a new summary.
1881
- */
1882
- function dualWriteCompactionEpisode(
1883
- conversationId: string,
1884
- scopeId: string,
1885
- summaryText: string,
1886
- summaryOutputTokens: number,
1887
- ): void {
1888
- const now = Date.now();
1889
- insertCompactionEpisode({
1890
- conversationId,
1891
- scopeId,
1892
- title: truncate(summaryText, 120, ""),
1893
- summary: summaryText,
1894
- tokenEstimate: summaryOutputTokens,
1895
- startAt: now,
1896
- endAt: now,
1897
- });
1898
- }
@@ -1,8 +1,5 @@
1
1
  import { getConfig } from "../config/loader.js";
2
2
  import { estimatePromptTokens } from "../context/token-estimator.js";
3
- import { buildArchiveRecall } from "../memory/archive-recall.js";
4
- import { compileMemoryBrief } from "../memory/brief.js";
5
- import { getDb } from "../memory/db.js";
6
3
  import { buildMemoryQuery } from "../memory/query-builder.js";
7
4
  import { computeRecallBudget } from "../memory/retrieval-budget.js";
8
5
  import {
@@ -12,11 +9,8 @@ import {
12
9
  import type { ScopePolicyOverride } from "../memory/search/types.js";
13
10
  import type { Message } from "../providers/types.js";
14
11
  import type { Provider } from "../providers/types.js";
15
- import { getLogger } from "../util/logger.js";
16
12
  import type { ServerMessage } from "./message-protocol.js";
17
13
 
18
- const log = getLogger("conversation-memory");
19
-
20
14
  export interface MemoryRecallResult {
21
15
  runMessages: Message[];
22
16
  recall: Awaited<ReturnType<typeof buildMemoryRecall>>;
@@ -121,14 +115,6 @@ export async function prepareMemoryContext(
121
115
 
122
116
  const runtimeConfig = getConfig();
123
117
 
124
- // ── Simplified memory path ──────────────────────────────────────────
125
- // When `memory.simplified.enabled` is true, inject the brief and
126
- // optional archive recall instead of the legacy hybrid pipeline.
127
- if (runtimeConfig.memory?.simplified?.enabled) {
128
- return prepareSimplifiedMemoryContext(ctx, content, userMessageId, onEvent);
129
- }
130
-
131
- // ── Legacy memory path (fallback) ──────────────────────────────────
132
118
  // Memory recall via the V2 hybrid pipeline
133
119
  const recallQuery = buildMemoryQuery(content, ctx.messages);
134
120
  const dynamicBudgetConfig = runtimeConfig.memory?.retrieval?.dynamicBudget;
@@ -221,106 +207,3 @@ export async function prepareMemoryContext(
221
207
  recall,
222
208
  };
223
209
  }
224
-
225
- // ── Simplified memory injection ─────────────────────────────────────────
226
-
227
- /**
228
- * Build simplified memory context for a turn: compiles the `<memory_brief>`
229
- * block and conditionally appends `<supporting_recall>` from the archive.
230
- *
231
- * Non-empty blocks are injected as text content blocks prepended to the
232
- * last user message, following the same injection pattern as the legacy
233
- * pipeline. Stripping is handled by `RUNTIME_INJECTION_PREFIXES` which
234
- * already includes `<memory_brief>`.
235
- */
236
- function prepareSimplifiedMemoryContext(
237
- ctx: MemoryPrepareContext,
238
- content: string,
239
- userMessageId: string,
240
- onEvent: (msg: ServerMessage) => void,
241
- ): MemoryRecallResult {
242
- const start = Date.now();
243
-
244
- // Build a no-op recall result matching the legacy shape.
245
- const noopRecall = (): Awaited<ReturnType<typeof buildMemoryRecall>> =>
246
- ({
247
- enabled: true,
248
- degraded: false,
249
- injectedText: "",
250
- semanticHits: 0,
251
- recencyHits: 0,
252
- mergedCount: 0,
253
- selectedCount: 0,
254
- injectedTokens: 0,
255
- latencyMs: 0,
256
- topCandidates: [],
257
- tier1Count: 0,
258
- tier2Count: 0,
259
- }) as Awaited<ReturnType<typeof buildMemoryRecall>>;
260
-
261
- try {
262
- const db = getDb();
263
-
264
- // Step 1: Build the memory brief
265
- const briefResult = compileMemoryBrief(db, ctx.scopeId, userMessageId);
266
-
267
- // Step 2: Conditionally build supporting recall from the archive
268
- const archiveResult = buildArchiveRecall(ctx.scopeId, content);
269
-
270
- // Step 3: Assemble the injection blocks (non-empty only)
271
- const blocks: string[] = [];
272
- if (briefResult.text.length > 0) {
273
- blocks.push(briefResult.text);
274
- }
275
- if (archiveResult.text.length > 0) {
276
- blocks.push(archiveResult.text);
277
- }
278
-
279
- const latencyMs = Date.now() - start;
280
-
281
- // Emit memory status for the simplified path
282
- onEvent({
283
- type: "memory_status",
284
- enabled: true,
285
- degraded: false,
286
- });
287
-
288
- // Inject non-empty blocks into the last user message
289
- let runMessages = ctx.messages;
290
- if (blocks.length > 0) {
291
- const injectedText = blocks.join("\n\n");
292
- const userTail = ctx.messages[ctx.messages.length - 1];
293
- if (userTail && userTail.role === "user") {
294
- runMessages = injectMemoryRecallAsUserBlock(ctx.messages, injectedText);
295
- }
296
-
297
- log.debug(
298
- {
299
- briefLength: briefResult.text.length,
300
- recallTrigger: archiveResult.trigger,
301
- recallBullets: archiveResult.bullets.length,
302
- latencyMs,
303
- },
304
- "Simplified memory injection completed",
305
- );
306
- }
307
-
308
- return {
309
- runMessages,
310
- recall: {
311
- ...noopRecall(),
312
- injectedText: blocks.length > 0 ? blocks.join("\n\n") : "",
313
- latencyMs,
314
- },
315
- };
316
- } catch (err) {
317
- log.warn({ err }, "Simplified memory injection failed, returning no-op");
318
- return {
319
- runMessages: ctx.messages,
320
- recall: {
321
- ...noopRecall(),
322
- latencyMs: Date.now() - start,
323
- },
324
- };
325
- }
326
- }
@@ -961,8 +961,6 @@ const RUNTIME_INJECTION_PREFIXES = [
961
961
  "<inbound_actor_context>",
962
962
  "<interface_turn_context>",
963
963
  "<turn_context>",
964
- "<memory_brief>",
965
- "<supporting_recall>",
966
964
  "<memory_context __injected>",
967
965
  "<memory_context>", // backward-compat: strip legacy blocks from pre-__injected history
968
966
  "<voice_call_control>",
@@ -23,7 +23,6 @@ import {
23
23
  import { isAllowDecision } from "../permissions/types.js";
24
24
  import type { Message, ToolDefinition } from "../providers/types.js";
25
25
  import type { TrustClass } from "../runtime/actor-trust-resolver.js";
26
- import { getEffectiveMode } from "../runtime/conversation-approval-overrides.js";
27
26
  import { coreAppProxyTools } from "../tools/apps/definitions.js";
28
27
  import { registerConversationSender } from "../tools/browser/browser-screencast.js";
29
28
  import type { ToolExecutor } from "../tools/executor.js";
@@ -234,110 +233,6 @@ export function createToolExecutor(
234
233
  params.allowedDomains,
235
234
  );
236
235
  },
237
- requestConfirmation: async (req) => {
238
- // Check trust store before prompting
239
- const existingRule = findHighestPriorityRule(
240
- "cc:" + req.toolName,
241
- [req.toolName, `cc:${req.toolName}`, "cc:*"],
242
- ctx.workingDir,
243
- );
244
- if (existingRule && existingRule.decision !== "ask") {
245
- return {
246
- decision:
247
- existingRule.decision === "allow"
248
- ? ("allow" as const)
249
- : ("deny" as const),
250
- };
251
- }
252
- // Auto-approve sub-tool confirmations when a temporary approval
253
- // override is active for this conversation (guardian only).
254
- const guardianTrust = ctx.trustContext?.trustClass ?? "unknown";
255
- if (
256
- guardianTrust === "guardian" &&
257
- getEffectiveMode(ctx.conversationId) !== undefined
258
- ) {
259
- return { decision: "allow" as const };
260
- }
261
- const allowlistOptions = [
262
- {
263
- label: `cc:${req.toolName}`,
264
- description: `Claude Code ${req.toolName}`,
265
- pattern: `cc:${req.toolName}`,
266
- },
267
- {
268
- label: "cc:*",
269
- description: "All Claude Code sub-tools",
270
- pattern: "cc:*",
271
- },
272
- ];
273
- const scopeOptions = generateScopeOptions(ctx.workingDir);
274
- const response = await prompter.prompt(
275
- `cc:${req.toolName}`,
276
- req.input,
277
- req.riskLevel,
278
- allowlistOptions,
279
- scopeOptions,
280
- undefined,
281
- undefined,
282
- ctx.conversationId,
283
- req.executionTarget,
284
- undefined,
285
- undefined,
286
- undefined,
287
- toolUseId,
288
- );
289
- if (
290
- (response.decision === "always_allow" ||
291
- response.decision === "always_allow_high_risk") &&
292
- response.selectedPattern &&
293
- response.selectedScope
294
- ) {
295
- log.info(
296
- {
297
- toolName: "cc:" + req.toolName,
298
- pattern: response.selectedPattern,
299
- scope: response.selectedScope,
300
- highRisk: response.decision === "always_allow_high_risk",
301
- },
302
- "Persisting always-allow trust rule",
303
- );
304
- addRule(
305
- "cc:" + req.toolName,
306
- response.selectedPattern,
307
- response.selectedScope,
308
- "allow",
309
- 100,
310
- response.decision === "always_allow_high_risk"
311
- ? { allowHighRisk: true }
312
- : undefined,
313
- );
314
- }
315
- if (
316
- response.decision === "always_deny" &&
317
- response.selectedPattern &&
318
- response.selectedScope
319
- ) {
320
- log.info(
321
- {
322
- toolName: "cc:" + req.toolName,
323
- pattern: response.selectedPattern,
324
- scope: response.selectedScope,
325
- },
326
- "Persisting always-deny trust rule",
327
- );
328
- addRule(
329
- "cc:" + req.toolName,
330
- response.selectedPattern,
331
- response.selectedScope,
332
- "deny",
333
- );
334
- }
335
- return {
336
- decision: isAllowDecision(response.decision)
337
- ? ("allow" as const)
338
- : ("deny" as const),
339
- };
340
- },
341
236
  };
342
237
 
343
238
  // Intercept skill_execute: extract the real tool name and input, then
@@ -42,6 +42,7 @@ import { PermissionPrompter } from "../permissions/prompter.js";
42
42
  import { SecretPrompter } from "../permissions/secret-prompter.js";
43
43
  import { patternMatchesCandidate } from "../permissions/trust-store.js";
44
44
  import type { UserDecision } from "../permissions/types.js";
45
+ import { resolvePersonaContext } from "../prompts/persona-resolver.js";
45
46
  import { buildSystemPrompt } from "../prompts/system-prompt.js";
46
47
  import type { Message } from "../providers/types.js";
47
48
  import type { Provider } from "../providers/types.js";
@@ -353,10 +354,18 @@ export class Conversation {
353
354
  const resolveSystemPromptCallback = (
354
355
  _history: import("../providers/types.js").Message[],
355
356
  ): ResolvedSystemPrompt => {
357
+ const persona = resolvePersonaContext(
358
+ this.trustContext,
359
+ this.channelCapabilities,
360
+ );
356
361
  const resolved = {
357
362
  systemPrompt: hasSystemPromptOverride
358
363
  ? systemPrompt
359
- : buildSystemPrompt({ hasNoClient: this.hasNoClient }),
364
+ : buildSystemPrompt({
365
+ hasNoClient: this.hasNoClient,
366
+ userPersona: persona.userPersona,
367
+ channelPersona: persona.channelPersona,
368
+ }),
360
369
  maxTokens: configuredMaxTokens,
361
370
  };
362
371
  return resolved;