@open-mercato/cezar 0.13.0 → 0.14.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/README.md +3 -2
- package/dist/agent-config/catalog.d.ts +4 -0
- package/dist/agent-config/catalog.js +85 -3
- package/dist/agent-config/catalog.js.map +1 -1
- package/dist/agent-config/model-settings/copilot.d.ts +15 -0
- package/dist/agent-config/model-settings/copilot.js +25 -0
- package/dist/agent-config/model-settings/copilot.js.map +1 -0
- package/dist/agent-config/model-settings/junie.d.ts +12 -0
- package/dist/agent-config/model-settings/junie.js +18 -0
- package/dist/agent-config/model-settings/junie.js.map +1 -0
- package/dist/agent-config/models.js +4 -0
- package/dist/agent-config/models.js.map +1 -1
- package/dist/automations/prompts.d.ts +2 -2
- package/dist/automations/prompts.js +1 -1
- package/dist/automations/types.d.ts +12 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/contract/agent-config.d.ts +4 -0
- package/dist/contract/agent-profiles.d.ts +30 -0
- package/dist/contract/automations.d.ts +32 -0
- package/dist/contract/dashboard-insights.d.ts +186 -0
- package/dist/contract/dashboard.d.ts +88 -0
- package/dist/contract/dispatch.d.ts +6 -0
- package/dist/contract/health.d.ts +8 -0
- package/dist/contract/index.d.ts +2 -0
- package/dist/contract/index.js +249 -72
- package/dist/contract/runs.d.ts +144 -0
- package/dist/contract/self-update.d.ts +111 -2
- package/dist/contract/skills.d.ts +19 -0
- package/dist/contract/star-count.d.ts +18 -0
- package/dist/contract/workflows.d.ts +12 -0
- package/dist/contract/workspace.d.ts +42 -2
- package/dist/core/acp-client.d.ts +99 -0
- package/dist/core/acp-client.js +198 -0
- package/dist/core/acp-client.js.map +1 -0
- package/dist/core/acp-ui-mapper.d.ts +95 -0
- package/dist/core/acp-ui-mapper.js +444 -0
- package/dist/core/acp-ui-mapper.js.map +1 -0
- package/dist/core/agent-env.js +10 -0
- package/dist/core/agent-env.js.map +1 -1
- package/dist/core/agent-profiles.d.ts +10 -0
- package/dist/core/agent-profiles.js +16 -0
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/agent-runner.d.ts +5 -3
- package/dist/core/agent-runner.js +5 -3
- package/dist/core/agent-runner.js.map +1 -1
- package/dist/core/backend-detect.d.ts +3 -3
- package/dist/core/backend-detect.js +61 -2
- package/dist/core/backend-detect.js.map +1 -1
- package/dist/core/claude-cli-runner.d.ts +5 -2
- package/dist/core/claude-cli-runner.js +11 -6
- package/dist/core/claude-cli-runner.js.map +1 -1
- package/dist/core/claude-ui-mapper.d.ts +14 -0
- package/dist/core/claude-ui-mapper.js +102 -11
- package/dist/core/claude-ui-mapper.js.map +1 -1
- package/dist/core/codex-app-server-transport.js +8 -4
- package/dist/core/codex-app-server-transport.js.map +1 -1
- package/dist/core/copilot-acp-runner.d.ts +60 -0
- package/dist/core/copilot-acp-runner.js +528 -0
- package/dist/core/copilot-acp-runner.js.map +1 -0
- package/dist/core/copilot-ui-mapper.d.ts +47 -0
- package/dist/core/copilot-ui-mapper.js +111 -0
- package/dist/core/copilot-ui-mapper.js.map +1 -0
- package/dist/core/cursor-agent-runner.js +4 -4
- package/dist/core/cursor-agent-runner.js.map +1 -1
- package/dist/core/disclaim-spawn.d.ts +9 -0
- package/dist/core/disclaim-spawn.js +53 -0
- package/dist/core/disclaim-spawn.js.map +1 -0
- package/dist/core/junie-acp-transport.d.ts +58 -0
- package/dist/core/junie-acp-transport.js +179 -0
- package/dist/core/junie-acp-transport.js.map +1 -0
- package/dist/core/junie-auth-probe.d.ts +12 -0
- package/dist/core/junie-auth-probe.js +30 -0
- package/dist/core/junie-auth-probe.js.map +1 -0
- package/dist/core/junie-model-catalog.d.ts +10 -0
- package/dist/core/junie-model-catalog.js +104 -0
- package/dist/core/junie-model-catalog.js.map +1 -0
- package/dist/core/junie-runner.d.ts +45 -0
- package/dist/core/junie-runner.js +533 -0
- package/dist/core/junie-runner.js.map +1 -0
- package/dist/core/junie-ui-mapper.d.ts +132 -0
- package/dist/core/junie-ui-mapper.js +459 -0
- package/dist/core/junie-ui-mapper.js.map +1 -0
- package/dist/core/model-identity.js +17 -0
- package/dist/core/model-identity.js.map +1 -1
- package/dist/core/model-presets.js +10 -0
- package/dist/core/model-presets.js.map +1 -1
- package/dist/core/opencode-server-runner.js +4 -4
- package/dist/core/opencode-server-runner.js.map +1 -1
- package/dist/core/pi-runner.js +4 -4
- package/dist/core/pi-runner.js.map +1 -1
- package/dist/core/provider-auth.d.ts +16 -2
- package/dist/core/provider-auth.js +113 -7
- package/dist/core/provider-auth.js.map +1 -1
- package/dist/core/runner-factory.js +6 -0
- package/dist/core/runner-factory.js.map +1 -1
- package/dist/core/runner-model-catalog.js +12 -8
- package/dist/core/runner-model-catalog.js.map +1 -1
- package/dist/core/tool-display.js +6 -1
- package/dist/core/tool-display.js.map +1 -1
- package/dist/core/ui-events.d.ts +6 -2
- package/dist/git-diff-base.js +23 -2
- package/dist/git-diff-base.js.map +1 -1
- package/dist/git-worktree.d.ts +21 -2
- package/dist/git-worktree.js +68 -5
- package/dist/git-worktree.js.map +1 -1
- package/dist/index.js +14 -4
- package/dist/index.js.map +1 -1
- package/dist/paths.js +2 -0
- package/dist/paths.js.map +1 -1
- package/dist/runs/event-history.js +3 -0
- package/dist/runs/event-history.js.map +1 -1
- package/dist/runs/store.d.ts +42 -3
- package/dist/runs/store.js +112 -6
- package/dist/runs/store.js.map +1 -1
- package/dist/self-update/checkouts.d.ts +53 -0
- package/dist/self-update/checkouts.js +268 -0
- package/dist/self-update/checkouts.js.map +1 -0
- package/dist/self-update/cli.d.ts +5 -3
- package/dist/self-update/cli.js +75 -8
- package/dist/self-update/cli.js.map +1 -1
- package/dist/self-update/layout.d.ts +33 -1
- package/dist/self-update/layout.js +102 -3
- package/dist/self-update/layout.js.map +1 -1
- package/dist/self-update/pulls.d.ts +40 -0
- package/dist/self-update/pulls.js +127 -0
- package/dist/self-update/pulls.js.map +1 -0
- package/dist/self-update/service.d.ts +26 -3
- package/dist/self-update/service.js +85 -9
- package/dist/self-update/service.js.map +1 -1
- package/dist/server/dashboard.d.ts +107 -0
- package/dist/server/dashboard.js +2 -1
- package/dist/server/dashboard.js.map +1 -1
- package/dist/server/forge/github.js +4 -1
- package/dist/server/forge/github.js.map +1 -1
- package/dist/server/fs-browse.d.ts +3 -1
- package/dist/server/fs-browse.js +27 -5
- package/dist/server/fs-browse.js.map +1 -1
- package/dist/server/open-in-app.js +2 -0
- package/dist/server/open-in-app.js.map +1 -1
- package/dist/server/provider-action-gate.js +5 -1
- package/dist/server/provider-action-gate.js.map +1 -1
- package/dist/server/server.d.ts +880 -511
- package/dist/server/server.js +40 -5
- package/dist/server/server.js.map +1 -1
- package/dist/server/star-count.d.ts +67 -0
- package/dist/server/star-count.js +186 -0
- package/dist/server/star-count.js.map +1 -0
- package/dist/skills-banner.d.ts +19 -0
- package/dist/skills-banner.js +24 -0
- package/dist/skills-banner.js.map +1 -1
- package/dist/workflows/run.d.ts +0 -2
- package/dist/workflows/run.js +45 -29
- package/dist/workflows/run.js.map +1 -1
- package/dist/workflows/types.d.ts +6 -0
- package/dist/workspace/agent-accounts.d.ts +9 -1
- package/dist/workspace/agent-accounts.js +2 -0
- package/dist/workspace/agent-accounts.js.map +1 -1
- package/dist/workspace/agent-profiles.d.ts +2 -2
- package/dist/workspace/agent-profiles.js +25 -6
- package/dist/workspace/agent-profiles.js.map +1 -1
- package/dist/workspace/config.d.ts +9 -1
- package/dist/workspace/config.js +10 -3
- package/dist/workspace/config.js.map +1 -1
- package/dist/workspace/dashboard-insights.d.ts +42 -0
- package/dist/workspace/dashboard-insights.js +220 -0
- package/dist/workspace/dashboard-insights.js.map +1 -0
- package/dist/workspace/dashboard.d.ts +71 -1
- package/dist/workspace/dashboard.js +14 -1
- package/dist/workspace/dashboard.js.map +1 -1
- package/dist/workspace/semaphore.d.ts +3 -0
- package/dist/workspace/semaphore.js +8 -1
- package/dist/workspace/semaphore.js.map +1 -1
- package/package.json +3 -3
- package/scripts/mock-claude.mjs +34 -1
- package/scripts/mock-copilot-acp.mjs +190 -0
- package/scripts/mock-junie-acp.mjs +208 -0
- package/web/dist/assets/agent-task-pickers-BeQi-UTm.js +1 -0
- package/web/dist/assets/alert-dialog-CnRAuqwb.js +1 -0
- package/web/dist/assets/arrow-down-Da0kNRNH.js +1 -0
- package/web/dist/assets/arrow-left-BIZHhBIP.js +1 -0
- package/web/dist/assets/automation-format-CfPmkcsg.js +1 -0
- package/web/dist/assets/automations-route-AMJbFP53.js +1 -0
- package/web/dist/assets/centered-state-3r2Kaar_.js +1 -0
- package/web/dist/assets/chevron-left-DLAUPC66.js +1 -0
- package/web/dist/assets/chevron-right-KVZcXiPL.js +1 -0
- package/web/dist/assets/{circle-x-C9UoMP1V.js → circle-x-C0Jm5Ppb.js} +1 -1
- package/web/dist/assets/collapsible-DG_SIWqU.js +1 -0
- package/web/dist/assets/command-Dfln3D4A.js +1 -0
- package/web/dist/assets/{commit-list-BSfPsVsu.js → commit-list-_RA72yB_.js} +1 -1
- package/web/dist/assets/compare-variants-D6Ji6od4.js +1 -0
- package/web/dist/assets/dashboard-B3-tPimG.js +44 -0
- package/web/dist/assets/dialog-CiDREdUK.js +1 -0
- package/web/dist/assets/{diff-I0xowULh.js → diff-CxdyRumG.js} +2 -2
- package/web/dist/assets/diff-controls-DqJMMV4z.js +1 -0
- package/web/dist/assets/{diff-stat-yKn7joEr.js → diff-stat-Hupj4hxh.js} +1 -1
- package/web/dist/assets/{diff-view-DjvMeW1M.js → diff-view-BBYT5k6c.js} +1 -1
- package/web/dist/assets/dist-BqMwqJFX.js +1 -0
- package/web/dist/assets/dist-DpiX6WjA.js +1 -0
- package/web/dist/assets/{download-BcgZ2yk4.js → download-BR7EN9gW.js} +1 -1
- package/web/dist/assets/dropdown-menu-Ci4HFML0.js +1 -0
- package/web/dist/assets/editable-title-DDtUgRKZ.js +1 -0
- package/web/dist/assets/{ellipsis-vertical-g4O4NlLV.js → ellipsis-vertical-DBklom4U.js} +1 -1
- package/web/dist/assets/facet-filter-CfI4QvOd.js +1 -0
- package/web/dist/assets/{file-wXNeZwi7.js → file-CZb7cKNH.js} +1 -1
- package/web/dist/assets/{file-text-DV1gE2L6.js → file-text-Dm6CrEGW.js} +1 -1
- package/web/dist/assets/{folder-wjVId5un.js → folder-zQj-FYOo.js} +1 -1
- package/web/dist/assets/{git-pull-request-BBEDdTLK.js → git-pull-request-AhwzJc7s.js} +1 -1
- package/web/dist/assets/git-toolbar-j7gKkhGL.js +1 -0
- package/web/dist/assets/github-De-DFy8s.js +1 -0
- package/web/dist/assets/{image-preview-u1f-wzxC.js → image-preview-Dd3NVB7N.js} +1 -1
- package/web/dist/assets/index-HS1hr5Sz.js +12 -0
- package/web/dist/assets/index-YwgrLyBj.css +2 -0
- package/web/dist/assets/loader-circle-sk4vKJKp.js +1 -0
- package/web/dist/assets/{markdown-Bnm47qUl.js → markdown-DjNR-1p8.js} +2 -2
- package/web/dist/assets/new-task-form-vLs2G1_z.js +1 -0
- package/web/dist/assets/picker-pill-VW-M1ZiV.js +1 -0
- package/web/dist/assets/{pill-7dm3vWF7.js → pill-CPl6sysj.js} +1 -1
- package/web/dist/assets/popover-CNGONAql.js +1 -0
- package/web/dist/assets/project-router-dCZQu1wQ.js +1 -0
- package/web/dist/assets/{prompt-templates-BMZ5q5H_.js → prompt-templates-jNjVTAws.js} +1 -1
- package/web/dist/assets/{refresh-cw-C69euZ2H.js → refresh-cw-BfkEydKA.js} +1 -1
- package/web/dist/assets/repo-git-BZWZ6_pR.js +1 -0
- package/web/dist/assets/{run-diff-CoNVGn23.js → run-diff-u_roDsAJ.js} +2 -2
- package/web/dist/assets/run-header-Br1yJR0m.js +1 -0
- package/web/dist/assets/{search-x-BNLFOxI6.js → search-x-CT0NTqK1.js} +1 -1
- package/web/dist/assets/segmented-IDD4ucht.js +1 -0
- package/web/dist/assets/skills-Dsi5YdLG.js +1 -0
- package/web/dist/assets/{sparkles-ChorK-gZ.js → sparkles-CvOeAoyJ.js} +1 -1
- package/web/dist/assets/{square-terminal-C7KCPznz.js → square-terminal-eSs8YYZe.js} +1 -1
- package/web/dist/assets/{tab-link-E5O2Cesc.js → tab-link-CPF6ORha.js} +1 -1
- package/web/dist/assets/task-changes-DIT9Y1rh.js +1 -0
- package/web/dist/assets/task-commits-B4VvdiHH.js +1 -0
- package/web/dist/assets/task-files-BMm9C0DW.js +2 -0
- package/web/dist/assets/task-thread-RXabJAt0.js +9 -0
- package/web/dist/assets/{textarea-DLAfWPb0.js → textarea-DtBqPhIs.js} +1 -1
- package/web/dist/assets/thread-loading-Dnxb6Ar-.js +1 -0
- package/web/dist/assets/toaster-CfRVb8vH.js +43 -0
- package/web/dist/assets/token-metrics-DldVlr6m.js +1 -0
- package/web/dist/assets/tooltip-_O50N3pt.js +1 -0
- package/web/dist/assets/tracker-J0fdcH1G.js +4 -0
- package/web/dist/assets/{trash-2-_vwSMdPG.js → trash-2-CUH7GOVh.js} +1 -1
- package/web/dist/assets/{triangle-alert-fBRUkB46.js → triangle-alert-D5K_zyD3.js} +1 -1
- package/web/dist/assets/{upload-B4OIpdyq.js → upload-D7_n-9cl.js} +1 -1
- package/web/dist/assets/{use-now-sqAvRMna.js → use-now-3lElDuTi.js} +1 -1
- package/web/dist/assets/utils-BXvEm7Ve.js +64 -0
- package/web/dist/assets/workflows-D-dx9c_0.js +7 -0
- package/web/dist/assets/x-kLybIvX4.js +1 -0
- package/web/dist/assets/{zoomable-image-X81SApIg.js → zoomable-image-CnyQ9wyw.js} +1 -1
- package/web/dist/index.html +38 -36
- package/web/dist/assets/agent-task-pickers-DQ1qvgrD.js +0 -1
- package/web/dist/assets/alert-dialog-B_2uU4Bg.js +0 -1
- package/web/dist/assets/arrow-down-DieVZxSE.js +0 -1
- package/web/dist/assets/arrow-left-C8M0efjn.js +0 -1
- package/web/dist/assets/automation-format-CzinzpHK.js +0 -1
- package/web/dist/assets/automations-route-DYHUjV9R.js +0 -1
- package/web/dist/assets/centered-state-DJLgwvA4.js +0 -43
- package/web/dist/assets/chevron-left-BhXrOEE3.js +0 -1
- package/web/dist/assets/chevron-right-B3Ta8VKK.js +0 -1
- package/web/dist/assets/collapsible-BcKvItwg.js +0 -1
- package/web/dist/assets/command-BvGGv2_u.js +0 -1
- package/web/dist/assets/compare-variants-DBvMYMs3.js +0 -1
- package/web/dist/assets/dashboard-CGaFh4RV.js +0 -44
- package/web/dist/assets/dialog-B6NgKh0-.js +0 -1
- package/web/dist/assets/diff-controls-DskkZqmD.js +0 -1
- package/web/dist/assets/dist-BvXEdcbG.js +0 -1
- package/web/dist/assets/dist-CTksUkKh.js +0 -1
- package/web/dist/assets/dropdown-menu-B7HeKCfN.js +0 -1
- package/web/dist/assets/editable-title-BHbHmSIK.js +0 -1
- package/web/dist/assets/facet-filter-DZ3wfvN9.js +0 -1
- package/web/dist/assets/git-toolbar-EZuX4Cuz.js +0 -1
- package/web/dist/assets/github-zcLRxv77.js +0 -1
- package/web/dist/assets/index-BrZhA4_u.css +0 -2
- package/web/dist/assets/index-CSNFuBvj.js +0 -12
- package/web/dist/assets/loader-circle-Cwgo6onL.js +0 -1
- package/web/dist/assets/new-task-form-CQODCzBP.js +0 -1
- package/web/dist/assets/picker-pill-DNB9ETjS.js +0 -1
- package/web/dist/assets/popover-BRq6QnwI.js +0 -1
- package/web/dist/assets/project-router-I8Pbsrxy.js +0 -1
- package/web/dist/assets/repo-git-G436Abni.js +0 -1
- package/web/dist/assets/run-header-CxdaA86t.js +0 -1
- package/web/dist/assets/skills-C_kBDesq.js +0 -1
- package/web/dist/assets/task-changes-Bhw4Ysvg.js +0 -1
- package/web/dist/assets/task-commits-DBuGXuGm.js +0 -1
- package/web/dist/assets/task-files-CYDbeffM.js +0 -2
- package/web/dist/assets/task-thread-RuxHMJgN.js +0 -9
- package/web/dist/assets/thread-loading-BAuVAbcA.js +0 -1
- package/web/dist/assets/token-metrics-rVl4kXe_.js +0 -1
- package/web/dist/assets/tooltip-Bdl8mQG8.js +0 -1
- package/web/dist/assets/tracker-DJ8JW59-.js +0 -4
- package/web/dist/assets/utils-DoBmOlX3.js +0 -64
- package/web/dist/assets/workflows-C54D7mlm.js +0 -7
- package/web/dist/assets/x-HXr9KZBr.js +0 -1
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from 'node:child_process';
|
|
2
|
+
import { dirname, resolve as resolvePath } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { isSignalTerminationExit, prependSystemPrompt, trackChildExit, } from './agent-runner.js';
|
|
5
|
+
import { buildChildEnv } from './agent-env.js';
|
|
6
|
+
import { AcpClient } from './acp-client.js';
|
|
7
|
+
import { abortAcpTurn, endAcpReplay, mapAcpFrame } from './acp-ui-mapper.js';
|
|
8
|
+
import { EOF_KILL_GRACE_MS, EOF_TERM_GRACE_MS } from './claude-cli-runner.js';
|
|
9
|
+
import { COPILOT_AUTH_FAILURE_MESSAGE, copilotDialect, createCopilotUiState, isCopilotAuthFailure, } from './copilot-ui-mapper.js';
|
|
10
|
+
const DEFAULT_TIMEOUT_MS = 30 * 60_000;
|
|
11
|
+
/** `initialize` / `session/new` / `session/load` are handshakes: bounded, unlike a prompt. */
|
|
12
|
+
const HANDSHAKE_TIMEOUT_MS = 90_000;
|
|
13
|
+
/**
|
|
14
|
+
* How long to wait for the end of a `session/load` replay (`available_commands_update`) before
|
|
15
|
+
* prompting anyway. Whether Copilot replays a loaded session's history at all is **unverified**
|
|
16
|
+
* (no entitled credential was available — see `__fixtures__/copilot/README.md`), so this is a
|
|
17
|
+
* bound, not an expectation: an agent that never sends the marker costs one 5s wait on resume.
|
|
18
|
+
*/
|
|
19
|
+
const REPLAY_WAIT_MS = 5_000;
|
|
20
|
+
const AUTO_END_DELAY_MS = 250;
|
|
21
|
+
/**
|
|
22
|
+
* GitHub Copilot CLI over the Agent Client Protocol (#582, spec
|
|
23
|
+
* `2026-09-19-runner-seam-native-backends` Phase 3): one long-lived `copilot --acp` child and one
|
|
24
|
+
* ACP session per cezar session. Follow-ups are further `session/prompt` calls on the same
|
|
25
|
+
* process; Continue resumes with `session/load`.
|
|
26
|
+
*
|
|
27
|
+
* The wire was verified against `@github/copilot` 1.0.88 — the record is
|
|
28
|
+
* `.ai/runs/2026-09-27-copilot-cli-runner/copilot-acp-notes.md` and the fixtures are
|
|
29
|
+
* `__fixtures__/copilot/`. Permissions are `auto` only (spec Q15): the child starts with
|
|
30
|
+
* `--allow-all-tools`, and a `session/request_permission` that still arrives is auto-approved with
|
|
31
|
+
* a note, so no request can park a run nothing is able to wake.
|
|
32
|
+
*/
|
|
33
|
+
export class CopilotAcpRunner {
|
|
34
|
+
backend = 'copilot';
|
|
35
|
+
bin;
|
|
36
|
+
timeoutMs;
|
|
37
|
+
lastSession = null;
|
|
38
|
+
constructor(opts = {}) {
|
|
39
|
+
this.bin =
|
|
40
|
+
opts.bin ?? process.env.CEZ_COPILOT_BIN ?? (process.env.CEZ_DRY_RUN === '1' ? mockCopilotPath() : 'copilot');
|
|
41
|
+
this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
42
|
+
}
|
|
43
|
+
run(spec, onEvent) {
|
|
44
|
+
return this.startSession(spec, onEvent, { autoEndAfterFirstTurn: true }).result;
|
|
45
|
+
}
|
|
46
|
+
async interrupt() {
|
|
47
|
+
this.lastSession?.interrupt();
|
|
48
|
+
}
|
|
49
|
+
startSession(spec, onEvent, opts = {}) {
|
|
50
|
+
const session = new CopilotAcpSession(this.bin, this.backend, spec, spec.timeoutMs ?? this.timeoutMs, onEvent, opts);
|
|
51
|
+
this.lastSession = session;
|
|
52
|
+
return session;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The CLI flags for one run. Every one is from `copilot --help` on 1.0.88 (see the notes):
|
|
57
|
+
*
|
|
58
|
+
* - `--acp` starts the ACP server on stdio. There is **no `--stdio` flag** — the spec's
|
|
59
|
+
* `copilot --acp --stdio` was wrong, and passing it makes the CLI exit on an unknown option.
|
|
60
|
+
* - `--allow-all-tools` is the `auto` permission mode (Q15). The **flag**, deliberately, not
|
|
61
|
+
* `COPILOT_ALLOW_ALL=true`: set to exactly `"true"` that variable *also* trusts the working
|
|
62
|
+
* directory, which loads its skills, plugins, MCP servers and hooks — including hooks that run
|
|
63
|
+
* shell commands. A cezar worktree is a checkout of someone else's branch; that is not a trust
|
|
64
|
+
* decision this runner gets to make.
|
|
65
|
+
* - `--no-auto-update` because a CLI that swaps itself out mid-task is not reproducible, and the
|
|
66
|
+
* download is not something a run should pay for.
|
|
67
|
+
* - `--add-dir` carries `AgentRunSpec.additionalDirectories`; the session cwd is the spawn cwd.
|
|
68
|
+
*
|
|
69
|
+
* `spec.allowedTools` / `spec.bashAllowlist` are NOT translated to `--allow-tool` / `--deny-tool`.
|
|
70
|
+
* Permission modes are out of scope for this phase (Q15), and a partial mapping would look like a
|
|
71
|
+
* sandbox while behaving like `--allow-all-tools`, which is worse than the honest version.
|
|
72
|
+
*/
|
|
73
|
+
export function buildCopilotArgs(spec) {
|
|
74
|
+
const args = ['--acp', '--allow-all-tools', '--no-auto-update'];
|
|
75
|
+
if (spec.model)
|
|
76
|
+
args.push('--model', spec.model);
|
|
77
|
+
for (const dir of spec.additionalDirectories ?? [])
|
|
78
|
+
args.push('--add-dir', dir);
|
|
79
|
+
return args;
|
|
80
|
+
}
|
|
81
|
+
/** The per-run environment: `buildChildEnv`'s least-privilege set for this backend. Copilot's own
|
|
82
|
+
* `COPILOT_` family and the shared `gh` names are what `agent-env.ts` already allows it. */
|
|
83
|
+
export function buildCopilotEnv(backend, extraEnv) {
|
|
84
|
+
return buildChildEnv({ backend, extraEnv });
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* A cezar-authored line for an exit outside a prompt.
|
|
88
|
+
*
|
|
89
|
+
* Copilot's exit codes are **not documented and were not verified**, so — unlike the Gemini
|
|
90
|
+
* runner, which can name 41/52/55 — this reports the code and the tail of stderr rather than
|
|
91
|
+
* inventing meanings. The one case worth translating is an authentication failure, because that
|
|
92
|
+
* wording is what raises `provider-auth-required`.
|
|
93
|
+
*/
|
|
94
|
+
export function copilotExitMessage(exitCode, stderr) {
|
|
95
|
+
if (isCopilotAuthFailure(stderr))
|
|
96
|
+
return COPILOT_AUTH_FAILURE_MESSAGE;
|
|
97
|
+
const detail = stderr.trim().split('\n').slice(-3).join(' | ');
|
|
98
|
+
return `Copilot CLI exited with code ${exitCode}${detail ? ` — ${truncate(detail, 400)}` : ''}`;
|
|
99
|
+
}
|
|
100
|
+
class CopilotAcpSession {
|
|
101
|
+
spec;
|
|
102
|
+
limitMs;
|
|
103
|
+
onEvent;
|
|
104
|
+
opts;
|
|
105
|
+
result;
|
|
106
|
+
pid;
|
|
107
|
+
child;
|
|
108
|
+
client;
|
|
109
|
+
hasExited;
|
|
110
|
+
ui = createCopilotUiState();
|
|
111
|
+
acpSessionId;
|
|
112
|
+
loadSupported = false;
|
|
113
|
+
imagesSupported = false;
|
|
114
|
+
isOpen = true;
|
|
115
|
+
turnInFlight = false;
|
|
116
|
+
turnsCompleted = 0;
|
|
117
|
+
queue = [];
|
|
118
|
+
terminatedByCezar = false;
|
|
119
|
+
timedOut = false;
|
|
120
|
+
failed = null;
|
|
121
|
+
replayDone = null;
|
|
122
|
+
textChunks = [];
|
|
123
|
+
toolCalls = [];
|
|
124
|
+
tokensUsed = 0;
|
|
125
|
+
stderr = [];
|
|
126
|
+
spawnError = null;
|
|
127
|
+
autoEndTimer;
|
|
128
|
+
timers = [];
|
|
129
|
+
constructor(bin, backend, spec, limitMs, onEvent, opts) {
|
|
130
|
+
this.spec = spec;
|
|
131
|
+
this.limitMs = limitMs;
|
|
132
|
+
this.onEvent = onEvent;
|
|
133
|
+
this.opts = opts;
|
|
134
|
+
this.child = nodeSpawn(bin, buildCopilotArgs(spec), { cwd: spec.cwd, env: buildCopilotEnv(backend, spec.env) });
|
|
135
|
+
this.pid = this.child.pid;
|
|
136
|
+
this.hasExited = trackChildExit(this.child);
|
|
137
|
+
this.child.on('error', (error) => {
|
|
138
|
+
this.spawnError =
|
|
139
|
+
error.code === 'ENOENT'
|
|
140
|
+
? new Error(`\`${bin}\` not found on PATH — install GitHub Copilot CLI (npm i -g @github/copilot) and run \`copilot login\``)
|
|
141
|
+
: error;
|
|
142
|
+
});
|
|
143
|
+
this.child.stderr.setEncoding('utf8');
|
|
144
|
+
this.child.stderr.on('data', (chunk) => this.stderr.push(chunk));
|
|
145
|
+
this.client = new AcpClient(this.child.stdin, this.child.stdout, {
|
|
146
|
+
onFrame: (dir, frame) => this.onFrame(dir, frame),
|
|
147
|
+
onRequest: (request) => this.onRequest(request),
|
|
148
|
+
onUnparseable: (line) => this.emit({ type: 'note', message: `copilot: skipped unparseable ACP line: ${truncate(line, 200)}` }),
|
|
149
|
+
});
|
|
150
|
+
if (this.limitMs > 0) {
|
|
151
|
+
const deadline = setTimeout(() => {
|
|
152
|
+
this.timedOut = true;
|
|
153
|
+
this.interrupt();
|
|
154
|
+
}, this.limitMs);
|
|
155
|
+
deadline.unref?.();
|
|
156
|
+
this.timers.push(deadline);
|
|
157
|
+
}
|
|
158
|
+
this.result = this.lifecycle();
|
|
159
|
+
}
|
|
160
|
+
get open() {
|
|
161
|
+
return this.isOpen;
|
|
162
|
+
}
|
|
163
|
+
sendMessage(content) {
|
|
164
|
+
if (!this.isOpen || this.client.closed)
|
|
165
|
+
return false;
|
|
166
|
+
if (this.autoEndTimer) {
|
|
167
|
+
clearTimeout(this.autoEndTimer);
|
|
168
|
+
this.autoEndTimer = undefined;
|
|
169
|
+
}
|
|
170
|
+
// ACP has no steering: a message sent mid-turn waits for the turn to end, in order.
|
|
171
|
+
this.queue.push(this.toAcp(content));
|
|
172
|
+
this.pump();
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
end() {
|
|
176
|
+
if (!this.isOpen)
|
|
177
|
+
return;
|
|
178
|
+
this.isOpen = false;
|
|
179
|
+
this.terminate(false);
|
|
180
|
+
}
|
|
181
|
+
interrupt() {
|
|
182
|
+
if (this.acpSessionId && this.turnInFlight)
|
|
183
|
+
this.client.cancel(this.acpSessionId);
|
|
184
|
+
this.isOpen = false;
|
|
185
|
+
this.terminate(true);
|
|
186
|
+
}
|
|
187
|
+
// ---- lifecycle ------------------------------------------------------------------------
|
|
188
|
+
async lifecycle() {
|
|
189
|
+
const reading = this.client.run();
|
|
190
|
+
const exited = waitForExit(this.child);
|
|
191
|
+
try {
|
|
192
|
+
await this.bootstrap();
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
// An agent that went away mid-handshake is explained by its exit, read below — not by the
|
|
196
|
+
// transport's "closed" rejection.
|
|
197
|
+
if (!this.spawnError && !this.client.closed)
|
|
198
|
+
this.fail(error instanceof Error ? error.message : String(error));
|
|
199
|
+
this.terminate(false);
|
|
200
|
+
}
|
|
201
|
+
await reading;
|
|
202
|
+
const exitCode = await exited;
|
|
203
|
+
for (const timer of this.timers)
|
|
204
|
+
clearTimeout(timer);
|
|
205
|
+
if (this.autoEndTimer)
|
|
206
|
+
clearTimeout(this.autoEndTimer);
|
|
207
|
+
this.isOpen = false;
|
|
208
|
+
if (this.spawnError)
|
|
209
|
+
throw this.spawnError;
|
|
210
|
+
if (this.turnInFlight) {
|
|
211
|
+
// The agent died with a prompt unanswered: the transport rejected it, the wire never will.
|
|
212
|
+
this.turnInFlight = false;
|
|
213
|
+
if (this.timedOut)
|
|
214
|
+
this.applyUi(abortAcpTurn(this.ui, copilotDialect, 'timeout'));
|
|
215
|
+
else if (this.terminatedByCezar)
|
|
216
|
+
this.applyUi(abortAcpTurn(this.ui, copilotDialect, 'cancelled'));
|
|
217
|
+
else {
|
|
218
|
+
const reason = copilotExitMessage(exitCode, this.stderrText());
|
|
219
|
+
this.applyUi(abortAcpTurn(this.ui, copilotDialect, 'error', reason));
|
|
220
|
+
this.fail(reason);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const summary = () => ({
|
|
224
|
+
text: this.textChunks.join('').trim(),
|
|
225
|
+
toolCalls: this.toolCalls,
|
|
226
|
+
tokensUsed: this.tokensUsed,
|
|
227
|
+
...(this.acpSessionId ? { sessionId: this.acpSessionId } : {}),
|
|
228
|
+
});
|
|
229
|
+
if (this.timedOut) {
|
|
230
|
+
const minutes = Math.round((this.limitMs / 60_000) * 10) / 10;
|
|
231
|
+
this.emit({ type: 'error', message: `Copilot CLI timed out after ${minutes}m and was killed` });
|
|
232
|
+
this.emit({ type: 'done' });
|
|
233
|
+
return summary();
|
|
234
|
+
}
|
|
235
|
+
if (this.failed) {
|
|
236
|
+
this.opts.onUiEvent?.({ type: 'session.ended', reason: 'error' });
|
|
237
|
+
this.emit({ type: 'done' });
|
|
238
|
+
return summary();
|
|
239
|
+
}
|
|
240
|
+
if (!this.acpSessionId && !this.terminatedByCezar && (exitCode === 0 || exitCode === null)) {
|
|
241
|
+
this.fail('Copilot CLI exited before it started a session');
|
|
242
|
+
this.opts.onUiEvent?.({ type: 'session.ended', reason: 'error' });
|
|
243
|
+
this.emit({ type: 'done' });
|
|
244
|
+
return summary();
|
|
245
|
+
}
|
|
246
|
+
if (exitCode !== 0 && exitCode !== null) {
|
|
247
|
+
if (this.terminatedByCezar && (isSignalTerminationExit(exitCode) || exitCode === 1)) {
|
|
248
|
+
this.emit({ type: 'note', message: `Copilot CLI exited ${exitCode} after cezar stopped it` });
|
|
249
|
+
}
|
|
250
|
+
else if (!this.terminatedByCezar) {
|
|
251
|
+
const message = copilotExitMessage(exitCode, this.stderrText());
|
|
252
|
+
this.emit({ type: 'error', message });
|
|
253
|
+
throw new Error(message);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (this.tokensUsed === 0 && this.turnsCompleted > 0) {
|
|
257
|
+
this.emit({ type: 'note', message: 'token usage not reported by Copilot CLI' });
|
|
258
|
+
}
|
|
259
|
+
this.opts.onUiEvent?.({ type: 'session.ended', reason: this.terminatedByCezar && this.turnsCompleted === 0 ? 'cancelled' : 'end_turn' });
|
|
260
|
+
this.emit({ type: 'done' });
|
|
261
|
+
return summary();
|
|
262
|
+
}
|
|
263
|
+
async bootstrap() {
|
|
264
|
+
const init = await this.client.initialize(HANDSHAKE_TIMEOUT_MS);
|
|
265
|
+
const caps = isRecord(init.agentCapabilities) ? init.agentCapabilities : {};
|
|
266
|
+
this.loadSupported = caps.loadSession === true;
|
|
267
|
+
this.imagesSupported = isRecord(caps.promptCapabilities) && caps.promptCapabilities.image === true;
|
|
268
|
+
let resumed = false;
|
|
269
|
+
if (this.spec.resume && this.spec.sessionId) {
|
|
270
|
+
if (this.loadSupported) {
|
|
271
|
+
const replayEnded = new Promise((resolve) => {
|
|
272
|
+
this.replayDone = resolve;
|
|
273
|
+
});
|
|
274
|
+
try {
|
|
275
|
+
await this.client.loadSession(this.spec.sessionId, this.spec.cwd, HANDSHAKE_TIMEOUT_MS);
|
|
276
|
+
this.acpSessionId = this.spec.sessionId;
|
|
277
|
+
resumed = true;
|
|
278
|
+
await Promise.race([replayEnded, delay(REPLAY_WAIT_MS)]);
|
|
279
|
+
this.ui = endAcpReplay(this.ui);
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
this.replayDone = null;
|
|
283
|
+
this.ui = endAcpReplay(this.ui);
|
|
284
|
+
this.emit({
|
|
285
|
+
type: 'note',
|
|
286
|
+
message: `Copilot could not resume session ${this.spec.sessionId} (${error instanceof Error ? error.message : String(error)}) — starting a fresh session`,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
this.emit({ type: 'note', message: 'Copilot CLI does not advertise session/load — starting a fresh session' });
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (!this.acpSessionId) {
|
|
295
|
+
const created = await this.client.newSession(this.spec.cwd, HANDSHAKE_TIMEOUT_MS).catch((error) => {
|
|
296
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
297
|
+
throw new Error(isCopilotAuthFailure(`${message}\n${this.stderrText()}`)
|
|
298
|
+
? COPILOT_AUTH_FAILURE_MESSAGE
|
|
299
|
+
: `Copilot CLI could not start a session: ${message}`);
|
|
300
|
+
});
|
|
301
|
+
const id = typeof created.sessionId === 'string' ? created.sessionId : undefined;
|
|
302
|
+
if (!id)
|
|
303
|
+
throw new Error('Copilot CLI answered session/new without a sessionId');
|
|
304
|
+
this.acpSessionId = id;
|
|
305
|
+
}
|
|
306
|
+
else if (resumed && this.spec.model) {
|
|
307
|
+
// `--model` only reaches a session this process CREATED; a loaded one keeps the model it was
|
|
308
|
+
// saved with, so a run whose model changed between turns (#954) has to say so. Copilot's
|
|
309
|
+
// `session/load` result shape is unverified, so this asks unconditionally rather than
|
|
310
|
+
// comparing against a field that may not be there.
|
|
311
|
+
await this.client.setModel(this.acpSessionId, this.spec.model, HANDSHAKE_TIMEOUT_MS).catch((error) => {
|
|
312
|
+
this.emit({
|
|
313
|
+
type: 'note',
|
|
314
|
+
message: `Copilot kept its own model: session/set_model failed (${error instanceof Error ? error.message : String(error)})`,
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
this.emit({ type: 'session', sessionId: this.acpSessionId });
|
|
319
|
+
const first = [
|
|
320
|
+
...(this.spec.images ?? []),
|
|
321
|
+
{ type: 'text', text: prependSystemPrompt(this.spec.systemPrompt, this.spec.userPrompt) },
|
|
322
|
+
];
|
|
323
|
+
this.queue.unshift(this.toAcp(first));
|
|
324
|
+
this.pump();
|
|
325
|
+
}
|
|
326
|
+
/** Send the next queued prompt when no turn is running. */
|
|
327
|
+
pump() {
|
|
328
|
+
if (this.turnInFlight || !this.acpSessionId || this.queue.length === 0 || this.client.closed)
|
|
329
|
+
return;
|
|
330
|
+
const prompt = this.queue.shift();
|
|
331
|
+
this.turnInFlight = true;
|
|
332
|
+
this.client.prompt(this.acpSessionId, prompt).then(() => this.turnEnded(),
|
|
333
|
+
// An error ANSWER ends the turn (the mapper already settled it); a lost transport does not —
|
|
334
|
+
// the lifecycle settles that one once it knows why the agent went away.
|
|
335
|
+
() => {
|
|
336
|
+
if (!this.client.closed)
|
|
337
|
+
this.turnEnded();
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
turnEnded() {
|
|
341
|
+
if (!this.turnInFlight)
|
|
342
|
+
return;
|
|
343
|
+
this.turnInFlight = false;
|
|
344
|
+
this.turnsCompleted += 1;
|
|
345
|
+
this.emit({ type: 'turn-end' });
|
|
346
|
+
if (this.queue.length > 0) {
|
|
347
|
+
this.pump();
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (this.opts.autoEndAfterFirstTurn && this.isOpen && !this.autoEndTimer) {
|
|
351
|
+
this.autoEndTimer = setTimeout(() => this.end(), AUTO_END_DELAY_MS);
|
|
352
|
+
this.autoEndTimer.unref?.();
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// ---- wire → events --------------------------------------------------------------------
|
|
356
|
+
onFrame(dir, frame) {
|
|
357
|
+
if (dir === 'in'
|
|
358
|
+
&& this.replayDone
|
|
359
|
+
&& isRecord(frame.params)
|
|
360
|
+
&& isRecord(frame.params.update)
|
|
361
|
+
&& frame.params.update.sessionUpdate === 'available_commands_update') {
|
|
362
|
+
const done = this.replayDone;
|
|
363
|
+
this.replayDone = null;
|
|
364
|
+
// Let the mapper see the marker first, then release the prompt.
|
|
365
|
+
queueMicrotask(done);
|
|
366
|
+
}
|
|
367
|
+
this.applyUi(mapAcpFrame({ dir, frame }, this.ui, copilotDialect));
|
|
368
|
+
}
|
|
369
|
+
applyUi(mapped) {
|
|
370
|
+
this.ui = mapped.state;
|
|
371
|
+
for (const event of mapped.events) {
|
|
372
|
+
this.opts.onUiEvent?.(event);
|
|
373
|
+
this.v1FromUi(event);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/** v1 derived from v2 (AGENT_PROTOCOL.md §2: every v1 event stays derivable from the v2 stream). */
|
|
377
|
+
v1FromUi(event) {
|
|
378
|
+
switch (event.type) {
|
|
379
|
+
case 'item.delta':
|
|
380
|
+
if (event.field === 'text') {
|
|
381
|
+
this.textChunks.push(event.delta);
|
|
382
|
+
this.emit({ type: 'text', text: event.delta });
|
|
383
|
+
}
|
|
384
|
+
return;
|
|
385
|
+
case 'item.started':
|
|
386
|
+
if (event.item.kind === 'tool') {
|
|
387
|
+
const input = event.item.input ?? { title: event.item.title };
|
|
388
|
+
this.toolCalls.push({ id: event.item.id, name: event.item.name, input });
|
|
389
|
+
this.emit({ type: 'tool-call', id: event.item.id, tool: event.item.name, input });
|
|
390
|
+
}
|
|
391
|
+
return;
|
|
392
|
+
case 'item.completed':
|
|
393
|
+
if (event.item.kind === 'tool') {
|
|
394
|
+
const failed = event.item.status === 'failed' || event.item.status === 'declined';
|
|
395
|
+
this.emit({
|
|
396
|
+
type: 'tool-result',
|
|
397
|
+
toolCallId: event.item.id,
|
|
398
|
+
result: (failed ? event.item.error : event.item.output) ?? '',
|
|
399
|
+
isError: failed,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
return;
|
|
403
|
+
case 'image':
|
|
404
|
+
this.emit({ type: 'image', mediaType: event.mediaType, data: event.data });
|
|
405
|
+
return;
|
|
406
|
+
case 'usage.updated':
|
|
407
|
+
this.tokensUsed = event.usage.total;
|
|
408
|
+
this.emit({ type: 'token-usage', tokensUsed: this.tokensUsed });
|
|
409
|
+
return;
|
|
410
|
+
case 'session.error':
|
|
411
|
+
// A failed prompt or session is the step's failure. A failed resume is not (the bootstrap
|
|
412
|
+
// notes it and starts a fresh session).
|
|
413
|
+
if (event.fatal || this.turnInFlight)
|
|
414
|
+
this.fail(event.message);
|
|
415
|
+
return;
|
|
416
|
+
default:
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
onRequest(request) {
|
|
421
|
+
if (request.method !== 'session/request_permission' || !isRecord(request.params)) {
|
|
422
|
+
return { error: { code: -32601, message: `Method not found: ${String(request.method)}` } };
|
|
423
|
+
}
|
|
424
|
+
const options = Array.isArray(request.params.options) ? request.params.options.filter(isRecord) : [];
|
|
425
|
+
const choice = options.find((o) => o.kind === 'allow_always') ?? options.find((o) => o.kind === 'allow_once') ?? options[0];
|
|
426
|
+
const title = isRecord(request.params.toolCall) && typeof request.params.toolCall.title === 'string'
|
|
427
|
+
? request.params.toolCall.title
|
|
428
|
+
: 'a tool call';
|
|
429
|
+
if (!choice || typeof choice.optionId !== 'string') {
|
|
430
|
+
this.emit({ type: 'note', message: `Copilot asked permission for ${title} with no option cezar could pick; cancelled` });
|
|
431
|
+
return { result: { outcome: { outcome: 'cancelled' } } };
|
|
432
|
+
}
|
|
433
|
+
this.emit({
|
|
434
|
+
type: 'note',
|
|
435
|
+
message: `Copilot asked permission for ${title}; auto-approved (${String(choice.kind ?? choice.optionId)}) — cezar runs Copilot in auto mode`,
|
|
436
|
+
});
|
|
437
|
+
return { result: { outcome: { outcome: 'selected', optionId: choice.optionId } } };
|
|
438
|
+
}
|
|
439
|
+
// ---- helpers --------------------------------------------------------------------------
|
|
440
|
+
toAcp(content) {
|
|
441
|
+
const blocks = [];
|
|
442
|
+
let droppedImages = 0;
|
|
443
|
+
for (const block of content) {
|
|
444
|
+
if (block.type === 'text')
|
|
445
|
+
blocks.push({ type: 'text', text: block.text });
|
|
446
|
+
else if (this.imagesSupported || !this.acpSessionId) {
|
|
447
|
+
blocks.push({ type: 'image', data: block.source.data, mimeType: block.source.media_type });
|
|
448
|
+
}
|
|
449
|
+
else
|
|
450
|
+
droppedImages += 1;
|
|
451
|
+
}
|
|
452
|
+
if (droppedImages > 0)
|
|
453
|
+
this.emit({ type: 'note', message: `Copilot CLI does not accept images; dropped ${droppedImages}` });
|
|
454
|
+
return blocks;
|
|
455
|
+
}
|
|
456
|
+
fail(message) {
|
|
457
|
+
if (this.failed)
|
|
458
|
+
return;
|
|
459
|
+
this.failed = message;
|
|
460
|
+
this.emit({ type: 'error', message });
|
|
461
|
+
}
|
|
462
|
+
emit(event) {
|
|
463
|
+
this.onEvent?.(event);
|
|
464
|
+
}
|
|
465
|
+
stderrText() {
|
|
466
|
+
return this.stderr.join('');
|
|
467
|
+
}
|
|
468
|
+
/** Close stdin, then SIGTERM→SIGKILL for a CLI that ignores EOF (#703, #844). `hard` skips the
|
|
469
|
+
* EOF grace: cancel means now. */
|
|
470
|
+
terminate(hard) {
|
|
471
|
+
try {
|
|
472
|
+
this.child.stdin.end();
|
|
473
|
+
}
|
|
474
|
+
catch {
|
|
475
|
+
// already gone
|
|
476
|
+
}
|
|
477
|
+
const signal = (sig) => {
|
|
478
|
+
if (this.hasExited())
|
|
479
|
+
return;
|
|
480
|
+
this.terminatedByCezar = true;
|
|
481
|
+
this.child.kill(sig);
|
|
482
|
+
};
|
|
483
|
+
if (hard) {
|
|
484
|
+
this.terminatedByCezar = true;
|
|
485
|
+
signal('SIGTERM');
|
|
486
|
+
const kill = setTimeout(() => signal('SIGKILL'), EOF_KILL_GRACE_MS);
|
|
487
|
+
kill.unref?.();
|
|
488
|
+
this.timers.push(kill);
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
const term = setTimeout(() => {
|
|
492
|
+
signal('SIGTERM');
|
|
493
|
+
const kill = setTimeout(() => signal('SIGKILL'), EOF_KILL_GRACE_MS);
|
|
494
|
+
kill.unref?.();
|
|
495
|
+
this.timers.push(kill);
|
|
496
|
+
}, EOF_TERM_GRACE_MS);
|
|
497
|
+
term.unref?.();
|
|
498
|
+
this.timers.push(term);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
function waitForExit(child) {
|
|
502
|
+
if (child.exitCode !== null)
|
|
503
|
+
return Promise.resolve(child.exitCode);
|
|
504
|
+
return new Promise((resolve) => {
|
|
505
|
+
child.once('close', (code) => resolve(code));
|
|
506
|
+
child.once('error', () => resolve(child.exitCode ?? null));
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
function delay(ms) {
|
|
510
|
+
return new Promise((resolve) => {
|
|
511
|
+
const timer = setTimeout(resolve, ms);
|
|
512
|
+
timer.unref?.();
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
/** Path to the bundled mock (`scripts/mock-copilot-acp.mjs`), for CEZ_DRY_RUN=1. */
|
|
516
|
+
function mockCopilotPath() {
|
|
517
|
+
// Resolved like `mockPiPath`: `new URL().pathname` yields `/C:/…` on Windows, which spawn rejects.
|
|
518
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
519
|
+
// here = <pkg>/dist/core (built) or <pkg>/src/core (tsx dev).
|
|
520
|
+
return resolvePath(here, '..', '..', 'scripts', 'mock-copilot-acp.mjs');
|
|
521
|
+
}
|
|
522
|
+
function truncate(value, max) {
|
|
523
|
+
return value.length > max ? `${value.slice(0, max)}…` : value;
|
|
524
|
+
}
|
|
525
|
+
function isRecord(value) {
|
|
526
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
527
|
+
}
|
|
528
|
+
//# sourceMappingURL=copilot-acp-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-acp-runner.js","sourceRoot":"","sources":["../../src/core/copilot-acp-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Copilot CLI's ACP dialect (#582) — the per-runner mapper `AGENT_PROTOCOL.md` §9 step 4
|
|
3
|
+
* asks for, over the shared `acp-ui-mapper.ts`.
|
|
4
|
+
*
|
|
5
|
+
* Every rule here was read off `@github/copilot` 1.0.88: the handshake and the auth error from a
|
|
6
|
+
* live `copilot --acp` probe, the streaming frames from the CLI's own ACP bridge inside its
|
|
7
|
+
* bundle. The verification record — with the commands and the code sites — is
|
|
8
|
+
* `.ai/runs/2026-09-27-copilot-cli-runner/copilot-acp-notes.md`, and `__fixtures__/copilot/`
|
|
9
|
+
* cites it frame by frame.
|
|
10
|
+
*
|
|
11
|
+
* Three things make Copilot differ from the plain ACP reading:
|
|
12
|
+
* - it announces a **started** tool as `pending` and never sends `in_progress`;
|
|
13
|
+
* - it tags a delegated agent's tool calls with the delegating `task` call's id, which is real
|
|
14
|
+
* parent attribution — so the nesting cell of the parity matrix needs no substitute;
|
|
15
|
+
* - it carries **no tool name** on the wire, only a rendered title and an ACP kind.
|
|
16
|
+
*/
|
|
17
|
+
import { type AcpDialect, type AcpUiMapperState, type AcpUiMapping } from './acp-ui-mapper.ts';
|
|
18
|
+
/**
|
|
19
|
+
* Copilot's own `_meta` namespace on `session/update` frames. Its only member is `agentId`, set
|
|
20
|
+
* exactly when the tool call belongs to a delegated agent, and equal to the `toolCallId` of the
|
|
21
|
+
* `task` call that spawned it.
|
|
22
|
+
*/
|
|
23
|
+
export declare const COPILOT_META_KEY = "github.com/copilot";
|
|
24
|
+
/** What a user needs in order to run Copilot CLI. */
|
|
25
|
+
export declare const COPILOT_AUTH_HINT = "GitHub Copilot CLI needs a Copilot-entitled login \u2014 run `copilot login`, or export COPILOT_GITHUB_TOKEN (GH_TOKEN and GITHUB_TOKEN are also read, in that order).";
|
|
26
|
+
/** The run-time line for a rejected credential. "authentication failed" is what
|
|
27
|
+
* `isRuntimeProviderAuthFailure` keys on, so the server raises `provider-auth-required`. */
|
|
28
|
+
export declare const COPILOT_AUTH_FAILURE_MESSAGE = "Copilot CLI authentication failed \u2014 run `copilot login`, or set COPILOT_GITHUB_TOKEN (GH_TOKEN and GITHUB_TOKEN are read too, in that order).";
|
|
29
|
+
/** True for the Copilot auth failures cezar has seen on the wire (see the fixtures). */
|
|
30
|
+
export declare function isCopilotAuthFailure(text: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* The tool's own name — a deliberate best-effort reconstruction.
|
|
33
|
+
*
|
|
34
|
+
* Copilot's ACP frames carry `title` (prose built by the CLI: "Editing src/app.ts") and the ACP
|
|
35
|
+
* `kind`, but never the tool name, and its `_meta` holds only `agentId`. Rather than guess a name
|
|
36
|
+
* from argument shapes that several tools share, only two are recovered — each keyed on an
|
|
37
|
+
* argument the CLI's own code proves is that tool's — and everything else reports the ACP kind.
|
|
38
|
+
* That costs nothing on screen: `upsertTool` prefers the wire `title` over anything derived from
|
|
39
|
+
* the name, so the name is used for `toolKindOf` and as a coarse label.
|
|
40
|
+
*/
|
|
41
|
+
export declare function copilotToolName(update: Record<string, unknown>): string;
|
|
42
|
+
/** The delegating `task` call's id, for a tool call a subagent made. */
|
|
43
|
+
export declare function copilotParentItem(update: Record<string, unknown>): string | undefined;
|
|
44
|
+
export declare const copilotDialect: AcpDialect;
|
|
45
|
+
export type CopilotUiMapperState = AcpUiMapperState;
|
|
46
|
+
export declare function createCopilotUiState(): CopilotUiMapperState;
|
|
47
|
+
export declare function mapCopilotFrame(frame: unknown, state: CopilotUiMapperState): AcpUiMapping;
|