chopin-ai 0.2.0 → 0.3.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.
Files changed (64) hide show
  1. package/README.md +1 -2
  2. package/dist/agent.d.ts +5 -5
  3. package/dist/agent.js +7 -11
  4. package/dist/agent.js.map +1 -1
  5. package/dist/bin.js +7 -2
  6. package/dist/bin.js.map +1 -1
  7. package/dist/chat.js +7 -0
  8. package/dist/chat.js.map +1 -1
  9. package/dist/credentials.d.ts +5 -1
  10. package/dist/credentials.js +18 -0
  11. package/dist/credentials.js.map +1 -1
  12. package/dist/header.d.ts +1 -0
  13. package/dist/header.js +7 -1
  14. package/dist/header.js.map +1 -1
  15. package/dist/home.d.ts +22 -3
  16. package/dist/home.js +11 -3
  17. package/dist/home.js.map +1 -1
  18. package/dist/project.d.ts +19 -2
  19. package/dist/project.js +111 -26
  20. package/dist/project.js.map +1 -1
  21. package/dist/rsi/control.d.ts +34 -0
  22. package/dist/rsi/control.js +142 -0
  23. package/dist/rsi/control.js.map +1 -0
  24. package/dist/rsi/evolve.d.ts +15 -0
  25. package/dist/rsi/evolve.js +314 -0
  26. package/dist/rsi/evolve.js.map +1 -0
  27. package/dist/rsi/export.d.ts +6 -0
  28. package/dist/rsi/export.js +25 -0
  29. package/dist/rsi/export.js.map +1 -0
  30. package/dist/rsi/harvest.d.ts +87 -0
  31. package/dist/rsi/harvest.js +274 -0
  32. package/dist/rsi/harvest.js.map +1 -0
  33. package/dist/rsi/held.d.ts +29 -0
  34. package/dist/rsi/held.js +45 -0
  35. package/dist/rsi/held.js.map +1 -0
  36. package/dist/rsi/lifecycle.d.ts +8 -0
  37. package/dist/rsi/lifecycle.js +25 -0
  38. package/dist/rsi/lifecycle.js.map +1 -0
  39. package/dist/rsi/models.d.ts +25 -0
  40. package/dist/rsi/models.js +71 -0
  41. package/dist/rsi/models.js.map +1 -0
  42. package/dist/rsi/records.d.ts +14 -0
  43. package/dist/rsi/records.js +20 -0
  44. package/dist/rsi/records.js.map +1 -0
  45. package/dist/rsi/round.d.ts +62 -0
  46. package/dist/rsi/round.js +333 -0
  47. package/dist/rsi/round.js.map +1 -0
  48. package/dist/rsi/schedule.d.ts +14 -0
  49. package/dist/rsi/schedule.js +42 -0
  50. package/dist/rsi/schedule.js.map +1 -0
  51. package/dist/rsi/summary.d.ts +5 -0
  52. package/dist/rsi/summary.js +41 -0
  53. package/dist/rsi/summary.js.map +1 -0
  54. package/dist/serve.js +52 -29
  55. package/dist/serve.js.map +1 -1
  56. package/dist/transcript.js +6 -1
  57. package/dist/transcript.js.map +1 -1
  58. package/package.json +11 -12
  59. package/dist/browser.d.ts +0 -2
  60. package/dist/browser.js +0 -9
  61. package/dist/browser.js.map +0 -1
  62. package/dist/web.d.ts +0 -3
  63. package/dist/web.js +0 -20
  64. package/dist/web.js.map +0 -1
