@pellux/goodvibes-tui 2.0.14 → 2.0.16
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/.goodvibes/GOODVIBES.md +1 -1
- package/.goodvibes/agents/reviewer.md +8 -8
- package/.goodvibes/skills/add-provider/SKILL.md +22 -22
- package/CHANGELOG.md +49 -0
- package/README.md +64 -44
- package/docs/README.md +6 -6
- package/docs/foundation-artifacts/README.md +5 -5
- package/docs/foundation-artifacts/operator-contract.json +123 -123
- package/package.json +12 -10
- package/scripts/postinstall.js +3 -3
- package/src/audio/activation-sound.ts +7 -7
- package/src/audio/capture.ts +7 -7
- package/src/audio/onnxruntime-assets.d.ts +1 -1
- package/src/audio/player.ts +4 -4
- package/src/audio/spoken-turn-wiring.ts +4 -4
- package/src/audio/voice-capture-wiring.ts +5 -5
- package/src/audio/voice-input-session.ts +3 -3
- package/src/audio/wake-inference.ts +13 -8
- package/src/audio/wake-runtime.ts +10 -10
- package/src/cli/completions/generate.ts +2 -2
- package/src/cli/doctor.ts +13 -13
- package/src/cli/ensure-goodvibes-gitignore.ts +3 -3
- package/src/cli/entrypoint.ts +3 -3
- package/src/cli/help.ts +6 -6
- package/src/cli/hooks-command.ts +4 -4
- package/src/cli/hooks-report.ts +4 -4
- package/src/cli/launch-auto-update.ts +17 -17
- package/src/cli/management-commands.ts +8 -8
- package/src/cli/management-utils.ts +3 -3
- package/src/cli/management.ts +1 -1
- package/src/cli/plugin-bundles-command.ts +10 -10
- package/src/cli/plugin-command.ts +9 -9
- package/src/cli/service-posture.ts +1 -1
- package/src/cli/status.ts +10 -10
- package/src/cli/surface-command.ts +4 -4
- package/src/cli/tui-startup.ts +23 -23
- package/src/config/run-daemon-config-migration.ts +3 -3
- package/src/config/secret-config.ts +10 -10
- package/src/config/surface.ts +1 -1
- package/src/config/tui-extension-settings.ts +8 -8
- package/src/core/active-model-identity.ts +7 -7
- package/src/core/approval-alert.ts +5 -5
- package/src/core/bookmark-navigation.ts +3 -3
- package/src/core/budget-breach-notifier.ts +6 -6
- package/src/core/compaction-receipt.ts +8 -8
- package/src/core/composer-state.ts +2 -2
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-event-navigation.ts +2 -2
- package/src/core/conversation-fold.ts +9 -9
- package/src/core/conversation-line-cache.ts +14 -14
- package/src/core/conversation-render-context.ts +6 -6
- package/src/core/conversation-rendering.ts +27 -30
- package/src/core/conversation-search-expansion.ts +6 -6
- package/src/core/conversation-splash-state.ts +3 -3
- package/src/core/conversation-turn-structure.ts +13 -13
- package/src/core/conversation-types.ts +3 -3
- package/src/core/conversation-user-receipts.ts +5 -5
- package/src/core/conversation.ts +17 -17
- package/src/core/format-user-error.ts +5 -5
- package/src/core/long-task-notifier.ts +9 -9
- package/src/core/memory-diagnostics-gateway.ts +8 -8
- package/src/core/memory-provenance.ts +5 -5
- package/src/core/model-routing-chip.ts +3 -3
- package/src/core/pairing-tailscale-gateway.ts +3 -3
- package/src/core/permission-mode.ts +5 -5
- package/src/core/power-chip-source.ts +3 -3
- package/src/core/power-status.ts +8 -8
- package/src/core/rewind-receipt.ts +6 -6
- package/src/core/session-resume-core.ts +8 -8
- package/src/core/stream-event-wiring.ts +36 -36
- package/src/core/stream-stall-watchdog.ts +4 -4
- package/src/core/system-message-noise.ts +7 -7
- package/src/core/system-message-router.ts +10 -10
- package/src/core/terminal-notifier.ts +5 -5
- package/src/core/turn-budget-outcome.ts +5 -5
- package/src/core/turn-cancellation.ts +3 -3
- package/src/core/turn-event-wiring.ts +16 -16
- package/src/core/voice-capture-status.ts +2 -2
- package/src/core/voice-provision-gateway.ts +12 -12
- package/src/core/voice-provision-status.ts +19 -19
- package/src/core/voice-stt-gateway.ts +6 -6
- package/src/core/wake-provision-runner.ts +7 -7
- package/src/core/wake-provision-status.ts +17 -17
- package/src/core/workstream-notification.ts +8 -8
- package/src/export/gist-uploader.ts +7 -7
- package/src/input/autocomplete.ts +3 -3
- package/src/input/bookmark-modal.ts +1 -1
- package/src/input/command-args-hint.ts +2 -2
- package/src/input/command-reference.ts +9 -9
- package/src/input/command-registry.ts +32 -32
- package/src/input/commands/acp-runtime.ts +6 -6
- package/src/input/commands/calendar-runtime.ts +9 -9
- package/src/input/commands/channel-pairing.ts +11 -11
- package/src/input/commands/channel-runtime.ts +1 -1
- package/src/input/commands/checkin-runtime.ts +4 -4
- package/src/input/commands/checkpoint-runtime.ts +4 -4
- package/src/input/commands/ci-runtime.ts +4 -4
- package/src/input/commands/cluster-runtime.ts +3 -3
- package/src/input/commands/codebase-runtime.ts +16 -16
- package/src/input/commands/config.ts +6 -6
- package/src/input/commands/connection-status.ts +12 -12
- package/src/input/commands/context-window.ts +2 -2
- package/src/input/commands/cost-attribution-format.ts +4 -4
- package/src/input/commands/cost-runtime.ts +2 -2
- package/src/input/commands/devices-runtime.ts +7 -7
- package/src/input/commands/diff-runtime.ts +2 -2
- package/src/input/commands/editor-runtime.ts +1 -1
- package/src/input/commands/eval.ts +4 -4
- package/src/input/commands/experience-runtime.ts +1 -1
- package/src/input/commands/git-runtime.ts +3 -3
- package/src/input/commands/graph-runtime.ts +3 -3
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-metrics-format.ts +2 -2
- package/src/input/commands/health-runtime.ts +8 -8
- package/src/input/commands/hosted-runtime.ts +13 -13
- package/src/input/commands/image-runtime.ts +6 -6
- package/src/input/commands/intelligence-runtime.ts +2 -2
- package/src/input/commands/local-auth-runtime.ts +3 -3
- package/src/input/commands/local-provider-runtime.ts +3 -3
- package/src/input/commands/local-runtime.ts +7 -7
- package/src/input/commands/mail-runtime.ts +9 -9
- package/src/input/commands/mcp-runtime.ts +1 -1
- package/src/input/commands/memory.ts +13 -13
- package/src/input/commands/notify-runtime.ts +1 -1
- package/src/input/commands/operator-panel-runtime.ts +8 -8
- package/src/input/commands/operator-rpc.ts +3 -3
- package/src/input/commands/operator-runtime.ts +3 -3
- package/src/input/commands/palette-runtime.ts +1 -1
- package/src/input/commands/payment-card-intake.ts +17 -17
- package/src/input/commands/permissions-provenance.ts +7 -7
- package/src/input/commands/permissions-runtime.ts +1 -1
- package/src/input/commands/planning-runtime.ts +19 -19
- package/src/input/commands/platform-services-runtime.ts +2 -2
- package/src/input/commands/policy-dispatch.ts +6 -6
- package/src/input/commands/power-runtime.ts +6 -6
- package/src/input/commands/principals-runtime.ts +3 -3
- package/src/input/commands/product-runtime.ts +3 -3
- package/src/input/commands/profile-render.ts +13 -13
- package/src/input/commands/profile-runtime.ts +13 -13
- package/src/input/commands/profile-types.ts +13 -13
- package/src/input/commands/provider-accounts-runtime.ts +5 -5
- package/src/input/commands/provider.ts +10 -10
- package/src/input/commands/qrcode-runtime.ts +3 -3
- package/src/input/commands/queue-runtime.ts +6 -6
- package/src/input/commands/recall-files-config.ts +4 -4
- package/src/input/commands/recall-files-git.ts +3 -3
- package/src/input/commands/recall-files.ts +12 -12
- package/src/input/commands/recall-query.ts +3 -3
- package/src/input/commands/recall-review.ts +3 -3
- package/src/input/commands/recall-shared.ts +1 -1
- package/src/input/commands/relay-runtime.ts +5 -5
- package/src/input/commands/remote-runtime.ts +3 -3
- package/src/input/commands/review-runtime.ts +8 -8
- package/src/input/commands/rewind-runtime.ts +21 -21
- package/src/input/commands/runtime-services.ts +1 -2
- package/src/input/commands/schedule-nl.ts +2 -2
- package/src/input/commands/schedule-runtime.ts +2 -2
- package/src/input/commands/secret-runtime.ts +3 -3
- package/src/input/commands/session-content.ts +7 -7
- package/src/input/commands/session-picker-filter.ts +3 -3
- package/src/input/commands/session-workflow.ts +10 -10
- package/src/input/commands/session.ts +15 -15
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/share-runtime.ts +4 -4
- package/src/input/commands/shell-core.ts +11 -11
- package/src/input/commands/tasks-runtime.ts +4 -4
- package/src/input/commands/test-runtime.ts +6 -6
- package/src/input/commands/tts-runtime.ts +4 -4
- package/src/input/commands/update-runtime.ts +27 -27
- package/src/input/commands/websearch-runtime.ts +2 -2
- package/src/input/commands/work-plan-runtime.ts +2 -2
- package/src/input/commands/workstream-attempt-dependents.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +16 -16
- package/src/input/commands/workstream-runtime.ts +36 -36
- package/src/input/commands/worktree-runtime.ts +6 -6
- package/src/input/composer-capture.ts +5 -5
- package/src/input/concealed-input.ts +2 -2
- package/src/input/config-modal-types.ts +16 -16
- package/src/input/config-modal.ts +30 -30
- package/src/input/daemon-owned-settings-descriptions.ts +4 -4
- package/src/input/delete-key-policy.ts +1 -1
- package/src/input/exec-env-scrub-config.ts +7 -7
- package/src/input/feature-unit-layout.ts +5 -5
- package/src/input/feed-context-factory.ts +38 -38
- package/src/input/file-picker.ts +1 -1
- package/src/input/handler-command-route.ts +2 -2
- package/src/input/handler-content-actions.ts +8 -8
- package/src/input/handler-feed-routes.ts +13 -13
- package/src/input/handler-feed.ts +31 -31
- package/src/input/handler-interactions.ts +2 -2
- package/src/input/handler-modal-routes.ts +13 -13
- package/src/input/handler-modal-stack.ts +1 -1
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-onboarding-daemon-adopt.ts +6 -6
- package/src/input/handler-picker-routes.ts +7 -7
- package/src/input/handler-prompt-buffer.ts +1 -1
- package/src/input/handler-shortcuts.ts +12 -12
- package/src/input/handler-types.ts +3 -3
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +9 -9
- package/src/input/input-history.ts +1 -1
- package/src/input/keybindings.ts +13 -13
- package/src/input/kill-ring.ts +7 -11
- package/src/input/model-picker-filter.ts +3 -3
- package/src/input/model-picker-items.ts +5 -5
- package/src/input/model-picker-types.ts +2 -2
- package/src/input/model-picker.ts +18 -18
- package/src/input/onboarding/onboarding-feature-units.ts +9 -13
- package/src/input/onboarding/onboarding-provider-key-fields.ts +3 -3
- package/src/input/onboarding/onboarding-runtime-status.ts +3 -3
- package/src/input/onboarding/onboarding-wizard-apply.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +4 -4
- package/src/input/onboarding/onboarding-wizard-network-adopt.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-steps.ts +2 -2
- package/src/input/panel-integration-actions.ts +3 -3
- package/src/input/panel-mouse-geometry.ts +1 -1
- package/src/input/panel-paste-flood-guard.ts +9 -9
- package/src/input/payments-config.ts +15 -15
- package/src/input/profile-picker-modal.ts +1 -1
- package/src/input/provider-key-intake.ts +9 -9
- package/src/input/relay-settings-descriptions.ts +3 -3
- package/src/input/sandbox-exec-config.ts +9 -9
- package/src/input/search.ts +18 -18
- package/src/input/selection-modal-queue.ts +10 -10
- package/src/input/selection-modal.ts +2 -2
- package/src/input/session-picker-modal.ts +7 -7
- package/src/input/settings-modal-activation.ts +1 -1
- package/src/input/settings-modal-adjustment.ts +2 -2
- package/src/input/settings-modal-commit.ts +6 -6
- package/src/input/settings-modal-connections.ts +2 -2
- package/src/input/settings-modal-data.ts +29 -29
- package/src/input/settings-modal-mutations.ts +7 -7
- package/src/input/settings-modal-reset.ts +3 -3
- package/src/input/settings-modal-search.ts +6 -6
- package/src/input/settings-modal-secrets.ts +3 -3
- package/src/input/settings-modal-types.ts +16 -16
- package/src/input/settings-modal.ts +4 -4
- package/src/input/voice-local-settings.ts +3 -3
- package/src/input/worktree-setup-config.ts +8 -8
- package/src/main.ts +15 -15
- package/src/panels/agent-inspector-shared.ts +5 -5
- package/src/panels/base-panel.ts +3 -3
- package/src/panels/builtin/agent.ts +3 -3
- package/src/panels/builtin/development.ts +4 -4
- package/src/panels/builtin/knowledge.ts +1 -1
- package/src/panels/builtin/operations.ts +12 -12
- package/src/panels/builtin/session.ts +8 -8
- package/src/panels/builtin/shared.ts +6 -6
- package/src/panels/builtin-modals.ts +8 -8
- package/src/panels/confirm-state.ts +5 -5
- package/src/panels/cost-tracker-panel.ts +22 -22
- package/src/panels/diff-panel.ts +20 -20
- package/src/panels/diff-review-model.ts +5 -5
- package/src/panels/diff-review-panel.ts +5 -5
- package/src/panels/eval-registry.ts +2 -2
- package/src/panels/expandable-list-panel.ts +5 -5
- package/src/panels/fleet-acts.ts +20 -20
- package/src/panels/fleet-deep-link.ts +5 -5
- package/src/panels/fleet-gateway.ts +12 -12
- package/src/panels/fleet-observed-render.ts +11 -11
- package/src/panels/fleet-panel-format.ts +14 -14
- package/src/panels/fleet-panel-worktree-detail.ts +8 -8
- package/src/panels/fleet-panel.ts +34 -34
- package/src/panels/fleet-read-model.ts +49 -49
- package/src/panels/fleet-spawn.ts +15 -15
- package/src/panels/fleet-steer.ts +7 -7
- package/src/panels/fleet-stop.ts +5 -5
- package/src/panels/fleet-tabs.ts +14 -14
- package/src/panels/fleet-transcript.ts +26 -26
- package/src/panels/git-panel.ts +8 -8
- package/src/panels/hosted-session-feed.ts +13 -13
- package/src/panels/hosted-session-panel.ts +7 -7
- package/src/panels/index.ts +1 -1
- package/src/panels/local-auth-panel.ts +15 -15
- package/src/panels/memory-consolidation-gateway.ts +8 -8
- package/src/panels/modals/devices-modal.ts +8 -8
- package/src/panels/modals/hooks-modal.ts +1 -1
- package/src/panels/modals/keybindings-modal.ts +5 -5
- package/src/panels/modals/knowledge-modal.ts +2 -2
- package/src/panels/modals/local-auth-modal.ts +4 -4
- package/src/panels/modals/marketplace-modal.ts +3 -3
- package/src/panels/modals/memory-modal.ts +19 -19
- package/src/panels/modals/modal-surface-helpers.ts +1 -1
- package/src/panels/modals/modal-theme.ts +3 -3
- package/src/panels/modals/pairing-modal.ts +19 -19
- package/src/panels/modals/planning-modal.ts +11 -11
- package/src/panels/modals/plugins-modal.ts +1 -1
- package/src/panels/modals/policy-modal.ts +4 -4
- package/src/panels/modals/provider-health-modal.ts +1 -1
- package/src/panels/modals/remote-modal.ts +1 -1
- package/src/panels/modals/sandbox-modal.ts +2 -2
- package/src/panels/modals/security-modal.ts +4 -4
- package/src/panels/modals/services-modal.ts +1 -1
- package/src/panels/modals/work-plan-modal.ts +4 -4
- package/src/panels/notifications-feed.ts +6 -6
- package/src/panels/notifications-panel.ts +6 -6
- package/src/panels/panel-confirm-overlay.ts +4 -4
- package/src/panels/panel-manager.ts +13 -13
- package/src/panels/plugins-panel.ts +6 -6
- package/src/panels/polish-core.ts +2 -2
- package/src/panels/polish-tables.ts +2 -2
- package/src/panels/polish.ts +1 -1
- package/src/panels/project-planning-answer-actions.ts +3 -3
- package/src/panels/scrollable-list-panel.ts +15 -15
- package/src/panels/search-focus.ts +1 -1
- package/src/panels/session-maintenance.ts +1 -1
- package/src/panels/skills-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +11 -11
- package/src/panels/types.ts +14 -14
- package/src/panels/workstream-graph-render.ts +5 -5
- package/src/panels/wrfc-panel-format.ts +1 -1
- package/src/permissions/broker-approval-card.ts +13 -13
- package/src/permissions/hunk-selection.ts +13 -13
- package/src/permissions/prompt.ts +22 -22
- package/src/permissions/sandbox-exec-gate.ts +5 -5
- package/src/providers/provider-classification.ts +1 -1
- package/src/providers/reasoning-effort-surface.ts +12 -12
- package/src/renderer/ansi-sanitize.ts +5 -6
- package/src/renderer/autocomplete-overlay.ts +5 -5
- package/src/renderer/block-actions-overlay.ts +1 -1
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compaction-history-modal.ts +4 -4
- package/src/renderer/compaction-preview.ts +5 -5
- package/src/renderer/compaction-quality.ts +5 -5
- package/src/renderer/composer-fragments.ts +6 -6
- package/src/renderer/compositor.ts +9 -9
- package/src/renderer/config-modal.ts +3 -3
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/context-status-hint.ts +10 -10
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +2 -2
- package/src/renderer/conversation-surface.ts +6 -6
- package/src/renderer/diff.ts +4 -4
- package/src/renderer/fleet-tab-strip.ts +2 -2
- package/src/renderer/footer-tips.ts +4 -4
- package/src/renderer/fullscreen-primitives.ts +1 -1
- package/src/renderer/git-status.ts +5 -5
- package/src/renderer/header-line.ts +5 -5
- package/src/renderer/help-overlay.ts +5 -5
- package/src/renderer/hint-grammar.ts +2 -2
- package/src/renderer/layout.ts +1 -1
- package/src/renderer/markdown-inline.ts +3 -3
- package/src/renderer/markdown-table.ts +7 -7
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/model-workspace.ts +7 -7
- package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
- package/src/renderer/overlay-box.ts +1 -1
- package/src/renderer/panel-composite.ts +5 -5
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +8 -8
- package/src/renderer/profile-picker-modal.ts +3 -3
- package/src/renderer/prompt-content-width.ts +1 -1
- package/src/renderer/search-overlay.ts +3 -3
- package/src/renderer/selection-modal-overlay.ts +6 -6
- package/src/renderer/semantic-diff.ts +6 -7
- package/src/renderer/session-picker-modal.ts +24 -24
- package/src/renderer/settings-modal-connections.ts +3 -3
- package/src/renderer/settings-modal-helpers.ts +16 -16
- package/src/renderer/settings-modal.ts +10 -10
- package/src/renderer/shell-surface.ts +8 -8
- package/src/renderer/status-glyphs.ts +6 -6
- package/src/renderer/syntax-highlighter.ts +2 -3
- package/src/renderer/system-message.ts +3 -3
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/term-caps.ts +12 -12
- package/src/renderer/terminal-bg-probe.ts +10 -10
- package/src/renderer/terminal-escapes.ts +1 -1
- package/src/renderer/theme-mode-config.ts +3 -3
- package/src/renderer/theme.ts +34 -34
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +5 -5
- package/src/renderer/tool-result-expanded-lines.ts +3 -3
- package/src/renderer/tool-result-summary.ts +6 -6
- package/src/renderer/turn-injection.ts +9 -9
- package/src/renderer/ui-factory.ts +33 -33
- package/src/renderer/ui-primitives.ts +4 -4
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +21 -21
- package/src/runtime/bootstrap-hook-bridge.ts +8 -8
- package/src/runtime/bootstrap-shell.ts +9 -9
- package/src/runtime/bootstrap.ts +16 -16
- package/src/runtime/client/approval-updates.ts +3 -3
- package/src/runtime/client/build-floors.ts +7 -7
- package/src/runtime/client/daemon-attach-handshake.ts +5 -5
- package/src/runtime/client/fleet-union.ts +7 -7
- package/src/runtime/client/host-service-status.ts +2 -2
- package/src/runtime/client/hosted-exit.ts +4 -4
- package/src/runtime/client/hosted-roster.ts +4 -4
- package/src/runtime/client/hosted-session-stream.ts +5 -5
- package/src/runtime/client/hosted-sessions.ts +8 -8
- package/src/runtime/client/operator-endpoint.ts +14 -14
- package/src/runtime/client/spine-adoption.ts +8 -8
- package/src/runtime/context-accounting-source.ts +4 -4
- package/src/runtime/context.ts +2 -2
- package/src/runtime/conversation-rewind-port.ts +6 -6
- package/src/runtime/credential-composition.ts +2 -2
- package/src/runtime/daemon-attach-notices.ts +6 -6
- package/src/runtime/diagnostics/panels/index.ts +1 -1
- package/src/runtime/diagnostics/panels/ops.ts +2 -2
- package/src/runtime/disposal-wiring.ts +6 -6
- package/src/runtime/index.ts +11 -11
- package/src/runtime/install-self-check-startup.ts +4 -4
- package/src/runtime/install-self-check.ts +6 -6
- package/src/runtime/interaction-seams.ts +4 -4
- package/src/runtime/knowledge-services.ts +2 -2
- package/src/runtime/legacy-daemon-migration.ts +37 -37
- package/src/runtime/legacy-daemon-reconcile.ts +30 -30
- package/src/runtime/memory-governance-services.ts +3 -3
- package/src/runtime/memory-spine-transport.ts +3 -3
- package/src/runtime/notification-dispatch.ts +4 -4
- package/src/runtime/onboarding/apply.ts +1 -1
- package/src/runtime/onboarding/derivation.ts +1 -1
- package/src/runtime/onboarding/fast-path.ts +7 -7
- package/src/runtime/onboarding/progress.ts +2 -2
- package/src/runtime/onboarding/provider-key-capture.ts +4 -4
- package/src/runtime/onboarding/snapshot.ts +2 -2
- package/src/runtime/onboarding/state.ts +4 -4
- package/src/runtime/onboarding/types.ts +4 -4
- package/src/runtime/orchestrator-core-services.ts +5 -5
- package/src/runtime/path-shadow-startup.ts +3 -3
- package/src/runtime/perf/panel-contracts.ts +1 -1
- package/src/runtime/power-keepawake-remote.ts +6 -6
- package/src/runtime/process-lifecycle.ts +14 -14
- package/src/runtime/provider-fallback.ts +3 -3
- package/src/runtime/recovery-autosave.ts +3 -3
- package/src/runtime/recovery-decisions.ts +19 -19
- package/src/runtime/recovery-offer-wiring.ts +4 -4
- package/src/runtime/recovery-prompt.ts +20 -20
- package/src/runtime/relay-reachability-bridge.ts +3 -3
- package/src/runtime/release-artifacts.ts +1 -1
- package/src/runtime/resume-notice.ts +20 -20
- package/src/runtime/runtime-services-types.ts +20 -20
- package/src/runtime/services.ts +20 -20
- package/src/runtime/session-continuity-hints.ts +1 -1
- package/src/runtime/session-inbound-inputs.ts +12 -12
- package/src/runtime/session-resume-liveness-confirm.ts +4 -4
- package/src/runtime/session-spine-transport.ts +3 -3
- package/src/runtime/store/domains/panels.ts +2 -2
- package/src/runtime/store/domains/ui-perf.ts +2 -2
- package/src/runtime/store/index.ts +1 -1
- package/src/runtime/store/selectors/index.ts +1 -1
- package/src/runtime/store/state.ts +2 -2
- package/src/runtime/ui-services.ts +3 -3
- package/src/runtime/workspace-checkpointing.ts +3 -3
- package/src/runtime/wrfc-persistence.ts +15 -15
- package/src/scripts/process-messages.ts +1 -1
- package/src/shell/blocking-input.ts +9 -9
- package/src/shell/recovery-input-helpers.ts +2 -2
- package/src/shell/retry-affordance.ts +9 -9
- package/src/shell/ui-openers.ts +14 -14
- package/src/shell/voice-capture-shell.ts +3 -3
- package/src/tools/wrfc-agent-guard.ts +4 -4
- package/src/utils/browser.ts +2 -2
- package/src/utils/format-duration.ts +3 -3
- package/src/utils/format-number.ts +2 -2
- package/src/utils/splash-lines.ts +4 -4
- package/src/utils/terminal-width.ts +6 -6
- package/src/verification/verification-ledger.ts +25 -25
- package/src/version.ts +3 -3
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"product": {
|
|
4
4
|
"id": "goodvibes",
|
|
5
5
|
"surface": "operator",
|
|
6
|
-
"version": "2.0.
|
|
6
|
+
"version": "2.0.20"
|
|
7
7
|
},
|
|
8
8
|
"auth": {
|
|
9
9
|
"modes": [
|
|
@@ -527,7 +527,7 @@
|
|
|
527
527
|
{
|
|
528
528
|
"id": "acp.agents.list",
|
|
529
529
|
"title": "List Installed Third-Party Coding Agents",
|
|
530
|
-
"description": "READ-ONLY discovery of installed ACP-capable third-party coding agents (Claude Code, Codex CLI, opencode): existence checks over $PATH and known install directories
|
|
530
|
+
"description": "READ-ONLY discovery of installed ACP-capable third-party coding agents (Claude Code, Codex CLI, opencode): existence checks over $PATH and known install directories, no process is ever executed, no registration ceremony. Returns only what is present (id, title, resolved binary path, ACP launch args); absence is a quiet empty list, never a nag.",
|
|
531
531
|
"category": "acp",
|
|
532
532
|
"source": "builtin",
|
|
533
533
|
"access": "authenticated",
|
|
@@ -581,7 +581,7 @@
|
|
|
581
581
|
{
|
|
582
582
|
"id": "acp.sessions.create",
|
|
583
583
|
"title": "Spawn a Third-Party Coding Agent Session",
|
|
584
|
-
"description": "Spawn a discovered third-party agent into a working directory as a hosted daemon session in ONE act: the binary is launched in ACP stdio mode, the handshake and session creation run under a bound timeout, and the result is the hosted record
|
|
584
|
+
"description": "Spawn a discovered third-party agent into a working directory as a hosted daemon session in ONE act: the binary is launched in ACP stdio mode, the handshake and session creation run under a bound timeout, and the result is the hosted record, which appears as a steerable/stoppable fleet row (kind acp-agent) whose permission asks classify as waiting-on-human. A binary that fails the handshake returns the SAME record with state \"failed\" and a structured error (which binary, which stage, what happened), an honest outcome, never a hung row and never a bare string. An optional initial prompt starts the first turn.",
|
|
585
585
|
"category": "acp",
|
|
586
586
|
"source": "builtin",
|
|
587
587
|
"access": "authenticated",
|
|
@@ -703,7 +703,7 @@
|
|
|
703
703
|
{
|
|
704
704
|
"id": "approvals.approve",
|
|
705
705
|
"title": "Approve Approval",
|
|
706
|
-
"description": "Approve a pending approval. Optionally pass selectedHunks (edit-tool approvals only): the daemon filters the approval's own edit list to those hunk indices server-side, so every surface produces identical modified-edit args. Omitting selectedHunks approves the whole request (back-compat). An out-of-range index or a non-edit approval is rejected with a 400. rememberTier generalizes the decision (a generalizing tier persists a durable rule and sweeps queued asks it covers); modifiedArgs carries an argument-modifying approval
|
|
706
|
+
"description": "Approve a pending approval. Optionally pass selectedHunks (edit-tool approvals only): the daemon filters the approval's own edit list to those hunk indices server-side, so every surface produces identical modified-edit args. Omitting selectedHunks approves the whole request (back-compat). An out-of-range index or a non-edit approval is rejected with a 400. rememberTier generalizes the decision (a generalizing tier persists a durable rule and sweeps queued asks it covers); modifiedArgs carries an argument-modifying approval, e.g. the typed answer to a command's terminal prompt, to the waiting call (selectedHunks supersedes it when both are present). The response's recorded block reports what the broker actually recorded.",
|
|
707
707
|
"category": "approvals",
|
|
708
708
|
"source": "builtin",
|
|
709
709
|
"access": "authenticated",
|
|
@@ -3458,7 +3458,7 @@
|
|
|
3458
3458
|
{
|
|
3459
3459
|
"id": "approvals.raise",
|
|
3460
3460
|
"title": "Raise Approval",
|
|
3461
|
-
"description": "Raise a permission ask INTO the shared broker from a surface that is not in the daemon's process
|
|
3461
|
+
"description": "Raise a permission ask INTO the shared broker from a surface that is not in the daemon's process, the write counterpart to approvals.list/claim/approve/deny/cancel, which could only ever act on asks the daemon's own in-process callers had created. The ask becomes a record every surface can see and decide, and the daemon's attention machinery (web push, blocked-on-user) fans it out. Returns the PENDING record immediately and does NOT block waiting for an answer: the decision arrives on the control.approval_update event (SSE/WS, `permissions` domain), which is the channel to watch using the returned id. An identical ask already in flight (same session, tool and args) coalesces onto the existing record, one prompt, one decision, `coalesced: true`, and the returned record is that earlier one. Optional timeoutMs expires the ask if nobody answers (clamped to 12h); optional waitMs waits inline for a decision for callers that want one round trip (clamped to 60s) and reports `decided: false` with the record still pending when it runs out, never a decision that was not made. ws-only invoke verb; no REST binding.",
|
|
3462
3462
|
"category": "approvals",
|
|
3463
3463
|
"source": "builtin",
|
|
3464
3464
|
"access": "authenticated",
|
|
@@ -8893,7 +8893,7 @@
|
|
|
8893
8893
|
{
|
|
8894
8894
|
"id": "automation.jobs.update",
|
|
8895
8895
|
"title": "Update Automation Job",
|
|
8896
|
-
"description": "Update a durable automation job. (Renamed from automation.jobs.patch in the 1.0.0 core-verb rename
|
|
8896
|
+
"description": "Update a durable automation job. (Renamed from automation.jobs.patch in the 1.0.0 core-verb rename, canonical verb is update, not patch.)",
|
|
8897
8897
|
"category": "automation",
|
|
8898
8898
|
"source": "builtin",
|
|
8899
8899
|
"access": "authenticated",
|
|
@@ -12325,7 +12325,7 @@
|
|
|
12325
12325
|
{
|
|
12326
12326
|
"id": "automation.runs.list",
|
|
12327
12327
|
"title": "List Automation Runs",
|
|
12328
|
-
"description": "Return automation run history. Without ?limit/?cursor returns { runs: [...] } (backward compatible). With ?limit=N (1–500, default 100) and optional ?cursor=<opaque> returns a PaginatedResponse envelope { items, hasMore, nextCursor? }. Invalid cursors return HTTP 400. Optional ?since=<epoch-ms> returns only runs active on or after that time (by queuedAt, or endedAt when set)
|
|
12328
|
+
"description": "Return automation run history. Without ?limit/?cursor returns { runs: [...] } (backward compatible). With ?limit=N (1–500, default 100) and optional ?cursor=<opaque> returns a PaginatedResponse envelope { items, hasMore, nextCursor? }. Invalid cursors return HTTP 400. Optional ?since=<epoch-ms> returns only runs active on or after that time (by queuedAt, or endedAt when set), the host-side source an away-digest reads to report the failed, missed, completed, and delivered runs since the operator was last present.",
|
|
12329
12329
|
"category": "automation",
|
|
12330
12330
|
"source": "builtin",
|
|
12331
12331
|
"access": "authenticated",
|
|
@@ -23781,7 +23781,7 @@
|
|
|
23781
23781
|
{
|
|
23782
23782
|
"id": "channels.inbox.list",
|
|
23783
23783
|
"title": "List Channel Inbox",
|
|
23784
|
-
"description": "Return the merged inbound message feed (Slack DMs, Discord messages, email threads) from the host's synced provider mirror, newest first. Read-only; no provider write. Every known provider reports its own state in `providers
|
|
23784
|
+
"description": "Return the merged inbound message feed (Slack DMs, Discord messages, email threads) from the host's synced provider mirror, newest first. Read-only; no provider write. Every known provider reports its own state in `providers`, including the unconfigured and the failing ones, so a short list is never ambiguous, and `partial` is true whenever a configured provider's items are missing because its last sync failed. Page with ?limit and ?cursor (opaque, from nextCursor); ?since=<epoch-ms> returns only items newer than a previous answer's `cursor` watermark; ?provider=<id> narrows to one provider.",
|
|
23785
23785
|
"category": "channels",
|
|
23786
23786
|
"source": "builtin",
|
|
23787
23787
|
"access": "authenticated",
|
|
@@ -24807,7 +24807,7 @@
|
|
|
24807
24807
|
{
|
|
24808
24808
|
"id": "channels.profiles.delete",
|
|
24809
24809
|
"title": "Unbind Channel Profile",
|
|
24810
|
-
"description": "Remove a channel profile binding. Returns { deleted: false } when no binding for that key existed
|
|
24810
|
+
"description": "Remove a channel profile binding. Returns { deleted: false } when no binding for that key existed, an honest boolean, never a phantom removal.",
|
|
24811
24811
|
"category": "channels",
|
|
24812
24812
|
"source": "builtin",
|
|
24813
24813
|
"access": "admin",
|
|
@@ -26226,7 +26226,7 @@
|
|
|
26226
26226
|
{
|
|
26227
26227
|
"id": "channels.test.send",
|
|
26228
26228
|
"title": "Send Channel Test Message",
|
|
26229
|
-
"description": "Send a real test message through a configured channel surface and report the actual delivery outcome. delivered:true means the daemon's delivery router accepted and sent it (with the surface's responseId when it returns one); a failed send is delivered:false with the real error (unconfigured/unsupported surface, provider/transport error)
|
|
26229
|
+
"description": "Send a real test message through a configured channel surface and report the actual delivery outcome. delivered:true means the daemon's delivery router accepted and sent it (with the surface's responseId when it returns one); a failed send is delivered:false with the real error (unconfigured/unsupported surface, provider/transport error), never a fabricated success. Provide address to target a specific recipient/channel, or omit it to use the surface's configured default.",
|
|
26230
26230
|
"category": "channels",
|
|
26231
26231
|
"source": "builtin",
|
|
26232
26232
|
"access": "authenticated",
|
|
@@ -26935,7 +26935,7 @@
|
|
|
26935
26935
|
{
|
|
26936
26936
|
"id": "checkpoints.create",
|
|
26937
26937
|
"title": "Create Workspace Checkpoint",
|
|
26938
|
-
"description": "Create a new workspace checkpoint. Returns checkpoint:null, noop:true (not an error) when the workspace tree is identical to the most recent checkpoint
|
|
26938
|
+
"description": "Create a new workspace checkpoint. Returns checkpoint:null, noop:true (not an error) when the workspace tree is identical to the most recent checkpoint, no commit, ref, or manifest entry is created in that case.",
|
|
26939
26939
|
"category": "checkpoints",
|
|
26940
26940
|
"source": "builtin",
|
|
26941
26941
|
"access": "authenticated",
|
|
@@ -27265,7 +27265,7 @@
|
|
|
27265
27265
|
{
|
|
27266
27266
|
"id": "checkpoints.restore",
|
|
27267
27267
|
"title": "Restore Workspace Checkpoint",
|
|
27268
|
-
"description": "DESTRUCTIVE: restore the workspace to the state captured by a checkpoint (git-backed workspace rewrite). Refuses to run unconfirmed: pass confirm:true to execute immediately, OR a confirmToken from checkpoints.restorePreview. An unconfirmed call returns a structured refusal (result:null, refused:true, refusal naming both options)
|
|
27268
|
+
"description": "DESTRUCTIVE: restore the workspace to the state captured by a checkpoint (git-backed workspace rewrite). Refuses to run unconfirmed: pass confirm:true to execute immediately, OR a confirmToken from checkpoints.restorePreview. An unconfirmed call returns a structured refusal (result:null, refused:true, refusal naming both options), not an error. An unknown/gc'd checkpoint id (once confirmed) is an honest 404, not a silent no-op.",
|
|
27269
27269
|
"category": "checkpoints",
|
|
27270
27270
|
"source": "builtin",
|
|
27271
27271
|
"access": "authenticated",
|
|
@@ -27481,7 +27481,7 @@
|
|
|
27481
27481
|
{
|
|
27482
27482
|
"id": "checkpoints.revertHunk",
|
|
27483
27483
|
"title": "Revert a Single Hunk",
|
|
27484
|
-
"description": "DESTRUCTIVE: reverse-apply ONE unified-diff hunk to its file in the live working tree, undoing exactly that hunk and nothing else. The hunk must still apply cleanly in reverse
|
|
27484
|
+
"description": "DESTRUCTIVE: reverse-apply ONE unified-diff hunk to its file in the live working tree, undoing exactly that hunk and nothing else. The hunk must still apply cleanly in reverse, a stale/drifted hunk is an honest 409 conflict, never a partial write. Refuses to run unconfirmed: pass confirm:true to execute immediately, OR a confirmToken from checkpoints.revertHunkPreview. An unconfirmed call returns a structured refusal (receipt:null, refused:true, refusal naming both options), not an error. Snapshots the whole tree (a manual checkpoint) before writing, so the revert is itself reversible; returns a receipt whose undo block carries that checkpoint id. Emits a HUNK_REVERTED receipt event.",
|
|
27485
27485
|
"category": "checkpoints",
|
|
27486
27486
|
"source": "builtin",
|
|
27487
27487
|
"access": "authenticated",
|
|
@@ -27636,7 +27636,7 @@
|
|
|
27636
27636
|
{
|
|
27637
27637
|
"id": "checkpoints.revertHunkPreview",
|
|
27638
27638
|
"title": "Preview a Single-Hunk Revert",
|
|
27639
|
-
"description": "Read-only: check whether reverse-applying ONE unified-diff hunk (copied from a checkpoints.diff / sessions.changes.get diff) to its file in the live working tree would apply cleanly right now, and mint a short-lived (~2 min), single-use confirmToken authorizing the matching checkpoints.revertHunk. A stale/drifted hunk returns applies:false with a human-readable conflict and a null token
|
|
27639
|
+
"description": "Read-only: check whether reverse-applying ONE unified-diff hunk (copied from a checkpoints.diff / sessions.changes.get diff) to its file in the live working tree would apply cleanly right now, and mint a short-lived (~2 min), single-use confirmToken authorizing the matching checkpoints.revertHunk. A stale/drifted hunk returns applies:false with a human-readable conflict and a null token, an honest \"this hunk no longer applies\", not an error. No workspace mutation.",
|
|
27640
27640
|
"category": "checkpoints",
|
|
27641
27641
|
"source": "builtin",
|
|
27642
27642
|
"access": "authenticated",
|
|
@@ -28433,7 +28433,7 @@
|
|
|
28433
28433
|
{
|
|
28434
28434
|
"id": "companion.chat.messages.edit",
|
|
28435
28435
|
"title": "Edit Companion Chat Message And Branch",
|
|
28436
|
-
"description": "Edit a user message and branch the conversation from it. `messageId` (required) is the user message to edit; the edited text is passed as `body` or `content` (as message create accepts), with optional `attachments` referencing artifacts. The original message and everything after it are SUPERSEDED
|
|
28436
|
+
"description": "Edit a user message and branch the conversation from it. `messageId` (required) is the user message to edit; the edited text is passed as `body` or `content` (as message create accepts), with optional `attachments` referencing artifacts. The original message and everything after it are SUPERSEDED, retained as history, never deleted, a new user message carrying `revisionOf` back to the original is appended, and a fresh turn answers it. Returns the new message id and the superseded ids for honest lineage. Same closed/unknown-session refusals as companion.chat.messages.retry.",
|
|
28437
28437
|
"category": "companion",
|
|
28438
28438
|
"source": "builtin",
|
|
28439
28439
|
"access": "authenticated",
|
|
@@ -28772,7 +28772,7 @@
|
|
|
28772
28772
|
{
|
|
28773
28773
|
"id": "companion.chat.messages.retry",
|
|
28774
28774
|
"title": "Regenerate Companion Chat Response",
|
|
28775
|
-
"description": "Regenerate an assistant response. Optional `messageId` targets a specific assistant message; omitted, the latest assistant response is re-run. The prior response (and any turns after it) is SUPERSEDED
|
|
28775
|
+
"description": "Regenerate an assistant response. Optional `messageId` targets a specific assistant message; omitted, the latest assistant response is re-run. The prior response (and any turns after it) is SUPERSEDED, kept in the message list and on disk, flagged as retained history, never deleted, then a fresh turn re-runs from the preceding user message. Returns the superseded message ids so the caller can render the honest lineage. Rejected on a closed session (409 SESSION_CLOSED) or unknown session (404 SESSION_NOT_FOUND), and with an honest machine code (409 NO_ASSISTANT_MESSAGE) when there is nothing to regenerate.",
|
|
28776
28776
|
"category": "companion",
|
|
28777
28777
|
"source": "builtin",
|
|
28778
28778
|
"access": "authenticated",
|
|
@@ -28828,7 +28828,7 @@
|
|
|
28828
28828
|
{
|
|
28829
28829
|
"id": "companion.chat.messages.steer",
|
|
28830
28830
|
"title": "Steer Companion Chat (Interrupt And Send)",
|
|
28831
|
-
"description": "Send a message that runs IMMEDIATELY, interrupting the in-flight turn if one is running. The message jumps to the front of the pending-turn queue; the active turn is cancelled through the same finalization path as companion.chat.turns.cancel (any non-empty partial reply is persisted with `deliveryState: \"cancelled\"` and the terminal `turn.cancelled` event reaches every subscriber), then the steered message's turn starts. Messages queued behind an active turn keep their places behind the steer. With no turn running this behaves as an ordinary send. Accepts the same payload as companion.chat.messages.create (`body`/`content`, `attachments`, `metadata`). Returns the new message id, `steered: true`, and `cancelledTurnId` when a turn was interrupted. Ordinary sends posted while a turn is running are QUEUED (transcript-visible immediately with `deliveryState: \"queued\"`, answered in order)
|
|
28831
|
+
"description": "Send a message that runs IMMEDIATELY, interrupting the in-flight turn if one is running. The message jumps to the front of the pending-turn queue; the active turn is cancelled through the same finalization path as companion.chat.turns.cancel (any non-empty partial reply is persisted with `deliveryState: \"cancelled\"` and the terminal `turn.cancelled` event reaches every subscriber), then the steered message's turn starts. Messages queued behind an active turn keep their places behind the steer. With no turn running this behaves as an ordinary send. Accepts the same payload as companion.chat.messages.create (`body`/`content`, `attachments`, `metadata`). Returns the new message id, `steered: true`, and `cancelledTurnId` when a turn was interrupted. Ordinary sends posted while a turn is running are QUEUED (transcript-visible immediately with `deliveryState: \"queued\"`, answered in order), steer is the explicit jump-the-line verb.",
|
|
28832
28832
|
"category": "companion",
|
|
28833
28833
|
"source": "builtin",
|
|
28834
28834
|
"access": "authenticated",
|
|
@@ -29177,7 +29177,7 @@
|
|
|
29177
29177
|
{
|
|
29178
29178
|
"id": "companion.chat.sessions.delete",
|
|
29179
29179
|
"title": "Delete Companion Chat Session",
|
|
29180
|
-
"description": "Permanently remove a companion-chat session: the on-disk record file is deleted and the session is dropped from the shared session store
|
|
29180
|
+
"description": "Permanently remove a companion-chat session: the on-disk record file is deleted and the session is dropped from the shared session store, this does NOT merely close it (use companion.chat.sessions.close for a soft close). Requires the session to already be closed: deleting a still-active session is rejected with 409 SESSION_ACTIVE (close it, then delete). An unknown or already-deleted id is a 404 SESSION_NOT_FOUND, never a 200-noop.",
|
|
29181
29181
|
"category": "companion",
|
|
29182
29182
|
"source": "builtin",
|
|
29183
29183
|
"access": "authenticated",
|
|
@@ -29839,7 +29839,7 @@
|
|
|
29839
29839
|
{
|
|
29840
29840
|
"id": "companion.chat.turns.cancel",
|
|
29841
29841
|
"title": "Cancel Companion Chat Turn",
|
|
29842
|
-
"description": "Stop the in-flight turn for a companion chat session
|
|
29842
|
+
"description": "Stop the in-flight turn for a companion chat session, a true server-side stop: the provider stream is aborted, any non-empty partial reply is persisted to the transcript with an explicit `deliveryState: \"cancelled\"` marker (an honest partial, never disguised as a complete reply) AND committed to the model-facing conversation history with an explicit interruption note, later turns can reason about what the user saw and stopped, which is usually what a follow-up or steer refers to, and the terminal `turn.cancelled` event is published to every subscriber of the session stream so a stop from one client converges on all others. Any announced tool call without a result is closed with a synthetic error `turn.tool_result` before the terminal event. Optional `turnId` guards against cancelling a newer turn a stale stop raced against (409 TURN_MISMATCH). No turn in flight is the benign 404 NO_ACTIVE_TURN (the turn finished before the stop landed). Repeat cancels are idempotent successes. The session stays open; the next message starts a fresh turn normally.",
|
|
29843
29843
|
"category": "companion",
|
|
29844
29844
|
"source": "builtin",
|
|
29845
29845
|
"access": "authenticated",
|
|
@@ -30327,7 +30327,7 @@
|
|
|
30327
30327
|
{
|
|
30328
30328
|
"id": "credentials.delete",
|
|
30329
30329
|
"title": "Delete Credential",
|
|
30330
|
-
"description": "Remove a credential: the stored secret first, then the config reference pointing at it. That order is deliberate
|
|
30330
|
+
"description": "Remove a credential: the stored secret first, then the config reference pointing at it. That order is deliberate, clearing the config first would strand a secret nothing points at and nothing reaps, while this order leaves, for an instant, a reference resolving to nothing, which every reader already treats as configured-but-broken (the honest state for a credential mid-removal). `cleared: false` means nothing was stored under that key: a miss, not an error, because asking for a credential to be gone when it already is has succeeded. ws-only invoke verb; no REST binding. Mutating, so a relay call is covered by relay.requireStepUpForMutations exactly as config.set is.",
|
|
30331
30331
|
"category": "config",
|
|
30332
30332
|
"source": "builtin",
|
|
30333
30333
|
"access": "admin",
|
|
@@ -30467,7 +30467,7 @@
|
|
|
30467
30467
|
{
|
|
30468
30468
|
"id": "credentials.set",
|
|
30469
30469
|
"title": "Set Credential",
|
|
30470
|
-
"description": "Store a credential for a secret-bearing config key THROUGH the daemon, so a surface no longer has to write it into its own on-disk secret store
|
|
30470
|
+
"description": "Store a credential for a secret-bearing config key THROUGH the daemon, so a surface no longer has to write it into its own on-disk secret store, the write counterpart to credentials.get, and the reason a client on another machine can now finish a settings modal at all. `key` is the config path (e.g. surfaces.telegram.botToken); the secret-store name is derived from it. The value goes into the encrypted store at the scope the ownership rules resolve (a daemon-needed credential lands in the daemon tier whoever asked), is read BACK and compared, and only then does the config key take its goodvibes://secrets/goodvibes/<KEY> reference. A read-back mismatch fails the call and leaves the setting exactly as it was, because a reference resolving to nothing reads as a configured-but-broken credential. The response is secret-free: key names, the resolved scope, the reference now in config, and two plain sentences about where the setting and the credential are filed, never the value. Refuses a key that is not credential-bearing (use config.set) and refuses a value that is itself a goodvibes:// reference. ws-only invoke verb; no REST binding. Mutating, so a relay call is covered by relay.requireStepUpForMutations exactly as config.set is.",
|
|
30471
30471
|
"category": "config",
|
|
30472
30472
|
"source": "builtin",
|
|
30473
30473
|
"access": "admin",
|
|
@@ -32923,7 +32923,7 @@
|
|
|
32923
32923
|
{
|
|
32924
32924
|
"id": "control.status",
|
|
32925
32925
|
"title": "Daemon Status",
|
|
32926
|
-
"description": "Return daemon status and version. THREE version fields, because there are two versions and they are not the same number: `buildVersion` is the running artifact's own release version
|
|
32926
|
+
"description": "Return daemon status and version. THREE version fields, because there are two versions and they are not the same number: `buildVersion` is the running artifact's own release version, what a person installed, and what the auto-update loop compares against release tags, and `platformVersion` is the SDK build it is composed from. `version` carries the build version and exists because every client already reads it; on an embedded daemon that ships no artifact of its own, all three are the platform build. Pass receipts=consume to also receive undelivered daemon receipts (update/crash/migration notices) and mark them delivered, exactly once across all consuming readers. Without the flag no receipts are returned or consumed, so identity probes and keepalives never eat them.",
|
|
32927
32927
|
"category": "control-plane",
|
|
32928
32928
|
"source": "builtin",
|
|
32929
32929
|
"access": "authenticated",
|
|
@@ -33042,7 +33042,7 @@
|
|
|
33042
33042
|
{
|
|
33043
33043
|
"id": "relay.pairing.mint",
|
|
33044
33044
|
"title": "Mint A Relay Pairing Payload",
|
|
33045
|
-
"description": "Return the pairing payload a surface scans to reach this daemon through the relay: the relay URL to dial, the rendezvous id the daemon registered under, and the daemon's static public key. `pairing` is null
|
|
33045
|
+
"description": "Return the pairing payload a surface scans to reach this daemon through the relay: the relay URL to dial, the rendezvous id the daemon registered under, and the daemon's static public key. `pairing` is null, not an error, when there is no live registration to mint against, which is the honest answer for a daemon whose relay is off or has not connected yet, and is the same value the in-process capability returns. Minting does not create a second identity or a second registration; it describes the one that exists.",
|
|
33046
33046
|
"category": "control-plane",
|
|
33047
33047
|
"source": "builtin",
|
|
33048
33048
|
"access": "admin",
|
|
@@ -33117,7 +33117,7 @@
|
|
|
33117
33117
|
{
|
|
33118
33118
|
"id": "relay.reachability.get",
|
|
33119
33119
|
"title": "Relay Reachability",
|
|
33120
|
-
"description": "Whether this daemon is registered with the relay, and what state its registration is in. `disabled` is a distinct answer from every other one and the distinction is the point: it means a gate is off
|
|
33120
|
+
"description": "Whether this daemon is registered with the relay, and what state its registration is in. `disabled` is a distinct answer from every other one and the distinction is the point: it means a gate is off, `relay.enabled`, the relay-connect capability, or an empty `relay.url`, rather than that a connection is failing. `idle` means the gates are open and nothing has started; `connecting`, `registered` and `reconnecting` are the live registration; `stopped` is a controller that was told to stop. `configured` says whether all three gates are open, so a caller can render \"turn it on\" instead of \"it is broken\". ws-only invoke verb; no REST binding.",
|
|
33121
33121
|
"category": "control-plane",
|
|
33122
33122
|
"source": "builtin",
|
|
33123
33123
|
"access": "authenticated",
|
|
@@ -33161,7 +33161,7 @@
|
|
|
33161
33161
|
{
|
|
33162
33162
|
"id": "update.check",
|
|
33163
33163
|
"title": "Check For An Update Now",
|
|
33164
|
-
"description": "Run one update check immediately instead of waiting for the next interval, and return the status afterwards. This is the same tick the schedule runs, so an on-demand check and the hourly one cannot reach different conclusions. It never forces an install: a downloaded-and-verified release still waits for a moment when no work is in flight, which the returned `pendingVersion` reports. A check that fails is reported in `failedCheckCount` and `lastCheckFailure` rather than refused
|
|
33164
|
+
"description": "Run one update check immediately instead of waiting for the next interval, and return the status afterwards. This is the same tick the schedule runs, so an on-demand check and the hourly one cannot reach different conclusions. It never forces an install: a downloaded-and-verified release still waits for a moment when no work is in flight, which the returned `pendingVersion` reports. A check that fails is reported in `failedCheckCount` and `lastCheckFailure` rather than refused, the caller asked what the state is, and \"the check failed\" is the answer. On a daemon with no loop armed this returns the same status `update.status` would, with `offReason` saying why nothing ran.",
|
|
33165
33165
|
"category": "control-plane",
|
|
33166
33166
|
"source": "builtin",
|
|
33167
33167
|
"access": "admin",
|
|
@@ -33271,7 +33271,7 @@
|
|
|
33271
33271
|
{
|
|
33272
33272
|
"id": "update.status",
|
|
33273
33273
|
"title": "Self-Update Status",
|
|
33274
|
-
"description": "Whether this daemon is keeping itself current, and
|
|
33274
|
+
"description": "Whether this daemon is keeping itself current, and, when it is not, the reason in one line. `armed` is false whenever no loop is running and `offReason` says which gate stopped it: update.auto not set, no artifact identity (a host that manages its own updates), or no release URL to resolve tags from. `failedCheckCount` with `lastCheckFailure` is the case that used to be invisible: checks running on schedule and failing every time, which looks exactly like having nothing to update to. `pendingVersion` is a release already downloaded and verified, waiting for a moment when no work is in flight. `rejectedVersion` is a release that was installed here, failed to start, and was rolled back, it is deliberately not reinstalled.",
|
|
33275
33275
|
"category": "control-plane",
|
|
33276
33276
|
"source": "builtin",
|
|
33277
33277
|
"access": "authenticated",
|
|
@@ -34616,7 +34616,7 @@
|
|
|
34616
34616
|
{
|
|
34617
34617
|
"id": "email.inbox.list",
|
|
34618
34618
|
"title": "List Email Inbox",
|
|
34619
|
-
"description": "Return inbox message summaries fetched live from the configured IMAP account, newest first (ordered by server-assigned UID, never by the sender-written Date header). Read-only (EXAMINE / BODY.PEEK); never marks messages read. When the server answered for a message and the daemon could not read the answer, the page is short and `unreadable` says so
|
|
34619
|
+
"description": "Return inbox message summaries fetched live from the configured IMAP account, newest first (ordered by server-assigned UID, never by the sender-written Date header). Read-only (EXAMINE / BODY.PEEK); never marks messages read. When the server answered for a message and the daemon could not read the answer, the page is short and `unreadable` says so, an omitted message is not by itself evidence that it was deleted.",
|
|
34620
34620
|
"category": "email",
|
|
34621
34621
|
"source": "builtin",
|
|
34622
34622
|
"access": "authenticated",
|
|
@@ -34875,7 +34875,7 @@
|
|
|
34875
34875
|
{
|
|
34876
34876
|
"id": "flags.graduation.report",
|
|
34877
34877
|
"title": "Feature Defaults Report",
|
|
34878
|
-
"description": "Return the feature defaults report: every platform capability with its current default, default-disposition state (dark = default-off with no evidence, soaking = accumulating evidence, graduate-candidate = judged ready and awaiting a release decision, graduated = default on, blocked = held off with a dated reason), and its validation evidence. Evidence is real-only: a capability with no instrumentation reports \"no evidence collected\", never a fabricated readiness; the permissions divergence simulation is the one wired instrumentation today. releaseBlockers lists every graduate-candidate entry
|
|
34878
|
+
"description": "Return the feature defaults report: every platform capability with its current default, default-disposition state (dark = default-off with no evidence, soaking = accumulating evidence, graduate-candidate = judged ready and awaiting a release decision, graduated = default on, blocked = held off with a dated reason), and its validation evidence. Evidence is real-only: a capability with no instrumentation reports \"no evidence collected\", never a fabricated readiness; the permissions divergence simulation is the one wired instrumentation today. releaseBlockers lists every graduate-candidate entry, the release policy (bun run flags:graduation) fails while that list is non-empty, forcing each ready default to flip on or record a dated blocker.",
|
|
34879
34879
|
"category": "flags",
|
|
34880
34880
|
"source": "builtin",
|
|
34881
34881
|
"access": "authenticated",
|
|
@@ -35562,7 +35562,7 @@
|
|
|
35562
35562
|
{
|
|
35563
35563
|
"id": "fleet.attempts.judge",
|
|
35564
35564
|
"title": "Propose a Best-of-N Winner (Model Judgment)",
|
|
35565
|
-
"description": "Run the optional judge model over a best-of-N group's candidates and PROPOSE a winner, with reasons. The output is explicitly model judgment (scoredBy:\"model\")
|
|
35565
|
+
"description": "Run the optional judge model over a best-of-N group's candidates and PROPOSE a winner, with reasons. The output is explicitly model judgment (scoredBy:\"model\"), it never auto-picks unless the source item opted into auto-accept; a human still confirms via fleet.attempts.pick. An engine with no judge configured returns an honest 501.",
|
|
35566
35566
|
"category": "fleet",
|
|
35567
35567
|
"source": "builtin",
|
|
35568
35568
|
"access": "authenticated",
|
|
@@ -35917,7 +35917,7 @@
|
|
|
35917
35917
|
{
|
|
35918
35918
|
"id": "fleet.attempts.pick",
|
|
35919
35919
|
"title": "Pick a Best-of-N Winner",
|
|
35920
|
-
"description": "Accept one attempt as the winner of its best-of-N group: its worktree branch is merged through the existing sequential integration lane and every losing sibling's worktree is cleaned. The winner must be a held (passed) candidate of a group whose siblings are all terminal
|
|
35920
|
+
"description": "Accept one attempt as the winner of its best-of-N group: its worktree branch is merged through the existing sequential integration lane and every losing sibling's worktree is cleaned. The winner must be a held (passed) candidate of a group whose siblings are all terminal, an unknown/not-ready group or an invalid winner is an honest 409, never a partial merge.",
|
|
35921
35921
|
"category": "fleet",
|
|
35922
35922
|
"source": "builtin",
|
|
35923
35923
|
"access": "authenticated",
|
|
@@ -36359,7 +36359,7 @@
|
|
|
36359
36359
|
{
|
|
36360
36360
|
"id": "fleet.graph.get",
|
|
36361
36361
|
"title": "Get Workstream Task Graph",
|
|
36362
|
-
"description": "The dependency-graph view of one workstream: nodes (id, title, state, cluster, files, merge state, blocked reason, orphaned flag, deepest-remaining-path depth, stalled tell, agent), edges (from depends on to), and the elastic-pool state (ready/running counts, at-cap, cap key + size, any spawn refusal). Surfaces render the task graph under the chain from this
|
|
36362
|
+
"description": "The dependency-graph view of one workstream: nodes (id, title, state, cluster, files, merge state, blocked reason, orphaned flag, deepest-remaining-path depth, stalled tell, agent), edges (from depends on to), and the elastic-pool state (ready/running counts, at-cap, cap key + size, any spawn refusal). Surfaces render the task graph under the chain from this, the fleet/observability idiom. 404 when the workstream is unknown to this daemon.",
|
|
36363
36363
|
"category": "fleet",
|
|
36364
36364
|
"source": "builtin",
|
|
36365
36365
|
"access": "authenticated",
|
|
@@ -36947,7 +36947,7 @@
|
|
|
36947
36947
|
{
|
|
36948
36948
|
"id": "fleet.observed.steer",
|
|
36949
36949
|
"title": "Steer an Observed Foreign Agent",
|
|
36950
|
-
"description": "Drill-in steer of an externally-launched coding-agent session goodvibes only OBSERVES (a Claude Code / Codex process it did not spawn or host). The steer rides the foreign session's own control channel
|
|
36950
|
+
"description": "Drill-in steer of an externally-launched coding-agent session goodvibes only OBSERVES (a Claude Code / Codex process it did not spawn or host). The steer rides the foreign session's own control channel, for a tmux-hosted session, the exact three-send recipe (message text, then two Enters) targeted at its pane. queued:false with an honest reason when the row exposes no channel (no controlling terminal / no tmux pane) or a send fails. STOP is never offered on an observed row, observing and steering is not owning the lifecycle. Weighted as a drill-in capability (see the node's observed.steerDrillInOnly), never a bulk affordance.",
|
|
36951
36951
|
"category": "fleet",
|
|
36952
36952
|
"source": "builtin",
|
|
36953
36953
|
"access": "authenticated",
|
|
@@ -36996,7 +36996,7 @@
|
|
|
36996
36996
|
{
|
|
36997
36997
|
"id": "fleet.snapshot",
|
|
36998
36998
|
"title": "Fleet Snapshot",
|
|
36999
|
-
"description": "Return a point-in-time capture of every live/completed runtime process (agents, WRFC chains/subtasks, workflow FSMs/triggers/schedules, watchers, background processes) as a flat, parentId-linked node list. Capped at 2000 nodes (truncated:true + totalCount when the live fleet exceeds the cap)
|
|
36999
|
+
"description": "Return a point-in-time capture of every live/completed runtime process (agents, WRFC chains/subtasks, workflow FSMs/triggers/schedules, watchers, background processes) as a flat, parentId-linked node list. Capped at 2000 nodes (truncated:true + totalCount when the live fleet exceeds the cap), use fleet.list to page through a larger fleet.",
|
|
37000
37000
|
"category": "fleet",
|
|
37001
37001
|
"source": "builtin",
|
|
37002
37002
|
"access": "authenticated",
|
|
@@ -37896,7 +37896,7 @@
|
|
|
37896
37896
|
{
|
|
37897
37897
|
"id": "power.keepAwake.set",
|
|
37898
37898
|
"title": "Set the Owner Keep-Awake Toggle",
|
|
37899
|
-
"description": "Turn the owner keep-awake toggle on or off: a daemon-held sleep inhibitor INDEPENDENT of work state, surviving surface closes, persisted as power.keepAwake. Covers idle + sleep + lid-switch classes where grantable; the returned state names any refused class honestly. No timers, no AC-only sub-options
|
|
37899
|
+
"description": "Turn the owner keep-awake toggle on or off: a daemon-held sleep inhibitor INDEPENDENT of work state, surviving surface closes, persisted as power.keepAwake. Covers idle + sleep + lid-switch classes where grantable; the returned state names any refused class honestly. No timers, no AC-only sub-options, the always-visible chip is the safety mechanism. Emits runtime.ops OPS_POWER_STATE_CHANGED so every attached surface updates its chip.",
|
|
37900
37900
|
"category": "health",
|
|
37901
37901
|
"source": "builtin",
|
|
37902
37902
|
"access": "authenticated",
|
|
@@ -38069,7 +38069,7 @@
|
|
|
38069
38069
|
{
|
|
38070
38070
|
"id": "power.status.get",
|
|
38071
38071
|
"title": "Get Sleep-Ownership State",
|
|
38072
|
-
"description": "The host sleep-ownership state: whether the automatic work inhibitor is held (and the live \"held because X\" reasons, cap, and expiry), and the owner keep-awake toggle with the classes the OS actually granted vs refused
|
|
38072
|
+
"description": "The host sleep-ownership state: whether the automatic work inhibitor is held (and the live \"held because X\" reasons, cap, and expiry), and the owner keep-awake toggle with the classes the OS actually granted vs refused, a refused lid-switch block is stated honestly (\"idle sleep blocked; lid-close suspend is controlled by your OS here\"), never papered over. Surfaces render the always-visible \"sleep disabled\" chip from this state and the runtime.ops OPS_POWER_STATE_CHANGED event.",
|
|
38073
38073
|
"category": "health",
|
|
38074
38074
|
"source": "builtin",
|
|
38075
38075
|
"access": "authenticated",
|
|
@@ -38232,7 +38232,7 @@
|
|
|
38232
38232
|
{
|
|
38233
38233
|
"id": "voice.local.install",
|
|
38234
38234
|
"title": "Install the Managed Local-Voice Runtime",
|
|
38235
|
-
"description": "One-act setup: download + checksum-verify the piper TTS engine, a default voice, and (where a pinned goodvibes-built bundle exists) the whisper.cpp STT engine with its default model into the goodvibes-managed directory, then point the voice.local.* config keys at the managed install
|
|
38235
|
+
"description": "One-act setup: download + checksum-verify the piper TTS engine, a default voice, and (where a pinned goodvibes-built bundle exists) the whisper.cpp STT engine with its default model into the goodvibes-managed directory, then point the voice.local.* config keys at the managed install, never overwriting a key you already set to a custom value (skipped keys are reported). After this, local TTS works with zero further configuration. Downloads only when you ask; a failed or checksum-mismatched download keeps nothing.",
|
|
38236
38236
|
"category": "health",
|
|
38237
38237
|
"source": "builtin",
|
|
38238
38238
|
"access": "authenticated",
|
|
@@ -38426,7 +38426,7 @@
|
|
|
38426
38426
|
{
|
|
38427
38427
|
"id": "voice.local.status",
|
|
38428
38428
|
"title": "Get Managed Local-Voice Runtime State",
|
|
38429
|
-
"description": "Whether the managed local voice runtime (piper TTS + a default voice) is installed: not-provisioned (with a size-labeled offer), partial, provisioned, or unsupported-platform. STT (whisper.cpp) reports its own managed state: goodvibes builds and pins the whisper.cpp bundle per platform (no official prebuilt exists; provisioning never compiles on your machine), so where a pinned bundle exists STT provisions like TTS, and elsewhere it reports unsupported honestly. While a voice.local.install run is active, the response also carries installInProgress
|
|
38429
|
+
"description": "Whether the managed local voice runtime (piper TTS + a default voice) is installed: not-provisioned (with a size-labeled offer), partial, provisioned, or unsupported-platform. STT (whisper.cpp) reports its own managed state: goodvibes builds and pins the whisper.cpp bundle per platform (no official prebuilt exists; provisioning never compiles on your machine), so where a pinned bundle exists STT provisions like TTS, and elsewhere it reports unsupported honestly. While a voice.local.install run is active, the response also carries installInProgress, the live per-component progress (phase, byte sizes where known) of that run, so surfaces poll this read during the install to render real progress; the section is absent when no install is running. Read-only.",
|
|
38430
38430
|
"category": "health",
|
|
38431
38431
|
"source": "builtin",
|
|
38432
38432
|
"access": "authenticated",
|
|
@@ -38615,7 +38615,7 @@
|
|
|
38615
38615
|
{
|
|
38616
38616
|
"id": "voice.wake.model.get",
|
|
38617
38617
|
"title": "Read Wake-Word Model Bytes",
|
|
38618
|
-
"description": "Read one provisioned wake artifact in bounded chunks, for a surface that cannot fetch it itself
|
|
38618
|
+
"description": "Read one provisioned wake artifact in bounded chunks, for a surface that cannot fetch it itself, a browser tab, whose cross-origin fetch of the release asset is refused because that asset answers with no CORS header. Each chunk carries the offset, the whole artifact's size, and its PINNED sha256, so a client reassembles the file and verifies it against the pin: a truncated transfer fails at the consumer instead of loading as a model that silently never detects. Both classifier formats are served, \"classifier\" is the onnx build a browser tab loads, \"tflite\" the same classifier for a runtime that cannot, as is the speech gate voice.wake.vadThreshold runs (\"vad\"), and so is the attribution NOTICE of each redistributable artifact (\"notice\" for the classifier, \"embedding-notice\" for the front end, \"vad-notice\" for the gate), because a client that can fetch the bytes but not the NOTICE cannot satisfy the terms it received them under. Serves what is on disk and does not download; installation puts it there, and voice.wake.provision is the recovery path when it is missing.",
|
|
38619
38619
|
"category": "health",
|
|
38620
38620
|
"source": "builtin",
|
|
38621
38621
|
"access": "authenticated",
|
|
@@ -38707,7 +38707,7 @@
|
|
|
38707
38707
|
{
|
|
38708
38708
|
"id": "voice.wake.provision",
|
|
38709
38709
|
"title": "Download the Wake-Word Models",
|
|
38710
|
-
"description": "Download and checksum-verify the pinned wake-word classifier in both runtime formats (onnx and tflite), the speech-embedding front end, the speech gate voice.wake.vadThreshold runs, and the attribution NOTICE of each, into the goodvibes-managed directory
|
|
38710
|
+
"description": "Download and checksum-verify the pinned wake-word classifier in both runtime formats (onnx and tflite), the speech-embedding front end, the speech gate voice.wake.vadThreshold runs, and the attribution NOTICE of each, into the goodvibes-managed directory, about 6.1 MB. Installing goodvibes already does this, and a daemon retries at boot, so this verb is the RECOVERY path: an install that was offline, an artifact that failed verification, or a re-provision after the pinned model changes. Resumable by re-running: an artifact that already matches its pin is skipped, and one that is present but fails verification is replaced rather than used. A failed or mismatched download keeps nothing at the destination. Single-flight: two surfaces asking at once, or a boot attempt and a user asking, join one download instead of racing for the same files.",
|
|
38711
38711
|
"category": "health",
|
|
38712
38712
|
"source": "builtin",
|
|
38713
38713
|
"access": "authenticated",
|
|
@@ -38833,7 +38833,7 @@
|
|
|
38833
38833
|
{
|
|
38834
38834
|
"id": "voice.wake.status",
|
|
38835
38835
|
"title": "Get Wake-Word Model State",
|
|
38836
|
-
"description": "Whether the pinned wake-word artifacts are on disk and VERIFIED BY CONTENT: the \"hey goodvibes\" classifier, the tflite form of the same classifier, the speech-embedding front end the classifier sits behind, the speech gate voice.wake.vadThreshold runs, and the attribution NOTICE belonging to each of the three redistributable artifacts (the classifier's, the front end's and the gate's). Each reports verified, corrupt (present but failing its checksum
|
|
38836
|
+
"description": "Whether the pinned wake-word artifacts are on disk and VERIFIED BY CONTENT: the \"hey goodvibes\" classifier, the tflite form of the same classifier, the speech-embedding front end the classifier sits behind, the speech gate voice.wake.vadThreshold runs, and the attribution NOTICE belonging to each of the three redistributable artifacts (the classifier's, the front end's and the gate's). Each reports verified, corrupt (present but failing its checksum, a truncated or swapped file, distinct from missing) and its byte size, with the total a fresh provision would download. Installing goodvibes provisions these, and a daemon retries at boot whatever the install could not fetch, so on a normal machine this reads ready without anyone having run a setup command; an offline install reports not-provisioned here until it is retried. The overall ready flag covers the classifier, the front end and both of THEIR NOTICEs, an artifact whose attribution is missing is not one this daemon may serve, and excludes two things: the tflite twin, which nothing here loads, so a host missing just that can still detect; and the speech gate, reported as vadReady instead, because voice.wake.vadThreshold defaults to 0 and the detector runs without it. Also restates that the model's published recall figures are measured on synthesised speech only, which any surface describing the model must carry. Never downloads. Read-only.",
|
|
38837
38837
|
"category": "health",
|
|
38838
38838
|
"source": "builtin",
|
|
38839
38839
|
"access": "authenticated",
|
|
@@ -67852,7 +67852,7 @@
|
|
|
67852
67852
|
{
|
|
67853
67853
|
"id": "mcp.servers.reveal",
|
|
67854
67854
|
"title": "MCP Servers Reveal",
|
|
67855
|
-
"description": "Return effective MCP config with environment VALUES included, not just envKeys. Admin only
|
|
67855
|
+
"description": "Return effective MCP config with environment VALUES included, not just envKeys. Admin only, the redacted mcp.config.get view is what every other caller should use.",
|
|
67856
67856
|
"category": "mcp",
|
|
67857
67857
|
"source": "builtin",
|
|
67858
67858
|
"access": "admin",
|
|
@@ -70777,7 +70777,7 @@
|
|
|
70777
70777
|
{
|
|
70778
70778
|
"id": "memory.consolidation.receipts",
|
|
70779
70779
|
"title": "Memory Consolidation Receipts",
|
|
70780
|
-
"description": "Return the retained memory-consolidation run receipts (what each idle/scheduled pass scanned, merged, archived, decayed) and the pending judgment PROPOSALS they carry (contradictions, cross-scope duplicates)
|
|
70780
|
+
"description": "Return the retained memory-consolidation run receipts (what each idle/scheduled pass scanned, merged, archived, decayed) and the pending judgment PROPOSALS they carry (contradictions, cross-scope duplicates), the records a proposal references are already marked into the review queue, and a human resolves them through the confirmation-gated review route. A runtime without the consolidation scheduler answers an honest 501.",
|
|
70781
70781
|
"category": "memory",
|
|
70782
70782
|
"source": "builtin",
|
|
70783
70783
|
"access": "authenticated",
|
|
@@ -71350,7 +71350,7 @@
|
|
|
71350
71350
|
{
|
|
71351
71351
|
"id": "memory.projections.get",
|
|
71352
71352
|
"title": "Get Memory Projection",
|
|
71353
|
-
"description": "Return one standing record's projection by id: its metadata entry plus the exact markdown the file projection would write (front-matter + content, with the live temporal status labelled). Returns 404 when no standing (project/team) record has that id
|
|
71353
|
+
"description": "Return one standing record's projection by id: its metadata entry plus the exact markdown the file projection would write (front-matter + content, with the live temporal status labelled). Returns 404 when no standing (project/team) record has that id, a session-scope or unknown id is an honest miss, never an empty projection.",
|
|
71354
71354
|
"category": "memory",
|
|
71355
71355
|
"source": "builtin",
|
|
71356
71356
|
"access": "authenticated",
|
|
@@ -71475,7 +71475,7 @@
|
|
|
71475
71475
|
{
|
|
71476
71476
|
"id": "memory.projections.list",
|
|
71477
71477
|
"title": "List Memory Projections",
|
|
71478
|
-
"description": "Return the live projection of standing (project/team-scope) memory records
|
|
71478
|
+
"description": "Return the live projection of standing (project/team-scope) memory records, one metadata entry per record (id, filename, scope, class, summary, tags, confidence, review state, temporal validity + status), oldest first. This is the read view over the same standing memory the file projection writes as markdown; session-scope records are excluded (they are not standing memory). Computed live from the store, never read from disk, so it always matches the current records. An expired record is present with status:\"expired\" rather than silently dropped.",
|
|
71479
71479
|
"category": "memory",
|
|
71480
71480
|
"source": "builtin",
|
|
71481
71481
|
"access": "authenticated",
|
|
@@ -71829,7 +71829,7 @@
|
|
|
71829
71829
|
{
|
|
71830
71830
|
"id": "memory.records.delete",
|
|
71831
71831
|
"title": "Delete Memory Record",
|
|
71832
|
-
"description": "Permanently delete a memory record and its links from the canonical store. Delete means delete: the record is removed from the store and the semantic index, not merely flagged. Returns { deleted: false } when no record with that id existed
|
|
71832
|
+
"description": "Permanently delete a memory record and its links from the canonical store. Delete means delete: the record is removed from the store and the semantic index, not merely flagged. Returns { deleted: false } when no record with that id existed, an honest boolean, never a 200 that pretends a phantom row was removed.",
|
|
71833
71833
|
"category": "memory",
|
|
71834
71834
|
"source": "builtin",
|
|
71835
71835
|
"access": "authenticated",
|
|
@@ -72553,7 +72553,7 @@
|
|
|
72553
72553
|
{
|
|
72554
72554
|
"id": "memory.records.links.add",
|
|
72555
72555
|
"title": "Link Memory Records",
|
|
72556
|
-
"description": "Create a directed relation (e.g. \"supersedes\", \"caused\") from the path record to a target record. Returns 404 when either endpoint does not exist
|
|
72556
|
+
"description": "Create a directed relation (e.g. \"supersedes\", \"caused\") from the path record to a target record. Returns 404 when either endpoint does not exist, never a 200 that pretends a link was made between records that do not both exist.",
|
|
72557
72557
|
"category": "memory",
|
|
72558
72558
|
"source": "builtin",
|
|
72559
72559
|
"access": "authenticated",
|
|
@@ -72626,7 +72626,7 @@
|
|
|
72626
72626
|
{
|
|
72627
72627
|
"id": "memory.records.links.list",
|
|
72628
72628
|
"title": "List Memory Record Links",
|
|
72629
|
-
"description": "Return every link where the record is the source or the target. Returns 404 when no record with that id exists
|
|
72629
|
+
"description": "Return every link where the record is the source or the target. Returns 404 when no record with that id exists, an honest not-found, distinct from a record that exists but has no links (an empty array).",
|
|
72630
72630
|
"category": "memory",
|
|
72631
72631
|
"source": "builtin",
|
|
72632
72632
|
"access": "authenticated",
|
|
@@ -73438,7 +73438,7 @@
|
|
|
73438
73438
|
{
|
|
73439
73439
|
"id": "memory.records.update",
|
|
73440
73440
|
"title": "Update Memory Record",
|
|
73441
|
-
"description": "Edit a record's content fields (scope, summary, detail, tags) and its temporal validity window (validFrom, validUntil) in the canonical store. This is distinct from the review update: it changes the record itself
|
|
73441
|
+
"description": "Edit a record's content fields (scope, summary, detail, tags) and its temporal validity window (validFrom, validUntil) in the canonical store. This is distinct from the review update: it changes the record itself, e.g. moving scope project→team promotes a record to the shared surface. For validFrom/validUntil a number sets the bound, null clears it, and an omitted field leaves it unchanged, so a proposal that changes only the window can be applied. Returns 404 when no record with that id exists.",
|
|
73442
73442
|
"category": "memory",
|
|
73443
73443
|
"source": "builtin",
|
|
73444
73444
|
"access": "authenticated",
|
|
@@ -74020,7 +74020,7 @@
|
|
|
74020
74020
|
{
|
|
74021
74021
|
"id": "occasions.acknowledge",
|
|
74022
74022
|
"title": "Acknowledge An Occasion",
|
|
74023
|
-
"description": "Record that the owner has one occurrence in hand, so nothing is pushed at
|
|
74023
|
+
"description": "Record that the owner has one occurrence in hand, so nothing is pushed at them about it again. This is not a yes and not a no: the open item STAYS OPEN and stays enumerable, so occasions.pending still lists it, under acknowledged[] rather than in the nudge, and asking what is coming up still answers with it. Only the push stops. The record expires with its occurrence, so next year asks fresh. source names how it was recorded: conversation when the owner said so in a reply, explicit when a surface offered the action, gift-flow when the owner is already answering gift questions about it.",
|
|
74024
74024
|
"category": "occasions",
|
|
74025
74025
|
"source": "builtin",
|
|
74026
74026
|
"access": "authenticated",
|
|
@@ -74090,7 +74090,7 @@
|
|
|
74090
74090
|
{
|
|
74091
74091
|
"id": "occasions.answer",
|
|
74092
74092
|
"title": "Answer An Occasion Nudge",
|
|
74093
|
-
"description": "Record yes, no or later for one occurrence. A no goes silent for the rest of this cycle and expires with the date, so next year asks fresh carrying no memory of the refusal. A later is NOT a decline
|
|
74093
|
+
"description": "Record yes, no or later for one occurrence. A no goes silent for the rest of this cycle and expires with the date, so next year asks fresh carrying no memory of the refusal. A later is NOT a decline, it comes back roughly halfway to the date. A yes on a gift-giving occasion opens the short interview and returns its first question. All three RESOLVE the open item and remove it; to say only \"I have this in hand\" without ending the question, use occasions.acknowledge instead.",
|
|
74094
74094
|
"category": "occasions",
|
|
74095
74095
|
"source": "builtin",
|
|
74096
74096
|
"access": "authenticated",
|
|
@@ -74253,7 +74253,7 @@
|
|
|
74253
74253
|
{
|
|
74254
74254
|
"id": "occasions.confirm",
|
|
74255
74255
|
"title": "Record A Confirmed Important Date",
|
|
74256
|
-
"description": "Write the confirmed occasion as one line in the owner profile, under Important dates, carrying its provenance. This is the ONE confirmation: nothing re-confirms at nudge time, because for an annual date a silent write means the mistake surfaces up to eleven months later. Refused without a kind rather than defaulting one. Goes through the owner-profile write gate, so authority, surface and a verbatim quote of what
|
|
74256
|
+
"description": "Write the confirmed occasion as one line in the owner profile, under Important dates, carrying its provenance. This is the ONE confirmation: nothing re-confirms at nudge time, because for an annual date a silent write means the mistake surfaces up to eleven months later. Refused without a kind rather than defaulting one. Goes through the owner-profile write gate, so authority, surface and a verbatim quote of what the owner said are all required.",
|
|
74257
74257
|
"category": "occasions",
|
|
74258
74258
|
"source": "builtin",
|
|
74259
74259
|
"access": "authenticated",
|
|
@@ -74358,7 +74358,7 @@
|
|
|
74358
74358
|
{
|
|
74359
74359
|
"id": "occasions.conflict.resolve",
|
|
74360
74360
|
"title": "Close A Date Conflict",
|
|
74361
|
-
"description": "Stop re-raising a conflict the owner has dealt with. The conflict itself is never resolved automatically
|
|
74361
|
+
"description": "Stop re-raising a conflict the owner has dealt with. The conflict itself is never resolved automatically, two different dates for one thing means only the owner knows which was right, and silently taking the newer value is the behaviour this exists to prevent.",
|
|
74362
74362
|
"category": "occasions",
|
|
74363
74363
|
"source": "builtin",
|
|
74364
74364
|
"access": "authenticated",
|
|
@@ -74481,7 +74481,7 @@
|
|
|
74481
74481
|
{
|
|
74482
74482
|
"id": "occasions.interview.answer",
|
|
74483
74483
|
"title": "Answer A Gift Interview Question",
|
|
74484
|
-
"description": "Record one answer and return the next question, if there is one. The interview guides the owner to
|
|
74484
|
+
"description": "Record one answer and return the next question, if there is one. The interview guides the owner to their own idea and never recommends a gift, that judgement is the owner's, which is also why the outcome recorded is what the owner landed on rather than what was suggested.",
|
|
74485
74485
|
"category": "occasions",
|
|
74486
74486
|
"source": "builtin",
|
|
74487
74487
|
"access": "authenticated",
|
|
@@ -74628,7 +74628,7 @@
|
|
|
74628
74628
|
{
|
|
74629
74629
|
"id": "occasions.interview.get",
|
|
74630
74630
|
"title": "Get Gift Interview",
|
|
74631
|
-
"description": "Return one gift interview and the question that has not been answered yet. A thread the owner walked away from resumes here rather than restarting: the next step is the one
|
|
74631
|
+
"description": "Return one gift interview and the question that has not been answered yet. A thread the owner walked away from resumes here rather than restarting: the next step is the one the owner did not get to. Over a channel the steps are asked one at a time; in the agent they can be one exchange.",
|
|
74632
74632
|
"category": "occasions",
|
|
74633
74633
|
"source": "builtin",
|
|
74634
74634
|
"access": "authenticated",
|
|
@@ -74766,8 +74766,8 @@
|
|
|
74766
74766
|
},
|
|
74767
74767
|
{
|
|
74768
74768
|
"id": "occasions.interview.record",
|
|
74769
|
-
"title": "Record What
|
|
74770
|
-
"description": "Close the interview with what
|
|
74769
|
+
"title": "Record What The Owner Landed On",
|
|
74770
|
+
"description": "Close the interview with what the owner settled on and write it to the gift history. Recording the outcome rather than merely that the owner said yes is the point: \"said yes in 2026\" cannot stop year three steering where year one did.",
|
|
74771
74771
|
"category": "occasions",
|
|
74772
74772
|
"source": "builtin",
|
|
74773
74773
|
"access": "authenticated",
|
|
@@ -74910,7 +74910,7 @@
|
|
|
74910
74910
|
{
|
|
74911
74911
|
"id": "occasions.list",
|
|
74912
74912
|
"title": "List Important Dates",
|
|
74913
|
-
"description": "Return every occasion declared in the owner profile, with its next occurrence, how many days away it is, the lead it uses, whether it is inside its lead window, and what was answered for that occurrence. Also returns lines under the heading that could not be typed, each with the reason, and any occasion that has two different dates recorded. This carries the dates: it is the owner asking
|
|
74913
|
+
"description": "Return every occasion declared in the owner profile, with its next occurrence, how many days away it is, the lead it uses, whether it is inside its lead window, and what was answered for that occurrence. Also returns lines under the heading that could not be typed, each with the reason, and any occasion that has two different dates recorded. This carries the dates: it is the owner asking their own system what it holds, which is the explicit ask that unlocks a closed-tier read. A nudge never does.",
|
|
74914
74914
|
"category": "occasions",
|
|
74915
74915
|
"source": "builtin",
|
|
74916
74916
|
"access": "authenticated",
|
|
@@ -75181,7 +75181,7 @@
|
|
|
75181
75181
|
{
|
|
75182
75182
|
"id": "occasions.pending",
|
|
75183
75183
|
"title": "Pull Outstanding Occasions",
|
|
75184
|
-
"description": "Return everything unresolved, without delivering anything: the batched nudge, any date conflict still open, and any interview left mid-thread. This is how a surface that is not a push destination receives a nudge
|
|
75184
|
+
"description": "Return everything unresolved, without delivering anything: the batched nudge, any date conflict still open, and any interview left mid-thread. This is how a surface that is not a push destination receives a nudge, it pulls at the start of a turn rather than being pushed at, and a stored date is the prior scheduling that permits raising something unprompted. A nudge a push has already landed on the agent is left out while the agent is a configured push destination, so the push and the pull cannot raise the same thing twice; an item no push has ever landed there is still returned, so a missing sender or a failed send loses nothing. The nudge names the occasion and the person and NEVER the date: proximity is a word, not a count of days.",
|
|
75185
75185
|
"category": "occasions",
|
|
75186
75186
|
"source": "builtin",
|
|
75187
75187
|
"access": "authenticated",
|
|
@@ -75564,7 +75564,7 @@
|
|
|
75564
75564
|
{
|
|
75565
75565
|
"id": "occasions.plans.list",
|
|
75566
75566
|
"title": "List Plans",
|
|
75567
|
-
"description": "Return every plan declared in the owner profile
|
|
75567
|
+
"description": "Return every plan declared in the owner profile, a dated range with attributes, plus whichever one has the owner away today. Plans are ambient: they never prompt. They exist so the system knows not to suggest things into that window, and so a nudge that would land while the owner is abroad moves to the day before they leave.",
|
|
75568
75568
|
"category": "occasions",
|
|
75569
75569
|
"source": "builtin",
|
|
75570
75570
|
"access": "authenticated",
|
|
@@ -75731,7 +75731,7 @@
|
|
|
75731
75731
|
{
|
|
75732
75732
|
"id": "occasions.plans.propose",
|
|
75733
75733
|
"title": "Propose A Plan",
|
|
75734
|
-
"description": "Work out what would be written for a plan heard in conversation, and return the one-line confirmation. Writes nothing. Away is opt-in rather than assumed: \"the kitchen is being redone, 3rd to the 10th\" is a real dated range that is not
|
|
75734
|
+
"description": "Work out what would be written for a plan heard in conversation, and return the one-line confirmation. Writes nothing. Away is opt-in rather than assumed: \"the kitchen is being redone, 3rd to the 10th\" is a real dated range that is not the owner leaving the house.",
|
|
75735
75735
|
"category": "occasions",
|
|
75736
75736
|
"source": "builtin",
|
|
75737
75737
|
"access": "authenticated",
|
|
@@ -75819,7 +75819,7 @@
|
|
|
75819
75819
|
{
|
|
75820
75820
|
"id": "occasions.propose",
|
|
75821
75821
|
"title": "Propose An Important Date",
|
|
75822
|
-
"description": "Work out what would be written for a date heard in conversation, and return the one-line confirmation to put to the owner. WRITES NOTHING. When no kind was given, needsKind is true and the confirmation asks for it in the same breath
|
|
75822
|
+
"description": "Work out what would be written for a date heard in conversation, and return the one-line confirmation to put to the owner. WRITES NOTHING. When no kind was given, needsKind is true and the confirmation asks for it in the same breath, the kind is the owner's choice and is never inferred, because no rule that reads a label tells a birthday from a death anniversary. Any date already recorded for the same name that disagrees comes back in conflictsWith.",
|
|
75823
75823
|
"category": "occasions",
|
|
75824
75824
|
"source": "builtin",
|
|
75825
75825
|
"access": "authenticated",
|
|
@@ -75918,7 +75918,7 @@
|
|
|
75918
75918
|
{
|
|
75919
75919
|
"id": "occasions.remove",
|
|
75920
75920
|
"title": "Remove An Important Date",
|
|
75921
|
-
"description": "Remove one occasion and every record the machine kept against it
|
|
75921
|
+
"description": "Remove one occasion and every record the machine kept against it, answers, gift history, open items, interviews and calendar mirrors. Takes exactly one confirmation: not unquestioned, and not an argument. People divorce and people die. A confirmed:false call returns the sentence to put to the owner and removes nothing.",
|
|
75922
75922
|
"category": "occasions",
|
|
75923
75923
|
"source": "builtin",
|
|
75924
75924
|
"access": "authenticated",
|
|
@@ -75994,7 +75994,7 @@
|
|
|
75994
75994
|
{
|
|
75995
75995
|
"id": "occasions.state",
|
|
75996
75996
|
"title": "Occasions State Disclosure",
|
|
75997
|
-
"description": "What the machine-owned store is holding
|
|
75997
|
+
"description": "What the machine-owned store is holding, counts of answers, gift records, open items, interviews and calendar mirrors, plus what the last housekeeping pass removed and why, and whether the file was found unreadable. Counts and reasons only: no answer, no gift and no date is returned, which is what makes this safe in a support bundle.",
|
|
75998
75998
|
"category": "occasions",
|
|
75999
75999
|
"source": "builtin",
|
|
76000
76000
|
"access": "authenticated",
|
|
@@ -76110,7 +76110,7 @@
|
|
|
76110
76110
|
{
|
|
76111
76111
|
"id": "occasions.sweep",
|
|
76112
76112
|
"title": "Run The Approach Sweep Now",
|
|
76113
|
-
"description": "Run one pass immediately: reap expired and orphaned state, find the occasions entering their lead window, batch them into a single message, mirror to the calendar if that is on, and deliver. Delivery goes to every destination in occasions.nudgeChannel
|
|
76113
|
+
"description": "Run one pass immediately: reap expired and orphaned state, find the occasions entering their lead window, batch them into a single message, mirror to the calendar if that is on, and deliver. Delivery goes to every destination in occasions.nudgeChannel, a comma-separated list, so Telegram and the agent both get it, and each is attempted independently, with deliveries[] naming per destination what landed and what did not. Housekeeping runs first and unconditionally, so a machine with nudging turned off still reaps. Returns hold:\"quiet-hours\" or hold:\"disabled\" when it deliberately said nothing, nothing is dropped, it waits.",
|
|
76114
76114
|
"category": "occasions",
|
|
76115
76115
|
"source": "builtin",
|
|
76116
76116
|
"access": "authenticated",
|
|
@@ -76489,7 +76489,7 @@
|
|
|
76489
76489
|
{
|
|
76490
76490
|
"id": "pairing.handoff.create",
|
|
76491
76491
|
"title": "Create Pairing Hand-off",
|
|
76492
|
-
"description": "Mint a per-device token AND assemble the set-up OFFER SET this daemon can satisfy (notifications
|
|
76492
|
+
"description": "Mint a per-device token AND assemble the set-up OFFER SET this daemon can satisfy (notifications, carrying the VAPID public key; relay; passkey step-up), so a freshly-paired surface can complete them in one pass. Returns the offer set, the `#pair=<token>` deep-link fragment (the exact URL-fragment shape the web app consumes, token in `pair=`, offers in `offers=`), a full deep link when a web origin is configured, and that origin's honest TLS/capability POSTURE: the one plain-http-on-LAN notice line (stated here, never a nag) plus per-capability availability labels so surfaces render \"needs https, available via tailscale\" instead of dead buttons. The token secret is returned exactly once. Each offer is independently declinable at completion.",
|
|
76493
76493
|
"category": "pairing",
|
|
76494
76494
|
"source": "builtin",
|
|
76495
76495
|
"access": "authenticated",
|
|
@@ -76635,7 +76635,7 @@
|
|
|
76635
76635
|
{
|
|
76636
76636
|
"id": "pairing.posture.get",
|
|
76637
76637
|
"title": "Get Origin TLS/Capability Posture",
|
|
76638
|
-
"description": "The honest TLS/capability posture of a web origin
|
|
76638
|
+
"description": "The honest TLS/capability posture of a web origin, pass your surface's current origin (or omit it to read the configured web origin). Plain http on a private-network origin (LAN IP, .local, localhost) is a supported posture reported with its ONE notice line; browser-gated capabilities (service worker/PWA install, push, microphone) are each labeled available or \"needs https, available via tailscale\" so surfaces render labels instead of dead buttons. Localhost keeps all three. The daemon never mints certificates.",
|
|
76639
76639
|
"category": "pairing",
|
|
76640
76640
|
"source": "builtin",
|
|
76641
76641
|
"access": "authenticated",
|
|
@@ -76875,7 +76875,7 @@
|
|
|
76875
76875
|
{
|
|
76876
76876
|
"id": "pairing.tokens.migrate",
|
|
76877
76877
|
"title": "Migrate Off The Shared Token",
|
|
76878
|
-
"description": "A client currently authenticated with the legacy single shared token mints its OWN named per-device token and receives the plaintext secret once
|
|
76878
|
+
"description": "A client currently authenticated with the legacy single shared token mints its OWN named per-device token and receives the plaintext secret once, the honest migration path. This does NOT revoke the shared token; that is a separate explicit step (pairing.tokens.revokeShared).",
|
|
76879
76879
|
"category": "pairing",
|
|
76880
76880
|
"source": "builtin",
|
|
76881
76881
|
"access": "authenticated",
|
|
@@ -77133,7 +77133,7 @@
|
|
|
77133
77133
|
{
|
|
77134
77134
|
"id": "payments.budget.status",
|
|
77135
77135
|
"title": "Payment Budget Status",
|
|
77136
|
-
"description": "Today's spending pools: the daily item budget, the separate overage budget that covers only unavoidable charges (tax, mandatory fees, and the delivery option actually used), and the tolerance allowance. Each reports its limit, what today has spent, what purchases in flight are holding, and what is left. Includes the calendar day and the timezone it was computed in
|
|
77136
|
+
"description": "Today's spending pools: the daily item budget, the separate overage budget that covers only unavoidable charges (tax, mandatory fees, and the delivery option actually used), and the tolerance allowance. Each reports its limit, what today has spent, what purchases in flight are holding, and what is left. Includes the calendar day and the timezone it was computed in, the day resets at midnight in daemon.timezone, UTC when unset, and whether this node is the one currently allowed to spend. Totals are recomputed from each spend record's UTC instant rather than counted, so changing the timezone cannot hand back a spent budget.",
|
|
77137
77137
|
"category": "payments",
|
|
77138
77138
|
"source": "builtin",
|
|
77139
77139
|
"access": "authenticated",
|
|
@@ -77403,7 +77403,7 @@
|
|
|
77403
77403
|
{
|
|
77404
77404
|
"id": "payments.cards.delete",
|
|
77405
77405
|
"title": "Remove a Payment Card",
|
|
77406
|
-
"description": "Delete a card: its config metadata and every secret derived from its config path, reporting how many secret entries were cleared so a partial deletion is visible rather than silent. Deleting the default card leaves payments.defaultCardId empty, which refuses purchases until another card is chosen
|
|
77406
|
+
"description": "Delete a card: its config metadata and every secret derived from its config path, reporting how many secret entries were cleared so a partial deletion is visible rather than silent. Deleting the default card leaves payments.defaultCardId empty, which refuses purchases until another card is chosen, the safe direction.",
|
|
77407
77407
|
"category": "payments",
|
|
77408
77408
|
"source": "builtin",
|
|
77409
77409
|
"access": "admin",
|
|
@@ -77555,7 +77555,7 @@
|
|
|
77555
77555
|
{
|
|
77556
77556
|
"id": "payments.checkout.begin",
|
|
77557
77557
|
"title": "Buy What Is In This Checkout",
|
|
77558
|
-
"description": "Run a purchase against an open browser page, end to end: the caller reports the checkout's line items, tax, fees and delivery options AS STRINGS plus the refs of the card, address, delivery and place-order controls, and the daemon does the rest. It parses every amount into integer minor units with its own parser (refusing anything ambiguous rather than guessing), checks the cart against what was actually asked for, refuses a recurring charge, runs the taint gate, applies the daily item budget, the per-purchase ceiling and the overage pool, walks the shipping ladder down one rung at a time when the pool cannot cover the preferred tier, sends ONE notice to the configured command-authority channels and runs the window
|
|
77558
|
+
"description": "Run a purchase against an open browser page, end to end: the caller reports the checkout's line items, tax, fees and delivery options AS STRINGS plus the refs of the card, address, delivery and place-order controls, and the daemon does the rest. It parses every amount into integer minor units with its own parser (refusing anything ambiguous rather than guessing), checks the cart against what was actually asked for, refuses a recurring charge, runs the taint gate, applies the daily item budget, the per-purchase ceiling and the overage pool, walks the shipping ladder down one rung at a time when the pool cannot cover the preferred tier, sends ONE notice to the configured command-authority channels and runs the window, above budget an approval where silence denies, within budget a veto where silence proceeds, then fills the stored shipping and billing addresses, types the stored card, submits once, records the purchase, debits the budget and reports the completed purchase. Nothing here knows any merchant's markup: the caller identifies the controls on whatever page it is looking at. Every number the owner is shown is re-rendered from the integers this daemon parsed, never from merchant text, and no response field can carry card material.",
|
|
77559
77559
|
"category": "payments",
|
|
77560
77560
|
"source": "builtin",
|
|
77561
77561
|
"access": "admin",
|
|
@@ -77890,7 +77890,7 @@
|
|
|
77890
77890
|
{
|
|
77891
77891
|
"id": "payments.checkout.fillCard",
|
|
77892
77892
|
"title": "Fill the Card into a Checkout",
|
|
77893
|
-
"description": "Have the daemon type the stored card into the payment fields of an open browser page. Takes the browser session, the page, and a list of {field, ref} targets naming where each part of the card goes
|
|
77893
|
+
"description": "Have the daemon type the stored card into the payment fields of an open browser page. Takes the browser session, the page, and a list of {field, ref} targets naming where each part of the card goes, the caller identifies the fields on whatever checkout it is looking at, so the daemon needs no knowledge of any merchant. The response is the list of field NAMES that were filled plus a boolean; it never carries the value, its length, or a masked form, and a failure names the field that did not accept input rather than what was typed into it. Refused unless a purchase decision is already in flight on that exact page and the page is still on the registrable domain the purchase was decided against, so the card is typed as part of an approved checkout or not at all. Also refused when the browser has no card-material redaction installed, because a snapshot taken afterwards would otherwise hand back what was just typed.",
|
|
77894
77894
|
"category": "payments",
|
|
77895
77895
|
"source": "builtin",
|
|
77896
77896
|
"access": "admin",
|
|
@@ -78002,7 +78002,7 @@
|
|
|
78002
78002
|
{
|
|
78003
78003
|
"id": "payments.purchases.list",
|
|
78004
78004
|
"title": "List Purchases",
|
|
78005
|
-
"description": "The purchase audit ledger: what was bought, from which merchant registrable domain, how much (item, tax, fees and delivery separately), which budget pool each part drew on, which delivery tier was requested and which was actually used, whether the shipping ladder stepped it down, which window ran and how it ended, which command-authority channel answered, and the outcome. Reconcilable against a card statement. Never contains a card number, expiry or CVV. A refund is recorded here for reconciliation and credits no pool
|
|
78005
|
+
"description": "The purchase audit ledger: what was bought, from which merchant registrable domain, how much (item, tax, fees and delivery separately), which budget pool each part drew on, which delivery tier was requested and which was actually used, whether the shipping ladder stepped it down, which window ran and how it ended, which command-authority channel answered, and the outcome. Reconcilable against a card statement. Never contains a card number, expiry or CVV. A refund is recorded here for reconciliation and credits no pool, a refund on day five refilling day five would be permission to buy again that nobody granted.",
|
|
78006
78006
|
"category": "payments",
|
|
78007
78007
|
"source": "builtin",
|
|
78008
78008
|
"access": "authenticated",
|
|
@@ -78209,7 +78209,7 @@
|
|
|
78209
78209
|
{
|
|
78210
78210
|
"id": "permissions.rules.delete",
|
|
78211
78211
|
"title": "Delete a Durable Permission Rule",
|
|
78212
|
-
"description": "Delete one durable user-origin permission rule by id. The matching asks prompt again afterwards
|
|
78212
|
+
"description": "Delete one durable user-origin permission rule by id. The matching asks prompt again afterwards, deleting a grant is how a remembered decision is revoked. deleted:false when no rule with that id exists (an honest miss, not an error).",
|
|
78213
78213
|
"category": "permissions",
|
|
78214
78214
|
"source": "builtin",
|
|
78215
78215
|
"access": "authenticated",
|
|
@@ -78248,7 +78248,7 @@
|
|
|
78248
78248
|
{
|
|
78249
78249
|
"id": "permissions.rules.list",
|
|
78250
78250
|
"title": "List Durable Permission Rules",
|
|
78251
|
-
"description": "List the durable user-origin permission rules written by remembered approval decisions (exact command / command class / path scope / whole tool), newest first
|
|
78251
|
+
"description": "List the durable user-origin permission rules written by remembered approval decisions (exact command / command class / path scope / whole tool), newest first, the persistent grants and denials the permission manager consults before ever prompting. Project-scoped.",
|
|
78252
78252
|
"category": "permissions",
|
|
78253
78253
|
"source": "builtin",
|
|
78254
78254
|
"access": "authenticated",
|
|
@@ -78507,7 +78507,7 @@
|
|
|
78507
78507
|
{
|
|
78508
78508
|
"id": "principals.delete",
|
|
78509
78509
|
"title": "Delete Principal",
|
|
78510
|
-
"description": "Permanently delete a principal. Returns { deleted: false } when no principal with that id existed
|
|
78510
|
+
"description": "Permanently delete a principal. Returns { deleted: false } when no principal with that id existed, an honest boolean, never a 200 that pretends a phantom principal was removed.",
|
|
78511
78511
|
"category": "principals",
|
|
78512
78512
|
"source": "builtin",
|
|
78513
78513
|
"access": "authenticated",
|
|
@@ -78804,7 +78804,7 @@
|
|
|
78804
78804
|
{
|
|
78805
78805
|
"id": "principals.resolve",
|
|
78806
78806
|
"title": "Resolve Sender Identity",
|
|
78807
|
-
"description": "Resolve a channel-specific sender identity ({channel, value}) to the named principal it belongs to. An unmapped identity resolves to the shared unknown principal with known:false
|
|
78807
|
+
"description": "Resolve a channel-specific sender identity ({channel, value}) to the named principal it belongs to. An unmapped identity resolves to the shared unknown principal with known:false, the registry never guesses.",
|
|
78808
78808
|
"category": "principals",
|
|
78809
78809
|
"source": "builtin",
|
|
78810
78810
|
"access": "authenticated",
|
|
@@ -79238,7 +79238,7 @@
|
|
|
79238
79238
|
{
|
|
79239
79239
|
"id": "profile.forget",
|
|
79240
79240
|
"title": "Forget Profile Line",
|
|
79241
|
-
"description": "Delete a mechanical field and every retained history comment for it, or one prose line addressed by its section plus its exact text. Never by line position: the owner edits this file himself, so an index taken from an earlier read may name a different line by the time the delete arrives. Text that no longer matches removes nothing and says so, rather than deleting the nearest thing. No tombstone, no deleted flag, no retention window
|
|
79241
|
+
"description": "Delete a mechanical field and every retained history comment for it, or one prose line addressed by its section plus its exact text. Never by line position: the owner edits this file himself, so an index taken from an earlier read may name a different line by the time the delete arrives. Text that no longer matches removes nothing and says so, rather than deleting the nearest thing. No tombstone, no deleted flag, no retention window, delete means delete. Forgetting something that was not there reports that honestly instead of returning success. Authority-gated exactly like a write: an injection that cannot add a fact must not be able to remove one.",
|
|
79242
79242
|
"category": "profile",
|
|
79243
79243
|
"source": "builtin",
|
|
79244
79244
|
"access": "authenticated",
|
|
@@ -79996,7 +79996,7 @@
|
|
|
79996
79996
|
{
|
|
79997
79997
|
"id": "profile.status",
|
|
79998
79998
|
"title": "Owner Profile Status",
|
|
79999
|
-
"description": "Diagnostics for the profile: whether it loaded, the file path, the section names, line/field/prose counts, and every mechanical value that did not validate WITH ITS REASON. It never returns a value
|
|
79999
|
+
"description": "Diagnostics for the profile: whether it loaded, the file path, the section names, line/field/prose counts, and every mechanical value that did not validate WITH ITS REASON. It never returns a value, that is what makes it safe in a support bundle, and it is asserted by test. An unreadable file reports unavailable with the reason rather than an empty profile.",
|
|
80000
80000
|
"category": "profile",
|
|
80001
80001
|
"source": "builtin",
|
|
80002
80002
|
"access": "authenticated",
|
|
@@ -80177,7 +80177,7 @@
|
|
|
80177
80177
|
{
|
|
80178
80178
|
"id": "models.current.get",
|
|
80179
80179
|
"title": "Current Model",
|
|
80180
|
-
"description": "The model this daemon would use for a turn right now, with whether its provider is actually configured and by which authentication route. `model` is null when nothing is selected
|
|
80180
|
+
"description": "The model this daemon would use for a turn right now, with whether its provider is actually configured and by which authentication route. `model` is null when nothing is selected, which is a real state, not an error, and a caller rendering a picker needs to tell it from a selection whose provider has lost its credentials.",
|
|
80181
80181
|
"category": "providers",
|
|
80182
80182
|
"source": "builtin",
|
|
80183
80183
|
"access": "authenticated",
|
|
@@ -80325,7 +80325,7 @@
|
|
|
80325
80325
|
{
|
|
80326
80326
|
"id": "models.current.set",
|
|
80327
80327
|
"title": "Switch the Current Model",
|
|
80328
|
-
"description": "Switch the daemon's current model live, by the registry key `models.list` returns. The switch applies to the next turn on every surface this daemon serves and is persisted, so it survives a restart; `persisted` says whether the write to settings succeeded. An unknown key is refused with MODEL_NOT_FOUND and a provider with no usable credentials with PROVIDER_NOT_CONFIGURED, naming the environment variables it looked for
|
|
80328
|
+
"description": "Switch the daemon's current model live, by the registry key `models.list` returns. The switch applies to the next turn on every surface this daemon serves and is persisted, so it survives a restart; `persisted` says whether the write to settings succeeded. An unknown key is refused with MODEL_NOT_FOUND and a provider with no usable credentials with PROVIDER_NOT_CONFIGURED, naming the environment variables it looked for, a caller must not have to guess which of the two happened.",
|
|
80329
80329
|
"category": "providers",
|
|
80330
80330
|
"source": "builtin",
|
|
80331
80331
|
"access": "authenticated",
|
|
@@ -81597,7 +81597,7 @@
|
|
|
81597
81597
|
{
|
|
81598
81598
|
"id": "push.subscriptions.create",
|
|
81599
81599
|
"title": "Register Web Push Subscription",
|
|
81600
|
-
"description": "Store a browser Push subscription (endpoint capability URL + p256dh/auth keys) for the authenticated operator so the daemon can deliver notifications to that device. When a stable deviceId is supplied the record reconciles on that device identity
|
|
81600
|
+
"description": "Store a browser Push subscription (endpoint capability URL + p256dh/auth keys) for the authenticated operator so the daemon can deliver notifications to that device. When a stable deviceId is supplied the record reconciles on that device identity, a browser whose push endpoint rotated re-registers the same deviceId with a new endpoint and heals the one record in place rather than piling up a stale duplicate; without a deviceId it reconciles on the raw endpoint (legacy). The stored endpoint and keys are never returned over the wire; the response is the redacted subscription view.",
|
|
81601
81601
|
"category": "push",
|
|
81602
81602
|
"source": "builtin",
|
|
81603
81603
|
"access": "authenticated",
|
|
@@ -81803,7 +81803,7 @@
|
|
|
81803
81803
|
{
|
|
81804
81804
|
"id": "push.subscriptions.reconcile",
|
|
81805
81805
|
"title": "Reconcile Web Push Subscription",
|
|
81806
|
-
"description": "Reconcile-on-open: the client presents its device identity (deviceId) and its CURRENT endpoint + p256dh/auth keys, and the daemon heals the record for that device in place
|
|
81806
|
+
"description": "Reconcile-on-open: the client presents its device identity (deviceId) and its CURRENT endpoint + p256dh/auth keys, and the daemon heals the record for that device in place, updating a stale endpoint the daemon had been holding, then reports what drifted (created / endpoint-updated / keys-updated / unchanged) so the client learns whether the daemon was out of date. A live reconcile also clears the bounded-retry failure counter. The stored endpoint and keys are never returned; the response is the redacted subscription view plus the drift discriminant.",
|
|
81807
81807
|
"category": "push",
|
|
81808
81808
|
"source": "builtin",
|
|
81809
81809
|
"access": "authenticated",
|
|
@@ -81993,7 +81993,7 @@
|
|
|
81993
81993
|
{
|
|
81994
81994
|
"id": "quota.fanout.get",
|
|
81995
81995
|
"title": "Assess Fan-out Against Quota Window",
|
|
81996
|
-
"description": "Assess whether spawning N agents against a provider likely exhausts its quota window right now, grounded in observed rate-limit signals (429 retry-after, and limit/remaining when headers carry them). verdict is likely-exhausts (with the evidence it rests on
|
|
81996
|
+
"description": "Assess whether spawning N agents against a provider likely exhausts its quota window right now, grounded in observed rate-limit signals (429 retry-after, and limit/remaining when headers carry them). verdict is likely-exhausts (with the evidence it rests on, an active cooldown or an observed remaining below the fan-out), unlikely (with the evidence), or unknown when no signal has been observed, never a fabricated certainty.",
|
|
81997
81997
|
"category": "quota",
|
|
81998
81998
|
"source": "builtin",
|
|
81999
81999
|
"access": "authenticated",
|
|
@@ -82078,7 +82078,7 @@
|
|
|
82078
82078
|
{
|
|
82079
82079
|
"id": "quota.snapshot.get",
|
|
82080
82080
|
"title": "Get Observed Quota Snapshot",
|
|
82081
|
-
"description": "Return the most recent observed quota window for a provider
|
|
82081
|
+
"description": "Return the most recent observed quota window for a provider, remaining, limit, reset, and any active cooldown, parsed from rate-limit headers carried on ordinary (successful) responses, so a consumer can render remaining quota BEFORE hitting a limit. hasSignal is false (with the observed-* fields absent) when no rate-limit signal has been seen for the provider in the lookback window: an honest \"no observation\", never a fabricated full quota.",
|
|
82082
82082
|
"category": "quota",
|
|
82083
82083
|
"source": "builtin",
|
|
82084
82084
|
"access": "authenticated",
|
|
@@ -82195,7 +82195,7 @@
|
|
|
82195
82195
|
{
|
|
82196
82196
|
"id": "stepup.credentials.register",
|
|
82197
82197
|
"title": "Register Step-up Credential",
|
|
82198
|
-
"description": "Store a WebAuthn (passkey) credential for relay step-up
|
|
82198
|
+
"description": "Store a WebAuthn (passkey) credential for relay step-up, its credentialId, COSE public key, and starting signature counter, and set the deployment policy (relying-party id, allowed origins, user-verification requirement). Admin/local-only: registering a step-up credential is itself a sensitive act. Self-hosted deployments register the credential directly ('none' attestation).",
|
|
82199
82199
|
"category": "relay",
|
|
82200
82200
|
"source": "builtin",
|
|
82201
82201
|
"access": "admin",
|
|
@@ -86170,7 +86170,7 @@
|
|
|
86170
86170
|
{
|
|
86171
86171
|
"id": "tailscale.get",
|
|
86172
86172
|
"title": "Detect Tailscale Environment",
|
|
86173
|
-
"description": "READ-ONLY detection of a usable tailscale environment: binary present, logged-in status, MagicDNS name, and the https URL `tailscale serve` would yield. Never invokes a state-changing tailscale command. Where tailscale is absent the result says so once
|
|
86173
|
+
"description": "READ-ONLY detection of a usable tailscale environment: binary present, logged-in status, MagicDNS name, and the https URL `tailscale serve` would yield. Never invokes a state-changing tailscale command. Where tailscale is absent the result says so once, surfaces offer the auto-wire affordance only when this reports a usable environment; nothing nags. Includes the most recent serve receipt, if any.",
|
|
86174
86174
|
"category": "remote-access",
|
|
86175
86175
|
"source": "builtin",
|
|
86176
86176
|
"access": "authenticated",
|
|
@@ -86238,7 +86238,7 @@
|
|
|
86238
86238
|
{
|
|
86239
86239
|
"id": "tailscale.serve.run",
|
|
86240
86240
|
"title": "Set Up Tailscale Serve For The Daemon",
|
|
86241
|
-
"description": "The one-action https affordance: run `tailscale serve --bg <web port>` so tailscale fronts the daemon's web surface at its https MagicDNS URL. This is the ONLY state-changing tailscale command the daemon ever runs, and only from this explicit user-initiated verb. The attempt is recorded with an honest receipt either way; on success web.publicBaseUrl is updated to the https URL from the same resolution. The daemon never mints certificates
|
|
86241
|
+
"description": "The one-action https affordance: run `tailscale serve --bg <web port>` so tailscale fronts the daemon's web surface at its https MagicDNS URL. This is the ONLY state-changing tailscale command the daemon ever runs, and only from this explicit user-initiated verb. The attempt is recorded with an honest receipt either way; on success web.publicBaseUrl is updated to the https URL from the same resolution. The daemon never mints certificates, TLS is terminated by tailscale.",
|
|
86242
86242
|
"category": "remote-access",
|
|
86243
86243
|
"source": "builtin",
|
|
86244
86244
|
"access": "authenticated",
|
|
@@ -86360,7 +86360,7 @@
|
|
|
86360
86360
|
{
|
|
86361
86361
|
"id": "rewind.apply",
|
|
86362
86362
|
"title": "Apply a Unified Rewind",
|
|
86363
|
-
"description": "Apply a unified rewind to a session turn anchor, restoring files and/or conversation. DESTRUCTIVE: requires confirmation
|
|
86363
|
+
"description": "Apply a unified rewind to a session turn anchor, restoring files and/or conversation. DESTRUCTIVE: requires confirmation, either the confirmToken minted by rewind.plan (single-use, ~2 min) or confirm:true. Called without either, it returns a non-error refusal (refused:true) naming rewind.plan, never a silent no-op; a bad token is a 400. Every apply records an undo point (the workspace restore takes a pre-restore safety checkpoint; the conversation store captures its pre-rewind snapshot) so the rewind is itself reversible, and returns a receipt whose `undo` block carries how to reverse it. Emits a REWIND_APPLIED receipt event.",
|
|
86364
86364
|
"category": "rewind",
|
|
86365
86365
|
"source": "builtin",
|
|
86366
86366
|
"access": "authenticated",
|
|
@@ -86638,7 +86638,7 @@
|
|
|
86638
86638
|
{
|
|
86639
86639
|
"id": "rewind.conversation.host.register",
|
|
86640
86640
|
"title": "Offer This Surface's Live Conversation for Rewind",
|
|
86641
|
-
"description": "Register the conversation this surface is running for a session, so a conversation-scope rewind of it can actually be served. Only the process holding the messages can count or drop them: without this, rewind.plan for a session hosted anywhere but the daemon reports the conversation half unavailable, and files rewind is unaffected either way. Re-registering with the hostId returned here RENEWS the offer; registering without one claims the session and replaces whoever held it, answering that surface's outstanding requests as unavailable. The registration is a lease, not a reservation
|
|
86641
|
+
"description": "Register the conversation this surface is running for a session, so a conversation-scope rewind of it can actually be served. Only the process holding the messages can count or drop them: without this, rewind.plan for a session hosted anywhere but the daemon reports the conversation half unavailable, and files rewind is unaffected either way. Re-registering with the hostId returned here RENEWS the offer; registering without one claims the session and replaces whoever held it, answering that surface's outstanding requests as unavailable. The registration is a lease, not a reservation, it lapses unless the surface keeps taking its requests, and nothing about it survives a daemon restart, because a claim about a live process is worthless once the process on either end may be gone.",
|
|
86642
86642
|
"category": "rewind",
|
|
86643
86643
|
"source": "builtin",
|
|
86644
86644
|
"access": "authenticated",
|
|
@@ -86723,7 +86723,7 @@
|
|
|
86723
86723
|
{
|
|
86724
86724
|
"id": "rewind.conversation.host.release",
|
|
86725
86725
|
"title": "Withdraw a Conversation Rewind Offer",
|
|
86726
|
-
"description": "Withdraw this surface's offer to serve a session's conversation
|
|
86726
|
+
"description": "Withdraw this surface's offer to serve a session's conversation, when the session ends, or the surface is going away. Outstanding requests put to it are answered unavailable rather than left to time out. Only the registered host may release its own session; anyone else is refused.",
|
|
86727
86727
|
"category": "rewind",
|
|
86728
86728
|
"source": "builtin",
|
|
86729
86729
|
"access": "authenticated",
|
|
@@ -86855,7 +86855,7 @@
|
|
|
86855
86855
|
{
|
|
86856
86856
|
"id": "rewind.conversation.requests.answer",
|
|
86857
86857
|
"title": "Answer a Conversation Rewind Request",
|
|
86858
|
-
"description": "Report what this surface found or did. Which fields are expected follows from the REQUEST, which already says whether it was a preview or a rewind
|
|
86858
|
+
"description": "Report what this surface found or did. Which fields are expected follows from the REQUEST, which already says whether it was a preview or a rewind, an answer that restated that could only disagree with it, silently. For a preview: messagesToDrop and messagesRemaining. For a rewind: droppedMessages and the undoSnapshotId that restores them. For either, a non-empty unavailableReason instead, which is the honest answer when the conversation is gone or this surface cannot serve it, and saying so beats staying silent, because silence becomes a timeout and a timed-out rewind cannot tell whether the messages were dropped. Only the surface a request was put to may answer it.",
|
|
86859
86859
|
"category": "rewind",
|
|
86860
86860
|
"source": "builtin",
|
|
86861
86861
|
"access": "authenticated",
|
|
@@ -86953,7 +86953,7 @@
|
|
|
86953
86953
|
{
|
|
86954
86954
|
"id": "rewind.conversation.requests.take",
|
|
86955
86955
|
"title": "Take Conversation Rewind Requests",
|
|
86956
|
-
"description": "Collect the conversation questions waiting for this host
|
|
86956
|
+
"description": "Collect the conversation questions waiting for this host, how many messages a rewind to an anchor would drop, or a request to actually drop them, and renew its lease, because a surface that is polling is a surface that is alive. With nothing waiting, pass waitMs to hold the call open until something arrives; an empty result is a normal answer, not an error. Answer each request with rewind.conversation.requests.answer before its expiresAt, or the caller waiting on it is told, honestly, that this surface did not answer in time.",
|
|
86957
86957
|
"category": "rewind",
|
|
86958
86958
|
"source": "builtin",
|
|
86959
86959
|
"access": "authenticated",
|
|
@@ -87066,7 +87066,7 @@
|
|
|
87066
87066
|
{
|
|
87067
87067
|
"id": "rewind.plan",
|
|
87068
87068
|
"title": "Preview a Unified Rewind",
|
|
87069
|
-
"description": "Dry-run preview of a unified rewind to a session turn anchor: exactly what restoring files (the nearest workspace checkpoint), conversation (truncating session state to the anchor), or both would change, and a short-lived single-use confirm token authorizing the matching rewind.apply. Read-only
|
|
87069
|
+
"description": "Dry-run preview of a unified rewind to a session turn anchor: exactly what restoring files (the nearest workspace checkpoint), conversation (truncating session state to the anchor), or both would change, and a short-lived single-use confirm token authorizing the matching rewind.apply. Read-only, nothing is changed. A part with no store wired on this runtime is reported unavailable in a warning, never faked.",
|
|
87070
87070
|
"category": "rewind",
|
|
87071
87071
|
"source": "builtin",
|
|
87072
87072
|
"access": "authenticated",
|
|
@@ -87703,7 +87703,7 @@
|
|
|
87703
87703
|
{
|
|
87704
87704
|
"id": "routes.bindings.update",
|
|
87705
87705
|
"title": "Update Route Binding",
|
|
87706
|
-
"description": "Update an existing route binding. (Renamed from routes.bindings.patch in the 1.0.0 core-verb rename
|
|
87706
|
+
"description": "Update an existing route binding. (Renamed from routes.bindings.patch in the 1.0.0 core-verb rename, canonical verb is update, not patch.)",
|
|
87707
87707
|
"category": "routes",
|
|
87708
87708
|
"source": "builtin",
|
|
87709
87709
|
"access": "admin",
|
|
@@ -88243,7 +88243,7 @@
|
|
|
88243
88243
|
{
|
|
88244
88244
|
"id": "devices.artifacts.list",
|
|
88245
88245
|
"title": "List Retained Device Captures",
|
|
88246
|
-
"description": "The camera and screen captures still inside their retention window, newest first, with when each was captured, when it will be deleted, and the reason the request stated. Expired captures are never listed
|
|
88246
|
+
"description": "The camera and screen captures still inside their retention window, newest first, with when each was captured, when it will be deleted, and the reason the request stated. Expired captures are never listed, retention is enforced by the store, not by this verb filtering them out of a longer list.",
|
|
88247
88247
|
"category": "runtime",
|
|
88248
88248
|
"source": "builtin",
|
|
88249
88249
|
"access": "authenticated",
|
|
@@ -88343,7 +88343,7 @@
|
|
|
88343
88343
|
{
|
|
88344
88344
|
"id": "devices.artifacts.read",
|
|
88345
88345
|
"title": "Read a Retained Device Capture",
|
|
88346
|
-
"description": "Return one retained capture's bytes, base64-encoded, for a caller that is not running on the daemon host and so cannot open the file itself. The store re-hashes the bytes against the digest recorded when the capture was retained and refuses to serve a mismatch, so a torn or half-written file is never handed back as if it were the picture that was taken. A capture that is gone
|
|
88346
|
+
"description": "Return one retained capture's bytes, base64-encoded, for a caller that is not running on the daemon host and so cannot open the file itself. The store re-hashes the bytes against the digest recorded when the capture was retained and refuses to serve a mismatch, so a torn or half-written file is never handed back as if it were the picture that was taken. A capture that is gone, expired, swept, missing, or corrupted, is an honest 404 naming which of those it was.",
|
|
88347
88347
|
"category": "runtime",
|
|
88348
88348
|
"source": "builtin",
|
|
88349
88349
|
"access": "authenticated",
|
|
@@ -88436,7 +88436,7 @@
|
|
|
88436
88436
|
{
|
|
88437
88437
|
"id": "devices.capability.request",
|
|
88438
88438
|
"title": "Request a Capability From a Paired Device",
|
|
88439
|
-
"description": "Ask one paired device node for one capability
|
|
88439
|
+
"description": "Ask one paired device node for one capability, a photo, a screen capture, a location fix, its clipboard, a notification, a link to open, a buzz, and return what came back. The reason is required and is shown VERBATIM on the confirmation prompt, so the person deciding sees what the caller said it was for. Every gate lives in the daemon-owned device runtime and this verb re-decides none of them: a durable grant is re-read from disk (never cached), a request with no grant asks the person on whatever surface they are looking at, a capability turned off by configuration is refused with the configuration key that turned it off, and a capture is retained under the configured retention window and disclosed. A refusal is returned as ok:false with the reason and a machine-readable refusal code, it is an answer, not an error. A capability that produces a capture returns an artifact REFERENCE; fetch the bytes with devices.artifacts.read.",
|
|
88440
88440
|
"category": "runtime",
|
|
88441
88441
|
"source": "builtin",
|
|
88442
88442
|
"access": "authenticated",
|
|
@@ -88641,7 +88641,7 @@
|
|
|
88641
88641
|
{
|
|
88642
88642
|
"id": "devices.grants.list",
|
|
88643
88643
|
"title": "List Device Capability Grants",
|
|
88644
|
-
"description": "The durable \"always allow\" grants a person gave, per capability and per device, with when each was granted, when it expires, and how often it has been used
|
|
88644
|
+
"description": "The durable \"always allow\" grants a person gave, per capability and per device, with when each was granted, when it expires, and how often it has been used, plus the recent ledger of grants given, used, revoked, and expired.",
|
|
88645
88645
|
"category": "runtime",
|
|
88646
88646
|
"source": "builtin",
|
|
88647
88647
|
"access": "authenticated",
|
|
@@ -91147,7 +91147,7 @@
|
|
|
91147
91147
|
{
|
|
91148
91148
|
"id": "sessions.changes.get",
|
|
91149
91149
|
"title": "Get Session Workspace Changes",
|
|
91150
|
-
"description": "Return the aggregate workspace file changes a session made, joined over its sessionId-stamped checkpoints: the net diff (files, unified diff, --stat) from the state before the session's earliest checkpoint to its latest. A session with no stamped checkpoints returns checkpointCount:0 with an empty diff (from/to:\"EMPTY\")
|
|
91150
|
+
"description": "Return the aggregate workspace file changes a session made, joined over its sessionId-stamped checkpoints: the net diff (files, unified diff, --stat) from the state before the session's earliest checkpoint to its latest. A session with no stamped checkpoints returns checkpointCount:0 with an empty diff (from/to:\"EMPTY\"), an honest \"nothing recorded\", not an error.",
|
|
91151
91151
|
"category": "sessions",
|
|
91152
91152
|
"source": "builtin",
|
|
91153
91153
|
"access": "authenticated",
|
|
@@ -91677,7 +91677,7 @@
|
|
|
91677
91677
|
{
|
|
91678
91678
|
"id": "sessions.delete",
|
|
91679
91679
|
"title": "Delete Shared Session",
|
|
91680
|
-
"description": "Permanently remove a shared session record and its queued inputs/messages from the home-scoped store. A distinct, explicit hard-delete verb
|
|
91680
|
+
"description": "Permanently remove a shared session record and its queued inputs/messages from the home-scoped store. A distinct, explicit hard-delete verb, NEVER triggered by close; closed sessions stay listable (includeClosed) and deletionRetentionMs semantics for non-deleted records are untouched. Requires the session to already be closed: deleting a still-active session is rejected with 409 SESSION_ACTIVE (close it, then delete). An unknown or already-deleted id is a 404 SESSION_NOT_FOUND, never a 200-noop. Emits control.session_update (session-deleted) so subscribers drop the row live.",
|
|
91681
91681
|
"category": "sessions",
|
|
91682
91682
|
"source": "builtin",
|
|
91683
91683
|
"access": "authenticated",
|
|
@@ -92843,7 +92843,7 @@
|
|
|
92843
92843
|
{
|
|
92844
92844
|
"id": "sessions.hosted.attach",
|
|
92845
92845
|
"title": "Attach to a Daemon-Hosted Session",
|
|
92846
|
-
"description": "Join a hosted session and receive its transcript so far, so a client that was never connected
|
|
92846
|
+
"description": "Join a hosted session and receive its transcript so far, so a client that was never connected, or one reconnecting after the daemon restarted, renders what it missed instead of an empty screen. A session restored from disk has its loop rebuilt on this call, with a system line in the transcript stating that its in-flight turn did not survive the restart. Live output continues on the `turn` and `tools` event domains, filtered on this session id. Attaching is what keeps a `kill`-policy session alive: the policy is applied when the LAST client detaches. An attachment carries a LEASE, `hostedSessions.attachmentTtlMs`, ten minutes by default, or `leaseMs` for this attachment alone, because a client that crashed or closed its tab never calls detach, and a claim nothing expires would hold a kill-policy session open forever. Calling attach again with the same `clientId` renews it, and a client whose control-plane connection is still open renews automatically, so an attached client watching a long turn in silence is never reaped. When the last attachment lapses the session is treated as detached and its policy decides. ws-only invoke verb; no REST binding.",
|
|
92847
92847
|
"category": "sessions",
|
|
92848
92848
|
"source": "builtin",
|
|
92849
92849
|
"access": "authenticated",
|
|
@@ -93012,7 +93012,7 @@
|
|
|
93012
93012
|
{
|
|
93013
93013
|
"id": "sessions.hosted.create",
|
|
93014
93014
|
"title": "Create a Daemon-Hosted Session",
|
|
93015
|
-
"description": "Compose a full conversation loop INSIDE the daemon for a workspace: the same orchestrator, tool registry and permission gate a terminal runs, hosted here so the conversation does not depend on the client that started it staying open. `workspaceRoot` must be absolute
|
|
93015
|
+
"description": "Compose a full conversation loop INSIDE the daemon for a workspace: the same orchestrator, tool registry and permission gate a terminal runs, hosted here so the conversation does not depend on the client that started it staying open. `workspaceRoot` must be absolute, a relative path would resolve against the daemon's own directory, which is never what the caller meant. `modelId` is resolved against this daemon's live model registry when given, so an unknown or ambiguous id is refused here rather than at the first turn; omitted, the session follows the daemon's current selection. `detachPolicy` overrides the `hostedSessions.detachPolicy` setting for this session alone. `initialPrompt` is submitted as the first user message and the call does NOT wait for that turn, watch the `turn` and `tools` event domains filtered on the returned session id. Refused with the live count and the setting named when `hostedSessions.maxSessions` is already reached. ws-only invoke verb; no REST binding.",
|
|
93016
93016
|
"category": "sessions",
|
|
93017
93017
|
"source": "builtin",
|
|
93018
93018
|
"access": "authenticated",
|
|
@@ -93165,7 +93165,7 @@
|
|
|
93165
93165
|
{
|
|
93166
93166
|
"id": "sessions.hosted.detach",
|
|
93167
93167
|
"title": "Detach from a Daemon-Hosted Session",
|
|
93168
|
-
"description": "Leave a hosted session. When other clients are still attached, nothing else happens. When this was the LAST client, the effective detach policy decides: `kill` (the default, and what closing a client has always done) terminates the session with the reason `detached`; `survive` leaves it idle and reattachable. The policy is the session's own override when it was created with one and the `hostedSessions.detachPolicy` setting otherwise, and the returned record says which applied and what the session now is
|
|
93168
|
+
"description": "Leave a hosted session. When other clients are still attached, nothing else happens. When this was the LAST client, the effective detach policy decides: `kill` (the default, and what closing a client has always done) terminates the session with the reason `detached`; `survive` leaves it idle and reattachable. The policy is the session's own override when it was created with one and the `hostedSessions.detachPolicy` setting otherwise, and the returned record says which applied and what the session now is, never a guess by the caller. ws-only invoke verb; no REST binding.",
|
|
93169
93169
|
"category": "sessions",
|
|
93170
93170
|
"source": "builtin",
|
|
93171
93171
|
"access": "authenticated",
|
|
@@ -93302,7 +93302,7 @@
|
|
|
93302
93302
|
{
|
|
93303
93303
|
"id": "sessions.hosted.kill",
|
|
93304
93304
|
"title": "End a Daemon-Hosted Session",
|
|
93305
|
-
"description": "End a hosted session regardless of who is attached or what its detach policy says: the in-flight turn is interrupted, its loop is taken apart, its workspace floor is released when it was the last session using it, and the record is kept
|
|
93305
|
+
"description": "End a hosted session regardless of who is attached or what its detach policy says: the in-flight turn is interrupted, its loop is taken apart, its workspace floor is released when it was the last session using it, and the record is kept, terminated, with the reason `killed`, until `hostedSessions.terminatedRetentionMs` retires it. Killing an already-terminated session returns that record unchanged rather than reporting an error for work that is already done. ws-only invoke verb; no REST binding.",
|
|
93306
93306
|
"category": "sessions",
|
|
93307
93307
|
"source": "builtin",
|
|
93308
93308
|
"access": "authenticated",
|
|
@@ -93436,7 +93436,7 @@
|
|
|
93436
93436
|
{
|
|
93437
93437
|
"id": "sessions.hosted.list",
|
|
93438
93438
|
"title": "List Daemon-Hosted Sessions",
|
|
93439
|
-
"description": "Every session this daemon hosts, most recently updated first. Terminated sessions are excluded unless `includeTerminated` is set
|
|
93439
|
+
"description": "Every session this daemon hosts, most recently updated first. Terminated sessions are excluded unless `includeTerminated` is set, they are kept, with the reason they ended, until the retention window retires them, so a session that stopped can be asked about instead of having simply vanished. Each record carries the policy that would apply on the next detach, so a client can show what leaving will do before it leaves. ws-only invoke verb; no REST binding.",
|
|
93440
93440
|
"category": "sessions",
|
|
93441
93441
|
"source": "builtin",
|
|
93442
93442
|
"access": "authenticated",
|
|
@@ -93833,7 +93833,7 @@
|
|
|
93833
93833
|
{
|
|
93834
93834
|
"id": "sessions.inputs.deliver",
|
|
93835
93835
|
"title": "Mark Shared Session Input Delivered",
|
|
93836
|
-
"description": "A live registered surface reports that it collected a queued input (moves it to `delivered`) or finished acting on it (`consumed:true` moves it to `completed`). This is how a surface-managed session
|
|
93836
|
+
"description": "A live registered surface reports that it collected a queued input (moves it to `delivered`) or finished acting on it (`consumed:true` moves it to `completed`). This is how a surface-managed session, where steer/follow-up inputs queue for the surface rather than spawn a daemon executor, closes the input lifecycle honestly. Only queued/delivered inputs advance; others are returned unchanged. `agentId` names the agent the surface is running for this input: it binds the reply so a message that arrived over a channel gets its answer routed back to that conversation, the same binding the daemon makes for the executors it spawns itself. `answer` (sent with `consumed:true`, optionally with `status`) is the output that agent finished with, the daemon writes it into the session and delivers it to the channel.",
|
|
93837
93837
|
"category": "sessions",
|
|
93838
93838
|
"source": "builtin",
|
|
93839
93839
|
"access": "authenticated",
|
|
@@ -95905,7 +95905,7 @@
|
|
|
95905
95905
|
{
|
|
95906
95906
|
"id": "sessions.queuedMessages.delete",
|
|
95907
95907
|
"title": "Delete a Queued Mid-Turn Message",
|
|
95908
|
-
"description": "Remove a message still waiting in the mid-turn queue so it is never delivered. A message already delivered to the model cannot be removed
|
|
95908
|
+
"description": "Remove a message still waiting in the mid-turn queue so it is never delivered. A message already delivered to the model cannot be removed, deleting it is a 404 MESSAGE_NOT_QUEUED. Only the daemon's live local runtime session is controllable; any other session id is a 404 SESSION_NOT_LOCAL.",
|
|
95909
95909
|
"category": "sessions",
|
|
95910
95910
|
"source": "builtin",
|
|
95911
95911
|
"access": "authenticated",
|
|
@@ -95964,7 +95964,7 @@
|
|
|
95964
95964
|
{
|
|
95965
95965
|
"id": "sessions.queuedMessages.edit",
|
|
95966
95966
|
"title": "Edit a Queued Mid-Turn Message",
|
|
95967
|
-
"description": "Replace the text of a message still waiting in the mid-turn queue. A message already delivered to the model is immutable
|
|
95967
|
+
"description": "Replace the text of a message still waiting in the mid-turn queue. A message already delivered to the model is immutable, editing it is a 404 MESSAGE_NOT_QUEUED. Editing replaces any multimodal content with the new plain text. Only the daemon's live local runtime session is controllable; any other session id is a 404 SESSION_NOT_LOCAL.",
|
|
95968
95968
|
"category": "sessions",
|
|
95969
95969
|
"source": "builtin",
|
|
95970
95970
|
"access": "authenticated",
|
|
@@ -96095,7 +96095,7 @@
|
|
|
96095
96095
|
{
|
|
96096
96096
|
"id": "sessions.register",
|
|
96097
96097
|
"title": "Register Shared Session",
|
|
96098
|
-
"description": "Idempotently register (or heartbeat) a session keyed on a caller-supplied id, carrying its kind, project, and participant identity. Re-calling with the same id advances the participant lastSeenAt (heartbeat). Registering against a CLOSED session does NOT silently reopen it
|
|
96098
|
+
"description": "Idempotently register (or heartbeat) a session keyed on a caller-supplied id, carrying its kind, project, and participant identity. Re-calling with the same id advances the participant lastSeenAt (heartbeat). Registering against a CLOSED session does NOT silently reopen it, the heartbeat is recorded and the still-closed record is returned with reopened=false and conflict={status:closed}; pass reopen=true to reopen. A titled session is never renamed by the heartbeat. An unknown kind is rejected (400), not coerced. Prefer this over sessions.create for external runtimes that own their session id.",
|
|
96099
96099
|
"category": "sessions",
|
|
96100
96100
|
"source": "builtin",
|
|
96101
96101
|
"access": "authenticated",
|
|
@@ -96560,7 +96560,7 @@
|
|
|
96560
96560
|
{
|
|
96561
96561
|
"id": "sessions.search",
|
|
96562
96562
|
"title": "Search Shared Sessions",
|
|
96563
|
-
"description": "Paginated, filtered query over shared sessions: free-text query (matches id/title), project, kind, surfaceKind, and status. Closed sessions are EXCLUDED by default
|
|
96563
|
+
"description": "Paginated, filtered query over shared sessions: free-text query (matches id/title), project, kind, surfaceKind, and status. Closed sessions are EXCLUDED by default, pass includeClosed:true to include them, and a returned closed session always carries an honest status:\"closed\" (never hidden, never relabeled). Cursor pagination returns disjoint pages that union to the full matching set.",
|
|
96564
96564
|
"category": "sessions",
|
|
96565
96565
|
"source": "builtin",
|
|
96566
96566
|
"access": "authenticated",
|
|
@@ -97419,7 +97419,7 @@
|
|
|
97419
97419
|
{
|
|
97420
97420
|
"id": "sessions.toolCalls.cancel",
|
|
97421
97421
|
"title": "Cancel One In-Flight Tool Call",
|
|
97422
|
-
"description": "Cancel a single running tool call by its callId, leaving the turn and any other running calls untouched. The cancelled call settles as a structured \"cancelled by user\" tool result the model adapts to in the same turn
|
|
97422
|
+
"description": "Cancel a single running tool call by its callId, leaving the turn and any other running calls untouched. The cancelled call settles as a structured \"cancelled by user\" tool result the model adapts to in the same turn, distinct from a whole-turn interrupt. Only the daemon's live local runtime session is controllable; any other session id is a 404 SESSION_NOT_LOCAL, and an unknown or already-settled callId is a 404 TOOL_CALL_NOT_RUNNING.",
|
|
97423
97423
|
"category": "sessions",
|
|
97424
97424
|
"source": "builtin",
|
|
97425
97425
|
"access": "authenticated",
|
|
@@ -97960,7 +97960,7 @@
|
|
|
97960
97960
|
{
|
|
97961
97961
|
"id": "skills.create",
|
|
97962
97962
|
"title": "Create Skill",
|
|
97963
|
-
"description": "Create a new skill from a name, one-line description, and Markdown body (plus optional frontmatter metadata). Fails with a conflict when a skill of that name already exists
|
|
97963
|
+
"description": "Create a new skill from a name, one-line description, and Markdown body (plus optional frontmatter metadata). Fails with a conflict when a skill of that name already exists, use skills.update to change an existing one.",
|
|
97964
97964
|
"category": "skills",
|
|
97965
97965
|
"source": "builtin",
|
|
97966
97966
|
"access": "authenticated",
|
|
@@ -98095,7 +98095,7 @@
|
|
|
98095
98095
|
{
|
|
98096
98096
|
"id": "skills.delete",
|
|
98097
98097
|
"title": "Delete Skill",
|
|
98098
|
-
"description": "Permanently delete a skill. Delete means delete: the document is removed, not tombstoned. Returns { deleted: false } when no skill with that name existed
|
|
98098
|
+
"description": "Permanently delete a skill. Delete means delete: the document is removed, not tombstoned. Returns { deleted: false } when no skill with that name existed, an honest boolean, never a 200 that pretends a phantom skill was removed.",
|
|
98099
98099
|
"category": "skills",
|
|
98100
98100
|
"source": "builtin",
|
|
98101
98101
|
"access": "authenticated",
|
|
@@ -98239,7 +98239,7 @@
|
|
|
98239
98239
|
{
|
|
98240
98240
|
"id": "skills.list",
|
|
98241
98241
|
"title": "List Skills",
|
|
98242
|
-
"description": "Return the index line (name, description, metadata) of every skill in the canonical store. Progressive disclosure: bodies are never returned here
|
|
98242
|
+
"description": "Return the index line (name, description, metadata) of every skill in the canonical store. Progressive disclosure: bodies are never returned here, call skills.get for the one skill you decide to open.",
|
|
98243
98243
|
"category": "skills",
|
|
98244
98244
|
"source": "builtin",
|
|
98245
98245
|
"access": "authenticated",
|
|
@@ -104430,7 +104430,7 @@
|
|
|
104430
104430
|
{
|
|
104431
104431
|
"id": "watchers.update",
|
|
104432
104432
|
"title": "Update Watcher",
|
|
104433
|
-
"description": "Update an existing watcher. (Renamed from watchers.patch in the 1.0.0 core-verb rename
|
|
104433
|
+
"description": "Update an existing watcher. (Renamed from watchers.patch in the 1.0.0 core-verb rename, canonical verb is update, not patch.)",
|
|
104434
104434
|
"category": "watchers",
|
|
104435
104435
|
"source": "builtin",
|
|
104436
104436
|
"access": "admin",
|
|
@@ -105088,7 +105088,7 @@
|
|
|
105088
105088
|
{
|
|
105089
105089
|
"id": "workspaces.registrations.add",
|
|
105090
105090
|
"title": "Register a Workspace",
|
|
105091
|
-
"description": "Register a workspace root so the whole subtree beneath it is covered. Refuses an absurdly broad root (the home directory, the filesystem root, or the daemon state directory) with a 400
|
|
105091
|
+
"description": "Register a workspace root so the whole subtree beneath it is covered. Refuses an absurdly broad root (the home directory, the filesystem root, or the daemon state directory) with a 400, coverage flows down the entire subtree, so a root that broad would sweep far more than a project. Idempotent: re-registering the same normalized root returns alreadyRegistered:true. Registering a root clears any remembered decline recorded at exactly that root.",
|
|
105092
105092
|
"category": "workspaces",
|
|
105093
105093
|
"source": "builtin",
|
|
105094
105094
|
"access": "authenticated",
|
|
@@ -105249,7 +105249,7 @@
|
|
|
105249
105249
|
{
|
|
105250
105250
|
"id": "workspaces.registrations.remove",
|
|
105251
105251
|
"title": "Unregister a Workspace",
|
|
105252
|
-
"description": "Remove a registered workspace root. Returns { removed: false } when no root with that normalized path was registered
|
|
105252
|
+
"description": "Remove a registered workspace root. Returns { removed: false } when no root with that normalized path was registered, an honest boolean, never a 200 that pretends a phantom root was removed.",
|
|
105253
105253
|
"category": "workspaces",
|
|
105254
105254
|
"source": "builtin",
|
|
105255
105255
|
"access": "authenticated",
|
|
@@ -105297,7 +105297,7 @@
|
|
|
105297
105297
|
{
|
|
105298
105298
|
"id": "workspaces.resolve",
|
|
105299
105299
|
"title": "Resolve Workspace Coverage",
|
|
105300
|
-
"description": "Resolve a path against the registry: covered (by which nearest registered root), declined (at which root), or unknown. Coverage flows DOWN a registered root's subtree and is inherited through the git worktree→main-repo link
|
|
105300
|
+
"description": "Resolve a path against the registry: covered (by which nearest registered root), declined (at which root), or unknown. Coverage flows DOWN a registered root's subtree and is inherited through the git worktree→main-repo link, a linked worktree outside any registered root still resolves to the main repo's registration. When mainWorktreeRoot is omitted the daemon probes the link itself. Read-only.",
|
|
105301
105301
|
"category": "workspaces",
|
|
105302
105302
|
"source": "builtin",
|
|
105303
105303
|
"access": "authenticated",
|
|
@@ -105936,7 +105936,7 @@
|
|
|
105936
105936
|
{
|
|
105937
105937
|
"id": "runtime.config",
|
|
105938
105938
|
"title": "config Domain Events",
|
|
105939
|
-
"description": "Key-level settings-change notices (CONFIG_KEY_CHANGED), carrying the dotted key, its ownership scope (daemon/client/user) and the new value
|
|
105939
|
+
"description": "Key-level settings-change notices (CONFIG_KEY_CHANGED), carrying the dotted key, its ownership scope (daemon/client/user) and the new value, EXCEPT for a secret-bearing key, which travels by name only with secret:true and no value field at all. The poll-free counterpart to config.get for a client whose settings live in the daemon: an in-process ConfigManager.subscribe cannot see a write that happened on another machine, so a client without this stream keeps running on whatever it read at startup.",
|
|
105940
105940
|
"category": "runtime-domain",
|
|
105941
105941
|
"source": "builtin",
|
|
105942
105942
|
"transport": [
|
|
@@ -106080,7 +106080,7 @@
|
|
|
106080
106080
|
{
|
|
106081
106081
|
"id": "runtime.fleet",
|
|
106082
106082
|
"title": "fleet Domain Events",
|
|
106083
|
-
"description": "Live process-registry node lifecycle events (started, state-changed, finished, blocked-on-user, unblocked)
|
|
106083
|
+
"description": "Live process-registry node lifecycle events (started, state-changed, finished, blocked-on-user, unblocked), the poll-free counterpart to fleet.snapshot.",
|
|
106084
106084
|
"category": "runtime-domain",
|
|
106085
106085
|
"source": "builtin",
|
|
106086
106086
|
"transport": [
|
|
@@ -107136,7 +107136,7 @@
|
|
|
107136
107136
|
{
|
|
107137
107137
|
"id": "control.approval_update",
|
|
107138
107138
|
"title": "Approval Record Update",
|
|
107139
|
-
"description": "Every approval record transition, pushed the moment the broker records it: an ask RAISED (status pending
|
|
107139
|
+
"description": "Every approval record transition, pushed the moment the broker records it: an ask RAISED (status pending, this is the prompt arriving), claimed by a surface, approved, denied, cancelled, expired, or updated in place (a started fix session stamped onto an accepted offer). The payload is the whole `approval` record plus the `createdAt` of the notice, so a subscriber renders the prompt from the event and never needs a follow-up read to draw it. This is the channel that makes approvals.raise usable from a surface that is not in the daemon process: raise returns the pending record and the DECISION arrives here, so a client gets keystroke-fast prompt delivery instead of polling approvals.list on a timer. Domain-tagged `permissions` (gateway-scope-enforcement.ts EVENT_DOMAIN), so a client that opened the stream with ?domains=… must include `permissions` to receive it; a client that opted into no domain narrowing receives it as before. The record is the daemon's, not the subscriber's: several surfaces see the same transition and the daemon remains the single source of the applied result, a surface renders what the record says rather than what it locally decided.",
|
|
107140
107140
|
"category": "transport",
|
|
107141
107141
|
"source": "builtin",
|
|
107142
107142
|
"transport": [
|
|
@@ -107639,7 +107639,7 @@
|
|
|
107639
107639
|
{
|
|
107640
107640
|
"id": "control.hosted_session_update",
|
|
107641
107641
|
"title": "Hosted Session Lifecycle Update",
|
|
107642
|
-
"description": "Every lifecycle transition of a session whose loop runs INSIDE the daemon: created, attached, detached, turn started, turn ended, terminated, and restored after a restart. The payload carries the whole hosted-session record plus the transition name, the client it is about (attach/detach) and a short detail
|
|
107642
|
+
"description": "Every lifecycle transition of a session whose loop runs INSIDE the daemon: created, attached, detached, turn started, turn ended, terminated, and restored after a restart. The payload carries the whole hosted-session record plus the transition name, the client it is about (attach/detach) and a short detail, so a subscriber renders the change from the event and needs no follow-up read. This channel is LIFECYCLE ONLY. The turn itself, streamed tokens, tool calls, tool results, turn transitions, is already on the `turn` and `tools` runtime domains, stamped with the hosted session id, because a hosted session runs the ordinary orchestrator; a client watches those exactly as it does for a local session and filters on the id it was handed. A second copy of that stream is not published here. Domain-tagged `session`, so a client narrowing with ?domains=… must include `session` to receive it. The record is the daemon's: `effectiveDetachPolicy` says what leaving would do right now, and `terminatedReason` says why a session ended, a hosted session never simply disappears.",
|
|
107643
107643
|
"category": "transport",
|
|
107644
107644
|
"source": "builtin",
|
|
107645
107645
|
"transport": [
|
|
@@ -107825,7 +107825,7 @@
|
|
|
107825
107825
|
{
|
|
107826
107826
|
"id": "control.session_update",
|
|
107827
107827
|
"title": "Session Lifecycle Update",
|
|
107828
|
-
"description": "Shared-session lifecycle broadcast. Every session created / closed / deleted / reopened / agent-bound / agent-completed / message-appended / message-forwarded / route-attached and every input & follow-up lifecycle transition is published on the single `session-update` wire event; the specific lifecycle name is the discriminated `payload.event` field. Cross-surface invalidation mapping (webui/TUI): created ⇐ session-created; updated ⇐ session-message-appended / session-agent-completed / session-route-attached / session-reopened; steered ⇐ session-input-delivered / session-message-forwarded; closed ⇐ session-closed; deleted ⇐ session-deleted (a hard removal
|
|
107828
|
+
"description": "Shared-session lifecycle broadcast. Every session created / closed / deleted / reopened / agent-bound / agent-completed / message-appended / message-forwarded / route-attached and every input & follow-up lifecycle transition is published on the single `session-update` wire event; the specific lifecycle name is the discriminated `payload.event` field. Cross-surface invalidation mapping (webui/TUI): created ⇐ session-created; updated ⇐ session-message-appended / session-agent-completed / session-route-attached / session-reopened; steered ⇐ session-input-delivered / session-message-forwarded; closed ⇐ session-closed; deleted ⇐ session-deleted (a hard removal, the record is gone, not merely closed). Domain-tagged `session` (gateway-scope-enforcement.ts EVENT_DOMAIN), the same tag control.hosted_session_update carries: both are session lifecycle, so a client that narrows with ?domains=… must include `session` to receive EITHER of them, and one that opted into no narrowing receives both. It is dropped entirely when the control-plane-gateway flag is turned off (no phantom buffering).",
|
|
107829
107829
|
"category": "transport",
|
|
107830
107830
|
"source": "builtin",
|
|
107831
107831
|
"transport": [
|