@loucompanion/forge-bridge 0.1.3-dev.9bc5014a2270 → 0.1.3-dev.9bdea250c8c9
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 +127 -0
- package/dist/bridge/bridge.base.d.ts +8 -1
- package/dist/bridge/bridge.service.d.ts +98 -3
- package/dist/bridge/bridge.service.js +1437 -46
- package/dist/bridge/bridge.types.d.ts +209 -1
- 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 +100 -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.js +47 -1
- package/dist/cli/cli.service.d.ts +45 -2
- package/dist/cli/cli.service.js +378 -26
- 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 +340 -0
- package/dist/runtime/attempt-node-runtime-launcher.d.ts +17 -0
- package/dist/runtime/attempt-node-runtime-launcher.js +105 -0
- package/dist/runtime/attempt-path-operation.d.ts +18 -0
- package/dist/runtime/attempt-path-operation.js +93 -0
- package/dist/runtime/attempt-private-directory.d.ts +4 -0
- package/dist/runtime/attempt-private-directory.js +41 -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 +97 -0
- package/dist/runtime/attempt-process-supervisor.js +386 -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 +83 -0
- package/dist/runtime/docker-engine-probe.js +300 -0
- package/dist/runtime/generated-output-reset.d.ts +10 -0
- package/dist/runtime/generated-output-reset.js +103 -0
- package/dist/runtime/host-diagnostics.d.ts +4 -0
- package/dist/runtime/host-diagnostics.js +95 -0
- package/dist/runtime/host-listener-inspector.d.ts +46 -0
- package/dist/runtime/host-listener-inspector.js +349 -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 +56 -0
- package/dist/runtime/host-runtime-contract.js +709 -0
- package/dist/runtime/host-runtime-lease.d.ts +201 -0
- package/dist/runtime/host-runtime-lease.js +2306 -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 +68 -0
- package/dist/runtime/memory-capacity.js +121 -0
- package/dist/runtime/node-host-runtime-adapter.d.ts +54 -0
- package/dist/runtime/node-host-runtime-adapter.js +284 -0
- package/dist/runtime/pinned-directory-process.d.ts +4 -0
- package/dist/runtime/pinned-directory-process.js +20 -0
- package/dist/runtime/pinned-source-directory.d.ts +9 -0
- package/dist/runtime/pinned-source-directory.js +56 -0
- package/dist/runtime/playwright-host-runtime-adapter.d.ts +21 -0
- package/dist/runtime/playwright-host-runtime-adapter.js +262 -0
- package/dist/runtime/prepared-runtime-identity.d.ts +3 -0
- package/dist/runtime/prepared-runtime-identity.js +191 -0
- package/dist/runtime/prepared-runtime-readiness.d.ts +22 -0
- package/dist/runtime/prepared-runtime-readiness.js +191 -0
- package/dist/runtime/runtime-isolation-lease.d.ts +67 -0
- package/dist/runtime/runtime-isolation-lease.js +158 -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 +5 -0
- package/dist/sandbox/repository-lock.js +121 -0
- package/dist/sandbox/runtime.d.ts +297 -0
- package/dist/sandbox/runtime.js +2338 -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 +72 -0
- package/dist/session/managed-attempt-tools.d.ts +21 -0
- package/dist/session/managed-attempt-tools.js +912 -0
- package/dist/session/managed-build-coordinator.d.ts +5 -0
- package/dist/session/managed-build-coordinator.js +105 -0
- package/dist/session/managed-build-receipt.d.ts +21 -0
- package/dist/session/managed-build-receipt.js +335 -0
- package/dist/session/phase-completion.artifacts.d.ts +17 -0
- package/dist/session/phase-completion.artifacts.js +256 -26
- package/dist/session/phase-completion.d.ts +12 -2
- package/dist/session/phase-completion.helpers.d.ts +5 -0
- package/dist/session/phase-completion.helpers.js +51 -10
- package/dist/session/phase-completion.js +14 -3
- package/dist/session/phase-completion.prompts.d.ts +3 -3
- package/dist/session/phase-completion.prompts.js +24 -8
- package/dist/session/phase-completion.runtime.d.ts +13 -1
- package/dist/session/phase-completion.runtime.js +189 -8
- package/dist/session/phase-completion.schemas.js +117 -4
- package/dist/session/phase-completion.validation.d.ts +4 -1
- package/dist/session/phase-completion.validation.js +153 -22
- package/dist/session/pre-publication-validation.d.ts +47 -0
- package/dist/session/pre-publication-validation.js +249 -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 +3 -2
- package/dist/session/provider-cli/provider-cli.artifacts.js +65 -7
- package/dist/session/provider-cli/provider-cli.base.d.ts +1 -0
- package/dist/session/provider-cli/provider-cli.deterministic.d.ts +2 -0
- package/dist/session/provider-cli/provider-cli.deterministic.js +68 -9
- package/dist/session/provider-cli/provider-cli.process.d.ts +26 -0
- package/dist/session/provider-cli/provider-cli.process.js +474 -23
- package/dist/session/provider-cli/provider-cli.prompts.d.ts +16 -2
- package/dist/session/provider-cli/provider-cli.prompts.js +224 -24
- package/dist/session/provider-cli/provider-cli.qa-sidecars.js +1 -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 +1 -1
- package/dist/session/provider-cli/provider-cli.runtime.js +6 -3
- package/dist/session/provider-cli/provider-cli.service.d.ts +26 -3
- package/dist/session/provider-cli/provider-cli.service.js +642 -90
- package/dist/session/provider-cli/provider-cli.types.d.ts +5 -0
- package/dist/session/provider-cli/provider-output-state.d.ts +2 -0
- package/dist/session/provider-cli/provider-output-state.js +91 -16
- 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 +38 -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 +531 -42
- package/dist/session/session.types.d.ts +126 -1
- package/dist/session/session.types.js +231 -4
- 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 +14 -0
- package/dist/shared/process/dotnet-toolchain.js +179 -0
- package/dist/shared/process/host-process-recovery.d.ts +12 -0
- package/dist/shared/process/host-process-recovery.js +78 -0
- package/dist/shared/process/host-process-supervisor.d.ts +59 -0
- package/dist/shared/process/host-process-supervisor.js +330 -0
- package/dist/shared/process/process.d.ts +2 -0
- package/dist/shared/process/process.js +11 -6
- package/dist/shared/process/windows-launch.d.ts +1 -1
- package/dist/shared/process/windows-launch.js +6 -3
- package/dist/shared/provider-capabilities.d.ts +1 -0
- package/dist/shared/provider-capabilities.js +3 -0
- package/dist/shared/redaction/redaction.js +16 -4
- 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 +43 -4
- package/dist/worktree/dependency-warmer.d.ts +36 -2
- package/dist/worktree/dependency-warmer.js +347 -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/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 +14 -2
- package/dist/worktree/worktree.service.js +296 -47
- package/dist/worktree/worktree.types.d.ts +5 -1
- package/package.json +8 -4
- package/runtime/windows-job-supervisor.ps1 +444 -0
- package/runtime/windows-listener-owner.ps1 +33 -0
|
@@ -5,22 +5,27 @@ export class NodeProcessRunner {
|
|
|
5
5
|
return await new Promise((resolve, reject) => {
|
|
6
6
|
const child = spawn(request.command, request.args, {
|
|
7
7
|
cwd: request.cwd,
|
|
8
|
+
env: request.env,
|
|
8
9
|
stdio: ["ignore", "pipe", "pipe"]
|
|
9
10
|
});
|
|
10
11
|
let stdout = "";
|
|
11
12
|
let stderr = "";
|
|
12
13
|
child.on("error", reject);
|
|
13
|
-
const stdoutReader = readline.createInterface({ input: child.stdout });
|
|
14
|
-
const stderrReader = readline.createInterface({ input: child.stderr });
|
|
15
|
-
|
|
14
|
+
const stdoutReader = request.rawOutput ? undefined : readline.createInterface({ input: child.stdout });
|
|
15
|
+
const stderrReader = request.rawOutput ? undefined : readline.createInterface({ input: child.stderr });
|
|
16
|
+
if (request.rawOutput) {
|
|
17
|
+
child.stdout.setEncoding("utf8").on("data", chunk => { stdout += chunk; });
|
|
18
|
+
child.stderr.setEncoding("utf8").on("data", chunk => { stderr += chunk; });
|
|
19
|
+
}
|
|
20
|
+
stdoutReader?.on("line", (line) => {
|
|
16
21
|
stdout += `${line}\n`;
|
|
17
22
|
});
|
|
18
|
-
stderrReader
|
|
23
|
+
stderrReader?.on("line", (line) => {
|
|
19
24
|
stderr += `${line}\n`;
|
|
20
25
|
});
|
|
21
26
|
child.on("close", (code) => {
|
|
22
|
-
stdoutReader
|
|
23
|
-
stderrReader
|
|
27
|
+
stdoutReader?.close();
|
|
28
|
+
stderrReader?.close();
|
|
24
29
|
resolve({
|
|
25
30
|
exitCode: code ?? 1,
|
|
26
31
|
stdout,
|
|
@@ -2,7 +2,7 @@ export interface LaunchCommand {
|
|
|
2
2
|
readonly command: string;
|
|
3
3
|
readonly args: readonly string[];
|
|
4
4
|
}
|
|
5
|
-
export declare function buildWindowsCmdLaunch(command: string, args: readonly string[]): LaunchCommand;
|
|
5
|
+
export declare function buildWindowsCmdLaunch(command: string, args: readonly string[], comSpec?: string | undefined): LaunchCommand;
|
|
6
6
|
export declare function buildWindowsLaunchCommand(commandPath: string, args: readonly string[]): LaunchCommand;
|
|
7
7
|
export declare function windowsCommandLine(command: string, args: readonly string[]): string;
|
|
8
8
|
export declare function quoteWindowsCommandLineArg(value: string): string;
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
export function buildWindowsCmdLaunch(command, args) {
|
|
2
|
+
export function buildWindowsCmdLaunch(command, args, comSpec = process.env.ComSpec) {
|
|
3
|
+
const resolvedComSpec = comSpec?.trim();
|
|
4
|
+
const commandLine = windowsCommandLine(command, args);
|
|
5
|
+
const cmdPayload = commandLine.startsWith('"') ? `"${commandLine}"` : commandLine;
|
|
3
6
|
return {
|
|
4
|
-
command:
|
|
5
|
-
args: ["/d", "/s", "/v:off", "/c",
|
|
7
|
+
command: resolvedComSpec || "cmd.exe",
|
|
8
|
+
args: ["/d", "/s", "/v:off", "/c", cmdPayload]
|
|
6
9
|
};
|
|
7
10
|
}
|
|
8
11
|
export function buildWindowsLaunchCommand(commandPath, args) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function supportsDraftImageAttachmentsFor(cliProviders: readonly string[]): boolean;
|
|
@@ -1,17 +1,29 @@
|
|
|
1
1
|
const secretKeyPattern = /(api[_-]?key|authorization|bearer|client[_-]?secret|password|secret|token)/i;
|
|
2
|
+
const attachmentContentKeyPattern = /^(textContent|contentBase64)$/i;
|
|
3
|
+
const serializedAttachmentContentPattern = /("(?:textContent|contentBase64)"\s*:\s*")(?:(?:\\.)|[^"\\])*(")/gi;
|
|
4
|
+
const authorizationCredentialPattern = /(\bauthorization\s*[:=]\s*(?:bearer|basic)?\s*)([^"',\s]+)/gi;
|
|
5
|
+
const bearerCredentialPattern = /(\bbearer\s+)([^"',\s]+)/gi;
|
|
6
|
+
const secretAssignmentPattern = /(api[_-]?key|client[_-]?secret|password|secret|token)(\s*["']?\s*[:=]\s*["']?\s*)([^"',\s]+)/gi;
|
|
7
|
+
// Keep this boundary in parity with Forge.Api's SecretRedactor. Without it, the
|
|
8
|
+
// `sk-` substring in a structural identifier such as `task-skill-contract`
|
|
9
|
+
// is mistaken for a provider credential and corrupts the artifact after it has
|
|
10
|
+
// already passed schema validation.
|
|
11
|
+
const providerKeyPattern = /(?<![a-zA-Z0-9])sk-[a-zA-Z0-9_-]{12,}/g;
|
|
2
12
|
export function redactSecrets(value, exactSecrets = []) {
|
|
3
13
|
return redactValue(value, exactSecrets);
|
|
4
14
|
}
|
|
5
15
|
export function redactText(value, exactSecrets = []) {
|
|
6
|
-
let redacted = value;
|
|
16
|
+
let redacted = value.replace(serializedAttachmentContentPattern, "$1[REDACTED]$2");
|
|
7
17
|
for (const secret of exactSecrets) {
|
|
8
18
|
if (secret.length > 0) {
|
|
9
19
|
redacted = redacted.split(secret).join("[REDACTED]");
|
|
10
20
|
}
|
|
11
21
|
}
|
|
12
22
|
return redacted
|
|
13
|
-
.replace(
|
|
14
|
-
.replace(
|
|
23
|
+
.replace(authorizationCredentialPattern, "$1[REDACTED]")
|
|
24
|
+
.replace(bearerCredentialPattern, "$1[REDACTED]")
|
|
25
|
+
.replace(secretAssignmentPattern, "$1$2[REDACTED]")
|
|
26
|
+
.replace(providerKeyPattern, "[REDACTED]");
|
|
15
27
|
}
|
|
16
28
|
function redactValue(value, exactSecrets) {
|
|
17
29
|
if (typeof value === "string") {
|
|
@@ -25,6 +37,6 @@ function redactValue(value, exactSecrets) {
|
|
|
25
37
|
}
|
|
26
38
|
return Object.fromEntries(Object.entries(value).map(([key, item]) => [
|
|
27
39
|
key,
|
|
28
|
-
secretKeyPattern.test(key) ? "[REDACTED]" : redactValue(item, exactSecrets)
|
|
40
|
+
secretKeyPattern.test(key) || attachmentContentKeyPattern.test(key) ? "[REDACTED]" : redactValue(item, exactSecrets)
|
|
29
41
|
]));
|
|
30
42
|
}
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const forgeBridgeVersion = "0.1.3-dev.
|
|
1
|
+
export declare const forgeBridgeVersion = "0.1.3-dev.9bdea250c8c9";
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const forgeBridgeVersion = "0.1.3-dev.
|
|
1
|
+
export const forgeBridgeVersion = "0.1.3-dev.9bdea250c8c9";
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { DispatchResolvedArtifact } from "../session/session.types.js";
|
|
2
|
-
export declare function injectWorktreeArtifacts(worktreePath: string, artifacts: readonly DispatchResolvedArtifact[]): Promise<void>;
|
|
2
|
+
export declare function injectWorktreeArtifacts(worktreePath: string, artifacts: readonly DispatchResolvedArtifact[], protectedRelativePaths?: ReadonlySet<string>): Promise<void>;
|
|
3
3
|
export declare function filterArtifactsForLane(artifacts: readonly DispatchResolvedArtifact[], lane: string, phase: string): readonly DispatchResolvedArtifact[];
|
|
4
|
-
export declare function writeArtifact(worktreePath: string, artifact: DispatchResolvedArtifact): Promise<void>;
|
|
4
|
+
export declare function writeArtifact(worktreePath: string, artifact: DispatchResolvedArtifact, protectedRelativePaths?: ReadonlySet<string>): Promise<void>;
|
|
5
5
|
export declare function selectLaneCommand(artifacts: readonly DispatchResolvedArtifact[], lane: string, phase: string): DispatchResolvedArtifact | undefined;
|
|
6
6
|
export declare function resolveCommandSlug(lane: string, phase: string): string;
|
|
7
|
+
export declare function artifactExecutionBody(artifact: DispatchResolvedArtifact): string;
|
|
7
8
|
export declare function buildSpecBody(laneCommand: DispatchResolvedArtifact, workItem: {
|
|
8
9
|
readonly id: string;
|
|
9
10
|
readonly title: string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import crypto from "node:crypto";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
2
3
|
import fs from "node:fs/promises";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
const DEBUG_OPERATIONAL_SKILLS = new Set(["debug-repro", "debug-root-cause", "debug-fix", "debug-regression"]);
|
|
@@ -59,9 +60,9 @@ const DRAFT_WORK_ITEM_OPERATIONAL_HOOKS = new Set([
|
|
|
59
60
|
const DRAFT_WORK_ORDER_OPERATIONAL_HOOKS = new Set([
|
|
60
61
|
"draft-work-order-plan"
|
|
61
62
|
]);
|
|
62
|
-
export async function injectWorktreeArtifacts(worktreePath, artifacts) {
|
|
63
|
+
export async function injectWorktreeArtifacts(worktreePath, artifacts, protectedRelativePaths = new Set()) {
|
|
63
64
|
for (const artifact of artifacts) {
|
|
64
|
-
await writeArtifact(worktreePath, artifact);
|
|
65
|
+
await writeArtifact(worktreePath, artifact, protectedRelativePaths);
|
|
65
66
|
}
|
|
66
67
|
}
|
|
67
68
|
export function filterArtifactsForLane(artifacts, lane, phase) {
|
|
@@ -78,7 +79,7 @@ export function filterArtifactsForLane(artifacts, lane, phase) {
|
|
|
78
79
|
}
|
|
79
80
|
return artifacts;
|
|
80
81
|
}
|
|
81
|
-
export async function writeArtifact(worktreePath, artifact) {
|
|
82
|
+
export async function writeArtifact(worktreePath, artifact, protectedRelativePaths = new Set()) {
|
|
82
83
|
const writtenHash = sha256(artifact.body);
|
|
83
84
|
if (writtenHash !== artifact.contentHash.toLowerCase()) {
|
|
84
85
|
throw new Error(`Injected artifact '${artifact.slug}' content_hash mismatch (expected ${artifact.contentHash}, got ${writtenHash}).`);
|
|
@@ -93,6 +94,11 @@ export async function writeArtifact(worktreePath, artifact) {
|
|
|
93
94
|
? path.resolve(scopeDir, slug, "SKILL.md")
|
|
94
95
|
: path.resolve(scopeDir, `${slug}.md`);
|
|
95
96
|
assertInside(forgeRoot, filePath, "Artifact file");
|
|
97
|
+
const relativePath = path.relative(worktreePath, filePath).replaceAll(path.sep, "/");
|
|
98
|
+
if (protectedRelativePaths.has(relativePath)) {
|
|
99
|
+
await restoreTrackedArtifactIfItMatchesManagedBody(worktreePath, filePath, relativePath, artifact);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
96
102
|
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
97
103
|
await fs.writeFile(filePath, artifact.body, "utf8");
|
|
98
104
|
}
|
|
@@ -120,6 +126,39 @@ export function resolveCommandSlug(lane, phase) {
|
|
|
120
126
|
return "dev-prompt";
|
|
121
127
|
}
|
|
122
128
|
}
|
|
129
|
+
async function restoreTrackedArtifactIfItMatchesManagedBody(worktreePath, filePath, relativePath, artifact) {
|
|
130
|
+
const current = await fs.readFile(filePath, "utf8").catch(() => null);
|
|
131
|
+
if (current === null
|
|
132
|
+
|| (current !== artifact.body && current !== artifactExecutionBody(artifact)))
|
|
133
|
+
return;
|
|
134
|
+
const result = await new Promise((resolve) => {
|
|
135
|
+
const child = spawn("git", ["show", `HEAD:${relativePath}`], {
|
|
136
|
+
cwd: worktreePath,
|
|
137
|
+
windowsHide: true,
|
|
138
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
139
|
+
});
|
|
140
|
+
let stdout = "";
|
|
141
|
+
child.stdout?.setEncoding("utf8");
|
|
142
|
+
child.stdout?.on("data", chunk => { stdout += chunk; });
|
|
143
|
+
child.on("error", () => resolve({ exitCode: 1, stdout: "" }));
|
|
144
|
+
child.on("close", code => resolve({ exitCode: code ?? 1, stdout }));
|
|
145
|
+
});
|
|
146
|
+
if (result.exitCode === 0)
|
|
147
|
+
await fs.writeFile(filePath, result.stdout, "utf8");
|
|
148
|
+
}
|
|
149
|
+
export function artifactExecutionBody(artifact) {
|
|
150
|
+
const content = artifact.body;
|
|
151
|
+
if (!content.startsWith("---"))
|
|
152
|
+
return content;
|
|
153
|
+
const end = content.indexOf("\n---", 3);
|
|
154
|
+
if (end < 3)
|
|
155
|
+
return content;
|
|
156
|
+
let bodyStart = end + 4;
|
|
157
|
+
while (bodyStart < content.length && (content[bodyStart] === "\n" || content[bodyStart] === "\r")) {
|
|
158
|
+
bodyStart += 1;
|
|
159
|
+
}
|
|
160
|
+
return content.slice(bodyStart);
|
|
161
|
+
}
|
|
123
162
|
function shouldInjectDebugArtifact(artifact, commandSlug) {
|
|
124
163
|
if (artifact.scope.trim().toLowerCase() !== "operational") {
|
|
125
164
|
return false;
|
|
@@ -192,7 +231,7 @@ function normalizeDraftPhase(phase) {
|
|
|
192
231
|
return phase.trim().toLowerCase().replaceAll("-", "_");
|
|
193
232
|
}
|
|
194
233
|
export function buildSpecBody(laneCommand, workItem, phase = "implementation") {
|
|
195
|
-
const prompt = laneCommand.
|
|
234
|
+
const prompt = artifactExecutionBody(laneCommand).replaceAll("{workItemId}", workItem.id);
|
|
196
235
|
return `---
|
|
197
236
|
work_item_id: ${workItem.id}
|
|
198
237
|
status: approved
|
|
@@ -9,6 +9,13 @@ export interface WarmDependenciesRequest {
|
|
|
9
9
|
readonly worktreePath: string;
|
|
10
10
|
readonly allowedRoot: string;
|
|
11
11
|
readonly warmPathOverrides?: readonly string[];
|
|
12
|
+
readonly preparationPolicy?: DependencyPreparationPolicy;
|
|
13
|
+
}
|
|
14
|
+
export interface DependencyPreparationPolicy {
|
|
15
|
+
readonly isolation?: string;
|
|
16
|
+
readonly trustDomain?: string;
|
|
17
|
+
readonly invalidationEpoch?: string;
|
|
18
|
+
readonly toolchainVersions?: Readonly<Partial<Record<DependencyEcosystem | "npm" | "pnpm", string>>>;
|
|
12
19
|
}
|
|
13
20
|
export interface InstallFallbackResult {
|
|
14
21
|
readonly ecosystem: DependencyEcosystem;
|
|
@@ -20,9 +27,23 @@ export interface WarmDependenciesResult {
|
|
|
20
27
|
readonly linked: readonly string[];
|
|
21
28
|
readonly skipped: readonly string[];
|
|
22
29
|
readonly fallbacks: readonly InstallFallbackResult[];
|
|
30
|
+
readonly receipts: readonly DependencyPreparationReceiptResult[];
|
|
31
|
+
}
|
|
32
|
+
export interface DependencyPreparationReceiptResult {
|
|
33
|
+
readonly ecosystem: DependencyEcosystem;
|
|
34
|
+
readonly packageRoot: string;
|
|
35
|
+
readonly command: string;
|
|
36
|
+
readonly cacheHit: boolean;
|
|
37
|
+
readonly fingerprint: string;
|
|
38
|
+
readonly receiptPath: string;
|
|
39
|
+
/** End-to-end receipt lookup/preparation time, including coordinator wait. */
|
|
40
|
+
readonly durationMs: number;
|
|
23
41
|
}
|
|
24
42
|
export interface CommandExecutor {
|
|
25
|
-
run(cwd: string, command: string, args: readonly string[]): Promise<void>;
|
|
43
|
+
run(cwd: string, command: string, args: readonly string[], options?: CommandExecutionOptions): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
export interface CommandExecutionOptions {
|
|
46
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
26
47
|
}
|
|
27
48
|
export declare function detectWarmPaths(repoRoot: string, warmPathOverrides?: readonly string[]): Promise<WarmPathEntry[]>;
|
|
28
49
|
export declare function warmWorktreeDependencies(request: WarmDependenciesRequest, executor?: CommandExecutor): Promise<WarmDependenciesResult>;
|
|
@@ -30,7 +51,20 @@ export declare function createDirectoryLink(sourcePath: string, targetPath: stri
|
|
|
30
51
|
export declare function lockfilesDiffer(baseCheckoutPath: string, worktreePath: string, packageRootRelative: string): Promise<boolean>;
|
|
31
52
|
export declare function requiresInstallFallback(entry: WarmPathEntry, baseCheckoutPath: string, worktreePath: string, sourceExists: boolean): Promise<string | null>;
|
|
32
53
|
export declare function declaresNativeModules(packageRootPath: string): Promise<boolean>;
|
|
33
|
-
export
|
|
54
|
+
export interface NpmLaunchOptions {
|
|
55
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
56
|
+
readonly execPath?: string;
|
|
57
|
+
readonly platform?: NodeJS.Platform;
|
|
58
|
+
readonly homeDir?: string;
|
|
59
|
+
readonly candidates?: readonly string[];
|
|
60
|
+
}
|
|
61
|
+
export declare function resolveNpmLaunch(args: readonly string[], options?: NpmLaunchOptions): {
|
|
62
|
+
command: string;
|
|
63
|
+
args: readonly string[];
|
|
64
|
+
};
|
|
65
|
+
export declare function resolvePnpmLaunch(args: readonly string[]): {
|
|
34
66
|
command: string;
|
|
35
67
|
args: readonly string[];
|
|
36
68
|
};
|
|
69
|
+
export declare function formatCommandFailureOutput(stdout: string, stderr: string): string;
|
|
70
|
+
export declare function unattendedPackageManagerEnvironment(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|