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
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** `toolroll models …`: what each CLI can run, whether the CLIs are
|
|
2
|
+
* current, and the automatic check. The same saved catalog as Settings → Models. */
|
|
3
|
+
import { envelopeJson } from "./envelope.js";
|
|
4
|
+
import { checkModels, isNewModel, modelOptions, priceWords, RUNTIME_TOOLS, runtimeStates, seenModels, setWatch, updateRuntime, watchState } from "./model-catalog.js";
|
|
5
|
+
import { isProviderId } from "./provider.js";
|
|
6
|
+
const flags = [
|
|
7
|
+
{ name: "provider", takesValue: true, meaning: "claude, codex, gemini or openrouter, for models list" },
|
|
8
|
+
{ name: "json", takesValue: false, meaning: "versioned structured response" },
|
|
9
|
+
{ name: "db", takesValue: true, meaning: "local Toolroll database" },
|
|
10
|
+
];
|
|
11
|
+
export const MODELS_DESCRIPTORS = [
|
|
12
|
+
{ action: "status", synopsis: "installed CLI versions, available updates, new models and the automatic check", mutation: "none", takesQuery: false, flags },
|
|
13
|
+
{ action: "list", synopsis: "models a provider can run, newest first, with prices (--provider claude|codex|gemini|openrouter)", mutation: "none", takesQuery: false, flags },
|
|
14
|
+
{ action: "check", synopsis: "fetch the public model lists and check CLI versions now", mutation: "unkeyed", takesQuery: false, flags },
|
|
15
|
+
{ action: "update", synopsis: "update one CLI while no work is running: models update claude|codex|gemini", mutation: "unkeyed", takesQuery: true, flags },
|
|
16
|
+
{ action: "watch", synopsis: "turn the 6-hourly check and its messages on or off: models watch on|off", mutation: "unkeyed", takesQuery: true, flags },
|
|
17
|
+
];
|
|
18
|
+
export async function runModelsCommand(positional, options, context) {
|
|
19
|
+
const action = positional[0] ?? "status";
|
|
20
|
+
const command = `models ${action}`;
|
|
21
|
+
const fail = (reason, message) => { context.write(context.json ? envelopeJson({ ok: false, command, reason, message }) : message); return reason === "usage" ? 2 : 1; };
|
|
22
|
+
const ok = (result, lines) => { context.write(context.json ? envelopeJson({ ok: true, command, ...result }) : lines.join("\n")); return 0; };
|
|
23
|
+
if (!MODELS_DESCRIPTORS.some(one => one.action === action))
|
|
24
|
+
return fail("usage", "Use models status | list --provider <p> | check | update <claude|codex|gemini> | watch on|off.");
|
|
25
|
+
if (context.actor === null)
|
|
26
|
+
return fail("unauthenticated", "Sign in first: the remembered local login drives models commands.");
|
|
27
|
+
const { store, now } = context;
|
|
28
|
+
if (action === "status") {
|
|
29
|
+
const runtimes = runtimeStates(store), watch = watchState(store);
|
|
30
|
+
const fresh = ["claude", "codex", "gemini"].flatMap(source => seenModels(store, source)).filter(model => isNewModel(model, now));
|
|
31
|
+
return ok({ runtimes, watch, newModels: fresh }, [
|
|
32
|
+
...(runtimes.length === 0 ? ["No CLI versions checked yet. Run: toolroll models check"] : runtimes.map(one => `${one.name} ${one.installed ?? "?"}${one.behind ? ` · ${one.latest} available${one.updateCommand === null ? "" : ` (toolroll models update ${one.tool})`}` : " · up to date"}`)),
|
|
33
|
+
...fresh.map(model => `New: ${model.name} · ${priceWords(model)}`),
|
|
34
|
+
`Automatic checks: ${watch.enabled ? "on" : "off"} · last checked ${watch.checkedAt ?? "never"}`,
|
|
35
|
+
]);
|
|
36
|
+
}
|
|
37
|
+
if (action === "list") {
|
|
38
|
+
const provider = options.get("provider");
|
|
39
|
+
if (typeof provider !== "string" || !isProviderId(provider))
|
|
40
|
+
return fail("usage", "Use --provider claude, codex, gemini or openrouter.");
|
|
41
|
+
const models = modelOptions(store, provider, now);
|
|
42
|
+
return ok({ provider, models }, models.length === 0 ? ["No models saved yet. Run: toolroll models check"] : models.map(one => `${one.value} ${one.label}`));
|
|
43
|
+
}
|
|
44
|
+
if (action === "check") {
|
|
45
|
+
const checked = await checkModels(store, now, context.seams);
|
|
46
|
+
const notable = checked.added.filter(one => one.source !== "openrouter");
|
|
47
|
+
if (!checked.ok)
|
|
48
|
+
return fail("refused", checked.problem ?? "The model lists could not be fetched.");
|
|
49
|
+
return ok({ added: notable, runtimes: checked.runtimes }, [
|
|
50
|
+
notable.length === 0 ? "No new models." : `New: ${notable.map(one => one.name).join(", ")}`,
|
|
51
|
+
...checked.runtimes.filter(one => one.behind).map(one => `${one.name} ${one.latest} is available (you have ${one.installed}).`),
|
|
52
|
+
]);
|
|
53
|
+
}
|
|
54
|
+
if (action === "update") {
|
|
55
|
+
const tool = positional[1] ?? "";
|
|
56
|
+
if (!(tool in RUNTIME_TOOLS))
|
|
57
|
+
return fail("usage", "Name one CLI: models update claude|codex|gemini.");
|
|
58
|
+
const updated = await updateRuntime(store, tool, context.actor, now, context.seams);
|
|
59
|
+
return updated.ok ? ok({ tool, message: updated.message }, [updated.message]) : fail("refused", updated.message);
|
|
60
|
+
}
|
|
61
|
+
const wanted = positional[1];
|
|
62
|
+
if (wanted !== "on" && wanted !== "off")
|
|
63
|
+
return fail("usage", "Use models watch on or models watch off.");
|
|
64
|
+
setWatch(store, wanted === "on", context.actor, now);
|
|
65
|
+
return ok({ enabled: wanted === "on" }, [wanted === "on" ? "Automatic checks are on: every 6 hours, with a message for each new model or CLI update." : "Automatic checks are off."]);
|
|
66
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Settings → Models: the CLIs on this computer, the default agent for each
|
|
2
|
+
* role picked from live lists, and the models that just arrived. */
|
|
3
|
+
import type { ModelOption, RuntimeState, SeenModel, WatchState } from "./model-catalog.js";
|
|
4
|
+
export declare const MODELS_CSS = ".models{max-width:780px;min-width:0;overflow-wrap:anywhere}.models .card{padding:16px 20px;margin:12px 0;min-width:0}.models h2{margin:24px 0 8px}.models form{margin:0}.models label{display:grid;gap:6px}.models select,.models input[type=search]{box-sizing:border-box;width:100%;max-width:100%;min-width:0}.models button,.models summary,.models .button-link{min-height:44px}.models button{white-space:nowrap}.models summary{padding:12px 0;cursor:pointer}.models .tool{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap}.models .role{display:grid;grid-template-columns:minmax(0,1fr);gap:8px}.models .role-row{display:flex;gap:12px;align-items:end;flex-wrap:wrap}.models .role-row select{flex:1 1 240px;width:auto;min-width:0}.models .role-name{font-weight:600}.models .new{font-weight:600}.models ul{padding-left:20px}.models .meta{font-size:.86rem}@media(max-width:600px){.models .card{padding:14px}}";
|
|
5
|
+
export type RoleView = {
|
|
6
|
+
phase: "plan" | "build" | "review" | "repair";
|
|
7
|
+
label: string;
|
|
8
|
+
/** "provider|model", or "inherit" for a repair that follows the builder. */
|
|
9
|
+
current: string;
|
|
10
|
+
words: string;
|
|
11
|
+
groups: {
|
|
12
|
+
label: string;
|
|
13
|
+
provider: string;
|
|
14
|
+
options: ModelOption[];
|
|
15
|
+
}[];
|
|
16
|
+
/** Repair only: offer "Same as the builder". */
|
|
17
|
+
inherit?: boolean;
|
|
18
|
+
};
|
|
19
|
+
export type ModelsView = {
|
|
20
|
+
runtimes: RuntimeState[];
|
|
21
|
+
watch: WatchState;
|
|
22
|
+
roles: RoleView[];
|
|
23
|
+
chat: {
|
|
24
|
+
words: string;
|
|
25
|
+
} | null;
|
|
26
|
+
fresh: SeenModel[];
|
|
27
|
+
csrf: string;
|
|
28
|
+
canManage: boolean;
|
|
29
|
+
said: string | null;
|
|
30
|
+
problem: string | null;
|
|
31
|
+
};
|
|
32
|
+
export declare function modelsHtml(view: ModelsView): string;
|
|
33
|
+
/** Filters one long picker as you type; the saved choice always stays listed. */
|
|
34
|
+
export declare function modelsScript(): string;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { priceWords } from "./model-catalog.js";
|
|
2
|
+
const e = (s) => String(s ?? "").replace(/[&<>"']/g, c => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]));
|
|
3
|
+
const hidden = (data) => Object.entries(data).map(([k, v]) => `<input type="hidden" name="${e(k)}" value="${e(v)}">`).join("");
|
|
4
|
+
const when = (iso) => iso === null ? "never" : `${iso.slice(0, 16).replace("T", " ")} UTC`;
|
|
5
|
+
export const MODELS_CSS = `.models{max-width:780px;min-width:0;overflow-wrap:anywhere}.models .card{padding:16px 20px;margin:12px 0;min-width:0}.models h2{margin:24px 0 8px}.models form{margin:0}.models label{display:grid;gap:6px}.models select,.models input[type=search]{box-sizing:border-box;width:100%;max-width:100%;min-width:0}.models button,.models summary,.models .button-link{min-height:44px}.models button{white-space:nowrap}.models summary{padding:12px 0;cursor:pointer}.models .tool{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap}.models .role{display:grid;grid-template-columns:minmax(0,1fr);gap:8px}.models .role-row{display:flex;gap:12px;align-items:end;flex-wrap:wrap}.models .role-row select{flex:1 1 240px;width:auto;min-width:0}.models .role-name{font-weight:600}.models .new{font-weight:600}.models ul{padding-left:20px}.models .meta{font-size:.86rem}@media(max-width:600px){.models .card{padding:14px}}`;
|
|
6
|
+
function toolRow(one, manage, csrf) {
|
|
7
|
+
const state = one.installed === null ? "Version unknown"
|
|
8
|
+
: one.behind ? `${e(one.installed)} · <strong>${e(one.latest)} available</strong>`
|
|
9
|
+
: `${e(one.installed)} · Up to date`;
|
|
10
|
+
const action = manage && one.behind && one.updateCommand !== null
|
|
11
|
+
? `<form method="post" action="/settings/models/update">${hidden({ csrf, tool: one.tool })}<button type="submit">Update ${e(one.name)}</button></form>`
|
|
12
|
+
: one.behind ? `<span class="meta">Update it the way you installed it</span>` : "";
|
|
13
|
+
return `<div class="card tool"><span><strong>${e(one.name)}</strong> ${state}${one.problem === null ? "" : `<br><span class="meta">${e(one.problem)}</span>`}</span>${action}</div>`;
|
|
14
|
+
}
|
|
15
|
+
function roleForm(role, manage, csrf) {
|
|
16
|
+
if (!manage)
|
|
17
|
+
return `<div class="card role"><strong>${e(role.label)}</strong><span>${e(role.words)}</span></div>`;
|
|
18
|
+
const known = role.groups.some(group => group.options.some(option => `${group.provider}|${option.value}` === role.current));
|
|
19
|
+
const saved = !known && role.current !== "inherit" && role.current !== "" ? `<option value="${e(role.current)}" selected>${e(role.words)} · current</option>` : "";
|
|
20
|
+
const groups = role.groups.map(group => `<optgroup label="${e(group.label)}">${group.options.map(option => {
|
|
21
|
+
const value = `${group.provider}|${option.value}`;
|
|
22
|
+
return `<option value="${e(value)}"${value === role.current ? " selected" : ""}>${e(option.label)}</option>`;
|
|
23
|
+
}).join("")}</optgroup>`).join("");
|
|
24
|
+
const inherit = role.inherit ? `<option value="inherit"${role.current === "inherit" ? " selected" : ""}>Same as the builder</option>` : "";
|
|
25
|
+
const long = role.groups.reduce((sum, group) => sum + group.options.length, 0) > 40;
|
|
26
|
+
const count = role.groups.reduce((sum, group) => sum + group.options.length, 0);
|
|
27
|
+
const id = `role-${role.phase}`;
|
|
28
|
+
return `<form method="post" action="/settings/models/agent" class="card role">${hidden({ csrf, phase: role.phase })}` +
|
|
29
|
+
`<label class="role-name" for="${id}">${e(role.label)}</label>` +
|
|
30
|
+
(long ? `<input type="search" data-model-filter hidden aria-label="Search ${e(role.label.toLowerCase())} models" placeholder="Search ${count} models" autocomplete="off">` : "") +
|
|
31
|
+
`<div class="role-row"><select id="${id}" name="agent">${inherit}${saved}${groups}</select><button type="submit" class="secondary">Save</button></div></form>`;
|
|
32
|
+
}
|
|
33
|
+
export function modelsHtml(view) {
|
|
34
|
+
const manage = view.canManage && view.csrf !== "";
|
|
35
|
+
const status = view.said === null ? "" : `<p role="status">${e(view.said)}</p>`;
|
|
36
|
+
const problem = view.problem === null ? "" : `<p class="problem" role="alert">${e(view.problem)}</p>`;
|
|
37
|
+
const tools = view.runtimes.length === 0
|
|
38
|
+
? `<p class="meta">No Claude, Codex or Gemini CLI found on this computer yet.</p>`
|
|
39
|
+
: view.runtimes.map(one => toolRow(one, manage, view.csrf)).join("");
|
|
40
|
+
const check = manage
|
|
41
|
+
? `<form method="post" action="/settings/models/check" class="inline">${hidden({ csrf: view.csrf })}<button type="submit" class="secondary">Check now</button></form>`
|
|
42
|
+
: "";
|
|
43
|
+
const fresh = view.fresh.length === 0 ? "" :
|
|
44
|
+
`<h2>New models</h2><ul>${view.fresh.map(model => `<li><span class="new">${e(model.name)}</span> <span class="meta">${e(priceWords(model))}${model.releasedAt === null ? "" : ` · released ${e(model.releasedAt.slice(0, 10))}`}</span></li>`).join("")}</ul>`;
|
|
45
|
+
const watch = manage
|
|
46
|
+
? `<details><summary>Automatic checks · ${view.watch.enabled ? "On" : "Off"}</summary><form method="post" action="/settings/models/watch">${hidden({ csrf: view.csrf, enabled: view.watch.enabled ? "0" : "1" })}` +
|
|
47
|
+
`<p>Check every 6 hours and send a message when a new model or CLI update appears. It uses public lists and sends nothing about you or your projects.</p>` +
|
|
48
|
+
`<button type="submit" class="secondary">${view.watch.enabled ? "Turn off" : "Turn on"}</button></form></details>`
|
|
49
|
+
: "";
|
|
50
|
+
return `<section class="models">${status}${problem}` +
|
|
51
|
+
`<h2>AI tools</h2>${tools}<p class="meta">Checked ${e(when(view.watch.checkedAt))} ${check}</p>` +
|
|
52
|
+
fresh +
|
|
53
|
+
`<h2>Default agents</h2><p class="meta">New tasks use these. Approved tasks keep the agents they were approved with.</p>` +
|
|
54
|
+
view.roles.map(role => roleForm(role, manage, view.csrf)).join("") +
|
|
55
|
+
(view.chat === null ? "" : `<h2>Chat</h2><p>${e(view.chat.words)} · <a href="/chat?settings=1#chat-settings">Change</a></p>`) +
|
|
56
|
+
watch + `</section>`;
|
|
57
|
+
}
|
|
58
|
+
/** Filters one long picker as you type; the saved choice always stays listed. */
|
|
59
|
+
export function modelsScript() {
|
|
60
|
+
return `(function(){document.querySelectorAll('.models form.role').forEach(function(form){
|
|
61
|
+
var search=form.querySelector('[data-model-filter]'),select=form.querySelector('select');
|
|
62
|
+
if(!search||!select)return;search.hidden=false;
|
|
63
|
+
var groups=Array.from(select.querySelectorAll('optgroup')).map(function(g){return{g:g,options:Array.from(g.children)}});
|
|
64
|
+
search.addEventListener('input',function(){var q=search.value.trim().toLowerCase(),chosen=select.value;
|
|
65
|
+
groups.forEach(function(entry){entry.g.replaceChildren();entry.options.forEach(function(o){if(!q||o.value===chosen||(o.textContent+' '+o.value).toLowerCase().includes(q))entry.g.appendChild(o)})});
|
|
66
|
+
select.value=chosen;});
|
|
67
|
+
})})();`;
|
|
68
|
+
}
|
package/dist/modes.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operating modes (v29, the modes chain v1–v7): a per-repository,
|
|
3
|
+
* password-signed, expiring envelope that pre-authorizes the SIGNER'S OWN
|
|
4
|
+
* future acts. The absence of a mode is 'locked' — every act keeps its
|
|
5
|
+
* own ceremony, today's world, the default forever.
|
|
6
|
+
*
|
|
7
|
+
* The doctrine (v4 ruling): RAISING authority is a password ceremony;
|
|
8
|
+
* LOWERING it is one click for any approver; on revocation or expiry
|
|
9
|
+
* every mode-derived flow falls back to the human ceremony at its next
|
|
10
|
+
* gate, and running work is never fenced.
|
|
11
|
+
*
|
|
12
|
+
* This module owns the terms shape, the digest, and the words. The store
|
|
13
|
+
* owns the transactions; the tick owns the rails; serve owns the
|
|
14
|
+
* ceremony screens.
|
|
15
|
+
*/
|
|
16
|
+
export type ModeName = "standard" | "hands-off";
|
|
17
|
+
export type ModeTerms = {
|
|
18
|
+
name: ModeName;
|
|
19
|
+
/** The filing default per provider (C7 matrix): "safe" = auto /
|
|
20
|
+
* auto_edit; "escalated" = bypassPermissions / yolo. Codex-shaped
|
|
21
|
+
* providers have one posture and the ceremony words say escalation
|
|
22
|
+
* changes nothing for them. */
|
|
23
|
+
permissionDefault: "safe" | "escalated";
|
|
24
|
+
/** Auto-approve the SIGNER'S OWN credentialed filings (C1's predicate
|
|
25
|
+
* and road table). */
|
|
26
|
+
autoApproveFiling: boolean;
|
|
27
|
+
/** Explicit opt-in: a verified planner may approve a plan that preserves
|
|
28
|
+
* the signer's pre-authorized filed contract and execution terms exactly. */
|
|
29
|
+
planAuto: boolean;
|
|
30
|
+
/** Attended mint without the per-mint password — signer only (D8). */
|
|
31
|
+
quickMint: boolean;
|
|
32
|
+
/** Historical signed field; new modes leave it false and no worker consumes it. */
|
|
33
|
+
reviewAuto: boolean;
|
|
34
|
+
/** Historical signed retry term, retained for digest and audit compatibility. */
|
|
35
|
+
reviewRetryAuto: boolean;
|
|
36
|
+
/** Stamped into filings that name no budget of their own. */
|
|
37
|
+
perAttemptBudgetMicrousd: number | null;
|
|
38
|
+
/** SOFT rail: new admissions stop once the day's MEASURED spend has
|
|
39
|
+
* reached this; running work may finish past it (D4). */
|
|
40
|
+
dailyMeasuredCapMicrousd: number | null;
|
|
41
|
+
/** HARD rail: reservation-counted admissions per UTC day, covering
|
|
42
|
+
* unmeasured providers too (D4). */
|
|
43
|
+
dailyRunCap: number | null;
|
|
44
|
+
/** "notify" = merges wait for a human even under a merge grant;
|
|
45
|
+
* "automerge" = the mode's signature substitutes for the per-merge
|
|
46
|
+
* human authorization, through the grant machinery only (D1/E1). */
|
|
47
|
+
publication: "notify" | "automerge";
|
|
48
|
+
/** Whether this mode AUTHORIZES automatic PAID fallback (a
|
|
49
|
+
* subscription->api-key or api-key->api-key switch that spends). v30,
|
|
50
|
+
* fallback chains R8: legacy modes default FALSE — a paid substitution
|
|
51
|
+
* must be an explicit, freshly-signed grant. A subscription->subscription
|
|
52
|
+
* fallback is not "paid" and needs no grant. */
|
|
53
|
+
allowPaidFallback: boolean;
|
|
54
|
+
/** Whether this mode AUTHORIZES the bounded repair loop to draft AND
|
|
55
|
+
* auto-approve its own repair attempts (v40, evidence-review-v1) — the
|
|
56
|
+
* allowPaidFallback precedent, verbatim: legacy modes default FALSE, a
|
|
57
|
+
* new authority is never inherited, only freshly signed. Without it, a
|
|
58
|
+
* short/refuted run with named unresolved criteria still gets exactly
|
|
59
|
+
* one drafted repair — it simply waits unapproved. */
|
|
60
|
+
repairAuto: boolean;
|
|
61
|
+
/** The signed cap on repair attempts per chain (0..3), counted over the
|
|
62
|
+
* chain rooted at the original task. Meaningless (read as 0) unless
|
|
63
|
+
* `repairAuto` is also true — a mode may sign a cap without signing the
|
|
64
|
+
* authority, but never the reverse. */
|
|
65
|
+
repairMaxAttempts: number;
|
|
66
|
+
absoluteExpiry: string;
|
|
67
|
+
};
|
|
68
|
+
export declare const MODE_MAX_DAYS = 7;
|
|
69
|
+
/** The presets are STARTING POINTS the ceremony renders in full — the
|
|
70
|
+
* signature always covers the resolved terms, never a label. */
|
|
71
|
+
export declare function presetTerms(name: ModeName, absoluteExpiry: string): ModeTerms;
|
|
72
|
+
export declare function modeTermsJson(terms: ModeTerms): string;
|
|
73
|
+
/** sha256 over a domain-separated canonical encoding, 32 hex like every
|
|
74
|
+
* other safety digest here. */
|
|
75
|
+
export declare function modeDigestOf(terms: ModeTerms): string;
|
|
76
|
+
/** Strict rehydration — anything unexpected is null, never a guess. */
|
|
77
|
+
export declare function modeTermsFromJson(json: string | null): ModeTerms | null;
|
|
78
|
+
/** Every term in words — what the ceremony renders and the password
|
|
79
|
+
* signs. The reversal sentence is verbatim from the chain (C1). */
|
|
80
|
+
export declare function modeWords(terms: ModeTerms): string[];
|
package/dist/modes.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operating modes (v29, the modes chain v1–v7): a per-repository,
|
|
3
|
+
* password-signed, expiring envelope that pre-authorizes the SIGNER'S OWN
|
|
4
|
+
* future acts. The absence of a mode is 'locked' — every act keeps its
|
|
5
|
+
* own ceremony, today's world, the default forever.
|
|
6
|
+
*
|
|
7
|
+
* The doctrine (v4 ruling): RAISING authority is a password ceremony;
|
|
8
|
+
* LOWERING it is one click for any approver; on revocation or expiry
|
|
9
|
+
* every mode-derived flow falls back to the human ceremony at its next
|
|
10
|
+
* gate, and running work is never fenced.
|
|
11
|
+
*
|
|
12
|
+
* This module owns the terms shape, the digest, and the words. The store
|
|
13
|
+
* owns the transactions; the tick owns the rails; serve owns the
|
|
14
|
+
* ceremony screens.
|
|
15
|
+
*/
|
|
16
|
+
import { createHash } from "node:crypto";
|
|
17
|
+
export const MODE_MAX_DAYS = 7;
|
|
18
|
+
/** The presets are STARTING POINTS the ceremony renders in full — the
|
|
19
|
+
* signature always covers the resolved terms, never a label. */
|
|
20
|
+
export function presetTerms(name, absoluteExpiry) {
|
|
21
|
+
return name === "standard"
|
|
22
|
+
? {
|
|
23
|
+
name,
|
|
24
|
+
permissionDefault: "safe",
|
|
25
|
+
autoApproveFiling: false,
|
|
26
|
+
planAuto: false,
|
|
27
|
+
quickMint: true,
|
|
28
|
+
reviewAuto: false,
|
|
29
|
+
reviewRetryAuto: false,
|
|
30
|
+
perAttemptBudgetMicrousd: null,
|
|
31
|
+
dailyMeasuredCapMicrousd: null,
|
|
32
|
+
dailyRunCap: null,
|
|
33
|
+
publication: "notify",
|
|
34
|
+
allowPaidFallback: false,
|
|
35
|
+
repairAuto: false,
|
|
36
|
+
repairMaxAttempts: 0,
|
|
37
|
+
absoluteExpiry,
|
|
38
|
+
}
|
|
39
|
+
: {
|
|
40
|
+
name,
|
|
41
|
+
permissionDefault: "escalated",
|
|
42
|
+
autoApproveFiling: true,
|
|
43
|
+
planAuto: false,
|
|
44
|
+
quickMint: true,
|
|
45
|
+
reviewAuto: false,
|
|
46
|
+
reviewRetryAuto: false,
|
|
47
|
+
perAttemptBudgetMicrousd: null,
|
|
48
|
+
dailyMeasuredCapMicrousd: null,
|
|
49
|
+
dailyRunCap: null,
|
|
50
|
+
publication: "notify",
|
|
51
|
+
allowPaidFallback: false,
|
|
52
|
+
repairAuto: false,
|
|
53
|
+
repairMaxAttempts: 0,
|
|
54
|
+
absoluteExpiry,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function canonicalJson(value) {
|
|
58
|
+
if (Array.isArray(value))
|
|
59
|
+
return `[${value.map(canonicalJson).join(",")}]`;
|
|
60
|
+
if (value !== null && typeof value === "object") {
|
|
61
|
+
const entries = Object.entries(value)
|
|
62
|
+
.filter(([, v]) => v !== undefined)
|
|
63
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
64
|
+
.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`);
|
|
65
|
+
return `{${entries.join(",")}}`;
|
|
66
|
+
}
|
|
67
|
+
return JSON.stringify(value);
|
|
68
|
+
}
|
|
69
|
+
export function modeTermsJson(terms) {
|
|
70
|
+
return canonicalJson(terms);
|
|
71
|
+
}
|
|
72
|
+
/** sha256 over a domain-separated canonical encoding, 32 hex like every
|
|
73
|
+
* other safety digest here. */
|
|
74
|
+
export function modeDigestOf(terms) {
|
|
75
|
+
return createHash("sha256")
|
|
76
|
+
.update(`standing-orders:mode:${modeTermsJson(terms)}`, "utf8")
|
|
77
|
+
.digest("hex")
|
|
78
|
+
.slice(0, 32);
|
|
79
|
+
}
|
|
80
|
+
/** Strict rehydration — anything unexpected is null, never a guess. */
|
|
81
|
+
export function modeTermsFromJson(json) {
|
|
82
|
+
if (json === null)
|
|
83
|
+
return null;
|
|
84
|
+
let parsed;
|
|
85
|
+
try {
|
|
86
|
+
parsed = JSON.parse(json);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
if (parsed === null || typeof parsed !== "object")
|
|
92
|
+
return null;
|
|
93
|
+
const t = parsed;
|
|
94
|
+
const optMoney = (v) => v === null ? null : typeof v === "number" && Number.isInteger(v) && v > 0 ? v : undefined;
|
|
95
|
+
const budget = optMoney(t["perAttemptBudgetMicrousd"]);
|
|
96
|
+
const measured = optMoney(t["dailyMeasuredCapMicrousd"]);
|
|
97
|
+
const runs = optMoney(t["dailyRunCap"]);
|
|
98
|
+
if ((t["name"] === "standard" || t["name"] === "hands-off") &&
|
|
99
|
+
(t["permissionDefault"] === "safe" || t["permissionDefault"] === "escalated") &&
|
|
100
|
+
typeof t["autoApproveFiling"] === "boolean" &&
|
|
101
|
+
(t["planAuto"] === undefined || typeof t["planAuto"] === "boolean") &&
|
|
102
|
+
typeof t["quickMint"] === "boolean" &&
|
|
103
|
+
typeof t["reviewAuto"] === "boolean" &&
|
|
104
|
+
(t["reviewRetryAuto"] === undefined || typeof t["reviewRetryAuto"] === "boolean") &&
|
|
105
|
+
budget !== undefined &&
|
|
106
|
+
measured !== undefined &&
|
|
107
|
+
runs !== undefined &&
|
|
108
|
+
(t["publication"] === "notify" || t["publication"] === "automerge") &&
|
|
109
|
+
// allowPaidFallback: a legacy mode has NO such field — that MUST read
|
|
110
|
+
// as false (R8: a paid substitution is only ever an explicit,
|
|
111
|
+
// freshly-signed grant). A present value must be a strict boolean;
|
|
112
|
+
// anything else is a bad envelope, null.
|
|
113
|
+
(t["allowPaidFallback"] === undefined || typeof t["allowPaidFallback"] === "boolean") &&
|
|
114
|
+
// repairAuto/repairMaxAttempts: the SAME precedent, verbatim (v40). A
|
|
115
|
+
// legacy mode has NO such fields — that MUST read as false/0, never
|
|
116
|
+
// inherited. A present repairAuto must be a strict boolean; a present
|
|
117
|
+
// repairMaxAttempts must be an integer 0..3. Anything else is a bad
|
|
118
|
+
// envelope, null.
|
|
119
|
+
(t["repairAuto"] === undefined || typeof t["repairAuto"] === "boolean") &&
|
|
120
|
+
(t["repairMaxAttempts"] === undefined ||
|
|
121
|
+
(typeof t["repairMaxAttempts"] === "number" && Number.isInteger(t["repairMaxAttempts"]) && t["repairMaxAttempts"] >= 0 && t["repairMaxAttempts"] <= 3)) &&
|
|
122
|
+
typeof t["absoluteExpiry"] === "string" &&
|
|
123
|
+
!Number.isNaN(Date.parse(t["absoluteExpiry"]))) {
|
|
124
|
+
return {
|
|
125
|
+
name: t["name"],
|
|
126
|
+
permissionDefault: t["permissionDefault"],
|
|
127
|
+
autoApproveFiling: t["autoApproveFiling"],
|
|
128
|
+
planAuto: t["planAuto"] === true,
|
|
129
|
+
quickMint: t["quickMint"],
|
|
130
|
+
reviewAuto: t["reviewAuto"],
|
|
131
|
+
reviewRetryAuto: t["reviewRetryAuto"] === true,
|
|
132
|
+
perAttemptBudgetMicrousd: budget,
|
|
133
|
+
dailyMeasuredCapMicrousd: measured,
|
|
134
|
+
dailyRunCap: runs,
|
|
135
|
+
publication: t["publication"],
|
|
136
|
+
allowPaidFallback: t["allowPaidFallback"] === true,
|
|
137
|
+
repairAuto: t["repairAuto"] === true,
|
|
138
|
+
repairMaxAttempts: typeof t["repairMaxAttempts"] === "number" ? t["repairMaxAttempts"] : 0,
|
|
139
|
+
absoluteExpiry: t["absoluteExpiry"],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
/** Every term in words — what the ceremony renders and the password
|
|
145
|
+
* signs. The reversal sentence is verbatim from the chain (C1). */
|
|
146
|
+
export function modeWords(terms) {
|
|
147
|
+
return [
|
|
148
|
+
terms.permissionDefault === "escalated"
|
|
149
|
+
? "new filings default to FULL permissions: claude runs with --dangerously-skip-permissions, gemini with --approval-mode yolo (codex-shaped lanes have one posture; this changes nothing for them)"
|
|
150
|
+
: "new filings use safe unattended permissions: routine project commands and edits proceed; risky acts stop for approval",
|
|
151
|
+
terms.autoApproveFiling
|
|
152
|
+
? "every scope YOU file — signed-in console or credentialed CLI — is approved the moment you file it; while this mode is active, your signed-in browser session becomes a spend credential for this repository"
|
|
153
|
+
: "filings still wait for their own approval ceremony",
|
|
154
|
+
terms.quickMint
|
|
155
|
+
? "you start watched sessions without re-typing your password — the confirm screen still shows every term"
|
|
156
|
+
: "watched sessions keep the per-session password",
|
|
157
|
+
terms.planAuto
|
|
158
|
+
? "plans for your pre-authorized filings auto-approve only when the goal, exclusions, paths, acceptance criteria, risk, budget, and agent route remain exactly unchanged; provide a goal, paths and acceptance criteria upfront; amendments and unresolved questions still wait for you"
|
|
159
|
+
: "planner-generated plans wait for your approval",
|
|
160
|
+
"finished work and saved checks go to the lead or user; no separate model review runs",
|
|
161
|
+
...(terms.reviewAuto || terms.reviewRetryAuto
|
|
162
|
+
? ["historical review grants are retained on record but no longer schedule work"] : []),
|
|
163
|
+
terms.perAttemptBudgetMicrousd === null
|
|
164
|
+
? "filings carry no default dollar cap"
|
|
165
|
+
: `filings that name no budget get a $${(terms.perAttemptBudgetMicrousd / 1_000_000).toFixed(2)} per-attempt cap`,
|
|
166
|
+
terms.dailyMeasuredCapMicrousd === null
|
|
167
|
+
? "no daily dollar rail"
|
|
168
|
+
: `new admissions stop once the day's MEASURED spend reaches $${(terms.dailyMeasuredCapMicrousd / 1_000_000).toFixed(2)} — running work may finish past it, and unmeasured providers ride outside this number`,
|
|
169
|
+
terms.dailyRunCap === null
|
|
170
|
+
? "no daily run rail"
|
|
171
|
+
: `at most ${terms.dailyRunCap} agent starts per UTC day, every provider counted, reserved at admission`,
|
|
172
|
+
terms.publication === "automerge"
|
|
173
|
+
? "pull requests merge THEMSELVES when CI is seen green on the exact commit — you are told afterwards (requires a merge-capable publication grant)"
|
|
174
|
+
: "merges wait for you — even where a grant could merge on its own, while this mode is active",
|
|
175
|
+
terms.allowPaidFallback
|
|
176
|
+
? "when a subscription is exhausted mid-build, an approved fallback that spends (an API key) may run automatically — spend moves to that account"
|
|
177
|
+
: "automatic fallback never switches to a paid API key on its own; a subscription that runs out stops and waits for you",
|
|
178
|
+
...(terms.repairAuto
|
|
179
|
+
? ["historical automatic repair grants are retained on record but no longer schedule work"] : []),
|
|
180
|
+
`everything above ends at ${terms.absoluteExpiry.slice(0, 16).replace("T", " ")} — revoking it earlier is one click, and every act it covered falls back to its own ceremony`,
|
|
181
|
+
];
|
|
182
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Where an address points, without its path or query (a webhook may carry a key in either). */
|
|
2
|
+
export declare const origin: (address: string) => string;
|
|
3
|
+
export type MonitoringSettings = {
|
|
4
|
+
webhook: {
|
|
5
|
+
url: string;
|
|
6
|
+
secret: string;
|
|
7
|
+
} | null;
|
|
8
|
+
folder: {
|
|
9
|
+
path: string;
|
|
10
|
+
} | null;
|
|
11
|
+
traces: {
|
|
12
|
+
endpoint: string;
|
|
13
|
+
header: {
|
|
14
|
+
name: string;
|
|
15
|
+
value: string;
|
|
16
|
+
} | null;
|
|
17
|
+
} | null;
|
|
18
|
+
};
|
|
19
|
+
export declare const NO_MONITORING: MonitoringSettings;
|
|
20
|
+
/** An address Toolroll may send to: https anywhere, http only to this machine (a collector beside it). */
|
|
21
|
+
export declare function sendableAddress(value: string): string | null;
|
|
22
|
+
export declare function readMonitoring(dir: string | null | undefined): MonitoringSettings;
|
|
23
|
+
/** A fresh signing secret for the webhook (shown once; the receiver keeps it to check each request). */
|
|
24
|
+
export declare function newSigningSecret(): string;
|
|
25
|
+
export type MonitoringForm = {
|
|
26
|
+
webhook: string;
|
|
27
|
+
folder: string;
|
|
28
|
+
tracesEndpoint: string;
|
|
29
|
+
headerName: string;
|
|
30
|
+
headerValue: string;
|
|
31
|
+
rotate: boolean;
|
|
32
|
+
};
|
|
33
|
+
export declare function saveMonitoring(dir: string, form: MonitoringForm, previous: MonitoringSettings, forbidden?: readonly string[]): {
|
|
34
|
+
ok: true;
|
|
35
|
+
settings: MonitoringSettings;
|
|
36
|
+
secret: string | null;
|
|
37
|
+
} | {
|
|
38
|
+
ok: false;
|
|
39
|
+
said: string;
|
|
40
|
+
};
|
|
41
|
+
/** The change in words for the ledger: where things go and header names, never a secret or a full address. */
|
|
42
|
+
export declare function monitoringWords(settings: MonitoringSettings): string;
|
|
43
|
+
/** A change for the ledger: before → after, and what changed that the words alone don't show (never the values). */
|
|
44
|
+
export declare function monitoringChange(before: MonitoringSettings, after: MonitoringSettings, newSecret: boolean): string | null;
|