zcode-acp-server 0.21.4 → 0.22.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.
Files changed (51) hide show
  1. package/README.md +6 -7
  2. package/dist/cli.d.ts +8 -5
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +22 -14
  5. package/dist/cli.js.map +1 -1
  6. package/dist/handlers/session.d.ts +17 -1
  7. package/dist/handlers/session.d.ts.map +1 -1
  8. package/dist/handlers/session.js +92 -4
  9. package/dist/handlers/session.js.map +1 -1
  10. package/dist/remote/hub-server.d.ts +7 -7
  11. package/dist/remote/hub-server.d.ts.map +1 -1
  12. package/dist/remote/hub-server.js +33 -33
  13. package/dist/remote/hub-server.js.map +1 -1
  14. package/dist/server.d.ts +5 -0
  15. package/dist/server.d.ts.map +1 -1
  16. package/dist/server.js +6 -0
  17. package/dist/server.js.map +1 -1
  18. package/dist/tui.d.ts +38 -0
  19. package/dist/tui.d.ts.map +1 -0
  20. package/dist/tui.js +96 -0
  21. package/dist/tui.js.map +1 -0
  22. package/docs/CLI.md +33 -76
  23. package/docs/REMOTE-CLIENTS.md +13 -9
  24. package/docs/REMOTE.md +8 -11
  25. package/docs/TROUBLESHOOTING.md +5 -1
  26. package/docs/adr/0007-unified-cli-entry-and-bin-pruning.md +2 -0
  27. package/package.json +3 -7
  28. package/dist/repl/App.d.ts +0 -108
  29. package/dist/repl/App.d.ts.map +0 -1
  30. package/dist/repl/App.js +0 -732
  31. package/dist/repl/App.js.map +0 -1
  32. package/dist/repl/history.d.ts +0 -25
  33. package/dist/repl/history.d.ts.map +0 -1
  34. package/dist/repl/history.js +0 -73
  35. package/dist/repl/history.js.map +0 -1
  36. package/dist/repl/hub.d.ts +0 -87
  37. package/dist/repl/hub.d.ts.map +0 -1
  38. package/dist/repl/hub.js +0 -188
  39. package/dist/repl/hub.js.map +0 -1
  40. package/dist/repl/input-buffer.d.ts +0 -77
  41. package/dist/repl/input-buffer.d.ts.map +0 -1
  42. package/dist/repl/input-buffer.js +0 -174
  43. package/dist/repl/input-buffer.js.map +0 -1
  44. package/dist/repl/model.d.ts +0 -312
  45. package/dist/repl/model.d.ts.map +0 -1
  46. package/dist/repl/model.js +0 -674
  47. package/dist/repl/model.js.map +0 -1
  48. package/dist/repl/run.d.ts +0 -12
  49. package/dist/repl/run.d.ts.map +0 -1
  50. package/dist/repl/run.js +0 -1245
  51. package/dist/repl/run.js.map +0 -1
package/README.md CHANGED
@@ -13,7 +13,7 @@ The server launches the ZCode headless app-server (`zcode app-server --stdio`) a
13
13
 
14
14
  - **Native editor experience** — streaming diffs, permission prompts and plan mode in Zed / JetBrains' own agent panel. No side-by-side terminal.
15
15
  - **The official harness, not a reimplementation** — drives the real `zcode app-server`: native tools, skills, MCP and slash commands, auto-compaction, session resume/fork.
