@loucompanion/forge-bridge 0.1.3-dev.f66395c3ac21 → 0.1.4-dev.04a1e5b9e484
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +165 -1
- package/dist/bridge/bridge-chat.types.d.ts +111 -0
- package/dist/bridge/bridge-chat.types.js +401 -0
- package/dist/bridge/bridge.base.d.ts +9 -1
- package/dist/bridge/bridge.service.d.ts +129 -3
- package/dist/bridge/bridge.service.js +2427 -70
- package/dist/bridge/bridge.types.d.ts +218 -2
- package/dist/bridge/dispatch-result-outbox.d.ts +25 -0
- package/dist/bridge/dispatch-result-outbox.js +62 -0
- package/dist/bridge/dispatch-result-worker.d.ts +2 -0
- package/dist/bridge/dispatch-result-worker.js +122 -0
- package/dist/bridge/internals.d.ts +2 -0
- package/dist/bridge/internals.js +1 -0
- package/dist/bridge/readiness-result-outbox.d.ts +21 -0
- package/dist/bridge/readiness-result-outbox.js +54 -0
- package/dist/bridge/readiness-result-worker.d.ts +2 -0
- package/dist/bridge/readiness-result-worker.js +121 -0
- package/dist/bridge/runner-host-capabilities.d.ts +15 -0
- package/dist/bridge/runner-host-capabilities.js +93 -0
- package/dist/cleanup/cleanup.service.d.ts +14 -2
- package/dist/cleanup/cleanup.service.js +496 -3
- package/dist/cleanup/cleanup.types.d.ts +10 -0
- package/dist/cleanup/index.d.ts +1 -1
- package/dist/cleanup/index.js +1 -1
- package/dist/cleanup/internals.d.ts +2 -2
- package/dist/cleanup/internals.js +1 -1
- package/dist/cli/cli.help.d.ts +2 -0
- package/dist/cli/cli.help.js +217 -0
- package/dist/cli/cli.service.d.ts +55 -7
- package/dist/cli/cli.service.js +429 -219
- package/dist/cli/local-config.d.ts +7 -0
- package/dist/cli/local-config.js +51 -3
- package/dist/runtime/aspnet-runtime-prebuild.d.ts +36 -0
- package/dist/runtime/aspnet-runtime-prebuild.js +341 -0
- package/dist/runtime/attempt-database-broker.d.ts +89 -0
- package/dist/runtime/attempt-database-broker.js +390 -0
- package/dist/runtime/attempt-node-runtime-launcher.d.ts +18 -0
- package/dist/runtime/attempt-node-runtime-launcher.js +140 -0
- package/dist/runtime/attempt-path-operation.d.ts +21 -0
- package/dist/runtime/attempt-path-operation.js +94 -0
- package/dist/runtime/attempt-private-directory.d.ts +6 -0
- package/dist/runtime/attempt-private-directory.js +54 -0
- package/dist/runtime/attempt-process-supervisor-registry.d.ts +20 -0
- package/dist/runtime/attempt-process-supervisor-registry.js +64 -0
- package/dist/runtime/attempt-process-supervisor.d.ts +102 -0
- package/dist/runtime/attempt-process-supervisor.js +421 -0
- package/dist/runtime/canonical-source-file.d.ts +3 -0
- package/dist/runtime/canonical-source-file.js +54 -0
- package/dist/runtime/docker-engine-probe.d.ts +90 -0
- package/dist/runtime/docker-engine-probe.js +333 -0
- package/dist/runtime/generated-output-reset.d.ts +20 -0
- package/dist/runtime/generated-output-reset.js +157 -0
- package/dist/runtime/host-database-capability-boundary.d.ts +16 -0
- package/dist/runtime/host-database-capability-boundary.js +62 -0
- package/dist/runtime/host-diagnostics.d.ts +11 -0
- package/dist/runtime/host-diagnostics.js +192 -0
- package/dist/runtime/host-execution-root.d.ts +4 -0
- package/dist/runtime/host-execution-root.js +39 -0
- package/dist/runtime/host-listener-inspector.d.ts +51 -0
- package/dist/runtime/host-listener-inspector.js +385 -0
- package/dist/runtime/host-port-broker.d.ts +76 -0
- package/dist/runtime/host-port-broker.js +333 -0
- package/dist/runtime/host-runtime-contract.d.ts +58 -0
- package/dist/runtime/host-runtime-contract.js +813 -0
- package/dist/runtime/host-runtime-lease.d.ts +217 -0
- package/dist/runtime/host-runtime-lease.js +2487 -0
- package/dist/runtime/host-runtime-promotion.d.ts +32 -0
- package/dist/runtime/host-runtime-promotion.js +206 -0
- package/dist/runtime/memory-capacity.d.ts +70 -0
- package/dist/runtime/memory-capacity.js +123 -0
- package/dist/runtime/native-test-postgres-fallback.d.ts +25 -0
- package/dist/runtime/native-test-postgres-fallback.js +91 -0
- package/dist/runtime/node-host-runtime-adapter.d.ts +54 -0
- package/dist/runtime/node-host-runtime-adapter.js +286 -0
- package/dist/runtime/pinned-directory-process.d.ts +9 -0
- package/dist/runtime/pinned-directory-process.js +61 -0
- package/dist/runtime/pinned-source-directory.d.ts +17 -0
- package/dist/runtime/pinned-source-directory.js +94 -0
- package/dist/runtime/playwright-host-runtime-adapter.d.ts +21 -0
- package/dist/runtime/playwright-host-runtime-adapter.js +268 -0
- package/dist/runtime/prepared-runtime-identity.d.ts +6 -0
- package/dist/runtime/prepared-runtime-identity.js +218 -0
- package/dist/runtime/prepared-runtime-readiness.d.ts +30 -0
- package/dist/runtime/prepared-runtime-readiness.js +285 -0
- package/dist/runtime/runtime-isolation-lease.d.ts +67 -0
- package/dist/runtime/runtime-isolation-lease.js +161 -0
- package/dist/runtime/workspace-resource-estimator.d.ts +17 -0
- package/dist/runtime/workspace-resource-estimator.js +174 -0
- package/dist/sandbox/command-runner.d.ts +4 -0
- package/dist/sandbox/command-runner.js +47 -0
- package/dist/sandbox/contract.d.ts +5 -0
- package/dist/sandbox/contract.js +276 -0
- package/dist/sandbox/event-budget.d.ts +11 -0
- package/dist/sandbox/event-budget.js +27 -0
- package/dist/sandbox/image-policy.d.ts +35 -0
- package/dist/sandbox/image-policy.js +247 -0
- package/dist/sandbox/index.d.ts +5 -0
- package/dist/sandbox/index.js +5 -0
- package/dist/sandbox/lease-watchdog.d.ts +18 -0
- package/dist/sandbox/lease-watchdog.js +67 -0
- package/dist/sandbox/preflight.d.ts +84 -0
- package/dist/sandbox/preflight.js +521 -0
- package/dist/sandbox/process.d.ts +20 -0
- package/dist/sandbox/process.js +209 -0
- package/dist/sandbox/provider-auth/codex.d.ts +26 -0
- package/dist/sandbox/provider-auth/codex.js +212 -0
- package/dist/sandbox/repository-lock.d.ts +6 -0
- package/dist/sandbox/repository-lock.js +129 -0
- package/dist/sandbox/runtime.d.ts +302 -0
- package/dist/sandbox/runtime.js +2368 -0
- package/dist/sandbox/sandbox.types.d.ts +93 -0
- package/dist/sandbox/sandbox.types.js +1 -0
- package/dist/sandbox/smoke.d.ts +76 -0
- package/dist/sandbox/smoke.js +380 -0
- package/dist/sandbox/worker-supervisor.d.ts +13 -0
- package/dist/sandbox/worker-supervisor.js +36 -0
- package/dist/sandbox/worker.d.ts +1 -0
- package/dist/sandbox/worker.js +225 -0
- package/dist/sandbox/workspace.service.d.ts +13 -0
- package/dist/sandbox/workspace.service.js +74 -0
- package/dist/session/managed-attempt-tools.d.ts +28 -0
- package/dist/session/managed-attempt-tools.js +1016 -0
- package/dist/session/managed-build-coordinator.d.ts +5 -0
- package/dist/session/managed-build-coordinator.js +106 -0
- package/dist/session/managed-build-receipt.d.ts +21 -0
- package/dist/session/managed-build-receipt.js +337 -0
- package/dist/session/managed-verification-timeouts.d.ts +8 -0
- package/dist/session/managed-verification-timeouts.js +17 -0
- package/dist/session/phase-completion.artifacts.d.ts +27 -0
- package/dist/session/phase-completion.artifacts.js +829 -0
- package/dist/session/phase-completion.d.ts +53 -42
- package/dist/session/phase-completion.helpers.d.ts +117 -0
- package/dist/session/phase-completion.helpers.js +707 -0
- package/dist/session/phase-completion.js +125 -3007
- package/dist/session/phase-completion.prompts.d.ts +14 -0
- package/dist/session/phase-completion.prompts.js +233 -0
- package/dist/session/phase-completion.runtime.d.ts +49 -0
- package/dist/session/phase-completion.runtime.js +840 -0
- package/dist/session/phase-completion.schemas.d.ts +3 -0
- package/dist/session/phase-completion.schemas.js +859 -0
- package/dist/session/phase-completion.validation.d.ts +38 -0
- package/dist/session/phase-completion.validation.js +918 -0
- package/dist/session/pre-publication-validation.d.ts +75 -0
- package/dist/session/pre-publication-validation.js +661 -0
- package/dist/session/provider-cli/bridge-cli.conformance-fixtures.d.ts +72 -0
- package/dist/session/provider-cli/bridge-cli.conformance-fixtures.js +462 -0
- package/dist/session/provider-cli/ci-repair-readiness.d.ts +16 -0
- package/dist/session/provider-cli/ci-repair-readiness.js +110 -0
- package/dist/session/provider-cli/provider-cli.artifacts.d.ts +95 -0
- package/dist/session/provider-cli/provider-cli.artifacts.js +812 -0
- package/dist/session/provider-cli/provider-cli.base.d.ts +1 -0
- package/dist/session/provider-cli/provider-cli.deterministic-payloads.d.ts +12 -0
- package/dist/session/provider-cli/provider-cli.deterministic-payloads.js +279 -0
- package/dist/session/provider-cli/provider-cli.deterministic.d.ts +14 -0
- package/dist/session/provider-cli/provider-cli.deterministic.js +407 -0
- package/dist/session/provider-cli/provider-cli.process.d.ts +99 -0
- package/dist/session/provider-cli/provider-cli.process.js +874 -0
- package/dist/session/provider-cli/provider-cli.prompts.d.ts +52 -0
- package/dist/session/provider-cli/provider-cli.prompts.js +715 -0
- package/dist/session/provider-cli/provider-cli.qa-sidecars.d.ts +11 -0
- package/dist/session/provider-cli/provider-cli.qa-sidecars.js +66 -0
- package/dist/session/provider-cli/provider-cli.repair-epoch.d.ts +6 -0
- package/dist/session/provider-cli/provider-cli.repair-epoch.js +11 -0
- package/dist/session/provider-cli/provider-cli.runtime.d.ts +22 -0
- package/dist/session/provider-cli/provider-cli.runtime.js +92 -0
- package/dist/session/provider-cli/provider-cli.service.d.ts +47 -53
- package/dist/session/provider-cli/provider-cli.service.js +1258 -2497
- package/dist/session/provider-cli/provider-cli.types.d.ts +8 -0
- package/dist/session/provider-cli/provider-output-state.d.ts +32 -0
- package/dist/session/provider-cli/provider-output-state.js +817 -0
- package/dist/session/provider-cli/provider-usage.d.ts +7 -0
- package/dist/session/provider-cli/provider-usage.js +28 -5
- package/dist/session/session-redaction.d.ts +3 -0
- package/dist/session/session-redaction.js +448 -0
- package/dist/session/session.base.d.ts +6 -1
- package/dist/session/session.service.d.ts +8 -2
- package/dist/session/session.service.js +586 -59
- package/dist/session/session.types.d.ts +324 -3
- package/dist/session/session.types.js +939 -10
- package/dist/session/unreferenced-exports.d.ts +12 -0
- package/dist/session/unreferenced-exports.js +59 -0
- package/dist/shared/format/format-bytes.d.ts +1 -0
- package/dist/shared/format/format-bytes.js +9 -0
- package/dist/shared/git/git.js +2 -1
- package/dist/shared/path/path.d.ts +1 -0
- package/dist/shared/path/path.js +21 -1
- package/dist/shared/process/dotnet-toolchain.d.ts +17 -0
- package/dist/shared/process/dotnet-toolchain.js +307 -0
- package/dist/shared/process/host-process-recovery.d.ts +12 -0
- package/dist/shared/process/host-process-recovery.js +79 -0
- package/dist/shared/process/host-process-supervisor.d.ts +59 -0
- package/dist/shared/process/host-process-supervisor.js +331 -0
- package/dist/shared/process/process.d.ts +3 -0
- package/dist/shared/process/process.js +13 -7
- package/dist/shared/process/windows-launch.d.ts +8 -0
- package/dist/shared/process/windows-launch.js +41 -0
- package/dist/shared/provider-capabilities.d.ts +4 -0
- package/dist/shared/provider-capabilities.js +88 -0
- package/dist/shared/redaction/redaction.d.ts +1 -0
- package/dist/shared/redaction/redaction.js +47 -4
- package/dist/shared/time/monotonic.d.ts +1 -0
- package/dist/shared/time/monotonic.js +8 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worktree/artifact-injector.d.ts +3 -2
- package/dist/worktree/artifact-injector.js +82 -10
- package/dist/worktree/dependency-warmer.d.ts +53 -1
- package/dist/worktree/dependency-warmer.js +619 -11
- package/dist/worktree/index.d.ts +2 -1
- package/dist/worktree/index.js +1 -0
- package/dist/worktree/prior-phase-artifact-hydrator.d.ts +2 -0
- package/dist/worktree/prior-phase-artifact-hydrator.js +136 -0
- package/dist/worktree/story-qa-reference-hydrator.d.ts +4 -0
- package/dist/worktree/story-qa-reference-hydrator.js +253 -0
- package/dist/worktree/worktree-paths.d.ts +4 -0
- package/dist/worktree/worktree-paths.js +30 -0
- package/dist/worktree/worktree.base.d.ts +3 -0
- package/dist/worktree/worktree.service.d.ts +16 -3
- package/dist/worktree/worktree.service.js +334 -54
- package/dist/worktree/worktree.types.d.ts +9 -1
- package/package.json +12 -7
- package/runtime/windows-job-supervisor.ps1 +722 -0
- package/runtime/windows-listener-owner.ps1 +33 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DispatchQaAppLaunchTarget } from "../session.types.js";
|
|
2
|
+
interface QaSidecarFile {
|
|
3
|
+
readonly relativePath: string;
|
|
4
|
+
readonly content: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function hasLaunchTarget(target: DispatchQaAppLaunchTarget | null): boolean;
|
|
7
|
+
export declare function deterministicBrowserSidecar(workItemId: string, target: DispatchQaAppLaunchTarget, ownerType?: string | null, ownerId?: string | null): QaSidecarFile;
|
|
8
|
+
export declare function deterministicBrowserCheck(target: DispatchQaAppLaunchTarget, screenshotPath: string): Record<string, unknown>;
|
|
9
|
+
export declare function primaryLaunchRoute(target: DispatchQaAppLaunchTarget): string;
|
|
10
|
+
export declare function writeQaSidecarFiles(worktreePath: string, files: readonly QaSidecarFile[]): Promise<Array<Record<string, unknown>>>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export function hasLaunchTarget(target) {
|
|
5
|
+
return Boolean(target?.url?.trim()
|
|
6
|
+
|| target?.ready_url?.trim()
|
|
7
|
+
|| target?.managed_runtime_port?.trim()
|
|
8
|
+
|| target?.command?.trim()
|
|
9
|
+
|| (target?.routes ?? []).some((route) => route.trim().length > 0));
|
|
10
|
+
}
|
|
11
|
+
export function deterministicBrowserSidecar(workItemId, target, ownerType, ownerId) {
|
|
12
|
+
const route = primaryLaunchRoute(target);
|
|
13
|
+
return {
|
|
14
|
+
relativePath: qaArtifactRelativePath(workItemId, "qa/screenshots/deterministic-browser-check.txt", ownerType, ownerId),
|
|
15
|
+
content: `Deterministic Forge QA browser evidence\nRoute: ${route}\nConsole errors: []\nNetwork errors: []\nResponsive checks: desktop, mobile\n`
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function deterministicBrowserCheck(target, screenshotPath) {
|
|
19
|
+
const route = primaryLaunchRoute(target);
|
|
20
|
+
return {
|
|
21
|
+
route,
|
|
22
|
+
url: route,
|
|
23
|
+
status: "pass",
|
|
24
|
+
summary: "Deterministic browser QA exercised the configured launch target.",
|
|
25
|
+
actions: ["open launch target", "walk acceptance criteria", "check console/network summaries", "check responsive viewport"],
|
|
26
|
+
screenshots: [screenshotPath],
|
|
27
|
+
console_errors: [],
|
|
28
|
+
network_errors: [],
|
|
29
|
+
responsive_checks: ["desktop", "mobile"]
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function primaryLaunchRoute(target) {
|
|
33
|
+
return target.ready_url?.trim()
|
|
34
|
+
|| target.url?.trim()
|
|
35
|
+
|| target.routes.find((route) => route.trim().length > 0)?.trim()
|
|
36
|
+
|| target.command?.trim()
|
|
37
|
+
|| "app launch command";
|
|
38
|
+
}
|
|
39
|
+
export async function writeQaSidecarFiles(worktreePath, files) {
|
|
40
|
+
const sidecars = [];
|
|
41
|
+
for (const file of files) {
|
|
42
|
+
const fullPath = path.resolve(worktreePath, file.relativePath);
|
|
43
|
+
const relativePath = path.relative(worktreePath, fullPath).split(path.sep).join("/");
|
|
44
|
+
if (relativePath.startsWith("..") || path.isAbsolute(relativePath)) {
|
|
45
|
+
throw new Error(`QA sidecar path must stay under the worktree: ${file.relativePath}`);
|
|
46
|
+
}
|
|
47
|
+
await fs.mkdir(path.dirname(fullPath), { recursive: true });
|
|
48
|
+
await fs.writeFile(fullPath, file.content, "utf8");
|
|
49
|
+
sidecars.push({
|
|
50
|
+
path: relativePath,
|
|
51
|
+
content_hash: sha256(file.content),
|
|
52
|
+
bytes: Buffer.byteLength(file.content, "utf8")
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return sidecars;
|
|
56
|
+
}
|
|
57
|
+
function qaArtifactRelativePath(workItemId, fileName, ownerType, ownerId) {
|
|
58
|
+
if (ownerType && ownerId) {
|
|
59
|
+
const ownerDirectory = ownerType.trim().toLowerCase() === "story" ? "stories" : "work-items";
|
|
60
|
+
return [".forge", ownerDirectory, ownerId, "artifacts", fileName].join("/");
|
|
61
|
+
}
|
|
62
|
+
return [".forge", "work-items", workItemId, "artifacts", fileName].join("/");
|
|
63
|
+
}
|
|
64
|
+
function sha256(content) {
|
|
65
|
+
return crypto.createHash("sha256").update(content).digest("hex");
|
|
66
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { GitClient } from "../../shared/git/git.js";
|
|
2
|
+
import type { ProviderCliRunContext } from "./provider-cli.types.js";
|
|
3
|
+
export declare function assertRepairHeadEpoch(context: ProviderCliRunContext, git: Pick<GitClient, "run">): Promise<{
|
|
4
|
+
expectedRepairHeadSha: string;
|
|
5
|
+
preparedHeadSha: string;
|
|
6
|
+
}>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export async function assertRepairHeadEpoch(context, git) {
|
|
2
|
+
const expectedRepairHeadSha = context.dispatch.cycleRun.repairHeadSha?.trim();
|
|
3
|
+
if (!expectedRepairHeadSha) {
|
|
4
|
+
throw new Error("missing_repair_head_epoch: repair dispatch does not include repairHeadSha; refresh provider state before retrying.");
|
|
5
|
+
}
|
|
6
|
+
const preparedHeadSha = (await git.run(context.worktree.worktreePath, ["rev-parse", "HEAD"])).trim();
|
|
7
|
+
if (preparedHeadSha.toLowerCase() !== expectedRepairHeadSha.toLowerCase()) {
|
|
8
|
+
throw new Error(`stale_head: repair dispatch expected ${expectedRepairHeadSha} but prepared worktree is ${preparedHeadSha}; refresh provider state before retrying.`);
|
|
9
|
+
}
|
|
10
|
+
return { expectedRepairHeadSha, preparedHeadSha };
|
|
11
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { RunOnceDispatchPacket } from "../session.types.js";
|
|
2
|
+
import type { ProviderCliRunContext } from "./provider-cli.types.js";
|
|
3
|
+
import type { ProviderOutputState } from "./provider-output-state.js";
|
|
4
|
+
import { type ProviderUsage } from "./provider-usage.js";
|
|
5
|
+
export declare function providerProcessEnv(dispatch: RunOnceDispatchPacket, runtimeEnvironment?: Readonly<Record<string, string>>): Readonly<Record<string, string>>;
|
|
6
|
+
/**
|
|
7
|
+
* Pre-publication validation runs the attempt's own checks, whose E2E fixtures log in to the
|
|
8
|
+
* brokered attempt database. Unlike the provider's shell, it receives that capability; the
|
|
9
|
+
* validator redacts it from every command's output.
|
|
10
|
+
*/
|
|
11
|
+
export declare function prePublicationValidationEnv(dispatch: RunOnceDispatchPacket, runtimeEnvironment?: Readonly<Record<string, string>>): Readonly<Record<string, string>>;
|
|
12
|
+
export declare function providerRuntimeEnvironment(runtimeEnvironment?: Readonly<Record<string, string>>): Readonly<Record<string, string>>;
|
|
13
|
+
export declare function providerCredentialEnv(dispatch: RunOnceDispatchPacket): Readonly<Record<string, string>>;
|
|
14
|
+
/**
|
|
15
|
+
* Non-secret CLI settings a provider needs to run headless under Forge. Claude Code's default MCP
|
|
16
|
+
* tool timeout is far shorter than Forge's managed verification commands, so match Codex's
|
|
17
|
+
* 7200s `tool_timeout_sec`, and keep the CLI from self-updating mid-attempt.
|
|
18
|
+
*/
|
|
19
|
+
export declare function providerCliDefaultsEnv(dispatch: RunOnceDispatchPacket): Readonly<Record<string, string>>;
|
|
20
|
+
export declare function exactRedactionSecrets(dispatch: RunOnceDispatchPacket): readonly string[];
|
|
21
|
+
export declare function emitProviderUsageEvent(emit: ProviderCliRunContext["emit"], dispatch: RunOnceDispatchPacket, outputState: ProviderOutputState): Promise<void>;
|
|
22
|
+
export declare function estimatedDeterministicUsage(): ProviderUsage;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { attemptDatabaseCapabilityEnvironment } from "../../runtime/attempt-database-broker.js";
|
|
2
|
+
import { completionRedactionEnv } from "../phase-completion.js";
|
|
3
|
+
import { addUsage, buildProviderUsageEvent, emptyUsage, hasUsage } from "./provider-usage.js";
|
|
4
|
+
export function providerProcessEnv(dispatch, runtimeEnvironment) {
|
|
5
|
+
const env = {
|
|
6
|
+
...completionRedactionEnv(exactRedactionSecrets(dispatch)),
|
|
7
|
+
...providerCliDefaultsEnv(dispatch),
|
|
8
|
+
...providerCredentialEnv(dispatch),
|
|
9
|
+
...providerRuntimeEnvironment(runtimeEnvironment),
|
|
10
|
+
};
|
|
11
|
+
// Always pass an explicit object. Alternate process runners must never receive
|
|
12
|
+
// `undefined`, which Node interprets as permission to inherit the entire
|
|
13
|
+
// Bridge environment, including credentials outside the provider contract.
|
|
14
|
+
return env;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Pre-publication validation runs the attempt's own checks, whose E2E fixtures log in to the
|
|
18
|
+
* brokered attempt database. Unlike the provider's shell, it receives that capability; the
|
|
19
|
+
* validator redacts it from every command's output.
|
|
20
|
+
*/
|
|
21
|
+
export function prePublicationValidationEnv(dispatch, runtimeEnvironment) {
|
|
22
|
+
const env = providerProcessEnv(dispatch, runtimeEnvironment);
|
|
23
|
+
const capability = runtimeEnvironment?.[attemptDatabaseCapabilityEnvironment]?.trim();
|
|
24
|
+
return capability ? { ...env, [attemptDatabaseCapabilityEnvironment]: capability } : env;
|
|
25
|
+
}
|
|
26
|
+
export function providerRuntimeEnvironment(runtimeEnvironment) {
|
|
27
|
+
if (!runtimeEnvironment)
|
|
28
|
+
return {};
|
|
29
|
+
return Object.fromEntries(Object.entries(runtimeEnvironment).filter(([name]) => {
|
|
30
|
+
const normalized = name.trim().toUpperCase();
|
|
31
|
+
return normalized !== "FORGE_TEST_POSTGRES_ADMIN_CONNECTION_STRING"
|
|
32
|
+
&& normalized !== "FORGE_TEST_POSTGRES_CONNECTION_STRING"
|
|
33
|
+
// The attempt database login reaches the application runtime, pre-publication checks and
|
|
34
|
+
// managed commands (which redact it); the provider's own shell does not need it.
|
|
35
|
+
&& normalized !== "FORGE_ATTEMPT_DATABASE_CAPABILITY"
|
|
36
|
+
&& !normalized.startsWith("CONNECTIONSTRINGS__")
|
|
37
|
+
&& !normalized.startsWith("CONNECTIONSTRINGS:")
|
|
38
|
+
&& !normalized.endsWith("_CONNECTION_STRING");
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
export function providerCredentialEnv(dispatch) {
|
|
42
|
+
const secret = dispatch.apiKeySecretGrant?.secret;
|
|
43
|
+
if (!secret || !dispatch.execution.requiresApiKeySecretGrant) {
|
|
44
|
+
return {};
|
|
45
|
+
}
|
|
46
|
+
const provider = dispatch.execution.provider.trim().toLowerCase();
|
|
47
|
+
if (provider === "codex" || provider === "openai") {
|
|
48
|
+
return { OPENAI_API_KEY: secret };
|
|
49
|
+
}
|
|
50
|
+
if (provider === "claude" || provider === "anthropic") {
|
|
51
|
+
return { ANTHROPIC_API_KEY: secret };
|
|
52
|
+
}
|
|
53
|
+
return {};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Non-secret CLI settings a provider needs to run headless under Forge. Claude Code's default MCP
|
|
57
|
+
* tool timeout is far shorter than Forge's managed verification commands, so match Codex's
|
|
58
|
+
* 7200s `tool_timeout_sec`, and keep the CLI from self-updating mid-attempt.
|
|
59
|
+
*/
|
|
60
|
+
export function providerCliDefaultsEnv(dispatch) {
|
|
61
|
+
const provider = dispatch.execution.provider.trim().toLowerCase();
|
|
62
|
+
if (provider === "claude") {
|
|
63
|
+
return {
|
|
64
|
+
MCP_TOOL_TIMEOUT: "7200000",
|
|
65
|
+
MCP_TIMEOUT: "60000",
|
|
66
|
+
DISABLE_AUTOUPDATER: "1"
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return {};
|
|
70
|
+
}
|
|
71
|
+
export function exactRedactionSecrets(dispatch) {
|
|
72
|
+
const secret = dispatch.apiKeySecretGrant?.secret;
|
|
73
|
+
if (!secret || !dispatch.execution.requiresApiKeySecretGrant) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
return [secret];
|
|
77
|
+
}
|
|
78
|
+
export async function emitProviderUsageEvent(emit, dispatch, outputState) {
|
|
79
|
+
const usage = outputState.usage;
|
|
80
|
+
if (hasUsage(usage)) {
|
|
81
|
+
await emit(buildProviderUsageEvent(dispatch, usage));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export function estimatedDeterministicUsage() {
|
|
85
|
+
return addUsage(emptyUsage("estimated"), {
|
|
86
|
+
inputTokens: 1000,
|
|
87
|
+
uncachedInputTokens: 1000,
|
|
88
|
+
outputTokens: 400,
|
|
89
|
+
source: "estimated",
|
|
90
|
+
inputTokenSemantics: "includes_cached_input"
|
|
91
|
+
});
|
|
92
|
+
}
|
|
@@ -1,42 +1,51 @@
|
|
|
1
1
|
import { GitClient } from "../../shared/git/git.js";
|
|
2
|
-
import {
|
|
2
|
+
import type { WorktreeLifecycleCoordinator } from "../../worktree/worktree.base.js";
|
|
3
|
+
import { type RunnerDispatchEvent } from "../session.types.js";
|
|
3
4
|
import type { ProviderCliService } from "./provider-cli.base.js";
|
|
4
5
|
import type { ProviderCliDraftContext, ProviderCliRunContext, ProviderCliRunResult } from "./provider-cli.types.js";
|
|
5
|
-
import type
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
import { type ProviderProcessRunner, type ProviderProcessRunResult } from "./provider-cli.process.js";
|
|
7
|
+
import { PrePublicationValidator } from "../pre-publication-validation.js";
|
|
8
|
+
export { parseClaudeMcpToolName } from "./provider-output-state.js";
|
|
9
|
+
export { DeterministicProviderCliService } from "./provider-cli.deterministic.js";
|
|
10
|
+
export { buildProviderCliCommand, codexSandboxModeForPlatform, formatProviderCliCommand, formatProviderCliCommandForCheckpoint } from "./provider-cli.prompts.js";
|
|
11
|
+
export { buildProviderChildEnvironment, chooseWindowsCommandCandidate, resolveCodexNpmDirectLaunch, resolveClaudeNpmDirectLaunch, resolvePackageManagerDirectLaunch, resolveWindowsCommandFromPath, PROVIDER_OUTPUT_CAPTURE_LIMIT_CHARS, CodexModelsCacheRecoveringProcessRunner, CodexResumeRecoveringProcessRunner, isTransientCodexProviderNotFoundFailure, StreamingProviderProcessRunner } from "./provider-cli.process.js";
|
|
12
|
+
export { buildWindowsLaunchCommand } from "../../shared/process/windows-launch.js";
|
|
13
|
+
export type { ProviderCliCommand, ProviderProcessRunner, ProviderProcessRunRequest, ProviderProcessRunResult } from "./provider-cli.process.js";
|
|
14
|
+
/**
|
|
15
|
+
* Capacity is trusted only when a nonzero provider process writes one of the
|
|
16
|
+
* narrow service-level messages to stderr. Stdout can contain arbitrary agent
|
|
17
|
+
* command output and account usage-limit messages remain ordinary failures.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isProviderCapacityFailure(result: ProviderProcessRunResult): boolean;
|
|
20
|
+
/** Only a nonzero Codex service diagnostic can classify a configuration rejection.
|
|
21
|
+
* JSONL turn.failed is a provider envelope; item/tool output is not retry authority. */
|
|
22
|
+
export declare function isProviderConfigurationFailure(command: string, result: ProviderProcessRunResult): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* A context limit is trusted only at the provider process boundary. The exact
|
|
25
|
+
* Codex message can be embedded in its JSONL stderr envelope, so substring
|
|
26
|
+
* matching is intentional but remains narrow and stderr-only.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isProviderContextWindowExhausted(command: string, result: ProviderProcessRunResult): boolean;
|
|
29
|
+
export declare class ManagedVerificationProgressEmitter {
|
|
30
|
+
private readonly logDirectory;
|
|
31
|
+
private readonly emit;
|
|
32
|
+
private readonly intervalMs;
|
|
33
|
+
private timer;
|
|
34
|
+
private readonly observedStatuses;
|
|
35
|
+
private readonly completedCommands;
|
|
36
|
+
constructor(logDirectory: string | undefined, emit: (event: RunnerDispatchEvent) => Promise<void>, intervalMs?: number);
|
|
37
|
+
start(): void;
|
|
38
|
+
stop(): Promise<void>;
|
|
39
|
+
private scan;
|
|
40
|
+
private emitTransition;
|
|
9
41
|
}
|
|
10
|
-
export interface ProviderProcessRunRequest {
|
|
11
|
-
readonly command: string;
|
|
12
|
-
readonly args: readonly string[];
|
|
13
|
-
readonly cwd: string;
|
|
14
|
-
readonly env?: Readonly<Record<string, string>>;
|
|
15
|
-
}
|
|
16
|
-
export interface ProviderProcessRunResult {
|
|
17
|
-
readonly exitCode: number;
|
|
18
|
-
readonly stdout: string;
|
|
19
|
-
readonly stderr: string;
|
|
20
|
-
}
|
|
21
|
-
export interface ProviderProcessRunner {
|
|
22
|
-
run(request: ProviderProcessRunRequest, handlers?: ProviderProcessHandlers, signal?: AbortSignal): Promise<ProviderProcessRunResult>;
|
|
23
|
-
}
|
|
24
|
-
export interface ProviderProcessHandlers {
|
|
25
|
-
onStdoutLine?(line: string): Promise<void> | void;
|
|
26
|
-
onStderrLine?(line: string): Promise<void> | void;
|
|
27
|
-
}
|
|
28
|
-
interface ProviderChildEnvironmentOptions {
|
|
29
|
-
readonly parentEnv?: NodeJS.ProcessEnv;
|
|
30
|
-
readonly platform?: NodeJS.Platform;
|
|
31
|
-
readonly homeDir?: string;
|
|
32
|
-
}
|
|
33
|
-
export declare function buildProviderChildEnvironment(requestEnv?: Readonly<Record<string, string>>, options?: ProviderChildEnvironmentOptions): NodeJS.ProcessEnv;
|
|
34
42
|
export declare class RoutingProviderCliService implements ProviderCliService {
|
|
35
43
|
private readonly realProvider;
|
|
36
44
|
private readonly deterministicProvider;
|
|
37
45
|
constructor(realProvider?: ProviderCliService, deterministicProvider?: ProviderCliService);
|
|
38
46
|
runImplementation(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
39
47
|
runArchitect(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
48
|
+
runCiRepair(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
40
49
|
runConflictResolve(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
41
50
|
runQa(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
42
51
|
runDraft(context: ProviderCliDraftContext): Promise<ProviderCliRunResult>;
|
|
@@ -44,33 +53,18 @@ export declare class RoutingProviderCliService implements ProviderCliService {
|
|
|
44
53
|
export declare class ProcessBackedProviderCliService implements ProviderCliService {
|
|
45
54
|
private readonly processRunner;
|
|
46
55
|
private readonly git;
|
|
47
|
-
|
|
56
|
+
private readonly providerToolHeartbeatIntervalMs;
|
|
57
|
+
private readonly publicationCoordinator;
|
|
58
|
+
private readonly prePublicationValidator;
|
|
59
|
+
constructor(processRunner?: ProviderProcessRunner, git?: GitClient, providerToolHeartbeatIntervalMs?: number, publicationCoordinator?: WorktreeLifecycleCoordinator, prePublicationValidator?: PrePublicationValidator);
|
|
48
60
|
runDraft(context: ProviderCliDraftContext): Promise<ProviderCliRunResult>;
|
|
49
61
|
runImplementation(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
50
62
|
runArchitect(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
51
63
|
runQa(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
64
|
+
runCiRepair(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
52
65
|
runConflictResolve(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
66
|
+
private runPullRequestRepair;
|
|
67
|
+
private recoverMissingQaCompletion;
|
|
68
|
+
private recoverMissingCommentRepairCompletion;
|
|
69
|
+
private validatePrePublicationWithRecovery;
|
|
53
70
|
}
|
|
54
|
-
export declare class DeterministicProviderCliService implements ProviderCliService {
|
|
55
|
-
private readonly git;
|
|
56
|
-
constructor(git?: GitClient);
|
|
57
|
-
runDraft(context: ProviderCliDraftContext): Promise<ProviderCliRunResult>;
|
|
58
|
-
runImplementation(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
59
|
-
runArchitect(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
60
|
-
runQa(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
61
|
-
runConflictResolve(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
|
|
62
|
-
}
|
|
63
|
-
export declare class StreamingProviderProcessRunner implements ProviderProcessRunner {
|
|
64
|
-
run(request: ProviderProcessRunRequest, handlers?: ProviderProcessHandlers, signal?: AbortSignal): Promise<ProviderProcessRunResult>;
|
|
65
|
-
}
|
|
66
|
-
export declare function chooseWindowsCommandCandidate(candidates: readonly string[]): string | null;
|
|
67
|
-
export declare function buildWindowsLaunchCommand(commandPath: string, args: readonly string[]): ProviderCliCommand;
|
|
68
|
-
export declare function formatProviderCliCommand(command: ProviderCliCommand): string;
|
|
69
|
-
export declare function buildProviderCliCommand(dispatch: RunOnceDispatchPacket, run?: {
|
|
70
|
-
readonly prompt?: string;
|
|
71
|
-
readonly worktreePath?: string;
|
|
72
|
-
readonly completionTools?: CompletionToolRuntime;
|
|
73
|
-
readonly skipGitRepoCheck?: boolean;
|
|
74
|
-
}): ProviderCliCommand;
|
|
75
|
-
export declare function codexSandboxModeForPlatform(platform?: NodeJS.Platform): "workspace-write" | "danger-full-access";
|
|
76
|
-
export {};
|