@post-print/agent-harness 2.0.8 → 2.0.10
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 +3 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/process-owner.d.ts +8 -0
- package/dist/process-owner.d.ts.map +1 -0
- package/dist/process-owner.js +26 -0
- package/dist/process-owner.js.map +1 -0
- package/dist/sealed-storage.d.ts +11 -0
- package/dist/sealed-storage.d.ts.map +1 -0
- package/dist/sealed-storage.js +71 -0
- package/dist/sealed-storage.js.map +1 -0
- package/dist/sealed-workspace.d.ts +1 -1
- package/dist/sealed-workspace.d.ts.map +1 -1
- package/dist/sealed-workspace.js +20 -20
- package/dist/sealed-workspace.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @post-print/agent-harness
|
|
2
2
|
|
|
3
3
|
<!-- source-of-truth: configured agent definitions and isolated harness sessions -->
|
|
4
|
-
<!-- doc-meta: owner=eng | last-reviewed=2026-
|
|
4
|
+
<!-- doc-meta: owner=eng | last-reviewed=2026-10-01 -->
|
|
5
5
|
<!-- review-deps: paths=packages/harness/src/*.ts,packages/harness/src/**/*.ts,packages/harness/package.json -->
|
|
6
6
|
|
|
7
7
|
Configure coding agents for agent-test. Definitions are reusable; each task session owns an isolated worker and host runtime.
|
|
@@ -25,3 +25,5 @@ Built-in runs default to a ten-minute deadline. A finite positive `timeoutMs` ov
|
|
|
25
25
|
Factories do not launch agents. Agent-test prepares workspaces, installs attached skills, supplies context, creates sessions, and guarantees cleanup. Custom adapters use `defineAgent()` and `customAgent()`; see [the SDK guide](../../docs/sdk-v2.md#custom-agents).
|
|
26
26
|
|
|
27
27
|
Built-in continuation currently reconstructs prior conversation. Cursor does not yet support enforced read-only judge sessions; use OpenAI or Claude as the judge. ACP is not introduced by this change.
|
|
28
|
+
|
|
29
|
+
`createSealedWorkspace` returns a temporary `workspace/` plus idempotent cleanup. A manifest outside that working tree allows startup recovery of expired dead-owner roots. Orchestrators can call `recoverSealedWorkspaces({ temporaryRoot?, minimumAgeMs? })`; see [storage ownership](../../docs/isolation.md#storage-ownership-and-retention) for active-run protection and the 24-hour default grace period.
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export { createAgentSession, HarnessSession } from "./agent-session.js";
|
|
|
4
4
|
export { resolvedTotalTokens } from "./capture.js";
|
|
5
5
|
export { loginCursorSdk } from "./cursor-auth.js";
|
|
6
6
|
export { resolveOpenaiBin } from "./openai-run.js";
|
|
7
|
+
export { ownerIsActive, ProcessOwner, processOwner } from "./process-owner.js";
|
|
8
|
+
export { recoverSealedWorkspaces } from "./sealed-storage.js";
|
|
7
9
|
export { createSealedWorkspace, SealedWorkspace, toolPathsOutsideWorkspace, } from "./sealed-workspace.js";
|
|
8
10
|
export { AgentHost, AgentMessage, AgentToolCall, AgentTrace, AgentUsage, ContextMode, ContextProfile, McpServerConfig, SkillContextSetting, } from "./types.js";
|
|
9
11
|
export { buildScenarioUsageBreakdown, ScenarioUsageBreakdown, sumUsageParts, } from "./usage-breakdown.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,cAAc,EACd,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,YAAY,EACZ,MAAM,EACN,MAAM,EACN,WAAW,EACX,wBAAwB,EACxB,WAAW,EACX,sBAAsB,EACtB,MAAM,EACN,UAAU,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,yBAAyB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,SAAS,EACT,YAAY,EACZ,aAAa,EACb,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,eAAe,EACf,mBAAmB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,2BAA2B,EAC3B,sBAAsB,EACtB,aAAa,GACb,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,cAAc,EACd,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,YAAY,EACZ,MAAM,EACN,MAAM,EACN,WAAW,EACX,wBAAwB,EACxB,WAAW,EACX,sBAAsB,EACtB,MAAM,EACN,UAAU,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,yBAAyB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,SAAS,EACT,YAAY,EACZ,aAAa,EACb,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,eAAe,EACf,mBAAmB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,2BAA2B,EAC3B,sBAAsB,EACtB,aAAa,GACb,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,8 @@ export { createAgentSession } from "./agent-session.js";
|
|
|
4
4
|
export { resolvedTotalTokens } from "./capture.js";
|
|
5
5
|
export { loginCursorSdk } from "./cursor-auth.js";
|
|
6
6
|
export { resolveOpenaiBin } from "./openai-run.js";
|
|
7
|
+
export { ownerIsActive, processOwner } from "./process-owner.js";
|
|
8
|
+
export { recoverSealedWorkspaces } from "./sealed-storage.js";
|
|
7
9
|
export { createSealedWorkspace, toolPathsOutsideWorkspace, } from "./sealed-workspace.js";
|
|
8
10
|
export { buildScenarioUsageBreakdown, sumUsageParts, } from "./usage-breakdown.js";
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EASN,MAAM,EACN,MAAM,EACN,WAAW,EACX,wBAAwB,EACxB,WAAW,EAEX,MAAM,EACN,UAAU,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEN,wBAAwB,GAExB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAkB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACN,qBAAqB,EAErB,yBAAyB,GACzB,MAAM,uBAAuB,CAAC;AAY/B,OAAO,EACN,2BAA2B,EAE3B,aAAa,GACb,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EASN,MAAM,EACN,MAAM,EACN,WAAW,EACX,wBAAwB,EACxB,WAAW,EAEX,MAAM,EACN,UAAU,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEN,wBAAwB,GAExB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAkB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAgB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACN,qBAAqB,EAErB,yBAAyB,GACzB,MAAM,uBAAuB,CAAC;AAY/B,OAAO,EACN,2BAA2B,EAE3B,aAAa,GACb,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ProcessOwner {
|
|
2
|
+
pid: number;
|
|
3
|
+
startedAt?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function processOwner(pid?: number): Promise<ProcessOwner>;
|
|
6
|
+
/** Unknown identity or permission failures protect storage conservatively. */
|
|
7
|
+
export declare function ownerIsActive(owner: ProcessOwner): Promise<boolean>;
|
|
8
|
+
//# sourceMappingURL=process-owner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-owner.d.ts","sourceRoot":"","sources":["../src/process-owner.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,YAAY,CAAC,GAAG,SAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAO3E;AAED,8EAA8E;AAC9E,wBAAsB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CASzE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
export async function processOwner(pid = process.pid) {
|
|
5
|
+
try {
|
|
6
|
+
const { stdout } = await execFileAsync("ps", ["-p", String(pid), "-o", "lstart="]);
|
|
7
|
+
return { pid, startedAt: stdout.trim() || undefined };
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return { pid };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** Unknown identity or permission failures protect storage conservatively. */
|
|
14
|
+
export async function ownerIsActive(owner) {
|
|
15
|
+
try {
|
|
16
|
+
process.kill(owner.pid, 0);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return error.code !== "ESRCH";
|
|
20
|
+
}
|
|
21
|
+
if (!owner.startedAt)
|
|
22
|
+
return true;
|
|
23
|
+
const current = await processOwner(owner.pid);
|
|
24
|
+
return !current.startedAt || current.startedAt === owner.startedAt;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=process-owner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-owner.js","sourceRoot":"","sources":["../src/process-owner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAM1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG;IACnD,IAAI,CAAC;QACJ,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;QACnF,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,GAAG,EAAE,CAAC;IAChB,CAAC;AACF,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAmB;IACtD,IAAI,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAQ,KAA+B,CAAC,IAAI,KAAK,OAAO,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const SEALED_WORKSPACE_DIR_PREFIX = "agent-harness-seal-";
|
|
2
|
+
/** Only versioned harness-owned roots are swept; legacy/unrecognized roots are preserved. */
|
|
3
|
+
export declare function recoverSealedWorkspaces(options?: {
|
|
4
|
+
temporaryRoot?: string;
|
|
5
|
+
minimumAgeMs?: number;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
export declare function allocateSealedWorkspace(callerCwd: string): Promise<{
|
|
8
|
+
path: string;
|
|
9
|
+
cleanup: () => Promise<void>;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=sealed-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sealed-storage.d.ts","sourceRoot":"","sources":["../src/sealed-storage.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,2BAA2B,wBAAwB,CAAC;AAUjE,6FAA6F;AAC7F,wBAAsB,uBAAuB,CAC5C,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,OAAO,CAAC,IAAI,CAAC,CAYf;AA4BD,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM;;;GAmB9D"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { mkdir, mkdtemp, readdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { ownerIsActive, processOwner } from "./process-owner.js";
|
|
5
|
+
export const SEALED_WORKSPACE_DIR_PREFIX = "agent-harness-seal-";
|
|
6
|
+
const MANIFEST = "owner.json";
|
|
7
|
+
/** Only versioned harness-owned roots are swept; legacy/unrecognized roots are preserved. */
|
|
8
|
+
export async function recoverSealedWorkspaces(options = {}) {
|
|
9
|
+
const root = options.temporaryRoot ?? tmpdir();
|
|
10
|
+
const minimumAgeMs = options.minimumAgeMs ?? 24 * 60 * 60 * 1000;
|
|
11
|
+
validateAge(minimumAgeMs);
|
|
12
|
+
for (const entry of await readdir(root, { withFileTypes: true })) {
|
|
13
|
+
if (!isSealedRoot(entry))
|
|
14
|
+
continue;
|
|
15
|
+
const path = join(root, entry.name);
|
|
16
|
+
const manifest = await readManifest(path);
|
|
17
|
+
if (!manifest)
|
|
18
|
+
continue;
|
|
19
|
+
if (!(await canRecover(manifest, minimumAgeMs)))
|
|
20
|
+
continue;
|
|
21
|
+
await rm(path, { recursive: true, force: true });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function validateAge(age) {
|
|
25
|
+
if (!Number.isFinite(age) || age < 0)
|
|
26
|
+
throw new Error("minimumAgeMs must be nonnegative");
|
|
27
|
+
}
|
|
28
|
+
async function canRecover(manifest, minimumAgeMs) {
|
|
29
|
+
return (Date.now() - Date.parse(manifest.createdAt) >= minimumAgeMs &&
|
|
30
|
+
!(await ownerIsActive(manifest.owner)));
|
|
31
|
+
}
|
|
32
|
+
function isSealedRoot(entry) {
|
|
33
|
+
return entry.isDirectory() && entry.name.startsWith(SEALED_WORKSPACE_DIR_PREFIX);
|
|
34
|
+
}
|
|
35
|
+
async function readManifest(root) {
|
|
36
|
+
try {
|
|
37
|
+
const value = JSON.parse(await readFile(join(root, MANIFEST), "utf8"));
|
|
38
|
+
if (value.version !== 1 || value.kind !== "agent-harness-sealed-workspace")
|
|
39
|
+
return;
|
|
40
|
+
if (!Number.isInteger(value.owner?.pid) || value.owner.pid <= 0)
|
|
41
|
+
return;
|
|
42
|
+
if (!Number.isFinite(Date.parse(value.createdAt)))
|
|
43
|
+
return;
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function allocateSealedWorkspace(callerCwd) {
|
|
51
|
+
await recoverSealedWorkspaces();
|
|
52
|
+
const root = await mkdtemp(join(tmpdir(), SEALED_WORKSPACE_DIR_PREFIX));
|
|
53
|
+
try {
|
|
54
|
+
const manifest = {
|
|
55
|
+
version: 1,
|
|
56
|
+
kind: "agent-harness-sealed-workspace",
|
|
57
|
+
callerCwd: resolve(callerCwd),
|
|
58
|
+
createdAt: new Date().toISOString(),
|
|
59
|
+
owner: await processOwner(),
|
|
60
|
+
};
|
|
61
|
+
await writeFile(join(root, MANIFEST), JSON.stringify(manifest));
|
|
62
|
+
const path = join(root, "workspace");
|
|
63
|
+
await mkdir(path);
|
|
64
|
+
return { path, cleanup: () => rm(root, { recursive: true, force: true }) };
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
await rm(root, { recursive: true, force: true });
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=sealed-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sealed-storage.js","sourceRoot":"","sources":["../src/sealed-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AgentTrace } from "./types.js";
|
|
2
|
-
export
|
|
2
|
+
export { SEALED_WORKSPACE_DIR_PREFIX } from "./sealed-storage.js";
|
|
3
3
|
export interface SealedWorkspace {
|
|
4
4
|
path: string;
|
|
5
5
|
cleanup: () => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sealed-workspace.d.ts","sourceRoot":"","sources":["../src/sealed-workspace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sealed-workspace.d.ts","sourceRoot":"","sources":["../src/sealed-workspace.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAIlE,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,4BAA4B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,uBAAuB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,uBAAuB,CAyB5E;AAqDD,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAc3F;AAcD,mFAAmF;AACnF,wBAAsB,qBAAqB,CAC1C,OAAO,EAAE,4BAA4B,GACnC,OAAO,CAAC,eAAe,CAAC,CAY1B;AA0DD,4DAA4D;AAC5D,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAc5F"}
|
package/dist/sealed-workspace.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
|
-
import { cp, mkdir,
|
|
3
|
-
import { tmpdir } from "node:os";
|
|
2
|
+
import { cp, mkdir, rm } from "node:fs/promises";
|
|
4
3
|
import { dirname, isAbsolute, join, resolve, sep } from "node:path";
|
|
5
4
|
import { promisify } from "node:util";
|
|
6
5
|
import { SKILL_ROOTS, skillOverlayRelPath } from "./skills-context.js";
|
|
@@ -10,7 +9,8 @@ const RELATIVE_PREFIX = /^\.\//;
|
|
|
10
9
|
const FILE_PROTOCOL = /^file:\/\//;
|
|
11
10
|
const TRAILING_PUNCTUATION = /[,:]+$/;
|
|
12
11
|
const execFileAsync = promisify(execFile);
|
|
13
|
-
export
|
|
12
|
+
export { SEALED_WORKSPACE_DIR_PREFIX } from "./sealed-storage.js";
|
|
13
|
+
import { allocateSealedWorkspace } from "./sealed-storage.js";
|
|
14
14
|
/**
|
|
15
15
|
* Parse `workspace`. `undefined`, empty, and `"."` mean caller HEAD.
|
|
16
16
|
* Subfolder paths must stay repo-relative and must not contain `..`.
|
|
@@ -116,28 +116,28 @@ async function initNestedGit(dest) {
|
|
|
116
116
|
}
|
|
117
117
|
/** Copy HEAD plus caller context into a temp folder the agent should not leave. */
|
|
118
118
|
export async function createSealedWorkspace(options) {
|
|
119
|
-
const dest = await mkdtemp(join(tmpdir(), SEALED_WORKSPACE_DIR_PREFIX));
|
|
120
119
|
const parsed = parseScenarioWorkspace(options.workspace);
|
|
121
|
-
if (!parsed.ok)
|
|
122
|
-
await rm(dest, { recursive: true, force: true });
|
|
120
|
+
if (!parsed.ok)
|
|
123
121
|
throw new Error(parsed.message);
|
|
122
|
+
const sealed = await allocateSealedWorkspace(options.callerCwd);
|
|
123
|
+
try {
|
|
124
|
+
await materializeSealedWorkspace(options, parsed.rel, sealed.path);
|
|
125
|
+
await initNestedGit(sealed.path);
|
|
126
|
+
return sealed;
|
|
124
127
|
}
|
|
125
|
-
|
|
126
|
-
await
|
|
128
|
+
catch (error) {
|
|
129
|
+
await sealed.cleanup();
|
|
130
|
+
throw error;
|
|
127
131
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
132
|
+
}
|
|
133
|
+
async function materializeSealedWorkspace(options, workspaceRel, dest) {
|
|
134
|
+
if (workspaceRel) {
|
|
135
|
+
await materializeWorkspaceFolder(options.callerCwd, workspaceRel, dest);
|
|
136
|
+
return;
|
|
133
137
|
}
|
|
134
|
-
await
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
cleanup: async () => {
|
|
138
|
-
await rm(dest, { recursive: true, force: true });
|
|
139
|
-
},
|
|
140
|
-
};
|
|
138
|
+
await materializeGitHead(options.callerCwd, dest);
|
|
139
|
+
for (const rel of options.overlayPaths ?? [])
|
|
140
|
+
await overlayPath(options.callerCwd, dest, rel);
|
|
141
141
|
}
|
|
142
142
|
function candidatePathsFromArgs(args) {
|
|
143
143
|
if (!args) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sealed-workspace.js","sourceRoot":"","sources":["../src/sealed-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"sealed-workspace.js","sourceRoot":"","sources":["../src/sealed-workspace.ts"],"names":[],"mappings":"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"}
|