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,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Limits on the Tasks page (v105): each subscription's usage windows, as the
|
|
3
|
+
* provider last said, and each monthly budget, one tile each. A subscription
|
|
4
|
+
* costs nothing per run, so its windows are what bind it; budgets bind work
|
|
5
|
+
* billed to an API key. An instance operator's view.
|
|
6
|
+
*/
|
|
7
|
+
import type { BrowserLimits } from "./browser-workspace.js";
|
|
8
|
+
import { type BudgetState } from "./spend.js";
|
|
9
|
+
/** "in 25 min", "in 2 h 10 min", or a day and hour ("Fri 11 PM") beyond a day. */
|
|
10
|
+
export declare function resetWords(resetsAt: string, now: Date): string;
|
|
11
|
+
export declare function limitsView(windows: readonly {
|
|
12
|
+
provider: string;
|
|
13
|
+
window: string;
|
|
14
|
+
usedPercent: number;
|
|
15
|
+
windowMinutes: number | null;
|
|
16
|
+
resetsAt: string | null;
|
|
17
|
+
reached: boolean;
|
|
18
|
+
plan: string | null;
|
|
19
|
+
observedAt: string;
|
|
20
|
+
}[], budgets: readonly BudgetState[], names: {
|
|
21
|
+
project: (repo: string) => string;
|
|
22
|
+
teammate: (id: number) => string;
|
|
23
|
+
}, now: Date): BrowserLimits | null;
|
|
24
|
+
/** The same tiles for the page without scripts. */
|
|
25
|
+
export declare function limitsHtml(limits: BrowserLimits | null): string;
|
|
26
|
+
export declare const LIMITS_CSS: string;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { windowLabel } from "./provider-limits.js";
|
|
2
|
+
import { usd } from "./spend.js";
|
|
3
|
+
const PROVIDER_NAMES = { claude: "Claude", codex: "Codex", gemini: "Gemini" };
|
|
4
|
+
/** Plan names worth showing; anything else (an internal billing name) is left off. */
|
|
5
|
+
const PLAN_NAMES = { free: "Free", plus: "Plus", pro: "Pro", max: "Max", team: "Team", business: "Business", enterprise: "Enterprise", edu: "Edu" };
|
|
6
|
+
/** "in 25 min", "in 2 h 10 min", or a day and hour ("Fri 11 PM") beyond a day. */
|
|
7
|
+
export function resetWords(resetsAt, now) {
|
|
8
|
+
const minutes = Math.max(1, Math.round((Date.parse(resetsAt) - now.getTime()) / 60_000));
|
|
9
|
+
if (minutes < 60)
|
|
10
|
+
return `in ${minutes} min`;
|
|
11
|
+
if (minutes < 24 * 60)
|
|
12
|
+
return `in ${Math.floor(minutes / 60)} h${minutes % 60 === 0 ? "" : ` ${minutes % 60} min`}`;
|
|
13
|
+
return new Intl.DateTimeFormat("en-US", { weekday: "short", hour: "numeric" }).format(new Date(resetsAt)).replace(",", "");
|
|
14
|
+
}
|
|
15
|
+
const ago = (iso, now) => {
|
|
16
|
+
const minutes = Math.max(0, Math.round((now.getTime() - Date.parse(iso)) / 60_000));
|
|
17
|
+
return minutes < 60 ? `${minutes}m ago` : minutes < 48 * 60 ? `${Math.round(minutes / 60)}h ago` : `${Math.round(minutes / 1440)}d ago`;
|
|
18
|
+
};
|
|
19
|
+
const toneOf = (percent, reached) => reached || percent >= 100 ? "danger" : percent >= 80 ? "warning" : "neutral";
|
|
20
|
+
export function limitsView(windows, budgets, names, now) {
|
|
21
|
+
const tiles = [];
|
|
22
|
+
for (const one of windows) {
|
|
23
|
+
// A window that has turned over since the reading starts again from nothing.
|
|
24
|
+
const turned = one.resetsAt !== null && Date.parse(one.resetsAt) <= now.getTime();
|
|
25
|
+
const percent = turned ? 0 : one.usedPercent;
|
|
26
|
+
const reached = !turned && one.reached;
|
|
27
|
+
const stale = now.getTime() - Date.parse(one.observedAt) > 30 * 60_000;
|
|
28
|
+
const provider = PROVIDER_NAMES[one.provider] ?? one.provider;
|
|
29
|
+
const plan = one.plan === null ? "" : Object.hasOwn(PLAN_NAMES, one.plan.toLowerCase()) ? ` ${PLAN_NAMES[one.plan.toLowerCase()]}` : "";
|
|
30
|
+
tiles.push({
|
|
31
|
+
key: `${one.provider}:${one.window}`, name: `${provider}${plan}`, window: windowLabel(one.window, one.windowMinutes),
|
|
32
|
+
value: String(Math.round(percent)), unit: "%", percent, tone: toneOf(percent, reached), marks: [], href: null,
|
|
33
|
+
detail: turned ? "New window" : `${reached ? "Used up · resets" : "Resets"} ${one.resetsAt === null ? "later" : resetWords(one.resetsAt, now)}${stale ? ` · read ${ago(one.observedAt, now)}` : ""}`,
|
|
34
|
+
title: `${provider} said this ${ago(one.observedAt, now)}`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
for (const budget of budgets) {
|
|
38
|
+
const over = budget.spentMicrousd >= budget.limitMicrousd;
|
|
39
|
+
const name = budget.scope === "installation" ? "Everything" : budget.scope === "project" ? names.project(budget.key)
|
|
40
|
+
: budget.scope === "teammate" ? names.teammate(Number(budget.key)) : budget.key;
|
|
41
|
+
tiles.push({
|
|
42
|
+
key: `budget:${budget.id}`, name, window: "Budget", value: usd(budget.spentMicrousd), unit: `of ${usd(budget.limitMicrousd)}`,
|
|
43
|
+
percent: budget.percent, tone: over ? (budget.hardStop ? "danger" : "warning") : budget.percent >= 80 ? "warning" : "neutral", marks: [50, 80], href: "/spend",
|
|
44
|
+
detail: over && budget.hardStop ? "Used up · API work waits" : budget.hardStop ? "Stops API work at 100%" : "Alerts only",
|
|
45
|
+
title: `This month's spend billed to API keys${budget.unpriced > 0 ? `; ${budget.unpriced} without a price` : ""}`,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return tiles.length === 0 ? null : { tiles };
|
|
49
|
+
}
|
|
50
|
+
const e = (value) => String(value ?? "").replace(/[&<>"']/g, c => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[c]);
|
|
51
|
+
/** The same tiles for the page without scripts. */
|
|
52
|
+
export function limitsHtml(limits) {
|
|
53
|
+
if (limits === null)
|
|
54
|
+
return "";
|
|
55
|
+
return `<section class="limits" aria-label="Limits"><ul>${limits.tiles.map(tile => {
|
|
56
|
+
const body = `<p class="limit-name"><strong>${e(tile.name)}</strong> ${e(tile.window)}</p><p class="limit-value"><strong>${e(tile.value)}</strong> ${e(tile.unit)}</p>` +
|
|
57
|
+
`<span class="limit-bar" aria-hidden="true"><span style="width:${Math.min(100, Math.max(0, tile.percent))}%"></span></span><p class="limit-detail">${e(tile.detail)}</p>`;
|
|
58
|
+
return `<li class="limit limit-${tile.tone}" data-limit="${e(tile.key)}"${tile.title === null ? "" : ` title="${e(tile.title)}"`}>${tile.href === null ? body : `<a href="${e(tile.href)}">${body}</a>`}</li>`;
|
|
59
|
+
}).join("")}</ul></section>`;
|
|
60
|
+
}
|
|
61
|
+
export const LIMITS_CSS = `.limits ul{list-style:none;margin:0 0 16px;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(176px,1fr));gap:8px}` +
|
|
62
|
+
`.limit{border:1px solid var(--border);border-radius:10px;background:var(--card);padding:12px 14px;min-width:0}.limit a{color:inherit;text-decoration:none;display:block}` +
|
|
63
|
+
`.limit p{margin:0}.limit-name{font-size:12px;color:var(--muted-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.limit-name strong{color:var(--foreground);font-weight:500}` +
|
|
64
|
+
`.limit-value{margin-top:8px!important;font-size:12px;color:var(--muted-foreground);font-variant-numeric:tabular-nums}.limit-value strong{font-size:22px;font-weight:600;color:var(--foreground);letter-spacing:-.02em}` +
|
|
65
|
+
`.limit-bar{display:block;height:6px;border-radius:3px;background:var(--muted);overflow:hidden;margin-top:10px}.limit-bar span{display:block;height:100%;border-radius:3px;background:var(--foreground)}` +
|
|
66
|
+
`.limit-warning .limit-bar span{background:var(--warning)}.limit-danger .limit-bar span{background:var(--danger)}.limit-danger .limit-value strong{color:var(--danger)}` +
|
|
67
|
+
`.limit-detail{margin-top:8px!important;font-size:11.5px;color:var(--muted-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}`;
|
package/dist/link.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Putting the command on PATH, as an explicit act.
|
|
3
|
+
*
|
|
4
|
+
* Toolroll refuses to install things on an operator's behalf — it prints
|
|
5
|
+
* the command and its side effects and lets them run it. A tool that applied
|
|
6
|
+
* that rule to `bd init` and then quietly edited PATH during its own install
|
|
7
|
+
* would not deserve to be believed, so this is a command you run, it shows
|
|
8
|
+
* you what it will do before it does it, and `unlink` undoes it exactly.
|
|
9
|
+
*
|
|
10
|
+
* Three rules hold throughout: never sudo, never a directory outside the home
|
|
11
|
+
* directory unless explicitly named, and never delete anything that is not
|
|
12
|
+
* something we put there.
|
|
13
|
+
*
|
|
14
|
+
* Two mechanisms, because "a command on PATH" means different things. On POSIX
|
|
15
|
+
* it is a symlink with the execute bit set. On Windows the shell resolves
|
|
16
|
+
* commands through PATHEXT, so an extensionless symlink is invisible no matter
|
|
17
|
+
* which directory it sits in — there it is a `.cmd` shim, which is also what
|
|
18
|
+
* npm writes, and which needs no Developer Mode to create.
|
|
19
|
+
*/
|
|
20
|
+
/** What you type. */
|
|
21
|
+
export declare const BIN_NAME = "toolroll";
|
|
22
|
+
/** What lands on disk. Windows needs the extension to resolve it through PATHEXT. */
|
|
23
|
+
export declare const LINK_FILE: string;
|
|
24
|
+
export type TargetChoice = {
|
|
25
|
+
dir: string;
|
|
26
|
+
onPath: boolean;
|
|
27
|
+
};
|
|
28
|
+
export type LinkPlan = {
|
|
29
|
+
action: "create";
|
|
30
|
+
source: string;
|
|
31
|
+
target: string;
|
|
32
|
+
} | {
|
|
33
|
+
action: "already";
|
|
34
|
+
source: string;
|
|
35
|
+
target: string;
|
|
36
|
+
} | {
|
|
37
|
+
action: "replace";
|
|
38
|
+
source: string;
|
|
39
|
+
target: string;
|
|
40
|
+
current: string;
|
|
41
|
+
} | {
|
|
42
|
+
action: "conflict";
|
|
43
|
+
source: string;
|
|
44
|
+
target: string;
|
|
45
|
+
reason: string;
|
|
46
|
+
};
|
|
47
|
+
export type UnlinkPlan = {
|
|
48
|
+
action: "remove";
|
|
49
|
+
target: string;
|
|
50
|
+
current: string;
|
|
51
|
+
} | {
|
|
52
|
+
action: "absent";
|
|
53
|
+
target: string;
|
|
54
|
+
} | {
|
|
55
|
+
action: "foreign";
|
|
56
|
+
target: string;
|
|
57
|
+
reason: string;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Where the link should go. Only directories inside the home directory are
|
|
61
|
+
* ever proposed: everything else needs sudo, and needing sudo to read your own
|
|
62
|
+
* git repositories would be absurd.
|
|
63
|
+
*/
|
|
64
|
+
export declare function chooseTarget(options: {
|
|
65
|
+
pathEntries: readonly string[];
|
|
66
|
+
home: string;
|
|
67
|
+
override?: string;
|
|
68
|
+
}): TargetChoice;
|
|
69
|
+
export declare function planLink(source: string, dir: string): Promise<LinkPlan>;
|
|
70
|
+
export declare function applyLink(plan: LinkPlan): Promise<void>;
|
|
71
|
+
export declare function planUnlink(dir: string): Promise<UnlinkPlan>;
|
|
72
|
+
export declare function applyUnlink(plan: UnlinkPlan): Promise<void>;
|
package/dist/link.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Putting the command on PATH, as an explicit act.
|
|
3
|
+
*
|
|
4
|
+
* Toolroll refuses to install things on an operator's behalf — it prints
|
|
5
|
+
* the command and its side effects and lets them run it. A tool that applied
|
|
6
|
+
* that rule to `bd init` and then quietly edited PATH during its own install
|
|
7
|
+
* would not deserve to be believed, so this is a command you run, it shows
|
|
8
|
+
* you what it will do before it does it, and `unlink` undoes it exactly.
|
|
9
|
+
*
|
|
10
|
+
* Three rules hold throughout: never sudo, never a directory outside the home
|
|
11
|
+
* directory unless explicitly named, and never delete anything that is not
|
|
12
|
+
* something we put there.
|
|
13
|
+
*
|
|
14
|
+
* Two mechanisms, because "a command on PATH" means different things. On POSIX
|
|
15
|
+
* it is a symlink with the execute bit set. On Windows the shell resolves
|
|
16
|
+
* commands through PATHEXT, so an extensionless symlink is invisible no matter
|
|
17
|
+
* which directory it sits in — there it is a `.cmd` shim, which is also what
|
|
18
|
+
* npm writes, and which needs no Developer Mode to create.
|
|
19
|
+
*/
|
|
20
|
+
import { chmod, mkdir, lstat, readFile, readlink, stat, symlink, unlink, writeFile } from "node:fs/promises";
|
|
21
|
+
import { dirname, join, resolve, sep } from "node:path";
|
|
22
|
+
const isWindows = process.platform === "win32";
|
|
23
|
+
/** What you type. */
|
|
24
|
+
export const BIN_NAME = "toolroll";
|
|
25
|
+
/** What lands on disk. Windows needs the extension to resolve it through PATHEXT. */
|
|
26
|
+
export const LINK_FILE = isWindows ? `${BIN_NAME}.cmd` : BIN_NAME;
|
|
27
|
+
/** Owner, group, and other execute — the same bits npm sets on a package bin. */
|
|
28
|
+
const EXECUTABLE_BITS = 0o111;
|
|
29
|
+
/**
|
|
30
|
+
* How a shim is known to be ours. The symlink case can ask the filesystem what
|
|
31
|
+
* it is; a `.cmd` is an ordinary file, so it has to say so in its own text or
|
|
32
|
+
* `unlink` could not tell it from someone else's program of the same name.
|
|
33
|
+
*/
|
|
34
|
+
const SHIM_MARKER = "toolroll-link: generated by `toolroll link`";
|
|
35
|
+
/** Shims written before the rename to Toolroll stay ours. */
|
|
36
|
+
const LEGACY_SHIM_MARKER = "standing-orders-link: generated by `standing-orders link`";
|
|
37
|
+
/**
|
|
38
|
+
* Windows path comparison is case-insensitive, and a PATH entry may or may not
|
|
39
|
+
* carry a trailing separator. Comparing the raw strings means a directory that
|
|
40
|
+
* is on PATH gets reported as missing from it.
|
|
41
|
+
*/
|
|
42
|
+
function comparablePath(path) {
|
|
43
|
+
const trimmed = path.length > 1 && path.endsWith(sep) ? path.slice(0, -1) : path;
|
|
44
|
+
return isWindows ? trimmed.toLowerCase() : trimmed;
|
|
45
|
+
}
|
|
46
|
+
function samePath(left, right) {
|
|
47
|
+
return comparablePath(left) === comparablePath(right);
|
|
48
|
+
}
|
|
49
|
+
/** Whether `path` is the home directory or sits beneath it. */
|
|
50
|
+
function isInside(path, home) {
|
|
51
|
+
const inner = comparablePath(path);
|
|
52
|
+
const outer = comparablePath(home);
|
|
53
|
+
return inner === outer || inner.startsWith(outer + sep);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Where the link should go. Only directories inside the home directory are
|
|
57
|
+
* ever proposed: everything else needs sudo, and needing sudo to read your own
|
|
58
|
+
* git repositories would be absurd.
|
|
59
|
+
*/
|
|
60
|
+
export function chooseTarget(options) {
|
|
61
|
+
const { pathEntries, home, override } = options;
|
|
62
|
+
const isOnPath = (dir) => pathEntries.some(entry => samePath(entry, dir));
|
|
63
|
+
if (override !== undefined) {
|
|
64
|
+
const dir = resolve(override);
|
|
65
|
+
return { dir, onPath: isOnPath(dir) };
|
|
66
|
+
}
|
|
67
|
+
const conventional = [join(home, ".local", "bin"), join(home, "bin")];
|
|
68
|
+
const preferred = conventional.find(isOnPath);
|
|
69
|
+
if (preferred !== undefined)
|
|
70
|
+
return { dir: preferred, onPath: true };
|
|
71
|
+
const homeOwned = pathEntries.find(entry => isInside(entry, home));
|
|
72
|
+
if (homeOwned !== undefined)
|
|
73
|
+
return { dir: homeOwned, onPath: true };
|
|
74
|
+
// Nothing usable on PATH. Propose the conventional location and say so.
|
|
75
|
+
return { dir: conventional[0], onPath: false };
|
|
76
|
+
}
|
|
77
|
+
export async function planLink(source, dir) {
|
|
78
|
+
const target = join(dir, LINK_FILE);
|
|
79
|
+
const existing = await describeExisting(target);
|
|
80
|
+
if (existing === null)
|
|
81
|
+
return { action: "create", source, target };
|
|
82
|
+
if (existing.kind === "foreign") {
|
|
83
|
+
return { action: "conflict", source, target, reason: existing.reason };
|
|
84
|
+
}
|
|
85
|
+
if (samePath(existing.pointsTo, source))
|
|
86
|
+
return { action: "already", source, target };
|
|
87
|
+
return { action: "replace", source, target, current: existing.pointsTo };
|
|
88
|
+
}
|
|
89
|
+
export async function applyLink(plan) {
|
|
90
|
+
if (plan.action === "conflict") {
|
|
91
|
+
throw new Error(`${plan.target}: ${plan.reason} — remove it yourself if you want it gone`);
|
|
92
|
+
}
|
|
93
|
+
if (plan.action === "already")
|
|
94
|
+
return;
|
|
95
|
+
await mkdir(dirname(plan.target), { recursive: true });
|
|
96
|
+
// Only ever removing a shim we recognise, never someone else's file.
|
|
97
|
+
if (plan.action === "replace")
|
|
98
|
+
await unlink(plan.target);
|
|
99
|
+
if (isWindows) {
|
|
100
|
+
await writeFile(plan.target, shimText(plan.source));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
await symlink(plan.source, plan.target);
|
|
104
|
+
await ensureExecutable(plan.source);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* `%*` forwards arguments with their quoting intact — the same mechanism npm's
|
|
108
|
+
* own generated shims use — and `EXIT /B` hands the command's exit code back to
|
|
109
|
+
* the shell, without which a failing scan would look like a success to anything
|
|
110
|
+
* that checked.
|
|
111
|
+
*
|
|
112
|
+
* The path is written with `%` doubled, because a percent sign is legal in a
|
|
113
|
+
* Windows path and cmd would otherwise read `%Foo%` in it as a variable and
|
|
114
|
+
* substitute it away. The `REM source:` line keeps the path verbatim: it is
|
|
115
|
+
* read back by this program, not by cmd.
|
|
116
|
+
*
|
|
117
|
+
* `SETLOCAL DisableDelayedExpansion` is not ceremony. Delayed expansion is
|
|
118
|
+
* inherited — a shim invoked under `cmd /v:on`, or from a batch file that
|
|
119
|
+
* enabled it, would have every `!` in the path *and in the arguments* eaten
|
|
120
|
+
* before node saw them, turning `a!name!b` into `ab` silently. Disabling it for
|
|
121
|
+
* our own scope is the only way to be sure. `ENDLOCAL &` shares a line with the
|
|
122
|
+
* exit so that `%ERRORLEVEL%` is read inside the scope, before it is torn down.
|
|
123
|
+
*
|
|
124
|
+
* One inherited quirk remains, worth knowing before someone reports it as a
|
|
125
|
+
* bug: a batch file reaching this through CALL has its arguments parsed a
|
|
126
|
+
* second time by cmd, which doubles any caret in them. That happens to
|
|
127
|
+
* `CALL node ...` just the same, with no shim involved, and no batch file can
|
|
128
|
+
* avoid it — only a compiled launcher could. The tests pin the shim to being
|
|
129
|
+
* transparent rather than to being immune.
|
|
130
|
+
*/
|
|
131
|
+
function shimText(source) {
|
|
132
|
+
return [
|
|
133
|
+
"@ECHO off",
|
|
134
|
+
`REM ${SHIM_MARKER}; safe to delete`,
|
|
135
|
+
`REM source: ${source}`,
|
|
136
|
+
"SETLOCAL DisableDelayedExpansion",
|
|
137
|
+
`node "${source.replaceAll("%", "%%")}" %*`,
|
|
138
|
+
"ENDLOCAL & EXIT /B %ERRORLEVEL%",
|
|
139
|
+
"",
|
|
140
|
+
].join("\r\n");
|
|
141
|
+
}
|
|
142
|
+
/** The source a shim points at, or null when the text is not one of ours. */
|
|
143
|
+
function readShimSource(text) {
|
|
144
|
+
if (!text.includes(SHIM_MARKER) && !text.includes(LEGACY_SHIM_MARKER))
|
|
145
|
+
return null;
|
|
146
|
+
const declared = /^REM source: (.+)$/m.exec(text);
|
|
147
|
+
return declared?.[1]?.trim() ?? null;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* tsc emits a file with the shebang intact but without the execute bit, so a
|
|
151
|
+
* symlink to it fails with "permission denied" the first time it is typed.
|
|
152
|
+
* Windows has no such bit, and chmod there is a no-op at best.
|
|
153
|
+
*/
|
|
154
|
+
async function ensureExecutable(source) {
|
|
155
|
+
if (isWindows)
|
|
156
|
+
return;
|
|
157
|
+
const stats = await stat(source);
|
|
158
|
+
const wanted = stats.mode | EXECUTABLE_BITS;
|
|
159
|
+
if (wanted !== stats.mode)
|
|
160
|
+
await chmod(source, wanted);
|
|
161
|
+
}
|
|
162
|
+
export async function planUnlink(dir) {
|
|
163
|
+
const target = join(dir, LINK_FILE);
|
|
164
|
+
const existing = await describeExisting(target);
|
|
165
|
+
if (existing === null)
|
|
166
|
+
return { action: "absent", target };
|
|
167
|
+
if (existing.kind === "foreign") {
|
|
168
|
+
return { action: "foreign", target, reason: existing.reason };
|
|
169
|
+
}
|
|
170
|
+
return { action: "remove", target, current: existing.pointsTo };
|
|
171
|
+
}
|
|
172
|
+
export async function applyUnlink(plan) {
|
|
173
|
+
if (plan.action === "foreign") {
|
|
174
|
+
throw new Error(`${plan.target}: ${plan.reason} — leaving it alone`);
|
|
175
|
+
}
|
|
176
|
+
if (plan.action === "absent")
|
|
177
|
+
return;
|
|
178
|
+
await unlink(plan.target);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* null when nothing is there. Otherwise: ours, and what it points at, or
|
|
182
|
+
* foreign, and why we will not touch it.
|
|
183
|
+
*/
|
|
184
|
+
async function describeExisting(target) {
|
|
185
|
+
let stats;
|
|
186
|
+
try {
|
|
187
|
+
stats = await lstat(target);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
if (isWindows) {
|
|
193
|
+
if (!stats.isFile()) {
|
|
194
|
+
return { kind: "foreign", reason: "something that is not a file is already there" };
|
|
195
|
+
}
|
|
196
|
+
let text;
|
|
197
|
+
try {
|
|
198
|
+
text = await readFile(target, "utf8");
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return { kind: "foreign", reason: "something unreadable is already there" };
|
|
202
|
+
}
|
|
203
|
+
const pointsTo = readShimSource(text);
|
|
204
|
+
if (pointsTo === null) {
|
|
205
|
+
return { kind: "foreign", reason: "a program we did not write is already there" };
|
|
206
|
+
}
|
|
207
|
+
return { kind: "ours", pointsTo };
|
|
208
|
+
}
|
|
209
|
+
if (!stats.isSymbolicLink()) {
|
|
210
|
+
return { kind: "foreign", reason: "something that is not a link is already there" };
|
|
211
|
+
}
|
|
212
|
+
// readlink returns the link's raw text, which may be relative. Comparing that
|
|
213
|
+
// against an absolute source would call a perfectly good link stale and
|
|
214
|
+
// replace it on every run.
|
|
215
|
+
const raw = await readlink(target);
|
|
216
|
+
return { kind: "ours", pointsTo: resolve(dirname(target), raw) };
|
|
217
|
+
}
|
package/dist/live.d.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The live window (arc 1): what the running agent is saying, on disk, for
|
|
3
|
+
* the run page to poll — and NOTHING else.
|
|
4
|
+
*
|
|
5
|
+
* This file is display state, not evidence. No artifact row points at it,
|
|
6
|
+
* no digest binds it, and the page that renders it says so: the machine
|
|
7
|
+
* running the agent could alter it. It exists so a person can watch work
|
|
8
|
+
* happen without a terminal, and every byte in it went through the same
|
|
9
|
+
* sanitize discipline as the peek: controls stripped, credential-shaped
|
|
10
|
+
* lines replaced whole, tool activity described in OUR fixed vocabulary —
|
|
11
|
+
* event metadata is never echoed.
|
|
12
|
+
*
|
|
13
|
+
* Fail-soft everywhere: a live view that cannot be written must never
|
|
14
|
+
* break, slow, or reclassify a build.
|
|
15
|
+
*/
|
|
16
|
+
export declare const LIVE_LINE_CAP: number;
|
|
17
|
+
export declare const LIVE_FILE_CAP: number;
|
|
18
|
+
export declare const LIVE_CAP_MARKER = "[the live view stopped at its size cap \u2014 the run record continues]";
|
|
19
|
+
export declare const LIVE_REDACTED_LINE = "[a credential-shaped line was redacted]";
|
|
20
|
+
/** Finalized runs keep their live file this long for the final drain. */
|
|
21
|
+
export declare const LIVE_RETAIN_MS: number;
|
|
22
|
+
/** The bounded sweep: at most this many FINALIZED files survive a pass. */
|
|
23
|
+
export declare const LIVE_FILE_BOUND = 500;
|
|
24
|
+
export declare function liveDir(root: string): string;
|
|
25
|
+
/** The exact filename, from the numeric id and nothing else — no user
|
|
26
|
+
* input is ever parsed into this path. */
|
|
27
|
+
export declare function liveLogPath(root: string, runId: number): string;
|
|
28
|
+
/**
|
|
29
|
+
* One stream event → zero or more display lines, in the fixed vocabulary.
|
|
30
|
+
* Assistant TEXT is the agent's own words (sanitized below); tool use is a
|
|
31
|
+
* headline; everything else — tool results, deltas, results, subagent
|
|
32
|
+
* chatter — renders nothing in v1.
|
|
33
|
+
*/
|
|
34
|
+
export declare function renderTranscriptLines(event: Record<string, unknown>): string[];
|
|
35
|
+
/** Sanitize one display line: strip, redact whole on any secret hit, cap. */
|
|
36
|
+
export declare function sanitizeTranscriptLine(line: string): string;
|
|
37
|
+
export type LiveLog = {
|
|
38
|
+
observe(event: Record<string, unknown>): void;
|
|
39
|
+
close(): void;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Open the run's live file for appending. The directory is 0700, the file
|
|
43
|
+
* 0600 and CREATED HERE (O_EXCL: a name that already exists — whatever put
|
|
44
|
+
* it there — is refused, not appended to), opened O_NOFOLLOW with the
|
|
45
|
+
* descriptor retained for the run's whole duration. Returns null on any
|
|
46
|
+
* failure: no live view is ever worth a build.
|
|
47
|
+
*/
|
|
48
|
+
export declare function openLiveLog(root: string, runId: number): LiveLog | null;
|
|
49
|
+
export type LiveWindowRead = {
|
|
50
|
+
ok: true;
|
|
51
|
+
text: string;
|
|
52
|
+
nextOffset: number;
|
|
53
|
+
eof: boolean;
|
|
54
|
+
} | {
|
|
55
|
+
ok: false;
|
|
56
|
+
reason: "missing" | "replaced" | "unreadable";
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Read the live file from a byte offset, returning only COMPLETE lines
|
|
60
|
+
* (through the last LF in the window). The descriptor is the authority:
|
|
61
|
+
* opened O_NOFOLLOW, proved a regular file, measured and read through
|
|
62
|
+
* itself. A file smaller than the offset was replaced — the caller resets,
|
|
63
|
+
* visibly, never silently duplicating (arc 1 §4). `allowTail` (the final
|
|
64
|
+
* drain) returns the unterminated tail after finalization.
|
|
65
|
+
*/
|
|
66
|
+
export declare function readLiveWindow(root: string, runId: number, from: number, allowTail?: boolean): LiveWindowRead;
|
|
67
|
+
export type LiveSweepVerdict = {
|
|
68
|
+
/** run id, or null when the name is not a run's file. */
|
|
69
|
+
runId: number | null;
|
|
70
|
+
fileName: string;
|
|
71
|
+
mtimeMs: number;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Enumerate the live directory for the reconcile sweep. Pure listing — the
|
|
75
|
+
* CALLER decides which runs are finalized and when; this module only
|
|
76
|
+
* refuses to guess. Non-run names are reported with runId null (orphans
|
|
77
|
+
* from nothing this plane wrote; aged on mtime like everything else).
|
|
78
|
+
*/
|
|
79
|
+
export declare function listLiveFiles(root: string): LiveSweepVerdict[];
|
|
80
|
+
/** Remove one live file, silently: a sweep never throws over display state. */
|
|
81
|
+
export declare function removeLiveFile(root: string, fileName: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* The reconcile sweep (arc 1 §2): ACTIVE runs are exempt ABSOLUTELY — the
|
|
84
|
+
* transport's no-truncation assumption depends on it. Finalized runs age
|
|
85
|
+
* from finished_at; orphans (no run row, or a name this plane never
|
|
86
|
+
* writes) age from mtime; and the 500-file bound applies only WITHIN the
|
|
87
|
+
* finalized-or-orphan set, oldest first.
|
|
88
|
+
*/
|
|
89
|
+
export declare function sweepLiveLogs(store: {
|
|
90
|
+
getRun(id: number): {
|
|
91
|
+
outcome: string | null;
|
|
92
|
+
finishedAt: string | null;
|
|
93
|
+
} | null;
|
|
94
|
+
}, root: string, now: Date): {
|
|
95
|
+
removed: string[];
|
|
96
|
+
};
|