@on-par/factory-core 0.9.8-next.3 → 0.9.8-next.30
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/dist/config/effort.d.ts.map +1 -1
- package/dist/config/effort.js +5 -0
- package/dist/config/effort.js.map +1 -1
- package/dist/config/index.d.ts +9 -5
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +7 -6
- package/dist/config/index.js.map +1 -1
- package/dist/config/intermediaries.d.ts +25 -0
- package/dist/config/intermediaries.d.ts.map +1 -0
- package/dist/config/intermediaries.js +40 -0
- package/dist/config/intermediaries.js.map +1 -0
- package/dist/config/repo-build-pin.js +2 -2
- package/dist/config/repo-build-pin.js.map +1 -1
- package/dist/config/repo-harnesses.d.ts +3 -0
- package/dist/config/repo-harnesses.d.ts.map +1 -1
- package/dist/config/repo-harnesses.js +6 -0
- package/dist/config/repo-harnesses.js.map +1 -1
- package/dist/config/repo-tier-guard.d.ts +4 -0
- package/dist/config/repo-tier-guard.d.ts.map +1 -0
- package/dist/config/repo-tier-guard.js +8 -0
- package/dist/config/repo-tier-guard.js.map +1 -0
- package/dist/config/repo.d.ts +8 -5
- package/dist/config/repo.d.ts.map +1 -1
- package/dist/config/repo.js +12 -10
- package/dist/config/repo.js.map +1 -1
- package/dist/config/v2.d.ts +2 -0
- package/dist/config/v2.d.ts.map +1 -1
- package/dist/config/v2.js +8 -0
- package/dist/config/v2.js.map +1 -1
- package/dist/daemon/execution-config.d.ts +3 -0
- package/dist/daemon/execution-config.d.ts.map +1 -1
- package/dist/daemon/run-runtime.d.ts +4 -1
- package/dist/daemon/run-runtime.d.ts.map +1 -1
- package/dist/daemon/run-runtime.js +3 -3
- package/dist/daemon/run-runtime.js.map +1 -1
- package/dist/discovery/gherkin-scenario.d.ts +4 -0
- package/dist/discovery/gherkin-scenario.d.ts.map +1 -0
- package/dist/discovery/gherkin-scenario.js +2 -0
- package/dist/discovery/gherkin-scenario.js.map +1 -0
- package/dist/discovery/promote.d.ts +1 -3
- package/dist/discovery/promote.d.ts.map +1 -1
- package/dist/discovery/promote.js.map +1 -1
- package/dist/events/kinds.d.ts +1 -1
- package/dist/events/kinds.d.ts.map +1 -1
- package/dist/events/kinds.js +1 -0
- package/dist/events/kinds.js.map +1 -1
- package/dist/filing/index.d.ts.map +1 -1
- package/dist/filing/index.js +1 -0
- package/dist/filing/index.js.map +1 -1
- package/dist/harness/catalog.d.ts +5 -0
- package/dist/harness/catalog.d.ts.map +1 -1
- package/dist/harness/catalog.js +10 -0
- package/dist/harness/catalog.js.map +1 -1
- package/dist/harness/classify.d.ts.map +1 -1
- package/dist/harness/classify.js +4 -0
- package/dist/harness/classify.js.map +1 -1
- package/dist/harness/claude-cli.d.ts +10 -1
- package/dist/harness/claude-cli.d.ts.map +1 -1
- package/dist/harness/claude-cli.js +38 -3
- package/dist/harness/claude-cli.js.map +1 -1
- package/dist/harness/contract.d.ts.map +1 -1
- package/dist/harness/contract.js +1 -0
- package/dist/harness/contract.js.map +1 -1
- package/dist/harness/index.d.ts +1 -1
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +1 -0
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/opencode.d.ts +33 -5
- package/dist/harness/opencode.d.ts.map +1 -1
- package/dist/harness/opencode.js +104 -16
- package/dist/harness/opencode.js.map +1 -1
- package/dist/harness/pi.d.ts +32 -0
- package/dist/harness/pi.d.ts.map +1 -0
- package/dist/harness/pi.js +194 -0
- package/dist/harness/pi.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/internal.d.ts +3 -2
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -0
- package/dist/internal.js.map +1 -1
- package/dist/models/diagnose-helpers.d.ts +8 -0
- package/dist/models/diagnose-helpers.d.ts.map +1 -0
- package/dist/models/diagnose-helpers.js +20 -0
- package/dist/models/diagnose-helpers.js.map +1 -0
- package/dist/models/harness-probe.d.ts +3 -0
- package/dist/models/harness-probe.d.ts.map +1 -0
- package/dist/models/harness-probe.js +20 -0
- package/dist/models/harness-probe.js.map +1 -0
- package/dist/models/index.d.ts +16 -15
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +62 -62
- package/dist/models/index.js.map +1 -1
- package/dist/models/overrides.d.ts +13 -0
- package/dist/models/overrides.d.ts.map +1 -0
- package/dist/models/overrides.js +24 -0
- package/dist/models/overrides.js.map +1 -0
- package/dist/models/pi-auth.d.ts +15 -0
- package/dist/models/pi-auth.d.ts.map +1 -0
- package/dist/models/pi-auth.js +57 -0
- package/dist/models/pi-auth.js.map +1 -0
- package/dist/models/zdr-review.d.ts +6 -0
- package/dist/models/zdr-review.d.ts.map +1 -0
- package/dist/models/zdr-review.js +27 -0
- package/dist/models/zdr-review.js.map +1 -0
- package/dist/phases/build-opencode-failover.d.ts +43 -0
- package/dist/phases/build-opencode-failover.d.ts.map +1 -0
- package/dist/phases/build-opencode-failover.js +36 -0
- package/dist/phases/build-opencode-failover.js.map +1 -0
- package/dist/phases/build.d.ts +2 -0
- package/dist/phases/build.d.ts.map +1 -1
- package/dist/phases/build.js +15 -0
- package/dist/phases/build.js.map +1 -1
- package/dist/queue/github-queue.d.ts +2 -2
- package/dist/queue/github-queue.d.ts.map +1 -1
- package/dist/queue/github-queue.js +1 -1
- package/dist/queue/github-queue.js.map +1 -1
- package/dist/router/breaker.d.ts +14 -7
- package/dist/router/breaker.d.ts.map +1 -1
- package/dist/router/breaker.js +27 -12
- package/dist/router/breaker.js.map +1 -1
- package/dist/router/index.d.ts +2 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +7 -1
- package/dist/router/index.js.map +1 -1
- package/dist/router/missing-worktree.d.ts +7 -0
- package/dist/router/missing-worktree.d.ts.map +1 -0
- package/dist/router/missing-worktree.js +14 -0
- package/dist/router/missing-worktree.js.map +1 -0
- package/dist/router/requires.js +2 -2
- package/dist/router/requires.js.map +1 -1
- package/dist/run/provider-breaker-gate.d.ts +25 -0
- package/dist/run/provider-breaker-gate.d.ts.map +1 -0
- package/dist/run/provider-breaker-gate.js +37 -0
- package/dist/run/provider-breaker-gate.js.map +1 -0
- package/dist/run/run-issue.d.ts.map +1 -1
- package/dist/run/run-issue.js +16 -15
- package/dist/run/run-issue.js.map +1 -1
- package/dist/sim/jitter.js +1 -1
- package/dist/sim/jitter.js.map +1 -1
- package/dist/types/index.d.ts +6 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/usage/subscription.js +1 -1
- package/dist/usage/subscription.js.map +1 -1
- package/dist/utils/exec.d.ts +1 -1
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/local-auth-record.d.ts +2 -2
- package/dist/utils/local-auth-record.d.ts.map +1 -1
- package/dist/utils/local-auth-record.js +8 -3
- package/dist/utils/local-auth-record.js.map +1 -1
- package/dist/utils/worktree-gc-issues.d.ts +22 -0
- package/dist/utils/worktree-gc-issues.d.ts.map +1 -0
- package/dist/utils/worktree-gc-issues.js +80 -0
- package/dist/utils/worktree-gc-issues.js.map +1 -0
- package/dist/utils/worktree-gc.d.ts +5 -0
- package/dist/utils/worktree-gc.d.ts.map +1 -1
- package/dist/utils/worktree-gc.js +39 -77
- package/dist/utils/worktree-gc.js.map +1 -1
- package/package.json +5 -5
package/dist/harness/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,+EAA+E;AAM/E;6DAC6D;AAC7D,oFAAoF;AACpF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,eAAe;CACuB,CAAC;AAEzC,2FAA2F;AAC3F,MAAM,UAAU,0BAA0B,CAAC,IAAc;IACvD,OAAQ,mBAAyC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAID;kDACkD;AAClD,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,gBAAgB;IAChB,cAAc;IACd,eAAe;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,+EAA+E;AAM/E;6DAC6D;AAC7D,oFAAoF;AACpF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,eAAe;CACuB,CAAC;AAEzC,2FAA2F;AAC3F,MAAM,UAAU,0BAA0B,CAAC,IAAc;IACvD,OAAQ,mBAAyC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAID;kDACkD;AAClD,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,gBAAgB;IAChB,cAAc;IACd,eAAe;IACf,mBAAmB;CAC+B,CAAC;AAErD,kEAAkE;AAClE,MAAM,UAAU,kBAAkB,CAAC,MAA4B;IAC7D,OAAO,CAAE,6BAAmD,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChF,CAAC;AAgDD;2EAC2E;AAC3E,MAAM,OAAO,YAAa,SAAQ,KAAK;IAG1B,MAAM;IACN,OAAO;IAHlB,YACE,OAAe,EACN,MAA4B,EAC5B,OAAO,GASZ,EAAE;QAEN,KAAK,CAAC,OAAO,CAAC,CAAC;sBAZN,MAAM;uBACN,OAAO;QAYhB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAqBD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -1,26 +1,54 @@
|
|
|
1
1
|
import type { ExecFn } from '../utils/exec.js';
|
|
2
|
-
import type { CodingHarness, HarnessRequest, HarnessResult, HarnessUsage } from './index.js';
|
|
2
|
+
import type { CodingHarness, HarnessFailureReason, HarnessRequest, HarnessResult, HarnessUsage } from './index.js';
|
|
3
3
|
import { type OpenCodeVersionProbe } from './opencode-version.js';
|
|
4
4
|
export type OpenCodeExecFn = ExecFn;
|
|
5
5
|
export interface ParsedOpenCodeJson {
|
|
6
|
-
/**
|
|
6
|
+
/** Text parts of the last step (after the final `step_start`), trimmed, non-empty, joined by a
|
|
7
|
+
* blank line; '' when that step has no text. */
|
|
7
8
|
text: string;
|
|
8
|
-
/** Summed `step_finish` usage; undefined when no step reported numeric tokens.
|
|
9
|
+
/** Summed `step_finish` usage; undefined when no step reported numeric tokens. `durationMs` is
|
|
10
|
+
* the span between the smallest and largest finite event `timestamp`, omitted when none. */
|
|
9
11
|
usage?: HarnessUsage;
|
|
10
12
|
/** One line per `error` event, newline-joined; '' when none. Each line is the message (or
|
|
11
13
|
* error name), then `data.responseBody` when a string, then `status <n>` when
|
|
12
14
|
* `data.statusCode` is a number, so caps and 429s carried outside the message classify. */
|
|
13
15
|
errorText: string;
|
|
16
|
+
/** `error.type` of the first `error` event with a non-empty string type (#2889); absent when none. */
|
|
17
|
+
errorType?: string;
|
|
18
|
+
/** HTTP status of that same event: first finite number of `error.status`, `error.statusCode`,
|
|
19
|
+
* `error.data.statusCode`; absent when none. */
|
|
20
|
+
errorStatus?: number;
|
|
21
|
+
/** `tool_use` events whose state error/output says the non-interactive run could not ask for
|
|
22
|
+
* permission; always present, `[]` when none. */
|
|
23
|
+
permissionDenials: OpenCodePermissionDenial[];
|
|
24
|
+
/** False when a `step_start` has no later `step_finish` (truncated run, #2882); true when every step closed or none started. */
|
|
25
|
+
finished: boolean;
|
|
14
26
|
}
|
|
27
|
+
export interface OpenCodePermissionDenial {
|
|
28
|
+
/** `part.tool` of the rejected `tool_use`; 'unknown' when absent. */
|
|
29
|
+
tool: string;
|
|
30
|
+
/** First line of the state error/output that carried the rejection, trimmed. */
|
|
31
|
+
message: string;
|
|
32
|
+
}
|
|
33
|
+
/** OpenCode typed `error.type` → failure reason (#2889). Unlisted types fall back to classifyFailure. */
|
|
34
|
+
export declare const OPENCODE_ERROR_TYPE_REASONS: Readonly<Record<string, HarnessFailureReason>>;
|
|
35
|
+
export declare function classifyOpenCodeErrorType(type: string | undefined): HarnessFailureReason | undefined;
|
|
15
36
|
/** Parses `opencode run --format json` NDJSON. Returns undefined when stdout has no
|
|
16
37
|
* OpenCode event lines (an object with a string `type`), so callers fall back to raw
|
|
17
38
|
* stdout. Tolerant by design: malformed lines, unknown event types and bad counts are
|
|
18
|
-
* skipped. Usage capture must never fail a run (#2462).
|
|
39
|
+
* skipped. Usage capture must never fail a run (#2462). Usage `durationMs` is the span between
|
|
40
|
+
* the smallest and largest finite event `timestamp` (omitted when none). Only the last step's text is returned:
|
|
41
|
+
* narration from earlier steps is dropped (#2881). A `tool_use` whose state error/output says the
|
|
42
|
+
* run cannot ask for permission is reported in `permissionDenials` (#2888). The first `error` event
|
|
43
|
+
* with a string `error.type` is reported as `errorType`/`errorStatus` (#2889). */
|
|
19
44
|
export declare function parseOpenCodeJson(stdout: string): ParsedOpenCodeJson | undefined;
|
|
20
45
|
/** `--model`/`--variant` fragment for `opencode run`. v2+ (#2878) carries effort as a `#effort`
|
|
21
46
|
* model suffix and has no --variant; v1 or an unknown major keeps `--variant`. */
|
|
22
47
|
export declare function buildOpenCodeModelArgs(providerModel: string | undefined, effort: string | undefined, major: number | undefined): string;
|
|
23
|
-
/**
|
|
48
|
+
/** Isolation flag for `opencode run`. v2+ (#2879) shares a per-user background server by default;
|
|
49
|
+
* `--standalone` gives the run a private one. v1 has no such flag, and an unknown major omits it. */
|
|
50
|
+
export declare function buildOpenCodeIsolationArgs(major: number | undefined): string;
|
|
51
|
+
/** Runs a model via the OpenCode CLI: opencode run --auto --format json [--standalone] (v2+ only) [--model <p/m>[#<effort>]] [--variant <effort>] (v1 only) < prompt-file, executed with cwd = worktree. */
|
|
24
52
|
export declare class OpenCodeHarness implements CodingHarness {
|
|
25
53
|
private execFn;
|
|
26
54
|
readonly id = "opencode";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnH,OAAO,EAAE,KAAK,oBAAoB,EAAsB,MAAM,uBAAuB,CAAC;AAEtF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC;qDACiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb;iGAC6F;IAC7F,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;gGAE4F;IAC5F,SAAS,EAAE,MAAM,CAAC;IAClB,sGAAsG;IACtG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;qDACiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;sDACkD;IAClD,iBAAiB,EAAE,wBAAwB,EAAE,CAAC;IAC9C,gIAAgI;IAChI,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,yGAAyG;AACzG,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAOtF,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,GAAG,SAAS,CAIpG;AAID;;;;;;;mFAOmF;AACnF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAiHhF;AAED;mFACmF;AACnF,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,MAAM,CAOR;AAED;sGACsG;AACtG,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE5E;AAED,4MAA4M;AAC5M,qBAAa,eAAgB,YAAW,aAAa;IAQjD,OAAO,CAAC,MAAM;IAPhB,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,OAAO,QAAQ;IAExB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,YAAY,CAAC,CAA8B;IAEnD,YACU,MAAM,GAAE,cAA8B,EAC9C,YAAY,CAAC,EAAE,oBAAoB,EAGpC;IAED,2EAA2E;IAC3E,OAAO,CAAC,eAAe;IAKjB,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAgHzD;CACF"}
|
package/dist/harness/opencode.js
CHANGED
|
@@ -7,17 +7,42 @@ import { shellEscape } from '../utils/index.js';
|
|
|
7
7
|
import { classifyFailure } from './classify.js';
|
|
8
8
|
import { HarnessError } from './index.js';
|
|
9
9
|
import { probeOpenCodeMajor } from './opencode-version.js';
|
|
10
|
+
const PERMISSION_REJECTED = /cannot ask the user for permission/i;
|
|
11
|
+
/** OpenCode typed `error.type` → failure reason (#2889). Unlisted types fall back to classifyFailure. */
|
|
12
|
+
export const OPENCODE_ERROR_TYPE_REASONS = {
|
|
13
|
+
'provider.rate-limit': 'rate_limit',
|
|
14
|
+
'provider.quota': 'usage_cap',
|
|
15
|
+
'provider.auth': 'local_auth',
|
|
16
|
+
'provider.timeout': 'timeout',
|
|
17
|
+
'provider.connect': 'unavailable',
|
|
18
|
+
'provider.no-route': 'unavailable',
|
|
19
|
+
};
|
|
20
|
+
export function classifyOpenCodeErrorType(type) {
|
|
21
|
+
return type !== undefined && Object.hasOwn(OPENCODE_ERROR_TYPE_REASONS, type)
|
|
22
|
+
? OPENCODE_ERROR_TYPE_REASONS[type]
|
|
23
|
+
: undefined;
|
|
24
|
+
}
|
|
10
25
|
const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : 0);
|
|
11
26
|
/** Parses `opencode run --format json` NDJSON. Returns undefined when stdout has no
|
|
12
27
|
* OpenCode event lines (an object with a string `type`), so callers fall back to raw
|
|
13
28
|
* stdout. Tolerant by design: malformed lines, unknown event types and bad counts are
|
|
14
|
-
* skipped. Usage capture must never fail a run (#2462).
|
|
29
|
+
* skipped. Usage capture must never fail a run (#2462). Usage `durationMs` is the span between
|
|
30
|
+
* the smallest and largest finite event `timestamp` (omitted when none). Only the last step's text is returned:
|
|
31
|
+
* narration from earlier steps is dropped (#2881). A `tool_use` whose state error/output says the
|
|
32
|
+
* run cannot ask for permission is reported in `permissionDenials` (#2888). The first `error` event
|
|
33
|
+
* with a string `error.type` is reported as `errorType`/`errorStatus` (#2889). */
|
|
15
34
|
export function parseOpenCodeJson(stdout) {
|
|
16
|
-
|
|
35
|
+
let stepTexts = [];
|
|
17
36
|
const errors = [];
|
|
37
|
+
let errorType;
|
|
38
|
+
let errorStatus;
|
|
39
|
+
const permissionDenials = [];
|
|
18
40
|
let sawEvent = false;
|
|
19
41
|
let sawUsage = false;
|
|
42
|
+
let openStep = false;
|
|
20
43
|
let numTurns = 0;
|
|
44
|
+
let minTs;
|
|
45
|
+
let maxTs;
|
|
21
46
|
let input = 0;
|
|
22
47
|
let output = 0;
|
|
23
48
|
let reasoning = 0;
|
|
@@ -38,12 +63,24 @@ export function parseOpenCodeJson(stdout) {
|
|
|
38
63
|
if (!event || typeof event !== 'object' || Array.isArray(event) || typeof event.type !== 'string')
|
|
39
64
|
continue;
|
|
40
65
|
sawEvent = true;
|
|
41
|
-
|
|
66
|
+
const ts = event.timestamp;
|
|
67
|
+
if (typeof ts === 'number' && Number.isFinite(ts)) {
|
|
68
|
+
if (minTs === undefined || ts < minTs)
|
|
69
|
+
minTs = ts;
|
|
70
|
+
if (maxTs === undefined || ts > maxTs)
|
|
71
|
+
maxTs = ts;
|
|
72
|
+
}
|
|
73
|
+
if (event.type === 'step_start') {
|
|
74
|
+
stepTexts = [];
|
|
75
|
+
openStep = true;
|
|
76
|
+
}
|
|
77
|
+
else if (event.type === 'text') {
|
|
42
78
|
const text = event.part?.text;
|
|
43
79
|
if (typeof text === 'string' && text.trim().length > 0)
|
|
44
|
-
|
|
80
|
+
stepTexts.push(text.trim());
|
|
45
81
|
}
|
|
46
82
|
else if (event.type === 'step_finish') {
|
|
83
|
+
openStep = false;
|
|
47
84
|
const tokens = event.part?.tokens;
|
|
48
85
|
if (!tokens || !Number.isFinite(tokens.input) || !Number.isFinite(tokens.output))
|
|
49
86
|
continue;
|
|
@@ -59,6 +96,13 @@ export function parseOpenCodeJson(stdout) {
|
|
|
59
96
|
else if (event.type === 'error') {
|
|
60
97
|
const data = event.error?.data;
|
|
61
98
|
const name = event.error?.name;
|
|
99
|
+
const type = event.error?.type;
|
|
100
|
+
const typed = typeof type === 'string' && type.length > 0;
|
|
101
|
+
const status = [event.error?.status, event.error?.statusCode, data?.statusCode].find((v) => typeof v === 'number' && Number.isFinite(v));
|
|
102
|
+
if (typed && errorType === undefined) {
|
|
103
|
+
errorType = type;
|
|
104
|
+
errorStatus = status;
|
|
105
|
+
}
|
|
62
106
|
const parts = [];
|
|
63
107
|
if (typeof data?.message === 'string')
|
|
64
108
|
parts.push(data.message);
|
|
@@ -66,18 +110,36 @@ export function parseOpenCodeJson(stdout) {
|
|
|
66
110
|
parts.push(name);
|
|
67
111
|
if (typeof data?.responseBody === 'string' && data.responseBody)
|
|
68
112
|
parts.push(data.responseBody);
|
|
113
|
+
if (parts.length === 0 && typed)
|
|
114
|
+
parts.push(type);
|
|
69
115
|
if (typeof data?.statusCode === 'number' && Number.isFinite(data.statusCode)) {
|
|
70
116
|
parts.push(`status ${data.statusCode}`);
|
|
71
117
|
}
|
|
118
|
+
else if (parts.length > 0 && status !== undefined) {
|
|
119
|
+
parts.push(`status ${status}`);
|
|
120
|
+
}
|
|
72
121
|
if (parts.length > 0)
|
|
73
122
|
errors.push(parts.join(' '));
|
|
74
123
|
}
|
|
124
|
+
else if (event.type === 'tool_use') {
|
|
125
|
+
const state = event.part?.state;
|
|
126
|
+
const match = [state?.error, state?.output].find((c) => typeof c === 'string' && PERMISSION_REJECTED.test(c));
|
|
127
|
+
if (match !== undefined) {
|
|
128
|
+
const tool = event.part?.tool;
|
|
129
|
+
const line = match.split('\n').find((l) => l.trim()) ?? match;
|
|
130
|
+
permissionDenials.push({ tool: typeof tool === 'string' && tool ? tool : 'unknown', message: line.trim() });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
75
133
|
}
|
|
76
134
|
if (!sawEvent)
|
|
77
135
|
return undefined;
|
|
78
136
|
return {
|
|
79
|
-
text:
|
|
137
|
+
text: stepTexts.join('\n\n'),
|
|
80
138
|
errorText: errors.join('\n'),
|
|
139
|
+
permissionDenials,
|
|
140
|
+
...(errorType !== undefined ? { errorType } : {}),
|
|
141
|
+
...(errorStatus !== undefined ? { errorStatus } : {}),
|
|
142
|
+
finished: !openStep,
|
|
81
143
|
...(sawUsage
|
|
82
144
|
? {
|
|
83
145
|
usage: {
|
|
@@ -87,6 +149,7 @@ export function parseOpenCodeJson(stdout) {
|
|
|
87
149
|
cacheReadTokens: cacheRead,
|
|
88
150
|
cacheCreationTokens: cacheWrite,
|
|
89
151
|
numTurns,
|
|
152
|
+
...(minTs !== undefined && maxTs !== undefined ? { durationMs: maxTs - minTs } : {}),
|
|
90
153
|
...(cost > 0 ? { costUsd: cost } : {}),
|
|
91
154
|
},
|
|
92
155
|
}
|
|
@@ -104,7 +167,12 @@ export function buildOpenCodeModelArgs(providerModel, effort, major) {
|
|
|
104
167
|
const modelArg = providerModel ? `--model ${shellEscape(providerModel)}` : '';
|
|
105
168
|
return `${modelArg}${effort === undefined ? '' : ` --variant ${shellEscape(effort)}`}`;
|
|
106
169
|
}
|
|
107
|
-
/**
|
|
170
|
+
/** Isolation flag for `opencode run`. v2+ (#2879) shares a per-user background server by default;
|
|
171
|
+
* `--standalone` gives the run a private one. v1 has no such flag, and an unknown major omits it. */
|
|
172
|
+
export function buildOpenCodeIsolationArgs(major) {
|
|
173
|
+
return major !== undefined && major >= 2 ? '--standalone' : '';
|
|
174
|
+
}
|
|
175
|
+
/** Runs a model via the OpenCode CLI: opencode run --auto --format json [--standalone] (v2+ only) [--model <p/m>[#<effort>]] [--variant <effort>] (v1 only) < prompt-file, executed with cwd = worktree. */
|
|
108
176
|
export class OpenCodeHarness {
|
|
109
177
|
execFn;
|
|
110
178
|
id = 'opencode';
|
|
@@ -125,12 +193,14 @@ export class OpenCodeHarness {
|
|
|
125
193
|
const effort = registry.getEffort(model, request.task);
|
|
126
194
|
const providerModel = registry.get(model)?.providerModel;
|
|
127
195
|
const effortValue = effort === undefined ? undefined : String(effort);
|
|
128
|
-
const major =
|
|
196
|
+
const major = await this.getMajorVersion();
|
|
129
197
|
const modelArgs = buildOpenCodeModelArgs(providerModel, effortValue, major);
|
|
198
|
+
const isolationArgs = buildOpenCodeIsolationArgs(major);
|
|
130
199
|
// Agentic sessions can legitimately end on a tool call with an empty final
|
|
131
200
|
// message (observed with deepseek-v4-flash on large plan prompts). One
|
|
132
201
|
// retry with an explicit final-message instruction recovers those runs
|
|
133
202
|
// without masking a genuinely broken provider (still throws after 2 tries).
|
|
203
|
+
// It also covers exit-0 runs truncated before the last `step_finish`.
|
|
134
204
|
const FINAL_MESSAGE_NUDGE = '\n\nIMPORTANT: your final message must contain your complete answer as plain text. Do not end the session on a tool call or with an empty message.';
|
|
135
205
|
const MAX_ATTEMPTS = 2;
|
|
136
206
|
const promptDir = await mkdtemp(join(tmpdir(), 'factory-opencode-prompt-'));
|
|
@@ -138,6 +208,7 @@ export class OpenCodeHarness {
|
|
|
138
208
|
try {
|
|
139
209
|
let stdout = '';
|
|
140
210
|
let stderr = '';
|
|
211
|
+
let truncated = false;
|
|
141
212
|
for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
|
|
142
213
|
const attemptPrompt = attempt === 1 ? prompt : prompt + FINAL_MESSAGE_NUDGE;
|
|
143
214
|
// `--auto`: headless runs auto-REJECT permission prompts (e.g. reading the
|
|
@@ -152,8 +223,10 @@ export class OpenCodeHarness {
|
|
|
152
223
|
// every call until the phase timeout.
|
|
153
224
|
// `--format json` emits NDJSON events so the harness can drop tool chatter
|
|
154
225
|
// and read token usage from `step_finish` events.
|
|
226
|
+
// `--standalone` (v2+ only): v2's run attaches to a shared per-user background
|
|
227
|
+
// server by default; this gives the lane a private one. v1 has no such flag.
|
|
155
228
|
await writeFile(promptPath, attemptPrompt, 'utf8');
|
|
156
|
-
const cmd = `opencode run --auto --format json ${modelArgs} < ${shellEscape(promptPath)}`;
|
|
229
|
+
const cmd = `opencode run --auto --format json ${[isolationArgs, modelArgs].filter(Boolean).join(' ')} < ${shellEscape(promptPath)}`;
|
|
157
230
|
try {
|
|
158
231
|
({ stdout, stderr } = await this.execFn(cmd, {
|
|
159
232
|
cwd: worktree,
|
|
@@ -165,32 +238,47 @@ export class OpenCodeHarness {
|
|
|
165
238
|
}));
|
|
166
239
|
}
|
|
167
240
|
catch (err) {
|
|
168
|
-
// Under --format json, session errors arrive as stdout `error` events.
|
|
169
|
-
const
|
|
241
|
+
// Under --format json, session errors arrive as stdout `error` events; kept as the diagnostic.
|
|
242
|
+
const parsedErr = typeof err.stdout === 'string' ? parseOpenCodeJson(err.stdout) : undefined;
|
|
243
|
+
const jsonErr = parsedErr?.errorText ?? '';
|
|
170
244
|
const classifyText = [err.stderr ?? '', jsonErr].filter(Boolean).join('\n');
|
|
171
|
-
const reason = err.killed
|
|
245
|
+
const reason = err.killed
|
|
246
|
+
? 'timeout'
|
|
247
|
+
: ((err.code === 124 ? undefined : classifyOpenCodeErrorType(parsedErr?.errorType)) ??
|
|
248
|
+
classifyFailure(classifyText, err.code ?? 1));
|
|
172
249
|
throw new HarnessError(err.message ?? String(err), reason, {
|
|
173
250
|
exitCode: typeof err.code === 'number' ? err.code : undefined,
|
|
174
251
|
stderr: err.stderr,
|
|
175
252
|
code: typeof err.code === 'string' || typeof err.code === 'number' ? err.code : undefined,
|
|
176
253
|
signal: typeof err.signal === 'string' ? err.signal : undefined,
|
|
177
254
|
killed: err.killed === true ? true : undefined,
|
|
255
|
+
...(jsonErr ? { diagnostic: jsonErr } : {}),
|
|
178
256
|
});
|
|
179
257
|
}
|
|
180
258
|
const parsed = parseOpenCodeJson(stdout);
|
|
259
|
+
// A non-interactive run auto-rejects `ask` permissions, still exits 0, and the model carries
|
|
260
|
+
// on. The failure is deterministic: no nudge retry, no failover (#2888).
|
|
261
|
+
if (parsed && parsed.permissionDenials.length > 0) {
|
|
262
|
+
const tools = [...new Set(parsed.permissionDenials.map((d) => d.tool))].join(', ');
|
|
263
|
+
const diagnostic = parsed.permissionDenials.map((d) => `${d.tool}: ${d.message}`).join('\n');
|
|
264
|
+
throw new HarnessError(`opencode run auto-rejected a permission request for tool ${tools}: ${parsed.permissionDenials[0].message}`, 'permission_denied', { exitCode: 0, stderr: stderr || undefined, diagnostic });
|
|
265
|
+
}
|
|
181
266
|
const output = parsed ? parsed.text : stdout;
|
|
182
|
-
|
|
267
|
+
// An exit-0 run whose last step never got a step_finish is truncated
|
|
268
|
+
// (anomalyco/opencode#50514): fall through to the nudge retry.
|
|
269
|
+
truncated = parsed !== undefined && !parsed.finished;
|
|
270
|
+
if (output.trim().length > 0 && !truncated)
|
|
183
271
|
return { output, ...(parsed?.usage ? { usage: parsed.usage } : {}) };
|
|
184
272
|
if (parsed && parsed.errorText) {
|
|
185
273
|
// OpenCode can exit 0 with the session error only on stdout. Do not
|
|
186
274
|
// nudge-retry into a usage cap or rate limit; let the router fail over.
|
|
187
275
|
const classifyText = [stderr, parsed.errorText].filter(Boolean).join('\n');
|
|
188
|
-
throw new HarnessError(`opencode run reported an error event: ${parsed.errorText.split('\n')[0]}`, classifyFailure(classifyText, 1), { exitCode: 0, stderr: stderr || undefined });
|
|
276
|
+
throw new HarnessError(`opencode run reported an error event: ${parsed.errorText.split('\n')[0]}`, classifyOpenCodeErrorType(parsed.errorType) ?? classifyFailure(classifyText, 1), { exitCode: 0, stderr: stderr || undefined, diagnostic: parsed.errorText });
|
|
189
277
|
}
|
|
190
278
|
}
|
|
191
|
-
throw new HarnessError(
|
|
192
|
-
|
|
193
|
-
|
|
279
|
+
throw new HarnessError(truncated
|
|
280
|
+
? `opencode run exited 0 without a final step_finish (${MAX_ATTEMPTS} attempts)`
|
|
281
|
+
: `opencode CLI returned empty output (${MAX_ATTEMPTS} attempts)`, 'empty_response', { exitCode: 0 });
|
|
194
282
|
}
|
|
195
283
|
finally {
|
|
196
284
|
await rm(promptDir, { recursive: true, force: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAA6B,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAkCtF,MAAM,mBAAmB,GAAG,qCAAqC,CAAC;AAElE,yGAAyG;AACzG,MAAM,CAAC,MAAM,2BAA2B,GAAmD;IACzF,qBAAqB,EAAE,YAAY;IACnC,gBAAgB,EAAE,WAAW;IAC7B,eAAe,EAAE,YAAY;IAC7B,kBAAkB,EAAE,SAAS;IAC7B,kBAAkB,EAAE,aAAa;IACjC,mBAAmB,EAAE,aAAa;CACnC,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,IAAwB;IAChE,OAAO,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,2BAA2B,EAAE,IAAI,CAAC;QAC3E,CAAC,CAAC,2BAA2B,CAAC,IAAI,CAAC;QACnC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,GAAG,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1F;;;;;;;mFAOmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,SAAS,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAA6B,CAAC;IAClC,IAAI,WAA+B,CAAC;IACpC,MAAM,iBAAiB,GAA+B,EAAE,CAAC;IACzD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,KAAyB,CAAC;IAC9B,IAAI,KAAyB,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,KAAU,CAAC;QACf,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QAC5G,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QAC3B,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,KAAK,SAAS,IAAI,EAAE,GAAG,KAAK;gBAAE,KAAK,GAAG,EAAE,CAAC;YAClD,IAAI,KAAK,KAAK,SAAS,IAAI,EAAE,GAAG,KAAK;gBAAE,KAAK,GAAG,EAAE,CAAC;QACpD,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,SAAS,GAAG,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;YAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACtF,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACxC,QAAQ,GAAG,KAAK,CAAC;YACjB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;YAClC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC3F,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,EAAE,CAAC;YACX,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;YACtB,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;YACxB,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACnC,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACrC,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACvC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;YAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;YAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;YAC/B,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,IAAI,CAClF,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAChE,CAAC;YACF,IAAI,KAAK,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBACrC,SAAS,GAAG,IAAI,CAAC;gBACjB,WAAW,GAAG,MAAM,CAAC;YACvB,CAAC;YACD,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;iBAC3D,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,OAAO,IAAI,EAAE,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,OAAO,IAAI,EAAE,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7E,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1C,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACpD,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;YAChC,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CACzE,CAAC;YACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;gBAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;gBAC9D,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,iBAAiB;QACjB,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,QAAQ,EAAE,CAAC,QAAQ;QACnB,GAAG,CAAC,QAAQ;YACV,CAAC,CAAC;gBACE,KAAK,EAAE;oBACL,WAAW,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU;oBAC3C,YAAY,EAAE,MAAM,GAAG,SAAS;oBAChC,cAAc,EAAE,KAAK;oBACrB,eAAe,EAAE,SAAS;oBAC1B,mBAAmB,EAAE,UAAU;oBAC/B,QAAQ;oBACR,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpF,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvC;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED;mFACmF;AACnF,MAAM,UAAU,sBAAsB,CACpC,aAAiC,EACjC,MAA0B,EAC1B,KAAyB;IAEzB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa;YAAE,OAAO,EAAE,CAAC;QAC9B,OAAO,WAAW,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC;IACvG,CAAC;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,OAAO,GAAG,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AACzF,CAAC;AAED;sGACsG;AACtG,MAAM,UAAU,0BAA0B,CAAC,KAAyB;IAClE,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,4MAA4M;AAC5M,MAAM,OAAO,eAAe;IAQhB,MAAM;IAPP,EAAE,GAAG,UAAU,CAAC;IAChB,OAAO,GAAG,IAAI,CAAC;IAEP,YAAY,CAAuB;IAC5C,YAAY,CAA+B;IAEnD,YACU,MAAM,GAAmB,aAAa,EAC9C,YAAmC;sBAD3B,MAAM;QAGd,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,2EAA2E;IACnE,eAAe;QACrB,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAuB;QAC/B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACnF,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,sBAAsB,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAC5E,MAAM,aAAa,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;QAExD,2EAA2E;QAC3E,uEAAuE;QACvE,uEAAuE;QACvE,4EAA4E;QAC5E,sEAAsE;QACtE,MAAM,mBAAmB,GACvB,oJAAoJ,CAAC;QACvJ,MAAM,YAAY,GAAG,CAAC,CAAC;QAEvB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC;QAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAEjD,IAAI,CAAC;YACH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;gBACzD,MAAM,aAAa,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,mBAAmB,CAAC;gBAC5E,2EAA2E;gBAC3E,0EAA0E;gBAC1E,yEAAyE;gBACzE,qEAAqE;gBACrE,qEAAqE;gBACrE,0EAA0E;gBAC1E,yEAAyE;gBACzE,wEAAwE;gBACxE,0EAA0E;gBAC1E,sCAAsC;gBACtC,2EAA2E;gBAC3E,kDAAkD;gBAClD,+EAA+E;gBAC/E,6EAA6E;gBAC7E,MAAM,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;gBACnD,MAAM,GAAG,GAAG,qCAAqC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;gBAErI,IAAI,CAAC;oBACH,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;wBAC3C,GAAG,EAAE,QAAQ;wBACb,SAAS,EAAE,cAAc,GAAG,IAAI;wBAChC,iDAAiD;wBACjD,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;wBAC3B,GAAG;wBACH,MAAM;qBACP,CAAC,CAAC,CAAC;gBACN,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,+FAA+F;oBAC/F,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC7F,MAAM,OAAO,GAAG,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC;oBAC3C,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5E,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM;wBACvB,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;4BACjF,eAAe,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClD,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE;wBACzD,QAAQ,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;wBAC7D,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;wBACzF,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;wBAC/D,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;wBAC9C,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC5C,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBACzC,6FAA6F;gBAC7F,yEAAyE;gBACzE,IAAI,MAAM,IAAI,MAAM,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnF,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC7F,MAAM,IAAI,YAAY,CACpB,4DAA4D,KAAK,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAC3G,mBAAmB,EACnB,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,UAAU,EAAE,CACzD,CAAC;gBACJ,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC7C,qEAAqE;gBACrE,+DAA+D;gBAC/D,SAAS,GAAG,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACrD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS;oBACxC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvE,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBAC/B,oEAAoE;oBACpE,wEAAwE;oBACxE,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3E,MAAM,IAAI,YAAY,CACpB,yCAAyC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAC1E,yBAAyB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,YAAY,EAAE,CAAC,CAAC,EAC/E,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,CAC3E,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,IAAI,YAAY,CACpB,SAAS;gBACP,CAAC,CAAC,sDAAsD,YAAY,YAAY;gBAChF,CAAC,CAAC,uCAAuC,YAAY,YAAY,EACnE,gBAAgB,EAChB,EAAE,QAAQ,EAAE,CAAC,EAAE,CAChB,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ExecFn } from '../utils/exec.js';
|
|
2
|
+
import type { CodingHarness, HarnessRequest, HarnessResult, HarnessUsage } from './index.js';
|
|
3
|
+
export type PiExecFn = ExecFn;
|
|
4
|
+
export interface ParsedPiJson {
|
|
5
|
+
/** Text of the last assistant `message_end`; '' when none. */
|
|
6
|
+
text: string;
|
|
7
|
+
/** Summed assistant `message_end` usage; undefined when no message reported numeric tokens. */
|
|
8
|
+
usage?: HarnessUsage;
|
|
9
|
+
/** `stopReason` of the last assistant `message_end`. */
|
|
10
|
+
lastStopReason?: string;
|
|
11
|
+
/** `aborted` of the last `agent_settled` event; undefined when absent or non-boolean. */
|
|
12
|
+
aborted?: boolean;
|
|
13
|
+
/** One line per assistant `errorMessage`, `auto_retry_end.finalError` and `compaction_end.errorMessage`, in stream order; '' when none. */
|
|
14
|
+
errorText: string;
|
|
15
|
+
}
|
|
16
|
+
/** Parses `pi -p --mode json` JSONL. Returns undefined when stdout has no Pi event lines
|
|
17
|
+
* (an object with a string `type`). Pi frames records on LF only, so this splits on '\n' and
|
|
18
|
+
* strips one trailing CR; U+2028/U+2029 inside text must survive. Tolerant of malformed lines
|
|
19
|
+
* and unknown events. */
|
|
20
|
+
export declare function parsePiJson(stdout: string): ParsedPiJson | undefined;
|
|
21
|
+
/** Builds the headless `pi` invocation. providerModel is `<provider>/<model>`, split on the first '/'. */
|
|
22
|
+
export declare function buildPiCommand(providerModel: string | undefined, promptPath: string, effort?: string): string;
|
|
23
|
+
/** Runs a model via the Pi CLI: pi -p --mode json ... --provider <p> --model <m> [--thinking <level>] < prompt-file, executed with cwd = worktree.
|
|
24
|
+
* Pi can exit 0 after a failed response, so success is decided from the JSONL stream. */
|
|
25
|
+
export declare class PiHarness implements CodingHarness {
|
|
26
|
+
private execFn;
|
|
27
|
+
readonly id = "pi";
|
|
28
|
+
readonly agentic = true;
|
|
29
|
+
constructor(execFn?: PiExecFn);
|
|
30
|
+
run(request: HarnessRequest): Promise<HarnessResult>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=pi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../src/harness/pi.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,KAAK,EAAE,aAAa,EAAwB,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGnH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yFAAyF;IACzF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2IAA2I;IAC3I,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;;0BAG0B;AAC1B,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAyEpE;AAED,0GAA0G;AAC1G,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAiB7G;AAED;0FAC0F;AAC1F,qBAAa,SAAU,YAAW,aAAa;IAIjC,OAAO,CAAC,MAAM;IAH1B,QAAQ,CAAC,EAAE,QAAQ;IACnB,QAAQ,CAAC,OAAO,QAAQ;IAExB,YAAoB,MAAM,GAAE,QAAwB,EAAI;IAElD,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA8EzD;CACF"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// src/harness/pi.ts — CodingHarness adapter for the Pi coding agent CLI.
|
|
2
|
+
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { wrapCommandInSandbox } from '../sandbox/index.js';
|
|
6
|
+
import { defaultExecFn } from '../utils/exec.js';
|
|
7
|
+
import { shellEscape } from '../utils/index.js';
|
|
8
|
+
import { classifyFailure } from './classify.js';
|
|
9
|
+
import { HarnessError } from './index.js';
|
|
10
|
+
/** Reasons an exit-0 Pi failure may be classified as; everything else stays a generic 'error'. */
|
|
11
|
+
const PI_PROVIDER_REASONS = new Set(['rate_limit', 'usage_cap', 'local_auth']);
|
|
12
|
+
const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : 0);
|
|
13
|
+
/** Parses `pi -p --mode json` JSONL. Returns undefined when stdout has no Pi event lines
|
|
14
|
+
* (an object with a string `type`). Pi frames records on LF only, so this splits on '\n' and
|
|
15
|
+
* strips one trailing CR; U+2028/U+2029 inside text must survive. Tolerant of malformed lines
|
|
16
|
+
* and unknown events. */
|
|
17
|
+
export function parsePiJson(stdout) {
|
|
18
|
+
let lastText = '';
|
|
19
|
+
let lastStopReason;
|
|
20
|
+
let aborted;
|
|
21
|
+
const errors = [];
|
|
22
|
+
let sawEvent = false;
|
|
23
|
+
let sawUsage = false;
|
|
24
|
+
let numTurns = 0;
|
|
25
|
+
let input = 0;
|
|
26
|
+
let output = 0;
|
|
27
|
+
let cacheRead = 0;
|
|
28
|
+
let cacheWrite = 0;
|
|
29
|
+
let cost = 0;
|
|
30
|
+
for (const raw of stdout.split('\n')) {
|
|
31
|
+
const line = raw.endsWith('\r') ? raw.slice(0, -1) : raw;
|
|
32
|
+
if (!line.trim())
|
|
33
|
+
continue;
|
|
34
|
+
let event;
|
|
35
|
+
try {
|
|
36
|
+
event = JSON.parse(line);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (!event || typeof event !== 'object' || Array.isArray(event) || typeof event.type !== 'string')
|
|
42
|
+
continue;
|
|
43
|
+
sawEvent = true;
|
|
44
|
+
if (event.type === 'message_end' && event.message?.role === 'assistant') {
|
|
45
|
+
const message = event.message;
|
|
46
|
+
const content = Array.isArray(message.content) ? message.content : [];
|
|
47
|
+
lastText = content
|
|
48
|
+
.map((part) => (part?.type === 'text' && typeof part.text === 'string' ? part.text : ''))
|
|
49
|
+
.join('');
|
|
50
|
+
lastStopReason = typeof message.stopReason === 'string' ? message.stopReason : undefined;
|
|
51
|
+
if (typeof message.errorMessage === 'string' && message.errorMessage.trim())
|
|
52
|
+
errors.push(message.errorMessage);
|
|
53
|
+
const usage = message.usage;
|
|
54
|
+
if (usage && Number.isFinite(usage.input) && Number.isFinite(usage.output)) {
|
|
55
|
+
sawUsage = true;
|
|
56
|
+
numTurns++;
|
|
57
|
+
input += usage.input;
|
|
58
|
+
output += usage.output;
|
|
59
|
+
cacheRead += num(usage.cacheRead);
|
|
60
|
+
cacheWrite += num(usage.cacheWrite);
|
|
61
|
+
cost += num(usage.cost?.total);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else if (event.type === 'agent_settled') {
|
|
65
|
+
aborted = typeof event.aborted === 'boolean' ? event.aborted : undefined;
|
|
66
|
+
}
|
|
67
|
+
else if (event.type === 'auto_retry_end' && typeof event.finalError === 'string' && event.finalError.trim()) {
|
|
68
|
+
errors.push(event.finalError);
|
|
69
|
+
}
|
|
70
|
+
else if (event.type === 'compaction_end' && typeof event.errorMessage === 'string' && event.errorMessage.trim()) {
|
|
71
|
+
errors.push(event.errorMessage);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!sawEvent)
|
|
75
|
+
return undefined;
|
|
76
|
+
return {
|
|
77
|
+
text: lastText,
|
|
78
|
+
lastStopReason,
|
|
79
|
+
aborted,
|
|
80
|
+
errorText: errors.join('\n'),
|
|
81
|
+
...(sawUsage
|
|
82
|
+
? {
|
|
83
|
+
usage: {
|
|
84
|
+
inputTokens: input + cacheRead + cacheWrite,
|
|
85
|
+
outputTokens: output,
|
|
86
|
+
rawInputTokens: input,
|
|
87
|
+
cacheReadTokens: cacheRead,
|
|
88
|
+
cacheCreationTokens: cacheWrite,
|
|
89
|
+
numTurns,
|
|
90
|
+
...(cost > 0 ? { costUsd: cost } : {}),
|
|
91
|
+
},
|
|
92
|
+
}
|
|
93
|
+
: {}),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** Builds the headless `pi` invocation. providerModel is `<provider>/<model>`, split on the first '/'. */
|
|
97
|
+
export function buildPiCommand(providerModel, promptPath, effort) {
|
|
98
|
+
const slash = providerModel?.indexOf('/') ?? -1;
|
|
99
|
+
if (!providerModel || slash <= 0 || slash === providerModel.length - 1) {
|
|
100
|
+
throw new HarnessError(`pi harness needs providerModel '<provider>/<model>' (got '${providerModel ?? ''}')`, 'error');
|
|
101
|
+
}
|
|
102
|
+
const provider = providerModel.slice(0, slash);
|
|
103
|
+
const id = providerModel.slice(slash + 1);
|
|
104
|
+
// -p --mode json: headless, JSONL events on stdout. --no-session: stateless run.
|
|
105
|
+
// --no-context-files: skip AGENTS.md/CLAUDE.md (the prompt already embeds the constitution).
|
|
106
|
+
// --no-extensions/--no-skills/--no-prompt-templates/--no-mcp: no repo-controlled code or tools.
|
|
107
|
+
// --no-approve: do not trust repo .pi/ project config. --offline: skip update/telemetry checks.
|
|
108
|
+
// --thinking: factory effort; Pi calls "no thinking" off, not none.
|
|
109
|
+
const thinkingArg = effort === undefined ? '' : ` --thinking ${shellEscape(effort === 'none' ? 'off' : effort)}`;
|
|
110
|
+
return `pi -p --mode json --no-session --no-context-files --no-extensions --no-skills --no-prompt-templates --no-mcp --no-approve --offline --provider ${shellEscape(provider)} --model ${shellEscape(id)}${thinkingArg} < ${shellEscape(promptPath)}`;
|
|
111
|
+
}
|
|
112
|
+
/** Runs a model via the Pi CLI: pi -p --mode json ... --provider <p> --model <m> [--thinking <level>] < prompt-file, executed with cwd = worktree.
|
|
113
|
+
* Pi can exit 0 after a failed response, so success is decided from the JSONL stream. */
|
|
114
|
+
export class PiHarness {
|
|
115
|
+
execFn;
|
|
116
|
+
id = 'pi';
|
|
117
|
+
agentic = true;
|
|
118
|
+
constructor(execFn = defaultExecFn) {
|
|
119
|
+
this.execFn = execFn;
|
|
120
|
+
}
|
|
121
|
+
async run(request) {
|
|
122
|
+
const { model, prompt, worktree, timeoutSeconds, registry, sandbox, env, onPgid } = request;
|
|
123
|
+
const providerModel = registry.get(model)?.providerModel;
|
|
124
|
+
const effort = registry.getEffort(model, request.task);
|
|
125
|
+
const promptDir = await mkdtemp(join(tmpdir(), 'factory-pi-prompt-'));
|
|
126
|
+
const promptPath = join(promptDir, 'prompt.txt');
|
|
127
|
+
try {
|
|
128
|
+
const cmd = buildPiCommand(providerModel, promptPath, effort === undefined ? undefined : String(effort));
|
|
129
|
+
await writeFile(promptPath, prompt, 'utf8');
|
|
130
|
+
const finalCmd = sandbox ? wrapCommandInSandbox(cmd, sandbox) : cmd;
|
|
131
|
+
// ADR-0163: the native deepseek provider is refused; DeepSeek models go through an
|
|
132
|
+
// approved intermediary, so Pi must not be able to authenticate with the native key.
|
|
133
|
+
// ExecFn merges `env` over the parent env, so deleting the key would leave the parent's
|
|
134
|
+
// copy in place; an explicit undefined override removes it from the child.
|
|
135
|
+
const childEnv = { ...env, DEEPSEEK_API_KEY: undefined };
|
|
136
|
+
let stdout;
|
|
137
|
+
let stderr;
|
|
138
|
+
try {
|
|
139
|
+
({ stdout, stderr } = await this.execFn(finalCmd, {
|
|
140
|
+
cwd: worktree,
|
|
141
|
+
timeoutMs: timeoutSeconds * 1000,
|
|
142
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
143
|
+
env: childEnv,
|
|
144
|
+
onPgid,
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
const jsonErr = typeof err.stdout === 'string' ? (parsePiJson(err.stdout)?.errorText ?? '') : '';
|
|
149
|
+
const classifyText = [err.stderr ?? '', jsonErr].filter(Boolean).join('\n');
|
|
150
|
+
const reason = err.killed ? 'timeout' : classifyFailure(classifyText, err.code ?? 1);
|
|
151
|
+
throw new HarnessError(err.message ?? String(err), reason, {
|
|
152
|
+
exitCode: typeof err.code === 'number' ? err.code : undefined,
|
|
153
|
+
stderr: err.stderr,
|
|
154
|
+
code: typeof err.code === 'string' || typeof err.code === 'number' ? err.code : undefined,
|
|
155
|
+
signal: typeof err.signal === 'string' ? err.signal : undefined,
|
|
156
|
+
killed: err.killed === true ? true : undefined,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
const parsed = parsePiJson(stdout);
|
|
160
|
+
if (!parsed) {
|
|
161
|
+
throw new HarnessError('pi returned no JSON events', stdout.trim() ? 'error' : 'empty_response', {
|
|
162
|
+
exitCode: 0,
|
|
163
|
+
stderr,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
const detail = parsed.errorText ? `: ${parsed.errorText.split('\n')[0]}` : '';
|
|
167
|
+
if (parsed.aborted === true) {
|
|
168
|
+
throw new HarnessError(`pi run was aborted (agent_settled.aborted true)${detail}`, 'error', {
|
|
169
|
+
exitCode: 0,
|
|
170
|
+
stderr: stderr || undefined,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
if (parsed.lastStopReason === 'length') {
|
|
174
|
+
throw new HarnessError(`pi response hit the output length limit (stopReason length)${detail}`, 'error', {
|
|
175
|
+
exitCode: 0,
|
|
176
|
+
stderr: stderr || undefined,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
if (parsed.lastStopReason !== 'stop' || parsed.aborted !== false) {
|
|
180
|
+
const classified = classifyFailure([parsed.errorText, stderr].filter(Boolean).join('\n'), 0);
|
|
181
|
+
const reason = PI_PROVIDER_REASONS.has(classified) ? classified : 'error';
|
|
182
|
+
throw new HarnessError(`pi run did not finish cleanly (stopReason ${parsed.lastStopReason ?? 'missing'}, aborted ${String(parsed.aborted)})${detail}`, reason, { exitCode: 0, stderr: stderr || undefined, ...(parsed.errorText ? { diagnostic: parsed.errorText } : {}) });
|
|
183
|
+
}
|
|
184
|
+
if (parsed.text.trim() === '') {
|
|
185
|
+
throw new HarnessError('pi returned an empty final message', 'empty_response', { exitCode: 0 });
|
|
186
|
+
}
|
|
187
|
+
return { output: parsed.text, ...(parsed.usage ? { usage: parsed.usage } : {}) };
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
await rm(promptDir, { recursive: true, force: true });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=pi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi.js","sourceRoot":"","sources":["../../src/harness/pi.ts"],"names":[],"mappings":"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"}
|