@vellumai/assistant 0.10.2-dev.202606250318.5e7cfb0 → 0.10.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/bun.lock +0 -20
- package/docs/workspace-tools.md +33 -42
- package/eslint-rules/cli-no-daemon-internals.js +0 -6
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +0 -31
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +0 -44
- package/node_modules/@vellumai/gateway-client/src/index.ts +0 -14
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +0 -17
- package/node_modules/@vellumai/service-contracts/package.json +0 -1
- package/node_modules/@vellumai/service-contracts/src/index.ts +0 -1
- package/openapi.yaml +0 -155
- package/package.json +1 -4
- package/scripts/test.sh +15 -36
- package/src/__tests__/actor-token-service.test.ts +14 -36
- package/src/__tests__/agent-loop-override-profile.test.ts +0 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +0 -2
- package/src/__tests__/annotate-activity-metadata.test.ts +0 -2
- package/src/__tests__/annotate-risk-options.test.ts +0 -2
- package/src/__tests__/approval-cascade.test.ts +0 -2
- package/src/__tests__/assistant-attachments.test.ts +0 -42
- package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
- package/src/__tests__/btw-routes.test.ts +0 -2
- package/src/__tests__/build-persisted-content.test.ts +0 -2
- package/src/__tests__/call-controller.test.ts +0 -19
- package/src/__tests__/channel-guardian.test.ts +58 -94
- package/src/__tests__/channel-reply-delivery.test.ts +0 -2
- package/src/__tests__/compaction-events.test.ts +0 -2
- package/src/__tests__/compaction.benchmark.test.ts +0 -2
- package/src/__tests__/compactor-call-site-logging.test.ts +0 -2
- package/src/__tests__/compactor-low-watermark-cut.test.ts +0 -2
- package/src/__tests__/compactor-preserved-tail-count.test.ts +0 -2
- package/src/__tests__/compactor-summary-call-truncation.test.ts +0 -2
- package/src/__tests__/compactor-web-search-strip.test.ts +0 -2
- package/src/__tests__/config-loader-backfill.test.ts +10 -123
- package/src/__tests__/config-schema.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -31
- package/src/__tests__/contacts-relay-reads.test.ts +15 -13
- package/src/__tests__/conversation-abort-tool-results.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop.test.ts +0 -134
- package/src/__tests__/conversation-analysis-routes.test.ts +0 -2
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +0 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -2
- package/src/__tests__/conversation-history-web-search.test.ts +0 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +0 -2
- package/src/__tests__/conversation-load-history-stripped.test.ts +0 -2
- package/src/__tests__/conversation-pairing.test.ts +0 -2
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +0 -2
- package/src/__tests__/conversation-process-callsite.test.ts +0 -2
- package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -2
- package/src/__tests__/conversation-queue.test.ts +0 -91
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -14
- package/src/__tests__/conversation-routes-slash-commands.test.ts +0 -14
- package/src/__tests__/conversation-slash-queue.test.ts +0 -2
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -2
- package/src/__tests__/conversation-speed-override.test.ts +0 -2
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -29
- package/src/__tests__/conversation-title-service.test.ts +0 -2
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -47
- package/src/__tests__/conversation-usage.test.ts +0 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -2
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -2
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -2
- package/src/__tests__/credential-security-invariants.test.ts +1 -1
- package/src/__tests__/db-migration-rollback.test.ts +171 -205
- package/src/__tests__/db-test-helpers.ts +4 -5
- package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -4
- package/src/__tests__/disk-pressure-guard.test.ts +0 -41
- package/src/__tests__/dm-persistence.test.ts +0 -2
- package/src/__tests__/emit-signal-routing-intent.test.ts +5 -10
- package/src/__tests__/events-dev-bypass-actor.test.ts +1 -7
- package/src/__tests__/exploration-drift-hook.test.ts +2 -3
- package/src/__tests__/filing-service.test.ts +0 -2
- package/src/__tests__/guardian-binding-drift-heal.test.ts +10 -75
- package/src/__tests__/guardian-dispatch.test.ts +1 -95
- package/src/__tests__/guardian-outbound-http.test.ts +0 -13
- package/src/__tests__/heartbeat-disk-pressure.test.ts +0 -2
- package/src/__tests__/heartbeat-service.test.ts +0 -2
- package/src/__tests__/helpers/channel-test-adapter.ts +7 -1
- package/src/__tests__/host-app-control-routes.test.ts +30 -24
- package/src/__tests__/host-bash-routes.test.ts +41 -31
- package/src/__tests__/host-browser-routes.test.ts +32 -26
- package/src/__tests__/host-cu-routes-targeted.test.ts +33 -25
- package/src/__tests__/host-file-routes-targeted.test.ts +52 -40
- package/src/__tests__/host-transfer-routes-targeted.test.ts +43 -31
- package/src/__tests__/http-user-message-parity.test.ts +8 -290
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -28
- package/src/__tests__/inbound-slack-persistence.test.ts +0 -2
- package/src/__tests__/invite-redemption-service.test.ts +0 -198
- package/src/__tests__/llm-context-normalization.test.ts +0 -105
- package/src/__tests__/llm-request-log-error-payload.test.ts +9 -71
- package/src/__tests__/llm-usage-store.test.ts +0 -25
- package/src/__tests__/mcp-health-check.test.ts +1 -2
- package/src/__tests__/media-stream-server-integration.test.ts +0 -127
- package/src/__tests__/memory-retrieval-hook.test.ts +0 -2
- package/src/__tests__/messaging-send-tool.test.ts +0 -2
- package/src/__tests__/migration-import-from-url.test.ts +2 -2
- package/src/__tests__/mtime-cache.test.ts +5 -146
- package/src/__tests__/native-web-search.test.ts +0 -2
- package/src/__tests__/non-member-access-request.test.ts +17 -189
- package/src/__tests__/notification-broadcaster.test.ts +0 -4
- package/src/__tests__/notification-decision-recipient-context.test.ts +32 -33
- package/src/__tests__/notification-deep-link.test.ts +0 -6
- package/src/__tests__/notification-guardian-path.test.ts +0 -19
- package/src/__tests__/openai-provider.test.ts +12 -22
- package/src/__tests__/openai-responses-provider.test.ts +2 -12
- package/src/__tests__/outbound-slack-persistence.test.ts +0 -2
- package/src/__tests__/pending-interactions-resolved-event.test.ts +4 -7
- package/src/__tests__/persistence-secret-redaction.test.ts +0 -2
- package/src/__tests__/plugin-bootstrap.test.ts +73 -3
- package/src/__tests__/plugin-route-contribution.test.ts +17 -4
- package/src/__tests__/plugin-tool-contribution.test.ts +18 -3
- package/src/__tests__/plugin-types.test.ts +2 -0
- package/src/__tests__/process-message-background-slack.test.ts +0 -2
- package/src/__tests__/process-message-display-content.test.ts +0 -2
- package/src/__tests__/provider-error-scenarios.test.ts +4 -5
- package/src/__tests__/provider-usage-tracking.test.ts +0 -39
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +0 -2
- package/src/__tests__/registry.test.ts +1 -4
- package/src/__tests__/relay-server.test.ts +25 -694
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -0
- package/src/__tests__/secret-ingress-http.test.ts +0 -14
- package/src/__tests__/send-endpoint-busy.test.ts +8 -30
- package/src/__tests__/skills.test.ts +0 -44
- package/src/__tests__/slack-inbound-verification.test.ts +2 -47
- package/src/__tests__/stt-hints.test.ts +13 -44
- package/src/__tests__/subagent-detail.test.ts +0 -27
- package/src/__tests__/subagent-disposal.test.ts +0 -65
- package/src/__tests__/subagent-notify-parent.test.ts +0 -2
- package/src/__tests__/subagent-role-registry.test.ts +2 -7
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +0 -2
- package/src/__tests__/subagent-tools.test.ts +0 -2
- package/src/__tests__/suggestion-routes.test.ts +0 -2
- package/src/__tests__/title-generate-hook.test.ts +0 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -2
- package/src/__tests__/tool-executor.test.ts +11 -16
- package/src/__tests__/tool-preview-lifecycle.test.ts +0 -2
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +0 -2
- package/src/__tests__/tool-start-timestamp.test.ts +0 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +10 -10
- package/src/__tests__/twilio-routes.test.ts +0 -96
- package/src/__tests__/ui-file-upload-surface.test.ts +0 -86
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
- package/src/__tests__/voice-invite-redemption.test.ts +0 -33
- package/src/__tests__/web-search-backend-failure.test.ts +0 -2
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +35 -14
- package/src/__tests__/workspace-tool-loader.test.ts +2 -195
- package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
- package/src/agent/loop.ts +0 -56
- package/src/api/index.ts +1 -19
- package/src/api/responses/llm-request-log-entry.ts +0 -29
- package/src/api/responses/subagent-detail.ts +0 -17
- package/src/api/surfaces.ts +3 -39
- package/src/approvals/guardian-request-resolvers.ts +11 -1
- package/src/calls/__tests__/relay-setup-router.test.ts +4 -262
- package/src/calls/call-domain.ts +3 -3
- package/src/calls/guardian-dispatch.ts +8 -10
- package/src/calls/inbound-trust-reader.ts +1 -17
- package/src/calls/media-stream-server.ts +0 -21
- package/src/calls/relay-server.ts +50 -167
- package/src/calls/relay-setup-router.ts +7 -37
- package/src/calls/relay-verification.ts +4 -4
- package/src/calls/stt-hints.ts +12 -9
- package/src/calls/twilio-routes.ts +4 -14
- package/src/channels/types.ts +20 -10
- package/src/cli/commands/__tests__/cache.test.ts +1 -8
- package/src/cli/commands/cache.ts +181 -194
- package/src/cli/commands/db/__tests__/repair.test.ts +5 -6
- package/src/cli/commands/db/status.ts +1 -37
- package/src/cli/commands/mcp.ts +218 -252
- package/src/cli/commands/memory/index.ts +0 -2
- package/src/cli/commands/plugins.ts +3 -75
- package/src/cli/lib/__tests__/install-from-github.test.ts +0 -102
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +1 -160
- package/src/cli/lib/list-installed-plugins.ts +1 -179
- package/src/config/__tests__/sync-gated-profiles.test.ts +3 -11
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +17 -27
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +3 -13
- package/src/config/bundled-skills/subagent/SKILL.md +1 -1
- package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
- package/src/config/feature-flag-registry.json +13 -5
- package/src/config/loader.ts +5 -38
- package/src/config/schemas/__tests__/memory-v3.test.ts +0 -1
- package/src/config/schemas/memory-lifecycle.ts +0 -12
- package/src/config/schemas/memory-v3.ts +0 -7
- package/src/config/schemas/memory.ts +0 -4
- package/src/config/schemas/timeouts.ts +0 -8
- package/src/config/seed-inference-profiles.ts +11 -21
- package/src/config/skills.ts +5 -27
- package/src/config/sync-gated-profiles.ts +13 -12
- package/src/contacts/contacts-write.ts +0 -3
- package/src/daemon/assistant-attachments.ts +4 -27
- package/src/daemon/conversation-agent-loop.ts +0 -28
- package/src/daemon/conversation-process.ts +16 -35
- package/src/daemon/conversation-surfaces.ts +38 -111
- package/src/daemon/conversation-tool-setup.ts +16 -50
- package/src/daemon/conversation.ts +1 -13
- package/src/daemon/disk-pressure-guard.ts +2 -12
- package/src/daemon/event-loop-watchdog.ts +1 -28
- package/src/daemon/external-plugins-bootstrap.ts +34 -4
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -25
- package/src/daemon/handlers/config-a2a.ts +14 -6
- package/src/daemon/handlers/config-channels.ts +22 -78
- package/src/daemon/handlers/conversations.ts +0 -77
- package/src/daemon/lifecycle.ts +0 -4
- package/src/daemon/mcp-reload-service.ts +0 -10
- package/src/daemon/memory-v2-startup.test.ts +0 -72
- package/src/daemon/memory-v2-startup.ts +19 -87
- package/src/daemon/message-types/conversations.ts +0 -2
- package/src/daemon/message-types/surfaces.ts +12 -12
- package/src/daemon/server.ts +4 -0
- package/src/daemon/shutdown-handlers.ts +0 -20
- package/src/daemon/tool-setup-types.ts +0 -9
- package/src/daemon/workspace-tools-watcher.ts +328 -0
- package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
- package/src/ipc/assistant-server.ts +2 -2
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
- package/src/mcp/client.ts +1 -15
- package/src/mcp/mcp-auth-orchestrator.ts +1 -6
- package/src/mcp/mcp-oauth-provider.ts +8 -19
- package/src/memory/__tests__/memory-retrospective-job.test.ts +0 -8
- package/src/memory/conversation-crud.ts +0 -38
- package/src/memory/db-connection.ts +3 -22
- package/src/memory/db-init.ts +502 -36
- package/src/memory/db-singleton.ts +4 -6
- package/src/memory/jobs-worker.ts +0 -58
- package/src/memory/llm-request-log-store.ts +1 -26
- package/src/memory/llm-usage-store.ts +20 -48
- package/src/memory/memory-retrospective-job.ts +8 -9
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +56 -130
- package/src/memory/migrations/__tests__/run-migrations.test.ts +2 -2
- package/src/memory/migrations/registry.ts +573 -0
- package/src/memory/migrations/run-migrations.ts +6 -90
- package/src/memory/migrations/validate-migration-state.ts +66 -101
- package/src/memory/schema/conversations.ts +0 -9
- package/src/memory/schema/infrastructure.ts +0 -20
- package/src/memory/v2/__tests__/cli-command-store.test.ts +0 -25
- package/src/memory/v2/__tests__/skill-store.test.ts +0 -80
- package/src/memory/v2/cli-command-store.ts +38 -75
- package/src/memory/v2/prompts/consolidation.ts +82 -13
- package/src/memory/v2/prompts/router.ts +93 -21
- package/src/memory/v2/skill-store.ts +31 -68
- package/src/notifications/__tests__/broadcaster.test.ts +8 -16
- package/src/notifications/__tests__/decision-engine.test.ts +9 -78
- package/src/notifications/broadcaster.ts +1 -8
- package/src/notifications/decision-engine.ts +7 -15
- package/src/notifications/destination-resolver.ts +24 -68
- package/src/notifications/emit-signal.ts +14 -39
- package/src/permissions/question-prompter.test.ts +1 -1
- package/src/permissions/question-prompter.ts +4 -7
- package/src/plugin-api/index.ts +6 -6
- package/src/plugin-api/types.ts +5 -3
- package/src/plugin-api/vision-support.test.ts +4 -28
- package/src/plugin-api/vision-support.ts +31 -66
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +0 -161
- package/src/plugins/defaults/advisor/consult.ts +6 -110
- package/src/plugins/defaults/advisor/steering.ts +2 -14
- package/src/plugins/defaults/advisor/tools/advisor.ts +5 -32
- package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +1 -2
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +7 -47
- package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +11 -10
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +20 -12
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +11 -42
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +3 -33
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +4 -48
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +8 -4
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +15 -43
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +2 -11
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +13 -77
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +11 -12
- package/src/plugins/mtime-cache.ts +291 -76
- package/src/plugins/pipeline.ts +13 -111
- package/src/plugins/types.ts +2 -0
- package/src/providers/anthropic/client.ts +0 -5
- package/src/providers/call-site-routing.ts +0 -4
- package/src/providers/model-catalog.ts +0 -16
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/chat-completions-provider.ts +83 -37
- package/src/providers/openai/responses-provider.ts +46 -50
- package/src/providers/openrouter/client.ts +0 -5
- package/src/providers/provider-send-message.ts +0 -4
- package/src/providers/ratelimit.ts +0 -4
- package/src/providers/retry.ts +0 -4
- package/src/providers/types.ts +0 -9
- package/src/providers/usage-tracking.ts +0 -4
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +3 -335
- package/src/runtime/access-request-helper.ts +39 -19
- package/src/runtime/actor-trust-resolver.ts +2 -2
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +2 -9
- package/src/runtime/auth/require-bound-guardian.ts +11 -21
- package/src/runtime/channel-verification-service.ts +31 -56
- package/src/runtime/confirmation-request-guardian-bridge.ts +3 -3
- package/src/runtime/guardian-vellum-migration.ts +7 -66
- package/src/runtime/invite-redemption-service.ts +187 -198
- package/src/runtime/local-actor-identity.ts +11 -76
- package/src/runtime/pending-interactions.ts +1 -11
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +5 -56
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +0 -187
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -13
- package/src/runtime/routes/channel-verification-routes.ts +3 -3
- package/src/runtime/routes/contact-routes.ts +32 -8
- package/src/runtime/routes/conversation-cli-routes.ts +5 -4
- package/src/runtime/routes/conversation-list-routes.ts +7 -4
- package/src/runtime/routes/conversation-query-routes.ts +0 -72
- package/src/runtime/routes/conversation-routes.ts +85 -84
- package/src/runtime/routes/events-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +1 -3
- package/src/runtime/routes/guardian-action-routes.ts +5 -4
- package/src/runtime/routes/host-app-control-routes.ts +4 -5
- package/src/runtime/routes/host-bash-routes.ts +4 -5
- package/src/runtime/routes/host-browser-routes.ts +11 -9
- package/src/runtime/routes/host-cu-routes.ts +4 -5
- package/src/runtime/routes/host-file-routes.ts +4 -5
- package/src/runtime/routes/host-transfer-routes.ts +6 -6
- package/src/runtime/routes/http-adapter.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +2 -3
- package/src/runtime/routes/inbound-message-handler.ts +5 -5
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +5 -97
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +49 -61
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -16
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +7 -7
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +8 -21
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +3 -14
- package/src/runtime/routes/index.ts +0 -2
- package/src/runtime/routes/llm-context-normalization.ts +0 -83
- package/src/runtime/routes/mcp-auth-routes.ts +19 -171
- package/src/runtime/routes/migration-rollback-routes.ts +3 -4
- package/src/runtime/routes/migration-routes.ts +1 -4
- package/src/runtime/routes/subagents-routes.ts +0 -5
- package/src/runtime/routes/surface-action-routes.ts +56 -42
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -1
- package/src/runtime/services/conversation-serializer.ts +9 -7
- package/src/runtime/tool-grant-request-helper.ts +3 -3
- package/src/runtime/trust-verdict-consumer.ts +9 -85
- package/src/runtime/verification-outbound-actions.ts +18 -18
- package/src/signals/user-message.ts +0 -16
- package/src/subagent/manager.ts +0 -9
- package/src/subagent/types.ts +3 -3
- package/src/telemetry/types.ts +1 -34
- package/src/telemetry/usage-telemetry-reporter.test.ts +2 -3
- package/src/telemetry/usage-telemetry-reporter.ts +3 -87
- package/src/tools/ask-question/ask-question-tool.test.ts +0 -29
- package/src/tools/ask-question/ask-question-tool.ts +0 -13
- package/src/tools/executor.ts +4 -4
- package/src/tools/registry.ts +0 -18
- package/src/tools/shared/filesystem/path-policy.ts +5 -12
- package/src/tools/tool-approval-handler.ts +1 -1
- package/src/tools/tool-defaults.ts +2 -9
- package/src/tools/tool-manifest.ts +0 -3
- package/src/tools/types.ts +2 -17
- package/src/tools/workspace-tools/loader.ts +244 -348
- package/src/util/errors.ts +1 -26
- package/src/util/platform.ts +0 -5
- package/src/workflows/library.test.ts +0 -140
- package/src/workflows/library.ts +28 -82
- package/src/workspace/migrations/017-seed-persona-dirs.ts +34 -3
- package/src/workspace/migrations/019-scope-journal-to-guardian.ts +24 -3
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +66 -14
- package/src/workspace/migrations/registry.ts +0 -2
- package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +0 -91
- package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +0 -48
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +0 -28
- package/node_modules/@vellumai/service-contracts/src/channels.ts +0 -41
- package/src/__tests__/code-search-tool.test.ts +0 -585
- package/src/__tests__/guardian-expiry-notifier.test.ts +0 -282
- package/src/__tests__/mcp-config-secret-boundary.test.ts +0 -390
- package/src/__tests__/plugin-pipeline.test.ts +0 -96
- package/src/__tests__/sse-actor-principal-guardian-source.test.ts +0 -102
- package/src/__tests__/steer-on-enqueue-question.test.ts +0 -181
- package/src/__tests__/workspace-migration-111-prune-seeded-callsite-defaults.test.ts +0 -208
- package/src/agent/loop-exclusive-tool.test.ts +0 -150
- package/src/api/constants/sse-replay.ts +0 -41
- package/src/api/events/conversation-notice.ts +0 -26
- package/src/approvals/guardian-channel-delivery.ts +0 -30
- package/src/approvals/guardian-expiry-notifier.ts +0 -148
- package/src/cli/commands/memory/__tests__/worker.test.ts +0 -302
- package/src/cli/commands/memory/worker.ts +0 -175
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +0 -143
- package/src/config/prune-seeded-callsite-defaults.ts +0 -110
- package/src/contacts/__tests__/contacts-write-revoke-relay.test.ts +0 -129
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +0 -312
- package/src/contacts/__tests__/member-write-relay.test.ts +0 -202
- package/src/contacts/guardian-delivery-reader.ts +0 -223
- package/src/contacts/member-write-relay.ts +0 -189
- package/src/daemon/conversation-notices.ts +0 -60
- package/src/daemon/handlers/__tests__/config-channels.test.ts +0 -225
- package/src/hooks/hook-loader.ts +0 -341
- package/src/mcp/mcp-header-store.ts +0 -134
- package/src/memory/__tests__/301-create-watchdog-events.test.ts +0 -110
- package/src/memory/__tests__/prompt-override.test.ts +0 -192
- package/src/memory/__tests__/watchdog-events-store.test.ts +0 -161
- package/src/memory/migrations/300-add-processing-started-at.ts +0 -30
- package/src/memory/migrations/301-create-watchdog-events.ts +0 -45
- package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +0 -224
- package/src/memory/prompt-override.ts +0 -129
- package/src/memory/steps.ts +0 -573
- package/src/memory/watchdog-events-store.ts +0 -87
- package/src/memory/worker-control.ts +0 -118
- package/src/memory/worker-process.ts +0 -72
- package/src/notifications/__tests__/connected-channels.test.ts +0 -114
- package/src/notifications/__tests__/destination-resolver.test.ts +0 -256
- package/src/onboarding/checkin-event.test.ts +0 -222
- package/src/onboarding/checkin-event.ts +0 -321
- package/src/onboarding/schedule-checkin.ts +0 -190
- package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +0 -106
- package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +0 -60
- package/src/plugins/defaults/advisor/context-pack.ts +0 -288
- package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +0 -146
- package/src/plugins/surface-import.ts +0 -121
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +0 -321
- package/src/providers/openai/api-error-normalization.ts +0 -270
- package/src/runtime/__tests__/channel-verification-service.test.ts +0 -133
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +0 -181
- package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +0 -66
- package/src/runtime/__tests__/local-principal-trust.test.ts +0 -164
- package/src/runtime/anchored-guardian.test.ts +0 -156
- package/src/runtime/anchored-guardian.ts +0 -135
- package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +0 -99
- package/src/runtime/local-principal-trust.ts +0 -52
- package/src/runtime/routes/__tests__/contact-routes.test.ts +0 -212
- package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -93
- package/src/runtime/routes/onboarding-checkin-routes.ts +0 -86
- package/src/tools/filesystem/search.ts +0 -543
- package/src/util/telemetry-db-path.ts +0 -24
- package/src/workspace/migrations/111-prune-seeded-callsite-defaults.ts +0 -134
|
@@ -66,6 +66,14 @@
|
|
|
66
66
|
"description": "Gate per-turn conversation trace (user/assistant/tool-call/tool-response) collection. The daemon attaches a trace to its turn telemetry only when this flag AND the owner's share_diagnostics consent are both on. Defaults off (fail-closed) — the live value is delivered from LaunchDarkly.",
|
|
67
67
|
"defaultEnabled": false
|
|
68
68
|
},
|
|
69
|
+
{
|
|
70
|
+
"id": "workspace-tools-watcher",
|
|
71
|
+
"scope": "assistant",
|
|
72
|
+
"key": "workspace-tools-watcher",
|
|
73
|
+
"label": "Workspace tools file watcher",
|
|
74
|
+
"description": "Hot-reload workspace tool overrides under `<workspaceDir>/tools/` by watching the directory and re-registering tools as files change. When disabled, workspace tools still load from disk once at daemon startup, but live edits require a restart to take effect.",
|
|
75
|
+
"defaultEnabled": false
|
|
76
|
+
},
|
|
69
77
|
{
|
|
70
78
|
"id": "settings-developer-nav",
|
|
71
79
|
"scope": "assistant",
|
|
@@ -403,11 +411,11 @@
|
|
|
403
411
|
"defaultEnabled": false
|
|
404
412
|
},
|
|
405
413
|
{
|
|
406
|
-
"id": "mcp-
|
|
414
|
+
"id": "mcp-settings",
|
|
407
415
|
"scope": "assistant",
|
|
408
|
-
"key": "mcp-
|
|
409
|
-
"label": "MCP
|
|
410
|
-
"description": "Show the
|
|
416
|
+
"key": "mcp-settings",
|
|
417
|
+
"label": "MCP Settings",
|
|
418
|
+
"description": "Show the MCP page in Settings for managing Model Context Protocol server connections: view status, enable/disable, configure, and inspect registered tools per server.",
|
|
411
419
|
"defaultEnabled": false
|
|
412
420
|
},
|
|
413
421
|
{
|
|
@@ -415,7 +423,7 @@
|
|
|
415
423
|
"scope": "assistant",
|
|
416
424
|
"key": "os-beta",
|
|
417
425
|
"label": "OS Beta",
|
|
418
|
-
"description": "Enable the OS Beta model profile (
|
|
426
|
+
"description": "Enable the OS Beta model profile (GLM 5.2 / Fireworks) in the assistant's model profile selection.",
|
|
419
427
|
"defaultEnabled": false
|
|
420
428
|
}
|
|
421
429
|
]
|
package/src/config/loader.ts
CHANGED
|
@@ -14,7 +14,6 @@ import {
|
|
|
14
14
|
getConfigQuarantineNoticePath,
|
|
15
15
|
getWorkspaceConfigPath,
|
|
16
16
|
} from "../util/platform.js";
|
|
17
|
-
import { pruneSeededCallsiteDefaultsFromConfig } from "./prune-seeded-callsite-defaults.js";
|
|
18
17
|
import { AssistantConfigSchema } from "./schema.js";
|
|
19
18
|
import type { AssistantConfig } from "./types.js";
|
|
20
19
|
|
|
@@ -301,20 +300,14 @@ function validateWithSchema(raw: Record<string, unknown>): AssistantConfig {
|
|
|
301
300
|
}
|
|
302
301
|
|
|
303
302
|
// Strip invalid fields by setting them to undefined so Zod defaults apply,
|
|
304
|
-
// then re-parse. We walk the error paths and delete the offending keys
|
|
305
|
-
// pruning any ancestor object the deletion leaves empty. Pruning matters for
|
|
306
|
-
// nested overrides like `llm.callSites.<id>.profile`: stripping just the
|
|
307
|
-
// invalid `.profile` leaf would leave `llm.callSites.<id> = {}`, which the
|
|
308
|
-
// resolver treats as a present (non-default) override and so skips the
|
|
309
|
-
// shipped call-site default — silently downgrading the call site to the
|
|
310
|
-
// active profile. Removing the emptied object lets that default apply.
|
|
303
|
+
// then re-parse. We walk the error paths and delete the offending keys.
|
|
311
304
|
const cleaned = structuredClone(raw);
|
|
312
305
|
for (const issue of result.error.issues) {
|
|
313
306
|
if (issue.path.length === 0) {
|
|
314
307
|
// Top-level error — return full defaults
|
|
315
308
|
return cloneDefaultConfig();
|
|
316
309
|
}
|
|
317
|
-
deleteNestedKey(cleaned, issue.path as (string | number)[]
|
|
310
|
+
deleteNestedKey(cleaned, issue.path as (string | number)[]);
|
|
318
311
|
}
|
|
319
312
|
|
|
320
313
|
const retry = AssistantConfigSchema.safeParse(cleaned);
|
|
@@ -327,42 +320,17 @@ function validateWithSchema(raw: Record<string, unknown>): AssistantConfig {
|
|
|
327
320
|
return cloneDefaultConfig();
|
|
328
321
|
}
|
|
329
322
|
|
|
330
|
-
/**
|
|
331
|
-
* Delete the key at `path` from `obj`. When `pruneEmptyAncestors` is set, also
|
|
332
|
-
* remove any ancestor object the deletion leaves empty, walking up until the
|
|
333
|
-
* first ancestor that still holds other keys. Only empty plain objects are
|
|
334
|
-
* pruned (arrays are left alone), and a still-populated ancestor stops the walk
|
|
335
|
-
* so a container holding other config is never removed.
|
|
336
|
-
*/
|
|
337
323
|
function deleteNestedKey(
|
|
338
324
|
obj: Record<string, unknown>,
|
|
339
325
|
path: (string | number)[],
|
|
340
|
-
pruneEmptyAncestors = false,
|
|
341
326
|
): void {
|
|
342
|
-
// Record each (container, key) hop on the way down so we can prune upward
|
|
343
|
-
// after deleting the leaf.
|
|
344
|
-
const chain: Array<{ container: Record<string, unknown>; key: string }> = [];
|
|
345
327
|
let current: unknown = obj;
|
|
346
328
|
for (let i = 0; i < path.length - 1; i++) {
|
|
347
329
|
if (current == null || typeof current !== "object") return;
|
|
348
|
-
|
|
349
|
-
chain.push({ container: current as Record<string, unknown>, key });
|
|
350
|
-
current = (current as Record<string, unknown>)[key];
|
|
330
|
+
current = (current as Record<string, unknown>)[String(path[i])];
|
|
351
331
|
}
|
|
352
|
-
if (current
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
if (!pruneEmptyAncestors) return;
|
|
356
|
-
// Remove ancestors emptied by the deletion, deepest first; stop at the first
|
|
357
|
-
// that still has keys.
|
|
358
|
-
for (let i = chain.length - 1; i >= 0; i--) {
|
|
359
|
-
const { container, key } = chain[i];
|
|
360
|
-
const child = container[key];
|
|
361
|
-
if (isPlainObject(child) && Object.keys(child).length === 0) {
|
|
362
|
-
delete container[key];
|
|
363
|
-
} else {
|
|
364
|
-
break;
|
|
365
|
-
}
|
|
332
|
+
if (current != null && typeof current === "object") {
|
|
333
|
+
delete (current as Record<string, unknown>)[String(path[path.length - 1])];
|
|
366
334
|
}
|
|
367
335
|
}
|
|
368
336
|
|
|
@@ -630,7 +598,6 @@ export function mergeDefaultWorkspaceConfig(): DefaultWorkspaceConfigMergeResult
|
|
|
630
598
|
}
|
|
631
599
|
|
|
632
600
|
deepMergeOverwrite(existing, defaults as Record<string, unknown>);
|
|
633
|
-
pruneSeededCallsiteDefaultsFromConfig(existing);
|
|
634
601
|
|
|
635
602
|
const dir = dirname(configPath);
|
|
636
603
|
if (!existsSync(dir)) {
|
|
@@ -78,17 +78,6 @@ export const MemoryJobsConfigSchema = MemoryJobsConfigInputSchema.transform(
|
|
|
78
78
|
},
|
|
79
79
|
).describe("Memory background job processing configuration");
|
|
80
80
|
|
|
81
|
-
export const MemoryWorkerConfigSchema = z
|
|
82
|
-
.object({
|
|
83
|
-
enabled: z
|
|
84
|
-
.boolean({ error: "memory.worker.enabled must be a boolean" })
|
|
85
|
-
.default(false)
|
|
86
|
-
.describe(
|
|
87
|
-
"Whether the memory jobs worker runs as a separate OS process spawned at assistant startup (the `assistant memory worker` implementation) instead of on the assistant's main event loop. Only affects startup; shutdown stops whichever worker is actually running.",
|
|
88
|
-
),
|
|
89
|
-
})
|
|
90
|
-
.describe("Memory jobs worker process configuration");
|
|
91
|
-
|
|
92
81
|
export const MemoryRetentionConfigSchema = z
|
|
93
82
|
.object({
|
|
94
83
|
keepRawForever: z
|
|
@@ -196,7 +185,6 @@ export const MemoryMaintenanceConfigSchema = z
|
|
|
196
185
|
);
|
|
197
186
|
|
|
198
187
|
export type MemoryJobsConfig = z.infer<typeof MemoryJobsConfigSchema>;
|
|
199
|
-
export type MemoryWorkerConfig = z.infer<typeof MemoryWorkerConfigSchema>;
|
|
200
188
|
export type MemoryRetentionConfig = z.infer<typeof MemoryRetentionConfigSchema>;
|
|
201
189
|
export type MemoryCleanupConfig = z.infer<typeof MemoryCleanupConfigSchema>;
|
|
202
190
|
export type MemoryMaintenanceConfig = z.infer<
|
|
@@ -259,13 +259,6 @@ export const MemoryV3ConfigSchema = z
|
|
|
259
259
|
.describe(
|
|
260
260
|
"Per-lane article budget for the reply-query finder pass: needle and dense each re-run over the assistant's previous message as separate queries (never concatenated with the user's message). 0 disables the pass. Deliberately small next to needleK/denseK — the pass adds the assistant-side retrieval signal, not a second full sweep.",
|
|
261
261
|
),
|
|
262
|
-
selectorPromptPath: z
|
|
263
|
-
.string({ error: "memory.v3.selectorPromptPath must be a string" })
|
|
264
|
-
.nullable()
|
|
265
|
-
.default(null)
|
|
266
|
-
.describe(
|
|
267
|
-
"Optional path to a file whose contents replace the bundled per-turn selector system prompt (the instructions that tell the selector which candidate pages to keep). Absolute paths are used as-is, a leading `~/` is expanded to the home directory, otherwise the path is resolved under the workspace root. The selector prompt takes no placeholders — the candidate pool is supplied separately as the user message — so the file is used verbatim. If the file is missing, unreadable, empty, or over 1 MiB, the bundled prompt is used and a warning is logged.",
|
|
268
|
-
),
|
|
269
262
|
edge: MemoryV3EdgeSchema.default(MemoryV3EdgeSchema.parse({})),
|
|
270
263
|
})
|
|
271
264
|
.describe("Memory v3 — section-grain lane retrieval");
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
MemoryJobsConfigSchema,
|
|
6
6
|
MemoryMaintenanceConfigSchema,
|
|
7
7
|
MemoryRetentionConfigSchema,
|
|
8
|
-
MemoryWorkerConfigSchema,
|
|
9
8
|
} from "./memory-lifecycle.js";
|
|
10
9
|
import {
|
|
11
10
|
MemoryExtractionConfigSchema,
|
|
@@ -40,9 +39,6 @@ export const MemoryConfigSchema = z
|
|
|
40
39
|
MemorySegmentationConfigSchema.parse({}),
|
|
41
40
|
),
|
|
42
41
|
jobs: MemoryJobsConfigSchema.default(MemoryJobsConfigSchema.parse({})),
|
|
43
|
-
worker: MemoryWorkerConfigSchema.default(
|
|
44
|
-
MemoryWorkerConfigSchema.parse({}),
|
|
45
|
-
),
|
|
46
42
|
retention: MemoryRetentionConfigSchema.default(
|
|
47
43
|
MemoryRetentionConfigSchema.parse({}),
|
|
48
44
|
),
|
|
@@ -28,14 +28,6 @@ export const TimeoutConfigSchema = z
|
|
|
28
28
|
.describe(
|
|
29
29
|
"How long to wait for user permission approval before timing out (seconds)",
|
|
30
30
|
),
|
|
31
|
-
questionResponseTimeoutSec: z
|
|
32
|
-
.number({ error: "timeouts.questionResponseTimeoutSec must be a number" })
|
|
33
|
-
.finite("timeouts.questionResponseTimeoutSec must be finite")
|
|
34
|
-
.positive("timeouts.questionResponseTimeoutSec must be a positive number")
|
|
35
|
-
.default(1800)
|
|
36
|
-
.describe(
|
|
37
|
-
"Backstop timeout for an unanswered ask_question prompt (seconds). The primary way an interactive user dismisses a prompt is by moving on — enqueuing another message supersedes it — so this only bounds a prompt left open with no response and no follow-up message.",
|
|
38
|
-
),
|
|
39
31
|
toolExecutionTimeoutSec: z
|
|
40
32
|
.number({ error: "timeouts.toolExecutionTimeoutSec must be a number" })
|
|
41
33
|
.finite("timeouts.toolExecutionTimeoutSec must be finite")
|
|
@@ -88,24 +88,15 @@ const MANAGED_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
|
88
88
|
// profile there's nothing stronger to consult, so the advisor defaults off.
|
|
89
89
|
advisorEnabled: false,
|
|
90
90
|
},
|
|
91
|
-
// Served by DeepSeek V4 Flash on Fireworks via managed platform inference: a
|
|
92
|
-
// fast, low-cost open model. `model` is pinned explicitly rather than
|
|
93
|
-
// resolved via the `latency-optimized` intent (which still maps to Kimi K2.5
|
|
94
|
-
// on Fireworks and Anthropic Haiku elsewhere).
|
|
95
|
-
//
|
|
96
|
-
// `effort: "none"` (not "low") because Fireworks is not thinking-aware: the
|
|
97
|
-
// disabled `thinking` config is stripped before the request, so a non-"none"
|
|
98
|
-
// effort would be sent as `reasoning_effort` and make this profile pay for
|
|
99
|
-
// reasoning despite thinking being off. "none" keeps Speed non-reasoning.
|
|
100
91
|
"cost-optimized": {
|
|
101
|
-
|
|
102
|
-
provider: "
|
|
103
|
-
connectionName: "
|
|
92
|
+
intent: "latency-optimized",
|
|
93
|
+
provider: "anthropic",
|
|
94
|
+
connectionName: "anthropic-managed",
|
|
104
95
|
source: "managed",
|
|
105
96
|
label: "Speed",
|
|
106
|
-
description: "Fastest responses at lower cost
|
|
97
|
+
description: "Fastest responses at lower cost",
|
|
107
98
|
maxTokens: 8192,
|
|
108
|
-
effort: "
|
|
99
|
+
effort: "low",
|
|
109
100
|
thinking: { enabled: false, streamThinking: false },
|
|
110
101
|
contextWindow: { maxInputTokens: DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS },
|
|
111
102
|
},
|
|
@@ -164,20 +155,19 @@ export const OS_BETA_FEATURE_FLAG_KEY = "os-beta";
|
|
|
164
155
|
* Flag-gated managed profile. NOT in MANAGED_PROFILE_TEMPLATES, so the
|
|
165
156
|
* unconditional boot seed never creates it. Reconciled in/out by
|
|
166
157
|
* the flag-gated profile reconcile based on the `os-beta` feature flag.
|
|
167
|
-
* Balanced defaults
|
|
158
|
+
* Balanced-parity defaults; GLM 5.2 pinned explicitly via `model`.
|
|
168
159
|
*/
|
|
169
160
|
export const OS_BETA_PROFILE_TEMPLATE: ManagedProfileTemplate = {
|
|
170
|
-
|
|
171
|
-
provider: "
|
|
172
|
-
connectionName: "
|
|
161
|
+
model: "accounts/fireworks/models/glm-5p2",
|
|
162
|
+
provider: "fireworks",
|
|
163
|
+
connectionName: "fireworks-managed",
|
|
173
164
|
source: "managed",
|
|
174
165
|
label: "OS Beta",
|
|
175
|
-
description: "
|
|
166
|
+
description: "Open-source frontier model (GLM 5.2), in beta",
|
|
176
167
|
maxTokens: 32000,
|
|
177
|
-
effort: "
|
|
168
|
+
effort: "high",
|
|
178
169
|
thinking: { enabled: true, streamThinking: true },
|
|
179
170
|
contextWindow: { maxInputTokens: DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS },
|
|
180
|
-
topP: 0.95,
|
|
181
171
|
};
|
|
182
172
|
|
|
183
173
|
// Membership here marks a name as managed. The route layer applies managed
|
package/src/config/skills.ts
CHANGED
|
@@ -688,9 +688,6 @@ function discoverSkillDirectories(skillsDir: string): string[] {
|
|
|
688
688
|
* parseable `package.json` whose `name` equals the directory name. This
|
|
689
689
|
* mirrors the external plugin loader's recognition gate, which skips any
|
|
690
690
|
* directory whose `manifest.name` does not match its directory name.
|
|
691
|
-
*
|
|
692
|
-
* The caller is responsible for the missing-`package.json` case (it emits a
|
|
693
|
-
* diagnostic warning); this function only judges a manifest that is present.
|
|
694
691
|
*/
|
|
695
692
|
function isRecognizedPluginDir(pluginDir: string, dirName: string): boolean {
|
|
696
693
|
const manifestPath = join(pluginDir, "package.json");
|
|
@@ -738,31 +735,12 @@ function discoverPluginResidentSkills(): SkillSummary[] {
|
|
|
738
735
|
for (const entry of entries) {
|
|
739
736
|
if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;
|
|
740
737
|
const pluginDir = join(pluginsDir, entry.name);
|
|
741
|
-
|
|
742
|
-
// A directory under `plugins/` with no `package.json` is not a plugin the
|
|
743
|
-
// runtime can load, so its skills are never surfaced. This is an easy
|
|
744
|
-
// footgun — a plugin dropped in without its manifest looks installed but
|
|
745
|
-
// silently contributes nothing — so warn loudly with the path rather than
|
|
746
|
-
// skipping in silence, to make the misconfiguration diagnosable.
|
|
747
|
-
if (!existsSync(join(pluginDir, "package.json"))) {
|
|
748
|
-
log.warn(
|
|
749
|
-
{ pluginDir },
|
|
750
|
-
"Plugin directory is missing package.json — skipping; its skills will not be available. Add a package.json whose `name` matches the directory.",
|
|
751
|
-
);
|
|
752
|
-
continue;
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
// Honor the `.disabled` sentinel the runtime plugin scan checks
|
|
756
|
-
// (`plugins/mtime-cache.ts`): a disabled plugin contributes no hooks or
|
|
757
|
-
// tools, so its resident skills must not be loadable either.
|
|
758
|
-
if (existsSync(join(pluginDir, ".disabled"))) continue;
|
|
759
|
-
|
|
760
738
|
// Mirror the plugin loader's recognition gate: a directory is a real
|
|
761
|
-
// installed plugin only if
|
|
762
|
-
// This rejects staging dirs
|
|
763
|
-
// un-adapted `caveman-installer`)
|
|
764
|
-
//
|
|
765
|
-
// to load.
|
|
739
|
+
// installed plugin only if it carries a parseable `package.json` whose
|
|
740
|
+
// `name` matches the directory. This rejects staging dirs, stray files,
|
|
741
|
+
// and malformed/mismatched clones (e.g. an un-adapted `caveman-installer`)
|
|
742
|
+
// that the loader itself would skip, so the catalog never surfaces skills
|
|
743
|
+
// from a directory the runtime would refuse to load.
|
|
766
744
|
if (!isRecognizedPluginDir(pluginDir, entry.name)) continue;
|
|
767
745
|
|
|
768
746
|
const skillsDir = join(pluginDir, "skills");
|
|
@@ -23,12 +23,12 @@ const log = getLogger("sync-gated-profiles");
|
|
|
23
23
|
* Reconcile flag-gated managed profiles against the current feature-flag state.
|
|
24
24
|
*
|
|
25
25
|
* `seedInferenceProfiles()` runs synchronously at boot before feature flags are
|
|
26
|
-
* available, so the OS Beta profile (
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
26
|
+
* available, so the OS Beta profile (GLM 5.2 / fireworks-managed) is materialized
|
|
27
|
+
* here once flags have loaded. When the `os-beta` flag is on, the managed profile
|
|
28
|
+
* is created (ordered right after `balanced`); when it is off, a previously
|
|
29
|
+
* managed entry is removed with `profileOrder` / `activeProfile` / `advisorProfile`
|
|
30
|
+
* fallbacks. The reconcile is idempotent and never touches a user-owned profile of
|
|
31
|
+
* the same name.
|
|
32
32
|
*
|
|
33
33
|
* Returns whether the on-disk config changed.
|
|
34
34
|
*/
|
|
@@ -105,22 +105,23 @@ function enableProfile(
|
|
|
105
105
|
OS_BETA_PROFILE_TEMPLATE.connectionName,
|
|
106
106
|
) as Record<string, unknown>;
|
|
107
107
|
|
|
108
|
-
// BYOK installs seed managed profiles disabled: the
|
|
109
|
-
// connection backing this profile isn't usable until the
|
|
110
|
-
// fresh OS Beta entry starts disabled to avoid offering
|
|
111
|
-
// user's own status override (preserved below) wins on
|
|
108
|
+
// BYOK installs seed managed profiles disabled: the platform-auth
|
|
109
|
+
// `fireworks-managed` connection backing this profile isn't usable until the
|
|
110
|
+
// user enables it, so a fresh OS Beta entry starts disabled to avoid offering
|
|
111
|
+
// an unusable route. A user's own status override (preserved below) wins on
|
|
112
|
+
// later reconciles.
|
|
112
113
|
if (isByokMode && !previous) {
|
|
113
114
|
next.status = "disabled";
|
|
114
115
|
}
|
|
115
116
|
|
|
116
117
|
if (previous) {
|
|
117
|
-
//
|
|
118
|
+
// The only fields a user may override on a managed profile. Carry `label`
|
|
119
|
+
// by key-presence so an explicit null (user cleared it) survives too.
|
|
118
120
|
if ("label" in previous) next.label = previous.label;
|
|
119
121
|
if ("status" in previous) next.status = previous.status;
|
|
120
122
|
if ("advisorEnabled" in previous) {
|
|
121
123
|
next.advisorEnabled = previous.advisorEnabled;
|
|
122
124
|
}
|
|
123
|
-
if ("topP" in previous) next.topP = previous.topP;
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
let changed = false;
|
|
@@ -30,9 +30,6 @@ import type {
|
|
|
30
30
|
* Returns true when a guardian channel was found and revoked, false otherwise.
|
|
31
31
|
*/
|
|
32
32
|
export function revokeGuardianBinding(channel: string): boolean {
|
|
33
|
-
// Local-store read, not the gateway: this read selects the row that the
|
|
34
|
-
// updateChannelStatus write below mutates, so it must stay transactionally
|
|
35
|
-
// consistent with that write. Leave for Combo 11 / gateway-bootstrap-binding.
|
|
36
33
|
const guardian = findGuardianForChannel(channel);
|
|
37
34
|
if (!guardian) return false;
|
|
38
35
|
|
|
@@ -284,19 +284,6 @@ interface VellumLinkExtractResult {
|
|
|
284
284
|
* markdown links from assistant text and return corresponding directive
|
|
285
285
|
* requests. The text is NOT modified — the links remain as rendered markdown.
|
|
286
286
|
*/
|
|
287
|
-
/**
|
|
288
|
-
* Decode a vellum:// path segment, returning null on malformed percent-encoding
|
|
289
|
-
* (e.g. a literal `%` not followed by two hex digits). This prevents a single
|
|
290
|
-
* bad link from throwing URIError and aborting the entire assistant message.
|
|
291
|
-
*/
|
|
292
|
-
function safeDecodePath(rawPath: string): string | null {
|
|
293
|
-
try {
|
|
294
|
-
return decodeURIComponent(rawPath);
|
|
295
|
-
} catch {
|
|
296
|
-
return null;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
|
|
300
287
|
export function extractVellumLinks(text: string): VellumLinkExtractResult {
|
|
301
288
|
const directiveRequests: DirectiveRequest[] = [];
|
|
302
289
|
const parseWarnings: string[] = [];
|
|
@@ -307,19 +294,9 @@ export function extractVellumLinks(text: string): VellumLinkExtractResult {
|
|
|
307
294
|
const authority = m[2]!;
|
|
308
295
|
const rawPath = m[3]!;
|
|
309
296
|
|
|
310
|
-
const decodedPath = safeDecodePath(rawPath);
|
|
311
|
-
if (decodedPath === null) {
|
|
312
|
-
parseWarnings.push(
|
|
313
|
-
`Ignored vellum://${authority} link "${linkText}": malformed percent-encoding in path.`,
|
|
314
|
-
);
|
|
315
|
-
continue;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
297
|
if (authority === "workspace") {
|
|
319
298
|
// Strip the leading "/" to get a workspace-relative path
|
|
320
|
-
const path =
|
|
321
|
-
? decodedPath.slice(1)
|
|
322
|
-
: decodedPath;
|
|
299
|
+
const path = rawPath.startsWith("/") ? rawPath.slice(1) : rawPath;
|
|
323
300
|
if (!path) {
|
|
324
301
|
parseWarnings.push(
|
|
325
302
|
`Ignored vellum://workspace link "${linkText}": empty path.`,
|
|
@@ -333,8 +310,8 @@ export function extractVellumLinks(text: string): VellumLinkExtractResult {
|
|
|
333
310
|
mimeType: undefined,
|
|
334
311
|
});
|
|
335
312
|
} else {
|
|
336
|
-
// host:
|
|
337
|
-
if (!
|
|
313
|
+
// host: rawPath is already absolute (starts with /)
|
|
314
|
+
if (!rawPath || rawPath === "/") {
|
|
338
315
|
parseWarnings.push(
|
|
339
316
|
`Ignored vellum://host link "${linkText}": empty path.`,
|
|
340
317
|
);
|
|
@@ -342,7 +319,7 @@ export function extractVellumLinks(text: string): VellumLinkExtractResult {
|
|
|
342
319
|
}
|
|
343
320
|
directiveRequests.push({
|
|
344
321
|
source: "host",
|
|
345
|
-
path:
|
|
322
|
+
path: rawPath,
|
|
346
323
|
filename: linkText || undefined,
|
|
347
324
|
mimeType: undefined,
|
|
348
325
|
});
|
|
@@ -100,10 +100,6 @@ import {
|
|
|
100
100
|
isUserCancellation,
|
|
101
101
|
} from "./conversation-error.js";
|
|
102
102
|
import { raceWithTimeout } from "./conversation-media-retry.js";
|
|
103
|
-
import {
|
|
104
|
-
clearConversationNotices,
|
|
105
|
-
drainConversationNotices,
|
|
106
|
-
} from "./conversation-notices.js";
|
|
107
103
|
import {
|
|
108
104
|
getSlackCompactionWatermarkForPrefix,
|
|
109
105
|
loadSlackChronologicalContext,
|
|
@@ -484,11 +480,6 @@ export async function runAgentLoopImpl(
|
|
|
484
480
|
// resolved once here and threaded into every re-injection — including the
|
|
485
481
|
// post-compaction hook — rather than re-read per assembly call.
|
|
486
482
|
const isNonInteractive = !isInteractiveResolved;
|
|
487
|
-
// Expose the resolved turn-level interactivity to tool execution so tools
|
|
488
|
-
// (e.g. ask_question) see whether a human is present to answer, rather than
|
|
489
|
-
// re-deriving it from live client state that misclassifies a scheduled turn
|
|
490
|
-
// running on a client-attached conversation.
|
|
491
|
-
ctx.currentTurnIsNonInteractive = isNonInteractive;
|
|
492
483
|
const diskPressureDecision = classifyDiskPressureTurnPolicy(
|
|
493
484
|
getDiskPressureStatus(),
|
|
494
485
|
{
|
|
@@ -1021,15 +1012,6 @@ export async function runAgentLoopImpl(
|
|
|
1021
1012
|
);
|
|
1022
1013
|
}
|
|
1023
1014
|
|
|
1024
|
-
const shouldEmitQueuedConversationNotices =
|
|
1025
|
-
!overflowTerminalReason &&
|
|
1026
|
-
!yieldedForHandoff &&
|
|
1027
|
-
!state.providerErrorUserMessage &&
|
|
1028
|
-
!abortController.signal.aborted;
|
|
1029
|
-
if (!shouldEmitQueuedConversationNotices) {
|
|
1030
|
-
clearConversationNotices(ctx.conversationId);
|
|
1031
|
-
}
|
|
1032
|
-
|
|
1033
1015
|
// Flush remaining tool results. On a normal turn these drain at the next
|
|
1034
1016
|
// `message_complete`; an aborted or yielded loop exits with them still
|
|
1035
1017
|
// buffered, so finalize the (possibly already on-arrival-reserved) grouped
|
|
@@ -1422,16 +1404,10 @@ export async function runAgentLoopImpl(
|
|
|
1422
1404
|
? { messageId: state.lastAssistantMessageId }
|
|
1423
1405
|
: {}),
|
|
1424
1406
|
});
|
|
1425
|
-
if (shouldEmitQueuedConversationNotices) {
|
|
1426
|
-
for (const notice of drainConversationNotices(ctx.conversationId)) {
|
|
1427
|
-
onEvent(notice);
|
|
1428
|
-
}
|
|
1429
|
-
}
|
|
1430
1407
|
publishLoopMessagesChanged();
|
|
1431
1408
|
}
|
|
1432
1409
|
}
|
|
1433
1410
|
} catch (err) {
|
|
1434
|
-
clearConversationNotices(ctx.conversationId);
|
|
1435
1411
|
const errorCtx = {
|
|
1436
1412
|
phase: "agent_loop" as const,
|
|
1437
1413
|
aborted: abortController.signal.aborted,
|
|
@@ -1539,10 +1515,6 @@ export async function runAgentLoopImpl(
|
|
|
1539
1515
|
ctx.diskPressureCleanupModeActive = false;
|
|
1540
1516
|
ctx.preactivatedSkillIds = undefined;
|
|
1541
1517
|
ctx.currentTurnOverrideProfile = undefined;
|
|
1542
|
-
// Turn-scoped interactivity. Clear it so paths that bypass this loop (e.g.
|
|
1543
|
-
// opportunity wakes calling `agentLoop.run` directly) don't inherit a stale
|
|
1544
|
-
// value and instead fall back to live client state in the tool context.
|
|
1545
|
-
ctx.currentTurnIsNonInteractive = undefined;
|
|
1546
1518
|
// Channel command intents (e.g. Telegram /start) are single-turn metadata.
|
|
1547
1519
|
// Clear at turn end so they never leak into subsequent unrelated messages.
|
|
1548
1520
|
ctx.commandIntent = undefined;
|
|
@@ -60,21 +60,6 @@ import { resolveVerificationSessionIntent } from "./verification-session-intent.
|
|
|
60
60
|
|
|
61
61
|
const log = getLogger("conversation-process");
|
|
62
62
|
|
|
63
|
-
/**
|
|
64
|
-
* Daemon-injected subagent lifecycle notifications carry `subagentNotification`
|
|
65
|
-
* metadata. They are persisted into the parent conversation so the orchestrator
|
|
66
|
-
* wakes and reads the subagent's result, but they are internal scaffolding — the
|
|
67
|
-
* user sees subagent activity through the inline progress card, not a chat turn.
|
|
68
|
-
* Skip the `user_message_echo` broadcast for these so they never render as a live
|
|
69
|
-
* user bubble; the persisted row is filtered from the rendered transcript on the
|
|
70
|
-
* client.
|
|
71
|
-
*/
|
|
72
|
-
function isSubagentNotificationMessage(
|
|
73
|
-
metadata: Record<string, unknown> | undefined,
|
|
74
|
-
): boolean {
|
|
75
|
-
return metadata?.subagentNotification != null;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
63
|
/** Format the result of a forced compaction into a user-facing message. */
|
|
79
64
|
export function formatCompactResult(result: ContextWindowResult): string {
|
|
80
65
|
const fmt = (n: number | undefined) => (n ?? 0).toLocaleString("en-US");
|
|
@@ -868,16 +853,14 @@ async function drainSingleMessage(
|
|
|
868
853
|
|
|
869
854
|
// Broadcast the user message to all hub subscribers so passive devices
|
|
870
855
|
// see the user turn before the assistant reply starts streaming.
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
});
|
|
880
|
-
}
|
|
856
|
+
next.onEvent({
|
|
857
|
+
type: "user_message_echo",
|
|
858
|
+
text: resolvedContent,
|
|
859
|
+
conversationId: conversation.conversationId,
|
|
860
|
+
messageId: userMessageId,
|
|
861
|
+
requestId: next.requestId,
|
|
862
|
+
clientMessageId: next.clientMessageId,
|
|
863
|
+
});
|
|
881
864
|
publishConversationMessagesChanged(conversation.conversationId);
|
|
882
865
|
|
|
883
866
|
// Set the active surface for the dequeued message so runAgentLoop can inject context
|
|
@@ -1221,16 +1204,14 @@ async function drainBatch(
|
|
|
1221
1204
|
|
|
1222
1205
|
// Broadcast the user message to all hub subscribers so passive devices
|
|
1223
1206
|
// see each batched user turn before the assistant reply starts streaming.
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
});
|
|
1233
|
-
}
|
|
1207
|
+
qm.onEvent({
|
|
1208
|
+
type: "user_message_echo",
|
|
1209
|
+
text: qmContent,
|
|
1210
|
+
conversationId: conversation.conversationId,
|
|
1211
|
+
messageId: lastUserMessageId,
|
|
1212
|
+
requestId: qm.requestId,
|
|
1213
|
+
clientMessageId: qm.clientMessageId,
|
|
1214
|
+
});
|
|
1234
1215
|
publishConversationMessagesChanged(conversation.conversationId);
|
|
1235
1216
|
|
|
1236
1217
|
// Persist succeeded. Update last-successful markers so a later tail
|