toolroll 0.5.0
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/LICENSE +21 -0
- package/README.md +1113 -0
- package/THIRD_PARTY_NOTICES.md +449 -0
- package/dist/accent-colors.d.ts +48 -0
- package/dist/accent-colors.js +122 -0
- package/dist/action-ledger.d.ts +26 -0
- package/dist/action-ledger.js +75 -0
- package/dist/agent-fence.d.ts +42 -0
- package/dist/agent-fence.js +183 -0
- package/dist/agentconfig.d.ts +216 -0
- package/dist/agentconfig.js +454 -0
- package/dist/api-tokens.d.ts +16 -0
- package/dist/api-tokens.js +27 -0
- package/dist/approval-policy.d.ts +69 -0
- package/dist/approval-policy.js +137 -0
- package/dist/approval-rules-ui.d.ts +25 -0
- package/dist/approval-rules-ui.js +39 -0
- package/dist/assignment-adapters.d.ts +180 -0
- package/dist/assignment-adapters.js +239 -0
- package/dist/assignment-brief.d.ts +71 -0
- package/dist/assignment-brief.js +129 -0
- package/dist/assignment-delivery.d.ts +56 -0
- package/dist/assignment-delivery.js +160 -0
- package/dist/assignment-presentation.d.ts +26 -0
- package/dist/assignment-presentation.js +80 -0
- package/dist/assignment-status.d.ts +62 -0
- package/dist/assignment-status.js +152 -0
- package/dist/assignment-ui.d.ts +71 -0
- package/dist/assignment-ui.js +103 -0
- package/dist/assignment.d.ts +222 -0
- package/dist/assignment.js +399 -0
- package/dist/attest.d.ts +56 -0
- package/dist/attest.js +153 -0
- package/dist/backend.d.ts +97 -0
- package/dist/backend.js +166 -0
- package/dist/backup-ui.d.ts +22 -0
- package/dist/backup-ui.js +59 -0
- package/dist/backup.d.ts +84 -0
- package/dist/backup.js +421 -0
- package/dist/beads.d.ts +34 -0
- package/dist/beads.js +135 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +22 -0
- package/dist/board.d.ts +150 -0
- package/dist/board.js +210 -0
- package/dist/boot-identity.d.ts +63 -0
- package/dist/boot-identity.js +99 -0
- package/dist/browser/THIRD_PARTY_NOTICES.txt +2295 -0
- package/dist/browser/workspace.css +4 -0
- package/dist/browser/workspace.js +225 -0
- package/dist/browser-crew.d.ts +11 -0
- package/dist/browser-crew.js +50 -0
- package/dist/browser-shell.d.ts +8 -0
- package/dist/browser-shell.js +60 -0
- package/dist/browser-workspace.d.ts +780 -0
- package/dist/browser-workspace.js +47 -0
- package/dist/budget-alerts.d.ts +19 -0
- package/dist/budget-alerts.js +46 -0
- package/dist/builder.d.ts +370 -0
- package/dist/builder.js +3262 -0
- package/dist/capscan.d.ts +35 -0
- package/dist/capscan.js +113 -0
- package/dist/chat-acceptance.d.ts +71 -0
- package/dist/chat-acceptance.js +120 -0
- package/dist/chat-actions.d.ts +265 -0
- package/dist/chat-actions.js +1273 -0
- package/dist/chat-channel.d.ts +109 -0
- package/dist/chat-channel.js +652 -0
- package/dist/chat-continuity.d.ts +32 -0
- package/dist/chat-continuity.js +317 -0
- package/dist/chat-controls.d.ts +113 -0
- package/dist/chat-controls.js +53 -0
- package/dist/chat-delivery-state.d.ts +159 -0
- package/dist/chat-delivery-state.js +309 -0
- package/dist/chat-delivery.d.ts +38 -0
- package/dist/chat-delivery.js +693 -0
- package/dist/chat-display.d.ts +1 -0
- package/dist/chat-display.js +18 -0
- package/dist/chat-evidence.d.ts +123 -0
- package/dist/chat-evidence.js +207 -0
- package/dist/chat-flow.d.ts +44 -0
- package/dist/chat-flow.js +215 -0
- package/dist/chat-inbox.d.ts +57 -0
- package/dist/chat-inbox.js +123 -0
- package/dist/chat-polish.d.ts +16 -0
- package/dist/chat-polish.js +135 -0
- package/dist/chat-review.d.ts +46 -0
- package/dist/chat-review.js +98 -0
- package/dist/chat-rooms.d.ts +123 -0
- package/dist/chat-rooms.js +216 -0
- package/dist/chat-task-actions.d.ts +44 -0
- package/dist/chat-task-actions.js +79 -0
- package/dist/check-progress.d.ts +51 -0
- package/dist/check-progress.js +290 -0
- package/dist/child-database.d.ts +12 -0
- package/dist/child-database.js +30 -0
- package/dist/claim.d.ts +688 -0
- package/dist/claim.js +1740 -0
- package/dist/cli.d.ts +137 -0
- package/dist/cli.js +1461 -0
- package/dist/codex-limits.d.ts +15 -0
- package/dist/codex-limits.js +145 -0
- package/dist/coding-context.d.ts +55 -0
- package/dist/coding-context.js +92 -0
- package/dist/coding-handoff.d.ts +57 -0
- package/dist/coding-handoff.js +277 -0
- package/dist/coding-provider.d.ts +72 -0
- package/dist/coding-provider.js +424 -0
- package/dist/coding-shipping-ui.d.ts +4 -0
- package/dist/coding-shipping-ui.js +12 -0
- package/dist/coding-types.d.ts +62 -0
- package/dist/coding-types.js +1 -0
- package/dist/coding-ui.d.ts +17 -0
- package/dist/coding-ui.js +364 -0
- package/dist/coding-update.d.ts +15 -0
- package/dist/coding-update.js +149 -0
- package/dist/coding-workspace.d.ts +124 -0
- package/dist/coding-workspace.js +768 -0
- package/dist/container-state.d.ts +5 -0
- package/dist/container-state.js +62 -0
- package/dist/containment.d.ts +197 -0
- package/dist/containment.js +559 -0
- package/dist/contest.d.ts +318 -0
- package/dist/contest.js +753 -0
- package/dist/control-setup.d.ts +35 -0
- package/dist/control-setup.js +40 -0
- package/dist/control-ui.d.ts +29 -0
- package/dist/control-ui.js +53 -0
- package/dist/controller-service.d.ts +1 -0
- package/dist/controller-service.js +19 -0
- package/dist/controller-supervisor.d.ts +30 -0
- package/dist/controller-supervisor.js +104 -0
- package/dist/converse.d.ts +304 -0
- package/dist/converse.js +849 -0
- package/dist/coordinator-proposals.d.ts +29 -0
- package/dist/coordinator-proposals.js +137 -0
- package/dist/coordinator.d.ts +186 -0
- package/dist/coordinator.js +447 -0
- package/dist/credentials-ui.d.ts +25 -0
- package/dist/credentials-ui.js +48 -0
- package/dist/daemon.d.ts +209 -0
- package/dist/daemon.js +604 -0
- package/dist/decision.d.ts +120 -0
- package/dist/decision.js +388 -0
- package/dist/demo.d.ts +55 -0
- package/dist/demo.js +992 -0
- package/dist/desktop-access.d.ts +28 -0
- package/dist/desktop-access.js +88 -0
- package/dist/desktop-bundle.d.ts +16 -0
- package/dist/desktop-bundle.js +74 -0
- package/dist/desktop-host.d.ts +54 -0
- package/dist/desktop-host.js +508 -0
- package/dist/desktop-update-gate.d.ts +12 -0
- package/dist/desktop-update-gate.js +91 -0
- package/dist/desktop-update-recovery.d.ts +14 -0
- package/dist/desktop-update-recovery.js +243 -0
- package/dist/desktop-update.d.ts +110 -0
- package/dist/desktop-update.js +740 -0
- package/dist/discord-api.d.ts +20 -0
- package/dist/discord-api.js +138 -0
- package/dist/discord-chat.d.ts +16 -0
- package/dist/discord-chat.js +381 -0
- package/dist/discord-settings.d.ts +7 -0
- package/dist/discord-settings.js +75 -0
- package/dist/discord.d.ts +10 -0
- package/dist/discord.js +169 -0
- package/dist/discover.d.ts +75 -0
- package/dist/discover.js +150 -0
- package/dist/dispatch.d.ts +100 -0
- package/dist/dispatch.js +311 -0
- package/dist/dispose.d.ts +161 -0
- package/dist/dispose.js +803 -0
- package/dist/email-settings.d.ts +34 -0
- package/dist/email-settings.js +50 -0
- package/dist/envelope.d.ts +47 -0
- package/dist/envelope.js +105 -0
- package/dist/evidence-pack.d.ts +185 -0
- package/dist/evidence-pack.js +258 -0
- package/dist/evidence.d.ts +345 -0
- package/dist/evidence.js +782 -0
- package/dist/exec.d.ts +285 -0
- package/dist/exec.js +1841 -0
- package/dist/exhaustion.d.ts +85 -0
- package/dist/exhaustion.js +141 -0
- package/dist/export-ui.d.ts +4 -0
- package/dist/export-ui.js +17 -0
- package/dist/export.d.ts +48 -0
- package/dist/export.js +305 -0
- package/dist/flow-actions.d.ts +77 -0
- package/dist/flow-actions.js +203 -0
- package/dist/flow-code.d.ts +50 -0
- package/dist/flow-code.js +159 -0
- package/dist/flow-draft.d.ts +38 -0
- package/dist/flow-draft.js +80 -0
- package/dist/flow-engine.d.ts +66 -0
- package/dist/flow-engine.js +416 -0
- package/dist/flow-insights.d.ts +95 -0
- package/dist/flow-insights.js +149 -0
- package/dist/flow-live.d.ts +24 -0
- package/dist/flow-live.js +150 -0
- package/dist/flow-people.d.ts +24 -0
- package/dist/flow-people.js +91 -0
- package/dist/flow-replies.d.ts +48 -0
- package/dist/flow-replies.js +113 -0
- package/dist/flow-scripts.d.ts +38 -0
- package/dist/flow-scripts.js +73 -0
- package/dist/flow-secrets.d.ts +13 -0
- package/dist/flow-secrets.js +45 -0
- package/dist/flow-sort.d.ts +82 -0
- package/dist/flow-sort.js +153 -0
- package/dist/flow-steps.d.ts +40 -0
- package/dist/flow-steps.js +408 -0
- package/dist/flow-triggers.d.ts +244 -0
- package/dist/flow-triggers.js +959 -0
- package/dist/flows-ui.d.ts +20 -0
- package/dist/flows-ui.js +175 -0
- package/dist/flows.d.ts +229 -0
- package/dist/flows.js +968 -0
- package/dist/fonts.d.ts +19 -0
- package/dist/fonts.js +19 -0
- package/dist/gaps.d.ts +35 -0
- package/dist/gaps.js +101 -0
- package/dist/gate-failure.d.ts +40 -0
- package/dist/gate-failure.js +66 -0
- package/dist/git.d.ts +54 -0
- package/dist/git.js +94 -0
- package/dist/google-mail.d.ts +58 -0
- package/dist/google-mail.js +151 -0
- package/dist/grant.d.ts +136 -0
- package/dist/grant.js +238 -0
- package/dist/graph.d.ts +164 -0
- package/dist/graph.js +383 -0
- package/dist/guides.d.ts +22 -0
- package/dist/guides.js +363 -0
- package/dist/held.d.ts +150 -0
- package/dist/held.js +799 -0
- package/dist/invoke.d.ts +112 -0
- package/dist/invoke.js +780 -0
- package/dist/issues.d.ts +41 -0
- package/dist/issues.js +131 -0
- package/dist/job-object-helper.ps1 +252 -0
- package/dist/jsonl-discriminants.d.ts +11 -0
- package/dist/jsonl-discriminants.js +93 -0
- package/dist/keys.d.ts +104 -0
- package/dist/keys.js +229 -0
- package/dist/kits-ui.d.ts +17 -0
- package/dist/kits-ui.js +46 -0
- package/dist/kits.d.ts +86 -0
- package/dist/kits.js +215 -0
- package/dist/knowledge-cli.d.ts +101 -0
- package/dist/knowledge-cli.js +92 -0
- package/dist/knowledge-ui.d.ts +24 -0
- package/dist/knowledge-ui.js +40 -0
- package/dist/lead-context.d.ts +8 -0
- package/dist/lead-context.js +56 -0
- package/dist/lead-follow.d.ts +22 -0
- package/dist/lead-follow.js +167 -0
- package/dist/lead-status.d.ts +75 -0
- package/dist/lead-status.js +285 -0
- package/dist/ledger-chain.d.ts +46 -0
- package/dist/ledger-chain.js +187 -0
- package/dist/ledger-csv.d.ts +4 -0
- package/dist/ledger-csv.js +11 -0
- package/dist/ledger-view.d.ts +24 -0
- package/dist/ledger-view.js +58 -0
- package/dist/limits-ui.d.ts +26 -0
- package/dist/limits-ui.js +67 -0
- package/dist/link.d.ts +72 -0
- package/dist/link.js +217 -0
- package/dist/live.d.ts +96 -0
- package/dist/live.js +366 -0
- package/dist/liveness.d.ts +30 -0
- package/dist/liveness.js +42 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +25 -0
- package/dist/mailbox.d.ts +57 -0
- package/dist/mailbox.js +150 -0
- package/dist/maintenance.d.ts +11 -0
- package/dist/maintenance.js +35 -0
- package/dist/mate-cli.d.ts +52 -0
- package/dist/mate-cli.js +345 -0
- package/dist/mate-contract.d.ts +10 -0
- package/dist/mate-contract.js +30 -0
- package/dist/mate-doors.d.ts +69 -0
- package/dist/mate-doors.js +548 -0
- package/dist/mate-progress.d.ts +29 -0
- package/dist/mate-progress.js +121 -0
- package/dist/mate-tools.d.ts +94 -0
- package/dist/mate-tools.js +1878 -0
- package/dist/mate.d.ts +92 -0
- package/dist/mate.js +435 -0
- package/dist/mcp-connect.d.ts +103 -0
- package/dist/mcp-connect.js +252 -0
- package/dist/mcp.d.ts +27 -0
- package/dist/mcp.js +651 -0
- package/dist/memory-cli.d.ts +466 -0
- package/dist/memory-cli.js +111 -0
- package/dist/memory-pass.d.ts +160 -0
- package/dist/memory-pass.js +409 -0
- package/dist/metrics.d.ts +3 -0
- package/dist/metrics.js +56 -0
- package/dist/mobile-viewport.d.ts +3 -0
- package/dist/mobile-viewport.js +37 -0
- package/dist/model-catalog.d.ts +118 -0
- package/dist/model-catalog.js +376 -0
- package/dist/models-cli.d.ts +102 -0
- package/dist/models-cli.js +66 -0
- package/dist/models-ui.d.ts +34 -0
- package/dist/models-ui.js +68 -0
- package/dist/modes.d.ts +80 -0
- package/dist/modes.js +182 -0
- package/dist/monitoring-settings.d.ts +44 -0
- package/dist/monitoring-settings.js +173 -0
- package/dist/monitoring-ui.d.ts +20 -0
- package/dist/monitoring-ui.js +51 -0
- package/dist/monitoring.d.ts +34 -0
- package/dist/monitoring.js +221 -0
- package/dist/names.d.ts +67 -0
- package/dist/names.js +102 -0
- package/dist/observations.d.ts +40 -0
- package/dist/observations.js +211 -0
- package/dist/oidc.d.ts +71 -0
- package/dist/oidc.js +182 -0
- package/dist/onboard.d.ts +108 -0
- package/dist/onboard.js +325 -0
- package/dist/openrouter-models.d.ts +30 -0
- package/dist/openrouter-models.js +120 -0
- package/dist/operate.d.ts +118 -0
- package/dist/operate.js +11321 -0
- package/dist/peek-cli.d.ts +97 -0
- package/dist/peek-cli.js +215 -0
- package/dist/peek.d.ts +134 -0
- package/dist/peek.js +578 -0
- package/dist/phase-routing.d.ts +307 -0
- package/dist/phase-routing.js +658 -0
- package/dist/plan-auto.d.ts +14 -0
- package/dist/plan-auto.js +92 -0
- package/dist/plan.d.ts +186 -0
- package/dist/plan.js +401 -0
- package/dist/planner-source.d.ts +251 -0
- package/dist/planner-source.js +460 -0
- package/dist/planner.d.ts +75 -0
- package/dist/planner.js +992 -0
- package/dist/policy-ui.d.ts +20 -0
- package/dist/policy-ui.js +41 -0
- package/dist/policy.d.ts +111 -0
- package/dist/policy.js +231 -0
- package/dist/prepared-evidence.d.ts +16 -0
- package/dist/prepared-evidence.js +96 -0
- package/dist/pricing.d.ts +45 -0
- package/dist/pricing.js +77 -0
- package/dist/principal.d.ts +42 -0
- package/dist/principal.js +82 -0
- package/dist/probe.d.ts +46 -0
- package/dist/probe.js +79 -0
- package/dist/process-custody.d.ts +17 -0
- package/dist/process-custody.js +91 -0
- package/dist/process-liveness.d.ts +10 -0
- package/dist/process-liveness.js +81 -0
- package/dist/process-recovery-anchor.d.ts +75 -0
- package/dist/process-recovery-anchor.js +188 -0
- package/dist/process-recovery-coalition.d.ts +25 -0
- package/dist/process-recovery-coalition.js +105 -0
- package/dist/process-recovery-eligibility.d.ts +178 -0
- package/dist/process-recovery-eligibility.js +170 -0
- package/dist/process-recovery-native.d.ts +172 -0
- package/dist/process-recovery-native.js +592 -0
- package/dist/process-recovery-provenance.d.ts +163 -0
- package/dist/process-recovery-provenance.js +292 -0
- package/dist/process-recovery-services.d.ts +56 -0
- package/dist/process-recovery-services.js +191 -0
- package/dist/process-recovery-settlement.d.ts +32 -0
- package/dist/process-recovery-settlement.js +132 -0
- package/dist/process-recovery.d.ts +41 -0
- package/dist/process-recovery.js +91 -0
- package/dist/process-tree.d.ts +41 -0
- package/dist/process-tree.js +264 -0
- package/dist/project-access.d.ts +14 -0
- package/dist/project-access.js +34 -0
- package/dist/project-cli.d.ts +18 -0
- package/dist/project-cli.js +104 -0
- package/dist/project-delete-ui.d.ts +22 -0
- package/dist/project-delete-ui.js +48 -0
- package/dist/project-delete.d.ts +55 -0
- package/dist/project-delete.js +413 -0
- package/dist/project-knowledge.d.ts +111 -0
- package/dist/project-knowledge.js +241 -0
- package/dist/project-learning.d.ts +100 -0
- package/dist/project-learning.js +438 -0
- package/dist/project-memory.d.ts +81 -0
- package/dist/project-memory.js +264 -0
- package/dist/project-skills.d.ts +152 -0
- package/dist/project-skills.js +660 -0
- package/dist/project-tools.d.ts +219 -0
- package/dist/project-tools.js +796 -0
- package/dist/project.d.ts +61 -0
- package/dist/project.js +125 -0
- package/dist/prompt.d.ts +22 -0
- package/dist/prompt.js +72 -0
- package/dist/proof.d.ts +513 -0
- package/dist/proof.js +1140 -0
- package/dist/proposal.d.ts +82 -0
- package/dist/proposal.js +210 -0
- package/dist/provider-connection.d.ts +22 -0
- package/dist/provider-connection.js +98 -0
- package/dist/provider-limits.d.ts +35 -0
- package/dist/provider-limits.js +95 -0
- package/dist/provider.d.ts +279 -0
- package/dist/provider.js +935 -0
- package/dist/publish.d.ts +107 -0
- package/dist/publish.js +650 -0
- package/dist/pulls.d.ts +118 -0
- package/dist/pulls.js +240 -0
- package/dist/push.d.ts +95 -0
- package/dist/push.js +353 -0
- package/dist/quality.d.ts +8 -0
- package/dist/quality.js +6 -0
- package/dist/recipe-ui.d.ts +18 -0
- package/dist/recipe-ui.js +152 -0
- package/dist/recipes.d.ts +81 -0
- package/dist/recipes.js +332 -0
- package/dist/remote.d.ts +67 -0
- package/dist/remote.js +122 -0
- package/dist/render.d.ts +64 -0
- package/dist/render.js +587 -0
- package/dist/report-summary.d.ts +13 -0
- package/dist/report-summary.js +15 -0
- package/dist/repos.d.ts +65 -0
- package/dist/repos.js +277 -0
- package/dist/repository-context-ui.d.ts +2 -0
- package/dist/repository-context-ui.js +10 -0
- package/dist/repository-context.d.ts +67 -0
- package/dist/repository-context.js +376 -0
- package/dist/restart-certification.d.ts +134 -0
- package/dist/restart-certification.js +226 -0
- package/dist/result-actions.d.ts +28 -0
- package/dist/result-actions.js +270 -0
- package/dist/result-completion.d.ts +18 -0
- package/dist/result-completion.js +66 -0
- package/dist/result-review.d.ts +213 -0
- package/dist/result-review.js +430 -0
- package/dist/retention-ui.d.ts +12 -0
- package/dist/retention-ui.js +39 -0
- package/dist/retention.d.ts +72 -0
- package/dist/retention.js +288 -0
- package/dist/review-context.d.ts +243 -0
- package/dist/review-context.js +1043 -0
- package/dist/review-evidence.d.ts +33 -0
- package/dist/review-evidence.js +56 -0
- package/dist/reviewer.d.ts +97 -0
- package/dist/reviewer.js +202 -0
- package/dist/routine.d.ts +228 -0
- package/dist/routine.js +764 -0
- package/dist/runner.d.ts +266 -0
- package/dist/runner.js +399 -0
- package/dist/scan.d.ts +32 -0
- package/dist/scan.js +92 -0
- package/dist/scope.d.ts +695 -0
- package/dist/scope.js +1176 -0
- package/dist/scout-report.d.ts +42 -0
- package/dist/scout-report.js +108 -0
- package/dist/scout.d.ts +69 -0
- package/dist/scout.js +351 -0
- package/dist/serve.d.ts +313 -0
- package/dist/serve.js +21776 -0
- package/dist/session-brief.d.ts +8 -0
- package/dist/session-brief.js +24 -0
- package/dist/session-cli.d.ts +13 -0
- package/dist/session-cli.js +284 -0
- package/dist/session-contract.d.ts +183 -0
- package/dist/session-contract.js +122 -0
- package/dist/session-http.d.ts +19 -0
- package/dist/session-http.js +154 -0
- package/dist/session-server.d.ts +12 -0
- package/dist/session-server.js +37 -0
- package/dist/session-service.d.ts +22 -0
- package/dist/session-service.js +157 -0
- package/dist/setup-guide.d.ts +39 -0
- package/dist/setup-guide.js +93 -0
- package/dist/sign-in-guard.d.ts +45 -0
- package/dist/sign-in-guard.js +74 -0
- package/dist/skills-ui.d.ts +11 -0
- package/dist/skills-ui.js +58 -0
- package/dist/skills.d.ts +97 -0
- package/dist/skills.js +276 -0
- package/dist/slack-api.d.ts +55 -0
- package/dist/slack-api.js +229 -0
- package/dist/slack-chat.d.ts +28 -0
- package/dist/slack-chat.js +413 -0
- package/dist/slack-settings.d.ts +7 -0
- package/dist/slack-settings.js +75 -0
- package/dist/slack-state.d.ts +13 -0
- package/dist/slack-state.js +9 -0
- package/dist/slack.d.ts +13 -0
- package/dist/slack.js +167 -0
- package/dist/spend-ui.d.ts +28 -0
- package/dist/spend-ui.js +95 -0
- package/dist/spend.d.ts +142 -0
- package/dist/spend.js +313 -0
- package/dist/sqlite-runtime.d.ts +3 -0
- package/dist/sqlite-runtime.js +6 -0
- package/dist/sso-settings.d.ts +33 -0
- package/dist/sso-settings.js +103 -0
- package/dist/sso-ui.d.ts +22 -0
- package/dist/sso-ui.js +39 -0
- package/dist/storage.d.ts +15 -0
- package/dist/storage.js +84 -0
- package/dist/store.d.ts +7754 -0
- package/dist/store.js +23279 -0
- package/dist/structured-output.d.ts +58 -0
- package/dist/structured-output.js +103 -0
- package/dist/style-asset.d.ts +7 -0
- package/dist/style-asset.js +41 -0
- package/dist/subscription-chat.d.ts +46 -0
- package/dist/subscription-chat.js +275 -0
- package/dist/summary.d.ts +33 -0
- package/dist/summary.js +71 -0
- package/dist/supervisor.mjs +297 -0
- package/dist/surface.d.ts +63 -0
- package/dist/surface.js +352 -0
- package/dist/sync.d.ts +94 -0
- package/dist/sync.js +279 -0
- package/dist/task-composer.d.ts +13 -0
- package/dist/task-composer.js +52 -0
- package/dist/task-control.d.ts +165 -0
- package/dist/task-control.js +214 -0
- package/dist/task-outcome-cli.d.ts +10 -0
- package/dist/task-outcome-cli.js +92 -0
- package/dist/task-text.d.ts +30 -0
- package/dist/task-text.js +41 -0
- package/dist/team-cli.d.ts +15 -0
- package/dist/team-cli.js +618 -0
- package/dist/team-contract.d.ts +92 -0
- package/dist/team-contract.js +1 -0
- package/dist/team-http.d.ts +17 -0
- package/dist/team-http.js +144 -0
- package/dist/team-leads.d.ts +81 -0
- package/dist/team-leads.js +565 -0
- package/dist/team-runtime.d.ts +27 -0
- package/dist/team-runtime.js +264 -0
- package/dist/team-ui.d.ts +3 -0
- package/dist/team-ui.js +9 -0
- package/dist/team-updates.d.ts +8 -0
- package/dist/team-updates.js +57 -0
- package/dist/teammate-admin.d.ts +53 -0
- package/dist/teammate-admin.js +111 -0
- package/dist/teammate-desk.d.ts +60 -0
- package/dist/teammate-desk.js +154 -0
- package/dist/teammate-memory.d.ts +64 -0
- package/dist/teammate-memory.js +196 -0
- package/dist/teammate-question.d.ts +59 -0
- package/dist/teammate-question.js +175 -0
- package/dist/teammate-tools.d.ts +108 -0
- package/dist/teammate-tools.js +271 -0
- package/dist/teammate-week.d.ts +68 -0
- package/dist/teammate-week.js +132 -0
- package/dist/teammate-work.d.ts +76 -0
- package/dist/teammate-work.js +280 -0
- package/dist/teammates-ui.d.ts +20 -0
- package/dist/teammates-ui.js +166 -0
- package/dist/teammates.d.ts +180 -0
- package/dist/teammates.js +253 -0
- package/dist/teams-api.d.ts +33 -0
- package/dist/teams-api.js +204 -0
- package/dist/teams-chat.d.ts +26 -0
- package/dist/teams-chat.js +215 -0
- package/dist/teams-settings.d.ts +12 -0
- package/dist/teams-settings.js +57 -0
- package/dist/teams.d.ts +21 -0
- package/dist/teams.js +124 -0
- package/dist/telegram-flow.d.ts +49 -0
- package/dist/telegram-flow.js +110 -0
- package/dist/telegram-mate.d.ts +137 -0
- package/dist/telegram-mate.js +707 -0
- package/dist/telegram-progress.d.ts +14 -0
- package/dist/telegram-progress.js +129 -0
- package/dist/telegram-settings.d.ts +9 -0
- package/dist/telegram-settings.js +36 -0
- package/dist/telegram-status.d.ts +75 -0
- package/dist/telegram-status.js +265 -0
- package/dist/telegram-team.d.ts +85 -0
- package/dist/telegram-team.js +359 -0
- package/dist/telegram.d.ts +230 -0
- package/dist/telegram.js +1931 -0
- package/dist/templates.d.ts +65 -0
- package/dist/templates.js +118 -0
- package/dist/tool-launcher.d.ts +1 -0
- package/dist/tool-launcher.js +101 -0
- package/dist/tools-ui.d.ts +30 -0
- package/dist/tools-ui.js +40 -0
- package/dist/transitions-recipes.d.ts +1 -0
- package/dist/transitions-recipes.js +203 -0
- package/dist/tree-proof.d.ts +34 -0
- package/dist/tree-proof.js +58 -0
- package/dist/verification-evidence.d.ts +44 -0
- package/dist/verification-evidence.js +238 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +10 -0
- package/dist/webhooks.d.ts +91 -0
- package/dist/webhooks.js +283 -0
- package/dist/work-index.d.ts +68 -0
- package/dist/work-index.js +384 -0
- package/dist/work-summary.d.ts +57 -0
- package/dist/work-summary.js +116 -0
- package/dist/workspace-motion.d.ts +4 -0
- package/dist/workspace-motion.js +133 -0
- package/dist/workspace-revision.d.ts +19 -0
- package/dist/workspace-revision.js +92 -0
- package/dist/workspace-ui.d.ts +204 -0
- package/dist/workspace-ui.js +411 -0
- package/dist/worktree-notices.d.ts +13 -0
- package/dist/worktree-notices.js +17 -0
- package/dist/worktree.d.ts +249 -0
- package/dist/worktree.js +720 -0
- package/package.json +122 -0
- package/scripts/canary-assertions.mjs +42 -0
- package/scripts/crash-canary.mjs +253 -0
- package/scripts/fixtures/crash-process.mjs +74 -0
- package/scripts/fixtures/pilot-scenarios.mjs +85 -0
- package/scripts/fixtures/restart-service.mjs +27 -0
- package/scripts/launchd-certification.mjs +143 -0
- package/scripts/pilot.mjs +121 -0
- package/scripts/proof-preflight.mjs +140 -0
- package/scripts/provider-canary.mjs +379 -0
- package/scripts/recovery-canary.mjs +135 -0
- package/scripts/restart-certification.mjs +98 -0
package/dist/issues.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Issues, through `gh`.
|
|
3
|
+
*
|
|
4
|
+
* No new credential: `gh` is already authenticated on any machine where the
|
|
5
|
+
* rest of this tool works, which is the same reason pull requests are read
|
|
6
|
+
* that way. Nothing here holds a token.
|
|
7
|
+
*
|
|
8
|
+
* Two things it deliberately will not do.
|
|
9
|
+
*
|
|
10
|
+
* **It will not write dependency edges.** GitHub grew native `blocked_by`
|
|
11
|
+
* relations and sub-issues, and the design says to use them *where a
|
|
12
|
+
* capability probe confirms them* — including a `gh` new enough to expose the
|
|
13
|
+
* fields. This adapter has confirmed neither the endpoint shape nor the
|
|
14
|
+
* version behaviour against a live repository, so it refuses instead of
|
|
15
|
+
* guessing, and refuses rather than emulating. An invented edge would make our
|
|
16
|
+
* scheduler disagree with what every human on the repository can see.
|
|
17
|
+
*
|
|
18
|
+
* **It will not reach the network on the scheduler's hot path.** Reading is a
|
|
19
|
+
* round trip per repository, and GitHub allows five thousand authenticated
|
|
20
|
+
* requests an hour; a scheduler polling dependencies for a hundred issues once
|
|
21
|
+
* a minute would exhaust that before doing any real work. §4's answer is a
|
|
22
|
+
* materialised snapshot read out of band, which is the scheduler's job to hold
|
|
23
|
+
* — this module just makes each read explicit and bounded so that when the
|
|
24
|
+
* scheduler arrives it is obvious what costs a network call.
|
|
25
|
+
*/
|
|
26
|
+
import type { Deps } from "./graph.js";
|
|
27
|
+
import { type GraphBackend, type Runner } from "./backend.js";
|
|
28
|
+
/** A network round trip; bounded like the pull request read it sits beside. */
|
|
29
|
+
export declare const ISSUE_TIMEOUT_MS = 20000;
|
|
30
|
+
/** Enough to see a backlog without paginating. */
|
|
31
|
+
export declare const DEFAULT_LIMIT = 100;
|
|
32
|
+
export type IssuesOptions = {
|
|
33
|
+
repo: string;
|
|
34
|
+
runner?: Runner;
|
|
35
|
+
limit?: number;
|
|
36
|
+
/** Overridden when a caller is spending a shared budget; see `remote.ts`. */
|
|
37
|
+
timeoutMs?: number;
|
|
38
|
+
/** Whether `gh` is new enough for the dependency fields; see `graph.ts`. */
|
|
39
|
+
deps?: Deps;
|
|
40
|
+
};
|
|
41
|
+
export declare function githubIssues(options: IssuesOptions): GraphBackend;
|
package/dist/issues.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Issues, through `gh`.
|
|
3
|
+
*
|
|
4
|
+
* No new credential: `gh` is already authenticated on any machine where the
|
|
5
|
+
* rest of this tool works, which is the same reason pull requests are read
|
|
6
|
+
* that way. Nothing here holds a token.
|
|
7
|
+
*
|
|
8
|
+
* Two things it deliberately will not do.
|
|
9
|
+
*
|
|
10
|
+
* **It will not write dependency edges.** GitHub grew native `blocked_by`
|
|
11
|
+
* relations and sub-issues, and the design says to use them *where a
|
|
12
|
+
* capability probe confirms them* — including a `gh` new enough to expose the
|
|
13
|
+
* fields. This adapter has confirmed neither the endpoint shape nor the
|
|
14
|
+
* version behaviour against a live repository, so it refuses instead of
|
|
15
|
+
* guessing, and refuses rather than emulating. An invented edge would make our
|
|
16
|
+
* scheduler disagree with what every human on the repository can see.
|
|
17
|
+
*
|
|
18
|
+
* **It will not reach the network on the scheduler's hot path.** Reading is a
|
|
19
|
+
* round trip per repository, and GitHub allows five thousand authenticated
|
|
20
|
+
* requests an hour; a scheduler polling dependencies for a hundred issues once
|
|
21
|
+
* a minute would exhaust that before doing any real work. §4's answer is a
|
|
22
|
+
* materialised snapshot read out of band, which is the scheduler's job to hold
|
|
23
|
+
* — this module just makes each read explicit and bounded so that when the
|
|
24
|
+
* scheduler arrives it is obvious what costs a network call.
|
|
25
|
+
*/
|
|
26
|
+
import { run } from "./exec.js";
|
|
27
|
+
import { ok, no, edgesNotEmulated, describeFailure, parseJson, } from "./backend.js";
|
|
28
|
+
const GH = "gh";
|
|
29
|
+
/** A network round trip; bounded like the pull request read it sits beside. */
|
|
30
|
+
export const ISSUE_TIMEOUT_MS = 20_000;
|
|
31
|
+
/** Enough to see a backlog without paginating. */
|
|
32
|
+
export const DEFAULT_LIMIT = 100;
|
|
33
|
+
export function githubIssues(options) {
|
|
34
|
+
const { repo, runner = run, limit = DEFAULT_LIMIT, timeoutMs = ISSUE_TIMEOUT_MS, deps = "unverified", } = options;
|
|
35
|
+
const call = (args) => runner(GH, args, { cwd: repo, timeoutMs });
|
|
36
|
+
return {
|
|
37
|
+
name: "github-issues",
|
|
38
|
+
deps,
|
|
39
|
+
/**
|
|
40
|
+
* Every open issue. Without confirmed edges there is no dependency order
|
|
41
|
+
* to apply, so "ready" here means "open" — which is exactly why a backend
|
|
42
|
+
* in this state is not an autonomous-scheduling default.
|
|
43
|
+
*/
|
|
44
|
+
async listReady() {
|
|
45
|
+
const result = await call([
|
|
46
|
+
"issue",
|
|
47
|
+
"list",
|
|
48
|
+
"--state",
|
|
49
|
+
"open",
|
|
50
|
+
"--limit",
|
|
51
|
+
String(limit),
|
|
52
|
+
"--json",
|
|
53
|
+
"number,title,state",
|
|
54
|
+
]);
|
|
55
|
+
if (result.code !== 0)
|
|
56
|
+
return no("unreachable", describeFailure(result));
|
|
57
|
+
const parsed = parseJson(result.stdout);
|
|
58
|
+
if (!Array.isArray(parsed))
|
|
59
|
+
return no("unreadable", "gh returned something that is not a list");
|
|
60
|
+
return ok(parsed.map(readIssue).filter((task) => task !== null));
|
|
61
|
+
},
|
|
62
|
+
async get(id) {
|
|
63
|
+
const result = await call(["issue", "view", id, "--json", "number,title,state"]);
|
|
64
|
+
// gh returns non-zero for a missing issue, which is an answer rather
|
|
65
|
+
// than a fault: null means "not there", and the caller can tell that
|
|
66
|
+
// apart from "we could not ask".
|
|
67
|
+
if (result.code !== 0) {
|
|
68
|
+
return isMissing(result.stderr) ? ok(null) : no("unreachable", describeFailure(result));
|
|
69
|
+
}
|
|
70
|
+
const task = readIssue(parseJson(result.stdout));
|
|
71
|
+
return task === null ? no("unreadable", "gh returned an issue in a shape we do not know") : ok(task);
|
|
72
|
+
},
|
|
73
|
+
/**
|
|
74
|
+
* `gh issue create` prints the new issue's URL and nothing else, so the
|
|
75
|
+
* number is read back off the end of it. Parsed strictly: a URL we cannot
|
|
76
|
+
* read means we do not know what was created, and reporting a made-up id
|
|
77
|
+
* would be worse than reporting the failure.
|
|
78
|
+
*/
|
|
79
|
+
async create(spec) {
|
|
80
|
+
const result = await call([
|
|
81
|
+
"issue",
|
|
82
|
+
"create",
|
|
83
|
+
"--title",
|
|
84
|
+
spec.title,
|
|
85
|
+
"--body",
|
|
86
|
+
spec.body ?? "Filed by Toolroll.",
|
|
87
|
+
]);
|
|
88
|
+
if (result.code !== 0)
|
|
89
|
+
return no("rejected", describeFailure(result));
|
|
90
|
+
const number = /\/issues\/(\d+)\s*$/.exec(result.stdout.trim());
|
|
91
|
+
if (number?.[1] === undefined) {
|
|
92
|
+
return no("unreadable", "the issue was created, but gh did not print a URL we could read");
|
|
93
|
+
}
|
|
94
|
+
return ok(number[1]);
|
|
95
|
+
},
|
|
96
|
+
/**
|
|
97
|
+
* GitHub has two states, so everything terminal closes and everything
|
|
98
|
+
* else reopens. The mapping is lossy and says so rather than inventing
|
|
99
|
+
* labels to carry the difference — a `failed` task and a `done` one look
|
|
100
|
+
* the same to GitHub, and pretending otherwise would put our vocabulary
|
|
101
|
+
* into somebody else's tracker.
|
|
102
|
+
*/
|
|
103
|
+
async setState(id, state) {
|
|
104
|
+
const closing = state === "done" || state === "failed" || state === "cancelled";
|
|
105
|
+
const result = await call(["issue", closing ? "close" : "reopen", id]);
|
|
106
|
+
if (result.code !== 0)
|
|
107
|
+
return no("rejected", describeFailure(result));
|
|
108
|
+
return ok(undefined);
|
|
109
|
+
},
|
|
110
|
+
async addEdge() {
|
|
111
|
+
return edgesNotEmulated("GitHub Issues");
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function readIssue(record) {
|
|
116
|
+
if (typeof record !== "object" || record === null)
|
|
117
|
+
return null;
|
|
118
|
+
const raw = record;
|
|
119
|
+
const number = raw["number"];
|
|
120
|
+
if (typeof number !== "number")
|
|
121
|
+
return null;
|
|
122
|
+
return {
|
|
123
|
+
id: String(number),
|
|
124
|
+
title: typeof raw["title"] === "string" ? raw["title"] : "",
|
|
125
|
+
state: String(raw["state"]).toUpperCase() === "CLOSED" ? "done" : "queued",
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function isMissing(stderr) {
|
|
129
|
+
const text = stderr.toLowerCase();
|
|
130
|
+
return text.includes("could not resolve") || text.includes("not found");
|
|
131
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# The Windows Job Object helper (docs/PROCESS_CONTAINMENT_PLAN.md).
|
|
2
|
+
#
|
|
3
|
+
# Runs OUTSIDE the job it owns. Invoked by containment.ts only:
|
|
4
|
+
# powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File job-object-helper.ps1 <pipe> <base64 json [file, ...args]>
|
|
5
|
+
#
|
|
6
|
+
# Protocol over the named pipe the controller listens on:
|
|
7
|
+
# helper -> controller "attached" the target was created SUSPENDED, assigned to a
|
|
8
|
+
# kill-on-close / no-breakaway job, then resumed
|
|
9
|
+
# "failed <detail>" the target never ran
|
|
10
|
+
# "empty" the job reports zero active processes
|
|
11
|
+
# controller -> helper "kill" TerminateJobObject, then report "empty" and exit
|
|
12
|
+
# The helper exits with the root's exit code as soon as the job is empty;
|
|
13
|
+
# members that outlive the root's natural exit are terminated after 2 s.
|
|
14
|
+
# The controller's death closes the pipe: the helper terminates the job and exits, and the
|
|
15
|
+
# job handle closing (kill-on-close) ends anything that raced that.
|
|
16
|
+
#
|
|
17
|
+
# The target inherits this helper's stdin/stdout/stderr (the controller's pipes), its
|
|
18
|
+
# environment and its working directory verbatim; argv is re-quoted with the same rules
|
|
19
|
+
# libuv uses, never re-parsed through a shell.
|
|
20
|
+
|
|
21
|
+
param(
|
|
22
|
+
[Parameter(Position = 0)] [string] $Pipe,
|
|
23
|
+
# The target's argv - file first - as base64(UTF-8 JSON array): one opaque
|
|
24
|
+
# token, so PowerShell's own command-line parsing can never touch a quote,
|
|
25
|
+
# a space or a percent sign the controller passed.
|
|
26
|
+
[Parameter(Position = 1)] [string] $Encoded,
|
|
27
|
+
[string] $JobName,
|
|
28
|
+
[string] $QueryName
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
$ErrorActionPreference = "Stop"
|
|
32
|
+
|
|
33
|
+
Add-Type -TypeDefinition @"
|
|
34
|
+
using System;
|
|
35
|
+
using System.Runtime.InteropServices;
|
|
36
|
+
using System.Text;
|
|
37
|
+
public static class SoJob {
|
|
38
|
+
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
39
|
+
public struct STARTUPINFO {
|
|
40
|
+
public int cb; public string lpReserved; public string lpDesktop; public string lpTitle;
|
|
41
|
+
public int dwX; public int dwY; public int dwXSize; public int dwYSize; public int dwXCountChars; public int dwYCountChars;
|
|
42
|
+
public int dwFillAttribute; public int dwFlags; public short wShowWindow; public short cbReserved2;
|
|
43
|
+
public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError;
|
|
44
|
+
}
|
|
45
|
+
[StructLayout(LayoutKind.Sequential)]
|
|
46
|
+
public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public int dwProcessId; public int dwThreadId; }
|
|
47
|
+
[StructLayout(LayoutKind.Sequential)]
|
|
48
|
+
public struct JOBOBJECT_BASIC_LIMIT_INFORMATION {
|
|
49
|
+
public long PerProcessUserTimeLimit; public long PerJobUserTimeLimit; public uint LimitFlags;
|
|
50
|
+
public UIntPtr MinimumWorkingSetSize; public UIntPtr MaximumWorkingSetSize; public uint ActiveProcessLimit;
|
|
51
|
+
public UIntPtr Affinity; public uint PriorityClass; public uint SchedulingClass;
|
|
52
|
+
}
|
|
53
|
+
[StructLayout(LayoutKind.Sequential)]
|
|
54
|
+
public struct IO_COUNTERS {
|
|
55
|
+
public ulong ReadOperationCount; public ulong WriteOperationCount; public ulong OtherOperationCount;
|
|
56
|
+
public ulong ReadTransferCount; public ulong WriteTransferCount; public ulong OtherTransferCount;
|
|
57
|
+
}
|
|
58
|
+
[StructLayout(LayoutKind.Sequential)]
|
|
59
|
+
public struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
|
|
60
|
+
public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; public IO_COUNTERS IoInfo;
|
|
61
|
+
public UIntPtr ProcessMemoryLimit; public UIntPtr JobMemoryLimit; public UIntPtr PeakProcessMemoryUsed; public UIntPtr PeakJobMemoryUsed;
|
|
62
|
+
}
|
|
63
|
+
[StructLayout(LayoutKind.Sequential)]
|
|
64
|
+
public struct JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
|
|
65
|
+
public long TotalUserTime; public long TotalKernelTime; public long ThisPeriodTotalUserTime; public long ThisPeriodTotalKernelTime;
|
|
66
|
+
public uint TotalPageFaultCount; public uint TotalProcesses; public uint ActiveProcesses; public uint TotalTerminatedProcesses;
|
|
67
|
+
}
|
|
68
|
+
public const int JobObjectBasicAccountingInformation = 1;
|
|
69
|
+
public const int JobObjectExtendedLimitInformation = 9;
|
|
70
|
+
public const uint JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x2000;
|
|
71
|
+
public const uint CREATE_SUSPENDED = 0x4;
|
|
72
|
+
public const uint CREATE_UNICODE_ENVIRONMENT = 0x400;
|
|
73
|
+
public const int STARTF_USESTDHANDLES = 0x100;
|
|
74
|
+
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern IntPtr CreateJobObjectW(IntPtr attributes, string name);
|
|
75
|
+
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool SetInformationJobObject(IntPtr job, int infoClass, IntPtr info, uint length);
|
|
76
|
+
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool QueryInformationJobObject(IntPtr job, int infoClass, IntPtr info, uint length, IntPtr returned);
|
|
77
|
+
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process);
|
|
78
|
+
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool TerminateJobObject(IntPtr job, uint exitCode);
|
|
79
|
+
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern bool CreateProcessW(string application, StringBuilder commandLine, IntPtr processAttributes, IntPtr threadAttributes, bool inheritHandles, uint creationFlags, IntPtr environment, string currentDirectory, ref STARTUPINFO startupInfo, out PROCESS_INFORMATION processInformation);
|
|
80
|
+
[DllImport("kernel32.dll", SetLastError = true)] public static extern uint ResumeThread(IntPtr thread);
|
|
81
|
+
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool TerminateProcess(IntPtr process, uint exitCode);
|
|
82
|
+
[DllImport("kernel32.dll", SetLastError = true)] public static extern uint WaitForSingleObject(IntPtr handle, uint milliseconds);
|
|
83
|
+
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool GetExitCodeProcess(IntPtr process, out uint exitCode);
|
|
84
|
+
[DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr GetStdHandle(int which);
|
|
85
|
+
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool CloseHandle(IntPtr handle);
|
|
86
|
+
|
|
87
|
+
/** libuv's quoting rules: the target sees exactly the argv the controller passed. */
|
|
88
|
+
public static string Quote(string arg) {
|
|
89
|
+
if (arg.Length == 0) return "\"\"";
|
|
90
|
+
bool plain = true;
|
|
91
|
+
foreach (char c in arg) { if (c == ' ' || c == '\t' || c == '"' || c == '\n' || c == '\r') { plain = false; break; } }
|
|
92
|
+
if (plain) return arg;
|
|
93
|
+
var sb = new StringBuilder();
|
|
94
|
+
sb.Append('"');
|
|
95
|
+
int backslashes = 0;
|
|
96
|
+
foreach (char c in arg) {
|
|
97
|
+
if (c == '\\') { backslashes++; continue; }
|
|
98
|
+
if (c == '"') { sb.Append('\\', backslashes * 2 + 1); sb.Append('"'); backslashes = 0; continue; }
|
|
99
|
+
sb.Append('\\', backslashes); sb.Append(c); backslashes = 0;
|
|
100
|
+
}
|
|
101
|
+
sb.Append('\\', backslashes * 2);
|
|
102
|
+
sb.Append('"');
|
|
103
|
+
return sb.ToString();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern IntPtr OpenJobObjectW(uint access, bool inherit, string name);
|
|
107
|
+
public static string Inspect(string name) {
|
|
108
|
+
IntPtr job = OpenJobObjectW(4, false, name); // JOB_OBJECT_QUERY only
|
|
109
|
+
if (job == IntPtr.Zero) return Marshal.GetLastWin32Error() == 2 ? "empty" : "unknown";
|
|
110
|
+
try { return ActiveProcesses(job) == 0 ? "empty" : "populated"; }
|
|
111
|
+
catch { return "unknown"; }
|
|
112
|
+
finally { CloseHandle(job); }
|
|
113
|
+
}
|
|
114
|
+
public static IntPtr MakeJob(string name) {
|
|
115
|
+
IntPtr job = CreateJobObjectW(IntPtr.Zero, name);
|
|
116
|
+
int createdError = Marshal.GetLastWin32Error();
|
|
117
|
+
if (job != IntPtr.Zero && createdError == 183) { CloseHandle(job); throw new Exception("job name already exists"); }
|
|
118
|
+
if (job == IntPtr.Zero) throw new Exception("CreateJobObject failed: " + Marshal.GetLastWin32Error());
|
|
119
|
+
var info = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION();
|
|
120
|
+
// Kill on close; NO breakaway flags, so nothing inside may leave the job.
|
|
121
|
+
info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
|
|
122
|
+
int size = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION));
|
|
123
|
+
IntPtr buffer = Marshal.AllocHGlobal(size);
|
|
124
|
+
try {
|
|
125
|
+
Marshal.StructureToPtr(info, buffer, false);
|
|
126
|
+
if (!SetInformationJobObject(job, JobObjectExtendedLimitInformation, buffer, (uint)size)) throw new Exception("SetInformationJobObject failed: " + Marshal.GetLastWin32Error());
|
|
127
|
+
} finally { Marshal.FreeHGlobal(buffer); }
|
|
128
|
+
return job;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
public static uint ActiveProcesses(IntPtr job) {
|
|
132
|
+
int size = Marshal.SizeOf(typeof(JOBOBJECT_BASIC_ACCOUNTING_INFORMATION));
|
|
133
|
+
IntPtr buffer = Marshal.AllocHGlobal(size);
|
|
134
|
+
try {
|
|
135
|
+
if (!QueryInformationJobObject(job, JobObjectBasicAccountingInformation, buffer, (uint)size, IntPtr.Zero)) throw new Exception("QueryInformationJobObject failed: " + Marshal.GetLastWin32Error());
|
|
136
|
+
var info = (JOBOBJECT_BASIC_ACCOUNTING_INFORMATION)Marshal.PtrToStructure(buffer, typeof(JOBOBJECT_BASIC_ACCOUNTING_INFORMATION));
|
|
137
|
+
return info.ActiveProcesses;
|
|
138
|
+
} finally { Marshal.FreeHGlobal(buffer); }
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
public static PROCESS_INFORMATION StartSuspended(string commandLine) {
|
|
142
|
+
var si = new STARTUPINFO();
|
|
143
|
+
si.cb = Marshal.SizeOf(typeof(STARTUPINFO));
|
|
144
|
+
si.dwFlags = STARTF_USESTDHANDLES;
|
|
145
|
+
si.hStdInput = GetStdHandle(-10); si.hStdOutput = GetStdHandle(-11); si.hStdError = GetStdHandle(-12);
|
|
146
|
+
PROCESS_INFORMATION pi;
|
|
147
|
+
var cmd = new StringBuilder(commandLine);
|
|
148
|
+
if (!CreateProcessW(null, cmd, IntPtr.Zero, IntPtr.Zero, true, CREATE_SUSPENDED | CREATE_UNICODE_ENVIRONMENT, IntPtr.Zero, null, ref si, out pi)) {
|
|
149
|
+
throw new Exception("CreateProcess failed: " + Marshal.GetLastWin32Error());
|
|
150
|
+
}
|
|
151
|
+
return pi;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
"@
|
|
155
|
+
|
|
156
|
+
if ($QueryName) {
|
|
157
|
+
if ($QueryName -cnotmatch '^Global\\so-[A-Za-z0-9._-]+-[a-f0-9]{64}$') { Write-Output "unknown"; exit 0 }
|
|
158
|
+
Write-Output ([SoJob]::Inspect($QueryName)); exit 0
|
|
159
|
+
}
|
|
160
|
+
if ($JobName -cnotmatch '^Global\\so-[A-Za-z0-9._-]+-[a-f0-9]{64}$') { throw "invalid job custody name" }
|
|
161
|
+
$name = $Pipe
|
|
162
|
+
if ($name.StartsWith("\\.\pipe\")) { $name = $name.Substring(9) }
|
|
163
|
+
# Duplex control requires an overlapped handle: on .NET Framework a pending
|
|
164
|
+
# asynchronous read on a synchronous PipeStream can serialize a concurrent
|
|
165
|
+
# write. That would delay the empty reply until another order arrives.
|
|
166
|
+
$client = New-Object System.IO.Pipes.NamedPipeClientStream(".", $name, [System.IO.Pipes.PipeDirection]::InOut, [System.IO.Pipes.PipeOptions]::Asynchronous)
|
|
167
|
+
$client.Connect(5000)
|
|
168
|
+
$writer = New-Object System.IO.StreamWriter($client)
|
|
169
|
+
$writer.AutoFlush = $true
|
|
170
|
+
$reader = New-Object System.IO.StreamReader($client)
|
|
171
|
+
|
|
172
|
+
function Send([string] $line) { try { $writer.Write($line + "`n") } catch { } }
|
|
173
|
+
|
|
174
|
+
$job = [IntPtr]::Zero
|
|
175
|
+
$pi = $null
|
|
176
|
+
try {
|
|
177
|
+
[string[]]$targetArguments = ConvertFrom-Json -InputObject ([System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($Encoded)))
|
|
178
|
+
if ($targetArguments.Count -lt 1) { throw "the target argv is empty" }
|
|
179
|
+
# Admission arrives only after the controller durably records this helper.
|
|
180
|
+
$job = [SoJob]::MakeJob($JobName)
|
|
181
|
+
Send "ready"
|
|
182
|
+
$admission = $reader.ReadLineAsync()
|
|
183
|
+
if (-not $admission.Wait(15000) -or $admission.Result -cne "go") { throw "job admission refused" }
|
|
184
|
+
$parts = @()
|
|
185
|
+
foreach ($arg in $targetArguments) { $parts += [SoJob]::Quote([string]$arg) }
|
|
186
|
+
$pi = [SoJob]::StartSuspended(($parts -join " "))
|
|
187
|
+
if (-not [SoJob]::AssignProcessToJobObject($job, $pi.hProcess)) {
|
|
188
|
+
$code = [System.Runtime.InteropServices.Marshal]::GetLastWin32Error()
|
|
189
|
+
[void][SoJob]::TerminateProcess($pi.hProcess, 126)
|
|
190
|
+
Send ("failed AssignProcessToJobObject failed with Win32 error " + $code + " - the target never ran")
|
|
191
|
+
exit 126
|
|
192
|
+
}
|
|
193
|
+
if ([SoJob]::ResumeThread($pi.hThread) -eq [uint32]::MaxValue) { throw "ResumeThread failed" }
|
|
194
|
+
Send "attached"
|
|
195
|
+
} catch {
|
|
196
|
+
if ($pi -ne $null -and $pi.hProcess -ne [IntPtr]::Zero) { [void][SoJob]::TerminateProcess($pi.hProcess, 126) }
|
|
197
|
+
if ($job -ne [IntPtr]::Zero) { [void][SoJob]::TerminateJobObject($job, 126); [void][SoJob]::CloseHandle($job) }
|
|
198
|
+
Send ("failed " + $_.Exception.Message)
|
|
199
|
+
exit 126
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
# Orders from the controller are read asynchronously on this one thread (a
|
|
203
|
+
# PowerShell runspace is single-threaded; ReadLineAsync polls without one). The
|
|
204
|
+
# pipe closing - the controller died - is itself the order to terminate.
|
|
205
|
+
$pendingRead = $reader.ReadLineAsync()
|
|
206
|
+
$pipeClosed = $false
|
|
207
|
+
function NextOrders {
|
|
208
|
+
$found = @()
|
|
209
|
+
while ($script:pendingRead -ne $null -and $script:pendingRead.IsCompleted) {
|
|
210
|
+
$line = $null
|
|
211
|
+
try { $line = $script:pendingRead.Result } catch { $line = $null }
|
|
212
|
+
if ($line -eq $null) { $script:pipeClosed = $true; $script:pendingRead = $null; $found += "closed"; break }
|
|
213
|
+
$found += $line.Trim()
|
|
214
|
+
$script:pendingRead = $reader.ReadLineAsync()
|
|
215
|
+
}
|
|
216
|
+
return $found
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
$exitCode = 1
|
|
220
|
+
$rootExited = $false
|
|
221
|
+
$rootExitedAt = $null
|
|
222
|
+
while ($true) {
|
|
223
|
+
if (-not $rootExited -and [SoJob]::WaitForSingleObject($pi.hProcess, 50) -eq 0) {
|
|
224
|
+
$rootExited = $true
|
|
225
|
+
$rootExitedAt = Get-Date
|
|
226
|
+
$c = [uint32]0
|
|
227
|
+
if ([SoJob]::GetExitCodeProcess($pi.hProcess, [ref]$c)) { $exitCode = [int]$c }
|
|
228
|
+
}
|
|
229
|
+
foreach ($order in (NextOrders)) {
|
|
230
|
+
# A stop from the controller, or the controller's death (pipe closed):
|
|
231
|
+
# end every member now. "release" needs nothing here - the helper exits
|
|
232
|
+
# on its own the moment the job is proven empty.
|
|
233
|
+
if ($order -eq "kill" -or $order -eq "closed") { [void][SoJob]::TerminateJobObject($job, 137); if (-not $rootExited) { $rootExited = $true; $rootExitedAt = Get-Date; $exitCode = 137 } }
|
|
234
|
+
}
|
|
235
|
+
if ($rootExited) {
|
|
236
|
+
$active = [SoJob]::ActiveProcesses($job)
|
|
237
|
+
if ($active -eq 0) { Send "empty"; break }
|
|
238
|
+
# The root is gone but members remain (a detached grandchild): natural
|
|
239
|
+
# exit cleans them up too, after a short grace for the ordinary case.
|
|
240
|
+
if (((Get-Date) - $rootExitedAt).TotalMilliseconds -gt 2000) { [void][SoJob]::TerminateJobObject($job, 137) }
|
|
241
|
+
}
|
|
242
|
+
Start-Sleep -Milliseconds 50
|
|
243
|
+
}
|
|
244
|
+
[void][SoJob]::CloseHandle($pi.hThread)
|
|
245
|
+
[void][SoJob]::CloseHandle($pi.hProcess)
|
|
246
|
+
[void][SoJob]::CloseHandle($job)
|
|
247
|
+
# This is a dedicated helper process. A pending .NET pipe read can prevent
|
|
248
|
+
# PowerShell's normal host shutdown, and disposing its shared stream can
|
|
249
|
+
# wait for that read. The kernel has already proved the job empty and all
|
|
250
|
+
# owned process/job handles are closed. Exit the helper process directly;
|
|
251
|
+
# Windows closes the pipe and cancels pending IO without a disposal wait.
|
|
252
|
+
[Environment]::Exit($exitCode)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Bounded structural metadata for an event whose text may exceed the wire
|
|
2
|
+
* cap. Long JSON strings become null in a small skeleton, but every escape
|
|
3
|
+
* is still validated. JSON.parse proves the remaining structure. Unknown,
|
|
4
|
+
* malformed or over-complex input never earns permission to discard it. */
|
|
5
|
+
export declare function jsonlDiscriminants(): {
|
|
6
|
+
push(bytes: Buffer): void;
|
|
7
|
+
finish(): {
|
|
8
|
+
type: string;
|
|
9
|
+
itemType: string | null;
|
|
10
|
+
} | null;
|
|
11
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/** Bounded structural metadata for an event whose text may exceed the wire
|
|
2
|
+
* cap. Long JSON strings become null in a small skeleton, but every escape
|
|
3
|
+
* is still validated. JSON.parse proves the remaining structure. Unknown,
|
|
4
|
+
* malformed or over-complex input never earns permission to discard it. */
|
|
5
|
+
export function jsonlDiscriminants() {
|
|
6
|
+
const skeleton = Buffer.allocUnsafe(64 * 1024);
|
|
7
|
+
const token = Buffer.allocUnsafe(256);
|
|
8
|
+
let size = 0;
|
|
9
|
+
let tokenSize = 0;
|
|
10
|
+
let longString = false;
|
|
11
|
+
let inString = false;
|
|
12
|
+
let escaped = false;
|
|
13
|
+
let unicode = 0;
|
|
14
|
+
let invalid = false;
|
|
15
|
+
const emit = (byte) => {
|
|
16
|
+
if (size >= skeleton.length)
|
|
17
|
+
invalid = true;
|
|
18
|
+
else
|
|
19
|
+
skeleton[size++] = byte;
|
|
20
|
+
};
|
|
21
|
+
const remember = (byte) => {
|
|
22
|
+
if (tokenSize < token.length)
|
|
23
|
+
token[tokenSize++] = byte;
|
|
24
|
+
else
|
|
25
|
+
longString = true;
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
push(bytes) {
|
|
29
|
+
for (const byte of bytes) {
|
|
30
|
+
if (invalid)
|
|
31
|
+
return;
|
|
32
|
+
if (!inString) {
|
|
33
|
+
if (byte === 34) {
|
|
34
|
+
inString = true;
|
|
35
|
+
tokenSize = 0;
|
|
36
|
+
longString = false;
|
|
37
|
+
remember(byte);
|
|
38
|
+
}
|
|
39
|
+
else if (byte === 32 || byte === 9 || byte === 13) {
|
|
40
|
+
if (size === 0 || skeleton[size - 1] !== 32)
|
|
41
|
+
emit(32);
|
|
42
|
+
}
|
|
43
|
+
else
|
|
44
|
+
emit(byte);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
remember(byte);
|
|
48
|
+
if (unicode > 0) {
|
|
49
|
+
if (!(byte >= 48 && byte <= 57 || byte >= 65 && byte <= 70 || byte >= 97 && byte <= 102))
|
|
50
|
+
invalid = true;
|
|
51
|
+
unicode--;
|
|
52
|
+
}
|
|
53
|
+
else if (escaped) {
|
|
54
|
+
escaped = false;
|
|
55
|
+
if (byte === 117)
|
|
56
|
+
unicode = 4;
|
|
57
|
+
else if (![34, 92, 47, 98, 102, 110, 114, 116].includes(byte))
|
|
58
|
+
invalid = true;
|
|
59
|
+
}
|
|
60
|
+
else if (byte === 92)
|
|
61
|
+
escaped = true;
|
|
62
|
+
else if (byte === 34) {
|
|
63
|
+
inString = false;
|
|
64
|
+
// A long key also becomes null, which is invalid JSON: refuse
|
|
65
|
+
// classification rather than invent a possibly colliding key.
|
|
66
|
+
const value = longString ? Buffer.from("null") : token.subarray(0, tokenSize);
|
|
67
|
+
for (const one of value)
|
|
68
|
+
emit(one);
|
|
69
|
+
}
|
|
70
|
+
else if (byte < 32)
|
|
71
|
+
invalid = true;
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
finish() {
|
|
75
|
+
if (invalid || inString)
|
|
76
|
+
return null;
|
|
77
|
+
try {
|
|
78
|
+
const event = JSON.parse(skeleton.toString("utf8", 0, size));
|
|
79
|
+
if (event === null || typeof event !== "object" || Array.isArray(event))
|
|
80
|
+
return null;
|
|
81
|
+
const { type, item } = event;
|
|
82
|
+
if (typeof type !== "string")
|
|
83
|
+
return null;
|
|
84
|
+
const itemType = item !== null && typeof item === "object" && !Array.isArray(item)
|
|
85
|
+
? item["type"] : null;
|
|
86
|
+
return { type, itemType: typeof itemType === "string" ? itemType : null };
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
package/dist/keys.d.ts
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider API keys, managed instead of ambient (the gap the gemini
|
|
3
|
+
* live-auth work exposed): one 0600 file per provider under
|
|
4
|
+
* ~/.toolroll/keys/ (or an older ~/.standing-orders/keys/), written from the settings card or piped into
|
|
5
|
+
* the CLI — never typed into an argv, never rendered back, never stored
|
|
6
|
+
* in the database a backup might carry.
|
|
7
|
+
*
|
|
8
|
+
* The injection contract lives in the invocation gateway: a stored key is
|
|
9
|
+
* added to EXACTLY its own provider's child environment at spawn, where
|
|
10
|
+
* the adapter's foreign-credential strip has already shed everybody
|
|
11
|
+
* else's. The plane's own process never needs the key in its environment
|
|
12
|
+
* at all — a restart or a rotation is a file write, not a relaunch — and
|
|
13
|
+
* an ambient env var still works as the fallback it always was (the file,
|
|
14
|
+
* being deliberate, wins).
|
|
15
|
+
*/
|
|
16
|
+
import type { ProviderId } from "./provider.js";
|
|
17
|
+
/** The ONE env name each provider's own harness reads its key from —
|
|
18
|
+
* where a managed key is INJECTED. */
|
|
19
|
+
export declare const PROVIDER_KEY_ENV: Record<ProviderId, string>;
|
|
20
|
+
/** EVERY env name a provider reads its OWN key from — what subscription
|
|
21
|
+
* mode STRIPS so an ambient key cannot override the login. gemini reads
|
|
22
|
+
* two; the rest read one. */
|
|
23
|
+
export declare const OWN_KEY_ENV: Record<ProviderId, readonly string[]>;
|
|
24
|
+
export declare function keysDir(home?: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* How a provider authenticates (the operator's ruling 2026-08-29: keep
|
|
27
|
+
* BOTH, prefer the subscription). "subscription" uses the CLI's OWN login
|
|
28
|
+
* — a Claude/ChatGPT plan, a Google cached login — and the API key is
|
|
29
|
+
* kept but NOT handed to the process, so its own auth wins. "api-key"
|
|
30
|
+
* hands the stored (or ambient) key to the process. openrouter has no
|
|
31
|
+
* login and is always api-key.
|
|
32
|
+
*/
|
|
33
|
+
export type AuthMode = "subscription" | "api-key";
|
|
34
|
+
/** Providers that CAN authenticate without an API key (a subscription or
|
|
35
|
+
* cached login). openrouter cannot — it is api-key only. */
|
|
36
|
+
export declare const SUBSCRIPTION_CAPABLE: Record<ProviderId, boolean>;
|
|
37
|
+
/** The default when nothing is set: subscription where it exists (prefer
|
|
38
|
+
* the plan the operator already pays for), api-key otherwise. */
|
|
39
|
+
export declare const DEFAULT_AUTH_MODE: Record<ProviderId, AuthMode>;
|
|
40
|
+
export declare function readAuthMode(provider: ProviderId, home?: string): AuthMode;
|
|
41
|
+
/**
|
|
42
|
+
* The auth mode as an AUTHORITY reads it (raw authority repair): an absent
|
|
43
|
+
* file is the provider's default, but a file that is present and says
|
|
44
|
+
* neither `subscription` nor `api-key` is a stated problem — never the
|
|
45
|
+
* subscription default a lenient read would coerce it to. A provider with
|
|
46
|
+
* no subscription login is the key, whatever the file says.
|
|
47
|
+
*/
|
|
48
|
+
export declare function readAuthModeStrict(provider: ProviderId, home?: string): {
|
|
49
|
+
ok: true;
|
|
50
|
+
mode: AuthMode;
|
|
51
|
+
} | {
|
|
52
|
+
ok: false;
|
|
53
|
+
problem: string;
|
|
54
|
+
};
|
|
55
|
+
export declare function setAuthMode(provider: ProviderId, mode: AuthMode, home?: string): {
|
|
56
|
+
ok: true;
|
|
57
|
+
} | {
|
|
58
|
+
ok: false;
|
|
59
|
+
reason: "no-subscription";
|
|
60
|
+
};
|
|
61
|
+
export declare function keyFileFor(provider: ProviderId, home?: string): string;
|
|
62
|
+
/** Shape check only — never a validity claim. A key is printable ASCII
|
|
63
|
+
* without whitespace, bounded; anything else is a paste accident. */
|
|
64
|
+
export declare function plausibleKey(value: string): boolean;
|
|
65
|
+
export declare function saveProviderKey(provider: ProviderId, value: string, home?: string): {
|
|
66
|
+
ok: true;
|
|
67
|
+
} | {
|
|
68
|
+
ok: false;
|
|
69
|
+
reason: "implausible";
|
|
70
|
+
};
|
|
71
|
+
export declare function readProviderKey(provider: ProviderId, home?: string): string | null;
|
|
72
|
+
export declare function clearProviderKey(provider: ProviderId, home?: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* A live credential check that spends NO tokens: each provider exposes a
|
|
75
|
+
* cheap authenticated GET (its model list, or a key-info route) whose only
|
|
76
|
+
* job here is to make the provider's own auth boundary answer yes or no.
|
|
77
|
+
* Injectable fetcher (the converse.ts precedent) so tests never touch the
|
|
78
|
+
* network. Distinguishes a REJECTED key (bad/expired/wrong provider) from
|
|
79
|
+
* an UNREACHABLE provider (offline, blocked) — the operator needs to know
|
|
80
|
+
* which, because only one of them means "fix the key".
|
|
81
|
+
*/
|
|
82
|
+
export type KeyVerdict = {
|
|
83
|
+
ok: true;
|
|
84
|
+
} | {
|
|
85
|
+
ok: false;
|
|
86
|
+
reason: "rejected";
|
|
87
|
+
status: number;
|
|
88
|
+
} | {
|
|
89
|
+
ok: false;
|
|
90
|
+
reason: "unreachable";
|
|
91
|
+
} | {
|
|
92
|
+
ok: false;
|
|
93
|
+
reason: "unexpected";
|
|
94
|
+
status: number;
|
|
95
|
+
};
|
|
96
|
+
export declare function verifyProviderKey(provider: ProviderId, value: string, fetcher?: typeof fetch, timeoutMs?: number): Promise<KeyVerdict>;
|
|
97
|
+
/** Words for a verdict, safe to render on any surface (never the key). */
|
|
98
|
+
export declare function verdictWords(provider: ProviderId, verdict: KeyVerdict): string;
|
|
99
|
+
/** What a surface may say about a key: that it exists and when it last
|
|
100
|
+
* changed — NEVER the value, never a prefix, never a length. */
|
|
101
|
+
export declare function keyStatus(provider: ProviderId, home?: string): {
|
|
102
|
+
set: boolean;
|
|
103
|
+
updatedAt: string | null;
|
|
104
|
+
};
|