@nanonets/graft 0.20.0 → 0.21.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/app/history.d.ts +36 -1
- package/dist/app/history.d.ts.map +1 -1
- package/dist/app/history.js +72 -25
- package/dist/app/history.js.map +1 -1
- package/dist/app/sources.d.ts +13 -0
- package/dist/app/sources.d.ts.map +1 -1
- package/dist/app/sources.js +129 -1
- package/dist/app/sources.js.map +1 -1
- package/dist/brain/claude-md.d.ts +4 -2
- package/dist/brain/claude-md.d.ts.map +1 -1
- package/dist/brain/claude-md.js +4 -3
- package/dist/brain/claude-md.js.map +1 -1
- package/dist/brain/context-files.d.ts +79 -0
- package/dist/brain/context-files.d.ts.map +1 -0
- package/dist/brain/context-files.js +245 -0
- package/dist/brain/context-files.js.map +1 -0
- package/dist/brain/link.d.ts +17 -0
- package/dist/brain/link.d.ts.map +1 -1
- package/dist/brain/link.js +21 -0
- package/dist/brain/link.js.map +1 -1
- package/dist/brain/pull.d.ts +17 -0
- package/dist/brain/pull.d.ts.map +1 -0
- package/dist/brain/pull.js +172 -0
- package/dist/brain/pull.js.map +1 -0
- package/dist/brain/push.d.ts +62 -7
- package/dist/brain/push.d.ts.map +1 -1
- package/dist/brain/push.js +97 -62
- package/dist/brain/push.js.map +1 -1
- package/dist/brain/signup.d.ts +46 -2
- package/dist/brain/signup.d.ts.map +1 -1
- package/dist/brain/signup.js +101 -11
- package/dist/brain/signup.js.map +1 -1
- package/dist/brain/upload.d.ts +61 -0
- package/dist/brain/upload.d.ts.map +1 -0
- package/dist/brain/upload.js +210 -0
- package/dist/brain/upload.js.map +1 -0
- package/dist/brain/watch.d.ts +76 -3
- package/dist/brain/watch.d.ts.map +1 -1
- package/dist/brain/watch.js +263 -39
- package/dist/brain/watch.js.map +1 -1
- package/dist/claude/build-progress.d.ts +29 -0
- package/dist/claude/build-progress.d.ts.map +1 -0
- package/dist/claude/build-progress.js +76 -0
- package/dist/claude/build-progress.js.map +1 -0
- package/dist/cli-picker.d.ts +17 -2
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +103 -22
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.js +423 -187
- package/dist/cli.js.map +1 -1
- package/dist/telemetry/contract.d.ts +16 -3
- package/dist/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +23 -5
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/util/spinner.d.ts +15 -0
- package/dist/util/spinner.d.ts.map +1 -0
- package/dist/util/spinner.js +52 -0
- package/dist/util/spinner.js.map +1 -0
- package/dist/util/state.d.ts +8 -0
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { type BrainLink } from "./link.js";
|
|
2
|
+
export type ContextFileKind = "agents_md" | "folder_claude_md" | "cursor_rule" | "skill";
|
|
3
|
+
/** One accepted change to one context file. */
|
|
4
|
+
export interface ContextFileChange {
|
|
5
|
+
id: string;
|
|
6
|
+
kind: "edit" | "add" | "create" | "replace";
|
|
7
|
+
heading?: string;
|
|
8
|
+
after_heading?: string;
|
|
9
|
+
find?: string;
|
|
10
|
+
/** edit/add: as in claude-md.ts. create/replace: the whole file. For
|
|
11
|
+
* replace, `find` is the whole file the suggestion was computed against. */
|
|
12
|
+
text: string;
|
|
13
|
+
reason?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ContextFile {
|
|
16
|
+
kind: ContextFileKind | string;
|
|
17
|
+
path: string;
|
|
18
|
+
exists?: boolean;
|
|
19
|
+
managed_by_graft?: boolean;
|
|
20
|
+
changes: ContextFileChange[];
|
|
21
|
+
}
|
|
22
|
+
export interface ContextFilesPull {
|
|
23
|
+
head_sha: string;
|
|
24
|
+
files: ContextFile[];
|
|
25
|
+
}
|
|
26
|
+
/** The kind of a context file, from its path — for the root CLAUDE.md pull,
|
|
27
|
+
* which names a path but no kind. */
|
|
28
|
+
export declare function kindForPath(path: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Whether a file of `kind` is for one of the `wired` agents. Everything passes
|
|
31
|
+
* when nothing is wired — there is no choice to respect — and so does a kind
|
|
32
|
+
* graft does not know, rather than dropping what Trail sent.
|
|
33
|
+
*/
|
|
34
|
+
export declare function readByWired(kind: string, wired: readonly string[]): boolean;
|
|
35
|
+
/** The agents among `wired` that read a file of `kind`. */
|
|
36
|
+
export declare function readersOf(kind: string, wired: readonly string[]): string[];
|
|
37
|
+
/** GET /api/public/brains/:id/context-files. `unsupported` on a 404: an older Trail. */
|
|
38
|
+
export declare function fetchContextFiles(link: BrainLink, fetchImpl?: typeof fetch): Promise<ContextFilesPull | {
|
|
39
|
+
unsupported: true;
|
|
40
|
+
} | {
|
|
41
|
+
error: string;
|
|
42
|
+
}>;
|
|
43
|
+
/** POST /api/public/brains/:id/context-files/applied, 100 ids per request. */
|
|
44
|
+
export declare function markContextFilesApplied(link: BrainLink, ids: string[], fetchImpl?: typeof fetch): Promise<boolean>;
|
|
45
|
+
/** What a pull will do (or did) to one file. */
|
|
46
|
+
export interface FilePlan {
|
|
47
|
+
/** Repo-relative, forward slashes. */
|
|
48
|
+
path: string;
|
|
49
|
+
/** M: an existing file changes. A: a new file. "": nothing to write. */
|
|
50
|
+
status: "M" | "A" | "";
|
|
51
|
+
/** The file's new text, when status is set. */
|
|
52
|
+
text?: string;
|
|
53
|
+
written: ContextFileChange[];
|
|
54
|
+
/** Already there: counts as applied, nothing to write. */
|
|
55
|
+
present: ContextFileChange[];
|
|
56
|
+
skipped: Array<{
|
|
57
|
+
change: ContextFileChange;
|
|
58
|
+
why: string;
|
|
59
|
+
}>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The repo-relative form of a path Trail sent, or null when it points
|
|
63
|
+
* anywhere but a file inside this checkout. Trail is trusted to suggest text,
|
|
64
|
+
* not to choose where on this machine it lands.
|
|
65
|
+
*/
|
|
66
|
+
export declare function safeRelPath(root: string, path: string): string | null;
|
|
67
|
+
/**
|
|
68
|
+
* Work out one file's changes against what is on disk. Pure but for reading
|
|
69
|
+
* the file, so the command, the dry run and the tests share it.
|
|
70
|
+
*/
|
|
71
|
+
export declare function planContextFile(root: string, file: ContextFile): FilePlan;
|
|
72
|
+
/** Write a planned file, making its folder when it is new. */
|
|
73
|
+
export declare function writePlannedFile(root: string, plan: FilePlan): void;
|
|
74
|
+
/** `+ Money · ~ Commands` — a new section is +, an edited one ~, a whole file nothing. */
|
|
75
|
+
export declare function changeSummary(changes: Array<{
|
|
76
|
+
kind: string;
|
|
77
|
+
heading?: string;
|
|
78
|
+
}>): string;
|
|
79
|
+
//# sourceMappingURL=context-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-files.d.ts","sourceRoot":"","sources":["../../src/brain/context-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `graft trail pull`, for every context file rather than only the root CLAUDE.md.
|
|
3
|
+
*
|
|
4
|
+
* Trail suggests changes to the files a repository hands its coding agents —
|
|
5
|
+
* AGENTS.md, a folder's own CLAUDE.md, Cursor rules, Claude skills — and a
|
|
6
|
+
* person accepts some of them. This fetches the accepted ones and writes them.
|
|
7
|
+
*
|
|
8
|
+
* Edits and new sections go through the same line-by-line patcher as the root
|
|
9
|
+
* CLAUDE.md (see claude-md.ts), so everything a change does not name comes back
|
|
10
|
+
* byte for byte. A `create` carries a whole file, and it is never allowed to
|
|
11
|
+
* overwrite a file someone wrote here: an existing file with other content is a
|
|
12
|
+
* conflict to report, unless graft itself owns that file. A `replace` (how a
|
|
13
|
+
* Cursor rule is edited) carries the whole new file and the whole file it was
|
|
14
|
+
* computed against, and is written only while the file here is still that one.
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
17
|
+
import { dirname, isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
|
|
18
|
+
import { applyChanges } from "./claude-md.js";
|
|
19
|
+
import { baseUrlFor } from "./link.js";
|
|
20
|
+
/**
|
|
21
|
+
* Which picked agents read a file of this kind. A file whose readers were not
|
|
22
|
+
* picked is neither listed nor written: `graft init` is where someone said which
|
|
23
|
+
* agents this repo is for, and a pull must not quietly add files for others.
|
|
24
|
+
*/
|
|
25
|
+
const READERS = {
|
|
26
|
+
claude_md: ["claude"],
|
|
27
|
+
folder_claude_md: ["claude"],
|
|
28
|
+
skill: ["claude"],
|
|
29
|
+
agents_md: ["agents", "hermes", "antigravity"],
|
|
30
|
+
cursor_rule: ["cursor"],
|
|
31
|
+
};
|
|
32
|
+
/** The kind of a context file, from its path — for the root CLAUDE.md pull,
|
|
33
|
+
* which names a path but no kind. */
|
|
34
|
+
export function kindForPath(path) {
|
|
35
|
+
const p = path.replace(/\\/g, "/");
|
|
36
|
+
const name = p.split("/").pop() ?? "";
|
|
37
|
+
if (name === "CLAUDE.md")
|
|
38
|
+
return p.includes("/") ? "folder_claude_md" : "claude_md";
|
|
39
|
+
if (name === "AGENTS.md")
|
|
40
|
+
return "agents_md";
|
|
41
|
+
if (p.startsWith(".cursor/rules/"))
|
|
42
|
+
return "cursor_rule";
|
|
43
|
+
if (p.startsWith(".claude/skills/"))
|
|
44
|
+
return "skill";
|
|
45
|
+
return "";
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Whether a file of `kind` is for one of the `wired` agents. Everything passes
|
|
49
|
+
* when nothing is wired — there is no choice to respect — and so does a kind
|
|
50
|
+
* graft does not know, rather than dropping what Trail sent.
|
|
51
|
+
*/
|
|
52
|
+
export function readByWired(kind, wired) {
|
|
53
|
+
if (wired.length === 0)
|
|
54
|
+
return true;
|
|
55
|
+
const readers = READERS[kind];
|
|
56
|
+
if (!readers)
|
|
57
|
+
return true;
|
|
58
|
+
return readers.some((r) => wired.includes(r));
|
|
59
|
+
}
|
|
60
|
+
/** The agents among `wired` that read a file of `kind`. */
|
|
61
|
+
export function readersOf(kind, wired) {
|
|
62
|
+
const readers = READERS[kind] ?? [];
|
|
63
|
+
return wired.filter((w) => readers.includes(w));
|
|
64
|
+
}
|
|
65
|
+
/** GET /api/public/brains/:id/context-files. `unsupported` on a 404: an older Trail. */
|
|
66
|
+
export async function fetchContextFiles(link, fetchImpl = fetch) {
|
|
67
|
+
const url = `${baseUrlFor(link)}/api/public/brains/${encodeURIComponent(link.brainId)}/context-files`;
|
|
68
|
+
try {
|
|
69
|
+
const res = await fetchImpl(url, {
|
|
70
|
+
headers: { authorization: `Bearer ${link.token}`, accept: "application/json" },
|
|
71
|
+
signal: AbortSignal.timeout(15_000),
|
|
72
|
+
});
|
|
73
|
+
const body = await res.text();
|
|
74
|
+
if (res.status === 404)
|
|
75
|
+
return { unsupported: true };
|
|
76
|
+
if (!res.ok)
|
|
77
|
+
return { error: `Trail refused the pull: ${res.status} ${body.slice(0, 200)}` };
|
|
78
|
+
const parsed = JSON.parse(body);
|
|
79
|
+
const files = Array.isArray(parsed.files) ? parsed.files : [];
|
|
80
|
+
return {
|
|
81
|
+
head_sha: String(parsed.head_sha ?? ""),
|
|
82
|
+
files: files
|
|
83
|
+
.filter((f) => f && typeof f.path === "string")
|
|
84
|
+
.map((f) => ({ ...f, changes: Array.isArray(f.changes) ? f.changes : [] })),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
return { error: `could not reach Trail: ${e instanceof Error ? e.message : e}` };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** POST /api/public/brains/:id/context-files/applied, 100 ids per request. */
|
|
92
|
+
export async function markContextFilesApplied(link, ids, fetchImpl = fetch) {
|
|
93
|
+
if (ids.length === 0)
|
|
94
|
+
return true;
|
|
95
|
+
const url = `${baseUrlFor(link)}/api/public/brains/${encodeURIComponent(link.brainId)}/context-files/applied`;
|
|
96
|
+
try {
|
|
97
|
+
for (let i = 0; i < ids.length; i += 100) {
|
|
98
|
+
const res = await fetchImpl(url, {
|
|
99
|
+
method: "POST",
|
|
100
|
+
headers: {
|
|
101
|
+
authorization: `Bearer ${link.token}`,
|
|
102
|
+
"content-type": "application/json",
|
|
103
|
+
accept: "application/json",
|
|
104
|
+
},
|
|
105
|
+
body: JSON.stringify({ ids: ids.slice(i, i + 100) }),
|
|
106
|
+
signal: AbortSignal.timeout(15_000),
|
|
107
|
+
});
|
|
108
|
+
if (!res.ok)
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The repo-relative form of a path Trail sent, or null when it points
|
|
119
|
+
* anywhere but a file inside this checkout. Trail is trusted to suggest text,
|
|
120
|
+
* not to choose where on this machine it lands.
|
|
121
|
+
*/
|
|
122
|
+
export function safeRelPath(root, path) {
|
|
123
|
+
const raw = path.replace(/\\/g, "/").trim();
|
|
124
|
+
if (!raw || isAbsolute(raw) || /^[a-zA-Z]:/.test(raw))
|
|
125
|
+
return null;
|
|
126
|
+
const parts = raw.split("/");
|
|
127
|
+
if (parts.some((p) => p === ".." || p === ""))
|
|
128
|
+
return null;
|
|
129
|
+
if (parts[0] === ".git")
|
|
130
|
+
return null;
|
|
131
|
+
const abs = resolve(root, normalize(raw));
|
|
132
|
+
const rel = relative(resolve(root), abs);
|
|
133
|
+
if (!rel || rel.startsWith("..") || isAbsolute(rel))
|
|
134
|
+
return null;
|
|
135
|
+
return rel.split(sep).join("/");
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Work out one file's changes against what is on disk. Pure but for reading
|
|
139
|
+
* the file, so the command, the dry run and the tests share it.
|
|
140
|
+
*/
|
|
141
|
+
export function planContextFile(root, file) {
|
|
142
|
+
const rel = safeRelPath(root, file.path);
|
|
143
|
+
const plan = { path: rel ?? file.path, status: "", written: [], present: [], skipped: [] };
|
|
144
|
+
if (!rel) {
|
|
145
|
+
for (const c of file.changes)
|
|
146
|
+
plan.skipped.push({ change: c, why: "the path points outside this repo" });
|
|
147
|
+
return plan;
|
|
148
|
+
}
|
|
149
|
+
const abs = join(root, rel);
|
|
150
|
+
const existed = existsSync(abs);
|
|
151
|
+
let original = "";
|
|
152
|
+
if (existed) {
|
|
153
|
+
try {
|
|
154
|
+
original = readFileSync(abs, "utf8");
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
for (const c of file.changes)
|
|
158
|
+
plan.skipped.push({ change: c, why: "the file here could not be read" });
|
|
159
|
+
return plan;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
let text = original;
|
|
163
|
+
let changed = false;
|
|
164
|
+
// Whole files first; the edits and sections after them may be relative to one.
|
|
165
|
+
for (const c of file.changes.filter((x) => x.kind === "create")) {
|
|
166
|
+
const want = c.text.replace(/\r\n/g, "\n");
|
|
167
|
+
const have = text.replace(/\r\n/g, "\n");
|
|
168
|
+
if (!existed && !changed) {
|
|
169
|
+
text = c.text.endsWith("\n") ? c.text : `${c.text}\n`;
|
|
170
|
+
changed = true;
|
|
171
|
+
plan.written.push(c);
|
|
172
|
+
}
|
|
173
|
+
else if (have.trimEnd() === want.trimEnd()) {
|
|
174
|
+
plan.present.push(c);
|
|
175
|
+
}
|
|
176
|
+
else if (file.managed_by_graft) {
|
|
177
|
+
text = c.text.endsWith("\n") ? c.text : `${c.text}\n`;
|
|
178
|
+
changed = true;
|
|
179
|
+
plan.written.push(c);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
plan.skipped.push({ change: c, why: "a file with other content is already there" });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Whole-file replacements, guarded by the text they were computed against.
|
|
186
|
+
const same = (a, b) => a.replace(/\r\n/g, "\n").trimEnd() === b.replace(/\r\n/g, "\n").trimEnd();
|
|
187
|
+
for (const c of file.changes.filter((x) => x.kind === "replace")) {
|
|
188
|
+
if (same(text, c.text)) {
|
|
189
|
+
plan.present.push(c);
|
|
190
|
+
}
|
|
191
|
+
else if (same(text, c.find ?? "") && (existed || changed || (c.find ?? "").trim() === "")) {
|
|
192
|
+
text = c.text.endsWith("\n") ? c.text : `${c.text}\n`;
|
|
193
|
+
changed = true;
|
|
194
|
+
plan.written.push(c);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
plan.skipped.push({ change: c, why: "the file changed here since Trail read it" });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const patches = file.changes.filter((x) => x.kind === "edit" || x.kind === "add");
|
|
201
|
+
if (patches.length > 0) {
|
|
202
|
+
// A file that is not here yet is an empty one: an edit to a section of it
|
|
203
|
+
// becomes that section, so the change lands rather than being skipped for
|
|
204
|
+
// a heading nobody could have written.
|
|
205
|
+
const fresh = !existed && !changed;
|
|
206
|
+
const r = applyChanges(text, patches.map((c) => ({
|
|
207
|
+
...c,
|
|
208
|
+
heading: c.heading ?? "",
|
|
209
|
+
kind: fresh && c.kind === "edit" ? "add" : c.kind,
|
|
210
|
+
...(fresh && c.kind === "edit" ? { after_heading: "" } : {}),
|
|
211
|
+
})));
|
|
212
|
+
const byId = new Map(patches.map((c) => [c.id, c]));
|
|
213
|
+
for (const w of r.written)
|
|
214
|
+
plan.written.push(byId.get(w.id));
|
|
215
|
+
for (const p of r.present)
|
|
216
|
+
plan.present.push(byId.get(p.id));
|
|
217
|
+
for (const s of r.skipped)
|
|
218
|
+
plan.skipped.push({ change: byId.get(s.change.id), why: s.why });
|
|
219
|
+
if (r.written.length > 0) {
|
|
220
|
+
text = r.text;
|
|
221
|
+
changed = true;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (changed && text !== original) {
|
|
225
|
+
plan.status = existed ? "M" : "A";
|
|
226
|
+
plan.text = text;
|
|
227
|
+
}
|
|
228
|
+
return plan;
|
|
229
|
+
}
|
|
230
|
+
/** Write a planned file, making its folder when it is new. */
|
|
231
|
+
export function writePlannedFile(root, plan) {
|
|
232
|
+
if (!plan.status || plan.text === undefined)
|
|
233
|
+
return;
|
|
234
|
+
const abs = join(root, plan.path);
|
|
235
|
+
mkdirSync(dirname(abs), { recursive: true });
|
|
236
|
+
writeFileSync(abs, plan.text);
|
|
237
|
+
}
|
|
238
|
+
/** `+ Money · ~ Commands` — a new section is +, an edited one ~, a whole file nothing. */
|
|
239
|
+
export function changeSummary(changes) {
|
|
240
|
+
return changes
|
|
241
|
+
.filter((c) => c.kind === "add" || c.kind === "edit")
|
|
242
|
+
.map((c) => `${c.kind === "add" ? "+" : "~"} ${c.heading ?? ""}`.trim())
|
|
243
|
+
.join(" · ");
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=context-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-files.js","sourceRoot":"","sources":["../../src/brain/context-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AA8BvD;;;;GAIG;AACH,MAAM,OAAO,GAA6B;IACxC,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,gBAAgB,EAAE,CAAC,QAAQ,CAAC;IAC5B,KAAK,EAAE,CAAC,QAAQ,CAAC;IACjB,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC;IAC9C,WAAW,EAAE,CAAC,QAAQ,CAAC;CACxB,CAAC;AAEF;qCACqC;AACrC,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACtC,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC;IACpF,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAC7C,IAAI,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,aAAa,CAAC;IACzD,IAAI,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,OAAO,CAAC;IACpD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAwB;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAwB;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACpC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAe,EACf,YAA0B,KAAK;IAE/B,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACtG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YAC/B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YAC9E,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA8B,CAAC;QAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YACvC,KAAK,EAAE,KAAK;iBACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;iBAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SAC9E,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,KAAK,EAAE,0BAA0B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACnF,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAe,EAAE,GAAa,EAAE,YAA0B,KAAK;IAC3G,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC;IAC9G,IAAI,CAAC;QACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;gBAC/B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;oBACrC,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;iBAC3B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;gBACpD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAgBD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAiB;IAC7D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,IAAI,GAAa,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACrG,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,mCAAmC,EAAE,CAAC,CAAC;QACzG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,iCAAiC,EAAE,CAAC,CAAC;YACvG,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,+EAA+E;IAC/E,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YACtD,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YACtD,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,4CAA4C,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IACjH,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;QACjE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAC5F,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YACtD,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,2CAA2C,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAClF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,0EAA0E;QAC1E,0EAA0E;QAC1E,uCAAuC;QACvC,MAAM,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,CAAC,GAAG,YAAY,CACpB,IAAI,EACJ,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC;YACC,GAAG,CAAC;YACJ,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACjD,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D,CAAmB,CACvB,CACF,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC;QAC9D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC;QAC9D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7F,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YACd,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAc;IAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,aAAa,CAAC,OAAkD;IAC9E,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SACpD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;SACvE,IAAI,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC"}
|
package/dist/brain/link.d.ts
CHANGED
|
@@ -78,6 +78,23 @@ export declare function markRulesChecked(dir: string, now?: number): void;
|
|
|
78
78
|
* stored value can always be corrected without editing a file.
|
|
79
79
|
*/
|
|
80
80
|
export declare function baseUrlFor(link: BrainLink): string;
|
|
81
|
+
/** The API host before there is a link to read one from: signing up. */
|
|
82
|
+
export declare function apiBaseUrl(): string;
|
|
83
|
+
/** A sign-up an agent-run push started and has not collected yet. */
|
|
84
|
+
export interface PendingSignup {
|
|
85
|
+
/** The state in the link, which is what claims the trail. */
|
|
86
|
+
state: string;
|
|
87
|
+
/** The repository the link was for, so a changed remote starts over. */
|
|
88
|
+
repo: string;
|
|
89
|
+
createdAt: number;
|
|
90
|
+
}
|
|
91
|
+
/** The sign-up waiting on repo `dir`, or null when there is none or it is too
|
|
92
|
+
* old to claim, or it was for a different repository. */
|
|
93
|
+
export declare function readPendingSignup(dir: string, repo: string, maxAgeMs: number, now?: number): PendingSignup | null;
|
|
94
|
+
/** Save the sign-up an agent-run push just started. Git-ignored like the link,
|
|
95
|
+
* because the state claims a read token. */
|
|
96
|
+
export declare function writePendingSignup(dir: string, pending: PendingSignup): void;
|
|
97
|
+
export declare function clearPendingSignup(dir: string): void;
|
|
81
98
|
/**
|
|
82
99
|
* Fetch the brain's symbol-anchored rules.
|
|
83
100
|
*
|
package/dist/brain/link.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/brain/link.ts"],"names":[],"mappings":"AAsBA,uEAAuE;AACvE,eAAO,MAAM,YAAY,QAAqB,CAAC;AAE/C;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,QAAgB,CAAC;AAEhD,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB;;;iEAG6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,gCAAgC;AAChC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAStD;AAED;;;;;;;mEAOmE;AACnE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAG5D;AAED,yFAAyF;AACzF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAE7D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,SAAa,GAAG,OAAO,CAIhF;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI,CAIpE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAElD;AAeD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,EACf,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CA4B7B"}
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/brain/link.ts"],"names":[],"mappings":"AAsBA,uEAAuE;AACvE,eAAO,MAAM,YAAY,QAAqB,CAAC;AAE/C;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,QAAgB,CAAC;AAEhD,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB;;;iEAG6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,gCAAgC;AAChC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAStD;AAED;;;;;;;mEAOmE;AACnE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAG5D;AAED,yFAAyF;AACzF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAE7D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,SAAa,GAAG,OAAO,CAIhF;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI,CAIpE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAElD;AAED,wEAAwE;AACxE,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;yDACyD;AACzD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,aAAa,GAAG,IAAI,CAIrH;AAED;4CAC4C;AAC5C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAG5E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEpD;AAeD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,EACf,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CA4B7B"}
|
package/dist/brain/link.js
CHANGED
|
@@ -101,6 +101,27 @@ export function markRulesChecked(dir, now = Date.now()) {
|
|
|
101
101
|
export function baseUrlFor(link) {
|
|
102
102
|
return (process.env.GRAFT_BRAIN_URL || link.baseUrl || DEFAULT_BRAIN_BASE_URL).replace(/\/+$/, '');
|
|
103
103
|
}
|
|
104
|
+
/** The API host before there is a link to read one from: signing up. */
|
|
105
|
+
export function apiBaseUrl() {
|
|
106
|
+
return (process.env.GRAFT_BRAIN_URL || DEFAULT_BRAIN_BASE_URL).replace(/\/+$/, '');
|
|
107
|
+
}
|
|
108
|
+
/** The sign-up waiting on repo `dir`, or null when there is none or it is too
|
|
109
|
+
* old to claim, or it was for a different repository. */
|
|
110
|
+
export function readPendingSignup(dir, repo, maxAgeMs, now = Date.now()) {
|
|
111
|
+
const p = readBuildConfig(dir)?.pendingSignup;
|
|
112
|
+
if (!p?.state || p.repo !== repo || !(now - p.createdAt < maxAgeMs))
|
|
113
|
+
return null;
|
|
114
|
+
return p;
|
|
115
|
+
}
|
|
116
|
+
/** Save the sign-up an agent-run push just started. Git-ignored like the link,
|
|
117
|
+
* because the state claims a read token. */
|
|
118
|
+
export function writePendingSignup(dir, pending) {
|
|
119
|
+
patchBuildConfig(dir, { pendingSignup: pending });
|
|
120
|
+
ensureGitignored(dir, join(dir, BUILD_CONFIG_DIR), LINK_NOTE);
|
|
121
|
+
}
|
|
122
|
+
export function clearPendingSignup(dir) {
|
|
123
|
+
patchBuildConfig(dir, { pendingSignup: undefined });
|
|
124
|
+
}
|
|
104
125
|
/** Timeout for one rules fetch. Short: `ask` must never block on this. */
|
|
105
126
|
const FETCH_TIMEOUT_MS = 5000;
|
|
106
127
|
/**
|
package/dist/brain/link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/brain/link.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/brain/link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ConnectResult } from "./connect.js";
|
|
2
|
+
import type { BrainLink } from "./link.js";
|
|
3
|
+
export interface PullOptions {
|
|
4
|
+
home: string;
|
|
5
|
+
/** The agents this repo is wired for; empty means no choice was recorded. */
|
|
6
|
+
wired: string[];
|
|
7
|
+
dryRun?: boolean;
|
|
8
|
+
fetchImpl?: typeof fetch;
|
|
9
|
+
write?: (line: string) => void;
|
|
10
|
+
}
|
|
11
|
+
/** The rules line: how many, and which files they are in. */
|
|
12
|
+
export declare function rulesLine(repo: string, res: ConnectResult): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Run the pull. Returns the exit code; every line goes through `write`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function runTrailPull(repo: string, link: BrainLink, opts: PullOptions): Promise<number>;
|
|
17
|
+
//# sourceMappingURL=pull.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/brain/pull.ts"],"names":[],"mappings":"AAYA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAahE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAK3C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAQD,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CASzE;AAgCD;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAiHpG"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `graft trail pull`: one command for both things a trail hands this repo.
|
|
3
|
+
*
|
|
4
|
+
* First the rules, refreshed into graft's own blocks in the agent files (what
|
|
5
|
+
* `graft trail pull` always did). Then every change accepted in Trail, for every
|
|
6
|
+
* context file the picked agents read — the root CLAUDE.md (what `graft
|
|
7
|
+
* claude-md pull` did, and still does, as an alias of this), and then AGENTS.md,
|
|
8
|
+
* folder CLAUDE.md files, Cursor rules and skills when Trail serves them.
|
|
9
|
+
*
|
|
10
|
+
* Files for agents that were not picked are neither listed nor written.
|
|
11
|
+
*/
|
|
12
|
+
import { isAbsolute, relative } from "node:path";
|
|
13
|
+
import { connectBrain } from "./connect.js";
|
|
14
|
+
import { fetchAcceptedChanges, markApplied } from "./claude-md.js";
|
|
15
|
+
import { changeSummary, fetchContextFiles, kindForPath, markContextFilesApplied, planContextFile, readByWired, writePlannedFile, } from "./context-files.js";
|
|
16
|
+
import { reviewUrl } from "./signup.js";
|
|
17
|
+
import { CONTEXT_FILE_KINDS, countBucket } from "../telemetry/contract.js";
|
|
18
|
+
import { track } from "../telemetry/track.js";
|
|
19
|
+
/** Repo-relative, forward slashes, for printing. */
|
|
20
|
+
function show(repo, path) {
|
|
21
|
+
const rel = isAbsolute(path) ? relative(repo, path) : path;
|
|
22
|
+
return rel.split("\\").join("/");
|
|
23
|
+
}
|
|
24
|
+
/** The rules line: how many, and which files they are in. */
|
|
25
|
+
export function rulesLine(repo, res) {
|
|
26
|
+
if (res.warning)
|
|
27
|
+
return `⚠ ${res.warning}`;
|
|
28
|
+
if (res.ruleCount === 0)
|
|
29
|
+
return "· the trail has no rules yet — run graft trail push to read this repo into it";
|
|
30
|
+
const n = res.ruleCount.toLocaleString("en-US");
|
|
31
|
+
const where = res.writes.map((w) => show(repo, w.path)).join(", ");
|
|
32
|
+
const rules = `${n} rule${res.ruleCount === 1 ? "" : "s"}`;
|
|
33
|
+
if (!where)
|
|
34
|
+
return `✓ ${rules} pulled · no instruction file to write them into — graft ask still carries them`;
|
|
35
|
+
if (res.writes.every((w) => w.action === "unchanged"))
|
|
36
|
+
return `✓ rules already current · ${n} in ${where}`;
|
|
37
|
+
return `✓ ${rules} refreshed in ${where}`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The `trail_pulled` event for one pull. Only the outcome, which kinds of file
|
|
41
|
+
* were written, and bucketed counts leave the machine — see TELEMETRY.md.
|
|
42
|
+
*/
|
|
43
|
+
function trackPull(repo, home, outcome, planned = []) {
|
|
44
|
+
const wrote = planned.filter((p) => p.plan.status && p.plan.written.length > 0);
|
|
45
|
+
const kinds = [...new Set(wrote.map((p) => p.kind))]
|
|
46
|
+
.filter((k) => CONTEXT_FILE_KINDS.includes(k))
|
|
47
|
+
.sort()
|
|
48
|
+
.join(",");
|
|
49
|
+
track("trail_pulled", {
|
|
50
|
+
outcome,
|
|
51
|
+
kinds,
|
|
52
|
+
files_bucket: countBucket(wrote.length),
|
|
53
|
+
changes_bucket: countBucket(wrote.reduce((n, p) => n + p.plan.written.length, 0)),
|
|
54
|
+
skipped_bucket: countBucket(planned.reduce((n, p) => n + p.plan.skipped.length, 0)),
|
|
55
|
+
}, { repo, home });
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Run the pull. Returns the exit code; every line goes through `write`.
|
|
59
|
+
*/
|
|
60
|
+
export async function runTrailPull(repo, link, opts) {
|
|
61
|
+
const write = opts.write ?? ((l) => console.error(l));
|
|
62
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
63
|
+
let code = 0;
|
|
64
|
+
// 1. The rules. Skipped on a dry run, which writes nothing at all.
|
|
65
|
+
if (!opts.dryRun) {
|
|
66
|
+
const res = await connectBrain(repo, link, {
|
|
67
|
+
home: opts.home,
|
|
68
|
+
ids: opts.wired.length > 0 ? opts.wired : undefined,
|
|
69
|
+
fetchImpl,
|
|
70
|
+
});
|
|
71
|
+
const line = rulesLine(repo, res);
|
|
72
|
+
if (line)
|
|
73
|
+
write(line);
|
|
74
|
+
if (res.warning)
|
|
75
|
+
code = 1;
|
|
76
|
+
}
|
|
77
|
+
// 2. Accepted changes: the root CLAUDE.md, then every other context file.
|
|
78
|
+
const planned = [];
|
|
79
|
+
let accepted = 0;
|
|
80
|
+
const md = await fetchAcceptedChanges(link, fetchImpl);
|
|
81
|
+
if ("error" in md) {
|
|
82
|
+
if (!md.unsupported) {
|
|
83
|
+
write(`✗ ${md.error}`);
|
|
84
|
+
code = 1;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (md.changes.length > 0) {
|
|
88
|
+
const file = { kind: kindForPath(md.path || "CLAUDE.md"), path: md.path || "CLAUDE.md", changes: md.changes };
|
|
89
|
+
if (readByWired(file.kind, opts.wired)) {
|
|
90
|
+
accepted += file.changes.length;
|
|
91
|
+
planned.push({ plan: planContextFile(repo, file), source: "claude-md", kind: file.kind });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const ctx = await fetchContextFiles(link, fetchImpl);
|
|
95
|
+
if ("error" in ctx) {
|
|
96
|
+
write(`✗ ${ctx.error}`);
|
|
97
|
+
code = 1;
|
|
98
|
+
}
|
|
99
|
+
else if (!("unsupported" in ctx)) {
|
|
100
|
+
for (const file of ctx.files) {
|
|
101
|
+
if (file.changes.length === 0 || !readByWired(file.kind, opts.wired))
|
|
102
|
+
continue;
|
|
103
|
+
accepted += file.changes.length;
|
|
104
|
+
planned.push({ plan: planContextFile(repo, file), source: "context-files", kind: file.kind });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (accepted === 0) {
|
|
108
|
+
if (code === 0) {
|
|
109
|
+
write("· nothing accepted in Trail yet — review:");
|
|
110
|
+
write(` ${reviewUrl(link.brainId)}`);
|
|
111
|
+
}
|
|
112
|
+
trackPull(repo, opts.home, code === 0 ? "nothing_accepted" : "error");
|
|
113
|
+
return code;
|
|
114
|
+
}
|
|
115
|
+
const writing = planned.filter((p) => p.plan.status);
|
|
116
|
+
const changes = writing.reduce((n, p) => n + p.plan.written.length, 0);
|
|
117
|
+
if (writing.length > 0) {
|
|
118
|
+
write(`✓ ${opts.dryRun ? "would write" : "wrote"} ${changes} accepted change${changes === 1 ? "" : "s"}`);
|
|
119
|
+
const width = Math.max(30, ...writing.map((p) => p.plan.path.length)) + 2;
|
|
120
|
+
for (const { plan } of writing) {
|
|
121
|
+
const summary = changeSummary(plan.written);
|
|
122
|
+
write(` ${plan.status} ${summary ? plan.path.padEnd(width) : plan.path}${summary}`.trimEnd());
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else if (planned.some((p) => p.plan.present.length > 0)) {
|
|
126
|
+
write("✓ every accepted change is already in these files");
|
|
127
|
+
}
|
|
128
|
+
for (const { plan } of planned) {
|
|
129
|
+
for (const s of plan.skipped) {
|
|
130
|
+
const what = s.change.kind === "edit" || s.change.kind === "add" ? `${changeSummary([s.change])} in ${plan.path}` : plan.path;
|
|
131
|
+
write(`⚠ skipped ${what} — ${s.why}; edit it in Trail, then pull again`);
|
|
132
|
+
code = 1;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (opts.dryRun) {
|
|
136
|
+
write("· dry run — nothing written, and Trail was not told");
|
|
137
|
+
trackPull(repo, opts.home, "dry_run", planned);
|
|
138
|
+
return code;
|
|
139
|
+
}
|
|
140
|
+
for (const { plan } of writing) {
|
|
141
|
+
try {
|
|
142
|
+
writePlannedFile(repo, plan);
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
write(`✗ could not write ${plan.path}: ${e instanceof Error ? e.message : e}`);
|
|
146
|
+
// Nothing from a file that was not written is reported as applied.
|
|
147
|
+
plan.written = [];
|
|
148
|
+
plan.present = [];
|
|
149
|
+
code = 1;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Written now or already there: either way Trail should stop listing it.
|
|
153
|
+
const done = (source) => planned.filter((p) => p.source === source).flatMap((p) => [...p.plan.written, ...p.plan.present].map((c) => c.id));
|
|
154
|
+
const told = (await markApplied(link, done("claude-md"), fetchImpl)) && (await markContextFilesApplied(link, done("context-files"), fetchImpl));
|
|
155
|
+
if (!told)
|
|
156
|
+
write("⚠ could not tell Trail which changes were written; it may still list them");
|
|
157
|
+
if (writing.length > 0)
|
|
158
|
+
write("· review with git diff, then commit");
|
|
159
|
+
const anyWritten = planned.some((p) => p.plan.status && p.plan.written.length > 0);
|
|
160
|
+
const anyPresent = planned.some((p) => p.plan.present.length > 0);
|
|
161
|
+
const anySkipped = planned.some((p) => p.plan.skipped.length > 0);
|
|
162
|
+
const outcome = anyWritten
|
|
163
|
+
? "written"
|
|
164
|
+
: anyPresent
|
|
165
|
+
? "already_present"
|
|
166
|
+
: anySkipped
|
|
167
|
+
? "skipped"
|
|
168
|
+
: "error";
|
|
169
|
+
trackPull(repo, opts.home, outcome, planned);
|
|
170
|
+
return code;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=pull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/brain/pull.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,YAAY,EAAsB,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,uBAAuB,EACvB,eAAe,EACf,WAAW,EACX,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAyB,MAAM,0BAA0B,CAAC;AAClG,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAW9C,oDAAoD;AACpD,SAAS,IAAI,CAAC,IAAY,EAAE,IAAY;IACtC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,GAAkB;IACxD,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;IAC3C,IAAI,GAAG,CAAC,SAAS,KAAK,CAAC;QAAE,OAAO,+EAA+E,CAAC;IAChH,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC3D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,KAAK,iFAAiF,CAAC;IAC/G,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC;QAAE,OAAO,6BAA6B,CAAC,OAAO,KAAK,EAAE,CAAC;IAC3G,OAAO,KAAK,KAAK,iBAAiB,KAAK,EAAE,CAAC;AAC5C,CAAC;AASD;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,IAAwB,EAAE,OAAyB,EAAE,UAAqB,EAAE;IAC3G,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SACjD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,kBAAwC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SACpE,IAAI,EAAE;SACN,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,KAAK,CACH,cAAc,EACd;QACE,OAAO;QACP,KAAK;QACL,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;QACvC,cAAc,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjF,cAAc,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;KACpF,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,IAAe,EAAE,IAAiB;IACjF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC1C,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,mEAAmE;IACnE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE;YACzC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACnD,SAAS;SACV,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClC,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,GAAG,CAAC,OAAO;YAAE,IAAI,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,0EAA0E;IAC1E,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACvD,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;YACpB,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;YACvB,IAAI,GAAG,CAAC,CAAC;QACX,CAAC;IACH,CAAC;SAAM,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAgB,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC;QAC3H,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACxB,IAAI,GAAG,CAAC,CAAC;IACX,CAAC;SAAM,IAAI,CAAC,CAAC,aAAa,IAAI,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC/E,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,KAAK,CAAC,2CAA2C,CAAC,CAAC;YACnD,KAAK,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,mBAAmB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1G,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1E,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5C,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1D,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9H,KAAK,CAAC,aAAa,IAAI,MAAM,CAAC,CAAC,GAAG,qCAAqC,CAAC,CAAC;YACzE,IAAI,GAAG,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAC7D,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,CAAC,qBAAqB,IAAI,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/E,mEAAmE;YACnE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,MAAM,IAAI,GAAG,CAAC,MAAyB,EAAE,EAAE,CACzC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrH,MAAM,IAAI,GAAG,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAChJ,IAAI,CAAC,IAAI;QAAE,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC9F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnF,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,OAAO,GAAqB,UAAU;QAC1C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,UAAU;YACV,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,UAAU;gBACV,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,OAAO,CAAC;IAChB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC"}
|