@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.
- package/AGENTS.md +4 -0
- package/ARCHITECTURE.md +68 -15
- package/Dockerfile +2 -2
- package/bun.lock +6 -2
- package/docker-entrypoint.sh +42 -1
- package/docs/architecture/integrations.md +1 -1
- package/docs/architecture/memory.md +21 -24
- package/node_modules/@vellumai/ces-contracts/src/handles.ts +7 -9
- package/openapi.yaml +539 -4
- 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__/assistant-event-hub.test.ts +30 -0
- package/src/__tests__/checker.test.ts +138 -172
- package/src/__tests__/cli-command-risk-guard.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +5 -0
- package/src/__tests__/context-overflow-approval.test.ts +5 -5
- 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-analysis-routes.test.ts +169 -0
- package/src/__tests__/conversation-directories-parse.test.ts +105 -0
- 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__/credential-execution-approval-bridge.test.ts +0 -2
- 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__/init-feature-flag-overrides.test.ts +167 -0
- package/src/__tests__/injection-block.test.ts +24 -0
- package/src/__tests__/inline-command-runner.test.ts +7 -5
- 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 +257 -100
- package/src/__tests__/managed-credential-catalog-cli.test.ts +12 -14
- 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__/navigate-settings-tab.test.ts +14 -1
- package/src/__tests__/notification-broadcaster.test.ts +65 -0
- package/src/__tests__/notification-decision-recipient-context.test.ts +282 -0
- package/src/__tests__/onboarding-template-contract.test.ts +63 -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__/pkb-autoinject.test.ts +96 -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__/require-fresh-approval.test.ts +0 -2
- package/src/__tests__/sandbox-diagnostics.test.ts +1 -32
- 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-sandbox.test.ts +1 -1
- package/src/__tests__/terminal-tools.test.ts +16 -29
- package/src/__tests__/test-preload.ts +18 -0
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -8
- package/src/__tests__/tool-executor.test.ts +4 -27
- 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__/transport-hints-queue.test.ts +77 -0
- package/src/__tests__/trust-store.test.ts +4 -4
- 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/__tests__/workspace-migration-030-seed-pkb-autoinject.test.ts +168 -0
- package/src/__tests__/workspace-policy.test.ts +2 -7
- package/src/agent/loop.ts +6 -29
- package/src/approvals/guardian-request-resolvers.ts +24 -0
- package/src/avatar/traits-png-sync.ts +3 -3
- package/src/channels/types.ts +5 -0
- package/src/cli/__tests__/run-assistant-command.ts +56 -0
- package/src/cli/__tests__/unknown-command.test.ts +33 -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/default-action.ts +68 -1
- 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/__tests__/connect.test.ts +27 -0
- package/src/cli/commands/oauth/connect.ts +25 -5
- package/src/cli/commands/platform/__tests__/connect.test.ts +1 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +1 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +1 -1
- package/src/cli/commands/routes.ts +396 -0
- package/src/cli/commands/skills.ts +130 -20
- package/src/cli/program.ts +11 -2
- package/src/cli.ts +1 -120
- package/src/config/assistant-feature-flags.ts +59 -55
- package/src/config/bundled-skills/app-builder/SKILL.md +91 -5
- package/src/config/bundled-skills/gmail/SKILL.md +13 -8
- package/src/config/bundled-skills/gmail/TOOLS.json +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +2 -1
- 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.json +1 -1
- 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/settings/tools/navigate-settings-tab.ts +8 -3
- 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/config/schemas/services.ts +8 -0
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/managed-catalog.ts +3 -7
- package/src/daemon/app-source-watcher.ts +93 -0
- package/src/daemon/config-watcher.ts +85 -3
- package/src/daemon/context-overflow-approval.ts +0 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +20 -0
- package/src/daemon/conversation-agent-loop.ts +179 -65
- package/src/daemon/conversation-attachments.ts +0 -1
- package/src/daemon/conversation-history.ts +4 -19
- package/src/daemon/conversation-lifecycle.ts +8 -14
- package/src/daemon/conversation-messaging.ts +3 -0
- package/src/daemon/conversation-process.ts +30 -8
- package/src/daemon/conversation-queue-manager.ts +8 -0
- package/src/daemon/conversation-runtime-assembly.ts +359 -308
- package/src/daemon/conversation-surfaces.ts +65 -0
- package/src/daemon/conversation-tool-setup.ts +44 -17
- package/src/daemon/conversation-workspace.ts +1 -2
- package/src/daemon/conversation.ts +19 -3
- package/src/daemon/date-context.ts +26 -53
- package/src/daemon/first-greeting.ts +1 -1
- package/src/daemon/handlers/conversations.ts +5 -7
- package/src/daemon/handlers/shared.test.ts +143 -0
- package/src/daemon/handlers/shared.ts +70 -5
- package/src/daemon/handlers/skills.ts +11 -18
- package/src/daemon/lifecycle.ts +220 -158
- package/src/daemon/message-types/conversations.ts +29 -6
- package/src/daemon/message-types/messages.ts +9 -2
- package/src/daemon/message-types/notifications.ts +12 -0
- package/src/daemon/message-types/schedules.ts +1 -0
- package/src/daemon/message-types/settings.ts +18 -0
- package/src/daemon/profiler-run-store.ts +557 -0
- package/src/daemon/server.ts +87 -10
- package/src/daemon/shutdown-handlers.ts +5 -0
- package/src/daemon/tool-side-effects.ts +23 -3
- package/src/daemon/transport-hints.ts +33 -0
- 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/index.ts +1 -1
- 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 +151 -117
- package/src/memory/conversation-directories.ts +39 -0
- package/src/memory/conversation-group-migration.ts +66 -6
- 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/embedding-local.ts +1 -1
- package/src/memory/graph/bootstrap.ts +75 -66
- package/src/memory/graph/capability-seed.ts +167 -17
- 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/group-crud.ts +25 -9
- 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/messaging/provider.ts +1 -1
- package/src/notifications/broadcaster.ts +6 -0
- package/src/notifications/conversation-pairing.ts +12 -4
- package/src/notifications/copy-composer.ts +86 -0
- package/src/notifications/decision-engine.ts +35 -0
- package/src/notifications/emit-signal.ts +14 -0
- package/src/notifications/signal.ts +11 -0
- package/src/oauth/platform-connection.test.ts +2 -2
- package/src/oauth/seed-providers.ts +1 -0
- package/src/permissions/checker.ts +15 -4
- package/src/permissions/defaults.ts +7 -8
- package/src/permissions/permission-mode-store.ts +180 -0
- package/src/permissions/permission-mode.ts +31 -0
- package/src/permissions/prompter.ts +0 -2
- package/src/permissions/workspace-policy.ts +9 -0
- package/src/platform/client.ts +1 -1
- package/src/prompts/system-prompt.ts +59 -7
- package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +100 -0
- package/src/prompts/templates/BOOTSTRAP.md +76 -162
- package/src/prompts/templates/HEARTBEAT.md +3 -1
- package/src/prompts/templates/SOUL.md +30 -9
- package/src/prompts/templates/UPDATES.md +8 -0
- package/src/providers/anthropic/client.ts +107 -219
- package/src/runtime/assistant-event-hub.ts +22 -0
- package/src/runtime/auth/route-policy.ts +23 -0
- package/src/runtime/auth/token-service.ts +8 -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 +185 -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 +270 -44
- package/src/runtime/routes/group-routes.ts +22 -8
- 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/AGENTS.md +104 -0
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +103 -0
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +716 -0
- package/src/runtime/routes/log-export/workspace-allowlist.ts +458 -0
- package/src/runtime/routes/log-export-routes.ts +41 -278
- 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/inline-command-runner.ts +12 -14
- 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 -18
- 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/secret-detection-handler.ts +0 -1
- 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/skills/sandbox-runner.ts +3 -6
- 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/terminal/sandbox-diagnostics.ts +4 -4
- package/src/tools/terminal/sandbox.ts +4 -1
- package/src/tools/terminal/shell.ts +3 -5
- package/src/tools/tool-manifest.ts +6 -0
- package/src/tools/types.ts +2 -3
- package/src/util/logger.ts +1 -1
- package/src/util/platform.ts +50 -17
- package/src/watcher/provider-types.ts +1 -1
- 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 +85 -0
- package/src/workspace/migrations/030-seed-pkb-autoinject.ts +73 -0
- package/src/workspace/migrations/registry.ts +6 -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
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route handler for conversation analysis.
|
|
3
|
+
*
|
|
4
|
+
* POST /v1/conversations/:id/analyze — analyze a conversation via a new
|
|
5
|
+
* agent loop that produces a structured self-assessment.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ServerMessage } from "../../daemon/message-protocol.js";
|
|
9
|
+
import {
|
|
10
|
+
addMessage,
|
|
11
|
+
createConversation,
|
|
12
|
+
getConversation,
|
|
13
|
+
getMessages,
|
|
14
|
+
} from "../../memory/conversation-crud.js";
|
|
15
|
+
import { resolveConversationId } from "../../memory/conversation-key-store.js";
|
|
16
|
+
import { getLogger } from "../../util/logger.js";
|
|
17
|
+
import { buildAssistantEvent } from "../assistant-event.js";
|
|
18
|
+
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
19
|
+
import { httpError } from "../http-errors.js";
|
|
20
|
+
import type { RouteDefinition } from "../http-router.js";
|
|
21
|
+
import type { SendMessageDeps } from "../http-types.js";
|
|
22
|
+
|
|
23
|
+
const log = getLogger("conversation-analysis-routes");
|
|
24
|
+
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Dependency types — injected by the daemon at wiring time
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
|
|
29
|
+
export interface ConversationAnalysisDeps {
|
|
30
|
+
sendMessageDeps: SendMessageDeps;
|
|
31
|
+
buildConversationDetailResponse: (
|
|
32
|
+
id: string,
|
|
33
|
+
) => Record<string, unknown> | null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Route definitions
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
|
|
40
|
+
export function conversationAnalysisRouteDefinitions(
|
|
41
|
+
deps: ConversationAnalysisDeps,
|
|
42
|
+
): RouteDefinition[] {
|
|
43
|
+
return [
|
|
44
|
+
{
|
|
45
|
+
endpoint: "conversations/:id/analyze",
|
|
46
|
+
method: "POST",
|
|
47
|
+
policyKey: "conversations/analyze",
|
|
48
|
+
summary: "Analyze a conversation",
|
|
49
|
+
description:
|
|
50
|
+
"Create a new conversation with a structured self-assessment of an existing conversation.",
|
|
51
|
+
tags: ["conversations"],
|
|
52
|
+
handler: async ({ params }) => {
|
|
53
|
+
// a. Resolve conversation ID
|
|
54
|
+
const resolvedId = resolveConversationId(params.id);
|
|
55
|
+
if (!resolvedId) {
|
|
56
|
+
return httpError(
|
|
57
|
+
"NOT_FOUND",
|
|
58
|
+
`Conversation ${params.id} not found`,
|
|
59
|
+
404,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// b. Load the conversation
|
|
64
|
+
const conversation = getConversation(resolvedId);
|
|
65
|
+
if (!conversation) {
|
|
66
|
+
return httpError(
|
|
67
|
+
"NOT_FOUND",
|
|
68
|
+
`Conversation ${resolvedId} not found`,
|
|
69
|
+
404,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// c. Reject private conversations
|
|
74
|
+
if (conversation.conversationType === "private") {
|
|
75
|
+
return httpError(
|
|
76
|
+
"FORBIDDEN",
|
|
77
|
+
"Private conversations cannot be analyzed",
|
|
78
|
+
403,
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// d. Check for messages
|
|
83
|
+
const existingMessages = getMessages(resolvedId);
|
|
84
|
+
if (existingMessages.length === 0) {
|
|
85
|
+
return httpError(
|
|
86
|
+
"BAD_REQUEST",
|
|
87
|
+
"Conversation has no messages to analyze",
|
|
88
|
+
400,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// e. Build the analysis transcript
|
|
93
|
+
const { buildAnalysisTranscript } =
|
|
94
|
+
await import("../../export/transcript-formatter.js");
|
|
95
|
+
const transcript = buildAnalysisTranscript(resolvedId);
|
|
96
|
+
|
|
97
|
+
// f. Create a new conversation for the analysis
|
|
98
|
+
const newConv = createConversation({
|
|
99
|
+
title: `Analysis: ${conversation.title ?? "Untitled"}`,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// g. Build the analysis prompt
|
|
103
|
+
const prompt = `<transcript>
|
|
104
|
+
${transcript}
|
|
105
|
+
</transcript>
|
|
106
|
+
|
|
107
|
+
Analyze the conversation above. Provide a structured self-assessment:
|
|
108
|
+
|
|
109
|
+
1. **Summary**: What was the user trying to accomplish? What was the outcome?
|
|
110
|
+
2. **What went well**: Effective tool usage, good reasoning, helpful responses, problem-solving patterns.
|
|
111
|
+
3. **What went wrong**: Errors, unnecessary tool calls, incorrect assumptions, wasted turns, misunderstandings.
|
|
112
|
+
4. **Root causes**: Why did failures happen? Missing context? Wrong approach? Tool limitations?
|
|
113
|
+
5. **Recommendations**: Specific, actionable improvements for similar conversations next time.
|
|
114
|
+
|
|
115
|
+
Be honest and specific. Reference particular moments in the transcript. Focus on patterns that generalize beyond this specific conversation.
|
|
116
|
+
|
|
117
|
+
Do not use tools during analysis. If you identify insights worth remembering for future conversations, include them in the response as explicit memory candidates instead of saving them directly.`;
|
|
118
|
+
|
|
119
|
+
// h. Persist the user message
|
|
120
|
+
const message = await addMessage(
|
|
121
|
+
newConv.id,
|
|
122
|
+
"user",
|
|
123
|
+
JSON.stringify([{ type: "text", text: prompt }]),
|
|
124
|
+
{ provenanceTrustClass: "unknown" as const },
|
|
125
|
+
);
|
|
126
|
+
const messageId = message.id;
|
|
127
|
+
|
|
128
|
+
// i. Load the conversation into memory with untrusted analysis context
|
|
129
|
+
const analysisConversation =
|
|
130
|
+
await deps.sendMessageDeps.getOrCreateConversation(newConv.id);
|
|
131
|
+
analysisConversation.setTrustContext({
|
|
132
|
+
trustClass: "unknown",
|
|
133
|
+
sourceChannel: "vellum",
|
|
134
|
+
});
|
|
135
|
+
await analysisConversation.ensureActorScopedHistory();
|
|
136
|
+
// Analysis runs over attacker-influenced transcript content, so do not
|
|
137
|
+
// expose any tools, even when a live client is available.
|
|
138
|
+
analysisConversation.setSubagentAllowedTools(new Set<string>());
|
|
139
|
+
|
|
140
|
+
const hasLiveSubscriber =
|
|
141
|
+
deps.sendMessageDeps.assistantEventHub.hasSubscribersForEvent({
|
|
142
|
+
assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
|
|
143
|
+
conversationId: newConv.id,
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// j. Build onEvent using inline hub publisher
|
|
147
|
+
const onEvent = (msg: ServerMessage) => {
|
|
148
|
+
deps.sendMessageDeps.assistantEventHub.publish(
|
|
149
|
+
buildAssistantEvent(DAEMON_INTERNAL_ASSISTANT_ID, msg, newConv.id),
|
|
150
|
+
);
|
|
151
|
+
};
|
|
152
|
+
analysisConversation.updateClient(onEvent, !hasLiveSubscriber);
|
|
153
|
+
|
|
154
|
+
// k. Set up processing state (required by runAgentLoop guard)
|
|
155
|
+
analysisConversation.processing = true;
|
|
156
|
+
analysisConversation.abortController = new AbortController();
|
|
157
|
+
analysisConversation.currentRequestId = crypto.randomUUID();
|
|
158
|
+
|
|
159
|
+
// l. Fire-and-forget the agent loop
|
|
160
|
+
analysisConversation
|
|
161
|
+
.runAgentLoop(prompt, messageId, onEvent, {
|
|
162
|
+
isInteractive: hasLiveSubscriber,
|
|
163
|
+
isUserMessage: true,
|
|
164
|
+
})
|
|
165
|
+
.catch((err) => {
|
|
166
|
+
log.error(
|
|
167
|
+
{ err, conversationId: newConv.id },
|
|
168
|
+
"Analysis agent loop failed",
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// m. Return the new conversation detail
|
|
173
|
+
const detail = deps.buildConversationDetailResponse(newConv.id);
|
|
174
|
+
if (!detail) {
|
|
175
|
+
return httpError(
|
|
176
|
+
"INTERNAL_ERROR",
|
|
177
|
+
`Analysis conversation ${newConv.id} could not be loaded`,
|
|
178
|
+
500,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
return Response.json(detail);
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
];
|
|
185
|
+
}
|
|
@@ -344,12 +344,6 @@ export function conversationManagementRouteDefinitions(
|
|
|
344
344
|
targetId: segId,
|
|
345
345
|
});
|
|
346
346
|
}
|
|
347
|
-
for (const itemId of result.orphanedItemIds) {
|
|
348
|
-
enqueueMemoryJob("delete_qdrant_vectors", {
|
|
349
|
-
targetType: "item",
|
|
350
|
-
targetId: itemId,
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
347
|
for (const summaryId of result.deletedSummaryIds) {
|
|
354
348
|
enqueueMemoryJob("delete_qdrant_vectors", {
|
|
355
349
|
targetType: "summary",
|
|
@@ -359,7 +353,6 @@ export function conversationManagementRouteDefinitions(
|
|
|
359
353
|
log.info(
|
|
360
354
|
{
|
|
361
355
|
conversationId: resolvedId,
|
|
362
|
-
unsuperseded: result.unsupersededItemIds.length,
|
|
363
356
|
summariesDeleted: result.deletedSummaryIds.length,
|
|
364
357
|
jobsCancelled: result.cancelledJobCount,
|
|
365
358
|
},
|
|
@@ -367,7 +360,7 @@ export function conversationManagementRouteDefinitions(
|
|
|
367
360
|
);
|
|
368
361
|
return Response.json({
|
|
369
362
|
wiped: true,
|
|
370
|
-
unsupersededItems:
|
|
363
|
+
unsupersededItems: 0,
|
|
371
364
|
deletedSummaries: result.deletedSummaryIds.length,
|
|
372
365
|
cancelledJobs: result.cancelledJobCount,
|
|
373
366
|
});
|
|
@@ -417,12 +410,6 @@ export function conversationManagementRouteDefinitions(
|
|
|
417
410
|
targetId: segId,
|
|
418
411
|
});
|
|
419
412
|
}
|
|
420
|
-
for (const itemId of deleted.orphanedItemIds) {
|
|
421
|
-
enqueueMemoryJob("delete_qdrant_vectors", {
|
|
422
|
-
targetType: "item",
|
|
423
|
-
targetId: itemId,
|
|
424
|
-
});
|
|
425
|
-
}
|
|
426
413
|
for (const summaryId of deleted.deletedSummaryIds) {
|
|
427
414
|
enqueueMemoryJob("delete_qdrant_vectors", {
|
|
428
415
|
targetType: "summary",
|
|
@@ -43,7 +43,10 @@ import {
|
|
|
43
43
|
} from "../../daemon/handlers/conversation-history.js";
|
|
44
44
|
import { deleteQueuedMessage } from "../../daemon/handlers/conversations.js";
|
|
45
45
|
import { getAssistantMessageIdsInTurn } from "../../memory/conversation-crud.js";
|
|
46
|
-
import {
|
|
46
|
+
import {
|
|
47
|
+
getRequestLogById,
|
|
48
|
+
getRequestLogsByMessageId,
|
|
49
|
+
} from "../../memory/llm-request-log-store.js";
|
|
47
50
|
import { getMemoryRecallLogByMessageIds } from "../../memory/memory-recall-log-store.js";
|
|
48
51
|
import { resolvePricingForUsage } from "../../util/pricing.js";
|
|
49
52
|
import { httpError } from "../http-errors.js";
|
|
@@ -487,8 +490,8 @@ export function conversationQueryRouteDefinitions(
|
|
|
487
490
|
);
|
|
488
491
|
return {
|
|
489
492
|
id: log.id,
|
|
490
|
-
requestPayload,
|
|
491
|
-
responsePayload,
|
|
493
|
+
requestPayload: null,
|
|
494
|
+
responsePayload: null,
|
|
492
495
|
createdAt: log.createdAt,
|
|
493
496
|
...result,
|
|
494
497
|
};
|
|
@@ -498,6 +501,49 @@ export function conversationQueryRouteDefinitions(
|
|
|
498
501
|
},
|
|
499
502
|
},
|
|
500
503
|
|
|
504
|
+
// ── Raw payload for a single LLM request log ─────────────────────
|
|
505
|
+
{
|
|
506
|
+
endpoint: "llm-request-logs/:id/payload",
|
|
507
|
+
method: "GET",
|
|
508
|
+
policyKey: "llm-request-logs/payload",
|
|
509
|
+
summary: "Get raw payload for a single LLM request log",
|
|
510
|
+
description:
|
|
511
|
+
"Return the full request and response payloads for a specific log entry.",
|
|
512
|
+
tags: ["messages"],
|
|
513
|
+
responseBody: z.object({
|
|
514
|
+
id: z.string(),
|
|
515
|
+
requestPayload: z.unknown(),
|
|
516
|
+
responsePayload: z.unknown(),
|
|
517
|
+
}),
|
|
518
|
+
handler: ({ params }) => {
|
|
519
|
+
const logId = params.id;
|
|
520
|
+
if (!logId) {
|
|
521
|
+
return httpError("BAD_REQUEST", "log id is required", 400);
|
|
522
|
+
}
|
|
523
|
+
const log = getRequestLogById(logId);
|
|
524
|
+
if (!log) {
|
|
525
|
+
return httpError("NOT_FOUND", "log not found", 404);
|
|
526
|
+
}
|
|
527
|
+
let requestPayload: unknown;
|
|
528
|
+
try {
|
|
529
|
+
requestPayload = JSON.parse(log.requestPayload);
|
|
530
|
+
} catch {
|
|
531
|
+
requestPayload = log.requestPayload;
|
|
532
|
+
}
|
|
533
|
+
let responsePayload: unknown;
|
|
534
|
+
try {
|
|
535
|
+
responsePayload = JSON.parse(log.responsePayload);
|
|
536
|
+
} catch {
|
|
537
|
+
responsePayload = log.responsePayload;
|
|
538
|
+
}
|
|
539
|
+
return Response.json({
|
|
540
|
+
id: log.id,
|
|
541
|
+
requestPayload,
|
|
542
|
+
responsePayload,
|
|
543
|
+
});
|
|
544
|
+
},
|
|
545
|
+
},
|
|
546
|
+
|
|
501
547
|
// ── Delete queued message ─────────────────────────────────────────
|
|
502
548
|
{
|
|
503
549
|
endpoint: "messages/queued/:id",
|