16
- - **Beyond the editor** — a full bilingual terminal REPL (`zcode-acp`, English/中文, works over SSH), phone/web access to the same sessions (`zcode-acp-remote`), opt-in writes-only sandbox. Credentials stay in `~/.zcode`.
16
+ - **Beyond the editor** — an interactive terminal chat (`zcode-acp`, a [Martty](https://github.com/openma-ai/Martty)-powered TUI, works over SSH), phone/web access to the same sessions (`zcode-acp-remote`), opt-in writes-only sandbox. Credentials stay in `~/.zcode`.
17
17
 
18
18
  Because it drives the real ZCode client, your GLM Coding Plan comes along untouched — current perks (the 150% quota bonus, priority routing over raw API) and the plan's flat-rate economics apply exactly as in the official app. No API keys in editor settings.
19
19
 
@@ -142,11 +142,10 @@ the primary client. Discovery API, tunnels, auth, and semantics:
142
142
 
143
143
  ## Unified CLI (`zcode-acp`)
144
144
 
145
- One command for every surface: an interactive terminal chat REPL with native
146
- scrollback (`zcode-acp`), plan quota cards (`zcode-acp quota`, GLM + Opencode
147
- Go), the remote hub daemon (`zcode-acp hub`), and the stdio server editors
148
- invoke (`zcode-acp server`). REPL keys, completion, history, and quota setup:
149
- [docs/CLI.md](docs/CLI.md).
145
+ One command for every surface: an interactive terminal chat TUI (`zcode-acp`,
146
+ powered by Martty), plan quota cards (`zcode-acp quota`, GLM + Opencode Go),
147
+ the remote hub daemon (`zcode-acp hub`), and the stdio server editors invoke
148
+ (`zcode-acp server`). TUI keys and quota setup: [docs/CLI.md](docs/CLI.md).
150
149
 
151
150
  ## ACP Registry
152
151
 
@@ -204,7 +203,7 @@ See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full architecture docum
204
203
  - [Protocol](docs/PROTOCOL.md) — ZCode JSON-RPC protocol details
205
204
  - [Sandbox](docs/SANDBOX.md) — full sandbox manual (switches, whitelist, popups, verification)
206
205
  - [Remote Access](docs/REMOTE.md) — hub, discovery API, tunnels, remote session-create
207
- - [Unified CLI](docs/CLI.md) — REPL, quota cards, hub/server subcommands
206
+ - [Unified CLI](docs/CLI.md) — interactive TUI, quota cards, hub/server subcommands
208
207
  - [Remote Clients](docs/REMOTE-CLIENTS.md) — remote access integration contract (discovery, transport, recovery)
209
208
  - [Replay Guide](docs/REPLAY-GUIDE.md) — building a client UI on tail replay
210
209
  - [Development](docs/DEVELOPMENT.md) — local development, debugging, adding extension methods
package/dist/cli.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * Unified CLI entry (`zcode-acp`). Every operational surface is a subcommand;
4
- * bare invocation opens the interactive REPL. See docs/adr/0007 for why the
5
- * old `zcode-acp-hub` / `zcode-quota` bins were folded in here and why
6
- * `zcode-acp-server` remains as a bin alias pointing at this same file.
4
+ * bare invocation opens the interactive Martty TUI (ADR-0020). See docs/adr
5
+ * 0007 for why the old `zcode-acp-hub` / `zcode-quota` bins were folded in
6
+ * here and why `zcode-acp-server` remains as a bin alias pointing at this
7
+ * same file.
7
8
  *
8
9
  * The legacy alias is detected via argv[0]: npm/pnpm install bin names as
9
10
  * symlinks, so both `zcode-acp` and `zcode-acp-server` resolve to dist/cli.js
@@ -14,8 +15,9 @@
14
15
  export type Invocation = {
15
16
  kind: "help";
16
17
  } | {
17
- kind: "repl";
18
+ kind: "tui";
18
19
  explicit: boolean;
20
+ check: boolean;
19
21
  } | {
20
22
  kind: "server";
21
23
  } | {
@@ -34,7 +36,8 @@ export type Invocation = {
34
36
  *
35
37
  * `invokedAs` is basename(argv[1]); `zcode-acp-server` means we were spawned
36
38
  * by an editor config that expects the bridge to speak ACP on stdio with no
37
- * subcommand prefix. Bare `zcode-acp` opens the interactive REPL.
39
+ * subcommand prefix. Bare `zcode-acp` opens the interactive Martty TUI;
40
+ * `repl` stays accepted as the old spelling of `tui`.
38
41
  */
39
42
  export declare function resolveInvocation(invokedAs: string, argv: readonly string[]): Invocation;
40
43
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAWH,sFAAsF;AACtF,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAoBxF"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG;AAWH,sFAAsF;AACtF,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAsBxF"}
package/dist/cli.js CHANGED
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * Unified CLI entry (`zcode-acp`). Every operational surface is a subcommand;
4
- * bare invocation opens the interactive REPL. See docs/adr/0007 for why the
5
- * old `zcode-acp-hub` / `zcode-quota` bins were folded in here and why
6
- * `zcode-acp-server` remains as a bin alias pointing at this same file.
4
+ * bare invocation opens the interactive Martty TUI (ADR-0020). See docs/adr
5
+ * 0007 for why the old `zcode-acp-hub` / `zcode-quota` bins were folded in
6
+ * here and why `zcode-acp-server` remains as a bin alias pointing at this
7
+ * same file.
7
8
  *
8
9
  * The legacy alias is detected via argv[0]: npm/pnpm install bin names as
9
10
  * symlinks, so both `zcode-acp` and `zcode-acp-server` resolve to dist/cli.js
@@ -15,23 +16,25 @@ import process from "node:process";
15
16
  import { main as runHub } from "./bin/hub.js";
16
17
  import { main as runQuota } from "./bin/quota.js";
17
18
  import { main as runServer, runHeadless } from "./index.js";
18
- import { runRepl } from "./repl/run.js";
19
+ import { checkTuiRuntime, runTui } from "./tui.js";
19
20
  import { AGENT_INFO } from "./utils.js";
20
21
  /**
21
22
  * Map (invoked name, argv) to a subcommand. Pure — exported for unit tests.
22
23
  *
23
24
  * `invokedAs` is basename(argv[1]); `zcode-acp-server` means we were spawned
24
25
  * by an editor config that expects the bridge to speak ACP on stdio with no
25
- * subcommand prefix. Bare `zcode-acp` opens the interactive REPL.
26
+ * subcommand prefix. Bare `zcode-acp` opens the interactive Martty TUI;
27
+ * `repl` stays accepted as the old spelling of `tui`.
26
28
  */
27
29
  export function resolveInvocation(invokedAs, argv) {
28
30
  if (invokedAs === "zcode-acp-server")
29
31
  return { kind: "server" };
30
32
  const sub = argv[0];
31
33
  if (sub === undefined)
32
- return { kind: "repl", explicit: false };
33
- if (sub === "repl" || sub === "tui")
34
- return { kind: "repl", explicit: true };
34
+ return { kind: "tui", explicit: false, check: false };
35
+ if (sub === "repl" || sub === "tui") {
36
+ return { kind: "tui", explicit: true, check: argv.slice(1).includes("--check") };
37
+ }
35
38
  if (sub === "-h" || sub === "--help" || sub === "help") {
36
39
  return { kind: "help" };
37
40
  }
@@ -51,11 +54,12 @@ export function resolveInvocation(invokedAs, argv) {
51
54
  const HELP_TEXT = `Usage: zcode-acp [command] [options]
52
55
 
53
56
  The single entry point for every zcode-acp-server surface. Bare invocation
54
- opens the interactive REPL (agent chat in this terminal).
57
+ opens the interactive Martty TUI (agent chat in this terminal).
55
58
 
56
59
  Commands:
57
- (none) | repl Interactive agent chat (Ink UI): stream output, tool
58
- rows, arrow-key permission prompts. /exit quits.
60
+ (none) | tui Interactive agent chat (Martty TUI): stream output,
61
+ tool rows, model picker, session resume. /exit quits.
62
+ 'tui --check' runs a headless wiring check and exits.
59
63
  quota [args...] Plan usage cards (was the zcode-quota bin): -w watch,
60
64
  -i <sec>, -d detail, -p plain, provider glm|go.
61
65
  hub Run the remote-access hub daemon (was zcode-acp-hub;
@@ -84,13 +88,17 @@ async function main() {
84
88
  case "help":
85
89
  process.stdout.write(HELP_TEXT + "\n");
86
90
  return;
87
- case "repl":
91
+ case "tui":
92
+ if (invocation.check) {
93
+ process.exitCode = (await checkTuiRuntime()) ? 0 : 1;
94
+ return;
95
+ }
88
96
  if (process.stdin.isTTY && process.stdout.isTTY) {
89
- await runRepl();
97
+ await runTui();
90
98
  return;
91
99
  }
92
100
  if (invocation.explicit) {
93
- process.stderr.write("zcode-acp: interactive REPL needs a TTY — run it from a terminal.\n");
101
+ process.stderr.write("zcode-acp: interactive TUI needs a TTY — run it from a terminal.\n");
94
102
  process.exit(2);
95
103
  }
96
104
  // Bare invocation without a TTY falls back to the stdio server: on
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAYxC;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,IAAuB;IAC1E,IAAI,SAAS,KAAK,kBAAkB;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAChE,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC7E,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IACD,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5B,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,KAAK,KAAK;YACR,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD;YACE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;wEAyBsD,CAAC;AAEzE,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;YACvC,OAAO;QACT,KAAK,MAAM;YACT,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChD,MAAM,OAAO,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;gBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;gBAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,mEAAmE;YACnE,uEAAuE;YACvE,kEAAkE;YAClE,gEAAgE;YAChE,MAAM,SAAS,EAAE,CAAC;YAClB,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,SAAS,EAAE,CAAC;YAClB,OAAO;QACT,KAAK,OAAO;YACV,MAAM,WAAW,EAAE,CAAC;YACpB,OAAO;QACT,KAAK,KAAK;YACR,MAAM,MAAM,EAAE,CAAC;YACf,OAAO;QACT,KAAK,OAAO;YACV,MAAM,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO;QACT,KAAK,SAAS;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,UAAU,CAAC,GAAG,OAAO,CAAC,CAAC;YAC3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,mEAAmE;AACnE,0EAA0E;AAC1E,uCAAuC;AACvC,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,CACL,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,kBAAkB,CAC5B,CAAC;AACJ,CAAC,CAAC,EAAE,CAAC;AAEL,IAAI,eAAe,EAAE,CAAC;IACpB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACzF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -14,11 +14,25 @@ import type * as acp from "@agentclientprotocol/sdk";
14
14
  import { EventStreamListener, TurnMonitor } from "../backend/listener.js";
15
15
  import { ProjectionDiffer } from "../translators/index.js";
16
16
  import type { PendingTurn, ZcodeAcpServer } from "../server.js";
17
+ /**
18
+ * Read and consume the boot-resume session id: the first `session/new` after
19
+ * process start claims it, the env is deleted so later `session/new` calls
20
+ * (the TUI's /new) create fresh sessions. Whitespace-only counts as unset.
21
+ */
22
+ export declare function consumeBootResumeTarget(): string | null;
17
23
  /**
18
24
  * `session/new` → local placeholder id. The real zcode `session/create` is
19
25
  * deferred to first use (`ensureRealSession`) so an editor startup that never
20
26
  * sends a message leaves no empty session in the backend or the App's task
21
27
  * index. The created session uses mode yolo (hardcoded).
28
+ *
29
+ * Exception — boot-resume interception (ADR-0017, amended by ADR-0020): when
30
+ * the hub incubated this bridge for a specific conversation
31
+ * (ZCODE_ACP_RESUME_SESSION), the TUI client's opening `session/new` is
32
+ * served as a `session/load` of that id instead. The client adopts the
33
+ * resumed conversation with zero client-side support. A failed load falls
34
+ * back to a fresh session so the window still lands on a usable prompt
35
+ * (the retired in-house REPL had the same fallback).
22
36
  */
23
37
  export declare function newSession(server: ZcodeAcpServer, params: acp.NewSessionRequest): Promise<acp.NewSessionResponse>;
24
38
  /**
@@ -37,7 +51,9 @@ export declare function resumeSession(server: ZcodeAcpServer, params: acp.Resume
37
51
  * `session/load` → zcode `session/resume` + stream conversation history back as
38
52
  * `session/update` notifications (text/reasoning/简化 tool_call).
39
53
  */
40
- export declare function loadSession(server: ZcodeAcpServer, params: acp.LoadSessionRequest, cx: acp.AgentContext): Promise<acp.LoadSessionResponse>;
54
+ export declare function loadSession(server: ZcodeAcpServer, params: acp.LoadSessionRequest, cx: acp.AgentContext, opts?: {
55
+ replayHistory?: boolean;
56
+ }): Promise<acp.LoadSessionResponse>;
41
57
  /**
42
58
  * `session/prompt` → subscribe-before-send, run the event-driven turn loop.
43
59
  *
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/handlers/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/handlers/session.ts"],"names":[],"mappings":"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"}
@@ -119,13 +119,53 @@ function toIso(ms) {
119
119
  return undefined;
120
120
  return new Date(ms).toISOString();
121
121
  }
122
+ /** Env carrying the hub's boot-resume target (ADR-0017). */
123
+ const BOOT_RESUME_ENV = "ZCODE_ACP_RESUME_SESSION";
124
+ /**
125
+ * Read and consume the boot-resume session id: the first `session/new` after
126
+ * process start claims it, the env is deleted so later `session/new` calls
127
+ * (the TUI's /new) create fresh sessions. Whitespace-only counts as unset.
128
+ */
129
+ export function consumeBootResumeTarget() {
130
+ const target = (process.env[BOOT_RESUME_ENV] ?? "").trim();
131
+ delete process.env[BOOT_RESUME_ENV];
132
+ return target || null;
133
+ }
122
134
  /**
123
135
  * `session/new` → local placeholder id. The real zcode `session/create` is
124
136
  * deferred to first use (`ensureRealSession`) so an editor startup that never
125
137
  * sends a message leaves no empty session in the backend or the App's task
126
138
  * index. The created session uses mode yolo (hardcoded).
139
+ *
140
+ * Exception — boot-resume interception (ADR-0017, amended by ADR-0020): when
141
+ * the hub incubated this bridge for a specific conversation
142
+ * (ZCODE_ACP_RESUME_SESSION), the TUI client's opening `session/new` is
143
+ * served as a `session/load` of that id instead. The client adopts the
144
+ * resumed conversation with zero client-side support. A failed load falls
145
+ * back to a fresh session so the window still lands on a usable prompt
146
+ * (the retired in-house REPL had the same fallback).
127
147
  */
128
148
  export async function newSession(server, params) {
149
+ const bootResume = consumeBootResumeTarget();
150
+ if (bootResume) {
151
+ try {
152
+ // replayHistory:false — the TUI does not render agent-replayed history
153
+ // (its transcript comes from its own local recording; it says so in its
154
+ // status line) and waits for this response, so a full replay would only
155
+ // stall the boot.
156
+ const loaded = await loadSession(server, { sessionId: bootResume }, server.clients.broadcast(), { replayHistory: false });
157
+ log(`session/new: boot-resume → ${bootResume}`);
158
+ return {
159
+ sessionId: bootResume,
160
+ modes: loaded.modes,
161
+ configOptions: loaded.configOptions,
162
+ };
163
+ }
164
+ catch (e) {
165
+ warn(`session/new: boot-resume of ${bootResume} failed (` +
166
+ `${e instanceof Error ? e.message : String(e)}) — starting a fresh session`);
167
+ }
168
+ }
129
169
  // Creation is the one moment a client's cwd is trusted (the editor
130
170
  // declaring its worktree); "/" is still rejected as a degenerate root.
131
171
  // Serve mode (ADR-0014) is the exception: a headless bridge exists for ONE
@@ -383,6 +423,31 @@ async function resolveResumeTarget(server, acpSid) {
383
423
  }
384
424
  return { zcodeSid: acpSid, alreadyLive: false };
385
425
  }
426
+ /**
427
+ * Tail size for the TUI resume replay. Bounded so a long store session does
428
+ * not push thousands of chunk notifications into one window; turn-aligned
429
+ * by sliceTail (a slice can run slightly past the limit to a turn start).
430
+ */
431
+ const MARTTY_RESUME_TAIL = 200;
432
+ /** True when the connecting client is Martty, the bundled TUI frontend. */
433
+ function isMarttyClient(server) {
434
+ return (server.clientName ?? "").toLowerCase().includes("martty");
435
+ }
436
+ /**
437
+ * Stream a resumed session's history to the TUI as chunk updates — the same
438
+ * wire form session/load replays (chunks fold in Martty; complete-form
439
+ * user/agent messages do not). Editors are unaffected: they replay through
440
+ * session/load and would double-render a resume replay.
441
+ */
442
+ async function replayResumeHistory(server, cx, acpSid, zcodeSid) {
443
+ const messages = await fetchMessages(server, zcodeSid);
444
+ if (messages.length === 0)
445
+ return;
446
+ const slice = sliceTail(messages, MARTTY_RESUME_TAIL);
447
+ await withReplayBatch(acpSid, () => replayMessages(cx, acpSid, slice.batch));
448
+ log(`session/resume: replayed ${slice.meta.replayedMessages} messages for the TUI` +
449
+ ` (tail ${MARTTY_RESUME_TAIL} of ${slice.meta.totalMessages} on record)`);
450
+ }
386
451
  /** `session/resume` → zcode `session/resume` (with runtimeModel overlay). */
387
452
  export async function resumeSession(server, params, cx) {
388
453
  const acpSid = params.sessionId;
@@ -444,6 +509,19 @@ export async function resumeSession(server, params, cx) {
444
509
  log(`session/resume -> ${zcodeSid}`);
445
510
  server.ensureBackgroundListener(zcodeSid);
446
511
  await adoptStoredTitle(server, acpSid, zcodeSid);
512
+ // Martty's /resume rides session/resume (no history by ACP design) and only
513
+ // folds updates addressed to a session id it has already adopted — i.e.
514
+ // delivered AFTER the resume response (pre-response updates are dropped;
515
+ // verified against martty 0.2.35). setImmediate lets the response write
516
+ // first: microtasks (the SDK's response send) drain before immediates.
517
+ if (isMarttyClient(server)) {
518
+ setImmediate(() => {
519
+ replayResumeHistory(server, cx, acpSid, zcodeSid).catch((e) => {
520
+ warn(`session/resume: TUI history replay failed (non-fatal): ` +
521
+ `${e instanceof Error ? e.message : String(e)}`);
522
+ });
523
+ });
524
+ }
447
525
  // Initial usage_update so the editor shows the context bar immediately for a
448
526
  // resumed session (mirrors Python _on_session_resume → _emit_initial_usage).
449
527
  await emitInitialUsage(server, cx, acpSid, zcodeSid, getOrCreateDiffer(server, zcodeSid));
@@ -458,7 +536,7 @@ export async function resumeSession(server, params, cx) {
458
536
  * `session/load` → zcode `session/resume` + stream conversation history back as
459
537
  * `session/update` notifications (text/reasoning/简化 tool_call).
460
538
  */
461
- export async function loadSession(server, params, cx) {
539
+ export async function loadSession(server, params, cx, opts = {}) {
462
540
  const acpSid = params.sessionId;
463
541
  if (!acpSid)
464
542
  throw new Error("sessionId required");
@@ -512,9 +590,19 @@ export async function loadSession(server, params, cx) {
512
590
  // for editors that send no `_meta` (Zed path unchanged).
513
591
  const limit = readTailLimit(params);
514
592
  const slice = limit === null ? fullSlice(messages) : sliceTail(messages, limit);
515
- await withReplayBatch(acpSid, () => replayMessages(cx, acpSid, slice.batch));
516
- log(`session/load: replayed ${slice.meta.replayedMessages} messages` +
517
- `${limit === null ? "" : ` (tail limit ${limit}, total ${slice.meta.totalMessages})`}`);
593
+ if (opts.replayHistory === false) {
594
+ // Boot-resume interception (session/new): the terminal TUI client does not
595
+ // render replayed updates (its transcript lives in its own local store)
596
+ // and blocks on the response until the replay finishes — so skip the
597
+ // dispatch. The differ baseline below still runs, so the next turn's
598
+ // completion diff does not re-emit the historical messages.
599
+ log(`session/load: history replay skipped (boot-resume); ${slice.meta.totalMessages} messages on record`);
600
+ }
601
+ else {
602
+ await withReplayBatch(acpSid, () => replayMessages(cx, acpSid, slice.batch));
603
+ log(`session/load: replayed ${slice.meta.replayedMessages} messages` +
604
+ `${limit === null ? "" : ` (tail limit ${limit}, total ${slice.meta.totalMessages})`}`);
605
+ }
518
606
  // Replay the existing todo list as an initial plan so a loaded session shows
519
607
  // its todos immediately.
520
608
  try {