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/board.d.ts
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The board's lane classifier — one exhaustive precedence order, applied to
|
|
3
|
+
* one database snapshot (Codex board review, findings 1 and 2).
|
|
4
|
+
*
|
|
5
|
+
* Lanes are the pipeline read left to right: attention → queued → waiting →
|
|
6
|
+
* building, with completed work joining from its own query. The chain below
|
|
7
|
+
* is total (the final else is queued) and disjoint (it is an if/else chain),
|
|
8
|
+
* so a task appears on the board exactly once — a parked task is attention,
|
|
9
|
+
* never also "waiting" through the hold its own decision placed.
|
|
10
|
+
*/
|
|
11
|
+
import { type CriterionMatrixRow } from "./proof.js";
|
|
12
|
+
export type BoardLane = "attention" | "queued" | "waiting" | "building";
|
|
13
|
+
/** Everything one task contributes to the board, fetched in one snapshot. */
|
|
14
|
+
export type BoardFacts = {
|
|
15
|
+
taskId: string;
|
|
16
|
+
title: string;
|
|
17
|
+
/** Where the task is placed — null for work nobody has placed yet. */
|
|
18
|
+
repo: string | null;
|
|
19
|
+
state: "queued" | "running" | "failed";
|
|
20
|
+
updatedAt: string;
|
|
21
|
+
strikes: number;
|
|
22
|
+
hasScope: boolean;
|
|
23
|
+
approved: boolean;
|
|
24
|
+
/** Planning mode: requested = a planner will run; drafted = review it. */
|
|
25
|
+
plan: "requested" | "drafted" | null;
|
|
26
|
+
/** First line of the scope's goal — the promise a queued card shows. */
|
|
27
|
+
goal: string | null;
|
|
28
|
+
/** An unanswered decision's id — open or expired; expiry never answers. */
|
|
29
|
+
openDecisionId: number | null;
|
|
30
|
+
/** The same decision's question and birth — fetched together with the
|
|
31
|
+
* id so all three name one decision (Codex round 2, finding 13). */
|
|
32
|
+
question: string | null;
|
|
33
|
+
decisionCreatedAt: string | null;
|
|
34
|
+
openIncidents: number;
|
|
35
|
+
/** Oldest unresolved incident — the honest stall anchor for stopped work. */
|
|
36
|
+
oldestIncidentAt: string | null;
|
|
37
|
+
/** The newest live claim, with its run's provenance when a run exists. A
|
|
38
|
+
* claim legitimately precedes its run (finding 7) — every run field is
|
|
39
|
+
* nullable and the card says "preparing" until they arrive. */
|
|
40
|
+
claim: {
|
|
41
|
+
runner: string;
|
|
42
|
+
claimedAt: string;
|
|
43
|
+
model: string | null;
|
|
44
|
+
branch: string | null;
|
|
45
|
+
worktree: string | null;
|
|
46
|
+
/** The run's role when one exists — a planning session reads differently. */
|
|
47
|
+
role: string | null;
|
|
48
|
+
/** Which harness is spending — worn on the card when it is not claude. */
|
|
49
|
+
provider: string | null;
|
|
50
|
+
/** The machine's own phase (M5.4) — stamped at state-machine boundaries,
|
|
51
|
+
* never parsed from a provider stream. Null before the first boundary. */
|
|
52
|
+
phase: string | null;
|
|
53
|
+
} | null;
|
|
54
|
+
/** The newest unfinished run under the live claim — where a building card
|
|
55
|
+
* links, so a glance lands on the build itself. Null before the run
|
|
56
|
+
* starts (the card falls back to the task screen). */
|
|
57
|
+
liveRunId?: number | null;
|
|
58
|
+
/** The top-precedence live hold: operator > backoff > decision > incident. */
|
|
59
|
+
hold: {
|
|
60
|
+
ownerKind: "operator" | "decision" | "incident" | "backoff" | "contest";
|
|
61
|
+
until: string | null;
|
|
62
|
+
} | null;
|
|
63
|
+
/** The task's open tournament, when agents raced (v14). Optional so
|
|
64
|
+
* callers that predate tournaments stay valid; absent reads as none. */
|
|
65
|
+
contest?: {
|
|
66
|
+
id: number;
|
|
67
|
+
state: string;
|
|
68
|
+
agents: number;
|
|
69
|
+
kind?: "race" | "comparison";
|
|
70
|
+
} | null;
|
|
71
|
+
/** The first blocker that is not done, when one exists. */
|
|
72
|
+
unmetDependency: string | null;
|
|
73
|
+
/** That blocker's state — pre-redacted by the caller to null when the
|
|
74
|
+
* blocker's repo is outside the ceiling (Codex round 2, finding 12);
|
|
75
|
+
* the classifier never learns what it must not say. */
|
|
76
|
+
blockerState: string | null;
|
|
77
|
+
/** The first required capability not currently verified, as "kind:name". */
|
|
78
|
+
missingRequirement: string | null;
|
|
79
|
+
/** The standing order this task is an instance of, when it is one. The
|
|
80
|
+
* board keeps instances in their track row — they enter the main lanes
|
|
81
|
+
* only when they need a person, wearing the routine's name. */
|
|
82
|
+
routineId: number | null;
|
|
83
|
+
routineName: string | null;
|
|
84
|
+
/** Queue rank — 0 is filing order. Scheduling only; ranks compare
|
|
85
|
+
* within one column, never across columns. */
|
|
86
|
+
priority?: number;
|
|
87
|
+
/** The worker this task is reserved for; null = the shared queue. */
|
|
88
|
+
assignedRunner?: string | null;
|
|
89
|
+
};
|
|
90
|
+
export type BoardCard = {
|
|
91
|
+
lane: BoardLane;
|
|
92
|
+
taskId: string;
|
|
93
|
+
title: string;
|
|
94
|
+
repo: string | null;
|
|
95
|
+
/** One honest phrase for the card's chip — why it sits in this lane. */
|
|
96
|
+
reason: string;
|
|
97
|
+
/** Where the card's link should land. */
|
|
98
|
+
href: string;
|
|
99
|
+
claim: BoardFacts["claim"];
|
|
100
|
+
/** When this stall began — attention cards only; the lane sorts by it. */
|
|
101
|
+
stalledSince: string | null;
|
|
102
|
+
/** The live attempt's ordinal when earlier ones failed — building only. */
|
|
103
|
+
attempt: number | null;
|
|
104
|
+
overdue: boolean;
|
|
105
|
+
/** The routine this card is an instance of — the chip it wears in lanes. */
|
|
106
|
+
routineName: string | null;
|
|
107
|
+
/** The task's queue rank, carried for the queued lane's sort and badge. */
|
|
108
|
+
priority: number;
|
|
109
|
+
/** The worker this card is reserved for; null = the shared queue. */
|
|
110
|
+
assignedRunner: string | null;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Plain words for every hold owner — shared with the task page so "who is
|
|
114
|
+
* holding this" reads the same everywhere. The internal owner tokens
|
|
115
|
+
* ("contest") never reach a page; an unknown future owner degrades to the
|
|
116
|
+
* generic word, never to its raw name.
|
|
117
|
+
*/
|
|
118
|
+
export declare const HOLD_OWNER_WORDS: Record<string, string>;
|
|
119
|
+
export declare function holdOwnerWords(ownerKind: string): string;
|
|
120
|
+
/**
|
|
121
|
+
* A completed task whose proof is short or refuted and not yet accepted
|
|
122
|
+
* (Priority 2): the board's once-and-only-once rule holds because the
|
|
123
|
+
* done lane's own query excludes exactly these same rows (the fetch site
|
|
124
|
+
* splits `listCompletedWorkScoped`'s rows by verdict before either lane
|
|
125
|
+
* renders) — never a second classifier disagreeing with the first.
|
|
126
|
+
*/
|
|
127
|
+
export type UnverifiedDoneFacts = {
|
|
128
|
+
taskId: string;
|
|
129
|
+
title: string;
|
|
130
|
+
repo: string | null;
|
|
131
|
+
/** The run's completion time — the stall anchor, same as every other
|
|
132
|
+
* attention card's `stalledSince`. */
|
|
133
|
+
completedAt: string;
|
|
134
|
+
proofVerdict: "short" | "refuted";
|
|
135
|
+
/** v39: the signed rubric's own matrix — folded into the plain-text
|
|
136
|
+
* `reason` chip via the shared `passFraction` helper (v40 closes the
|
|
137
|
+
* hand-rolled copy this card used to keep), since a board card carries
|
|
138
|
+
* no room for the full matrix. `[]` for a grandfathered task. */
|
|
139
|
+
proofMatrix?: readonly Pick<CriterionMatrixRow, "state">[];
|
|
140
|
+
/** v40: the bounded repair chain's own trajectory, when one exists —
|
|
141
|
+
* one more word on the SAME chip, never a second card (one task, one
|
|
142
|
+
* card, the board's own once-and-only-once rule). */
|
|
143
|
+
repairChain?: {
|
|
144
|
+
attempt: number;
|
|
145
|
+
outcome: "drafted" | "attempts-spent" | "no-progress" | "integrity-refused" | "resolved";
|
|
146
|
+
approved: boolean;
|
|
147
|
+
} | null;
|
|
148
|
+
};
|
|
149
|
+
export declare function attentionCardForUnverifiedDone(facts: UnverifiedDoneFacts): BoardCard;
|
|
150
|
+
export declare function classify(facts: BoardFacts, now: Date): BoardCard;
|
package/dist/board.js
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The board's lane classifier — one exhaustive precedence order, applied to
|
|
3
|
+
* one database snapshot (Codex board review, findings 1 and 2).
|
|
4
|
+
*
|
|
5
|
+
* Lanes are the pipeline read left to right: attention → queued → waiting →
|
|
6
|
+
* building, with completed work joining from its own query. The chain below
|
|
7
|
+
* is total (the final else is queued) and disjoint (it is an if/else chain),
|
|
8
|
+
* so a task appears on the board exactly once — a parked task is attention,
|
|
9
|
+
* never also "waiting" through the hold its own decision placed.
|
|
10
|
+
*/
|
|
11
|
+
import { passFraction } from "./proof.js";
|
|
12
|
+
/** ISO to the minute for chip text — "retrying 14:32". */
|
|
13
|
+
function clockOf(iso) {
|
|
14
|
+
return iso.slice(11, 16);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Plain words for every hold owner — shared with the task page so "who is
|
|
18
|
+
* holding this" reads the same everywhere. The internal owner tokens
|
|
19
|
+
* ("contest") never reach a page; an unknown future owner degrades to the
|
|
20
|
+
* generic word, never to its raw name.
|
|
21
|
+
*/
|
|
22
|
+
export const HOLD_OWNER_WORDS = {
|
|
23
|
+
operator: "held by you",
|
|
24
|
+
decision: "waiting on a question",
|
|
25
|
+
incident: "stopped by an incident",
|
|
26
|
+
backoff: "backing off after a failure",
|
|
27
|
+
contest: "held by a tournament",
|
|
28
|
+
revision: "waiting on a plan-revision decision",
|
|
29
|
+
};
|
|
30
|
+
export function holdOwnerWords(ownerKind) {
|
|
31
|
+
return HOLD_OWNER_WORDS[ownerKind] ?? "held";
|
|
32
|
+
}
|
|
33
|
+
export function attentionCardForUnverifiedDone(facts) {
|
|
34
|
+
const matrix = facts.proofMatrix ?? [];
|
|
35
|
+
const { passed, total } = passFraction(matrix);
|
|
36
|
+
const matrixWords = total === 0 ? "" : ` (${passed}/${total} criteria)`;
|
|
37
|
+
const chain = facts.repairChain ?? null;
|
|
38
|
+
const repairWords = chain === null
|
|
39
|
+
? ""
|
|
40
|
+
: chain.outcome === "drafted"
|
|
41
|
+
? ` — repair attempt ${chain.attempt} ${chain.approved ? "approved" : "awaiting approval"}`
|
|
42
|
+
: chain.outcome === "resolved"
|
|
43
|
+
? ` — repair resolved`
|
|
44
|
+
: ` — repair ${chain.outcome} at attempt ${chain.attempt}`;
|
|
45
|
+
return {
|
|
46
|
+
lane: "attention",
|
|
47
|
+
taskId: facts.taskId,
|
|
48
|
+
title: facts.title,
|
|
49
|
+
repo: facts.repo,
|
|
50
|
+
href: `/t/${encodeURIComponent(facts.taskId)}`,
|
|
51
|
+
claim: null,
|
|
52
|
+
stalledSince: facts.completedAt,
|
|
53
|
+
attempt: null,
|
|
54
|
+
overdue: false,
|
|
55
|
+
routineName: null,
|
|
56
|
+
priority: 0,
|
|
57
|
+
assignedRunner: null,
|
|
58
|
+
reason: (facts.proofVerdict === "refuted" ? "complete — conflicting evidence" : "complete — missing evidence") + matrixWords + repairWords,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function classify(facts, now) {
|
|
62
|
+
const base = {
|
|
63
|
+
taskId: facts.taskId,
|
|
64
|
+
title: facts.title,
|
|
65
|
+
repo: facts.repo,
|
|
66
|
+
href: `/t/${encodeURIComponent(facts.taskId)}`,
|
|
67
|
+
claim: facts.claim,
|
|
68
|
+
stalledSince: null,
|
|
69
|
+
attempt: null,
|
|
70
|
+
overdue: false,
|
|
71
|
+
routineName: facts.routineName,
|
|
72
|
+
priority: facts.priority ?? 0,
|
|
73
|
+
assignedRunner: facts.assignedRunner ?? null,
|
|
74
|
+
};
|
|
75
|
+
const contest = facts.contest ?? null;
|
|
76
|
+
if (facts.claim !== null) {
|
|
77
|
+
const doing = facts.claim.role === "planner" ? "planning — " : facts.claim.role === "scout" ? "scouting — " : "";
|
|
78
|
+
// A racing tournament wears its own chip: the operator should read
|
|
79
|
+
// "several agents on this" where a lone build would name its runner.
|
|
80
|
+
if (contest !== null && (contest.state === "dispatching" || contest.state === "racing")) {
|
|
81
|
+
return {
|
|
82
|
+
...base,
|
|
83
|
+
lane: "building",
|
|
84
|
+
attempt: null,
|
|
85
|
+
reason: contest.kind === "comparison"
|
|
86
|
+
? `comparison — ${contest.agents} agents building side by side`
|
|
87
|
+
: `tournament — ${contest.agents} agents racing`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// A building card lands on the build itself when one exists — the
|
|
91
|
+
// pop-in glance should reach the live page in one click. Before the
|
|
92
|
+
// run starts (or for a tournament, which has no single run) the task
|
|
93
|
+
// screen remains the destination.
|
|
94
|
+
const liveRunId = facts.liveRunId ?? null;
|
|
95
|
+
return {
|
|
96
|
+
...base,
|
|
97
|
+
lane: "building",
|
|
98
|
+
href: liveRunId === null ? base.href : `/r/${liveRunId}`,
|
|
99
|
+
attempt: facts.strikes > 0 ? facts.strikes + 1 : null,
|
|
100
|
+
reason: facts.claim.model === null && facts.claim.branch === null
|
|
101
|
+
? `${doing}${facts.claim.runner} · preparing workspace`
|
|
102
|
+
: `${doing}${facts.claim.runner}`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (facts.openDecisionId !== null) {
|
|
106
|
+
// The question is the content — the generic verb only when the
|
|
107
|
+
// snapshot could not carry it.
|
|
108
|
+
return {
|
|
109
|
+
...base,
|
|
110
|
+
lane: "attention",
|
|
111
|
+
reason: facts.question ?? "answer a question",
|
|
112
|
+
href: `/d/${facts.openDecisionId}`,
|
|
113
|
+
stalledSince: facts.decisionCreatedAt ?? facts.updatedAt,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// A finished tournament outranks every generic reading of the same rows
|
|
117
|
+
// (design round 2, finding 6): the claim is gone and the task still says
|
|
118
|
+
// running, which the generic branches would misread as a vanished build.
|
|
119
|
+
if (contest !== null) {
|
|
120
|
+
const link = `/contest/${contest.id}`;
|
|
121
|
+
if (contest.state === "pick-wait") {
|
|
122
|
+
return { ...base, lane: "attention", href: link, reason: `${(contest.kind === "comparison" ? "comparison" : "tournament")} finished — ${contest.agents} results to compare`, stalledSince: facts.updatedAt };
|
|
123
|
+
}
|
|
124
|
+
if (contest.state === "exhausted") {
|
|
125
|
+
return { ...base, lane: "attention", href: link, reason: `${(contest.kind === "comparison" ? "comparison" : "tournament")} ended with nothing to pick`, stalledSince: facts.updatedAt };
|
|
126
|
+
}
|
|
127
|
+
if (contest.state === "interrupted") {
|
|
128
|
+
return { ...base, lane: "attention", href: link, reason: `${(contest.kind === "comparison" ? "comparison" : "tournament")} was interrupted — decide what happens next`, stalledSince: facts.updatedAt };
|
|
129
|
+
}
|
|
130
|
+
if (contest.state === "decision-wait") {
|
|
131
|
+
// The open question already classified above; reaching here means it
|
|
132
|
+
// was answered and an agent resumes on the next pass.
|
|
133
|
+
return { ...base, lane: "building", reason: `${(contest.kind === "comparison" ? "comparison" : "tournament")} — an agent is resuming` };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (facts.state === "failed" || facts.openIncidents > 0) {
|
|
137
|
+
return {
|
|
138
|
+
...base,
|
|
139
|
+
lane: "attention",
|
|
140
|
+
stalledSince: facts.oldestIncidentAt ?? facts.updatedAt,
|
|
141
|
+
reason: facts.openIncidents > 0
|
|
142
|
+
? `stopped — ${facts.openIncidents} incident${facts.openIncidents > 1 ? "s" : ""}`
|
|
143
|
+
: `failed${facts.strikes > 0 ? ` after ${facts.strikes} attempt${facts.strikes > 1 ? "s" : ""}` : ""}`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (facts.plan === "drafted" && !facts.approved) {
|
|
147
|
+
// The planner concluded; the negotiation waits on the operator.
|
|
148
|
+
return { ...base, lane: "attention", reason: "review the plan", stalledSince: facts.updatedAt };
|
|
149
|
+
}
|
|
150
|
+
if (facts.plan !== "requested") {
|
|
151
|
+
if (!facts.hasScope) {
|
|
152
|
+
return { ...base, lane: "attention", reason: "write its scope", stalledSince: facts.updatedAt };
|
|
153
|
+
}
|
|
154
|
+
if (!facts.approved) {
|
|
155
|
+
return { ...base, lane: "attention", reason: "approve its scope", stalledSince: facts.updatedAt };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (facts.state === "running") {
|
|
159
|
+
// Running with no live claim: the build vanished out from under the
|
|
160
|
+
// state machine (reaped, or the claim expired mid-flight). A repair
|
|
161
|
+
// card, not a silent omission (finding 1).
|
|
162
|
+
return { ...base, lane: "attention", reason: "build vanished — needs repair", stalledSince: facts.updatedAt };
|
|
163
|
+
}
|
|
164
|
+
if (facts.hold !== null) {
|
|
165
|
+
const until = facts.hold.until;
|
|
166
|
+
const reason = facts.hold.ownerKind === "operator"
|
|
167
|
+
? "held by you"
|
|
168
|
+
: facts.hold.ownerKind === "backoff"
|
|
169
|
+
? until === null
|
|
170
|
+
? "backing off"
|
|
171
|
+
: until <= now.toISOString()
|
|
172
|
+
? "retrying now"
|
|
173
|
+
: `retrying ${clockOf(until)}`
|
|
174
|
+
: // A decision, incident, or tournament hold with no open item
|
|
175
|
+
// above it is an orphan — say who holds it in plain words,
|
|
176
|
+
// never the internal owner token.
|
|
177
|
+
holdOwnerWords(facts.hold.ownerKind);
|
|
178
|
+
return { ...base, lane: "waiting", reason };
|
|
179
|
+
}
|
|
180
|
+
if (facts.unmetDependency !== null) {
|
|
181
|
+
// A terminal blocker will never clear itself. Say repair instead of
|
|
182
|
+
// presenting an impossible dependency as ordinary patience.
|
|
183
|
+
if (facts.blockerState === "failed" || facts.blockerState === "cancelled") {
|
|
184
|
+
return {
|
|
185
|
+
...base,
|
|
186
|
+
lane: "waiting",
|
|
187
|
+
reason: `waiting for ${facts.unmetDependency}, but it ${facts.blockerState === "cancelled" ? "was cancelled" : "failed"}`,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const doing = facts.blockerState === null
|
|
191
|
+
? ""
|
|
192
|
+
: facts.blockerState === "running"
|
|
193
|
+
? " — building now"
|
|
194
|
+
: ` — ${facts.blockerState}`;
|
|
195
|
+
return { ...base, lane: "waiting", reason: `waits on ${facts.unmetDependency}${doing}` };
|
|
196
|
+
}
|
|
197
|
+
if (facts.missingRequirement !== null) {
|
|
198
|
+
return { ...base, lane: "waiting", reason: `needs ${facts.missingRequirement}` };
|
|
199
|
+
}
|
|
200
|
+
// Task-local prerequisites all satisfied. Fleet-wide constraints (worker
|
|
201
|
+
// capacity, provider quota, the attention budget) are deliberately not
|
|
202
|
+
// per-card claims — the board cannot know which runner would take this
|
|
203
|
+
// task, so the queued lane's header speaks for the fleet (finding 6).
|
|
204
|
+
// The card at this stage IS the promise: show the goal, not "ready" —
|
|
205
|
+
// unless the promise is still being negotiated, in which case say so.
|
|
206
|
+
if (facts.plan === "requested") {
|
|
207
|
+
return { ...base, lane: "queued", reason: "planning next" };
|
|
208
|
+
}
|
|
209
|
+
return { ...base, lane: "queued", reason: facts.goal ?? "ready" };
|
|
210
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS boot identity for process custody (OS containment and login recovery).
|
|
3
|
+
*
|
|
4
|
+
* A process witness carries the PID it saw, the host that saw it, and —
|
|
5
|
+
* from v53 — the identity of the OS boot it was born under. After a
|
|
6
|
+
* VERIFIED boot change on the same host, no process of the old boot can
|
|
7
|
+
* survive: a pending stop or recovery that would otherwise wait forever
|
|
8
|
+
* on an incomplete old spawn, or on a PID the new boot has since reused,
|
|
9
|
+
* may settle. Every other case keeps the conservative road the witness
|
|
10
|
+
* already took: a witness with no boot id (legacy), a witness from
|
|
11
|
+
* another host, a boot id this host cannot read or cannot parse, or two
|
|
12
|
+
* identical ids (the same boot, where the PID probe still decides).
|
|
13
|
+
*
|
|
14
|
+
* The identity comes from the kernel's own per-boot token, never from
|
|
15
|
+
* wall-clock arithmetic: a boot time compared to `now` proves nothing
|
|
16
|
+
* across suspended clocks, NTP steps and time-zone edits.
|
|
17
|
+
*
|
|
18
|
+
* linux /proc/sys/kernel/random/boot_id — a UUID minted at boot
|
|
19
|
+
* darwin sysctl kern.bootsessionuuid — a UUID minted at boot
|
|
20
|
+
* win32 no unprivileged per-boot UUID this build trusts → unknown
|
|
21
|
+
*/
|
|
22
|
+
export type BootIdentity = {
|
|
23
|
+
ok: true;
|
|
24
|
+
id: string;
|
|
25
|
+
source: "linux-boot-id" | "darwin-bootsessionuuid" | "injected";
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
reason: "unsupported-platform" | "unreadable" | "malformed";
|
|
29
|
+
detail: string;
|
|
30
|
+
};
|
|
31
|
+
export type BootIdentityReaders = {
|
|
32
|
+
platform?: NodeJS.Platform;
|
|
33
|
+
readFile?: (path: string) => string;
|
|
34
|
+
sysctl?: (name: string) => string;
|
|
35
|
+
};
|
|
36
|
+
/** Normalize a candidate token: exactly one UUID, lower-cased; anything else is malformed. */
|
|
37
|
+
export declare function normalizeBootId(raw: string): string | null;
|
|
38
|
+
/** Read the running kernel's boot token — never cached here, so a test can
|
|
39
|
+
* construct each answer; production reads it once through bootIdentity(). */
|
|
40
|
+
export declare function readBootIdentity(readers?: BootIdentityReaders): BootIdentity;
|
|
41
|
+
/** This process's boot identity, read once. `null` when it is unknown —
|
|
42
|
+
* every consumer must then take the conservative road. */
|
|
43
|
+
export declare function bootIdentity(): BootIdentity;
|
|
44
|
+
/** The id to stamp on new custody, or null when the boot is unknown. */
|
|
45
|
+
export declare function currentBootId(): string | null;
|
|
46
|
+
/** Tests only: pin or clear the cached identity for this process. */
|
|
47
|
+
export declare function injectBootIdentity(identity: BootIdentity | null): void;
|
|
48
|
+
export type BootWitness = {
|
|
49
|
+
host: string;
|
|
50
|
+
bootId: string | null;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* THE ONE RULE (plan §login/reboot recovery): a witnessed process is
|
|
54
|
+
* proven dead by boot change only when the witness names THIS host, the
|
|
55
|
+
* witness carries a well-formed boot id, this host's current boot id is
|
|
56
|
+
* well-formed and known, and the two differ. Same boot, a legacy witness
|
|
57
|
+
* without an id, a foreign host, an unknown or malformed current id — each
|
|
58
|
+
* answers false, and the caller keeps its PID probe or its refusal.
|
|
59
|
+
*/
|
|
60
|
+
export declare function provenDeadByBootChange(witness: BootWitness, current?: {
|
|
61
|
+
host?: string;
|
|
62
|
+
bootId: string | null;
|
|
63
|
+
}): boolean;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS boot identity for process custody (OS containment and login recovery).
|
|
3
|
+
*
|
|
4
|
+
* A process witness carries the PID it saw, the host that saw it, and —
|
|
5
|
+
* from v53 — the identity of the OS boot it was born under. After a
|
|
6
|
+
* VERIFIED boot change on the same host, no process of the old boot can
|
|
7
|
+
* survive: a pending stop or recovery that would otherwise wait forever
|
|
8
|
+
* on an incomplete old spawn, or on a PID the new boot has since reused,
|
|
9
|
+
* may settle. Every other case keeps the conservative road the witness
|
|
10
|
+
* already took: a witness with no boot id (legacy), a witness from
|
|
11
|
+
* another host, a boot id this host cannot read or cannot parse, or two
|
|
12
|
+
* identical ids (the same boot, where the PID probe still decides).
|
|
13
|
+
*
|
|
14
|
+
* The identity comes from the kernel's own per-boot token, never from
|
|
15
|
+
* wall-clock arithmetic: a boot time compared to `now` proves nothing
|
|
16
|
+
* across suspended clocks, NTP steps and time-zone edits.
|
|
17
|
+
*
|
|
18
|
+
* linux /proc/sys/kernel/random/boot_id — a UUID minted at boot
|
|
19
|
+
* darwin sysctl kern.bootsessionuuid — a UUID minted at boot
|
|
20
|
+
* win32 no unprivileged per-boot UUID this build trusts → unknown
|
|
21
|
+
*/
|
|
22
|
+
import { execFileSync } from "node:child_process";
|
|
23
|
+
import { readFileSync } from "node:fs";
|
|
24
|
+
import { hostname } from "node:os";
|
|
25
|
+
/** RFC 4122 shape, any case; the kernel tokens are exactly this. */
|
|
26
|
+
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
27
|
+
/** Normalize a candidate token: exactly one UUID, lower-cased; anything else is malformed. */
|
|
28
|
+
// Recovery may compare this normalized token only after its host/kernel origin is
|
|
29
|
+
// authenticated; well-formed text alone supplies neither boot identity nor absence.
|
|
30
|
+
export function normalizeBootId(raw) {
|
|
31
|
+
const trimmed = raw.trim();
|
|
32
|
+
return UUID.test(trimmed) ? trimmed.toLowerCase() : null;
|
|
33
|
+
}
|
|
34
|
+
/** Read the running kernel's boot token — never cached here, so a test can
|
|
35
|
+
* construct each answer; production reads it once through bootIdentity(). */
|
|
36
|
+
export function readBootIdentity(readers = {}) {
|
|
37
|
+
const platform = readers.platform ?? process.platform;
|
|
38
|
+
const readFile = readers.readFile ?? ((path) => readFileSync(path, "utf8"));
|
|
39
|
+
const sysctl = readers.sysctl ?? ((name) => execFileSync("/usr/sbin/sysctl", ["-n", name], { encoding: "utf8", timeout: 2000 }));
|
|
40
|
+
let raw;
|
|
41
|
+
let source;
|
|
42
|
+
try {
|
|
43
|
+
if (platform === "linux") {
|
|
44
|
+
source = "linux-boot-id";
|
|
45
|
+
raw = readFile("/proc/sys/kernel/random/boot_id");
|
|
46
|
+
}
|
|
47
|
+
else if (platform === "darwin") {
|
|
48
|
+
source = "darwin-bootsessionuuid";
|
|
49
|
+
raw = sysctl("kern.bootsessionuuid");
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
return { ok: false, reason: "unsupported-platform", detail: `${platform} exposes no per-boot identity this build trusts` };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return { ok: false, reason: "unreadable", detail: `the boot identity could not be read: ${error instanceof Error ? error.message : String(error)}` };
|
|
57
|
+
}
|
|
58
|
+
const id = normalizeBootId(raw);
|
|
59
|
+
if (id === null)
|
|
60
|
+
return { ok: false, reason: "malformed", detail: `the boot identity was not a UUID (${raw.trim().slice(0, 64)})` };
|
|
61
|
+
return { ok: true, id, source };
|
|
62
|
+
}
|
|
63
|
+
let cached = null;
|
|
64
|
+
/** This process's boot identity, read once. `null` when it is unknown —
|
|
65
|
+
* every consumer must then take the conservative road. */
|
|
66
|
+
export function bootIdentity() {
|
|
67
|
+
if (cached === null)
|
|
68
|
+
cached = readBootIdentity();
|
|
69
|
+
return cached;
|
|
70
|
+
}
|
|
71
|
+
/** The id to stamp on new custody, or null when the boot is unknown. */
|
|
72
|
+
export function currentBootId() {
|
|
73
|
+
const identity = bootIdentity();
|
|
74
|
+
return identity.ok ? identity.id : null;
|
|
75
|
+
}
|
|
76
|
+
/** Tests only: pin or clear the cached identity for this process. */
|
|
77
|
+
export function injectBootIdentity(identity) {
|
|
78
|
+
cached = identity;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* THE ONE RULE (plan §login/reboot recovery): a witnessed process is
|
|
82
|
+
* proven dead by boot change only when the witness names THIS host, the
|
|
83
|
+
* witness carries a well-formed boot id, this host's current boot id is
|
|
84
|
+
* well-formed and known, and the two differ. Same boot, a legacy witness
|
|
85
|
+
* without an id, a foreign host, an unknown or malformed current id — each
|
|
86
|
+
* answers false, and the caller keeps its PID probe or its refusal.
|
|
87
|
+
*/
|
|
88
|
+
export function provenDeadByBootChange(witness, current = { bootId: currentBootId() }) {
|
|
89
|
+
const host = current.host ?? hostname();
|
|
90
|
+
if (witness.host !== host)
|
|
91
|
+
return false;
|
|
92
|
+
if (witness.bootId === null || current.bootId === null)
|
|
93
|
+
return false;
|
|
94
|
+
const seen = normalizeBootId(witness.bootId);
|
|
95
|
+
const now = normalizeBootId(current.bootId);
|
|
96
|
+
if (seen === null || now === null)
|
|
97
|
+
return false;
|
|
98
|
+
return seen !== now;
|
|
99
|
+
}
|