@intutic/sync-daemon 2.0.0 → 2.2.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.
- package/dist/agentReporter.d.ts +5 -12
- package/dist/agentReporter.d.ts.map +1 -1
- package/dist/agentReporter.js +25 -4
- package/dist/agentReporter.js.map +1 -1
- package/dist/configReader.d.ts +44 -22
- package/dist/configReader.d.ts.map +1 -1
- package/dist/configReader.js +70 -44
- package/dist/configReader.js.map +1 -1
- package/dist/configWriter.d.ts +29 -41
- package/dist/configWriter.d.ts.map +1 -1
- package/dist/configWriter.js +28 -625
- package/dist/configWriter.js.map +1 -1
- package/dist/disconnect/harnesses.d.ts +31 -0
- package/dist/disconnect/harnesses.d.ts.map +1 -0
- package/dist/disconnect/harnesses.js +728 -0
- package/dist/disconnect/harnesses.js.map +1 -0
- package/dist/disconnect/index.d.ts +25 -0
- package/dist/disconnect/index.d.ts.map +1 -0
- package/dist/disconnect/index.js +82 -0
- package/dist/disconnect/index.js.map +1 -0
- package/dist/disconnect/mcp.d.ts +60 -0
- package/dist/disconnect/mcp.d.ts.map +1 -0
- package/dist/disconnect/mcp.js +283 -0
- package/dist/disconnect/mcp.js.map +1 -0
- package/dist/disconnect/originals.d.ts +88 -0
- package/dist/disconnect/originals.d.ts.map +1 -0
- package/dist/disconnect/originals.js +257 -0
- package/dist/disconnect/originals.js.map +1 -0
- package/dist/disconnect/plan.d.ts +175 -0
- package/dist/disconnect/plan.d.ts.map +1 -0
- package/dist/disconnect/plan.js +580 -0
- package/dist/disconnect/plan.js.map +1 -0
- package/dist/disconnect/recognise.d.ts +43 -0
- package/dist/disconnect/recognise.d.ts.map +1 -0
- package/dist/disconnect/recognise.js +98 -0
- package/dist/disconnect/recognise.js.map +1 -0
- package/dist/disconnect/tomlLines.d.ts +39 -0
- package/dist/disconnect/tomlLines.d.ts.map +1 -0
- package/dist/disconnect/tomlLines.js +105 -0
- package/dist/disconnect/tomlLines.js.map +1 -0
- package/dist/harness/aiderConfigMerger.d.ts +42 -5
- package/dist/harness/aiderConfigMerger.d.ts.map +1 -1
- package/dist/harness/aiderConfigMerger.js +113 -86
- package/dist/harness/aiderConfigMerger.js.map +1 -1
- package/dist/harness/antigravityHooks.d.ts +13 -8
- package/dist/harness/antigravityHooks.d.ts.map +1 -1
- package/dist/harness/antigravityHooks.js +53 -39
- package/dist/harness/antigravityHooks.js.map +1 -1
- package/dist/harness/claudeCodeHooks.d.ts +1 -2
- package/dist/harness/claudeCodeHooks.d.ts.map +1 -1
- package/dist/harness/claudeCodeHooks.js +61 -34
- package/dist/harness/claudeCodeHooks.js.map +1 -1
- package/dist/harness/claudeDesktopHooks.d.ts +3 -0
- package/dist/harness/claudeDesktopHooks.d.ts.map +1 -1
- package/dist/harness/claudeDesktopHooks.js +3 -1
- package/dist/harness/claudeDesktopHooks.js.map +1 -1
- package/dist/harness/claudeProjectApproval.d.ts +53 -0
- package/dist/harness/claudeProjectApproval.d.ts.map +1 -0
- package/dist/harness/claudeProjectApproval.js +159 -0
- package/dist/harness/claudeProjectApproval.js.map +1 -0
- package/dist/harness/clineHooks.d.ts +39 -9
- package/dist/harness/clineHooks.d.ts.map +1 -1
- package/dist/harness/clineHooks.js +142 -60
- package/dist/harness/clineHooks.js.map +1 -1
- package/dist/harness/codexConfigMerger.d.ts +38 -0
- package/dist/harness/codexConfigMerger.d.ts.map +1 -0
- package/dist/harness/codexConfigMerger.js +105 -0
- package/dist/harness/codexConfigMerger.js.map +1 -0
- package/dist/harness/codexHooks.d.ts +4 -2
- package/dist/harness/codexHooks.d.ts.map +1 -1
- package/dist/harness/codexHooks.js +14 -11
- package/dist/harness/codexHooks.js.map +1 -1
- package/dist/harness/continueConfigMerger.d.ts +46 -0
- package/dist/harness/continueConfigMerger.d.ts.map +1 -0
- package/dist/harness/continueConfigMerger.js +94 -0
- package/dist/harness/continueConfigMerger.js.map +1 -0
- package/dist/harness/continueHooks.d.ts +15 -25
- package/dist/harness/continueHooks.d.ts.map +1 -1
- package/dist/harness/continueHooks.js +25 -119
- package/dist/harness/continueHooks.js.map +1 -1
- package/dist/harness/cursorHooks.d.ts +33 -16
- package/dist/harness/cursorHooks.d.ts.map +1 -1
- package/dist/harness/cursorHooks.js +69 -25
- package/dist/harness/cursorHooks.js.map +1 -1
- package/dist/harness/dshHooks.d.ts +59 -52
- package/dist/harness/dshHooks.d.ts.map +1 -1
- package/dist/harness/dshHooks.js +152 -147
- package/dist/harness/dshHooks.js.map +1 -1
- package/dist/harness/gateBody.d.ts +11 -2
- package/dist/harness/gateBody.d.ts.map +1 -1
- package/dist/harness/gateBody.js +33 -6
- package/dist/harness/gateBody.js.map +1 -1
- package/dist/harness/gateKind.d.ts.map +1 -1
- package/dist/harness/gateKind.js +1 -0
- package/dist/harness/gateKind.js.map +1 -1
- package/dist/harness/githubCopilotHooks.d.ts.map +1 -1
- package/dist/harness/githubCopilotHooks.js +5 -10
- package/dist/harness/githubCopilotHooks.js.map +1 -1
- package/dist/harness/gooseHooks.d.ts +15 -0
- package/dist/harness/gooseHooks.d.ts.map +1 -1
- package/dist/harness/gooseHooks.js +55 -43
- package/dist/harness/gooseHooks.js.map +1 -1
- package/dist/harness/grokHooks.d.ts.map +1 -1
- package/dist/harness/grokHooks.js +14 -12
- package/dist/harness/grokHooks.js.map +1 -1
- package/dist/harness/hermesHooks.d.ts +9 -0
- package/dist/harness/hermesHooks.d.ts.map +1 -1
- package/dist/harness/hermesHooks.js +39 -33
- package/dist/harness/hermesHooks.js.map +1 -1
- package/dist/harness/holdRedaction.d.ts +4 -1
- package/dist/harness/holdRedaction.d.ts.map +1 -1
- package/dist/harness/holdRedaction.js +32 -8
- package/dist/harness/holdRedaction.js.map +1 -1
- package/dist/harness/jetbrainsXmlConfig.d.ts +20 -0
- package/dist/harness/jetbrainsXmlConfig.d.ts.map +1 -1
- package/dist/harness/jetbrainsXmlConfig.js +39 -18
- package/dist/harness/jetbrainsXmlConfig.js.map +1 -1
- package/dist/harness/jsonMergeTarget.d.ts +23 -0
- package/dist/harness/jsonMergeTarget.d.ts.map +1 -0
- package/dist/harness/jsonMergeTarget.js +50 -0
- package/dist/harness/jsonMergeTarget.js.map +1 -0
- package/dist/harness/mcpAutoWrite.d.ts +64 -20
- package/dist/harness/mcpAutoWrite.d.ts.map +1 -1
- package/dist/harness/mcpAutoWrite.js +429 -85
- package/dist/harness/mcpAutoWrite.js.map +1 -1
- package/dist/harness/museHooks.d.ts.map +1 -1
- package/dist/harness/museHooks.js +6 -2
- package/dist/harness/museHooks.js.map +1 -1
- package/dist/harness/n8nHooks.d.ts.map +1 -1
- package/dist/harness/n8nHooks.js +6 -7
- package/dist/harness/n8nHooks.js.map +1 -1
- package/dist/harness/openCodeHooks.d.ts +37 -6
- package/dist/harness/openCodeHooks.d.ts.map +1 -1
- package/dist/harness/openCodeHooks.js +103 -13
- package/dist/harness/openCodeHooks.js.map +1 -1
- package/dist/harness/openWebuiHooks.d.ts.map +1 -1
- package/dist/harness/openWebuiHooks.js +10 -5
- package/dist/harness/openWebuiHooks.js.map +1 -1
- package/dist/harness/openclawHooks.d.ts +5 -0
- package/dist/harness/openclawHooks.d.ts.map +1 -1
- package/dist/harness/openclawHooks.js +3 -1
- package/dist/harness/openclawHooks.js.map +1 -1
- package/dist/harness/openhandsHooks.d.ts +26 -1
- package/dist/harness/openhandsHooks.d.ts.map +1 -1
- package/dist/harness/openhandsHooks.js +160 -40
- package/dist/harness/openhandsHooks.js.map +1 -1
- package/dist/harness/piHooks.d.ts +17 -0
- package/dist/harness/piHooks.d.ts.map +1 -1
- package/dist/harness/piHooks.js +31 -29
- package/dist/harness/piHooks.js.map +1 -1
- package/dist/harness/protectedPaths.d.ts +64 -6
- package/dist/harness/protectedPaths.d.ts.map +1 -1
- package/dist/harness/protectedPaths.js +161 -11
- package/dist/harness/protectedPaths.js.map +1 -1
- package/dist/harness/rooCodeHooks.d.ts.map +1 -1
- package/dist/harness/rooCodeHooks.js +5 -10
- package/dist/harness/rooCodeHooks.js.map +1 -1
- package/dist/harness/windsurfHooks.d.ts +21 -3
- package/dist/harness/windsurfHooks.d.ts.map +1 -1
- package/dist/harness/windsurfHooks.js +96 -44
- package/dist/harness/windsurfHooks.js.map +1 -1
- package/dist/harness/windsurfJetBrainsProxy.d.ts +10 -7
- package/dist/harness/windsurfJetBrainsProxy.d.ts.map +1 -1
- package/dist/harness/windsurfJetBrainsProxy.js +22 -7
- package/dist/harness/windsurfJetBrainsProxy.js.map +1 -1
- package/dist/index.d.ts +12 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -10
- package/dist/index.js.map +1 -1
- package/dist/lib/decisionsDigest.d.ts +1 -1
- package/dist/lib/decisionsDigest.js +1 -1
- package/dist/lib/policySnapshot.d.ts +37 -0
- package/dist/lib/policySnapshot.d.ts.map +1 -1
- package/dist/lib/policySnapshot.js +170 -8
- package/dist/lib/policySnapshot.js.map +1 -1
- package/dist/sessionReporter.d.ts +2 -2
- package/dist/sessionReporter.js +2 -2
- package/dist/syncCycle.d.ts +142 -0
- package/dist/syncCycle.d.ts.map +1 -0
- package/dist/syncCycle.js +315 -0
- package/dist/syncCycle.js.map +1 -0
- package/dist/trajectoryMonitor.d.ts +1 -1
- package/dist/trajectoryMonitor.d.ts.map +1 -1
- package/dist/trajectoryMonitor.js +1 -1
- package/dist/trajectoryMonitor.js.map +1 -1
- package/dist/watcher/settingsGuard.d.ts +4 -1
- package/dist/watcher/settingsGuard.d.ts.map +1 -1
- package/dist/watcher/settingsGuard.js +42 -18
- package/dist/watcher/settingsGuard.js.map +1 -1
- package/package.json +6 -6
- package/dist/hashReporter.d.ts +0 -33
- package/dist/hashReporter.d.ts.map +0 -1
- package/dist/hashReporter.js +0 -69
- package/dist/hashReporter.js.map +0 -1
- package/dist/integrityStore.d.ts +0 -35
- package/dist/integrityStore.d.ts.map +0 -1
- package/dist/integrityStore.js +0 -71
- package/dist/integrityStore.js.map +0 -1
- package/dist/lib/gitWorktrees.d.ts +0 -140
- package/dist/lib/gitWorktrees.d.ts.map +0 -1
- package/dist/lib/gitWorktrees.js +0 -191
- package/dist/lib/gitWorktrees.js.map +0 -1
- package/dist/syncLoop.d.ts +0 -172
- package/dist/syncLoop.d.ts.map +0 -1
- package/dist/syncLoop.js +0 -878
- package/dist/syncLoop.js.map +0 -1
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* plan.ts — the changes `intutic disconnect` will make, computed before any is
|
|
3
|
+
* made, so `--dry-run` prints exactly what a real run does.
|
|
4
|
+
*
|
|
5
|
+
* Every reverser adds to one {@link DisconnectPlan}. A change is either a
|
|
6
|
+
* file restored, rewritten or deleted, or a command run; a note is something
|
|
7
|
+
* left alone on purpose, with the reason. The helpers here cover the two
|
|
8
|
+
* shapes nearly every Intutic write takes:
|
|
9
|
+
*
|
|
10
|
+
* - {@link reverseOwnedFile}: a file Intutic writes whole (a rules file, a
|
|
11
|
+
* gate script, a hook definition it owns).
|
|
12
|
+
* - {@link reverseStructuredFile}: a JSON, YAML or TOML file the user owns
|
|
13
|
+
* that Intutic merges entries into.
|
|
14
|
+
*
|
|
15
|
+
* Both consult the record `originals.ts` kept, and both end the same way: a
|
|
16
|
+
* file that comes out semantically equal to its original gets the original
|
|
17
|
+
* bytes back, so an untouched file is restored exactly even where Intutic's
|
|
18
|
+
* write had reformatted it.
|
|
19
|
+
*
|
|
20
|
+
* @module
|
|
21
|
+
*/
|
|
22
|
+
import * as node_fs from 'node:fs/promises';
|
|
23
|
+
import * as node_path from 'node:path';
|
|
24
|
+
import { execFileSync } from 'node:child_process';
|
|
25
|
+
import { realpathSync } from 'node:fs';
|
|
26
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
27
|
+
import { parseDocument, isMap, isNode, isScalar } from 'yaml';
|
|
28
|
+
import { parse as parseToml, stringify as stringifyToml } from 'smol-toml';
|
|
29
|
+
import { forgetOriginal, readOriginal, sha256 } from './originals.js';
|
|
30
|
+
export class DisconnectPlan {
|
|
31
|
+
changes = [];
|
|
32
|
+
notes = [];
|
|
33
|
+
change(path, describe, apply) {
|
|
34
|
+
this.changes.push({ path, describe, apply });
|
|
35
|
+
}
|
|
36
|
+
quiet(path, apply) {
|
|
37
|
+
this.changes.push({ path, describe: '', quiet: true, apply });
|
|
38
|
+
}
|
|
39
|
+
note(path, message) {
|
|
40
|
+
this.notes.push({ path, message });
|
|
41
|
+
}
|
|
42
|
+
claimed = new Set();
|
|
43
|
+
/**
|
|
44
|
+
* Claims `path` for one reverser. A file several writers touch is reversed
|
|
45
|
+
* in one pass; a second claim (another harness listing the same file)
|
|
46
|
+
* gets false and must leave it to the first.
|
|
47
|
+
*/
|
|
48
|
+
claim(path) {
|
|
49
|
+
if (this.claimed.has(path))
|
|
50
|
+
return false;
|
|
51
|
+
this.claimed.add(path);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
/** The changes a user should see, without the housekeeping. */
|
|
55
|
+
visible() {
|
|
56
|
+
return this.changes.filter((c) => !c.quiet);
|
|
57
|
+
}
|
|
58
|
+
emptyDirs = [];
|
|
59
|
+
/**
|
|
60
|
+
* Removes `dir` after every change has run, if nothing is left in it. Only
|
|
61
|
+
* for directories named for Intutic (`.intutic/hooks`, a plugin directory
|
|
62
|
+
* called `intutic-governance`) and ones a record says Intutic created: a
|
|
63
|
+
* directory created for one file may hold another Intutic file deleted
|
|
64
|
+
* later in the run, so it is retried at the end.
|
|
65
|
+
*/
|
|
66
|
+
removeIfEmpty(dir) {
|
|
67
|
+
if (!this.emptyDirs.includes(dir))
|
|
68
|
+
this.emptyDirs.push(dir);
|
|
69
|
+
}
|
|
70
|
+
/** Runs every change in order, then the directory clean-up, deepest directory first. */
|
|
71
|
+
async apply() {
|
|
72
|
+
for (const change of this.changes)
|
|
73
|
+
await change.apply();
|
|
74
|
+
const dirs = [...this.emptyDirs].sort((a, b) => b.length - a.length);
|
|
75
|
+
for (const dir of dirs) {
|
|
76
|
+
try {
|
|
77
|
+
await node_fs.rmdir(dir);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Not empty, or not there.
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// ─── File operations ─────────────────────────────────────────────────────────
|
|
86
|
+
export async function readText(file) {
|
|
87
|
+
try {
|
|
88
|
+
return await node_fs.readFile(file, 'utf-8');
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function writeAtomic(file, content, mode) {
|
|
95
|
+
let keepMode = mode;
|
|
96
|
+
if (keepMode === undefined) {
|
|
97
|
+
try {
|
|
98
|
+
keepMode = (await node_fs.stat(file)).mode & 0o7777;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
keepMode = undefined;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const tmp = `${file}.intutic-disconnect-tmp`;
|
|
105
|
+
await node_fs.writeFile(tmp, content);
|
|
106
|
+
if (keepMode !== undefined)
|
|
107
|
+
await node_fs.chmod(tmp, keepMode);
|
|
108
|
+
await node_fs.rename(tmp, file);
|
|
109
|
+
}
|
|
110
|
+
/** Deletes `file`, then each directory in `dirs` (deepest first) that is left empty. */
|
|
111
|
+
export async function deleteFile(file, dirs = []) {
|
|
112
|
+
await node_fs.rm(file, { force: true });
|
|
113
|
+
for (const dir of [...dirs].reverse()) {
|
|
114
|
+
try {
|
|
115
|
+
await node_fs.rmdir(dir);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Not empty (the user put something there), or already gone.
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The version of `file` committed at HEAD, when it is tracked in a git
|
|
125
|
+
* repository; null otherwise.
|
|
126
|
+
*/
|
|
127
|
+
export function committedVersion(file) {
|
|
128
|
+
try {
|
|
129
|
+
// git reports the top level as a real path; /tmp and /var are symlinks on macOS.
|
|
130
|
+
const dir = realpathSync(node_path.dirname(file));
|
|
131
|
+
const top = execFileSync('git', ['-C', dir, 'rev-parse', '--show-toplevel'], {
|
|
132
|
+
encoding: 'utf-8',
|
|
133
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
134
|
+
timeout: 5000,
|
|
135
|
+
}).trim();
|
|
136
|
+
const rel = node_path.relative(top, node_path.join(dir, node_path.basename(file))).split(node_path.sep).join('/');
|
|
137
|
+
return execFileSync('git', ['-C', top, 'show', `HEAD:${rel}`], { stdio: ['ignore', 'pipe', 'ignore'], timeout: 5000 });
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* A recorded file that is gone already (connect stopped part way, or the
|
|
145
|
+
* user deleted it): nothing to restore, but the directories Intutic made for
|
|
146
|
+
* it still go if empty.
|
|
147
|
+
*/
|
|
148
|
+
function forgetMissing(plan, file, record, forget) {
|
|
149
|
+
if (!record)
|
|
150
|
+
return;
|
|
151
|
+
if (!record.existed)
|
|
152
|
+
record.createdDirs?.forEach((dir) => plan.removeIfEmpty(dir));
|
|
153
|
+
plan.quiet(file, forget);
|
|
154
|
+
}
|
|
155
|
+
// ─── Owned files ─────────────────────────────────────────────────────────────
|
|
156
|
+
/**
|
|
157
|
+
* Plans the reversal of a file Intutic writes whole.
|
|
158
|
+
*
|
|
159
|
+
* With a record: an unedited file gets its original back, or is deleted
|
|
160
|
+
* along with the directories Intutic made for it; an edited one stays, with
|
|
161
|
+
* a note. Without one (an earlier version wrote it): a file `isOurs` does not
|
|
162
|
+
* recognise is not Intutic's and is left alone; one it does is deleted when
|
|
163
|
+
* untracked, or put back to the committed version when git has one that is
|
|
164
|
+
* not Intutic's.
|
|
165
|
+
*/
|
|
166
|
+
export async function reverseOwnedFile(plan, file, workspaceRoot, isOurs, options = {}) {
|
|
167
|
+
if (!plan.claim(file))
|
|
168
|
+
return;
|
|
169
|
+
const current = await readText(file);
|
|
170
|
+
const record = await readOriginal(file, workspaceRoot);
|
|
171
|
+
const forget = () => forgetOriginal(file, workspaceRoot);
|
|
172
|
+
const before = options.beforeApply ?? (async () => undefined);
|
|
173
|
+
if (current === null) {
|
|
174
|
+
forgetMissing(plan, file, record, forget);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (record) {
|
|
178
|
+
const edited = record.writtenSha256 !== undefined ? sha256(current) !== record.writtenSha256 : !isOurs(current);
|
|
179
|
+
if (edited) {
|
|
180
|
+
plan.note(file, 'edited since Intutic wrote it, so it was left as it is');
|
|
181
|
+
plan.quiet(file, forget);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (record.existed && record.content) {
|
|
185
|
+
const original = record.content;
|
|
186
|
+
plan.change(file, 'restore the original', async () => {
|
|
187
|
+
await before();
|
|
188
|
+
await writeAtomic(file, original, record.mode);
|
|
189
|
+
await forget();
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
record.createdDirs?.forEach((dir) => plan.removeIfEmpty(dir));
|
|
194
|
+
plan.change(file, 'delete (Intutic created it)', async () => {
|
|
195
|
+
await before();
|
|
196
|
+
await deleteFile(file, record.createdDirs);
|
|
197
|
+
await forget();
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (!isOurs(current))
|
|
203
|
+
return;
|
|
204
|
+
const committed = committedVersion(file);
|
|
205
|
+
if (committed === null) {
|
|
206
|
+
plan.change(file, 'delete (Intutic generated it)', async () => {
|
|
207
|
+
await before();
|
|
208
|
+
await deleteFile(file);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
else if (!isOurs(committed.toString('utf-8'))) {
|
|
212
|
+
plan.change(file, 'restore the committed version (Intutic kept no copy of the original)', async () => {
|
|
213
|
+
await before();
|
|
214
|
+
await writeAtomic(file, committed);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
plan.note(file, 'Intutic generated it, but this version is committed to the repository, so it was left for you to remove');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
export const jsonFormat = {
|
|
222
|
+
parse(raw) {
|
|
223
|
+
const parsed = raw.trim() === '' ? {} : JSON.parse(raw);
|
|
224
|
+
if (!isObject(parsed))
|
|
225
|
+
throw new Error('not a JSON object');
|
|
226
|
+
return parsed;
|
|
227
|
+
},
|
|
228
|
+
toJS: (doc) => structuredClone(doc),
|
|
229
|
+
write(_doc, next, raw) {
|
|
230
|
+
const indent = raw.match(/^([ \t]+)\S/m)?.[1] ?? 2;
|
|
231
|
+
return JSON.stringify(next, null, indent) + (raw === '' || raw.endsWith('\n') ? '\n' : '');
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
/**
|
|
235
|
+
* YAML through `yaml`'s Document: the edit is applied to the document node
|
|
236
|
+
* by node, so comments and layout away from the edited keys survive.
|
|
237
|
+
*/
|
|
238
|
+
export const yamlFormat = {
|
|
239
|
+
parse(raw) {
|
|
240
|
+
const doc = parseDocument(raw);
|
|
241
|
+
if (doc.errors.length > 0)
|
|
242
|
+
throw doc.errors[0];
|
|
243
|
+
const js = doc.toJS();
|
|
244
|
+
if (js !== null && js !== undefined && !isObject(js))
|
|
245
|
+
throw new Error('not a YAML mapping');
|
|
246
|
+
return doc;
|
|
247
|
+
},
|
|
248
|
+
toJS: (doc) => doc.toJS() ?? {},
|
|
249
|
+
write(doc, next, _raw, original) {
|
|
250
|
+
applyDiff(doc, [], doc.toJS() ?? {}, next, original);
|
|
251
|
+
// `[a, b]` rather than the library's default `[ a, b ]`: the way people
|
|
252
|
+
// write flow lists by hand, and so the way the user's file most likely had them.
|
|
253
|
+
return doc.toString({ flowCollectionPadding: false });
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
/**
|
|
257
|
+
* Applies the difference between two plain objects to a YAML document, key by
|
|
258
|
+
* key. A key put back is placed where `after` has it, not at the end, and a
|
|
259
|
+
* value put back to what the original held gets the original's node, so its
|
|
260
|
+
* quoting and flow or block layout come back with it.
|
|
261
|
+
*/
|
|
262
|
+
function applyDiff(doc, path, before, after, original) {
|
|
263
|
+
if (path.length > 0 && original !== null) {
|
|
264
|
+
const was = original.getIn(path, true);
|
|
265
|
+
if (isNode(was) && isDeepStrictEqual(was.toJSON(), after)) {
|
|
266
|
+
doc.setIn(path, was.clone());
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (isObject(before) && isObject(after)) {
|
|
271
|
+
for (const key of Object.keys(before)) {
|
|
272
|
+
if (!(key in after))
|
|
273
|
+
doc.deleteIn([...path, key]);
|
|
274
|
+
}
|
|
275
|
+
let previous;
|
|
276
|
+
for (const [key, value] of Object.entries(after)) {
|
|
277
|
+
if (!isDeepStrictEqual(before[key], value))
|
|
278
|
+
applyDiff(doc, [...path, key], before[key], value, original);
|
|
279
|
+
if (!(key in before))
|
|
280
|
+
placeAfter(doc, path, key, previous);
|
|
281
|
+
previous = key;
|
|
282
|
+
}
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
if (path.length === 0)
|
|
286
|
+
return;
|
|
287
|
+
doc.setIn(path, after);
|
|
288
|
+
}
|
|
289
|
+
function placeAfter(doc, path, key, previous) {
|
|
290
|
+
const node = path.length === 0 ? doc.contents : doc.getIn(path, true);
|
|
291
|
+
if (!isMap(node))
|
|
292
|
+
return;
|
|
293
|
+
const keyOf = (pair) => (isScalar(pair.key) ? pair.key.value : pair.key);
|
|
294
|
+
const at = node.items.findIndex((pair) => keyOf(pair) === key);
|
|
295
|
+
if (at === -1)
|
|
296
|
+
return;
|
|
297
|
+
const [pair] = node.items.splice(at, 1);
|
|
298
|
+
const to = previous === undefined ? 0 : node.items.findIndex((p) => keyOf(p) === previous) + 1;
|
|
299
|
+
node.items.splice(to, 0, pair);
|
|
300
|
+
}
|
|
301
|
+
/** Rebuilds `doc`'s top-level keys in `original`'s order, the rest after them as they were. */
|
|
302
|
+
export function orderLike(doc, original) {
|
|
303
|
+
const entries = [
|
|
304
|
+
...Object.keys(original).filter((k) => k in doc),
|
|
305
|
+
...Object.keys(doc).filter((k) => !(k in original)),
|
|
306
|
+
].map((k) => [k, doc[k]]);
|
|
307
|
+
for (const key of Object.keys(doc))
|
|
308
|
+
delete doc[key];
|
|
309
|
+
for (const [key, value] of entries)
|
|
310
|
+
doc[key] = value;
|
|
311
|
+
}
|
|
312
|
+
/** TOML through smol-toml. Comments are lost on a rewrite, as they were on Intutic's own write. */
|
|
313
|
+
export const tomlFormat = {
|
|
314
|
+
parse: (raw) => (raw.trim() === '' ? {} : parseToml(raw)),
|
|
315
|
+
toJS: (doc) => structuredClone(doc),
|
|
316
|
+
write: (_doc, next) => stringifyToml(next),
|
|
317
|
+
};
|
|
318
|
+
export function isObject(v) {
|
|
319
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
320
|
+
}
|
|
321
|
+
/** Whether `js` holds nothing: no keys, or only empty objects and arrays. */
|
|
322
|
+
export function isEmptyValue(js) {
|
|
323
|
+
if (Array.isArray(js))
|
|
324
|
+
return js.length === 0;
|
|
325
|
+
if (isObject(js))
|
|
326
|
+
return Object.values(js).every(isEmptyValue);
|
|
327
|
+
return js === undefined || js === null;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Plans the reversal of Intutic's entries in a JSON, YAML or TOML file the
|
|
331
|
+
* user owns. `edit` removes them from `doc` in place and reports whether it
|
|
332
|
+
* changed anything.
|
|
333
|
+
*
|
|
334
|
+
* The result is written only if `edit` changed something. A result equal to
|
|
335
|
+
* the original gets the original bytes; a file Intutic created that ends up
|
|
336
|
+
* empty is deleted; a file with no record that ends up empty is deleted only
|
|
337
|
+
* when `deleteIfEmptyWithoutRecord` says an earlier version created it.
|
|
338
|
+
*/
|
|
339
|
+
export async function reverseStructuredFile(plan, file, workspaceRoot, format, edit, options = {}) {
|
|
340
|
+
if (!plan.claim(file))
|
|
341
|
+
return;
|
|
342
|
+
const raw = await readText(file);
|
|
343
|
+
const record = await readOriginal(file, workspaceRoot);
|
|
344
|
+
const forget = () => forgetOriginal(file, workspaceRoot);
|
|
345
|
+
if (raw === null) {
|
|
346
|
+
forgetMissing(plan, file, record, forget);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
let handle;
|
|
350
|
+
try {
|
|
351
|
+
handle = format.parse(raw);
|
|
352
|
+
}
|
|
353
|
+
catch {
|
|
354
|
+
plan.note(file, 'does not parse, so Intutic could not remove its entries; remove them by hand');
|
|
355
|
+
if (record)
|
|
356
|
+
plan.quiet(file, forget);
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
let originalHandle = null;
|
|
360
|
+
if (record?.existed && record.content) {
|
|
361
|
+
try {
|
|
362
|
+
originalHandle = format.parse(record.content.toString('utf-8'));
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
originalHandle = null;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
const original = originalHandle === null ? null : format.toJS(originalHandle);
|
|
369
|
+
const doc = format.toJS(handle);
|
|
370
|
+
const changed = edit(doc, { original, record, handle, note: (message) => plan.note(file, message) });
|
|
371
|
+
if (!changed) {
|
|
372
|
+
if (record)
|
|
373
|
+
plan.quiet(file, forget);
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
if (record && !record.existed && isEmptyValue(doc)) {
|
|
377
|
+
record.createdDirs?.forEach((dir) => plan.removeIfEmpty(dir));
|
|
378
|
+
plan.change(file, 'delete (Intutic created it)', async () => {
|
|
379
|
+
await deleteFile(file, record.createdDirs);
|
|
380
|
+
await forget();
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
else if (!record && options.deleteIfEmptyWithoutRecord && isEmptyValue(doc)) {
|
|
384
|
+
plan.change(file, 'delete (only Intutic entries were in it)', () => deleteFile(file));
|
|
385
|
+
}
|
|
386
|
+
else if (record?.existed && record.content && original !== null && isDeepStrictEqual(doc, original)) {
|
|
387
|
+
const bytes = record.content;
|
|
388
|
+
plan.change(file, 'restore the original', async () => {
|
|
389
|
+
await writeAtomic(file, bytes, record.mode);
|
|
390
|
+
await forget();
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
const next = format.write(handle, doc, raw, originalHandle);
|
|
395
|
+
plan.change(file, 'remove the Intutic entries', async () => {
|
|
396
|
+
await writeAtomic(file, next);
|
|
397
|
+
if (record)
|
|
398
|
+
await forget();
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Plans the reversal of Intutic's lines in a text config edited line by line
|
|
404
|
+
* (Codex's and OpenHands' TOML, where a rewrite through a parser would drop
|
|
405
|
+
* the user's comments). `edit` returns the new text, or null for no change;
|
|
406
|
+
* `parse` is only used to compare: a result that means the same as the
|
|
407
|
+
* original gets the original bytes back.
|
|
408
|
+
*/
|
|
409
|
+
export async function reverseTextFile(plan, file, workspaceRoot, parse, edit) {
|
|
410
|
+
if (!plan.claim(file))
|
|
411
|
+
return;
|
|
412
|
+
const raw = await readText(file);
|
|
413
|
+
const record = await readOriginal(file, workspaceRoot);
|
|
414
|
+
const forget = () => forgetOriginal(file, workspaceRoot);
|
|
415
|
+
if (raw === null) {
|
|
416
|
+
forgetMissing(plan, file, record, forget);
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
const originalText = record?.existed && record.content ? record.content.toString('utf-8') : null;
|
|
420
|
+
const next = edit(raw, { originalText, note: (message) => plan.note(file, message) });
|
|
421
|
+
if (next === null || next === raw) {
|
|
422
|
+
if (record)
|
|
423
|
+
plan.quiet(file, forget);
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
const same = (a, b) => {
|
|
427
|
+
try {
|
|
428
|
+
return isDeepStrictEqual(parse(a), parse(b));
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
if (record && !record.existed && next.trim() === '') {
|
|
435
|
+
record.createdDirs?.forEach((dir) => plan.removeIfEmpty(dir));
|
|
436
|
+
plan.change(file, 'delete (Intutic created it)', async () => {
|
|
437
|
+
await deleteFile(file, record.createdDirs);
|
|
438
|
+
await forget();
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
else if (record?.existed && record.content && originalText !== null && same(next, originalText)) {
|
|
442
|
+
const bytes = record.content;
|
|
443
|
+
plan.change(file, 'restore the original', async () => {
|
|
444
|
+
await writeAtomic(file, bytes, record.mode);
|
|
445
|
+
await forget();
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
plan.change(file, 'remove the Intutic entries', async () => {
|
|
450
|
+
await writeAtomic(file, next);
|
|
451
|
+
if (record)
|
|
452
|
+
await forget();
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
function child(cur, key) {
|
|
457
|
+
if (Array.isArray(cur))
|
|
458
|
+
return /^\d+$/.test(key) ? cur[Number(key)] : undefined;
|
|
459
|
+
return isObject(cur) ? cur[key] : undefined;
|
|
460
|
+
}
|
|
461
|
+
/** Reads the value at `path`; array elements are addressed by their index. */
|
|
462
|
+
export function getPath(obj, path) {
|
|
463
|
+
let cur = obj;
|
|
464
|
+
for (const key of path)
|
|
465
|
+
cur = child(cur, key);
|
|
466
|
+
return cur;
|
|
467
|
+
}
|
|
468
|
+
/** Sets `path` to `value`, creating objects on the way. */
|
|
469
|
+
export function setPath(doc, path, value) {
|
|
470
|
+
let cur = doc;
|
|
471
|
+
for (const key of path.slice(0, -1)) {
|
|
472
|
+
let next = child(cur, key);
|
|
473
|
+
if (!isObject(next) && !Array.isArray(next)) {
|
|
474
|
+
next = {};
|
|
475
|
+
cur[key] = next;
|
|
476
|
+
}
|
|
477
|
+
cur = next;
|
|
478
|
+
}
|
|
479
|
+
;
|
|
480
|
+
cur[path[path.length - 1]] = value;
|
|
481
|
+
}
|
|
482
|
+
/** Removes the key at `path`. Array elements are never removed this way: it would renumber their siblings. */
|
|
483
|
+
export function deletePath(doc, path) {
|
|
484
|
+
const parent = getPath(doc, path.slice(0, -1));
|
|
485
|
+
const key = path[path.length - 1];
|
|
486
|
+
if (!isObject(parent) || !(key in parent))
|
|
487
|
+
return false;
|
|
488
|
+
delete parent[key];
|
|
489
|
+
return true;
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Walks up from `path`, removing each empty object or array that the
|
|
493
|
+
* original did not have (with no original, every empty one: Intutic made it).
|
|
494
|
+
*/
|
|
495
|
+
export function pruneEmpty(doc, path, original) {
|
|
496
|
+
for (let depth = path.length; depth > 0; depth--) {
|
|
497
|
+
const p = path.slice(0, depth);
|
|
498
|
+
const value = getPath(doc, p);
|
|
499
|
+
if (value === undefined)
|
|
500
|
+
continue;
|
|
501
|
+
if (!(Array.isArray(value) || isObject(value)) || !isEmptyValue(value))
|
|
502
|
+
return;
|
|
503
|
+
if (original !== null && getPath(original, p) !== undefined)
|
|
504
|
+
return;
|
|
505
|
+
if (!deletePath(doc, p))
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Removes the elements of the array at `path` that `isOurs` claims. An array
|
|
511
|
+
* (and each parent object) left empty is removed too, unless the original
|
|
512
|
+
* had it there.
|
|
513
|
+
*/
|
|
514
|
+
export function removeFromArray(doc, path, isOurs, original) {
|
|
515
|
+
const arr = getPath(doc, path);
|
|
516
|
+
if (!Array.isArray(arr))
|
|
517
|
+
return false;
|
|
518
|
+
const kept = arr.filter((e) => !isOurs(e));
|
|
519
|
+
if (kept.length === arr.length)
|
|
520
|
+
return false;
|
|
521
|
+
setPath(doc, path, kept);
|
|
522
|
+
pruneEmpty(doc, path, original);
|
|
523
|
+
return true;
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Puts a key Intutic overwrote back. With an original, the key gets the
|
|
527
|
+
* original's value, or is removed when the original had none. Without one,
|
|
528
|
+
* the key is removed (the earlier value is unknown, and the harness's
|
|
529
|
+
* default is closer to it than Intutic's), with a note saying so. Only a key
|
|
530
|
+
* whose current value `isIntutic` recognises is touched: anything else was
|
|
531
|
+
* set since by someone else.
|
|
532
|
+
*/
|
|
533
|
+
export function restoreKey(doc, path, ctx, isIntutic) {
|
|
534
|
+
const current = getPath(doc, path);
|
|
535
|
+
if (current === undefined || !isIntutic(current))
|
|
536
|
+
return false;
|
|
537
|
+
const { original } = ctx;
|
|
538
|
+
if (original !== null) {
|
|
539
|
+
const was = getPath(original, path);
|
|
540
|
+
if (isDeepStrictEqual(was, current))
|
|
541
|
+
return false;
|
|
542
|
+
if (was === undefined)
|
|
543
|
+
deletePath(doc, path);
|
|
544
|
+
else
|
|
545
|
+
setPath(doc, path, structuredClone(was));
|
|
546
|
+
pruneEmpty(doc, path.slice(0, -1), original);
|
|
547
|
+
return true;
|
|
548
|
+
}
|
|
549
|
+
deletePath(doc, path);
|
|
550
|
+
pruneEmpty(doc, path.slice(0, -1), null);
|
|
551
|
+
ctx.note(`${path.join('.')} was removed rather than restored: an earlier Intutic version set it without keeping the value it replaced`);
|
|
552
|
+
return true;
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Applies {@link restoreKey} to every string value in `doc` that `isIntutic`
|
|
556
|
+
* recognises, wherever it sits — for writers that set a proxy URL on every
|
|
557
|
+
* model, or on whichever key a pattern happened to match.
|
|
558
|
+
*/
|
|
559
|
+
export function restoreMatchingValues(doc, ctx, isIntutic) {
|
|
560
|
+
const paths = [];
|
|
561
|
+
const walk = (value, path) => {
|
|
562
|
+
if (typeof value === 'string' && isIntutic(value))
|
|
563
|
+
paths.push(path);
|
|
564
|
+
else if (Array.isArray(value))
|
|
565
|
+
value.forEach((v, i) => walk(v, [...path, String(i)]));
|
|
566
|
+
else if (isObject(value))
|
|
567
|
+
for (const [k, v] of Object.entries(value))
|
|
568
|
+
walk(v, [...path, k]);
|
|
569
|
+
};
|
|
570
|
+
walk(doc, []);
|
|
571
|
+
let changed = false;
|
|
572
|
+
for (const path of paths)
|
|
573
|
+
changed = restoreKey(doc, path, ctx, isIntutic) || changed;
|
|
574
|
+
return changed;
|
|
575
|
+
}
|
|
576
|
+
/** Runs every edit (none short-circuits the others) and reports whether any changed something. */
|
|
577
|
+
export function allEdits(...results) {
|
|
578
|
+
return results.some(Boolean);
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/disconnect/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* recognise.ts — how disconnect tells Intutic's entries from the user's.
|
|
3
|
+
*
|
|
4
|
+
* Every test here is on content Intutic writes and nothing else: a hook
|
|
5
|
+
* command that runs a gate script from an `.intutic/hooks/` directory, a
|
|
6
|
+
* rules file that starts with the generated header, a URL on the origin of
|
|
7
|
+
* the proxy connect pointed the harness at.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
/** First line of every rules file Intutic generates. */
|
|
12
|
+
export declare const RULES_HEADER = "# Intutic Governance Rules (auto-generated)";
|
|
13
|
+
export declare function startsWithRulesHeader(text: string): boolean;
|
|
14
|
+
/** Whether `text` mentions `marker`, for owned files recognised by a line Intutic writes in them. */
|
|
15
|
+
export declare function contains(marker: string): (text: string) => boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Whether `command` runs the gate script `script` from an `.intutic/hooks/`
|
|
18
|
+
* directory (any workspace's, or the home one) — however it is quoted or
|
|
19
|
+
* whichever interpreter runs it.
|
|
20
|
+
*/
|
|
21
|
+
export declare function runsGate(command: unknown, script: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Whether a `{ matcher, hooks: [{ command }] }` entry is Intutic's: every
|
|
24
|
+
* hook in it runs `script`. The shape Claude Code, Codex, Continue, Muse,
|
|
25
|
+
* Gemini CLI, Pi and Claude Desktop share.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isGateEntry(script: string): (entry: unknown) => boolean;
|
|
28
|
+
/** Whether a `{ command }` entry (Cursor, Windsurf, Roo) runs `script`. */
|
|
29
|
+
export declare function isGateCommandEntry(script: string): (entry: unknown) => boolean;
|
|
30
|
+
/**
|
|
31
|
+
* A test for "this value is a URL on the Intutic proxy", given the proxy
|
|
32
|
+
* URLs connect is known to have written. Any path on the proxy's origin
|
|
33
|
+
* counts: connect writes the bare host for Anthropic SDKs, `/v1` for OpenAI
|
|
34
|
+
* ones, and a trailing slash for Continue.
|
|
35
|
+
*/
|
|
36
|
+
export declare function proxyUrlMatcher(proxyUrls: readonly string[]): (value: unknown) => boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Proxy URLs an earlier connect left in a workspace's own generated files:
|
|
39
|
+
* the "Proxy URL" line of a rules file and `INTUTIC_PROXY_URL` in
|
|
40
|
+
* `.env.intutic`. Used when connect predates the recorded list.
|
|
41
|
+
*/
|
|
42
|
+
export declare function proxyUrlsInWorkspace(workspaceRoot: string): Promise<string[]>;
|
|
43
|
+
//# sourceMappingURL=recognise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recognise.d.ts","sourceRoot":"","sources":["../../src/disconnect/recognise.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,wDAAwD;AACxD,eAAO,MAAM,YAAY,gDAAgD,CAAA;AAEzE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,qGAAqG;AACrG,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAElE;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIlE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAKvE;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAE9E;AAcD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAGzF;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAenF"}
|