@vellumai/assistant 0.6.0 → 0.6.2

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 (358) hide show
  1. package/AGENTS.md +4 -0
  2. package/ARCHITECTURE.md +68 -15
  3. package/Dockerfile +2 -2
  4. package/bun.lock +6 -2
  5. package/docker-entrypoint.sh +42 -1
  6. package/docs/architecture/integrations.md +1 -1
  7. package/docs/architecture/memory.md +21 -24
  8. package/node_modules/@vellumai/ces-contracts/src/handles.ts +7 -9
  9. package/openapi.yaml +539 -4
  10. package/package.json +5 -1
  11. package/src/__tests__/anthropic-provider.test.ts +160 -95
  12. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  13. package/src/__tests__/app-executors.test.ts +47 -1
  14. package/src/__tests__/app-source-watcher.test.ts +159 -0
  15. package/src/__tests__/assistant-event-hub.test.ts +30 -0
  16. package/src/__tests__/checker.test.ts +138 -172
  17. package/src/__tests__/cli-command-risk-guard.test.ts +1 -1
  18. package/src/__tests__/config-schema.test.ts +5 -0
  19. package/src/__tests__/context-overflow-approval.test.ts +5 -5
  20. package/src/__tests__/conversation-agent-loop-overflow.test.ts +4 -6
  21. package/src/__tests__/conversation-agent-loop.test.ts +4 -51
  22. package/src/__tests__/conversation-analysis-routes.test.ts +169 -0
  23. package/src/__tests__/conversation-directories-parse.test.ts +105 -0
  24. package/src/__tests__/conversation-history-web-search.test.ts +1 -1
  25. package/src/__tests__/conversation-runtime-assembly.test.ts +653 -832
  26. package/src/__tests__/conversation-runtime-workspace.test.ts +1 -93
  27. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +17 -4
  28. package/src/__tests__/conversation-wipe.test.ts +2 -6
  29. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -12
  30. package/src/__tests__/conversation-workspace-injection.test.ts +25 -26
  31. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
  32. package/src/__tests__/copy-composer-tc-templates.test.ts +335 -0
  33. package/src/__tests__/credential-execution-approval-bridge.test.ts +0 -2
  34. package/src/__tests__/date-context.test.ts +76 -210
  35. package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -1
  36. package/src/__tests__/file-list-tool.test.ts +219 -0
  37. package/src/__tests__/first-greeting.test.ts +1 -1
  38. package/src/__tests__/heartbeat-service.test.ts +180 -3
  39. package/src/__tests__/identity-routes.test.ts +328 -0
  40. package/src/__tests__/init-feature-flag-overrides.test.ts +167 -0
  41. package/src/__tests__/injection-block.test.ts +24 -0
  42. package/src/__tests__/inline-command-runner.test.ts +7 -5
  43. package/src/__tests__/install-skill-routing.test.ts +7 -6
  44. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +15 -14
  45. package/src/__tests__/list-messages-tool-merge.test.ts +300 -0
  46. package/src/__tests__/llm-context-normalization.test.ts +18 -18
  47. package/src/__tests__/llm-context-route-provider.test.ts +101 -0
  48. package/src/__tests__/llm-request-log-turn-query.test.ts +162 -0
  49. package/src/__tests__/log-export-workspace.test.ts +257 -100
  50. package/src/__tests__/managed-credential-catalog-cli.test.ts +12 -14
  51. package/src/__tests__/mcp-abort-signal.test.ts +5 -0
  52. package/src/__tests__/mcp-client-auth.test.ts +5 -0
  53. package/src/__tests__/memory-recall-log-store.test.ts +132 -0
  54. package/src/__tests__/migration-export-streaming.test.ts +304 -0
  55. package/src/__tests__/migration-import-commit-http.test.ts +11 -10
  56. package/src/__tests__/mock-fetch.ts +87 -0
  57. package/src/__tests__/navigate-settings-tab.test.ts +14 -1
  58. package/src/__tests__/notification-broadcaster.test.ts +65 -0
  59. package/src/__tests__/notification-decision-recipient-context.test.ts +282 -0
  60. package/src/__tests__/onboarding-template-contract.test.ts +63 -14
  61. package/src/__tests__/parser.test.ts +32 -0
  62. package/src/__tests__/permission-checker-host-gate.test.ts +452 -0
  63. package/src/__tests__/permission-controls-v2-flag.test.ts +55 -0
  64. package/src/__tests__/permission-mode-sse.test.ts +418 -0
  65. package/src/__tests__/permission-mode-store.test.ts +277 -0
  66. package/src/__tests__/permission-mode.test.ts +101 -0
  67. package/src/__tests__/pkb-autoinject.test.ts +96 -0
  68. package/src/__tests__/platform-bash-auto-approve.test.ts +359 -0
  69. package/src/__tests__/profiler-routes.test.ts +502 -0
  70. package/src/__tests__/profiler-run-store.test.ts +441 -0
  71. package/src/__tests__/proxy-approval-callback.test.ts +4 -75
  72. package/src/__tests__/registry.test.ts +1 -1
  73. package/src/__tests__/require-fresh-approval.test.ts +0 -2
  74. package/src/__tests__/sandbox-diagnostics.test.ts +1 -32
  75. package/src/__tests__/sandbox-host-parity.test.ts +5 -4
  76. package/src/__tests__/scheduler-reuse-conversation.test.ts +368 -0
  77. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +278 -0
  78. package/src/__tests__/search-skills-unified.test.ts +4 -3
  79. package/src/__tests__/send-endpoint-busy.test.ts +42 -3
  80. package/src/__tests__/set-permission-mode.test.ts +274 -0
  81. package/src/__tests__/skill-load-feature-flag.test.ts +12 -0
  82. package/src/__tests__/skill-memory.test.ts +2 -783
  83. package/src/__tests__/strip-memory-injections.test.ts +187 -0
  84. package/src/__tests__/subagent-detail.test.ts +84 -0
  85. package/src/__tests__/subagent-disposal.test.ts +308 -0
  86. package/src/__tests__/subagent-manager-notify.test.ts +19 -10
  87. package/src/__tests__/subagent-notify-parent.test.ts +390 -0
  88. package/src/__tests__/subagent-role-registry.test.ts +108 -0
  89. package/src/__tests__/subagent-tool-filtering.test.ts +71 -0
  90. package/src/__tests__/subagent-tools.test.ts +464 -4
  91. package/src/__tests__/system-prompt-ask-mode.test.ts +139 -0
  92. package/src/__tests__/task-memory-cleanup.test.ts +12 -12
  93. package/src/__tests__/terminal-sandbox.test.ts +1 -1
  94. package/src/__tests__/terminal-tools.test.ts +16 -29
  95. package/src/__tests__/test-preload.ts +18 -0
  96. package/src/__tests__/tool-domain-event-publisher.test.ts +0 -1
  97. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -8
  98. package/src/__tests__/tool-executor.test.ts +4 -27
  99. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
  100. package/src/__tests__/top-level-renderer.test.ts +10 -13
  101. package/src/__tests__/transport-hints-queue.test.ts +77 -0
  102. package/src/__tests__/trust-store.test.ts +4 -4
  103. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +116 -2
  104. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +387 -0
  105. package/src/__tests__/workspace-migration-030-seed-pkb-autoinject.test.ts +168 -0
  106. package/src/__tests__/workspace-policy.test.ts +2 -7
  107. package/src/agent/loop.ts +6 -29
  108. package/src/approvals/guardian-request-resolvers.ts +24 -0
  109. package/src/avatar/traits-png-sync.ts +3 -3
  110. package/src/channels/types.ts +5 -0
  111. package/src/cli/__tests__/run-assistant-command.ts +56 -0
  112. package/src/cli/__tests__/unknown-command.test.ts +33 -0
  113. package/src/cli/commands/__tests__/email-download.test.ts +245 -0
  114. package/src/cli/commands/__tests__/email-list.test.ts +192 -0
  115. package/src/cli/commands/__tests__/email-register.test.ts +186 -0
  116. package/src/cli/commands/__tests__/email-send.test.ts +291 -0
  117. package/src/cli/commands/__tests__/email-status.test.ts +181 -0
  118. package/src/cli/commands/__tests__/email-unregister.test.ts +139 -0
  119. package/src/cli/commands/__tests__/routes.test.ts +562 -0
  120. package/src/cli/commands/conversations.ts +1 -8
  121. package/src/cli/commands/default-action.ts +68 -1
  122. package/src/cli/commands/email.ts +584 -835
  123. package/src/cli/commands/memory.ts +1 -34
  124. package/src/cli/commands/notifications.ts +7 -2
  125. package/src/cli/commands/oauth/__tests__/connect.test.ts +27 -0
  126. package/src/cli/commands/oauth/connect.ts +25 -5
  127. package/src/cli/commands/platform/__tests__/connect.test.ts +1 -1
  128. package/src/cli/commands/platform/__tests__/disconnect.test.ts +1 -1
  129. package/src/cli/commands/platform/__tests__/status.test.ts +1 -1
  130. package/src/cli/commands/routes.ts +396 -0
  131. package/src/cli/commands/skills.ts +130 -20
  132. package/src/cli/program.ts +11 -2
  133. package/src/cli.ts +1 -120
  134. package/src/config/assistant-feature-flags.ts +59 -55
  135. package/src/config/bundled-skills/app-builder/SKILL.md +91 -5
  136. package/src/config/bundled-skills/gmail/SKILL.md +13 -8
  137. package/src/config/bundled-skills/gmail/TOOLS.json +1 -1
  138. package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +2 -1
  139. package/src/config/bundled-skills/messaging/SKILL.md +7 -0
  140. package/src/config/bundled-skills/schedule/SKILL.md +22 -2
  141. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  142. package/src/config/bundled-skills/settings/TOOLS.json +1 -1
  143. package/src/config/bundled-skills/settings/tools/avatar-get.ts +3 -13
  144. package/src/config/bundled-skills/settings/tools/avatar-remove.ts +2 -4
  145. package/src/config/bundled-skills/settings/tools/avatar-update.ts +5 -2
  146. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +8 -3
  147. package/src/config/bundled-skills/slack/SKILL.md +2 -0
  148. package/src/config/bundled-skills/subagent/SKILL.md +43 -3
  149. package/src/config/bundled-skills/subagent/TOOLS.json +29 -4
  150. package/src/config/env-registry.ts +63 -0
  151. package/src/config/feature-flag-registry.json +17 -1
  152. package/src/config/schema.ts +8 -0
  153. package/src/config/schemas/filing.ts +51 -0
  154. package/src/config/schemas/heartbeat.ts +15 -12
  155. package/src/config/schemas/memory-lifecycle.ts +12 -0
  156. package/src/config/schemas/security.ts +14 -0
  157. package/src/config/schemas/services.ts +8 -0
  158. package/src/credential-execution/approval-bridge.ts +0 -1
  159. package/src/credential-execution/managed-catalog.ts +3 -7
  160. package/src/daemon/app-source-watcher.ts +93 -0
  161. package/src/daemon/config-watcher.ts +85 -3
  162. package/src/daemon/context-overflow-approval.ts +0 -1
  163. package/src/daemon/conversation-agent-loop-handlers.ts +20 -0
  164. package/src/daemon/conversation-agent-loop.ts +179 -65
  165. package/src/daemon/conversation-attachments.ts +0 -1
  166. package/src/daemon/conversation-history.ts +4 -19
  167. package/src/daemon/conversation-lifecycle.ts +8 -14
  168. package/src/daemon/conversation-messaging.ts +3 -0
  169. package/src/daemon/conversation-process.ts +30 -8
  170. package/src/daemon/conversation-queue-manager.ts +8 -0
  171. package/src/daemon/conversation-runtime-assembly.ts +359 -308
  172. package/src/daemon/conversation-surfaces.ts +65 -0
  173. package/src/daemon/conversation-tool-setup.ts +44 -17
  174. package/src/daemon/conversation-workspace.ts +1 -2
  175. package/src/daemon/conversation.ts +19 -3
  176. package/src/daemon/date-context.ts +26 -53
  177. package/src/daemon/first-greeting.ts +1 -1
  178. package/src/daemon/handlers/conversations.ts +5 -7
  179. package/src/daemon/handlers/shared.test.ts +143 -0
  180. package/src/daemon/handlers/shared.ts +70 -5
  181. package/src/daemon/handlers/skills.ts +11 -18
  182. package/src/daemon/lifecycle.ts +220 -158
  183. package/src/daemon/message-types/conversations.ts +29 -6
  184. package/src/daemon/message-types/messages.ts +9 -2
  185. package/src/daemon/message-types/notifications.ts +12 -0
  186. package/src/daemon/message-types/schedules.ts +1 -0
  187. package/src/daemon/message-types/settings.ts +18 -0
  188. package/src/daemon/profiler-run-store.ts +557 -0
  189. package/src/daemon/server.ts +87 -10
  190. package/src/daemon/shutdown-handlers.ts +5 -0
  191. package/src/daemon/tool-side-effects.ts +23 -3
  192. package/src/daemon/transport-hints.ts +33 -0
  193. package/src/export/transcript-formatter.ts +148 -0
  194. package/src/filing/filing-service.ts +228 -0
  195. package/src/heartbeat/heartbeat-service.ts +96 -7
  196. package/src/index.ts +1 -1
  197. package/src/mcp/client.ts +6 -0
  198. package/src/mcp/mcp-oauth-provider.ts +149 -27
  199. package/src/memory/admin.ts +33 -32
  200. package/src/memory/app-store.ts +69 -0
  201. package/src/memory/conversation-bootstrap.ts +1 -1
  202. package/src/memory/conversation-crud.ts +151 -117
  203. package/src/memory/conversation-directories.ts +39 -0
  204. package/src/memory/conversation-group-migration.ts +66 -6
  205. package/src/memory/conversation-queries.ts +58 -12
  206. package/src/memory/conversation-title-service.ts +1 -0
  207. package/src/memory/db-init.ts +182 -376
  208. package/src/memory/embedding-local.ts +1 -1
  209. package/src/memory/graph/bootstrap.ts +75 -66
  210. package/src/memory/graph/capability-seed.ts +167 -17
  211. package/src/memory/graph/consolidation.ts +38 -4
  212. package/src/memory/graph/conversation-graph-memory.ts +133 -104
  213. package/src/memory/graph/extraction-job.ts +9 -4
  214. package/src/memory/graph/extraction.ts +66 -23
  215. package/src/memory/graph/graph-memory-state-store.ts +37 -0
  216. package/src/memory/graph/graph-search.ts +29 -15
  217. package/src/memory/graph/injection.ts +38 -8
  218. package/src/memory/graph/inspect.ts +12 -3
  219. package/src/memory/graph/retriever.ts +365 -262
  220. package/src/memory/graph/store.test.ts +48 -0
  221. package/src/memory/graph/store.ts +150 -11
  222. package/src/memory/graph/tool-handlers.ts +84 -209
  223. package/src/memory/graph/tools.ts +8 -52
  224. package/src/memory/graph/types.ts +24 -0
  225. package/src/memory/group-crud.ts +25 -9
  226. package/src/memory/job-handlers/cleanup.ts +44 -1
  227. package/src/memory/jobs-store.ts +70 -60
  228. package/src/memory/jobs-worker.ts +44 -28
  229. package/src/memory/llm-request-log-store.ts +96 -12
  230. package/src/memory/memory-recall-log-store.ts +49 -5
  231. package/src/memory/migrations/203-drop-memory-items-tables.ts +33 -1
  232. package/src/memory/migrations/206-memory-graph-node-edits.ts +19 -0
  233. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +131 -0
  234. package/src/memory/migrations/207-conversation-graph-memory-state.ts +20 -0
  235. package/src/memory/migrations/208-conversations-last-message-at.ts +35 -0
  236. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +85 -0
  237. package/src/memory/migrations/210-schedule-reuse-conversation.ts +13 -0
  238. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +21 -0
  239. package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +19 -0
  240. package/src/memory/migrations/index.ts +8 -0
  241. package/src/memory/migrations/registry.ts +8 -0
  242. package/src/memory/schema/conversations.ts +14 -0
  243. package/src/memory/schema/infrastructure.ts +8 -1
  244. package/src/memory/schema/memory-core.ts +0 -51
  245. package/src/memory/schema/memory-graph.ts +15 -0
  246. package/src/memory/task-memory-cleanup.ts +30 -11
  247. package/src/messaging/provider.ts +1 -1
  248. package/src/notifications/broadcaster.ts +6 -0
  249. package/src/notifications/conversation-pairing.ts +12 -4
  250. package/src/notifications/copy-composer.ts +86 -0
  251. package/src/notifications/decision-engine.ts +35 -0
  252. package/src/notifications/emit-signal.ts +14 -0
  253. package/src/notifications/signal.ts +11 -0
  254. package/src/oauth/platform-connection.test.ts +2 -2
  255. package/src/oauth/seed-providers.ts +1 -0
  256. package/src/permissions/checker.ts +15 -4
  257. package/src/permissions/defaults.ts +7 -8
  258. package/src/permissions/permission-mode-store.ts +180 -0
  259. package/src/permissions/permission-mode.ts +31 -0
  260. package/src/permissions/prompter.ts +0 -2
  261. package/src/permissions/workspace-policy.ts +9 -0
  262. package/src/platform/client.ts +1 -1
  263. package/src/prompts/system-prompt.ts +59 -7
  264. package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +100 -0
  265. package/src/prompts/templates/BOOTSTRAP.md +76 -162
  266. package/src/prompts/templates/HEARTBEAT.md +3 -1
  267. package/src/prompts/templates/SOUL.md +30 -9
  268. package/src/prompts/templates/UPDATES.md +8 -0
  269. package/src/providers/anthropic/client.ts +107 -219
  270. package/src/runtime/assistant-event-hub.ts +22 -0
  271. package/src/runtime/auth/route-policy.ts +23 -0
  272. package/src/runtime/auth/token-service.ts +8 -0
  273. package/src/runtime/http-server.ts +32 -2
  274. package/src/runtime/http-types.ts +12 -1
  275. package/src/runtime/migrations/vbundle-builder.ts +389 -3
  276. package/src/runtime/migrations/vbundle-importer.ts +8 -6
  277. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +378 -0
  278. package/src/runtime/routes/app-management-routes.ts +1 -11
  279. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +26 -0
  280. package/src/runtime/routes/archive-utils.ts +29 -0
  281. package/src/runtime/routes/avatar-routes.ts +2 -9
  282. package/src/runtime/routes/btw-routes.ts +14 -1
  283. package/src/runtime/routes/conversation-analysis-routes.ts +185 -0
  284. package/src/runtime/routes/conversation-management-routes.ts +1 -14
  285. package/src/runtime/routes/conversation-query-routes.ts +49 -3
  286. package/src/runtime/routes/conversation-routes.ts +270 -44
  287. package/src/runtime/routes/group-routes.ts +22 -8
  288. package/src/runtime/routes/heartbeat-routes.ts +4 -10
  289. package/src/runtime/routes/identity-routes.ts +53 -18
  290. package/src/runtime/routes/llm-context-normalization.ts +14 -10
  291. package/src/runtime/routes/log-export/AGENTS.md +104 -0
  292. package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +103 -0
  293. package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +716 -0
  294. package/src/runtime/routes/log-export/workspace-allowlist.ts +458 -0
  295. package/src/runtime/routes/log-export-routes.ts +41 -278
  296. package/src/runtime/routes/memory-item-routes.test.ts +168 -233
  297. package/src/runtime/routes/migration-routes.ts +18 -7
  298. package/src/runtime/routes/profiler-routes.ts +350 -0
  299. package/src/runtime/routes/schedule-routes.ts +27 -12
  300. package/src/runtime/routes/settings-routes.ts +95 -8
  301. package/src/runtime/routes/subagents-routes.ts +28 -7
  302. package/src/runtime/routes/user-route-dispatcher.ts +223 -0
  303. package/src/runtime/routes/user-routes.ts +41 -0
  304. package/src/runtime/routes/workspace-routes.ts +0 -1
  305. package/src/schedule/schedule-store.ts +30 -0
  306. package/src/schedule/scheduler.ts +45 -18
  307. package/src/skills/catalog-install.ts +10 -2
  308. package/src/skills/inline-command-runner.ts +12 -14
  309. package/src/skills/managed-store.ts +2 -2
  310. package/src/skills/skill-memory.ts +1 -293
  311. package/src/subagent/index.ts +13 -3
  312. package/src/subagent/manager.ts +308 -29
  313. package/src/subagent/types.ts +68 -0
  314. package/src/tasks/task-runner.ts +4 -4
  315. package/src/tools/apps/executors.ts +29 -4
  316. package/src/tools/filesystem/list.ts +93 -0
  317. package/src/tools/permission-checker.ts +78 -18
  318. package/src/tools/registry.ts +4 -0
  319. package/src/tools/schedule/create.ts +3 -0
  320. package/src/tools/schedule/list.ts +1 -0
  321. package/src/tools/schedule/update.ts +6 -0
  322. package/src/tools/secret-detection-handler.ts +0 -1
  323. package/src/tools/shared/filesystem/errors.ts +5 -0
  324. package/src/tools/shared/filesystem/file-ops-service.ts +90 -2
  325. package/src/tools/shared/filesystem/types.ts +17 -0
  326. package/src/tools/shared/shell-output.ts +31 -2
  327. package/src/tools/skills/sandbox-runner.ts +3 -6
  328. package/src/tools/subagent/abort.ts +12 -2
  329. package/src/tools/subagent/message.ts +9 -2
  330. package/src/tools/subagent/notify-parent.ts +79 -0
  331. package/src/tools/subagent/read.ts +29 -8
  332. package/src/tools/subagent/resolve.ts +21 -0
  333. package/src/tools/subagent/spawn.ts +2 -0
  334. package/src/tools/subagent/status.ts +11 -1
  335. package/src/tools/system/avatar-generator.ts +3 -3
  336. package/src/tools/system/register.ts +23 -0
  337. package/src/tools/system/set-permission-mode.ts +103 -0
  338. package/src/tools/terminal/parser.ts +30 -5
  339. package/src/tools/terminal/safe-env.ts +16 -1
  340. package/src/tools/terminal/sandbox-diagnostics.ts +4 -4
  341. package/src/tools/terminal/sandbox.ts +4 -1
  342. package/src/tools/terminal/shell.ts +3 -5
  343. package/src/tools/tool-manifest.ts +6 -0
  344. package/src/tools/types.ts +2 -3
  345. package/src/util/logger.ts +1 -1
  346. package/src/util/platform.ts +50 -17
  347. package/src/watcher/provider-types.ts +1 -1
  348. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +2 -2
  349. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +2 -2
  350. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +270 -0
  351. package/src/workspace/migrations/029-seed-pkb.ts +85 -0
  352. package/src/workspace/migrations/030-seed-pkb-autoinject.ts +73 -0
  353. package/src/workspace/migrations/registry.ts +6 -0
  354. package/src/workspace/top-level-renderer.ts +5 -9
  355. package/src/__tests__/cli-memory.test.ts +0 -377
  356. package/src/__tests__/clipboard.test.ts +0 -88
  357. package/src/cli/cli-memory.ts +0 -179
  358. package/src/util/clipboard.ts +0 -34
