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,72 @@
|
|
|
1
|
+
import { type ProcessObservationFailure } from "./process-tree.js";
|
|
2
|
+
/** Read-only recovery witnesses, never authority to signal historical PIDs.
|
|
3
|
+
* macOS ancestry is observational; a missed/failed observation stays fenced.
|
|
4
|
+
*/
|
|
5
|
+
export type CodingCustody = {
|
|
6
|
+
pid: number | null;
|
|
7
|
+
group: boolean;
|
|
8
|
+
descendants: {
|
|
9
|
+
pid: number;
|
|
10
|
+
group: boolean;
|
|
11
|
+
}[];
|
|
12
|
+
observationUnknown: boolean;
|
|
13
|
+
observationFailures?: ProcessObservationFailure[];
|
|
14
|
+
host: string;
|
|
15
|
+
bootId: string | null;
|
|
16
|
+
container?: {
|
|
17
|
+
backend: string;
|
|
18
|
+
id: string;
|
|
19
|
+
identity?: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export type CodingProviderEvent = {
|
|
23
|
+
kind: "notification";
|
|
24
|
+
method: string;
|
|
25
|
+
params: Record<string, unknown>;
|
|
26
|
+
} | {
|
|
27
|
+
kind: "request";
|
|
28
|
+
id: string | number;
|
|
29
|
+
method: string;
|
|
30
|
+
params: Record<string, unknown>;
|
|
31
|
+
} | {
|
|
32
|
+
kind: "custody";
|
|
33
|
+
custody: CodingCustody;
|
|
34
|
+
} | {
|
|
35
|
+
kind: "exit";
|
|
36
|
+
message: string;
|
|
37
|
+
};
|
|
38
|
+
export interface CodingProvider {
|
|
39
|
+
request(method: string, params: Record<string, unknown>): Promise<unknown>;
|
|
40
|
+
respond(id: string | number, result: unknown): void;
|
|
41
|
+
reject(id: string | number, code: number, message: string): void;
|
|
42
|
+
subscribe(listener: (event: CodingProviderEvent) => void): () => void;
|
|
43
|
+
/** Retain this witness after disconnect. It is not permission to signal a saved PID. */
|
|
44
|
+
processId(): number | null;
|
|
45
|
+
custody(): CodingCustody;
|
|
46
|
+
/** Resolves only after exit is verified; a rejection must keep session custody fenced. */
|
|
47
|
+
close(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
/** A response from the server, distinct from an ambiguous transport failure. */
|
|
50
|
+
export declare class CodingProviderRequestError extends Error {
|
|
51
|
+
readonly code: number;
|
|
52
|
+
readonly data?: unknown;
|
|
53
|
+
readonly outcomeUnknown = false;
|
|
54
|
+
constructor(code: number, message: string, data?: unknown);
|
|
55
|
+
}
|
|
56
|
+
export declare class CodingProviderDisconnectedError extends Error {
|
|
57
|
+
readonly outcomeUnknown = true;
|
|
58
|
+
constructor(message?: string);
|
|
59
|
+
}
|
|
60
|
+
export declare class CodingProviderShutdownError extends Error {
|
|
61
|
+
constructor();
|
|
62
|
+
}
|
|
63
|
+
export declare function codingEnvironment(): NodeJS.ProcessEnv;
|
|
64
|
+
/** Native app-server JSONL transport. It keeps Codex's normal config, tools and
|
|
65
|
+
* approval rules. There are no request/turn deadlines or automatic retries.
|
|
66
|
+
* Protocol: https://learn.chatgpt.com/docs/app-server (installed CLI schema).
|
|
67
|
+
*/
|
|
68
|
+
export declare function createCodexCodingProvider(options?: {
|
|
69
|
+
cwd?: string;
|
|
70
|
+
command?: string;
|
|
71
|
+
args?: string[];
|
|
72
|
+
}): CodingProvider;
|
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { TextDecoder } from "node:util";
|
|
3
|
+
import { hostname } from "node:os";
|
|
4
|
+
import { currentBootId } from "./boot-identity.js";
|
|
5
|
+
import { createContainer, currentContainment } from "./containment.js";
|
|
6
|
+
import { processMayBeAlive } from "./process-liveness.js";
|
|
7
|
+
import { observeProcessTree, sampleProcessTree, stopProcessTree } from "./process-tree.js";
|
|
8
|
+
import { isOwnEnv } from "./names.js";
|
|
9
|
+
/** A response from the server, distinct from an ambiguous transport failure. */
|
|
10
|
+
export class CodingProviderRequestError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
data;
|
|
13
|
+
outcomeUnknown = false;
|
|
14
|
+
constructor(code, message, data) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.data = data;
|
|
18
|
+
this.name = "CodingProviderRequestError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class CodingProviderDisconnectedError extends Error {
|
|
22
|
+
outcomeUnknown = true;
|
|
23
|
+
constructor(message = "Codex disconnected. The last request may have run; inspect the saved session before continuing.") {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = "CodingProviderDisconnectedError";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class CodingProviderShutdownError extends Error {
|
|
29
|
+
constructor() {
|
|
30
|
+
super("Codex process cleanup could not be verified. Keep this session paused until its processes are confirmed stopped.");
|
|
31
|
+
this.name = "CodingProviderShutdownError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// A corrupt/noisy child must never grow an unbounded transcript or write queue.
|
|
35
|
+
// Fail the connection explicitly; never truncate a valid protocol message.
|
|
36
|
+
const MAX_FRAME_BYTES = 16 * 1024 * 1024;
|
|
37
|
+
const MAX_PENDING_REQUESTS = 128;
|
|
38
|
+
const EXIT_GRACE_MS = 1_000;
|
|
39
|
+
const own = (object, key) => Object.prototype.hasOwnProperty.call(object, key);
|
|
40
|
+
const object = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
41
|
+
const requestId = (value) => typeof value === "string" || (typeof value === "number" && Number.isSafeInteger(value));
|
|
42
|
+
export function codingEnvironment() {
|
|
43
|
+
const env = { ...process.env };
|
|
44
|
+
const invokingSession = new Set([
|
|
45
|
+
"CODEX_INTERNAL_ORIGINATOR_OVERRIDE", "CODEX_SESSION_ID", "CODEX_THREAD_ID",
|
|
46
|
+
"CODEX_SHELL", "CODEX_CI", "CODEX_VERSION", "CODEX_SAGE_BACKFILL_TRACKER_TAB_REUSE",
|
|
47
|
+
]);
|
|
48
|
+
for (const key of Object.keys(env)) {
|
|
49
|
+
// Preserve native Codex auth, HOME, PATH, CODEX_HOME and project config.
|
|
50
|
+
// A parent desktop session's control pipe and identity do not belong to
|
|
51
|
+
// this independent native client. Keep install/runtime paths such as
|
|
52
|
+
// CODEX_MCP_NODE_PATH. Service credentials stay with the web service.
|
|
53
|
+
if (isOwnEnv(key) || /^(TELEGRAM|SLACK|DISCORD)_.*(TOKEN|SECRET|KEY)$/i.test(key) || /^CODEX_APP_TOOLS_/.test(key) || invokingSession.has(key) || key === "NODE_OPTIONS" || key === "NODE_PATH")
|
|
54
|
+
delete env[key];
|
|
55
|
+
}
|
|
56
|
+
return env;
|
|
57
|
+
}
|
|
58
|
+
/** Native app-server JSONL transport. It keeps Codex's normal config, tools and
|
|
59
|
+
* approval rules. There are no request/turn deadlines or automatic retries.
|
|
60
|
+
* Protocol: https://learn.chatgpt.com/docs/app-server (installed CLI schema).
|
|
61
|
+
*/
|
|
62
|
+
export function createCodexCodingProvider(options = {}) {
|
|
63
|
+
let child = null;
|
|
64
|
+
let container = null;
|
|
65
|
+
let initialization = null;
|
|
66
|
+
let shutdown = null;
|
|
67
|
+
let disconnected = null;
|
|
68
|
+
let closing = false;
|
|
69
|
+
let exited = false;
|
|
70
|
+
let resolveExit = null;
|
|
71
|
+
const didExit = new Promise(resolve => { resolveExit = resolve; });
|
|
72
|
+
const listeners = new Set();
|
|
73
|
+
const pending = new Map();
|
|
74
|
+
const incoming = new Set();
|
|
75
|
+
const descendants = new Map();
|
|
76
|
+
let ancestryUnknown = false;
|
|
77
|
+
const observationFailures = [];
|
|
78
|
+
const host = hostname();
|
|
79
|
+
// Bind the boot at creation, not when an old snapshot is requested later.
|
|
80
|
+
const bootId = currentBootId();
|
|
81
|
+
let nextId = 0;
|
|
82
|
+
let frameParts = [];
|
|
83
|
+
let frameBytes = 0;
|
|
84
|
+
const decoder = new TextDecoder("utf-8", { fatal: true });
|
|
85
|
+
function custody() {
|
|
86
|
+
const pid = child?.pid ?? null;
|
|
87
|
+
return {
|
|
88
|
+
pid, group: pid !== null && process.platform !== "win32",
|
|
89
|
+
descendants: [...descendants.values()].map(one => ({ ...one })),
|
|
90
|
+
observationUnknown: ancestryUnknown, host, bootId,
|
|
91
|
+
...(observationFailures.length === 0 ? {} : { observationFailures: observationFailures.map(one => ({ ...one })) }),
|
|
92
|
+
...(container === null ? {} : { container: { backend: container.backend, id: container.id, ...(container.identity === undefined ? {} : { identity: container.identity }) } }),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function custodyChanged() { emit({ kind: "custody", custody: custody() }); }
|
|
96
|
+
function emit(event) {
|
|
97
|
+
for (const listener of [...listeners]) {
|
|
98
|
+
try {
|
|
99
|
+
listener(event);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// A failed persistence/event consumer cannot silently drop an approval
|
|
103
|
+
// or part of the transcript while the agent continues to mutate files.
|
|
104
|
+
if (event.kind !== "exit")
|
|
105
|
+
fail("Codex updates could not be recorded. The session was disconnected; inspect its saved result.");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function disconnect(message) {
|
|
110
|
+
if (disconnected !== null)
|
|
111
|
+
return;
|
|
112
|
+
disconnected = new CodingProviderDisconnectedError(message);
|
|
113
|
+
for (const one of pending.values())
|
|
114
|
+
one.reject(disconnected);
|
|
115
|
+
pending.clear();
|
|
116
|
+
incoming.clear();
|
|
117
|
+
frameParts = [];
|
|
118
|
+
frameBytes = 0;
|
|
119
|
+
emit({ kind: "exit", message });
|
|
120
|
+
}
|
|
121
|
+
function fail(message) {
|
|
122
|
+
disconnect(message);
|
|
123
|
+
// Keep the rejected cleanup promise for close() to expose to the owner.
|
|
124
|
+
// The local catch only prevents an unhandled rejection in an event handler.
|
|
125
|
+
void close().catch(() => { });
|
|
126
|
+
}
|
|
127
|
+
function write(message) {
|
|
128
|
+
if (disconnected !== null)
|
|
129
|
+
throw disconnected;
|
|
130
|
+
if (closing || child?.stdin === null || child === null || child.stdin.destroyed)
|
|
131
|
+
throw new CodingProviderDisconnectedError();
|
|
132
|
+
let line;
|
|
133
|
+
try {
|
|
134
|
+
line = `${JSON.stringify(message)}\n`;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
throw new CodingProviderRequestError(-32602, "Codex request must contain JSON-serializable values.");
|
|
138
|
+
}
|
|
139
|
+
if (Buffer.byteLength(line) > MAX_FRAME_BYTES)
|
|
140
|
+
throw new CodingProviderRequestError(-32602, "Codex request exceeds the 16 MiB message limit.");
|
|
141
|
+
if (child.stdin.writableLength + Buffer.byteLength(line) > MAX_FRAME_BYTES * 2) {
|
|
142
|
+
throw new CodingProviderRequestError(-32001, "Codex is still receiving earlier requests. Wait before sending more.");
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
child.stdin.write(line, error => { if (error !== null && error !== undefined)
|
|
146
|
+
fail("Codex could not receive a request. Its outcome is unknown; inspect the saved session."); });
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
fail("Codex could not receive a request. Its outcome is unknown; inspect the saved session.");
|
|
150
|
+
throw disconnected;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function send(method, params) {
|
|
154
|
+
if (pending.size >= MAX_PENDING_REQUESTS)
|
|
155
|
+
return Promise.reject(new CodingProviderRequestError(-32001, "Too many pending Codex requests. Wait for a response."));
|
|
156
|
+
const id = nextId++;
|
|
157
|
+
return new Promise((resolve, reject) => {
|
|
158
|
+
pending.set(id, { resolve, reject });
|
|
159
|
+
try {
|
|
160
|
+
write({ id, method, params });
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
pending.delete(id);
|
|
164
|
+
reject(error);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
function receive(frame) {
|
|
169
|
+
let message;
|
|
170
|
+
try {
|
|
171
|
+
message = JSON.parse(decoder.decode(frame));
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
fail("Codex sent an invalid protocol message. The session was disconnected; inspect its saved result.");
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!object(message)) {
|
|
178
|
+
fail("Codex sent an invalid protocol message.");
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (own(message, "method")) {
|
|
182
|
+
if (typeof message.method !== "string" || message.method.length === 0 || own(message, "result") || own(message, "error") || (own(message, "params") && !object(message.params))) {
|
|
183
|
+
fail("Codex sent an invalid request or update.");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const params = (message.params ?? {});
|
|
187
|
+
if (!own(message, "id")) {
|
|
188
|
+
if (message.method === "serverRequest/resolved" && requestId(params.requestId))
|
|
189
|
+
incoming.delete(params.requestId);
|
|
190
|
+
emit({ kind: "notification", method: message.method, params });
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (!requestId(message.id) || incoming.has(message.id)) {
|
|
194
|
+
fail("Codex sent an invalid or duplicate request identifier.");
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (incoming.size >= MAX_PENDING_REQUESTS) {
|
|
198
|
+
fail("Codex sent too many unanswered requests. Inspect the saved session before continuing.");
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (listeners.size === 0) {
|
|
202
|
+
// An absent UI/consumer must never imply consent or leave a tool waiting
|
|
203
|
+
// indefinitely for an approval nobody can see.
|
|
204
|
+
write({ id: message.id, error: { code: -32601, message: "No client is available to handle this request." } });
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
incoming.add(message.id);
|
|
208
|
+
emit({ kind: "request", id: message.id, method: message.method, params });
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (!requestId(message.id) || own(message, "result") === own(message, "error") || own(message, "params")) {
|
|
212
|
+
fail("Codex sent an invalid response.");
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const request = pending.get(message.id);
|
|
216
|
+
if (request === undefined) {
|
|
217
|
+
fail("Codex sent a response for an unknown request.");
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (own(message, "error")) {
|
|
221
|
+
if (!object(message.error) || !Number.isSafeInteger(message.error.code) || typeof message.error.message !== "string") {
|
|
222
|
+
fail("Codex sent an invalid error response.");
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
pending.delete(message.id);
|
|
226
|
+
request.reject(new CodingProviderRequestError(message.error.code, message.error.message, message.error.data));
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
pending.delete(message.id);
|
|
230
|
+
request.resolve(message.result);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function read(chunk) {
|
|
234
|
+
if (disconnected !== null)
|
|
235
|
+
return;
|
|
236
|
+
let start = 0;
|
|
237
|
+
while (start < chunk.length && disconnected === null) {
|
|
238
|
+
const newline = chunk.indexOf(10, start);
|
|
239
|
+
const end = newline === -1 ? chunk.length : newline;
|
|
240
|
+
const part = chunk.subarray(start, end);
|
|
241
|
+
if (frameBytes + part.length > MAX_FRAME_BYTES) {
|
|
242
|
+
fail("Codex sent a message exceeding the 16 MiB limit. The session was disconnected; no message was truncated.");
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (part.length) {
|
|
246
|
+
frameParts.push(part);
|
|
247
|
+
frameBytes += part.length;
|
|
248
|
+
}
|
|
249
|
+
if (newline === -1)
|
|
250
|
+
return;
|
|
251
|
+
const frame = Buffer.concat(frameParts, frameBytes);
|
|
252
|
+
frameParts = [];
|
|
253
|
+
frameBytes = 0;
|
|
254
|
+
if (frame.length) {
|
|
255
|
+
try {
|
|
256
|
+
receive(frame);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
fail("Codex protocol handling failed. Inspect the saved session before continuing.");
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
start = newline + 1;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async function start() {
|
|
266
|
+
if (closing || disconnected !== null)
|
|
267
|
+
throw disconnected ?? new CodingProviderDisconnectedError("This Codex connection is closed.");
|
|
268
|
+
const made = createContainer(currentContainment(), "coding-session");
|
|
269
|
+
if ("refused" in made)
|
|
270
|
+
throw new CodingProviderRequestError(-32000, made.refused);
|
|
271
|
+
container = made.container;
|
|
272
|
+
const command = options.command ?? "codex";
|
|
273
|
+
const args = options.args ?? ["app-server", "--listen", "stdio://"];
|
|
274
|
+
let launch;
|
|
275
|
+
try {
|
|
276
|
+
launch = container?.launch(command, args);
|
|
277
|
+
child = spawn(launch?.file ?? command, launch?.args ?? args, {
|
|
278
|
+
...(options.cwd === undefined ? {} : { cwd: options.cwd }),
|
|
279
|
+
env: codingEnvironment(),
|
|
280
|
+
shell: false, windowsHide: true, detached: process.platform !== "win32",
|
|
281
|
+
stdio: ["pipe", "pipe", "pipe", ...(launch?.extraStdio ?? [])],
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
container?.release();
|
|
286
|
+
container = null;
|
|
287
|
+
throw new CodingProviderRequestError(-32000, "Codex could not start. Check that the Codex CLI is installed and the project directory exists.");
|
|
288
|
+
}
|
|
289
|
+
if (container === null) {
|
|
290
|
+
// The existing observer has no Windows ancestry backend. A plain root
|
|
291
|
+
// PID there cannot establish tool-process exit without a native job.
|
|
292
|
+
if (process.platform === "win32")
|
|
293
|
+
ancestryUnknown = true;
|
|
294
|
+
observeProcessTree(child, {
|
|
295
|
+
onDescendant: (pid, group) => { descendants.set(`${pid}:${group}`, { pid, group }); custodyChanged(); },
|
|
296
|
+
onDescendantExit: (pid, group) => { descendants.delete(`${pid}:${group}`); custodyChanged(); },
|
|
297
|
+
onObservationFailure: failure => { observationFailures.push({ ...failure }); custodyChanged(); },
|
|
298
|
+
onUnknown: () => { if (!ancestryUnknown) {
|
|
299
|
+
ancestryUnknown = true;
|
|
300
|
+
custodyChanged();
|
|
301
|
+
} },
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
child.stdout.on("data", read);
|
|
305
|
+
child.stdout.once("end", () => {
|
|
306
|
+
if (disconnected === null && !closing)
|
|
307
|
+
fail(frameBytes ? "Codex disconnected with an incomplete protocol message. The request outcome is unknown." : "Codex closed its connection. Inspect the saved session before continuing.");
|
|
308
|
+
});
|
|
309
|
+
// Drain diagnostics without retaining or forwarding paths, prompts or credentials.
|
|
310
|
+
child.stderr.resume();
|
|
311
|
+
child.stdin.on("error", () => fail("Codex input disconnected. The last request may have run; inspect the saved session."));
|
|
312
|
+
child.stdout.on("error", () => fail("Codex updates disconnected. Inspect the saved session before continuing."));
|
|
313
|
+
child.stderr.on("error", () => { });
|
|
314
|
+
child.once("error", () => fail("Codex could not start or its process failed. Check the installed CLI and project directory."));
|
|
315
|
+
child.once("exit", () => {
|
|
316
|
+
exited = true;
|
|
317
|
+
resolveExit();
|
|
318
|
+
if (!closing)
|
|
319
|
+
fail("Codex exited. The last request may have run; inspect the saved session before continuing.");
|
|
320
|
+
});
|
|
321
|
+
// Failed spawn emits close without exit.
|
|
322
|
+
child.once("close", () => { exited = true; resolveExit(); });
|
|
323
|
+
// Publish the owned handle before initialization can start a native task.
|
|
324
|
+
// Even a failed initialize must leave its process/container witness behind.
|
|
325
|
+
custodyChanged();
|
|
326
|
+
if (launch !== undefined && child.pid !== undefined) {
|
|
327
|
+
const attached = await launch.attach(child);
|
|
328
|
+
if (!attached.ok)
|
|
329
|
+
throw new CodingProviderRequestError(-32000, "Codex could not enter the required process container.");
|
|
330
|
+
}
|
|
331
|
+
await send("initialize", {
|
|
332
|
+
clientInfo: { name: "toolroll", title: "Toolroll", version: "0.4.3" },
|
|
333
|
+
capabilities: { experimentalApi: true },
|
|
334
|
+
});
|
|
335
|
+
write({ method: "initialized", params: {} });
|
|
336
|
+
}
|
|
337
|
+
async function waitForExit(milliseconds) {
|
|
338
|
+
if (exited)
|
|
339
|
+
return true;
|
|
340
|
+
let timer;
|
|
341
|
+
await Promise.race([didExit, new Promise(resolve => { timer = setTimeout(resolve, milliseconds); })]);
|
|
342
|
+
if (timer !== undefined)
|
|
343
|
+
clearTimeout(timer);
|
|
344
|
+
return exited;
|
|
345
|
+
}
|
|
346
|
+
async function stop() {
|
|
347
|
+
closing = true;
|
|
348
|
+
disconnect("Codex connection closed. Pending request outcomes must be checked in the saved session.");
|
|
349
|
+
const owned = child;
|
|
350
|
+
if (owned === null)
|
|
351
|
+
return;
|
|
352
|
+
sampleProcessTree(owned);
|
|
353
|
+
owned.stdin?.end();
|
|
354
|
+
if (!await waitForExit(EXIT_GRACE_MS)) {
|
|
355
|
+
sampleProcessTree(owned);
|
|
356
|
+
owned.kill("SIGTERM");
|
|
357
|
+
if (!await waitForExit(EXIT_GRACE_MS)) {
|
|
358
|
+
if (container !== null)
|
|
359
|
+
await container.kill();
|
|
360
|
+
else if (!stopProcessTree(owned))
|
|
361
|
+
owned.kill("SIGKILL");
|
|
362
|
+
await waitForExit(EXIT_GRACE_MS);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
let clean = exited;
|
|
366
|
+
if (container !== null) {
|
|
367
|
+
clean = await container.kill() && clean;
|
|
368
|
+
if (clean)
|
|
369
|
+
container.release();
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
// Root exit cannot prove escaped tool-process exit. Do not signal saved
|
|
373
|
+
// descendants after ancestry is lost or silently release session custody.
|
|
374
|
+
const absent = () => (owned.pid === undefined || !processMayBeAlive(owned.pid, process.platform !== "win32")) && [...descendants.values()].every(({ pid, group }) => !processMayBeAlive(pid, group));
|
|
375
|
+
const until = Date.now() + EXIT_GRACE_MS;
|
|
376
|
+
while (!ancestryUnknown && !absent() && Date.now() < until)
|
|
377
|
+
await new Promise(resolve => setTimeout(resolve, 25));
|
|
378
|
+
clean = clean && !ancestryUnknown && absent();
|
|
379
|
+
}
|
|
380
|
+
if (!clean)
|
|
381
|
+
throw new CodingProviderShutdownError();
|
|
382
|
+
owned.stdout?.destroy();
|
|
383
|
+
owned.stderr?.destroy();
|
|
384
|
+
}
|
|
385
|
+
function close() {
|
|
386
|
+
if (shutdown === null) {
|
|
387
|
+
closing = true;
|
|
388
|
+
// Assign before invoking callbacks: an exit listener may also call close.
|
|
389
|
+
shutdown = Promise.resolve().then(stop);
|
|
390
|
+
}
|
|
391
|
+
return shutdown;
|
|
392
|
+
}
|
|
393
|
+
return {
|
|
394
|
+
async request(method, params) {
|
|
395
|
+
if (typeof method !== "string" || method.length === 0 || method === "initialize" || method === "initialized" || !object(params))
|
|
396
|
+
throw new CodingProviderRequestError(-32602, "Choose a valid Codex request method and parameters.");
|
|
397
|
+
if (closing || disconnected !== null)
|
|
398
|
+
throw disconnected ?? new CodingProviderDisconnectedError("This Codex connection is closed.");
|
|
399
|
+
initialization ??= start().catch(error => { fail("Codex initialization failed. Check the installed CLI before opening another connection."); throw error; });
|
|
400
|
+
await initialization;
|
|
401
|
+
return send(method, params);
|
|
402
|
+
},
|
|
403
|
+
respond(id, result) {
|
|
404
|
+
if (!incoming.has(id))
|
|
405
|
+
throw new CodingProviderRequestError(-32600, "This Codex request is no longer waiting for a response.");
|
|
406
|
+
if (result === undefined)
|
|
407
|
+
throw new CodingProviderRequestError(-32602, "A Codex response must contain a result.");
|
|
408
|
+
write({ id, result });
|
|
409
|
+
incoming.delete(id);
|
|
410
|
+
},
|
|
411
|
+
reject(id, code, message) {
|
|
412
|
+
if (!incoming.has(id))
|
|
413
|
+
throw new CodingProviderRequestError(-32600, "This Codex request is no longer waiting for a response.");
|
|
414
|
+
if (!Number.isSafeInteger(code) || !message.trim())
|
|
415
|
+
throw new CodingProviderRequestError(-32602, "A Codex rejection must contain an error code and message.");
|
|
416
|
+
write({ id, error: { code, message } });
|
|
417
|
+
incoming.delete(id);
|
|
418
|
+
},
|
|
419
|
+
subscribe(listener) { listeners.add(listener); return () => { listeners.delete(listener); }; },
|
|
420
|
+
processId() { return child?.pid ?? null; },
|
|
421
|
+
custody,
|
|
422
|
+
close,
|
|
423
|
+
};
|
|
424
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CodingHandoffPreview } from './coding-handoff.js';
|
|
2
|
+
/** A reviewable handoff. The next screen retains the existing approval terms. */
|
|
3
|
+
export declare function codingShippingHtml(preview: CodingHandoffPreview, csrf: string, values?: URLSearchParams, error?: string): string;
|
|
4
|
+
export declare const CODING_SHIPPING_CSS = ".coding-workspace.coding-handoff{display:block;max-width:780px}.coding-handoff h1{margin-bottom:12px}.coding-handoff>p{margin-top:12px}.coding-workspace .coding-check{display:flex;align-items:center;gap:10px;min-height:44px}.coding-workspace .coding-check input{width:20px;height:20px;flex:0 0 20px}";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const escape = (value) => value.replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]));
|
|
2
|
+
/** A reviewable handoff. The next screen retains the existing approval terms. */
|
|
3
|
+
export function codingShippingHtml(preview, csrf, values, error) {
|
|
4
|
+
const hidden = (name, value) => `<input type="hidden" name="${name}" value="${escape(value)}">`;
|
|
5
|
+
const goal = values?.get('goal') ?? preview.title;
|
|
6
|
+
const criteria = values?.get('acceptance') ?? '';
|
|
7
|
+
const notice = error?.startsWith('Review screenshots are not ready.')
|
|
8
|
+
? `<p class="coding-notice" role="alert">Screenshots needed. Ask Codex to capture and commit them, then try again.</p><details><summary>Technical details</summary><p>${escape(error)}</p></details>`
|
|
9
|
+
: error ? `<p class="coding-notice" role="alert">${escape(error)}</p>` : '';
|
|
10
|
+
return `<section class="coding-workspace coding-handoff" data-coding-session=""><h1>Review for shipping</h1><p>${escape(preview.title)}</p>${notice}<form method="post" action="/code/${escape(preview.sessionId)}/ship" class="coding-start">${hidden('csrf', csrf)}${hidden('base', preview.base)}${hidden('candidate', preview.candidate)}${hidden('title', preview.title)}<label>Outcome<textarea name="goal" rows="4" required maxlength="16000">${escape(goal)}</textarea></label><label>Checks for review<textarea name="acceptance" rows="4" required maxlength="16000" placeholder="One observable result per line">${escape(criteria)}</textarea></label><label class="coding-check"><input type="checkbox" name="visual" value="yes"${values?.get('visual') === 'yes' ? ' checked' : ''}>Include desktop and phone screenshots</label><details><summary>${preview.changedPaths.length} changed files · commit ${escape(preview.candidate.slice(0, 8))}</summary><ul>${preview.changedPaths.map(path => `<li><code>${escape(path)}</code></li>`).join('')}</ul><p class="coding-meta">Review covers the complete change from ${escape(preview.base)} to ${escape(preview.candidate)}.</p></details><p class="coding-terms">Verification and publication use this project’s existing approval process.</p><button type="submit">Create review task</button></form><p><a href="/code/${escape(preview.sessionId)}">Back to coding</a></p></section>`;
|
|
11
|
+
}
|
|
12
|
+
export const CODING_SHIPPING_CSS = `.coding-workspace.coding-handoff{display:block;max-width:780px}.coding-handoff h1{margin-bottom:12px}.coding-handoff>p{margin-top:12px}.coding-workspace .coding-check{display:flex;align-items:center;gap:10px;min-height:44px}.coding-workspace .coding-check input{width:20px;height:20px;flex:0 0 20px}`;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { CodingContext } from './coding-context.js';
|
|
2
|
+
export type CodingStatus = 'starting' | 'ready' | 'working' | 'needs-input' | 'stopping' | 'interrupted' | 'failed' | 'uncertain' | 'closed';
|
|
3
|
+
export type CodingSession = {
|
|
4
|
+
id: string;
|
|
5
|
+
owner: string;
|
|
6
|
+
generation: number;
|
|
7
|
+
repo: string;
|
|
8
|
+
title: string;
|
|
9
|
+
provider: 'codex';
|
|
10
|
+
model: string | null;
|
|
11
|
+
branch: string;
|
|
12
|
+
base: string;
|
|
13
|
+
worktree: string;
|
|
14
|
+
nativeThreadId: string | null;
|
|
15
|
+
turnId: string | null;
|
|
16
|
+
status: CodingStatus;
|
|
17
|
+
error: string | null;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
updatedAt: string;
|
|
20
|
+
deliveryReviewRequired?: boolean;
|
|
21
|
+
initialRequest?: {
|
|
22
|
+
requestId: string;
|
|
23
|
+
prompt: string;
|
|
24
|
+
};
|
|
25
|
+
context?: CodingContext;
|
|
26
|
+
};
|
|
27
|
+
export type CodingItem = {
|
|
28
|
+
id: string;
|
|
29
|
+
type: string;
|
|
30
|
+
text: string;
|
|
31
|
+
status: string | null;
|
|
32
|
+
clientId?: string;
|
|
33
|
+
};
|
|
34
|
+
export type CodingQuestion = {
|
|
35
|
+
id: string;
|
|
36
|
+
header: string;
|
|
37
|
+
question: string;
|
|
38
|
+
options: {
|
|
39
|
+
label: string;
|
|
40
|
+
description: string;
|
|
41
|
+
}[];
|
|
42
|
+
};
|
|
43
|
+
export type CodingRequest = {
|
|
44
|
+
id: string;
|
|
45
|
+
kind: 'command' | 'files' | 'questions';
|
|
46
|
+
method: string;
|
|
47
|
+
title: string;
|
|
48
|
+
detail: string;
|
|
49
|
+
questions: CodingQuestion[];
|
|
50
|
+
};
|
|
51
|
+
export type CodingSnapshot = {
|
|
52
|
+
session: CodingSession;
|
|
53
|
+
items: CodingItem[];
|
|
54
|
+
requests: CodingRequest[];
|
|
55
|
+
revision: number;
|
|
56
|
+
};
|
|
57
|
+
export type CodingChanges = {
|
|
58
|
+
head: string;
|
|
59
|
+
status: string;
|
|
60
|
+
diff: string;
|
|
61
|
+
truncated: boolean;
|
|
62
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CodingSession, CodingSnapshot } from './coding-types.js';
|
|
2
|
+
export declare function codingWorkspaceHtml(input: {
|
|
3
|
+
projects: {
|
|
4
|
+
path: string;
|
|
5
|
+
name: string;
|
|
6
|
+
}[];
|
|
7
|
+
sessions: CodingSession[];
|
|
8
|
+
selected: CodingSnapshot | null;
|
|
9
|
+
csrf: string;
|
|
10
|
+
project: string | null;
|
|
11
|
+
error?: string;
|
|
12
|
+
draft?: string;
|
|
13
|
+
available: boolean;
|
|
14
|
+
owner?: string;
|
|
15
|
+
}): string;
|
|
16
|
+
export declare const CODING_CSS = "\n.coding-workspace{display:grid;grid-template-columns:224px minmax(0,1fr);gap:24px;max-width:1220px;min-width:0;margin:0 auto;overflow-wrap:anywhere}\n.coding-workspace *{box-sizing:border-box}.coding-workspace [hidden]{display:none!important}.coding-workspace h1{font-size:1.45rem;line-height:1.25;margin:0}.coding-workspace h2{font-size:1rem;margin:0}.coding-workspace h3{font-size:1rem;margin:0 0 12px}.coding-workspace p{margin:0 0 12px}.coding-main,.coding-sidebar{min-width:0}.coding-meta,.coding-workspace small{font-size:.83rem;color:var(--muted-foreground,#747981)}\n.coding-sidebar-top,.coding-header,.coding-state-row,.coding-actions{display:flex;align-items:center;gap:12px;justify-content:space-between}.coding-sidebar-top{margin-bottom:12px}.coding-header{align-items:flex-start;margin-bottom:16px}.coding-header .coding-meta{margin:6px 0 0}.coding-session-detail{max-width:220px}.coding-session-detail summary{font-size:.82rem}.coding-session-detail dl{font-size:.82rem}.coding-session-detail dt{font-weight:600;margin-top:8px}.coding-session-detail dd{margin:2px 0 0}.coding-state-row{flex-wrap:wrap;padding:10px 0;border-bottom:1px solid var(--border,#353940);margin-bottom:12px}.coding-state-row p{margin:0;font-weight:600}.coding-state-row form{margin:0}\n.coding-session-list{max-height:74vh;overflow:auto}.coding-sidebar ul{list-style:none;margin:0;padding:0;display:grid;gap:4px}.coding-sidebar nav a{display:block;padding:12px;border-radius:10px;text-decoration:none;color:inherit}.coding-sidebar nav a:hover,.coding-sidebar nav a[aria-current]{background:var(--muted,#22252a)}.coding-sidebar nav a[aria-current]{box-shadow:inset 3px 0 var(--primary,#90bfa7)}.coding-sidebar nav span,.coding-sidebar nav small{display:block}.coding-sidebar nav [data-coding-status-for]{display:inline}.coding-sidebar nav small{margin-top:5px}.coding-mobile-sessions{display:none}\n.coding-workspace form:not(.coding-state-row form){display:grid;gap:12px;margin:0}.coding-workspace label{display:grid;gap:6px;font-size:.9rem;font-weight:500}.coding-workspace input,.coding-workspace textarea,.coding-workspace select{width:100%;min-width:0;max-width:100%;font-size:16px;border:1px solid var(--border,#353940);border-radius:8px;padding:11px 12px;background:var(--background,#14161a);color:var(--foreground,#f0f1f3)}.coding-workspace textarea{resize:vertical;line-height:1.5}.coding-workspace input:focus-visible,.coding-workspace textarea:focus-visible,.coding-workspace select:focus-visible,.coding-workspace button:focus-visible,.coding-workspace summary:focus-visible,.coding-workspace a:focus-visible{outline:2px solid var(--ring,#79acff);outline-offset:3px}.coding-workspace button,.coding-link-button{min-height:44px;padding:10px 15px;white-space:nowrap;border-radius:8px;max-width:100%;font-size:.9rem}.coding-workspace button{justify-self:start;cursor:pointer}.coding-workspace button:disabled{cursor:default;opacity:.55}.coding-workspace .coding-secondary{background:transparent;color:inherit;border:1px solid var(--border,#353940)}.coding-link-button{display:inline-flex;align-items:center;justify-content:center;text-decoration:none;color:inherit;border:1px solid var(--border,#353940)}.coding-workspace summary{cursor:pointer;min-height:44px;padding:12px 0}.coding-actions{justify-content:flex-start;flex-wrap:wrap}.coding-start{max-width:680px}.coding-options label+label{margin-top:12px}.coding-terms{font-size:.9rem;line-height:1.6;margin:0!important}.coding-empty{padding:28px 0}\n.coding-notice{border:1px solid var(--destructive,#bd7674);border-radius:10px;padding:12px;line-height:1.5;margin-bottom:16px}.coding-conversation{max-height:min(58vh,640px);min-height:140px;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;padding:4px 10px 12px 0}.coding-message{padding:14px 0}.coding-message strong{display:block;font-size:.78rem;margin-bottom:7px;color:var(--muted-foreground,#747981)}.coding-user{margin:8px 0 8px 32px;padding:14px 16px;border-radius:12px;background:var(--muted,#22252a)}.coding-text{white-space:pre-wrap;line-height:1.6;overflow-wrap:anywhere}.coding-tool{border-bottom:1px solid var(--border,#353940);font-size:.88rem}.coding-workspace pre{white-space:pre-wrap;overflow-wrap:anywhere;max-width:100%;font-size:.8rem;line-height:1.5;margin:0 0 12px}.coding-tool summary{display:list-item}.coding-tool summary span{margin-left:6px}.coding-composer{border-top:1px solid var(--border,#353940);padding-top:14px;margin-top:8px!important}.coding-composer label{font-size:.83rem}.coding-request{border:1px solid var(--border,#353940);border-radius:12px;padding:16px;margin:12px 0}.coding-permission-detail{max-height:240px;overflow:auto}.coding-changes{margin-top:20px;border-top:1px solid var(--border,#353940)}.coding-changes pre{max-height:min(50dvh,480px);overflow:auto}.coding-change-meta{font-size:.8rem}.coding-workspace #coding-latest{margin:8px 0}.coding-workspace #coding-connection{line-height:1.4}\n.coding-workspace .coding-start>button[type=\"submit\"],.coding-workspace .coding-composer button[type=\"submit\"]{background:var(--primary,#171717);color:var(--primary-foreground,#fff);border:1px solid var(--primary,#171717);font-weight:600;box-shadow:none}.coding-workspace .coding-start>button[type=\"submit\"]:not(:disabled):hover,.coding-workspace .coding-composer button[type=\"submit\"]:not(:disabled):hover{filter:brightness(.9)}\n.coding-workspace:not([data-coding-session=\"\"]) .coding-main{display:flex;flex-direction:column;min-height:calc(100dvh - 180px)}.coding-main>.coding-header,.coding-main>.coding-state-row,.coding-main>#coding-requests,.coding-main>.coding-composer,.coding-main>.coding-changes,.coding-main>.coding-notice,.coding-main>#coding-connection{flex-shrink:0}.coding-workspace:not([data-coding-session=\"\"]) .coding-conversation{flex:1 1 120px;min-height:100px;max-height:min(58dvh,640px)}.coding-workspace .coding-tool{margin:4px 0;padding:0 10px;border-radius:8px}.coding-workspace .coding-session-detail{margin:0;padding:0 10px;flex-shrink:0}.coding-workspace .coding-changes{padding:0 12px;margin-top:12px}.coding-text strong{display:inline;font-size:inherit;color:inherit;margin:0;font-weight:600}.coding-composer textarea{min-height:72px;max-height:180px}\n@media(max-width:760px){.coding-workspace{grid-template-columns:minmax(0,1fr);gap:16px}.coding-sidebar{border-bottom:1px solid var(--border,#353940);padding-bottom:12px}.coding-sidebar-top h2,.coding-session-list{display:none}.coding-sidebar-top{float:right;margin:0 0 8px 12px}.coding-mobile-sessions{display:block;max-width:100%;margin:0}.coding-mobile-sessions>nav{max-height:260px;overflow:auto;clear:both}.coding-mobile-sessions>summary{min-height:44px}.coding-header{display:block}.coding-session-detail{max-width:none;margin-top:4px}.coding-session-detail summary{padding:10px 0}.coding-conversation{max-height:52vh;min-height:100px;padding-right:4px}.coding-user{margin-left:16px}.coding-workspace h1{font-size:1.25rem}.coding-workspace button,.coding-link-button{padding:10px 12px}.coding-start{max-width:none}}\n@media(max-width:760px){.coding-workspace:not([data-coding-session=\"\"]) .coding-main{min-height:calc(100dvh - 245px - env(safe-area-inset-bottom,0px))}.coding-workspace:not([data-coding-session=\"\"]) .coding-conversation{min-height:80px}.coding-header{display:flex;gap:12px}.coding-header>div{min-width:0;flex:1}.coding-header:has(.coding-session-detail[open]){flex-wrap:wrap}.coding-workspace .coding-session-detail{max-width:100px}.coding-workspace .coding-session-detail[open]{max-width:100%;flex-basis:100%}.coding-session-detail summary{white-space:nowrap}.coding-workspace .coding-mobile-sessions{padding:0 12px}.coding-composer{gap:8px!important}.coding-composer textarea{height:72px}.coding-state-row{padding:8px 0;margin-bottom:8px}}\n@media(prefers-reduced-motion:reduce){.coding-workspace *{scroll-behavior:auto!important}}\n";
|
|
17
|
+
export declare function codingWorkspaceScript(): string;
|