@skrr-ai/cli 0.1.110 → 0.1.111
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/bin/run.js +15 -1
- package/dist/base-command.d.ts +31 -3
- package/dist/base-command.js +136 -22
- package/dist/commands/actions/list.js +2 -1
- package/dist/commands/agenda/trigger/create.js +1 -1
- package/dist/commands/agenda/trigger/list.js +2 -1
- package/dist/commands/agent-groups/list.js +2 -1
- package/dist/commands/agents/actions/list.js +2 -1
- package/dist/commands/agents/always-on/status.js +5 -0
- package/dist/commands/agents/chat.js +4 -1
- package/dist/commands/agents/duplicate.js +4 -0
- package/dist/commands/agents/eval/list.js +2 -1
- package/dist/commands/agents/files/list.js +2 -1
- package/dist/commands/agents/folders/list.js +2 -1
- package/dist/commands/agents/goals/list.js +2 -1
- package/dist/commands/agents/intuitions/list.js +8 -5
- package/dist/commands/agents/list.d.ts +12 -0
- package/dist/commands/agents/list.js +45 -8
- package/dist/commands/agents/releases/known-issues/list.js +2 -1
- package/dist/commands/agents/releases/list.js +5 -1
- package/dist/commands/agents/releases/trusted-publishers/list.js +2 -1
- package/dist/commands/agents/roles/list.js +2 -1
- package/dist/commands/agents/skills/list.js +2 -1
- package/dist/commands/agents/todos/list.js +2 -1
- package/dist/commands/agents/triggers/list.js +2 -1
- package/dist/commands/api-keys/list.js +2 -1
- package/dist/commands/apps/channel.d.ts +20 -0
- package/dist/commands/apps/channel.js +64 -0
- package/dist/commands/apps/check-draft.d.ts +12 -0
- package/dist/commands/apps/check-draft.js +41 -0
- package/dist/commands/apps/check.d.ts +42 -0
- package/dist/commands/apps/check.js +91 -0
- package/dist/commands/apps/create.d.ts +15 -0
- package/dist/commands/apps/create.js +59 -0
- package/dist/commands/apps/data/put.d.ts +18 -0
- package/dist/commands/apps/data/put.js +72 -0
- package/dist/commands/apps/data/query.d.ts +20 -0
- package/dist/commands/apps/data/query.js +88 -0
- package/dist/commands/apps/disclosure.d.ts +16 -0
- package/dist/commands/apps/disclosure.js +71 -0
- package/dist/commands/apps/file/cat.d.ts +15 -0
- package/dist/commands/apps/file/cat.js +50 -0
- package/dist/commands/apps/file/ls.d.ts +13 -0
- package/dist/commands/apps/file/ls.js +47 -0
- package/dist/commands/apps/file/mv.d.ts +15 -0
- package/dist/commands/apps/file/mv.js +49 -0
- package/dist/commands/apps/file/rm.d.ts +15 -0
- package/dist/commands/apps/file/rm.js +53 -0
- package/dist/commands/apps/file/write.d.ts +17 -0
- package/dist/commands/apps/file/write.js +81 -0
- package/dist/commands/apps/install.d.ts +19 -0
- package/dist/commands/apps/install.js +136 -0
- package/dist/commands/apps/installations/list.d.ts +11 -0
- package/dist/commands/apps/installations/list.js +49 -0
- package/dist/commands/apps/installations/show.d.ts +12 -0
- package/dist/commands/apps/installations/show.js +61 -0
- package/dist/commands/apps/layout/set.d.ts +11 -0
- package/dist/commands/apps/layout/set.js +125 -0
- package/dist/commands/apps/layout/show.d.ts +9 -0
- package/dist/commands/apps/layout/show.js +33 -0
- package/dist/commands/apps/list.d.ts +10 -0
- package/dist/commands/apps/list.js +45 -0
- package/dist/commands/apps/logs.d.ts +13 -0
- package/dist/commands/apps/logs.js +55 -0
- package/dist/commands/apps/preview.d.ts +12 -0
- package/dist/commands/apps/preview.js +39 -0
- package/dist/commands/apps/publish/propose.d.ts +14 -0
- package/dist/commands/apps/publish/propose.js +45 -0
- package/dist/commands/apps/pull.d.ts +14 -0
- package/dist/commands/apps/pull.js +56 -0
- package/dist/commands/apps/push.d.ts +15 -0
- package/dist/commands/apps/push.js +75 -0
- package/dist/commands/apps/reconsent.d.ts +13 -0
- package/dist/commands/apps/reconsent.js +67 -0
- package/dist/commands/apps/report.d.ts +20 -0
- package/dist/commands/apps/report.js +63 -0
- package/dist/commands/apps/resume.d.ts +12 -0
- package/dist/commands/apps/resume.js +36 -0
- package/dist/commands/apps/settings/set.d.ts +13 -0
- package/dist/commands/apps/settings/set.js +54 -0
- package/dist/commands/apps/settings/show.d.ts +11 -0
- package/dist/commands/apps/settings/show.js +31 -0
- package/dist/commands/apps/show.d.ts +12 -0
- package/dist/commands/apps/show.js +49 -0
- package/dist/commands/apps/suspend.d.ts +12 -0
- package/dist/commands/apps/suspend.js +35 -0
- package/dist/commands/apps/uninstall.d.ts +13 -0
- package/dist/commands/apps/uninstall.js +43 -0
- package/dist/commands/apps/upgrade.d.ts +14 -0
- package/dist/commands/apps/upgrade.js +49 -0
- package/dist/commands/apps/version/create.d.ts +14 -0
- package/dist/commands/apps/version/create.js +53 -0
- package/dist/commands/apps/version/show.d.ts +12 -0
- package/dist/commands/apps/version/show.js +39 -0
- package/dist/commands/apps/versions.d.ts +12 -0
- package/dist/commands/apps/versions.js +40 -0
- package/dist/commands/apps/webhooks/list.d.ts +12 -0
- package/dist/commands/apps/webhooks/list.js +47 -0
- package/dist/commands/characters/list.js +2 -1
- package/dist/commands/chats/files/list.js +2 -1
- package/dist/commands/chats/folders/list.js +2 -1
- package/dist/commands/chats/list.js +2 -1
- package/dist/commands/chats/spaces/list.js +2 -1
- package/dist/commands/chats/widgets/list.js +2 -1
- package/dist/commands/code/jobs/list.js +4 -1
- package/dist/commands/commerce/incidents/list.js +2 -1
- package/dist/commands/commitments/accounting.js +3 -0
- package/dist/commands/commitments/action-proposals.d.ts +8 -0
- package/dist/commands/commitments/action-proposals.js +17 -2
- package/dist/commands/commitments/cost.d.ts +11 -0
- package/dist/commands/commitments/cost.js +25 -0
- package/dist/commands/commitments/create.js +6 -1
- package/dist/commands/commitments/endpoints/list.js +2 -1
- package/dist/commands/commitments/links/list.js +2 -1
- package/dist/commands/commitments/list.js +2 -1
- package/dist/commands/commitments/liveness.d.ts +30 -0
- package/dist/commands/commitments/liveness.js +22 -5
- package/dist/commands/commitments/pack/list.js +2 -1
- package/dist/commands/commitments/preflight.js +6 -2
- package/dist/commands/commitments/update.js +10 -1
- package/dist/commands/compass/list.js +2 -1
- package/dist/commands/context.js +7 -1
- package/dist/commands/convos/list.js +3 -2
- package/dist/commands/dm/list.js +2 -1
- package/dist/commands/dm/work.d.ts +19 -0
- package/dist/commands/dm/work.js +54 -0
- package/dist/commands/feeds/list.js +2 -1
- package/dist/commands/followups/list.js +2 -1
- package/dist/commands/followups/plans/cancel.d.ts +13 -0
- package/dist/commands/followups/plans/cancel.js +26 -0
- package/dist/commands/followups/plans/create.d.ts +11 -0
- package/dist/commands/followups/plans/create.js +35 -0
- package/dist/commands/followups/plans/list.d.ts +13 -0
- package/dist/commands/followups/plans/list.js +50 -0
- package/dist/commands/followups/plans/observability.d.ts +11 -0
- package/dist/commands/followups/plans/observability.js +46 -0
- package/dist/commands/followups/plans/revise.d.ts +13 -0
- package/dist/commands/followups/plans/revise.js +35 -0
- package/dist/commands/followups/plans/show.d.ts +11 -0
- package/dist/commands/followups/plans/show.js +32 -0
- package/dist/commands/goals/key-results/list.js +2 -1
- package/dist/commands/goals/labels/list.js +3 -2
- package/dist/commands/goals/list.js +3 -2
- package/dist/commands/grants/list.js +2 -1
- package/dist/commands/harnesses/grants/list.js +2 -1
- package/dist/commands/harnesses/leases/list.js +2 -1
- package/dist/commands/harnesses/list.js +10 -1
- package/dist/commands/ingress/list.js +2 -1
- package/dist/commands/initiatives/list.js +2 -1
- package/dist/commands/instruction-blocks/list.js +2 -1
- package/dist/commands/instructions/list.js +2 -1
- package/dist/commands/integrations/connections/list.js +2 -1
- package/dist/commands/integrations/tools/list.js +2 -1
- package/dist/commands/labels/list.js +3 -2
- package/dist/commands/learning/adapters.d.ts +16 -0
- package/dist/commands/learning/adapters.js +44 -0
- package/dist/commands/machines/dedicated/list.js +2 -1
- package/dist/commands/machines/hosted/list.js +2 -1
- package/dist/commands/machines/list.js +2 -1
- package/dist/commands/machines/show.js +5 -2
- package/dist/commands/measures/list.js +2 -1
- package/dist/commands/memory/list.js +2 -1
- package/dist/commands/memory/proposals/list.js +2 -1
- package/dist/commands/memory/stores/list.js +2 -1
- package/dist/commands/memory/topics/list.js +2 -1
- package/dist/commands/memory/versions/list.js +2 -1
- package/dist/commands/messages/list.js +2 -1
- package/dist/commands/northstars/intents/list.js +2 -1
- package/dist/commands/northstars/list.js +2 -1
- package/dist/commands/northstars/recommendations/list.js +2 -1
- package/dist/commands/outbox/list.js +2 -1
- package/dist/commands/profiles/list.js +2 -1
- package/dist/commands/projects/docs/list.js +8 -1
- package/dist/commands/projects/updates/list.js +2 -1
- package/dist/commands/proposals/list.js +2 -1
- package/dist/commands/requests/comments/list.js +2 -1
- package/dist/commands/requests/list.js +2 -1
- package/dist/commands/shares/list.js +2 -1
- package/dist/commands/shortcuts/list.js +2 -1
- package/dist/commands/signals/monitors/list.js +2 -1
- package/dist/commands/signals/schemas/list.js +2 -1
- package/dist/commands/signals/sources/list.js +2 -1
- package/dist/commands/space-directory-views/list.js +2 -1
- package/dist/commands/spaces/actions/list.js +4 -3
- package/dist/commands/spaces/briefs/list.js +2 -1
- package/dist/commands/spaces/cycles/list.js +2 -1
- package/dist/commands/spaces/files/folders/list.js +2 -1
- package/dist/commands/spaces/files/list.js +3 -2
- package/dist/commands/spaces/heartbeats/list.js +3 -2
- package/dist/commands/spaces/labels/list.js +3 -2
- package/dist/commands/spaces/list.d.ts +3 -18
- package/dist/commands/spaces/list.js +28 -35
- package/dist/commands/spaces/live/cards/list.js +2 -1
- package/dist/commands/spaces/members/list.d.ts +1 -0
- package/dist/commands/spaces/members/list.js +4 -1
- package/dist/commands/spaces/show.js +2 -2
- package/dist/commands/spaces/skills/list.js +6 -2
- package/dist/commands/spaces/states/list.js +2 -1
- package/dist/commands/spaces/views/list.js +2 -1
- package/dist/commands/spaces/widgets/list.js +3 -2
- package/dist/commands/spaces/workflow-templates/list.js +2 -1
- package/dist/commands/spaces/workflows/fixtures/list.js +2 -1
- package/dist/commands/spaces/workflows/list.js +3 -2
- package/dist/commands/spaces/workflows/proposals/list.js +2 -1
- package/dist/commands/spaces/workflows/triggers/list.js +2 -1
- package/dist/commands/store/acquisitions/list.js +2 -1
- package/dist/commands/store/admissions/list.js +17 -1
- package/dist/commands/store/advisories/list.js +2 -1
- package/dist/commands/store/follows/list.js +2 -1
- package/dist/commands/store/publishers/domains/list.js +2 -1
- package/dist/commands/store/reports/list.js +2 -1
- package/dist/commands/subscriptions/list.js +2 -1
- package/dist/commands/tasks/actionability.js +7 -30
- package/dist/commands/tasks/activity.js +3 -7
- package/dist/commands/tasks/approvals/list.js +2 -1
- package/dist/commands/tasks/assign.d.ts +1 -0
- package/dist/commands/tasks/assign.js +43 -7
- package/dist/commands/tasks/attachments/list.js +2 -1
- package/dist/commands/tasks/chat/send.js +34 -0
- package/dist/commands/tasks/comments/add.js +6 -1
- package/dist/commands/tasks/comments/list.js +2 -1
- package/dist/commands/tasks/complete.js +26 -2
- package/dist/commands/tasks/continue.d.ts +18 -0
- package/dist/commands/tasks/continue.js +54 -0
- package/dist/commands/tasks/create-tree.d.ts +5 -0
- package/dist/commands/tasks/create-tree.js +399 -219
- package/dist/commands/tasks/create.d.ts +1 -0
- package/dist/commands/tasks/create.js +63 -11
- package/dist/commands/tasks/deliverable/add.js +10 -3
- package/dist/commands/tasks/deliverable/list.js +2 -1
- package/dist/commands/tasks/events/list.js +2 -1
- package/dist/commands/tasks/execution-state.d.ts +12 -0
- package/dist/commands/tasks/execution-state.js +28 -0
- package/dist/commands/tasks/expectations/assess.js +40 -5
- package/dist/commands/tasks/guide.d.ts +10 -0
- package/dist/commands/tasks/guide.js +20 -0
- package/dist/commands/tasks/labels/list.js +2 -1
- package/dist/commands/tasks/list.d.ts +19 -0
- package/dist/commands/tasks/list.js +97 -4
- package/dist/commands/tasks/move.js +10 -2
- package/dist/commands/tasks/preflight.d.ts +14 -0
- package/dist/commands/tasks/preflight.js +77 -0
- package/dist/commands/tasks/resource/list.js +2 -1
- package/dist/commands/tasks/result/submit.js +10 -1
- package/dist/commands/tasks/review.js +6 -1
- package/dist/commands/tasks/revisions.d.ts +2 -0
- package/dist/commands/tasks/revisions.js +8 -1
- package/dist/commands/tasks/show.js +17 -11
- package/dist/commands/tasks/start.d.ts +1 -0
- package/dist/commands/tasks/start.js +35 -0
- package/dist/commands/tasks/templates/list.js +2 -1
- package/dist/commands/tasks/timeline.d.ts +5 -0
- package/dist/commands/tasks/timeline.js +9 -1
- package/dist/commands/tasks/update.d.ts +1 -0
- package/dist/commands/tasks/update.js +25 -2
- package/dist/commands/tasks/updates/add.js +6 -1
- package/dist/commands/tasks/updates/list.js +2 -1
- package/dist/commands/tasks/upsert.d.ts +1 -0
- package/dist/commands/tasks/upsert.js +8 -1
- package/dist/commands/token/list.js +2 -1
- package/dist/commands/tokens/list.js +2 -1
- package/dist/commands/tones/list.js +4 -2
- package/dist/commands/triggers/list.js +2 -1
- package/dist/commands/views/list.js +2 -1
- package/dist/commands/webhooks/list.js +2 -1
- package/dist/commands/whoami.js +1 -1
- package/dist/commands/widgets/list.js +2 -1
- package/dist/commands/widgets/save-as-app.d.ts +13 -0
- package/dist/commands/widgets/save-as-app.js +65 -0
- package/dist/commands/work-views/list.js +2 -1
- package/dist/commands/worklog/list.js +2 -1
- package/dist/commands/workspaces/list.js +3 -2
- package/dist/commands/workspaces/members.d.ts +1 -0
- package/dist/commands/workspaces/members.js +5 -2
- package/dist/generated/managed-instruction-guides.json +2 -2
- package/dist/help.js +7 -0
- package/dist/lib/agent-proactive-baseline.d.ts +9 -0
- package/dist/lib/agent-proactive-baseline.js +44 -0
- package/dist/lib/agentic-stream.d.ts +4 -1
- package/dist/lib/agentic-stream.js +29 -4
- package/dist/lib/appData.d.ts +75 -0
- package/dist/lib/appData.js +274 -0
- package/dist/lib/appInstallations.d.ts +117 -0
- package/dist/lib/appInstallations.js +960 -0
- package/dist/lib/appSettings.d.ts +3 -0
- package/dist/lib/appSettings.js +71 -0
- package/dist/lib/appWebhooks.d.ts +7 -0
- package/dist/lib/appWebhooks.js +59 -0
- package/dist/lib/apps-command.d.ts +44 -0
- package/dist/lib/apps-command.js +164 -0
- package/dist/lib/apps.d.ts +45 -0
- package/dist/lib/apps.js +148 -0
- package/dist/lib/appsCheck.d.ts +12 -0
- package/dist/lib/appsCheck.js +173 -0
- package/dist/lib/appsFs.d.ts +58 -0
- package/dist/lib/appsFs.js +384 -0
- package/dist/lib/auth-failure.d.ts +20 -0
- package/dist/lib/auth-failure.js +40 -3
- package/dist/lib/cli-installers.d.ts +9 -2
- package/dist/lib/command-miss.js +107 -0
- package/dist/lib/commitment-loop-status.js +25 -3
- package/dist/lib/commitments.d.ts +44 -3
- package/dist/lib/commitments.js +107 -9
- package/dist/lib/compasses.d.ts +4 -0
- package/dist/lib/compasses.js +11 -0
- package/dist/lib/daemon-setup.js +7 -7
- package/dist/lib/daemonHandoff.js +3 -2
- package/dist/lib/dedicated-ssh.d.ts +2 -0
- package/dist/lib/dedicated-ssh.js +98 -28
- package/dist/lib/json-output.d.ts +33 -0
- package/dist/lib/json-output.js +37 -0
- package/dist/lib/list-output.d.ts +9 -4
- package/dist/lib/list-output.js +36 -9
- package/dist/lib/lookbackPlans.d.ts +13 -0
- package/dist/lib/lookbackPlans.js +68 -0
- package/dist/lib/machines.d.ts +27 -6
- package/dist/lib/machines.js +25 -14
- package/dist/lib/member-output.d.ts +20 -0
- package/dist/lib/member-output.js +57 -0
- package/dist/lib/preflight-copy.d.ts +7 -0
- package/dist/lib/preflight-copy.js +31 -0
- package/dist/lib/roles.d.ts +2 -2
- package/dist/lib/task-admission.d.ts +9 -0
- package/dist/lib/task-admission.js +35 -0
- package/dist/lib/task-batch.d.ts +4 -0
- package/dist/lib/task-batch.js +2 -0
- package/dist/lib/task-operations.d.ts +25 -0
- package/dist/lib/task-operations.js +123 -0
- package/dist/lib/task-preflight.d.ts +35 -0
- package/dist/lib/task-preflight.js +121 -0
- package/dist/lib/task-resource-references.d.ts +23 -0
- package/dist/lib/task-resource-references.js +119 -0
- package/dist/lib/task-spec-verification.d.ts +42 -0
- package/dist/lib/task-spec-verification.js +101 -0
- package/dist/lib/task-work.d.ts +11 -0
- package/dist/lib/task-work.js +41 -0
- package/dist/lib/task-write-attribution.d.ts +26 -0
- package/dist/lib/task-write-attribution.js +47 -0
- package/dist/lib/tasks.d.ts +13 -0
- package/dist/lib/tasks.js +61 -8
- package/dist/lib/triggers.d.ts +7 -0
- package/dist/lib/triggers.js +54 -4
- package/dist/lib/usage-discovery.d.ts +4 -0
- package/dist/lib/usage-discovery.js +14 -4
- package/dist/lib/widgetApps.d.ts +10 -0
- package/dist/lib/widgetApps.js +47 -0
- package/dist/lib/widgetStaticScan.js +25 -1
- package/dist/lib/workspaces.d.ts +11 -4
- package/dist/lib/workspaces.js +7 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/computerWire.d.ts +14 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/computerWire.js +47 -2
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonToolApproval.d.ts +49 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonToolApproval.js +26 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonWire.d.ts +118 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonWire.js +614 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refresh.d.ts +2 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refresh.js +15 -2
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refreshClassification.d.ts +5 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refreshClassification.js +3 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/sessionRevocation.d.ts +177 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/sessionRevocation.js +484 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/telemetryRedaction.d.ts +11 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/telemetryRedaction.js +46 -7
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/toolApprovalSignature.d.ts +232 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/toolApprovalSignature.js +372 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/types.d.ts +17 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/types.js +12 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/computerWire.d.ts +14 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/computerWire.js +45 -2
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonToolApproval.d.ts +49 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonToolApproval.js +24 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonWire.d.ts +118 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonWire.js +608 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refresh.d.ts +2 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refresh.js +15 -2
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refreshClassification.d.ts +5 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refreshClassification.js +3 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/sessionRevocation.d.ts +177 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/sessionRevocation.js +472 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/telemetryRedaction.d.ts +11 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/telemetryRedaction.js +44 -6
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/toolApprovalSignature.d.ts +232 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/toolApprovalSignature.js +360 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/types.d.ts +17 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/types.js +12 -1
- package/dist/node_modules/@skrr-ai/auth-core/package.json +30 -0
- package/dist/node_modules/@skrr-ai/data-provider/index.js +25239 -18730
- package/docs/v1/operations.md +52 -0
- package/docs/v1/space-search.md +19 -0
- package/oclif.manifest.json +4719 -479
- package/package.json +23 -2
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { createPublicKey, sign as signEd25519, verify as verifyEd25519, } from 'node:crypto';
|
|
2
|
+
import { ATTESTED_TOOL_APPROVAL_TTL_MS, canonicalApprovalJson, canonicalToolInputDigest, verifyAttestedToolApproval, verifyAttestedToolApprovalClaims, } from './daemonToolApproval.js';
|
|
3
|
+
/**
|
|
4
|
+
* Platform-signed tool approvals (OSK-16614) — attestation v2.
|
|
5
|
+
*
|
|
6
|
+
* v1 (`daemonToolApproval.ts`) is a plain JSON object whose authority is the
|
|
7
|
+
* channel it arrived on. That stops the MODEL approving itself, and nothing
|
|
8
|
+
* else: anything that can put a `daemon:tool:request` on the daemon's channel
|
|
9
|
+
* — a websocket or SSE layer bug, a relay, the Redis pub/sub bridge the
|
|
10
|
+
* request crosses, an injected event, a peer holding a stolen daemon session
|
|
11
|
+
* — can approve any `manual`-category call by writing the field.
|
|
12
|
+
*
|
|
13
|
+
* v2 is `{v: 2, payload, kid, sig}`: an Ed25519 signature by a platform
|
|
14
|
+
* approval key over the canonical JSON `payload`, which carries the v1 claims
|
|
15
|
+
* plus the `daemonId` and `sessionId` it was minted for. The daemon verifies
|
|
16
|
+
* it against a keyset it PINNED outside the approval decision (fetched over
|
|
17
|
+
* authenticated HTTPS, TOFU, per server origin) and that only changes through
|
|
18
|
+
* a keyset signed by a key it already trusts.
|
|
19
|
+
*
|
|
20
|
+
* What it stops: every writer to the channel that cannot reach the signing
|
|
21
|
+
* key. What it does NOT stop: a fully compromised API host with access to the
|
|
22
|
+
* key, or server code that mints without a person having answered — the key
|
|
23
|
+
* says "the platform says a person approved this call", not that one did.
|
|
24
|
+
* Only an approval signed by the approving person's own device closes that,
|
|
25
|
+
* and that is the long-term target this format is shaped for (a second key
|
|
26
|
+
* class in the same keyset), not something it claims today.
|
|
27
|
+
*
|
|
28
|
+
* Pure: node:crypto only, no schema library (auth-core is schema-free), no
|
|
29
|
+
* I/O. Where the keyset is stored and how it is fetched is the daemon's
|
|
30
|
+
* (`daemon/src/permissions/approval-keyset.ts`); where the private key lives
|
|
31
|
+
* is the server's (`api/server/utils/toolApprovalSigning.js`).
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* Announced by a daemon that holds a pinned approval keyset and therefore
|
|
35
|
+
* verifies v2. The daemon announces it ONLY while pinned — positive
|
|
36
|
+
* withholding on its side too — and the server mints v2 only for a daemon
|
|
37
|
+
* that announced it, v1 otherwise.
|
|
38
|
+
*/
|
|
39
|
+
export const TOOL_APPROVAL_SIGNED_CAPABILITY = 'tool_approval_signed_v1';
|
|
40
|
+
/**
|
|
41
|
+
* Domain separation: the signed bytes are prefixed, so a signature made for
|
|
42
|
+
* an attestation can never verify as a keyset or vice versa, whatever JSON
|
|
43
|
+
* either happens to contain.
|
|
44
|
+
*/
|
|
45
|
+
const ATTESTATION_SIGNING_DOMAIN = 'skrr-tool-approval-v2\n';
|
|
46
|
+
const KEYSET_SIGNING_DOMAIN = 'skrr-tool-approval-keyset-v1\n';
|
|
47
|
+
/** A key id: short, printable, and safe to put in a log line. */
|
|
48
|
+
const KID_PATTERN = /^[A-Za-z0-9._-]{1,64}$/;
|
|
49
|
+
/** Bounds on untrusted wire input, so a hostile document cannot cost much. */
|
|
50
|
+
const MAX_PAYLOAD_BYTES = 4096;
|
|
51
|
+
const MAX_KEYSET_BYTES = 16 * 1024;
|
|
52
|
+
const MAX_KEYSET_KEYS = 16;
|
|
53
|
+
const MAX_KEYSET_SIGNATURES = 16;
|
|
54
|
+
/** Derive the wire public key from a private (or public) Ed25519 KeyObject. */
|
|
55
|
+
export function approvalPublicKeyFromKeyObject(kid, key) {
|
|
56
|
+
const publicKey = key.type === 'private' ? createPublicKey(key) : key;
|
|
57
|
+
const der = publicKey.export({ format: 'der', type: 'spki' });
|
|
58
|
+
return { kid, publicKeySpkiB64: Buffer.from(der).toString('base64') };
|
|
59
|
+
}
|
|
60
|
+
function ed25519PublicKey(publicKeySpkiB64) {
|
|
61
|
+
try {
|
|
62
|
+
const key = createPublicKey({
|
|
63
|
+
key: Buffer.from(publicKeySpkiB64, 'base64'),
|
|
64
|
+
format: 'der',
|
|
65
|
+
type: 'spki',
|
|
66
|
+
});
|
|
67
|
+
return key.asymmetricKeyType === 'ed25519' ? key : null;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function verifySignature(domain, message, sigB64, key) {
|
|
74
|
+
try {
|
|
75
|
+
const sig = Buffer.from(sigB64, 'base64');
|
|
76
|
+
// An Ed25519 signature is exactly 64 bytes; anything else is not one, and
|
|
77
|
+
// base64 decoding is lenient enough that the check is worth making.
|
|
78
|
+
if (sig.length !== 64)
|
|
79
|
+
return false;
|
|
80
|
+
return verifyEd25519(null, Buffer.from(domain + message, 'utf8'), key, sig);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function signMessage(domain, message, privateKey) {
|
|
87
|
+
return signEd25519(null, Buffer.from(domain + message, 'utf8'), privateKey).toString('base64');
|
|
88
|
+
}
|
|
89
|
+
/** Code-unit order: the same on every runtime, unlike `localeCompare`. */
|
|
90
|
+
function compareKid(a, b) {
|
|
91
|
+
if (a === b)
|
|
92
|
+
return 0;
|
|
93
|
+
return a < b ? -1 : 1;
|
|
94
|
+
}
|
|
95
|
+
/** Canonical keyset text: keys sorted by kid, canonical JSON. */
|
|
96
|
+
export function canonicalApprovalKeysetText(keyset) {
|
|
97
|
+
const keys = [...keyset.keys]
|
|
98
|
+
.map((k) => ({ kid: k.kid, publicKeySpkiB64: k.publicKeySpkiB64 }))
|
|
99
|
+
.sort((a, b) => compareKid(a.kid, b.kid));
|
|
100
|
+
return canonicalApprovalJson({ v: 1, seq: keyset.seq, keys });
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Server side: the document for a keyring. Every signer signs, and every
|
|
104
|
+
* signer's public key is listed. `endorsements` are signatures made OFFLINE
|
|
105
|
+
* over the same canonical text by a root key the daemon may have embedded
|
|
106
|
+
* (see `verifyApprovalKeysetDocument`'s `anchors`); the text is deterministic
|
|
107
|
+
* — no timestamp — precisely so an endorsement can be made ahead of time.
|
|
108
|
+
*/
|
|
109
|
+
export function buildApprovalKeysetDocument(args) {
|
|
110
|
+
const keyset = canonicalApprovalKeysetText({
|
|
111
|
+
v: 1,
|
|
112
|
+
seq: args.seq,
|
|
113
|
+
keys: args.signers.map((s) => approvalPublicKeyFromKeyObject(s.kid, s.privateKey)),
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
keyset,
|
|
117
|
+
signatures: [
|
|
118
|
+
...args.signers.map((s) => ({
|
|
119
|
+
kid: s.kid,
|
|
120
|
+
sig: signMessage(KEYSET_SIGNING_DOMAIN, keyset, s.privateKey),
|
|
121
|
+
})),
|
|
122
|
+
...(args.endorsements ?? []),
|
|
123
|
+
],
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** Sign keyset text with one key — for an offline root endorsement. */
|
|
127
|
+
export function endorseApprovalKeysetText(keysetText, signer) {
|
|
128
|
+
return {
|
|
129
|
+
kid: signer.kid,
|
|
130
|
+
sig: signMessage(KEYSET_SIGNING_DOMAIN, keysetText, signer.privateKey),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/** Parse and validate keyset text. Null when it is not a well-formed keyset. */
|
|
134
|
+
export function parseApprovalKeysetText(text) {
|
|
135
|
+
if (typeof text !== 'string' || text.length === 0 || text.length > MAX_KEYSET_BYTES) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
let parsed;
|
|
139
|
+
try {
|
|
140
|
+
parsed = JSON.parse(text);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
146
|
+
return null;
|
|
147
|
+
const p = parsed;
|
|
148
|
+
if (p.v !== 1 || !Number.isSafeInteger(p.seq) || p.seq < 1)
|
|
149
|
+
return null;
|
|
150
|
+
if (!Array.isArray(p.keys) || p.keys.length === 0 || p.keys.length > MAX_KEYSET_KEYS) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const keys = [];
|
|
154
|
+
const seen = new Set();
|
|
155
|
+
for (const entry of p.keys) {
|
|
156
|
+
if (!entry || typeof entry !== 'object')
|
|
157
|
+
return null;
|
|
158
|
+
const { kid, publicKeySpkiB64 } = entry;
|
|
159
|
+
if (typeof kid !== 'string' || !KID_PATTERN.test(kid) || seen.has(kid))
|
|
160
|
+
return null;
|
|
161
|
+
if (typeof publicKeySpkiB64 !== 'string' || !ed25519PublicKey(publicKeySpkiB64))
|
|
162
|
+
return null;
|
|
163
|
+
seen.add(kid);
|
|
164
|
+
keys.push({ kid, publicKeySpkiB64 });
|
|
165
|
+
}
|
|
166
|
+
const keyset = { v: 1, seq: p.seq, keys };
|
|
167
|
+
// One byte representation per keyset: a pinned keyset is compared by its
|
|
168
|
+
// text, so a non-canonical spelling of the same keys must not read as a
|
|
169
|
+
// different set (or the same seq would look like a conflict).
|
|
170
|
+
return canonicalApprovalKeysetText(keyset) === text ? keyset : null;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Daemon side: decide whether to adopt a keyset document.
|
|
174
|
+
*
|
|
175
|
+
* - Pinned: at least one signature must verify under a key in the PINNED set
|
|
176
|
+
* (or an anchor). The new set may drop or add keys — that is rotation — but
|
|
177
|
+
* its `seq` may not fall, and the same `seq` must be the same set.
|
|
178
|
+
* - Not pinned, anchors given (an embedded root for this server origin): at
|
|
179
|
+
* least one signature must verify under an anchor. No TOFU.
|
|
180
|
+
* - Not pinned, no anchors: trust on first use. The document must still be
|
|
181
|
+
* signed by a key it lists (proof that whoever served it holds one), but
|
|
182
|
+
* its authority is the authenticated HTTPS fetch it came from.
|
|
183
|
+
*
|
|
184
|
+
* A signature is checked against the TRUSTED copy of a key, looked up by kid —
|
|
185
|
+
* never against the key the new document lists under that kid, or a document
|
|
186
|
+
* could swap a key's bytes while keeping its name.
|
|
187
|
+
*/
|
|
188
|
+
export function verifyApprovalKeysetDocument(doc, trust) {
|
|
189
|
+
if (!doc || typeof doc !== 'object' || Array.isArray(doc)) {
|
|
190
|
+
return { ok: false, reason: 'malformed' };
|
|
191
|
+
}
|
|
192
|
+
const d = doc;
|
|
193
|
+
const keyset = parseApprovalKeysetText(d.keyset);
|
|
194
|
+
if (!keyset)
|
|
195
|
+
return { ok: false, reason: 'malformed' };
|
|
196
|
+
const text = d.keyset;
|
|
197
|
+
if (!Array.isArray(d.signatures) ||
|
|
198
|
+
d.signatures.length === 0 ||
|
|
199
|
+
d.signatures.length > MAX_KEYSET_SIGNATURES) {
|
|
200
|
+
return { ok: false, reason: 'malformed' };
|
|
201
|
+
}
|
|
202
|
+
// A list, not a map: an anchor and a pinned key that share a kid are both
|
|
203
|
+
// tried, so neither can shadow the other.
|
|
204
|
+
let trusted = [
|
|
205
|
+
...(trust.anchors ?? []),
|
|
206
|
+
...(trust.pinned?.keys ?? []),
|
|
207
|
+
];
|
|
208
|
+
if (trusted.length === 0)
|
|
209
|
+
trusted = keyset.keys;
|
|
210
|
+
const signed = d.signatures.some((entry) => {
|
|
211
|
+
if (!entry || typeof entry !== 'object')
|
|
212
|
+
return false;
|
|
213
|
+
const { kid, sig } = entry;
|
|
214
|
+
if (typeof kid !== 'string' || typeof sig !== 'string')
|
|
215
|
+
return false;
|
|
216
|
+
return trusted.some((k) => {
|
|
217
|
+
if (k.kid !== kid)
|
|
218
|
+
return false;
|
|
219
|
+
const key = ed25519PublicKey(k.publicKeySpkiB64);
|
|
220
|
+
return key ? verifySignature(KEYSET_SIGNING_DOMAIN, text, sig, key) : false;
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
if (!signed)
|
|
224
|
+
return { ok: false, reason: 'untrusted' };
|
|
225
|
+
if (!trust.pinned)
|
|
226
|
+
return { ok: true, keyset, text, change: 'first_pin' };
|
|
227
|
+
if (keyset.seq < trust.pinned.seq)
|
|
228
|
+
return { ok: false, reason: 'rollback' };
|
|
229
|
+
if (keyset.seq === trust.pinned.seq) {
|
|
230
|
+
return canonicalApprovalKeysetText(trust.pinned) === text
|
|
231
|
+
? { ok: true, keyset, text, change: 'unchanged' }
|
|
232
|
+
: { ok: false, reason: 'conflict' };
|
|
233
|
+
}
|
|
234
|
+
return { ok: true, keyset, text, change: 'rotated' };
|
|
235
|
+
}
|
|
236
|
+
/** Server side: mint and sign a v2 attestation after a person approved THIS call. */
|
|
237
|
+
export function signToolApproval(args) {
|
|
238
|
+
const now = args.now ?? Date.now();
|
|
239
|
+
const payload = {
|
|
240
|
+
v: 2,
|
|
241
|
+
toolUseId: args.toolUseId,
|
|
242
|
+
toolName: args.toolName,
|
|
243
|
+
inputSha256: canonicalToolInputDigest(args.toolInput),
|
|
244
|
+
decidedBy: 'user',
|
|
245
|
+
daemonId: args.daemonId,
|
|
246
|
+
sessionId: args.sessionId,
|
|
247
|
+
issuedAt: now,
|
|
248
|
+
expiresAt: now + (args.ttlMs ?? ATTESTED_TOOL_APPROVAL_TTL_MS),
|
|
249
|
+
};
|
|
250
|
+
const text = canonicalApprovalJson(payload);
|
|
251
|
+
return {
|
|
252
|
+
v: 2,
|
|
253
|
+
payload: text,
|
|
254
|
+
kid: args.signer.kid,
|
|
255
|
+
sig: signMessage(ATTESTATION_SIGNING_DOMAIN, text, args.signer.privateKey),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Daemon side: verify a v2 attestation against the pinned keyset and the call.
|
|
260
|
+
* Order matters: nothing in the payload is READ until the signature verified
|
|
261
|
+
* under a pinned key, so an unsigned claim can never pick which check runs.
|
|
262
|
+
*/
|
|
263
|
+
export function verifySignedToolApproval(approval, call, keyset) {
|
|
264
|
+
if (approval === undefined || approval === null)
|
|
265
|
+
return { ok: false, reason: 'absent' };
|
|
266
|
+
if (typeof approval !== 'object' || Array.isArray(approval)) {
|
|
267
|
+
return { ok: false, reason: 'malformed' };
|
|
268
|
+
}
|
|
269
|
+
const a = approval;
|
|
270
|
+
if (a.v !== 2 ||
|
|
271
|
+
typeof a.payload !== 'string' ||
|
|
272
|
+
a.payload.length > MAX_PAYLOAD_BYTES ||
|
|
273
|
+
typeof a.kid !== 'string' ||
|
|
274
|
+
typeof a.sig !== 'string') {
|
|
275
|
+
return { ok: false, reason: 'malformed' };
|
|
276
|
+
}
|
|
277
|
+
const pinnedKey = keyset.keys.find((k) => k.kid === a.kid);
|
|
278
|
+
const key = pinnedKey ? ed25519PublicKey(pinnedKey.publicKeySpkiB64) : null;
|
|
279
|
+
if (!key)
|
|
280
|
+
return { ok: false, reason: 'unknown_key' };
|
|
281
|
+
if (!verifySignature(ATTESTATION_SIGNING_DOMAIN, a.payload, a.sig, key)) {
|
|
282
|
+
return { ok: false, reason: 'signature' };
|
|
283
|
+
}
|
|
284
|
+
let parsed;
|
|
285
|
+
try {
|
|
286
|
+
parsed = JSON.parse(a.payload);
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
return { ok: false, reason: 'malformed' };
|
|
290
|
+
}
|
|
291
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
292
|
+
return { ok: false, reason: 'malformed' };
|
|
293
|
+
}
|
|
294
|
+
const p = parsed;
|
|
295
|
+
if (p.v !== 2 ||
|
|
296
|
+
typeof p.toolUseId !== 'string' ||
|
|
297
|
+
typeof p.toolName !== 'string' ||
|
|
298
|
+
typeof p.inputSha256 !== 'string' ||
|
|
299
|
+
p.decidedBy !== 'user' ||
|
|
300
|
+
typeof p.daemonId !== 'string' ||
|
|
301
|
+
typeof p.sessionId !== 'string' ||
|
|
302
|
+
typeof p.issuedAt !== 'number' ||
|
|
303
|
+
typeof p.expiresAt !== 'number') {
|
|
304
|
+
return { ok: false, reason: 'malformed' };
|
|
305
|
+
}
|
|
306
|
+
// A signed approval for another daemon (or another session on this one) is
|
|
307
|
+
// a valid signature over the wrong question. Checked before freshness so the
|
|
308
|
+
// log says WHICH wrong question when both are wrong.
|
|
309
|
+
if (!call.daemonId ||
|
|
310
|
+
p.daemonId !== call.daemonId ||
|
|
311
|
+
!call.sessionId ||
|
|
312
|
+
p.sessionId !== call.sessionId) {
|
|
313
|
+
return { ok: false, reason: 'daemon_binding' };
|
|
314
|
+
}
|
|
315
|
+
const claims = verifyAttestedToolApprovalClaims({
|
|
316
|
+
toolUseId: p.toolUseId,
|
|
317
|
+
toolName: p.toolName,
|
|
318
|
+
inputSha256: p.inputSha256,
|
|
319
|
+
issuedAt: p.issuedAt,
|
|
320
|
+
expiresAt: p.expiresAt,
|
|
321
|
+
}, call);
|
|
322
|
+
if (!claims.ok)
|
|
323
|
+
return claims;
|
|
324
|
+
return { ok: true, toolUseId: p.toolUseId, expiresAt: p.expiresAt };
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Daemon side: THE decision for any attestation, whatever version arrived.
|
|
328
|
+
*
|
|
329
|
+
* - pinned → only v2 verified against the pinned keyset approves; v1 is
|
|
330
|
+
* refused as `unsigned` (downgrade protection).
|
|
331
|
+
* - unpinned → legacy: v1 is verified exactly as before; v2 is refused as
|
|
332
|
+
* `unpinned` (nothing here could check it — the server should
|
|
333
|
+
* not have sent it, since this daemon did not announce
|
|
334
|
+
* `tool_approval_signed_v1`).
|
|
335
|
+
* - unreadable → nothing approves.
|
|
336
|
+
*
|
|
337
|
+
* Returns the claims the spend-once ledger keys on when it approves.
|
|
338
|
+
*/
|
|
339
|
+
export function verifyToolApprovalAttestation(approval, call, pin) {
|
|
340
|
+
if (approval === undefined || approval === null)
|
|
341
|
+
return { ok: false, reason: 'absent' };
|
|
342
|
+
const version = approval && typeof approval === 'object' && !Array.isArray(approval)
|
|
343
|
+
? approval.v
|
|
344
|
+
: undefined;
|
|
345
|
+
if (pin.state === 'unreadable')
|
|
346
|
+
return { ok: false, reason: 'pin_unreadable' };
|
|
347
|
+
if (pin.state === 'pinned') {
|
|
348
|
+
if (version === 1)
|
|
349
|
+
return { ok: false, reason: 'unsigned' };
|
|
350
|
+
const verdict = verifySignedToolApproval(approval, call, pin.keyset);
|
|
351
|
+
return verdict.ok ? { ...verdict, signed: true } : verdict;
|
|
352
|
+
}
|
|
353
|
+
if (version === 2)
|
|
354
|
+
return { ok: false, reason: 'unpinned' };
|
|
355
|
+
const legacy = verifyAttestedToolApproval(approval, call);
|
|
356
|
+
if (!legacy.ok)
|
|
357
|
+
return legacy;
|
|
358
|
+
const a = approval;
|
|
359
|
+
return { ok: true, toolUseId: a.toolUseId, expiresAt: a.expiresAt, signed: false };
|
|
360
|
+
}
|
|
@@ -82,7 +82,16 @@ export interface TokenPair {
|
|
|
82
82
|
export type PermanentAuthReason = 'REFRESH_INVALID' | 'REFRESH_REUSED' | 'REFRESH_EXPIRED' | 'SESSION_REVOKED' | 'DEVICE_KEY_MISMATCH' | 'TOKEN_INVALID' | 'TOKEN_EXPIRED' | 'UNKNOWN_401';
|
|
83
83
|
export declare class PermanentAuthFailure extends Error {
|
|
84
84
|
readonly code: PermanentAuthReason;
|
|
85
|
-
|
|
85
|
+
/**
|
|
86
|
+
* OSK-16941 — for `SESSION_REVOKED`, the server's `reason` (a
|
|
87
|
+
* `SESSION_REVOCATION_REASONS` value, `./sessionRevocation.ts`) exactly as
|
|
88
|
+
* received, or undefined when the server sent none. Deliberately not
|
|
89
|
+
* normalized here: a surface rendering it with `describeSessionRevocation`
|
|
90
|
+
* turns a missing or unknown value into the "we could not tell why" copy,
|
|
91
|
+
* and keeps an unrecognised code visible rather than losing it.
|
|
92
|
+
*/
|
|
93
|
+
readonly revocationReason?: string;
|
|
94
|
+
constructor(code: PermanentAuthReason, message: string, revocationReason?: string);
|
|
86
95
|
}
|
|
87
96
|
export declare class TransientAuthFailure extends Error {
|
|
88
97
|
readonly cause?: unknown;
|
|
@@ -91,6 +100,13 @@ export declare class TransientAuthFailure extends Error {
|
|
|
91
100
|
export interface ReauthState {
|
|
92
101
|
code: string;
|
|
93
102
|
message?: string;
|
|
103
|
+
/**
|
|
104
|
+
* OSK-16941 — the server's session-revocation `reason` for a
|
|
105
|
+
* `SESSION_REVOKED` latch, so the CLI and desktop can say WHY the person was
|
|
106
|
+
* signed out. Absent on latches written before it existed and on refusals
|
|
107
|
+
* that were not revocations.
|
|
108
|
+
*/
|
|
109
|
+
revocationReason?: string;
|
|
94
110
|
/** Epoch ms. */
|
|
95
111
|
at: number;
|
|
96
112
|
}
|
|
@@ -5,10 +5,21 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export class PermanentAuthFailure extends Error {
|
|
7
7
|
code;
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* OSK-16941 — for `SESSION_REVOKED`, the server's `reason` (a
|
|
10
|
+
* `SESSION_REVOCATION_REASONS` value, `./sessionRevocation.ts`) exactly as
|
|
11
|
+
* received, or undefined when the server sent none. Deliberately not
|
|
12
|
+
* normalized here: a surface rendering it with `describeSessionRevocation`
|
|
13
|
+
* turns a missing or unknown value into the "we could not tell why" copy,
|
|
14
|
+
* and keeps an unrecognised code visible rather than losing it.
|
|
15
|
+
*/
|
|
16
|
+
revocationReason;
|
|
17
|
+
constructor(code, message, revocationReason) {
|
|
9
18
|
super(message);
|
|
10
19
|
this.name = 'PermanentAuthFailure';
|
|
11
20
|
this.code = code;
|
|
21
|
+
if (revocationReason !== undefined)
|
|
22
|
+
this.revocationReason = revocationReason;
|
|
12
23
|
}
|
|
13
24
|
}
|
|
14
25
|
export class TransientAuthFailure extends Error {
|
|
@@ -64,6 +64,16 @@
|
|
|
64
64
|
"default": "./dist/cjs/daemonToolApproval.js"
|
|
65
65
|
}
|
|
66
66
|
},
|
|
67
|
+
"./tool-approval-signature": {
|
|
68
|
+
"import": {
|
|
69
|
+
"types": "./dist/esm/toolApprovalSignature.d.ts",
|
|
70
|
+
"default": "./dist/esm/toolApprovalSignature.js"
|
|
71
|
+
},
|
|
72
|
+
"require": {
|
|
73
|
+
"types": "./dist/cjs/toolApprovalSignature.d.ts",
|
|
74
|
+
"default": "./dist/cjs/toolApprovalSignature.js"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
67
77
|
"./session-permission-authority": {
|
|
68
78
|
"import": {
|
|
69
79
|
"types": "./dist/esm/sessionPermissionAuthority.d.ts",
|
|
@@ -114,6 +124,16 @@
|
|
|
114
124
|
"default": "./dist/cjs/computerWire.js"
|
|
115
125
|
}
|
|
116
126
|
},
|
|
127
|
+
"./daemon-wire": {
|
|
128
|
+
"import": {
|
|
129
|
+
"types": "./dist/esm/daemonWire.d.ts",
|
|
130
|
+
"default": "./dist/esm/daemonWire.js"
|
|
131
|
+
},
|
|
132
|
+
"require": {
|
|
133
|
+
"types": "./dist/cjs/daemonWire.d.ts",
|
|
134
|
+
"default": "./dist/cjs/daemonWire.js"
|
|
135
|
+
}
|
|
136
|
+
},
|
|
117
137
|
"./loopback-http": {
|
|
118
138
|
"import": {
|
|
119
139
|
"types": "./dist/esm/loopbackHttp.d.ts",
|
|
@@ -203,6 +223,16 @@
|
|
|
203
223
|
"types": "./dist/cjs/telemetryRedaction.d.ts",
|
|
204
224
|
"default": "./dist/cjs/telemetryRedaction.js"
|
|
205
225
|
}
|
|
226
|
+
},
|
|
227
|
+
"./session-revocation": {
|
|
228
|
+
"import": {
|
|
229
|
+
"types": "./dist/esm/sessionRevocation.d.ts",
|
|
230
|
+
"default": "./dist/esm/sessionRevocation.js"
|
|
231
|
+
},
|
|
232
|
+
"require": {
|
|
233
|
+
"types": "./dist/cjs/sessionRevocation.d.ts",
|
|
234
|
+
"default": "./dist/cjs/sessionRevocation.js"
|
|
235
|
+
}
|
|
206
236
|
}
|
|
207
237
|
},
|
|
208
238
|
"dependencies": {
|