@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.
- package/AGENTS.md +4 -0
- package/ARCHITECTURE.md +68 -15
- package/Dockerfile +2 -2
- package/bun.lock +6 -2
- package/docker-entrypoint.sh +32 -1
- package/docs/architecture/integrations.md +1 -1
- package/docs/architecture/memory.md +21 -24
- package/openapi.yaml +538 -3
- package/package.json +5 -1
- package/src/__tests__/anthropic-provider.test.ts +160 -95
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +47 -1
- package/src/__tests__/app-source-watcher.test.ts +159 -0
- package/src/__tests__/checker.test.ts +38 -6
- package/src/__tests__/config-schema.test.ts +5 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +4 -6
- package/src/__tests__/conversation-agent-loop.test.ts +4 -51
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +653 -832
- package/src/__tests__/conversation-runtime-workspace.test.ts +1 -93
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +17 -4
- package/src/__tests__/conversation-wipe.test.ts +2 -6
- package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -12
- package/src/__tests__/conversation-workspace-injection.test.ts +25 -26
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
- package/src/__tests__/copy-composer-tc-templates.test.ts +335 -0
- package/src/__tests__/date-context.test.ts +76 -210
- package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -1
- package/src/__tests__/file-list-tool.test.ts +219 -0
- package/src/__tests__/first-greeting.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +180 -3
- package/src/__tests__/identity-routes.test.ts +328 -0
- package/src/__tests__/injection-block.test.ts +24 -0
- package/src/__tests__/install-skill-routing.test.ts +7 -6
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +15 -14
- package/src/__tests__/list-messages-tool-merge.test.ts +300 -0
- package/src/__tests__/llm-context-normalization.test.ts +18 -18
- package/src/__tests__/llm-context-route-provider.test.ts +101 -0
- package/src/__tests__/llm-request-log-turn-query.test.ts +162 -0
- package/src/__tests__/log-export-workspace.test.ts +72 -105
- package/src/__tests__/mcp-abort-signal.test.ts +5 -0
- package/src/__tests__/mcp-client-auth.test.ts +5 -0
- package/src/__tests__/memory-recall-log-store.test.ts +132 -0
- package/src/__tests__/migration-export-streaming.test.ts +304 -0
- package/src/__tests__/migration-import-commit-http.test.ts +11 -10
- package/src/__tests__/mock-fetch.ts +87 -0
- package/src/__tests__/notification-decision-recipient-context.test.ts +282 -0
- package/src/__tests__/onboarding-template-contract.test.ts +62 -14
- package/src/__tests__/parser.test.ts +32 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +452 -0
- package/src/__tests__/permission-controls-v2-flag.test.ts +55 -0
- package/src/__tests__/permission-mode-sse.test.ts +418 -0
- package/src/__tests__/permission-mode-store.test.ts +277 -0
- package/src/__tests__/permission-mode.test.ts +101 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +359 -0
- package/src/__tests__/profiler-routes.test.ts +502 -0
- package/src/__tests__/profiler-run-store.test.ts +441 -0
- package/src/__tests__/proxy-approval-callback.test.ts +4 -75
- package/src/__tests__/registry.test.ts +1 -1
- package/src/__tests__/sandbox-host-parity.test.ts +5 -4
- package/src/__tests__/scheduler-reuse-conversation.test.ts +368 -0
- package/src/__tests__/scrub-corrupted-image-attachments.test.ts +278 -0
- package/src/__tests__/search-skills-unified.test.ts +4 -3
- package/src/__tests__/send-endpoint-busy.test.ts +42 -3
- package/src/__tests__/set-permission-mode.test.ts +274 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +12 -0
- package/src/__tests__/skill-memory.test.ts +2 -783
- package/src/__tests__/strip-memory-injections.test.ts +187 -0
- package/src/__tests__/subagent-detail.test.ts +84 -0
- package/src/__tests__/subagent-disposal.test.ts +308 -0
- package/src/__tests__/subagent-manager-notify.test.ts +19 -10
- package/src/__tests__/subagent-notify-parent.test.ts +390 -0
- package/src/__tests__/subagent-role-registry.test.ts +108 -0
- package/src/__tests__/subagent-tool-filtering.test.ts +71 -0
- package/src/__tests__/subagent-tools.test.ts +464 -4
- package/src/__tests__/system-prompt-ask-mode.test.ts +139 -0
- package/src/__tests__/task-memory-cleanup.test.ts +12 -12
- package/src/__tests__/terminal-tools.test.ts +17 -27
- package/src/__tests__/test-preload.ts +4 -0
- package/src/__tests__/tool-executor.test.ts +4 -26
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/top-level-renderer.test.ts +10 -13
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +116 -2
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +387 -0
- package/src/agent/loop.ts +6 -0
- package/src/approvals/guardian-request-resolvers.ts +24 -0
- package/src/avatar/traits-png-sync.ts +3 -3
- package/src/cli/__tests__/run-assistant-command.ts +29 -0
- package/src/cli/commands/__tests__/email-download.test.ts +245 -0
- package/src/cli/commands/__tests__/email-list.test.ts +192 -0
- package/src/cli/commands/__tests__/email-register.test.ts +186 -0
- package/src/cli/commands/__tests__/email-send.test.ts +291 -0
- package/src/cli/commands/__tests__/email-status.test.ts +181 -0
- package/src/cli/commands/__tests__/email-unregister.test.ts +139 -0
- package/src/cli/commands/__tests__/routes.test.ts +562 -0
- package/src/cli/commands/conversations.ts +1 -8
- package/src/cli/commands/email.ts +584 -835
- package/src/cli/commands/memory.ts +1 -34
- package/src/cli/commands/notifications.ts +7 -2
- package/src/cli/commands/oauth/connect.ts +14 -5
- package/src/cli/commands/routes.ts +396 -0
- package/src/cli/commands/skills.ts +130 -20
- package/src/cli/program.ts +2 -0
- package/src/cli.ts +1 -120
- package/src/config/bundled-skills/app-builder/SKILL.md +4 -1
- package/src/config/bundled-skills/gmail/SKILL.md +2 -2
- package/src/config/bundled-skills/messaging/SKILL.md +7 -0
- package/src/config/bundled-skills/schedule/SKILL.md +22 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
- package/src/config/bundled-skills/settings/tools/avatar-get.ts +3 -13
- package/src/config/bundled-skills/settings/tools/avatar-remove.ts +2 -4
- package/src/config/bundled-skills/settings/tools/avatar-update.ts +5 -2
- package/src/config/bundled-skills/slack/SKILL.md +2 -0
- package/src/config/bundled-skills/subagent/SKILL.md +43 -3
- package/src/config/bundled-skills/subagent/TOOLS.json +29 -4
- package/src/config/env-registry.ts +63 -0
- package/src/config/feature-flag-registry.json +17 -1
- package/src/config/schema.ts +8 -0
- package/src/config/schemas/filing.ts +51 -0
- package/src/config/schemas/heartbeat.ts +15 -12
- package/src/config/schemas/memory-lifecycle.ts +12 -0
- package/src/config/schemas/security.ts +14 -0
- package/src/daemon/app-source-watcher.ts +93 -0
- package/src/daemon/config-watcher.ts +79 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +20 -0
- package/src/daemon/conversation-agent-loop.ts +158 -65
- package/src/daemon/conversation-history.ts +4 -19
- package/src/daemon/conversation-lifecycle.ts +8 -14
- package/src/daemon/conversation-process.ts +13 -7
- package/src/daemon/conversation-runtime-assembly.ts +300 -306
- package/src/daemon/conversation-tool-setup.ts +44 -14
- package/src/daemon/conversation-workspace.ts +1 -2
- package/src/daemon/conversation.ts +18 -0
- package/src/daemon/date-context.ts +26 -53
- package/src/daemon/first-greeting.ts +1 -1
- package/src/daemon/handlers/conversations.ts +4 -7
- package/src/daemon/handlers/shared.test.ts +143 -0
- package/src/daemon/handlers/shared.ts +63 -5
- package/src/daemon/handlers/skills.ts +11 -18
- package/src/daemon/lifecycle.ts +199 -157
- package/src/daemon/message-types/conversations.ts +25 -6
- package/src/daemon/message-types/messages.ts +9 -1
- package/src/daemon/message-types/schedules.ts +1 -0
- package/src/daemon/message-types/settings.ts +6 -0
- package/src/daemon/profiler-run-store.ts +557 -0
- package/src/daemon/server.ts +89 -9
- package/src/daemon/shutdown-handlers.ts +5 -0
- package/src/daemon/tool-side-effects.ts +23 -3
- package/src/export/transcript-formatter.ts +148 -0
- package/src/filing/filing-service.ts +228 -0
- package/src/heartbeat/heartbeat-service.ts +96 -7
- package/src/mcp/client.ts +6 -0
- package/src/mcp/mcp-oauth-provider.ts +149 -27
- package/src/memory/admin.ts +33 -32
- package/src/memory/app-store.ts +69 -0
- package/src/memory/conversation-bootstrap.ts +1 -1
- package/src/memory/conversation-crud.ts +136 -107
- package/src/memory/conversation-group-migration.ts +1 -1
- package/src/memory/conversation-queries.ts +58 -12
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/db-init.ts +182 -376
- package/src/memory/graph/bootstrap.ts +75 -66
- package/src/memory/graph/capability-seed.ts +167 -15
- package/src/memory/graph/consolidation.ts +38 -4
- package/src/memory/graph/conversation-graph-memory.ts +133 -104
- package/src/memory/graph/extraction-job.ts +9 -4
- package/src/memory/graph/extraction.ts +66 -23
- package/src/memory/graph/graph-memory-state-store.ts +37 -0
- package/src/memory/graph/graph-search.ts +29 -15
- package/src/memory/graph/injection.ts +38 -8
- package/src/memory/graph/inspect.ts +12 -3
- package/src/memory/graph/retriever.ts +365 -262
- package/src/memory/graph/store.test.ts +48 -0
- package/src/memory/graph/store.ts +150 -11
- package/src/memory/graph/tool-handlers.ts +84 -209
- package/src/memory/graph/tools.ts +8 -52
- package/src/memory/graph/types.ts +24 -0
- package/src/memory/job-handlers/cleanup.ts +44 -1
- package/src/memory/jobs-store.ts +70 -60
- package/src/memory/jobs-worker.ts +44 -28
- package/src/memory/llm-request-log-store.ts +96 -12
- package/src/memory/memory-recall-log-store.ts +49 -5
- package/src/memory/migrations/203-drop-memory-items-tables.ts +33 -1
- package/src/memory/migrations/206-memory-graph-node-edits.ts +19 -0
- package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +131 -0
- package/src/memory/migrations/207-conversation-graph-memory-state.ts +20 -0
- package/src/memory/migrations/208-conversations-last-message-at.ts +35 -0
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +85 -0
- package/src/memory/migrations/210-schedule-reuse-conversation.ts +13 -0
- package/src/memory/migrations/211-memory-recall-logs-query-context.ts +21 -0
- package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +19 -0
- package/src/memory/migrations/index.ts +8 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/schema/conversations.ts +14 -0
- package/src/memory/schema/infrastructure.ts +8 -1
- package/src/memory/schema/memory-core.ts +0 -51
- package/src/memory/schema/memory-graph.ts +15 -0
- package/src/memory/task-memory-cleanup.ts +30 -11
- package/src/notifications/copy-composer.ts +86 -0
- package/src/notifications/decision-engine.ts +35 -0
- package/src/permissions/checker.ts +12 -1
- package/src/permissions/permission-mode-store.ts +180 -0
- package/src/permissions/permission-mode.ts +31 -0
- package/src/permissions/workspace-policy.ts +9 -0
- package/src/prompts/system-prompt.ts +59 -7
- package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +100 -0
- package/src/prompts/templates/BOOTSTRAP.md +70 -165
- package/src/prompts/templates/HEARTBEAT.md +3 -1
- package/src/prompts/templates/SOUL.md +25 -4
- package/src/prompts/templates/UPDATES.md +8 -0
- package/src/providers/anthropic/client.ts +107 -219
- package/src/runtime/auth/route-policy.ts +23 -0
- package/src/runtime/http-server.ts +32 -2
- package/src/runtime/http-types.ts +12 -1
- package/src/runtime/migrations/vbundle-builder.ts +389 -3
- package/src/runtime/migrations/vbundle-importer.ts +8 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +378 -0
- package/src/runtime/routes/app-management-routes.ts +1 -11
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +26 -0
- package/src/runtime/routes/archive-utils.ts +29 -0
- package/src/runtime/routes/avatar-routes.ts +2 -9
- package/src/runtime/routes/btw-routes.ts +14 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +173 -0
- package/src/runtime/routes/conversation-management-routes.ts +1 -14
- package/src/runtime/routes/conversation-query-routes.ts +49 -3
- package/src/runtime/routes/conversation-routes.ts +264 -44
- package/src/runtime/routes/heartbeat-routes.ts +4 -10
- package/src/runtime/routes/identity-routes.ts +53 -18
- package/src/runtime/routes/llm-context-normalization.ts +14 -10
- package/src/runtime/routes/log-export-routes.ts +23 -275
- package/src/runtime/routes/memory-item-routes.test.ts +168 -233
- package/src/runtime/routes/migration-routes.ts +18 -7
- package/src/runtime/routes/profiler-routes.ts +350 -0
- package/src/runtime/routes/schedule-routes.ts +27 -12
- package/src/runtime/routes/settings-routes.ts +95 -8
- package/src/runtime/routes/subagents-routes.ts +28 -7
- package/src/runtime/routes/user-route-dispatcher.ts +223 -0
- package/src/runtime/routes/user-routes.ts +41 -0
- package/src/runtime/routes/workspace-routes.ts +0 -1
- package/src/schedule/schedule-store.ts +30 -0
- package/src/schedule/scheduler.ts +45 -18
- package/src/skills/catalog-install.ts +10 -2
- package/src/skills/managed-store.ts +2 -2
- package/src/skills/skill-memory.ts +1 -293
- package/src/subagent/index.ts +13 -3
- package/src/subagent/manager.ts +308 -29
- package/src/subagent/types.ts +68 -0
- package/src/tasks/task-runner.ts +4 -4
- package/src/tools/apps/executors.ts +29 -4
- package/src/tools/filesystem/list.ts +93 -0
- package/src/tools/permission-checker.ts +78 -0
- package/src/tools/registry.ts +4 -0
- package/src/tools/schedule/create.ts +3 -0
- package/src/tools/schedule/list.ts +1 -0
- package/src/tools/schedule/update.ts +6 -0
- package/src/tools/shared/filesystem/errors.ts +5 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +90 -2
- package/src/tools/shared/filesystem/types.ts +17 -0
- package/src/tools/shared/shell-output.ts +31 -2
- package/src/tools/subagent/abort.ts +12 -2
- package/src/tools/subagent/message.ts +9 -2
- package/src/tools/subagent/notify-parent.ts +79 -0
- package/src/tools/subagent/read.ts +29 -8
- package/src/tools/subagent/resolve.ts +21 -0
- package/src/tools/subagent/spawn.ts +2 -0
- package/src/tools/subagent/status.ts +11 -1
- package/src/tools/system/avatar-generator.ts +3 -3
- package/src/tools/system/register.ts +23 -0
- package/src/tools/system/set-permission-mode.ts +103 -0
- package/src/tools/terminal/parser.ts +30 -5
- package/src/tools/terminal/safe-env.ts +16 -1
- package/src/tools/tool-manifest.ts +6 -0
- package/src/tools/types.ts +2 -0
- package/src/util/logger.ts +1 -1
- package/src/util/platform.ts +50 -17
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +2 -2
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +2 -2
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +270 -0
- package/src/workspace/migrations/029-seed-pkb.ts +84 -0
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/workspace/top-level-renderer.ts +5 -9
- package/src/__tests__/cli-memory.test.ts +0 -377
- package/src/__tests__/clipboard.test.ts +0 -88
- package/src/cli/cli-memory.ts +0 -179
- package/src/util/clipboard.ts +0 -34
|
@@ -1,25 +1,6 @@
|
|
|
1
|
-
import {
|
|
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
|
-
}
|
package/src/subagent/index.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
|
-
export { SubagentManager } from "./manager.js";
|
|
2
|
-
export type {
|
|
3
|
-
|
|
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
|
|