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.
- package/README.md +5 -8
- package/dist/agents/implementors/adapter.d.ts +1 -1
- package/dist/agents/implementors/adapter.d.ts.map +1 -1
- package/dist/agents/implementors/adapter.js +2 -2
- package/dist/agents/implementors/adapter.js.map +1 -1
- package/dist/agents/implementors/index.d.ts.map +1 -1
- package/dist/agents/implementors/index.js +1 -1
- package/dist/agents/implementors/index.js.map +1 -1
- package/dist/agents/interviewers/adapter.d.ts +1 -1
- package/dist/agents/interviewers/adapter.d.ts.map +1 -1
- package/dist/agents/interviewers/adapter.js +2 -2
- package/dist/agents/interviewers/adapter.js.map +1 -1
- package/dist/agents/interviewers/index.d.ts.map +1 -1
- package/dist/agents/interviewers/index.js +1 -1
- package/dist/agents/interviewers/index.js.map +1 -1
- package/dist/agents/planners/adapter.d.ts +1 -1
- package/dist/agents/planners/adapter.d.ts.map +1 -1
- package/dist/agents/planners/adapter.js +2 -2
- package/dist/agents/planners/adapter.js.map +1 -1
- package/dist/agents/planners/index.d.ts.map +1 -1
- package/dist/agents/planners/index.js +1 -1
- package/dist/agents/planners/index.js.map +1 -1
- package/dist/agents/registry.d.ts +1 -0
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js.map +1 -1
- package/dist/agents/reviewers/adapter.d.ts +1 -1
- package/dist/agents/reviewers/adapter.d.ts.map +1 -1
- package/dist/agents/reviewers/adapter.js +3 -3
- package/dist/agents/reviewers/adapter.js.map +1 -1
- package/dist/agents/reviewers/handler.d.ts.map +1 -1
- package/dist/agents/reviewers/handler.js +7 -0
- package/dist/agents/reviewers/handler.js.map +1 -1
- package/dist/agents/reviewers/index.d.ts.map +1 -1
- package/dist/agents/reviewers/index.js +1 -1
- package/dist/agents/reviewers/index.js.map +1 -1
- package/dist/agents/reviewers/prompts.d.ts +2 -2
- package/dist/agents/reviewers/prompts.d.ts.map +1 -1
- package/dist/agents/reviewers/prompts.js +12 -2
- package/dist/agents/reviewers/prompts.js.map +1 -1
- package/dist/agents/reviewers/types.d.ts +3 -1
- package/dist/agents/reviewers/types.d.ts.map +1 -1
- package/dist/agents/reviewers/types.js.map +1 -1
- package/dist/agents/runner.d.ts +3 -2
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +48 -10
- package/dist/agents/runner.js.map +1 -1
- package/dist/agents/simplifiers/adapter.d.ts +1 -1
- package/dist/agents/simplifiers/adapter.d.ts.map +1 -1
- package/dist/agents/simplifiers/adapter.js +2 -2
- package/dist/agents/simplifiers/adapter.js.map +1 -1
- package/dist/agents/simplifiers/index.d.ts.map +1 -1
- package/dist/agents/simplifiers/index.js +1 -1
- package/dist/agents/simplifiers/index.js.map +1 -1
- package/dist/cli.js +20 -6
- package/dist/cli.js.map +1 -1
- package/dist/flow/built-in/default-factory.d.ts.map +1 -1
- package/dist/flow/built-in/default-factory.js +1 -2
- package/dist/flow/built-in/default-factory.js.map +1 -1
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.d.ts.map +1 -1
- package/dist/flow/index.js +1 -1
- package/dist/flow/index.js.map +1 -1
- package/dist/flow/params.d.ts +1 -0
- package/dist/flow/params.d.ts.map +1 -1
- package/dist/flow/params.js +14 -0
- package/dist/flow/params.js.map +1 -1
- package/dist/markdown.js +59 -29
- package/dist/markdown.js.map +1 -1
- package/dist/offscreen/controller.d.ts +21 -0
- package/dist/offscreen/controller.d.ts.map +1 -0
- package/dist/offscreen/controller.js +185 -0
- package/dist/offscreen/controller.js.map +1 -0
- package/dist/offscreen/fork-launch.d.ts +31 -0
- package/dist/offscreen/fork-launch.d.ts.map +1 -0
- package/dist/offscreen/fork-launch.js +76 -0
- package/dist/offscreen/fork-launch.js.map +1 -0
- package/dist/offscreen/fork.d.ts +21 -0
- package/dist/offscreen/fork.d.ts.map +1 -0
- package/dist/offscreen/fork.js +122 -0
- package/dist/offscreen/fork.js.map +1 -0
- package/dist/offscreen/keys.d.ts +6 -0
- package/dist/offscreen/keys.d.ts.map +1 -0
- package/dist/offscreen/keys.js +16 -0
- package/dist/offscreen/keys.js.map +1 -0
- package/dist/offscreen/registry.d.ts +6 -0
- package/dist/offscreen/registry.d.ts.map +1 -0
- package/dist/offscreen/registry.js +27 -0
- package/dist/offscreen/registry.js.map +1 -0
- package/dist/offscreen/resolve.d.ts +10 -0
- package/dist/offscreen/resolve.d.ts.map +1 -0
- package/dist/offscreen/resolve.js +111 -0
- package/dist/offscreen/resolve.js.map +1 -0
- package/dist/offscreen/surface.d.ts +4 -0
- package/dist/offscreen/surface.d.ts.map +1 -0
- package/dist/offscreen/surface.js +24 -0
- package/dist/offscreen/surface.js.map +1 -0
- package/dist/orchestrator.d.ts +5 -1
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +25 -6
- package/dist/orchestrator.js.map +1 -1
- package/dist/providers/claude/session.d.ts +4 -0
- package/dist/providers/claude/session.d.ts.map +1 -1
- package/dist/providers/claude/session.js +7 -2
- package/dist/providers/claude/session.js.map +1 -1
- package/dist/providers/codex/session.d.ts +4 -0
- package/dist/providers/codex/session.d.ts.map +1 -1
- package/dist/providers/codex/session.js +68 -3
- package/dist/providers/codex/session.js.map +1 -1
- package/dist/providers/copilot/session.d.ts +6 -0
- package/dist/providers/copilot/session.d.ts.map +1 -1
- package/dist/providers/copilot/session.js +13 -4
- package/dist/providers/copilot/session.js.map +1 -1
- package/dist/providers/copilot/strategy.d.ts.map +1 -1
- package/dist/providers/copilot/strategy.js +6 -1
- package/dist/providers/copilot/strategy.js.map +1 -1
- package/dist/providers/trust.d.ts +12 -0
- package/dist/providers/trust.d.ts.map +1 -0
- package/dist/providers/trust.js +220 -0
- package/dist/providers/trust.js.map +1 -0
- package/dist/providers/types.d.ts +7 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/session/locator.d.ts +7 -1
- package/dist/session/locator.d.ts.map +1 -1
- package/dist/session/locator.js +10 -3
- package/dist/session/locator.js.map +1 -1
- package/dist/session/resume.d.ts.map +1 -1
- package/dist/session/resume.js +16 -3
- package/dist/session/resume.js.map +1 -1
- package/dist/status-bar.d.ts +0 -2
- package/dist/status-bar.d.ts.map +1 -1
- package/dist/status-bar.js +1 -17
- package/dist/status-bar.js.map +1 -1
- package/dist/terminal/host.d.ts +8 -0
- package/dist/terminal/host.d.ts.map +1 -1
- package/dist/terminal/host.js +32 -19
- package/dist/terminal/host.js.map +1 -1
- package/dist/terminal/input-router.d.ts +10 -3
- package/dist/terminal/input-router.d.ts.map +1 -1
- package/dist/terminal/input-router.js +22 -5
- package/dist/terminal/input-router.js.map +1 -1
- package/dist/terminal/key-to-bytes.d.ts +4 -1
- package/dist/terminal/key-to-bytes.d.ts.map +1 -1
- package/dist/terminal/key-to-bytes.js +6 -5
- package/dist/terminal/key-to-bytes.js.map +1 -1
- package/dist/terminal/render.d.ts +12 -1
- package/dist/terminal/render.d.ts.map +1 -1
- package/dist/terminal/render.js +37 -5
- package/dist/terminal/render.js.map +1 -1
- package/dist/terminal/win32-console-source.d.ts.map +1 -1
- package/dist/terminal/win32-console-source.js +3 -1
- package/dist/terminal/win32-console-source.js.map +1 -1
- package/dist/terminal-input.d.ts +2 -0
- package/dist/terminal-input.d.ts.map +1 -1
- package/dist/terminal-input.js +26 -6
- package/dist/terminal-input.js.map +1 -1
- package/dist/user/curate-handler.d.ts +6 -1
- package/dist/user/curate-handler.d.ts.map +1 -1
- package/dist/user/curate-handler.js +11 -2
- package/dist/user/curate-handler.js.map +1 -1
- package/dist/user/curate-prompt.d.ts +5 -1
- package/dist/user/curate-prompt.d.ts.map +1 -1
- package/dist/user/curate-prompt.js.map +1 -1
- package/dist/user/handler.d.ts +6 -1
- package/dist/user/handler.d.ts.map +1 -1
- package/dist/user/handler.js +12 -1
- package/dist/user/handler.js.map +1 -1
- package/dist/user/host-curate-prompt.d.ts +2 -1
- package/dist/user/host-curate-prompt.d.ts.map +1 -1
- package/dist/user/host-curate-prompt.js +87 -32
- package/dist/user/host-curate-prompt.js.map +1 -1
- package/dist/user/host-prompt.d.ts +2 -3
- package/dist/user/host-prompt.d.ts.map +1 -1
- package/dist/user/host-prompt.js +46 -26
- package/dist/user/host-prompt.js.map +1 -1
- package/dist/user/index.d.ts +1 -1
- package/dist/user/index.d.ts.map +1 -1
- package/dist/user/prompt.d.ts +6 -0
- package/dist/user/prompt.d.ts.map +1 -1
- package/dist/user/prompt.js.map +1 -1
- package/dist/user/shortcut-hints.d.ts +2 -0
- package/dist/user/shortcut-hints.d.ts.map +1 -0
- package/dist/user/shortcut-hints.js +15 -0
- package/dist/user/shortcut-hints.js.map +1 -0
- package/docs/startup-tui.png +0 -0
- 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":"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"}
|
|
@@ -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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EACL,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,MAAM,OAAO,IAAI;IAcI;IAbV,OAAO,CAA2B;IAClC,SAAS,CAAS;IAClB,eAAe,CAAS;IACxB,MAAM,CAA0B;IAChC,GAAG,CAAY;IACf,EAAE,CAAkB;IACrB,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,KAAK,CAAC;IAEvB,YACE,IAAmB,EACnB,GAAc,EACd,EAAmB,EACF,OAAmB,EACpC,IAAkD;QADjC,YAAO,GAAP,OAAO,CAAY;QAGpC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAEb,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YACxB,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC;YAC7C,MAAM,iBAAiB,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;YAC5C,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE;gBACvB,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACxB,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,IAAI,CAAC,EAAE,CAAC,cAAc;wBAAE,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;gBACvD,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;oBACnC,MAAM,KAAK,GAAG,iBAAiB,GAAG,QAAQ,CAAC;oBAC3C,IAAI,KAAK,GAAG,CAAC;wBAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC;yBACrC,IAAI,KAAK,GAAG,CAAC;wBAAE,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACnD,CAAC;gBACD,IAAI,IAAI,CAAC,OAAO;oBAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAChB,IAAmB,EACnB,OAAe,EACf,IAAkD,EAClD,IAAY,EACZ,IAAY;QAEZ,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,EAA+B,CAAC;QACpC,IAAI,GAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,EAAE,GAAG,IAAI,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC7C,GAAG,GAAG,QAAQ,CAAC;gBACb,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,EAAE,OAAO;gBACZ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;YACH,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,GAAG,EAAE,IAAI,EAAE,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;YACvC,CAAC;YACD,IAAI,CAAC;gBACH,EAAE,EAAE,OAAO,EAAE,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,kDAAkD;YACpD,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,UAAU,CAAC,OAAgB;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,IAAY;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;QACD,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;QACD,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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 @@
|
|
|
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"}
|
package/dist/orchestrator.d.ts
CHANGED
|
@@ -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":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAOjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAYhE,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
|
package/dist/orchestrator.js
CHANGED
|
@@ -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,
|
|
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") {
|