@claudexor/workspace 4.6.1 → 4.7.0

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.
@@ -0,0 +1,22 @@
1
+ export type AuxiliaryWritableRootRejection = "filesystem_root" | "home" | "engine_state" | "execution_tree" | "source_project" | "git_metadata";
2
+ export interface AuxiliaryWritableRootsContext {
3
+ /** Stable project (source) root. */
4
+ repoRoot: string;
5
+ /** Tree the harness executes in; the project root for envelope runs at admission time. */
6
+ executionRoot: string;
7
+ /** Configured credential-profile homes the engine owns (isolation locators). */
8
+ credentialHomes?: readonly string[];
9
+ }
10
+ /** Spelling-only admission for a boundary that defers the mutable existence fact. */
11
+ export declare function assertAuxiliaryWritableRootSpelling(root: string): void;
12
+ /** The canonical (realpath) directory a caller-spelled root names, or a typed refusal. */
13
+ export declare function auxiliaryWritableRootDirectory(root: string): string;
14
+ /**
15
+ * The run's canonical auxiliary grant: every caller-spelled root resolved to
16
+ * an existing directory, deduplicated, and refused when it would widen access
17
+ * to the filesystem root, HOME itself, Claudexor's own state, the execution
18
+ * tree or the source project, or their Git metadata. Omission and [] grant
19
+ * nothing.
20
+ */
21
+ export declare function admitAuxiliaryWritableRoots(roots: readonly string[] | undefined, ctx: AuxiliaryWritableRootsContext): string[];
22
+ //# sourceMappingURL=auxiliary-writable-roots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auxiliary-writable-roots.d.ts","sourceRoot":"","sources":["../src/auxiliary-writable-roots.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,8BAA8B,GACtC,iBAAiB,GACjB,MAAM,GACN,cAAc,GACd,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,CAAC;AAWnB,MAAM,WAAW,6BAA6B;IAC5C,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,aAAa,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AA+CD,qFAAqF;AACrF,wBAAgB,mCAAmC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEtE;AAiCD,0FAA0F;AAC1F,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAInE;AA0CD;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACpC,GAAG,EAAE,6BAA6B,GACjC,MAAM,EAAE,CAyBV"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Admission of `execution.auxiliaryWritableRoots`: exact caller-created service
3
+ * directories (download caches, outside-Git scratch) a writable Agent lane may
4
+ * also write. One owner for the filesystem rules, shared by the HTTP boundary
5
+ * (cheap shape/existence checks) and the engine's run admission (the complete
6
+ * canonical grant). Nothing here creates, cleans, or inventories directories.
7
+ */
8
+ import { accessSync, constants, readFileSync, realpathSync, statSync } from "node:fs";
9
+ import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
10
+ import { canonicalProjectRoot, claudexorOwnedRoot, userHomeDir } from "@claudexor/util";
11
+ const REJECTION_TEXT = {
12
+ filesystem_root: "is a filesystem root",
13
+ home: "is the user home directory or one of its ancestors",
14
+ engine_state: "overlaps Claudexor's own control or credential state",
15
+ execution_tree: "overlaps the execution tree",
16
+ source_project: "overlaps the source project",
17
+ git_metadata: "overlaps Git metadata of the project or execution tree",
18
+ };
19
+ /** Missing future state directories have no identity yet; other read failures stay visible. */
20
+ function directoryIdentity(path) {
21
+ try {
22
+ const stat = statSync(path, { bigint: true });
23
+ return stat.isDirectory() && stat.ino !== 0n ? `${stat.dev}:${stat.ino}` : null;
24
+ }
25
+ catch (error) {
26
+ const code = error.code;
27
+ if (code === "ENOENT" || code === "ENOTDIR")
28
+ return null;
29
+ throw invalid(path, `cannot inspect directory identity (${code ?? "unreadable"})`, true);
30
+ }
31
+ }
32
+ /** `inner` is `outer` or lies below it, including aliases realpath leaves distinct. */
33
+ function within(outer, inner) {
34
+ const rel = relative(outer, inner);
35
+ if (rel === "" || (!isAbsolute(rel) && rel !== ".." && !rel.startsWith(`..${sep}`)))
36
+ return true;
37
+ // macOS firmlinks preserve two realpath spellings for the same directory.
38
+ // Compare only this ancestry's identities, never scan directory contents.
39
+ const id = directoryIdentity(outer);
40
+ if (id === null)
41
+ return false;
42
+ for (let parent = inner;; parent = dirname(parent)) {
43
+ if (directoryIdentity(parent) === id)
44
+ return true;
45
+ if (dirname(parent) === parent)
46
+ return false;
47
+ }
48
+ }
49
+ function overlaps(a, b) {
50
+ return within(a, b) || within(b, a);
51
+ }
52
+ function invalid(root, detail, retryable) {
53
+ return Object.assign(new Error(`execution.auxiliaryWritableRoots entry ${JSON.stringify(root)} ${detail}`), {
54
+ status: 400,
55
+ code: "auxiliary_writable_root_invalid",
56
+ retryable,
57
+ requiredActions: [
58
+ "Create the directory yourself and pass its absolute path (the engine never provisions it), or remove the grant. For continueFrom, POST /v2/runs with a complete replacement execution group and auxiliaryWritableRoots: []; claudexor_run_continue inherits execution, so use HTTP or start a new run.",
59
+ ],
60
+ context: { root },
61
+ });
62
+ }
63
+ /** Spelling-only admission for a boundary that defers the mutable existence fact. */
64
+ export function assertAuxiliaryWritableRootSpelling(root) {
65
+ if (!isAbsolute(root))
66
+ throw invalid(root, "is not an absolute path", false);
67
+ }
68
+ function canonicalDirectory(root) {
69
+ assertAuxiliaryWritableRootSpelling(root);
70
+ let real;
71
+ try {
72
+ real = realpathSync.native(root);
73
+ }
74
+ catch (error) {
75
+ const code = error.code ?? "unreadable";
76
+ throw invalid(root, code === "ENOENT" ? "does not exist" : `cannot be resolved (${code})`, true);
77
+ }
78
+ let directory = false;
79
+ try {
80
+ directory = statSync(real).isDirectory();
81
+ }
82
+ catch {
83
+ // Raced away or unreadable: refused below like any non-directory.
84
+ }
85
+ if (!directory)
86
+ throw invalid(root, "is not a directory", true);
87
+ return real;
88
+ }
89
+ function assertUsable(root, real) {
90
+ try {
91
+ accessSync(real, constants.R_OK | constants.W_OK | constants.X_OK);
92
+ }
93
+ catch {
94
+ throw invalid(root, "is not readable and writable by the engine user", true);
95
+ }
96
+ }
97
+ /** The canonical (realpath) directory a caller-spelled root names, or a typed refusal. */
98
+ export function auxiliaryWritableRootDirectory(root) {
99
+ const real = canonicalDirectory(root);
100
+ assertUsable(root, real);
101
+ return real;
102
+ }
103
+ /** Git metadata a tree's `.git` names: the directory itself, or a worktree's gitdir and common dir. */
104
+ function gitMetadataDirs(tree) {
105
+ const dotGit = join(tree, ".git");
106
+ try {
107
+ const stat = statSync(dotGit);
108
+ if (stat.isDirectory())
109
+ return [canonicalProjectRoot(dotGit)];
110
+ if (!stat.isFile())
111
+ return [];
112
+ const pointer = /^gitdir:\s*(.+)$/m.exec(readFileSync(dotGit, "utf8"))?.[1]?.trim();
113
+ if (!pointer)
114
+ return [];
115
+ const gitDir = canonicalProjectRoot(resolve(tree, pointer));
116
+ try {
117
+ const common = readFileSync(join(gitDir, "commondir"), "utf8").trim();
118
+ return common ? [gitDir, canonicalProjectRoot(resolve(gitDir, common))] : [gitDir];
119
+ }
120
+ catch {
121
+ return [gitDir];
122
+ }
123
+ }
124
+ catch {
125
+ return [];
126
+ }
127
+ }
128
+ function rejection(real, ctx) {
129
+ if (dirname(real) === real)
130
+ return "filesystem_root";
131
+ if (within(real, canonicalProjectRoot(userHomeDir())))
132
+ return "home";
133
+ const engineHomes = [claudexorOwnedRoot(), ...(ctx.credentialHomes ?? [])];
134
+ if (engineHomes.some((home) => overlaps(real, canonicalProjectRoot(home))))
135
+ return "engine_state";
136
+ const executionRoot = canonicalProjectRoot(ctx.executionRoot);
137
+ const projectRoot = canonicalProjectRoot(ctx.repoRoot);
138
+ // Service side effects must not enter the project's capture/apply footprint,
139
+ // even when a descendant already happens to be writable in a live run.
140
+ if (overlaps(real, executionRoot))
141
+ return "execution_tree";
142
+ if (overlaps(real, projectRoot))
143
+ return "source_project";
144
+ const gitDirs = [...gitMetadataDirs(executionRoot), ...gitMetadataDirs(projectRoot)];
145
+ if (gitDirs.some((gitDir) => overlaps(real, gitDir)))
146
+ return "git_metadata";
147
+ return null;
148
+ }
149
+ /**
150
+ * The run's canonical auxiliary grant: every caller-spelled root resolved to
151
+ * an existing directory, deduplicated, and refused when it would widen access
152
+ * to the filesystem root, HOME itself, Claudexor's own state, the execution
153
+ * tree or the source project, or their Git metadata. Omission and [] grant
154
+ * nothing.
155
+ */
156
+ export function admitAuxiliaryWritableRoots(roots, ctx) {
157
+ const granted = [];
158
+ for (const root of roots ?? []) {
159
+ const real = canonicalDirectory(root);
160
+ const reason = rejection(real, ctx);
161
+ if (reason) {
162
+ throw Object.assign(new Error(`execution.auxiliaryWritableRoots entry ${JSON.stringify(root)} (${real}) ${REJECTION_TEXT[reason]}`), {
163
+ status: 400,
164
+ code: "auxiliary_writable_root_unsafe",
165
+ retryable: false,
166
+ requiredActions: [
167
+ "Grant a dedicated service directory outside the project, the execution tree, their Git metadata, HOME itself, and Claudexor's own state. For continueFrom, replace the complete execution group through POST /v2/runs (auxiliaryWritableRoots: [] clears it), or start a new run; claudexor_run_continue inherits execution.",
168
+ ],
169
+ context: { root, canonicalRoot: real, reason },
170
+ });
171
+ }
172
+ assertUsable(root, real);
173
+ if (!granted.includes(real))
174
+ granted.push(real);
175
+ }
176
+ return granted;
177
+ }
178
+ //# sourceMappingURL=auxiliary-writable-roots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auxiliary-writable-roots.js","sourceRoot":"","sources":["../src/auxiliary-writable-roots.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -15,5 +15,6 @@ export * from "./directory-workspace.js";
15
15
  export * from "./files-io.js";