@@ -0,0 +1,333 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { mkdir, mkdtemp, readFile, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { admitDaily, audit, continuationPrefix, DEFAULT_PROPOSER_SKILL, LoopFault, MENDED_POINTS, recurringPoints, recursOften, effectiveLayer, goodSteps, isUserWritten, judgeContext, judgeEquivalent, judgeRepeat, loadSkills, overLimits, parseProposal, proposalBrief, PROPOSER_SKILL, SCREEN_PAIRS, signals, skillBody, triggered, } from "@chopin-ai/core";
6
+ import { writeWhole } from "../home.js";
7
+ import { digest, readSession } from "./harvest.js";
8
+ import { BudgetSpent } from "./models.js";
9
+ /** How much of a session before a decision point a continuation carries, and how many points a test draws from. */
10
+ const PREFIX = 40;
11
+ const PROTECT_POINTS = 20;
12
+ /** How much of each request the proposer read the audit is shown. */
13
+ const REQUEST_CHARS = 300;
14
+ /**
15
+ * How many points a round may lose to failed calls, such as points a provider refuses for their content, before the
16
+ * provider is probed to tell content it will not take from a fault that stops the loop, once they are also half of
17
+ * the points tried; a point lost once is not tried again in the round.
18
+ */
19
+ const POINT_FAILURES = 3;
20
+ /** Whether a round has lost enough of the points it tried, and so many of them, to probe the provider. */
21
+ export function tripsBreaker(lost, attempted) {
22
+ return lost >= POINT_FAILURES && lost * 2 >= attempted;
23
+ }
24
+ /** A session any model continues without objection, to tell a provider that fails from content it will not take. */
25
+ const PROBE = [{
26
+ at: "", notification: { sessionId: "probe", update: { sessionUpdate: "user_message_chunk", content: { type: "text", text: "List the files here." } } },
27
+ }];
28
+ /** Calls on one kind's sessions kept failing while the provider answered others: it will not take their content. */
29
+ class ContentRefused extends Error {
30
+ }
31
+ /**
32
+ * Runs a round for every kind of failure that recurred, has no change kept for it yet, and is not set aside: first
33
+ * the kinds the user confirmed a correction of, then the rest, each in order of how many sessions it came from.
34
+ */
35
+ export async function runRounds(setup, onOutcome = () => { }) {
36
+ const answered = await setup.evidence.answered();
37
+ const waiting = new Set((await setup.held.waiting()).map((held) => held.failure));
38
+ const corrections = await setup.evidence.confirmedCorrections();
39
+ const corrected = (found) => Number(found.failures.some((failure) => corrections.has(`${failure.session}:${failure.line}`)));
40
+ const outcomes = [];
41
+ for (const found of triggered(await setup.evidence.kinds()).sort((a, b) => corrected(b) - corrected(a))) {
42
+ if (answered.has(found.key) || waiting.has(found.key))
43
+ continue;
44
+ const criteria = await setup.evidence.criteria(found);
45
+ if (await setup.rejections.shelved(found.key, setup.model, found.failures.length, criteria))
46
+ continue;
47
+ const approved = await setup.held.approved(found.key);
48
+ const outcome = await runRound(setup, found, approved, corrections, criteria).catch((error) => {
49
+ if (!(error instanceof ContentRefused))
50
+ throw error;
51
+ return recordRefusal(setup, found, `its sessions keep failing to continue: ${error.message}`);
52
+ });
53
+ if (approved !== undefined)
54
+ await setup.held.decide(approved, "tested");
55
+ onOutcome(outcome);
56
+ outcomes.push(outcome);
57
+ }
58
+ return outcomes;
59
+ }
60
+ /** Records why a round kept nothing; one that found the failure no longer happens sets the kind aside. */
61
+ async function recordRefusal(setup, found, reason, refusal = {}) {
62
+ const { text = "", prediction, certificate, notRecurring } = refusal;
63
+ await setup.rejections.record({
64
+ failure: found.key, candidate: certificate?.candidate ?? "", text, reason, ...(prediction && { prediction }), ...(notRecurring && { notRecurring }),
65
+ });
66
+ if (notRecurring !== undefined)
67
+ return { failure: found.key, outcome: "set_aside", reason };
68
+ return { failure: found.key, outcome: "refused", reason, ...(certificate && { certificate }) };
69
+ }
70
+ /**
71
+ * One round for one kind of failure. Its failures are first continued with the incumbent to find where it still
72
+ * happens; a failure that no longer does leaves nothing to mend on this model. Then the proposer reads every time it
73
+ * happened and proposes one change, which must fit the layer's limits and pass the audit, and is tested where the
74
+ * failure recurs and on steps that went right in sessions the proposer did not read, kept as a new version only if
75
+ * it is better there.
76
+ */
77
+ async function runRound(setup, found, approved, corrections, criteria) {
78
+ const refuse = (reason, refusal) => recordRefusal(setup, found, reason, refusal);
79
+ const sessions = new Map();
80
+ const read = async (path) => {
81
+ let entries = sessions.get(path);
82
+ if (entries === undefined) {
83
+ const source = setup.sources.find((candidate) => candidate.path === path);
84
+ entries = source === undefined ? [] : await readSession(source, setup.secrets);
85
+ sessions.set(path, entries);
86
+ }
87
+ return entries;
88
+ };
89
+ const random = setup.random ?? Math.random;
90
+ const current = await setup.versions.current();
91
+ const items = await setup.versions.items(current);
92
+ const runner = { model: setup.model, harness: "pi", anyModel: true };
93
+ const incumbent = await effectiveLayer(setup.base, setup.versions, current, runner);
94
+ const attempted = new Set();
95
+ const lost = new Set();
96
+ const guarded = async (point, call) => {
97
+ if (lost.has(point))
98
+ return undefined;
99
+ attempted.add(point);
100
+ try {
101
+ return await call();
102
+ }
103
+ catch (error) {
104
+ if (error instanceof BudgetSpent || error instanceof ContentRefused || error instanceof LoopFault)
105
+ throw error;
106
+ lost.add(point);
107
+ if (!tripsBreaker(lost.size, attempted.size)) {
108
+ setup.report?.(error);
109
+ return undefined;
110
+ }
111
+ if (await answers())
112
+ throw new ContentRefused(error instanceof Error ? error.message : String(error));
113
+ throw error;
114
+ }
115
+ };
116
+ // Whether the provider answers a continuation and a judge at all.
117
+ const answers = async () => {
118
+ try {
119
+ await judgeRepeat("", await setup.continueStep(incumbent, PROBE), found.signature, setup.judge);
120
+ return true;
121
+ }
122
+ catch (error) {
123
+ if (error instanceof BudgetSpent)
124
+ throw error;
125
+ return false;
126
+ }
127
+ };
128
+ const prefixes = new Map();
129
+ const sessionOf = new Map();
130
+ const failurePoints = [];
131
+ for (const failure of found.failures) {
132
+ const entries = await read(failure.session);
133
+ const prefix = continuationPrefix(entries, failure.line, PREFIX);
134
+ if (prefix === undefined)
135
+ continue;
136
+ const id = `${failure.session}:${failure.line}`;
137
+ prefixes.set(id, prefix);
138
+ sessionOf.set(id, failure.session);
139
+ const correction = corrections.get(id);
140
+ failurePoints.push({ id, context: judgeContext(entries, failure.line), failure: found.signature, ...(correction !== undefined && { correction }) });
141
+ }
142
+ if (failurePoints.length === 0)
143
+ return refuse("none of its failures has a conversation before it to continue from");
144
+ const known = await setup.evidence.recurrence(current, setup.model);
145
+ // A verdict holds for the criterion it was judged by, so a point judged by a correction keeps its own.
146
+ const judged = (point) => (point.correction === undefined ? point.id : `${point.id}#${digest(point.correction)}`);
147
+ const drawn = (point, draw) => (draw === 0 ? judged(point) : `${judged(point)}@${draw}`);
148
+ const draws = (point) => {
149
+ let count = 0;
150
+ while (known.has(drawn(point, count)))
151
+ count += 1;
152
+ return count;
153
+ };
154
+ // Draws already made cost nothing to make again, so the points with the most come first.
155
+ const order = shuffled(failurePoints, random).sort((a, b) => draws(b) - draws(a));
156
+ const { recurring, repeats, tried } = await recurringPoints(order, async (point, draw) => {
157
+ const key = drawn(point, draw);
158
+ const cached = known.get(key);
159
+ if (cached !== undefined)
160
+ return cached;
161
+ const step = await guarded(point.id, () => setup.continueStep(incumbent, prefixes.get(point.id) ?? []));
162
+ const verdict = step === undefined ? undefined : await guarded(point.id, () => judgeRepeat(point.context, step, point.failure, setup.judge, point.correction));
163
+ if (verdict === undefined)
164
+ return undefined;
165
+ await setup.evidence.addRecurrence(key, current, setup.model, verdict === "repeats");
166
+ return verdict === "repeats";
167
+ });
168
+ if (tried === 0)
169
+ return refuse("none of its failures could be continued");
170
+ if (!recursOften({ repeats, tried })) {
171
+ return refuse(`it seldom recurs when its sessions are continued: ${repeats} of the ${tried} continuations`, { notRecurring: { model: setup.model, failures: found.failures.length, criteria, tried } });
172
+ }
173
+ // No change could be kept until it recurs at enough points; the checks are cached per layer version, so retrying is free.
174
+ if (recurring.length < MENDED_POINTS) {
175
+ return { failure: found.key, outcome: "set_aside", reason: `it recurs at ${recurring.length} decision point, and a change must mend ${MENDED_POINTS}` };
176
+ }
177
+ // A proposal the user approved after the audit held it is tested as it was; a new one is asked for otherwise.
178
+ const proposal = approved?.proposal ?? parseProposal(await setup.propose(await proposerPrompt(setup, found, corrections, items, incumbent, read)));
179
+ if (proposal === undefined)
180
+ return refuse("the proposer's reply was not one well-formed proposal");
181
+ const { candidate, prediction } = proposal;
182
+ const proposed = { text: candidate.text, prediction };
183
+ const changed = await withCandidate(incumbent, items, proposal);
184
+ if (changed === undefined)
185
+ return refuse("the skill it proposed does not load", proposed);
186
+ const over = overLimits(changed);
187
+ if (over.length > 0)
188
+ return refuse(`it would put the layer over its limits: ${over.join("; ")}`, proposed);
189
+ if (approved === undefined) {
190
+ const audited = await audit({
191
+ candidate, rules: setup.rules,
192
+ existing: items.filter((item) => !item.archived).map((item) => ({ id: item.id, text: item.text ?? item.skill ?? "" })),
193
+ diagnosisTasks: await requests(found, read),
194
+ }, setup.judge);
195
+ if (audited === undefined)
196
+ return refuse("the audit could not be read", proposed);
197
+ if (audited.decision === "review" && setup.holdForReview === true) {
198
+ await setup.held.hold({ id: randomUUID(), failure: found.key, proposal, reasons: audited.reasons });
199
+ return { failure: found.key, outcome: "held", reason: `the audit asks for your review: ${audited.reasons.join("; ")}` };
200
+ }
201
+ if (audited.decision !== "admit") {
202
+ const why = audited.decision === "revise" ? `it overlaps ${audited.existing}; revise that item instead` : audited.reasons.join("; ") || audited.decision;
203
+ return refuse(`the audit ${audited.decision === "review" ? "asks for your review" : "refused it"}: ${why}`, proposed);
204
+ }
205
+ }
206
+ const project = proposal.scope === "project" ? setup.projectOf(found.failures[0].session) : undefined;
207
+ if (proposal.scope === "project" && project === undefined)
208
+ return refuse("it holds only in one project, and the session's project cannot be told", proposed);
209
+ const target = project?.versions ?? setup.versions;
210
+ const targetVersion = await target.current();
211
+ const before = project === undefined ? incumbent : await effectiveLayer(incumbent, project.versions, targetVersion, runner);
212
+ const after = project === undefined ? changed : await withCandidate(before, await target.items(targetVersion), proposal);
213
+ if (after === undefined)
214
+ return refuse("the skill it proposed does not load", proposed);
215
+ const sameScope = (path) => project === undefined || setup.projectOf(path)?.key === project.key;
216
+ const fixPoints = recurring.filter((point) => sameScope(sessionOf.get(point.id) ?? ""));
217
+ if (fixPoints.length < MENDED_POINTS)
218
+ return refuse(`it recurs at fewer than ${MENDED_POINTS} decision points in the project it holds in`, proposed);
219
+ const protectPoints = await protect(setup, read, new Set(found.sessions), prefixes, sameScope);
220
+ const id = randomUUID();
221
+ const certificate = await admitDaily({
222
+ candidate: id, kind: candidate.kind, scope: project === undefined ? { kind: "global" } : { kind: "project", project: project.key },
223
+ incumbent: targetVersion, fixPoints, protectPoints,
224
+ continueAt: async (arm, point) => {
225
+ const step = await guarded(point.id, () => setup.continueStep(arm === "candidate" ? after : before, prefixes.get(point.id) ?? []));
226
+ if (step === undefined)
227
+ return undefined;
228
+ const used = proposal.skill === undefined || step.includes(`"call":"skill"`) && step.includes(`"${proposal.skill}"`);
229
+ return { step, used: arm === "candidate" && used };
230
+ },
231
+ judgeRepeat: async (point, step) => guarded(point.id, () => judgeRepeat(point.context, step, point.failure, setup.judge, point.correction)),
232
+ judgeEquivalent: async (point, step) => guarded(point.id, () => judgeEquivalent(point.context, point.original, step, setup.judge)),
233
+ ledger: setup.ledger, limit: setup.limit ?? 120, mustBeUsed: proposal.skill !== undefined, prediction, model: setup.model,
234
+ random,
235
+ });
236
+ await mkdir(setup.certificates, { recursive: true });
237
+ await writeWhole(join(setup.certificates, `${id}.json`), `${JSON.stringify(certificate, null, 2)}\n`, 0o600);
238
+ if (certificate.pairs === 0 && lost.size > 0)
239
+ return refuse(`none of its decision points could be continued: ${lost.size} lost`, { ...proposed, certificate });
240
+ const { pairs, incumbentRepeated, candidateRepeated } = certificate.atFailures;
241
+ const atFailures = `at failures it repeated ${candidateRepeated} of ${pairs} times, the incumbent ${incumbentRepeated}`;
242
+ if (certificate.screenedOut)
243
+ return refuse(`it mended none of the first ${SCREEN_PAIRS} failures it was tried on; ${atFailures}`, { ...proposed, certificate });
244
+ if (!certificate.kept) {
245
+ const short = `evidence ${certificate.evidence.toFixed(2)} short of ${(1 / certificate.level).toFixed(0)}`;
246
+ return refuse(`not better where tested: ${certificate.pairs} pairs, ${short}; ${atFailures}`, { ...proposed, certificate });
247
+ }
248
+ const item = {
249
+ id, kind: candidate.kind, ...(candidate.kind === "instruction" ? { text: candidate.text } : { skill: proposal.skill }),
250
+ validated: { models: [setup.model], harnesses: ["pi"] }, source: { failure: found.key, certificate: id },
251
+ pinned: false, archived: false, added: new Date().toISOString(),
252
+ };
253
+ const files = proposal.skill === undefined ? {} : { [`skills/${proposal.skill}/SKILL.md`]: candidate.text };
254
+ const version = await target.commit((all) => [...all.map((old) => (old.id === candidate.revises ? { ...old, archived: true } : old)), item], files);
255
+ await setup.evidence.addAnswered(found.key);
256
+ return { failure: found.key, outcome: "kept", version, certificate };
257
+ }
258
+ /** What the proposer is asked: its method, the instructions in use, and the brief on the failure. */
259
+ async function proposerPrompt(setup, found, corrections, items, incumbent, read) {
260
+ const sessions = [];
261
+ for (const session of found.sessions) {
262
+ sessions.push({ session, entries: await read(session), lines: found.failures.filter((f) => f.session === session).map((f) => f.line) });
263
+ }
264
+ const brief = proposalBrief({
265
+ failure: found, sessions, corrections,
266
+ secrets: setup.secrets,
267
+ rejections: await setup.rejections.for(found.key),
268
+ existing: items.filter((item) => !item.archived).map((item) => ({ id: item.id, text: item.text ?? item.skill ?? "" })),
269
+ });
270
+ const own = incumbent.skills.find((skill) => skill.name === PROPOSER_SKILL);
271
+ const method = own === undefined ? DEFAULT_PROPOSER_SKILL : await readFile(join(own.directory, "SKILL.md"), "utf8");
272
+ return [skillBody(method), "## Your instructions now", incumbent.instructions ?? "(none)", brief].join("\n\n");
273
+ }
274
+ /** `items` in a random order, every order equally likely. */
275
+ function shuffled(items, random) {
276
+ const order = [...items];
277
+ for (let i = order.length - 1; i > 0; i -= 1) {
278
+ const j = Math.floor(random() * (i + 1));
279
+ [order[i], order[j]] = [order[j], order[i]];
280
+ }
281
+ return order;
282
+ }
283
+ /** The layer with the proposal applied, the item it revises taking its place; `undefined` when a skill does not load. */
284
+ async function withCandidate(layer, items, proposal) {
285
+ const revised = items.find((item) => item.id === proposal.candidate.revises);
286
+ if (proposal.skill === undefined) {
287
+ const kept = revised?.text === undefined ? layer.instructions ?? "" : (layer.instructions ?? "").replace(revised.text, "");
288
+ return { ...layer, instructions: [kept.trim(), proposal.candidate.text].filter((text) => text !== "").join("\n\n") };
289
+ }
290
+ const root = await mkdtemp(join(tmpdir(), "chopin-candidate-"));
291
+ await mkdir(join(root, proposal.skill), { recursive: true });
292
+ await writeFile(join(root, proposal.skill, "SKILL.md"), proposal.candidate.text);
293
+ const problems = [];
294
+ const [skill] = await loadSkills(root, problems);
295
+ if (skill === undefined || problems.length > 0)
296
+ return undefined;
297
+ return { ...layer, skills: [...layer.skills.filter((s) => s.name !== skill.name && s.name !== revised?.skill), skill] };
298
+ }
299
+ /**
300
+ * What the user had asked before each failure: the tasks the proposer read, which a general change must not be keyed
301
+ * to.
302
+ */
303
+ async function requests(found, read) {
304
+ const asked = new Set();
305
+ for (const failure of found.failures) {
306
+ const entry = (await read(failure.session)).slice(0, failure.line).findLast(isUserWritten);
307
+ const update = entry !== undefined && "notification" in entry ? entry.notification.update : undefined;
308
+ if (update?.sessionUpdate === "user_message_chunk" && update.content.type === "text")
309
+ asked.add(update.content.text.slice(0, REQUEST_CHARS));
310
+ }
311
+ return [...asked];
312
+ }
313
+ /** Steps that went right in sessions the proposer did not read, each with the session before it. */
314
+ async function protect(setup, read, seen, prefixes, inScope) {
315
+ const random = setup.random ?? Math.random;
316
+ const points = [];
317
+ const others = setup.sources.filter((source) => !seen.has(source.path) && inScope(source.path)).map((source) => source.path);
318
+ for (const path of shuffled(others, random)) {
319
+ if (points.length >= PROTECT_POINTS)
320
+ break;
321
+ const entries = await read(path);
322
+ const good = goodSteps(entries, signals(entries).map((signal) => signal.line));
323
+ const line = good[Math.floor(random() * good.length)];
324
+ const prefix = line === undefined ? undefined : continuationPrefix(entries, line, PREFIX);
325
+ if (line === undefined || prefix === undefined)
326
+ continue;
327
+ const id = `${path}:${line}`;
328
+ prefixes.set(id, prefix);
329
+ points.push({ id, context: judgeContext(entries, line), original: JSON.stringify(entries[line]) });
330
+ }
331
+ return points;
332
+ }
333
+ //# sourceMappingURL=round.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"round.js","sourceRoot":"","sources":["../../src/rsi/round.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAC3M,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAGlH,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,WAAW,EAA8B,MAAM,cAAc,CAAC;AAE/E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,mHAAmH;AACnH,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,qEAAqE;AACrE,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B;;;;GAIG;AACH,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,0GAA0G;AAC1G,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,SAAiB;IAC1D,OAAO,IAAI,IAAI,cAAc,IAAI,IAAI,GAAG,CAAC,IAAI,SAAS,CAAC;AACzD,CAAC;AAED,oHAAoH;AACpH,MAAM,KAAK,GAA+B,CAAC;QACzC,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,oBAAoB,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,EAAE;KACvJ,CAAC,CAAC;AAEH,oHAAoH;AACpH,MAAM,cAAe,SAAQ,KAAK;CAAG;AAuCrC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAiB,EAAE,SAAS,GAAoC,GAAG,EAAE,GAAE,CAAC;IACtG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAClF,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;IAChE,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3I,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxG,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,SAAS;QAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;YAAE,SAAS;QACtG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACrG,IAAI,CAAC,CAAC,KAAK,YAAY,cAAc,CAAC;gBAAE,MAAM,KAAK,CAAC;YACpD,OAAO,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,0CAA0C,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChG,CAAC,CAAC,CAAC;QACH,IAAI,QAAQ,KAAK,SAAS;YAAE,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACxE,SAAS,CAAC,OAAO,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AASD,0GAA0G;AAC1G,KAAK,UAAU,aAAa,CAAC,KAAiB,EAAE,KAAmB,EAAE,MAAc,EAAE,OAAO,GAAY,EAAE;IACxG,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACrE,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAC5B,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;KACpJ,CAAC,CAAC;IACH,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAC5F,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AACjG,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,QAAQ,CACrB,KAAiB,EACjB,KAAmB,EACnB,QAAkC,EAClC,WAAwC,EACxC,QAAgB;IAEhB,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,OAAiB,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACnG,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IACtD,MAAM,IAAI,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;QAClC,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC1E,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/E,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACrE,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAG,KAAK,EAAK,KAAa,EAAE,IAAsB,EAA0B,EAAE;QACzF,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACtC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,YAAY,SAAS;gBAAE,MAAM,KAAK,CAAC;YAC/G,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;gBACtB,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,MAAM,OAAO,EAAE;gBAAE,MAAM,IAAI,cAAc,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtG,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IACF,kEAAkE;IAClE,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAChG,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,WAAW;gBAAE,MAAM,KAAK,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,aAAa,GAAe,EAAE,CAAC;IACrC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACzB,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IACtJ,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,oEAAoE,CAAC,CAAC;IACpH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACpE,uGAAuG;IACvG,MAAM,MAAM,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5H,MAAM,KAAK,GAAG,CAAC,KAAe,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3G,MAAM,KAAK,GAAG,CAAC,KAAe,EAAE,EAAE;QAChC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,yFAAyF;IACzF,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACvF,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxG,MAAM,OAAO,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/J,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC;QACrF,OAAO,OAAO,KAAK,SAAS,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,yCAAyC,CAAC,CAAC;IAC1E,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,qDAAqD,OAAO,WAAW,KAAK,gBAAgB,EAAE,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1M,CAAC;IACD,0HAA0H;IAC1H,IAAI,SAAS,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;QACrC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,SAAS,CAAC,MAAM,2CAA2C,aAAa,EAAE,EAAE,CAAC;IAC1J,CAAC;IAED,8GAA8G;IAC9G,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACnJ,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,uDAAuD,CAAC,CAAC;IACnG,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;IAC3C,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;IAEtD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChE,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,qCAAqC,EAAE,QAAQ,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,2CAA2C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3G,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;YAC1B,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK;YAC7B,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;YACtH,cAAc,EAAE,MAAM,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;SAC5C,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAChB,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAC;QAClF,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAClE,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACpG,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,mCAAmC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC1H,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,OAAO,CAAC,QAAQ,4BAA4B,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC;YACzJ,OAAO,MAAM,CAAC,aAAa,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QACxH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvG,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,wEAAwE,EAAE,QAAQ,CAAC,CAAC;IAC7J,MAAM,MAAM,GAAG,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC;IACnD,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAC5H,MAAM,KAAK,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzH,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,qCAAqC,EAAE,QAAQ,CAAC,CAAC;IACxF,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;IACxG,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACxF,IAAI,SAAS,CAAC,MAAM,GAAG,aAAa;QAAE,OAAO,MAAM,CAAC,2BAA2B,aAAa,6CAA6C,EAAE,QAAQ,CAAC,CAAC;IAErJ,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/F,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC;QACnC,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;QAClI,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa;QAClD,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACnI,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;YACrH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,WAAW,IAAI,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC3I,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAClI,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK;QACzH,MAAM;KACP,CAAC,CAAC;IACH,MAAM,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7G,IAAI,WAAW,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,mDAAmD,IAAI,CAAC,IAAI,OAAO,EAAE,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/J,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,GAAG,WAAW,CAAC,UAAU,CAAC;IAC/E,MAAM,UAAU,GAAG,2BAA2B,iBAAiB,OAAO,KAAK,yBAAyB,iBAAiB,EAAE,CAAC;IACxH,IAAI,WAAW,CAAC,WAAW;QAAE,OAAO,MAAM,CAAC,+BAA+B,YAAY,8BAA8B,UAAU,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAChK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,YAAY,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3G,OAAO,MAAM,CAAC,4BAA4B,WAAW,CAAC,KAAK,WAAW,KAAK,KAAK,UAAU,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9H,CAAC;IACD,MAAM,IAAI,GAAc;QACtB,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtH,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE;QACxG,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAChE,CAAC;IACF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,QAAQ,CAAC,KAAK,WAAW,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;IAC5G,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IACpJ,MAAM,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AACvE,CAAC;AAED,qGAAqG;AACrG,KAAK,UAAU,cAAc,CAC3B,KAAiB,EACjB,KAAmB,EACnB,WAAwC,EACxC,KAA2B,EAC3B,SAAgB,EAChB,IAAkD;IAElD,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1I,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW;QACrC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,UAAU,EAAE,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;QACjD,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;KACvH,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IACpH,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,0BAA0B,EAAE,SAAS,CAAC,YAAY,IAAI,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjH,CAAC;AAED,6DAA6D;AAC7D,SAAS,QAAQ,CAAI,KAAmB,EAAE,MAAoB;IAC5D,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yHAAyH;AACzH,KAAK,UAAU,aAAa,CAAC,KAAY,EAAE,KAA2B,EAAE,QAAuD;IAC7H,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7E,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3H,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACvH,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACjE,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;AAC1H,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,QAAQ,CAAC,KAAmB,EAAE,IAAkD;IAC7F,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,IAAI,cAAc,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACtG,IAAI,MAAM,EAAE,aAAa,KAAK,oBAAoB,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/I,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,oGAAoG;AACpG,KAAK,UAAU,OAAO,CACpB,KAAiB,EACjB,IAAkD,EAClD,IAAyB,EACzB,QAAiD,EACjD,OAAkC;IAElC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IAC3C,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7H,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,MAAM,IAAI,cAAc;YAAE,MAAM;QAC3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1F,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACzD,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;QAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { CredentialStore } from "@earendil-works/pi-ai";
2
+ /** How long the loop waits between runs it starts on its own. */
3
+ export declare const EVOLVE_EVERY_MS: number;
4
+ export interface EvolveOptions {
5
+ now?: number;
6
+ /** Credentials the loop is handed through a pipe, where they live in this process alone; else it reads its home's. */
7
+ credentials?: CredentialStore;
8
+ }
9
+ /**
10
+ * Starts `chopin evolve` in the background when the loop is set up, its last run is long enough ago, and `idle` says
11
+ * the agent has nothing in hand, so the loop never competes with the user's own work. `chopin` is the node arguments
12
+ * that start chopin. Says whether it started one.
13
+ */
14
+ export declare function evolveIfDue(chopin: readonly string[], home: string, idle: () => Promise<boolean>, options?: EvolveOptions): Promise<boolean>;
@@ -0,0 +1,42 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, open, readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { credentialsText } from "../credentials.js";
5
+ import { readSettings, rsiDirectory, writeWhole } from "../home.js";
6
+ /** How long the loop waits between runs it starts on its own. */
7
+ export const EVOLVE_EVERY_MS = 6 * 60 * 60_000;
8
+ /**
9
+ * Starts `chopin evolve` in the background when the loop is set up, its last run is long enough ago, and `idle` says
10
+ * the agent has nothing in hand, so the loop never competes with the user's own work. `chopin` is the node arguments
11
+ * that start chopin. Says whether it started one.
12
+ */
13
+ export async function evolveIfDue(chopin, home, idle, options = {}) {
14
+ const now = options.now ?? Date.now();
15
+ if ((await readSettings()).rsi?.weeklyBudgetUsd === undefined)
16
+ return false;
17
+ const root = rsiDirectory();
18
+ const marker = join(root, "last-run.json");
19
+ const last = await readFile(marker, "utf8").then((text) => JSON.parse(text).at, () => 0);
20
+ if (now - last < EVOLVE_EVERY_MS || !(await idle()))
21
+ return false;
22
+ const handed = options.credentials === undefined ? undefined : await credentialsText(options.credentials);
23
+ await mkdir(root, { recursive: true, mode: 0o700 });
24
+ await writeWhole(marker, JSON.stringify({ at: now }), 0o600);
25
+ const log = await open(join(root, "evolve.log"), "a", 0o600);
26
+ try {
27
+ const child = spawn(process.execPath, [...chopin, "evolve", ...(handed === undefined ? [] : ["--credentials-on-stdin"])], {
28
+ detached: true,
29
+ stdio: [handed === undefined ? "ignore" : "pipe", log.fd, log.fd],
30
+ env: { ...process.env, CHOPIN_HOME: home },
31
+ });
32
+ // Never on a command line or in the environment, where other processes of the machine could read them.
33
+ child.stdin?.on("error", () => { });
34
+ child.stdin?.end(handed);
35
+ child.unref();
36
+ }
37
+ finally {
38
+ await log.close();
39
+ }
40
+ return true;
41
+ }
42
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/rsi/schedule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * One line on what the loop did since it was last shown: changes kept, kinds of correction and changes waiting for
3
+ * the user, kinds of failure set aside, and the week's spending. Undefined when none of the first four has anything new.
4
+ */
5
+ export declare function loopSummary(now?: number): Promise<string | undefined>;
@@ -0,0 +1,41 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { LayerVersions, Rejections, TRIGGER_SESSIONS } from "@chopin-ai/core";
4
+ import { readSettings, rsiDirectory, writeWhole } from "../home.js";
5
+ import { Evidence } from "./harvest.js";
6
+ import { HeldProposals } from "./held.js";
7
+ import { Budget } from "./models.js";
8
+ /**
9
+ * One line on what the loop did since it was last shown: changes kept, kinds of correction and changes waiting for
10
+ * the user, kinds of failure set aside, and the week's spending. Undefined when none of the first four has anything new.
11
+ */
12
+ export async function loopSummary(now = Date.now()) {
13
+ const root = rsiDirectory();
14
+ const markFile = join(root, "shown.json");
15
+ const shown = await readFile(markFile, "utf8").then((text) => JSON.parse(text), () => ({ at: 0 }));
16
+ const versions = new LayerVersions(join(root, "layer"));
17
+ const kept = (await versions.items(await versions.current())).filter((item) => !item.archived && Date.parse(item.added) > shown.at).length;
18
+ const evidence = new Evidence(join(root, "evidence"));
19
+ const waiting = (await evidence.correctionKinds()).filter((kind) => kind.sessions.length >= TRIGGER_SESSIONS).length;
20
+ const rejections = new Rejections(join(root, "rejections.jsonl"));
21
+ const settings = await readSettings();
22
+ let shelved = 0;
23
+ for (const found of await evidence.kinds())
24
+ if (await rejections.shelved(found.key, settings.model ?? "", found.failures.length, await evidence.criteria(found)))
25
+ shelved += 1;
26
+ const held = (await new HeldProposals(join(root, "held.jsonl")).waiting()).length;
27
+ if (kept === 0 && waiting === 0 && held === 0 && shelved === 0)
28
+ return undefined;
29
+ const weekly = settings.rsi?.weeklyBudgetUsd;
30
+ const spent = await new Budget(join(root, "spend.jsonl"), weekly ?? 0).spent(now);
31
+ await writeWhole(markFile, JSON.stringify({ at: now }), 0o600);
32
+ const parts = [
33
+ ...(kept > 0 ? [`kept ${kept} change${kept === 1 ? "" : "s"} since last time`] : []),
34
+ ...(waiting > 0 ? [`${waiting} kind${waiting === 1 ? "" : "s"} of correction to confirm (chopin evolve corrections)`] : []),
35
+ ...(held > 0 ? [`${held} change${held === 1 ? "" : "s"} held for your review (chopin evolve review)`] : []),
36
+ ...(shelved > 0 ? [`${shelved} kind${shelved === 1 ? "" : "s"} of failure set aside`] : []),
37
+ `$${spent.toFixed(2)}${weekly === undefined ? "" : ` of $${weekly.toFixed(2)}`} spent this week`,
38
+ ];
39
+ return `RSI: ${parts.join(" · ")}`;
40
+ }
41
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/rsi/summary.ts"],"names":[],"mappings":"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"}