expandai 0.0.2 → 0.0.4
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 +42 -5
- package/build/dts/ApiClient.d.ts +128 -194
- package/build/dts/ApiClient.d.ts.map +1 -1
- package/build/dts/Auth/Domain.d.ts +95 -0
- package/build/dts/Auth/Domain.d.ts.map +1 -0
- package/build/dts/Auth/ManualAuthorization.d.ts +107 -0
- package/build/dts/Auth/ManualAuthorization.d.ts.map +1 -0
- package/build/dts/Auth/PendingInit.d.ts +35 -0
- package/build/dts/Auth/PendingInit.d.ts.map +1 -0
- package/build/dts/Auth/Pkce.d.ts +10 -0
- package/build/dts/Auth/Pkce.d.ts.map +1 -0
- package/build/dts/Auth/SetupGrantAuthorization.d.ts +34 -0
- package/build/dts/Auth/SetupGrantAuthorization.d.ts.map +1 -0
- package/build/dts/Authentication.d.ts +10 -9
- package/build/dts/Authentication.d.ts.map +1 -1
- package/build/dts/BrowserOAuth.d.ts +7 -7
- package/build/dts/BrowserOAuth.d.ts.map +1 -1
- package/build/dts/CommandPath.d.ts +2 -0
- package/build/dts/CommandPath.d.ts.map +1 -0
- package/build/dts/Commands/Fetch.d.ts.map +1 -1
- package/build/dts/Commands/Hook.d.ts +5 -5
- package/build/dts/Commands/Init.d.ts +55 -0
- package/build/dts/Commands/Init.d.ts.map +1 -0
- package/build/dts/Commands/Mcp.d.ts +6 -6
- package/build/dts/Commands/Search.d.ts.map +1 -1
- package/build/dts/Commands/Skill.d.ts +4 -4
- package/build/dts/Commands/Status.d.ts +27 -0
- package/build/dts/Commands/Status.d.ts.map +1 -0
- package/build/dts/Commands/Telemetry.d.ts +7 -0
- package/build/dts/Commands/Telemetry.d.ts.map +1 -0
- package/build/dts/Commands/Uninstall.d.ts +4 -4
- package/build/dts/Config.d.ts +108 -17
- package/build/dts/Config.d.ts.map +1 -1
- package/build/dts/Hook/SnapshotNote.d.ts +8 -4
- package/build/dts/Hook/SnapshotNote.d.ts.map +1 -1
- package/build/dts/Init/ClaudeAdapter.d.ts +61 -0
- package/build/dts/Init/ClaudeAdapter.d.ts.map +1 -0
- package/build/dts/Init/ClaudeProfile.d.ts +77 -0
- package/build/dts/Init/ClaudeProfile.d.ts.map +1 -0
- package/build/dts/Init/Domain.d.ts +139 -0
- package/build/dts/Init/Domain.d.ts.map +1 -0
- package/build/dts/Init/HarnessAdapter.d.ts +33 -0
- package/build/dts/Init/HarnessAdapter.d.ts.map +1 -0
- package/build/dts/Init/HarnessDetector.d.ts +19 -0
- package/build/dts/Init/HarnessDetector.d.ts.map +1 -0
- package/build/dts/Init/HarnessRegistry.d.ts +50 -0
- package/build/dts/Init/HarnessRegistry.d.ts.map +1 -0
- package/build/dts/Init/MutationTransaction.d.ts +96 -0
- package/build/dts/Init/MutationTransaction.d.ts.map +1 -0
- package/build/dts/Init/Service.d.ts +72 -0
- package/build/dts/Init/Service.d.ts.map +1 -0
- package/build/dts/Init/StandardAdapters.d.ts +42 -0
- package/build/dts/Init/StandardAdapters.d.ts.map +1 -0
- package/build/dts/Init/Status.d.ts +149 -0
- package/build/dts/Init/Status.d.ts.map +1 -0
- package/build/dts/Install/Claude/Hook.d.ts +57 -29
- package/build/dts/Install/Claude/Hook.d.ts.map +1 -1
- package/build/dts/Install/Claude/Mcp.d.ts +21 -18
- package/build/dts/Install/Claude/Mcp.d.ts.map +1 -1
- package/build/dts/Install/Claude/Skill.d.ts +14 -15
- package/build/dts/Install/Claude/Skill.d.ts.map +1 -1
- package/build/dts/Install/Codex/Mcp.d.ts +14 -8
- package/build/dts/Install/Codex/Mcp.d.ts.map +1 -1
- package/build/dts/Install/Codex/Skill.d.ts +4 -2
- package/build/dts/Install/Codex/Skill.d.ts.map +1 -1
- package/build/dts/Install/Cursor/Mcp.d.ts +13 -13
- package/build/dts/Install/Cursor/Mcp.d.ts.map +1 -1
- package/build/dts/Install/Cursor/Skill.d.ts +4 -2
- package/build/dts/Install/Cursor/Skill.d.ts.map +1 -1
- package/build/dts/Install/Domain.d.ts +35 -5
- package/build/dts/Install/Domain.d.ts.map +1 -1
- package/build/dts/Install/Hook.d.ts +4 -4
- package/build/dts/Install/Hook.d.ts.map +1 -1
- package/build/dts/Install/Mcp.d.ts +5 -5
- package/build/dts/Install/Mcp.d.ts.map +1 -1
- package/build/dts/Install/Opencode/Hook.d.ts +4 -3
- package/build/dts/Install/Opencode/Hook.d.ts.map +1 -1
- package/build/dts/Install/Opencode/Mcp.d.ts +11 -11
- package/build/dts/Install/Opencode/Mcp.d.ts.map +1 -1
- package/build/dts/Install/Opencode/Skill.d.ts +4 -2
- package/build/dts/Install/Opencode/Skill.d.ts.map +1 -1
- package/build/dts/Install/Skill.d.ts +3 -3
- package/build/dts/Install/Uninstall.d.ts +6 -6
- package/build/dts/Install/Uninstall.d.ts.map +1 -1
- package/build/dts/MarkdownAnsi.d.ts +29 -0
- package/build/dts/MarkdownAnsi.d.ts.map +1 -0
- package/build/dts/Mcp/ExpandDocs.d.ts +17 -5
- package/build/dts/Mcp/ExpandDocs.d.ts.map +1 -1
- package/build/dts/Mcp/Server.d.ts +1 -1
- package/build/dts/Mcp/Server.d.ts.map +1 -1
- package/build/dts/Mcp/tools/Citations.d.ts +100 -71
- package/build/dts/Mcp/tools/Citations.d.ts.map +1 -1
- package/build/dts/Mcp/tools/Fetch.d.ts +16 -15
- package/build/dts/Mcp/tools/Fetch.d.ts.map +1 -1
- package/build/dts/SecureFile.d.ts +23 -0
- package/build/dts/SecureFile.d.ts.map +1 -0
- package/build/dts/Snippets.d.ts +11 -12
- package/build/dts/Snippets.d.ts.map +1 -1
- package/build/dts/Telemetry.d.ts +30 -0
- package/build/dts/Telemetry.d.ts.map +1 -0
- package/build/dts/Version.d.ts +2 -0
- package/build/dts/Version.d.ts.map +1 -0
- package/build/dts/Xdg.d.ts +11 -0
- package/build/dts/Xdg.d.ts.map +1 -0
- package/build/esm/ApiClient.js +133 -10
- package/build/esm/ApiClient.js.map +1 -1
- package/build/esm/Auth/Domain.js +56 -0
- package/build/esm/Auth/Domain.js.map +1 -0
- package/build/esm/Auth/ManualAuthorization.js +253 -0
- package/build/esm/Auth/ManualAuthorization.js.map +1 -0
- package/build/esm/Auth/PendingInit.js +267 -0
- package/build/esm/Auth/PendingInit.js.map +1 -0
- package/build/esm/Auth/Pkce.js +23 -0
- package/build/esm/Auth/Pkce.js.map +1 -0
- package/build/esm/Auth/SetupGrantAuthorization.js +91 -0
- package/build/esm/Auth/SetupGrantAuthorization.js.map +1 -0
- package/build/esm/Authentication.js +38 -7
- package/build/esm/Authentication.js.map +1 -1
- package/build/esm/BrowserOAuth.js +7 -10
- package/build/esm/BrowserOAuth.js.map +1 -1
- package/build/esm/CommandPath.js +31 -0
- package/build/esm/CommandPath.js.map +1 -0
- package/build/esm/Commands/Fetch.js +30 -6
- package/build/esm/Commands/Fetch.js.map +1 -1
- package/build/esm/Commands/Init.js +371 -0
- package/build/esm/Commands/Init.js.map +1 -0
- package/build/esm/Commands/Search.js +6 -3
- package/build/esm/Commands/Search.js.map +1 -1
- package/build/esm/Commands/Status.js +186 -0
- package/build/esm/Commands/Status.js.map +1 -0
- package/build/esm/Commands/Telemetry.js +23 -0
- package/build/esm/Commands/Telemetry.js.map +1 -0
- package/build/esm/Config.js +502 -28
- package/build/esm/Config.js.map +1 -1
- package/build/esm/Hook/Claude.js +1 -1
- package/build/esm/Hook/Claude.js.map +1 -1
- package/build/esm/Hook/SnapshotNote.js +54 -7
- package/build/esm/Hook/SnapshotNote.js.map +1 -1
- package/build/esm/Init/ClaudeAdapter.js +137 -0
- package/build/esm/Init/ClaudeAdapter.js.map +1 -0
- package/build/esm/Init/ClaudeProfile.js +344 -0
- package/build/esm/Init/ClaudeProfile.js.map +1 -0
- package/build/esm/Init/Domain.js +118 -0
- package/build/esm/Init/Domain.js.map +1 -0
- package/build/esm/Init/HarnessAdapter.js +21 -0
- package/build/esm/Init/HarnessAdapter.js.map +1 -0
- package/build/esm/Init/HarnessDetector.js +65 -0
- package/build/esm/Init/HarnessDetector.js.map +1 -0
- package/build/esm/Init/HarnessRegistry.js +58 -0
- package/build/esm/Init/HarnessRegistry.js.map +1 -0
- package/build/esm/Init/MutationTransaction.js +494 -0
- package/build/esm/Init/MutationTransaction.js.map +1 -0
- package/build/esm/Init/Service.js +319 -0
- package/build/esm/Init/Service.js.map +1 -0
- package/build/esm/Init/StandardAdapters.js +116 -0
- package/build/esm/Init/StandardAdapters.js.map +1 -0
- package/build/esm/Init/Status.js +215 -0
- package/build/esm/Init/Status.js.map +1 -0
- package/build/esm/Install/Claude/Hook.js +52 -64
- package/build/esm/Install/Claude/Hook.js.map +1 -1
- package/build/esm/Install/Claude/Mcp.js +56 -26
- package/build/esm/Install/Claude/Mcp.js.map +1 -1
- package/build/esm/Install/Claude/Skill.js +49 -27
- package/build/esm/Install/Claude/Skill.js.map +1 -1
- package/build/esm/Install/Codex/Mcp.js +9 -4
- package/build/esm/Install/Codex/Mcp.js.map +1 -1
- package/build/esm/Install/Codex/Skill.js +4 -1
- package/build/esm/Install/Codex/Skill.js.map +1 -1
- package/build/esm/Install/Cursor/Mcp.js +7 -4
- package/build/esm/Install/Cursor/Mcp.js.map +1 -1
- package/build/esm/Install/Cursor/Skill.js +4 -1
- package/build/esm/Install/Cursor/Skill.js.map +1 -1
- package/build/esm/Install/Domain.js +60 -3
- package/build/esm/Install/Domain.js.map +1 -1
- package/build/esm/Install/Hook.js.map +1 -1
- package/build/esm/Install/Mcp.js +1 -1
- package/build/esm/Install/Mcp.js.map +1 -1
- package/build/esm/Install/Opencode/Hook.js +1 -1
- package/build/esm/Install/Opencode/Hook.js.map +1 -1
- package/build/esm/Install/Opencode/Mcp.js +6 -3
- package/build/esm/Install/Opencode/Mcp.js.map +1 -1
- package/build/esm/Install/Opencode/Skill.js +4 -1
- package/build/esm/Install/Opencode/Skill.js.map +1 -1
- package/build/esm/Install/Opencode/expandai-webfetch.js +27 -9
- package/build/esm/Install/Skill.js.map +1 -1
- package/build/esm/Install/Uninstall.js +2 -2
- package/build/esm/Install/Uninstall.js.map +1 -1
- package/build/esm/MarkdownAnsi.js +142 -0
- package/build/esm/MarkdownAnsi.js.map +1 -0
- package/build/esm/Mcp/ExpandDocs.js +44 -52
- package/build/esm/Mcp/ExpandDocs.js.map +1 -1
- package/build/esm/Mcp/RequestHeaders.js.map +1 -1
- package/build/esm/Mcp/Server.js +2 -1
- package/build/esm/Mcp/Server.js.map +1 -1
- package/build/esm/Mcp/tools/Citations.js +109 -8
- package/build/esm/Mcp/tools/Citations.js.map +1 -1
- package/build/esm/Mcp/tools/Fetch.js +36 -12
- package/build/esm/Mcp/tools/Fetch.js.map +1 -1
- package/build/esm/SecureFile.js +36 -0
- package/build/esm/SecureFile.js.map +1 -0
- package/build/esm/Snippets.js +12 -1
- package/build/esm/Snippets.js.map +1 -1
- package/build/esm/Telemetry.js +157 -0
- package/build/esm/Telemetry.js.map +1 -0
- package/build/esm/Version.js +4 -0
- package/build/esm/Version.js.map +1 -0
- package/build/esm/Xdg.js +15 -0
- package/build/esm/Xdg.js.map +1 -0
- package/build/esm/main.js +122 -14
- package/build/esm/main.js.map +1 -1
- package/build/skills/expandai/SKILL.md +37 -8
- package/package.json +4 -4
- package/src/ApiClient.ts +206 -13
- package/src/Auth/Domain.ts +63 -0
- package/src/Auth/ManualAuthorization.ts +296 -0
- package/src/Auth/PendingInit.ts +338 -0
- package/src/Auth/Pkce.ts +26 -0
- package/src/Auth/SetupGrantAuthorization.ts +116 -0
- package/src/Authentication.ts +49 -11
- package/src/BrowserOAuth.ts +10 -12
- package/src/CommandPath.ts +30 -0
- package/src/Commands/Fetch.ts +42 -11
- package/src/Commands/Init.ts +489 -0
- package/src/Commands/Search.ts +8 -3
- package/src/Commands/Status.ts +228 -0
- package/src/Commands/Telemetry.ts +42 -0
- package/src/Config.ts +695 -50
- package/src/Hook/Claude.ts +1 -1
- package/src/Hook/SnapshotNote.ts +55 -7
- package/src/Init/ClaudeAdapter.ts +191 -0
- package/src/Init/ClaudeProfile.ts +453 -0
- package/src/Init/Domain.ts +153 -0
- package/src/Init/HarnessAdapter.ts +35 -0
- package/src/Init/HarnessDetector.ts +77 -0
- package/src/Init/HarnessRegistry.ts +87 -0
- package/src/Init/MutationTransaction.ts +747 -0
- package/src/Init/Service.ts +385 -0
- package/src/Init/StandardAdapters.ts +141 -0
- package/src/Init/Status.ts +253 -0
- package/src/Install/Claude/Hook.ts +81 -91
- package/src/Install/Claude/Mcp.ts +80 -33
- package/src/Install/Claude/Skill.ts +70 -37
- package/src/Install/Codex/Mcp.ts +14 -9
- package/src/Install/Codex/Skill.ts +9 -5
- package/src/Install/Cursor/Mcp.ts +12 -9
- package/src/Install/Cursor/Skill.ts +9 -5
- package/src/Install/Domain.ts +77 -4
- package/src/Install/Hook.ts +3 -3
- package/src/Install/Mcp.ts +6 -6
- package/src/Install/Opencode/Hook.ts +5 -5
- package/src/Install/Opencode/Mcp.ts +11 -8
- package/src/Install/Opencode/Skill.ts +9 -5
- package/src/Install/Opencode/expandai-webfetch.js +27 -9
- package/src/Install/Skill.ts +3 -3
- package/src/Install/Uninstall.ts +3 -3
- package/src/MarkdownAnsi.ts +162 -0
- package/src/Mcp/ExpandDocs.ts +46 -55
- package/src/Mcp/Server.ts +2 -1
- package/src/Mcp/tools/Citations.ts +117 -8
- package/src/Mcp/tools/Fetch.ts +40 -14
- package/src/SecureFile.ts +70 -0
- package/src/Snippets.ts +19 -12
- package/src/Telemetry.ts +186 -0
- package/src/Version.ts +3 -0
- package/src/Xdg.ts +18 -0
- package/src/main.ts +171 -12
- package/build/dts/DeviceAuth.d.ts +0 -87
- package/build/dts/DeviceAuth.d.ts.map +0 -1
- package/build/esm/DeviceAuth.js +0 -127
- package/build/esm/DeviceAuth.js.map +0 -1
- package/src/DeviceAuth.ts +0 -193
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Effect, Schema } from 'effect';
|
|
2
|
+
import { ClaudeAdapter } from './ClaudeAdapter.js';
|
|
3
|
+
import { CodexAdapter, CursorAdapter, OpencodeAdapter } from './StandardAdapters.js';
|
|
4
|
+
export class UnsupportedInitHarnessError extends Schema.TaggedError()('UnsupportedInitHarnessError', {
|
|
5
|
+
harness: Schema.String,
|
|
6
|
+
}) {
|
|
7
|
+
get message() {
|
|
8
|
+
return `No init adapter is registered for ${this.harness}`;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function makeRegistry(adapters) {
|
|
12
|
+
const adaptersByHarness = new Map(adapters.map((adapter) => [adapter.harness, adapter]));
|
|
13
|
+
const find = Effect.fn('HarnessRegistry.find')(function* (harness) {
|
|
14
|
+
const adapter = adaptersByHarness.get(harness);
|
|
15
|
+
if (adapter === undefined) {
|
|
16
|
+
return yield* new UnsupportedInitHarnessError({ harness });
|
|
17
|
+
}
|
|
18
|
+
return adapter;
|
|
19
|
+
});
|
|
20
|
+
const inspect = Effect.fn('HarnessRegistry.inspect')(function* (harness, scope) {
|
|
21
|
+
const adapter = yield* find(harness);
|
|
22
|
+
return yield* adapter.inspect(scope);
|
|
23
|
+
});
|
|
24
|
+
const configure = Effect.fn('HarnessRegistry.configure')(function* (harness, scope) {
|
|
25
|
+
const adapter = yield* find(harness);
|
|
26
|
+
return yield* adapter.configure(scope);
|
|
27
|
+
});
|
|
28
|
+
return { inspect, configure };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* `Default` is the **real** registry, wired to the four adapters.
|
|
32
|
+
*
|
|
33
|
+
* It used to be `sync: () => makeRegistry([])` — an empty registry that reported
|
|
34
|
+
* every harness as unsupported. Nothing consumed it, because `main.ts` and the
|
|
35
|
+
* tests both built `DefaultWithoutDependencies` with a registry supplied by
|
|
36
|
+
* hand; but `InitService` and `StatusService` still *declared* it in their
|
|
37
|
+
* `dependencies`, so the declaration was decorative and would have silently
|
|
38
|
+
* produced an empty registry for anyone who reached for the obvious layer.
|
|
39
|
+
* `Effect.Service` always generates `Default`, so the fix is to make it correct
|
|
40
|
+
* rather than to remove it.
|
|
41
|
+
*/
|
|
42
|
+
export class HarnessRegistry extends Effect.Service()('@expandai/cli/Init/HarnessRegistry', {
|
|
43
|
+
dependencies: [ClaudeAdapter.Default, CursorAdapter.Default, OpencodeAdapter.Default, CodexAdapter.Default],
|
|
44
|
+
effect: Effect.gen(function* () {
|
|
45
|
+
const adapters = yield* Effect.all([ClaudeAdapter, CursorAdapter, OpencodeAdapter, CodexAdapter]);
|
|
46
|
+
return makeRegistry(adapters);
|
|
47
|
+
}),
|
|
48
|
+
}) {
|
|
49
|
+
/**
|
|
50
|
+
* The adapters are statically known at the composition root, so the contract
|
|
51
|
+
* is enforced by the type. The previous version took `ReadonlyArray<object>`
|
|
52
|
+
* and proved membership at runtime by walking prototypes and calling
|
|
53
|
+
* `Context.isTag` on the constructor — reflection standing in for a type, plus
|
|
54
|
+
* an error channel for a condition the compiler already rules out.
|
|
55
|
+
*/
|
|
56
|
+
static fromAdapters = (adapters) => HarnessRegistry.make(makeRegistry(adapters));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=HarnessRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HarnessRegistry.js","sourceRoot":"","sources":["../../../src/Init/HarnessRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAmBpF,MAAM,OAAO,2BAA4B,SAAQ,MAAM,CAAC,WAAW,EAA+B,CACjG,6BAA6B,EAC7B;IACC,OAAO,EAAE,MAAM,CAAC,MAAM;CACtB,CACD;IACA,IAAI,OAAO;QACV,OAAO,qCAAqC,IAAI,CAAC,OAAO,EAAE,CAAA;IAC3D,CAAC;CACD;AAED,SAAS,YAAY,CAAC,QAA+C;IACpE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IAExF,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAoB;QAC7E,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC9C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC,CAAC,IAAI,2BAA2B,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,OAAO,OAAO,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAoB,EAAE,KAAgB;QACrG,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAoB,EAAE,KAAgB;QACzG,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;AAC9B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,OAAO,EAAmB,CAAC,oCAAoC,EAAE;IAC5G,YAAY,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;IAC3G,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC,CAAA;QACjG,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC9B,CAAC,CAAC;CACF,CAAC;IACD;;;;;;OAMG;IACH,MAAM,CAAU,YAAY,GAAG,CAAC,QAA+C,EAAE,EAAE,CAClF,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAA;CAC7C"}
|
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
import { FileSystem, Path, Error as PlatformError } from '@effect/platform';
|
|
2
|
+
import { NodeFileSystem, NodePath } from '@effect/platform-node';
|
|
3
|
+
import { Array, Cause, Chunk, Effect, Either, Exit, Inspectable, Option, Schema, Scope } from 'effect';
|
|
4
|
+
const MutationFailure = Schema.Struct({
|
|
5
|
+
path: Schema.String,
|
|
6
|
+
operation: Schema.Literal('write', 'remove', 'mkdir'),
|
|
7
|
+
error: Schema.Defect,
|
|
8
|
+
});
|
|
9
|
+
export class MutationSymlinkError extends Schema.TaggedError()('MutationSymlinkError', {
|
|
10
|
+
path: Schema.String,
|
|
11
|
+
}) {
|
|
12
|
+
get message() {
|
|
13
|
+
return `Refusing to mutate through symbolic link ${this.path}`;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
class MutationPathChangedError extends Schema.TaggedError()('MutationPathChangedError', {
|
|
17
|
+
path: Schema.String,
|
|
18
|
+
}) {
|
|
19
|
+
get message() {
|
|
20
|
+
return `Path lineage changed while the mutation transaction was using ${this.path}`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
class MutationRollbackConflictError extends Schema.TaggedError()('MutationRollbackConflictError', {
|
|
24
|
+
path: Schema.String,
|
|
25
|
+
}) {
|
|
26
|
+
get message() {
|
|
27
|
+
return `Rollback preserved concurrent state at ${this.path}`;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export class MutationValidationError extends Schema.TaggedError()('MutationValidationError', MutationFailure.fields) {
|
|
31
|
+
get message() {
|
|
32
|
+
return `Mutation validation failed for ${this.path}: ${Inspectable.format(this.error)}`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class MutationApplicationError extends Schema.TaggedError()('MutationApplicationError', {
|
|
36
|
+
...MutationFailure.fields,
|
|
37
|
+
rollbackFailures: Schema.Array(MutationFailure),
|
|
38
|
+
}) {
|
|
39
|
+
get message() {
|
|
40
|
+
const rollbackSummary = this.rollbackFailures.length === 0 ? '' : `; ${this.rollbackFailures.length} rollback operation(s) also failed`;
|
|
41
|
+
return `Mutation failed for ${this.path}: ${Inspectable.format(this.error)}${rollbackSummary}`;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export class MutationRollbackError extends Schema.TaggedError()('MutationRollbackError', {
|
|
45
|
+
rollbackFailures: Schema.Array(MutationFailure),
|
|
46
|
+
}) {
|
|
47
|
+
get message() {
|
|
48
|
+
return `${this.rollbackFailures.length} rollback operation(s) failed after a defect or interruption`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const MODE_MAX = 0o7777;
|
|
52
|
+
function pathLineage(pathService, target) {
|
|
53
|
+
const absolute = pathService.resolve(target);
|
|
54
|
+
const root = pathService.parse(absolute).root;
|
|
55
|
+
function collect(current) {
|
|
56
|
+
if (current === root)
|
|
57
|
+
return [root];
|
|
58
|
+
return [...collect(pathService.dirname(current)), current];
|
|
59
|
+
}
|
|
60
|
+
return collect(absolute);
|
|
61
|
+
}
|
|
62
|
+
function bytesEqual(left, right) {
|
|
63
|
+
if (left === undefined || right === undefined)
|
|
64
|
+
return left === right;
|
|
65
|
+
if (left.byteLength !== right.byteLength)
|
|
66
|
+
return false;
|
|
67
|
+
return left.every((value, index) => value === right[index]);
|
|
68
|
+
}
|
|
69
|
+
function entriesEqual(left, right) {
|
|
70
|
+
if (left === undefined || right === undefined)
|
|
71
|
+
return left === right;
|
|
72
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
73
|
+
}
|
|
74
|
+
function statesEqual(left, right) {
|
|
75
|
+
return (left.exists === right.exists &&
|
|
76
|
+
left.type === right.type &&
|
|
77
|
+
left.mode === right.mode &&
|
|
78
|
+
bytesEqual(left.bytes, right.bytes) &&
|
|
79
|
+
entriesEqual(left.entries, right.entries));
|
|
80
|
+
}
|
|
81
|
+
function ownershipEqual(left, right) {
|
|
82
|
+
return (statesEqual(left, right) &&
|
|
83
|
+
(!left.exists || (left.dev === right.dev && left.ino === right.ino && left.realPath === right.realPath)));
|
|
84
|
+
}
|
|
85
|
+
function matchesExpectedState(actual, expected) {
|
|
86
|
+
if (actual.exists !== expected.exists)
|
|
87
|
+
return false;
|
|
88
|
+
if (!expected.exists)
|
|
89
|
+
return true;
|
|
90
|
+
if (actual.type !== expected.type || actual.mode !== expected.mode)
|
|
91
|
+
return false;
|
|
92
|
+
return expected.type === 'Directory' || bytesEqual(actual.bytes, expected.bytes);
|
|
93
|
+
}
|
|
94
|
+
function isErrnoCode(input, code) {
|
|
95
|
+
return typeof input === 'object' && input !== null && 'code' in input && input.code === code;
|
|
96
|
+
}
|
|
97
|
+
function identitiesEqual(left, right) {
|
|
98
|
+
return (left.length === right.length &&
|
|
99
|
+
left.every((entry, index) => {
|
|
100
|
+
const other = right[index];
|
|
101
|
+
return (other !== undefined &&
|
|
102
|
+
entry.path === other.path &&
|
|
103
|
+
entry.exists === other.exists &&
|
|
104
|
+
entry.dev === other.dev &&
|
|
105
|
+
entry.ino === other.ino &&
|
|
106
|
+
entry.realPath === other.realPath &&
|
|
107
|
+
entry.type === other.type);
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
function validationError(operation, error) {
|
|
111
|
+
return new MutationValidationError({ path: operation.path, operation: operation.type, error });
|
|
112
|
+
}
|
|
113
|
+
function invalidMutation(operation, message) {
|
|
114
|
+
return validationError(operation, new Error(message));
|
|
115
|
+
}
|
|
116
|
+
function applicationError(operation, error) {
|
|
117
|
+
return new MutationApplicationError({
|
|
118
|
+
path: operation.path,
|
|
119
|
+
operation: operation.type,
|
|
120
|
+
error,
|
|
121
|
+
rollbackFailures: [],
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const makeMutationTransaction = Effect.gen(function* () {
|
|
125
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
126
|
+
const pathService = yield* Path.Path;
|
|
127
|
+
const assertNotSymbolicLink = Effect.fnUntraced(function* (candidate) {
|
|
128
|
+
const result = yield* Effect.either(fileSystem.readLink(candidate));
|
|
129
|
+
if (Either.isRight(result))
|
|
130
|
+
return yield* new MutationSymlinkError({ path: candidate });
|
|
131
|
+
const error = result.left;
|
|
132
|
+
if (error instanceof PlatformError.SystemError &&
|
|
133
|
+
(error.reason === 'InvalidData' ||
|
|
134
|
+
error.reason === 'NotFound' ||
|
|
135
|
+
(error.method === 'readLink' && isErrnoCode(error.cause, 'EINVAL')))) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
return yield* error;
|
|
139
|
+
});
|
|
140
|
+
const inspectLineage = Effect.fnUntraced(function* (target) {
|
|
141
|
+
return yield* Effect.forEach(pathLineage(pathService, target), (candidate) => Effect.gen(function* () {
|
|
142
|
+
yield* assertNotSymbolicLink(candidate);
|
|
143
|
+
const exists = yield* fileSystem.exists(candidate);
|
|
144
|
+
if (!exists) {
|
|
145
|
+
const missing = { path: candidate, exists: false };
|
|
146
|
+
return missing;
|
|
147
|
+
}
|
|
148
|
+
const info = yield* fileSystem.stat(candidate);
|
|
149
|
+
const identity = {
|
|
150
|
+
path: candidate,
|
|
151
|
+
exists: true,
|
|
152
|
+
dev: info.dev,
|
|
153
|
+
ino: Option.getOrUndefined(info.ino),
|
|
154
|
+
realPath: yield* fileSystem.realPath(candidate),
|
|
155
|
+
type: info.type,
|
|
156
|
+
};
|
|
157
|
+
return identity;
|
|
158
|
+
}));
|
|
159
|
+
});
|
|
160
|
+
// @effect/platform and Node expose only path-based mutation APIs here: this
|
|
161
|
+
// closes detected lineage races but cannot eliminate the final syscall TOCTOU
|
|
162
|
+
// window without non-portable openat/renameat/unlinkat-style primitives.
|
|
163
|
+
const withStableLineage = Effect.fnUntraced(function* (target, action) {
|
|
164
|
+
const before = yield* inspectLineage(target);
|
|
165
|
+
const actionExit = yield* Effect.exit(action);
|
|
166
|
+
const afterExit = yield* Effect.exit(inspectLineage(target));
|
|
167
|
+
if (Exit.isFailure(afterExit)) {
|
|
168
|
+
return yield* Exit.isFailure(actionExit)
|
|
169
|
+
? Effect.failCause(Cause.sequential(actionExit.cause, afterExit.cause))
|
|
170
|
+
: Effect.failCause(afterExit.cause);
|
|
171
|
+
}
|
|
172
|
+
if (!identitiesEqual(before, afterExit.value)) {
|
|
173
|
+
const changed = new MutationPathChangedError({ path: target });
|
|
174
|
+
return yield* Exit.isFailure(actionExit)
|
|
175
|
+
? Effect.failCause(Cause.sequential(actionExit.cause, Cause.fail(changed)))
|
|
176
|
+
: changed;
|
|
177
|
+
}
|
|
178
|
+
return yield* Exit.isFailure(actionExit) ? Effect.failCause(actionExit.cause) : Effect.succeed(actionExit.value);
|
|
179
|
+
});
|
|
180
|
+
const rawSnapshot = Effect.fnUntraced(function* (target, includeDirectoryEntries) {
|
|
181
|
+
const exists = yield* fileSystem.exists(target);
|
|
182
|
+
if (!exists) {
|
|
183
|
+
const absent = { exists: false };
|
|
184
|
+
return absent;
|
|
185
|
+
}
|
|
186
|
+
const info = yield* fileSystem.stat(target);
|
|
187
|
+
if (info.type === 'File') {
|
|
188
|
+
const file = {
|
|
189
|
+
exists: true,
|
|
190
|
+
bytes: yield* fileSystem.readFile(target),
|
|
191
|
+
dev: info.dev,
|
|
192
|
+
ino: Option.getOrUndefined(info.ino),
|
|
193
|
+
mode: info.mode & MODE_MAX,
|
|
194
|
+
realPath: yield* fileSystem.realPath(target),
|
|
195
|
+
type: 'File',
|
|
196
|
+
};
|
|
197
|
+
return file;
|
|
198
|
+
}
|
|
199
|
+
if (info.type === 'Directory') {
|
|
200
|
+
const entries = includeDirectoryEntries ? [...(yield* fileSystem.readDirectory(target))].sort() : undefined;
|
|
201
|
+
const directory = {
|
|
202
|
+
exists: true,
|
|
203
|
+
dev: info.dev,
|
|
204
|
+
...(entries === undefined ? {} : { entries }),
|
|
205
|
+
ino: Option.getOrUndefined(info.ino),
|
|
206
|
+
mode: info.mode & MODE_MAX,
|
|
207
|
+
realPath: yield* fileSystem.realPath(target),
|
|
208
|
+
type: 'Directory',
|
|
209
|
+
};
|
|
210
|
+
return directory;
|
|
211
|
+
}
|
|
212
|
+
return yield* new MutationPathChangedError({ path: target });
|
|
213
|
+
});
|
|
214
|
+
const snapshot = Effect.fnUntraced(function* (target, includeDirectoryEntries = true) {
|
|
215
|
+
return yield* withStableLineage(target, rawSnapshot(target, includeDirectoryEntries).pipe(Effect.flatMap((first) => rawSnapshot(target, includeDirectoryEntries).pipe(Effect.flatMap((second) => statesEqual(first, second) ? Effect.succeed(second) : new MutationPathChangedError({ path: target }))))));
|
|
216
|
+
});
|
|
217
|
+
const validateMode = Effect.fnUntraced(function* (operation) {
|
|
218
|
+
if ('mode' in operation && operation.mode !== undefined) {
|
|
219
|
+
const valid = Number.isInteger(operation.mode) && operation.mode >= 0 && operation.mode <= MODE_MAX;
|
|
220
|
+
if (!valid)
|
|
221
|
+
return yield* invalidMutation(operation, `Invalid file mode ${operation.mode}`);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
const validateOperations = Effect.fnUntraced(function* (operations) {
|
|
225
|
+
const targets = new Set();
|
|
226
|
+
const plannedDirectories = new Set();
|
|
227
|
+
return yield* Effect.forEach(operations, (operation) => {
|
|
228
|
+
const absolutePath = pathService.resolve(operation.path);
|
|
229
|
+
return Effect.gen(function* () {
|
|
230
|
+
if (targets.has(absolutePath)) {
|
|
231
|
+
return yield* invalidMutation(operation, `Multiple mutations target ${absolutePath}`);
|
|
232
|
+
}
|
|
233
|
+
targets.add(absolutePath);
|
|
234
|
+
yield* validateMode(operation);
|
|
235
|
+
const lineage = yield* inspectLineage(absolutePath);
|
|
236
|
+
yield* Effect.forEach(lineage, (identity, index) => {
|
|
237
|
+
const isTarget = index === lineage.length - 1;
|
|
238
|
+
if (!identity.exists) {
|
|
239
|
+
const permitted = operation.type === 'mkdir' || isTarget || plannedDirectories.has(identity.path);
|
|
240
|
+
return permitted
|
|
241
|
+
? Effect.void
|
|
242
|
+
: invalidMutation(operation, `Parent directory does not exist: ${identity.path}`);
|
|
243
|
+
}
|
|
244
|
+
if (!isTarget && identity.type !== 'Directory') {
|
|
245
|
+
return invalidMutation(operation, `Parent path is not a directory: ${identity.path}`);
|
|
246
|
+
}
|
|
247
|
+
if (isTarget && operation.type === 'mkdir' && identity.type !== 'Directory') {
|
|
248
|
+
return invalidMutation(operation, `Directory mutation targets ${identity.type}: ${identity.path}`);
|
|
249
|
+
}
|
|
250
|
+
if (isTarget && operation.type !== 'mkdir' && identity.type !== 'File') {
|
|
251
|
+
return invalidMutation(operation, `File mutation targets ${identity.type}: ${identity.path}`);
|
|
252
|
+
}
|
|
253
|
+
return Effect.void;
|
|
254
|
+
}, { discard: true });
|
|
255
|
+
if (operation.validate !== undefined)
|
|
256
|
+
yield* operation.validate;
|
|
257
|
+
if (operation.type === 'mkdir') {
|
|
258
|
+
Array.forEach(pathLineage(pathService, absolutePath), (candidate) => plannedDirectories.add(candidate));
|
|
259
|
+
}
|
|
260
|
+
return { operation, absolutePath };
|
|
261
|
+
}).pipe(Effect.mapError((error) => error instanceof MutationValidationError || error instanceof MutationSymlinkError
|
|
262
|
+
? error
|
|
263
|
+
: validationError(operation, error)));
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
/**
|
|
267
|
+
* Scoped per call, not per transaction. The staging container lives inside the
|
|
268
|
+
* target's own parent directory, so while it exists it is an entry in that
|
|
269
|
+
* directory — and `statesEqual` compares directory entries. Holding the
|
|
270
|
+
* finalizer until the end of `run` therefore made rollback fail on exactly the
|
|
271
|
+
* case it exists for: a write into a directory this transaction created, whose
|
|
272
|
+
* restore compares the parent against a snapshot taken before the container
|
|
273
|
+
* appeared, sees one extra entry, and aborts with a rollback conflict.
|
|
274
|
+
*/
|
|
275
|
+
const writeAtomically = Effect.fnUntraced(function* (target, contents, expectedCurrent, mode, onInstalled) {
|
|
276
|
+
const parent = pathService.dirname(target);
|
|
277
|
+
const temporary = yield* Effect.acquireRelease(withStableLineage(parent, fileSystem.makeTempFile({ directory: parent, prefix: '.expandai-init-' })),
|
|
278
|
+
// `makeTempFile` nests the file inside its own `.expandai-init-*`
|
|
279
|
+
// directory, so removing just the file left that directory behind on
|
|
280
|
+
// every atomic write — they accumulated in the user's home and survived
|
|
281
|
+
// `uninstall`. Remove the container, never the target's own parent.
|
|
282
|
+
(temporary) => {
|
|
283
|
+
const container = pathService.dirname(temporary);
|
|
284
|
+
const stray = pathService.resolve(container) !== pathService.resolve(parent);
|
|
285
|
+
return withStableLineage(parent, stray
|
|
286
|
+
? fileSystem.remove(container, { force: true, recursive: true })
|
|
287
|
+
: fileSystem.remove(temporary, { force: true })).pipe(Effect.ignore);
|
|
288
|
+
});
|
|
289
|
+
yield* withStableLineage(temporary, fileSystem.writeFile(temporary, contents));
|
|
290
|
+
if (mode !== undefined)
|
|
291
|
+
yield* withStableLineage(temporary, fileSystem.chmod(temporary, mode));
|
|
292
|
+
const temporarySnapshot = yield* snapshot(temporary);
|
|
293
|
+
const expectedInstalled = { ...temporarySnapshot, realPath: pathService.resolve(target) };
|
|
294
|
+
yield* withStableLineage(parent, Effect.gen(function* () {
|
|
295
|
+
const current = yield* snapshot(target);
|
|
296
|
+
if (!ownershipEqual(current, expectedCurrent)) {
|
|
297
|
+
return yield* new MutationPathChangedError({ path: target });
|
|
298
|
+
}
|
|
299
|
+
// Install and register-the-undo, atomically. Everything after this point
|
|
300
|
+
// — including the post-install verification below — can fail freely:
|
|
301
|
+
// the undo is already on the scope, so rollback knows about the change.
|
|
302
|
+
// This is the only mask left, and it is two statements wide.
|
|
303
|
+
yield* Effect.uninterruptible(fileSystem
|
|
304
|
+
.rename(temporary, target)
|
|
305
|
+
.pipe(Effect.zipRight(onInstalled === undefined ? Effect.void : onInstalled(expectedInstalled))));
|
|
306
|
+
}));
|
|
307
|
+
const installed = yield* snapshot(target);
|
|
308
|
+
if (!ownershipEqual(installed, expectedInstalled))
|
|
309
|
+
return yield* new MutationPathChangedError({ path: target });
|
|
310
|
+
return installed;
|
|
311
|
+
}, Effect.scoped);
|
|
312
|
+
const removeSafely = Effect.fnUntraced(function* (target, expectedCurrent, onInstalled) {
|
|
313
|
+
const installed = { exists: false };
|
|
314
|
+
const remove = expectedCurrent.type === 'Directory' ? fileSystem.remove(target, { recursive: true }) : fileSystem.remove(target);
|
|
315
|
+
yield* withStableLineage(pathService.dirname(target), Effect.gen(function* () {
|
|
316
|
+
const current = yield* snapshot(target);
|
|
317
|
+
if (!ownershipEqual(current, expectedCurrent)) {
|
|
318
|
+
return yield* new MutationPathChangedError({ path: target });
|
|
319
|
+
}
|
|
320
|
+
yield* Effect.uninterruptible(remove.pipe(Effect.zipRight(onInstalled === undefined ? Effect.void : onInstalled(installed))));
|
|
321
|
+
}));
|
|
322
|
+
const verified = yield* snapshot(target);
|
|
323
|
+
if (!statesEqual(verified, installed))
|
|
324
|
+
return yield* new MutationPathChangedError({ path: target });
|
|
325
|
+
return installed;
|
|
326
|
+
});
|
|
327
|
+
const makeDirectoryAtomically = Effect.fnUntraced(function* (target, expectedCurrent, mode, onInstalled) {
|
|
328
|
+
const parent = pathService.dirname(target);
|
|
329
|
+
const temporary = yield* Effect.acquireRelease(withStableLineage(parent, fileSystem.makeTempDirectory({ directory: parent, prefix: '.expandai-init-directory-' })), (temporary) => withStableLineage(parent, fileSystem.remove(temporary, { force: true, recursive: true })).pipe(Effect.ignore));
|
|
330
|
+
if (mode !== undefined)
|
|
331
|
+
yield* withStableLineage(temporary, fileSystem.chmod(temporary, mode));
|
|
332
|
+
const temporarySnapshot = yield* snapshot(temporary);
|
|
333
|
+
const expectedInstalled = { ...temporarySnapshot, realPath: pathService.resolve(target) };
|
|
334
|
+
yield* withStableLineage(parent, Effect.gen(function* () {
|
|
335
|
+
const current = yield* snapshot(target);
|
|
336
|
+
if (!ownershipEqual(current, expectedCurrent)) {
|
|
337
|
+
return yield* new MutationPathChangedError({ path: target });
|
|
338
|
+
}
|
|
339
|
+
// Install and register-the-undo, atomically. Everything after this point
|
|
340
|
+
// — including the post-install verification below — can fail freely:
|
|
341
|
+
// the undo is already on the scope, so rollback knows about the change.
|
|
342
|
+
// This is the only mask left, and it is two statements wide.
|
|
343
|
+
yield* Effect.uninterruptible(fileSystem
|
|
344
|
+
.rename(temporary, target)
|
|
345
|
+
.pipe(Effect.zipRight(onInstalled === undefined ? Effect.void : onInstalled(expectedInstalled))));
|
|
346
|
+
}));
|
|
347
|
+
const installed = yield* snapshot(target);
|
|
348
|
+
if (!ownershipEqual(installed, expectedInstalled))
|
|
349
|
+
return yield* new MutationPathChangedError({ path: target });
|
|
350
|
+
return installed;
|
|
351
|
+
}, Effect.scoped);
|
|
352
|
+
/**
|
|
353
|
+
* Each undo banks its own cause: `addFinalizer` requires `Effect<X, never, R>`,
|
|
354
|
+
* so a release cannot fail in the typed channel. `run` folds these into the
|
|
355
|
+
* transaction's failure once the scope has closed, preserving the reporting the
|
|
356
|
+
* old `attachRollbackFailures` path gave us.
|
|
357
|
+
*/
|
|
358
|
+
const bankFailure = (failures, path, operation, undo) => Effect.exit(undo).pipe(Effect.flatMap((exit) => Exit.isSuccess(exit)
|
|
359
|
+
? Effect.void
|
|
360
|
+
: Effect.sync(() => {
|
|
361
|
+
failures.push({ path, operation, error: exit.cause });
|
|
362
|
+
}).pipe(
|
|
363
|
+
// Also logged, not only banked. When the transaction is
|
|
364
|
+
// interrupted rather than failed, the fiber may never reach the
|
|
365
|
+
// bookkeeping that folds these into the returned cause — and
|
|
366
|
+
// "rollback was incomplete" is the one thing an operator must not
|
|
367
|
+
// lose. The typed cause still carries them on every other path.
|
|
368
|
+
Effect.zipRight(Effect.logError(`Rollback failed for ${path} (${operation})`, Cause.pretty(exit.cause))))));
|
|
369
|
+
/**
|
|
370
|
+
* Confirms the change is still ours, applies `restore`, and confirms the result
|
|
371
|
+
* matches the state we started from.
|
|
372
|
+
*
|
|
373
|
+
* The *shape* of the restoration comes from the caller — the code that knows
|
|
374
|
+
* what it just did — not from inspecting `before` here. The previous version
|
|
375
|
+
* branched on `before.type` with no branch for a directory, so an unhandled
|
|
376
|
+
* prior state surfaced as a rollback *conflict*, blaming a concurrent writer
|
|
377
|
+
* for a case nobody had implemented.
|
|
378
|
+
*/
|
|
379
|
+
const undoWith = Effect.fnUntraced(function* (path, installed, before, restore) {
|
|
380
|
+
const current = yield* snapshot(path);
|
|
381
|
+
if (!ownershipEqual(current, installed))
|
|
382
|
+
return yield* new MutationRollbackConflictError({ path });
|
|
383
|
+
yield* restore(current);
|
|
384
|
+
const restored = yield* snapshot(path);
|
|
385
|
+
if (!statesEqual(restored, before))
|
|
386
|
+
return yield* new MutationRollbackConflictError({ path });
|
|
387
|
+
});
|
|
388
|
+
/** Undo for something created where nothing was: remove it again. */
|
|
389
|
+
const undoToAbsent = (path, installed, before) => undoWith(path, installed, before, (current) => removeSafely(path, current));
|
|
390
|
+
/** Undo for something replaced or deleted: put the original bytes back. */
|
|
391
|
+
const undoToFile = (path, installed, before, bytes) => undoWith(path, installed, before, (current) => writeAtomically(path, bytes, current, before.mode));
|
|
392
|
+
/**
|
|
393
|
+
* Applies one mutation, registering the effect that reverses it on `scope` at
|
|
394
|
+
* the instant it lands.
|
|
395
|
+
*
|
|
396
|
+
* The scope is passed explicitly rather than taken from the environment: an
|
|
397
|
+
* ambient scope of transaction lifetime would silently adopt any future
|
|
398
|
+
* unscoped `acquireRelease` in this file and hold its resource open for the
|
|
399
|
+
* whole transaction — the defect that once made rollback fail. Staging
|
|
400
|
+
* resources still scope to the single operation that creates them.
|
|
401
|
+
*/
|
|
402
|
+
const applyOne = Effect.fnUntraced(function* (planned, scope, failures) {
|
|
403
|
+
const { operation, path, snapshot: before } = planned;
|
|
404
|
+
const current = yield* snapshot(path);
|
|
405
|
+
if (!ownershipEqual(current, before))
|
|
406
|
+
return yield* new MutationPathChangedError({ path });
|
|
407
|
+
const register = (undoPath, undo) => (installed) => Scope.addFinalizerExit(scope, (exit) => Exit.isSuccess(exit) ? Effect.void : bankFailure(failures, undoPath, operation.type, undo(installed)));
|
|
408
|
+
if (operation.type === 'write') {
|
|
409
|
+
const desiredMode = operation.mode ?? before.mode;
|
|
410
|
+
if (before.type === 'File' && bytesEqual(before.bytes, operation.bytes) && before.mode === desiredMode)
|
|
411
|
+
return;
|
|
412
|
+
const original = before.exists ? before.bytes : undefined;
|
|
413
|
+
yield* writeAtomically(path, operation.bytes, before, desiredMode, register(path, (installed) => original === undefined
|
|
414
|
+
? undoToAbsent(path, installed, before)
|
|
415
|
+
: undoToFile(path, installed, before, original)));
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
if (operation.type === 'remove') {
|
|
419
|
+
if (!before.exists)
|
|
420
|
+
return;
|
|
421
|
+
// Validation refuses a non-`File` target, so the bytes are present.
|
|
422
|
+
const original = before.bytes;
|
|
423
|
+
if (original === undefined)
|
|
424
|
+
return yield* new MutationPathChangedError({ path });
|
|
425
|
+
yield* removeSafely(path, before, register(path, (installed) => undoToFile(path, installed, before, original)));
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
if (before.exists)
|
|
429
|
+
return;
|
|
430
|
+
yield* Effect.forEach(pathLineage(pathService, path), (candidate) => Effect.gen(function* () {
|
|
431
|
+
// Existing ancestors are owned by other processes. Their identity
|
|
432
|
+
// must stay stable, but unrelated sibling entries may legitimately churn.
|
|
433
|
+
const candidateBefore = yield* snapshot(candidate, false);
|
|
434
|
+
if (candidateBefore.exists)
|
|
435
|
+
return;
|
|
436
|
+
yield* makeDirectoryAtomically(candidate, candidateBefore, operation.mode, register(candidate, (installed) => undoToAbsent(candidate, installed, candidateBefore)));
|
|
437
|
+
}), { discard: true });
|
|
438
|
+
});
|
|
439
|
+
const attachRollbackFailures = Effect.fnUntraced(function* (cause, rollbackFailures) {
|
|
440
|
+
if (rollbackFailures.length === 0)
|
|
441
|
+
return cause;
|
|
442
|
+
const mapped = Cause.map(cause, (error) => error instanceof MutationApplicationError
|
|
443
|
+
? new MutationApplicationError({
|
|
444
|
+
path: error.path,
|
|
445
|
+
operation: error.operation,
|
|
446
|
+
error: error.error,
|
|
447
|
+
rollbackFailures: [...rollbackFailures],
|
|
448
|
+
})
|
|
449
|
+
: error);
|
|
450
|
+
const hasApplicationError = Chunk.some(Cause.failures(cause), (error) => error instanceof MutationApplicationError);
|
|
451
|
+
return hasApplicationError
|
|
452
|
+
? mapped
|
|
453
|
+
: Cause.sequential(mapped, Cause.fail(new MutationRollbackError({ rollbackFailures: [...rollbackFailures] })));
|
|
454
|
+
});
|
|
455
|
+
const run = Effect.fn('MutationTransaction.run')(function* (operations) {
|
|
456
|
+
const validated = yield* validateOperations(operations);
|
|
457
|
+
const planned = yield* Effect.forEach(validated, ({ operation, absolutePath }) => Effect.gen(function* () {
|
|
458
|
+
const actual = yield* snapshot(absolutePath);
|
|
459
|
+
if (operation.expected !== undefined && !matchesExpectedState(actual, operation.expected)) {
|
|
460
|
+
return yield* invalidMutation(operation, 'Expected mutation state no longer matches');
|
|
461
|
+
}
|
|
462
|
+
return { operation, path: absolutePath, snapshot: actual };
|
|
463
|
+
}).pipe(Effect.mapError((error) => error instanceof MutationValidationError ? error : validationError(operation, error))));
|
|
464
|
+
// Rollback is a scope, not a transaction-wide mask.
|
|
465
|
+
//
|
|
466
|
+
// Each installer registers its undo on `scope` in the same uninterruptible
|
|
467
|
+
// step that performs the change, so no change can exist on disk that rollback
|
|
468
|
+
// does not know about — including one whose post-install verification then
|
|
469
|
+
// fails. `Effect.onExit` is `uninterruptibleMask((restore) =>
|
|
470
|
+
// matchCauseEffect(restore(self), ...))` (`core.ts:1113`), so closing the
|
|
471
|
+
// scope runs every undo, in reverse order of registration
|
|
472
|
+
// (`fiberRuntime.ts:3256`), and cannot itself be interrupted. Both guarantees
|
|
473
|
+
// come from combinators rather than from this function remembering to restore
|
|
474
|
+
// correctly.
|
|
475
|
+
const scope = yield* Scope.make();
|
|
476
|
+
// Per run, not per service: two transactions on one `MutationTransaction`
|
|
477
|
+
// instance would otherwise share one array and cross-attribute — or clear —
|
|
478
|
+
// each other's rollback diagnostics.
|
|
479
|
+
const rollbackFailures = [];
|
|
480
|
+
const application = Effect.forEach(planned, (item) => applyOne(item, scope, rollbackFailures).pipe(Effect.mapError((error) => error instanceof MutationApplicationError ? error : applicationError(item.operation, error))), { discard: true });
|
|
481
|
+
const exit = yield* Effect.exit(application.pipe(Effect.onExit((applicationExit) => Scope.close(scope, applicationExit))));
|
|
482
|
+
if (Exit.isSuccess(exit))
|
|
483
|
+
return;
|
|
484
|
+
const cause = yield* attachRollbackFailures(exit.cause, rollbackFailures);
|
|
485
|
+
return yield* Effect.failCause(cause);
|
|
486
|
+
});
|
|
487
|
+
return { run };
|
|
488
|
+
});
|
|
489
|
+
export class MutationTransaction extends Effect.Service()('@expandai/cli/Init/MutationTransaction', {
|
|
490
|
+
dependencies: [NodeFileSystem.layer, NodePath.layer],
|
|
491
|
+
effect: makeMutationTransaction,
|
|
492
|
+
}) {
|
|
493
|
+
}
|
|
494
|
+
//# sourceMappingURL=MutationTransaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MutationTransaction.js","sourceRoot":"","sources":["../../../src/Init/MutationTransaction.ts"],"names":[],"mappings":"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"}
|