@vellumai/assistant 0.9.0 → 0.10.0-staging.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/ARCHITECTURE.md +18 -34
- package/bun.lock +7 -8
- package/docs/activation-funnel-telemetry.md +28 -22
- package/docs/architecture/security.md +29 -28
- package/docs/stt-provider-onboarding.md +3 -5
- package/docs/workflows-testing.md +13 -44
- package/docs/workflows.md +3 -5
- package/node_modules/@vellumai/ces-client/src/__tests__/ces-client.test.ts +47 -0
- package/node_modules/@vellumai/ces-client/src/rpc-client.ts +28 -5
- package/node_modules/@vellumai/environments/src/seeds.ts +2 -5
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +97 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +10 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +32 -6
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +119 -0
- package/node_modules/@vellumai/gateway-client/src/types.ts +15 -84
- package/openapi.yaml +976 -63
- package/package.json +2 -1
- package/scripts/sync-llm-catalog.ts +6 -15
- package/scripts/sync-web-search-catalog.ts +3 -11
- package/src/__tests__/access-request-card-view.test.ts +98 -0
- package/src/__tests__/access-request-seed-content-blocks.test.ts +2 -4
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +72 -32
- package/src/__tests__/agent-loop-compaction-strip.test.ts +241 -0
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +16 -13
- package/src/__tests__/agent-loop-output-hooks.test.ts +69 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +25 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -3
- package/src/__tests__/app-compiler.test.ts +15 -1
- package/src/__tests__/app-dir-path-guard.test.ts +0 -1
- package/src/__tests__/assistant-feature-flag-guard.test.ts +1 -4
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/auth-fallback-events-store.test.ts +6 -14
- package/src/__tests__/avatar-identity-sync.test.ts +2 -27
- package/src/__tests__/btw-routes.test.ts +6 -8
- package/src/__tests__/call-pointer-messages.test.ts +28 -0
- package/src/__tests__/cancel-clears-processing.test.ts +89 -0
- package/src/__tests__/channel-approval-routes.test.ts +0 -4
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +5 -15
- package/src/__tests__/checker.test.ts +0 -3
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +3 -4
- package/src/__tests__/compactor-image-manifest-trust.test.ts +21 -1
- package/src/__tests__/compactor-summary-call-truncation.test.ts +223 -0
- package/src/__tests__/config-loader-backfill.test.ts +268 -27
- package/src/__tests__/config-schema.test.ts +35 -0
- package/src/__tests__/config-watcher.test.ts +0 -18
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +0 -6
- package/src/__tests__/contacts-tools.test.ts +29 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +22 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop.test.ts +58 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
- package/src/__tests__/conversation-lifecycle.test.ts +7 -9
- package/src/__tests__/conversation-load-history-repair.test.ts +101 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +15 -12
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +6 -3
- package/src/__tests__/conversation-title-service.test.ts +62 -0
- package/src/__tests__/credential-broker.test.ts +449 -1
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +18 -11
- package/src/__tests__/credential-execution-tools.test.ts +0 -1
- package/src/__tests__/credential-prompt-route.test.ts +4 -4
- package/src/__tests__/credential-routes.test.ts +360 -0
- package/src/__tests__/credential-security-invariants.test.ts +4 -13
- package/src/__tests__/disk-pressure-policy.test.ts +12 -0
- package/src/__tests__/disk-usage.test.ts +65 -0
- package/src/__tests__/dynamic-page-surface.test.ts +152 -1
- package/src/__tests__/fixtures/credential-security-fixtures.ts +2 -33
- package/src/__tests__/gateway-flag-listener.test.ts +110 -1
- package/src/__tests__/gateway-only-guard.test.ts +3 -7
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-card-withdrawal.test.ts +403 -0
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +5 -3
- package/src/__tests__/guardian-grant-minting.test.ts +3 -35
- package/src/__tests__/guardian-routing-invariants.test.ts +64 -26
- package/src/__tests__/guardian-routing-state.test.ts +0 -1
- package/src/__tests__/headless-browser-mode.test.ts +10 -0
- package/src/__tests__/headless-browser-navigate.test.ts +8 -3
- package/src/__tests__/helpers/create-guardian-binding.ts +0 -1
- package/src/__tests__/host-browser-proxy.test.ts +87 -0
- package/src/__tests__/identity-routes.test.ts +0 -189
- package/src/__tests__/inbound-invite-redemption.test.ts +4 -4
- package/src/__tests__/injector-v3-suppression.test.ts +27 -20
- package/src/__tests__/internal-telemetry-routes.test.ts +6 -14
- package/src/__tests__/invite-redemption-service.test.ts +4 -7
- package/src/__tests__/llm-callsite-catalog.test.ts +5 -6
- package/src/__tests__/llm-catalog-parity.test.ts +30 -23
- package/src/__tests__/llm-resolver.test.ts +70 -24
- package/src/__tests__/llm-schema.test.ts +1 -0
- package/src/__tests__/managed-profile-guard.test.ts +163 -4
- package/src/__tests__/mcp-health-check.test.ts +6 -7
- package/src/__tests__/media-stream-server-integration.test.ts +317 -13
- package/src/__tests__/oauth-provider-seed-logos.test.ts +4 -6
- package/src/__tests__/onboarding-persona-write.test.ts +1 -1
- package/src/__tests__/path-policy.test.ts +34 -0
- package/src/__tests__/persona-resolver.test.ts +49 -14
- package/src/__tests__/plugin-api-model-profiles.test.ts +178 -0
- package/src/__tests__/plugin-api-provider.test.ts +24 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +6 -3
- package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +214 -0
- package/src/__tests__/provider-send-message-override-profile.test.ts +76 -0
- package/src/__tests__/reaction-persistence.test.ts +150 -29
- package/src/__tests__/registry.test.ts +2 -7
- package/src/__tests__/relay-server.test.ts +285 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -10
- package/src/__tests__/schedule-routes.test.ts +0 -30
- package/src/__tests__/schedule-tools.test.ts +2 -18
- package/src/__tests__/scheduler-reuse-conversation.test.ts +8 -5
- package/src/__tests__/skill-execute-input.test.ts +51 -1
- package/src/__tests__/skill-runtime-path.test.ts +2 -3
- package/src/__tests__/skills.test.ts +51 -0
- package/src/__tests__/slack-notification-approval-card.test.ts +176 -0
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +285 -0
- package/src/__tests__/subagent-tools.test.ts +266 -0
- package/src/__tests__/surface-completion-nudge-hook.test.ts +367 -0
- package/src/__tests__/task-progress-nudge-hook.test.ts +1 -1
- package/src/__tests__/title-generate-hook.test.ts +100 -3
- package/src/__tests__/token-estimator-accuracy.benchmark.test.ts +1 -29
- package/src/__tests__/token-manager.test.ts +519 -0
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +1 -1
- package/src/__tests__/tool-audit-listener.test.ts +7 -7
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +6 -3
- package/src/__tests__/tool-executor.test.ts +0 -79
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +4 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +220 -3
- package/src/__tests__/trusted-contact-multichannel.test.ts +3 -3
- package/src/__tests__/trusted-contact-verification.test.ts +8 -10
- package/src/__tests__/twilio-routes.test.ts +81 -1
- package/src/__tests__/voice-invite-redemption.test.ts +2 -3
- package/src/__tests__/weak-open-model.test.ts +30 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +6 -25
- package/src/__tests__/workspace-greetings.test.ts +152 -0
- package/src/__tests__/workspace-migration-105-enable-memory-v3-live-for-new-workspaces.test.ts +149 -0
- package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +285 -0
- package/src/__tests__/workspace-migration-add-send-diagnostics.test.ts +1 -1
- package/src/__tests__/workspace-migration-drop-collect-usage-data.test.ts +118 -0
- package/src/__tests__/workspace-migration-drop-send-diagnostics.test.ts +118 -0
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +0 -4
- package/src/agent/loop.ts +49 -29
- package/src/api/README.md +6 -6
- package/src/api/events/tool-result.ts +6 -0
- package/src/api/events/workflow-completed.ts +53 -0
- package/src/api/events/workflow-leaf-finished.ts +38 -0
- package/src/api/events/workflow-leaf-started.ts +35 -0
- package/src/api/events/workflow-progress.ts +32 -0
- package/src/api/events/workflow-started.ts +31 -0
- package/src/api/index.ts +40 -0
- package/src/api/responses/conversation-message.ts +28 -4
- package/src/api/responses/home.ts +26 -4
- package/src/api/responses/workflow-journal.ts +53 -0
- package/src/approvals/guardian-card-withdrawal.ts +145 -0
- package/src/approvals/guardian-decision-primitive.ts +26 -3
- package/src/approvals/guardian-request-resolvers.ts +183 -80
- package/src/calls/__tests__/channel-admission-reader.test.ts +132 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +350 -0
- package/src/calls/call-pointer-messages.ts +10 -4
- package/src/calls/channel-admission-reader.ts +104 -0
- package/src/calls/guardian-dispatch.ts +17 -45
- package/src/calls/media-stream-server.ts +84 -2
- package/src/calls/relay-access-wait.ts +1 -1
- package/src/calls/relay-server.ts +66 -0
- package/src/calls/relay-setup-router.ts +82 -1
- package/src/calls/twilio-routes.ts +17 -8
- package/src/calls/voice-session-bridge.ts +2 -2
- package/src/cli/commands/clients.ts +3 -0
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v2-compare-render.test.ts +1 -1
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v2.test.ts +8 -7
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v3.test.ts +5 -4
- package/src/cli/commands/memory/index.ts +30 -0
- package/src/cli/commands/{memory-v2-compare-render.ts → memory/memory-v2-compare-render.ts} +1 -1
- package/src/cli/commands/{memory-v2.ts → memory/memory-v2.ts} +6 -15
- package/src/cli/commands/{memory-v3.ts → memory/memory-v3.ts} +97 -11
- package/src/cli/commands/oauth/status.test.ts +36 -0
- package/src/cli/commands/oauth/status.ts +23 -3
- package/src/cli/commands/plugins.ts +197 -4
- package/src/cli/lib/__tests__/diff-plugin.test.ts +443 -0
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +54 -0
- package/src/cli/lib/__tests__/merge-plugin-tree.test.ts +443 -0
- package/src/cli/lib/__tests__/plugin-surfaces.test.ts +111 -0
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +295 -2
- package/src/cli/lib/diff-plugin.ts +346 -0
- package/src/cli/lib/inspect-plugin.ts +12 -1
- package/src/cli/lib/install-from-github.ts +105 -17
- package/src/cli/lib/merge-plugin-tree.ts +328 -0
- package/src/cli/lib/plugin-fingerprint.ts +14 -0
- package/src/cli/lib/plugin-surfaces.ts +104 -0
- package/src/cli/lib/upgrade-plugin.ts +298 -10
- package/src/cli/program.ts +2 -6
- package/src/config/__tests__/sync-gated-profiles.test.ts +368 -0
- package/src/config/assistant-feature-flags.ts +22 -7
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +0 -1
- package/src/config/bundled-skills/messaging/SKILL.md +6 -4
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +9 -8
- package/src/config/bundled-skills/subagent/SKILL.md +4 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +4 -0
- package/src/config/bundled-skills/workflows/SKILL.md +14 -8
- package/src/config/bundled-tool-registry.ts +2 -7
- package/src/config/call-site-defaults.ts +15 -2
- package/src/config/feature-flag-registry.json +46 -31
- package/src/config/inference-profile-validation.ts +26 -0
- package/src/config/llm-resolver.ts +3 -0
- package/src/config/loader.ts +4 -0
- package/src/config/memory-v3-gate.ts +11 -0
- package/src/config/profile-order.ts +28 -0
- package/src/config/schema.ts +8 -6
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/call-site-catalog.ts +7 -0
- package/src/config/schemas/channels.ts +11 -0
- package/src/config/schemas/elevenlabs.ts +0 -1
- package/src/config/schemas/llm.ts +31 -0
- package/src/config/schemas/memory-lifecycle.ts +3 -7
- package/src/config/schemas/memory-v3.ts +6 -0
- package/src/config/schemas/platform.ts +0 -8
- package/src/config/schemas/services.ts +18 -0
- package/src/config/seed-inference-profiles.ts +109 -44
- package/src/config/skills.ts +21 -0
- package/src/config/sync-gated-profiles.ts +220 -0
- package/src/contacts/contact-store.ts +89 -106
- package/src/contacts/contacts-write.ts +5 -22
- package/src/contacts/types.ts +0 -1
- package/src/context/compactor.ts +88 -54
- package/src/context/strip-injections.ts +58 -10
- package/src/context/token-estimator.ts +1 -1
- package/src/credential-execution/process-manager.ts +55 -14
- package/src/credential-execution/prompted-credential.ts +2 -3
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -2
- package/src/daemon/config-watcher.ts +0 -4
- package/src/daemon/conversation-agent-loop-handlers.ts +2 -0
- package/src/daemon/conversation-agent-loop.ts +114 -22
- package/src/daemon/conversation-history.ts +1 -1
- package/src/daemon/conversation-lifecycle.ts +3 -5
- package/src/daemon/conversation-process.ts +13 -5
- package/src/daemon/conversation-runtime-assembly.ts +13 -15
- package/src/daemon/conversation-slash.ts +2 -23
- package/src/daemon/conversation-surfaces.ts +26 -0
- package/src/daemon/conversation-tool-setup.ts +27 -14
- package/src/daemon/conversation.ts +66 -14
- package/src/daemon/disk-pressure-policy.ts +5 -3
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +0 -1
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -1
- package/src/daemon/handlers/config-a2a.ts +0 -2
- package/src/daemon/handlers/config-channels.ts +15 -16
- package/src/daemon/handlers/config-slack-channel.ts +22 -3
- package/src/daemon/handlers/conversations.ts +107 -0
- package/src/daemon/host-browser-proxy.ts +41 -0
- package/src/daemon/lifecycle.ts +55 -27
- package/src/daemon/message-provenance.ts +2 -0
- package/src/daemon/message-types/contacts.ts +0 -1
- package/src/daemon/message-types/conversations.ts +3 -3
- package/src/daemon/message-types/sync.ts +0 -1
- package/src/daemon/message-types/web-activity.ts +7 -1
- package/src/daemon/message-types/workflows.ts +83 -1
- package/src/daemon/orphan-reaper.test.ts +0 -19
- package/src/daemon/orphan-reaper.ts +2 -24
- package/src/daemon/server.ts +0 -10
- package/src/daemon/tool-setup-types.ts +4 -0
- package/src/daemon/trust-context.ts +1 -1
- package/src/events/tool-audit-listener.ts +2 -2
- package/src/home/feed-source-enrichment.test.ts +151 -0
- package/src/home/feed-source-enrichment.ts +176 -0
- package/src/home/relationship-state.ts +2 -4
- package/src/instrument.ts +18 -6
- package/src/ipc/__tests__/binary-result-ipc.test.ts +81 -0
- package/src/ipc/__tests__/clients-list-ipc.test.ts +20 -0
- package/src/ipc/assistant-server.ts +37 -4
- package/src/ipc/gateway-flag-listener.ts +18 -2
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +5 -16
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +7 -11
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +37 -7
- package/src/memory/__tests__/memory-retrospective-job.test.ts +229 -401
- package/src/memory/__tests__/onboarding-events-store.test.ts +7 -7
- package/src/memory/auth-fallback-events-store.ts +2 -2
- package/src/memory/auto-analysis-enqueue.ts +3 -5
- package/src/memory/bookmark-crud.ts +1 -2
- package/src/memory/canonical-guardian-store.ts +39 -1
- package/src/memory/conversation-crud.ts +9 -4
- package/src/memory/conversation-key-store.ts +17 -2
- package/src/memory/conversation-title-service.ts +64 -7
- package/src/memory/db-init.ts +17 -17
- package/src/memory/embedding-backend.ts +38 -1
- package/src/memory/embedding-billing-breaker.ts +96 -0
- package/src/memory/jobs-store.ts +25 -13
- package/src/memory/jobs-worker.ts +54 -1
- package/src/memory/lifecycle-events-store.ts +2 -2
- package/src/memory/memory-retrospective-constants.ts +4 -4
- package/src/memory/memory-retrospective-enqueue.ts +31 -6
- package/src/memory/memory-retrospective-job.ts +28 -227
- package/src/memory/migrations/129-contact-channels-access-fields.ts +18 -9
- package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +14 -2
- package/src/memory/migrations/289-contact-channels-unique-ext-user.ts +10 -0
- package/src/memory/migrations/291-contact-channels-renormalize-addresses.ts +72 -0
- package/src/memory/migrations/292-schedule-default-no-reuse-conversation.test.ts +67 -0
- package/src/memory/migrations/292-schedule-default-no-reuse-conversation.ts +25 -0
- package/src/memory/migrations/293-workflow-journal-leaf-tokens.ts +32 -0
- package/src/memory/migrations/294-drop-external-user-id.ts +31 -0
- package/src/memory/migrations/295-drop-approval-prompt-ts-tracker.ts +20 -0
- package/src/memory/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +110 -0
- package/src/memory/migrations/296-rewrite-balanced-economy-profile-pins.ts +68 -0
- package/src/memory/migrations/__tests__/131-drop-legacy-member-guardian-tables.test.ts +154 -0
- package/src/memory/migrations/__tests__/289-contact-channels-unique-ext-user.test.ts +31 -0
- package/src/memory/migrations/__tests__/291-contact-channels-renormalize-addresses.test.ts +341 -0
- package/src/memory/migrations/__tests__/run-migrations.test.ts +52 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/run-migrations.ts +41 -0
- package/src/memory/migrations/validate-migration-state.ts +1 -1
- package/src/memory/onboarding-events-store.ts +3 -3
- package/src/memory/schema/contacts.ts +0 -5
- package/src/memory/skill-loaded-events-store.test.ts +7 -15
- package/src/memory/skill-loaded-events-store.ts +2 -2
- package/src/memory/tool-executed-events-store.test.ts +7 -7
- package/src/memory/turn-trace-store.test.ts +736 -0
- package/src/memory/turn-trace-store.ts +364 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +8 -0
- package/src/memory/v2/__tests__/skill-content.test.ts +30 -0
- package/src/memory/v2/consolidation-job.ts +2 -2
- package/src/memory/v2/skill-content.ts +25 -7
- package/src/memory/v2/skill-store.ts +7 -1
- package/src/memory/v3-eval/__tests__/eval-packets.test.ts +248 -0
- package/src/memory/v3-eval/eval-packets.ts +546 -0
- package/src/messaging/providers/slack/adapter.ts +1 -1
- package/src/messaging/providers/slack/api.ts +31 -0
- package/src/messaging/providers/slack/send.test.ts +114 -2
- package/src/messaging/providers/slack/send.ts +30 -7
- package/src/messaging/providers/slack/withdraw.test.ts +200 -0
- package/src/messaging/providers/slack/withdraw.ts +161 -0
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/access-request-copy.ts +72 -59
- package/src/notifications/adapters/shared.ts +29 -0
- package/src/notifications/adapters/slack.ts +58 -103
- package/src/notifications/adapters/telegram.ts +2 -20
- package/src/notifications/approval-card-data.ts +333 -0
- package/src/notifications/broadcaster.ts +16 -3
- package/src/notifications/canonical-delivery-recorder.ts +139 -0
- package/src/notifications/copy-composer.ts +3 -3
- package/src/notifications/decision-engine.ts +4 -2
- package/src/notifications/destination-resolver.ts +4 -6
- package/src/notifications/guardian-question-mode.ts +10 -0
- package/src/notifications/home-feed-side-effect.ts +7 -16
- package/src/notifications/notification-utils.ts +19 -20
- package/src/notifications/signal.ts +79 -43
- package/src/notifications/types.ts +98 -121
- package/src/oauth/AGENTS.md +5 -24
- package/src/permissions/checker.test.ts +51 -0
- package/src/permissions/checker.ts +185 -26
- package/src/permissions/ipc-risk-types.ts +24 -0
- package/src/permissions/question-prompter.test.ts +27 -0
- package/src/permissions/question-prompter.ts +4 -0
- package/src/platform/client.test.ts +119 -0
- package/src/platform/client.ts +66 -0
- package/src/platform/consent-cache.test.ts +267 -0
- package/src/platform/consent-cache.ts +174 -0
- package/src/plugin-api/constants.ts +1 -1
- package/src/plugin-api/index.ts +33 -1
- package/src/plugin-api/model-profiles.ts +33 -0
- package/src/plugin-api/types.ts +50 -2
- package/src/plugins/defaults/advisor/__tests__/advisor-gate.test.ts +56 -0
- package/src/plugins/defaults/advisor/__tests__/advisor-state-store.test.ts +43 -0
- package/src/plugins/defaults/advisor/__tests__/agent-loop-integration.test.ts +137 -0
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +153 -0
- package/src/plugins/defaults/advisor/__tests__/hooks.test.ts +138 -0
- package/src/plugins/defaults/advisor/__tests__/transcript.test.ts +147 -0
- package/src/plugins/defaults/advisor/advisor-gate.ts +29 -0
- package/src/plugins/defaults/advisor/advisor-state-store.ts +94 -0
- package/src/plugins/defaults/advisor/config.ts +21 -0
- package/src/plugins/defaults/advisor/consult.ts +93 -0
- package/src/plugins/defaults/advisor/hooks/post-model-call.ts +34 -0
- package/src/plugins/defaults/advisor/hooks/pre-model-call.ts +30 -0
- package/src/plugins/defaults/advisor/hooks/user-prompt-submit.ts +19 -0
- package/src/plugins/defaults/advisor/package.json +14 -0
- package/src/plugins/defaults/advisor/steering.ts +67 -0
- package/src/plugins/defaults/advisor/tools/advisor.ts +65 -0
- package/src/plugins/defaults/advisor/transcript.ts +76 -0
- package/src/plugins/defaults/index.ts +60 -0
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +22 -9
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +2 -2
- package/src/plugins/defaults/memory-retrieval/tail-reinjection-strip.ts +64 -0
- package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +29 -21
- package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +129 -9
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +31 -4
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +77 -2
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +7 -10
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +144 -11
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +32 -20
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +56 -3
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +23 -2
- package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +276 -0
- package/src/plugins/defaults/surface-completion-nudge/hooks/stop.ts +22 -0
- package/src/plugins/defaults/surface-completion-nudge/nudge-state-store.ts +46 -0
- package/src/plugins/defaults/surface-completion-nudge/package.json +14 -0
- package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +3 -13
- package/src/plugins/defaults/title-generate/hooks/stop.ts +56 -21
- package/src/prompts/persona-resolver.ts +14 -4
- package/src/prompts/templates/system-sections.ts +7 -2
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +1 -0
- package/src/providers/__tests__/retry-callsite.test.ts +176 -0
- package/src/providers/atlascloud/client.ts +85 -0
- package/src/providers/fetch-provider-catalog.ts +85 -0
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/model-catalog.ts +58 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +33 -0
- package/src/providers/openai/chat-completions-provider.ts +7 -0
- package/src/providers/openai/responses-provider.ts +10 -0
- package/src/providers/provider-send-message.ts +11 -3
- package/src/providers/retry.ts +53 -12
- package/src/providers/search-provider-catalog.ts +10 -0
- package/src/providers/weak-open-model.ts +22 -0
- package/src/runtime/AGENTS.md +0 -1
- package/src/runtime/__tests__/agent-wake.test.ts +181 -0
- package/src/runtime/__tests__/client-health.test.ts +44 -0
- package/src/runtime/access-request-helper.ts +21 -53
- package/src/runtime/actor-trust-resolver.ts +59 -63
- package/src/runtime/agent-wake.ts +52 -0
- package/src/runtime/assistant-event-hub.ts +18 -4
- package/src/runtime/auth/__tests__/route-policy.test.ts +12 -0
- package/src/runtime/auth/require-bound-guardian.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -6
- package/src/runtime/capabilities.test.ts +120 -0
- package/src/runtime/capabilities.ts +197 -0
- package/src/runtime/channel-approval-types.ts +22 -45
- package/src/runtime/channel-invite-transports/telegram.ts +4 -4
- package/src/runtime/channel-retry-sweep.ts +1 -0
- package/src/runtime/channel-verification-service.ts +3 -3
- package/src/runtime/client-health.ts +26 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +38 -29
- package/src/runtime/effective-capabilities.test.ts +128 -0
- package/src/runtime/effective-capabilities.ts +84 -0
- package/src/runtime/guardian-reply-router.ts +106 -21
- package/src/runtime/invite-redemption-service.ts +9 -25
- package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +123 -0
- package/src/runtime/migrations/vbundle-builder.ts +49 -20
- package/src/runtime/pending-interactions.ts +15 -0
- package/src/runtime/routes/__tests__/client-routes.test.ts +13 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +67 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +240 -1
- package/src/runtime/routes/app-routes.ts +1 -1
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +2 -2
- package/src/runtime/routes/assets/vellum-design-system.css +1959 -0
- package/src/runtime/routes/browser-tabs-routes.ts +9 -0
- package/src/runtime/routes/btw-routes.ts +1 -27
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +17 -8
- package/src/runtime/routes/client-routes.ts +10 -0
- package/src/runtime/routes/contact-routes.ts +31 -8
- package/src/runtime/routes/conversation-compaction-routes.ts +1 -1
- package/src/runtime/routes/conversation-management-routes.ts +80 -1
- package/src/runtime/routes/conversation-query-routes.ts +68 -22
- package/src/runtime/routes/conversation-routes.ts +39 -14
- package/src/runtime/routes/credential-routes.ts +40 -16
- package/src/runtime/routes/empty-state-greeting-cache.ts +1 -2
- package/src/runtime/routes/events-routes.ts +1 -3
- package/src/runtime/routes/guardian-approval-interception.ts +14 -73
- package/src/runtime/routes/guardian-approval-prompt.ts +22 -4
- package/src/runtime/routes/home-feed-routes.ts +8 -3
- package/src/runtime/routes/identity-routes.ts +1 -296
- package/src/runtime/routes/inbound-message-handler.ts +214 -228
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +89 -7
- package/src/runtime/routes/inbound-stages/admission-policy.test.ts +154 -0
- package/src/runtime/routes/inbound-stages/admission-policy.ts +140 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +3 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +11 -6
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +1 -2
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +1 -2
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +7 -7
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +47 -28
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +358 -0
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +8 -0
- package/src/runtime/routes/integrations/slack/channel.ts +36 -0
- package/src/runtime/routes/internal-telemetry-routes.ts +1 -1
- package/src/runtime/routes/mcp-auth-routes.ts +233 -41
- package/src/runtime/routes/memory-eval-routes.ts +87 -0
- package/src/runtime/routes/notification-routes.ts +122 -133
- package/src/runtime/routes/platform-routes.ts +2 -2
- package/src/runtime/routes/plugins-routes.ts +202 -3
- package/src/runtime/routes/schedule-routes.ts +0 -22
- package/src/runtime/routes/secret-routes.ts +10 -0
- package/src/runtime/routes/surface-action-routes.ts +2 -1
- package/src/runtime/routes/tool-call-question-enrichment.test.ts +146 -0
- package/src/runtime/routes/tool-call-question-enrichment.ts +66 -0
- package/src/runtime/routes/workflow-routes.test.ts +229 -44
- package/src/runtime/routes/workflow-routes.ts +131 -29
- package/src/runtime/routes/workspace-greetings.ts +55 -0
- package/src/runtime/sync/resource-sync-events.ts +1 -11
- package/src/runtime/tool-grant-request-helper.ts +18 -16
- package/src/runtime/trust-context-resolver.ts +8 -5
- package/src/schedule/inference-profile.ts +2 -14
- package/src/schedule/schedule-store.ts +1 -1
- package/src/schedule/scheduler-types.ts +5 -1
- package/src/security/__tests__/provider-key-env-fallback.test.ts +6 -0
- package/src/security/secret-patterns.ts +3 -0
- package/src/subagent/manager.ts +17 -4
- package/src/subagent/types.ts +6 -0
- package/src/telemetry/trace-collection-policy.test.ts +28 -0
- package/src/telemetry/trace-collection-policy.ts +30 -0
- package/src/telemetry/types.ts +89 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +586 -36
- package/src/telemetry/usage-telemetry-reporter.ts +148 -41
- package/src/tools/AGENTS.md +3 -3
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +31 -0
- package/src/tools/browser/browser-execution.ts +30 -19
- package/src/tools/document/document-tool.ts +2 -3
- package/src/tools/executor.ts +5 -3
- package/src/tools/host-terminal/host-shell.ts +5 -4
- package/src/tools/memory/register.ts +2 -2
- package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +360 -0
- package/src/tools/network/__tests__/web-search.test.ts +143 -0
- package/src/tools/network/web-fetch.ts +372 -1
- package/src/tools/network/web-search-error.ts +1 -1
- package/src/tools/network/web-search.ts +213 -10
- package/src/tools/permission-checker.ts +4 -3
- package/src/tools/registry.ts +20 -0
- package/src/tools/schedule/create.ts +7 -12
- package/src/tools/schedule/update.ts +4 -11
- package/src/tools/shared/filesystem/path-policy.ts +39 -13
- package/src/tools/side-effects.ts +2 -17
- package/src/tools/skills/execute.ts +33 -0
- package/src/tools/subagent/spawn.ts +61 -12
- package/src/tools/terminal/shell.ts +10 -4
- package/src/tools/tool-approval-handler.ts +18 -13
- package/src/tools/tool-manifest.ts +0 -2
- package/src/tools/types.ts +9 -0
- package/src/tools/ui-surface/definitions.ts +64 -3
- package/src/tools/verification-control-plane-policy.ts +3 -1
- package/src/tools/workflows/run-workflow.test.ts +8 -18
- package/src/tools/workflows/run-workflow.ts +1 -0
- package/src/util/disk-usage.ts +78 -23
- package/src/util/platform.ts +10 -3
- package/src/watcher/telemetry.ts +2 -2
- package/src/workflows/capabilities.ts +2 -3
- package/src/workflows/engine.test.ts +175 -1
- package/src/workflows/engine.ts +82 -0
- package/src/workflows/journal-store.test.ts +70 -0
- package/src/workflows/journal-store.ts +18 -3
- package/src/workflows/run-manager.test.ts +171 -28
- package/src/workflows/run-manager.ts +66 -24
- package/src/workspace/migrations/105-enable-memory-v3-live-for-new-workspaces.ts +63 -0
- package/src/workspace/migrations/106-drop-collect-usage-data.ts +47 -0
- package/src/workspace/migrations/107-drop-send-diagnostics.ts +47 -0
- package/src/workspace/migrations/108-drop-balanced-economy-profile.ts +129 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +0 -98
- package/src/__tests__/credential-security-e2e.test.ts +0 -362
- package/src/__tests__/credential-vault-unit.test.ts +0 -1528
- package/src/__tests__/credential-vault.test.ts +0 -1706
- package/src/__tests__/identity-intro-cache.test.ts +0 -315
- package/src/__tests__/secret-onetime-send.test.ts +0 -182
- package/src/cli/commands/__tests__/task.test.ts +0 -914
- package/src/cli/commands/task.ts +0 -771
- package/src/config/bundled-skills/personal-page/SKILL.md +0 -57
- package/src/config/bundled-skills/personal-page/TOOLS.json +0 -27
- package/src/config/bundled-skills/personal-page/tools/app-refresh.ts +0 -17
- package/src/config/preloaded-apps/personal-page/src/components/About.tsx +0 -22
- package/src/config/preloaded-apps/personal-page/src/components/App.tsx +0 -16
- package/src/config/preloaded-apps/personal-page/src/components/Features.tsx +0 -77
- package/src/config/preloaded-apps/personal-page/src/components/Hero.tsx +0 -57
- package/src/config/preloaded-apps/personal-page/src/components/Pending.tsx +0 -28
- package/src/config/preloaded-apps/personal-page/src/components/animations.tsx +0 -234
- package/src/config/preloaded-apps/personal-page/src/components/icons.tsx +0 -48
- package/src/config/preloaded-apps/personal-page/src/components/media.ts +0 -16
- package/src/config/preloaded-apps/personal-page/src/index.html +0 -20
- package/src/config/preloaded-apps/personal-page/src/main.tsx +0 -7
- package/src/config/preloaded-apps/personal-page/src/profile-data.ts +0 -82
- package/src/config/preloaded-apps/personal-page/src/styles.css +0 -759
- package/src/memory/__tests__/preloaded-apps.test.ts +0 -85
- package/src/memory/preloaded-apps.ts +0 -116
- package/src/notifications/tool-approval-copy.ts +0 -142
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +0 -78
- package/src/runtime/routes/identity-intro-cache.ts +0 -172
- package/src/tools/credentials/vault.ts +0 -712
|
@@ -10,14 +10,17 @@
|
|
|
10
10
|
* This is deliberately a distinct operation from install: `install` is
|
|
11
11
|
* first-time materialization (and errors on an existing install unless
|
|
12
12
|
* `--force` is passed), whereas `upgrade` moves an existing install forward.
|
|
13
|
-
* Mechanically the move is a forced re-install at the current pin, which the
|
|
14
|
-
* underlying {@link ./install-from-github.installPlugin} performs atomically —
|
|
15
|
-
* the previously installed copy is preserved until the fetch succeeds.
|
|
16
13
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
14
|
+
* How local edits are reconciled with the pin is controlled by the
|
|
15
|
+
* {@link PluginUpgradeStrategy}. `overwrite` (the default) moves via a forced
|
|
16
|
+
* re-install at the current pin — the underlying
|
|
17
|
+
* {@link ./install-from-github.installPlugin} performs that atomically, and the
|
|
18
|
+
* previously installed copy (including any local edits) is replaced wholesale.
|
|
19
|
+
* `ours`/`theirs`/`assistant` instead three-way merge the on-disk tree and the
|
|
20
|
+
* pin against the re-materialized install commit so non-conflicting local edits
|
|
21
|
+
* survive; conflicting hunks resolve toward the local edit (`ours`) or the pin
|
|
22
|
+
* (`theirs`), while `assistant` writes git conflict markers into the file and
|
|
23
|
+
* reports the conflicted paths for the assistant to resolve.
|
|
21
24
|
*
|
|
22
25
|
* Designed for direct programmatic use with injected dependencies, mirroring
|
|
23
26
|
* the sibling plugin libraries. The CLI command `assistant plugins upgrade
|
|
@@ -25,24 +28,66 @@
|
|
|
25
28
|
* result.
|
|
26
29
|
*/
|
|
27
30
|
|
|
28
|
-
import {
|
|
31
|
+
import { existsSync, mkdirSync, mkdtempSync, rmSync } from "node:fs";
|
|
32
|
+
import { tmpdir } from "node:os";
|
|
33
|
+
import { dirname, join } from "node:path";
|
|
29
34
|
|
|
30
35
|
import { getWorkspacePluginsDir } from "../../util/platform.js";
|
|
31
36
|
import {
|
|
32
37
|
inspectPlugin,
|
|
33
38
|
type PluginInspection,
|
|
34
39
|
PluginInspectNotFoundError,
|
|
40
|
+
type PluginLocalInfo,
|
|
41
|
+
type PluginRemoteInfo,
|
|
35
42
|
} from "./inspect-plugin.js";
|
|
36
43
|
import {
|
|
44
|
+
DEFAULT_PLUGIN_REF,
|
|
37
45
|
type FetchLike,
|
|
46
|
+
finalizeStagedInstall,
|
|
38
47
|
type GitRunner,
|
|
48
|
+
INSTALL_META_FILENAME,
|
|
39
49
|
installPlugin,
|
|
50
|
+
materializePluginTree,
|
|
51
|
+
type PluginFetchSource,
|
|
52
|
+
PluginNotFoundError,
|
|
40
53
|
PluginSourceUnavailableError,
|
|
41
54
|
type PostinstallRunner,
|
|
55
|
+
readInstallMeta,
|
|
42
56
|
sanitizePluginName,
|
|
43
57
|
} from "./install-from-github.js";
|
|
58
|
+
import { type ConflictLabels, mergePluginTree } from "./merge-plugin-tree.js";
|
|
59
|
+
import { computeFingerprint, fingerprintsEqual } from "./plugin-fingerprint.js";
|
|
44
60
|
import { PluginNotInstalledError } from "./uninstall-plugin.js";
|
|
45
61
|
|
|
62
|
+
/**
|
|
63
|
+
* How local edits to an installed plugin are reconciled with the marketplace
|
|
64
|
+
* pin during an upgrade.
|
|
65
|
+
*
|
|
66
|
+
* - `overwrite` (default) — discard all local edits and re-install the pin
|
|
67
|
+
* wholesale. Matches the historical upgrade behavior.
|
|
68
|
+
* - `ours` — three-way merge; conflicting hunks resolve toward the local edit.
|
|
69
|
+
* - `theirs` — three-way merge; conflicting hunks resolve toward the pin.
|
|
70
|
+
* - `assistant` — three-way merge that writes git conflict markers into
|
|
71
|
+
* conflicting files and reports them for the assistant to resolve.
|
|
72
|
+
*/
|
|
73
|
+
export type PluginUpgradeStrategy =
|
|
74
|
+
| "ours"
|
|
75
|
+
| "theirs"
|
|
76
|
+
| "overwrite"
|
|
77
|
+
| "assistant";
|
|
78
|
+
|
|
79
|
+
/** The set of accepted `--strategy` values, for validation and help text. */
|
|
80
|
+
export const PLUGIN_UPGRADE_STRATEGIES: readonly PluginUpgradeStrategy[] = [
|
|
81
|
+
"ours",
|
|
82
|
+
"theirs",
|
|
83
|
+
"overwrite",
|
|
84
|
+
"assistant",
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
/** The strategy applied when a caller omits `--strategy`. */
|
|
88
|
+
export const DEFAULT_PLUGIN_UPGRADE_STRATEGY: PluginUpgradeStrategy =
|
|
89
|
+
"overwrite";
|
|
90
|
+
|
|
46
91
|
/**
|
|
47
92
|
* Outcome of an upgrade attempt.
|
|
48
93
|
*
|
|
@@ -61,6 +106,11 @@ export interface UpgradePluginOptions {
|
|
|
61
106
|
readonly name: string;
|
|
62
107
|
/** Report what would change without modifying the install. */
|
|
63
108
|
readonly dryRun?: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* How to reconcile local edits with the pin. Defaults to
|
|
111
|
+
* {@link DEFAULT_PLUGIN_UPGRADE_STRATEGY}.
|
|
112
|
+
*/
|
|
113
|
+
readonly strategy?: PluginUpgradeStrategy;
|
|
64
114
|
}
|
|
65
115
|
|
|
66
116
|
/** Dependencies injected by the caller. */
|
|
@@ -99,6 +149,21 @@ export interface PluginUpgradeResult {
|
|
|
99
149
|
readonly fileCount: number | null;
|
|
100
150
|
/** Whether this was a dry run (no changes made). */
|
|
101
151
|
readonly dryRun: boolean;
|
|
152
|
+
/** Conflict-resolution strategy the upgrade applied. */
|
|
153
|
+
readonly strategy: PluginUpgradeStrategy;
|
|
154
|
+
/**
|
|
155
|
+
* Paths (relative to {@link PluginUpgradeResult.target}) left for the
|
|
156
|
+
* assistant to resolve under the `assistant` strategy: text files carry git
|
|
157
|
+
* conflict markers, modify/delete divergences keep the surviving content.
|
|
158
|
+
* Always empty for other strategies.
|
|
159
|
+
*/
|
|
160
|
+
readonly conflicts: readonly string[];
|
|
161
|
+
/**
|
|
162
|
+
* Paths of binary files that conflicted under the `assistant` strategy; the
|
|
163
|
+
* local copy was kept since markers cannot be written into binary content.
|
|
164
|
+
* Always empty for other strategies.
|
|
165
|
+
*/
|
|
166
|
+
readonly binaryConflicts: readonly string[];
|
|
102
167
|
/**
|
|
103
168
|
* Whether the installed copy lacked resolvable provenance before the
|
|
104
169
|
* upgrade. Such installs are re-pinned to the current SHA, which also
|
|
@@ -118,6 +183,22 @@ export class PluginNotUpgradableError extends Error {
|
|
|
118
183
|
}
|
|
119
184
|
}
|
|
120
185
|
|
|
186
|
+
/**
|
|
187
|
+
* A merge strategy (`ours`/`theirs`) was requested but the install-time
|
|
188
|
+
* baseline needed for a three-way merge cannot be reconstructed.
|
|
189
|
+
*/
|
|
190
|
+
export class PluginMergeBaselineError extends Error {
|
|
191
|
+
constructor(
|
|
192
|
+
readonly pluginName: string,
|
|
193
|
+
reason: string,
|
|
194
|
+
) {
|
|
195
|
+
super(
|
|
196
|
+
`Plugin "${pluginName}" cannot be merge-upgraded: ${reason}. Use '--strategy overwrite' to take the pin wholesale, or reinstall with 'plugins install ${pluginName} --force'.`,
|
|
197
|
+
);
|
|
198
|
+
this.name = "PluginMergeBaselineError";
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
121
202
|
function pluginTarget(name: string, deps: UpgradePluginDeps): string {
|
|
122
203
|
const dir = deps.workspacePluginsDir ?? getWorkspacePluginsDir();
|
|
123
204
|
return join(dir, name);
|
|
@@ -126,10 +207,19 @@ function pluginTarget(name: string, deps: UpgradePluginDeps): string {
|
|
|
126
207
|
/**
|
|
127
208
|
* Move an installed plugin to the marketplace's current pin.
|
|
128
209
|
*
|
|
210
|
+
* The `strategy` controls how local edits are reconciled with the pin:
|
|
211
|
+
* `overwrite` (default) re-installs the pin wholesale; `ours`/`theirs`/
|
|
212
|
+
* `assistant` do a three-way merge that carries non-conflicting local edits
|
|
213
|
+
* forward, resolving conflicting hunks toward the local edit (`ours`) or the
|
|
214
|
+
* pin (`theirs`), or leaving git conflict markers in the file for the assistant
|
|
215
|
+
* to resolve (`assistant`).
|
|
216
|
+
*
|
|
129
217
|
* Throws {@link PluginNotInstalledError} when no copy is installed,
|
|
130
218
|
* {@link PluginNotUpgradableError} when the install has no marketplace entry to
|
|
131
|
-
* advance to, {@link
|
|
132
|
-
*
|
|
219
|
+
* advance to, {@link PluginMergeBaselineError} when a merge strategy is
|
|
220
|
+
* requested but the install-time baseline cannot be reconstructed,
|
|
221
|
+
* {@link PluginSourceUnavailableError} when the marketplace catalog is
|
|
222
|
+
* temporarily unreachable (a retryable outage, distinct from the permanent
|
|
133
223
|
* no-entry case), and propagates {@link installPlugin}'s errors (e.g. source
|
|
134
224
|
* unavailable, postinstall failure) when the re-install itself fails.
|
|
135
225
|
*/
|
|
@@ -139,6 +229,7 @@ export async function upgradePlugin(
|
|
|
139
229
|
): Promise<PluginUpgradeResult> {
|
|
140
230
|
const name = sanitizePluginName(opts.name);
|
|
141
231
|
const dryRun = opts.dryRun ?? false;
|
|
232
|
+
const strategy = opts.strategy ?? DEFAULT_PLUGIN_UPGRADE_STRATEGY;
|
|
142
233
|
|
|
143
234
|
let inspection: PluginInspection;
|
|
144
235
|
try {
|
|
@@ -199,6 +290,9 @@ export async function upgradePlugin(
|
|
|
199
290
|
target: local.target,
|
|
200
291
|
fileCount: null,
|
|
201
292
|
dryRun,
|
|
293
|
+
strategy,
|
|
294
|
+
conflicts: [],
|
|
295
|
+
binaryConflicts: [],
|
|
202
296
|
provenanceWasUnknown: false,
|
|
203
297
|
};
|
|
204
298
|
}
|
|
@@ -214,10 +308,37 @@ export async function upgradePlugin(
|
|
|
214
308
|
target: local.target,
|
|
215
309
|
fileCount: null,
|
|
216
310
|
dryRun: true,
|
|
311
|
+
strategy,
|
|
312
|
+
conflicts: [],
|
|
313
|
+
binaryConflicts: [],
|
|
217
314
|
provenanceWasUnknown,
|
|
218
315
|
};
|
|
219
316
|
}
|
|
220
317
|
|
|
318
|
+
// `ours`/`theirs`/`assistant` carry local edits forward via a three-way
|
|
319
|
+
// merge; the default `overwrite` discards them and re-installs the pin
|
|
320
|
+
// wholesale.
|
|
321
|
+
if (
|
|
322
|
+
strategy === "ours" ||
|
|
323
|
+
strategy === "theirs" ||
|
|
324
|
+
strategy === "assistant"
|
|
325
|
+
) {
|
|
326
|
+
return mergeUpgrade(
|
|
327
|
+
{
|
|
328
|
+
name,
|
|
329
|
+
strategy,
|
|
330
|
+
local,
|
|
331
|
+
remote,
|
|
332
|
+
fromCommit,
|
|
333
|
+
fromTimestamp,
|
|
334
|
+
toCommit,
|
|
335
|
+
toTimestamp,
|
|
336
|
+
provenanceWasUnknown,
|
|
337
|
+
},
|
|
338
|
+
deps,
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
|
|
221
342
|
const result = await installPlugin(
|
|
222
343
|
{ name, force: true },
|
|
223
344
|
{
|
|
@@ -238,6 +359,173 @@ export async function upgradePlugin(
|
|
|
238
359
|
target: result.target,
|
|
239
360
|
fileCount: result.fileCount,
|
|
240
361
|
dryRun: false,
|
|
362
|
+
strategy,
|
|
363
|
+
conflicts: [],
|
|
364
|
+
binaryConflicts: [],
|
|
241
365
|
provenanceWasUnknown,
|
|
242
366
|
};
|
|
243
367
|
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Carry local edits forward by three-way merging the on-disk install (`ours`)
|
|
371
|
+
* and the marketplace pin (`theirs`) against the re-materialized install commit
|
|
372
|
+
* (`base`), then atomically swapping the merged tree into place pinned at the
|
|
373
|
+
* new commit. Conflicting hunks resolve toward `ours` or `theirs` per the
|
|
374
|
+
* strategy, or are left as git conflict markers under `assistant`;
|
|
375
|
+
* non-conflicting edits from both sides survive.
|
|
376
|
+
*/
|
|
377
|
+
async function mergeUpgrade(
|
|
378
|
+
ctx: {
|
|
379
|
+
readonly name: string;
|
|
380
|
+
readonly strategy: "ours" | "theirs" | "assistant";
|
|
381
|
+
readonly local: PluginLocalInfo;
|
|
382
|
+
readonly remote: PluginRemoteInfo;
|
|
383
|
+
readonly fromCommit: string | null;
|
|
384
|
+
readonly fromTimestamp: string | null;
|
|
385
|
+
readonly toCommit: string;
|
|
386
|
+
readonly toTimestamp: string | null;
|
|
387
|
+
readonly provenanceWasUnknown: boolean;
|
|
388
|
+
},
|
|
389
|
+
deps: UpgradePluginDeps,
|
|
390
|
+
): Promise<PluginUpgradeResult> {
|
|
391
|
+
const { name, strategy, local, remote } = ctx;
|
|
392
|
+
|
|
393
|
+
// Marker labels name each side by its commit so the assistant can tell the
|
|
394
|
+
// local edit from the incoming pin when resolving.
|
|
395
|
+
const shortSha = (sha: string | null): string =>
|
|
396
|
+
sha ? sha.slice(0, 7) : "unknown";
|
|
397
|
+
const conflictLabels: ConflictLabels = {
|
|
398
|
+
ours: `local edits (was ${shortSha(ctx.fromCommit)})`,
|
|
399
|
+
base: `install baseline ${shortSha(ctx.fromCommit)}`,
|
|
400
|
+
theirs: `upgrade pin ${shortSha(ctx.toCommit)}`,
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
const meta = readInstallMeta(local.target);
|
|
404
|
+
if (!meta || !meta.commit || !meta.fingerprint) {
|
|
405
|
+
throw new PluginMergeBaselineError(
|
|
406
|
+
name,
|
|
407
|
+
"no install commit or fingerprint was recorded (an older or manually-copied install)",
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
const recorded = meta.fingerprint;
|
|
411
|
+
|
|
412
|
+
const baseSource: PluginFetchSource = {
|
|
413
|
+
owner: meta.source.owner,
|
|
414
|
+
repo: meta.source.repo,
|
|
415
|
+
rootPath: meta.source.path ?? "",
|
|
416
|
+
ref: meta.commit,
|
|
417
|
+
};
|
|
418
|
+
const [remoteOwner, remoteRepo] = remote.repo.split("/");
|
|
419
|
+
const theirsSource: PluginFetchSource = {
|
|
420
|
+
owner: remoteOwner ?? "",
|
|
421
|
+
repo: remoteRepo ?? "",
|
|
422
|
+
rootPath: remote.path,
|
|
423
|
+
ref: remote.commit,
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
const pluginsDir = deps.workspacePluginsDir ?? getWorkspacePluginsDir();
|
|
427
|
+
const baseDir = mkdtempSync(join(tmpdir(), `plugin-upgrade-base-${name}-`));
|
|
428
|
+
const theirsDir = mkdtempSync(
|
|
429
|
+
join(tmpdir(), `plugin-upgrade-theirs-${name}-`),
|
|
430
|
+
);
|
|
431
|
+
// Stage outside the served `plugins/` directory and on its filesystem so the
|
|
432
|
+
// final swap is an atomic rename, mirroring `installPlugin`.
|
|
433
|
+
const stagingRoot = join(dirname(pluginsDir), ".plugins-staging");
|
|
434
|
+
mkdirSync(stagingRoot, { recursive: true });
|
|
435
|
+
const stagingDir = join(stagingRoot, `${name}.upgrading.${process.pid}`);
|
|
436
|
+
if (existsSync(stagingDir)) {
|
|
437
|
+
rmSync(stagingDir, { recursive: true, force: true });
|
|
438
|
+
}
|
|
439
|
+
mkdirSync(stagingDir, { recursive: true });
|
|
440
|
+
|
|
441
|
+
try {
|
|
442
|
+
const base = await materializePluginTree(
|
|
443
|
+
{
|
|
444
|
+
source: baseSource,
|
|
445
|
+
name,
|
|
446
|
+
stubRef: DEFAULT_PLUGIN_REF,
|
|
447
|
+
destDir: baseDir,
|
|
448
|
+
},
|
|
449
|
+
deps,
|
|
450
|
+
);
|
|
451
|
+
if (base.fileCount === 0) {
|
|
452
|
+
throw new PluginNotFoundError(
|
|
453
|
+
name,
|
|
454
|
+
baseSource.ref,
|
|
455
|
+
`${baseSource.owner}/${baseSource.repo}`,
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
// The merge base must faithfully reproduce what install materialized;
|
|
459
|
+
// otherwise a curated adapter overlay that moved since install would read
|
|
460
|
+
// as base→ours/theirs edits and corrupt the merge. Verify against the
|
|
461
|
+
// recorded fingerprint, exactly as `plugins diff` does.
|
|
462
|
+
const baseFingerprint = computeFingerprint(baseDir, [
|
|
463
|
+
INSTALL_META_FILENAME,
|
|
464
|
+
]);
|
|
465
|
+
if (!fingerprintsEqual(baseFingerprint, recorded)) {
|
|
466
|
+
throw new PluginMergeBaselineError(
|
|
467
|
+
name,
|
|
468
|
+
"the install-time baseline could not be faithfully reconstructed (a curated adapter overlay it was built from has changed since install)",
|
|
469
|
+
);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
const theirs = await materializePluginTree(
|
|
473
|
+
{
|
|
474
|
+
source: theirsSource,
|
|
475
|
+
name,
|
|
476
|
+
stubRef: remote.marketplaceRef,
|
|
477
|
+
destDir: theirsDir,
|
|
478
|
+
},
|
|
479
|
+
deps,
|
|
480
|
+
);
|
|
481
|
+
if (theirs.fileCount === 0) {
|
|
482
|
+
throw new PluginNotFoundError(
|
|
483
|
+
name,
|
|
484
|
+
theirsSource.ref,
|
|
485
|
+
`${theirsSource.owner}/${theirsSource.repo}`,
|
|
486
|
+
);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
const merge = await mergePluginTree({
|
|
490
|
+
baseDir,
|
|
491
|
+
oursDir: local.target,
|
|
492
|
+
theirsDir,
|
|
493
|
+
destDir: stagingDir,
|
|
494
|
+
strategy,
|
|
495
|
+
conflictLabels,
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
const toCommit = theirs.commit ?? remote.commit;
|
|
499
|
+
const toTimestamp = theirs.committedAt ?? remote.committedAt;
|
|
500
|
+
finalizeStagedInstall(stagingDir, {
|
|
501
|
+
name,
|
|
502
|
+
source: theirsSource,
|
|
503
|
+
ref: theirsSource.ref,
|
|
504
|
+
commit: toCommit,
|
|
505
|
+
committedAt: toTimestamp,
|
|
506
|
+
pluginsDir,
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
return {
|
|
510
|
+
name,
|
|
511
|
+
outcome: "upgraded",
|
|
512
|
+
fromCommit: ctx.fromCommit,
|
|
513
|
+
fromTimestamp: ctx.fromTimestamp,
|
|
514
|
+
toCommit,
|
|
515
|
+
toTimestamp,
|
|
516
|
+
target: join(pluginsDir, name),
|
|
517
|
+
fileCount: merge.fileCount,
|
|
518
|
+
dryRun: false,
|
|
519
|
+
strategy,
|
|
520
|
+
conflicts: merge.conflicts,
|
|
521
|
+
binaryConflicts: merge.binaryConflicts,
|
|
522
|
+
provenanceWasUnknown: ctx.provenanceWasUnknown,
|
|
523
|
+
};
|
|
524
|
+
} catch (err) {
|
|
525
|
+
rmSync(stagingDir, { recursive: true, force: true });
|
|
526
|
+
throw err;
|
|
527
|
+
} finally {
|
|
528
|
+
rmSync(baseDir, { recursive: true, force: true });
|
|
529
|
+
rmSync(theirsDir, { recursive: true, force: true });
|
|
530
|
+
}
|
|
531
|
+
}
|
package/src/cli/program.ts
CHANGED
|
@@ -34,8 +34,7 @@ import { registerImageGenerationCommand } from "./commands/image-generation.js";
|
|
|
34
34
|
import { registerInferenceCommand } from "./commands/inference.js";
|
|
35
35
|
import { registerKeysCommand } from "./commands/keys.js";
|
|
36
36
|
import { registerMcpCommand } from "./commands/mcp.js";
|
|
37
|
-
import {
|
|
38
|
-
import { registerMemoryV3Command } from "./commands/memory-v3.js";
|
|
37
|
+
import { registerMemoryCommand } from "./commands/memory/index.js";
|
|
39
38
|
import { registerNotificationsCommand } from "./commands/notifications.js";
|
|
40
39
|
import { registerOAuthCommand } from "./commands/oauth/index.js";
|
|
41
40
|
import { registerPendingCommand } from "./commands/pending.js";
|
|
@@ -47,7 +46,6 @@ import { registerSequenceCommand } from "./commands/sequence.js";
|
|
|
47
46
|
import { registerSkillsCommand } from "./commands/skills.js";
|
|
48
47
|
import { registerStatusCommand } from "./commands/status.js";
|
|
49
48
|
import { registerSttCommand } from "./commands/stt.js";
|
|
50
|
-
import { registerTaskCommand } from "./commands/task.js";
|
|
51
49
|
import { registerTelemetryCommand } from "./commands/telemetry.js";
|
|
52
50
|
import { registerToolsCommand } from "./commands/tools.js";
|
|
53
51
|
import { registerTrustCommand } from "./commands/trust.js";
|
|
@@ -131,8 +129,7 @@ Examples:
|
|
|
131
129
|
registerInferenceCommand(program);
|
|
132
130
|
registerKeysCommand(program);
|
|
133
131
|
registerMcpCommand(program);
|
|
134
|
-
|
|
135
|
-
registerMemoryV3Command(program);
|
|
132
|
+
registerMemoryCommand(program);
|
|
136
133
|
registerNotificationsCommand(program);
|
|
137
134
|
registerOAuthCommand(program);
|
|
138
135
|
registerPendingCommand(program);
|
|
@@ -146,7 +143,6 @@ Examples:
|
|
|
146
143
|
registerStatusCommand(program);
|
|
147
144
|
registerSkillsCommand(program);
|
|
148
145
|
registerSttCommand(program);
|
|
149
|
-
registerTaskCommand(program);
|
|
150
146
|
registerTelemetryCommand(program);
|
|
151
147
|
registerToolsCommand(program);
|
|
152
148
|
registerTrustCommand(program);
|