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,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `toolroll peek` — the terminal multiplexer over live agents.
|
|
3
|
+
*
|
|
4
|
+
* One pane per open run: its task, worker, role, stage word, elapsed
|
|
5
|
+
* clock, and the tail of its live transcript (the same per-run file the
|
|
6
|
+
* console's run page follows: text the agent said and the kind of tool it
|
|
7
|
+
* reached for — never file contents, never a command line, credential
|
|
8
|
+
* shapes redacted at write). Digits focus one pane, `a` shows all, `q`
|
|
9
|
+
* leaves. No dependency: the screen is the alternate buffer and a
|
|
10
|
+
* handful of escape sequences. `--tmux` opens a real tmux session with one
|
|
11
|
+
* window per run for people who live there. Outside a TTY (or with
|
|
12
|
+
* `--json`) it prints one snapshot and exits — the same data, an envelope.
|
|
13
|
+
*
|
|
14
|
+
* Read-only by construction: nothing here writes to the store or the
|
|
15
|
+
* files; a peek is a look.
|
|
16
|
+
*/
|
|
17
|
+
import type { Store } from "./store.js";
|
|
18
|
+
export declare const PEEK_TAIL_LINES = 400;
|
|
19
|
+
export type PeekPane = {
|
|
20
|
+
runId: number;
|
|
21
|
+
taskId: string;
|
|
22
|
+
title: string;
|
|
23
|
+
repo: string | null;
|
|
24
|
+
runner: string;
|
|
25
|
+
role: string;
|
|
26
|
+
provider: string;
|
|
27
|
+
model: string | null;
|
|
28
|
+
phase: string;
|
|
29
|
+
startedAt: string;
|
|
30
|
+
/** Tail of the live transcript, newest last. */
|
|
31
|
+
lines: string[];
|
|
32
|
+
/** Why the transcript is absent, when it is. */
|
|
33
|
+
transcript: "live" | "not-yet" | "replaced" | "unreadable";
|
|
34
|
+
};
|
|
35
|
+
type Tail = {
|
|
36
|
+
offset: number;
|
|
37
|
+
lines: string[];
|
|
38
|
+
state: PeekPane["transcript"];
|
|
39
|
+
};
|
|
40
|
+
/** Advance one run's tail from its offset; `replaced` resets visibly. */
|
|
41
|
+
export declare function advanceTail(root: string, runId: number, tail: Tail): Tail;
|
|
42
|
+
/** The stage word for a pane: the machine's own phase, or what precedes it. */
|
|
43
|
+
export declare function stageWord(run: {
|
|
44
|
+
phase: string | null;
|
|
45
|
+
model: string | null;
|
|
46
|
+
providerStartedAt: string | null;
|
|
47
|
+
}): string;
|
|
48
|
+
export declare function elapsedWords(startedAt: string, now: Date): string;
|
|
49
|
+
/** One snapshot of every live run — the envelope's body, and the TUI's first frame. */
|
|
50
|
+
export declare function snapshotLiveRuns(store: Store, root: string, now: Date, tails?: Map<number, Tail>): PeekPane[];
|
|
51
|
+
/**
|
|
52
|
+
* Compose one frame: panes stacked, each with a header and as many tail
|
|
53
|
+
* lines as its share of the rows allows; the focused pane takes the whole
|
|
54
|
+
* screen. Pure — the loop paints what this returns.
|
|
55
|
+
*/
|
|
56
|
+
export declare function composeFrame(panes: PeekPane[], size: {
|
|
57
|
+
columns: number;
|
|
58
|
+
rows: number;
|
|
59
|
+
}, focus: number | null, now: Date): string;
|
|
60
|
+
export type PeekIo = {
|
|
61
|
+
stdout: NodeJS.WriteStream & {
|
|
62
|
+
columns?: number;
|
|
63
|
+
rows?: number;
|
|
64
|
+
};
|
|
65
|
+
stdin: NodeJS.ReadStream & {
|
|
66
|
+
setRawMode?: (raw: boolean) => void;
|
|
67
|
+
isRaw?: boolean;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Follow live runs until `q` (or, watching one run, until it finishes).
|
|
72
|
+
* Resolves with the exit code.
|
|
73
|
+
*/
|
|
74
|
+
export declare function runPeek(store: Store, root: string, options: {
|
|
75
|
+
runId?: number;
|
|
76
|
+
io: PeekIo;
|
|
77
|
+
clock?: () => Date;
|
|
78
|
+
intervalMs?: number;
|
|
79
|
+
}): Promise<number>;
|
|
80
|
+
/**
|
|
81
|
+
* A real tmux session, one window per live run, each running `peek <run>`
|
|
82
|
+
* — for people who already live in tmux. The plane never becomes tmux's
|
|
83
|
+
* dependant: liveness stays in the store's leases, and this is a view.
|
|
84
|
+
*/
|
|
85
|
+
export declare function openInTmux(panes: readonly PeekPane[], command: readonly string[], run: (file: string, args: readonly string[]) => Promise<{
|
|
86
|
+
code: number;
|
|
87
|
+
stderr: string;
|
|
88
|
+
}>, session?: string): Promise<{
|
|
89
|
+
ok: true;
|
|
90
|
+
windows: number;
|
|
91
|
+
} | {
|
|
92
|
+
ok: false;
|
|
93
|
+
message: string;
|
|
94
|
+
}>;
|
|
95
|
+
/** Hand the terminal to tmux and wait for it to come back. */
|
|
96
|
+
export declare function attachTmux(session?: string): Promise<number>;
|
|
97
|
+
export {};
|
package/dist/peek-cli.js
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `toolroll peek` — the terminal multiplexer over live agents.
|
|
3
|
+
*
|
|
4
|
+
* One pane per open run: its task, worker, role, stage word, elapsed
|
|
5
|
+
* clock, and the tail of its live transcript (the same per-run file the
|
|
6
|
+
* console's run page follows: text the agent said and the kind of tool it
|
|
7
|
+
* reached for — never file contents, never a command line, credential
|
|
8
|
+
* shapes redacted at write). Digits focus one pane, `a` shows all, `q`
|
|
9
|
+
* leaves. No dependency: the screen is the alternate buffer and a
|
|
10
|
+
* handful of escape sequences. `--tmux` opens a real tmux session with one
|
|
11
|
+
* window per run for people who live there. Outside a TTY (or with
|
|
12
|
+
* `--json`) it prints one snapshot and exits — the same data, an envelope.
|
|
13
|
+
*
|
|
14
|
+
* Read-only by construction: nothing here writes to the store or the
|
|
15
|
+
* files; a peek is a look.
|
|
16
|
+
*/
|
|
17
|
+
import { spawn } from "node:child_process";
|
|
18
|
+
import { readLiveWindow } from "./live.js";
|
|
19
|
+
export const PEEK_TAIL_LINES = 400;
|
|
20
|
+
const ESC = "\u001b";
|
|
21
|
+
/** Advance one run's tail from its offset; `replaced` resets visibly. */
|
|
22
|
+
export function advanceTail(root, runId, tail) {
|
|
23
|
+
const read = readLiveWindow(root, runId, tail.offset);
|
|
24
|
+
if (!read.ok) {
|
|
25
|
+
if (read.reason === "replaced")
|
|
26
|
+
return { offset: 0, lines: ["[the live view was replaced — starting over]"], state: "replaced" };
|
|
27
|
+
return { ...tail, state: read.reason === "missing" ? (tail.lines.length === 0 ? "not-yet" : tail.state) : "unreadable" };
|
|
28
|
+
}
|
|
29
|
+
if (read.text === "")
|
|
30
|
+
return { ...tail, state: tail.lines.length === 0 ? "not-yet" : "live" };
|
|
31
|
+
const fresh = read.text.split("\n").filter(one => one !== "");
|
|
32
|
+
const lines = [...tail.lines, ...fresh].slice(-PEEK_TAIL_LINES);
|
|
33
|
+
return { offset: read.nextOffset, lines, state: "live" };
|
|
34
|
+
}
|
|
35
|
+
/** The stage word for a pane: the machine's own phase, or what precedes it. */
|
|
36
|
+
export function stageWord(run) {
|
|
37
|
+
if (run.phase !== null)
|
|
38
|
+
return run.phase.replace(/-/g, " ");
|
|
39
|
+
return run.providerStartedAt === null ? "preparing workspace" : "the agent is working";
|
|
40
|
+
}
|
|
41
|
+
export function elapsedWords(startedAt, now) {
|
|
42
|
+
const ms = Math.max(0, now.getTime() - new Date(startedAt).getTime());
|
|
43
|
+
const minutes = Math.floor(ms / 60_000);
|
|
44
|
+
const seconds = Math.floor((ms % 60_000) / 1000);
|
|
45
|
+
return minutes >= 60 ? `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, "0")}m` : `${minutes}m${String(seconds).padStart(2, "0")}s`;
|
|
46
|
+
}
|
|
47
|
+
/** One snapshot of every live run — the envelope's body, and the TUI's first frame. */
|
|
48
|
+
export function snapshotLiveRuns(store, root, now, tails = new Map()) {
|
|
49
|
+
const panes = [];
|
|
50
|
+
for (const run of store.liveRuns(now)) {
|
|
51
|
+
const previous = tails.get(run.id) ?? { offset: 0, lines: [], state: "not-yet" };
|
|
52
|
+
const tail = advanceTail(root, run.id, previous);
|
|
53
|
+
tails.set(run.id, tail);
|
|
54
|
+
panes.push({
|
|
55
|
+
runId: run.id,
|
|
56
|
+
taskId: run.taskId,
|
|
57
|
+
title: run.title,
|
|
58
|
+
repo: run.repo,
|
|
59
|
+
runner: run.runner,
|
|
60
|
+
role: run.role,
|
|
61
|
+
provider: run.provider,
|
|
62
|
+
model: run.model,
|
|
63
|
+
phase: stageWord(run),
|
|
64
|
+
startedAt: run.startedAt,
|
|
65
|
+
lines: tail.lines,
|
|
66
|
+
transcript: tail.state,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
for (const id of [...tails.keys()]) {
|
|
70
|
+
if (!panes.some(one => one.runId === id))
|
|
71
|
+
tails.delete(id);
|
|
72
|
+
}
|
|
73
|
+
return panes;
|
|
74
|
+
}
|
|
75
|
+
// ---- the frame --------------------------------------------------------------
|
|
76
|
+
function fit(text, width) {
|
|
77
|
+
const chars = [...text];
|
|
78
|
+
if (chars.length <= width)
|
|
79
|
+
return text + " ".repeat(width - chars.length);
|
|
80
|
+
return chars.slice(0, Math.max(0, width - 1)).join("") + "…";
|
|
81
|
+
}
|
|
82
|
+
function header(pane, index, now, width, focused) {
|
|
83
|
+
const left = `${index + 1} · #${pane.runId} ${pane.title}`;
|
|
84
|
+
const right = `${pane.runner} · ${pane.role} · ${pane.phase} · ${elapsedWords(pane.startedAt, now)}`;
|
|
85
|
+
const room = Math.max(0, width - [...right].length - 1);
|
|
86
|
+
const line = `${fit(left, room)} ${right}`;
|
|
87
|
+
return `${ESC}[7m${focused ? `${ESC}[1m` : ""}${fit(line, width)}${ESC}[0m`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Compose one frame: panes stacked, each with a header and as many tail
|
|
91
|
+
* lines as its share of the rows allows; the focused pane takes the whole
|
|
92
|
+
* screen. Pure — the loop paints what this returns.
|
|
93
|
+
*/
|
|
94
|
+
export function composeFrame(panes, size, focus, now) {
|
|
95
|
+
const columns = Math.max(20, size.columns);
|
|
96
|
+
const rows = Math.max(4, size.rows);
|
|
97
|
+
const footer = `${ESC}[2m${fit(panes.length === 0 ? "no agent is working right now — q leaves" : `${panes.length} live · 1-${Math.min(9, panes.length)} focus · a all · q leaves`, columns)}${ESC}[0m`;
|
|
98
|
+
const shown = focus !== null && panes[focus] !== undefined ? [panes[focus]] : panes;
|
|
99
|
+
const out = [];
|
|
100
|
+
if (shown.length === 0) {
|
|
101
|
+
out.push(fit("", columns));
|
|
102
|
+
out.push(fit(" nothing to peek at: no run is open.", columns));
|
|
103
|
+
for (let i = out.length; i < rows - 1; i += 1)
|
|
104
|
+
out.push(fit("", columns));
|
|
105
|
+
out.push(footer);
|
|
106
|
+
return out.join("\n");
|
|
107
|
+
}
|
|
108
|
+
const body = rows - 1;
|
|
109
|
+
const share = Math.max(2, Math.floor(body / shown.length));
|
|
110
|
+
for (const [i, pane] of shown.entries()) {
|
|
111
|
+
const index = focus !== null && panes[focus] !== undefined ? focus : i;
|
|
112
|
+
const height = i === shown.length - 1 ? body - share * (shown.length - 1) : share;
|
|
113
|
+
out.push(header(pane, index, now, columns, focus !== null));
|
|
114
|
+
const lines = pane.lines.length === 0
|
|
115
|
+
? [pane.transcript === "not-yet" ? " (no transcript yet — the agent has not spoken)" : pane.transcript === "unreadable" ? " (the live file could not be read)" : " …"]
|
|
116
|
+
: pane.lines.slice(-(height - 1)).map(one => ` ${one}`);
|
|
117
|
+
for (let r = 0; r < height - 1; r += 1)
|
|
118
|
+
out.push(fit(lines[r] ?? "", columns));
|
|
119
|
+
}
|
|
120
|
+
while (out.length < rows - 1)
|
|
121
|
+
out.push(fit("", columns));
|
|
122
|
+
out.push(footer);
|
|
123
|
+
return out.slice(0, rows).join("\n");
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Follow live runs until `q` (or, watching one run, until it finishes).
|
|
127
|
+
* Resolves with the exit code.
|
|
128
|
+
*/
|
|
129
|
+
export async function runPeek(store, root, options) {
|
|
130
|
+
const { io } = options;
|
|
131
|
+
const clock = options.clock ?? (() => new Date());
|
|
132
|
+
const tails = new Map();
|
|
133
|
+
let focus = null;
|
|
134
|
+
let stop = false;
|
|
135
|
+
let finishedWord = null;
|
|
136
|
+
const paint = () => {
|
|
137
|
+
const now = clock();
|
|
138
|
+
let panes = snapshotLiveRuns(store, root, now, tails);
|
|
139
|
+
if (options.runId !== undefined) {
|
|
140
|
+
panes = panes.filter(one => one.runId === options.runId);
|
|
141
|
+
if (panes.length === 0 && finishedWord === null) {
|
|
142
|
+
const run = store.getRun(options.runId);
|
|
143
|
+
finishedWord = run === null ? "no such run" : `run #${options.runId} finished: ${run.outcome ?? "?"}${run.reason === null ? "" : ` (${run.reason})`}`;
|
|
144
|
+
stop = true;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const size = { columns: io.stdout.columns ?? 100, rows: io.stdout.rows ?? 30 };
|
|
148
|
+
io.stdout.write(`${ESC}[H${composeFrame(panes, size, options.runId !== undefined ? null : focus, now)}`);
|
|
149
|
+
};
|
|
150
|
+
const wasRaw = io.stdin.isRaw === true;
|
|
151
|
+
io.stdout.write(`${ESC}[?1049h${ESC}[?25l${ESC}[2J`);
|
|
152
|
+
io.stdin.setRawMode?.(true);
|
|
153
|
+
io.stdin.resume();
|
|
154
|
+
const onKey = (chunk) => {
|
|
155
|
+
for (const ch of chunk.toString("utf8")) {
|
|
156
|
+
if (ch === "q" || ch === "\u0003")
|
|
157
|
+
stop = true;
|
|
158
|
+
else if (ch === "a")
|
|
159
|
+
focus = null;
|
|
160
|
+
else if (ch >= "1" && ch <= "9")
|
|
161
|
+
focus = Number(ch) - 1;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
io.stdin.on("data", onKey);
|
|
165
|
+
const onResize = () => paint();
|
|
166
|
+
io.stdout.on("resize", onResize);
|
|
167
|
+
try {
|
|
168
|
+
paint();
|
|
169
|
+
while (!stop) {
|
|
170
|
+
await new Promise(resolve => setTimeout(resolve, options.intervalMs ?? 500));
|
|
171
|
+
paint();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
io.stdin.removeListener("data", onKey);
|
|
176
|
+
io.stdout.removeListener("resize", onResize);
|
|
177
|
+
io.stdin.setRawMode?.(wasRaw);
|
|
178
|
+
io.stdin.pause();
|
|
179
|
+
io.stdout.write(`${ESC}[?25h${ESC}[?1049l`);
|
|
180
|
+
if (finishedWord !== null)
|
|
181
|
+
io.stdout.write(`${finishedWord}\n`);
|
|
182
|
+
}
|
|
183
|
+
return 0;
|
|
184
|
+
}
|
|
185
|
+
// ---- tmux -------------------------------------------------------------------
|
|
186
|
+
/**
|
|
187
|
+
* A real tmux session, one window per live run, each running `peek <run>`
|
|
188
|
+
* — for people who already live in tmux. The plane never becomes tmux's
|
|
189
|
+
* dependant: liveness stays in the store's leases, and this is a view.
|
|
190
|
+
*/
|
|
191
|
+
export async function openInTmux(panes, command, run, session = "toolroll") {
|
|
192
|
+
if (panes.length === 0)
|
|
193
|
+
return { ok: false, message: "no run is open — nothing to open a window for" };
|
|
194
|
+
const probe = await run("tmux", ["-V"]);
|
|
195
|
+
if (probe.code !== 0)
|
|
196
|
+
return { ok: false, message: "tmux is not installed (or not on PATH) — `toolroll peek` without --tmux needs nothing" };
|
|
197
|
+
const shellWord = (part) => `'${part.replace(/'/g, "'\\''")}'`;
|
|
198
|
+
const commandFor = (runId) => [...command, "peek", String(runId)].map(shellWord).join(" ");
|
|
199
|
+
const [first, ...rest] = panes;
|
|
200
|
+
const made = await run("tmux", ["new-session", "-d", "-s", session, "-n", first.taskId, commandFor(first.runId)]);
|
|
201
|
+
if (made.code !== 0)
|
|
202
|
+
return { ok: false, message: `tmux new-session: ${made.stderr.trim() || "refused"} — a session named ${session} may already exist (\`tmux attach -t ${session}\`)` };
|
|
203
|
+
for (const pane of rest) {
|
|
204
|
+
await run("tmux", ["new-window", "-t", session, "-n", pane.taskId, commandFor(pane.runId)]);
|
|
205
|
+
}
|
|
206
|
+
return { ok: true, windows: panes.length };
|
|
207
|
+
}
|
|
208
|
+
/** Hand the terminal to tmux and wait for it to come back. */
|
|
209
|
+
export function attachTmux(session = "toolroll") {
|
|
210
|
+
return new Promise(resolve => {
|
|
211
|
+
const child = spawn("tmux", ["attach", "-t", session], { stdio: "inherit" });
|
|
212
|
+
child.on("exit", code => resolve(code ?? 0));
|
|
213
|
+
child.on("error", () => resolve(1));
|
|
214
|
+
});
|
|
215
|
+
}
|
package/dist/peek.d.ts
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The live peek's NATIVE reader (attended finding 7, CRITICAL): the whole
|
|
3
|
+
* point of this module is what it does not do. No git invocation ever has
|
|
4
|
+
* the agent's worktree as its working tree; nothing here consults
|
|
5
|
+
* gitattributes, hooks, clean/process filters, or external diff drivers —
|
|
6
|
+
* the mechanisms finding 7 proved can execute repository-configured
|
|
7
|
+
* commands. Change detection is a git-blob sha1 computed IN PROCESS against
|
|
8
|
+
* the frozen base tree; the diff is a line-based Myers implemented here.
|
|
9
|
+
*
|
|
10
|
+
* Two layers, deliberately separated: the PURE core (sha1, diff, parsers,
|
|
11
|
+
* aggregation — bytes in, structures out) and ONE I/O function,
|
|
12
|
+
* observeWorktree — descriptor-DISCIPLINED, not descriptor-confined: Node
|
|
13
|
+
* has no openat, so traversal is by pathname and a same-UID attacker
|
|
14
|
+
* renaming ancestors mid-walk can misdirect it (round-3 finding 44 owns
|
|
15
|
+
* the honest disclosure). What IS held: files open O_NOFOLLOW|O_NONBLOCK
|
|
16
|
+
* and must fstat as regular files on the root's device before a byte is
|
|
17
|
+
* read; reads go through that descriptor, bounded to the accepted size,
|
|
18
|
+
* with growth re-checked after; directories must prove the root's device
|
|
19
|
+
* before descent; symlinks are never followed; `.git` is never entered;
|
|
20
|
+
* every cap is explicit; unreadable corners make the look PARTIAL rather
|
|
21
|
+
* than silently narrower. Guarding, caching, and serving stay with their
|
|
22
|
+
* owners (serve.ts).
|
|
23
|
+
*/
|
|
24
|
+
/** git's own blob identity: sha1 over "blob <len>\0" + bytes. Computing it
|
|
25
|
+
* here is what lets change detection never ask git about a working tree. */
|
|
26
|
+
export declare function gitBlobSha1(bytes: Buffer): string;
|
|
27
|
+
/** git's heuristic, near enough: a NUL in the first 8 KiB means binary —
|
|
28
|
+
* named on the page, never diffed. */
|
|
29
|
+
export declare function looksBinary(bytes: Buffer): boolean;
|
|
30
|
+
export type Hunk = {
|
|
31
|
+
aStart: number;
|
|
32
|
+
aLines: number;
|
|
33
|
+
bStart: number;
|
|
34
|
+
bLines: number;
|
|
35
|
+
/** Prefixed lines: " ctx", "-old", "+new" — exactly unified-diff shape. */
|
|
36
|
+
lines: string[];
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Line-based Myers (the O(ND) greedy walk), bounded by the caller's caps —
|
|
40
|
+
* inputs beyond the byte caps never reach here. Returns unified hunks with
|
|
41
|
+
* three lines of context, or null when the edit distance exceeds `maxD`
|
|
42
|
+
* (a rewrite is not usefully rendered as a diff — the caller says so).
|
|
43
|
+
*/
|
|
44
|
+
export declare function diffLines(aText: string, bText: string, maxD?: number): Hunk[] | null;
|
|
45
|
+
/** Render hunks as a unified patch body for one file, capped in bytes.
|
|
46
|
+
* The cap drops the incomplete final line (finding 9), and says so. */
|
|
47
|
+
export declare function renderUnified(path: string, hunks: Hunk[], capBytes: number): {
|
|
48
|
+
text: string;
|
|
49
|
+
truncated: boolean;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* New-file readability WITHOUT suppression (round-1 finding 19: ignore
|
|
53
|
+
* parsing is gone — a pattern match can HIDE a name, and patterns are
|
|
54
|
+
* agent-influencable). Aggregation only: a first path segment holding more
|
|
55
|
+
* than `groupAt` new files collapses to one row stating its exact count;
|
|
56
|
+
* everything else lists; the row cap saturates with exact totals. No name
|
|
57
|
+
* is ever dropped silently — the numbers always add up.
|
|
58
|
+
*/
|
|
59
|
+
export type NewFileRow = {
|
|
60
|
+
label: string;
|
|
61
|
+
count: number;
|
|
62
|
+
collapsed: boolean;
|
|
63
|
+
};
|
|
64
|
+
export declare function aggregateNewNames(paths: readonly string[], groupAt?: number, rowCap?: number): {
|
|
65
|
+
rows: NewFileRow[];
|
|
66
|
+
total: number;
|
|
67
|
+
renderedFiles: number;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* The base-tree snapshot parser (round-1 finding 15's demands, applied to
|
|
71
|
+
* OUR OWN format anyway): every entry is proved shaped before use —
|
|
72
|
+
* relative path with no dot-dot/backslash/control bytes, a known mode,
|
|
73
|
+
* a 40-hex sha, a bounded non-negative size. Anything else refuses the
|
|
74
|
+
* whole snapshot; a partial base is not a base.
|
|
75
|
+
*/
|
|
76
|
+
export type BaseTreeEntry = {
|
|
77
|
+
path: string;
|
|
78
|
+
mode: string;
|
|
79
|
+
sha: string;
|
|
80
|
+
size: number;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* The enveloped snapshot document (round-2 finding 26): entries alone are
|
|
84
|
+
* not a snapshot — the envelope binds schema version, repository, run, and
|
|
85
|
+
* the exact base OID, and the CONSUMER (not readVerifiedArtifact) proves
|
|
86
|
+
* those against the run row plus capture_status/truncated before any walk.
|
|
87
|
+
*/
|
|
88
|
+
export type BaseTreeSnapshot = {
|
|
89
|
+
repo: string;
|
|
90
|
+
run: number;
|
|
91
|
+
base: string;
|
|
92
|
+
entries: BaseTreeEntry[];
|
|
93
|
+
};
|
|
94
|
+
export declare function encodeBaseTreeSnapshot(snapshot: BaseTreeSnapshot): string;
|
|
95
|
+
export declare function parseBaseTreeSnapshot(json: string, entryCap?: number): BaseTreeSnapshot | null;
|
|
96
|
+
export declare function parseBaseTree(json: string, entryCap?: number): BaseTreeEntry[] | null;
|
|
97
|
+
export type PeekLimits = {
|
|
98
|
+
/** Walk abandons past this many entries — a typed refusal, not a guess. */
|
|
99
|
+
maxEntries: number;
|
|
100
|
+
/** Combined cap across changed+deleted+unchecked rows (finding 38). */
|
|
101
|
+
maxRows: number;
|
|
102
|
+
/** Files larger than this are compared by size only, and say so. */
|
|
103
|
+
maxFileBytes: number;
|
|
104
|
+
/** Total bytes hashed per observation; past it, remaining files go unverified. */
|
|
105
|
+
maxHashedBytes: number;
|
|
106
|
+
/** Wall budget, checked between files — over it, a partial look, never a hang. */
|
|
107
|
+
deadlineMs: number;
|
|
108
|
+
};
|
|
109
|
+
export declare const PEEK_LIMITS: PeekLimits;
|
|
110
|
+
export type PeekRow = {
|
|
111
|
+
kind: "changed" | "deleted" | "unchecked";
|
|
112
|
+
path: string;
|
|
113
|
+
detail: string;
|
|
114
|
+
};
|
|
115
|
+
export type Observation = {
|
|
116
|
+
ok: true;
|
|
117
|
+
rows: PeekRow[];
|
|
118
|
+
newPaths: string[];
|
|
119
|
+
/** Non-null when the look is partial, saying why in plain words. */
|
|
120
|
+
partial: string | null;
|
|
121
|
+
scanned: number;
|
|
122
|
+
} | {
|
|
123
|
+
ok: false;
|
|
124
|
+
reason: string;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* One best-effort observation of a working tree against its frozen base
|
|
128
|
+
* (v2 brief §2). Descriptor-confined throughout: directories via opendir
|
|
129
|
+
* handles, files via O_NOFOLLOW descriptors, sizes from fstat on the OPEN
|
|
130
|
+
* descriptor (never a path-racy stat), bytes hashed through the same
|
|
131
|
+
* descriptor. Symlinks are typed by lstat-equivalent dirent info and never
|
|
132
|
+
* opened. Nothing here writes, spawns, or evaluates anything.
|
|
133
|
+
*/
|
|
134
|
+
export declare function observeWorktree(root: string, base: readonly BaseTreeEntry[], limits?: PeekLimits): Promise<Observation>;
|