poly-weaver 0.10.1 → 0.10.3

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 (185) hide show
  1. package/README.md +5 -8
  2. package/dist/agents/implementors/adapter.d.ts +1 -1
  3. package/dist/agents/implementors/adapter.d.ts.map +1 -1
  4. package/dist/agents/implementors/adapter.js +2 -2
  5. package/dist/agents/implementors/adapter.js.map +1 -1
  6. package/dist/agents/implementors/index.d.ts.map +1 -1
  7. package/dist/agents/implementors/index.js +1 -1
  8. package/dist/agents/implementors/index.js.map +1 -1
  9. package/dist/agents/interviewers/adapter.d.ts +1 -1
  10. package/dist/agents/interviewers/adapter.d.ts.map +1 -1
  11. package/dist/agents/interviewers/adapter.js +2 -2
  12. package/dist/agents/interviewers/adapter.js.map +1 -1
  13. package/dist/agents/interviewers/index.d.ts.map +1 -1
  14. package/dist/agents/interviewers/index.js +1 -1
  15. package/dist/agents/interviewers/index.js.map +1 -1
  16. package/dist/agents/planners/adapter.d.ts +1 -1
  17. package/dist/agents/planners/adapter.d.ts.map +1 -1
  18. package/dist/agents/planners/adapter.js +2 -2
  19. package/dist/agents/planners/adapter.js.map +1 -1
  20. package/dist/agents/planners/index.d.ts.map +1 -1
  21. package/dist/agents/planners/index.js +1 -1
  22. package/dist/agents/planners/index.js.map +1 -1
  23. package/dist/agents/registry.d.ts +1 -0
  24. package/dist/agents/registry.d.ts.map +1 -1
  25. package/dist/agents/registry.js.map +1 -1
  26. package/dist/agents/reviewers/adapter.d.ts +1 -1
  27. package/dist/agents/reviewers/adapter.d.ts.map +1 -1
  28. package/dist/agents/reviewers/adapter.js +3 -3
  29. package/dist/agents/reviewers/adapter.js.map +1 -1
  30. package/dist/agents/reviewers/handler.d.ts.map +1 -1
  31. package/dist/agents/reviewers/handler.js +7 -0
  32. package/dist/agents/reviewers/handler.js.map +1 -1
  33. package/dist/agents/reviewers/index.d.ts.map +1 -1
  34. package/dist/agents/reviewers/index.js +1 -1
  35. package/dist/agents/reviewers/index.js.map +1 -1
  36. package/dist/agents/reviewers/prompts.d.ts +2 -2
  37. package/dist/agents/reviewers/prompts.d.ts.map +1 -1
  38. package/dist/agents/reviewers/prompts.js +12 -2
  39. package/dist/agents/reviewers/prompts.js.map +1 -1
  40. package/dist/agents/reviewers/types.d.ts +3 -1
  41. package/dist/agents/reviewers/types.d.ts.map +1 -1
  42. package/dist/agents/reviewers/types.js.map +1 -1
  43. package/dist/agents/runner.d.ts +3 -2
  44. package/dist/agents/runner.d.ts.map +1 -1
  45. package/dist/agents/runner.js +48 -10
  46. package/dist/agents/runner.js.map +1 -1
  47. package/dist/agents/simplifiers/adapter.d.ts +1 -1
  48. package/dist/agents/simplifiers/adapter.d.ts.map +1 -1
  49. package/dist/agents/simplifiers/adapter.js +2 -2
  50. package/dist/agents/simplifiers/adapter.js.map +1 -1
  51. package/dist/agents/simplifiers/index.d.ts.map +1 -1
  52. package/dist/agents/simplifiers/index.js +1 -1
  53. package/dist/agents/simplifiers/index.js.map +1 -1
  54. package/dist/cli.js +20 -6
  55. package/dist/cli.js.map +1 -1
  56. package/dist/flow/built-in/default-factory.d.ts.map +1 -1
  57. package/dist/flow/built-in/default-factory.js +1 -2
  58. package/dist/flow/built-in/default-factory.js.map +1 -1
  59. package/dist/flow/index.d.ts +1 -1
  60. package/dist/flow/index.d.ts.map +1 -1
  61. package/dist/flow/index.js +1 -1
  62. package/dist/flow/index.js.map +1 -1
  63. package/dist/flow/params.d.ts +1 -0
  64. package/dist/flow/params.d.ts.map +1 -1
  65. package/dist/flow/params.js +14 -0
  66. package/dist/flow/params.js.map +1 -1
  67. package/dist/markdown.js +59 -29
  68. package/dist/markdown.js.map +1 -1
  69. package/dist/offscreen/controller.d.ts +21 -0
  70. package/dist/offscreen/controller.d.ts.map +1 -0
  71. package/dist/offscreen/controller.js +185 -0
  72. package/dist/offscreen/controller.js.map +1 -0
  73. package/dist/offscreen/fork-launch.d.ts +31 -0
  74. package/dist/offscreen/fork-launch.d.ts.map +1 -0
  75. package/dist/offscreen/fork-launch.js +76 -0
  76. package/dist/offscreen/fork-launch.js.map +1 -0
  77. package/dist/offscreen/fork.d.ts +21 -0
  78. package/dist/offscreen/fork.d.ts.map +1 -0
  79. package/dist/offscreen/fork.js +122 -0
  80. package/dist/offscreen/fork.js.map +1 -0
  81. package/dist/offscreen/keys.d.ts +6 -0
  82. package/dist/offscreen/keys.d.ts.map +1 -0
  83. package/dist/offscreen/keys.js +16 -0
  84. package/dist/offscreen/keys.js.map +1 -0
  85. package/dist/offscreen/registry.d.ts +6 -0
  86. package/dist/offscreen/registry.d.ts.map +1 -0
  87. package/dist/offscreen/registry.js +27 -0
  88. package/dist/offscreen/registry.js.map +1 -0
  89. package/dist/offscreen/resolve.d.ts +10 -0
  90. package/dist/offscreen/resolve.d.ts.map +1 -0
  91. package/dist/offscreen/resolve.js +111 -0
  92. package/dist/offscreen/resolve.js.map +1 -0
  93. package/dist/offscreen/surface.d.ts +4 -0
  94. package/dist/offscreen/surface.d.ts.map +1 -0
  95. package/dist/offscreen/surface.js +24 -0
  96. package/dist/offscreen/surface.js.map +1 -0
  97. package/dist/orchestrator.d.ts +5 -1
  98. package/dist/orchestrator.d.ts.map +1 -1
  99. package/dist/orchestrator.js +25 -6
  100. package/dist/orchestrator.js.map +1 -1
  101. package/dist/providers/claude/session.d.ts +4 -0
  102. package/dist/providers/claude/session.d.ts.map +1 -1
  103. package/dist/providers/claude/session.js +7 -2
  104. package/dist/providers/claude/session.js.map +1 -1
  105. package/dist/providers/codex/session.d.ts +4 -0
  106. package/dist/providers/codex/session.d.ts.map +1 -1
  107. package/dist/providers/codex/session.js +68 -3
  108. package/dist/providers/codex/session.js.map +1 -1
  109. package/dist/providers/copilot/session.d.ts +6 -0
  110. package/dist/providers/copilot/session.d.ts.map +1 -1
  111. package/dist/providers/copilot/session.js +13 -4
  112. package/dist/providers/copilot/session.js.map +1 -1
  113. package/dist/providers/copilot/strategy.d.ts.map +1 -1
  114. package/dist/providers/copilot/strategy.js +6 -1
  115. package/dist/providers/copilot/strategy.js.map +1 -1
  116. package/dist/providers/trust.d.ts +12 -0
  117. package/dist/providers/trust.d.ts.map +1 -0
  118. package/dist/providers/trust.js +220 -0
  119. package/dist/providers/trust.js.map +1 -0
  120. package/dist/providers/types.d.ts +7 -0
  121. package/dist/providers/types.d.ts.map +1 -1
  122. package/dist/session/locator.d.ts +7 -1
  123. package/dist/session/locator.d.ts.map +1 -1
  124. package/dist/session/locator.js +10 -3
  125. package/dist/session/locator.js.map +1 -1
  126. package/dist/session/resume.d.ts.map +1 -1
  127. package/dist/session/resume.js +16 -3
  128. package/dist/session/resume.js.map +1 -1
  129. package/dist/status-bar.d.ts +0 -2
  130. package/dist/status-bar.d.ts.map +1 -1
  131. package/dist/status-bar.js +1 -17
  132. package/dist/status-bar.js.map +1 -1
  133. package/dist/terminal/host.d.ts +8 -0
  134. package/dist/terminal/host.d.ts.map +1 -1
  135. package/dist/terminal/host.js +32 -19
  136. package/dist/terminal/host.js.map +1 -1
  137. package/dist/terminal/input-router.d.ts +10 -3
  138. package/dist/terminal/input-router.d.ts.map +1 -1
  139. package/dist/terminal/input-router.js +22 -5
  140. package/dist/terminal/input-router.js.map +1 -1
  141. package/dist/terminal/key-to-bytes.d.ts +4 -1
  142. package/dist/terminal/key-to-bytes.d.ts.map +1 -1
  143. package/dist/terminal/key-to-bytes.js +6 -5
  144. package/dist/terminal/key-to-bytes.js.map +1 -1
  145. package/dist/terminal/render.d.ts +12 -1
  146. package/dist/terminal/render.d.ts.map +1 -1
  147. package/dist/terminal/render.js +37 -5
  148. package/dist/terminal/render.js.map +1 -1
  149. package/dist/terminal/win32-console-source.d.ts.map +1 -1
  150. package/dist/terminal/win32-console-source.js +3 -1
  151. package/dist/terminal/win32-console-source.js.map +1 -1
  152. package/dist/terminal-input.d.ts +2 -0
  153. package/dist/terminal-input.d.ts.map +1 -1
  154. package/dist/terminal-input.js +26 -6
  155. package/dist/terminal-input.js.map +1 -1
  156. package/dist/user/curate-handler.d.ts +6 -1
  157. package/dist/user/curate-handler.d.ts.map +1 -1
  158. package/dist/user/curate-handler.js +11 -2
  159. package/dist/user/curate-handler.js.map +1 -1
  160. package/dist/user/curate-prompt.d.ts +5 -1
  161. package/dist/user/curate-prompt.d.ts.map +1 -1
  162. package/dist/user/curate-prompt.js.map +1 -1
  163. package/dist/user/handler.d.ts +6 -1
  164. package/dist/user/handler.d.ts.map +1 -1
  165. package/dist/user/handler.js +12 -1
  166. package/dist/user/handler.js.map +1 -1
  167. package/dist/user/host-curate-prompt.d.ts +2 -1
  168. package/dist/user/host-curate-prompt.d.ts.map +1 -1
  169. package/dist/user/host-curate-prompt.js +87 -32
  170. package/dist/user/host-curate-prompt.js.map +1 -1
  171. package/dist/user/host-prompt.d.ts +2 -3
  172. package/dist/user/host-prompt.d.ts.map +1 -1
  173. package/dist/user/host-prompt.js +46 -26
  174. package/dist/user/host-prompt.js.map +1 -1
  175. package/dist/user/index.d.ts +1 -1
  176. package/dist/user/index.d.ts.map +1 -1
  177. package/dist/user/prompt.d.ts +6 -0
  178. package/dist/user/prompt.d.ts.map +1 -1
  179. package/dist/user/prompt.js.map +1 -1
  180. package/dist/user/shortcut-hints.d.ts +2 -0
  181. package/dist/user/shortcut-hints.d.ts.map +1 -0
  182. package/dist/user/shortcut-hints.js +15 -0
  183. package/dist/user/shortcut-hints.js.map +1 -0
  184. package/docs/startup-tui.png +0 -0
  185. package/package.json +3 -2