@@ -1,25 +1,6 @@
1
- import { and, eq, sql } from "drizzle-orm";
2
- import { v4 as uuid } from "uuid";
3
-
4
- import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
5
- import { getConfig } from "../config/loader.js";
6
- import { resolveSkillStates } from "../config/skill-state.js";
7
- import { loadSkillCatalog, type SkillSummary } from "../config/skills.js";
8
- import { getDb } from "../memory/db.js";
9
- import { enqueueMemoryJob } from "../memory/jobs-store.js";
10
- import { memoryGraphNodes } from "../memory/schema.js";
11
- import { getLogger } from "../util/logger.js";
12
- import { getCachedCatalogSync } from "./catalog-cache.js";
1
+ import type { SkillSummary } from "../config/skills.js";
13
2
  import type { CatalogSkill } from "./catalog-install.js";
14
3
 
15
- const log = getLogger("skill-memory");
16
-
17
- /** Escape SQL LIKE wildcards so they match literally.
18
- * Uses backslash as the escape character — callers must pair with ESCAPE '\\'. */
19
- function escapeLike(s: string): string {
20
- return s.replace(/\\/g, "\\\\").replace(/%/g, "\\%").replace(/_/g, "\\_");
21
- }
22
-
23
4
  /**
24
5
  * Generic input for building capability statements.
25
6
  * Decoupled from CatalogSkill so other skill sources (e.g. bundled skills) can
@@ -61,276 +42,3 @@ export function fromCatalogSkill(entry: CatalogSkill): SkillCapabilityInput {
61
42
  };
62
43
  }
63
44
 
64
- /**
65
- * Build a semantically rich capability statement from a skill capability input.
66
- * Truncated to 500 chars max (matching the limit used by memory item extraction).
67
- */
68
- export function buildCapabilityStatement(input: SkillCapabilityInput): string {
69
- const { displayName, activationHints, avoidWhen } = input;
70
-
71
- let statement = `The "${displayName}" skill (${input.id}) is available. ${input.description}.`;
72
- if (activationHints && activationHints.length > 0) {
73
- statement += ` Use when: ${activationHints.join("; ")}.`;
74
- }
75
- if (avoidWhen && avoidWhen.length > 0) {
76
- statement += ` Avoid when: ${avoidWhen.join("; ")}.`;
77
- }
78
-
79
- // Truncate to 500 chars max
80
- if (statement.length > 500) {
81
- statement = statement.slice(0, 500);
82
- }
83
-
84
- return statement;
85
- }
86
-
87
- /** Default emotional charge for capability graph nodes. */
88
- const DEFAULT_EMOTIONAL_CHARGE = JSON.stringify({
89
- valence: 0,
90
- intensity: 0.1,
91
- decayCurve: "linear",
92
- decayRate: 0.05,
93
- originalIntensity: 0.1,
94
- });
95
-
96
- /**
97
- * Upsert a capability memory graph node for a skill.
98
- * Best-effort: errors are logged but never thrown.
99
- */
100
- export function upsertSkillCapabilityMemory(
101
- skillId: string,
102
- input: SkillCapabilityInput,
103
- ): void {
104
- try {
105
- const db = getDb();
106
- const statement = buildCapabilityStatement(input);
107
- const content = `skill:${skillId}\n${statement}`;
108
- const scopeId = "default";
109
- const now = Date.now();
110
-
111
- const existing = db
112
- .select()
113
- .from(memoryGraphNodes)
114
- .where(
115
- and(
116
- eq(memoryGraphNodes.type, "procedural"),
117
- sql`${memoryGraphNodes.content} LIKE ${'skill:' + escapeLike(skillId) + '\n%'} ESCAPE '\\'`,
118
- eq(memoryGraphNodes.scopeId, scopeId),
119
- ),
120
- )
121
- .get();
122
-
123
- if (existing) {
124
- if (
125
- existing.content === content &&
126
- existing.fidelity !== "gone"
127
- ) {
128
- // Same content — just touch lastAccessed
129
- db.update(memoryGraphNodes)
130
- .set({ lastAccessed: now })
131
- .where(eq(memoryGraphNodes.id, existing.id))
132
- .run();
133
- return;
134
- }
135
-
136
- if (existing.fidelity !== "gone") {
137
- // Content changed — update content
138
- db.update(memoryGraphNodes)
139
- .set({
140
- content,
141
- lastAccessed: now,
142
- })
143
- .where(eq(memoryGraphNodes.id, existing.id))
144
- .run();
145
- enqueueMemoryJob("embed_graph_node", { nodeId: existing.id });
146
- return;
147
- }
148
-
149
- // fidelity === "gone" — reactivate
150
- db.update(memoryGraphNodes)
151
- .set({
152
- fidelity: "vivid",
153
- content,
154
- created: now,
155
- lastAccessed: now,
156
- })
157
- .where(eq(memoryGraphNodes.id, existing.id))
158
- .run();
159
- enqueueMemoryJob("embed_graph_node", { nodeId: existing.id });
160
- log.info({ skillId, nodeId: existing.id }, "Reactivated skill capability memory");
161
- return;
162
- }
163
-
164
- // No existing — insert new graph node
165
- const id = uuid();
166
- db.insert(memoryGraphNodes)
167
- .values({
168
- id,
169
- content,
170
- type: "procedural",
171
- created: now,
172
- lastAccessed: now,
173
- lastConsolidated: now,
174
- emotionalCharge: DEFAULT_EMOTIONAL_CHARGE,
175
- fidelity: "vivid",
176
- confidence: 1.0,
177
- significance: 0.7,
178
- stability: 14,
179
- reinforcementCount: 0,
180
- lastReinforced: now,
181
- sourceConversations: JSON.stringify([]),
182
- sourceType: "inferred",
183
- narrativeRole: null,
184
- partOfStory: null,
185
- scopeId,
186
- })
187
- .run();
188
- enqueueMemoryJob("embed_graph_node", { nodeId: id });
189
- log.info({ skillId, nodeId: id }, "Created skill capability memory");
190
- } catch (err) {
191
- log.warn({ err, skillId }, "Failed to upsert skill capability memory");
192
- }
193
- }
194
-
195
- /**
196
- * Soft-delete the capability memory graph node for a skill.
197
- * Best-effort: errors are logged but never thrown.
198
- */
199
- export function deleteSkillCapabilityMemory(skillId: string): void {
200
- try {
201
- const db = getDb();
202
- const now = Date.now();
203
-
204
- const existing = db
205
- .select()
206
- .from(memoryGraphNodes)
207
- .where(
208
- and(
209
- eq(memoryGraphNodes.type, "procedural"),
210
- sql`${memoryGraphNodes.content} LIKE ${'skill:' + escapeLike(skillId) + '\n%'} ESCAPE '\\'`,
211
- eq(memoryGraphNodes.scopeId, "default"),
212
- sql`${memoryGraphNodes.fidelity} != 'gone'`,
213
- ),
214
- )
215
- .get();
216
-
217
- if (existing) {
218
- db.update(memoryGraphNodes)
219
- .set({ fidelity: "gone", lastAccessed: now })
220
- .where(eq(memoryGraphNodes.id, existing.id))
221
- .run();
222
- }
223
- } catch (err) {
224
- log.warn({ err, skillId }, "Failed to delete skill capability memory");
225
- }
226
- }
227
-
228
- /**
229
- * Seed capability memory graph nodes for all enabled skills (bundled, managed, workspace, extra).
230
- * Prunes stale entries whose skills are no longer in the enabled set.
231
- * Best-effort: errors are logged but never thrown.
232
- */
233
- export function seedCatalogSkillMemories(): void {
234
- try {
235
- const catalog = loadSkillCatalog();
236
- const config = getConfig();
237
- const resolved = resolveSkillStates(catalog, config);
238
- const enabled = resolved.filter((r) => r.state === "enabled");
239
-
240
- const catalogIds = new Set<string>();
241
- for (const { summary } of enabled) {
242
- catalogIds.add(summary.id);
243
- const input = fromSkillSummary(summary);
244
-
245
- // Enrich mcp-setup description with configured server names
246
- if (summary.id === "mcp-setup") {
247
- const servers = config.mcp?.servers;
248
- if (servers) {
249
- const names = Object.keys(servers).filter(
250
- (name) => servers[name]?.enabled !== false,
251
- );
252
- if (names.length > 0) {
253
- input.description += ` Configured: ${names.join(", ")}`;
254
- }
255
- }
256
- }
257
-
258
- upsertSkillCapabilityMemory(summary.id, input);
259
- }
260
-
261
- // Prune stale capability memories for skills no longer in the enabled set
262
- // and not available in the remote/local catalog.
263
- const db = getDb();
264
- const allCapabilities = db
265
- .select()
266
- .from(memoryGraphNodes)
267
- .where(
268
- and(
269
- eq(memoryGraphNodes.type, "procedural"),
270
- eq(memoryGraphNodes.scopeId, "default"),
271
- sql`${memoryGraphNodes.fidelity} != 'gone'`,
272
- ),
273
- )
274
- .all();
275
-
276
- const allLocalSkillIds = new Set(catalog.map((s) => s.id));
277
- const cachedCatalog = getCachedCatalogSync();
278
- const cachedCatalogIds = new Set(cachedCatalog.map((s) => s.id));
279
-
280
- const now = Date.now();
281
- for (const item of allCapabilities) {
282
- if (!item.content.startsWith("skill:")) continue;
283
- const itemSkillId = item.content.split("\n")[0].replace("skill:", "");
284
-
285
- // Keep enabled skills
286
- if (catalogIds.has(itemSkillId)) continue;
287
-
288
- // Keep uninstalled catalog skills that are still in the remote catalog
289
- if (cachedCatalogIds.has(itemSkillId)) continue;
290
-
291
- // If the catalog cache is empty (cold start, before async fetch),
292
- // we can't tell whether an unknown skill is a stale entry or
293
- // a valid uninstalled catalog skill. Only prune skills we can
294
- // positively identify as local-but-disabled.
295
- if (cachedCatalogIds.size === 0 && !allLocalSkillIds.has(itemSkillId)) continue;
296
-
297
- log.info({ skillId: itemSkillId, nodeId: item.id, catalogSize: catalogIds.size, cacheSize: cachedCatalogIds.size }, "Pruning stale skill capability memory");
298
- db.update(memoryGraphNodes)
299
- .set({ fidelity: "gone", lastAccessed: now })
300
- .where(eq(memoryGraphNodes.id, item.id))
301
- .run();
302
- }
303
- } catch (err) {
304
- log.warn({ err }, "Failed to seed catalog skill memories");
305
- }
306
- }
307
-
308
- /**
309
- * Seed capability memories for catalog skills that are not yet installed.
310
- * This makes uninstalled skills discoverable via memory injection so the LLM
311
- * can auto-install them via skill_load when relevant.
312
- * Best-effort: errors are logged but never thrown.
313
- */
314
- export async function seedUninstalledCatalogSkillMemories(): Promise<void> {
315
- try {
316
- const { getCatalog } = await import("./catalog-cache.js");
317
- const fullCatalog = await getCatalog();
318
- if (fullCatalog.length === 0) return;
319
-
320
- const installedCatalog = loadSkillCatalog();
321
- const installedIds = new Set(installedCatalog.map((s) => s.id));
322
-
323
- const config = getConfig();
324
- for (const entry of fullCatalog) {
325
- if (installedIds.has(entry.id)) continue;
326
-
327
- const flagKey = entry.metadata?.vellum?.["feature-flag"];
328
- if (flagKey && !isAssistantFeatureFlagEnabled(flagKey, config)) continue;
329
-
330
- const input = fromCatalogSkill(entry);
331
- upsertSkillCapabilityMemory(entry.id, input);
332
- }
333
- } catch (err) {
334
- log.warn({ err }, "Failed to seed uninstalled catalog skill memories");
335
- }
336
- }
@@ -1,6 +1,16 @@
1
- export { SubagentManager } from "./manager.js";
2
- export type { SubagentConfig, SubagentState, SubagentStatus } from "./types.js";
3
- export { SUBAGENT_LIMITS, TERMINAL_STATUSES } from "./types.js";
1
+ export { mergeSkillIds, SubagentManager } from "./manager.js";
2
+ export type {
3
+ SubagentConfig,
4
+ SubagentRole,
5
+ SubagentRoleConfig,
6
+ SubagentState,
7
+ SubagentStatus,
8
+ } from "./types.js";
9
+ export {
10
+ SUBAGENT_LIMITS,
11
+ SUBAGENT_ROLE_REGISTRY,
12
+ TERMINAL_STATUSES,
13
+ } from "./types.js";
4
14
 
5
15
  import { SubagentManager } from "./manager.js";
6
16