16
16
  export * from "./files-apply.js";
17
17
  export * from "./continuation-sources.js";
18
+ export * from "./auxiliary-writable-roots.js";
18
19
  export { readContinuationEvidence, readSessionCapsule, runFilesExpired, } from "./continuation-evidence.js";
19
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAE1C,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GAChB,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAE9C,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GAChB,MAAM,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -15,5 +15,6 @@ export * from "./directory-workspace.js";
15
15
  export * from "./files-io.js";
16
16
  export * from "./files-apply.js";
17
17
  export * from "./continuation-sources.js";
18
+ export * from "./auxiliary-writable-roots.js";
18
19
  export { readContinuationEvidence, readSessionCapsule, runFilesExpired, } from "./continuation-evidence.js";
19
20
  //# 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,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAE1C,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GAChB,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAE9C,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GAChB,MAAM,4BAA4B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claudexor/workspace",
3
- "version": "4.6.1",
3
+ "version": "4.7.0",
4
4
  "license": "MIT",
5
5
  "description": "WorkspaceEnvelope manager: git worktree + scoped HOME/harness-config isolation + dirty policy.",
6
6
  "type": "module",
@@ -17,10 +17,10 @@
17
17
  ],
18
18
  "dependencies": {
19
19
  "yaml": "^2.9.1",
20
- "@claudexor/schema": "4.6.1",
21
- "@claudexor/util": "4.6.1",
22
- "@claudexor/event-log": "4.6.1",
23
- "@claudexor/core": "4.6.1"
20
+ "@claudexor/core": "4.7.0",
21
+ "@claudexor/schema": "4.7.0",
22
+ "@claudexor/util": "4.7.0",
23
+ "@claudexor/event-log": "4.7.0"
24
24
  },
25
25
  "repository": {
26
26
  "type": "git",