@@ -0,0 +1,76 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { cp } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { rmSync } from "node:fs";
5
+ import { getCopilotSessionDir } from "../providers/copilot/session.js";
6
+ export async function buildForkLaunch(slot, workdir) {
7
+ switch (slot.driver) {
8
+ case "claude":
9
+ return {
10
+ command: "claude",
11
+ args: [
12
+ "--resume",
13
+ slot.sourceSessionId,
14
+ "--fork-session",
15
+ ...claudeFlags(slot),
16
+ ],
17
+ cleanup: () => { },
18
+ };
19
+ case "codex":
20
+ return {
21
+ command: "codex",
22
+ args: [
23
+ "fork",
24
+ slot.sourceSessionId,
25
+ ...codexFlags(slot),
26
+ ],
27
+ cleanup: () => { },
28
+ };
29
+ case "copilot": {
30
+ const clonedId = randomUUID();
31
+ const sourceDir = copilotSourceDir(slot);
32
+ const targetDir = join(getCopilotSessionDir(), clonedId);
33
+ await cp(sourceDir, targetDir, { recursive: true, errorOnExist: true, force: false });
34
+ return {
35
+ command: "copilot",
36
+ args: [
37
+ "--resume",
38
+ clonedId,
39
+ ...copilotFlags(slot),
40
+ ],
41
+ cleanup: () => {
42
+ rmSync(targetDir, { recursive: true, force: true });
43
+ },
44
+ };
45
+ }
46
+ }
47
+ }
48
+ function claudeFlags(slot) {
49
+ return [
50
+ ...(slot.yolo ? ["--dangerously-skip-permissions"] : []),
51
+ ...(slot.model ? ["--model", slot.model] : []),
52
+ ...(slot.effort ? ["--effort", slot.effort] : []),
53
+ ];
54
+ }
55
+ function codexFlags(slot) {
56
+ return [
57
+ ...(slot.yolo ? ["--dangerously-bypass-approvals-and-sandbox"] : []),
58
+ ...(slot.model ? ["-m", slot.model] : []),
59
+ ...(slot.effort ? ["-c", `model_reasoning_effort="${slot.effort}"`] : []),
60
+ ];
61
+ }
62
+ function copilotFlags(slot) {
63
+ return [
64
+ ...(slot.model ? ["--model", slot.model] : []),
65
+ ...(slot.effort ? ["--effort", slot.effort] : []),
66
+ ...(slot.yolo ? ["--allow-all"] : []),
67
+ "--mouse=on",
68
+ ];
69
+ }
70
+ function copilotSourceDir(slot) {
71
+ if (slot.sourceSessionPath.endsWith("events.jsonl")) {
72
+ return dirname(slot.sourceSessionPath);
73
+ }
74
+ return join(getCopilotSessionDir(), slot.sourceSessionId);
75
+ }
76
+ //# sourceMappingURL=fork-launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork-launch.js","sourceRoot":"","sources":["../../src/offscreen/fork-launch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAmCvE,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAmB,EACnB,OAAe;IAEf,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO;gBACL,OAAO,EAAE,QAAQ;gBACjB,IAAI,EAAE;oBACJ,UAAU;oBACV,IAAI,CAAC,eAAe;oBACpB,gBAAgB;oBAChB,GAAG,WAAW,CAAC,IAAI,CAAC;iBACrB;gBACD,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;aAClB,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE;oBACJ,MAAM;oBACN,IAAI,CAAC,eAAe;oBACpB,GAAG,UAAU,CAAC,IAAI,CAAC;iBACpB;gBACD,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;aAClB,CAAC;QACJ,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzD,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACtF,OAAO;gBACL,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE;oBACJ,UAAU;oBACV,QAAQ;oBACR,GAAG,YAAY,CAAC,IAAI,CAAC;iBACtB;gBACD,OAAO,EAAE,GAAG,EAAE;oBACZ,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,CAAC;aACF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAsD;IACzE,OAAO;QACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAsD;IACxE,OAAO;QACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,2BAA2B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAsD;IAC1E,OAAO;QACL,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,YAAY;KACb,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAmB;IAC3C,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACpD,OAAO,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { VirtualTerminal } from "../terminal/virtual-terminal.js";
2
+ import type { TerminalHost } from "../terminal/host.js";
3
+ import type { PtyHandle } from "../pty/types.js";
4
+ import { type OffscreenSlot } from "./fork-launch.js";
5
+ export declare class Fork {
6
+ private readonly cleanup;
7
+ readonly binding: OffscreenSlot["binding"];
8
+ readonly roleLabel: string;
9
+ readonly sourceSessionId: string;
10
+ readonly driver: OffscreenSlot["driver"];
11
+ readonly pty: PtyHandle;
12
+ readonly vt: VirtualTerminal;
13
+ private visible;
14
+ private killed;
15
+ private constructor();
16
+ static spawn(slot: OffscreenSlot, workdir: string, host: Pick<TerminalHost, "scheduleParentUiRender">, cols: number, rows: number): Promise<Fork>;
17
+ setVisible(visible: boolean): void;
18
+ resize(cols: number, rows: number): void;
19
+ kill(): void;
20
+ }
21
+ //# sourceMappingURL=fork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork.d.ts","sourceRoot":"","sources":["../../src/offscreen/fork.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAI1B,qBAAa,IAAI;IAcb,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;WAiCM,KAAK,CAChB,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,wBAAwB,CAAC,EAClD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC;IAqChB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOxC,IAAI,IAAI,IAAI;CAoBb"}
@@ -0,0 +1,122 @@
1
+ import { VirtualTerminal } from "../terminal/virtual-terminal.js";
2
+ import { spawnPty } from "../pty/spawn.js";
3
+ import { buildForkLaunch, } from "./fork-launch.js";
4
+ const HEADER_ROWS = 1;
5
+ export class Fork {
6
+ cleanup;
7
+ binding;
8
+ roleLabel;
9
+ sourceSessionId;
10
+ driver;
11
+ pty;
12
+ vt;
13
+ visible = false;
14
+ killed = false;
15
+ constructor(slot, pty, vt, cleanup, host) {
16
+ this.cleanup = cleanup;
17
+ this.binding = slot.binding;
18
+ this.roleLabel = slot.roleLabel;
19
+ this.sourceSessionId = slot.sourceSessionId;
20
+ this.driver = slot.driver;
21
+ this.pty = pty;
22
+ this.vt = vt;
23
+ this.pty.onData((data) => {
24
+ if (this.killed)
25
+ return;
26
+ const stickyBottom = !this.vt.isScrolledBack;
27
+ const preWriteViewportY = this.vt.viewportY;
28
+ this.vt.write(data, () => {
29
+ if (this.killed)
30
+ return;
31
+ if (stickyBottom) {
32
+ if (this.vt.isScrolledBack)
33
+ this.vt.scrollToBottom();
34
+ }
35
+ else {
36
+ const currentY = this.vt.viewportY;
37
+ const delta = preWriteViewportY - currentY;
38
+ if (delta < 0)
39
+ this.vt.scrollBack(-delta);
40
+ else if (delta > 0)
41
+ this.vt.scrollForward(delta);
42
+ }
43
+ if (this.visible)
44
+ host.scheduleParentUiRender();
45
+ });
46
+ });
47
+ }
48
+ static async spawn(slot, workdir, host, cols, rows) {
49
+ const launch = await buildForkLaunch(slot, workdir);
50
+ const forkRows = Math.max(1, rows - HEADER_ROWS);
51
+ const forkCols = Math.max(1, cols);
52
+ let vt;
53
+ let pty;
54
+ try {
55
+ vt = new VirtualTerminal(forkCols, forkRows);
56
+ pty = spawnPty({
57
+ command: launch.command,
58
+ args: launch.args,
59
+ cwd: workdir,
60
+ cols: forkCols,
61
+ rows: forkRows,
62
+ interactive: true,
63
+ });
64
+ return new Fork(slot, pty, vt, launch.cleanup, host);
65
+ }
66
+ catch (err) {
67
+ try {
68
+ pty?.kill();
69
+ }
70
+ catch {
71
+ // The child may already have exited.
72
+ }
73
+ try {
74
+ vt?.dispose();
75
+ }
76
+ catch {
77
+ // Dispose is best-effort on construction failure.
78
+ }
79
+ try {
80
+ launch.cleanup();
81
+ }
82
+ catch {
83
+ // Preserve the original launch/spawn failure.
84
+ }
85
+ throw err;
86
+ }
87
+ }
88
+ setVisible(visible) {
89
+ this.visible = visible;
90
+ }
91
+ resize(cols, rows) {
92
+ const forkCols = Math.max(1, cols);
93
+ const forkRows = Math.max(1, rows - HEADER_ROWS);
94
+ this.vt.resize(forkCols, forkRows);
95
+ this.pty.resize(forkCols, forkRows);
96
+ }
97
+ kill() {
98
+ if (this.killed)
99
+ return;
100
+ this.killed = true;
101
+ this.visible = false;
102
+ try {
103
+ this.pty.kill();
104
+ }
105
+ catch {
106
+ // The child may already have exited.
107
+ }
108
+ try {
109
+ this.vt.dispose();
110
+ }
111
+ catch {
112
+ // Dispose is best-effort during process teardown.
113
+ }
114
+ try {
115
+ this.cleanup();
116
+ }
117
+ catch {
118
+ // Cleanup is best-effort during process teardown.
119
+ }
120
+ }
121
+ }
122
+ //# sourceMappingURL=fork.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork.js","sourceRoot":"","sources":["../../src/offscreen/fork.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TerminalKey } from "../terminal-input.js";
2
+ export declare function isPrimaryShowKey(key: TerminalKey): boolean;
3
+ export declare function isSecondaryShowKey(key: TerminalKey): boolean;
4
+ export declare function isShowKey(key: TerminalKey): boolean;
5
+ export declare function isHideKey(key: TerminalKey): boolean;
6
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/offscreen/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMxD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAE1D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAE5D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAEnD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAEnD"}
@@ -0,0 +1,16 @@
1
+ const CTRL_O = 0x0f;
2
+ const CTRL_Q = 0x11;
3
+ const CTRL_C = 0x03;
4
+ export function isPrimaryShowKey(key) {
5
+ return key.kind === "control" && key.byte === CTRL_O;
6
+ }
7
+ export function isSecondaryShowKey(key) {
8
+ return key.kind === "control" && key.byte === CTRL_Q;
9
+ }
10
+ export function isShowKey(key) {
11
+ return isPrimaryShowKey(key) || isSecondaryShowKey(key);
12
+ }
13
+ export function isHideKey(key) {
14
+ return key.kind === "control" && key.byte === CTRL_C;
15
+ }
16
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/offscreen/keys.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,IAAI,CAAC;AACpB,MAAM,MAAM,GAAG,IAAI,CAAC;AACpB,MAAM,MAAM,GAAG,IAAI,CAAC;AAEpB,MAAM,UAAU,gBAAgB,CAAC,GAAgB;IAC/C,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAgB;IACjD,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAgB;IACxC,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAgB;IACxC,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;AACvD,CAAC"}
@@ -0,0 +1,6 @@
1
+ type OffscreenDisposer = () => void;
2
+ export declare function registerOffscreenDisposer(disposer: OffscreenDisposer): () => void;
3
+ export declare function drainOffscreenDisposers(): void;
4
+ export declare function offscreenDisposerCount(): number;
5
+ export {};
6
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/offscreen/registry.ts"],"names":[],"mappings":"AAAA,KAAK,iBAAiB,GAAG,MAAM,IAAI,CAAC;AAIpC,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAQjF;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAU9C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C"}
@@ -0,0 +1,27 @@
1
+ const disposers = new Set();
2
+ export function registerOffscreenDisposer(disposer) {
3
+ disposers.add(disposer);
4
+ let removed = false;
5
+ return () => {
6
+ if (removed)
7
+ return;
8
+ removed = true;
9
+ disposers.delete(disposer);
10
+ };
11
+ }
12
+ export function drainOffscreenDisposers() {
13
+ const snapshot = Array.from(disposers);
14
+ disposers.clear();
15
+ for (const dispose of snapshot) {
16
+ try {
17
+ dispose();
18
+ }
19
+ catch {
20
+ // Abrupt-exit cleanup must be best-effort and non-throwing.
21
+ }
22
+ }
23
+ }
24
+ export function offscreenDisposerCount() {
25
+ return disposers.size;
26
+ }
27
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/offscreen/registry.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE/C,MAAM,UAAU,yBAAyB,CAAC,QAA2B;IACnE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,GAAG,EAAE;QACV,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;QAC9D,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,SAAS,CAAC,IAAI,CAAC;AACxB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { StepContext, BuiltinRole } from "../flow/types.js";
2
+ import type { ForkSourceConfig, ForkSourceKey, OffscreenSlot } from "./fork-launch.js";
3
+ export interface OffscreenPromptConfig {
4
+ workdir: string;
5
+ slots: OffscreenSlot[];
6
+ }
7
+ export declare function resolveOffscreenPromptConfig(phaseId: string, ctx: StepContext, forkSources: ReadonlyMap<ForkSourceKey, ForkSourceConfig>, workdir: string): Promise<OffscreenPromptConfig | undefined>;
8
+ export declare function findRestorableOffscreenSessionId(source: Pick<ForkSourceConfig, "sessionKey" | "role" | "variant">, ctx: StepContext): string | undefined;
9
+ export declare function forkSourceKeyForAgent(role: BuiltinRole, variant: string | undefined): ForkSourceKey | undefined;
10
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/offscreen/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAC;AAE7E,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EAEb,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AA0CD,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,WAAW,CAAC,aAAa,EAAE,gBAAgB,CAAC,EACzD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAiB5C;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC,EACjE,GAAG,EAAE,WAAW,GACf,MAAM,GAAG,SAAS,CAapB;AAsCD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,aAAa,GAAG,SAAS,CAK3B"}
@@ -0,0 +1,111 @@
1
+ import { resolveProvider } from "../providers/registry.js";
2
+ const PHASE_SLOTS = {
3
+ "user:spec-approval": [
4
+ {
5
+ key: "interviewer",
6
+ binding: "primary",
7
+ roleLabel: "interviewer",
8
+ hint: "Ctrl+O Inquire spec",
9
+ },
10
+ ],
11
+ "user:plan-approval": [
12
+ {
13
+ key: "planner",
14
+ binding: "primary",
15
+ roleLabel: "planner",
16
+ hint: "Ctrl+O Inquire plan",
17
+ },
18
+ ],
19
+ "user:curate-verdict": [
20
+ {
21
+ key: "planner",
22
+ binding: "primary",
23
+ roleLabel: "planner",
24
+ hint: "Ctrl+O Inquire plan",
25
+ },
26
+ {
27
+ key: "reviewer-plan",
28
+ binding: "secondary",
29
+ roleLabel: "reviewer",
30
+ hint: "Ctrl+Q Inquire issues",
31
+ },
32
+ ],
33
+ };
34
+ export async function resolveOffscreenPromptConfig(phaseId, ctx, forkSources, workdir) {
35
+ // Handlers pass the resolved step.id. The user() DSL prefixes a step's flow
36
+ // label with "user-", so user("user:plan-approval") resolves to step.id
37
+ // "user-user:plan-approval". PHASE_SLOTS is keyed by the bare flow label
38
+ // (matching the built-in flow definitions), so fall back to the de-prefixed id.
39
+ const requests = PHASE_SLOTS[phaseId] ?? PHASE_SLOTS[phaseId.replace(/^user-/, "")];
40
+ if (!requests)
41
+ return undefined;
42
+ if (forkSources.size === 0)
43
+ return undefined;
44
+ const slots = [];
45
+ for (const request of requests) {
46
+ const source = forkSources.get(request.key);
47
+ if (!source)
48
+ continue;
49
+ const slot = await resolveSlot(request, source, ctx, workdir);
50
+ if (slot)
51
+ slots.push(slot);
52
+ }
53
+ return { workdir, slots };
54
+ }
55
+ export function findRestorableOffscreenSessionId(source, ctx) {
56
+ const live = ctx.sessionIds.get(source.sessionKey);
57
+ if (live)
58
+ return live;
59
+ const snapshots = ctx.completedSnapshots
60
+ ? Array.from(ctx.completedSnapshots.values()).sort((a, b) => b.seq - a.seq)
61
+ : [];
62
+ for (const snap of snapshots) {
63
+ if (snap.role !== source.role)
64
+ continue;
65
+ const id = snap.sessionIds?.[source.sessionKey];
66
+ if (id)
67
+ return id;
68
+ }
69
+ return undefined;
70
+ }
71
+ function isDriverName(driver) {
72
+ return driver === "claude" || driver === "codex" || driver === "copilot";
73
+ }
74
+ async function resolveSlot(request, source, ctx, workdir) {
75
+ if (!isDriverName(source.driver))
76
+ return undefined;
77
+ const sourceSessionId = findRestorableOffscreenSessionId(source, ctx);
78
+ if (!sourceSessionId)
79
+ return undefined;
80
+ let sourceSessionPath;
81
+ try {
82
+ const provider = resolveProvider(source.driver);
83
+ sourceSessionPath = await provider.session.locateSessionById?.(workdir, sourceSessionId);
84
+ }
85
+ catch {
86
+ return undefined;
87
+ }
88
+ if (!sourceSessionPath)
89
+ return undefined;
90
+ return {
91
+ binding: request.binding,
92
+ roleLabel: request.roleLabel,
93
+ hint: request.hint,
94
+ driver: source.driver,
95
+ sourceSessionId,
96
+ sourceSessionPath,
97
+ model: source.model,
98
+ effort: source.effort,
99
+ yolo: source.yolo,
100
+ };
101
+ }
102
+ export function forkSourceKeyForAgent(role, variant) {
103
+ if (role === "interviewer")
104
+ return "interviewer";
105
+ if (role === "planner")
106
+ return "planner";
107
+ if (role === "reviewer" && variant === "plan")
108
+ return "reviewer-plan";
109
+ return undefined;
110
+ }
111
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/offscreen/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { HostUiSurface } from "../terminal/host.js";
2
+ import type { Fork } from "./fork.js";
3
+ export declare function buildForkSurface(fork: Fork, cols: number, rows: number): HostUiSurface;
4
+ //# sourceMappingURL=surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../../src/offscreen/surface.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAYtF"}
@@ -0,0 +1,24 @@
1
+ import { bold, padOrClip, reset } from "../ansi.js";
2
+ import { renderViewportLines } from "../terminal/render.js";
3
+ export function buildForkSurface(fork, cols, rows) {
4
+ const width = Math.max(1, cols);
5
+ const height = Math.max(1, rows);
6
+ const vtRows = Math.max(0, height - 1);
7
+ const headerText = ` Branched Inquiry - ${forkSurfaceLabel(fork.roleLabel)} · Ctrl+C hide`;
8
+ const header = `${bold}\x1b[45m\x1b[97m${padOrClip(headerText, width)}${reset}`;
9
+ const lines = [
10
+ header,
11
+ ...renderViewportLines(fork.vt, vtRows, width),
12
+ ];
13
+ return { lines, showCursor: false };
14
+ }
15
+ function forkSurfaceLabel(roleLabel) {
16
+ if (roleLabel === "interviewer")
17
+ return "Spec";
18
+ if (roleLabel === "planner")
19
+ return "Plan";
20
+ if (roleLabel === "reviewer")
21
+ return "Issues";
22
+ return roleLabel;
23
+ }
24
+ //# sourceMappingURL=surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.js","sourceRoot":"","sources":["../../src/offscreen/surface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,UAAU,gBAAgB,CAAC,IAAU,EAAE,IAAY,EAAE,IAAY;IACrE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,uBAAuB,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;IAC3F,MAAM,MAAM,GAAG,GAAG,IAAI,mBAAmB,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC;IAChF,MAAM,KAAK,GAAG;QACZ,MAAM;QACN,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC;KAC/C,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACzC,IAAI,SAAS,KAAK,aAAa;QAAE,OAAO,MAAM,CAAC;IAC/C,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAC3C,IAAI,SAAS,KAAK,UAAU;QAAE,OAAO,QAAQ,CAAC;IAC9C,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -5,7 +5,7 @@ import type { CuratePromptHandler } from "./user/curate-prompt.js";
5
5
  import type { StatusBar } from "./status-bar.js";
