@shapeshift-labs/frontier-swarm-codex 0.5.122 → 0.5.124
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apply.d.ts.map +1 -1
- package/dist/apply.js +10 -248
- package/dist/apply.js.map +1 -1
- package/dist/artifact-store.js +1 -1
- package/dist/artifact-store.js.map +1 -1
- package/dist/cli-args.d.ts +2 -2
- package/dist/codex-workspace-changes.d.ts +6 -17
- package/dist/codex-workspace-changes.d.ts.map +1 -1
- package/dist/codex-workspace-changes.js +13 -82
- package/dist/codex-workspace-changes.js.map +1 -1
- package/dist/codex-workspace.d.ts +3 -3
- package/dist/codex-workspace.d.ts.map +1 -1
- package/dist/codex-workspace.js +16 -241
- package/dist/codex-workspace.js.map +1 -1
- package/dist/collect-bundle-staleness.d.ts.map +1 -1
- package/dist/collect-bundle-staleness.js +18 -15
- package/dist/collect-bundle-staleness.js.map +1 -1
- package/dist/collect-finalize.d.ts.map +1 -1
- package/dist/collect-finalize.js +1 -4
- package/dist/collect-finalize.js.map +1 -1
- package/dist/collect-workspace-proof.js +2 -2
- package/dist/collect-workspace-proof.js.map +1 -1
- package/dist/common.d.ts +0 -7
- package/dist/common.d.ts.map +1 -1
- package/dist/common.js +0 -15
- package/dist/common.js.map +1 -1
- package/dist/score.d.ts.map +1 -1
- package/dist/score.js +16 -10
- package/dist/score.js.map +1 -1
- package/dist/semantic-import-base.d.ts.map +1 -1
- package/dist/semantic-import-base.js +12 -15
- package/dist/semantic-import-base.js.map +1 -1
- package/dist/types-apply-lease.d.ts +2 -25
- package/dist/types-apply-lease.d.ts.map +1 -1
- package/dist/types-collection.d.ts +4 -6
- package/dist/types-collection.d.ts.map +1 -1
- package/dist/types-workspace.d.ts +12 -126
- package/dist/types-workspace.d.ts.map +1 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/workspace-link-repair.d.ts.map +1 -1
- package/dist/workspace-link-repair.js +2 -161
- package/dist/workspace-link-repair.js.map +1 -1
- package/package.json +3 -2
- package/dist/codex-workspace-change-paths.d.ts +0 -20
- package/dist/codex-workspace-change-paths.d.ts.map +0 -1
- package/dist/codex-workspace-change-paths.js +0 -215
- package/dist/codex-workspace-change-paths.js.map +0 -1
- package/dist/codex-workspace-restore.d.ts +0 -15
- package/dist/codex-workspace-restore.d.ts.map +0 -1
- package/dist/codex-workspace-restore.js +0 -66
- package/dist/codex-workspace-restore.js.map +0 -1
- package/dist/codex-workspace-write-fence.d.ts +0 -21
- package/dist/codex-workspace-write-fence.d.ts.map +0 -1
- package/dist/codex-workspace-write-fence.js +0 -155
- package/dist/codex-workspace-write-fence.js.map +0 -1
- package/dist/collect-run-graph.d.ts +0 -7
- package/dist/collect-run-graph.d.ts.map +0 -1
- package/dist/collect-run-graph.js +0 -1246
- package/dist/collect-run-graph.js.map +0 -1
- package/dist/run-graph-utils.d.ts +0 -8
- package/dist/run-graph-utils.d.ts.map +0 -1
- package/dist/run-graph-utils.js +0 -44
- package/dist/run-graph-utils.js.map +0 -1
- package/dist/types-run-graph.d.ts +0 -60
- package/dist/types-run-graph.d.ts.map +0 -1
- package/dist/types-run-graph.js +0 -2
- package/dist/types-run-graph.js.map +0 -1
|
@@ -1,164 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { FRONTIER_SWARM_CODEX_LINK_REPAIR_KIND, FRONTIER_SWARM_CODEX_LINK_REPAIR_VERSION } from './constants.js';
|
|
4
|
-
import { isObject, uniqueStrings } from './common.js';
|
|
1
|
+
import { repairSwarmGitWorkspacePackageLinks } from '@shapeshift-labs/frontier-swarm-git';
|
|
5
2
|
export async function repairCodexWorkspacePackageLinks(input = {}) {
|
|
6
|
-
|
|
7
|
-
const scope = input.scope ?? '@shapeshift-labs';
|
|
8
|
-
const write = input.write ?? false;
|
|
9
|
-
const replace = input.replace ?? false;
|
|
10
|
-
const packageRoots = (input.packageRoots?.length ? input.packageRoots : [path.join(root, 'packages'), path.dirname(root)])
|
|
11
|
-
.map((entry) => path.resolve(root, entry));
|
|
12
|
-
const excludes = new Set(input.excludePackages ?? []);
|
|
13
|
-
const dependencies = input.packages?.length
|
|
14
|
-
? new Map(input.packages.map((name) => [name, undefined]))
|
|
15
|
-
: await readWorkspaceScopedDependencies(root, scope);
|
|
16
|
-
const localPackages = await discoverLocalWorkspacePackages(packageRoots, scope);
|
|
17
|
-
const entries = [];
|
|
18
|
-
for (const [packageName, dependencyRange] of Array.from(dependencies.entries()).sort(([a], [b]) => a.localeCompare(b))) {
|
|
19
|
-
const linkPath = path.join(root, 'node_modules', ...packageName.split('/'));
|
|
20
|
-
if (excludes.has(packageName)) {
|
|
21
|
-
entries.push({ packageName, dependencyRange, linkPath, status: 'excluded', reason: 'package excluded from local repair' });
|
|
22
|
-
continue;
|
|
23
|
-
}
|
|
24
|
-
const targetPath = localPackages.get(packageName);
|
|
25
|
-
if (!targetPath) {
|
|
26
|
-
entries.push({ packageName, dependencyRange, linkPath, status: 'missing-local-package', reason: 'no matching local package was found' });
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
entries.push(await planOrRepairWorkspacePackageLink({
|
|
30
|
-
packageName,
|
|
31
|
-
dependencyRange,
|
|
32
|
-
linkPath,
|
|
33
|
-
targetPath,
|
|
34
|
-
write,
|
|
35
|
-
replace
|
|
36
|
-
}));
|
|
37
|
-
}
|
|
38
|
-
const result = {
|
|
39
|
-
kind: FRONTIER_SWARM_CODEX_LINK_REPAIR_KIND,
|
|
40
|
-
version: FRONTIER_SWARM_CODEX_LINK_REPAIR_VERSION,
|
|
41
|
-
generatedAt: Date.now(),
|
|
42
|
-
root,
|
|
43
|
-
scope,
|
|
44
|
-
packageRoots,
|
|
45
|
-
write,
|
|
46
|
-
replace,
|
|
47
|
-
entries,
|
|
48
|
-
summary: {
|
|
49
|
-
total: entries.length,
|
|
50
|
-
planned: entries.filter((entry) => entry.status === 'planned').length,
|
|
51
|
-
linked: entries.filter((entry) => entry.status === 'linked').length,
|
|
52
|
-
replaced: entries.filter((entry) => entry.status === 'replaced').length,
|
|
53
|
-
alreadyLinked: entries.filter((entry) => entry.status === 'already-linked').length,
|
|
54
|
-
excluded: entries.filter((entry) => entry.status === 'excluded').length,
|
|
55
|
-
missingLocalPackage: entries.filter((entry) => entry.status === 'missing-local-package').length,
|
|
56
|
-
conflicts: entries.filter((entry) => entry.status === 'conflict').length
|
|
57
|
-
},
|
|
58
|
-
...(input.outFile ? { outFile: path.resolve(root, input.outFile) } : {})
|
|
59
|
-
};
|
|
60
|
-
if (result.outFile) {
|
|
61
|
-
await fs.mkdir(path.dirname(result.outFile), { recursive: true });
|
|
62
|
-
await fs.writeFile(result.outFile, JSON.stringify(result, null, 2) + '\n');
|
|
63
|
-
}
|
|
64
|
-
return result;
|
|
65
|
-
}
|
|
66
|
-
async function readWorkspaceScopedDependencies(root, scope) {
|
|
67
|
-
const packageJson = await readJsonObject(path.join(root, 'package.json'));
|
|
68
|
-
const dependencies = new Map();
|
|
69
|
-
for (const section of ['dependencies', 'devDependencies', 'optionalDependencies', 'peerDependencies']) {
|
|
70
|
-
const value = packageJson?.[section];
|
|
71
|
-
if (!isObject(value))
|
|
72
|
-
continue;
|
|
73
|
-
for (const [name, range] of Object.entries(value)) {
|
|
74
|
-
if (name === scope || name.startsWith(scope + '/'))
|
|
75
|
-
dependencies.set(name, typeof range === 'string' ? range : undefined);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return dependencies;
|
|
79
|
-
}
|
|
80
|
-
async function discoverLocalWorkspacePackages(packageRoots, scope) {
|
|
81
|
-
const packages = new Map();
|
|
82
|
-
for (const root of uniqueStrings(packageRoots)) {
|
|
83
|
-
await addLocalWorkspacePackage(packages, root, scope);
|
|
84
|
-
const entries = await fs.readdir(root, { withFileTypes: true }).catch(() => []);
|
|
85
|
-
for (const entry of entries) {
|
|
86
|
-
if (!entry.isDirectory() || entry.name === 'node_modules' || entry.name === '.git')
|
|
87
|
-
continue;
|
|
88
|
-
const child = path.join(root, entry.name);
|
|
89
|
-
if (entry.name.startsWith('@')) {
|
|
90
|
-
const scopedEntries = await fs.readdir(child, { withFileTypes: true }).catch(() => []);
|
|
91
|
-
for (const scopedEntry of scopedEntries) {
|
|
92
|
-
if (scopedEntry.isDirectory())
|
|
93
|
-
await addLocalWorkspacePackage(packages, path.join(child, scopedEntry.name), scope);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
await addLocalWorkspacePackage(packages, child, scope);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return packages;
|
|
102
|
-
}
|
|
103
|
-
async function addLocalWorkspacePackage(packages, packageDir, scope) {
|
|
104
|
-
const packageJson = await readJsonObject(path.join(packageDir, 'package.json'));
|
|
105
|
-
const name = typeof packageJson?.name === 'string' ? packageJson.name : undefined;
|
|
106
|
-
if (!name || name !== scope && !name.startsWith(scope + '/'))
|
|
107
|
-
return;
|
|
108
|
-
if (!packages.has(name))
|
|
109
|
-
packages.set(name, path.resolve(packageDir));
|
|
110
|
-
}
|
|
111
|
-
async function readJsonObject(file) {
|
|
112
|
-
try {
|
|
113
|
-
const parsed = JSON.parse(await fs.readFile(file, 'utf8'));
|
|
114
|
-
return isObject(parsed) ? parsed : undefined;
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
return undefined;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
async function planOrRepairWorkspacePackageLink(input) {
|
|
121
|
-
const base = {
|
|
122
|
-
packageName: input.packageName,
|
|
123
|
-
dependencyRange: input.dependencyRange,
|
|
124
|
-
linkPath: input.linkPath,
|
|
125
|
-
targetPath: input.targetPath
|
|
126
|
-
};
|
|
127
|
-
const stat = await fs.lstat(input.linkPath).catch(() => undefined);
|
|
128
|
-
const relativeTarget = path.relative(path.dirname(input.linkPath), input.targetPath) || '.';
|
|
129
|
-
if (stat?.isSymbolicLink()) {
|
|
130
|
-
const currentTarget = path.resolve(path.dirname(input.linkPath), await fs.readlink(input.linkPath));
|
|
131
|
-
if (currentTarget === input.targetPath)
|
|
132
|
-
return { ...base, status: 'already-linked' };
|
|
133
|
-
if (!input.write)
|
|
134
|
-
return { ...base, status: 'planned', reason: 'existing symlink points at a different package' };
|
|
135
|
-
await fs.unlink(input.linkPath);
|
|
136
|
-
await fs.symlink(relativeTarget, input.linkPath, 'dir');
|
|
137
|
-
return { ...base, status: 'linked', reason: 'updated existing symlink' };
|
|
138
|
-
}
|
|
139
|
-
if (stat) {
|
|
140
|
-
if (!input.replace)
|
|
141
|
-
return { ...base, status: 'conflict', reason: 'existing node_modules entry is not a symlink' };
|
|
142
|
-
if (!input.write)
|
|
143
|
-
return { ...base, status: 'planned', reason: 'would replace existing node_modules entry' };
|
|
144
|
-
await fs.rm(input.linkPath, { recursive: true, force: true });
|
|
145
|
-
await fs.mkdir(path.dirname(input.linkPath), { recursive: true });
|
|
146
|
-
await fs.symlink(relativeTarget, input.linkPath, 'dir');
|
|
147
|
-
return { ...base, status: 'replaced', reason: 'replaced existing node_modules entry with a symlink' };
|
|
148
|
-
}
|
|
149
|
-
if (!input.write)
|
|
150
|
-
return { ...base, status: 'planned', reason: 'missing symlink' };
|
|
151
|
-
await fs.mkdir(path.dirname(input.linkPath), { recursive: true });
|
|
152
|
-
await fs.symlink(relativeTarget, input.linkPath, 'dir');
|
|
153
|
-
return { ...base, status: 'linked', reason: 'created symlink' };
|
|
154
|
-
}
|
|
155
|
-
async function resolvePidManifestPath(runPath) {
|
|
156
|
-
const absolute = path.resolve(runPath);
|
|
157
|
-
const stat = await fs.lstat(absolute).catch(() => undefined);
|
|
158
|
-
if (stat?.isDirectory())
|
|
159
|
-
return path.join(absolute, 'pids.json');
|
|
160
|
-
if (path.basename(absolute) === 'swarm-results.json')
|
|
161
|
-
return path.join(path.dirname(absolute), 'pids.json');
|
|
162
|
-
return absolute;
|
|
3
|
+
return repairSwarmGitWorkspacePackageLinks(input);
|
|
163
4
|
}
|
|
164
5
|
//# sourceMappingURL=workspace-link-repair.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-link-repair.js","sourceRoot":"","sources":["../src/workspace-link-repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"workspace-link-repair.js","sourceRoot":"","sources":["../src/workspace-link-repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAM1F,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,QAAsD,EAAE;IAExD,OAAO,mCAAmC,CAAC,KAAK,CAA2D,CAAC;AAC9G,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shapeshift-labs/frontier-swarm-codex",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.124",
|
|
4
4
|
"description": "Node Codex CLI runner adapter for Frontier swarm plans with resource allocation.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -64,7 +64,8 @@
|
|
|
64
64
|
],
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"@shapeshift-labs/frontier-run": "0.1.0",
|
|
67
|
-
"@shapeshift-labs/frontier-swarm": "0.5.
|
|
67
|
+
"@shapeshift-labs/frontier-swarm": "0.5.26",
|
|
68
|
+
"@shapeshift-labs/frontier-swarm-git": "0.1.2"
|
|
68
69
|
},
|
|
69
70
|
"optionalDependencies": {
|
|
70
71
|
"@shapeshift-labs/frontier-lang": "0.4.89"
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { FrontierCodexSwarmRunOptions, FrontierCodexWorkspaceIgnoredChangedPathReason, FrontierCodexWorkspaceIgnoredChangedPathReasonCode, FrontierCodexWorkspacePlan } from './index.js';
|
|
2
|
-
export type FrontierCodexWorkspaceFileSnapshot = Map<string, string>;
|
|
3
|
-
export interface FrontierCodexChangedPathCollection {
|
|
4
|
-
observedChangedPaths: string[];
|
|
5
|
-
changedPaths: string[];
|
|
6
|
-
ignoredChangedPaths: string[];
|
|
7
|
-
ignoredChangedPathReasons: FrontierCodexWorkspaceIgnoredChangedPathReason[];
|
|
8
|
-
}
|
|
9
|
-
export declare function emptyChangedPathCollection(): FrontierCodexChangedPathCollection;
|
|
10
|
-
export declare function shouldSnapshotWorkspaceChanges(plan: FrontierCodexWorkspacePlan, options: FrontierCodexSwarmRunOptions): boolean;
|
|
11
|
-
export declare function snapshotWorkspaceFiles(root: string): Promise<FrontierCodexWorkspaceFileSnapshot>;
|
|
12
|
-
export declare function collectChangedPaths(cwd: string, baseline: FrontierCodexWorkspaceFileSnapshot | undefined, plan: FrontierCodexWorkspacePlan): Promise<FrontierCodexChangedPathCollection>;
|
|
13
|
-
export declare function filterWorkspaceChangedPaths(paths: readonly string[], plan: FrontierCodexWorkspacePlan): FrontierCodexChangedPathCollection;
|
|
14
|
-
export declare function mergeWorkspaceChangedPathCollections(collections: readonly FrontierCodexChangedPathCollection[]): FrontierCodexChangedPathCollection;
|
|
15
|
-
export declare function createIgnoredWorkspaceChangedPathReasons(paths: readonly string[], plan: FrontierCodexWorkspacePlan): FrontierCodexWorkspaceIgnoredChangedPathReason[];
|
|
16
|
-
export declare function getIgnoredWorkspaceChangedPathReason(file: string, plan: FrontierCodexWorkspacePlan): FrontierCodexWorkspaceIgnoredChangedPathReasonCode | undefined;
|
|
17
|
-
export declare function normalizeWorkspaceChangedPath(file: string, plan: FrontierCodexWorkspacePlan): string | undefined;
|
|
18
|
-
export declare function uniqueWorkspaceChangedPaths(paths: readonly string[], plan: FrontierCodexWorkspacePlan): string[];
|
|
19
|
-
export declare function snapshotContainsWorkspacePath(snapshot: FrontierCodexWorkspaceFileSnapshot, file: string): boolean;
|
|
20
|
-
//# sourceMappingURL=codex-workspace-change-paths.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-workspace-change-paths.d.ts","sourceRoot":"","sources":["../src/codex-workspace-change-paths.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,4BAA4B,EAC5B,8CAA8C,EAC9C,kDAAkD,EAClD,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,kCAAkC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErE,MAAM,WAAW,kCAAkC;IACjD,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,yBAAyB,EAAE,8CAA8C,EAAE,CAAC;CAC7E;AAED,wBAAgB,0BAA0B,IAAI,kCAAkC,CAO/E;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAE/H;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAItG;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,kCAAkC,GAAG,SAAS,EACxD,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,kCAAkC,CAAC,CAI7C;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,IAAI,EAAE,0BAA0B,GAC/B,kCAAkC,CAEpC;AAED,wBAAgB,oCAAoC,CAClD,WAAW,EAAE,SAAS,kCAAkC,EAAE,GACzD,kCAAkC,CAapC;AAED,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,IAAI,EAAE,0BAA0B,GAC/B,8CAA8C,EAAE,CAOlD;AAED,wBAAgB,oCAAoC,CAClD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,0BAA0B,GAC/B,kDAAkD,GAAG,SAAS,CAShE;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,GAAG,MAAM,GAAG,SAAS,CAOhH;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,0BAA0B,GAAG,MAAM,EAAE,CAUhH;AAED,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,kCAAkC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAOjH"}
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
2
|
-
import fs from 'node:fs/promises';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { getWorkspaceNoisePathReason, isWorkspaceNoisePath, normalizeWorkspacePath, runProcess, workspacePathMatches, uniqueWorkspacePaths } from './common.js';
|
|
5
|
-
export function emptyChangedPathCollection() {
|
|
6
|
-
return {
|
|
7
|
-
observedChangedPaths: [],
|
|
8
|
-
changedPaths: [],
|
|
9
|
-
ignoredChangedPaths: [],
|
|
10
|
-
ignoredChangedPathReasons: []
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
export function shouldSnapshotWorkspaceChanges(plan, options) {
|
|
14
|
-
return options.collectGitStatus !== false && (plan.mode === 'copy' || plan.mode === 'snapshot');
|
|
15
|
-
}
|
|
16
|
-
export async function snapshotWorkspaceFiles(root) {
|
|
17
|
-
const snapshot = new Map();
|
|
18
|
-
await walkWorkspaceFiles(root, root, snapshot);
|
|
19
|
-
return snapshot;
|
|
20
|
-
}
|
|
21
|
-
export async function collectChangedPaths(cwd, baseline, plan) {
|
|
22
|
-
if (!baseline)
|
|
23
|
-
return filterWorkspaceChangedPaths(await gitChangedPaths(cwd), plan);
|
|
24
|
-
const after = await snapshotWorkspaceFiles(cwd);
|
|
25
|
-
return filterWorkspaceChangedPathsFromSnapshots(diffWorkspaceFiles(baseline, after), plan, baseline, after);
|
|
26
|
-
}
|
|
27
|
-
export function filterWorkspaceChangedPaths(paths, plan) {
|
|
28
|
-
return filterWorkspaceChangedPathsWithEmptyMarkers(paths, plan, new Set());
|
|
29
|
-
}
|
|
30
|
-
export function mergeWorkspaceChangedPathCollections(collections) {
|
|
31
|
-
const ignoredReasonByKey = new Map();
|
|
32
|
-
for (const collection of collections) {
|
|
33
|
-
for (const reason of collection.ignoredChangedPathReasons) {
|
|
34
|
-
ignoredReasonByKey.set(`${reason.path}:${reason.reasonCode}`, reason);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return {
|
|
38
|
-
observedChangedPaths: uniqueWorkspacePaths(collections.flatMap((collection) => collection.observedChangedPaths)),
|
|
39
|
-
changedPaths: uniqueWorkspacePaths(collections.flatMap((collection) => collection.changedPaths)),
|
|
40
|
-
ignoredChangedPaths: uniqueWorkspacePaths(collections.flatMap((collection) => collection.ignoredChangedPaths)),
|
|
41
|
-
ignoredChangedPathReasons: Array.from(ignoredReasonByKey.values())
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
export function createIgnoredWorkspaceChangedPathReasons(paths, plan) {
|
|
45
|
-
const reasons = [];
|
|
46
|
-
for (const file of uniqueWorkspaceChangedPaths(paths, plan)) {
|
|
47
|
-
const reasonCode = getIgnoredWorkspaceChangedPathReason(file, plan);
|
|
48
|
-
if (reasonCode)
|
|
49
|
-
reasons.push({ path: file, reasonCode });
|
|
50
|
-
}
|
|
51
|
-
return reasons;
|
|
52
|
-
}
|
|
53
|
-
export function getIgnoredWorkspaceChangedPathReason(file, plan) {
|
|
54
|
-
if (plan.mode !== 'copy' && plan.mode !== 'snapshot')
|
|
55
|
-
return undefined;
|
|
56
|
-
const noiseReason = getWorkspaceNoisePathReason(file);
|
|
57
|
-
if (noiseReason)
|
|
58
|
-
return noiseReason;
|
|
59
|
-
if (isGeneratedWorkspaceSetupFile(file) && !isExplicitWorkspaceInput(file, plan))
|
|
60
|
-
return 'generated_setup';
|
|
61
|
-
if (plan.excludes.some((entry) => workspacePathMatches(file, entry)))
|
|
62
|
-
return 'workspace_exclude';
|
|
63
|
-
if (plan.artifactIncludes.some((entry) => workspacePathMatches(file, entry)))
|
|
64
|
-
return 'artifact_include';
|
|
65
|
-
if (plan.linkPaths.some((entry) => workspacePathMatches(file, entry)))
|
|
66
|
-
return 'linked_path';
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
|
-
export function normalizeWorkspaceChangedPath(file, plan) {
|
|
70
|
-
const value = String(file ?? '').trim();
|
|
71
|
-
if (!value)
|
|
72
|
-
return undefined;
|
|
73
|
-
if (path.isAbsolute(value)) {
|
|
74
|
-
return normalizeWorkspacePath(path.relative(plan.path, value).replace(/\\/g, '/'));
|
|
75
|
-
}
|
|
76
|
-
return normalizeWorkspacePath(value);
|
|
77
|
-
}
|
|
78
|
-
export function uniqueWorkspaceChangedPaths(paths, plan) {
|
|
79
|
-
const out = [];
|
|
80
|
-
const seen = new Set();
|
|
81
|
-
for (const file of paths) {
|
|
82
|
-
const normalized = normalizeWorkspaceChangedPath(file, plan);
|
|
83
|
-
if (!normalized || seen.has(normalized))
|
|
84
|
-
continue;
|
|
85
|
-
seen.add(normalized);
|
|
86
|
-
out.push(normalized);
|
|
87
|
-
}
|
|
88
|
-
return out;
|
|
89
|
-
}
|
|
90
|
-
export function snapshotContainsWorkspacePath(snapshot, file) {
|
|
91
|
-
if (snapshot.has(file))
|
|
92
|
-
return true;
|
|
93
|
-
const prefix = file.replace(/\/$/, '') + '/';
|
|
94
|
-
for (const entry of snapshot.keys()) {
|
|
95
|
-
if (entry.startsWith(prefix))
|
|
96
|
-
return true;
|
|
97
|
-
}
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
function filterWorkspaceChangedPathsFromSnapshots(paths, plan, before, after) {
|
|
101
|
-
return filterWorkspaceChangedPathsWithEmptyMarkers(paths, plan, deletedChildEmptyDirectoryMarkers(paths, before, after));
|
|
102
|
-
}
|
|
103
|
-
function filterWorkspaceChangedPathsWithEmptyMarkers(paths, plan, emptyDirectoryMarkers) {
|
|
104
|
-
const observedChangedPaths = uniqueWorkspaceChangedPaths(paths, plan);
|
|
105
|
-
const changedPaths = [];
|
|
106
|
-
const ignoredChangedPaths = [];
|
|
107
|
-
const ignoredChangedPathReasons = [];
|
|
108
|
-
for (const file of observedChangedPaths) {
|
|
109
|
-
const reasonCode = emptyDirectoryMarkers.has(file)
|
|
110
|
-
? 'empty_directory_marker'
|
|
111
|
-
: getIgnoredWorkspaceChangedPathReason(file, plan);
|
|
112
|
-
if (reasonCode) {
|
|
113
|
-
ignoredChangedPaths.push(file);
|
|
114
|
-
ignoredChangedPathReasons.push({ path: file, reasonCode });
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
changedPaths.push(file);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
return { observedChangedPaths, changedPaths, ignoredChangedPaths, ignoredChangedPathReasons };
|
|
121
|
-
}
|
|
122
|
-
function deletedChildEmptyDirectoryMarkers(paths, before, after) {
|
|
123
|
-
const out = new Set();
|
|
124
|
-
const changed = uniqueWorkspacePaths(paths);
|
|
125
|
-
const beforePaths = Array.from(before.keys());
|
|
126
|
-
for (const file of changed) {
|
|
127
|
-
const marker = after.get(file);
|
|
128
|
-
if (!marker?.startsWith('empty-dir'))
|
|
129
|
-
continue;
|
|
130
|
-
if (before.has(file))
|
|
131
|
-
continue;
|
|
132
|
-
const prefix = file.replace(/\/+$/, '') + '/';
|
|
133
|
-
if (beforePaths.some((candidate) => candidate.startsWith(prefix)))
|
|
134
|
-
out.add(file);
|
|
135
|
-
}
|
|
136
|
-
return out;
|
|
137
|
-
}
|
|
138
|
-
async function gitChangedPaths(cwd) {
|
|
139
|
-
const result = await runProcess('git', ['status', '--porcelain'], { cwd, allowFailure: true });
|
|
140
|
-
if (result.status !== 0)
|
|
141
|
-
return [];
|
|
142
|
-
return result.stdout.split(/\r?\n/).filter(Boolean).flatMap((line) => {
|
|
143
|
-
const value = line.slice(3);
|
|
144
|
-
return value.includes(' -> ') ? value.split(' -> ') : [value];
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
function isGeneratedWorkspaceSetupFile(file) {
|
|
148
|
-
return file === 'loom.json' || file === '.loomignore' || file === '.gitignore';
|
|
149
|
-
}
|
|
150
|
-
function isExplicitWorkspaceInput(file, plan) {
|
|
151
|
-
const inputs = [...plan.includes, ...plan.artifactIncludes, ...plan.requiredIncludes, ...plan.optionalIncludes];
|
|
152
|
-
return inputs.some((entry) => file === entry || file.startsWith(entry.replace(/\/$/, '') + '/'));
|
|
153
|
-
}
|
|
154
|
-
async function walkWorkspaceFiles(root, current, snapshot) {
|
|
155
|
-
let entries;
|
|
156
|
-
try {
|
|
157
|
-
entries = await fs.readdir(current);
|
|
158
|
-
}
|
|
159
|
-
catch {
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
for (const entry of entries) {
|
|
163
|
-
const absolute = path.join(current, entry);
|
|
164
|
-
const relative = path.relative(root, absolute).replace(/\\/g, '/');
|
|
165
|
-
const stat = await fs.lstat(absolute).catch(() => undefined);
|
|
166
|
-
if (!stat)
|
|
167
|
-
continue;
|
|
168
|
-
if (stat.isSymbolicLink()) {
|
|
169
|
-
const target = await fs.readlink(absolute).catch(() => '');
|
|
170
|
-
snapshot.set(relative, `link:${target}`);
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
if (stat.isDirectory()) {
|
|
174
|
-
if (isWorkspaceNoisePath(relative)) {
|
|
175
|
-
snapshot.set(relative, snapshotMarker('ignored-dir'));
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
const beforeSize = snapshot.size;
|
|
179
|
-
await walkWorkspaceFiles(root, absolute, snapshot);
|
|
180
|
-
if (relative && snapshot.size === beforeSize)
|
|
181
|
-
snapshot.set(relative, snapshotMarker('empty-dir'));
|
|
182
|
-
continue;
|
|
183
|
-
}
|
|
184
|
-
if (stat.isFile()) {
|
|
185
|
-
snapshot.set(relative, isWorkspaceNoisePath(relative)
|
|
186
|
-
? await snapshotFileMarker('ignored-file', absolute, stat)
|
|
187
|
-
: await snapshotFileMarker('file', absolute, stat));
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
async function snapshotFileMarker(kind, absolute, stat) {
|
|
192
|
-
try {
|
|
193
|
-
const hash = createHash('sha256').update(await fs.readFile(absolute)).digest('hex');
|
|
194
|
-
return `${kind}:${stat.size}:${hash}`;
|
|
195
|
-
}
|
|
196
|
-
catch {
|
|
197
|
-
return `${kind}:${stat.size}:unreadable`;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
function snapshotMarker(kind) {
|
|
201
|
-
return kind;
|
|
202
|
-
}
|
|
203
|
-
function diffWorkspaceFiles(before, after) {
|
|
204
|
-
const changed = new Set();
|
|
205
|
-
for (const [file, marker] of after) {
|
|
206
|
-
if (before.get(file) !== marker)
|
|
207
|
-
changed.add(file);
|
|
208
|
-
}
|
|
209
|
-
for (const file of before.keys()) {
|
|
210
|
-
if (!after.has(file))
|
|
211
|
-
changed.add(file);
|
|
212
|
-
}
|
|
213
|
-
return Array.from(changed).sort();
|
|
214
|
-
}
|
|
215
|
-
//# sourceMappingURL=codex-workspace-change-paths.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-workspace-change-paths.js","sourceRoot":"","sources":["../src/codex-workspace-change-paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { type FrontierCodexWorkspaceFileSnapshot } from './codex-workspace-change-paths.js';
|
|
2
|
-
import type { FrontierCodexWorkspacePlan } from './index.js';
|
|
3
|
-
export interface FrontierCodexWorkspaceRestoreRecord {
|
|
4
|
-
path: string;
|
|
5
|
-
action: 'restored' | 'deleted' | 'missing' | 'skipped';
|
|
6
|
-
reason: string;
|
|
7
|
-
}
|
|
8
|
-
export declare function restoreWorkspaceChangedPaths(input: {
|
|
9
|
-
workspace: string;
|
|
10
|
-
sourceRoot: string;
|
|
11
|
-
workspacePlan: FrontierCodexWorkspacePlan;
|
|
12
|
-
baseline?: FrontierCodexWorkspaceFileSnapshot;
|
|
13
|
-
changedPaths: readonly string[];
|
|
14
|
-
}): Promise<FrontierCodexWorkspaceRestoreRecord[]>;
|
|
15
|
-
//# sourceMappingURL=codex-workspace-restore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-workspace-restore.d.ts","sourceRoot":"","sources":["../src/codex-workspace-restore.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiC,KAAK,kCAAkC,EAAE,MAAM,mCAAmC,CAAC;AAC3H,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,WAAW,mCAAmC;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACvD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,4BAA4B,CAAC,KAAK,EAAE;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,EAAE,kCAAkC,CAAC;IAC9C,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,GAAG,OAAO,CAAC,mCAAmC,EAAE,CAAC,CAwCjD"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { pathExists, uniqueWorkspacePaths } from './common.js';
|
|
4
|
-
import { snapshotContainsWorkspacePath } from './codex-workspace-change-paths.js';
|
|
5
|
-
export async function restoreWorkspaceChangedPaths(input) {
|
|
6
|
-
const paths = uniqueWorkspacePaths(input.changedPaths);
|
|
7
|
-
if (!paths.length)
|
|
8
|
-
return [];
|
|
9
|
-
if (input.workspacePlan.mode !== 'copy' && input.workspacePlan.mode !== 'snapshot') {
|
|
10
|
-
return paths.map((file) => ({
|
|
11
|
-
path: file,
|
|
12
|
-
action: 'skipped',
|
|
13
|
-
reason: `workspace mode ${input.workspacePlan.mode} is not isolated`
|
|
14
|
-
}));
|
|
15
|
-
}
|
|
16
|
-
const records = [];
|
|
17
|
-
for (const file of paths) {
|
|
18
|
-
const source = path.join(input.sourceRoot, file);
|
|
19
|
-
const target = path.join(input.workspace, file);
|
|
20
|
-
const sourceExists = await pathExists(source);
|
|
21
|
-
const targetExists = await pathExists(target);
|
|
22
|
-
const existedAtBaseline = input.baseline ? snapshotContainsWorkspacePath(input.baseline, file) : undefined;
|
|
23
|
-
if (input.baseline && !existedAtBaseline) {
|
|
24
|
-
if (targetExists) {
|
|
25
|
-
await fs.rm(target, { recursive: true, force: true });
|
|
26
|
-
await pruneUnauthorizedEmptyParents(input.workspace, file, input.baseline);
|
|
27
|
-
records.push({ path: file, action: 'deleted', reason: 'removed unauthorized new path' });
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
records.push({ path: file, action: 'missing', reason: 'path absent in workspace baseline and workspace' });
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
else if (sourceExists) {
|
|
34
|
-
await fs.rm(target, { recursive: true, force: true });
|
|
35
|
-
await fs.mkdir(path.dirname(target), { recursive: true });
|
|
36
|
-
await fs.cp(source, target, { recursive: true, force: true, verbatimSymlinks: true });
|
|
37
|
-
records.push({ path: file, action: 'restored', reason: 'restored from source root' });
|
|
38
|
-
}
|
|
39
|
-
else if (targetExists) {
|
|
40
|
-
await fs.rm(target, { recursive: true, force: true });
|
|
41
|
-
if (input.baseline)
|
|
42
|
-
await pruneUnauthorizedEmptyParents(input.workspace, file, input.baseline);
|
|
43
|
-
records.push({ path: file, action: 'deleted', reason: 'removed unauthorized path missing from source root' });
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
records.push({ path: file, action: 'missing', reason: 'path absent in source and workspace' });
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return records;
|
|
50
|
-
}
|
|
51
|
-
async function pruneUnauthorizedEmptyParents(workspace, file, baseline) {
|
|
52
|
-
let current = path.dirname(file);
|
|
53
|
-
while (current && current !== '.' && !path.isAbsolute(current)) {
|
|
54
|
-
if (snapshotContainsWorkspacePath(baseline, current))
|
|
55
|
-
return;
|
|
56
|
-
const absolute = path.join(workspace, current);
|
|
57
|
-
try {
|
|
58
|
-
await fs.rmdir(absolute);
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
current = path.dirname(current);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=codex-workspace-restore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-workspace-restore.js","sourceRoot":"","sources":["../src/codex-workspace-restore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { FrontierCodexWorkspacePlan, FrontierCodexWorkspaceWriteFenceSummary } from './index.js';
|
|
2
|
-
export interface FrontierCodexWorkspaceWriteFenceRecord {
|
|
3
|
-
path: string;
|
|
4
|
-
absolutePath: string;
|
|
5
|
-
kind: 'file' | 'directory';
|
|
6
|
-
originalMode: number;
|
|
7
|
-
fencedMode: number;
|
|
8
|
-
}
|
|
9
|
-
export interface FrontierCodexWorkspaceWriteFenceState {
|
|
10
|
-
summary: FrontierCodexWorkspaceWriteFenceSummary;
|
|
11
|
-
records: FrontierCodexWorkspaceWriteFenceRecord[];
|
|
12
|
-
}
|
|
13
|
-
export declare function applyWorkspacePreExecWriteFence(input: {
|
|
14
|
-
workspace: string;
|
|
15
|
-
workspacePlan: FrontierCodexWorkspacePlan;
|
|
16
|
-
allowedWrites: readonly string[];
|
|
17
|
-
writableRoots?: readonly string[];
|
|
18
|
-
enabled?: boolean;
|
|
19
|
-
}): Promise<FrontierCodexWorkspaceWriteFenceState>;
|
|
20
|
-
export declare function restoreWorkspacePreExecWriteFence(state: FrontierCodexWorkspaceWriteFenceState): Promise<FrontierCodexWorkspaceWriteFenceSummary>;
|
|
21
|
-
//# sourceMappingURL=codex-workspace-write-fence.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-workspace-write-fence.d.ts","sourceRoot":"","sources":["../src/codex-workspace-write-fence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAEtG,MAAM,WAAW,sCAAsC;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qCAAqC;IACpD,OAAO,EAAE,uCAAuC,CAAC;IACjD,OAAO,EAAE,sCAAsC,EAAE,CAAC;CACnD;AASD,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,qCAAqC,CAAC,CAgBjD;AAED,wBAAsB,iCAAiC,CACrD,KAAK,EAAE,qCAAqC,GAC3C,OAAO,CAAC,uCAAuC,CAAC,CAYlD"}
|