@vellumai/assistant 0.8.6 → 0.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -4
- package/Dockerfile +1 -0
- package/bun.lock +11 -2
- package/docker-entrypoint.sh +8 -6
- package/docs/plugins.md +63 -28
- package/examples/plugins/echo/register.ts +4 -7
- package/knip.json +1 -0
- package/node_modules/@vellumai/environments/bun.lock +24 -0
- package/node_modules/@vellumai/environments/package.json +18 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
- package/node_modules/@vellumai/environments/src/index.ts +11 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
- package/node_modules/@vellumai/environments/src/types.ts +70 -0
- package/node_modules/@vellumai/environments/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +3 -4
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +6 -2
- package/openapi.yaml +3735 -353
- package/package.json +7 -3
- package/scripts/generate-openapi.ts +20 -13
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +240 -39
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +19 -32
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +6 -4
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +207 -341
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +4 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
- package/src/__tests__/anthropic-provider.test.ts +201 -55
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +5 -0
- package/src/__tests__/approval-cascade.test.ts +4 -11
- package/src/__tests__/approval-routes-http.test.ts +4 -2
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
- package/src/__tests__/avatar-e2e.test.ts +7 -37
- package/src/__tests__/avatar-generator.test.ts +12 -42
- package/src/__tests__/avatar-identity-sync.test.ts +28 -3
- package/src/__tests__/background-shell-bash.test.ts +3 -7
- package/src/__tests__/btw-routes.test.ts +7 -12
- package/src/__tests__/call-pointer-messages.test.ts +5 -3
- package/src/__tests__/call-site-routing-provider.test.ts +22 -40
- package/src/__tests__/catalog-files.test.ts +1 -0
- package/src/__tests__/channel-approval-routes.test.ts +48 -20
- package/src/__tests__/channel-approvals.test.ts +3 -1
- package/src/__tests__/channel-invite-transport.test.ts +1 -5
- package/src/__tests__/channel-readiness-routes.test.ts +0 -4
- package/src/__tests__/channel-readiness-slack-remote.test.ts +2 -7
- package/src/__tests__/channel-retry-sweep.test.ts +71 -79
- package/src/__tests__/circuit-breaker-pipeline.test.ts +3 -3
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-events.test.ts +5 -17
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
- package/src/__tests__/compaction-trail-store.test.ts +1 -79
- package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
- package/src/__tests__/computer-use-tools.test.ts +2 -2
- package/src/__tests__/config-watcher.test.ts +28 -0
- package/src/__tests__/context-search-agent-runner.test.ts +6 -3
- package/src/__tests__/context-token-estimator.test.ts +34 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +14 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +12 -27
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +430 -90
- package/src/__tests__/conversation-agent-loop.test.ts +581 -62
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -3
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- package/src/__tests__/conversation-clear-safety.test.ts +20 -10
- package/src/__tests__/conversation-confirmation-signals.test.ts +15 -45
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +10 -17
- package/src/__tests__/conversation-fork-crud.test.ts +86 -172
- package/src/__tests__/conversation-fork-route.test.ts +16 -14
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
- package/src/__tests__/conversation-lifecycle.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +3 -2
- package/src/__tests__/conversation-load-history-stripped.test.ts +1 -1
- package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
- package/src/__tests__/conversation-pairing.test.ts +34 -4
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -0
- package/src/__tests__/conversation-process-callsite.test.ts +27 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +53 -44
- package/src/__tests__/conversation-queue.test.ts +270 -164
- package/src/__tests__/conversation-routes-disk-view.test.ts +3 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
- package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +20 -22
- package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
- package/src/__tests__/conversation-slash-queue.test.ts +37 -31
- package/src/__tests__/conversation-slash-unknown.test.ts +13 -15
- package/src/__tests__/conversation-speed-override.test.ts +8 -22
- package/src/__tests__/conversation-stream-state.test.ts +484 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +6 -15
- package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
- package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -2
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -15
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +23 -11
- package/src/__tests__/conversation-unread-route.test.ts +14 -2
- package/src/__tests__/conversation-usage.test.ts +0 -2
- package/src/__tests__/conversation-wipe.test.ts +1 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +3 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +48 -22
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +27 -7
- package/src/__tests__/credential-execution-tools.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/cross-provider-web-search.test.ts +6 -2
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -0
- package/src/__tests__/disk-pressure-guard.test.ts +66 -0
- package/src/__tests__/disk-pressure-routes.test.ts +9 -2
- package/src/__tests__/dm-persistence.test.ts +7 -2
- package/src/__tests__/dynamic-page-surface.test.ts +68 -0
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-pipeline.test.ts +127 -5
- package/src/__tests__/filing-service.test.ts +2 -2
- package/src/__tests__/first-greeting.test.ts +55 -14
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +351 -28
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +9 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +2 -1
- package/src/__tests__/history-repair-hook.test.ts +161 -0
- package/src/__tests__/history-repair-observability.test.ts +1 -1
- package/src/__tests__/history-repair.test.ts +2 -1
- package/src/__tests__/host-app-control-proxy.test.ts +2 -0
- package/src/__tests__/host-cu-proxy.test.ts +2 -0
- package/src/__tests__/host-file-edit-tool.test.ts +4 -2
- package/src/__tests__/host-file-proxy.test.ts +31 -0
- package/src/__tests__/host-file-read-tool.test.ts +4 -2
- package/src/__tests__/host-file-write-tool.test.ts +9 -3
- package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
- package/src/__tests__/host-shell-tool.test.ts +9 -4
- package/src/__tests__/http-user-message-parity.test.ts +2 -2
- package/src/__tests__/identity-intro-cache.test.ts +35 -14
- package/src/__tests__/inbound-slack-persistence.test.ts +7 -2
- package/src/__tests__/injector-background-turn.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +1 -1
- package/src/__tests__/injector-document-comments.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/injector-v3-suppression.test.ts +220 -0
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +17 -15
- package/src/__tests__/list-messages-page-latest.test.ts +0 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
- package/src/__tests__/llm-call-pipeline.test.ts +21 -15
- package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
- package/src/__tests__/llm-resolver.test.ts +23 -47
- package/src/__tests__/llm-usage-store.test.ts +45 -0
- package/src/__tests__/log-export-routes.test.ts +59 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
- package/src/__tests__/mcp-auth-routes.test.ts +15 -10
- package/src/__tests__/mcp-health-check.test.ts +18 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messaging-send-tool.test.ts +8 -4
- package/src/__tests__/migration-export-http.test.ts +12 -12
- package/src/__tests__/migration-import-commit-http.test.ts +8 -8
- package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/native-web-search.test.ts +14 -20
- package/src/__tests__/notification-decision-identity.test.ts +9 -18
- package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
- package/src/__tests__/oauth-commands-routes.test.ts +1 -1
- package/src/__tests__/onboarding-template-contract.test.ts +10 -0
- package/src/__tests__/openai-provider.test.ts +66 -70
- package/src/__tests__/openai-responses-provider.test.ts +21 -77
- package/src/__tests__/outbound-slack-persistence.test.ts +2 -1
- package/src/__tests__/overflow-reduce-pipeline.test.ts +2 -4
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persistence-pipeline.test.ts +15 -26
- package/src/__tests__/persistence-secret-redaction.test.ts +2 -1
- package/src/__tests__/pipeline-runner.test.ts +2 -3
- package/src/__tests__/plugin-bootstrap.test.ts +51 -25
- package/src/__tests__/plugin-route-contribution.test.ts +6 -16
- package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
- package/src/__tests__/plugin-tool-contribution.test.ts +10 -26
- package/src/__tests__/plugin-types.test.ts +7 -14
- package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
- package/src/__tests__/process-message-background-slack.test.ts +17 -16
- package/src/__tests__/process-message-display-content.test.ts +30 -42
- package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
- package/src/__tests__/provider-error-scenarios.test.ts +7 -6
- package/src/__tests__/provider-platform-proxy-integration.test.ts +3 -8
- package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
- package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
- package/src/__tests__/provider-usage-tracking.test.ts +0 -6
- package/src/__tests__/ratelimit.test.ts +9 -4
- package/src/__tests__/relay-server.test.ts +20 -13
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
- package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
- package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +353 -0
- package/src/__tests__/schedule-routes.test.ts +80 -10
- package/src/__tests__/schedule-store.test.ts +67 -0
- package/src/__tests__/schedule-tools.test.ts +125 -0
- package/src/__tests__/secret-ingress-http.test.ts +2 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
- package/src/__tests__/secret-response-routing.test.ts +13 -11
- package/src/__tests__/send-endpoint-busy.test.ts +2 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +11 -11
- package/src/__tests__/skill-feature-flags.test.ts +6 -6
- package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
- package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
- package/src/__tests__/skillssh-files.test.ts +1 -0
- package/src/__tests__/starter-task-flow.test.ts +6 -6
- package/src/__tests__/strip-memory-injections.test.ts +102 -14
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +19 -16
- package/src/__tests__/system-prompt.test.ts +54 -0
- package/src/__tests__/terminal-tools.test.ts +3 -24
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-pipeline.test.ts +1 -1
- package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
- package/src/__tests__/tool-error-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +13 -11
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
- package/src/__tests__/tool-result-truncation.test.ts +3 -1
- package/src/__tests__/tools-audio-read.test.ts +113 -0
- package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
- package/src/__tests__/turn-events-store.test.ts +11 -7
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
- package/src/__tests__/voice-session-bridge.test.ts +13 -7
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/agent/compaction-circuit.ts +140 -0
- package/src/agent/loop.ts +409 -85
- package/src/api/README.md +19 -17
- package/src/api/constants/tool-execution.ts +21 -0
- package/src/api/events/assistant-activity-state.ts +75 -0
- package/src/api/events/assistant-outbound-attachment.ts +25 -27
- package/src/api/events/assistant-text-delta.ts +6 -8
- package/src/api/events/assistant-turn-start.ts +5 -7
- package/src/api/events/avatar-updated.ts +24 -0
- package/src/api/events/compaction-circuit-closed.ts +26 -0
- package/src/api/events/compaction-circuit-open.ts +28 -0
- package/src/api/events/confirmation-request.ts +114 -0
- package/src/api/events/contact-request.ts +33 -0
- package/src/api/events/conversation-error.ts +77 -0
- package/src/api/events/conversation-list-invalidated.ts +38 -0
- package/src/api/events/conversation-title-updated.ts +24 -0
- package/src/api/events/disk-pressure-status-changed.ts +61 -0
- package/src/api/events/document-comment-created.ts +24 -28
- package/src/api/events/document-comment-deleted.ts +6 -8
- package/src/api/events/document-comment-reopened.ts +6 -8
- package/src/api/events/document-comment-resolved.ts +8 -10
- package/src/api/events/document-editor-update.ts +27 -0
- package/src/api/events/error.ts +32 -0
- package/src/api/events/generation-cancelled.ts +4 -6
- package/src/api/events/generation-handoff.ts +13 -15
- package/src/api/events/home-feed-updated.ts +26 -0
- package/src/api/events/identity-changed.ts +32 -0
- package/src/api/events/interaction-resolved.ts +50 -0
- package/src/api/events/message-complete.ts +10 -12
- package/src/api/events/message-dequeued.ts +21 -0
- package/src/api/events/message-queued-deleted.ts +23 -0
- package/src/api/events/message-queued.ts +22 -0
- package/src/api/events/message-request-complete.ts +29 -0
- package/src/api/events/navigate-settings.ts +20 -0
- package/src/api/events/notification-intent.ts +33 -0
- package/src/api/events/open-url.ts +6 -8
- package/src/api/events/question-request.ts +67 -0
- package/src/api/events/relationship-state-updated.ts +4 -6
- package/src/api/events/secret-request.ts +42 -0
- package/src/api/events/subagent-event.ts +79 -0
- package/src/api/events/subagent-spawned.ts +40 -0
- package/src/api/events/subagent-status-changed.ts +65 -0
- package/src/api/events/sync-changed.ts +29 -0
- package/src/api/events/tool-result.ts +129 -0
- package/src/api/events/tool-use-start.ts +8 -10
- package/src/api/events/turn-profile-auto-routed.ts +28 -0
- package/src/api/events/ui-surface-complete.ts +30 -0
- package/src/api/events/ui-surface-dismiss.ts +22 -0
- package/src/api/events/ui-surface-show.ts +67 -0
- package/src/api/events/ui-surface-update.ts +26 -0
- package/src/api/events/usage-update.ts +34 -0
- package/src/api/events/user-message-echo.ts +35 -0
- package/src/api/index.ts +354 -0
- package/src/api/requests/dictation.ts +45 -0
- package/src/api/responses/disk-pressure-status.ts +26 -0
- package/src/api/responses/home.ts +217 -0
- package/src/api/responses/llm-context-response.ts +2 -0
- package/src/api/responses/memory-v3-selection-log.ts +50 -0
- package/src/api/responses/subagent-detail.ts +48 -0
- package/src/approvals/guardian-decision-primitive.ts +7 -15
- package/src/approvals/guardian-request-resolvers.ts +6 -9
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +193 -0
- package/src/avatar/avatar-manifest.ts +195 -0
- package/src/avatar/avatar-store.ts +113 -0
- package/src/avatar/traits-png-sync.ts +8 -2
- package/src/background-wake/next-wake.test.ts +31 -1
- package/src/background-wake/next-wake.ts +4 -1
- package/src/calls/call-conversation-messages.ts +6 -4
- package/src/calls/guardian-action-sweep.ts +6 -4
- package/src/calls/relay-server.ts +12 -8
- package/src/calls/voice-session-bridge.ts +13 -27
- package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
- package/src/cli/commands/avatar.ts +17 -11
- package/src/cli/commands/conversations.ts +15 -1
- package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
- package/src/cli/commands/db/__tests__/status.test.ts +253 -0
- package/src/cli/commands/db/format.ts +48 -0
- package/src/cli/commands/db/index.ts +29 -0
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
- package/src/cli/commands/db/repair-step-integrity.ts +146 -0
- package/src/cli/commands/db/repair-steps.ts +164 -0
- package/src/cli/commands/db/repair.ts +141 -0
- package/src/cli/commands/db/status.ts +366 -0
- package/src/cli/commands/memory-v3.ts +159 -445
- package/src/cli/lib/cli-colors.ts +24 -6
- package/src/cli/program.ts +4 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
- package/src/config/call-site-defaults.ts +2 -7
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -226
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/llm.ts +2 -3
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +0 -253
- package/src/config/schemas/memory-v3.ts +39 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/context/compactor.ts +54 -31
- package/src/context/token-estimator.ts +19 -0
- package/src/context/tool-result-truncation.ts +1 -43
- package/src/context/window-manager.ts +138 -20
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
- package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +225 -88
- package/src/daemon/conversation-agent-loop.ts +284 -584
- package/src/daemon/conversation-error.ts +7 -7
- package/src/daemon/conversation-history.ts +22 -6
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +10 -38
- package/src/daemon/conversation-messaging.ts +1 -3
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +100 -79
- package/src/daemon/conversation-runtime-assembly.ts +47 -21
- package/src/daemon/conversation-store.ts +6 -5
- package/src/daemon/conversation-surfaces.ts +55 -69
- package/src/daemon/conversation-tool-setup.ts +3 -0
- package/src/daemon/conversation.ts +91 -126
- package/src/daemon/daemon-skill-host.ts +2 -6
- package/src/daemon/disk-pressure-guard.ts +35 -29
- package/src/daemon/external-plugins-bootstrap.ts +46 -24
- package/src/daemon/first-greeting.ts +26 -4
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/conversations.ts +6 -22
- package/src/daemon/handlers/shared.ts +4 -0
- package/src/daemon/handlers/skills.ts +15 -14
- package/src/daemon/host-app-control-proxy.ts +54 -1
- package/src/daemon/host-cu-proxy.ts +46 -22
- package/src/daemon/host-file-proxy.ts +25 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -6
- package/src/daemon/lifecycle.ts +28 -55
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- package/src/daemon/message-types/contacts.ts +3 -20
- package/src/daemon/message-types/conversations.ts +13 -111
- package/src/daemon/message-types/documents.ts +3 -9
- package/src/daemon/message-types/home.ts +4 -17
- package/src/daemon/message-types/integrations.ts +2 -6
- package/src/daemon/message-types/messages.ts +28 -343
- package/src/daemon/message-types/notifications.ts +2 -32
- package/src/daemon/message-types/settings.ts +3 -8
- package/src/daemon/message-types/skills.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/process-message.ts +49 -46
- package/src/daemon/server.ts +12 -0
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +11 -1
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -1
- package/src/heartbeat/heartbeat-run-store.ts +31 -0
- package/src/heartbeat/heartbeat-service.ts +16 -0
- package/src/home/feature-gate.ts +22 -0
- package/src/home/feed-types.ts +36 -221
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
- package/src/ipc/routes/route-adapter.ts +45 -6
- package/src/ipc/skill-routes/__tests__/memory.test.ts +18 -9
- package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
- package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
- package/src/ipc/skill-routes/memory.ts +26 -13
- package/src/ipc/skill-routes/providers.ts +5 -6
- package/src/ipc/skill-routes/registries.ts +13 -61
- package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
- package/src/memory/__tests__/conversation-queries.test.ts +192 -8
- package/src/memory/__tests__/db-maintenance.test.ts +128 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
- package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/memory/context-search/agent-runner.ts +2 -4
- package/src/memory/conversation-crud.ts +39 -8
- package/src/memory/conversation-queries.ts +78 -22
- package/src/memory/db-init.ts +8 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +41 -8
- package/src/memory/graph/extraction.ts +6 -9
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.ts +20 -26
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/job-handlers/conversation-starters.ts +32 -32
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs-store.ts +3 -1
- package/src/memory/jobs-worker.ts +51 -39
- package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
- package/src/memory/llm-request-log-source-local.ts +0 -11
- package/src/memory/llm-request-log-source.ts +9 -25
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +10 -0
- package/src/memory/memory-marker.ts +17 -0
- package/src/memory/memory-retrospective-job.ts +6 -2
- package/src/memory/memory-v2-activation-log-store.ts +1 -83
- package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
- package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
- package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
- package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
- package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/schema/infrastructure.ts +11 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
- package/src/memory/v2/__tests__/migration.test.ts +11 -3
- package/src/memory/v2/__tests__/page-index.test.ts +37 -1
- package/src/memory/v2/__tests__/router.test.ts +14 -4
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
- package/src/memory/v2/backfill-jobs.ts +6 -0
- package/src/memory/v2/consolidation-job.ts +89 -9
- package/src/memory/v2/migration.ts +5 -3
- package/src/memory/v2/page-index.ts +11 -0
- package/src/memory/v2/router.ts +8 -11
- package/src/memory/v2/sweep-job.ts +8 -11
- package/src/memory/v2/types.ts +1 -0
- package/src/memory/v3/__tests__/assign.test.ts +242 -0
- package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
- package/src/memory/v3/__tests__/core.test.ts +39 -0
- package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
- package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
- package/src/memory/v3/__tests__/health.test.ts +203 -0
- package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
- package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
- package/src/memory/v3/__tests__/needle.test.ts +107 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
- package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
- package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
- package/src/memory/v3/__tests__/router.test.ts +260 -0
- package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
- package/src/memory/v3/__tests__/selector.test.ts +404 -0
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
- package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
- package/src/memory/v3/__tests__/tree.test.ts +192 -0
- package/src/memory/v3/__tests__/types.test.ts +54 -0
- package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
- package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/memory/v3/assign.ts +268 -0
- package/src/memory/v3/capabilities.ts +124 -0
- package/src/memory/v3/core.ts +26 -0
- package/src/memory/v3/data/README.md +84 -0
- package/src/memory/v3/data/assignments.json +5 -0
- package/src/memory/v3/data/core.json +1 -0
- package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
- package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
- package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +314 -0
- package/src/memory/v3/needle.ts +115 -0
- package/src/memory/v3/orchestrate.ts +114 -0
- package/src/memory/v3/page-content.ts +34 -0
- package/src/memory/v3/provider-blocks.ts +16 -0
- package/src/memory/v3/reconcile.ts +523 -0
- package/src/memory/v3/render-injection.ts +32 -0
- package/src/memory/v3/router.ts +184 -0
- package/src/memory/v3/selection-log-store.ts +84 -0
- package/src/memory/v3/selector.ts +211 -0
- package/src/memory/v3/shadow-plugin.ts +379 -0
- package/src/memory/v3/snapshot.ts +209 -0
- package/src/memory/v3/tree.ts +174 -0
- package/src/memory/v3/types.ts +46 -60
- package/src/memory/v3/working-set.ts +88 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.ts +2 -2
- package/src/messaging/style-analyzer.ts +8 -11
- package/src/notifications/conversation-pairing.ts +8 -6
- package/src/notifications/decision-engine.ts +10 -13
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/permissions/prompter.ts +42 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/plugin-api/index.ts +2 -0
- package/src/plugin-api/types.ts +25 -3
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
- package/src/plugins/defaults/circuit-breaker/package.json +15 -0
- package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +35 -0
- package/src/plugins/defaults/compaction/terminal.ts +73 -0
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +28 -0
- package/src/plugins/defaults/empty-response/terminal.ts +106 -0
- package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/history-repair/package.json +15 -0
- package/src/plugins/defaults/history-repair/register.ts +24 -0
- package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
- package/src/plugins/defaults/index.ts +29 -40
- package/src/plugins/defaults/injectors/package.json +15 -0
- package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +14 -38
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
- package/src/plugins/defaults/llm-call/package.json +15 -0
- package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
- package/src/plugins/defaults/memory-retrieval/package.json +15 -0
- package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
- package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
- package/src/plugins/defaults/overflow-reduce/package.json +15 -0
- package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
- package/src/plugins/defaults/persistence/package.json +15 -0
- package/src/plugins/defaults/persistence/register.ts +38 -0
- package/src/plugins/defaults/persistence/terminal.ts +83 -0
- package/src/plugins/defaults/title-generate/package.json +15 -0
- package/src/plugins/defaults/title-generate/register.ts +35 -0
- package/src/plugins/defaults/title-generate/terminal.ts +31 -0
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
- package/src/plugins/defaults/token-estimate/package.json +15 -0
- package/src/plugins/defaults/token-estimate/register.ts +34 -0
- package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +35 -0
- package/src/plugins/defaults/tool-error/terminal.ts +47 -0
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
- package/src/plugins/defaults/tool-execute/package.json +15 -0
- package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
- package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +0 -12
- package/src/plugins/types.ts +51 -90
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +0 -1
- package/src/proactive-artifact/job.test.ts +20 -8
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +5 -1
- package/src/prompts/templates/system-sections.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -25
- package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
- package/src/providers/anthropic/client.ts +24 -5
- package/src/providers/call-site-routing.ts +1 -9
- package/src/providers/gemini/client.ts +152 -34
- package/src/providers/gemini/inline-media.ts +74 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +0 -2
- package/src/providers/openai/chat-completions-provider.ts +1 -4
- package/src/providers/openai/responses-provider.ts +1 -4
- package/src/providers/openrouter/client.ts +1 -6
- package/src/providers/provider-send-message.ts +6 -6
- package/src/providers/ratelimit.ts +1 -9
- package/src/providers/retry.ts +0 -5
- package/src/providers/types.ts +11 -2
- package/src/providers/usage-tracking.ts +1 -9
- package/src/runtime/__tests__/agent-wake.test.ts +131 -26
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
- package/src/runtime/agent-wake.ts +93 -18
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
- package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
- package/src/runtime/auth/route-policy.ts +42 -1079
- package/src/runtime/background-job-runner.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -1
- package/src/runtime/channel-approvals.ts +3 -14
- package/src/runtime/channel-invite-transport.ts +5 -6
- package/src/runtime/channel-readiness-service.ts +2 -5
- package/src/runtime/channel-retry-sweep.ts +12 -16
- package/src/runtime/conversation-stream-state.ts +294 -0
- package/src/runtime/http-router.ts +19 -22
- package/src/runtime/http-types.ts +12 -6
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/pending-interactions.ts +2 -2
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
- package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
- package/src/runtime/routes/__tests__/tts-routes.test.ts +3 -3
- package/src/runtime/routes/acp-routes.test.ts +97 -75
- package/src/runtime/routes/acp-routes.ts +29 -6
- package/src/runtime/routes/app-management-routes.ts +97 -24
- package/src/runtime/routes/app-routes.ts +25 -5
- package/src/runtime/routes/approval-routes.ts +16 -4
- package/src/runtime/routes/attachment-routes.ts +25 -1
- package/src/runtime/routes/audio-routes.ts +1 -0
- package/src/runtime/routes/audit-routes.ts +5 -0
- package/src/runtime/routes/auth-routes.ts +5 -0
- package/src/runtime/routes/avatar-routes.ts +238 -59
- package/src/runtime/routes/background-tool-routes.ts +9 -0
- package/src/runtime/routes/background-wake-routes.ts +13 -3
- package/src/runtime/routes/backup-routes.ts +45 -0
- package/src/runtime/routes/bookmark-routes.ts +13 -0
- package/src/runtime/routes/brain-graph-routes.ts +9 -0
- package/src/runtime/routes/browser-routes.ts +5 -0
- package/src/runtime/routes/browser-tabs-routes.ts +5 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/cache-routes.ts +13 -0
- package/src/runtime/routes/call-routes.ts +21 -10
- package/src/runtime/routes/channel-availability-routes.ts +5 -1
- package/src/runtime/routes/channel-readiness-routes.ts +37 -4
- package/src/runtime/routes/channel-route-definitions.ts +21 -0
- package/src/runtime/routes/channel-verification-routes.ts +21 -0
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
- package/src/runtime/routes/client-routes.ts +9 -0
- package/src/runtime/routes/consolidation-routes.ts +13 -5
- package/src/runtime/routes/contact-prompt-routes.ts +9 -0
- package/src/runtime/routes/contact-routes.ts +90 -23
- package/src/runtime/routes/content-source-routes.ts +5 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +5 -1
- package/src/runtime/routes/conversation-attention-routes.ts +5 -0
- package/src/runtime/routes/conversation-cli-routes.ts +54 -7
- package/src/runtime/routes/conversation-compaction-routes.ts +54 -25
- package/src/runtime/routes/conversation-list-routes.ts +81 -12
- package/src/runtime/routes/conversation-management-routes.ts +57 -14
- package/src/runtime/routes/conversation-query-routes.ts +88 -41
- package/src/runtime/routes/conversation-routes.ts +74 -19
- package/src/runtime/routes/conversation-starter-routes.ts +22 -13
- package/src/runtime/routes/conversations-import-routes.ts +6 -1
- package/src/runtime/routes/credential-prompt-routes.ts +5 -0
- package/src/runtime/routes/credential-routes.ts +25 -6
- package/src/runtime/routes/debug-bash-routes.ts +5 -0
- package/src/runtime/routes/debug-routes.ts +11 -2
- package/src/runtime/routes/defer-routes.ts +13 -0
- package/src/runtime/routes/diagnostics-routes.ts +37 -46
- package/src/runtime/routes/disk-pressure-routes.ts +17 -31
- package/src/runtime/routes/document-comments-routes.ts +46 -27
- package/src/runtime/routes/documents-routes.ts +21 -10
- package/src/runtime/routes/domain-routes.ts +61 -28
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/events-routes.ts +114 -9
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +5 -0
- package/src/runtime/routes/global-search-routes.ts +53 -50
- package/src/runtime/routes/group-routes.ts +21 -5
- package/src/runtime/routes/guardian-action-routes.ts +9 -0
- package/src/runtime/routes/guardian-approval-interception.ts +0 -31
- package/src/runtime/routes/heartbeat-routes.ts +25 -9
- package/src/runtime/routes/home-feed-routes.ts +23 -19
- package/src/runtime/routes/home-state-routes.ts +8 -40
- package/src/runtime/routes/host-app-control-routes.ts +5 -0
- package/src/runtime/routes/host-bash-routes.ts +5 -0
- package/src/runtime/routes/host-browser-routes.ts +13 -0
- package/src/runtime/routes/host-cu-routes.ts +5 -0
- package/src/runtime/routes/host-file-routes.ts +26 -6
- package/src/runtime/routes/host-transfer-routes.ts +13 -2
- package/src/runtime/routes/http-adapter.ts +1 -2
- package/src/runtime/routes/identity-intro-cache.ts +17 -6
- package/src/runtime/routes/identity-routes.ts +12 -2
- package/src/runtime/routes/image-generation-routes.ts +5 -0
- package/src/runtime/routes/inbound-message-handler.ts +15 -11
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
- package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
- package/src/runtime/routes/inference-provider-connection-routes.ts +21 -5
- package/src/runtime/routes/inference-send-routes.ts +11 -11
- package/src/runtime/routes/integrations/a2a.ts +30 -7
- package/src/runtime/routes/integrations/slack/channel.ts +19 -3
- package/src/runtime/routes/integrations/slack/share.ts +9 -2
- package/src/runtime/routes/integrations/telegram.ts +28 -9
- package/src/runtime/routes/integrations/twilio.ts +35 -7
- package/src/runtime/routes/integrations/vercel.ts +3 -3
- package/src/runtime/routes/internal-oauth-routes.ts +5 -0
- package/src/runtime/routes/internal-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/log-export-routes.ts +28 -10
- package/src/runtime/routes/mcp-auth-routes.ts +25 -0
- package/src/runtime/routes/memory-item-routes.ts +21 -10
- package/src/runtime/routes/memory-v2-routes.ts +90 -36
- package/src/runtime/routes/memory-v3-routes.ts +273 -407
- package/src/runtime/routes/migration-rollback-routes.ts +5 -1
- package/src/runtime/routes/migration-routes.ts +29 -0
- package/src/runtime/routes/notification-routes.ts +17 -1
- package/src/runtime/routes/oauth-apps.ts +33 -11
- package/src/runtime/routes/oauth-commands-routes.ts +37 -14
- package/src/runtime/routes/oauth-connect-routes.ts +9 -0
- package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
- package/src/runtime/routes/oauth-providers.ts +35 -10
- package/src/runtime/routes/platform-routes.ts +21 -0
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
- package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
- package/src/runtime/routes/playground/force-compact.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +0 -1
- package/src/runtime/routes/playground/inject-failures.ts +13 -8
- package/src/runtime/routes/playground/reset-circuit.ts +14 -9
- package/src/runtime/routes/playground/seed-conversation.ts +1 -1
- package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
- package/src/runtime/routes/playground/state.ts +4 -3
- package/src/runtime/routes/plugins-routes.ts +22 -19
- package/src/runtime/routes/profiler-routes.ts +17 -4
- package/src/runtime/routes/ps-routes.ts +5 -0
- package/src/runtime/routes/publish-routes.ts +13 -3
- package/src/runtime/routes/question-routes.ts +5 -0
- package/src/runtime/routes/recording-routes.ts +25 -12
- package/src/runtime/routes/rename-conversation-routes.ts +5 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +137 -47
- package/src/runtime/routes/secret-routes.ts +17 -4
- package/src/runtime/routes/sequence-routes.ts +33 -0
- package/src/runtime/routes/settings-routes.ts +65 -19
- package/src/runtime/routes/skills-routes.ts +133 -69
- package/src/runtime/routes/slack-channel-routes.ts +5 -0
- package/src/runtime/routes/stt-routes.ts +13 -6
- package/src/runtime/routes/subagents-routes.ts +24 -18
- package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
- package/src/runtime/routes/surface-action-routes.ts +9 -0
- package/src/runtime/routes/surface-content-routes.ts +10 -2
- package/src/runtime/routes/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +5 -0
- package/src/runtime/routes/tts-routes.ts +13 -6
- package/src/runtime/routes/types.ts +17 -8
- package/src/runtime/routes/ui-request-routes.ts +5 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
- package/src/runtime/routes/usage-routes.ts +71 -3
- package/src/runtime/routes/user-routes-cli.ts +9 -0
- package/src/runtime/routes/user-routes.ts +5 -1
- package/src/runtime/routes/wake-conversation-routes.ts +5 -0
- package/src/runtime/routes/watcher-routes.ts +21 -0
- package/src/runtime/routes/webhook-routes.ts +9 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
- package/src/runtime/routes/work-items-routes.ts +47 -19
- package/src/runtime/routes/workspace-commit-routes.ts +5 -0
- package/src/runtime/routes/workspace-routes.test.ts +42 -0
- package/src/runtime/routes/workspace-routes.ts +120 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -4
- package/src/runtime/services/analyze-conversation.ts +3 -6
- package/src/runtime/services/conversation-serializer.ts +24 -2
- package/src/runtime/sync/resource-sync-events.ts +16 -2
- package/src/runtime/sync/sync-publisher.ts +2 -2
- package/src/schedule/run-script.ts +28 -3
- package/src/schedule/schedule-store.ts +8 -0
- package/src/schedule/scheduler.ts +3 -1
- package/src/signals/user-message.ts +5 -8
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/clawhub-files.ts +2 -0
- package/src/skills/skillssh-files.ts +2 -0
- package/src/subagent/manager.ts +3 -6
- package/src/telemetry/types.ts +26 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
- package/src/telemetry/usage-telemetry-reporter.ts +31 -0
- package/src/tools/acp/spawn.test.ts +88 -38
- package/src/tools/apps/definitions.ts +8 -4
- package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
- package/src/tools/ask-question/ask-question-tool.ts +85 -90
- package/src/tools/computer-use/definitions.ts +28 -24
- package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
- package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
- package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
- package/src/tools/credentials/vault.ts +112 -111
- package/src/tools/execution-target.ts +1 -1
- package/src/tools/execution-timeout.ts +3 -4
- package/src/tools/filesystem/edit.ts +45 -42
- package/src/tools/filesystem/list.ts +33 -30
- package/src/tools/filesystem/read.ts +54 -35
- package/src/tools/filesystem/write.ts +34 -31
- package/src/tools/host-filesystem/edit.ts +44 -42
- package/src/tools/host-filesystem/read.ts +49 -35
- package/src/tools/host-filesystem/transfer.ts +121 -108
- package/src/tools/host-filesystem/write.ts +33 -31
- package/src/tools/host-terminal/host-shell.ts +50 -48
- package/src/tools/memory/register.ts +23 -24
- package/src/tools/network/web-fetch.ts +49 -46
- package/src/tools/network/web-search.ts +16 -13
- package/src/tools/registry.ts +39 -16
- package/src/tools/schedule/create.ts +11 -0
- package/src/tools/schedule/update.ts +16 -0
- package/src/tools/shared/filesystem/audio-read.ts +122 -0
- package/src/tools/shared/filesystem/image-read.ts +1 -1
- package/src/tools/skills/execute.ts +34 -31
- package/src/tools/skills/load.ts +29 -23
- package/src/tools/subagent/notify-parent.ts +35 -32
- package/src/tools/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- package/src/tools/terminal/shell.ts +190 -61
- package/src/tools/tool-defaults.ts +20 -9
- package/src/tools/tool-manifest.ts +4 -4
- package/src/tools/types.ts +74 -23
- package/src/tools/ui-surface/definitions.ts +69 -9
- package/src/usage/types.ts +10 -0
- package/src/util/errors.ts +2 -2
- package/src/util/map-limit.ts +27 -0
- package/src/util/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
- package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
- package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
- package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
- package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
- package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
- package/src/cli/commands/memory-v3-render.ts +0 -491
- package/src/daemon/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
- package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
- package/src/memory/v3/__tests__/edges.test.ts +0 -706
- package/src/memory/v3/__tests__/filter.test.ts +0 -560
- package/src/memory/v3/__tests__/gate.test.ts +0 -637
- package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
- package/src/memory/v3/__tests__/loop.test.ts +0 -775
- package/src/memory/v3/__tests__/retriever.test.ts +0 -226
- package/src/memory/v3/__tests__/scouts.test.ts +0 -489
- package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
- package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
- package/src/memory/v3/__tests__/traversal.test.ts +0 -508
- package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
- package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
- package/src/memory/v3/__tests__/tree-walk.test.ts +0 -784
- package/src/memory/v3/__tests__/validate.test.ts +0 -277
- package/src/memory/v3/auto-edges.ts +0 -223
- package/src/memory/v3/coactivation-store.ts +0 -124
- package/src/memory/v3/consolidation-job.ts +0 -323
- package/src/memory/v3/coretrieval-seed.ts +0 -240
- package/src/memory/v3/edge-learning-job.ts +0 -160
- package/src/memory/v3/edges.ts +0 -286
- package/src/memory/v3/filter.ts +0 -286
- package/src/memory/v3/gate.ts +0 -349
- package/src/memory/v3/index-composition.ts +0 -126
- package/src/memory/v3/llm-capture.ts +0 -46
- package/src/memory/v3/loop.ts +0 -430
- package/src/memory/v3/maintenance.ts +0 -144
- package/src/memory/v3/prompt-context.ts +0 -33
- package/src/memory/v3/prompts/consolidation.ts +0 -458
- package/src/memory/v3/prompts/system-prompts.ts +0 -196
- package/src/memory/v3/retriever.ts +0 -33
- package/src/memory/v3/scouts.ts +0 -431
- package/src/memory/v3/shadow-diff.ts +0 -287
- package/src/memory/v3/shadow-middleware.ts +0 -347
- package/src/memory/v3/traversal.ts +0 -211
- package/src/memory/v3/tree-index.ts +0 -237
- package/src/memory/v3/tree-store.ts +0 -394
- package/src/memory/v3/tree-walk.ts +0 -356
- package/src/memory/v3/validate.ts +0 -323
- package/src/plugins/defaults/circuit-breaker.ts +0 -141
- package/src/plugins/defaults/compaction.ts +0 -141
- package/src/plugins/defaults/empty-response.ts +0 -124
- package/src/plugins/defaults/history-repair.ts +0 -83
- package/src/plugins/defaults/persistence.ts +0 -146
- package/src/plugins/defaults/title-generate.ts +0 -90
- package/src/plugins/defaults/token-estimate.ts +0 -101
- package/src/plugins/defaults/tool-error.ts +0 -119
- package/src/plugins/defaults/tool-result-truncate.ts +0 -84
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
|
@@ -114,12 +114,14 @@ describe("host.providers.llm.complete", () => {
|
|
|
114
114
|
expect(sendMessageSpy).toHaveBeenCalledTimes(1);
|
|
115
115
|
const call = sendMessageSpy.mock.calls[0] as unknown as [
|
|
116
116
|
unknown[],
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
{
|
|
118
|
+
systemPrompt?: string;
|
|
119
|
+
tools?: unknown[];
|
|
120
|
+
config?: Record<string, unknown>;
|
|
121
|
+
},
|
|
120
122
|
];
|
|
121
123
|
expect(Array.isArray(call[0])).toBe(true);
|
|
122
|
-
expect(call[
|
|
124
|
+
expect(call[1]?.systemPrompt).toBe("you are helpful");
|
|
123
125
|
expect(response).toEqual({
|
|
124
126
|
content: [{ type: "text", text: "hello" }],
|
|
125
127
|
model: "stub-model",
|
|
@@ -138,13 +140,11 @@ describe("host.providers.llm.complete", () => {
|
|
|
138
140
|
|
|
139
141
|
const call = sendMessageSpy.mock.calls[0] as unknown as [
|
|
140
142
|
unknown[],
|
|
141
|
-
unknown[],
|
|
142
|
-
string | undefined,
|
|
143
|
-
{ config?: Record<string, unknown> } | undefined,
|
|
143
|
+
{ tools?: unknown[]; config?: Record<string, unknown> },
|
|
144
144
|
];
|
|
145
|
-
expect(Array.isArray(call[1])).toBe(true);
|
|
146
|
-
expect(
|
|
147
|
-
expect(call[
|
|
145
|
+
expect(Array.isArray(call[1]?.tools)).toBe(true);
|
|
146
|
+
expect(call[1]?.tools?.length).toBe(1);
|
|
147
|
+
expect(call[1]?.config).toEqual({
|
|
148
148
|
model: "override-model",
|
|
149
149
|
callSite: "mainAgent",
|
|
150
150
|
});
|
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
getTool,
|
|
22
22
|
getToolOwner,
|
|
23
23
|
} from "../../../tools/registry.js";
|
|
24
|
+
import { RiskLevel } from "../../../tools/types.js";
|
|
24
25
|
import {
|
|
25
26
|
__getActiveSessionCountForTesting,
|
|
26
27
|
__resetActiveSessionsForTesting,
|
|
@@ -85,7 +86,7 @@ describe("host.registries.register_tools", () => {
|
|
|
85
86
|
});
|
|
86
87
|
});
|
|
87
88
|
|
|
88
|
-
test("proxy execute
|
|
89
|
+
test("proxy execute surfaces an error result when no supervisor is attached", async () => {
|
|
89
90
|
await registerToolsRoute.handler({
|
|
90
91
|
skillId: "stub-skill",
|
|
91
92
|
tools: [
|
|
@@ -101,16 +102,19 @@ describe("host.registries.register_tools", () => {
|
|
|
101
102
|
|
|
102
103
|
const installed = getTool("skill_stub_tool");
|
|
103
104
|
expect(installed).toBeDefined();
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
105
|
+
// Skill tools arrive without an `execute` closure (closures don't cross
|
|
106
|
+
// IPC). `finalizeTool` synthesizes a no-op error result so unsupervised
|
|
107
|
+
// invocations surface a clear "not wired up" signal to the model.
|
|
108
|
+
const result = await installed!.execute(
|
|
109
|
+
{},
|
|
110
|
+
{
|
|
111
|
+
workingDir: "/tmp",
|
|
112
|
+
conversationId: "c",
|
|
113
|
+
trustClass: "guardian",
|
|
114
|
+
},
|
|
115
|
+
);
|
|
116
|
+
expect(result.isError).toBe(true);
|
|
117
|
+
expect(result.content).toMatch(/no execute implementation/i);
|
|
114
118
|
});
|
|
115
119
|
|
|
116
120
|
test("rejects empty tool list", async () => {
|
|
@@ -119,13 +123,19 @@ describe("host.registries.register_tools", () => {
|
|
|
119
123
|
).rejects.toThrow();
|
|
120
124
|
});
|
|
121
125
|
|
|
122
|
-
test("
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
test("fills defaults for partial tool entries", async () => {
|
|
127
|
+
// Wire and author share one schema (`ToolDefinitionSchema`, all-optional)
|
|
128
|
+
// and the daemon runs `finalizeTool` on every incoming tool. So a
|
|
129
|
+
// partial entry doesn't reject — defaults fill in for missing fields.
|
|
130
|
+
const result = (await registerToolsRoute.handler({
|
|
131
|
+
skillId: "partial-skill",
|
|
132
|
+
tools: [{ name: "partial_tool" }],
|
|
133
|
+
})) as { registered: string[] };
|
|
134
|
+
expect(result.registered).toEqual(["partial_tool"]);
|
|
135
|
+
const installed = getTool("partial_tool");
|
|
136
|
+
expect(installed).toBeDefined();
|
|
137
|
+
expect(installed!.defaultRiskLevel).toBe(RiskLevel.Medium);
|
|
138
|
+
expect(installed!.executionTarget).toBe("sandbox");
|
|
129
139
|
});
|
|
130
140
|
|
|
131
141
|
test("rejects missing skillId", async () => {
|
|
@@ -16,22 +16,24 @@ import type { SkillIpcRoute } from "../skill-ipc-types.js";
|
|
|
16
16
|
// -- Param schemas --------------------------------------------------------
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
20
|
-
* `
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
19
|
+
* IPC params for `addMessage()`. `role` is constrained to the
|
|
20
|
+
* `MessageRole` union. `metadata` is a free-form record (validated
|
|
21
|
+
* downstream by `messageMetadataSchema` with a warn-and-store fallback).
|
|
22
|
+
* `skipIndexing` and `clientMessageId` mirror `AddMessageOptions`.
|
|
23
|
+
*
|
|
24
|
+
* The `opts` field is a backward-compat shim: the macOS app and platform
|
|
25
|
+
* do not release together, so a skill-host built against an older contract
|
|
26
|
+
* may still send `{ opts: { skipIndexing } }` instead of the flat shape.
|
|
27
|
+
* The handler flattens it via `skipIndexing ?? opts?.skipIndexing`.
|
|
24
28
|
*/
|
|
25
29
|
const MemoryAddMessageParams = z.object({
|
|
26
30
|
conversationId: z.string().min(1),
|
|
27
31
|
role: z.enum(["user", "assistant", "system"]),
|
|
28
32
|
content: z.string(),
|
|
29
33
|
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
})
|
|
34
|
-
.optional(),
|
|
34
|
+
skipIndexing: z.boolean().optional(),
|
|
35
|
+
clientMessageId: z.string().optional(),
|
|
36
|
+
opts: z.object({ skipIndexing: z.boolean().optional() }).optional(),
|
|
35
37
|
});
|
|
36
38
|
|
|
37
39
|
/** Mirrors `WakeOptions` from `runtime/agent-wake.ts`. */
|
|
@@ -44,9 +46,20 @@ const MemoryWakeOpportunityParams = z.object({
|
|
|
44
46
|
// -- Handlers -------------------------------------------------------------
|
|
45
47
|
|
|
46
48
|
async function handleAddMessage(params?: Record<string, unknown>) {
|
|
47
|
-
const {
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
const {
|
|
50
|
+
conversationId,
|
|
51
|
+
role,
|
|
52
|
+
content,
|
|
53
|
+
metadata,
|
|
54
|
+
skipIndexing,
|
|
55
|
+
clientMessageId,
|
|
56
|
+
opts,
|
|
57
|
+
} = MemoryAddMessageParams.parse(params);
|
|
58
|
+
return addMessage(conversationId, role, content, {
|
|
59
|
+
metadata,
|
|
60
|
+
skipIndexing: skipIndexing ?? opts?.skipIndexing,
|
|
61
|
+
clientMessageId,
|
|
62
|
+
});
|
|
50
63
|
}
|
|
51
64
|
|
|
52
65
|
async function handleWakeAgentForOpportunity(
|
|
@@ -39,7 +39,7 @@ import type { SkillIpcRoute } from "../skill-ipc-types.js";
|
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* LLM completion request. The IPC surface only accepts the serializable
|
|
42
|
-
* subset of `Provider.sendMessage(messages,
|
|
42
|
+
* subset of `Provider.sendMessage(messages, options?)`.
|
|
43
43
|
* Non-serializable fields (`onEvent`, `signal`) are intentionally omitted —
|
|
44
44
|
* streaming deltas and per-call cancellation belong on future streaming
|
|
45
45
|
* routes, not this one-shot RPC.
|
|
@@ -76,12 +76,11 @@ async function handleLlmComplete(params?: Record<string, unknown>) {
|
|
|
76
76
|
`host.providers.llm.complete: no provider configured for callSite '${callSite}'`,
|
|
77
77
|
);
|
|
78
78
|
}
|
|
79
|
-
return provider.sendMessage(
|
|
80
|
-
|
|
81
|
-
tools as ToolDefinition[] | undefined,
|
|
79
|
+
return provider.sendMessage(messages as Message[], {
|
|
80
|
+
tools: tools as ToolDefinition[] | undefined,
|
|
82
81
|
systemPrompt,
|
|
83
|
-
|
|
84
|
-
);
|
|
82
|
+
config: { ...((config as SendMessageConfig) ?? {}), callSite },
|
|
83
|
+
});
|
|
85
84
|
}
|
|
86
85
|
|
|
87
86
|
function handleSttListProviderIds(): string[] {
|
|
@@ -22,36 +22,15 @@ import { z } from "zod";
|
|
|
22
22
|
import type { MeetHostSupervisor } from "../../daemon/meet-host-supervisor.js";
|
|
23
23
|
import { registerShutdownHook } from "../../daemon/shutdown-registry.js";
|
|
24
24
|
import { registerSkillRoute } from "../../runtime/skill-route-registry.js";
|
|
25
|
-
import { resolveExecutionTarget } from "../../tools/execution-target.js";
|
|
26
25
|
import { registerSkillTools } from "../../tools/registry.js";
|
|
27
|
-
import
|
|
28
|
-
import {
|
|
26
|
+
import { finalizeTool } from "../../tools/tool-defaults.js";
|
|
27
|
+
import { ToolDefinitionSchema } from "../../tools/types.js";
|
|
29
28
|
import { getLogger } from "../../util/logger.js";
|
|
30
29
|
import type { SkillIpcRoute } from "../skill-ipc-types.js";
|
|
31
30
|
import type { SkillIpcConnection } from "../skill-server.js";
|
|
32
31
|
|
|
33
32
|
const log = getLogger("skill-routes-registries");
|
|
34
33
|
|
|
35
|
-
// ── Wire-level schemas ────────────────────────────────────────────────
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Serialized tool manifest entry sent over IPC. Mirrors the subset of
|
|
39
|
-
* {@link Tool} a skill process can describe without carrying the tool's
|
|
40
|
-
* executable closure across the socket; the closure is synthesized
|
|
41
|
-
* daemon-side (see {@link buildProxyTool}) to forward invocations back
|
|
42
|
-
* over IPC.
|
|
43
|
-
*/
|
|
44
|
-
const ToolManifestSchema = z.object({
|
|
45
|
-
name: z.string().min(1),
|
|
46
|
-
description: z.string(),
|
|
47
|
-
input_schema: z.record(z.string(), z.unknown()),
|
|
48
|
-
defaultRiskLevel: z.enum(["low", "medium", "high"]),
|
|
49
|
-
category: z.string().min(1),
|
|
50
|
-
executionTarget: z.enum(["sandbox", "host"]).optional(),
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
export type ToolManifest = z.infer<typeof ToolManifestSchema>;
|
|
54
|
-
|
|
55
34
|
// `skillId` lives at the params level rather than per-tool: a single
|
|
56
35
|
// `register_tools` IPC frame is always one skill's batch, ownership flows
|
|
57
36
|
// through `registerSkillTools(skillId, tools)` into the registry's
|
|
@@ -61,7 +40,7 @@ export type ToolManifest = z.infer<typeof ToolManifestSchema>;
|
|
|
61
40
|
// in-process on the assistant side.
|
|
62
41
|
const RegisterToolsParams = z.object({
|
|
63
42
|
skillId: z.string().min(1),
|
|
64
|
-
tools: z.array(
|
|
43
|
+
tools: z.array(ToolDefinitionSchema).min(1),
|
|
65
44
|
});
|
|
66
45
|
|
|
67
46
|
const RegisterSkillRouteParams = z.object({
|
|
@@ -170,39 +149,6 @@ export function __getActiveSessionCountForTesting(): number {
|
|
|
170
149
|
return activeSessions.size;
|
|
171
150
|
}
|
|
172
151
|
|
|
173
|
-
// ── Proxy-tool construction ───────────────────────────────────────────
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Build a daemon-side {@link Tool} whose `execute` routes back to the
|
|
177
|
-
* remote skill over IPC. PR 28 replaces the stub body with a real
|
|
178
|
-
* `skill.dispatch_tool` round-trip; until then we keep a shape-complete
|
|
179
|
-
* proxy in the registry so the rest of the tool-manifest plumbing can be
|
|
180
|
-
* exercised end-to-end.
|
|
181
|
-
*/
|
|
182
|
-
function buildProxyTool(manifest: ToolManifest): Tool {
|
|
183
|
-
// RiskLevel is a string enum whose values are "low" | "medium" | "high",
|
|
184
|
-
// matching the schema above exactly — the cast is a no-op at runtime.
|
|
185
|
-
return {
|
|
186
|
-
name: manifest.name,
|
|
187
|
-
description: manifest.description,
|
|
188
|
-
input_schema: manifest.input_schema as object,
|
|
189
|
-
category: manifest.category,
|
|
190
|
-
defaultRiskLevel: manifest.defaultRiskLevel as RiskLevel,
|
|
191
|
-
executionTarget: resolveExecutionTarget({
|
|
192
|
-
name: manifest.name,
|
|
193
|
-
executionTarget: manifest.executionTarget as ExecutionTarget | undefined,
|
|
194
|
-
}),
|
|
195
|
-
execute: async () => {
|
|
196
|
-
// Only reached when no supervisor is attached (tests/boot race);
|
|
197
|
-
// the supervisor short-circuit above replaces this with the
|
|
198
|
-
// manifest's dispatching execute closure on the production path.
|
|
199
|
-
throw new Error(
|
|
200
|
-
`Skill tool "${manifest.name}" invocation requires an attached MeetHostSupervisor`,
|
|
201
|
-
);
|
|
202
|
-
},
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
152
|
// ── Handlers ──────────────────────────────────────────────────────────
|
|
207
153
|
|
|
208
154
|
async function handleRegisterTools(
|
|
@@ -212,6 +158,13 @@ async function handleRegisterTools(
|
|
|
212
158
|
const { skillId, tools } = RegisterToolsParams.parse(params);
|
|
213
159
|
const conn = connection as SkillIpcConnection | undefined;
|
|
214
160
|
|
|
161
|
+
// Finalize before branching so both the supervisor short-circuit and
|
|
162
|
+
// the in-memory registration path see a `Tool[]` with guaranteed
|
|
163
|
+
// `name`. The execute closure arrives as a no-op error closure from
|
|
164
|
+
// `finalizeTool`; the production (supervisor) path replaces it with
|
|
165
|
+
// the dispatching closure installed by the manifest loader at boot.
|
|
166
|
+
const proxies = tools.map((t) => finalizeTool(t));
|
|
167
|
+
|
|
215
168
|
// Supervisor short-circuit: when a supervisor is registered, the
|
|
216
169
|
// manifest loader has already installed proxy tools at daemon boot.
|
|
217
170
|
// Re-installing here would double-register and clobber the manifest's
|
|
@@ -222,16 +175,15 @@ async function handleRegisterTools(
|
|
|
222
175
|
if (conn) sessionSupervisor.setActiveConnection(conn);
|
|
223
176
|
log.info(
|
|
224
177
|
{
|
|
225
|
-
count:
|
|
226
|
-
names:
|
|
178
|
+
count: proxies.length,
|
|
179
|
+
names: proxies.map((t) => t.name),
|
|
227
180
|
ownerSkillId: skillId,
|
|
228
181
|
},
|
|
229
182
|
"Supervisor active: skipping in-memory tool re-registration; manifest proxies serve dispatches",
|
|
230
183
|
);
|
|
231
|
-
return { registered:
|
|
184
|
+
return { registered: proxies.map((t) => t.name) };
|
|
232
185
|
}
|
|
233
186
|
|
|
234
|
-
const proxies = tools.map(buildProxyTool);
|
|
235
187
|
// `registerExternalTools` is only consumed inside `initializeTools()` at
|
|
236
188
|
// daemon boot; IPC children connect after boot, so route through
|
|
237
189
|
// `registerSkillTools` into the live registry the agent-loop reads from.
|
|
@@ -47,13 +47,16 @@ async function createMessage(role: "user" | "assistant" = "user") {
|
|
|
47
47
|
conversation.id,
|
|
48
48
|
role,
|
|
49
49
|
role === "user" ? "Example user utterance" : "Example assistant response",
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
50
|
+
{
|
|
51
|
+
metadata:
|
|
52
|
+
role === "user"
|
|
53
|
+
? { userMessageChannel: "vellum", userMessageInterface: "macos" }
|
|
54
|
+
: {
|
|
55
|
+
assistantMessageChannel: "vellum",
|
|
56
|
+
assistantMessageInterface: "macos",
|
|
57
|
+
},
|
|
58
|
+
skipIndexing: true,
|
|
59
|
+
},
|
|
57
60
|
);
|
|
58
61
|
return { conversation, message };
|
|
59
62
|
}
|
|
@@ -371,15 +374,25 @@ describe("live voice audio archive", () => {
|
|
|
371
374
|
conversation.id,
|
|
372
375
|
"user",
|
|
373
376
|
"Example source utterance",
|
|
374
|
-
{
|
|
375
|
-
|
|
377
|
+
{
|
|
378
|
+
metadata: {
|
|
379
|
+
userMessageChannel: "vellum",
|
|
380
|
+
userMessageInterface: "macos",
|
|
381
|
+
},
|
|
382
|
+
skipIndexing: true,
|
|
383
|
+
},
|
|
376
384
|
);
|
|
377
385
|
const targetMessage = await addMessage(
|
|
378
386
|
conversation.id,
|
|
379
387
|
"user",
|
|
380
388
|
"Example target utterance",
|
|
381
|
-
{
|
|
382
|
-
|
|
389
|
+
{
|
|
390
|
+
metadata: {
|
|
391
|
+
userMessageChannel: "vellum",
|
|
392
|
+
userMessageInterface: "macos",
|
|
393
|
+
},
|
|
394
|
+
skipIndexing: true,
|
|
395
|
+
},
|
|
383
396
|
);
|
|
384
397
|
|
|
385
398
|
const archived = archiveLiveVoiceUserUtteranceAudio({
|
|
@@ -155,7 +155,7 @@ describe("countConversations", () => {
|
|
|
155
155
|
const priv = createConversation("private-1");
|
|
156
156
|
setConversationType(priv.id, "private");
|
|
157
157
|
|
|
158
|
-
expect(countConversations(
|
|
158
|
+
expect(countConversations("background")).toBe(2);
|
|
159
159
|
});
|
|
160
160
|
|
|
161
161
|
test("includes standard conversations with group_id system:background in background count", () => {
|
|
@@ -170,13 +170,13 @@ describe("countConversations", () => {
|
|
|
170
170
|
createConversation("foreground-1");
|
|
171
171
|
|
|
172
172
|
// WHEN counting background conversations
|
|
173
|
-
const bgCount = countConversations(
|
|
173
|
+
const bgCount = countConversations("background");
|
|
174
174
|
|
|
175
175
|
// THEN the heartbeat conversation is included
|
|
176
176
|
expect(bgCount).toBe(1);
|
|
177
177
|
|
|
178
178
|
// AND excluded from the foreground count
|
|
179
|
-
expect(countConversations(
|
|
179
|
+
expect(countConversations("standard")).toBe(1);
|
|
180
180
|
});
|
|
181
181
|
|
|
182
182
|
test("excludes standard conversations with group_id system:background from foreground count", () => {
|
|
@@ -191,7 +191,59 @@ describe("countConversations", () => {
|
|
|
191
191
|
|
|
192
192
|
// WHEN counting foreground conversations
|
|
193
193
|
// THEN the heartbeat is excluded
|
|
194
|
-
expect(countConversations(
|
|
194
|
+
expect(countConversations("standard")).toBe(2);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test('"scheduled" count returns only scheduled rows', () => {
|
|
198
|
+
// GIVEN one scheduled, one background, and one foreground conversation
|
|
199
|
+
createConversation({ title: "sched-1", conversationType: "scheduled" });
|
|
200
|
+
createConversation({ title: "bg-1", conversationType: "background" });
|
|
201
|
+
createConversation("foreground-1");
|
|
202
|
+
|
|
203
|
+
// WHEN counting scheduled conversations
|
|
204
|
+
// THEN only the scheduled row is counted (background is excluded)
|
|
205
|
+
expect(countConversations("scheduled")).toBe(1);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
describe("archiveStatus", () => {
|
|
209
|
+
test("defaults to active — archived rows are excluded from the count", () => {
|
|
210
|
+
// GIVEN one live and one archived foreground conversation
|
|
211
|
+
createConversation("live-1");
|
|
212
|
+
const archived = createConversation("archived-1");
|
|
213
|
+
rawRun(
|
|
214
|
+
"UPDATE conversations SET archived_at = ? WHERE id = ?",
|
|
215
|
+
Date.now(),
|
|
216
|
+
archived.id,
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
expect(countConversations()).toBe(1);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
test('archiveStatus "archived" returns the archived count only', () => {
|
|
223
|
+
createConversation("live-1");
|
|
224
|
+
const a1 = createConversation("archived-1");
|
|
225
|
+
const a2 = createConversation("archived-2");
|
|
226
|
+
rawRun(
|
|
227
|
+
"UPDATE conversations SET archived_at = ? WHERE id IN (?, ?)",
|
|
228
|
+
Date.now(),
|
|
229
|
+
a1.id,
|
|
230
|
+
a2.id,
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
expect(countConversations("standard", "archived")).toBe(2);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test('archiveStatus "all" returns both', () => {
|
|
237
|
+
createConversation("live-1");
|
|
238
|
+
const archived = createConversation("archived-1");
|
|
239
|
+
rawRun(
|
|
240
|
+
"UPDATE conversations SET archived_at = ? WHERE id = ?",
|
|
241
|
+
Date.now(),
|
|
242
|
+
archived.id,
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
expect(countConversations("standard", "all")).toBe(2);
|
|
246
|
+
});
|
|
195
247
|
});
|
|
196
248
|
});
|
|
197
249
|
|
|
@@ -215,7 +267,7 @@ describe("listConversations", () => {
|
|
|
215
267
|
createConversation("foreground-1");
|
|
216
268
|
|
|
217
269
|
// WHEN listing background conversations
|
|
218
|
-
const bgList = listConversations(100,
|
|
270
|
+
const bgList = listConversations(100, "background");
|
|
219
271
|
|
|
220
272
|
// THEN both background and heartbeat conversations are returned
|
|
221
273
|
expect(bgList).toHaveLength(2);
|
|
@@ -236,7 +288,7 @@ describe("listConversations", () => {
|
|
|
236
288
|
createConversation("foreground-1");
|
|
237
289
|
|
|
238
290
|
// WHEN listing foreground conversations
|
|
239
|
-
const fgList = listConversations(100,
|
|
291
|
+
const fgList = listConversations(100, "standard");
|
|
240
292
|
|
|
241
293
|
// THEN only the foreground conversation is returned
|
|
242
294
|
expect(fgList).toHaveLength(1);
|
|
@@ -252,16 +304,148 @@ describe("listConversations", () => {
|
|
|
252
304
|
);
|
|
253
305
|
|
|
254
306
|
// WHEN listing background conversations
|
|
255
|
-
const bgList = listConversations(100,
|
|
307
|
+
const bgList = listConversations(100, "background");
|
|
256
308
|
|
|
257
309
|
// THEN it appears in the background list
|
|
258
310
|
expect(bgList).toHaveLength(1);
|
|
259
311
|
expect(bgList[0]!.title).toBe("schedule-routed");
|
|
260
312
|
|
|
261
313
|
// AND not in the foreground list
|
|
262
|
-
const fgList = listConversations(100,
|
|
314
|
+
const fgList = listConversations(100, "standard");
|
|
263
315
|
expect(fgList).toHaveLength(0);
|
|
264
316
|
});
|
|
317
|
+
|
|
318
|
+
test('"scheduled" fetch returns only scheduled rows and excludes plain background', () => {
|
|
319
|
+
// GIVEN a scheduled conversation, a background conversation, and a foreground one
|
|
320
|
+
createConversation({ title: "sched-1", conversationType: "scheduled" });
|
|
321
|
+
createConversation({ title: "bg-1", conversationType: "background" });
|
|
322
|
+
createConversation("foreground-1");
|
|
323
|
+
|
|
324
|
+
// WHEN listing scheduled conversations
|
|
325
|
+
const scheduledList = listConversations(100, "scheduled");
|
|
326
|
+
|
|
327
|
+
// THEN only the scheduled conversation is returned
|
|
328
|
+
expect(scheduledList).toHaveLength(1);
|
|
329
|
+
expect(scheduledList[0]!.title).toBe("sched-1");
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
test('"scheduled" fetch includes standard rows routed to group_id system:scheduled but not system:background', () => {
|
|
333
|
+
// GIVEN a standard conversation routed to system:scheduled
|
|
334
|
+
const scheduledRouted = createConversation("schedule-routed");
|
|
335
|
+
rawRun(
|
|
336
|
+
"UPDATE conversations SET group_id = 'system:scheduled' WHERE id = ?",
|
|
337
|
+
scheduledRouted.id,
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
// AND a standard conversation routed to system:background
|
|
341
|
+
const backgroundRouted = createConversation("background-routed");
|
|
342
|
+
rawRun(
|
|
343
|
+
"UPDATE conversations SET group_id = 'system:background' WHERE id = ?",
|
|
344
|
+
backgroundRouted.id,
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
// WHEN listing scheduled conversations
|
|
348
|
+
const scheduledList = listConversations(100, "scheduled");
|
|
349
|
+
|
|
350
|
+
// THEN only the system:scheduled row appears
|
|
351
|
+
expect(scheduledList).toHaveLength(1);
|
|
352
|
+
expect(scheduledList[0]!.title).toBe("schedule-routed");
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
test('"scheduled" fetch excludes subagent runs', () => {
|
|
356
|
+
// GIVEN a scheduled conversation produced by a subagent
|
|
357
|
+
createConversation({
|
|
358
|
+
title: "subagent-sched",
|
|
359
|
+
conversationType: "scheduled",
|
|
360
|
+
source: "subagent",
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
// WHEN listing scheduled conversations
|
|
364
|
+
const scheduledList = listConversations(100, "scheduled");
|
|
365
|
+
|
|
366
|
+
// THEN the subagent run is excluded
|
|
367
|
+
expect(scheduledList).toHaveLength(0);
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
describe("archiveStatus", () => {
|
|
371
|
+
test("defaults to active — archived rows are excluded", () => {
|
|
372
|
+
// GIVEN a live conversation and an archived one
|
|
373
|
+
createConversation("live-1");
|
|
374
|
+
const archived = createConversation("archived-1");
|
|
375
|
+
rawRun(
|
|
376
|
+
"UPDATE conversations SET archived_at = ? WHERE id = ?",
|
|
377
|
+
Date.now(),
|
|
378
|
+
archived.id,
|
|
379
|
+
);
|
|
380
|
+
|
|
381
|
+
// WHEN listing without an explicit archiveStatus
|
|
382
|
+
const rows = listConversations(100, "standard");
|
|
383
|
+
|
|
384
|
+
// THEN only the live conversation appears
|
|
385
|
+
expect(rows).toHaveLength(1);
|
|
386
|
+
expect(rows[0]!.title).toBe("live-1");
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
test('archiveStatus "archived" returns only archived rows', () => {
|
|
390
|
+
// GIVEN a live conversation and an archived one
|
|
391
|
+
createConversation("live-1");
|
|
392
|
+
const archived = createConversation("archived-1");
|
|
393
|
+
rawRun(
|
|
394
|
+
"UPDATE conversations SET archived_at = ? WHERE id = ?",
|
|
395
|
+
Date.now(),
|
|
396
|
+
archived.id,
|
|
397
|
+
);
|
|
398
|
+
|
|
399
|
+
// WHEN listing with archiveStatus "archived"
|
|
400
|
+
const rows = listConversations(100, "standard", 0, "archived");
|
|
401
|
+
|
|
402
|
+
// THEN only the archived conversation appears
|
|
403
|
+
expect(rows).toHaveLength(1);
|
|
404
|
+
expect(rows[0]!.title).toBe("archived-1");
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
test('archiveStatus "all" returns both active and archived rows', () => {
|
|
408
|
+
// GIVEN a live conversation and an archived one
|
|
409
|
+
createConversation("live-1");
|
|
410
|
+
const archived = createConversation("archived-1");
|
|
411
|
+
rawRun(
|
|
412
|
+
"UPDATE conversations SET archived_at = ? WHERE id = ?",
|
|
413
|
+
Date.now(),
|
|
414
|
+
archived.id,
|
|
415
|
+
);
|
|
416
|
+
|
|
417
|
+
// WHEN listing with archiveStatus "all"
|
|
418
|
+
const rows = listConversations(100, "standard", 0, "all");
|
|
419
|
+
|
|
420
|
+
// THEN both conversations appear
|
|
421
|
+
expect(rows).toHaveLength(2);
|
|
422
|
+
const titles = rows.map((c) => c.title);
|
|
423
|
+
expect(titles).toContain("live-1");
|
|
424
|
+
expect(titles).toContain("archived-1");
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
test('archiveStatus "archived" composes with background-only', () => {
|
|
428
|
+
// GIVEN an archived background conversation and an archived foreground one
|
|
429
|
+
const archivedBg = createConversation({
|
|
430
|
+
title: "archived-bg",
|
|
431
|
+
conversationType: "background",
|
|
432
|
+
});
|
|
433
|
+
const archivedFg = createConversation("archived-fg");
|
|
434
|
+
rawRun(
|
|
435
|
+
"UPDATE conversations SET archived_at = ? WHERE id IN (?, ?)",
|
|
436
|
+
Date.now(),
|
|
437
|
+
archivedBg.id,
|
|
438
|
+
archivedFg.id,
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
// WHEN listing archived background conversations
|
|
442
|
+
const rows = listConversations(100, "background", 0, "archived");
|
|
443
|
+
|
|
444
|
+
// THEN only the archived background row appears
|
|
445
|
+
expect(rows).toHaveLength(1);
|
|
446
|
+
expect(rows[0]!.title).toBe("archived-bg");
|
|
447
|
+
});
|
|
448
|
+
});
|
|
265
449
|
});
|
|
266
450
|
|
|
267
451
|
describe("listConversationsBySource", () => {
|