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,75 @@
|
|
|
1
|
+
/** v99: sign-ins (and refusals, lockouts, sign-outs) and policy changes are their own kinds of event. */
|
|
2
|
+
export const LEDGER_SOURCES = ["work", "request", "access", "sign-in", "policy"];
|
|
3
|
+
/** The table as v54 made it: the one earlier shape the v99 rebuild accepts. */
|
|
4
|
+
export const LEDGER_V54_TABLE = (name) => `CREATE TABLE ${name} (
|
|
5
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
6
|
+
at TEXT NOT NULL, actor TEXT NOT NULL, repo TEXT,
|
|
7
|
+
task_id TEXT, run_id INTEGER,
|
|
8
|
+
action TEXT NOT NULL, outcome TEXT NOT NULL,
|
|
9
|
+
source TEXT NOT NULL CHECK (source IN ('work','request','access'))
|
|
10
|
+
)`;
|
|
11
|
+
export const LEDGER_V54_COLUMNS = ["id", "at", "actor", "repo", "task_id", "run_id", "action", "outcome", "source"];
|
|
12
|
+
export const LEDGER_TABLE = (name) => `CREATE TABLE ${name} (
|
|
13
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
14
|
+
at TEXT NOT NULL, actor TEXT NOT NULL, repo TEXT,
|
|
15
|
+
task_id TEXT, run_id INTEGER,
|
|
16
|
+
action TEXT NOT NULL, outcome TEXT NOT NULL,
|
|
17
|
+
source TEXT NOT NULL CHECK (source IN ('work','request','access','sign-in','policy')),
|
|
18
|
+
detail TEXT
|
|
19
|
+
)`;
|
|
20
|
+
export const LEDGER_SCHEMA = `
|
|
21
|
+
${LEDGER_TABLE("IF NOT EXISTS action_ledger")};
|
|
22
|
+
CREATE INDEX IF NOT EXISTS action_ledger_project ON action_ledger(repo, id DESC);
|
|
23
|
+
CREATE INDEX IF NOT EXISTS action_ledger_actor ON action_ledger(actor, id DESC);
|
|
24
|
+
CREATE TRIGGER IF NOT EXISTS action_ledger_no_update BEFORE UPDATE ON action_ledger
|
|
25
|
+
BEGIN SELECT RAISE(ABORT, 'action history is append-only'); END;
|
|
26
|
+
CREATE TRIGGER IF NOT EXISTS action_ledger_no_delete BEFORE DELETE ON action_ledger
|
|
27
|
+
BEGIN SELECT RAISE(ABORT, 'action history is append-only'); END;
|
|
28
|
+
`;
|
|
29
|
+
/** Installed after all table migrations. Work events commit with the work,
|
|
30
|
+
* including CLI and unattended workers; no prompts, tool arguments, tokens,
|
|
31
|
+
* decision text, or transcript content are copied into the ledger. */
|
|
32
|
+
export function installLedgerTriggers(db) {
|
|
33
|
+
const repo = (ref) => `(SELECT repo FROM task_ref WHERE id = ${ref})`;
|
|
34
|
+
const task = (ref) => `(SELECT external_id FROM task_ref WHERE id = ${ref})`;
|
|
35
|
+
const runRef = `(SELECT task_ref FROM run WHERE id = NEW.run)`;
|
|
36
|
+
const event = (at, actor, project, taskId, runId, action, outcome) => `INSERT INTO action_ledger(at,actor,repo,task_id,run_id,action,outcome,source) VALUES (${at},${actor},${project},${taskId},${runId},'${action}',${outcome},'work');`;
|
|
37
|
+
db.exec(`
|
|
38
|
+
CREATE TRIGGER IF NOT EXISTS ledger_run_started AFTER INSERT ON run BEGIN
|
|
39
|
+
${event("NEW.started_at", "NEW.runner", repo("NEW.task_ref"), task("NEW.task_ref"), "NEW.id", "run started", "NEW.role")}
|
|
40
|
+
END;
|
|
41
|
+
CREATE TRIGGER IF NOT EXISTS ledger_run_finished AFTER UPDATE OF outcome ON run
|
|
42
|
+
WHEN NEW.outcome IS NOT NULL AND OLD.outcome IS NOT NEW.outcome BEGIN
|
|
43
|
+
${event("COALESCE(NEW.finished_at, NEW.started_at)", "NEW.runner", repo("NEW.task_ref"), task("NEW.task_ref"), "NEW.id", "run finished", "NEW.outcome")}
|
|
44
|
+
END;
|
|
45
|
+
CREATE TRIGGER IF NOT EXISTS ledger_decision_opened AFTER INSERT ON decision BEGIN
|
|
46
|
+
${event("NEW.created_at", "'system'", repo(runRef), task(runRef), "NEW.run", "decision opened", "NEW.state")}
|
|
47
|
+
END;
|
|
48
|
+
CREATE TRIGGER IF NOT EXISTS ledger_decision_answered AFTER UPDATE OF answered_at ON decision
|
|
49
|
+
WHEN NEW.answered_at IS NOT NULL AND OLD.answered_at IS NULL BEGIN
|
|
50
|
+
${event("NEW.answered_at", "COALESCE(NEW.answered_by,'system')", repo(runRef), task(runRef), "NEW.run", "decision answered", "NEW.state")}
|
|
51
|
+
END;
|
|
52
|
+
CREATE TRIGGER IF NOT EXISTS ledger_scope_approved AFTER UPDATE OF approved_at, approved_digest ON task_scope
|
|
53
|
+
WHEN NEW.approved_at IS NOT NULL AND (OLD.approved_at IS NOT NEW.approved_at OR OLD.approved_digest IS NOT NEW.approved_digest) BEGIN
|
|
54
|
+
${event("NEW.approved_at", "COALESCE(NEW.approved_by,'system')", "(SELECT repo FROM task_ref WHERE backend = 'built-in' AND external_id = NEW.task_id)", "NEW.task_id", "NULL", "scope approved", "'approved'")}
|
|
55
|
+
END;
|
|
56
|
+
CREATE TRIGGER IF NOT EXISTS ledger_task_state AFTER UPDATE OF state ON task
|
|
57
|
+
WHEN OLD.state IS NOT NEW.state BEGIN
|
|
58
|
+
${event("NEW.updated_at", "'system'", "(SELECT repo FROM task_ref WHERE backend = 'built-in' AND external_id = NEW.id)", "NEW.id", "NULL", "task state changed", "NEW.state")}
|
|
59
|
+
END;
|
|
60
|
+
CREATE TRIGGER IF NOT EXISTS ledger_task_placed AFTER UPDATE OF repo ON task_ref
|
|
61
|
+
WHEN OLD.repo IS NOT NEW.repo BEGIN
|
|
62
|
+
${event("strftime('%Y-%m-%dT%H:%M:%fZ','now')", "'system'", "NEW.repo", "NEW.external_id", "NULL", "task placed", "'recorded'")}
|
|
63
|
+
END;
|
|
64
|
+
CREATE TRIGGER IF NOT EXISTS ledger_coordinator_minted AFTER INSERT ON coordinator_credential BEGIN
|
|
65
|
+
INSERT INTO action_ledger(at,actor,repo,task_id,run_id,action,outcome,source,detail) VALUES (NEW.created_at, NEW.created_by, NULL, NULL, NULL,
|
|
66
|
+
'coordinator minted: ' || NEW.name, 'minted', 'access', 'projects: ' || NEW.repos);
|
|
67
|
+
END;
|
|
68
|
+
CREATE TRIGGER IF NOT EXISTS ledger_task_registered AFTER INSERT ON task_ref BEGIN
|
|
69
|
+
${event("strftime('%Y-%m-%dT%H:%M:%fZ','now')", "'system'", "NEW.repo", "NEW.external_id", "NULL", "task registered", "'recorded'")}
|
|
70
|
+
END;
|
|
71
|
+
CREATE TRIGGER IF NOT EXISTS ledger_steer AFTER INSERT ON task_steer BEGIN
|
|
72
|
+
${event("NEW.created_at", "NEW.author", repo("NEW.task_ref"), task("NEW.task_ref"), "NEW.attached_run", "steering added", "NEW.authorship_state")}
|
|
73
|
+
END;
|
|
74
|
+
`);
|
|
75
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** How a launch was fenced, as recorded on the run and said on the task. */
|
|
2
|
+
export type FenceMethod = "codex-profile" | "macos-sandbox" | "linux-bubblewrap" | "claude-rules" | "none";
|
|
3
|
+
/**
|
|
4
|
+
* Every path an agent must not reach: the Toolroll state folder
|
|
5
|
+
* beside the database (all of it, except the folder that holds this run's
|
|
6
|
+
* own worktree), the database itself with its journal files, and
|
|
7
|
+
* `~/.toolroll` or an older `~/.standing-orders` (provider keys and project tool secrets). When the
|
|
8
|
+
* database sits anywhere else (a shared folder), only the database and
|
|
9
|
+
* secret-looking entries there are fenced.
|
|
10
|
+
*/
|
|
11
|
+
export declare function agentFence(options: {
|
|
12
|
+
databaseFile: string | null;
|
|
13
|
+
worktree: string | null;
|
|
14
|
+
home?: string;
|
|
15
|
+
extra?: readonly string[];
|
|
16
|
+
}): string[];
|
|
17
|
+
/**
|
|
18
|
+
* Codex's own sandbox, fenced. Auto: the `:workspace` profile Codex's
|
|
19
|
+
* `--sandbox workspace-write` already gives (workspace and temp writes, no
|
|
20
|
+
* network). Full access: the same profile widened to write anywhere with
|
|
21
|
+
* network on, instead of no sandbox at all. Either way the fenced paths are
|
|
22
|
+
* denied, which in Codex outranks any write or read grant.
|
|
23
|
+
*/
|
|
24
|
+
export declare function codexFenceArgv(fence: readonly string[], fullAccess: boolean): string[];
|
|
25
|
+
/** Claude's own file tools refuse the fenced paths in every mode (its shell is fenced by the macOS sandbox). */
|
|
26
|
+
export declare function claudeFenceSettings(fence: readonly string[]): string;
|
|
27
|
+
/** A Seatbelt profile that allows everything except reading or writing the fenced paths. */
|
|
28
|
+
export declare function macosFenceProfile(fence: readonly string[]): string;
|
|
29
|
+
export declare const SANDBOX_EXEC = "/usr/bin/sandbox-exec";
|
|
30
|
+
/** Whether this machine can run an agent inside the macOS fence. */
|
|
31
|
+
export declare function macosFenceAvailable(platform?: NodeJS.Platform): boolean;
|
|
32
|
+
/** The spawn that runs `file args` inside the macOS fence (same process: sandbox-exec replaces itself with the agent). */
|
|
33
|
+
export declare function macosFenced(file: string, args: readonly string[], fence: readonly string[]): {
|
|
34
|
+
file: string;
|
|
35
|
+
args: string[];
|
|
36
|
+
};
|
|
37
|
+
export declare function linuxFenceAvailable(platform?: NodeJS.Platform, probe?: () => boolean): boolean;
|
|
38
|
+
/** The spawn that runs `file args` inside the Linux fence: the whole filesystem as it is, except each fenced path masked. */
|
|
39
|
+
export declare function linuxFenced(file: string, args: readonly string[], fence: readonly string[]): {
|
|
40
|
+
file: string;
|
|
41
|
+
args: string[];
|
|
42
|
+
};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The agent fence: what no build, plan, scout or repair agent may read or
|
|
3
|
+
* write, whatever its permission mode. Agents run as the operator's own OS
|
|
4
|
+
* user, so without it an agent could read the approver's remembered login
|
|
5
|
+
* (`up-login.txt`), runner and coordinator tokens, provider keys, project
|
|
6
|
+
* tool secrets, other runs' evidence, or the live database — and use them
|
|
7
|
+
* to approve its own work. The fence closes that at the operating system,
|
|
8
|
+
* not in the model's instructions:
|
|
9
|
+
*
|
|
10
|
+
* - Codex (every platform): a permission profile that extends its own
|
|
11
|
+
* `:workspace` sandbox (Auto keeps it exactly: workspace writes, no
|
|
12
|
+
* network) or widens it to write anywhere with network on (Full access,
|
|
13
|
+
* which used to mean no sandbox at all), and denies every fenced path.
|
|
14
|
+
* - Claude and Gemini on macOS: the whole agent process runs inside a
|
|
15
|
+
* Seatbelt profile that allows everything except the fenced paths.
|
|
16
|
+
* - Claude and Gemini on Linux (v88): the agent runs under bubblewrap, in its
|
|
17
|
+
* own mount namespace where every fenced folder is an empty one and every
|
|
18
|
+
* fenced file is /dev/null. Used when `bwrap` is installed and works here.
|
|
19
|
+
* - Claude everywhere also gets Read/Edit deny rules for its own file tools.
|
|
20
|
+
*
|
|
21
|
+
* Checked against codex-cli 0.156 and Claude Code 2.1.281 with a canary
|
|
22
|
+
* file read by an obfuscated script: "Operation not permitted".
|
|
23
|
+
*/
|
|
24
|
+
import { spawnSync } from "node:child_process";
|
|
25
|
+
import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
26
|
+
import { homedir } from "node:os";
|
|
27
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
28
|
+
import { readMonitoring } from "./monitoring-settings.js";
|
|
29
|
+
import { existingFolders } from "./names.js";
|
|
30
|
+
/** Names that are secrets wherever the database lives (used when its folder is shared with other things). */
|
|
31
|
+
const SENSITIVE_NAME = /(^up-login\.txt$|token|secret|login|password|credential|vapid|keys?\b|\.pem$|\.key$|^backups$|^evidence$|^remote$|^sign-in\.json$|^monitoring\.json$)/i;
|
|
32
|
+
function real(path) {
|
|
33
|
+
try {
|
|
34
|
+
return realpathSync(path);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return resolve(path);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function inside(child, parent) {
|
|
41
|
+
const rel = relative(parent, child);
|
|
42
|
+
return rel !== "" && !rel.startsWith("..") && !isAbsolute(rel);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Every path an agent must not reach: the Toolroll state folder
|
|
46
|
+
* beside the database (all of it, except the folder that holds this run's
|
|
47
|
+
* own worktree), the database itself with its journal files, and
|
|
48
|
+
* `~/.toolroll` or an older `~/.standing-orders` (provider keys and project tool secrets). When the
|
|
49
|
+
* database sits anywhere else (a shared folder), only the database and
|
|
50
|
+
* secret-looking entries there are fenced.
|
|
51
|
+
*/
|
|
52
|
+
export function agentFence(options) {
|
|
53
|
+
const fence = new Set();
|
|
54
|
+
const home = real(options.home ?? homedir());
|
|
55
|
+
const worktree = options.worktree === null ? null : real(options.worktree);
|
|
56
|
+
if (options.databaseFile !== null && options.databaseFile !== "" && options.databaseFile !== ":memory:") {
|
|
57
|
+
const database = real(options.databaseFile);
|
|
58
|
+
const state = dirname(database);
|
|
59
|
+
for (const suffix of ["", "-wal", "-shm", "-journal"])
|
|
60
|
+
if (existsSync(database + suffix))
|
|
61
|
+
fence.add(database + suffix);
|
|
62
|
+
// Only a folder that is Toolroll's own (~/.config/toolroll or an older name,
|
|
63
|
+
// the desktop app's "Toolroll") is fenced whole: a database kept
|
|
64
|
+
// in a shared folder (a projects folder, a test's temp folder) must not
|
|
65
|
+
// fence its neighbours, the repositories agents build among them.
|
|
66
|
+
const dedicated = state !== home && state !== sep && !existsSync(join(state, ".git")) && /standing[\s_-]?orders|toolroll|nightorders/i.test(basename(state));
|
|
67
|
+
// The entries this run's worktree needs stay reachable: the one it lives
|
|
68
|
+
// under, and the repository its git metadata belongs to.
|
|
69
|
+
const keep = new Set();
|
|
70
|
+
for (const needed of [worktree, worktree === null ? null : mainRepositoryOf(worktree)]) {
|
|
71
|
+
if (needed !== null && inside(needed, state))
|
|
72
|
+
keep.add(relative(state, needed).split(sep)[0]);
|
|
73
|
+
}
|
|
74
|
+
let entries = [];
|
|
75
|
+
try {
|
|
76
|
+
entries = readdirSync(state);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
entries = [];
|
|
80
|
+
}
|
|
81
|
+
for (const entry of entries) {
|
|
82
|
+
// A repository is work, never a secret.
|
|
83
|
+
if (keep.has(entry) || existsSync(join(state, entry, ".git")))
|
|
84
|
+
continue;
|
|
85
|
+
if (dedicated || SENSITIVE_NAME.test(entry))
|
|
86
|
+
fence.add(join(state, entry));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (const secrets of existingFolders(home, { dot: true }))
|
|
90
|
+
fence.add(secrets);
|
|
91
|
+
// v104: the folder the audit stream writes to holds the whole instance's history.
|
|
92
|
+
if (options.databaseFile !== null && options.databaseFile !== "" && options.databaseFile !== ":memory:") {
|
|
93
|
+
const stream = readMonitoring(dirname(real(options.databaseFile))).folder?.path;
|
|
94
|
+
if (stream !== undefined && existsSync(stream))
|
|
95
|
+
fence.add(real(stream));
|
|
96
|
+
}
|
|
97
|
+
for (const path of options.extra ?? [])
|
|
98
|
+
if (existsSync(path))
|
|
99
|
+
fence.add(real(path));
|
|
100
|
+
// Never fence the run's own worktree or anything above it.
|
|
101
|
+
return [...fence].filter(path => worktree === null || (path !== worktree && !inside(worktree, path))).sort();
|
|
102
|
+
}
|
|
103
|
+
/** The repository a git worktree belongs to (its `.git` file names the main repository's git folder). */
|
|
104
|
+
function mainRepositoryOf(worktree) {
|
|
105
|
+
try {
|
|
106
|
+
const pointer = /^gitdir:\s*(.+)$/m.exec(readFileSync(join(worktree, ".git"), "utf8"))?.[1]?.trim();
|
|
107
|
+
if (pointer === undefined)
|
|
108
|
+
return null;
|
|
109
|
+
const gitdir = real(isAbsolute(pointer) ? pointer : join(worktree, pointer));
|
|
110
|
+
// <repo>/.git/worktrees/<name> → <repo>
|
|
111
|
+
const marker = `${sep}.git${sep}worktrees${sep}`;
|
|
112
|
+
const at = gitdir.lastIndexOf(marker);
|
|
113
|
+
return at < 0 ? null : gitdir.slice(0, at);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const toml = (value) => `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
120
|
+
/**
|
|
121
|
+
* Codex's own sandbox, fenced. Auto: the `:workspace` profile Codex's
|
|
122
|
+
* `--sandbox workspace-write` already gives (workspace and temp writes, no
|
|
123
|
+
* network). Full access: the same profile widened to write anywhere with
|
|
124
|
+
* network on, instead of no sandbox at all. Either way the fenced paths are
|
|
125
|
+
* denied, which in Codex outranks any write or read grant.
|
|
126
|
+
*/
|
|
127
|
+
export function codexFenceArgv(fence, fullAccess) {
|
|
128
|
+
const filesystem = [...(fullAccess ? ['"/"="write"'] : []), ...fence.map(path => `${toml(path)}="deny"`)];
|
|
129
|
+
return [
|
|
130
|
+
"-c", 'default_permissions="standing-orders"',
|
|
131
|
+
"-c", 'permissions.standing-orders.extends=":workspace"',
|
|
132
|
+
"-c", `permissions.standing-orders.filesystem={${filesystem.join(",")}}`,
|
|
133
|
+
...(fullAccess ? ["-c", "permissions.standing-orders.network.enabled=true", "-c", 'approval_policy="never"'] : []),
|
|
134
|
+
];
|
|
135
|
+
}
|
|
136
|
+
/** Claude's own file tools refuse the fenced paths in every mode (its shell is fenced by the macOS sandbox). */
|
|
137
|
+
export function claudeFenceSettings(fence) {
|
|
138
|
+
const rules = fence.flatMap(path => [`Read(/${path})`, `Read(/${path}/**)`, `Edit(/${path})`, `Edit(/${path}/**)`]);
|
|
139
|
+
return JSON.stringify({ permissions: { deny: rules } });
|
|
140
|
+
}
|
|
141
|
+
const seatbelt = (path) => `"${path.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
142
|
+
/** A Seatbelt profile that allows everything except reading or writing the fenced paths. */
|
|
143
|
+
export function macosFenceProfile(fence) {
|
|
144
|
+
return ["(version 1)", "(allow default)", `(deny file-read* file-write* ${fence.map(path => `(subpath ${seatbelt(path)})`).join(" ")})`].join("\n");
|
|
145
|
+
}
|
|
146
|
+
export const SANDBOX_EXEC = "/usr/bin/sandbox-exec";
|
|
147
|
+
/** Whether this machine can run an agent inside the macOS fence. */
|
|
148
|
+
export function macosFenceAvailable(platform = process.platform) {
|
|
149
|
+
return platform === "darwin" && existsSync(SANDBOX_EXEC);
|
|
150
|
+
}
|
|
151
|
+
/** The spawn that runs `file args` inside the macOS fence (same process: sandbox-exec replaces itself with the agent). */
|
|
152
|
+
export function macosFenced(file, args, fence) {
|
|
153
|
+
return { file: SANDBOX_EXEC, args: ["-p", macosFenceProfile(fence), file, ...args] };
|
|
154
|
+
}
|
|
155
|
+
/** Whether bubblewrap runs here (checked once): installed, and allowed to make its namespace. */
|
|
156
|
+
let bubblewrapWorks = null;
|
|
157
|
+
export function linuxFenceAvailable(platform = process.platform, probe = () => spawnSync("bwrap", ["--dev-bind", "/", "/", "--", "true"], { timeout: 5_000, stdio: "ignore" }).status === 0) {
|
|
158
|
+
if (platform !== "linux")
|
|
159
|
+
return false;
|
|
160
|
+
if (bubblewrapWorks === null) {
|
|
161
|
+
try {
|
|
162
|
+
bubblewrapWorks = probe();
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
bubblewrapWorks = false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return bubblewrapWorks;
|
|
169
|
+
}
|
|
170
|
+
/** The spawn that runs `file args` inside the Linux fence: the whole filesystem as it is, except each fenced path masked. */
|
|
171
|
+
export function linuxFenced(file, args, fence) {
|
|
172
|
+
const masks = fence.flatMap(path => {
|
|
173
|
+
let folder = true;
|
|
174
|
+
try {
|
|
175
|
+
folder = statSync(path).isDirectory();
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
folder = true;
|
|
179
|
+
}
|
|
180
|
+
return folder ? ["--tmpfs", path] : ["--ro-bind", "/dev/null", path];
|
|
181
|
+
});
|
|
182
|
+
return { file: "bwrap", args: ["--dev-bind", "/", "/", ...masks, "--die-with-parent", "--", file, ...args] };
|
|
183
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase-agent resolution: which provider and model a phase runs on, layer
|
|
3
|
+
* by layer, with the layers written down (Codex provider review, Q8).
|
|
4
|
+
*
|
|
5
|
+
* pinned task agent — stamped by a fire transaction; NOTHING overrides it
|
|
6
|
+
* explicit flags — this pass's operator, per field
|
|
7
|
+
* project override — phase_config row scoped to the canonical repo
|
|
8
|
+
* installation — phase_config row scoped 'installation'
|
|
9
|
+
* review inheritance — when review is unset, the planner's complete pair
|
|
10
|
+
* default — claude, harness default model
|
|
11
|
+
*
|
|
12
|
+
* Config rows are COMPLETE pairs (provider required, model optional), so a
|
|
13
|
+
* partial override cannot marry a codex model to an inherited claude
|
|
14
|
+
* provider. Flags are per-field with one stated rule: `--model` alone
|
|
15
|
+
* rides whatever provider resolves; `--provider` alone runs that
|
|
16
|
+
* provider's default model — a lower layer's model never crosses onto a
|
|
17
|
+
* flag-chosen provider it was not written for.
|
|
18
|
+
*
|
|
19
|
+
* The resolved pair is validated before anything is claimed or spent, and
|
|
20
|
+
* the caller snapshots it into the run row.
|
|
21
|
+
*/
|
|
22
|
+
import { type AgentSpec, type Phase } from "./provider.js";
|
|
23
|
+
import { type Store, type TaskRef } from "./store.js";
|
|
24
|
+
import { type ChainEntry, type ExecutionProfile, type UnattendedPermissionMode } from "./scope.js";
|
|
25
|
+
import { type ExactSpec, type PhaseRoute, type RouteCandidates } from "./phase-routing.js";
|
|
26
|
+
import type { AcceptanceCriterion } from "./scope.js";
|
|
27
|
+
export declare const INSTALLATION_SCOPE = "installation";
|
|
28
|
+
export type PhaseFlags = {
|
|
29
|
+
provider?: string | undefined;
|
|
30
|
+
model?: string | undefined;
|
|
31
|
+
};
|
|
32
|
+
export type Resolution = {
|
|
33
|
+
ok: true;
|
|
34
|
+
spec: AgentSpec;
|
|
35
|
+
source: "pinned" | "flag" | "project" | "installation" | "default";
|
|
36
|
+
} | {
|
|
37
|
+
ok: false;
|
|
38
|
+
problem: string;
|
|
39
|
+
};
|
|
40
|
+
export declare function resolvePhaseAgent(store: Store, phase: Phase, repo: string | null, flags: PhaseFlags,
|
|
41
|
+
/** The task being dispatched, when one is — its pin is authoritative. */
|
|
42
|
+
ref?: Pick<TaskRef, "agentProvider" | "agentModel">): Resolution;
|
|
43
|
+
/**
|
|
44
|
+
* The FILING resolver (foundations findings 13/15/19): the execution
|
|
45
|
+
* profile a scope stores, resolved once, exactly, at filing. The model is
|
|
46
|
+
* the exact string the argv will carry — the harness-default road refuses
|
|
47
|
+
* here rather than floating (ruling 10). Repair precedence: the
|
|
48
|
+
* --repair-model flag, else the repair phase-config row's MODEL (its
|
|
49
|
+
* provider must equal the build provider — cross-provider repair does not
|
|
50
|
+
* exist), else the literal "inherit". Callers that file scopes SAVE an
|
|
51
|
+
* unresolved state on refusal (finding 19) — this function only says why.
|
|
52
|
+
*/
|
|
53
|
+
export type ProfileResolution = {
|
|
54
|
+
ok: true;
|
|
55
|
+
profile: ExecutionProfile;
|
|
56
|
+
provenance: {
|
|
57
|
+
resolvedFrom: string;
|
|
58
|
+
repairFrom: string;
|
|
59
|
+
};
|
|
60
|
+
} | {
|
|
61
|
+
ok: false;
|
|
62
|
+
reason: "unknown-provider" | "no-model" | "repair-provider-mismatch";
|
|
63
|
+
problem: string;
|
|
64
|
+
};
|
|
65
|
+
export declare function resolveScopeProfile(store: Store, repo: string | null, ref: Pick<TaskRef, "agentProvider" | "agentModel"> | undefined, flags: PhaseFlags & {
|
|
66
|
+
repairModel?: string | undefined;
|
|
67
|
+
permissionMode?: UnattendedPermissionMode | undefined;
|
|
68
|
+
}): ProfileResolution;
|
|
69
|
+
export type ChainResolution = {
|
|
70
|
+
ok: true;
|
|
71
|
+
chain: ChainEntry[];
|
|
72
|
+
kind: "profile" | "chain";
|
|
73
|
+
} | {
|
|
74
|
+
ok: false;
|
|
75
|
+
reason: "base-unresolved" | "bad-fallback" | "duplicate";
|
|
76
|
+
problem: string;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Resolve the full EXECUTION CHAIN a scope files under (v30): the base
|
|
80
|
+
* (entry 0) is the ordinary single-profile resolution wearing the base
|
|
81
|
+
* provider's auth mode; the fallbacks are the scope's configured entries,
|
|
82
|
+
* each resolved to a WHOLE ExecutionProfile (repair per entry). With no
|
|
83
|
+
* fallbacks configured, the result is `kind: "profile"` — a single-profile
|
|
84
|
+
* approval, byte-identical to today (NOT an explicit chain). With
|
|
85
|
+
* fallbacks, it is `kind: "chain"` and the approval binds the whole thing.
|
|
86
|
+
* The base auth mode is passed in (the caller reads it from the managed
|
|
87
|
+
* key store) so resolution stays pure and testable.
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveScopeChain(store: Store, repo: string | null, ref: Pick<TaskRef, "agentProvider" | "agentModel"> | undefined, flags: PhaseFlags & {
|
|
90
|
+
repairModel?: string | undefined;
|
|
91
|
+
permissionMode?: UnattendedPermissionMode | undefined;
|
|
92
|
+
}, baseAuthMode: "subscription" | "api-key"): ChainResolution;
|
|
93
|
+
/**
|
|
94
|
+
* The two candidate tiers the routing policy chooses between, per phase,
|
|
95
|
+
* read from configuration ONLY — never inferred from a model's name:
|
|
96
|
+
*
|
|
97
|
+
* routine — the ordinary resolution above (project > installation,
|
|
98
|
+
* review inheriting the planner's pair), i.e. exactly the
|
|
99
|
+
* agent every pre-v47 scope resolved to — but EXACT: a phase
|
|
100
|
+
* whose resolution has no model id cannot be a candidate,
|
|
101
|
+
* because an approval binds exact routing. Repair is the one
|
|
102
|
+
* phase with no routine candidate of its own when nothing is
|
|
103
|
+
* configured: it inherits the build leg (repairs resume the
|
|
104
|
+
* builder's session), and the policy says so.
|
|
105
|
+
* strong — the operator's named strong row (`config set <phase> --tier
|
|
106
|
+
* strong …`), project over installation, review inheriting the
|
|
107
|
+
* plan's strong row when it has none of its own; null when
|
|
108
|
+
* nothing is configured, and the route then SAYS so.
|
|
109
|
+
*
|
|
110
|
+
* A misconfigured row — unknown provider, missing model, argv-unsafe
|
|
111
|
+
* model — REFUSES with the words to fix it; the caller files the scope
|
|
112
|
+
* unresolved with them. Nothing is skipped or guessed.
|
|
113
|
+
*/
|
|
114
|
+
export type CandidatesResolution = {
|
|
115
|
+
ok: true;
|
|
116
|
+
candidates: RouteCandidates;
|
|
117
|
+
} | {
|
|
118
|
+
ok: false;
|
|
119
|
+
phase: Phase;
|
|
120
|
+
problem: string;
|
|
121
|
+
};
|
|
122
|
+
export declare function resolveRouteCandidates(store: Store, repo: string | null, pins?: {
|
|
123
|
+
plan?: ExactSpec | null;
|
|
124
|
+
build?: ExactSpec | null;
|
|
125
|
+
}): CandidatesResolution;
|
|
126
|
+
/** A task's pinned pair as an EXACT spec, or the words for why it cannot
|
|
127
|
+
* route: a pin with no model id binds nothing exact. */
|
|
128
|
+
export declare function exactPinOf(provider: string | null, model: string | null, phase: "plan" | "build"): {
|
|
129
|
+
ok: true;
|
|
130
|
+
pin: ExactSpec | null;
|
|
131
|
+
} | {
|
|
132
|
+
ok: false;
|
|
133
|
+
problem: string;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* THE ROUTE A TASK RUNS UNDER, for dispatch and every surface:
|
|
137
|
+
*
|
|
138
|
+
* approved — the sealed route when the approval stands (authoritative;
|
|
139
|
+
* mutable configuration never rewrites it);
|
|
140
|
+
* proposed — the WORKING proposed route the next approval would seal;
|
|
141
|
+
* live — no scope yet (a plan request): a live recommendation from
|
|
142
|
+
* the task's own risk, overrides, and pins over today's
|
|
143
|
+
* configuration;
|
|
144
|
+
* legacy — a row PROVEN to predate v47 (no route era): its sealed
|
|
145
|
+
* profile alone governs the build; plan and review resolve
|
|
146
|
+
* from configuration at run time, and the surfaces say so;
|
|
147
|
+
* unreadable — a routed row whose route data is missing, malformed, or
|
|
148
|
+
* does not verify against its approval, or a task whose
|
|
149
|
+
* configuration cannot make an exact route: FAIL CLOSED,
|
|
150
|
+
* with the words. Nothing dispatches on it.
|
|
151
|
+
*
|
|
152
|
+
* `source` says which, so a surface never presents a live recommendation
|
|
153
|
+
* as a sealed term and a runner never runs a legacy road on a routed row.
|
|
154
|
+
*/
|
|
155
|
+
export type TaskRoute = {
|
|
156
|
+
kind: "route";
|
|
157
|
+
route: PhaseRoute;
|
|
158
|
+
source: "approved" | "proposed" | "live";
|
|
159
|
+
} | {
|
|
160
|
+
kind: "legacy";
|
|
161
|
+
profile: ExecutionProfile;
|
|
162
|
+
approved: boolean;
|
|
163
|
+
} | {
|
|
164
|
+
kind: "unreadable";
|
|
165
|
+
problem: string;
|
|
166
|
+
};
|
|
167
|
+
export declare function routeOfTask(store: Store, taskId: string, ref: TaskRef | null, now: Date): TaskRoute | null;
|
|
168
|
+
/**
|
|
169
|
+
* THE ROUTINE'S FROZEN AUTHORITY, resolved once at filing: the four-role
|
|
170
|
+
* route a routine's firings will run under, and the execution profile that
|
|
171
|
+
* restates its build and repair legs exactly. Routine tasks declare routine
|
|
172
|
+
* risk; the rubric's evidence needs, the installation's quality default,
|
|
173
|
+
* and the repository's publication authority are the other signed inputs.
|
|
174
|
+
* A configuration that cannot make an exact, runnable route answers with
|
|
175
|
+
* the words — the routine files unresolved and cannot be approved until
|
|
176
|
+
* it is filed again under a configuration that can.
|
|
177
|
+
*/
|
|
178
|
+
export type RoutineAuthority = {
|
|
179
|
+
ok: true;
|
|
180
|
+
route: PhaseRoute;
|
|
181
|
+
profile: ExecutionProfile;
|
|
182
|
+
} | {
|
|
183
|
+
ok: false;
|
|
184
|
+
problem: string;
|
|
185
|
+
};
|
|
186
|
+
export declare function resolveRoutineAuthority(store: Store, repo: string, acceptance: readonly AcceptanceCriterion[], now: Date): RoutineAuthority;
|
|
187
|
+
/** One agent a surface shows for one role: an exact pair, where it comes
|
|
188
|
+
* from, whether it is the role's current leg, and whether it can be
|
|
189
|
+
* CHOSEN — only a pair the active configuration names for this role is
|
|
190
|
+
* selectable; a current leg the configuration no longer names is shown
|
|
191
|
+
* for what runs today and nothing more. */
|
|
192
|
+
export type AgentChoice = ExactSpec & {
|
|
193
|
+
source: string;
|
|
194
|
+
current: boolean;
|
|
195
|
+
selectable: boolean;
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* THE ROLE'S CONFIGURED CHOICES (v48), simple and role-specific: for each
|
|
199
|
+
* role, exactly the exact pairs the active configuration names FOR THAT
|
|
200
|
+
* ROLE — its everyday agent and its strong agent — and nothing borrowed
|
|
201
|
+
* from another role. Repair runs only the build leg's provider (repairs
|
|
202
|
+
* resume the builder's session): its choices are the configured repair
|
|
203
|
+
* rows on that provider plus the build role's own configured agents on
|
|
204
|
+
* it, so an operator can keep repairs on the builder without naming a
|
|
205
|
+
* repair row. Gemini never reviews. Nothing is typed free-hand and
|
|
206
|
+
* nothing unconfigured is selectable: an approval binds an exact agent
|
|
207
|
+
* the operator named once, in configuration.
|
|
208
|
+
*
|
|
209
|
+
* The role's CURRENT leg rides along marked `current`; when the
|
|
210
|
+
* configuration no longer names it (a stale override, a routine's pin)
|
|
211
|
+
* it is display-only — `selectable: false` — so a surface can say what
|
|
212
|
+
* runs today without offering to re-pick it. Empty when the
|
|
213
|
+
* configuration cannot make exact candidates at all; the surface then
|
|
214
|
+
* says so instead of guessing.
|
|
215
|
+
*/
|
|
216
|
+
export declare function agentChoicesFor(store: Store, repo: string | null, route: PhaseRoute | null): Record<Phase, AgentChoice[]>;
|