@oharness/engine 0.12.0 → 0.14.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/agent/agent.d.ts +3 -0
- package/dist/agent/agent.js +32 -12
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/background-usage.d.ts +34 -0
- package/dist/agent/background-usage.js +53 -0
- package/dist/agent/background-usage.js.map +1 -0
- package/dist/agent/background.d.ts +2 -0
- package/dist/agent/background.js +11 -0
- package/dist/agent/background.js.map +1 -1
- package/dist/agent/memory-backup.d.ts +1 -1
- package/dist/agent/memory-backup.js +1 -1
- package/dist/agent/memory-backup.js.map +1 -1
- package/dist/agent/memory-digest.d.ts +107 -0
- package/dist/agent/memory-digest.js +208 -0
- package/dist/agent/memory-digest.js.map +1 -0
- package/dist/agent/memory-dream.d.ts +106 -0
- package/dist/agent/memory-dream.js +237 -0
- package/dist/agent/memory-dream.js.map +1 -0
- package/dist/agent/memory-ledger.d.ts +154 -0
- package/dist/agent/memory-ledger.js +179 -0
- package/dist/agent/memory-ledger.js.map +1 -0
- package/dist/agent/memory-provider.d.ts +12 -0
- package/dist/agent/memory-recall.d.ts +2 -0
- package/dist/agent/memory-recall.js +5 -2
- package/dist/agent/memory-recall.js.map +1 -1
- package/dist/agent/memory-usage.d.ts +20 -0
- package/dist/agent/memory-usage.js +16 -1
- package/dist/agent/memory-usage.js.map +1 -1
- package/dist/agent/memory.d.ts +3 -0
- package/dist/agent/memory.js +24 -4
- package/dist/agent/memory.js.map +1 -1
- package/dist/agent/store.d.ts +7 -0
- package/dist/agent/store.js +14 -1
- package/dist/agent/store.js.map +1 -1
- package/dist/config-files.d.ts +6 -1
- package/dist/config-files.js +7 -2
- package/dist/config-files.js.map +1 -1
- package/dist/harness.d.ts +20 -0
- package/dist/harness.js +58 -8
- package/dist/harness.js.map +1 -1
- package/dist/runtime-plugins/builtin/dreaming-coordinator.d.ts +244 -0
- package/dist/runtime-plugins/builtin/dreaming-coordinator.js +548 -0
- package/dist/runtime-plugins/builtin/dreaming-coordinator.js.map +1 -0
- package/dist/runtime-plugins/builtin/dreaming.d.ts +30 -0
- package/dist/runtime-plugins/builtin/dreaming.js +231 -0
- package/dist/runtime-plugins/builtin/dreaming.js.map +1 -0
- package/dist/runtime-plugins/builtin/memory.d.ts +89 -2
- package/dist/runtime-plugins/builtin/memory.js +186 -5
- package/dist/runtime-plugins/builtin/memory.js.map +1 -1
- package/dist/runtime-plugins/host.js +2 -0
- package/dist/runtime-plugins/host.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
import { digestEntries, digestSession, isUserTurn } from "../../agent/memory-digest.js";
|
|
2
|
+
import { dreamScope } from "../../agent/memory-dream.js";
|
|
3
|
+
import { DreamStore } from "../../agent/memory-ledger.js";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { RoutineLock } from "../../schedule/lock.js";
|
|
6
|
+
import { userPath } from "../../paths.js";
|
|
7
|
+
export const DEFAULT_DREAMING = {
|
|
8
|
+
auto: "subscribers", idleHours: 6, minUserTurns: 3, startDelayMinutes: 5,
|
|
9
|
+
minClaims: 5, maxWaitHours: 72, maxClaims: 40, dailyTokens: 200_000,
|
|
10
|
+
};
|
|
11
|
+
const newMeter = () => ({ calls: 0, input: 0, output: 0, costUsd: 0 });
|
|
12
|
+
const MINUTE = 60_000, HOUR = 3_600_000;
|
|
13
|
+
const TICK_MS = 15 * MINUTE;
|
|
14
|
+
/** A run seen this recently means the person is working: background work waits. */
|
|
15
|
+
const BUSY_MS = 2 * MINUTE;
|
|
16
|
+
/** For estimating a prompt before it is sent; spending is counted from what the provider reports. */
|
|
17
|
+
const CHARS_PER_TOKEN = 4;
|
|
18
|
+
/**
|
|
19
|
+
* How far back a pass looks, and how many conversations it reads at most.
|
|
20
|
+
* Turning dreaming on must not mean one pass over a year of history; older
|
|
21
|
+
* conversations are left alone, and a long backlog drains over several runs.
|
|
22
|
+
*/
|
|
23
|
+
const LOOKBACK_MS = 30 * 24 * HOUR;
|
|
24
|
+
const MAX_DIGESTS_PER_RUN = 10;
|
|
25
|
+
export const projectLedgerKey = (projectId) => `project:${projectId}`;
|
|
26
|
+
export const USER_LEDGER_KEY = "user";
|
|
27
|
+
export class DreamCoordinator {
|
|
28
|
+
/** The process's coordinator. Tests construct their own. */
|
|
29
|
+
static shared = new DreamCoordinator();
|
|
30
|
+
store;
|
|
31
|
+
targets = new Set();
|
|
32
|
+
fixedLock;
|
|
33
|
+
homeLock;
|
|
34
|
+
now;
|
|
35
|
+
logger;
|
|
36
|
+
startedAt = 0;
|
|
37
|
+
lastActivity = 0;
|
|
38
|
+
timer;
|
|
39
|
+
running;
|
|
40
|
+
runs = new WeakMap();
|
|
41
|
+
constructor(options = {}) {
|
|
42
|
+
this.store = options.store ?? new DreamStore();
|
|
43
|
+
if (options.lock)
|
|
44
|
+
this.fixedLock = options.lock;
|
|
45
|
+
this.now = options.now ?? Date.now;
|
|
46
|
+
}
|
|
47
|
+
/** Resolved on use, like the store, so a changed `OHARNESS_HOME` is honoured. */
|
|
48
|
+
get lock() {
|
|
49
|
+
if (this.fixedLock)
|
|
50
|
+
return this.fixedLock;
|
|
51
|
+
const file = userPath("dreams", "dreamer.lock");
|
|
52
|
+
if (this.homeLock?.file !== file)
|
|
53
|
+
this.homeLock = { file, lock: new RoutineLock(file) };
|
|
54
|
+
return this.homeLock.lock;
|
|
55
|
+
}
|
|
56
|
+
register(target, logger) {
|
|
57
|
+
this.targets.add(target);
|
|
58
|
+
this.logger ??= logger;
|
|
59
|
+
if (!this.startedAt)
|
|
60
|
+
this.startedAt = this.now();
|
|
61
|
+
this.schedule();
|
|
62
|
+
return () => {
|
|
63
|
+
this.targets.delete(target);
|
|
64
|
+
if (this.targets.size)
|
|
65
|
+
return;
|
|
66
|
+
if (this.timer)
|
|
67
|
+
clearTimeout(this.timer);
|
|
68
|
+
this.timer = undefined;
|
|
69
|
+
this.startedAt = 0;
|
|
70
|
+
void this.lock.release().catch(() => { });
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** Someone is sending a message or a run just ended: background work waits. */
|
|
74
|
+
activity() { this.lastActivity = this.now(); }
|
|
75
|
+
lastRun(target) { return this.runs.get(target); }
|
|
76
|
+
isRunning() { return !!this.running; }
|
|
77
|
+
schedule() {
|
|
78
|
+
if (this.timer || !this.targets.size)
|
|
79
|
+
return;
|
|
80
|
+
const delay = Math.max(...[...this.targets].map((target) => target.settings().startDelayMinutes)) * MINUTE;
|
|
81
|
+
const first = Math.max(0, this.startedAt + delay - this.now());
|
|
82
|
+
const fire = () => {
|
|
83
|
+
this.timer = undefined;
|
|
84
|
+
void this.tick().catch((error) => this.logger?.warn("dreaming tick failed", { error: error instanceof Error ? error.message : String(error) }))
|
|
85
|
+
.finally(() => {
|
|
86
|
+
if (!this.targets.size || this.timer)
|
|
87
|
+
return;
|
|
88
|
+
this.timer = setTimeout(fire, TICK_MS);
|
|
89
|
+
this.timer.unref?.();
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
this.timer = setTimeout(fire, first);
|
|
93
|
+
this.timer.unref?.();
|
|
94
|
+
}
|
|
95
|
+
/** One work item at a time, whether a tick or a person's request. */
|
|
96
|
+
exclusive(work) {
|
|
97
|
+
const previous = this.running ?? Promise.resolve();
|
|
98
|
+
const next = previous.catch(() => { }).then(work);
|
|
99
|
+
// The caller handles the failure; the queue only needs to know it ended.
|
|
100
|
+
const tracked = next.then(() => { }, () => { }).finally(() => { if (this.running === tracked)
|
|
101
|
+
this.running = undefined; });
|
|
102
|
+
this.running = tracked;
|
|
103
|
+
return next;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The background pass: digest every due session of every project whose
|
|
107
|
+
* automatic passes are on. Waits while a run is in progress or another
|
|
108
|
+
* process holds the lock.
|
|
109
|
+
*/
|
|
110
|
+
async tick(signal) {
|
|
111
|
+
const auto = [...this.targets].filter((target) => target.autoOn());
|
|
112
|
+
if (!auto.length)
|
|
113
|
+
return { digested: 0, dreamed: 0 };
|
|
114
|
+
if (this.now() - this.lastActivity < BUSY_MS)
|
|
115
|
+
return { digested: 0, dreamed: 0, skipped: "busy" };
|
|
116
|
+
if (!(await this.lock.claim(Math.floor(this.now() / MINUTE))))
|
|
117
|
+
return { digested: 0, dreamed: 0, skipped: "locked" };
|
|
118
|
+
return this.exclusive(async () => {
|
|
119
|
+
let digested = 0, dreamed = 0, budgetStopped = false;
|
|
120
|
+
const runs = new Map(auto.map((target) => [target, this.newRun()]));
|
|
121
|
+
// Step 1, every project first: a dream never reads half the evidence.
|
|
122
|
+
const drained = new Set();
|
|
123
|
+
for (const target of auto) {
|
|
124
|
+
const run = runs.get(target);
|
|
125
|
+
const result = await this.digestTarget(target, { force: false, meter: run.meter, ...(signal ? { signal } : {}) });
|
|
126
|
+
run.digested += result.digested;
|
|
127
|
+
digested += result.digested;
|
|
128
|
+
if (result.budgetStopped) {
|
|
129
|
+
run.budgetStopped = budgetStopped = true;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
if (!result.more)
|
|
133
|
+
drained.add(target);
|
|
134
|
+
}
|
|
135
|
+
// Step 3: each scope that is due. (Step 2, the freshness scan, has no model call and is not built yet.)
|
|
136
|
+
for (const target of auto) {
|
|
137
|
+
if (budgetStopped || !drained.has(target) || signal?.aborted)
|
|
138
|
+
continue;
|
|
139
|
+
const run = runs.get(target);
|
|
140
|
+
for (const scope of ["project", "user"]) {
|
|
141
|
+
if (!(await this.due(target, scope)))
|
|
142
|
+
continue;
|
|
143
|
+
const result = await this.dreamScope(target, scope, run, signal);
|
|
144
|
+
if (!result)
|
|
145
|
+
continue;
|
|
146
|
+
dreamed++;
|
|
147
|
+
if (result.error === "budget") {
|
|
148
|
+
run.budgetStopped = budgetStopped = true;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
run.scopes.push(result);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// A tick that did nothing is not history; one that read or dreamed is.
|
|
155
|
+
for (const [target, run] of runs)
|
|
156
|
+
if (run.digested || run.scopes.length || run.budgetStopped)
|
|
157
|
+
await this.finish(target, run, "auto");
|
|
158
|
+
return { digested, dreamed };
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
key(target, scope) {
|
|
162
|
+
return scope === "user" ? USER_LEDGER_KEY : projectLedgerKey(target.projectId);
|
|
163
|
+
}
|
|
164
|
+
claimsOf(target, scope) {
|
|
165
|
+
return this.store.claims(scope === "user" ? { scope } : { scope, project: target.projectId }, this.key(target, scope));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Whether a scope dreams this tick: not yet today (a local calendar day, not
|
|
169
|
+
* a rolling 24 hours, which would drift into the working morning), and
|
|
170
|
+
* enough claims gathered, or the oldest waiting long enough.
|
|
171
|
+
*/
|
|
172
|
+
async due(target, scope) {
|
|
173
|
+
if (!(await target.notes(scope)))
|
|
174
|
+
return false;
|
|
175
|
+
if (await this.store.dreamedToday(this.key(target, scope), this.now()))
|
|
176
|
+
return false;
|
|
177
|
+
const claims = await this.claimsOf(target, scope);
|
|
178
|
+
if (!claims.length)
|
|
179
|
+
return false;
|
|
180
|
+
const settings = target.settings();
|
|
181
|
+
return claims.length >= settings.minClaims || this.now() - claims[0].at >= settings.maxWaitHours * HOUR;
|
|
182
|
+
}
|
|
183
|
+
/** Whether a prompt of `chars` characters may still be sent today. */
|
|
184
|
+
async affordable(target, chars) {
|
|
185
|
+
return (await this.store.spentToday(this.now())) + Math.ceil(chars / CHARS_PER_TOKEN) <= target.settings().dailyTokens;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* The model, as a dream or a digest calls it: the reply's text, with what it
|
|
189
|
+
* cost added to the run and to the day's budget, in the tokens the provider
|
|
190
|
+
* reported.
|
|
191
|
+
*/
|
|
192
|
+
metered(target, meter) {
|
|
193
|
+
return async (system, prompt, signal) => {
|
|
194
|
+
const reply = await target.generate(system, prompt, signal);
|
|
195
|
+
const u = reply.usage;
|
|
196
|
+
const tokens = u.inputTokens + u.outputTokens + (u.cacheReadTokens ?? 0) + (u.cacheWriteTokens ?? 0);
|
|
197
|
+
meter.calls++;
|
|
198
|
+
meter.input += u.inputTokens + (u.cacheReadTokens ?? 0) + (u.cacheWriteTokens ?? 0);
|
|
199
|
+
meter.output += u.outputTokens;
|
|
200
|
+
meter.costUsd += reply.costUsd;
|
|
201
|
+
meter.model = reply.model;
|
|
202
|
+
await this.store.spend(tokens, this.now());
|
|
203
|
+
return reply.text;
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
newRun() {
|
|
207
|
+
return { id: `r${randomUUID().slice(0, 12)}`, at: this.now(), digested: 0, scopes: [], meter: newMeter() };
|
|
208
|
+
}
|
|
209
|
+
/** Write a run to the project's history. */
|
|
210
|
+
async finish(target, run, trigger) {
|
|
211
|
+
const applied = run.scopes.flatMap((scope) => scope.applied);
|
|
212
|
+
const proposals = run.scopes.reduce((sum, scope) => sum + scope.proposals, 0);
|
|
213
|
+
const errors = run.scopes.flatMap((scope) => scope.error ? [scope.error] : []);
|
|
214
|
+
const outcome = run.budgetStopped ? "budget"
|
|
215
|
+
: errors.length ? (run.scopes.some((scope) => scope.refused) ? "refused" : "failed")
|
|
216
|
+
: !run.meter.calls ? "no-call"
|
|
217
|
+
: applied.length ? "changed" : proposals ? "suggested" : "nothing";
|
|
218
|
+
await this.store.recordRun(target.projectId, {
|
|
219
|
+
id: run.id, at: run.at, trigger, seconds: Math.round((this.now() - run.at) / 1000),
|
|
220
|
+
digested: run.digested, applied: applied.length, proposals, changes: applied.map((change) => change.id),
|
|
221
|
+
tokens: { input: run.meter.input, output: run.meter.output }, costUsd: run.meter.costUsd,
|
|
222
|
+
...(run.meter.model ? { model: run.meter.model } : {}), outcome, errors,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Digest a project's sessions. Unforced, only sessions quiet for
|
|
227
|
+
* `idleHours` with `minUserTurns` new user messages; forced (Dream now),
|
|
228
|
+
* every session with anything new the user typed.
|
|
229
|
+
*/
|
|
230
|
+
async digestTarget(target, options) {
|
|
231
|
+
const settings = target.settings();
|
|
232
|
+
const device = await target.sessions.device();
|
|
233
|
+
const generate = this.metered(target, options.meter ?? newMeter());
|
|
234
|
+
let digested = 0;
|
|
235
|
+
// Read once, when the first conversation needs it.
|
|
236
|
+
let known;
|
|
237
|
+
const shownNotes = async () => {
|
|
238
|
+
if (!known) {
|
|
239
|
+
known = new Map();
|
|
240
|
+
for (const scope of ["user", "project"])
|
|
241
|
+
for (const note of (await target.notes(scope)) ?? [])
|
|
242
|
+
known.set(note.id, { id: note.id, scope, summary: note.summary });
|
|
243
|
+
}
|
|
244
|
+
const map = known;
|
|
245
|
+
return (ids) => ids.map((id) => map.get(id)).filter((note) => !!note);
|
|
246
|
+
};
|
|
247
|
+
for (const meta of await target.sessions.list()) {
|
|
248
|
+
if (options.signal?.aborted)
|
|
249
|
+
break;
|
|
250
|
+
// Ten a pass; whatever is left is still due, and the dream waits for it.
|
|
251
|
+
if (digested >= MAX_DIGESTS_PER_RUN)
|
|
252
|
+
return { digested, more: true };
|
|
253
|
+
// A routine's prompt was written earlier, not said now: not evidence.
|
|
254
|
+
if (meta.routine || this.now() - meta.updatedAt > LOOKBACK_MS)
|
|
255
|
+
continue;
|
|
256
|
+
const [records, archive, read] = await Promise.all([
|
|
257
|
+
target.sessions.records(meta.id), target.sessions.archive(meta.id), this.store.digested(meta.id),
|
|
258
|
+
]);
|
|
259
|
+
const all = digestEntries(records, archive, device);
|
|
260
|
+
const pending = all.filter((entry) => !read.has(entry.key));
|
|
261
|
+
if (!pending.length)
|
|
262
|
+
continue;
|
|
263
|
+
const turns = pending.filter((entry) => isUserTurn(entry.message)).length;
|
|
264
|
+
const lastAt = all[all.length - 1].at;
|
|
265
|
+
if (!options.force && (turns < settings.minUserTurns || this.now() - lastAt < settings.idleHours * HOUR))
|
|
266
|
+
continue;
|
|
267
|
+
if (!turns) {
|
|
268
|
+
// Nothing the user typed: nothing to read, but nothing to read again either.
|
|
269
|
+
await this.store.recordDigest(meta.id, target.projectId, [], pending.map((entry) => entry.key));
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
// The estimate is the prompt's size; the reply is counted once it exists.
|
|
273
|
+
if (!(await this.affordable(target, estimate(pending))))
|
|
274
|
+
return { digested, budgetStopped: true };
|
|
275
|
+
const result = await digestSession({
|
|
276
|
+
session: meta.id, pending, all, generate, shownNotes: await shownNotes(),
|
|
277
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
278
|
+
});
|
|
279
|
+
await this.store.recordDigest(meta.id, target.projectId, result.claims, pending.map((entry) => entry.key));
|
|
280
|
+
digested++;
|
|
281
|
+
}
|
|
282
|
+
return { digested };
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Dream now: read everything new, however recently said, then dream both
|
|
286
|
+
* scopes regardless of the day or the batch threshold.
|
|
287
|
+
*/
|
|
288
|
+
dreamNow(target, signal) {
|
|
289
|
+
return this.exclusive(async () => {
|
|
290
|
+
const run = this.newRun();
|
|
291
|
+
const digest = await this.digestTarget(target, { force: true, meter: run.meter, ...(signal ? { signal } : {}) });
|
|
292
|
+
run.digested = digest.digested;
|
|
293
|
+
if (digest.budgetStopped)
|
|
294
|
+
run.budgetStopped = true;
|
|
295
|
+
for (const scope of ["project", "user"]) {
|
|
296
|
+
if (run.budgetStopped || signal?.aborted)
|
|
297
|
+
break;
|
|
298
|
+
const result = await this.dreamScope(target, scope, run, signal);
|
|
299
|
+
if (!result)
|
|
300
|
+
continue;
|
|
301
|
+
if (result.error === "budget") {
|
|
302
|
+
run.budgetStopped = true;
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
run.scopes.push(result);
|
|
306
|
+
}
|
|
307
|
+
this.runs.set(target, run);
|
|
308
|
+
await this.finish(target, run, "manual");
|
|
309
|
+
return run;
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
/** Hashes dreams last left notes at, from the ledger, for the hand-edit rule. */
|
|
313
|
+
async dreamWrote(key) {
|
|
314
|
+
const events = await this.store.ledger(key);
|
|
315
|
+
const undone = new Set(events.flatMap((event) => event.type === "undone" ? [event.change] : []));
|
|
316
|
+
const wrote = new Map();
|
|
317
|
+
for (const event of events) {
|
|
318
|
+
if (event.type !== "applied")
|
|
319
|
+
continue;
|
|
320
|
+
for (const change of event.changes) {
|
|
321
|
+
if (undone.has(change.id))
|
|
322
|
+
continue;
|
|
323
|
+
for (const after of change.after)
|
|
324
|
+
if (after.hash)
|
|
325
|
+
wrote.set(after.id, after.hash);
|
|
326
|
+
else
|
|
327
|
+
wrote.delete(after.id);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return wrote;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* One dream of one scope: claims in, changes out. What may be applied is
|
|
334
|
+
* committed as one batch; the rest becomes suggestions. The day is marked
|
|
335
|
+
* whether or not the batch lands, so a refused batch is not retried every
|
|
336
|
+
* tick at the price of a model call; the claims behind it stay for the next
|
|
337
|
+
* dream instead of being consumed.
|
|
338
|
+
*/
|
|
339
|
+
async dreamScope(target, scope, owner, signal) {
|
|
340
|
+
const notes = await target.notes(scope);
|
|
341
|
+
if (!notes)
|
|
342
|
+
return undefined;
|
|
343
|
+
const key = this.key(target, scope);
|
|
344
|
+
const claims = (await this.claimsOf(target, scope)).slice(0, target.settings().maxClaims);
|
|
345
|
+
if (!claims.length)
|
|
346
|
+
return { scope, claims: 0, applied: [], proposals: 0 };
|
|
347
|
+
if (!(await this.affordable(target, claimChars(claims) + 24_000)))
|
|
348
|
+
return { scope, claims: claims.length, applied: [], proposals: 0, error: "budget" };
|
|
349
|
+
const at = this.now();
|
|
350
|
+
let result;
|
|
351
|
+
try {
|
|
352
|
+
result = await dreamScope({
|
|
353
|
+
claims, notes, generate: this.metered(target, owner.meter), now: at,
|
|
354
|
+
dreamWrote: await this.dreamWrote(key), ...(signal ? { signal } : {}),
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
catch (failure) {
|
|
358
|
+
const error = failure instanceof Error ? failure.message : String(failure);
|
|
359
|
+
await this.store.record(key, { type: "failed", at, scope, error });
|
|
360
|
+
return { scope, claims: claims.length, applied: [], proposals: 0, error };
|
|
361
|
+
}
|
|
362
|
+
const evidence = evidenceOf(claims);
|
|
363
|
+
const run = { scope, claims: claims.length, applied: [], proposals: 0 };
|
|
364
|
+
const apply = result.ops.filter((one) => one.disposition === "apply" && committable(one.op));
|
|
365
|
+
if (apply.length) {
|
|
366
|
+
try {
|
|
367
|
+
run.applied = await this.commitOps(target, scope, apply.map((one) => one.op), evidence, undefined, owner.id);
|
|
368
|
+
}
|
|
369
|
+
catch (failure) {
|
|
370
|
+
run.error = failure instanceof Error ? failure.message : String(failure);
|
|
371
|
+
run.refused = true;
|
|
372
|
+
await this.store.record(key, { type: "failed", at, scope, error: run.error });
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
for (const one of result.ops.filter((op) => !apply.includes(op))) {
|
|
376
|
+
await this.store.record(key, {
|
|
377
|
+
type: "proposal", at, scope, id: `p${randomUUID().slice(0, 12)}`, op: one.op,
|
|
378
|
+
...(one.why ? { why: one.why } : {}), evidence: one.op.claims.map((id) => evidence.get(id)).filter((claim) => !!claim),
|
|
379
|
+
});
|
|
380
|
+
run.proposals++;
|
|
381
|
+
}
|
|
382
|
+
// Claims behind a refused batch wait for the next dream, unless a suggestion carries them.
|
|
383
|
+
const kept = new Set(run.refused ? apply.flatMap((one) => one.op.claims) : []);
|
|
384
|
+
for (const one of result.ops)
|
|
385
|
+
if (!apply.includes(one))
|
|
386
|
+
for (const id of one.op.claims)
|
|
387
|
+
kept.delete(id);
|
|
388
|
+
await this.store.record(key, { type: "consumed", at, claims: claims.map((claim) => claim.id).filter((id) => !kept.has(id)) });
|
|
389
|
+
await this.store.markDreamed(key, at);
|
|
390
|
+
return run;
|
|
391
|
+
}
|
|
392
|
+
/** Commit operations as one batch, record them, and tell the next run. */
|
|
393
|
+
async commitOps(target, scope, ops, evidence, fromProposal, run) {
|
|
394
|
+
const committed = await target.commit(scope, ops.map(toChange));
|
|
395
|
+
const at = this.now();
|
|
396
|
+
const changes = committed.map((done, i) => {
|
|
397
|
+
const op = ops[i];
|
|
398
|
+
return {
|
|
399
|
+
id: `d${randomUUID().slice(0, 12)}`, op: op.op, summary: "summary" in op ? op.summary : "",
|
|
400
|
+
before: done.before, after: done.after,
|
|
401
|
+
evidence: op.claims.map((id) => evidence.get(id)).filter((claim) => !!claim),
|
|
402
|
+
...(fromProposal ? { fromProposal } : {}),
|
|
403
|
+
...(run ? { run } : {}),
|
|
404
|
+
};
|
|
405
|
+
});
|
|
406
|
+
await this.store.record(this.key(target, scope), { type: "applied", at, scope, changes });
|
|
407
|
+
target.announce(changes.map((change) => ({
|
|
408
|
+
id: change.after.find((one) => one.hash)?.id ?? change.after[0].id, summary: change.summary, scope,
|
|
409
|
+
action: change.op === "create" ? "created" : "updated",
|
|
410
|
+
})));
|
|
411
|
+
return changes;
|
|
412
|
+
}
|
|
413
|
+
/** Open suggestions and recent changes, both scopes, newest first. */
|
|
414
|
+
async state(target) {
|
|
415
|
+
const out = { proposals: [], log: [] };
|
|
416
|
+
for (const scope of ["project", "user"]) {
|
|
417
|
+
if (!(await target.notes(scope)))
|
|
418
|
+
continue;
|
|
419
|
+
const events = await this.store.ledger(this.key(target, scope));
|
|
420
|
+
const closed = new Set(events.flatMap((event) => event.type === "proposal-state" ? [event.id] : []));
|
|
421
|
+
const undone = new Set(events.flatMap((event) => event.type === "undone" ? [event.change] : []));
|
|
422
|
+
for (const event of events) {
|
|
423
|
+
if (event.type === "proposal" && !closed.has(event.id)) {
|
|
424
|
+
out.proposals.push({ id: event.id, scope, at: event.at, op: event.op, ...(event.why ? { why: event.why } : {}), evidence: event.evidence });
|
|
425
|
+
}
|
|
426
|
+
else if (event.type === "applied") {
|
|
427
|
+
for (const change of event.changes)
|
|
428
|
+
out.log.push({ scope, at: event.at, change, undone: undone.has(change.id) });
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
out.proposals.sort((a, b) => b.at - a.at);
|
|
433
|
+
out.log.sort((a, b) => b.at - a.at);
|
|
434
|
+
out.log.splice(30);
|
|
435
|
+
return out;
|
|
436
|
+
}
|
|
437
|
+
async proposal(target, scope, id) {
|
|
438
|
+
const events = await this.store.ledger(this.key(target, scope));
|
|
439
|
+
if (events.some((event) => event.type === "proposal-state" && event.id === id))
|
|
440
|
+
throw new Error("This suggestion was already handled");
|
|
441
|
+
const found = events.find((event) => event.type === "proposal" && event.id === id);
|
|
442
|
+
if (!found)
|
|
443
|
+
throw new Error("Unknown suggestion");
|
|
444
|
+
return found;
|
|
445
|
+
}
|
|
446
|
+
/** A person applies a suggestion; refused, and closed as stale, if its notes changed since. */
|
|
447
|
+
applyProposal(target, scope, id) {
|
|
448
|
+
return this.exclusive(async () => {
|
|
449
|
+
const proposal = await this.proposal(target, scope, id);
|
|
450
|
+
const op = proposal.op;
|
|
451
|
+
if (!committable(op))
|
|
452
|
+
throw new Error("This suggestion has nothing to apply");
|
|
453
|
+
const evidence = new Map(proposal.evidence.map((claim) => [claim.id, claim]));
|
|
454
|
+
try {
|
|
455
|
+
const changes = await this.commitOps(target, scope, [op], evidence, id);
|
|
456
|
+
await this.store.record(this.key(target, scope), { type: "proposal-state", at: this.now(), id, state: "applied" });
|
|
457
|
+
return changes;
|
|
458
|
+
}
|
|
459
|
+
catch (failure) {
|
|
460
|
+
await this.store.record(this.key(target, scope), { type: "proposal-state", at: this.now(), id, state: "stale" });
|
|
461
|
+
throw failure;
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
dismissProposal(target, scope, id) {
|
|
466
|
+
return this.exclusive(async () => {
|
|
467
|
+
await this.proposal(target, scope, id);
|
|
468
|
+
await this.store.record(this.key(target, scope), { type: "proposal-state", at: this.now(), id, state: "dismissed" });
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Put back what a change replaced. Refused if any of its notes changed
|
|
473
|
+
* since, rather than overwriting someone's newer edit; the page then points
|
|
474
|
+
* at the backups.
|
|
475
|
+
*/
|
|
476
|
+
undo(target, scope, changeId) {
|
|
477
|
+
return this.exclusive(async () => {
|
|
478
|
+
const key = this.key(target, scope);
|
|
479
|
+
const events = await this.store.ledger(key);
|
|
480
|
+
if (events.some((event) => event.type === "undone" && event.change === changeId))
|
|
481
|
+
throw new Error("Already undone");
|
|
482
|
+
const change = events.flatMap((event) => event.type === "applied" ? event.changes : []).find((one) => one.id === changeId);
|
|
483
|
+
if (!change)
|
|
484
|
+
throw new Error("Unknown change");
|
|
485
|
+
const after = new Map(change.after.map((one) => [one.id, one.hash]));
|
|
486
|
+
await target.commit(scope, change.before.map((before) => ({
|
|
487
|
+
kind: "restore", id: before.id, expectedHash: after.get(before.id) ?? null, note: before.note,
|
|
488
|
+
})));
|
|
489
|
+
await this.store.record(key, { type: "undone", at: this.now(), change: changeId });
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* What decides the next automatic dream, per scope, for the page: whether it
|
|
494
|
+
* already dreamed today, and how many claims wait and since when.
|
|
495
|
+
*/
|
|
496
|
+
async nextDream(target) {
|
|
497
|
+
const scopes = [];
|
|
498
|
+
for (const scope of ["project", "user"]) {
|
|
499
|
+
if (!(await target.notes(scope)))
|
|
500
|
+
continue;
|
|
501
|
+
const claims = await this.claimsOf(target, scope);
|
|
502
|
+
scopes.push({
|
|
503
|
+
scope, dreamedToday: await this.store.dreamedToday(this.key(target, scope), this.now()), waiting: claims.length,
|
|
504
|
+
...(claims[0] ? { oldestAt: claims[0].at } : {}),
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
return { spentToday: await this.store.spentToday(this.now()), scopes };
|
|
508
|
+
}
|
|
509
|
+
/** Claims waiting, per scope, for the page. */
|
|
510
|
+
async pending(target) {
|
|
511
|
+
const [project, user] = await Promise.all([
|
|
512
|
+
this.store.claims({ scope: "project", project: target.projectId }, projectLedgerKey(target.projectId)),
|
|
513
|
+
this.store.claims({ scope: "user" }, USER_LEDGER_KEY),
|
|
514
|
+
]);
|
|
515
|
+
return { project: project.length, user: user.length };
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
function estimate(entries) {
|
|
519
|
+
let chars = 4_000;
|
|
520
|
+
for (const entry of entries)
|
|
521
|
+
for (const block of entry.message.content)
|
|
522
|
+
if (block.type === "text")
|
|
523
|
+
chars += block.text.length;
|
|
524
|
+
return Math.min(chars, 64_000);
|
|
525
|
+
}
|
|
526
|
+
function evidenceOf(claims) {
|
|
527
|
+
return new Map(claims.map((claim) => [claim.id, {
|
|
528
|
+
id: claim.id, kind: claim.kind, text: claim.text, at: claim.at, ...(claim.quote ? { quote: claim.quote } : {}),
|
|
529
|
+
}]));
|
|
530
|
+
}
|
|
531
|
+
/** Operations that change a note; stale and conflict only ask a person to look. */
|
|
532
|
+
function committable(op) {
|
|
533
|
+
return op.op === "create" || op.op === "update" || op.op === "merge";
|
|
534
|
+
}
|
|
535
|
+
function toChange(op) {
|
|
536
|
+
if (!committable(op))
|
|
537
|
+
throw new Error("Not a change");
|
|
538
|
+
const draft = { summary: op.summary, body: op.body, tags: op.tags, ...(op.type ? { type: op.type } : {}) };
|
|
539
|
+
if (op.op === "create")
|
|
540
|
+
return { kind: "create", draft };
|
|
541
|
+
if (op.op === "update")
|
|
542
|
+
return { kind: "update", id: op.id, expectedHash: op.expectedHash, draft };
|
|
543
|
+
return { kind: "merge", ids: op.ids, expectedHashes: op.expectedHashes, draft };
|
|
544
|
+
}
|
|
545
|
+
function claimChars(claims) {
|
|
546
|
+
return claims.reduce((sum, claim) => sum + claim.text.length + (claim.quote?.length ?? 0) + 120, 6_000);
|
|
547
|
+
}
|
|
548
|
+
//# sourceMappingURL=dreaming-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dreaming-coordinator.js","sourceRoot":"","sources":["../../../src/runtime-plugins/builtin/dreaming-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { RuntimePlugin } from "../types.ts";
|
|
2
|
+
import { DreamCoordinator } from "./dreaming-coordinator.ts";
|
|
3
|
+
import type { DreamSessions, DreamingSettings, GenerateReply } from "./dreaming-coordinator.ts";
|
|
4
|
+
import type { MemoryBridge, MemoryService } from "./memory.ts";
|
|
5
|
+
/**
|
|
6
|
+
* Dreaming, as a runtime plugin of its own.
|
|
7
|
+
*
|
|
8
|
+
* Built on `memory` and never part of it: switching this plugin off in
|
|
9
|
+
* `runtimePlugins` leaves memory exactly as it was, and with `memory` off this
|
|
10
|
+
* one sets up as nothing at all. It never registers a memory provider (the
|
|
11
|
+
* host allows one) and never writes a note file: every change goes through
|
|
12
|
+
* memory's commit path, which the harness hands over in a `MemoryBridge`.
|
|
13
|
+
*/
|
|
14
|
+
export interface DreamingPluginOptions {
|
|
15
|
+
projectId: string;
|
|
16
|
+
sessions: DreamSessions;
|
|
17
|
+
/** Memory's services, once memory has set up; absent when memory is off. */
|
|
18
|
+
memory(): {
|
|
19
|
+
project?: MemoryService;
|
|
20
|
+
user?: MemoryService;
|
|
21
|
+
};
|
|
22
|
+
/** One reply from the small model, with what it cost. Without it nothing is read or dreamed. */
|
|
23
|
+
generate?(system: string, prompt: string, signal?: AbortSignal): Promise<GenerateReply>;
|
|
24
|
+
bridge?: MemoryBridge;
|
|
25
|
+
coordinator?: DreamCoordinator;
|
|
26
|
+
}
|
|
27
|
+
export declare function parseDreamingConfig(raw: unknown): DreamingSettings;
|
|
28
|
+
/** Set the choice, for every project open in this process, and keep it. */
|
|
29
|
+
export declare function chooseAuto(auto: boolean | undefined, persist?: boolean): Promise<void>;
|
|
30
|
+
export declare function createDreamingPlugin(options: DreamingPluginOptions): RuntimePlugin<DreamingSettings>;
|