poly-weaver 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -64
- package/dist/agents/errors.d.ts +20 -0
- package/dist/agents/errors.d.ts.map +1 -0
- package/dist/agents/errors.js +26 -0
- package/dist/agents/errors.js.map +1 -0
- 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/handler.d.ts.map +1 -1
- package/dist/agents/implementors/handler.js +2 -1
- package/dist/agents/implementors/handler.js.map +1 -1
- package/dist/agents/implementors/index.d.ts.map +1 -1
- package/dist/agents/implementors/index.js +3 -9
- package/dist/agents/implementors/index.js.map +1 -1
- package/dist/agents/implementors/prompts.d.ts +4 -9
- package/dist/agents/implementors/prompts.d.ts.map +1 -1
- package/dist/agents/implementors/prompts.js +10 -16
- package/dist/agents/implementors/prompts.js.map +1 -1
- package/dist/agents/index.d.ts +2 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/interviewers/adapter.d.ts +17 -0
- package/dist/agents/interviewers/adapter.d.ts.map +1 -0
- package/dist/agents/interviewers/adapter.js +111 -0
- package/dist/agents/interviewers/adapter.js.map +1 -0
- package/dist/agents/interviewers/dsl.d.ts +13 -0
- package/dist/agents/interviewers/dsl.d.ts.map +1 -0
- package/dist/agents/interviewers/dsl.js +14 -0
- package/dist/agents/interviewers/dsl.js.map +1 -0
- package/dist/agents/interviewers/handler.d.ts +21 -0
- package/dist/agents/interviewers/handler.d.ts.map +1 -0
- package/dist/agents/interviewers/handler.js +217 -0
- package/dist/agents/interviewers/handler.js.map +1 -0
- package/dist/agents/interviewers/index.d.ts +11 -0
- package/dist/agents/interviewers/index.d.ts.map +1 -0
- package/dist/agents/interviewers/index.js +16 -0
- package/dist/agents/interviewers/index.js.map +1 -0
- package/dist/agents/interviewers/prompts.d.ts +3 -0
- package/dist/agents/interviewers/prompts.d.ts.map +1 -0
- package/dist/agents/interviewers/prompts.js +73 -0
- package/dist/agents/interviewers/prompts.js.map +1 -0
- package/dist/agents/interviewers/types.d.ts +53 -0
- package/dist/agents/interviewers/types.d.ts.map +1 -0
- package/dist/agents/interviewers/types.js +2 -0
- package/dist/agents/interviewers/types.js.map +1 -0
- 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/dsl.d.ts +5 -1
- package/dist/agents/planners/dsl.d.ts.map +1 -1
- package/dist/agents/planners/handler.d.ts.map +1 -1
- package/dist/agents/planners/handler.js +44 -25
- package/dist/agents/planners/handler.js.map +1 -1
- package/dist/agents/planners/index.d.ts.map +1 -1
- package/dist/agents/planners/index.js +3 -9
- package/dist/agents/planners/index.js.map +1 -1
- package/dist/agents/planners/prompts.d.ts +5 -11
- package/dist/agents/planners/prompts.d.ts.map +1 -1
- package/dist/agents/planners/prompts.js +15 -22
- package/dist/agents/planners/prompts.js.map +1 -1
- package/dist/agents/registry.d.ts +2 -1
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js.map +1 -1
- package/dist/agents/reviewers/adapter.d.ts +2 -2
- package/dist/agents/reviewers/adapter.d.ts.map +1 -1
- package/dist/agents/reviewers/adapter.js +4 -4
- package/dist/agents/reviewers/adapter.js.map +1 -1
- package/dist/agents/reviewers/dsl.d.ts +6 -1
- package/dist/agents/reviewers/dsl.d.ts.map +1 -1
- package/dist/agents/reviewers/dsl.js.map +1 -1
- package/dist/agents/reviewers/handler.d.ts.map +1 -1
- package/dist/agents/reviewers/handler.js +24 -6
- 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 +7 -9
- package/dist/agents/reviewers/index.js.map +1 -1
- package/dist/agents/reviewers/prompts.d.ts +5 -11
- package/dist/agents/reviewers/prompts.d.ts.map +1 -1
- package/dist/agents/reviewers/prompts.js +22 -21
- package/dist/agents/reviewers/prompts.js.map +1 -1
- package/dist/agents/reviewers/types.d.ts +5 -2
- 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 +28 -1
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +140 -22
- 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/handler.d.ts.map +1 -1
- package/dist/agents/simplifiers/handler.js +2 -1
- package/dist/agents/simplifiers/handler.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/ansi.d.ts.map +1 -1
- package/dist/ansi.js +2 -3
- package/dist/ansi.js.map +1 -1
- package/dist/cli.js +84 -187
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +14 -9
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +24 -5
- package/dist/config.js.map +1 -1
- package/dist/dsl.d.ts +4 -1
- package/dist/dsl.d.ts.map +1 -1
- package/dist/dsl.js +4 -3
- package/dist/dsl.js.map +1 -1
- package/dist/dump/collector.d.ts.map +1 -1
- package/dist/dump/collector.js +22 -1
- package/dist/dump/collector.js.map +1 -1
- package/dist/dump/service.d.ts.map +1 -1
- package/dist/dump/service.js +1 -0
- package/dist/dump/service.js.map +1 -1
- package/dist/dump/types.d.ts +38 -0
- package/dist/dump/types.d.ts.map +1 -1
- package/dist/dump/types.js.map +1 -1
- package/dist/flow/built-in/default-factory.d.ts.map +1 -1
- package/dist/flow/built-in/default-factory.js +70 -66
- package/dist/flow/built-in/default-factory.js.map +1 -1
- package/dist/flow/built-in/default.d.ts +1 -1
- package/dist/flow/built-in/default.d.ts.map +1 -1
- package/dist/flow/built-in/default.js +3 -3
- package/dist/flow/built-in/default.js.map +1 -1
- package/dist/flow/built-in/default.ts +4 -4
- package/dist/flow/custom/AUTHORING.md +54 -54
- package/dist/flow/custom/load.d.ts.map +1 -1
- package/dist/flow/custom/load.js +0 -1
- package/dist/flow/custom/load.js.map +1 -1
- package/dist/flow/dsl.d.ts +2 -0
- package/dist/flow/dsl.d.ts.map +1 -1
- package/dist/flow/dsl.js +2 -0
- package/dist/flow/dsl.js.map +1 -1
- package/dist/flow/executor.d.ts +2 -1
- package/dist/flow/executor.d.ts.map +1 -1
- package/dist/flow/executor.js +31 -14
- package/dist/flow/executor.js.map +1 -1
- package/dist/flow/index.d.ts +1 -2
- package/dist/flow/index.d.ts.map +1 -1
- package/dist/flow/index.js +1 -2
- package/dist/flow/index.js.map +1 -1
- package/dist/flow/params.d.ts +19 -2
- package/dist/flow/params.d.ts.map +1 -1
- package/dist/flow/params.js +70 -1
- package/dist/flow/params.js.map +1 -1
- package/dist/flow/types.d.ts +33 -3
- package/dist/flow/types.d.ts.map +1 -1
- package/dist/flow/types.js +6 -0
- package/dist/flow/types.js.map +1 -1
- package/dist/flow-editor/tui.d.ts.map +1 -1
- package/dist/flow-editor/tui.js +10 -8
- package/dist/flow-editor/tui.js.map +1 -1
- package/dist/flow-editor/validate.d.ts.map +1 -1
- package/dist/flow-editor/validate.js +2 -1
- package/dist/flow-editor/validate.js.map +1 -1
- package/dist/markdown.d.ts +5 -0
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js +48 -1
- package/dist/markdown.js.map +1 -1
- package/dist/orchestrator.d.ts +16 -5
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +106 -25
- package/dist/orchestrator.js.map +1 -1
- package/dist/preflight.d.ts +11 -0
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +49 -16
- package/dist/preflight.js.map +1 -1
- package/dist/preview-panel.d.ts +30 -5
- package/dist/preview-panel.d.ts.map +1 -1
- package/dist/preview-panel.js +332 -15
- package/dist/preview-panel.js.map +1 -1
- package/dist/providers/base-completion.d.ts +5 -1
- package/dist/providers/base-completion.d.ts.map +1 -1
- package/dist/providers/base-completion.js +65 -5
- package/dist/providers/base-completion.js.map +1 -1
- package/dist/providers/claude/completion-plan-mode.d.ts +1 -1
- package/dist/providers/claude/completion-plan-mode.d.ts.map +1 -1
- package/dist/providers/claude/completion-plan-mode.js +2 -2
- package/dist/providers/claude/completion-plan-mode.js.map +1 -1
- package/dist/providers/claude/completion.d.ts +1 -1
- package/dist/providers/claude/completion.d.ts.map +1 -1
- package/dist/providers/claude/completion.js +2 -2
- package/dist/providers/claude/completion.js.map +1 -1
- package/dist/providers/claude/strategy.d.ts +2 -4
- package/dist/providers/claude/strategy.d.ts.map +1 -1
- package/dist/providers/claude/strategy.js +6 -2
- package/dist/providers/claude/strategy.js.map +1 -1
- package/dist/providers/codex/completion.d.ts +1 -1
- package/dist/providers/codex/completion.d.ts.map +1 -1
- package/dist/providers/codex/completion.js +2 -2
- package/dist/providers/codex/completion.js.map +1 -1
- package/dist/providers/codex/strategy.d.ts +2 -4
- package/dist/providers/codex/strategy.d.ts.map +1 -1
- package/dist/providers/codex/strategy.js +11 -6
- package/dist/providers/codex/strategy.js.map +1 -1
- package/dist/providers/copilot/completion.d.ts +1 -1
- package/dist/providers/copilot/completion.d.ts.map +1 -1
- package/dist/providers/copilot/completion.js +2 -2
- package/dist/providers/copilot/completion.js.map +1 -1
- package/dist/providers/copilot/strategy.d.ts +2 -3
- package/dist/providers/copilot/strategy.d.ts.map +1 -1
- package/dist/providers/copilot/strategy.js +13 -6
- package/dist/providers/copilot/strategy.js.map +1 -1
- package/dist/providers/option-catalog.d.ts +8 -0
- package/dist/providers/option-catalog.d.ts.map +1 -0
- package/dist/providers/option-catalog.js +33 -0
- package/dist/providers/option-catalog.js.map +1 -0
- package/dist/providers/types.d.ts +8 -3
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/providers/version.d.ts.map +1 -1
- package/dist/providers/version.js +6 -2
- package/dist/providers/version.js.map +1 -1
- package/dist/pty/exit.js +1 -1
- package/dist/pty/exit.js.map +1 -1
- package/dist/pty/spawn.d.ts +1 -0
- package/dist/pty/spawn.d.ts.map +1 -1
- package/dist/pty/spawn.js +13 -9
- package/dist/pty/spawn.js.map +1 -1
- package/dist/pty/types.d.ts +5 -1
- package/dist/pty/types.d.ts.map +1 -1
- package/dist/resume-tui.d.ts +6 -0
- package/dist/resume-tui.d.ts.map +1 -1
- package/dist/resume-tui.js +27 -12
- package/dist/resume-tui.js.map +1 -1
- package/dist/session/manifest.d.ts +12 -5
- package/dist/session/manifest.d.ts.map +1 -1
- package/dist/session/resume.d.ts.map +1 -1
- package/dist/session/resume.js +4 -2
- package/dist/session/resume.js.map +1 -1
- package/dist/startup-tui.d.ts +19 -5
- package/dist/startup-tui.d.ts.map +1 -1
- package/dist/startup-tui.js +134 -46
- package/dist/startup-tui.js.map +1 -1
- package/dist/terminal/win32-key-translator.d.ts.map +1 -1
- package/dist/terminal/win32-key-translator.js +5 -2
- package/dist/terminal/win32-key-translator.js.map +1 -1
- package/dist/terminal-input.d.ts.map +1 -1
- package/dist/terminal-input.js +9 -6
- package/dist/terminal-input.js.map +1 -1
- package/dist/user/curate-handler.d.ts.map +1 -1
- package/dist/user/curate-handler.js +25 -32
- package/dist/user/curate-handler.js.map +1 -1
- package/dist/user/curate-prompt.d.ts +1 -1
- package/dist/user/dsl.d.ts +1 -0
- package/dist/user/dsl.d.ts.map +1 -1
- package/dist/user/dsl.js +1 -0
- package/dist/user/dsl.js.map +1 -1
- package/dist/user/handler.d.ts.map +1 -1
- package/dist/user/handler.js +2 -1
- package/dist/user/handler.js.map +1 -1
- package/dist/user/host-curate-prompt.d.ts.map +1 -1
- package/dist/user/host-curate-prompt.js +105 -15
- package/dist/user/host-curate-prompt.js.map +1 -1
- package/dist/user/host-prompt.d.ts.map +1 -1
- package/dist/user/host-prompt.js +13 -5
- package/dist/user/host-prompt.js.map +1 -1
- package/dist/user/index.d.ts +1 -2
- package/dist/user/index.d.ts.map +1 -1
- package/dist/user/index.js +1 -2
- package/dist/user/index.js.map +1 -1
- package/dist/user/plan-pane.d.ts +32 -1
- package/dist/user/plan-pane.d.ts.map +1 -1
- package/dist/user/plan-pane.js +158 -5
- package/dist/user/plan-pane.js.map +1 -1
- package/dist/user/prompt.d.ts +9 -6
- package/dist/user/prompt.d.ts.map +1 -1
- package/dist/user/prompt.js +3 -8
- package/dist/user/prompt.js.map +1 -1
- package/package.json +1 -1
- package/schemas/review-verdict.json +13 -0
- package/dist/flow/built-in/why-so-serious-factory.d.ts +0 -16
- package/dist/flow/built-in/why-so-serious-factory.d.ts.map +0 -1
- package/dist/flow/built-in/why-so-serious-factory.js +0 -187
- package/dist/flow/built-in/why-so-serious-factory.js.map +0 -1
- package/dist/flow/built-in/why-so-serious.d.ts +0 -17
- package/dist/flow/built-in/why-so-serious.d.ts.map +0 -1
- package/dist/flow/built-in/why-so-serious.js +0 -23
- package/dist/flow/built-in/why-so-serious.js.map +0 -1
- package/dist/user/auto-curate-prompt.d.ts +0 -17
- package/dist/user/auto-curate-prompt.d.ts.map +0 -1
- package/dist/user/auto-curate-prompt.js +0 -22
- package/dist/user/auto-curate-prompt.js.map +0 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BaseStep, RetryFn, RoleHandler, StepContext, StepSignal } from "../../flow/types.js";
|
|
2
|
+
import type { InterviewerDriver } from "./types.js";
|
|
3
|
+
/** Thrown by the validation step inside the retry closure — retryable. */
|
|
4
|
+
export declare class InterviewerValidationError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class InterviewerRoleHandler implements RoleHandler {
|
|
8
|
+
private driver;
|
|
9
|
+
constructor(driver: InterviewerDriver);
|
|
10
|
+
execute(step: BaseStep, ctx: StepContext, retry: RetryFn): Promise<StepSignal>;
|
|
11
|
+
/**
|
|
12
|
+
* If a prior interviewer session exists (sidecar > snapshot) and its
|
|
13
|
+
* on-disk file is still present, set `ctx.sessionIds[sessionKey]` and
|
|
14
|
+
* return the validated session file path. Returning the path lets the
|
|
15
|
+
* caller hand it to driver.run() so the runner's resume fast path
|
|
16
|
+
* skips session-file discovery.
|
|
17
|
+
*/
|
|
18
|
+
private maybeRestoreSessionId;
|
|
19
|
+
private findRestorableSessionIdFromSnapshots;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/agents/interviewers/handler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,QAAQ,EACR,OAAO,EACP,WAAW,EACX,WAAW,EACX,UAAU,EACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,iBAAiB,EAGlB,MAAM,YAAY,CAAC;AAEpB,0EAA0E;AAC1E,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM;CAI5B;AAoCD,qBAAa,sBAAuB,YAAW,WAAW;IAC5C,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,iBAAiB;IAEvC,OAAO,CACX,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC;IAwHtB;;;;;;OAMG;YACW,qBAAqB;IAuDnC,OAAO,CAAC,oCAAoC;CAsB7C"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile, rm } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { bindSessionReporter, bindDriverRuntime, bindPtyBufferReporter, bindAttemptFailureReporter } from "../runner.js";
|
|
5
|
+
/** Thrown by the validation step inside the retry closure — retryable. */
|
|
6
|
+
export class InterviewerValidationError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "InterviewerValidationError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
async function readLiveSidecar(path) {
|
|
13
|
+
try {
|
|
14
|
+
const text = await readFile(path, "utf8");
|
|
15
|
+
const parsed = JSON.parse(text);
|
|
16
|
+
if (parsed &&
|
|
17
|
+
typeof parsed === "object" &&
|
|
18
|
+
typeof parsed.sessionId === "string" &&
|
|
19
|
+
typeof parsed.driver === "string" &&
|
|
20
|
+
typeof parsed.sessionKey === "string") {
|
|
21
|
+
return parsed;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
/* missing / unreadable — fine */
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
async function readFileMaybe(path) {
|
|
30
|
+
try {
|
|
31
|
+
return await readFile(path, "utf8");
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class InterviewerRoleHandler {
|
|
38
|
+
driver;
|
|
39
|
+
constructor(driver) {
|
|
40
|
+
this.driver = driver;
|
|
41
|
+
}
|
|
42
|
+
async execute(step, ctx, retry) {
|
|
43
|
+
const agentStep = step;
|
|
44
|
+
const sessionKey = agentStep.sessionShareKey ?? step.id;
|
|
45
|
+
const taskFile = ctx.artifacts.getFile(step.reads.task);
|
|
46
|
+
if (!taskFile) {
|
|
47
|
+
throw new Error("InterviewerRoleHandler: task artifact missing");
|
|
48
|
+
}
|
|
49
|
+
const specKey = step.writes.spec;
|
|
50
|
+
if (!specKey) {
|
|
51
|
+
throw new Error("InterviewerRoleHandler: step.writes.spec missing");
|
|
52
|
+
}
|
|
53
|
+
const specFile = join(ctx.sessionDir, "spec.md");
|
|
54
|
+
const markerFile = join(ctx.sessionDir, "spec.done");
|
|
55
|
+
const feedbackFile = step.reads.feedback
|
|
56
|
+
? ctx.artifacts.getFile(step.reads.feedback)
|
|
57
|
+
: undefined;
|
|
58
|
+
bindSessionReporter(this.driver, ctx.lastStepSessionFilePaths);
|
|
59
|
+
bindPtyBufferReporter(this.driver, ctx);
|
|
60
|
+
bindAttemptFailureReporter(this.driver, ctx);
|
|
61
|
+
bindDriverRuntime(this.driver, {
|
|
62
|
+
output: ctx.output,
|
|
63
|
+
terminalHost: ctx.terminalHost,
|
|
64
|
+
});
|
|
65
|
+
const sidecarPath = ctx.persistentDir
|
|
66
|
+
? join(ctx.persistentDir, "interviewer.live.json")
|
|
67
|
+
: undefined;
|
|
68
|
+
if (sidecarPath) {
|
|
69
|
+
this.driver.setLiveSidecar(sidecarPath, {
|
|
70
|
+
driver: agentStep.driver,
|
|
71
|
+
sessionKey,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const restoredSessionFile = await this.maybeRestoreSessionId(agentStep, ctx, sessionKey, sidecarPath);
|
|
75
|
+
let currentSessionId = ctx.sessionIds.get(sessionKey);
|
|
76
|
+
// Mode selection: (resumed?) × (feedback?). The chosen prompt always
|
|
77
|
+
// includes specFile/markerFile because cross-process resume rebuilds
|
|
78
|
+
// `sessionDir` under a fresh UUID — the new paths must overwrite the
|
|
79
|
+
// now-stale paths in the resumed conversation history. (In-process
|
|
80
|
+
// resume passes the same paths a second time, which is harmless.)
|
|
81
|
+
const initialMode = currentSessionId
|
|
82
|
+
? (feedbackFile ? "revise" : "continue")
|
|
83
|
+
: (feedbackFile ? "rehydrate" : "initial");
|
|
84
|
+
let prevFailure;
|
|
85
|
+
const result = await retry("interviewer", async (attempt) => {
|
|
86
|
+
await rm(markerFile, { force: true });
|
|
87
|
+
let mode;
|
|
88
|
+
if (attempt === 1) {
|
|
89
|
+
mode = initialMode;
|
|
90
|
+
}
|
|
91
|
+
else if (prevFailure === "missing-spec") {
|
|
92
|
+
mode = "retry-missing-spec";
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
mode = initialMode;
|
|
96
|
+
}
|
|
97
|
+
let driverRes;
|
|
98
|
+
try {
|
|
99
|
+
driverRes = await this.driver.run({
|
|
100
|
+
mode,
|
|
101
|
+
taskFile,
|
|
102
|
+
specFile,
|
|
103
|
+
markerFile,
|
|
104
|
+
feedbackFile,
|
|
105
|
+
resumeSessionId: currentSessionId,
|
|
106
|
+
// First attempt only: feed the just-validated path back to the
|
|
107
|
+
// runner so its resume fast path skips snapshot/discovery (the
|
|
108
|
+
// provider appends to the existing file — no new file appears).
|
|
109
|
+
resumeSessionFilePath: attempt === 1 && currentSessionId ? restoredSessionFile : undefined,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
currentSessionId =
|
|
114
|
+
(await this.driver.resolveCurrentSessionId()) ?? currentSessionId;
|
|
115
|
+
await this.driver.flushPendingSidecar();
|
|
116
|
+
}
|
|
117
|
+
const specText = (await readFileMaybe(specFile)) ?? "";
|
|
118
|
+
if (specText.trim().length === 0) {
|
|
119
|
+
prevFailure = "missing-spec";
|
|
120
|
+
throw new InterviewerValidationError("spec.md missing or empty");
|
|
121
|
+
}
|
|
122
|
+
prevFailure = undefined;
|
|
123
|
+
return { driverRes, specText };
|
|
124
|
+
});
|
|
125
|
+
const finalSessionId = currentSessionId ?? result.driverRes.sessionId;
|
|
126
|
+
if (finalSessionId) {
|
|
127
|
+
ctx.sessionIds.set(sessionKey, finalSessionId);
|
|
128
|
+
}
|
|
129
|
+
if (result.driverRes.sessionFilePath) {
|
|
130
|
+
ctx.lastStepSessionFilePaths?.push(result.driverRes.sessionFilePath);
|
|
131
|
+
}
|
|
132
|
+
ctx.artifacts.set(specKey, {
|
|
133
|
+
file: specFile,
|
|
134
|
+
text: result.specText,
|
|
135
|
+
meta: {
|
|
136
|
+
driver: this.driver.name,
|
|
137
|
+
iteration: ctx.totalIterations,
|
|
138
|
+
source: "interviewer",
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
if (sidecarPath) {
|
|
142
|
+
await rm(sidecarPath, { force: true }).catch(() => { });
|
|
143
|
+
}
|
|
144
|
+
return { kind: "continue" };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* If a prior interviewer session exists (sidecar > snapshot) and its
|
|
148
|
+
* on-disk file is still present, set `ctx.sessionIds[sessionKey]` and
|
|
149
|
+
* return the validated session file path. Returning the path lets the
|
|
150
|
+
* caller hand it to driver.run() so the runner's resume fast path
|
|
151
|
+
* skips session-file discovery.
|
|
152
|
+
*/
|
|
153
|
+
async maybeRestoreSessionId(step, ctx, sessionKey, sidecarPath) {
|
|
154
|
+
if (!step.restoreSessionIdsOnResume)
|
|
155
|
+
return undefined;
|
|
156
|
+
if (ctx.sessionIds.has(sessionKey))
|
|
157
|
+
return undefined;
|
|
158
|
+
if (sidecarPath) {
|
|
159
|
+
const sidecar = await readLiveSidecar(sidecarPath);
|
|
160
|
+
if (sidecar) {
|
|
161
|
+
if (sidecar.sessionKey !== sessionKey) {
|
|
162
|
+
// stale sidecar from a different interviewer step — silent skip
|
|
163
|
+
}
|
|
164
|
+
else if (sidecar.driver !== step.driver) {
|
|
165
|
+
ctx.output?.warn("interviewer: prior session unavailable (driver changed), starting fresh");
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
const path = this.driver.predictSessionFile?.(sidecar.sessionId);
|
|
169
|
+
if (!path) {
|
|
170
|
+
ctx.output?.warn("interviewer: provider does not support resume by id, starting fresh");
|
|
171
|
+
}
|
|
172
|
+
else if (!existsSync(path)) {
|
|
173
|
+
ctx.output?.warn("interviewer: prior session file missing, starting fresh");
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
ctx.sessionIds.set(sessionKey, sidecar.sessionId);
|
|
177
|
+
return path;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const priorId = this.findRestorableSessionIdFromSnapshots(step, ctx, sessionKey);
|
|
183
|
+
if (!priorId)
|
|
184
|
+
return undefined;
|
|
185
|
+
const path = this.driver.predictSessionFile?.(priorId);
|
|
186
|
+
if (!path) {
|
|
187
|
+
ctx.output?.warn("interviewer: provider does not support resume by id, starting fresh");
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
if (!existsSync(path)) {
|
|
191
|
+
ctx.output?.warn("interviewer: prior session file missing, starting fresh");
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
ctx.sessionIds.set(sessionKey, priorId);
|
|
195
|
+
return path;
|
|
196
|
+
}
|
|
197
|
+
findRestorableSessionIdFromSnapshots(step, ctx, sessionKey) {
|
|
198
|
+
if (!ctx.completedSnapshots)
|
|
199
|
+
return undefined;
|
|
200
|
+
const seqsDesc = [...ctx.completedSnapshots.keys()].sort((a, b) => b - a);
|
|
201
|
+
for (const seq of seqsDesc) {
|
|
202
|
+
const snap = ctx.completedSnapshots.get(seq);
|
|
203
|
+
if (snap.role !== "interviewer")
|
|
204
|
+
continue;
|
|
205
|
+
const priorId = snap.sessionIds?.[sessionKey];
|
|
206
|
+
if (!priorId)
|
|
207
|
+
continue;
|
|
208
|
+
if (snap.driver !== step.driver) {
|
|
209
|
+
ctx.output?.warn(`interviewer: prior session unavailable (driver changed ${snap.driver} → ${step.driver}), starting fresh`);
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
return priorId;
|
|
213
|
+
}
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/agents/interviewers/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ProviderStrategy } from "../../providers/types.js";
|
|
2
|
+
import type { DriverName } from "../../flow/types.js";
|
|
3
|
+
import type { InterviewerDriver, InterviewerPromptSet } from "./types.js";
|
|
4
|
+
export { interviewer } from "./dsl.js";
|
|
5
|
+
export { InterviewerRoleHandler } from "./handler.js";
|
|
6
|
+
export { defaultInterviewerPrompts } from "./prompts.js";
|
|
7
|
+
export type { InterviewerDriver, InterviewerMode, InterviewerPromptSet, InterviewerRunOpts, InterviewResult, InterviewerLiveSidecarMeta, } from "./types.js";
|
|
8
|
+
export type InterviewerFactory = (workdir: string, prompts?: InterviewerPromptSet) => InterviewerDriver;
|
|
9
|
+
export declare const registerProvider: (name: DriverName, strategy: ProviderStrategy) => void;
|
|
10
|
+
export declare const registerFactory: (name: string, factory: InterviewerFactory) => void, availableDrivers: () => string[];
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/interviewers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE1E,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,oBAAoB,KAC3B,iBAAiB,CAAC;AAiBvB,eAAO,MAAM,gBAAgB,EAA2B,CACtD,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,gBAAgB,KACvB,IAAI,CAAC;AACV,eAAO,MAAQ,eAAe,uDAAE,gBAAgB,gBAAQ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { InterviewerAdapter } from "./adapter.js";
|
|
2
|
+
import { InterviewerRoleHandler } from "./handler.js";
|
|
3
|
+
import { createRoleModule } from "../registry.js";
|
|
4
|
+
import { defaultInterviewerPrompts } from "./prompts.js";
|
|
5
|
+
export { interviewer } from "./dsl.js";
|
|
6
|
+
export { InterviewerRoleHandler } from "./handler.js";
|
|
7
|
+
export { defaultInterviewerPrompts } from "./prompts.js";
|
|
8
|
+
const mod = createRoleModule({
|
|
9
|
+
roleName: "interviewer",
|
|
10
|
+
fromFactory: (factory, workdir) => factory(workdir, defaultInterviewerPrompts),
|
|
11
|
+
fromProvider: (strategy, workdir, opts) => new InterviewerAdapter(strategy, workdir, defaultInterviewerPrompts, opts?.yolo, opts?.model, opts?.effort),
|
|
12
|
+
toHandler: (driver) => new InterviewerRoleHandler(driver),
|
|
13
|
+
});
|
|
14
|
+
export const registerProvider = mod.registerProvider;
|
|
15
|
+
export const { registerFactory, availableDrivers } = mod;
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/interviewers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAezD,MAAM,GAAG,GAAG,gBAAgB,CAAwC;IAClE,QAAQ,EAAE,aAAa;IACvB,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC9E,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CACxC,IAAI,kBAAkB,CACpB,QAAQ,EACR,OAAO,EACP,yBAAyB,EACzB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,MAAM,CACb;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,sBAAsB,CAAC,MAAM,CAAC;CAC1D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC,gBAG3B,CAAC;AACV,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/agents/interviewers/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AA2FvD,eAAO,MAAM,yBAAyB,EAAE,oBAMvC,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
const INTERVIEW_GUIDELINES = [
|
|
2
|
+
"Conduct a requirements interview or bug clarification with the user. Your job is to understand WHAT they want or what is broken - not HOW to fix or build it.",
|
|
3
|
+
"Ask focused questions until you understand the user's goal, the success criteria, the in/out of scope boundary, and any constraints. You decide the cadence and how many questions to ask per turn.",
|
|
4
|
+
"Keep grilling until the requirements are clear.",
|
|
5
|
+
"For bug-fix tasks, attempt to reproduce the bug locally before writing the spec; reproduction steps and observed behavior belong in the spec.",
|
|
6
|
+
].join(" ");
|
|
7
|
+
const GUARDRAILS = [
|
|
8
|
+
"Strict rules:",
|
|
9
|
+
"- Do not propose a design, implementation, file edits, or code changes.",
|
|
10
|
+
"- Do not edit any source files. The only file you may write is the spec and the marker file.",
|
|
11
|
+
"- Do not ask the user meta questions (\"want me to revise?\", \"does this look good?\", \"should I continue?\") or ask the user to review, approve, or confirm the spec before writing the marker file - the user reviews the spec externally after the interview ends.",
|
|
12
|
+
"- Do not write the marker file while any open questions remain. The spec as it exists on disk at the moment you write the marker file is the final committed answer. Make sure it is complete before writing the marker.",
|
|
13
|
+
"- End your turn immediately after writing the marker file. No follow-up commentary.",
|
|
14
|
+
].join("\n");
|
|
15
|
+
function initial(taskFile, specFile, markerFile) {
|
|
16
|
+
return [
|
|
17
|
+
`Read the user's task: ${taskFile}`,
|
|
18
|
+
`Write a requirements spec to: ${specFile}`,
|
|
19
|
+
"",
|
|
20
|
+
INTERVIEW_GUIDELINES,
|
|
21
|
+
"",
|
|
22
|
+
"You may rewrite the spec on disk as the conversation progresses.",
|
|
23
|
+
"",
|
|
24
|
+
`When - and only when - the requirements are fully clear, write the marker file at: ${markerFile}`,
|
|
25
|
+
"The marker may be empty; its presence signals you are done.",
|
|
26
|
+
"",
|
|
27
|
+
GUARDRAILS,
|
|
28
|
+
].join("\n");
|
|
29
|
+
}
|
|
30
|
+
function continueInterview(specFile, markerFile) {
|
|
31
|
+
return [
|
|
32
|
+
"Continue the interview.",
|
|
33
|
+
"",
|
|
34
|
+
`Current spec file: ${specFile}`,
|
|
35
|
+
`When the spec reflects the user's intent, write the marker file at: ${markerFile} and end your turn.`,
|
|
36
|
+
].join("\n");
|
|
37
|
+
}
|
|
38
|
+
function retryMissingSpec(specFile, markerFile) {
|
|
39
|
+
return [
|
|
40
|
+
`Your previous turn wrote the marker file but the spec file at ${specFile} is missing or empty.`,
|
|
41
|
+
"",
|
|
42
|
+
`Write the complete spec to ${specFile}, then re-write the marker file at ${markerFile}.`,
|
|
43
|
+
].join("\n");
|
|
44
|
+
}
|
|
45
|
+
function revise(feedbackFile, specFile, markerFile) {
|
|
46
|
+
return [
|
|
47
|
+
`The user reviewed the spec and left feedback: ${feedbackFile}`,
|
|
48
|
+
"",
|
|
49
|
+
`Revise the spec at ${specFile} to address the feedback.`,
|
|
50
|
+
`When done, write the marker file at: ${markerFile} and end your turn.`,
|
|
51
|
+
].join("\n");
|
|
52
|
+
}
|
|
53
|
+
function rehydrate(taskFile, specFile, markerFile, feedbackFile) {
|
|
54
|
+
const lines = [
|
|
55
|
+
"You are resuming a requirements interview that was interrupted.",
|
|
56
|
+
"",
|
|
57
|
+
`Original task: ${taskFile}`,
|
|
58
|
+
`Current requirements spec on disk: ${specFile} (may be partial or empty)`,
|
|
59
|
+
];
|
|
60
|
+
if (feedbackFile) {
|
|
61
|
+
lines.push(`User feedback on the prior spec: ${feedbackFile}`);
|
|
62
|
+
}
|
|
63
|
+
lines.push("", INTERVIEW_GUIDELINES, "", "Read those files, then continue the interview from where it left off. You may update the spec on disk as the conversation progresses.", `When the spec is complete, write the marker file at: ${markerFile} and end your turn.`, "", GUARDRAILS);
|
|
64
|
+
return lines.join("\n");
|
|
65
|
+
}
|
|
66
|
+
export const defaultInterviewerPrompts = {
|
|
67
|
+
initial,
|
|
68
|
+
continueInterview,
|
|
69
|
+
retryMissingSpec,
|
|
70
|
+
revise,
|
|
71
|
+
rehydrate,
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/agents/interviewers/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,oBAAoB,GAAG;IAC3B,+JAA+J;IAC/J,qMAAqM;IACrM,iDAAiD;IACjD,+IAA+I;CAChJ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,UAAU,GAAG;IACjB,eAAe;IACf,yEAAyE;IACzE,8FAA8F;IAC9F,yQAAyQ;IACzQ,0NAA0N;IAC1N,qFAAqF;CACtF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,OAAO,CAAC,QAAgB,EAAE,QAAgB,EAAE,UAAkB;IACrE,OAAO;QACL,yBAAyB,QAAQ,EAAE;QACnC,iCAAiC,QAAQ,EAAE;QAC3C,EAAE;QACF,oBAAoB;QACpB,EAAE;QACF,kEAAkE;QAClE,EAAE;QACF,sFAAsF,UAAU,EAAE;QAClG,6DAA6D;QAC7D,EAAE;QACF,UAAU;KACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,UAAkB;IAC7D,OAAO;QACL,yBAAyB;QACzB,EAAE;QACF,sBAAsB,QAAQ,EAAE;QAChC,uEAAuE,UAAU,qBAAqB;KACvG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,UAAkB;IAC5D,OAAO;QACL,iEAAiE,QAAQ,uBAAuB;QAChG,EAAE;QACF,8BAA8B,QAAQ,sCAAsC,UAAU,GAAG;KAC1F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CACb,YAAoB,EACpB,QAAgB,EAChB,UAAkB;IAElB,OAAO;QACL,iDAAiD,YAAY,EAAE;QAC/D,EAAE;QACF,sBAAsB,QAAQ,2BAA2B;QACzD,wCAAwC,UAAU,qBAAqB;KACxE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAChB,QAAgB,EAChB,QAAgB,EAChB,UAAkB,EAClB,YAAgC;IAEhC,MAAM,KAAK,GAAG;QACZ,iEAAiE;QACjE,EAAE;QACF,kBAAkB,QAAQ,EAAE;QAC5B,sCAAsC,QAAQ,4BAA4B;KAC3E,CAAC;IACF,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,oCAAoC,YAAY,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,KAAK,CAAC,IAAI,CACR,EAAE,EACF,oBAAoB,EACpB,EAAE,EACF,uIAAuI,EACvI,wDAAwD,UAAU,qBAAqB,EACvF,EAAE,EACF,UAAU,CACX,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAyB;IAC7D,OAAO;IACP,iBAAiB;IACjB,gBAAgB;IAChB,MAAM;IACN,SAAS;CACV,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modes the handler can drive the interviewer into. The adapter selects
|
|
3
|
+
* the prompt by mode; freshFallbackPrompt selection (see adapter) handles
|
|
4
|
+
* the resume-failure path.
|
|
5
|
+
*/
|
|
6
|
+
export type InterviewerMode = "initial" | "continue" | "retry-missing-spec" | "revise" | "rehydrate";
|
|
7
|
+
export interface InterviewerPromptSet {
|
|
8
|
+
initial: (taskFile: string, specFile: string, markerFile: string) => string;
|
|
9
|
+
continueInterview: (specFile: string, markerFile: string) => string;
|
|
10
|
+
retryMissingSpec: (specFile: string, markerFile: string) => string;
|
|
11
|
+
revise: (feedbackFile: string, specFile: string, markerFile: string) => string;
|
|
12
|
+
rehydrate: (taskFile: string, specFile: string, markerFile: string, feedbackFile: string | undefined) => string;
|
|
13
|
+
}
|
|
14
|
+
export interface InterviewerLiveSidecarMeta {
|
|
15
|
+
driver: string;
|
|
16
|
+
sessionKey: string;
|
|
17
|
+
}
|
|
18
|
+
export interface InterviewerRunOpts {
|
|
19
|
+
mode: InterviewerMode;
|
|
20
|
+
taskFile: string;
|
|
21
|
+
specFile: string;
|
|
22
|
+
markerFile: string;
|
|
23
|
+
feedbackFile?: string;
|
|
24
|
+
resumeSessionId?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Known on-disk session file path for `resumeSessionId`. When the handler
|
|
27
|
+
* has just validated a provider-predicted file before driver.run(), it
|
|
28
|
+
* passes the path here so the runner can skip session-file discovery
|
|
29
|
+
* (which otherwise hangs waiting for a *new* file that never appears when
|
|
30
|
+
* the provider appends to the existing one).
|
|
31
|
+
*/
|
|
32
|
+
resumeSessionFilePath?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface InterviewResult {
|
|
35
|
+
sessionId: string;
|
|
36
|
+
sessionFilePath?: string;
|
|
37
|
+
rawText?: string;
|
|
38
|
+
agentUsed: string;
|
|
39
|
+
}
|
|
40
|
+
export interface InterviewerDriver {
|
|
41
|
+
readonly name: string;
|
|
42
|
+
run(opts: InterviewerRunOpts): Promise<InterviewResult>;
|
|
43
|
+
getSessionId(): string | undefined;
|
|
44
|
+
/** Resolve session id even if `run()` threw — delegates to provider extractSessionId. */
|
|
45
|
+
resolveCurrentSessionId(): Promise<string | undefined>;
|
|
46
|
+
/** Register sidecar destination. Adapter chains the write into its existing callback. */
|
|
47
|
+
setLiveSidecar(sidecarPath: string, meta: InterviewerLiveSidecarMeta): void;
|
|
48
|
+
/** Await any in-flight sidecar write (called by handler `finally` so Ctrl+C can't lose it). */
|
|
49
|
+
flushPendingSidecar(): Promise<void>;
|
|
50
|
+
/** Optional: predict the on-disk session file path for an id. */
|
|
51
|
+
predictSessionFile?(sessionId: string): string | undefined;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/agents/interviewers/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,UAAU,GACV,oBAAoB,GACpB,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5E,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACpE,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACnE,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/E,SAAS,EAAE,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GAAG,SAAS,KAC7B,MAAM,CAAC;CACb;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACxD,YAAY,IAAI,MAAM,GAAG,SAAS,CAAC;IACnC,yFAAyF;IACzF,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvD,yFAAyF;IACzF,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC5E,+FAA+F;IAC/F,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,iEAAiE;IACjE,kBAAkB,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agents/interviewers/types.ts"],"names":[],"mappings":""}
|
|
@@ -12,7 +12,7 @@ type PlannerRunOptions = {
|
|
|
12
12
|
export declare function selectPlannerPrompt(taskFile: string, opts: PlannerRunOptions, prompts?: PlannerPromptSet): string;
|
|
13
13
|
export declare class PlannerAdapter extends BaseAdapter implements PlannerDriver {
|
|
14
14
|
private readonly prompts?;
|
|
15
|
-
constructor(strategy: ProviderStrategy, workdir: string, prompts?: PlannerPromptSet | undefined, yolo?: boolean);
|
|
15
|
+
constructor(strategy: ProviderStrategy, workdir: string, prompts?: PlannerPromptSet | undefined, yolo?: boolean, model?: string, effort?: string);
|
|
16
16
|
run(taskFile: string, opts: PlannerRunOptions): Promise<PlanResult>;
|
|
17
17
|
}
|
|
18
18
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/agents/planners/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,KAAK,iBAAiB,GAAG;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,gBAAwC,GAChD,MAAM,CAmCR;AAED,qBAAa,cAAe,SAAQ,WAAY,YAAW,aAAa;IAIpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAFzB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,EACE,OAAO,CAAC,EAAE,gBAAgB,YAAA,EAC3C,IAAI,CAAC,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/agents/planners/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,KAAK,iBAAiB,GAAG;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,gBAAwC,GAChD,MAAM,CAmCR;AAED,qBAAa,cAAe,SAAQ,WAAY,YAAW,aAAa;IAIpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAFzB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,EACE,OAAO,CAAC,EAAE,gBAAgB,YAAA,EAC3C,IAAI,CAAC,EAAE,OAAO,EACd,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM;IAKX,GAAG,CACP,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,UAAU,CAAC;CAoDvB"}
|
|
@@ -19,8 +19,8 @@ export function selectPlannerPrompt(taskFile, opts, prompts = defaultPlannerProm
|
|
|
19
19
|
}
|
|
20
20
|
export class PlannerAdapter extends BaseAdapter {
|
|
21
21
|
prompts;
|
|
22
|
-
constructor(strategy, workdir, prompts, yolo) {
|
|
23
|
-
super(strategy, workdir, yolo);
|
|
22
|
+
constructor(strategy, workdir, prompts, yolo, model, effort) {
|
|
23
|
+
super(strategy, workdir, yolo, model, effort);
|
|
24
24
|
this.prompts = prompts;
|
|
25
25
|
}
|
|
26
26
|
async run(taskFile, opts) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/agents/planners/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAWrD,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,IAAuB,EACvB,UAA4B,qBAAqB;IAEjD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,qDAAqD;QACrD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,OAAO,OAAO,CAAC,kBAAkB,CAC/B,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,cAAc,CACpB,CAAC;YACJ,CAAC;YACD,OAAO,OAAO,CAAC,YAAY,CACzB,QAAQ,EACR,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,cAAc,CACpB,CAAC;QACJ,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,cAAc,CAC3B,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,cAAc,IAAI,UAAU,EACjC,IAAI,CAAC,cAAc,CACpB,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,QAAQ,CACrB,QAAQ,EACR,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,cAAc,IAAI,UAAU,EACjC,IAAI,CAAC,cAAc,CACpB,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,OAAO,cAAe,SAAQ,WAAW;IAI1B;IAHnB,YACE,QAA0B,EAC1B,OAAe,EACE,OAA0B,EAC3C,IAAc;
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/agents/planners/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,11 @@ import { type WhenCondition, type PhaseLabelSpec } from "../../flow/dsl.js";
|
|
|
2
2
|
import type { AgentStep } from "../../flow/types.js";
|
|
3
3
|
export declare function plan(opts: {
|
|
4
4
|
driver: string;
|
|
5
|
-
reads: Record<string, string
|
|
5
|
+
reads: Record<string, string> & {
|
|
6
|
+
task?: string;
|
|
7
|
+
spec?: string;
|
|
8
|
+
verdict?: string;
|
|
9
|
+
};
|
|
6
10
|
writes: Record<string, string>;
|
|
7
11
|
id?: string;
|
|
8
12
|
feedbackToTask?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dsl.d.ts","sourceRoot":"","sources":["../../../src/agents/planners/dsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,wBAAgB,IAAI,CAAC,IAAI,EAAE;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"dsl.d.ts","sourceRoot":"","sources":["../../../src/agents/planners/dsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,wBAAgB,IAAI,CAAC,IAAI,EAAE;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B,GAAG,SAAS,CAMZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/agents/planners/handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMhD,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAQ7B,qBAAa,kBAAmB,YAAW,WAAW;IAGxC,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,WAAW,CAAK;gBAEJ,MAAM,EAAE,aAAa;IAEnC,OAAO,CACX,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/agents/planners/handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMhD,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAQ7B,qBAAa,kBAAmB,YAAW,WAAW;IAGxC,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,WAAW,CAAK;gBAEJ,MAAM,EAAE,aAAa;IAEnC,OAAO,CACX,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC;CAiHvB"}
|
|
@@ -3,7 +3,7 @@ import { join } from "node:path";
|
|
|
3
3
|
import { appendClarifications } from "../../prompts.js";
|
|
4
4
|
import { readPlanFromContract, removeFileIfExists, } from "../../orchestrator.js";
|
|
5
5
|
import { TASK, } from "../../flow/types.js";
|
|
6
|
-
import { bindSessionReporter, bindDriverRuntime, bindPtyBufferReporter } from "../runner.js";
|
|
6
|
+
import { bindSessionReporter, bindDriverRuntime, bindPtyBufferReporter, bindAttemptFailureReporter } from "../runner.js";
|
|
7
7
|
/** Return the plan file path for a given version (1-based). */
|
|
8
8
|
function planFileForVersion(root, version) {
|
|
9
9
|
return join(root, `plan-v${version}.md`);
|
|
@@ -15,9 +15,10 @@ export class PlannerRoleHandler {
|
|
|
15
15
|
this.driver = driver;
|
|
16
16
|
}
|
|
17
17
|
async execute(step, ctx, retry) {
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const specFile = (step.reads.spec && ctx.artifacts.getFile(step.reads.spec))
|
|
19
|
+
?? (step.reads.task && ctx.artifacts.getFile(step.reads.task));
|
|
20
|
+
if (!specFile)
|
|
21
|
+
throw new Error("PlannerRoleHandler: spec or task artifact missing");
|
|
21
22
|
// Read feedback from verdict artifact (set by incorporateFeedback)
|
|
22
23
|
const verdictArtifact = step.reads.verdict
|
|
23
24
|
? ctx.artifacts.get(step.reads.verdict) : undefined;
|
|
@@ -36,14 +37,20 @@ export class PlannerRoleHandler {
|
|
|
36
37
|
ctx.sessionIds.delete(sessionKey);
|
|
37
38
|
}
|
|
38
39
|
const resumeSessionId = ctx.sessionIds.get(sessionKey);
|
|
39
|
-
|
|
40
|
+
// implReplan is the "impl-review revising the plan" case: a planner step
|
|
41
|
+
// whose task input is remapped to something other than TASK (and whose
|
|
42
|
+
// input is therefore not the original task). Spec-driven planning still
|
|
43
|
+
// reads `spec`, NOT a remapped task, so it must NOT be flagged as
|
|
44
|
+
// impl-replan.
|
|
45
|
+
const implReplan = !step.reads.spec && step.reads.task !== undefined && step.reads.task !== TASK;
|
|
40
46
|
bindSessionReporter(this.driver, ctx.lastStepSessionFilePaths);
|
|
41
47
|
bindPtyBufferReporter(this.driver, ctx);
|
|
48
|
+
bindAttemptFailureReporter(this.driver, ctx);
|
|
42
49
|
bindDriverRuntime(this.driver, { output: ctx.output, terminalHost: ctx.terminalHost });
|
|
43
50
|
const { planResult, planText, actualPlanFile } = await retry("planner", async (attempt) => {
|
|
44
51
|
if (attempt > 1)
|
|
45
52
|
await removeFileIfExists(outputPlanFile);
|
|
46
|
-
const planResult = await this.driver.run(
|
|
53
|
+
const planResult = await this.driver.run(specFile, {
|
|
47
54
|
outputPlanFile,
|
|
48
55
|
resumeSessionId: attempt === 1 ? resumeSessionId : undefined,
|
|
49
56
|
planFile: feedbackSource ? prevPlanFile : undefined,
|
|
@@ -69,25 +76,37 @@ export class PlannerRoleHandler {
|
|
|
69
76
|
if (planResult.sessionId) {
|
|
70
77
|
ctx.sessionIds.set(sessionKey, planResult.sessionId);
|
|
71
78
|
}
|
|
72
|
-
// Merge in-planning clarifications (AskUserQuestion Q&A)
|
|
73
|
-
//
|
|
74
|
-
if (planResult.clarifications?.length
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
79
|
+
// Merge in-planning clarifications (AskUserQuestion Q&A) into the
|
|
80
|
+
// planner's input baseline: spec if present, task otherwise.
|
|
81
|
+
if (planResult.clarifications?.length) {
|
|
82
|
+
const specKey = step.reads.spec;
|
|
83
|
+
const taskKey = step.reads.task;
|
|
84
|
+
const specArtifact = specKey ? ctx.artifacts.get(specKey) : undefined;
|
|
85
|
+
const baseline = specArtifact?.text != null
|
|
86
|
+
? { key: specKey, artifact: specArtifact }
|
|
87
|
+
: (() => {
|
|
88
|
+
if (!taskKey || taskKey !== TASK)
|
|
89
|
+
return null;
|
|
90
|
+
const taskArtifact = ctx.artifacts.get(taskKey);
|
|
91
|
+
return taskArtifact?.text != null
|
|
92
|
+
? { key: taskKey, artifact: taskArtifact }
|
|
93
|
+
: null;
|
|
94
|
+
})();
|
|
95
|
+
if (baseline) {
|
|
96
|
+
const entries = planResult.clarifications.map((c) => ({
|
|
97
|
+
type: "qa",
|
|
98
|
+
clarification: c,
|
|
99
|
+
}));
|
|
100
|
+
const result = appendClarifications(baseline.artifact.text, entries, ctx.nextClarificationNumber);
|
|
101
|
+
ctx.nextClarificationNumber = result.nextNumber;
|
|
102
|
+
ctx.artifacts.set(baseline.key, {
|
|
103
|
+
...baseline.artifact,
|
|
104
|
+
text: result.content,
|
|
105
|
+
file: baseline.artifact.file,
|
|
106
|
+
});
|
|
107
|
+
if (baseline.artifact.file) {
|
|
108
|
+
await writeFile(baseline.artifact.file, result.content, "utf-8");
|
|
109
|
+
}
|
|
91
110
|
}
|
|
92
111
|
}
|
|
93
112
|
return { kind: "continue" };
|