@skrr-ai/cli 0.1.109 → 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 +44 -1
- package/dist/base-command.js +194 -33
- 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/create.js +1 -1
- package/dist/commands/agents/triggers/list.js +2 -1
- package/dist/commands/agents/triggers/update.js +1 -1
- package/dist/commands/agents/update.d.ts +11 -0
- package/dist/commands/agents/update.js +58 -2
- 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/daemon/install.js +17 -1
- package/dist/commands/daemon/login.js +14 -0
- 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/harnesses/prune.d.ts +26 -0
- package/dist/commands/harnesses/prune.js +172 -0
- 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/login.js +11 -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/start.js +3 -1
- package/dist/commands/spaces/workflows/triggers/list.js +2 -1
- package/dist/commands/spaces/workflows/validate.js +12 -2
- 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 +14 -8
- 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 +103 -6
- 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/rearm-recurrence.js +22 -3
- 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.d.ts +8 -0
- package/dist/commands/tasks/show.js +81 -43
- 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/unschedule.js +5 -1
- package/dist/commands/tasks/update.d.ts +1 -0
- package/dist/commands/tasks/update.js +36 -3
- 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/audit.js +12 -3
- package/dist/commands/triggers/create.js +1 -1
- package/dist/commands/triggers/fire-detail.d.ts +7 -0
- package/dist/commands/triggers/fire-detail.js +30 -12
- package/dist/commands/triggers/fire.js +13 -3
- package/dist/commands/triggers/list.js +2 -1
- package/dist/commands/triggers/parse-intent.js +1 -1
- package/dist/commands/triggers/update.js +1 -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/grants.js +1 -4
- package/dist/commands/workspaces/list.js +3 -2
- package/dist/commands/workspaces/members.d.ts +1 -0
- package/dist/commands/workspaces/members.js +10 -7
- 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/commitment-product.js +5 -2
- package/dist/lib/commitments.d.ts +45 -3
- package/dist/lib/commitments.js +139 -41
- package/dist/lib/compasses.d.ts +4 -0
- package/dist/lib/compasses.js +11 -0
- package/dist/lib/daemon-machine-identity-copy.d.ts +14 -0
- package/dist/lib/daemon-machine-identity-copy.js +27 -0
- package/dist/lib/daemon-machine-identity.d.ts +27 -0
- package/dist/lib/daemon-machine-identity.js +61 -0
- package/dist/lib/daemon-setup.js +7 -7
- package/dist/lib/daemonHandoff.d.ts +19 -1
- package/dist/lib/daemonHandoff.js +62 -2
- package/dist/lib/dedicated-ssh.d.ts +2 -0
- package/dist/lib/dedicated-ssh.js +98 -28
- package/dist/lib/harnesses.d.ts +71 -0
- package/dist/lib/harnesses.js +70 -0
- 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 +38 -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/profile-machine-identity-guard.js +11 -1
- 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-economics.d.ts +10 -0
- package/dist/lib/task-economics.js +24 -2
- 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 +18 -0
- package/dist/lib/triggers.js +97 -5
- 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/workflow-run-view.d.ts +4 -0
- package/dist/lib/workflow-run-view.js +5 -0
- package/dist/lib/workspaces.d.ts +33 -9
- package/dist/lib/workspaces.js +19 -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/index.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +5 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/machineUuid.d.ts +60 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/machineUuid.js +130 -6
- 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/index.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/machineUuid.d.ts +60 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/machineUuid.js +128 -6
- 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 +31 -1
- package/dist/node_modules/@skrr-ai/data-provider/index.js +25255 -18711
- package/docs/v1/operations.md +52 -0
- package/docs/v1/space-search.md +19 -0
- package/oclif.manifest.json +4843 -513
- package/package.json +32 -2
|
@@ -24,9 +24,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
exports.runHeadersHelper = exports.SENTINEL_TRIGGERING_FAILURES = exports.__resetAuthHelperFailureReasonForTest = exports.getLastAuthHelperFailureReason = exports.getDefaultHelperTtlMs = exports.invokeAuthHelper = exports.AuthHelperUnavailableError = exports.AuthHelperUntrustedError = exports.isStaticTokenKind = exports.PERSONAL_ACCESS_TOKEN_PREFIX = exports.CI_TOKEN_PREFIX = exports.classifyTokenKind = exports.invalidateAuthHelperCache = exports.__resetCredentialResolverForTest = exports.CREDENTIAL_PRECEDENCE = exports.CredentialResolver = exports.__setFdReaderForTest = exports.readAuthFromFd = exports.createRefreshScheduler = exports.UNKNOWN_401_BUDGET = exports.__resetUnknown401StreaksForTest = exports.__refreshDiagnostics = exports.installLockExitHandlers = exports.clearReauthState = exports.needsReauthState = exports.persistReauthState = exports.withAuthLock = exports.revokeDaemonRefreshSession = exports.refreshDaemonToken = exports.classifyRefreshResponse = exports.EXIT_NEEDS_REAUTH = exports.reauthCommand = exports.formatReauthMessage = exports.handleMidStreamAuthExpiry = exports.isAuthExpiredSseEvent = exports.decodeJwtPayload = exports.decodeJwtExpiry = exports.TransientAuthFailure = exports.PermanentAuthFailure = exports.emitAuthTelemetry = exports.getAuthBinaryName = exports.getAuthKillSwitches = exports.getAuthConfigDir = exports.getAuthLogger = exports.configureAuthCore = exports.OAUTH_CLI_SCOPE = exports.isDaemonScope = exports.VALID_DAEMON_SCOPE_SET = exports.ALL_DAEMON_SCOPES = exports.SCOPES = void 0;
|
|
26
26
|
exports.jwkThumbprint = exports.generateDeviceKeyPair = exports.buildDeviceProof = exports.zeroizeKekCaches = exports.WindowsKek = exports.registerZeroizeHook = exports.MacosKek = exports.LinuxKek = exports.KekUnavailableError = exports.UnavailableKek = exports.InMemoryKek = exports.getKekStrategy = exports.__setKekStrategyForTest = exports.credEnvelopeWrap = exports.credEnvelopeUnwrap = exports.credEnvelopeSerialize = exports.credSealBuffer = exports.credOpenBuffer = exports.CRED_KEY_LEN = exports.isCredEnvelopeString = exports.generateDek = exports.CRED_ENVELOPE_MAGIC = exports.credEnvelopeEncrypt = exports.credEnvelopeDeserialize = exports.credEnvelopeDecrypt = exports.buildCredentialAad = exports.isValidRecoveryCode = exports.normalizeRecoveryCode = exports.parseRecoveryCode = exports.formatRecoveryCode = exports.MAX_TTL_DAYS = exports.MIN_TTL_DAYS = exports.parseTtlDays = exports.LoginExchangeError = exports.LoginInitError = exports.loginWithLocalhost = exports.LocalCallbackMalformedError = exports.LocalCallbackDeniedError = exports.LocalCallbackStateMismatchError = exports.LocalCallbackTimeoutError = exports.LocalCallbackBindError = exports.LocalCallbackError = exports.DEFAULT_LOGIN_TIMEOUT_MS = exports.startLocalCallback = exports.verifyChallenge = exports.safeEqual = exports.generateState = exports.challenge = exports.generateVerifier = exports.invalidateHeadersHelperCache = void 0;
|
|
27
|
-
exports.
|
|
28
|
-
exports.
|
|
29
|
-
exports.compareReleaseVersions = exports.consolidateProfileState = exports.profileStateFilePathsToClear = exports.profileStateFileLocations = exports.resolveProfileStateFile = exports.resolveProfileStateDir = exports.legacyProfileStateDir = exports.profileStateDir = exports.SUPERSEDED_COPY_SUFFIX = exports.SUPERSEDED_MARKER_SUFFIX = exports.PROFILES_SEGMENT = exports.isConfigRootOverridden = exports.configRootPath = exports.resolveConfigRoot = exports.verifyManifest = exports.verifyArtifact = exports.isTrustedArtifactOrigin = exports.getDeltaFor = exports.buildManifestMessage = exports.buildArtifactMessage = exports.TRUSTED_FEED_ORIGINS = exports.MAX_SIGS = exports.OVERSKY_RELEASE_PUBLIC_KEYS = exports.resolveFirstPartyHarnessChannel = exports.resolveChannelManifestUrl = exports.isFirstPartyHarnessChannel = exports.firstPartyHarnessFeedCandidates = exports.firstPartyHarnessFeedBase = exports.firstPartyHarnessChannelPrefix = exports.FIRST_PARTY_HARNESS_CHANNELS = exports.DEFAULT_FIRST_PARTY_HARNESS_CHANNEL = exports.migrateFirstPartyHarnessHome = exports.linkFirstPartyHarnessAliases = exports.firstPartyHarnessInstalledBinaryPath = exports.firstPartyHarnessHomeDir = exports.firstPartyHarnessBinDir = exports.FIRST_PARTY_HARNESS_PROVENANCE_SUFFIX = exports.FIRST_PARTY_HARNESS_PREVIOUS_SUFFIX = exports.describeLegacyState = exports.findLegacyLocalState = exports.DEFAULT_BINARY_NAME = exports.LEGACY_NATIVE_ID_PREFIXES = exports.NATIVE_ID_PREFIX = exports.LEGACY_CONFIG_DIR_NAMES = exports.CONFIG_DIR_NAME = void 0;
|
|
27
|
+
exports.setMachineUuidProfile = exports.getHardwareMachineUuid = exports.describeMachineIdentity = exports.getMachineUuidForProfile = exports.getMachineUuid = exports.__getDeviceIdentityStateForTest = exports.__setDeviceIdentityStateForTest = exports.__enrollmentBackoffPathForTest = exports.__enrollmentMarkerPathForTest = exports.__privateKeyPathForTest = exports.__publicKeyPathForTest = exports.describeDeviceKeySplit = exports.describeDeviceIdentityState = exports.getDevicePublicKey = exports.isDeviceIdentityActive = exports.clearEnrollmentMarker = exports.enrollWithServer = exports.signServerRequest = exports.resetDeviceIdentity = exports.initDeviceIdentity = exports.__resetShutdownGuardForTest = exports.__getCredEnvelopeStateForTest = exports.__setCredEnvelopeStateForTest = exports.__wrappedDekFilePathForTest = exports.DEFAULT_UNREADABLE_CREDENTIAL_HINT = exports.maybeDecryptOnRead = exports.maybeEncryptForWrite = exports.splitKeyConvergencePolicy = exports.describeCredEnvelopeState = exports.hasCredEnvelopePathConflict = exports.isCredEnvelopeActive = exports.shutdownCredEnvelope = exports.resetCredEnvelope = exports.initCredEnvelope = exports.verifyDpopProof = exports.normalizeDpopHtu = exports.isJwkThumbprint = exports.isAth = exports.createDpopKey = exports.accessTokenHash = exports.DPOP_PROOF_VERIFY_UNAVAILABLE = exports.DPOP_PROOF_TYP = exports.DPOP_PROOF_REQUIRED = exports.DPOP_PROOF_INVALID = exports.DPOP_MAX_AGE_SECONDS = exports.DPOP_HEADER = exports.verifyDeviceProof = exports.tokenHash = exports.publicJwkFromX = exports.normalizeHtu = void 0;
|
|
28
|
+
exports.isLoopbackAddress = exports.isLoopbackHostname = exports.assertLoopbackHttpUrl = exports.loopbackFetch = exports.withLoopbackNoProxy = exports.envHasProxy = exports.LOOPBACK_NO_PROXY_HOSTS = exports.isDaemonChildEnv = exports.DAEMON_CHILD_ENV = exports.SENSITIVE_ENV_PREFIX_EXCEPTIONS = exports.SENSITIVE_ENV_NAME_TOKENS = exports.SENSITIVE_ENV_SUFFIXES = exports.SENSITIVE_ENV_PREFIXES = exports.SENSITIVE_ENV_VARS = exports.sanitizeSpawnEnv = exports.harnessLoadsClaudeSkillsLayout = exports.claudeSkillsLayoutEvidence = exports.HARNESSES_LOADING_CLAUDE_SKILLS_LAYOUT = exports.tierPermitsConfiguredAutoMode = exports.credentialPolicyForTier = exports.getHarnessTier = exports.HARNESS_TIERS = exports.pairUint8ArrayToBase64Url = exports.pairUint8ArrayToBase64 = exports.parsePairUrl = exports.parsePairPlaintext = exports.parsePairBundle = exports.openPairBundleBase64 = exports.generatePairKeyPair = exports.buildPairUrl = exports.buildPairAad = exports.pairBase64UrlToUint8Array = exports.pairBase64ToUint8Array = exports.assemblePairBundleBase64 = exports.PairBundleError = exports.PAIR_SECRET_LEN = exports.PAIR_PUBKEY_LEN = exports.PAIR_NONCE_LEN = exports.PAIR_BUNDLE_MAX_BASE64_LEN = exports.PAIR_AAD_MAX_LEN = exports.PAIR_AAD_PREFIX = exports.__resetCachedDaemonIdForTest = exports.legacyDaemonUuids = exports.ensureMachineDaemonId = exports.__resetMachineUuidCacheForTest = exports.HOSTED_RUNTIME_MACHINE_SOURCES = exports.hostedRuntimeIdOverride = exports.MACHINE_IDENTITY_FILENAME = exports.qualifyMachineUuid = exports.getMachineUuidProfile = void 0;
|
|
29
|
+
exports.compareReleaseVersions = exports.consolidateProfileState = exports.profileStateFilePathsToClear = exports.profileStateFileLocations = exports.resolveProfileStateFile = exports.resolveProfileStateDir = exports.legacyProfileStateDir = exports.profileStateDir = exports.SUPERSEDED_COPY_SUFFIX = exports.SUPERSEDED_MARKER_SUFFIX = exports.PROFILES_SEGMENT = exports.isConfigRootOverridden = exports.configRootPath = exports.resolveConfigRoot = exports.verifyManifest = exports.verifyArtifact = exports.isTrustedArtifactOrigin = exports.getDeltaFor = exports.buildManifestMessage = exports.buildArtifactMessage = exports.TRUSTED_FEED_ORIGINS = exports.MAX_SIGS = exports.OVERSKY_RELEASE_PUBLIC_KEYS = exports.resolveFirstPartyHarnessChannel = exports.resolveChannelManifestUrl = exports.isFirstPartyHarnessChannel = exports.firstPartyHarnessFeedCandidates = exports.firstPartyHarnessFeedBase = exports.firstPartyHarnessChannelPrefix = exports.FIRST_PARTY_HARNESS_CHANNELS = exports.DEFAULT_FIRST_PARTY_HARNESS_CHANNEL = exports.migrateFirstPartyHarnessHome = exports.linkFirstPartyHarnessAliases = exports.firstPartyHarnessInstalledBinaryPath = exports.firstPartyHarnessHomeDir = exports.firstPartyHarnessBinDir = exports.FIRST_PARTY_HARNESS_PROVENANCE_SUFFIX = exports.FIRST_PARTY_HARNESS_PREVIOUS_SUFFIX = exports.describeLegacyState = exports.findLegacyLocalState = exports.DEFAULT_BINARY_NAME = exports.LEGACY_NATIVE_ID_PREFIXES = exports.NATIVE_ID_PREFIX = exports.LEGACY_CONFIG_DIR_NAMES = exports.CONFIG_DIR_NAME = exports.LOOPBACK_DEFAULT_MAX_BODY_BYTES = exports.LoopbackTargetRefusedError = void 0;
|
|
30
30
|
// Daemon scope vocabulary — single source of truth for non-Mongoose tiers
|
|
31
31
|
// (daemon, desktop, cli). Schema-bound canonical lives in
|
|
32
32
|
// `@skrr-ai/data-schemas/common/daemonScopes`; the two are kept byte-equal
|
|
@@ -284,6 +284,8 @@ Object.defineProperty(exports, "__getDeviceIdentityStateForTest", { enumerable:
|
|
|
284
284
|
// OSK-12063. Also exposed dependency-free as `@skrr-ai/auth-core/machine-uuid`.
|
|
285
285
|
var machineUuid_js_1 = require("./machineUuid.js");
|
|
286
286
|
Object.defineProperty(exports, "getMachineUuid", { enumerable: true, get: function () { return machineUuid_js_1.getMachineUuid; } });
|
|
287
|
+
Object.defineProperty(exports, "getMachineUuidForProfile", { enumerable: true, get: function () { return machineUuid_js_1.getMachineUuidForProfile; } });
|
|
288
|
+
Object.defineProperty(exports, "describeMachineIdentity", { enumerable: true, get: function () { return machineUuid_js_1.describeMachineIdentity; } });
|
|
287
289
|
Object.defineProperty(exports, "getHardwareMachineUuid", { enumerable: true, get: function () { return machineUuid_js_1.getHardwareMachineUuid; } });
|
|
288
290
|
Object.defineProperty(exports, "setMachineUuidProfile", { enumerable: true, get: function () { return machineUuid_js_1.setMachineUuidProfile; } });
|
|
289
291
|
Object.defineProperty(exports, "getMachineUuidProfile", { enumerable: true, get: function () { return machineUuid_js_1.getMachineUuidProfile; } });
|
|
@@ -56,5 +56,65 @@ export declare function getMachineUuidProfile(): string | null;
|
|
|
56
56
|
* profile that already held credentials; see the block above.
|
|
57
57
|
*/
|
|
58
58
|
export declare function getMachineUuid(): string;
|
|
59
|
+
/**
|
|
60
|
+
* The `machineUuid` a process running as `profile` sends, WITHOUT changing which
|
|
61
|
+
* profile this process runs as.
|
|
62
|
+
*
|
|
63
|
+
* The CLI needs the answer for the profile it is about to hand a credential to,
|
|
64
|
+
* and asks the daemon binary what IT will send (`accept-handoff --print-id`).
|
|
65
|
+
* Two programs that compute one identity can only be known to agree by
|
|
66
|
+
* comparing them, and a daemon that predates per-profile identities does not
|
|
67
|
+
* agree: it sends the hardware value whatever the profile's
|
|
68
|
+
* `machine-identity.json` says, so a credential minted for what it reports
|
|
69
|
+
* registers the profile on the default machine's row (the OSK-13845 failure, now
|
|
70
|
+
* reached through version skew rather than through the rule). The comparison
|
|
71
|
+
* needs this: the expected value for the TARGET profile, which is not
|
|
72
|
+
* necessarily the one this process is running as.
|
|
73
|
+
*
|
|
74
|
+
* Decides and persists the profile's identity if nothing has yet — the same
|
|
75
|
+
* side effect `getMachineUuid()` has, for the same reason.
|
|
76
|
+
*/
|
|
77
|
+
export declare function getMachineUuidForProfile(profile: string | null | undefined): string;
|
|
78
|
+
export type MachineIdentityReason =
|
|
79
|
+
/** The default profile, which always uses this computer's own identity. */
|
|
80
|
+
'default_profile'
|
|
81
|
+
/** A hosted runtime, whose identity the control plane issued. */
|
|
82
|
+
| 'hosted_runtime'
|
|
83
|
+
/** A profile that held no credentials when its identity was first decided. */
|
|
84
|
+
| 'new_profile'
|
|
85
|
+
/** A profile that already held credentials, so it keeps the shared identity. */
|
|
86
|
+
| 'pre_existing_profile'
|
|
87
|
+
/** Recovered from the copy kept outside the profile after product state was removed. */
|
|
88
|
+
| 'restored_profile'
|
|
89
|
+
/** The profile's record could not be read (the identity is still the one in use). */
|
|
90
|
+
| 'unrecorded';
|
|
91
|
+
export interface MachineIdentityDescription {
|
|
92
|
+
/** The profile this process runs as; null for the default profile. */
|
|
93
|
+
profile: string | null;
|
|
94
|
+
/** The value sent to the server as `machineUuid`. */
|
|
95
|
+
machineUuid: string;
|
|
96
|
+
/** This computer's own identity. */
|
|
97
|
+
hardware: string;
|
|
98
|
+
/**
|
|
99
|
+
* A non-default profile that registers on the SAME machine row as the default
|
|
100
|
+
* profile: they share one Daemon row, one device-key pin and one machine page.
|
|
101
|
+
*/
|
|
102
|
+
sharesDefaultMachine: boolean;
|
|
103
|
+
reason: MachineIdentityReason;
|
|
104
|
+
/** The files that made a profile "already hold credentials", when recorded. */
|
|
105
|
+
evidence: string[];
|
|
106
|
+
decidedAt: string | null;
|
|
107
|
+
/** One sentence for a person. Written once, here, so no surface words it differently. */
|
|
108
|
+
sentence: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Which machine this process registers as, and WHY — the question a person has
|
|
112
|
+
* when two profiles turn up on one machine page and the logs say nothing.
|
|
113
|
+
*
|
|
114
|
+
* A read, not a decision: it reports the identity `getMachineUuid()` settled on
|
|
115
|
+
* (settling it if nothing has, exactly as any caller would) and the record that
|
|
116
|
+
* explains it. It never changes what a profile registers as.
|
|
117
|
+
*/
|
|
118
|
+
export declare function describeMachineIdentity(): MachineIdentityDescription;
|
|
59
119
|
/** @internal test seam — forget the cached value so the next call re-probes. */
|
|
60
120
|
export declare function __resetMachineUuidCacheForTest(): void;
|
|
@@ -10,6 +10,8 @@ exports.qualifyMachineUuid = qualifyMachineUuid;
|
|
|
10
10
|
exports.setMachineUuidProfile = setMachineUuidProfile;
|
|
11
11
|
exports.getMachineUuidProfile = getMachineUuidProfile;
|
|
12
12
|
exports.getMachineUuid = getMachineUuid;
|
|
13
|
+
exports.getMachineUuidForProfile = getMachineUuidForProfile;
|
|
14
|
+
exports.describeMachineIdentity = describeMachineIdentity;
|
|
13
15
|
exports.__resetMachineUuidCacheForTest = __resetMachineUuidCacheForTest;
|
|
14
16
|
/**
|
|
15
17
|
* machineUuid.ts — the ONE hardware machine identity sent to the server as
|
|
@@ -231,7 +233,7 @@ function readPersistedChoice(file, hardware, profile, requireProfile = false) {
|
|
|
231
233
|
return null;
|
|
232
234
|
}
|
|
233
235
|
}
|
|
234
|
-
function persistChoice(dir, file, hardware, machineUuid, reason, profile) {
|
|
236
|
+
function persistChoice(dir, file, hardware, machineUuid, reason, profile, evidence) {
|
|
235
237
|
try {
|
|
236
238
|
node_fs_1.default.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
237
239
|
const tmp = `${file}.${process.pid}.${Date.now()}.tmp`;
|
|
@@ -241,6 +243,12 @@ function persistChoice(dir, file, hardware, machineUuid, reason, profile) {
|
|
|
241
243
|
machineUuid,
|
|
242
244
|
profile,
|
|
243
245
|
reason,
|
|
246
|
+
// WHICH file made a profile "already hold credentials". The reason alone
|
|
247
|
+
// says a profile shares the default's machine row; this says what put it
|
|
248
|
+
// there, which is the difference between "an older Skrr set it up" and
|
|
249
|
+
// "its first credential was written before anything chose its identity".
|
|
250
|
+
// Additive: a reader that predates it ignores the field.
|
|
251
|
+
...(evidence && evidence.length > 0 ? { evidence: [...evidence] } : {}),
|
|
244
252
|
decidedAt: new Date().toISOString(),
|
|
245
253
|
};
|
|
246
254
|
node_fs_1.default.writeFileSync(tmp, `${JSON.stringify(body)}\n`, { mode: 0o600 });
|
|
@@ -280,7 +288,7 @@ function resolveProfileMachineUuid(profile, hardware) {
|
|
|
280
288
|
persistChoice(dir, file, hardware, chosen, 'restored_profile', profile);
|
|
281
289
|
}
|
|
282
290
|
if (!chosen) {
|
|
283
|
-
const
|
|
291
|
+
const evidence = PRE_EXISTING_PROFILE_EVIDENCE.filter((name) => {
|
|
284
292
|
try {
|
|
285
293
|
return node_fs_1.default.existsSync(node_path_1.default.join(dir, name));
|
|
286
294
|
}
|
|
@@ -288,8 +296,9 @@ function resolveProfileMachineUuid(profile, hardware) {
|
|
|
288
296
|
return false;
|
|
289
297
|
}
|
|
290
298
|
});
|
|
299
|
+
const preExisting = evidence.length > 0;
|
|
291
300
|
chosen = preExisting ? hardware : qualifyMachineUuid(hardware, profile);
|
|
292
|
-
persistChoice(dir, file, hardware, chosen, preExisting ? 'pre_existing_profile' : 'new_profile', profile);
|
|
301
|
+
persistChoice(dir, file, hardware, chosen, preExisting ? 'pre_existing_profile' : 'new_profile', profile, evidence);
|
|
293
302
|
}
|
|
294
303
|
preserveRecoveryChoice(profile, hardware, chosen);
|
|
295
304
|
profileChoiceCache.set(cacheKey, chosen);
|
|
@@ -309,14 +318,129 @@ function resolveProfileMachineUuid(profile, hardware) {
|
|
|
309
318
|
* profile that already held credentials; see the block above.
|
|
310
319
|
*/
|
|
311
320
|
function getMachineUuid() {
|
|
321
|
+
return getMachineUuidForProfile(activeMachineProfile);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* The `machineUuid` a process running as `profile` sends, WITHOUT changing which
|
|
325
|
+
* profile this process runs as.
|
|
326
|
+
*
|
|
327
|
+
* The CLI needs the answer for the profile it is about to hand a credential to,
|
|
328
|
+
* and asks the daemon binary what IT will send (`accept-handoff --print-id`).
|
|
329
|
+
* Two programs that compute one identity can only be known to agree by
|
|
330
|
+
* comparing them, and a daemon that predates per-profile identities does not
|
|
331
|
+
* agree: it sends the hardware value whatever the profile's
|
|
332
|
+
* `machine-identity.json` says, so a credential minted for what it reports
|
|
333
|
+
* registers the profile on the default machine's row (the OSK-13845 failure, now
|
|
334
|
+
* reached through version skew rather than through the rule). The comparison
|
|
335
|
+
* needs this: the expected value for the TARGET profile, which is not
|
|
336
|
+
* necessarily the one this process is running as.
|
|
337
|
+
*
|
|
338
|
+
* Decides and persists the profile's identity if nothing has yet — the same
|
|
339
|
+
* side effect `getMachineUuid()` has, for the same reason.
|
|
340
|
+
*/
|
|
341
|
+
function getMachineUuidForProfile(profile) {
|
|
312
342
|
const hardware = getHardwareMachineUuid();
|
|
313
343
|
// A hosted runtime's identity is ISSUED and fenced by the control plane.
|
|
314
344
|
if (hostedRuntimeIdOverride('OVERSKY_MACHINE_UUID'))
|
|
315
345
|
return hardware;
|
|
316
|
-
const
|
|
317
|
-
if (!
|
|
346
|
+
const name = typeof profile === 'string' ? profile.trim() : '';
|
|
347
|
+
if (!name || name === DEFAULT_PROFILE_NAME)
|
|
318
348
|
return hardware;
|
|
319
|
-
return resolveProfileMachineUuid(
|
|
349
|
+
return resolveProfileMachineUuid(name, hardware);
|
|
350
|
+
}
|
|
351
|
+
function readRecordedChoice(profile) {
|
|
352
|
+
try {
|
|
353
|
+
const file = node_path_1.default.join((0, configRoot_js_1.resolveConfigRoot)(), 'profiles', profile, exports.MACHINE_IDENTITY_FILENAME);
|
|
354
|
+
const parsed = JSON.parse(node_fs_1.default.readFileSync(file, 'utf-8'));
|
|
355
|
+
const reason = parsed.reason === 'new_profile' ||
|
|
356
|
+
parsed.reason === 'pre_existing_profile' ||
|
|
357
|
+
parsed.reason === 'restored_profile'
|
|
358
|
+
? parsed.reason
|
|
359
|
+
: null;
|
|
360
|
+
return {
|
|
361
|
+
reason,
|
|
362
|
+
evidence: Array.isArray(parsed.evidence)
|
|
363
|
+
? parsed.evidence.filter((e) => typeof e === 'string')
|
|
364
|
+
: [],
|
|
365
|
+
decidedAt: typeof parsed.decidedAt === 'string' ? parsed.decidedAt : null,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
return { reason: null, evidence: [], decidedAt: null };
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Which machine this process registers as, and WHY — the question a person has
|
|
374
|
+
* when two profiles turn up on one machine page and the logs say nothing.
|
|
375
|
+
*
|
|
376
|
+
* A read, not a decision: it reports the identity `getMachineUuid()` settled on
|
|
377
|
+
* (settling it if nothing has, exactly as any caller would) and the record that
|
|
378
|
+
* explains it. It never changes what a profile registers as.
|
|
379
|
+
*/
|
|
380
|
+
function describeMachineIdentity() {
|
|
381
|
+
const hardware = getHardwareMachineUuid();
|
|
382
|
+
const machineUuid = getMachineUuid();
|
|
383
|
+
const active = activeMachineProfile;
|
|
384
|
+
const profile = active && active !== DEFAULT_PROFILE_NAME ? active : null;
|
|
385
|
+
const base = { profile, machineUuid, hardware };
|
|
386
|
+
if (hostedRuntimeIdOverride('OVERSKY_MACHINE_UUID')) {
|
|
387
|
+
return {
|
|
388
|
+
...base,
|
|
389
|
+
sharesDefaultMachine: false,
|
|
390
|
+
reason: 'hosted_runtime',
|
|
391
|
+
evidence: [],
|
|
392
|
+
decidedAt: null,
|
|
393
|
+
sentence: 'This runtime is hosted; its machine identity was issued by the control plane.',
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
if (!profile) {
|
|
397
|
+
return {
|
|
398
|
+
...base,
|
|
399
|
+
sharesDefaultMachine: false,
|
|
400
|
+
reason: 'default_profile',
|
|
401
|
+
evidence: [],
|
|
402
|
+
decidedAt: null,
|
|
403
|
+
sentence: "The default profile uses this computer's own machine identity.",
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
const recorded = readRecordedChoice(profile);
|
|
407
|
+
const sharesDefaultMachine = machineUuid === hardware;
|
|
408
|
+
const reason = recorded.reason ?? 'unrecorded';
|
|
409
|
+
const decided = recorded.decidedAt ? ` (decided ${recorded.decidedAt})` : '';
|
|
410
|
+
const held = recorded.evidence.length > 0 ? ` (${recorded.evidence.join(', ')})` : '';
|
|
411
|
+
let sentence;
|
|
412
|
+
if (reason === 'new_profile') {
|
|
413
|
+
sentence =
|
|
414
|
+
`Profile '${profile}' has its own machine identity: it held no credentials when that ` +
|
|
415
|
+
`identity was first chosen${decided}.`;
|
|
416
|
+
}
|
|
417
|
+
else if (reason === 'pre_existing_profile') {
|
|
418
|
+
sentence =
|
|
419
|
+
`Profile '${profile}' shares this computer's default machine identity: it already held ` +
|
|
420
|
+
`credentials${held} when its identity was first chosen${decided}, and the server ties ` +
|
|
421
|
+
'those credentials to that identity, so changing it would sign the profile out.';
|
|
422
|
+
}
|
|
423
|
+
else if (reason === 'restored_profile') {
|
|
424
|
+
sentence = sharesDefaultMachine
|
|
425
|
+
? `Profile '${profile}' shares this computer's default machine identity, restored from the ` +
|
|
426
|
+
`copy kept outside the profile after its state was removed${decided}.`
|
|
427
|
+
: `Profile '${profile}' has its own machine identity, restored from the copy kept outside ` +
|
|
428
|
+
`the profile after its state was removed${decided}.`;
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
sentence = sharesDefaultMachine
|
|
432
|
+
? `Profile '${profile}' uses this computer's default machine identity; the record of why ` +
|
|
433
|
+
'could not be read.'
|
|
434
|
+
: `Profile '${profile}' has its own machine identity; the record of why could not be read.`;
|
|
435
|
+
}
|
|
436
|
+
return {
|
|
437
|
+
...base,
|
|
438
|
+
sharesDefaultMachine,
|
|
439
|
+
reason,
|
|
440
|
+
evidence: recorded.evidence,
|
|
441
|
+
decidedAt: recorded.decidedAt,
|
|
442
|
+
sentence,
|
|
443
|
+
};
|
|
320
444
|
}
|
|
321
445
|
/** @internal test seam — forget the cached value so the next call re-probes. */
|
|
322
446
|
function __resetMachineUuidCacheForTest() {
|
|
@@ -282,6 +282,8 @@ export declare function needsReauthState(): {
|
|
|
282
282
|
* which one they hit (OSK-12116).
|
|
283
283
|
*/
|
|
284
284
|
message?: string;
|
|
285
|
+
/** OSK-16941 — the server's session-revocation reason, when one was latched. */
|
|
286
|
+
revocationReason?: string;
|
|
285
287
|
since?: number;
|
|
286
288
|
};
|
|
287
289
|
export declare function clearReauthState(): void;
|
|
@@ -851,8 +851,18 @@ async function doRefresh(serverUrl, currentRefreshToken, daemonId, options = {})
|
|
|
851
851
|
statusCode: 401,
|
|
852
852
|
},
|
|
853
853
|
});
|
|
854
|
-
|
|
855
|
-
|
|
854
|
+
// OSK-16941 — keep WHY a revoked session was revoked, so the CLI and the
|
|
855
|
+
// desktop banner can tell the person instead of a bare code.
|
|
856
|
+
const revocationReason = code === 'SESSION_REVOKED' && typeof parsedBody.reason === 'string'
|
|
857
|
+
? parsedBody.reason.slice(0, 64)
|
|
858
|
+
: undefined;
|
|
859
|
+
persistReauthState({
|
|
860
|
+
code,
|
|
861
|
+
message: parsedBody.message,
|
|
862
|
+
...(revocationReason ? { revocationReason } : {}),
|
|
863
|
+
at: Date.now(),
|
|
864
|
+
});
|
|
865
|
+
throw new types_js_1.PermanentAuthFailure(code, parsedBody.message || code, revocationReason);
|
|
856
866
|
}
|
|
857
867
|
// Unknown-shape 401 — unknown code, missing code, or unparseable body.
|
|
858
868
|
// By construction this is NOT a daemon's actual refresh-family burn
|
|
@@ -975,6 +985,9 @@ function needsReauthState() {
|
|
|
975
985
|
...(typeof state.message === 'string' && state.message.length > 0
|
|
976
986
|
? { message: state.message }
|
|
977
987
|
: {}),
|
|
988
|
+
...(typeof state.revocationReason === 'string' && state.revocationReason.length > 0
|
|
989
|
+
? { revocationReason: state.revocationReason }
|
|
990
|
+
: {}),
|
|
978
991
|
since: state.at,
|
|
979
992
|
};
|
|
980
993
|
}
|
|
@@ -21,6 +21,11 @@ export interface RefreshResponseShape {
|
|
|
21
21
|
code?: string;
|
|
22
22
|
/** Optional human-readable error message. */
|
|
23
23
|
message?: string;
|
|
24
|
+
/**
|
|
25
|
+
* OSK-16941 — with `code: 'SESSION_REVOKED'`, why the session was revoked
|
|
26
|
+
* (`@skrr-ai/data-provider` `SESSION_REVOCATION_REASONS`).
|
|
27
|
+
*/
|
|
28
|
+
reason?: string;
|
|
24
29
|
/** When 200, the new access token. */
|
|
25
30
|
token?: string;
|
|
26
31
|
/** When 200, the (possibly rotated) refresh token. */
|
|
@@ -97,7 +97,9 @@ function classifyRefreshResponse(status, body) {
|
|
|
97
97
|
const fallback = body?.code === 'REFRESH_MISSING' ? 'Refresh token missing' : reason;
|
|
98
98
|
return {
|
|
99
99
|
kind: 'failure',
|
|
100
|
-
failure: new types_js_1.PermanentAuthFailure(reason, body?.message ?? fallback
|
|
100
|
+
failure: new types_js_1.PermanentAuthFailure(reason, body?.message ?? fallback, reason === 'SESSION_REVOKED' && typeof body?.reason === 'string'
|
|
101
|
+
? body.reason
|
|
102
|
+
: undefined),
|
|
101
103
|
};
|
|
102
104
|
}
|
|
103
105
|
// Unknown-shape 401 (no code, or a code we don't recognise). This is NOT a
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Why a session was signed out, and what the person should do next (OSK-16941).
|
|
3
|
+
*
|
|
4
|
+
* ## Why this file exists
|
|
5
|
+
*
|
|
6
|
+
* The server always knew why it refused a session: `requireJwtAuth` answers
|
|
7
|
+
* `401 SESSION_REVOKED` with a `reason` for an inactive account, an account-wide
|
|
8
|
+
* revocation, a password change and a per-session sign-out. Nothing passed it
|
|
9
|
+
* on. The CLI dropped the field, the web client folded every unrecognised code
|
|
10
|
+
* into "your saved credentials are no longer valid", and a refresh refused for a
|
|
11
|
+
* revoked session answered with no code at all. A person signed out with no
|
|
12
|
+
* explanation reasonably concludes their account was stolen.
|
|
13
|
+
*
|
|
14
|
+
* So the vocabulary lives here, once, beside the one function that turns a
|
|
15
|
+
* reason into words: the API writes these codes, the web login page, the desktop
|
|
16
|
+
* banner, the desktop main process (OS notification and tray) and the CLI all
|
|
17
|
+
* render them through `describeSessionRevocation`.
|
|
18
|
+
*
|
|
19
|
+
* ## Why auth-core, behind its own subpath
|
|
20
|
+
*
|
|
21
|
+
* It was declared in `@skrr-ai/data-provider`, which the Electron main process
|
|
22
|
+
* does not (and should not) depend on — so main kept printing the server's raw
|
|
23
|
+
* message in the OS notification and the tray. auth-core is already the
|
|
24
|
+
* package that LATCHES the reason (`refresh.ts` writes `revocationReason` into
|
|
25
|
+
* `needs-reauth.json`), and every desktop, daemon and CLI process already
|
|
26
|
+
* depends on it. This module imports nothing, so the
|
|
27
|
+
* `@skrr-ai/auth-core/session-revocation` subpath is safe in a browser, React
|
|
28
|
+
* Native and Node alike, the same way `first-party-harness` is.
|
|
29
|
+
* `@skrr-ai/data-provider` re-exports it unchanged: there is still exactly one
|
|
30
|
+
* declaration of the vocabulary and one copy of its words.
|
|
31
|
+
*
|
|
32
|
+
* ## Three closed lists
|
|
33
|
+
*
|
|
34
|
+
* - `SESSION_REVOCATION_REASONS` — what a refused CLIENT is told. Wire values;
|
|
35
|
+
* the 401 body's `reason` field. The account-state members keep the spelling
|
|
36
|
+
* `requireJwtAuth` already sent (`banned`, `pending_deletion`, ...), so a
|
|
37
|
+
* client that already switched on them keeps working.
|
|
38
|
+
* - `SESSION_REVOCATION_CAUSES` — what HAPPENED, recorded in Security activity
|
|
39
|
+
* when sessions are revoked. Each cause names its trigger and the reason the
|
|
40
|
+
* signed-out client is told.
|
|
41
|
+
* - `SESSION_REVOCATION_TRIGGERS` — who or what did it.
|
|
42
|
+
*
|
|
43
|
+
* ## Unknown is a member, and it is never hidden
|
|
44
|
+
*
|
|
45
|
+
* Each list carries an explicit `unknown`. A missing, empty or unrecognised
|
|
46
|
+
* value normalizes to it, and its copy says plainly that we could not tell why.
|
|
47
|
+
* It is never folded into the nearest reassuring reading: "Everything reads
|
|
48
|
+
* healthy and the thing is unusable" (root CLAUDE.md) is exactly what an
|
|
49
|
+
* optimistic default here would produce.
|
|
50
|
+
*
|
|
51
|
+
* Copy avoids contractions in code strings so a terminal and a source file read
|
|
52
|
+
* them the same; the web reads the localized keys instead.
|
|
53
|
+
*/
|
|
54
|
+
/**
|
|
55
|
+
* The CLI binary the `cli` surface names when the caller passes no `bin`. A
|
|
56
|
+
* literal because this module imports nothing; `@skrr-ai/data-provider`'s
|
|
57
|
+
* `sessionRevocation.spec` asserts it equals `BRAND_NAME`, so the two cannot
|
|
58
|
+
* drift.
|
|
59
|
+
*/
|
|
60
|
+
export declare const SESSION_REVOCATION_DEFAULT_BIN: "skrr";
|
|
61
|
+
export declare const SESSION_REVOCATION_REASONS: readonly ["password_change", "sessions_revoked", "logged_out", "session_limit", "sign_in_method_removed", "security_check", "machine_removed", "banned", "disabled", "deleted", "pending_deletion", "unknown"];
|
|
62
|
+
export type SessionRevocationReason = (typeof SESSION_REVOCATION_REASONS)[number];
|
|
63
|
+
export declare const SESSION_REVOCATION_UNKNOWN: "unknown";
|
|
64
|
+
/**
|
|
65
|
+
* The login-page query parameter that carries a revocation reason across the
|
|
66
|
+
* sign-out redirect (`/login?reason=SESSION_REVOKED&revocation=password_change`).
|
|
67
|
+
* `reason` keeps the refusal CODE it always carried, so a login page that
|
|
68
|
+
* predates this still says something.
|
|
69
|
+
*/
|
|
70
|
+
export declare const SESSION_REVOCATION_QUERY_PARAM: "revocation";
|
|
71
|
+
export declare function isSessionRevocationReason(value: unknown): value is SessionRevocationReason;
|
|
72
|
+
/**
|
|
73
|
+
* The canonical reason for any value a server or a URL handed us. Anything not
|
|
74
|
+
* in the vocabulary is `unknown` — never a guess.
|
|
75
|
+
*/
|
|
76
|
+
export declare function normalizeSessionRevocationReason(value: unknown): SessionRevocationReason;
|
|
77
|
+
/**
|
|
78
|
+
* Refusal codes that end a session WITHOUT revoking it, each of which a surface
|
|
79
|
+
* explains in its own sentence (expired, no longer valid). Every other code a
|
|
80
|
+
* refusal latch can carry is read as a revocation.
|
|
81
|
+
*/
|
|
82
|
+
export declare const NON_REVOCATION_REFUSAL_CODES: readonly ["REFRESH_EXPIRED", "TOKEN_EXPIRED", "REFRESH_INVALID", "TOKEN_INVALID"];
|
|
83
|
+
export type NonRevocationRefusalCode = (typeof NON_REVOCATION_REFUSAL_CODES)[number];
|
|
84
|
+
export declare function isNonRevocationRefusalCode(value: unknown): value is NonRevocationRefusalCode;
|
|
85
|
+
/**
|
|
86
|
+
* The revocation reason a refusal names — from a refusal CODE (`SESSION_REVOKED`,
|
|
87
|
+
* `REFRESH_REUSED`, ...) and the revocation reason that travelled beside it —
|
|
88
|
+
* or `null` when the code is one of `NON_REVOCATION_REFUSAL_CODES`.
|
|
89
|
+
*
|
|
90
|
+
* - A revocation reason, when present, always wins.
|
|
91
|
+
* - `SESSION_REVOKED` with no reason beside it IS a revocation whose reason we
|
|
92
|
+
* do not know, so it is `unknown`.
|
|
93
|
+
* - `REFRESH_REUSED` is the refresh-family burn, i.e. a security check.
|
|
94
|
+
* - Any other code, including none at all, is `unknown`: "we could not tell
|
|
95
|
+
* why", never a guess.
|
|
96
|
+
*
|
|
97
|
+
* Shared by the web banner and the desktop main process so the two read one
|
|
98
|
+
* latch the same way.
|
|
99
|
+
*/
|
|
100
|
+
export declare function sessionRevocationForRefusal(code: string | undefined | null, revocation?: string | undefined | null): SessionRevocationReason | null;
|
|
101
|
+
export declare const SESSION_REVOCATION_NEXT_STEPS: readonly ["sign_in", "sign_in_and_review", "cancel_deletion", "contact_support", "use_another_account"];
|
|
102
|
+
export type SessionRevocationNextStep = (typeof SESSION_REVOCATION_NEXT_STEPS)[number];
|
|
103
|
+
/** Where the copy is shown: the CLI names its command, an app names a screen. */
|
|
104
|
+
export type SessionRevocationSurface = 'cli' | 'app';
|
|
105
|
+
/** Translation keys the web client renders; English values mirror the copy above. */
|
|
106
|
+
export interface SessionRevocationKeys {
|
|
107
|
+
title: `com_auth_revoked_${SessionRevocationReason}_title`;
|
|
108
|
+
detail: `com_auth_revoked_${SessionRevocationReason}_detail`;
|
|
109
|
+
nextStep: `com_auth_revoked_next_${SessionRevocationNextStep}`;
|
|
110
|
+
}
|
|
111
|
+
export interface SessionRevocationDescription {
|
|
112
|
+
/** The canonical reason; `unknown` for anything unrecognised or missing. */
|
|
113
|
+
reason: SessionRevocationReason;
|
|
114
|
+
/**
|
|
115
|
+
* The value as received when it was NOT a recognised reason (and not empty),
|
|
116
|
+
* so a surface can show the code it could not explain instead of losing it.
|
|
117
|
+
*/
|
|
118
|
+
unrecognized: string | null;
|
|
119
|
+
title: string;
|
|
120
|
+
detail: string;
|
|
121
|
+
nextStep: SessionRevocationNextStep;
|
|
122
|
+
/** The next step as a sentence for the requested surface. */
|
|
123
|
+
nextStepText: string;
|
|
124
|
+
/** Whether the person should look at Security activity to explain it. */
|
|
125
|
+
reviewSecurityActivity: boolean;
|
|
126
|
+
keys: SessionRevocationKeys;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* THE copy for a revoked session. Never throws, whatever it is given: the server
|
|
130
|
+
* can ship a reason before a client knows it, and that case must still say
|
|
131
|
+
* something true ("we could not tell why"), not nothing.
|
|
132
|
+
*/
|
|
133
|
+
export declare function describeSessionRevocation(value: unknown, { surface, bin, }?: {
|
|
134
|
+
surface?: SessionRevocationSurface;
|
|
135
|
+
bin?: string;
|
|
136
|
+
}): SessionRevocationDescription;
|
|
137
|
+
/** One line for a terminal or a notification: title, detail and next step. */
|
|
138
|
+
export declare function formatSessionRevocation(value: unknown, options?: {
|
|
139
|
+
surface?: SessionRevocationSurface;
|
|
140
|
+
bin?: string;
|
|
141
|
+
}): string;
|
|
142
|
+
export declare const SESSION_REVOCATION_TRIGGERS: readonly ["account_owner", "administrator", "security_system", "external_provider", "account_lifecycle", "unknown"];
|
|
143
|
+
export type SessionRevocationTrigger = (typeof SESSION_REVOCATION_TRIGGERS)[number];
|
|
144
|
+
export declare const SESSION_REVOCATION_CAUSES: readonly ["password_change", "password_reset", "sign_out_everywhere", "sign_out_other_sessions", "session_signed_out", "two_factor_change", "email_change", "email_change_reverted", "account_recovery", "reported_not_me", "sign_in_method_removed", "machine_removed", "oauth_app_revoked", "session_limit", "suspicious_reuse", "administrator", "account_suspended", "external_provider", "account_deletion_scheduled", "account_superseded", "unverified_account_cleanup", "unknown"];
|
|
145
|
+
export type SessionRevocationCause = (typeof SESSION_REVOCATION_CAUSES)[number];
|
|
146
|
+
interface CauseFacts {
|
|
147
|
+
trigger: SessionRevocationTrigger;
|
|
148
|
+
/** What a client signed out by this cause is told. */
|
|
149
|
+
reason: SessionRevocationReason;
|
|
150
|
+
/** English sentence for the Security activity row. */
|
|
151
|
+
copy: string;
|
|
152
|
+
}
|
|
153
|
+
export declare const SESSION_REVOCATION_CAUSE_FACTS: Readonly<Record<SessionRevocationCause, CauseFacts>>;
|
|
154
|
+
export declare const SESSION_REVOCATION_TRIGGER_COPY: Readonly<Record<SessionRevocationTrigger, string>>;
|
|
155
|
+
export declare function normalizeSessionRevocationCause(value: unknown): SessionRevocationCause;
|
|
156
|
+
export declare function normalizeSessionRevocationTrigger(value: unknown): SessionRevocationTrigger;
|
|
157
|
+
export interface SessionRevocationActivityDescription {
|
|
158
|
+
cause: SessionRevocationCause;
|
|
159
|
+
trigger: SessionRevocationTrigger;
|
|
160
|
+
reason: SessionRevocationReason;
|
|
161
|
+
causeText: string;
|
|
162
|
+
triggerText: string;
|
|
163
|
+
keys: {
|
|
164
|
+
cause: `com_nav_security_activity_revocation_cause_${SessionRevocationCause}`;
|
|
165
|
+
trigger: `com_nav_security_activity_revocation_trigger_${SessionRevocationTrigger}`;
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* How Security activity explains one recorded revocation. A stored trigger wins
|
|
170
|
+
* over the cause's usual one (an administrator can change a password too); an
|
|
171
|
+
* unreadable one is `unknown`, never the cause's default.
|
|
172
|
+
*/
|
|
173
|
+
export declare function describeSessionRevocationActivity(record: {
|
|
174
|
+
cause?: unknown;
|
|
175
|
+
trigger?: unknown;
|
|
176
|
+
}): SessionRevocationActivityDescription;
|
|
177
|
+
export {};
|