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,34 @@
|
|
|
1
|
+
import type { UserClarification } from "./agents/planners/types.js";
|
|
2
|
+
export declare function getVerdictSchema(): Promise<string>;
|
|
3
|
+
/**
|
|
4
|
+
* Derive a human-readable feedback markdown from a review verdict.
|
|
5
|
+
*/
|
|
6
|
+
export declare function deriveFeedback(verdict: {
|
|
7
|
+
approved: boolean;
|
|
8
|
+
issues: Array<{
|
|
9
|
+
description: string;
|
|
10
|
+
category?: string;
|
|
11
|
+
severity?: string;
|
|
12
|
+
}>;
|
|
13
|
+
summary: string;
|
|
14
|
+
}): string;
|
|
15
|
+
/**
|
|
16
|
+
* Derive a feedback markdown from user comments.
|
|
17
|
+
*/
|
|
18
|
+
export declare function deriveUserFeedback(comments: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Append one or more clarification entries to the task content.
|
|
21
|
+
* Creates the "## User Clarifications" section header on first call
|
|
22
|
+
* (startNumber === 1). Returns the updated content and next available number.
|
|
23
|
+
*/
|
|
24
|
+
export declare function appendClarifications(taskContent: string, entries: Array<{
|
|
25
|
+
type: "qa";
|
|
26
|
+
clarification: UserClarification;
|
|
27
|
+
} | {
|
|
28
|
+
type: "comment";
|
|
29
|
+
text: string;
|
|
30
|
+
}>, startNumber: number): {
|
|
31
|
+
content: string;
|
|
32
|
+
nextNumber: number;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAOpE,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKxD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE;IACP,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,OAAO,EAAE,MAAM,CAAC;CACjB,GACA,MAAM,CAmBR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,iBAAiB,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACpG,WAAW,EAAE,MAAM,GAClB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAuBzC"}
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const SCHEMA_PATH = join(__dirname, "..", "schemas", "review-verdict.json");
|
|
6
|
+
let cachedSchema = null;
|
|
7
|
+
export async function getVerdictSchema() {
|
|
8
|
+
if (!cachedSchema) {
|
|
9
|
+
cachedSchema = await readFile(SCHEMA_PATH, "utf-8");
|
|
10
|
+
}
|
|
11
|
+
return cachedSchema;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Derive a human-readable feedback markdown from a review verdict.
|
|
15
|
+
*/
|
|
16
|
+
export function deriveFeedback(verdict) {
|
|
17
|
+
const lines = ["# Review Feedback", "", `**Summary:** ${verdict.summary}`, ""];
|
|
18
|
+
if (verdict.issues.length > 0) {
|
|
19
|
+
lines.push("## Issues to Address", "");
|
|
20
|
+
for (const issue of verdict.issues) {
|
|
21
|
+
if (issue.severity && issue.category) {
|
|
22
|
+
lines.push(`- **[${issue.severity.toUpperCase()}] ${issue.category}**: ${issue.description}`);
|
|
23
|
+
}
|
|
24
|
+
else if (issue.category) {
|
|
25
|
+
lines.push(`- **${issue.category}**: ${issue.description}`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
lines.push(`- ${issue.description}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return lines.join("\n");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Derive a feedback markdown from user comments.
|
|
36
|
+
*/
|
|
37
|
+
export function deriveUserFeedback(comments) {
|
|
38
|
+
return ["# User Feedback", "", comments].join("\n");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Append one or more clarification entries to the task content.
|
|
42
|
+
* Creates the "## User Clarifications" section header on first call
|
|
43
|
+
* (startNumber === 1). Returns the updated content and next available number.
|
|
44
|
+
*/
|
|
45
|
+
export function appendClarifications(taskContent, entries, startNumber) {
|
|
46
|
+
if (entries.length === 0)
|
|
47
|
+
return { content: taskContent, nextNumber: startNumber };
|
|
48
|
+
const parts = [];
|
|
49
|
+
if (startNumber === 1) {
|
|
50
|
+
parts.push("\n\n---\n## User Clarifications\n\n> Points are listed in chronological order. If a later point conflicts with an earlier one, follow the later point.\n");
|
|
51
|
+
}
|
|
52
|
+
let n = startNumber;
|
|
53
|
+
for (const entry of entries) {
|
|
54
|
+
if (entry.type === "qa") {
|
|
55
|
+
parts.push(`${n}. **Q:** ${entry.clarification.question}\n **A:** ${entry.clarification.answer}`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
parts.push(`${n}. ${entry.text}`);
|
|
59
|
+
}
|
|
60
|
+
n++;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
content: taskContent + parts.join("\n"),
|
|
64
|
+
nextNumber: n,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { CompletionDetector } from "./types.js";
|
|
2
|
+
import { type SessionLine } from "../session/reader.js";
|
|
3
|
+
/**
|
|
4
|
+
* Base class for completion detectors that share the same poll-based lifecycle:
|
|
5
|
+
*
|
|
6
|
+
* 1. Poll the session file via `fs.stat()` (reliable on Windows, unlike fs.watch).
|
|
7
|
+
* 2. On file growth: re-read, slice by `lineOffset`, call `analyzeLines()`.
|
|
8
|
+
* 3. When `isPrimarySignalFired()` returns true and the quiet debounce elapses,
|
|
9
|
+
* resolve with `extractResponse()`.
|
|
10
|
+
*
|
|
11
|
+
* Subclasses only implement:
|
|
12
|
+
* - `analyzeLines(lines)` — update provider-specific state
|
|
13
|
+
* - `isPrimarySignalFired()` — check if the turn is considered done
|
|
14
|
+
* - `extractResponse(lines)` — pull the final text from parsed session lines
|
|
15
|
+
*
|
|
16
|
+
* Optional override:
|
|
17
|
+
* - `shouldShortCircuit(lines)` — return true to resolve immediately (skip debounce).
|
|
18
|
+
* Used by Codex which resolves instantly on `task_complete`.
|
|
19
|
+
*/
|
|
20
|
+
export declare abstract class AbstractCompletionDetector implements CompletionDetector {
|
|
21
|
+
private readonly pollMs;
|
|
22
|
+
private readonly quietMs;
|
|
23
|
+
private disposed;
|
|
24
|
+
private pollTimer;
|
|
25
|
+
private resolve;
|
|
26
|
+
private reject;
|
|
27
|
+
private lastFileSize;
|
|
28
|
+
private sessionFile;
|
|
29
|
+
private lineOffset;
|
|
30
|
+
protected lastDataTime: number;
|
|
31
|
+
protected lastParsedLines: SessionLine[];
|
|
32
|
+
constructor(pollMs?: number, quietMs?: number);
|
|
33
|
+
start(sessionFile: string, lineOffset?: number): Promise<string>;
|
|
34
|
+
onPtyData(_data: string): void;
|
|
35
|
+
dispose(): void;
|
|
36
|
+
/** Update provider-specific state from the current session lines. */
|
|
37
|
+
protected abstract analyzeLines(lines: SessionLine[]): void;
|
|
38
|
+
/** Return true when the provider's primary completion signal has fired. */
|
|
39
|
+
protected abstract isPrimarySignalFired(): boolean;
|
|
40
|
+
/** Extract the final response text from parsed session lines. */
|
|
41
|
+
protected abstract extractResponse(lines: SessionLine[]): string;
|
|
42
|
+
/**
|
|
43
|
+
* Return true to resolve immediately when new data arrives (skip debounce).
|
|
44
|
+
* Default: false. Override in providers where the primary signal is authoritative
|
|
45
|
+
* (e.g., Codex's `task_complete`).
|
|
46
|
+
*/
|
|
47
|
+
protected shouldShortCircuit(_lines: SessionLine[]): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Return true to suppress PTY timer resets in `onPtyData`.
|
|
50
|
+
* Default: false. Override in providers that keep emitting TUI data after
|
|
51
|
+
* the task is done (e.g., Codex, Copilot).
|
|
52
|
+
*/
|
|
53
|
+
protected shouldSuppressPtyTimerReset(): boolean;
|
|
54
|
+
private poll;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=base-completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-completion.d.ts","sourceRoot":"","sources":["../../src/providers/base-completion.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEzE;;;;;;;;;;;;;;;;GAgBG;AACH,8BAAsB,0BAA2B,YAAW,kBAAkB;IAa1E,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,UAAU,CAAK;IAEvB,SAAS,CAAC,YAAY,SAAK;IAC3B,SAAS,CAAC,eAAe,EAAE,WAAW,EAAE,CAAM;gBAG3B,MAAM,SAAM,EACZ,OAAO,SAAM;IAGhC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAe3D,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9B,OAAO,IAAI,IAAI;IAUf,qEAAqE;IACrE,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI;IAE3D,2EAA2E;IAC3E,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI,OAAO;IAElD,iEAAiE;IACjE,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM;IAEhE;;;;OAIG;IACH,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO;IAI5D;;;;OAIG;IACH,SAAS,CAAC,2BAA2B,IAAI,OAAO;YAMlC,IAAI;CAqCnB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
import { readSessionFile } from "../session/reader.js";
|
|
3
|
+
/**
|
|
4
|
+
* Base class for completion detectors that share the same poll-based lifecycle:
|
|
5
|
+
*
|
|
6
|
+
* 1. Poll the session file via `fs.stat()` (reliable on Windows, unlike fs.watch).
|
|
7
|
+
* 2. On file growth: re-read, slice by `lineOffset`, call `analyzeLines()`.
|
|
8
|
+
* 3. When `isPrimarySignalFired()` returns true and the quiet debounce elapses,
|
|
9
|
+
* resolve with `extractResponse()`.
|
|
10
|
+
*
|
|
11
|
+
* Subclasses only implement:
|
|
12
|
+
* - `analyzeLines(lines)` — update provider-specific state
|
|
13
|
+
* - `isPrimarySignalFired()` — check if the turn is considered done
|
|
14
|
+
* - `extractResponse(lines)` — pull the final text from parsed session lines
|
|
15
|
+
*
|
|
16
|
+
* Optional override:
|
|
17
|
+
* - `shouldShortCircuit(lines)` — return true to resolve immediately (skip debounce).
|
|
18
|
+
* Used by Codex which resolves instantly on `task_complete`.
|
|
19
|
+
*/
|
|
20
|
+
export class AbstractCompletionDetector {
|
|
21
|
+
pollMs;
|
|
22
|
+
quietMs;
|
|
23
|
+
disposed = false;
|
|
24
|
+
pollTimer = null;
|
|
25
|
+
resolve = null;
|
|
26
|
+
reject = null;
|
|
27
|
+
lastFileSize = 0;
|
|
28
|
+
sessionFile = "";
|
|
29
|
+
lineOffset = 0;
|
|
30
|
+
lastDataTime = 0;
|
|
31
|
+
lastParsedLines = [];
|
|
32
|
+
constructor(pollMs = 500, quietMs = 500) {
|
|
33
|
+
this.pollMs = pollMs;
|
|
34
|
+
this.quietMs = quietMs;
|
|
35
|
+
}
|
|
36
|
+
start(sessionFile, lineOffset = 0) {
|
|
37
|
+
this.sessionFile = sessionFile;
|
|
38
|
+
this.lineOffset = lineOffset;
|
|
39
|
+
this.lastDataTime = Date.now();
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
this.resolve = resolve;
|
|
42
|
+
this.reject = reject;
|
|
43
|
+
this.pollTimer = setInterval(() => {
|
|
44
|
+
void this.poll();
|
|
45
|
+
}, this.pollMs);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
onPtyData(_data) {
|
|
49
|
+
if (!this.shouldSuppressPtyTimerReset()) {
|
|
50
|
+
this.lastDataTime = Date.now();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
dispose() {
|
|
54
|
+
this.disposed = true;
|
|
55
|
+
if (this.pollTimer) {
|
|
56
|
+
clearInterval(this.pollTimer);
|
|
57
|
+
this.pollTimer = null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Return true to resolve immediately when new data arrives (skip debounce).
|
|
62
|
+
* Default: false. Override in providers where the primary signal is authoritative
|
|
63
|
+
* (e.g., Codex's `task_complete`).
|
|
64
|
+
*/
|
|
65
|
+
shouldShortCircuit(_lines) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Return true to suppress PTY timer resets in `onPtyData`.
|
|
70
|
+
* Default: false. Override in providers that keep emitting TUI data after
|
|
71
|
+
* the task is done (e.g., Codex, Copilot).
|
|
72
|
+
*/
|
|
73
|
+
shouldSuppressPtyTimerReset() {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
// ── Poll loop ───────────────────────────────────────────────────────
|
|
77
|
+
async poll() {
|
|
78
|
+
if (this.disposed)
|
|
79
|
+
return;
|
|
80
|
+
try {
|
|
81
|
+
const s = await stat(this.sessionFile);
|
|
82
|
+
if (s.size === this.lastFileSize) {
|
|
83
|
+
// No new data — check if quiet debounce has passed and primary signal is ready
|
|
84
|
+
if (this.isPrimarySignalFired() &&
|
|
85
|
+
Date.now() - this.lastDataTime >= this.quietMs) {
|
|
86
|
+
const text = this.extractResponse(this.lastParsedLines);
|
|
87
|
+
this.dispose();
|
|
88
|
+
this.resolve?.(text);
|
|
89
|
+
}
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const lines = await readSessionFile(this.sessionFile);
|
|
93
|
+
// Update AFTER successful read — if readSessionFile() throws (e.g. EBUSY
|
|
94
|
+
// on Windows), lastFileSize stays stale so the next poll retries the read.
|
|
95
|
+
this.lastFileSize = s.size;
|
|
96
|
+
this.lastDataTime = Date.now();
|
|
97
|
+
this.lastParsedLines = lines.slice(this.lineOffset);
|
|
98
|
+
this.analyzeLines(this.lastParsedLines);
|
|
99
|
+
// Allow providers to short-circuit (e.g. Codex on task_complete)
|
|
100
|
+
if (this.shouldShortCircuit(this.lastParsedLines)) {
|
|
101
|
+
const text = this.extractResponse(this.lastParsedLines);
|
|
102
|
+
this.dispose();
|
|
103
|
+
this.resolve?.(text);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// File might not exist yet — keep polling
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=base-completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-completion.js","sourceRoot":"","sources":["../../src/providers/base-completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SessionLine } from "../../session/reader.js";
|
|
2
|
+
import { AbstractCompletionDetector } from "../base-completion.js";
|
|
3
|
+
/**
|
|
4
|
+
* Claude completion detection using the two-signal rule:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Tool-use tracking (primary)**: Track tool_use IDs in assistant messages,
|
|
7
|
+
* mark resolved when matching tool_result appears. Complete when pending set
|
|
8
|
+
* is empty AND at least one text output was emitted.
|
|
9
|
+
*
|
|
10
|
+
* 2. **Quiet debounce (secondary)**: No new JSONL lines for `quietMs` after
|
|
11
|
+
* the primary signal fires.
|
|
12
|
+
*
|
|
13
|
+
* Both signals must agree before the turn is considered complete.
|
|
14
|
+
*/
|
|
15
|
+
export declare class ClaudeCompletionStrategy extends AbstractCompletionDetector {
|
|
16
|
+
private readonly exitToolName?;
|
|
17
|
+
private pendingToolUses;
|
|
18
|
+
private hasTextOutput;
|
|
19
|
+
private primaryFired;
|
|
20
|
+
private exitToolCalled;
|
|
21
|
+
constructor(pollMs?: number, quietMs?: number, exitToolName?: string | undefined);
|
|
22
|
+
protected analyzeLines(currentLines: SessionLine[]): void;
|
|
23
|
+
protected isPrimarySignalFired(): boolean;
|
|
24
|
+
protected shouldShortCircuit(_lines: SessionLine[]): boolean;
|
|
25
|
+
protected shouldSuppressPtyTimerReset(): boolean;
|
|
26
|
+
protected extractResponse(lines: SessionLine[]): string;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE;;;;;;;;;;;GAWG;AACH,qBAAa,wBAAyB,SAAQ,0BAA0B;IAUpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IARhC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAS;gBAG7B,MAAM,SAAM,EACZ,OAAO,SAAM,EACI,YAAY,CAAC,EAAE,MAAM,YAAA;IAKxC,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI;IA4EzD,SAAS,CAAC,oBAAoB,IAAI,OAAO;cAItB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO;cAIlD,2BAA2B,IAAI,OAAO;IAIzD,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM;CAGxD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { extractClaudeResponse } from "./session.js";
|
|
2
|
+
import { AbstractCompletionDetector } from "../base-completion.js";
|
|
3
|
+
/**
|
|
4
|
+
* Claude completion detection using the two-signal rule:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Tool-use tracking (primary)**: Track tool_use IDs in assistant messages,
|
|
7
|
+
* mark resolved when matching tool_result appears. Complete when pending set
|
|
8
|
+
* is empty AND at least one text output was emitted.
|
|
9
|
+
*
|
|
10
|
+
* 2. **Quiet debounce (secondary)**: No new JSONL lines for `quietMs` after
|
|
11
|
+
* the primary signal fires.
|
|
12
|
+
*
|
|
13
|
+
* Both signals must agree before the turn is considered complete.
|
|
14
|
+
*/
|
|
15
|
+
export class ClaudeCompletionStrategy extends AbstractCompletionDetector {
|
|
16
|
+
exitToolName;
|
|
17
|
+
// Two-signal state
|
|
18
|
+
pendingToolUses = new Set();
|
|
19
|
+
hasTextOutput = false;
|
|
20
|
+
primaryFired = false;
|
|
21
|
+
exitToolCalled = false;
|
|
22
|
+
constructor(pollMs = 500, quietMs = 500, exitToolName) {
|
|
23
|
+
super(pollMs, quietMs);
|
|
24
|
+
this.exitToolName = exitToolName;
|
|
25
|
+
}
|
|
26
|
+
analyzeLines(currentLines) {
|
|
27
|
+
this.pendingToolUses.clear();
|
|
28
|
+
this.hasTextOutput = false;
|
|
29
|
+
this.exitToolCalled = false;
|
|
30
|
+
let hasAnyToolUse = false;
|
|
31
|
+
let lastToolActivityIdx = -1;
|
|
32
|
+
let lastAssistantTextIdx = -1;
|
|
33
|
+
let lastAssistantStopReason;
|
|
34
|
+
for (let idx = 0; idx < currentLines.length; idx++) {
|
|
35
|
+
const line = currentLines[idx];
|
|
36
|
+
if (line.type === "assistant") {
|
|
37
|
+
const message = line.message;
|
|
38
|
+
if (!message?.content)
|
|
39
|
+
continue;
|
|
40
|
+
lastAssistantStopReason = message.stop_reason;
|
|
41
|
+
for (const block of message.content) {
|
|
42
|
+
if (block.type === "tool_use" && block.id) {
|
|
43
|
+
// If this is the plan-exit tool, mark it and skip tracking
|
|
44
|
+
if (this.exitToolName && block.name === this.exitToolName) {
|
|
45
|
+
this.exitToolCalled = true;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
this.pendingToolUses.add(block.id);
|
|
49
|
+
hasAnyToolUse = true;
|
|
50
|
+
lastToolActivityIdx = idx;
|
|
51
|
+
}
|
|
52
|
+
if (block.type === "text" && block.text) {
|
|
53
|
+
this.hasTextOutput = true;
|
|
54
|
+
lastAssistantTextIdx = idx;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else if (line.type === "user") {
|
|
59
|
+
// Tool results resolve pending tool uses
|
|
60
|
+
const message = line.message;
|
|
61
|
+
if (!message?.content)
|
|
62
|
+
continue;
|
|
63
|
+
for (const block of message.content) {
|
|
64
|
+
if (block.type === "tool_result" && block.tool_use_id) {
|
|
65
|
+
this.pendingToolUses.delete(block.tool_use_id);
|
|
66
|
+
lastToolActivityIdx = idx;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Guard: stop_reason === null (strict) means the API response is still
|
|
72
|
+
// streaming content blocks. Suppress primary to avoid false completion
|
|
73
|
+
// during the gap between intermediate JSONL lines of the same response.
|
|
74
|
+
// undefined (missing field, e.g. in test data) falls through.
|
|
75
|
+
const responseIncomplete = lastAssistantStopReason === null ||
|
|
76
|
+
lastAssistantStopReason === "stop_sequence";
|
|
77
|
+
// Primary signal:
|
|
78
|
+
// - the last assistant response is not mid-stream
|
|
79
|
+
// - no pending tool uses
|
|
80
|
+
// - at least one assistant text output
|
|
81
|
+
// - if tools were used, we require assistant text to appear after the
|
|
82
|
+
// most recent tool activity (prevents resolving between tool_result and
|
|
83
|
+
// the final narrative/verdict message).
|
|
84
|
+
this.primaryFired =
|
|
85
|
+
!responseIncomplete &&
|
|
86
|
+
this.pendingToolUses.size === 0 &&
|
|
87
|
+
this.hasTextOutput &&
|
|
88
|
+
(!hasAnyToolUse || lastAssistantTextIdx > lastToolActivityIdx);
|
|
89
|
+
}
|
|
90
|
+
isPrimarySignalFired() {
|
|
91
|
+
return this.primaryFired;
|
|
92
|
+
}
|
|
93
|
+
shouldShortCircuit(_lines) {
|
|
94
|
+
return this.exitToolCalled && this.pendingToolUses.size === 0;
|
|
95
|
+
}
|
|
96
|
+
shouldSuppressPtyTimerReset() {
|
|
97
|
+
return this.primaryFired || (this.exitToolCalled && this.pendingToolUses.size === 0);
|
|
98
|
+
}
|
|
99
|
+
extractResponse(lines) {
|
|
100
|
+
return extractClaudeResponse(lines);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/providers/claude/completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/claude/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { SessionHandler, SessionSnapshot } from "../types.js";
|
|
2
|
+
import { type SessionLine } from "../../session/reader.js";
|
|
3
|
+
import type { UserClarification } from "../../agents/planners/types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Get the Claude session base directory.
|
|
6
|
+
* Claude stores sessions at: ~/.claude/projects/{encoded-cwd}/{sessionId}.jsonl
|
|
7
|
+
*/
|
|
8
|
+
export declare function getClaudeSessionDir(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Encode a working directory path into the directory name Claude uses
|
|
11
|
+
* under ~/.claude/projects/. Claude replaces colons, forward slashes,
|
|
12
|
+
* and backslashes with hyphens.
|
|
13
|
+
*/
|
|
14
|
+
export declare function encodeClaudeProjectDir(cwd: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Extract the last assistant response text from a Claude session file.
|
|
17
|
+
*
|
|
18
|
+
* Claude format: message.content[] where type === "text".
|
|
19
|
+
* We collect text blocks from the last assistant message sequence.
|
|
20
|
+
*/
|
|
21
|
+
export declare function extractClaudeResponse(lines: SessionLine[]): string;
|
|
22
|
+
/**
|
|
23
|
+
* Extract the plan file path from Claude session lines.
|
|
24
|
+
*
|
|
25
|
+
* Scans for Write or Edit tool_use blocks where `input.file_path` targets
|
|
26
|
+
* the `.claude/plans/` directory. Returns the last matching path
|
|
27
|
+
* (always re-scanned on each run to avoid staleness).
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractClaudePlanFilePath(lines: SessionLine[]): string | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Extract AskUserQuestion Q&A pairs from Claude session lines.
|
|
32
|
+
*
|
|
33
|
+
* Walks forward to pair `tool_use` blocks (name === "AskUserQuestion") with
|
|
34
|
+
* their corresponding `tool_result` responses. Multi-question calls have
|
|
35
|
+
* their questions joined with "; ". Unmatched tool_use blocks are skipped.
|
|
36
|
+
*/
|
|
37
|
+
export declare function extractClaudeClarifications(lines: SessionLine[]): UserClarification[];
|
|
38
|
+
/**
|
|
39
|
+
* Claude session handler.
|
|
40
|
+
*
|
|
41
|
+
* Handles session file discovery across Claude's per-project subdirectories
|
|
42
|
+
* and extracts clarifications from AskUserQuestion Q&A pairs.
|
|
43
|
+
*/
|
|
44
|
+
export declare class ClaudeSessionHandler implements SessionHandler {
|
|
45
|
+
private readonly getSessionDir;
|
|
46
|
+
constructor(getSessionDir?: () => string);
|
|
47
|
+
predictSessionFile(workdir: string, sessionId: string): string;
|
|
48
|
+
snapshot(workdir: string): Promise<SessionSnapshot>;
|
|
49
|
+
findSessionFile(snapshot: SessionSnapshot, _workdir: string): Promise<string>;
|
|
50
|
+
extractSessionId(sessionFilePath: string): Promise<string>;
|
|
51
|
+
extractClarifications(sessionFilePath: string, lineOffset: number): Promise<UserClarification[]>;
|
|
52
|
+
extractPlanFilePath(sessionFilePath: string, lineOffset: number): Promise<string | undefined>;
|
|
53
|
+
private readNewLines;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAM5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExE;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CA0BlE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,CA8BlF;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CA8CrF;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;gBAEjC,aAAa,CAAC,EAAE,MAAM,MAAM;IAIxC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAKxD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOnD,eAAe,CACnB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAOZ,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1D,qBAAqB,CACzB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAIzB,mBAAmB,CACvB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAIhB,YAAY;CAI3B"}
|