poly-weaver 0.2.5
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 +388 -0
- package/dist/agents/implementors/adapter.d.ts +18 -0
- package/dist/agents/implementors/adapter.d.ts.map +1 -0
- package/dist/agents/implementors/adapter.js +36 -0
- package/dist/agents/implementors/adapter.js.map +1 -0
- package/dist/agents/implementors/dsl.d.ts +11 -0
- package/dist/agents/implementors/dsl.d.ts.map +1 -0
- package/dist/agents/implementors/dsl.js +9 -0
- package/dist/agents/implementors/dsl.js.map +1 -0
- package/dist/agents/implementors/handler.d.ts +10 -0
- package/dist/agents/implementors/handler.d.ts.map +1 -0
- package/dist/agents/implementors/handler.js +55 -0
- package/dist/agents/implementors/handler.js.map +1 -0
- package/dist/agents/implementors/index.d.ts +10 -0
- package/dist/agents/implementors/index.d.ts.map +1 -0
- package/dist/agents/implementors/index.js +21 -0
- package/dist/agents/implementors/index.js.map +1 -0
- package/dist/agents/implementors/prompts.d.ts +20 -0
- package/dist/agents/implementors/prompts.d.ts.map +1 -0
- package/dist/agents/implementors/prompts.js +72 -0
- package/dist/agents/implementors/prompts.js.map +1 -0
- package/dist/agents/implementors/types.d.ts +24 -0
- package/dist/agents/implementors/types.d.ts.map +1 -0
- package/dist/agents/implementors/types.js +2 -0
- package/dist/agents/implementors/types.js.map +1 -0
- package/dist/agents/index.d.ts +12 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +25 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/planners/adapter.d.ts +22 -0
- package/dist/agents/planners/adapter.d.ts.map +1 -0
- package/dist/agents/planners/adapter.js +67 -0
- package/dist/agents/planners/adapter.js.map +1 -0
- package/dist/agents/planners/dsl.d.ts +13 -0
- package/dist/agents/planners/dsl.d.ts.map +1 -0
- package/dist/agents/planners/dsl.js +9 -0
- package/dist/agents/planners/dsl.js.map +1 -0
- package/dist/agents/planners/handler.d.ts +9 -0
- package/dist/agents/planners/handler.d.ts.map +1 -0
- package/dist/agents/planners/handler.js +86 -0
- package/dist/agents/planners/handler.js.map +1 -0
- package/dist/agents/planners/index.d.ts +10 -0
- package/dist/agents/planners/index.d.ts.map +1 -0
- package/dist/agents/planners/index.js +21 -0
- package/dist/agents/planners/index.js.map +1 -0
- package/dist/agents/planners/prompts.d.ts +30 -0
- package/dist/agents/planners/prompts.d.ts.map +1 -0
- package/dist/agents/planners/prompts.js +153 -0
- package/dist/agents/planners/prompts.js.map +1 -0
- package/dist/agents/planners/types.d.ts +37 -0
- package/dist/agents/planners/types.d.ts.map +1 -0
- package/dist/agents/planners/types.js +2 -0
- package/dist/agents/planners/types.js.map +1 -0
- package/dist/agents/registry.d.ts +29 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +44 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/reviewers/adapter.d.ts +10 -0
- package/dist/agents/reviewers/adapter.d.ts.map +1 -0
- package/dist/agents/reviewers/adapter.js +35 -0
- package/dist/agents/reviewers/adapter.js.map +1 -0
- package/dist/agents/reviewers/dsl.d.ts +12 -0
- package/dist/agents/reviewers/dsl.d.ts.map +1 -0
- package/dist/agents/reviewers/dsl.js +9 -0
- package/dist/agents/reviewers/dsl.js.map +1 -0
- package/dist/agents/reviewers/handler.d.ts +8 -0
- package/dist/agents/reviewers/handler.d.ts.map +1 -0
- package/dist/agents/reviewers/handler.js +48 -0
- package/dist/agents/reviewers/handler.js.map +1 -0
- package/dist/agents/reviewers/index.d.ts +10 -0
- package/dist/agents/reviewers/index.d.ts.map +1 -0
- package/dist/agents/reviewers/index.js +33 -0
- package/dist/agents/reviewers/index.js.map +1 -0
- package/dist/agents/reviewers/prompts.d.ts +25 -0
- package/dist/agents/reviewers/prompts.d.ts.map +1 -0
- package/dist/agents/reviewers/prompts.js +143 -0
- package/dist/agents/reviewers/prompts.js.map +1 -0
- package/dist/agents/reviewers/types.d.ts +35 -0
- package/dist/agents/reviewers/types.d.ts.map +1 -0
- package/dist/agents/reviewers/types.js +10 -0
- package/dist/agents/reviewers/types.js.map +1 -0
- package/dist/agents/runner.d.ts +62 -0
- package/dist/agents/runner.d.ts.map +1 -0
- package/dist/agents/runner.js +136 -0
- package/dist/agents/runner.js.map +1 -0
- package/dist/agents/simplifiers/adapter.d.ts +12 -0
- package/dist/agents/simplifiers/adapter.d.ts.map +1 -0
- package/dist/agents/simplifiers/adapter.js +27 -0
- package/dist/agents/simplifiers/adapter.js.map +1 -0
- package/dist/agents/simplifiers/dsl.d.ts +11 -0
- package/dist/agents/simplifiers/dsl.d.ts.map +1 -0
- package/dist/agents/simplifiers/dsl.js +9 -0
- package/dist/agents/simplifiers/dsl.js.map +1 -0
- package/dist/agents/simplifiers/handler.d.ts +9 -0
- package/dist/agents/simplifiers/handler.d.ts.map +1 -0
- package/dist/agents/simplifiers/handler.js +39 -0
- package/dist/agents/simplifiers/handler.js.map +1 -0
- package/dist/agents/simplifiers/index.d.ts +10 -0
- package/dist/agents/simplifiers/index.d.ts.map +1 -0
- package/dist/agents/simplifiers/index.js +20 -0
- package/dist/agents/simplifiers/index.js.map +1 -0
- package/dist/agents/simplifiers/prompts.d.ts +11 -0
- package/dist/agents/simplifiers/prompts.d.ts.map +1 -0
- package/dist/agents/simplifiers/prompts.js +24 -0
- package/dist/agents/simplifiers/prompts.js.map +1 -0
- package/dist/agents/simplifiers/types.d.ts +15 -0
- package/dist/agents/simplifiers/types.d.ts.map +1 -0
- package/dist/agents/simplifiers/types.js +2 -0
- package/dist/agents/simplifiers/types.js.map +1 -0
- package/dist/agents/whip-hint.d.ts +23 -0
- package/dist/agents/whip-hint.d.ts.map +1 -0
- package/dist/agents/whip-hint.js +41 -0
- package/dist/agents/whip-hint.js.map +1 -0
- package/dist/ansi.d.ts +39 -0
- package/dist/ansi.d.ts.map +1 -0
- package/dist/ansi.js +158 -0
- package/dist/ansi.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +309 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +55 -0
- package/dist/config.js.map +1 -0
- package/dist/dsl.d.ts +25 -0
- package/dist/dsl.d.ts.map +1 -0
- package/dist/dsl.js +16 -0
- package/dist/dsl.js.map +1 -0
- package/dist/flow/artifacts.d.ts +13 -0
- package/dist/flow/artifacts.d.ts.map +1 -0
- package/dist/flow/artifacts.js +27 -0
- package/dist/flow/artifacts.js.map +1 -0
- package/dist/flow/built-in/default.d.ts +15 -0
- package/dist/flow/built-in/default.d.ts.map +1 -0
- package/dist/flow/built-in/default.js +123 -0
- package/dist/flow/built-in/default.js.map +1 -0
- package/dist/flow/built-in/default.ts +152 -0
- package/dist/flow/built-in/why-so-serious.d.ts +15 -0
- package/dist/flow/built-in/why-so-serious.d.ts.map +1 -0
- package/dist/flow/built-in/why-so-serious.js +147 -0
- package/dist/flow/built-in/why-so-serious.js.map +1 -0
- package/dist/flow/custom/AUTHORING.md +558 -0
- package/dist/flow/custom/index.d.ts +3 -0
- package/dist/flow/custom/index.d.ts.map +1 -0
- package/dist/flow/custom/index.js +2 -0
- package/dist/flow/custom/index.js.map +1 -0
- package/dist/flow/custom/load.d.ts +19 -0
- package/dist/flow/custom/load.d.ts.map +1 -0
- package/dist/flow/custom/load.js +117 -0
- package/dist/flow/custom/load.js.map +1 -0
- package/dist/flow/diagram.d.ts +37 -0
- package/dist/flow/diagram.d.ts.map +1 -0
- package/dist/flow/diagram.js +596 -0
- package/dist/flow/diagram.js.map +1 -0
- package/dist/flow/dsl.d.ts +65 -0
- package/dist/flow/dsl.d.ts.map +1 -0
- package/dist/flow/dsl.js +210 -0
- package/dist/flow/dsl.js.map +1 -0
- package/dist/flow/executor.d.ts +22 -0
- package/dist/flow/executor.d.ts.map +1 -0
- package/dist/flow/executor.js +185 -0
- package/dist/flow/executor.js.map +1 -0
- package/dist/flow/index.d.ts +16 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/flow/index.js +12 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/flow/inspect.d.ts +21 -0
- package/dist/flow/inspect.d.ts.map +1 -0
- package/dist/flow/inspect.js +54 -0
- package/dist/flow/inspect.js.map +1 -0
- package/dist/flow/neighbors.d.ts +10 -0
- package/dist/flow/neighbors.d.ts.map +1 -0
- package/dist/flow/neighbors.js +48 -0
- package/dist/flow/neighbors.js.map +1 -0
- package/dist/flow/params.d.ts +21 -0
- package/dist/flow/params.d.ts.map +1 -0
- package/dist/flow/params.js +44 -0
- package/dist/flow/params.js.map +1 -0
- package/dist/flow/types.d.ts +159 -0
- package/dist/flow/types.d.ts.map +1 -0
- package/dist/flow/types.js +33 -0
- package/dist/flow/types.js.map +1 -0
- package/dist/flow-editor/index.d.ts +9 -0
- package/dist/flow-editor/index.d.ts.map +1 -0
- package/dist/flow-editor/index.js +6 -0
- package/dist/flow-editor/index.js.map +1 -0
- package/dist/flow-editor/llm.d.ts +33 -0
- package/dist/flow-editor/llm.d.ts.map +1 -0
- package/dist/flow-editor/llm.js +137 -0
- package/dist/flow-editor/llm.js.map +1 -0
- package/dist/flow-editor/names.d.ts +5 -0
- package/dist/flow-editor/names.d.ts.map +1 -0
- package/dist/flow-editor/names.js +21 -0
- package/dist/flow-editor/names.js.map +1 -0
- package/dist/flow-editor/save.d.ts +59 -0
- package/dist/flow-editor/save.d.ts.map +1 -0
- package/dist/flow-editor/save.js +143 -0
- package/dist/flow-editor/save.js.map +1 -0
- package/dist/flow-editor/tui.d.ts +56 -0
- package/dist/flow-editor/tui.d.ts.map +1 -0
- package/dist/flow-editor/tui.js +628 -0
- package/dist/flow-editor/tui.js.map +1 -0
- package/dist/flow-editor/validate.d.ts +39 -0
- package/dist/flow-editor/validate.d.ts.map +1 -0
- package/dist/flow-editor/validate.js +192 -0
- package/dist/flow-editor/validate.js.map +1 -0
- package/dist/git-info.d.ts +6 -0
- package/dist/git-info.d.ts.map +1 -0
- package/dist/git-info.js +26 -0
- package/dist/git-info.js.map +1 -0
- package/dist/orchestrator.d.ts +55 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +240 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/preflight.d.ts +30 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +107 -0
- package/dist/preflight.js.map +1 -0
- package/dist/preview-panel.d.ts +87 -0
- package/dist/preview-panel.d.ts.map +1 -0
- package/dist/preview-panel.js +418 -0
- package/dist/preview-panel.js.map +1 -0
- package/dist/prompts.d.ts +34 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +67 -0
- package/dist/prompts.js.map +1 -0
- package/dist/providers/base-completion.d.ts +56 -0
- package/dist/providers/base-completion.d.ts.map +1 -0
- package/dist/providers/base-completion.js +111 -0
- package/dist/providers/base-completion.js.map +1 -0
- package/dist/providers/claude/completion.d.ts +28 -0
- package/dist/providers/claude/completion.d.ts.map +1 -0
- package/dist/providers/claude/completion.js +103 -0
- package/dist/providers/claude/completion.js.map +1 -0
- package/dist/providers/claude/index.d.ts +2 -0
- package/dist/providers/claude/index.d.ts.map +1 -0
- package/dist/providers/claude/index.js +2 -0
- package/dist/providers/claude/index.js.map +1 -0
- package/dist/providers/claude/session.d.ts +55 -0
- package/dist/providers/claude/session.d.ts.map +1 -0
- package/dist/providers/claude/session.js +172 -0
- package/dist/providers/claude/session.js.map +1 -0
- package/dist/providers/claude/strategy.d.ts +14 -0
- package/dist/providers/claude/strategy.d.ts.map +1 -0
- package/dist/providers/claude/strategy.js +38 -0
- package/dist/providers/claude/strategy.js.map +1 -0
- package/dist/providers/codex/completion.d.ts +21 -0
- package/dist/providers/codex/completion.d.ts.map +1 -0
- package/dist/providers/codex/completion.js +63 -0
- package/dist/providers/codex/completion.js.map +1 -0
- package/dist/providers/codex/index.d.ts +2 -0
- package/dist/providers/codex/index.d.ts.map +1 -0
- package/dist/providers/codex/index.js +2 -0
- package/dist/providers/codex/index.js.map +1 -0
- package/dist/providers/codex/session.d.ts +46 -0
- package/dist/providers/codex/session.d.ts.map +1 -0
- package/dist/providers/codex/session.js +151 -0
- package/dist/providers/codex/session.js.map +1 -0
- package/dist/providers/codex/strategy.d.ts +14 -0
- package/dist/providers/codex/strategy.d.ts.map +1 -0
- package/dist/providers/codex/strategy.js +41 -0
- package/dist/providers/codex/strategy.js.map +1 -0
- package/dist/providers/copilot/completion.d.ts +22 -0
- package/dist/providers/copilot/completion.d.ts.map +1 -0
- package/dist/providers/copilot/completion.js +65 -0
- package/dist/providers/copilot/completion.js.map +1 -0
- package/dist/providers/copilot/index.d.ts +2 -0
- package/dist/providers/copilot/index.d.ts.map +1 -0
- package/dist/providers/copilot/index.js +2 -0
- package/dist/providers/copilot/index.js.map +1 -0
- package/dist/providers/copilot/session.d.ts +39 -0
- package/dist/providers/copilot/session.d.ts.map +1 -0
- package/dist/providers/copilot/session.js +185 -0
- package/dist/providers/copilot/session.js.map +1 -0
- package/dist/providers/copilot/strategy.d.ts +14 -0
- package/dist/providers/copilot/strategy.d.ts.map +1 -0
- package/dist/providers/copilot/strategy.js +48 -0
- package/dist/providers/copilot/strategy.js.map +1 -0
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/invoke.d.ts +14 -0
- package/dist/providers/invoke.d.ts.map +1 -0
- package/dist/providers/invoke.js +55 -0
- package/dist/providers/invoke.js.map +1 -0
- package/dist/providers/path-utils.d.ts +7 -0
- package/dist/providers/path-utils.d.ts.map +1 -0
- package/dist/providers/path-utils.js +9 -0
- package/dist/providers/path-utils.js.map +1 -0
- package/dist/providers/prompt-file.d.ts +8 -0
- package/dist/providers/prompt-file.d.ts.map +1 -0
- package/dist/providers/prompt-file.js +17 -0
- package/dist/providers/prompt-file.js.map +1 -0
- package/dist/providers/registry.d.ts +17 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +49 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +145 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +5 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/providers/version.d.ts +11 -0
- package/dist/providers/version.d.ts.map +1 -0
- package/dist/providers/version.js +31 -0
- package/dist/providers/version.js.map +1 -0
- package/dist/pty/exit.d.ts +12 -0
- package/dist/pty/exit.d.ts.map +1 -0
- package/dist/pty/exit.js +43 -0
- package/dist/pty/exit.js.map +1 -0
- package/dist/pty/spawn.d.ts +20 -0
- package/dist/pty/spawn.d.ts.map +1 -0
- package/dist/pty/spawn.js +163 -0
- package/dist/pty/spawn.js.map +1 -0
- package/dist/pty/types.d.ts +44 -0
- package/dist/pty/types.d.ts.map +1 -0
- package/dist/pty/types.js +2 -0
- package/dist/pty/types.js.map +1 -0
- package/dist/session/dir.d.ts +19 -0
- package/dist/session/dir.d.ts.map +1 -0
- package/dist/session/dir.js +31 -0
- package/dist/session/dir.js.map +1 -0
- package/dist/session/locator.d.ts +28 -0
- package/dist/session/locator.d.ts.map +1 -0
- package/dist/session/locator.js +88 -0
- package/dist/session/locator.js.map +1 -0
- package/dist/session/reader.d.ts +12 -0
- package/dist/session/reader.d.ts.map +1 -0
- package/dist/session/reader.js +94 -0
- package/dist/session/reader.js.map +1 -0
- package/dist/startup-tui.d.ts +75 -0
- package/dist/startup-tui.d.ts.map +1 -0
- package/dist/startup-tui.js +504 -0
- package/dist/startup-tui.js.map +1 -0
- package/dist/status-bar.d.ts +29 -0
- package/dist/status-bar.d.ts.map +1 -0
- package/dist/status-bar.js +135 -0
- package/dist/status-bar.js.map +1 -0
- package/dist/terminal-input.d.ts +51 -0
- package/dist/terminal-input.d.ts.map +1 -0
- package/dist/terminal-input.js +212 -0
- package/dist/terminal-input.js.map +1 -0
- package/dist/user/dsl.d.ts +13 -0
- package/dist/user/dsl.d.ts.map +1 -0
- package/dist/user/dsl.js +19 -0
- package/dist/user/dsl.js.map +1 -0
- package/dist/user/handler.d.ts +16 -0
- package/dist/user/handler.d.ts.map +1 -0
- package/dist/user/handler.js +49 -0
- package/dist/user/handler.js.map +1 -0
- package/dist/user/index.d.ts +5 -0
- package/dist/user/index.d.ts.map +1 -0
- package/dist/user/index.js +4 -0
- package/dist/user/index.js.map +1 -0
- package/dist/user/prompt.d.ts +86 -0
- package/dist/user/prompt.d.ts.map +1 -0
- package/dist/user/prompt.js +320 -0
- package/dist/user/prompt.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/package.json +50 -0
- package/schemas/review-verdict.json +41 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { visibleLength } from "./ansi.js";
|
|
2
|
+
import { APP_VERSION } from "./version.js";
|
|
3
|
+
function formatContext(ctx) {
|
|
4
|
+
if (ctx.iteration != null && ctx.maxIterations != null) {
|
|
5
|
+
return `Iteration ${ctx.iteration}/${ctx.maxIterations}`;
|
|
6
|
+
}
|
|
7
|
+
return "";
|
|
8
|
+
}
|
|
9
|
+
const ANIMAL_EMOJIS = [
|
|
10
|
+
"🐶", "🐱", "🐭", "🐹", "🐰", "🦊", "🐻", "🐼",
|
|
11
|
+
"🐨", "🐯", "🦁", "🐮", "🐷", "🐸", "🐵", "🐔",
|
|
12
|
+
"🐧", "🐦", "🐤", "🦆", "🦅", "🦉", "🐴", "🦄",
|
|
13
|
+
"🐝", "🐛", "🦋", "🐌", "🐙", "🦑", "🐠", "🐬",
|
|
14
|
+
];
|
|
15
|
+
/** Deterministic animal emoji for a branch name (djb2 hash). */
|
|
16
|
+
export function branchAnimalEmoji(branch) {
|
|
17
|
+
let h = 5381;
|
|
18
|
+
for (let i = 0; i < branch.length; i++) {
|
|
19
|
+
h = ((h << 5) + h + branch.charCodeAt(i)) | 0;
|
|
20
|
+
}
|
|
21
|
+
return ANIMAL_EMOJIS[Math.abs(h) % ANIMAL_EMOJIS.length];
|
|
22
|
+
}
|
|
23
|
+
export class StatusBar {
|
|
24
|
+
enabled;
|
|
25
|
+
barRow;
|
|
26
|
+
lastCtx;
|
|
27
|
+
out;
|
|
28
|
+
resizeHandler;
|
|
29
|
+
redrawTimer;
|
|
30
|
+
lastDrawnOutput;
|
|
31
|
+
gitInfo = null;
|
|
32
|
+
constructor(out) {
|
|
33
|
+
this.out = out ?? process.stdout;
|
|
34
|
+
this.enabled =
|
|
35
|
+
this.out.isTTY === true && (this.out.rows ?? 0) >= 5;
|
|
36
|
+
this.barRow = this.out.rows ?? 0;
|
|
37
|
+
}
|
|
38
|
+
init() {
|
|
39
|
+
if (!this.enabled)
|
|
40
|
+
return;
|
|
41
|
+
this.barRow = this.out.rows;
|
|
42
|
+
// Set scroll region with cursor save/restore (no cursor homing)
|
|
43
|
+
this.out.write(`\x1b7\x1b[1;${this.barRow - 1}r\x1b8`);
|
|
44
|
+
// Draw initial bar
|
|
45
|
+
this.drawBar();
|
|
46
|
+
// Handle terminal resize
|
|
47
|
+
this.resizeHandler = () => {
|
|
48
|
+
this.barRow = this.out.rows;
|
|
49
|
+
this.out.write(`\x1b7\x1b[1;${this.barRow - 1}r\x1b8`);
|
|
50
|
+
this.drawBar();
|
|
51
|
+
};
|
|
52
|
+
this.out.on("resize", this.resizeHandler);
|
|
53
|
+
// Periodic redraw to repair scroll region disruption
|
|
54
|
+
this.redrawTimer = setInterval(() => {
|
|
55
|
+
this.lastDrawnOutput = undefined;
|
|
56
|
+
this.drawBar();
|
|
57
|
+
}, 1000);
|
|
58
|
+
}
|
|
59
|
+
update(ctx) {
|
|
60
|
+
if (!this.enabled)
|
|
61
|
+
return;
|
|
62
|
+
this.lastCtx = ctx;
|
|
63
|
+
this.drawBar();
|
|
64
|
+
}
|
|
65
|
+
setGitInfo(info) {
|
|
66
|
+
this.gitInfo = info;
|
|
67
|
+
if (this.enabled)
|
|
68
|
+
this.drawBar();
|
|
69
|
+
}
|
|
70
|
+
destroy() {
|
|
71
|
+
if (!this.enabled)
|
|
72
|
+
return;
|
|
73
|
+
this.enabled = false;
|
|
74
|
+
if (this.redrawTimer != null) {
|
|
75
|
+
clearInterval(this.redrawTimer);
|
|
76
|
+
this.redrawTimer = undefined;
|
|
77
|
+
}
|
|
78
|
+
if (this.resizeHandler) {
|
|
79
|
+
this.out.removeListener("resize", this.resizeHandler);
|
|
80
|
+
this.resizeHandler = undefined;
|
|
81
|
+
}
|
|
82
|
+
// Clear bar and reset scroll region (cursor-safe)
|
|
83
|
+
this.out.write(`\x1b7\x1b[${this.barRow};1H\x1b[2K\x1b[r\x1b8`);
|
|
84
|
+
}
|
|
85
|
+
get reservedRows() {
|
|
86
|
+
return this.enabled ? 1 : 0;
|
|
87
|
+
}
|
|
88
|
+
formatGitSegment() {
|
|
89
|
+
if (!this.gitInfo)
|
|
90
|
+
return null;
|
|
91
|
+
const animal = branchAnimalEmoji(this.gitInfo.branch);
|
|
92
|
+
const wt = this.gitInfo.isWorktree ? " \u{1F332}" : "";
|
|
93
|
+
return `${animal} ${this.gitInfo.branch}${wt}`;
|
|
94
|
+
}
|
|
95
|
+
drawBar() {
|
|
96
|
+
const columns = this.out.columns ?? 80;
|
|
97
|
+
let content;
|
|
98
|
+
const gitSeg = this.formatGitSegment();
|
|
99
|
+
if (!this.lastCtx) {
|
|
100
|
+
content = gitSeg
|
|
101
|
+
? ` poly-weaver v${APP_VERSION} \u2502 ${gitSeg}`
|
|
102
|
+
: ` poly-weaver v${APP_VERSION}`;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const phaseLabel = this.lastCtx.phase;
|
|
106
|
+
const ctx = formatContext(this.lastCtx);
|
|
107
|
+
const segments = [` poly-weaver v${APP_VERSION}`];
|
|
108
|
+
if (gitSeg)
|
|
109
|
+
segments.push(gitSeg);
|
|
110
|
+
segments.push(phaseLabel);
|
|
111
|
+
if (this.lastCtx.agent)
|
|
112
|
+
segments.push(this.lastCtx.agent);
|
|
113
|
+
if (ctx)
|
|
114
|
+
segments.push(ctx);
|
|
115
|
+
content = segments.join(" \u2502 ");
|
|
116
|
+
}
|
|
117
|
+
// Pad visible content to full terminal width
|
|
118
|
+
const pad = columns - visibleLength(content);
|
|
119
|
+
const padded = pad > 0 ? content + " ".repeat(pad) : content;
|
|
120
|
+
// Atomic write: save cursor, re-establish scroll region, draw bar, restore cursor
|
|
121
|
+
const output = `\x1b7` +
|
|
122
|
+
`\x1b[1;${this.barRow - 1}r` +
|
|
123
|
+
`\x1b[${this.barRow};1H` +
|
|
124
|
+
`\x1b[2K` +
|
|
125
|
+
`\x1b[7m` +
|
|
126
|
+
padded +
|
|
127
|
+
`\x1b[27m` +
|
|
128
|
+
`\x1b8`;
|
|
129
|
+
if (output === this.lastDrawnOutput)
|
|
130
|
+
return;
|
|
131
|
+
this.lastDrawnOutput = output;
|
|
132
|
+
this.out.write(output);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=status-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-bar.js","sourceRoot":"","sources":["../src/status-bar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared terminal input parser — bytes → low-level key identities.
|
|
3
|
+
*
|
|
4
|
+
* This module owns the byte-level state machine (normal/esc/csi), kitty
|
|
5
|
+
* keyboard protocol parsing, kitty dedup tracking, and escape timeout.
|
|
6
|
+
* It produces {@link TerminalKey} events with no domain semantics.
|
|
7
|
+
*
|
|
8
|
+
* Consumers (e.g. RawInputParser for review-phase, TuiInputParser for
|
|
9
|
+
* startup TUI) wrap this via composition and map TerminalKey → their own
|
|
10
|
+
* domain event types.
|
|
11
|
+
*/
|
|
12
|
+
export type TerminalKey = {
|
|
13
|
+
kind: "printable";
|
|
14
|
+
char: string;
|
|
15
|
+
source: "plain" | "kitty-u" | "kitty-text";
|
|
16
|
+
} | {
|
|
17
|
+
kind: "control";
|
|
18
|
+
byte: number;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "enter";
|
|
21
|
+
} | {
|
|
22
|
+
kind: "backspace";
|
|
23
|
+
} | {
|
|
24
|
+
kind: "escape";
|
|
25
|
+
} | {
|
|
26
|
+
kind: "arrow";
|
|
27
|
+
direction: "up" | "down" | "left" | "right";
|
|
28
|
+
} | {
|
|
29
|
+
kind: "kitty-key";
|
|
30
|
+
keyCode: number;
|
|
31
|
+
modifiers: number;
|
|
32
|
+
};
|
|
33
|
+
export declare class TerminalKeyParser {
|
|
34
|
+
private readonly now;
|
|
35
|
+
private readonly dedupeWindowMs;
|
|
36
|
+
private readonly escapeTimeoutMs;
|
|
37
|
+
private state;
|
|
38
|
+
private csiParams;
|
|
39
|
+
private lastKittyPrintable;
|
|
40
|
+
private escapeTimer;
|
|
41
|
+
private deferredCallback;
|
|
42
|
+
constructor(now?: () => number, dedupeWindowMs?: number, escapeTimeoutMs?: number);
|
|
43
|
+
onDeferredKeys(cb: (keys: TerminalKey[]) => void): void;
|
|
44
|
+
cancelPendingEscape(): void;
|
|
45
|
+
parseChunk(chunk: Buffer): TerminalKey[];
|
|
46
|
+
private handleCsi;
|
|
47
|
+
private parseKittyEventType;
|
|
48
|
+
private shouldInsertKittyPrintable;
|
|
49
|
+
private clearKittyPrintable;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=terminal-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-input.d.ts","sourceRoot":"","sources":["../src/terminal-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,CAAA;CAAE,GAC/E;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,qBAAa,iBAAiB;IAU1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAXlC,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,kBAAkB,CAEZ;IACd,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,gBAAgB,CAA8C;gBAGnD,GAAG,GAAE,MAAM,MAAiB,EAC5B,cAAc,SAAK,EACnB,eAAe,SAAK;IAGvC,cAAc,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,GAAG,IAAI;IAIvD,mBAAmB,IAAI,IAAI;IAO3B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE;IAqExC,OAAO,CAAC,SAAS;IA+FjB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,0BAA0B;IAyBlC,OAAO,CAAC,mBAAmB;CAG5B"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared terminal input parser — bytes → low-level key identities.
|
|
3
|
+
*
|
|
4
|
+
* This module owns the byte-level state machine (normal/esc/csi), kitty
|
|
5
|
+
* keyboard protocol parsing, kitty dedup tracking, and escape timeout.
|
|
6
|
+
* It produces {@link TerminalKey} events with no domain semantics.
|
|
7
|
+
*
|
|
8
|
+
* Consumers (e.g. RawInputParser for review-phase, TuiInputParser for
|
|
9
|
+
* startup TUI) wrap this via composition and map TerminalKey → their own
|
|
10
|
+
* domain event types.
|
|
11
|
+
*/
|
|
12
|
+
export class TerminalKeyParser {
|
|
13
|
+
now;
|
|
14
|
+
dedupeWindowMs;
|
|
15
|
+
escapeTimeoutMs;
|
|
16
|
+
state = "normal";
|
|
17
|
+
csiParams = "";
|
|
18
|
+
lastKittyPrintable;
|
|
19
|
+
escapeTimer;
|
|
20
|
+
deferredCallback;
|
|
21
|
+
constructor(now = Date.now, dedupeWindowMs = 30, escapeTimeoutMs = 50) {
|
|
22
|
+
this.now = now;
|
|
23
|
+
this.dedupeWindowMs = dedupeWindowMs;
|
|
24
|
+
this.escapeTimeoutMs = escapeTimeoutMs;
|
|
25
|
+
}
|
|
26
|
+
onDeferredKeys(cb) {
|
|
27
|
+
this.deferredCallback = cb;
|
|
28
|
+
}
|
|
29
|
+
cancelPendingEscape() {
|
|
30
|
+
if (this.escapeTimer != null) {
|
|
31
|
+
clearTimeout(this.escapeTimer);
|
|
32
|
+
this.escapeTimer = undefined;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
parseChunk(chunk) {
|
|
36
|
+
const keys = [];
|
|
37
|
+
for (const byte of chunk) {
|
|
38
|
+
switch (this.state) {
|
|
39
|
+
case "normal":
|
|
40
|
+
if (byte === 0x1b) {
|
|
41
|
+
this.cancelPendingEscape();
|
|
42
|
+
this.state = "esc";
|
|
43
|
+
}
|
|
44
|
+
else if (byte === 0x0d || byte === 0x0a) {
|
|
45
|
+
this.clearKittyPrintable();
|
|
46
|
+
keys.push({ kind: "enter" });
|
|
47
|
+
}
|
|
48
|
+
else if (byte === 0x7f || byte === 0x08) {
|
|
49
|
+
this.clearKittyPrintable();
|
|
50
|
+
keys.push({ kind: "backspace" });
|
|
51
|
+
}
|
|
52
|
+
else if (byte < 0x20) {
|
|
53
|
+
this.clearKittyPrintable();
|
|
54
|
+
keys.push({ kind: "control", byte });
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.clearKittyPrintable();
|
|
58
|
+
keys.push({
|
|
59
|
+
kind: "printable",
|
|
60
|
+
char: String.fromCharCode(byte),
|
|
61
|
+
source: "plain",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
case "esc":
|
|
66
|
+
if (byte === 0x5b) {
|
|
67
|
+
this.state = "csi";
|
|
68
|
+
this.csiParams = "";
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.state = "normal";
|
|
72
|
+
this.clearKittyPrintable();
|
|
73
|
+
keys.push({ kind: "escape" });
|
|
74
|
+
// Re-process current byte in normal mode
|
|
75
|
+
keys.push(...this.parseChunk(Buffer.from([byte])));
|
|
76
|
+
}
|
|
77
|
+
break;
|
|
78
|
+
case "csi":
|
|
79
|
+
if (byte >= 0x40 && byte <= 0x7e) {
|
|
80
|
+
keys.push(...this.handleCsi(this.csiParams, String.fromCharCode(byte)));
|
|
81
|
+
this.state = "normal";
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.csiParams += String.fromCharCode(byte);
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Bare ESC at end of chunk: start escape timeout
|
|
90
|
+
if (this.state === "esc" && this.escapeTimer == null) {
|
|
91
|
+
this.escapeTimer = setTimeout(() => {
|
|
92
|
+
this.escapeTimer = undefined;
|
|
93
|
+
if (this.state === "esc") {
|
|
94
|
+
this.state = "normal";
|
|
95
|
+
this.clearKittyPrintable();
|
|
96
|
+
this.deferredCallback?.([{ kind: "escape" }]);
|
|
97
|
+
}
|
|
98
|
+
}, this.escapeTimeoutMs);
|
|
99
|
+
}
|
|
100
|
+
return keys;
|
|
101
|
+
}
|
|
102
|
+
handleCsi(params, finalByte) {
|
|
103
|
+
// Standard arrow keys: CSI A/B/C/D (with optional params like "1;1")
|
|
104
|
+
if (finalByte === "A") {
|
|
105
|
+
this.clearKittyPrintable();
|
|
106
|
+
return [{ kind: "arrow", direction: "up" }];
|
|
107
|
+
}
|
|
108
|
+
if (finalByte === "B") {
|
|
109
|
+
this.clearKittyPrintable();
|
|
110
|
+
return [{ kind: "arrow", direction: "down" }];
|
|
111
|
+
}
|
|
112
|
+
if (finalByte === "C") {
|
|
113
|
+
this.clearKittyPrintable();
|
|
114
|
+
return [{ kind: "arrow", direction: "right" }];
|
|
115
|
+
}
|
|
116
|
+
if (finalByte === "D") {
|
|
117
|
+
this.clearKittyPrintable();
|
|
118
|
+
return [{ kind: "arrow", direction: "left" }];
|
|
119
|
+
}
|
|
120
|
+
// CSI Z: standard Shift+Tab — normalize to Kitty protocol representation
|
|
121
|
+
if (finalByte === "Z") {
|
|
122
|
+
this.clearKittyPrintable();
|
|
123
|
+
return [{ kind: "kitty-key", keyCode: 9, modifiers: 2 }];
|
|
124
|
+
}
|
|
125
|
+
if (finalByte !== "u" && finalByte !== "_") {
|
|
126
|
+
this.clearKittyPrintable();
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
const parts = params.split(";");
|
|
130
|
+
const keyCode = parseInt(parts[0]?.split(":")[0] ?? "", 10) || 0;
|
|
131
|
+
const modifiers = parseInt(parts[1]?.split(":")[0] ?? "1", 10) || 1;
|
|
132
|
+
const eventType = this.parseKittyEventType(parts[1]);
|
|
133
|
+
// Ignore key-release events
|
|
134
|
+
if (eventType === 3) {
|
|
135
|
+
this.clearKittyPrintable();
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
// Enter with Ctrl modifier → kitty-key (so consumer can distinguish Ctrl+Enter)
|
|
139
|
+
if ((keyCode === 13 || keyCode === 10) && (modifiers - 1) & 0x04) {
|
|
140
|
+
this.clearKittyPrintable();
|
|
141
|
+
return [{ kind: "kitty-key", keyCode, modifiers }];
|
|
142
|
+
}
|
|
143
|
+
// Enter (no Ctrl)
|
|
144
|
+
if (keyCode === 13 || keyCode === 10) {
|
|
145
|
+
this.clearKittyPrintable();
|
|
146
|
+
return [{ kind: "enter" }];
|
|
147
|
+
}
|
|
148
|
+
// Backspace
|
|
149
|
+
if (keyCode === 127 || keyCode === 8) {
|
|
150
|
+
this.clearKittyPrintable();
|
|
151
|
+
return [{ kind: "backspace" }];
|
|
152
|
+
}
|
|
153
|
+
// Special keycodes → kitty-key (consumer decides semantics)
|
|
154
|
+
if (keyCode === 9 || keyCode === 27 || keyCode === 3) {
|
|
155
|
+
this.clearKittyPrintable();
|
|
156
|
+
return [{ kind: "kitty-key", keyCode, modifiers }];
|
|
157
|
+
}
|
|
158
|
+
// Kitty text event (_): extract codepoints
|
|
159
|
+
if (finalByte === "_" && parts.length >= 3) {
|
|
160
|
+
const cps = parts[2]
|
|
161
|
+
.split(":")
|
|
162
|
+
.map(Number)
|
|
163
|
+
.filter((cp) => cp >= 32);
|
|
164
|
+
const result = [];
|
|
165
|
+
for (const cp of cps) {
|
|
166
|
+
const ch = String.fromCodePoint(cp);
|
|
167
|
+
if (this.shouldInsertKittyPrintable(ch, "kitty-text")) {
|
|
168
|
+
result.push({ kind: "printable", char: ch, source: "kitty-text" });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
// Printable keycodes via 'u'
|
|
174
|
+
if (keyCode >= 32 && keyCode < 127) {
|
|
175
|
+
const ch = String.fromCharCode(keyCode);
|
|
176
|
+
if (this.shouldInsertKittyPrintable(ch, "kitty-u")) {
|
|
177
|
+
return [{ kind: "printable", char: ch, source: "kitty-u" }];
|
|
178
|
+
}
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
this.clearKittyPrintable();
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
parseKittyEventType(modsAndEvent) {
|
|
185
|
+
if (!modsAndEvent)
|
|
186
|
+
return 1;
|
|
187
|
+
const raw = modsAndEvent.split(":")[1];
|
|
188
|
+
const parsed = raw ? parseInt(raw, 10) : NaN;
|
|
189
|
+
return Number.isFinite(parsed) ? parsed : 1;
|
|
190
|
+
}
|
|
191
|
+
shouldInsertKittyPrintable(char, source) {
|
|
192
|
+
const ts = this.now();
|
|
193
|
+
const prev = this.lastKittyPrintable;
|
|
194
|
+
if (prev && ts - prev.at > this.dedupeWindowMs) {
|
|
195
|
+
this.lastKittyPrintable = undefined;
|
|
196
|
+
}
|
|
197
|
+
const currentPrev = this.lastKittyPrintable;
|
|
198
|
+
if (currentPrev &&
|
|
199
|
+
currentPrev.char === char &&
|
|
200
|
+
currentPrev.source !== source &&
|
|
201
|
+
ts - currentPrev.at <= this.dedupeWindowMs) {
|
|
202
|
+
this.lastKittyPrintable = undefined;
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
this.lastKittyPrintable = { char, source, at: ts };
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
clearKittyPrintable() {
|
|
209
|
+
this.lastKittyPrintable = undefined;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=terminal-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-input.js","sourceRoot":"","sources":["../src/terminal-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { UserStep } from "../flow/types.js";
|
|
2
|
+
import type { WhenCondition, PhaseLabelSpec } from "../flow/dsl.js";
|
|
3
|
+
export declare function user(label: string, opts?: {
|
|
4
|
+
id?: string;
|
|
5
|
+
when?: WhenCondition;
|
|
6
|
+
whenLabel?: string;
|
|
7
|
+
reads?: Record<string, string>;
|
|
8
|
+
writes?: Record<string, string>;
|
|
9
|
+
feedbackToTask?: boolean;
|
|
10
|
+
breakOnAccept?: boolean;
|
|
11
|
+
phaseLabel?: PhaseLabelSpec;
|
|
12
|
+
}): UserStep;
|
|
13
|
+
//# sourceMappingURL=dsl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsl.d.ts","sourceRoot":"","sources":["../../src/user/dsl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAe,MAAM,gBAAgB,CAAC;AAEjF,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IACzC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B,GAAG,QAAQ,CAiBX"}
|
package/dist/user/dsl.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function user(label, opts) {
|
|
2
|
+
const _phaseLabel = opts?.phaseLabel ?? "👤 User Review...";
|
|
3
|
+
const raw = {
|
|
4
|
+
type: "user",
|
|
5
|
+
id: opts?.id ?? "",
|
|
6
|
+
role: "user",
|
|
7
|
+
reads: opts?.reads ?? { display: "plan" },
|
|
8
|
+
writes: opts?.writes ?? {},
|
|
9
|
+
feedbackToTask: opts?.feedbackToTask ?? true,
|
|
10
|
+
breakOnAccept: opts?.breakOnAccept,
|
|
11
|
+
phaseLabel: typeof _phaseLabel === "string" ? _phaseLabel : "",
|
|
12
|
+
_idPrefix: `user-${label}`,
|
|
13
|
+
_when: opts?.when,
|
|
14
|
+
_whenLabel: opts?.whenLabel,
|
|
15
|
+
_phaseLabel,
|
|
16
|
+
};
|
|
17
|
+
return raw;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=dsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsl.js","sourceRoot":"","sources":["../../src/user/dsl.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,IAAI,CAAC,KAAa,EAAE,IASnC;IACC,MAAM,WAAW,GAAG,IAAI,EAAE,UAAU,IAAI,mBAAmB,CAAC;IAC5D,MAAM,GAAG,GAAgB;QACvB,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE;QAClB,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;QACzC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE;QAC1B,cAAc,EAAE,IAAI,EAAE,cAAc,IAAI,IAAI;QAC5C,aAAa,EAAE,IAAI,EAAE,aAAa;QAClC,UAAU,EAAE,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QAC9D,SAAS,EAAE,QAAQ,KAAK,EAAE;QAC1B,KAAK,EAAE,IAAI,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI,EAAE,SAAS;QAC3B,WAAW;KACZ,CAAC;IACF,OAAO,GAA0B,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { UserPromptHandler } from "./prompt.js";
|
|
2
|
+
import type { BaseStep, StepContext, StepSignal, RetryFn, RoleHandler } from "../flow/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* RoleHandler adapter that bridges UserPromptHandler with the flow executor.
|
|
5
|
+
* Registered as the "user" role so user steps are dispatched uniformly.
|
|
6
|
+
*
|
|
7
|
+
* On rejection, writes a unified verdict artifact with data, text, and meta.
|
|
8
|
+
* This ensures `artifactData("verdict", "approved")` evaluates correctly when
|
|
9
|
+
* the user rejects after a reviewer approves.
|
|
10
|
+
*/
|
|
11
|
+
export declare class UserRoleHandler implements RoleHandler {
|
|
12
|
+
private userPhase;
|
|
13
|
+
constructor(userPhase: UserPromptHandler);
|
|
14
|
+
execute(step: BaseStep, ctx: StepContext, _retry: RetryFn): Promise<StepSignal>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/user/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EACV,QAAQ,EAER,WAAW,EACX,UAAU,EACV,OAAO,EACP,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACrC,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,iBAAiB;IAE1C,OAAO,CACX,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,UAAU,CAAC;CAsCvB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RoleHandler adapter that bridges UserPromptHandler with the flow executor.
|
|
3
|
+
* Registered as the "user" role so user steps are dispatched uniformly.
|
|
4
|
+
*
|
|
5
|
+
* On rejection, writes a unified verdict artifact with data, text, and meta.
|
|
6
|
+
* This ensures `artifactData("verdict", "approved")` evaluates correctly when
|
|
7
|
+
* the user rejects after a reviewer approves.
|
|
8
|
+
*/
|
|
9
|
+
export class UserRoleHandler {
|
|
10
|
+
userPhase;
|
|
11
|
+
constructor(userPhase) {
|
|
12
|
+
this.userPhase = userPhase;
|
|
13
|
+
}
|
|
14
|
+
async execute(step, ctx, _retry) {
|
|
15
|
+
const displayArtifact = step.reads.display;
|
|
16
|
+
const displayText = displayArtifact
|
|
17
|
+
? ctx.artifacts.getText(displayArtifact) ?? "" : "";
|
|
18
|
+
// Build prompt context from the verdict artifact
|
|
19
|
+
const verdictArtifactName = step.writes.verdict;
|
|
20
|
+
const verdictData = verdictArtifactName
|
|
21
|
+
? ctx.artifacts.getData(verdictArtifactName)
|
|
22
|
+
: undefined;
|
|
23
|
+
const verdictSource = verdictArtifactName
|
|
24
|
+
? ctx.artifacts.getMeta(verdictArtifactName, "source")
|
|
25
|
+
: undefined;
|
|
26
|
+
const promptCtx = {
|
|
27
|
+
verdictApproved: verdictData?.approved,
|
|
28
|
+
isFirstReview: verdictData === undefined,
|
|
29
|
+
verdictSource,
|
|
30
|
+
previousStepRole: ctx.previousStepRole,
|
|
31
|
+
};
|
|
32
|
+
const result = await this.userPhase.prompt(displayText, step.id, promptCtx);
|
|
33
|
+
if (result.accepted) {
|
|
34
|
+
const userStep = step;
|
|
35
|
+
return { kind: userStep.breakOnAccept ? "break-loop" : "continue" };
|
|
36
|
+
}
|
|
37
|
+
// Rejected — write to verdict artifact with data + text + meta
|
|
38
|
+
const verdictKey = step.writes.verdict;
|
|
39
|
+
if (verdictKey) {
|
|
40
|
+
ctx.artifacts.set(verdictKey, {
|
|
41
|
+
data: { approved: false },
|
|
42
|
+
text: result.comments ?? "",
|
|
43
|
+
meta: { source: "user" },
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return { kind: "restart-loop" };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/user/handler.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,MAAM,OAAO,eAAe;IACN;IAApB,YAAoB,SAA4B;QAA5B,cAAS,GAAT,SAAS,CAAmB;IAAG,CAAC;IAEpD,KAAK,CAAC,OAAO,CACX,IAAc,EACd,GAAgB,EAChB,MAAe;QAEf,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAC3C,MAAM,WAAW,GAAG,eAAe;YACjC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtD,iDAAiD;QACjD,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAChD,MAAM,WAAW,GAAG,mBAAmB;YACrC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAyB,mBAAmB,CAAC;YACpE,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,aAAa,GAAG,mBAAmB;YACvC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAS,mBAAmB,EAAE,QAAQ,CAAC;YAC9D,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,SAAS,GAAsB;YACnC,eAAe,EAAE,WAAW,EAAE,QAAQ;YACtC,aAAa,EAAE,WAAW,KAAK,SAAS;YACxC,aAAa;YACb,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;SACvC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAE5E,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAgB,CAAC;YAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QACtE,CAAC;QAED,+DAA+D;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACvC,IAAI,UAAU,EAAE,CAAC;YACf,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE;gBAC5B,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;gBACzB,IAAI,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;gBAC3B,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;aACzB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { UserPromptHandler, UserPromptResult, UserPromptContext } from "./prompt.js";
|
|
2
|
+
export { InteractiveUserPrompt, AutoUserPrompt, RawInputParser } from "./prompt.js";
|
|
3
|
+
export { UserRoleHandler } from "./handler.js";
|
|
4
|
+
export { user } from "./dsl.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { type FeatureGates } from "../providers/registry.js";
|
|
2
|
+
import type { BuiltinRole } from "../flow/types.js";
|
|
3
|
+
export interface UserPromptResult {
|
|
4
|
+
accepted: boolean;
|
|
5
|
+
comments?: string;
|
|
6
|
+
}
|
|
7
|
+
type RawInputEvent = {
|
|
8
|
+
type: "insert";
|
|
9
|
+
text: string;
|
|
10
|
+
} | {
|
|
11
|
+
type: "backspace";
|
|
12
|
+
} | {
|
|
13
|
+
type: "submit";
|
|
14
|
+
} | {
|
|
15
|
+
type: "newline";
|
|
16
|
+
} | {
|
|
17
|
+
type: "ctrl-c";
|
|
18
|
+
} | {
|
|
19
|
+
type: "arrow";
|
|
20
|
+
direction: "up" | "down";
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Stateful parser for raw stdin bytes in normal mode and kitty keyboard protocol mode.
|
|
24
|
+
*
|
|
25
|
+
* Kitty may emit both key (`...u`) and text (`..._`) variants for one printable
|
|
26
|
+
* keystroke. We deduplicate matching adjacent variants so one physical keypress
|
|
27
|
+
* produces exactly one inserted character.
|
|
28
|
+
*/
|
|
29
|
+
export declare class RawInputParser {
|
|
30
|
+
private parser;
|
|
31
|
+
constructor(now?: () => number, dedupeWindowMs?: number);
|
|
32
|
+
parseChunk(chunk: Buffer): RawInputEvent[];
|
|
33
|
+
private mapKey;
|
|
34
|
+
}
|
|
35
|
+
export interface UserPromptContext {
|
|
36
|
+
/** Whether the reviewer approved the plan. undefined = no verdict yet. */
|
|
37
|
+
verdictApproved?: boolean;
|
|
38
|
+
/** True when no prior verdict exists (first review before any reviewer runs). */
|
|
39
|
+
isFirstReview?: boolean;
|
|
40
|
+
/** Who produced the verdict: "user" | "reviewer" | undefined. */
|
|
41
|
+
verdictSource?: string;
|
|
42
|
+
/** Role of the step that executed immediately before this user step. */
|
|
43
|
+
previousStepRole?: BuiltinRole | "user";
|
|
44
|
+
}
|
|
45
|
+
export interface UserPromptHandler {
|
|
46
|
+
/**
|
|
47
|
+
* Present the plan to the user and collect their decision.
|
|
48
|
+
* @param plan - The full plan text. Displayed unless the provider streamed it natively (see FeatureGates.nativePlanMode).
|
|
49
|
+
* @param phase - Which checkpoint triggered this prompt
|
|
50
|
+
* @param context - Optional context with verdict status
|
|
51
|
+
*/
|
|
52
|
+
prompt(plan: string, phase: string, context?: UserPromptContext): Promise<UserPromptResult>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Interactive user prompt handler.
|
|
56
|
+
* Displays the plan (unless nativePlanMode gate suppresses it) and collects multiline input.
|
|
57
|
+
* Empty input = accept, non-empty = comments for revision.
|
|
58
|
+
*
|
|
59
|
+
* Uses a raw stdin reader instead of readline so that input works even
|
|
60
|
+
* when the terminal is in kitty keyboard protocol mode (which spawned
|
|
61
|
+
* PTY processes like Claude Code may leave enabled).
|
|
62
|
+
*/
|
|
63
|
+
export declare class InteractiveUserPrompt implements UserPromptHandler {
|
|
64
|
+
readonly gates: FeatureGates;
|
|
65
|
+
constructor(gates?: FeatureGates);
|
|
66
|
+
prompt(plan: string, phase: string, context?: UserPromptContext): Promise<UserPromptResult>;
|
|
67
|
+
/** True unless the provider already streamed the plan natively (planner → user). */
|
|
68
|
+
private shouldDisplayPlan;
|
|
69
|
+
private printPlan;
|
|
70
|
+
/**
|
|
71
|
+
* Two-row selector: "Approve" row and multiline feedback input area.
|
|
72
|
+
* `❯` arrow moves between rows to indicate which is active.
|
|
73
|
+
* Input row is active by default — just start typing.
|
|
74
|
+
* Enter inserts a newline; Ctrl+D submits.
|
|
75
|
+
* Approve requires ↑ then Enter.
|
|
76
|
+
*/
|
|
77
|
+
private collectDecision;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* No-op handler that always accepts. Used for --auto mode and as the default.
|
|
81
|
+
*/
|
|
82
|
+
export declare class AutoUserPrompt implements UserPromptHandler {
|
|
83
|
+
prompt(): Promise<UserPromptResult>;
|
|
84
|
+
}
|
|
85
|
+
export {};
|
|
86
|
+
//# sourceMappingURL=prompt.d.ts.map
|