@on-par/factory-core 0.9.8-next.3 → 0.9.8-next.31
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/check.d.ts +29 -0
- package/dist/harness/check.d.ts.map +1 -0
- package/dist/harness/check.js +104 -0
- package/dist/harness/check.js.map +1 -0
- 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 +6 -6
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +3 -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/types/index.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export interface ModelDefinition {
|
|
|
17
17
|
providerModel?: string;
|
|
18
18
|
/** Provider-native options, e.g. Ollama num_ctx/temperature */
|
|
19
19
|
providerOptions?: Record<string, unknown>;
|
|
20
|
+
/** Approved Anthropic-compatible intermediary base URL (https) the claude-cli harness targets for this model; needs envKey (#2906, ADR-0163) */
|
|
21
|
+
endpoint?: string;
|
|
20
22
|
/** Whether this model runs via Codex CLI */
|
|
21
23
|
codex?: boolean;
|
|
22
24
|
/** Extra Codex CLI flags */
|
|
@@ -26,6 +28,7 @@ export interface ModelDefinition {
|
|
|
26
28
|
harness?: string;
|
|
27
29
|
/** Speculative/unproven model — excluded from routing unless FACTORY_EXPERIMENTAL=1 */
|
|
28
30
|
experimental?: boolean;
|
|
31
|
+
trainsOnPrompts?: boolean;
|
|
29
32
|
}
|
|
30
33
|
export type TaskType = 'plan' | 'build_codex' | 'build_claude' | 'check_compile' | 'check_tests' | 'check_lint' | 'check_accessibility' | 'check_links' | 'check_custom' | 'check_design' | 'review_pr' | 'security_review' | 'classify_pr' | 'dispute_resolution' | 'triage' | (string & {});
|
|
31
34
|
export interface RouteDefinition {
|
|
@@ -84,7 +87,9 @@ export interface CheckSummary {
|
|
|
84
87
|
* (harness/index.ts aliases HarnessFailureReason to this type). */
|
|
85
88
|
export type FailoverReason = 'rate_limit' | 'usage_cap' | 'timeout' | 'error' | 'empty_response' | 'unavailable' | 'local_auth'
|
|
86
89
|
/** The agent CLI could not be started (exit 127, ENOENT, command not found). */
|
|
87
|
-
| 'cli_missing' | 'schema_invalid' | 'apply_failed' | 'verify_failed'
|
|
90
|
+
| 'cli_missing' | 'schema_invalid' | 'apply_failed' | 'verify_failed'
|
|
91
|
+
/** An agent CLI auto-rejected a tool permission in a non-interactive run (#2888). */
|
|
92
|
+
| 'permission_denied' | 'unknown';
|
|
88
93
|
/** Pipeline phase a failure terminated in. */
|
|
89
94
|
export type FailurePhase = 'plan' | 'build' | 'check' | 'ship';
|
|
90
95
|
/** Whether the fault is in the factory itself or in the product under work. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACnH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAItE,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AACtG,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AAErC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,4CAA4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;2EACuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,YAAY,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@ const UsageResponseSchema = z
|
|
|
28
28
|
resets_at: z.string().nullish(),
|
|
29
29
|
}),
|
|
30
30
|
})
|
|
31
|
-
.
|
|
31
|
+
.loose();
|
|
32
32
|
export async function readClaudeAccessToken(deps = {}) {
|
|
33
33
|
const env = deps.env ?? process.env;
|
|
34
34
|
const exec = deps.exec ?? defaultKeychainExec;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/usage/subscription.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,wEAAwE;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAqBvF,MAAM,mBAAmB,GAA+C,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAC9F,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAE7B;2DAC2D;AAC3D,KAAK,UAAU,eAAe,CAC5B,GAAsB,EACtB,IAAgD;IAEhD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,uBAAuB,EAAE,IAAI,EAAE,qBAAqB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE;QACvG,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,8FAA8F;AAC9F,SAAS,sBAAsB,CAAC,GAAsB;IACpD,OAAO,YAAY,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;KAChC,CAAC;CACH,CAAC;KACD,
|
|
1
|
+
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/usage/subscription.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,wEAAwE;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAqBvF,MAAM,mBAAmB,GAA+C,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAC9F,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAE7B;2DAC2D;AAC3D,KAAK,UAAU,eAAe,CAC5B,GAAsB,EACtB,IAAgD;IAEhD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,uBAAuB,EAAE,IAAI,EAAE,qBAAqB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE;QACvG,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,8FAA8F;AAC9F,SAAS,sBAAsB,CAAC,GAAsB;IACpD,OAAO,YAAY,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;KAChC,CAAC;CACH,CAAC;KACD,KAAK,EAAE,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAI,GAA0B,EAAE;IAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,mBAAmB,CAAC;IAC9C,MAAM,EACJ,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAC3B,YAAY,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,EAC/C,mBAAmB,GAAG,GAAG,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,EACvD,GAAG,GAAG,IAAI,CAAC,GAAG,GACf,GAAG,IAAI,CAAC;IAET,IAAI,GAAG,GAAkB,IAAI,CAAC;IAE9B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,YAAY,EAAE,CAAC;YACzC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,GAAG,GAAG,WAAW,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,mBAAmB,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC;QAEnD,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7E,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,GAAG,EAAE;YAAE,OAAO,IAAI,CAAC;QAEnG,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAI,GAA0B,EAAE;IAC3E,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAEhC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,2CAA2C,EAAE;YAC5E,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,gBAAgB,EAAE,kBAAkB;gBACpC,MAAM,EAAE,kBAAkB;aAC3B;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAEjC,OAAO;YACL,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW;YACtD,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI;SAC1D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/utils/exec.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export type ExecFn = (cmd: string, opts: {
|
|
|
2
2
|
cwd?: string;
|
|
3
3
|
timeoutMs?: number;
|
|
4
4
|
maxBuffer?: number;
|
|
5
|
-
env?: Record<string, string>;
|
|
5
|
+
env?: Record<string, string | undefined>;
|
|
6
6
|
/** When set, the child is spawned detached (its own process group) and
|
|
7
7
|
* its pid is reported here so a lane can track and later kill the
|
|
8
8
|
* whole group. */
|
package/dist/utils/exec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,MAAM,GAAG,CACnB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACJ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,MAAM,GAAG,CACnB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACJ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC;;uBAEmB;IACnB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;qCAGiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,KACE,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AA+GjD;;;;;;;;;;;eAWe;AACf,eAAO,MAAM,aAAa,EAAE,MAiC3B,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type LocalAuthAgent = 'claude' | 'codex';
|
|
1
|
+
export type LocalAuthAgent = 'claude' | 'codex' | 'opencode';
|
|
2
2
|
export interface LocalAuthRecordDeps {
|
|
3
3
|
env?: NodeJS.ProcessEnv;
|
|
4
4
|
homedir?: () => string;
|
|
@@ -17,7 +17,7 @@ export interface LocalAuthFailure {
|
|
|
17
17
|
export declare function localAuthRecordPath(deps?: LocalAuthRecordDeps): string;
|
|
18
18
|
/** Maps a harness id (or provider) to the agent whose login it uses; undefined for others. */
|
|
19
19
|
export declare function localAuthAgentFor(harnessOrProvider: string | undefined): LocalAuthAgent | undefined;
|
|
20
|
-
/** Credential file whose mtime marks the agent's latest login. */
|
|
20
|
+
/** Credential file whose mtime marks the agent's latest login (opencode's is written by `opencode auth login`). */
|
|
21
21
|
export declare function localAuthCredentialPath(agent: LocalAuthAgent, deps?: LocalAuthRecordDeps): string;
|
|
22
22
|
/** Records that `agent` just failed local_auth. Best effort; never throws. */
|
|
23
23
|
export declare function recordLocalAuthFailure(agent: LocalAuthAgent, deps?: LocalAuthRecordDeps): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-auth-record.d.ts","sourceRoot":"","sources":["../../src/utils/local-auth-record.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"local-auth-record.d.ts","sourceRoot":"","sources":["../../src/utils/local-auth-record.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,wCAAwC;IACxC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,CAAC;IACtB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,kDAAkD;AAClD,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,mBAAwB,GAAG,MAAM,CAE1E;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAKnG;AAED,mHAAmH;AACnH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,GAAE,mBAAwB,GAAG,MAAM,CAQrG;AAkBD,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,GAAE,mBAAwB,GAAG,IAAI,CAkBlG;AAED;;;8FAG8F;AAC9F,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,cAAc,EACrB,IAAI,GAAE,mBAAwB,GAC7B,gBAAgB,GAAG,IAAI,CAWzB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/utils/local-auth-record.ts — the last run-time local_auth failure per agent (#2733).
|
|
1
|
+
// src/utils/local-auth-record.ts — the last run-time local_auth failure per agent (#2733, #2890 adds opencode).
|
|
2
2
|
//
|
|
3
3
|
// A refresh token that is present but already used or revoked looks fine on disk, and doctor
|
|
4
4
|
// must not refresh it to find out (that would burn the token). So when a run hits local_auth,
|
|
@@ -23,14 +23,19 @@ export function localAuthAgentFor(harnessOrProvider) {
|
|
|
23
23
|
return 'claude';
|
|
24
24
|
if (harnessOrProvider === 'codex-cli')
|
|
25
25
|
return 'codex';
|
|
26
|
+
if (harnessOrProvider === 'opencode')
|
|
27
|
+
return 'opencode';
|
|
26
28
|
return undefined;
|
|
27
29
|
}
|
|
28
|
-
/** Credential file whose mtime marks the agent's latest login. */
|
|
30
|
+
/** Credential file whose mtime marks the agent's latest login (opencode's is written by `opencode auth login`). */
|
|
29
31
|
export function localAuthCredentialPath(agent, deps = {}) {
|
|
30
32
|
const env = deps.env ?? process.env;
|
|
31
33
|
const home = (deps.homedir ?? osHomedir)();
|
|
32
34
|
if (agent === 'claude')
|
|
33
35
|
return resolve(claudeConfigDirPath(env, home), '.credentials.json');
|
|
36
|
+
if (agent === 'opencode') {
|
|
37
|
+
return join(env.XDG_DATA_HOME?.trim() || join(home, '.local', 'share'), 'opencode', 'auth.json');
|
|
38
|
+
}
|
|
34
39
|
return join(env.CODEX_HOME?.trim() || join(home, '.codex'), 'auth.json');
|
|
35
40
|
}
|
|
36
41
|
function readAll(deps) {
|
|
@@ -40,7 +45,7 @@ function readAll(deps) {
|
|
|
40
45
|
if (typeof parsed !== 'object' || parsed === null)
|
|
41
46
|
return {};
|
|
42
47
|
const out = {};
|
|
43
|
-
for (const agent of ['claude', 'codex']) {
|
|
48
|
+
for (const agent of ['claude', 'codex', 'opencode']) {
|
|
44
49
|
const at = parsed[agent]?.at;
|
|
45
50
|
if (typeof at === 'string' && Number.isFinite(Date.parse(at)))
|
|
46
51
|
out[agent] = { agent, at };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-auth-record.js","sourceRoot":"","sources":["../../src/utils/local-auth-record.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"local-auth-record.js","sourceRoot":"","sources":["../../src/utils/local-auth-record.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EventKind } from '../events/kinds.js';
|
|
2
|
+
import type { IssueWarnDedup, SweepDeps } from './worktree-gc.js';
|
|
3
|
+
/** The owning issue's verdict on a lane worktree. `null` means "no verdict" (no client/repo,
|
|
4
|
+
* or the query failed) and must always fall back to the PR-state/local-evidence rules. */
|
|
5
|
+
export type IssueDisposition = 'reap-closed' | 'reap-parked' | 'reap-decomposed' | 'keep-claimed' | 'keep';
|
|
6
|
+
/** GitHub's verdict on the owning issue. A closed issue and a factory:parked label both mean
|
|
7
|
+
* the lane is finished-or-parked and its clean checkout is redundant (see ADR, this PR). */
|
|
8
|
+
export declare function resolveIssueDisposition(octokit: SweepDeps['octokit'], repo: string | undefined, issue: number, log: (type: EventKind, msg: string) => void, issueWarnDedup: IssueWarnDedup): Promise<IssueDisposition | null>;
|
|
9
|
+
/** The lane issue's existence on GitHub, checked only for worktree-gc's dry-run report.
|
|
10
|
+
* 'not-configured' (no client/repo) and 'error' (the call threw anything but a 404) both mean
|
|
11
|
+
* "no verdict" but are reported differently: 'error' surfaces as unverifiable so a rate-limit
|
|
12
|
+
* or network blip is never mistaken for a confirmed-gone issue. */
|
|
13
|
+
export declare function resolveIssueExistence(octokit: SweepDeps['octokit'], repo: string | undefined, issue: number, log: (type: EventKind, msg: string) => void): Promise<'exists' | 'not-found' | 'error' | 'not-configured'>;
|
|
14
|
+
/** Whether the lane issue carries an active, unexpired claim, checked only for worktree-gc's
|
|
15
|
+
* dry-run report. A `factory:claimed-by:*` label alone is not enough (#1501): if the issue also
|
|
16
|
+
* carries a `factory:claim-expires:*` lease label and that lease has lapsed, `findStaleClaims`
|
|
17
|
+
* (the same primitive the queue's own reconcile uses, ADR-0104/#1506) reads it as unclaimed
|
|
18
|
+
* immediately — no separate release step, and no host-pid/hostname evidence anywhere. Fail-safe:
|
|
19
|
+
* no client/repo, or a lookup error, both resolve to 'unknown' — never conflated with a
|
|
20
|
+
* confirmed 'unclaimed' verdict. */
|
|
21
|
+
export declare function resolveActiveClaim(octokit: SweepDeps['octokit'], repo: string | undefined, issue: number, log: (type: EventKind, msg: string) => void): Promise<'claimed' | 'unclaimed' | 'unknown'>;
|
|
22
|
+
//# sourceMappingURL=worktree-gc-issues.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-gc-issues.d.ts","sourceRoot":"","sources":["../../src/utils/worktree-gc-issues.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElE;2FAC2F;AAC3F,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,GAAG,iBAAiB,GAAG,cAAc,GAAG,MAAM,CAAC;AAE3G;6FAC6F;AAC7F,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,EAC7B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,EAC3C,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAiClC;AAED;;;oEAGoE;AACpE,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,EAC7B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,GAC1C,OAAO,CAAC,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,gBAAgB,CAAC,CAc9D;AAED;;;;;;qCAMqC;AACrC,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,EAC7B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,GAC1C,OAAO,CAAC,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC,CAgB9C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { CLAIMED_BY_LABEL_PREFIX, DECOMPOSED_LABEL, PARKED_LABEL } from '../queue/github-queue.js';
|
|
2
|
+
import { findStaleClaims } from '../queue/stale-claims.js';
|
|
3
|
+
/** GitHub's verdict on the owning issue. A closed issue and a factory:parked label both mean
|
|
4
|
+
* the lane is finished-or-parked and its clean checkout is redundant (see ADR, this PR). */
|
|
5
|
+
export async function resolveIssueDisposition(octokit, repo, issue, log, issueWarnDedup) {
|
|
6
|
+
if (!octokit || !repo)
|
|
7
|
+
return null;
|
|
8
|
+
const [owner, repoName] = repo.split('/');
|
|
9
|
+
try {
|
|
10
|
+
const { data } = await octokit.rest.issues.get({ owner, repo: repoName, issue_number: issue });
|
|
11
|
+
if (data.state === 'closed')
|
|
12
|
+
return 'reap-closed';
|
|
13
|
+
const labels = new Set((data.labels ?? []).map((l) => (typeof l === 'string' ? l : (l?.name ?? ''))));
|
|
14
|
+
// An open issue with a live claim is being worked by some lane/run right now (#2964): its
|
|
15
|
+
// worktree is never reaped or quarantined, whatever its PR history or age. A lapsed lease is
|
|
16
|
+
// stale (findStaleClaims) and does not protect.
|
|
17
|
+
if ([...labels].some((name) => name.startsWith(CLAIMED_BY_LABEL_PREFIX)) &&
|
|
18
|
+
findStaleClaims([{ number: issue, labels: [...labels] }]).length === 0) {
|
|
19
|
+
return 'keep-claimed';
|
|
20
|
+
}
|
|
21
|
+
if (labels.has(PARKED_LABEL))
|
|
22
|
+
return 'reap-parked';
|
|
23
|
+
if (labels.has(DECOMPOSED_LABEL))
|
|
24
|
+
return 'reap-decomposed';
|
|
25
|
+
return 'keep';
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
if (issueWarnDedup.record(issue)) {
|
|
29
|
+
log('warn', `worktree-gc: GitHub issue query failed for #${issue} (${err?.message ?? String(err)}) — using PR/local evidence only`);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
log('warn', `worktree-gc: GitHub issue query failed for #${issue} — suppressed ${issueWarnDedup.suppressedCount(issue)} repeated warning(s) (using PR/local evidence only)`);
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** The lane issue's existence on GitHub, checked only for worktree-gc's dry-run report.
|
|
38
|
+
* 'not-configured' (no client/repo) and 'error' (the call threw anything but a 404) both mean
|
|
39
|
+
* "no verdict" but are reported differently: 'error' surfaces as unverifiable so a rate-limit
|
|
40
|
+
* or network blip is never mistaken for a confirmed-gone issue. */
|
|
41
|
+
export async function resolveIssueExistence(octokit, repo, issue, log) {
|
|
42
|
+
if (!octokit || !repo)
|
|
43
|
+
return 'not-configured';
|
|
44
|
+
const [owner, repoName] = repo.split('/');
|
|
45
|
+
try {
|
|
46
|
+
await octokit.rest.issues.get({ owner, repo: repoName, issue_number: issue });
|
|
47
|
+
return 'exists';
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
if (err?.status === 404)
|
|
51
|
+
return 'not-found';
|
|
52
|
+
log('warn', `worktree-gc: GitHub issue existence check failed for #${issue} (${err?.message ?? String(err)}) — reporting as unverifiable`);
|
|
53
|
+
return 'error';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Whether the lane issue carries an active, unexpired claim, checked only for worktree-gc's
|
|
57
|
+
* dry-run report. A `factory:claimed-by:*` label alone is not enough (#1501): if the issue also
|
|
58
|
+
* carries a `factory:claim-expires:*` lease label and that lease has lapsed, `findStaleClaims`
|
|
59
|
+
* (the same primitive the queue's own reconcile uses, ADR-0104/#1506) reads it as unclaimed
|
|
60
|
+
* immediately — no separate release step, and no host-pid/hostname evidence anywhere. Fail-safe:
|
|
61
|
+
* no client/repo, or a lookup error, both resolve to 'unknown' — never conflated with a
|
|
62
|
+
* confirmed 'unclaimed' verdict. */
|
|
63
|
+
export async function resolveActiveClaim(octokit, repo, issue, log) {
|
|
64
|
+
if (!octokit || !repo)
|
|
65
|
+
return 'unknown';
|
|
66
|
+
const [owner, repoName] = repo.split('/');
|
|
67
|
+
try {
|
|
68
|
+
const { data } = await octokit.rest.issues.get({ owner, repo: repoName, issue_number: issue });
|
|
69
|
+
const labels = (data.labels ?? []).map((label) => (typeof label === 'string' ? label : (label?.name ?? '')));
|
|
70
|
+
if (!labels.some((name) => name.startsWith(CLAIMED_BY_LABEL_PREFIX)))
|
|
71
|
+
return 'unclaimed';
|
|
72
|
+
const stale = findStaleClaims([{ number: issue, labels }]);
|
|
73
|
+
return stale.length > 0 ? 'unclaimed' : 'claimed';
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
log('warn', `worktree-gc: GitHub claim-label check failed for #${issue} (${err?.message ?? String(err)}) — reporting as unknown (not flagged)`);
|
|
77
|
+
return 'unknown';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=worktree-gc-issues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-gc-issues.js","sourceRoot":"","sources":["../../src/utils/worktree-gc-issues.ts"],"names":[],"mappings":"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"}
|
|
@@ -145,12 +145,17 @@ export declare function scrubFile(filePath: string): void;
|
|
|
145
145
|
export declare function isWorktreeClean(runCommand: NonNullable<SweepDeps['runCommand']>, worktreePath: string): Promise<boolean>;
|
|
146
146
|
/** Commits reachable from `rev` that are on no `origin` ref; null when the probe fails or is unparseable (⇒ keep). */
|
|
147
147
|
export declare function countUnpushedCommits(runCommand: NonNullable<SweepDeps['runCommand']>, repoRoot: string, rev: string): Promise<number | null>;
|
|
148
|
+
/** True only when `head` has exactly 0 commits ahead of origin/main — a lane that has not committed
|
|
149
|
+
* yet (every lane starts at origin/main), never proof of a merge (#2964). Probe failure ⇒ false. */
|
|
150
|
+
export declare function isZeroCommitLane(runCommand: NonNullable<SweepDeps['runCommand']>, repoRoot: string, head: string | null): Promise<boolean>;
|
|
148
151
|
export declare function sweepWorktrees(opts: {
|
|
149
152
|
repoRoot: string;
|
|
150
153
|
ttlDays: number;
|
|
151
154
|
dryRun?: boolean;
|
|
152
155
|
repo?: string;
|
|
153
156
|
branchPrefix?: string;
|
|
157
|
+
/** Issues other lanes of this run have in flight: never reaped, whatever their age or PR state (#2964). */
|
|
158
|
+
protectedIssues?: ReadonlySet<number>;
|
|
154
159
|
}, deps?: SweepDeps): Promise<GcReport>;
|
|
155
160
|
export declare function formatGcReport(report: GcReport): string;
|
|
156
161
|
//# sourceMappingURL=worktree-gc.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-gc.d.ts","sourceRoot":"","sources":["../../src/utils/worktree-gc.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree-gc.d.ts","sourceRoot":"","sources":["../../src/utils/worktree-gc.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAWnE,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,aAAa,GACb,aAAa,GACb,cAAc,GACd,cAAc,GACd,kBAAkB,GAClB,iBAAiB,GACjB,iBAAiB,CAAC;AAEtB;;oEAEoE;AACpE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB;;+EAE2E;IAC3E,aAAa,EAAE,OAAO,CAAC;IACvB;;;2CAGuC;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;kGAG8F;IAC9F,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAC;IAChC;;kGAE8F;IAC9F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;iFAGiF;AACjF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;yBAIyB;AACzB,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC9B;AAED;6DAC6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB;;;yFAGqF;IACrF,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC;;;+BAG2B;IAC3B,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;IACvC;;;;;kFAK8E;IAC9E,aAAa,EAAE,sBAAsB,EAAE,CAAC;IACxC;;iDAE6C;IAC7C,IAAI,EAAE,eAAe,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnF,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,0HAA0H;IAC1H,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChC;;;qGAGiG;IACjG,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B;;oFAEgF;IAChF,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;;;;;;0DAO0D;AAC1D,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IAEpD;kFAC8E;IAC9E,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAI7B;IAED,gGAAgG;IAChG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErC;IAED;+DAC2D;IAC3D,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAIjD;CACF;AAiCD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA+BxE;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BlE;AA4BD;;;+DAG+D;AAC/D,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAa/C;AAED;kBACkB;AAClB,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOhD;AA8FD;;uEAEuE;AACvE,wBAAsB,eAAe,CACnC,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,EAChD,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,sHAAsH;AACtH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,EAChD,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMxB;AAED;qGACqG;AACrG,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,EAChD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE;IACJ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2GAA2G;IAC3G,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC,EACD,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,QAAQ,CAAC,CAuYnB;AAiCD,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAuDvD"}
|
|
@@ -3,11 +3,10 @@ import { exec as execCb } from 'node:child_process';
|
|
|
3
3
|
import { closeSync, constants, existsSync, fstatSync, lstatSync, mkdirSync, openSync, readdirSync, renameSync, rmSync, statSync, writeSync, } from 'node:fs';
|
|
4
4
|
import { basename, join, resolve } from 'node:path';
|
|
5
5
|
import { promisify } from 'node:util';
|
|
6
|
-
import { CLAIMED_BY_LABEL_PREFIX, DECOMPOSED_LABEL, PARKED_LABEL } from '../queue/github-queue.js';
|
|
7
|
-
import { findStaleClaims } from '../queue/stale-claims.js';
|
|
8
6
|
import { getFactoryPaths } from '../config/index.js';
|
|
9
7
|
import { factoryBranchPrefixes, shellEscape } from './index.js';
|
|
10
8
|
import { removeMicroVm } from './microvm.js';
|
|
9
|
+
import { resolveActiveClaim, resolveIssueDisposition, resolveIssueExistence, } from './worktree-gc-issues.js';
|
|
11
10
|
import { isFactoryDirName } from './worktree-name.js';
|
|
12
11
|
const exec = promisify(execCb);
|
|
13
12
|
/** Dedupes resolveIssueDisposition's lookup-failure warning across repeated sweeps — the factory
|
|
@@ -244,76 +243,6 @@ function laneIssueNumber(entry, lanePattern) {
|
|
|
244
243
|
const fromPath = basename(entry.path).match(/-(\d+)$/);
|
|
245
244
|
return fromPath ? Number(fromPath[1]) : null;
|
|
246
245
|
}
|
|
247
|
-
/** GitHub's verdict on the owning issue. A closed issue and a factory:parked label both mean
|
|
248
|
-
* the lane is finished-or-parked and its clean checkout is redundant (see ADR, this PR). */
|
|
249
|
-
async function resolveIssueDisposition(octokit, repo, issue, log, issueWarnDedup) {
|
|
250
|
-
if (!octokit || !repo)
|
|
251
|
-
return null;
|
|
252
|
-
const [owner, repoName] = repo.split('/');
|
|
253
|
-
try {
|
|
254
|
-
const { data } = await octokit.rest.issues.get({ owner, repo: repoName, issue_number: issue });
|
|
255
|
-
if (data.state === 'closed')
|
|
256
|
-
return 'reap-closed';
|
|
257
|
-
const labels = new Set((data.labels ?? []).map((l) => (typeof l === 'string' ? l : (l?.name ?? ''))));
|
|
258
|
-
if (labels.has(PARKED_LABEL))
|
|
259
|
-
return 'reap-parked';
|
|
260
|
-
if (labels.has(DECOMPOSED_LABEL))
|
|
261
|
-
return 'reap-decomposed';
|
|
262
|
-
return 'keep';
|
|
263
|
-
}
|
|
264
|
-
catch (err) {
|
|
265
|
-
if (issueWarnDedup.record(issue)) {
|
|
266
|
-
log('warn', `worktree-gc: GitHub issue query failed for #${issue} (${err?.message ?? String(err)}) — using PR/local evidence only`);
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
log('warn', `worktree-gc: GitHub issue query failed for #${issue} — suppressed ${issueWarnDedup.suppressedCount(issue)} repeated warning(s) (using PR/local evidence only)`);
|
|
270
|
-
}
|
|
271
|
-
return null;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
/** The lane issue's existence on GitHub, checked only for worktree-gc's dry-run report.
|
|
275
|
-
* 'not-configured' (no client/repo) and 'error' (the call threw anything but a 404) both mean
|
|
276
|
-
* "no verdict" but are reported differently: 'error' surfaces as unverifiable so a rate-limit
|
|
277
|
-
* or network blip is never mistaken for a confirmed-gone issue. */
|
|
278
|
-
async function resolveIssueExistence(octokit, repo, issue, log) {
|
|
279
|
-
if (!octokit || !repo)
|
|
280
|
-
return 'not-configured';
|
|
281
|
-
const [owner, repoName] = repo.split('/');
|
|
282
|
-
try {
|
|
283
|
-
await octokit.rest.issues.get({ owner, repo: repoName, issue_number: issue });
|
|
284
|
-
return 'exists';
|
|
285
|
-
}
|
|
286
|
-
catch (err) {
|
|
287
|
-
if (err?.status === 404)
|
|
288
|
-
return 'not-found';
|
|
289
|
-
log('warn', `worktree-gc: GitHub issue existence check failed for #${issue} (${err?.message ?? String(err)}) — reporting as unverifiable`);
|
|
290
|
-
return 'error';
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
/** Whether the lane issue carries an active, unexpired claim, checked only for worktree-gc's
|
|
294
|
-
* dry-run report. A `factory:claimed-by:*` label alone is not enough (#1501): if the issue also
|
|
295
|
-
* carries a `factory:claim-expires:*` lease label and that lease has lapsed, `findStaleClaims`
|
|
296
|
-
* (the same primitive the queue's own reconcile uses, ADR-0104/#1506) reads it as unclaimed
|
|
297
|
-
* immediately — no separate release step, and no host-pid/hostname evidence anywhere. Fail-safe:
|
|
298
|
-
* no client/repo, or a lookup error, both resolve to 'unknown' — never conflated with a
|
|
299
|
-
* confirmed 'unclaimed' verdict. */
|
|
300
|
-
async function resolveActiveClaim(octokit, repo, issue, log) {
|
|
301
|
-
if (!octokit || !repo)
|
|
302
|
-
return 'unknown';
|
|
303
|
-
const [owner, repoName] = repo.split('/');
|
|
304
|
-
try {
|
|
305
|
-
const { data } = await octokit.rest.issues.get({ owner, repo: repoName, issue_number: issue });
|
|
306
|
-
const labels = (data.labels ?? []).map((label) => (typeof label === 'string' ? label : (label?.name ?? '')));
|
|
307
|
-
if (!labels.some((name) => name.startsWith(CLAIMED_BY_LABEL_PREFIX)))
|
|
308
|
-
return 'unclaimed';
|
|
309
|
-
const stale = findStaleClaims([{ number: issue, labels }]);
|
|
310
|
-
return stale.length > 0 ? 'unclaimed' : 'claimed';
|
|
311
|
-
}
|
|
312
|
-
catch (err) {
|
|
313
|
-
log('warn', `worktree-gc: GitHub claim-label check failed for #${issue} (${err?.message ?? String(err)}) — reporting as unknown (not flagged)`);
|
|
314
|
-
return 'unknown';
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
246
|
/** A worktree is clean when it has no modified tracked files. `--untracked-files=no` deliberately
|
|
318
247
|
* ignores untracked build residue (node_modules, artifacts) — the "live work" signal is tracked-file
|
|
319
248
|
* modifications. A probe failure (`safeExec` null) ⇒ false ⇒ keep. */
|
|
@@ -329,6 +258,16 @@ export async function countUnpushedCommits(runCommand, repoRoot, rev) {
|
|
|
329
258
|
const n = result === null ? NaN : Number.parseInt(result.stdout.trim(), 10);
|
|
330
259
|
return Number.isInteger(n) ? n : null;
|
|
331
260
|
}
|
|
261
|
+
/** True only when `head` has exactly 0 commits ahead of origin/main — a lane that has not committed
|
|
262
|
+
* yet (every lane starts at origin/main), never proof of a merge (#2964). Probe failure ⇒ false. */
|
|
263
|
+
export async function isZeroCommitLane(runCommand, repoRoot, head) {
|
|
264
|
+
if (head === null)
|
|
265
|
+
return false;
|
|
266
|
+
const result = await safeExec(runCommand, `git rev-list --count origin/main..${shellEscape(head)}`, {
|
|
267
|
+
cwd: repoRoot,
|
|
268
|
+
});
|
|
269
|
+
return result !== null && result.stdout.trim() === '0';
|
|
270
|
+
}
|
|
332
271
|
export async function sweepWorktrees(opts, deps = {}) {
|
|
333
272
|
const { runCommand = defaultRunCommand, now = () => Date.now(), log = () => { }, octokit, sandbox, issueWarnDedup = defaultIssueWarnDedup, } = deps;
|
|
334
273
|
const { repoRoot, ttlDays, dryRun = false, repo } = opts;
|
|
@@ -407,6 +346,11 @@ export async function sweepWorktrees(opts, deps = {}) {
|
|
|
407
346
|
return p;
|
|
408
347
|
};
|
|
409
348
|
for (const entry of candidates) {
|
|
349
|
+
const entryIssue = laneIssueNumber(entry, lanePattern);
|
|
350
|
+
if (entryIssue !== null && opts.protectedIssues?.has(entryIssue)) {
|
|
351
|
+
kept++;
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
410
354
|
const ageDays = computeAgeDays(entry.path, now, log);
|
|
411
355
|
let pushEvidence;
|
|
412
356
|
const priorPush = async () => {
|
|
@@ -417,6 +361,11 @@ export async function sweepWorktrees(opts, deps = {}) {
|
|
|
417
361
|
}
|
|
418
362
|
return pushEvidence;
|
|
419
363
|
};
|
|
364
|
+
let zeroCommit;
|
|
365
|
+
const zeroCommitLane = async () => {
|
|
366
|
+
zeroCommit ??= await isZeroCommitLane(runCommand, repoRoot, entry.head);
|
|
367
|
+
return zeroCommit;
|
|
368
|
+
};
|
|
420
369
|
let reason = null;
|
|
421
370
|
let branchReapable = false;
|
|
422
371
|
let heldThisEntry = false;
|
|
@@ -492,7 +441,7 @@ export async function sweepWorktrees(opts, deps = {}) {
|
|
|
492
441
|
}
|
|
493
442
|
else if (prState === 'merged') {
|
|
494
443
|
// GitHub decided the branch is merged — authoritative on its own, no ancestry/push requirement.
|
|
495
|
-
if (await isWorktreeClean(runCommand, entry.path))
|
|
444
|
+
if ((await isWorktreeClean(runCommand, entry.path)) && !(await zeroCommitLane()))
|
|
496
445
|
reason = 'merged';
|
|
497
446
|
}
|
|
498
447
|
else if (prState === 'closed') {
|
|
@@ -502,7 +451,10 @@ export async function sweepWorktrees(opts, deps = {}) {
|
|
|
502
451
|
(await safeExec(runCommand, `git merge-base --is-ancestor ${shellEscape(entry.head)} origin/main`, {
|
|
503
452
|
cwd: repoRoot,
|
|
504
453
|
})) !== null;
|
|
505
|
-
if (
|
|
454
|
+
if (await zeroCommitLane()) {
|
|
455
|
+
// A zero-commit lane is trivially an ancestor of main — not delivered work (#2964).
|
|
456
|
+
}
|
|
457
|
+
else if (delivered) {
|
|
506
458
|
// Closed-not-merged PR whose content reached main — delivered, removable.
|
|
507
459
|
reason = 'merged';
|
|
508
460
|
}
|
|
@@ -525,7 +477,7 @@ export async function sweepWorktrees(opts, deps = {}) {
|
|
|
525
477
|
// origin/main (setupWorktree: `git worktree add -b <branch> <path> origin/main`), so a lane
|
|
526
478
|
// that has not committed yet is trivially an ancestor. Require evidence the branch was
|
|
527
479
|
// actually pushed before calling it merged.
|
|
528
|
-
if (ancestorResult !== null && (await priorPush())) {
|
|
480
|
+
if (ancestorResult !== null && (await priorPush()) && !(await zeroCommitLane())) {
|
|
529
481
|
reason = 'merged';
|
|
530
482
|
}
|
|
531
483
|
}
|
|
@@ -535,7 +487,7 @@ export async function sweepWorktrees(opts, deps = {}) {
|
|
|
535
487
|
});
|
|
536
488
|
// An empty ls-remote is ambiguous — "merged and deleted upstream" or "never pushed". Only the
|
|
537
489
|
// former is garbage, and only a prior push distinguishes them.
|
|
538
|
-
if (lsRemote !== null && lsRemote.stdout.trim() === '' && (await priorPush())) {
|
|
490
|
+
if (lsRemote !== null && lsRemote.stdout.trim() === '' && (await priorPush()) && !(await zeroCommitLane())) {
|
|
539
491
|
reason = 'remote-gone';
|
|
540
492
|
}
|
|
541
493
|
}
|
|
@@ -550,7 +502,17 @@ export async function sweepWorktrees(opts, deps = {}) {
|
|
|
550
502
|
// never touched on a heuristic signal alone) and never overriding a live open PR — the same
|
|
551
503
|
// "never remove" rule the hard-evidence tier above already applies to it.
|
|
552
504
|
const openPr = entry.branch !== null && (await prStateFor(entry.branch)) === 'open';
|
|
553
|
-
|
|
505
|
+
const claimedDisposition = entryIssue === null ? null : await dispositionFor(entryIssue);
|
|
506
|
+
if (claimedDisposition === 'keep-claimed') {
|
|
507
|
+
// A live claim outranks every reap tier, TTL included (#2964).
|
|
508
|
+
reason = null;
|
|
509
|
+
}
|
|
510
|
+
if (!reason &&
|
|
511
|
+
!heldThisEntry &&
|
|
512
|
+
claimedDisposition !== 'keep-claimed' &&
|
|
513
|
+
!dryRun &&
|
|
514
|
+
!openPr &&
|
|
515
|
+
(await isWorktreeClean(runCommand, entry.path))) {
|
|
554
516
|
const issueNumber = laneIssueNumber(entry, lanePattern);
|
|
555
517
|
if (issueNumber !== null) {
|
|
556
518
|
const existence = await issueExistenceFor(issueNumber);
|