@vellumai/assistant 0.8.12 → 0.9.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/AGENTS.md +0 -14
- package/ARCHITECTURE.md +45 -45
- package/README.md +1 -1
- package/bun.lock +200 -154
- package/docs/architecture/integrations.md +3 -3
- package/docs/architecture/memory.md +2 -2
- package/docs/architecture/security.md +10 -10
- package/docs/runbook-trusted-contacts.md +12 -12
- package/docs/skills.md +6 -6
- package/docs/workflows-testing.md +221 -0
- package/docs/workflows.md +510 -0
- package/examples/plugins/echo/README.md +5 -5
- package/knip.json +2 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +105 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +12 -0
- package/openapi.yaml +7197 -5708
- package/package.json +8 -4
- package/scripts/generate-openapi.ts +66 -114
- package/src/__tests__/access-request-seed-content-blocks.test.ts +213 -0
- package/src/__tests__/adaptive-thinking-repair.test.ts +32 -3
- package/src/__tests__/agent-loop-output-hooks.test.ts +183 -0
- package/src/__tests__/agent-loop-regrowth-guard.test.ts +506 -0
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +2 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +77 -0
- package/src/__tests__/app-compiler.test.ts +7 -1
- package/src/__tests__/app-dir-path-guard.test.ts +27 -3
- package/src/__tests__/app-executors.test.ts +43 -0
- package/src/__tests__/approval-cascade.test.ts +0 -5
- package/src/__tests__/approval-routes-http.test.ts +91 -0
- package/src/__tests__/assistant-stream-state.test.ts +107 -0
- package/src/__tests__/browser-fill-credential.test.ts +3 -3
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +1 -1
- package/src/__tests__/compaction-events.test.ts +63 -7
- package/src/__tests__/compaction-trail-store.test.ts +74 -1
- package/src/__tests__/compaction.benchmark.test.ts +63 -41
- package/src/__tests__/compactor-low-watermark-cut.test.ts +349 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +64 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +0 -5
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -5
- package/src/__tests__/conversation-history-web-search.test.ts +7 -0
- package/src/__tests__/conversation-process-callsite.test.ts +0 -5
- package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -5
- package/src/__tests__/conversation-queue.test.ts +0 -5
- package/src/__tests__/conversation-slash-queue.test.ts +0 -5
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -5
- package/src/__tests__/conversation-speed-override.test.ts +0 -5
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +97 -0
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +67 -0
- package/src/__tests__/conversation-usage.test.ts +2 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -5
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -5
- package/src/__tests__/credential-broker-browser-fill.test.ts +2 -2
- package/src/__tests__/credential-broker-server-use.test.ts +2 -2
- package/src/__tests__/credential-broker.test.ts +1 -1
- package/src/__tests__/credential-prompt-route.test.ts +417 -0
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/credential-vault.test.ts +37 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +24 -0
- package/src/__tests__/dynamic-page-surface.test.ts +219 -0
- package/src/__tests__/empty-state-greeting-cache.test.ts +94 -0
- package/src/__tests__/gateway-flag-listener.test.ts +24 -7
- package/src/__tests__/guardian-action-sweep.test.ts +56 -219
- package/src/__tests__/guardian-routing-invariants.test.ts +138 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +0 -2
- package/src/__tests__/list-messages-hidden-metadata.test.ts +99 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +87 -1
- package/src/__tests__/llm-resolver.test.ts +115 -0
- package/src/__tests__/managed-profile-guard.test.ts +6 -5
- package/src/__tests__/max-tokens-continue-hook.test.ts +184 -0
- package/src/__tests__/media-generate-image.test.ts +20 -9
- package/src/__tests__/mock-gateway-ipc.ts +23 -0
- package/src/__tests__/model-intents.test.ts +1 -1
- package/src/__tests__/normalize-onboarding.test.ts +26 -0
- package/src/__tests__/notification-decision-strategy.test.ts +4 -2
- package/src/__tests__/notification-telegram-adapter.test.ts +21 -3
- package/src/__tests__/pending-interactions-resolved-event.test.ts +62 -0
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +72 -18
- package/src/__tests__/require-fresh-approval.test.ts +425 -1
- package/src/__tests__/resolve-app-id.test.ts +56 -0
- package/src/__tests__/runtime-events-sse-parity.test.ts +2 -0
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +408 -0
- package/src/__tests__/schedule-routes.test.ts +257 -4
- package/src/__tests__/schedule-store.test.ts +60 -0
- package/src/__tests__/schedule-tools.test.ts +247 -2
- package/src/__tests__/skill-execute-input.test.ts +85 -0
- package/src/__tests__/skill-secret-handling-guard.test.ts +21 -20
- package/src/__tests__/skills.test.ts +3 -3
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +1 -1
- package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
- package/src/__tests__/subagent-tool-gate-mode.test.ts +547 -0
- package/src/__tests__/system-prompt.test.ts +1 -1
- package/src/__tests__/task-progress-nudge-hook.test.ts +372 -0
- package/src/__tests__/task-scheduler.test.ts +299 -0
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +209 -0
- package/src/__tests__/tool-result-spool.test.ts +3 -1
- package/src/__tests__/workspace-migration-102-preserve-heartbeat-enabled-for-existing-workspaces.test.ts +181 -0
- package/src/__tests__/workspace-migration-103-upgrade-quality-profile-to-opus-4-8.test.ts +174 -0
- package/src/agent/compaction-circuit.ts +11 -0
- package/src/agent/loop.ts +181 -12
- package/src/api/constants/call-sites.ts +12 -0
- package/src/api/events/assistant-thinking-delta.ts +10 -0
- package/src/api/events/usage-update.ts +7 -0
- package/src/api/index.ts +4 -1
- package/src/api/responses/memory-v3-selection-log.ts +18 -11
- package/src/approvals/approval-primitive.ts +2 -2
- package/src/background-wake/background-wake-routes.test.ts +5 -2
- package/src/bundler/compiler-tools.ts +1 -1
- package/src/bundler/package-resolver.ts +0 -1
- package/src/calls/call-domain.ts +1 -1
- package/src/calls/guardian-action-sweep.ts +16 -93
- package/src/cli/AGENTS.md +4 -0
- package/src/cli/commands/__tests__/schedules.test.ts +430 -1
- package/src/cli/commands/credentials.ts +28 -24
- package/src/cli/commands/image-generation.ts +23 -9
- package/src/cli/commands/notifications.ts +1 -1
- package/src/cli/commands/plugins.ts +89 -46
- package/src/cli/commands/schedules.ts +384 -11
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +69 -5
- package/src/cli/lib/__tests__/install-from-github.test.ts +15 -0
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +81 -4
- package/src/cli/lib/inspect-plugin.ts +62 -1
- package/src/cli/lib/install-from-github.ts +52 -5
- package/src/cli/lib/upgrade-plugin.ts +18 -0
- package/src/config/__tests__/workflows-schema.test.ts +60 -0
- package/src/config/bundled-skills/acp/SKILL.md +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +1 -1
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +6 -1
- package/src/config/bundled-skills/app-builder/tools/app-generate-icon.ts +7 -1
- package/src/config/bundled-skills/app-builder/tools/app-refresh.ts +7 -1
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +10 -1
- package/src/config/bundled-skills/image-studio/SKILL.md +66 -19
- package/src/config/bundled-skills/image-studio/TOOLS.json +1 -6
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +22 -3
- package/src/config/bundled-skills/personal-page/SKILL.md +57 -0
- package/src/config/bundled-skills/personal-page/TOOLS.json +27 -0
- package/src/config/bundled-skills/personal-page/tools/app-refresh.ts +17 -0
- package/src/config/bundled-skills/schedule/SKILL.md +7 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +48 -4
- package/src/config/bundled-skills/workflows/SKILL.md +214 -0
- package/src/config/bundled-skills/workflows/TOOLS.json +84 -0
- package/src/config/bundled-skills/workflows/tools/manage-workflows.ts +12 -0
- package/src/config/bundled-skills/workflows/tools/run-workflow.ts +12 -0
- package/src/config/bundled-tool-registry.ts +14 -2
- package/src/config/call-site-defaults.ts +5 -0
- package/src/config/feature-flag-registry.json +12 -4
- package/src/config/llm-context-resolution.ts +8 -0
- package/src/config/llm-resolver.ts +30 -0
- package/src/config/preloaded-apps/personal-page/src/components/About.tsx +22 -0
- package/src/config/preloaded-apps/personal-page/src/components/App.tsx +16 -0
- package/src/config/preloaded-apps/personal-page/src/components/Features.tsx +77 -0
- package/src/config/preloaded-apps/personal-page/src/components/Hero.tsx +57 -0
- package/src/config/preloaded-apps/personal-page/src/components/Pending.tsx +28 -0
- package/src/config/preloaded-apps/personal-page/src/components/animations.tsx +234 -0
- package/src/config/preloaded-apps/personal-page/src/components/icons.tsx +48 -0
- package/src/config/preloaded-apps/personal-page/src/components/media.ts +16 -0
- package/src/config/preloaded-apps/personal-page/src/index.html +20 -0
- package/src/config/preloaded-apps/personal-page/src/main.tsx +7 -0
- package/src/config/preloaded-apps/personal-page/src/profile-data.ts +82 -0
- package/src/config/preloaded-apps/personal-page/src/styles.css +759 -0
- package/src/config/schema.ts +2 -0
- package/src/config/schemas/call-site-catalog.ts +7 -0
- package/src/config/schemas/heartbeat.ts +4 -1
- package/src/config/schemas/llm.ts +33 -26
- package/src/config/schemas/memory-retrospective.ts +19 -0
- package/src/config/schemas/platform.ts +8 -0
- package/src/config/schemas/services.ts +5 -2
- package/src/config/schemas/workflows.ts +42 -0
- package/src/config/skills.ts +3 -3
- package/src/context/compactor.ts +273 -39
- package/src/context/post-turn-tool-result-truncation.ts +23 -6
- package/src/context/tool-result-spool.ts +12 -17
- package/src/credential-execution/executable-discovery.ts +1 -1
- package/src/credential-execution/process-manager.ts +37 -3
- package/src/credential-execution/prompted-credential.ts +205 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +14 -0
- package/src/daemon/conversation-process.ts +11 -2
- package/src/daemon/conversation-surfaces.ts +167 -3
- package/src/daemon/conversation-tool-setup.ts +103 -26
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +115 -11
- package/src/daemon/handlers/shared.ts +26 -14
- package/src/daemon/host-cu-proxy.ts +15 -12
- package/src/daemon/host-file-proxy.ts +15 -12
- package/src/daemon/host-transfer-proxy.ts +30 -24
- package/src/daemon/lifecycle.ts +40 -3
- package/src/daemon/message-protocol.ts +3 -0
- package/src/daemon/message-types/messages.ts +2 -10
- package/src/daemon/message-types/workflows.ts +49 -0
- package/src/daemon/parse-actual-tokens-from-error.test.ts +62 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +43 -4
- package/src/daemon/process-message.ts +6 -0
- package/src/daemon/tool-setup-types.ts +57 -0
- package/src/daemon/wake-conversation-ops.ts +18 -0
- package/src/heartbeat/heartbeat-run-store.ts +8 -2
- package/src/home/feed-types.ts +1 -1
- package/src/ipc/gateway-flag-listener.ts +28 -6
- package/src/mcp/mcp-auth-state.ts +8 -20
- package/src/media/__tests__/image-models.test.ts +57 -0
- package/src/media/image-models.ts +66 -0
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +38 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +12 -2
- package/src/memory/__tests__/memory-retrospective-job.test.ts +911 -34
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +227 -5
- package/src/memory/__tests__/memory-retrospective-state.test.ts +195 -0
- package/src/memory/__tests__/preloaded-apps.test.ts +85 -0
- package/src/memory/auto-analysis-enqueue.ts +14 -1
- package/src/memory/compaction-log-store-clickhouse.ts +6 -4
- package/src/memory/conversation-crud.ts +9 -2
- package/src/memory/conversation-disk-view.ts +1 -1
- package/src/memory/conversation-queries.ts +22 -7
- package/src/memory/db-init.ts +20 -0
- package/src/memory/db-maintenance.ts +16 -0
- package/src/memory/embedding-runtime-manager.ts +1 -1
- package/src/memory/llm-request-log-source-clickhouse.ts +112 -14
- package/src/memory/llm-request-log-source-local.ts +19 -1
- package/src/memory/llm-request-log-source.ts +35 -6
- package/src/memory/llm-request-log-store.ts +90 -2
- package/src/memory/memory-retrospective-constants.ts +9 -0
- package/src/memory/memory-retrospective-enqueue.ts +3 -6
- package/src/memory/memory-retrospective-fork-boundary.ts +94 -0
- package/src/memory/memory-retrospective-job.ts +500 -208
- package/src/memory/memory-retrospective-startup-cleanup.ts +97 -19
- package/src/memory/memory-retrospective-state.ts +85 -2
- package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +40 -0
- package/src/memory/migrations/282-schedule-inference-profile.test.ts +77 -0
- package/src/memory/migrations/282-schedule-inference-profile.ts +26 -0
- package/src/memory/migrations/283-memory-v3-selections-message-id-and-sections.test.ts +102 -0
- package/src/memory/migrations/283-memory-v3-selections-message-id-and-sections.ts +53 -0
- package/src/memory/migrations/284-workflow-runs.ts +51 -0
- package/src/memory/migrations/285-schedule-workflow-mode.ts +26 -0
- package/src/memory/migrations/286-workflow-run-trust.ts +27 -0
- package/src/memory/migrations/287-conversation-origin-channel-index.ts +15 -0
- package/src/memory/migrations/288-backfill-origin-channel-from-bindings.ts +43 -0
- package/src/memory/migrations/289-contact-channels-unique-ext-user.ts +115 -0
- package/src/memory/migrations/290-schedule-capabilities.test.ts +77 -0
- package/src/memory/migrations/290-schedule-capabilities.ts +25 -0
- package/src/memory/migrations/__tests__/281-memory-retrospective-remembered-log.test.ts +96 -0
- package/src/memory/migrations/__tests__/289-contact-channels-unique-ext-user.test.ts +571 -0
- package/src/memory/migrations/index.ts +10 -0
- package/src/memory/preloaded-apps.ts +116 -0
- package/src/memory/schema/infrastructure.ts +4 -0
- package/src/memory/schema/memory-core.ts +4 -0
- package/src/memory/v2/__tests__/concept-page-frontmatter-schema.test.ts +45 -0
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +11 -7
- package/src/memory/v2/__tests__/page-store.test.ts +13 -2
- package/src/memory/v2/__tests__/qdrant.test.ts +24 -0
- package/src/memory/v2/frontmatter-sweep.ts +7 -6
- package/src/memory/v2/page-store.ts +4 -3
- package/src/memory/v2/qdrant.ts +42 -3
- package/src/memory/v2/types.ts +16 -10
- package/src/messaging/draft-store.ts +1 -1
- package/src/notifications/access-request-copy.ts +200 -113
- package/src/notifications/adapters/slack.ts +250 -111
- package/src/notifications/adapters/telegram.ts +7 -44
- package/src/notifications/approval-card-builder.ts +93 -0
- package/src/notifications/broadcaster.ts +74 -0
- package/src/notifications/conversation-pairing.ts +8 -6
- package/src/notifications/copy-composer.ts +32 -26
- package/src/notifications/decision-engine.ts +59 -7
- package/src/notifications/guardian-question-mode.ts +145 -155
- package/src/notifications/home-feed-side-effect.ts +28 -11
- package/src/notifications/notification-utils.ts +66 -0
- package/src/notifications/signal.ts +6 -0
- package/src/notifications/tool-approval-copy.ts +142 -0
- package/src/notifications/types.ts +19 -0
- package/src/permissions/threshold.ts +11 -0
- package/src/plugin-api/types.ts +16 -4
- package/src/plugins/defaults/compaction/window-manager.ts +44 -0
- package/src/plugins/defaults/index.ts +46 -0
- package/src/plugins/defaults/max-tokens-continue/continue-state-store.ts +53 -0
- package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +80 -0
- package/src/plugins/defaults/max-tokens-continue/hooks/stop.ts +20 -0
- package/src/plugins/defaults/max-tokens-continue/package.json +14 -0
- package/src/plugins/defaults/memory-retrieval/hooks/__tests__/user-prompt-submit.test.ts +37 -0
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +29 -1
- package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +8 -3
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +4 -2
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +28 -18
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +67 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +122 -22
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +2 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +63 -1
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +61 -18
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +1 -1
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +39 -10
- package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +34 -1
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +112 -47
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +78 -15
- package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +206 -0
- package/src/plugins/defaults/task-progress-nudge/package.json +15 -0
- package/src/prompts/__tests__/system-prompt.test.ts +100 -1
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +5 -7
- package/src/prompts/normalize-onboarding.ts +2 -0
- package/src/prompts/persona-resolver.ts +3 -0
- package/src/prompts/system-prompt.ts +51 -2
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +3 -1
- package/src/prompts/templates/system-sections.ts +8 -3
- package/src/providers/call-site-routing.ts +6 -3
- package/src/providers/fireworks/client.ts +3 -0
- package/src/providers/inference/auth.ts +52 -46
- package/src/providers/model-intents.ts +2 -2
- package/src/providers/openai/__tests__/coerce-object-args.test.ts +105 -0
- package/src/providers/openai/chat-completions-provider.ts +47 -9
- package/src/providers/openai/coerce-object-args.ts +104 -0
- package/src/providers/retry.ts +8 -5
- package/src/providers/types.ts +10 -0
- package/src/runtime/__tests__/agent-wake.test.ts +629 -7
- package/src/runtime/access-request-helper.ts +16 -9
- package/src/runtime/agent-wake.ts +302 -51
- package/src/runtime/assistant-stream-state.ts +141 -8
- package/src/runtime/background-job-runner.ts +9 -0
- package/src/runtime/channel-approval-types.ts +1 -0
- package/src/runtime/channel-invite-transports/telegram.ts +6 -5
- package/src/runtime/channel-invite-transports/voice.ts +2 -2
- package/src/runtime/channel-invite-types.ts +4 -2
- package/src/runtime/channel-retry-sweep.ts +19 -41
- package/src/runtime/finalize-event-delivery.ts +72 -0
- package/src/runtime/guardian-action-message-composer.ts +0 -54
- package/src/runtime/http-server.ts +6 -14
- package/src/runtime/http-types.ts +0 -1
- package/src/runtime/message-composer-types.ts +0 -9
- package/src/runtime/middleware/__tests__/rate-limiter.test.ts +63 -0
- package/src/runtime/middleware/auth.ts +27 -3
- package/src/runtime/middleware/rate-limiter.ts +28 -1
- package/src/runtime/migrations/vbundle-builder.ts +6 -5
- package/src/runtime/pending-interactions.ts +20 -1
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +232 -173
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +18 -0
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +436 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +11 -0
- package/src/runtime/routes/approval-routes.ts +35 -8
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +2 -1
- package/src/runtime/routes/btw-routes.ts +37 -1
- package/src/runtime/routes/channel-delivery-routes.ts +11 -7
- package/src/runtime/routes/channel-route-definitions.ts +3 -0
- package/src/runtime/routes/channel-route-shared.ts +3 -1
- package/src/runtime/routes/consolidation-routes.ts +17 -13
- package/src/runtime/routes/conversation-compaction-routes.ts +159 -119
- package/src/runtime/routes/conversation-list-routes.ts +41 -4
- package/src/runtime/routes/conversation-query-routes.ts +196 -11
- package/src/runtime/routes/conversation-routes.ts +15 -1
- package/src/runtime/routes/credential-prompt-routes.ts +39 -17
- package/src/runtime/routes/empty-state-greeting-cache.ts +65 -0
- package/src/runtime/routes/heartbeat-routes.ts +18 -13
- package/src/runtime/routes/image-generation-routes.ts +20 -2
- package/src/runtime/routes/inbound-message-handler.ts +13 -12
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +32 -31
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +7 -5
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +7 -21
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +5 -5
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +6 -15
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +1 -1
- package/src/runtime/routes/index.ts +6 -0
- package/src/runtime/routes/log-export/AGENTS.md +1 -1
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/migration-routes.ts +5 -9
- package/src/runtime/routes/plugins-routes.ts +26 -0
- package/src/runtime/routes/ps-routes.ts +10 -8
- package/src/runtime/routes/retrospective-routes.ts +235 -0
- package/src/runtime/routes/runs-pagination.ts +75 -0
- package/src/runtime/routes/schedule-routes.ts +367 -59
- package/src/runtime/routes/sounds-config-routes.ts +239 -0
- package/src/runtime/routes/surface-action-routes.ts +84 -4
- package/src/runtime/routes/workflow-routes.test.ts +372 -0
- package/src/runtime/routes/workflow-routes.ts +363 -0
- package/src/runtime/routes/workspace-routes.test.ts +61 -1
- package/src/runtime/routes/workspace-routes.ts +26 -1
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +38 -0
- package/src/runtime/services/analyze-conversation.ts +26 -13
- package/src/schedule/inference-profile.ts +28 -0
- package/src/schedule/schedule-store.ts +152 -4
- package/src/schedule/scheduler-types.ts +6 -0
- package/src/schedule/scheduler.ts +96 -0
- package/src/security/secret-allowlist.ts +1 -1
- package/src/skills/path-classifier.ts +1 -1
- package/src/tools/apps/executors.ts +23 -0
- package/src/tools/apps/resolve-app-id.ts +42 -0
- package/src/tools/browser/browser-execution.ts +9 -11
- package/src/tools/credentials/broker.ts +4 -4
- package/src/tools/credentials/vault.ts +26 -137
- package/src/tools/executor.ts +69 -0
- package/src/tools/flag-gated-tools.test.ts +76 -0
- package/src/tools/permission-checker.ts +8 -1
- package/src/tools/registry.ts +51 -0
- package/src/tools/schedule/create.ts +77 -1
- package/src/tools/schedule/list.ts +1 -0
- package/src/tools/schedule/update.ts +73 -1
- package/src/tools/skills/execute.ts +56 -0
- package/src/tools/terminal/shell.ts +1 -1
- package/src/tools/ui-surface/definitions.ts +91 -2
- package/src/tools/workflows/manage-workflows.ts +183 -0
- package/src/tools/workflows/run-workflow.test.ts +442 -0
- package/src/tools/workflows/run-workflow.ts +88 -0
- package/src/types/onboarding-context.ts +2 -0
- package/src/usage/attribution.ts +24 -0
- package/src/util/canonicalize-identity.ts +12 -3
- package/src/util/platform.ts +17 -17
- package/src/watcher/__tests__/engine.test.ts +24 -0
- package/src/watcher/__tests__/telemetry.test.ts +135 -0
- package/src/watcher/engine.ts +7 -0
- package/src/watcher/telemetry.ts +74 -0
- package/src/workflows/capabilities.test.ts +365 -0
- package/src/workflows/capabilities.ts +359 -0
- package/src/workflows/deterministic-stringify.ts +27 -0
- package/src/workflows/engine-integration.test.ts +656 -0
- package/src/workflows/engine.test.ts +1144 -0
- package/src/workflows/engine.ts +1078 -0
- package/src/workflows/fanout-load.test.ts +168 -0
- package/src/workflows/journal-store.test.ts +369 -0
- package/src/workflows/journal-store.ts +470 -0
- package/src/workflows/leaf-runner.test.ts +704 -0
- package/src/workflows/leaf-runner.ts +589 -0
- package/src/workflows/library.test.ts +134 -0
- package/src/workflows/library.ts +124 -0
- package/src/workflows/run-manager.test.ts +711 -0
- package/src/workflows/run-manager.ts +593 -0
- package/src/workflows/sandbox-escape.test.ts +339 -0
- package/src/workflows/sandbox.test.ts +251 -0
- package/src/workflows/sandbox.ts +447 -0
- package/src/workspace/adaptive-thinking-repair.ts +33 -11
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +1 -1
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +1 -1
- package/src/workspace/migrations/026-backfill-install-meta.ts +1 -1
- package/src/workspace/migrations/030-seed-pkb-autoinject.ts +2 -1
- package/src/workspace/migrations/031-drop-user-md.ts +1 -4
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +1 -1
- package/src/workspace/migrations/056-release-notes-inference-profile-reordering.ts +5 -2
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +1 -1
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +8 -2
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +41 -14
- package/src/workspace/migrations/102-preserve-heartbeat-enabled-for-existing-workspaces.ts +69 -0
- package/src/workspace/migrations/103-upgrade-quality-profile-to-opus-4-8.ts +83 -0
- package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +133 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/workspace/migrations/runner.ts +1 -1
- package/tsconfig.json +1 -1
- package/src/__tests__/guardian-action-copy-generator.test.ts +0 -200
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -579
- package/src/__tests__/guardian-action-store.test.ts +0 -106
- package/src/daemon/guardian-action-generators.ts +0 -71
- package/src/memory/guardian-action-store.ts +0 -484
- package/src/runtime/guardian-action-grant-minter.ts +0 -150
|
@@ -55,7 +55,7 @@ The `claude-agent-acp` adapter requires a Claude OAuth token. Store it once in t
|
|
|
55
55
|
assistant credentials set --service acp --field claude_oauth_token <token>
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
When the token is missing, do NOT ask the user to paste it into chat. Collect it via the
|
|
58
|
+
When the token is missing, do NOT ask the user to paste it into chat. Collect it via the secure prompt instead: `assistant credentials prompt --service acp --field claude_oauth_token --label "Claude OAuth Token"`. That prompts the user through a secure UI so the token never enters the conversation or the workspace config. Users generate the token by running `claude setup-token` on a machine where they are logged in to Claude.
|
|
59
59
|
|
|
60
60
|
## Codex setup
|
|
61
61
|
|
|
@@ -78,7 +78,7 @@ Gemini CLI speaks ACP natively (`gemini --acp`) - there is no separate adapter b
|
|
|
78
78
|
assistant credentials set --service acp --field gemini_api_key <key>
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
Or collect the key via the
|
|
81
|
+
Or collect the key via the secure prompt: `assistant credentials prompt --service acp --field gemini_api_key --label "Gemini API Key"`. Either way the key never appears in chat or workspace config, and every spawn injects it as `GEMINI_API_KEY` automatically. The key is optional - a spawn proceeds without it when the vault has no entry.
|
|
82
82
|
|
|
83
83
|
The alternative is browser OAuth: run `gemini` once interactively and complete the sign-in flow. This is impractical on hosted assistants (no browser), so prefer the credential store there.
|
|
84
84
|
|
|
@@ -196,7 +196,7 @@ render(<App />, document.getElementById("app")!);
|
|
|
196
196
|
2. **`file_write`** each real file, one per tool call, overwriting the placeholders and adding components.
|
|
197
197
|
3. **`app_refresh`** ONCE at the end to compile.
|
|
198
198
|
|
|
199
|
-
**Allowed packages** (esbuild-resolved, no CDN): `date-fns`, `chart.js`, `lodash-es`, `zod`, `clsx
|
|
199
|
+
**Allowed packages** (esbuild-resolved, no CDN): `date-fns`, `chart.js`, `lodash-es`, `zod`, `clsx`. For icons, write inline `<svg>` markup directly — no icon package is bundled.
|
|
200
200
|
|
|
201
201
|
**Constraints:** Preact not React. No CDN imports. No external fonts/images (system fonts, inline CSS/SVG). Responsive only, no fixed-pixel widths. The WebView blocks navigation — `href` and form `action` don't work.
|
|
202
202
|
|
|
@@ -15,5 +15,10 @@ export async function run(
|
|
|
15
15
|
setAppCommitMessage(context.conversationId, input.change_summary.trim());
|
|
16
16
|
}
|
|
17
17
|
const createInput: AppCreateInput = input as unknown as AppCreateInput;
|
|
18
|
-
return executeAppCreate(
|
|
18
|
+
return executeAppCreate(
|
|
19
|
+
createInput,
|
|
20
|
+
appStore,
|
|
21
|
+
context.proxyToolResolver,
|
|
22
|
+
context.conversationId,
|
|
23
|
+
);
|
|
19
24
|
}
|
|
@@ -2,6 +2,10 @@ import { setAppCommitMessage } from "../../../../memory/app-git-service.js";
|
|
|
2
2
|
import * as appStore from "../../../../memory/app-store.js";
|
|
3
3
|
import type { AppGenerateIconInput } from "../../../../tools/apps/executors.js";
|
|
4
4
|
import { executeAppGenerateIcon } from "../../../../tools/apps/executors.js";
|
|
5
|
+
import {
|
|
6
|
+
missingAppIdError,
|
|
7
|
+
resolveAppId,
|
|
8
|
+
} from "../../../../tools/apps/resolve-app-id.js";
|
|
5
9
|
import type {
|
|
6
10
|
ToolContext,
|
|
7
11
|
ToolExecutionResult,
|
|
@@ -14,8 +18,10 @@ export async function run(
|
|
|
14
18
|
if (typeof input.change_summary === "string" && input.change_summary.trim()) {
|
|
15
19
|
setAppCommitMessage(context.conversationId, input.change_summary.trim());
|
|
16
20
|
}
|
|
21
|
+
const appId = resolveAppId(input, context.conversationId);
|
|
22
|
+
if (!appId) return missingAppIdError();
|
|
17
23
|
return executeAppGenerateIcon(
|
|
18
|
-
input as unknown as AppGenerateIconInput,
|
|
24
|
+
{ ...input, app_id: appId } as unknown as AppGenerateIconInput,
|
|
19
25
|
appStore,
|
|
20
26
|
);
|
|
21
27
|
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { setAppCommitMessage } from "../../../../memory/app-git-service.js";
|
|
2
2
|
import * as appStore from "../../../../memory/app-store.js";
|
|
3
3
|
import { executeAppRefresh } from "../../../../tools/apps/executors.js";
|
|
4
|
+
import {
|
|
5
|
+
missingAppIdError,
|
|
6
|
+
resolveAppId,
|
|
7
|
+
} from "../../../../tools/apps/resolve-app-id.js";
|
|
4
8
|
import type {
|
|
5
9
|
ToolContext,
|
|
6
10
|
ToolExecutionResult,
|
|
@@ -13,5 +17,7 @@ export async function run(
|
|
|
13
17
|
if (typeof input.change_summary === "string" && input.change_summary.trim()) {
|
|
14
18
|
setAppCommitMessage(context.conversationId, input.change_summary.trim());
|
|
15
19
|
}
|
|
16
|
-
|
|
20
|
+
const appId = resolveAppId(input, context.conversationId);
|
|
21
|
+
if (!appId) return missingAppIdError();
|
|
22
|
+
return executeAppRefresh({ app_id: appId }, appStore);
|
|
17
23
|
}
|
|
@@ -2,6 +2,10 @@ import { setAppCommitMessage } from "../../../../memory/app-git-service.js";
|
|
|
2
2
|
import * as appStore from "../../../../memory/app-store.js";
|
|
3
3
|
import type { AppUpdateInput } from "../../../../tools/apps/executors.js";
|
|
4
4
|
import { executeAppUpdate } from "../../../../tools/apps/executors.js";
|
|
5
|
+
import {
|
|
6
|
+
missingAppIdError,
|
|
7
|
+
resolveAppId,
|
|
8
|
+
} from "../../../../tools/apps/resolve-app-id.js";
|
|
5
9
|
import type {
|
|
6
10
|
ToolContext,
|
|
7
11
|
ToolExecutionResult,
|
|
@@ -14,5 +18,10 @@ export async function run(
|
|
|
14
18
|
if (typeof input.change_summary === "string" && input.change_summary.trim()) {
|
|
15
19
|
setAppCommitMessage(context.conversationId, input.change_summary.trim());
|
|
16
20
|
}
|
|
17
|
-
|
|
21
|
+
const appId = resolveAppId(input, context.conversationId);
|
|
22
|
+
if (!appId) return missingAppIdError();
|
|
23
|
+
return executeAppUpdate(
|
|
24
|
+
{ ...input, app_id: appId } as unknown as AppUpdateInput,
|
|
25
|
+
appStore,
|
|
26
|
+
);
|
|
18
27
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: image-studio
|
|
3
|
-
description:
|
|
3
|
+
description: Create images from a text description, or edit photos and graphics the user provides (remove backgrounds or watermarks, retouch, restyle, in-paint). Can produce multiple variants when the user wants options to choose from.
|
|
4
4
|
compatibility: "Designed for Vellum personal assistants"
|
|
5
5
|
metadata:
|
|
6
6
|
emoji: "🎨"
|
|
@@ -9,36 +9,83 @@ metadata:
|
|
|
9
9
|
category: "content"
|
|
10
10
|
activation-hints:
|
|
11
11
|
- "User asks to generate, draw, or create an image from a text prompt"
|
|
12
|
-
- "User wants to edit an existing image
|
|
12
|
+
- "User wants to edit an existing image: background removal, watermark removal, in-painting, style change, retouching"
|
|
13
13
|
- "User wants multiple variations of a visual (logo concepts, mood boards, illustration options)"
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
## Usage
|
|
19
|
-
|
|
20
|
-
- **Text-to-image**: "Generate an image of a sunset over the ocean"
|
|
21
|
-
- **Image editing**: "Remove the background from this image" (requires providing source image file paths)
|
|
22
|
-
- **Multiple variants**: "Generate 3 variations of a logo for a coffee shop"
|
|
16
|
+
Use the `media_generate_image` tool via `skill_execute` to create or edit images.
|
|
23
17
|
|
|
24
18
|
## Modes
|
|
25
19
|
|
|
26
20
|
- **generate** (default): Create a new image from a text prompt.
|
|
27
|
-
- **edit**: Modify an existing image
|
|
21
|
+
- **edit**: Modify an existing image. Requires one or more source images via `source_paths`.
|
|
28
22
|
|
|
29
23
|
## Models
|
|
30
24
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
Do not pass the `model` parameter unless you need a specific tier. Omitting it uses the configured default, which is correct for most requests.
|
|
26
|
+
|
|
27
|
+
When you do need to choose, use an alias, not a concrete model ID. Aliases always resolve to the current model for that tier:
|
|
28
|
+
|
|
29
|
+
- `fast`: quickest, good quality (default tier)
|
|
30
|
+
- `quality`: higher fidelity, slower
|
|
31
|
+
- `openai`: OpenAI's model; most permissive on photo edits
|
|
32
|
+
|
|
33
|
+
Pass a concrete model ID only if the user names one explicitly. If the tool rejects an unknown model ID, the error lists the currently available models and aliases.
|
|
34
|
+
|
|
35
|
+
## Example calls
|
|
36
|
+
|
|
37
|
+
Generate (no model parameter, default is correct):
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{ "tool": "media_generate_image", "input": { "prompt": "A sunset over the ocean, golden hour, soft haze, 35mm photo style", "variants": 2 } }
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Edit:
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{ "tool": "media_generate_image", "input": { "prompt": "Remove the watermark text from the background. Keep the subject, framing, lighting, and colors exactly identical. Change nothing else.", "mode": "edit", "source_paths": ["conversations/<conv-id>/attachments/photo.jpeg"], "model": "openai" } }
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`source_paths` is a flat array of file path strings. Do NOT pass objects:
|
|
50
|
+
|
|
51
|
+
- Wrong: `"source_paths": [{ "path": "img.jpeg" }]` → schema validation error
|
|
52
|
+
- Right: `"source_paths": ["img.jpeg"]`
|
|
34
53
|
|
|
35
|
-
##
|
|
54
|
+
## Source images for edit mode
|
|
36
55
|
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
|
|
56
|
+
- Paths resolve inside the workspace. Conversation attachments live under `conversations/<conversation-id>/attachments/`; prefer that path for images the user attached.
|
|
57
|
+
- Host paths (e.g. `~/Desktop/photo.jpg`) only work if the file arrived as an attachment; the tool falls back to the stored workspace copy. If the user references a host file that was never attached, pull it into the workspace first, then pass the workspace path.
|
|
58
|
+
|
|
59
|
+
## Prompting
|
|
60
|
+
|
|
61
|
+
- Generate: describe style, composition, lighting, and mood, not just the subject.
|
|
62
|
+
- Edit: name the change AND what must stay the same. Models re-render the whole image, so without preservation language ("keep subject, framing, and lighting identical; only change X") they drift on crop and color.
|
|
63
|
+
- Aspect ratio and size have no parameter today. State them in the prompt ("16:9 widescreen banner") and verify the output.
|
|
64
|
+
- Use `variants` (1 to 4) when the user wants options. In **edit mode always use `variants: 1`**: edits run 60-90 seconds per variant, and two variants can exceed the tool execution timeout (`timeouts.toolExecutionTimeoutSec`, default 120s). If the user wants multiple edit options, make separate sequential calls.
|
|
65
|
+
|
|
66
|
+
## Timing
|
|
67
|
+
|
|
68
|
+
Edits on large photos are slow (1 to 2 minutes). If the tool reports a timeout ("timed out after Ns"), the result is lost; do not wait for it to appear. Retry with `variants: 1`, or if it already was 1, fall back to the CLI which writes files to disk: `assistant image-generation generate --prompt "..." --mode edit --source <path> --model openai --output-dir <dir>`.
|
|
69
|
+
|
|
70
|
+
## Output handling
|
|
71
|
+
|
|
72
|
+
Images return as inline content blocks in the tool result; they are not written to disk automatically.
|
|
73
|
+
|
|
74
|
+
- If the user just wants to see the image, the inline result is enough.
|
|
75
|
+
- If the user wants a file or you need to iterate on the result, save it to disk and deliver it through the conversation's attachment mechanism.
|
|
41
76
|
|
|
42
77
|
## Error handling
|
|
43
78
|
|
|
44
|
-
|
|
79
|
+
Two kinds of failure. Treat them differently:
|
|
80
|
+
|
|
81
|
+
1. **Configuration errors** (missing API key, provider not set up): report the error to the user as-is. Do NOT change service configuration (managed vs your-own mode, default provider, or default model in Settings). Configuration changes happen only at the user's explicit request.
|
|
82
|
+
2. **Generation failures** (any other error: "invalid", content policy, safety rejection, provider error). Do not diagnose the cause; switch providers. The error message names the model that failed:
|
|
83
|
+
- If the error names a `gemini-*` model (or no model) → retry ONCE with `model: "openai"`.
|
|
84
|
+
- If the error names `gpt-image-2` or another `gpt-*` model → retry ONCE with `model: "quality"`.
|
|
85
|
+
- If the retry also fails → stop and report both errors to the user.
|
|
86
|
+
|
|
87
|
+
Do NOT rephrase the prompt and retry on the same model, even if the error suggests checking the prompt. One provider switch, then stop.
|
|
88
|
+
|
|
89
|
+
## Complete when
|
|
90
|
+
|
|
91
|
+
The tool has returned at least one image and the user can see it: either the inline result in chat or an attached saved file. An error report counts as complete only after the retry path in Error handling has been exhausted.
|
|
@@ -27,12 +27,7 @@
|
|
|
27
27
|
},
|
|
28
28
|
"model": {
|
|
29
29
|
"type": "string",
|
|
30
|
-
"
|
|
31
|
-
"gemini-3.1-flash-image-preview",
|
|
32
|
-
"gemini-3-pro-image-preview",
|
|
33
|
-
"gpt-image-2"
|
|
34
|
-
],
|
|
35
|
-
"description": "Which model to use for generation. If omitted, uses the user's configured preference."
|
|
30
|
+
"description": "Model tier alias (fast | quality | openai) or a concrete model ID. If omitted, uses the user's configured preference. Unknown values return an error listing currently available models."
|
|
36
31
|
},
|
|
37
32
|
"variants": {
|
|
38
33
|
"type": "number",
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { getConfig } from "../../../../config/loader.js";
|
|
2
2
|
import { resolveImageGenCredentials } from "../../../../media/image-credentials.js";
|
|
3
|
+
import {
|
|
4
|
+
describeImageModels,
|
|
5
|
+
resolveImageModel,
|
|
6
|
+
} from "../../../../media/image-models.js";
|
|
3
7
|
import {
|
|
4
8
|
generateImage,
|
|
5
9
|
mapImageGenError,
|
|
@@ -19,7 +23,20 @@ export async function run(
|
|
|
19
23
|
): Promise<ToolExecutionResult> {
|
|
20
24
|
const config = getConfig();
|
|
21
25
|
const svc = config.services["image-generation"];
|
|
22
|
-
|
|
26
|
+
let modelOverride = input.model;
|
|
27
|
+
// Resolve tier aliases (fast, quality, openai) to concrete model IDs via
|
|
28
|
+
// the registry. Unknown values get an error listing the current catalog so
|
|
29
|
+
// callers can self-correct without a stale schema enum.
|
|
30
|
+
if (typeof modelOverride === "string" && modelOverride) {
|
|
31
|
+
const entry = resolveImageModel(modelOverride);
|
|
32
|
+
if (!entry) {
|
|
33
|
+
return {
|
|
34
|
+
content: `Unknown model "${modelOverride}". Available models and aliases:\n${describeImageModels()}\n\nRetry with one of the aliases above, or omit the model parameter to use the configured default.`,
|
|
35
|
+
isError: true,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
modelOverride = entry.id;
|
|
39
|
+
}
|
|
23
40
|
// Derive provider from the explicit model when supplied so that requesting
|
|
24
41
|
// e.g. `gpt-image-2` while config.provider === "gemini" routes to OpenAI
|
|
25
42
|
// instead of silently falling back to the Gemini default model.
|
|
@@ -30,7 +47,7 @@ export async function run(
|
|
|
30
47
|
});
|
|
31
48
|
if (!credentials) {
|
|
32
49
|
return {
|
|
33
|
-
content: `${errorHint ?? "Image generation is not configured."}\n\nReport this error to the user. Do not change service configuration (mode
|
|
50
|
+
content: `${errorHint ?? "Image generation is not configured."}\n\nReport this error to the user as-is. Do not change service configuration (managed/your-own mode or default provider/model settings) to try to fix it.`,
|
|
34
51
|
isError: true,
|
|
35
52
|
};
|
|
36
53
|
}
|
|
@@ -130,8 +147,10 @@ export async function run(
|
|
|
130
147
|
contentBlocks,
|
|
131
148
|
};
|
|
132
149
|
} catch (error) {
|
|
150
|
+
// Echo the model that failed so callers (including the skill's retry
|
|
151
|
+
// branch) can key off the error text instead of remembering their input.
|
|
133
152
|
return {
|
|
134
|
-
content: `${mapImageGenError(provider, error)}\n\
|
|
153
|
+
content: `${mapImageGenError(provider, error)}\n\nFailed model: ${model}\n\nDo not change service configuration (managed/your-own mode or default provider/model settings) to try to fix it. Retrying this call once with a different model parameter is allowed; follow the skill's error handling instructions.`,
|
|
135
154
|
isError: true,
|
|
136
155
|
};
|
|
137
156
|
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: personal-page
|
|
3
|
+
description: Build or update the user's personal page — a cinematic landing page about THE USER themselves (their bio, work, life areas). Use whenever the user asks for a personal page, a page about them, or to update what's on their page. NOT for general landing pages or other apps (that's app-builder). The page already exists in the workspace; this skill is how to fill it.
|
|
4
|
+
metadata:
|
|
5
|
+
emoji: "✨"
|
|
6
|
+
vellum:
|
|
7
|
+
display-name: "Personal Page"
|
|
8
|
+
category: "content"
|
|
9
|
+
activation-hints:
|
|
10
|
+
- "User asks for a personal page, profile page, or landing page about themselves"
|
|
11
|
+
- "User asks to change, refresh, or add something to their personal page"
|
|
12
|
+
- "Onboarding asks you to turn research about the user into a page"
|
|
13
|
+
avoid-when:
|
|
14
|
+
- "User wants a landing page for a product, company, or someone else — use app-builder"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
You fill in the user's personal page — a finished, cinematic dark landing page
|
|
18
|
+
that already lives in the workspace as the app `personal-page`. Your job is
|
|
19
|
+
**content, not construction**: the design is done.
|
|
20
|
+
|
|
21
|
+
If `/workspace/data/apps/personal-page/` does not exist, this skill does not
|
|
22
|
+
apply (the preseeded page is rolled out gradually) — build whatever the user
|
|
23
|
+
asked for with app-builder instead.
|
|
24
|
+
|
|
25
|
+
**Present it as yours.** To the user this is "the page you filled in for
|
|
26
|
+
them" — fine to acknowledge the page shell exists, but never narrate the
|
|
27
|
+
mechanics below (file paths, refresh calls, contracts) or your progress in
|
|
28
|
+
chat. Do the work, then one short line.
|
|
29
|
+
|
|
30
|
+
## How to populate it
|
|
31
|
+
|
|
32
|
+
1. Read `/workspace/data/apps/personal-page/src/profile-data.ts`. The contract
|
|
33
|
+
comment at the top explains every field and shows a worked example.
|
|
34
|
+
2. Overwrite the `profile` export with what you know or learned about the
|
|
35
|
+
user. Set `status: "ready"`. Touch ONLY this file — never the layout,
|
|
36
|
+
styles, animations, or media. Do NOT use `app_create`; the app exists.
|
|
37
|
+
3. Call `app_refresh` (app_id: `personal-page`). If it reports compile errors,
|
|
38
|
+
fix your profile-data.ts edit and refresh again. **`app_refresh` is the
|
|
39
|
+
only build step — never compile manually (no esbuild, bundlers, or build
|
|
40
|
+
commands in the terminal); the platform's compiler has the correct JSX
|
|
41
|
+
setup and a manual build will produce a broken page.**
|
|
42
|
+
4. As soon as the refresh is clean, call `app_open` (app_id: `personal-page`)
|
|
43
|
+
so the finished page is up and waiting — don't wait to be asked.
|
|
44
|
+
|
|
45
|
+
## Writing the content
|
|
46
|
+
|
|
47
|
+
- Facts beat adjectives: names, numbers, places. One fact per bullet.
|
|
48
|
+
- Only what you actually verified; write around gaps rather than inventing.
|
|
49
|
+
- Third person, warm but grounded. The page should feel like a profile in a
|
|
50
|
+
design magazine, not a résumé.
|
|
51
|
+
|
|
52
|
+
## Later edits
|
|
53
|
+
|
|
54
|
+
- Content tweaks ("add my marathon PR", "fix my title") → same flow: edit
|
|
55
|
+
`profile-data.ts`, `app_refresh`.
|
|
56
|
+
- Only if the user explicitly asks to change the **design or layout** may you
|
|
57
|
+
edit the other source files, following app-builder conventions.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"tools": [
|
|
4
|
+
{
|
|
5
|
+
"name": "app_refresh",
|
|
6
|
+
"description": "Trigger recompilation and surface refresh for an app after making file changes. Call this once after you finish editing app files with generic file tools.",
|
|
7
|
+
"category": "apps",
|
|
8
|
+
"risk": "low",
|
|
9
|
+
"input_schema": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"properties": {
|
|
12
|
+
"app_id": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"description": "The ID of the app to refresh"
|
|
15
|
+
},
|
|
16
|
+
"change_summary": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"description": "Short summary of what changed, using git conventional commit format (e.g. 'feat: add dark mode toggle', 'fix: form validation'). Used as the version history entry."
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"required": ["app_id"]
|
|
22
|
+
},
|
|
23
|
+
"executor": "tools/app-refresh.ts",
|
|
24
|
+
"execution_target": "host"
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { setAppCommitMessage } from "../../../../memory/app-git-service.js";
|
|
2
|
+
import * as appStore from "../../../../memory/app-store.js";
|
|
3
|
+
import { executeAppRefresh } from "../../../../tools/apps/executors.js";
|
|
4
|
+
import type {
|
|
5
|
+
ToolContext,
|
|
6
|
+
ToolExecutionResult,
|
|
7
|
+
} from "../../../../tools/types.js";
|
|
8
|
+
|
|
9
|
+
export async function run(
|
|
10
|
+
input: Record<string, unknown>,
|
|
11
|
+
context: ToolContext,
|
|
12
|
+
): Promise<ToolExecutionResult> {
|
|
13
|
+
if (typeof input.change_summary === "string" && input.change_summary.trim()) {
|
|
14
|
+
setAppCommitMessage(context.conversationId, input.change_summary.trim());
|
|
15
|
+
}
|
|
16
|
+
return executeAppRefresh({ app_id: input.app_id as string }, appStore);
|
|
17
|
+
}
|
|
@@ -17,7 +17,7 @@ metadata:
|
|
|
17
17
|
- "User wants to act immediately or run a quick command that completes within the conversation — schedule is only for deferred or recurring execution"
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
Manage scheduled automations. Schedules can be **recurring** (cron or RRULE expression) or **one-shot** (a single `fire_at` timestamp). Schedules support
|
|
20
|
+
Manage scheduled automations. Schedules can be **recurring** (cron or RRULE expression) or **one-shot** (a single `fire_at` timestamp). Schedules support four modes: **execute** (run a message through the assistant), **notify** (send a notification to the user), **script** (run a shell command directly without LLM involvement), and **workflow** (run a saved multi-agent workflow by name).
|
|
21
21
|
|
|
22
22
|
## Schedule Syntax
|
|
23
23
|
|
|
@@ -96,8 +96,13 @@ The `mode` parameter controls what happens when a schedule fires:
|
|
|
96
96
|
- **execute** (default) - sends the schedule's message to a background assistant conversation for autonomous handling. The assistant processes the message as if the user sent it.
|
|
97
97
|
- **notify** - sends a notification to the user via the notification pipeline. No assistant processing occurs.
|
|
98
98
|
- **script** - runs the `script` field as a shell command directly. No LLM invoked, no conversation created. stdout/stderr are captured in the schedule run record. Exit code 0 = success, non-zero = error. Commands run in the workspace directory with a 60-second timeout by default. Override the timeout per schedule with `timeout_ms` (range 1000–1800000 ms) when a script needs more or less time; pass `timeout_ms: null` on update to revert to the default. The guardian can also adjust this from the /assistant/settings/schedules page.
|
|
99
|
+
- **workflow** - runs a saved workflow (by `workflow_name`) at trigger time, optionally with `workflow_args`. Requires the `workflows` feature flag; `workflow_name` is required. Use this to run a previously saved multi-agent workflow on a schedule (e.g. "run my inbox-triage workflow every morning at 8am"). Optionally pass `capabilities` (the run's single consent point) to grant the scheduled run's leaves side-effecting tools or host functions beyond the read-only baseline; declaring any prompts the guardian for approval once at creation.
|
|
99
100
|
|
|
100
|
-
Use `notify` for simple reminders ("remind me to take medicine at 9am"), `execute` for tasks that need assistant action ("check my calendar at 8am and send me a digest"),
|
|
101
|
+
Use `notify` for simple reminders ("remind me to take medicine at 9am"), `execute` for tasks that need assistant action ("check my calendar at 8am and send me a digest"), `script` for lightweight shell automations that don't need LLM involvement ("refresh a cache", "poll an API", "rotate logs"), and `workflow` to run a saved workflow on a schedule.
|
|
102
|
+
|
|
103
|
+
## Inference Profile
|
|
104
|
+
|
|
105
|
+
Execute-mode runs use the default `mainAgent` model selection unless the schedule pins an `inference_profile` (a key from `llm.profiles`). Pin a profile when a recurring task should run on a specific model — e.g. a cost-optimized profile for a high-frequency digest. Pass `inference_profile: null` on update to revert to the default. The pinned profile is shown on the schedule's details page in settings.
|
|
101
106
|
|
|
102
107
|
## Conversation Reuse
|
|
103
108
|
|
|
@@ -48,8 +48,36 @@
|
|
|
48
48
|
},
|
|
49
49
|
"mode": {
|
|
50
50
|
"type": "string",
|
|
51
|
-
"enum": ["notify", "execute", "script"],
|
|
52
|
-
"description": "Whether to notify the user, execute autonomously via LLM,
|
|
51
|
+
"enum": ["notify", "execute", "script", "workflow"],
|
|
52
|
+
"description": "Whether to notify the user, execute autonomously via LLM, run a shell command directly (script), or run a saved workflow (workflow). Defaults to \"execute\"."
|
|
53
|
+
},
|
|
54
|
+
"workflow_name": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"description": "Name of a saved workflow to run when the schedule triggers. Required for workflow mode."
|
|
57
|
+
},
|
|
58
|
+
"workflow_args": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"description": "Arguments object passed to the saved workflow as `args`. Optional; only used in workflow mode."
|
|
61
|
+
},
|
|
62
|
+
"capabilities": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"description": "Workflow mode only. Per-run capability grant (the single consent point) persisted with the schedule and applied to each triggered run. Leaves get a read-only baseline by default. Declaring any side-effecting tool or host function requires a fresh approval at creation.",
|
|
65
|
+
"properties": {
|
|
66
|
+
"tools": {
|
|
67
|
+
"type": "array",
|
|
68
|
+
"items": { "type": "string" },
|
|
69
|
+
"description": "Side-effecting tool names granted to leaves on top of the read-only baseline."
|
|
70
|
+
},
|
|
71
|
+
"hostFunctions": {
|
|
72
|
+
"type": "array",
|
|
73
|
+
"items": { "type": "string" },
|
|
74
|
+
"description": "Host-function names the run may invoke."
|
|
75
|
+
},
|
|
76
|
+
"persona": {
|
|
77
|
+
"type": "boolean",
|
|
78
|
+
"description": "Grant leaves access to persona (identity + memory) context."
|
|
79
|
+
}
|
|
80
|
+
}
|
|
53
81
|
},
|
|
54
82
|
"routing_intent": {
|
|
55
83
|
"type": "string",
|
|
@@ -79,6 +107,10 @@
|
|
|
79
107
|
"timeout_ms": {
|
|
80
108
|
"type": "integer",
|
|
81
109
|
"description": "For script mode: maximum time in milliseconds the shell command may run before it is killed. Defaults to 60000 (60s). Allowed range: 1000 to 1800000."
|
|
110
|
+
},
|
|
111
|
+
"inference_profile": {
|
|
112
|
+
"type": "string",
|
|
113
|
+
"description": "Inference profile (a key from llm.profiles) the schedule's LLM-executed runs should use, e.g. to run a heavy task on a cheaper model. When omitted, runs use the default mainAgent model selection. Must name a configured profile."
|
|
82
114
|
}
|
|
83
115
|
},
|
|
84
116
|
"required": ["name", "description"]
|
|
@@ -155,8 +187,16 @@
|
|
|
155
187
|
},
|
|
156
188
|
"mode": {
|
|
157
189
|
"type": "string",
|
|
158
|
-
"enum": ["notify", "execute", "script"],
|
|
159
|
-
"description": "Whether to notify the user, execute autonomously via LLM,
|
|
190
|
+
"enum": ["notify", "execute", "script", "workflow"],
|
|
191
|
+
"description": "Whether to notify the user, execute autonomously via LLM, run a shell command directly (script), or run a saved workflow (workflow)"
|
|
192
|
+
},
|
|
193
|
+
"workflow_name": {
|
|
194
|
+
"type": "string",
|
|
195
|
+
"description": "Name of a saved workflow to run when the schedule triggers. Required when the schedule's resulting mode is workflow."
|
|
196
|
+
},
|
|
197
|
+
"workflow_args": {
|
|
198
|
+
"type": "object",
|
|
199
|
+
"description": "Arguments object passed to the saved workflow as `args`. Only used in workflow mode."
|
|
160
200
|
},
|
|
161
201
|
"routing_intent": {
|
|
162
202
|
"type": "string",
|
|
@@ -186,6 +226,10 @@
|
|
|
186
226
|
"timeout_ms": {
|
|
187
227
|
"type": ["integer", "null"],
|
|
188
228
|
"description": "For script mode: maximum time in milliseconds the shell command may run before it is killed (default 60000, range 1000 to 1800000). Pass null to clear a custom timeout and revert to the default."
|
|
229
|
+
},
|
|
230
|
+
"inference_profile": {
|
|
231
|
+
"type": ["string", "null"],
|
|
232
|
+
"description": "Inference profile (a key from llm.profiles) the schedule's LLM-executed runs should use. Pass null to clear the override and revert to the default mainAgent model selection. Must name a configured profile."
|
|
189
233
|
}
|
|
190
234
|
},
|
|
191
235
|
"required": ["job_id"]
|