@vellumai/assistant 0.6.0 → 0.6.1

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 (285) 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 +32 -1
  6. package/docs/architecture/integrations.md +1 -1
  7. package/docs/architecture/memory.md +21 -24
  8. package/openapi.yaml +538 -3
  9. package/package.json +5 -1
  10. package/src/__tests__/anthropic-provider.test.ts +160 -95
  11. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  12. package/src/__tests__/app-executors.test.ts +47 -1
  13. package/src/__tests__/app-source-watcher.test.ts +159 -0
  14. package/src/__tests__/checker.test.ts +38 -6
  15. package/src/__tests__/config-schema.test.ts +5 -0
  16. package/src/__tests__/conversation-agent-loop-overflow.test.ts +4 -6
  17. package/src/__tests__/conversation-agent-loop.test.ts +4 -51
  18. package/src/__tests__/conversation-history-web-search.test.ts +1 -1
  19. package/src/__tests__/conversation-runtime-assembly.test.ts +653 -832
  20. package/src/__tests__/conversation-runtime-workspace.test.ts +1 -93
  21. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +17 -4
  22. package/src/__tests__/conversation-wipe.test.ts +2 -6
  23. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -12
  24. package/src/__tests__/conversation-workspace-injection.test.ts +25 -26
  25. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
  26. package/src/__tests__/copy-composer-tc-templates.test.ts +335 -0
  27. package/src/__tests__/date-context.test.ts +76 -210
  28. package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -1
  29. package/src/__tests__/file-list-tool.test.ts +219 -0
  30. package/src/__tests__/first-greeting.test.ts +1 -1
  31. package/src/__tests__/heartbeat-service.test.ts +180 -3
  32. package/src/__tests__/identity-routes.test.ts +328 -0
  33. package/src/__tests__/injection-block.test.ts +24 -0
  34. package/src/__tests__/install-skill-routing.test.ts +7 -6
  35. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +15 -14
  36. package/src/__tests__/list-messages-tool-merge.test.ts +300 -0
  37. package/src/__tests__/llm-context-normalization.test.ts +18 -18
  38. package/src/__tests__/llm-context-route-provider.test.ts +101 -0
  39. package/src/__tests__/llm-request-log-turn-query.test.ts +162 -0
  40. package/src/__tests__/log-export-workspace.test.ts +72 -105
  41. package/src/__tests__/mcp-abort-signal.test.ts +5 -0
  42. package/src/__tests__/mcp-client-auth.test.ts +5 -0
  43. package/src/__tests__/memory-recall-log-store.test.ts +132 -0
  44. package/src/__tests__/migration-export-streaming.test.ts +304 -0
  45. package/src/__tests__/migration-import-commit-http.test.ts +11 -10
  46. package/src/__tests__/mock-fetch.ts +87 -0
  47. package/src/__tests__/notification-decision-recipient-context.test.ts +282 -0
  48. package/src/__tests__/onboarding-template-contract.test.ts +62 -14
  49. package/src/__tests__/parser.test.ts +32 -0
  50. package/src/__tests__/permission-checker-host-gate.test.ts +452 -0
  51. package/src/__tests__/permission-controls-v2-flag.test.ts +55 -0
  52. package/src/__tests__/permission-mode-sse.test.ts +418 -0
  53. package/src/__tests__/permission-mode-store.test.ts +277 -0
  54. package/src/__tests__/permission-mode.test.ts +101 -0
  55. package/src/__tests__/platform-bash-auto-approve.test.ts +359 -0
  56. package/src/__tests__/profiler-routes.test.ts +502 -0
  57. package/src/__tests__/profiler-run-store.test.ts +441 -0
  58. package/src/__tests__/proxy-approval-callback.test.ts +4 -75
  59. package/src/__tests__/registry.test.ts +1 -1
  60. package/src/__tests__/sandbox-host-parity.test.ts +5 -4
  61. package/src/__tests__/scheduler-reuse-conversation.test.ts +368 -0
  62. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +278 -0
  63. package/src/__tests__/search-skills-unified.test.ts +4 -3
  64. package/src/__tests__/send-endpoint-busy.test.ts +42 -3
  65. package/src/__tests__/set-permission-mode.test.ts +274 -0
  66. package/src/__tests__/skill-load-feature-flag.test.ts +12 -0
  67. package/src/__tests__/skill-memory.test.ts +2 -783
  68. package/src/__tests__/strip-memory-injections.test.ts +187 -0
  69. package/src/__tests__/subagent-detail.test.ts +84 -0
  70. package/src/__tests__/subagent-disposal.test.ts +308 -0
  71. package/src/__tests__/subagent-manager-notify.test.ts +19 -10
  72. package/src/__tests__/subagent-notify-parent.test.ts +390 -0
  73. package/src/__tests__/subagent-role-registry.test.ts +108 -0
  74. package/src/__tests__/subagent-tool-filtering.test.ts +71 -0
  75. package/src/__tests__/subagent-tools.test.ts +464 -4
  76. package/src/__tests__/system-prompt-ask-mode.test.ts +139 -0
  77. package/src/__tests__/task-memory-cleanup.test.ts +12 -12
  78. package/src/__tests__/terminal-tools.test.ts +17 -27
  79. package/src/__tests__/test-preload.ts +4 -0
  80. package/src/__tests__/tool-executor.test.ts +4 -26
  81. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
  82. package/src/__tests__/top-level-renderer.test.ts +10 -13
  83. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +116 -2
  84. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +387 -0
  85. package/src/agent/loop.ts +6 -0
  86. package/src/approvals/guardian-request-resolvers.ts +24 -0
  87. package/src/avatar/traits-png-sync.ts +3 -3
  88. package/src/cli/__tests__/run-assistant-command.ts +29 -0
  89. package/src/cli/commands/__tests__/email-download.test.ts +245 -0
  90. package/src/cli/commands/__tests__/email-list.test.ts +192 -0
  91. package/src/cli/commands/__tests__/email-register.test.ts +186 -0
  92. package/src/cli/commands/__tests__/email-send.test.ts +291 -0
  93. package/src/cli/commands/__tests__/email-status.test.ts +181 -0
  94. package/src/cli/commands/__tests__/email-unregister.test.ts +139 -0
  95. package/src/cli/commands/__tests__/routes.test.ts +562 -0
  96. package/src/cli/commands/conversations.ts +1 -8
  97. package/src/cli/commands/email.ts +584 -835
  98. package/src/cli/commands/memory.ts +1 -34
  99. package/src/cli/commands/notifications.ts +7 -2
  100. package/src/cli/commands/oauth/connect.ts +14 -5
  101. package/src/cli/commands/routes.ts +396 -0
  102. package/src/cli/commands/skills.ts +130 -20
  103. package/src/cli/program.ts +2 -0
  104. package/src/cli.ts +1 -120
  105. package/src/config/bundled-skills/app-builder/SKILL.md +4 -1
  106. package/src/config/bundled-skills/gmail/SKILL.md +2 -2
  107. package/src/config/bundled-skills/messaging/SKILL.md +7 -0
  108. package/src/config/bundled-skills/schedule/SKILL.md +22 -2
  109. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  110. package/src/config/bundled-skills/settings/tools/avatar-get.ts +3 -13
  111. package/src/config/bundled-skills/settings/tools/avatar-remove.ts +2 -4
  112. package/src/config/bundled-skills/settings/tools/avatar-update.ts +5 -2
  113. package/src/config/bundled-skills/slack/SKILL.md +2 -0
  114. package/src/config/bundled-skills/subagent/SKILL.md +43 -3
  115. package/src/config/bundled-skills/subagent/TOOLS.json +29 -4
  116. package/src/config/env-registry.ts +63 -0
  117. package/src/config/feature-flag-registry.json +17 -1
  118. package/src/config/schema.ts +8 -0
  119. package/src/config/schemas/filing.ts +51 -0
  120. package/src/config/schemas/heartbeat.ts +15 -12
  121. package/src/config/schemas/memory-lifecycle.ts +12 -0
  122. package/src/config/schemas/security.ts +14 -0
  123. package/src/daemon/app-source-watcher.ts +93 -0
  124. package/src/daemon/config-watcher.ts +79 -1
  125. package/src/daemon/conversation-agent-loop-handlers.ts +20 -0
  126. package/src/daemon/conversation-agent-loop.ts +158 -65
  127. package/src/daemon/conversation-history.ts +4 -19
  128. package/src/daemon/conversation-lifecycle.ts +8 -14
  129. package/src/daemon/conversation-process.ts +13 -7
  130. package/src/daemon/conversation-runtime-assembly.ts +300 -306
  131. package/src/daemon/conversation-tool-setup.ts +44 -14
  132. package/src/daemon/conversation-workspace.ts +1 -2
  133. package/src/daemon/conversation.ts +18 -0
  134. package/src/daemon/date-context.ts +26 -53
  135. package/src/daemon/first-greeting.ts +1 -1
  136. package/src/daemon/handlers/conversations.ts +4 -7
  137. package/src/daemon/handlers/shared.test.ts +143 -0
  138. package/src/daemon/handlers/shared.ts +63 -5
  139. package/src/daemon/handlers/skills.ts +11 -18
  140. package/src/daemon/lifecycle.ts +199 -157
  141. package/src/daemon/message-types/conversations.ts +25 -6
  142. package/src/daemon/message-types/messages.ts +9 -1
  143. package/src/daemon/message-types/schedules.ts +1 -0
  144. package/src/daemon/message-types/settings.ts +6 -0
  145. package/src/daemon/profiler-run-store.ts +557 -0
  146. package/src/daemon/server.ts +89 -9
  147. package/src/daemon/shutdown-handlers.ts +5 -0
  148. package/src/daemon/tool-side-effects.ts +23 -3
  149. package/src/export/transcript-formatter.ts +148 -0
  150. package/src/filing/filing-service.ts +228 -0
  151. package/src/heartbeat/heartbeat-service.ts +96 -7
  152. package/src/mcp/client.ts +6 -0
  153. package/src/mcp/mcp-oauth-provider.ts +149 -27
  154. package/src/memory/admin.ts +33 -32
  155. package/src/memory/app-store.ts +69 -0
  156. package/src/memory/conversation-bootstrap.ts +1 -1
  157. package/src/memory/conversation-crud.ts +136 -107
  158. package/src/memory/conversation-group-migration.ts +1 -1
  159. package/src/memory/conversation-queries.ts +58 -12
  160. package/src/memory/conversation-title-service.ts +1 -0
  161. package/src/memory/db-init.ts +182 -376
  162. package/src/memory/graph/bootstrap.ts +75 -66
  163. package/src/memory/graph/capability-seed.ts +167 -15
  164. package/src/memory/graph/consolidation.ts +38 -4
  165. package/src/memory/graph/conversation-graph-memory.ts +133 -104
  166. package/src/memory/graph/extraction-job.ts +9 -4
  167. package/src/memory/graph/extraction.ts +66 -23
  168. package/src/memory/graph/graph-memory-state-store.ts +37 -0
  169. package/src/memory/graph/graph-search.ts +29 -15
  170. package/src/memory/graph/injection.ts +38 -8
  171. package/src/memory/graph/inspect.ts +12 -3
  172. package/src/memory/graph/retriever.ts +365 -262
  173. package/src/memory/graph/store.test.ts +48 -0
  174. package/src/memory/graph/store.ts +150 -11
  175. package/src/memory/graph/tool-handlers.ts +84 -209
  176. package/src/memory/graph/tools.ts +8 -52
  177. package/src/memory/graph/types.ts +24 -0
  178. package/src/memory/job-handlers/cleanup.ts +44 -1
  179. package/src/memory/jobs-store.ts +70 -60
  180. package/src/memory/jobs-worker.ts +44 -28
  181. package/src/memory/llm-request-log-store.ts +96 -12
  182. package/src/memory/memory-recall-log-store.ts +49 -5
  183. package/src/memory/migrations/203-drop-memory-items-tables.ts +33 -1
  184. package/src/memory/migrations/206-memory-graph-node-edits.ts +19 -0
  185. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +131 -0
  186. package/src/memory/migrations/207-conversation-graph-memory-state.ts +20 -0
  187. package/src/memory/migrations/208-conversations-last-message-at.ts +35 -0
  188. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +85 -0
  189. package/src/memory/migrations/210-schedule-reuse-conversation.ts +13 -0
  190. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +21 -0
  191. package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +19 -0
  192. package/src/memory/migrations/index.ts +8 -0
  193. package/src/memory/migrations/registry.ts +8 -0
  194. package/src/memory/schema/conversations.ts +14 -0
  195. package/src/memory/schema/infrastructure.ts +8 -1
  196. package/src/memory/schema/memory-core.ts +0 -51
  197. package/src/memory/schema/memory-graph.ts +15 -0
  198. package/src/memory/task-memory-cleanup.ts +30 -11
  199. package/src/notifications/copy-composer.ts +86 -0
  200. package/src/notifications/decision-engine.ts +35 -0
  201. package/src/permissions/checker.ts +12 -1
  202. package/src/permissions/permission-mode-store.ts +180 -0
  203. package/src/permissions/permission-mode.ts +31 -0
  204. package/src/permissions/workspace-policy.ts +9 -0
  205. package/src/prompts/system-prompt.ts +59 -7
  206. package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +100 -0
  207. package/src/prompts/templates/BOOTSTRAP.md +70 -165
  208. package/src/prompts/templates/HEARTBEAT.md +3 -1
  209. package/src/prompts/templates/SOUL.md +25 -4
  210. package/src/prompts/templates/UPDATES.md +8 -0
  211. package/src/providers/anthropic/client.ts +107 -219
  212. package/src/runtime/auth/route-policy.ts +23 -0
  213. package/src/runtime/http-server.ts +32 -2
  214. package/src/runtime/http-types.ts +12 -1
  215. package/src/runtime/migrations/vbundle-builder.ts +389 -3
  216. package/src/runtime/migrations/vbundle-importer.ts +8 -6
  217. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +378 -0
  218. package/src/runtime/routes/app-management-routes.ts +1 -11
  219. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +26 -0
  220. package/src/runtime/routes/archive-utils.ts +29 -0
  221. package/src/runtime/routes/avatar-routes.ts +2 -9
  222. package/src/runtime/routes/btw-routes.ts +14 -1
  223. package/src/runtime/routes/conversation-analysis-routes.ts +173 -0
  224. package/src/runtime/routes/conversation-management-routes.ts +1 -14
  225. package/src/runtime/routes/conversation-query-routes.ts +49 -3
  226. package/src/runtime/routes/conversation-routes.ts +264 -44
  227. package/src/runtime/routes/heartbeat-routes.ts +4 -10
  228. package/src/runtime/routes/identity-routes.ts +53 -18
  229. package/src/runtime/routes/llm-context-normalization.ts +14 -10
  230. package/src/runtime/routes/log-export-routes.ts +23 -275
  231. package/src/runtime/routes/memory-item-routes.test.ts +168 -233
  232. package/src/runtime/routes/migration-routes.ts +18 -7
  233. package/src/runtime/routes/profiler-routes.ts +350 -0
  234. package/src/runtime/routes/schedule-routes.ts +27 -12
  235. package/src/runtime/routes/settings-routes.ts +95 -8
  236. package/src/runtime/routes/subagents-routes.ts +28 -7
  237. package/src/runtime/routes/user-route-dispatcher.ts +223 -0
  238. package/src/runtime/routes/user-routes.ts +41 -0
  239. package/src/runtime/routes/workspace-routes.ts +0 -1
  240. package/src/schedule/schedule-store.ts +30 -0
  241. package/src/schedule/scheduler.ts +45 -18
  242. package/src/skills/catalog-install.ts +10 -2
  243. package/src/skills/managed-store.ts +2 -2
  244. package/src/skills/skill-memory.ts +1 -293
  245. package/src/subagent/index.ts +13 -3
  246. package/src/subagent/manager.ts +308 -29
  247. package/src/subagent/types.ts +68 -0
  248. package/src/tasks/task-runner.ts +4 -4
  249. package/src/tools/apps/executors.ts +29 -4
  250. package/src/tools/filesystem/list.ts +93 -0
  251. package/src/tools/permission-checker.ts +78 -0
  252. package/src/tools/registry.ts +4 -0
  253. package/src/tools/schedule/create.ts +3 -0
  254. package/src/tools/schedule/list.ts +1 -0
  255. package/src/tools/schedule/update.ts +6 -0
  256. package/src/tools/shared/filesystem/errors.ts +5 -0
  257. package/src/tools/shared/filesystem/file-ops-service.ts +90 -2
  258. package/src/tools/shared/filesystem/types.ts +17 -0
  259. package/src/tools/shared/shell-output.ts +31 -2
  260. package/src/tools/subagent/abort.ts +12 -2
  261. package/src/tools/subagent/message.ts +9 -2
  262. package/src/tools/subagent/notify-parent.ts +79 -0
  263. package/src/tools/subagent/read.ts +29 -8
  264. package/src/tools/subagent/resolve.ts +21 -0
  265. package/src/tools/subagent/spawn.ts +2 -0
  266. package/src/tools/subagent/status.ts +11 -1
  267. package/src/tools/system/avatar-generator.ts +3 -3
  268. package/src/tools/system/register.ts +23 -0
  269. package/src/tools/system/set-permission-mode.ts +103 -0
  270. package/src/tools/terminal/parser.ts +30 -5
  271. package/src/tools/terminal/safe-env.ts +16 -1
  272. package/src/tools/tool-manifest.ts +6 -0
  273. package/src/tools/types.ts +2 -0
  274. package/src/util/logger.ts +1 -1
  275. package/src/util/platform.ts +50 -17
  276. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +2 -2
  277. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +2 -2
  278. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +270 -0
  279. package/src/workspace/migrations/029-seed-pkb.ts +84 -0
  280. package/src/workspace/migrations/registry.ts +4 -0
  281. package/src/workspace/top-level-renderer.ts +5 -9
  282. package/src/__tests__/cli-memory.test.ts +0 -377
  283. package/src/__tests__/clipboard.test.ts +0 -88
  284. package/src/cli/cli-memory.ts +0 -179
  285. 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