6
6
  import type { OrchestrationOutput } from "./terminal/output.js";
7
7
  import type { SessionManifest, SessionStepEntry } from "./session/manifest.js";
8
- import { type FlowTemplate, type FlowParamValues } from "./flow/types.js";
8
+ import { type FlowTemplate, type FlowParamValues, type FlowStep, type AgentStep } from "./flow/types.js";
9
9
  export declare class PlannerContractError extends Error {
10
10
  constructor(message: string);
11
11
  }
@@ -74,6 +74,8 @@ export interface TemplateOrchestratorOptions {
74
74
  output?: OrchestrationOutput;
75
75
  /** Optional terminal host for parent-owned rendering. */
76
76
  terminalHost?: import("./terminal/host.js").TerminalHost;
77
+ /** Optional timeout for provider session-file discovery. */
78
+ sessionFileWaitMs?: number;
77
79
  /**
78
80
  * Required for fresh runs (unless `persistence === "disabled"`); ignored
79
81
  * for resumed runs. Path to the flow's source file (the factory
@@ -112,4 +114,6 @@ export declare function createCuratePromptHandler(terminalHost?: import("./termi
112
114
  * drivers dynamically; structure params shape the flow via build().
113
115
  */
114
116
  export declare function orchestrateWithTemplate(opts: TemplateOrchestratorOptions): Promise<OrchestratorResult>;
117
+ /** Recursively walk flow steps and yield all AgentStep nodes. */
118
+ export declare function collectAgentSteps(steps: FlowStep[]): AgentStep[];
115
119
  //# sourceMappingURL=orchestrator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ import { getSessionsDir } from "./config.js";
22
22
  import { captureFlowSnapshot } from "./session/flow-snapshot.js";
23
23
  import { SessionStore } from "./session/session-store.js";
24
24
  import { acquireLock, releaseLock } from "./session/lock.js";
25
+ import { forkSourceKeyForAgent, } from "./offscreen/resolve.js";
25
26
  import { TASK, handlerKey, } from "./flow/types.js";
26
27
  export class PlannerContractError extends Error {
27
28
  constructor(message) {
@@ -324,10 +325,9 @@ export async function orchestrateWithTemplate(opts) {
324
325
  const handler = opts.userPromptHandler
325
326
  ?? (needsUserPrompt ? createUserPromptHandler(opts.terminalHost) : undefined);
326
327
  const handlers = new Map();
328
+ const forkSources = new Map();
327
329
  for (const step of collectAgentSteps(flow.steps)) {
328
330
  const key = handlerKey(step);
329
- if (handlers.has(key))
330
- continue;
331
331
  const role = step.role;
332
332
  const { modelKey, effortKey } = getRoleModelEffortKeys(role, opts.template.params);
333
333
  const model = modelKey
@@ -336,16 +336,35 @@ export async function orchestrateWithTemplate(opts) {
336
336
  const effort = effortKey
337
337
  ? effectiveParamValues[effortKey]
338
338
  : undefined;
339
+ const forkKey = forkSourceKeyForAgent(role, step.variant);
340
+ if (forkKey && !forkSources.has(forkKey)) {
341
+ forkSources.set(forkKey, {
342
+ key: forkKey,
343
+ role,
344
+ variant: step.variant,
345
+ driver: step.driver,
346
+ sessionKey: step.sessionShareKey ?? step.id,
347
+ model,
348
+ effort,
349
+ yolo: opts.yolo,
350
+ });
351
+ }
352
+ if (handlers.has(key))
353
+ continue;
339
354
  handlers.set(key, createHandler(step.role, step.driver, workdir, {
340
- variant: step.variant, yolo: opts.yolo, model, effort,
355
+ variant: step.variant,
356
+ yolo: opts.yolo,
357
+ model,
358
+ effort,
359
+ sessionFileWaitMs: opts.sessionFileWaitMs,
341
360
  }));
342
361
  }
343
362
  if (handler) {
344
- handlers.set("user", new UserRoleHandler(handler));
363
+ handlers.set("user", new UserRoleHandler(handler, forkSources, workdir));
345
364
  }
346
365
  if (stepsContainCuratePrompt(flow.steps)) {
347
366
  const curatePrompt = opts.curatePromptHandler ?? createCuratePromptHandler(opts.terminalHost);
348
- handlers.set("user:curate-verdict", new CurateVerdictRoleHandler(curatePrompt));
367
+ handlers.set("user:curate-verdict", new CurateVerdictRoleHandler(curatePrompt, forkSources, workdir));
349
368
  }
350
369
  const ctx = {
351
370
  sessionDir: ephemeralSessionDir,
@@ -451,7 +470,7 @@ export async function orchestrateWithTemplate(opts) {
451
470
  }
452
471
  }
453
472
  /** Recursively walk flow steps and yield all AgentStep nodes. */
454
- function collectAgentSteps(steps) {
473
+ export function collectAgentSteps(steps) {
455
474
  const result = [];
456
475
  for (const step of steps) {
457
476
  if (step.type === "agent") {