@ai-ecoverse/slicc-agent 3.36.2 → 3.37.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -2
- package/dist/client.js +3 -1
- package/dist/client.js.map +2 -2
- package/dist/control.js +3 -1
- package/dist/control.js.map +2 -2
- package/dist/host.js +14 -3
- package/dist/host.js.map +2 -2
- package/dist/kernel/groups.js +6 -0
- package/dist/kernel/groups.js.map +2 -2
- package/dist/main.js +7 -1
- package/dist/main.js.map +2 -2
- package/dist/mcp/index.js +1 -0
- package/dist/mcp/index.js.map +2 -2
- package/dist/mcp/runtime.js +1 -0
- package/dist/mcp/runtime.js.map +2 -2
- package/dist/memory/format.js +8 -0
- package/dist/memory/format.js.map +2 -2
- package/dist/monitor/index.js +449 -0
- package/dist/monitor/index.js.map +7 -0
- package/dist/monitor/redact.js +25 -0
- package/dist/monitor/redact.js.map +7 -0
- package/dist/readonly.js +1 -1
- package/dist/readonly.js.map +2 -2
- package/dist/services.js.map +2 -2
- package/dist/spectrum/index.js +12 -1
- package/dist/spectrum/index.js.map +3 -3
- package/dist/spectrum/monitor-port.js +623 -0
- package/dist/spectrum/monitor-port.js.map +7 -0
- package/dist/spectrum/tray-port.js +0 -2
- package/dist/spectrum/tray-port.js.map +2 -2
- package/dist/types/client.d.ts +2 -1
- package/dist/types/control.d.ts +2 -1
- package/dist/types/host.d.ts +2 -0
- package/dist/types/kernel/groups.d.ts +1 -0
- package/dist/types/mcp/runtime.d.ts +1 -0
- package/dist/types/monitor/index.d.ts +67 -0
- package/dist/types/monitor/redact.d.ts +5 -0
- package/dist/types/services.d.ts +71 -0
- package/dist/types/spectrum/index.d.ts +7 -0
- package/dist/types/spectrum/monitor-port.d.ts +70 -0
- package/package.json +3 -3
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
import {
|
|
2
|
+
replicatedState
|
|
3
|
+
} from "@earendil-works/chord";
|
|
4
|
+
import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
|
|
5
|
+
import { live } from "../agents.js";
|
|
6
|
+
import { commandLine, program, redacted } from "./redact.js";
|
|
7
|
+
const TTL_MS = 3e4;
|
|
8
|
+
const PS_MS = 2e3;
|
|
9
|
+
const THROTTLE_MS = 1e3;
|
|
10
|
+
const USAGE_MS = 2e3;
|
|
11
|
+
const PROBLEMS_MAX = 50;
|
|
12
|
+
const globalTimers = {
|
|
13
|
+
set: (run, ms) => setTimeout(run, ms),
|
|
14
|
+
clear: (handle) => clearTimeout(handle)
|
|
15
|
+
};
|
|
16
|
+
function emptyFeed() {
|
|
17
|
+
return {
|
|
18
|
+
open: false,
|
|
19
|
+
at: 0,
|
|
20
|
+
usage: null,
|
|
21
|
+
agents: [],
|
|
22
|
+
tasks: [],
|
|
23
|
+
processes: null,
|
|
24
|
+
problems: [],
|
|
25
|
+
paused: false
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function totals(usage) {
|
|
29
|
+
let tokens = 0;
|
|
30
|
+
let cost = 0;
|
|
31
|
+
for (const bucket of [usage.models, usage.tools])
|
|
32
|
+
for (const entry of Object.values(bucket)) {
|
|
33
|
+
tokens += entry.totalTokens ?? 0;
|
|
34
|
+
cost += entry.cost?.total ?? 0;
|
|
35
|
+
}
|
|
36
|
+
return { tokens, cost, free: cost === 0 };
|
|
37
|
+
}
|
|
38
|
+
function phaseOf(node) {
|
|
39
|
+
return "phase" in node.state ? node.state.phase : node.state.outcome;
|
|
40
|
+
}
|
|
41
|
+
function contextOf(message) {
|
|
42
|
+
const usage = message.usage;
|
|
43
|
+
if (!usage) return null;
|
|
44
|
+
const parts = [usage.input, usage.output, usage.cacheRead, usage.cacheWrite];
|
|
45
|
+
const total = parts.reduce((sum, part) => sum + (part ?? 0), 0);
|
|
46
|
+
return total > 0 ? total : null;
|
|
47
|
+
}
|
|
48
|
+
function lastAssistant(view) {
|
|
49
|
+
const entries = view?.entries ?? [];
|
|
50
|
+
for (let at = entries.length - 1; at >= 0; at--) {
|
|
51
|
+
const entry = entries[at];
|
|
52
|
+
if (entry.kind === "pi.assistant")
|
|
53
|
+
return { id: String(entry.id), message: entry.model?.[0] ?? {} };
|
|
54
|
+
}
|
|
55
|
+
return void 0;
|
|
56
|
+
}
|
|
57
|
+
function conversations(state) {
|
|
58
|
+
const out = /* @__PURE__ */ new Map();
|
|
59
|
+
for (const [id, scoop] of Object.entries(state.scoops)) out.set(scoop.conversation, id);
|
|
60
|
+
for (const [id, cone] of Object.entries(state.cones)) out.set(cone.conversation, id);
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
function liveAgents(state) {
|
|
64
|
+
const cones = Object.entries(state.cones).map(([id, cone]) => ({
|
|
65
|
+
id,
|
|
66
|
+
name: cone.name,
|
|
67
|
+
kind: "cone",
|
|
68
|
+
parentId: null,
|
|
69
|
+
conversation: cone.conversation
|
|
70
|
+
}));
|
|
71
|
+
const scoops = Object.entries(state.scoops).filter(([, scoop]) => live(scoop)).map(([id, scoop]) => ({
|
|
72
|
+
id,
|
|
73
|
+
name: scoop.name,
|
|
74
|
+
kind: "scoop",
|
|
75
|
+
parentId: scoop.parent,
|
|
76
|
+
conversation: scoop.conversation
|
|
77
|
+
}));
|
|
78
|
+
return [...cones, ...scoops];
|
|
79
|
+
}
|
|
80
|
+
function narrowed(feed, programs) {
|
|
81
|
+
if (!feed.processes) return feed;
|
|
82
|
+
return {
|
|
83
|
+
...feed,
|
|
84
|
+
processes: feed.processes.map((row) => ({ ...row, command: programs.get(row.pid) ?? "" }))
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
class Session {
|
|
88
|
+
stopped = false;
|
|
89
|
+
#options;
|
|
90
|
+
#settings;
|
|
91
|
+
#publish;
|
|
92
|
+
#off = [];
|
|
93
|
+
#handles = /* @__PURE__ */ new Set();
|
|
94
|
+
#watch;
|
|
95
|
+
#graph = { tasks: {} };
|
|
96
|
+
#usage = null;
|
|
97
|
+
#processes = null;
|
|
98
|
+
#users = /* @__PURE__ */ new Map();
|
|
99
|
+
#paused = false;
|
|
100
|
+
#problems = [];
|
|
101
|
+
#seen = /* @__PURE__ */ new Map();
|
|
102
|
+
#next = /* @__PURE__ */ new Map();
|
|
103
|
+
#build;
|
|
104
|
+
#usageTimer;
|
|
105
|
+
#lastBuild = Number.NEGATIVE_INFINITY;
|
|
106
|
+
#last = "";
|
|
107
|
+
constructor(options, settings, publish) {
|
|
108
|
+
this.#options = options;
|
|
109
|
+
this.#settings = settings;
|
|
110
|
+
this.#publish = publish;
|
|
111
|
+
}
|
|
112
|
+
start() {
|
|
113
|
+
const options = this.#options;
|
|
114
|
+
this.#off.push(
|
|
115
|
+
options.harness.subscribeCommits((publication) => this.#commit(publication)),
|
|
116
|
+
options.agents.onChange(() => this.schedule()),
|
|
117
|
+
options.views.subscribe(() => this.schedule())
|
|
118
|
+
);
|
|
119
|
+
void options.harness.watchTaskGraph(this.#settings.context).then(
|
|
120
|
+
(watch) => this.#watching(watch),
|
|
121
|
+
() => void 0
|
|
122
|
+
);
|
|
123
|
+
void options.users?.().then(
|
|
124
|
+
(list) => {
|
|
125
|
+
this.#users = new Map(list.map((user) => [user.uid, user.name]));
|
|
126
|
+
this.schedule();
|
|
127
|
+
},
|
|
128
|
+
() => void 0
|
|
129
|
+
);
|
|
130
|
+
void this.#poll();
|
|
131
|
+
this.refresh();
|
|
132
|
+
}
|
|
133
|
+
stop() {
|
|
134
|
+
this.stopped = true;
|
|
135
|
+
for (const off of this.#off) off();
|
|
136
|
+
for (const handle of this.#handles) this.#settings.timers.clear(handle);
|
|
137
|
+
this.#handles.clear();
|
|
138
|
+
void this.#watch?.stop();
|
|
139
|
+
}
|
|
140
|
+
refresh() {
|
|
141
|
+
void this.#readUsage();
|
|
142
|
+
void this.#options.harness.inspect(this.#settings.context).then(
|
|
143
|
+
(inspection) => {
|
|
144
|
+
this.#paused = inspection.scheduling === "paused";
|
|
145
|
+
this.schedule();
|
|
146
|
+
},
|
|
147
|
+
() => void 0
|
|
148
|
+
);
|
|
149
|
+
this.schedule();
|
|
150
|
+
}
|
|
151
|
+
schedule() {
|
|
152
|
+
if (this.stopped || this.#build !== void 0) return;
|
|
153
|
+
const wait = Math.max(0, this.#lastBuild + this.#settings.throttleMs - this.#settings.now());
|
|
154
|
+
this.#build = this.#later(() => {
|
|
155
|
+
this.#build = void 0;
|
|
156
|
+
this.#emit();
|
|
157
|
+
}, wait);
|
|
158
|
+
}
|
|
159
|
+
#later(task, ms) {
|
|
160
|
+
if (this.stopped) return void 0;
|
|
161
|
+
const handle = this.#settings.timers.set(() => {
|
|
162
|
+
this.#handles.delete(handle);
|
|
163
|
+
if (!this.stopped) task();
|
|
164
|
+
}, ms);
|
|
165
|
+
this.#handles.add(handle);
|
|
166
|
+
return handle;
|
|
167
|
+
}
|
|
168
|
+
#watching(watch) {
|
|
169
|
+
if (this.stopped) {
|
|
170
|
+
void watch.stop();
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
this.#watch = watch;
|
|
174
|
+
this.#graph = watch.value;
|
|
175
|
+
this.schedule();
|
|
176
|
+
watch.start(async (graph) => {
|
|
177
|
+
this.#graph = graph;
|
|
178
|
+
this.schedule();
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
#readUsage() {
|
|
182
|
+
return this.#options.harness.usage(this.#settings.context).then(
|
|
183
|
+
(usage) => {
|
|
184
|
+
this.#usage = usage;
|
|
185
|
+
this.schedule();
|
|
186
|
+
},
|
|
187
|
+
() => void 0
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
#poll() {
|
|
191
|
+
const kernel = this.#options.kernel;
|
|
192
|
+
if (!kernel?.ps) return Promise.resolve();
|
|
193
|
+
return kernel.ps().then(
|
|
194
|
+
(entries) => {
|
|
195
|
+
this.#processes = entries;
|
|
196
|
+
},
|
|
197
|
+
() => {
|
|
198
|
+
this.#processes = null;
|
|
199
|
+
}
|
|
200
|
+
).then(() => {
|
|
201
|
+
this.schedule();
|
|
202
|
+
this.#later(() => void this.#poll(), this.#settings.psMs);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
#problem(entry) {
|
|
206
|
+
if (this.#problems.some((known) => known.id === entry.id)) return;
|
|
207
|
+
this.#problems.unshift(entry);
|
|
208
|
+
this.#problems.length = Math.min(this.#problems.length, PROBLEMS_MAX);
|
|
209
|
+
}
|
|
210
|
+
#commit(publication) {
|
|
211
|
+
let changed = false;
|
|
212
|
+
for (const change of publication.changes) {
|
|
213
|
+
if (change.type === "task") changed = this.#failed(change.value) || changed;
|
|
214
|
+
else if (change.type === "document" && change.record.kind === "pi.usage")
|
|
215
|
+
this.#usageChanged();
|
|
216
|
+
}
|
|
217
|
+
if (changed) this.schedule();
|
|
218
|
+
}
|
|
219
|
+
#failed(task) {
|
|
220
|
+
if (task.state.status !== "terminal") return false;
|
|
221
|
+
const outcome = task.state.outcome;
|
|
222
|
+
if (outcome.status !== "faulted" && outcome.status !== "orphaned") return false;
|
|
223
|
+
this.#problem({
|
|
224
|
+
id: `task:${task.id}`,
|
|
225
|
+
at: this.#settings.now(),
|
|
226
|
+
agentId: conversations(this.#options.agents.state()).get(task.conversationId) ?? null,
|
|
227
|
+
kind: "task",
|
|
228
|
+
message: redacted(
|
|
229
|
+
outcome.status === "faulted" ? outcome.error.message : outcome.reason,
|
|
230
|
+
this.#settings.secrets()
|
|
231
|
+
)
|
|
232
|
+
});
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
#usageChanged() {
|
|
236
|
+
if (this.#usageTimer !== void 0) return;
|
|
237
|
+
this.#usageTimer = this.#later(() => {
|
|
238
|
+
this.#usageTimer = void 0;
|
|
239
|
+
void this.#readUsage();
|
|
240
|
+
}, this.#settings.usageMs);
|
|
241
|
+
}
|
|
242
|
+
#since(key) {
|
|
243
|
+
const at = this.#seen.get(key) ?? this.#settings.now();
|
|
244
|
+
this.#next.set(key, at);
|
|
245
|
+
return at;
|
|
246
|
+
}
|
|
247
|
+
#agent(agent, view, tools) {
|
|
248
|
+
const secrets = this.#settings.secrets();
|
|
249
|
+
const liveDoc = view?.docs["pi.live"];
|
|
250
|
+
for (const slot of liveDoc?.tools ?? [])
|
|
251
|
+
if (slot.taskId !== void 0) tools.set(String(slot.taskId), slot.name);
|
|
252
|
+
const inbox = view?.docs["pi.inbox"];
|
|
253
|
+
const doc = view?.docs["pi.agent"];
|
|
254
|
+
const generation = liveDoc?.generation;
|
|
255
|
+
const retry = generation?.retry ? {
|
|
256
|
+
attempt: generation.attempt,
|
|
257
|
+
since: this.#since(`retry:${agent.id}`),
|
|
258
|
+
error: redacted(generation.retry.error, secrets)
|
|
259
|
+
} : null;
|
|
260
|
+
if (retry)
|
|
261
|
+
this.#problem({
|
|
262
|
+
id: `retry:${agent.id}:${retry.since}`,
|
|
263
|
+
at: retry.since,
|
|
264
|
+
agentId: agent.id,
|
|
265
|
+
kind: "retry",
|
|
266
|
+
message: retry.error
|
|
267
|
+
});
|
|
268
|
+
const last = lastAssistant(view);
|
|
269
|
+
const failed = last?.message.stopReason === "error" ? redacted(last.message.errorMessage || "error", secrets) : null;
|
|
270
|
+
if (failed && last)
|
|
271
|
+
this.#problem({
|
|
272
|
+
id: `turn:${last.id}`,
|
|
273
|
+
at: this.#settings.now(),
|
|
274
|
+
agentId: agent.id,
|
|
275
|
+
kind: "turn",
|
|
276
|
+
message: failed
|
|
277
|
+
});
|
|
278
|
+
return {
|
|
279
|
+
id: agent.id,
|
|
280
|
+
name: agent.name,
|
|
281
|
+
kind: agent.kind,
|
|
282
|
+
parentId: agent.parentId,
|
|
283
|
+
model: doc?.model ? `${doc.model.provider}/${doc.model.modelId}` : null,
|
|
284
|
+
running: Boolean(liveDoc?.run),
|
|
285
|
+
queued: inbox?.items?.length ?? 0,
|
|
286
|
+
tool: liveDoc?.tools?.find((slot) => slot.status === "running")?.name ?? null,
|
|
287
|
+
retry,
|
|
288
|
+
failed,
|
|
289
|
+
context: last ? contextOf(last.message) : null
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
#task(node, owners, details) {
|
|
293
|
+
const id = String(node.id);
|
|
294
|
+
const status = node.state.status;
|
|
295
|
+
return {
|
|
296
|
+
id,
|
|
297
|
+
kind: node.kind,
|
|
298
|
+
detail: details.get(id) ?? null,
|
|
299
|
+
agentId: owners.get(node.conversationId) ?? null,
|
|
300
|
+
owner: node.owner === void 0 ? null : String(node.owner),
|
|
301
|
+
status,
|
|
302
|
+
phase: phaseOf(node),
|
|
303
|
+
background: node.background,
|
|
304
|
+
aborting: node.abortRequested ? this.#since(`abort:${id}`) : null,
|
|
305
|
+
since: this.#since(`task:${id}:${status}`),
|
|
306
|
+
waits: node.state.status === "waiting" ? node.state.on.length : 0
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
#process(entry, groups, programs) {
|
|
310
|
+
const argv = entry.argv ?? [];
|
|
311
|
+
const pgid = entry.pgid ?? entry.pid;
|
|
312
|
+
const zombie = entry.state === "Z";
|
|
313
|
+
programs.set(entry.pid, program(argv));
|
|
314
|
+
const uid = entry.uid;
|
|
315
|
+
return {
|
|
316
|
+
pid: entry.pid,
|
|
317
|
+
ppid: entry.ppid ?? 0,
|
|
318
|
+
pgid,
|
|
319
|
+
user: uid === void 0 ? null : this.#users.get(uid) ?? (uid === 0 ? "root" : `uid ${uid}`),
|
|
320
|
+
agentId: groups.get(pgid) ?? null,
|
|
321
|
+
command: commandLine(argv, this.#settings.secrets()),
|
|
322
|
+
state: zombie ? "Z" : "S",
|
|
323
|
+
started: entry.started ?? 0,
|
|
324
|
+
zombie: zombie ? this.#since(`zombie:${entry.pid}`) : null,
|
|
325
|
+
tty: Boolean(entry.tty),
|
|
326
|
+
rss: typeof entry.rss === "number" ? entry.rss : null
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
#emit() {
|
|
330
|
+
this.#lastBuild = this.#settings.now();
|
|
331
|
+
this.#next = /* @__PURE__ */ new Map();
|
|
332
|
+
const registry = this.#options.agents.state();
|
|
333
|
+
const views = this.#options.views.value ?? {};
|
|
334
|
+
const agents = liveAgents(registry);
|
|
335
|
+
const details = /* @__PURE__ */ new Map();
|
|
336
|
+
const rows = agents.map(
|
|
337
|
+
(agent) => this.#agent(agent, views[agent.id], details)
|
|
338
|
+
);
|
|
339
|
+
for (const scoop of Object.values(registry.scoops))
|
|
340
|
+
details.set(String(scoop.anchor), scoop.name);
|
|
341
|
+
const owners = conversations(registry);
|
|
342
|
+
const tasks = Object.values(this.#graph.tasks).map(
|
|
343
|
+
(node) => this.#task(node, owners, details)
|
|
344
|
+
);
|
|
345
|
+
const groups = /* @__PURE__ */ new Map();
|
|
346
|
+
for (const agent of agents)
|
|
347
|
+
for (const pgid of this.#options.groups?.owned(agent.conversation) ?? [])
|
|
348
|
+
groups.set(pgid, agent.id);
|
|
349
|
+
const programs = /* @__PURE__ */ new Map();
|
|
350
|
+
const processes = this.#processes?.map((entry) => this.#process(entry, groups, programs)) ?? null;
|
|
351
|
+
this.#seen = this.#next;
|
|
352
|
+
const feed = {
|
|
353
|
+
open: true,
|
|
354
|
+
at: this.#lastBuild,
|
|
355
|
+
usage: this.#usage ? totals(this.#usage) : null,
|
|
356
|
+
agents: rows,
|
|
357
|
+
tasks,
|
|
358
|
+
processes,
|
|
359
|
+
problems: [...this.#problems],
|
|
360
|
+
paused: this.#paused
|
|
361
|
+
};
|
|
362
|
+
const key = JSON.stringify({ ...feed, at: 0 });
|
|
363
|
+
if (key === this.#last) return;
|
|
364
|
+
this.#last = key;
|
|
365
|
+
this.#publish(feed, narrowed(feed, programs));
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
function createMonitor(options) {
|
|
369
|
+
const settings = {
|
|
370
|
+
now: options.now ?? Date.now,
|
|
371
|
+
timers: options.timers ?? globalTimers,
|
|
372
|
+
context: options.context ?? BACKGROUND_CONTEXT,
|
|
373
|
+
psMs: options.psMs ?? PS_MS,
|
|
374
|
+
throttleMs: options.throttleMs ?? THROTTLE_MS,
|
|
375
|
+
usageMs: options.usageMs ?? USAGE_MS,
|
|
376
|
+
secrets: () => options.secrets?.() ?? []
|
|
377
|
+
};
|
|
378
|
+
const { now, timers, context } = settings;
|
|
379
|
+
const ttlMs = options.ttlMs ?? TTL_MS;
|
|
380
|
+
const state = replicatedState(emptyFeed());
|
|
381
|
+
const viewState = replicatedState(emptyFeed());
|
|
382
|
+
const leases = /* @__PURE__ */ new Map();
|
|
383
|
+
let session;
|
|
384
|
+
let sweep;
|
|
385
|
+
const publish = (feed, view) => {
|
|
386
|
+
state.replace(context, feed);
|
|
387
|
+
viewState.replace(context, view);
|
|
388
|
+
};
|
|
389
|
+
const stop = () => {
|
|
390
|
+
if (sweep !== void 0) timers.clear(sweep);
|
|
391
|
+
sweep = void 0;
|
|
392
|
+
const current = session;
|
|
393
|
+
if (!current) return;
|
|
394
|
+
session = void 0;
|
|
395
|
+
current.stop();
|
|
396
|
+
publish(
|
|
397
|
+
{ ...state.value, open: false },
|
|
398
|
+
{ ...viewState.value, open: false }
|
|
399
|
+
);
|
|
400
|
+
};
|
|
401
|
+
const arm = () => {
|
|
402
|
+
if (sweep !== void 0) timers.clear(sweep);
|
|
403
|
+
sweep = timers.set(expire, Math.max(0, Math.min(...leases.values()) - now()));
|
|
404
|
+
};
|
|
405
|
+
const expire = () => {
|
|
406
|
+
sweep = void 0;
|
|
407
|
+
const at = now();
|
|
408
|
+
for (const [lease, until] of [...leases]) if (until <= at) leases.delete(lease);
|
|
409
|
+
if (leases.size) arm();
|
|
410
|
+
else stop();
|
|
411
|
+
};
|
|
412
|
+
return {
|
|
413
|
+
state,
|
|
414
|
+
viewState,
|
|
415
|
+
async open(lease, resync) {
|
|
416
|
+
const id = lease ?? crypto.randomUUID();
|
|
417
|
+
leases.set(id, now() + ttlMs);
|
|
418
|
+
arm();
|
|
419
|
+
if (!session) {
|
|
420
|
+
session = new Session(options, settings, publish);
|
|
421
|
+
session.start();
|
|
422
|
+
} else if (resync) session.refresh();
|
|
423
|
+
return { lease: id, ttlMs };
|
|
424
|
+
},
|
|
425
|
+
async close(lease) {
|
|
426
|
+
if (!leases.delete(lease)) return;
|
|
427
|
+
if (leases.size) arm();
|
|
428
|
+
else stop();
|
|
429
|
+
},
|
|
430
|
+
active: () => session !== void 0,
|
|
431
|
+
async dispose() {
|
|
432
|
+
leases.clear();
|
|
433
|
+
stop();
|
|
434
|
+
}
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
export {
|
|
438
|
+
PROBLEMS_MAX,
|
|
439
|
+
PS_MS,
|
|
440
|
+
THROTTLE_MS,
|
|
441
|
+
TTL_MS,
|
|
442
|
+
USAGE_MS,
|
|
443
|
+
createMonitor,
|
|
444
|
+
emptyFeed,
|
|
445
|
+
globalTimers,
|
|
446
|
+
narrowed,
|
|
447
|
+
totals
|
|
448
|
+
};
|
|
449
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/monitor/index.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type Context,\n type JsonValue,\n type ReplicatedState,\n replicatedState,\n} from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type {\n CommitPublication,\n ConversationView,\n Harness,\n TaskGraph,\n TaskGraphNode,\n TaskGraphWatch,\n TaskRecord,\n UsageState,\n} from '@earendil-works/pi-durable';\nimport { type AgentsState, live } from '../agents.ts';\nimport type {\n MonitorAgent,\n MonitorFeed,\n MonitorLease,\n MonitorProblem,\n MonitorProcess,\n MonitorTask,\n} from '../services.ts';\nimport { commandLine, program, redacted } from './redact.ts';\n\nexport interface PsEntry {\n pid: number;\n ppid?: number;\n pgid?: number;\n argv?: readonly string[];\n tty?: unknown;\n started?: number;\n state?: string;\n uid?: number;\n rss?: number;\n}\n\nexport interface Timers {\n set(run: () => void, ms: number): unknown;\n clear(handle: unknown): void;\n}\n\nexport interface MonitorOptions {\n harness: Pick<Harness, 'watchTaskGraph' | 'usage' | 'subscribeCommits' | 'inspect'>;\n agents: { state(): Readonly<AgentsState>; onChange(listener: () => void): () => void };\n views: ReplicatedState<Record<string, ConversationView>>;\n kernel?: { ps?(): Promise<readonly PsEntry[]> };\n groups?: { owned(owner: number): number[] };\n users?: () => Promise<readonly { name: string; uid: number }[]>;\n secrets?: () => readonly string[];\n now?: () => number;\n timers?: Timers;\n ttlMs?: number;\n psMs?: number;\n throttleMs?: number;\n usageMs?: number;\n context?: Context;\n}\n\nexport interface Monitor {\n readonly state: ReplicatedState<MonitorFeed>;\n readonly viewState: ReplicatedState<MonitorFeed>;\n open(lease: string | null, resync: boolean, context: Context): Promise<MonitorLease>;\n close(lease: string, context: Context): Promise<void>;\n active(): boolean;\n dispose(): Promise<void>;\n}\n\nexport const TTL_MS = 30000;\nexport const PS_MS = 2000;\nexport const THROTTLE_MS = 1000;\nexport const USAGE_MS = 2000;\nexport const PROBLEMS_MAX = 50;\n\nexport const globalTimers: Timers = {\n set: (run, ms) => setTimeout(run, ms),\n clear: (handle) => clearTimeout(handle as ReturnType<typeof setTimeout>),\n};\n\nexport function emptyFeed(): MonitorFeed {\n return {\n open: false,\n at: 0,\n usage: null,\n agents: [],\n tasks: [],\n processes: null,\n problems: [],\n paused: false,\n };\n}\n\ninterface Live {\n run?: unknown;\n generation?: { attempt: number; retry?: { at: number; error: string } };\n tools?: { name: string; status: string; taskId?: unknown }[];\n}\n\ninterface ModelMessage {\n stopReason?: string;\n errorMessage?: string;\n usage?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number };\n}\n\nexport function totals(usage: UsageState): { tokens: number; cost: number; free: boolean } {\n let tokens = 0;\n let cost = 0;\n for (const bucket of [usage.models, usage.tools])\n for (const entry of Object.values(bucket)) {\n tokens += entry.totalTokens ?? 0;\n cost += entry.cost?.total ?? 0;\n }\n return { tokens, cost, free: cost === 0 };\n}\n\nfunction phaseOf(node: TaskGraphNode): string {\n return 'phase' in node.state ? node.state.phase : node.state.outcome;\n}\n\nfunction contextOf(message: ModelMessage): number | null {\n const usage = message.usage;\n if (!usage) return null;\n const parts = [usage.input, usage.output, usage.cacheRead, usage.cacheWrite];\n const total = parts.reduce<number>((sum, part) => sum + (part ?? 0), 0);\n return total > 0 ? total : null;\n}\n\nfunction lastAssistant(view: ConversationView | undefined) {\n const entries = view?.entries ?? [];\n for (let at = entries.length - 1; at >= 0; at--) {\n const entry = entries[at] as (typeof entries)[number];\n if (entry.kind === 'pi.assistant')\n return { id: String(entry.id), message: (entry.model?.[0] ?? {}) as ModelMessage };\n }\n return undefined;\n}\n\nfunction conversations(state: Readonly<AgentsState>): Map<number, string> {\n const out = new Map<number, string>();\n for (const [id, scoop] of Object.entries(state.scoops)) out.set(scoop.conversation, id);\n for (const [id, cone] of Object.entries(state.cones)) out.set(cone.conversation, id);\n return out;\n}\n\nfunction liveAgents(state: Readonly<AgentsState>) {\n const cones = Object.entries(state.cones).map(([id, cone]) => ({\n id,\n name: cone.name,\n kind: 'cone' as const,\n parentId: null,\n conversation: cone.conversation,\n }));\n const scoops = Object.entries(state.scoops)\n .filter(([, scoop]) => live(scoop))\n .map(([id, scoop]) => ({\n id,\n name: scoop.name,\n kind: 'scoop' as const,\n parentId: scoop.parent,\n conversation: scoop.conversation,\n }));\n return [...cones, ...scoops];\n}\n\nexport function narrowed(feed: MonitorFeed, programs: ReadonlyMap<number, string>): MonitorFeed {\n if (!feed.processes) return feed;\n return {\n ...feed,\n processes: feed.processes.map((row) => ({ ...row, command: programs.get(row.pid) ?? '' })),\n };\n}\n\ninterface Settings {\n now: () => number;\n timers: Timers;\n context: Context;\n psMs: number;\n throttleMs: number;\n usageMs: number;\n secrets: () => readonly string[];\n}\n\ntype Agent = ReturnType<typeof liveAgents>[number];\n\nclass Session {\n stopped = false;\n readonly #options: MonitorOptions;\n readonly #settings: Settings;\n readonly #publish: (feed: MonitorFeed, view: MonitorFeed) => void;\n readonly #off: (() => void)[] = [];\n readonly #handles = new Set<unknown>();\n #watch: TaskGraphWatch | undefined;\n #graph: TaskGraph = { tasks: {} };\n #usage: UsageState | null = null;\n #processes: readonly PsEntry[] | null = null;\n #users = new Map<number, string>();\n #paused = false;\n #problems: MonitorProblem[] = [];\n #seen = new Map<string, number>();\n #next = new Map<string, number>();\n #build: unknown;\n #usageTimer: unknown;\n #lastBuild = Number.NEGATIVE_INFINITY;\n #last = '';\n\n constructor(\n options: MonitorOptions,\n settings: Settings,\n publish: (feed: MonitorFeed, view: MonitorFeed) => void\n ) {\n this.#options = options;\n this.#settings = settings;\n this.#publish = publish;\n }\n\n start(): void {\n const options = this.#options;\n this.#off.push(\n options.harness.subscribeCommits((publication) => this.#commit(publication)),\n options.agents.onChange(() => this.schedule()),\n options.views.subscribe(() => this.schedule())\n );\n void options.harness.watchTaskGraph(this.#settings.context).then(\n (watch) => this.#watching(watch),\n () => undefined\n );\n void options.users?.().then(\n (list) => {\n this.#users = new Map(list.map((user) => [user.uid, user.name]));\n this.schedule();\n },\n () => undefined\n );\n void this.#poll();\n this.refresh();\n }\n\n stop(): void {\n this.stopped = true;\n for (const off of this.#off) off();\n for (const handle of this.#handles) this.#settings.timers.clear(handle);\n this.#handles.clear();\n void this.#watch?.stop();\n }\n\n refresh(): void {\n void this.#readUsage();\n void this.#options.harness.inspect(this.#settings.context).then(\n (inspection) => {\n this.#paused = inspection.scheduling === 'paused';\n this.schedule();\n },\n () => undefined\n );\n this.schedule();\n }\n\n schedule(): void {\n if (this.stopped || this.#build !== undefined) return;\n const wait = Math.max(0, this.#lastBuild + this.#settings.throttleMs - this.#settings.now());\n this.#build = this.#later(() => {\n this.#build = undefined;\n this.#emit();\n }, wait);\n }\n\n #later(task: () => void, ms: number): unknown {\n if (this.stopped) return undefined;\n const handle = this.#settings.timers.set(() => {\n this.#handles.delete(handle);\n if (!this.stopped) task();\n }, ms);\n this.#handles.add(handle);\n return handle;\n }\n\n #watching(watch: TaskGraphWatch): void {\n if (this.stopped) {\n void watch.stop();\n return;\n }\n this.#watch = watch;\n this.#graph = watch.value;\n this.schedule();\n watch.start(async (graph) => {\n this.#graph = graph;\n this.schedule();\n });\n }\n\n #readUsage(): Promise<void> {\n return this.#options.harness.usage(this.#settings.context).then(\n (usage) => {\n this.#usage = usage;\n this.schedule();\n },\n () => undefined\n );\n }\n\n #poll(): Promise<void> {\n const kernel = this.#options.kernel;\n if (!kernel?.ps) return Promise.resolve();\n return kernel\n .ps()\n .then(\n (entries) => {\n this.#processes = entries;\n },\n () => {\n this.#processes = null;\n }\n )\n .then(() => {\n this.schedule();\n this.#later(() => void this.#poll(), this.#settings.psMs);\n });\n }\n\n #problem(entry: MonitorProblem): void {\n if (this.#problems.some((known) => known.id === entry.id)) return;\n this.#problems.unshift(entry);\n this.#problems.length = Math.min(this.#problems.length, PROBLEMS_MAX);\n }\n\n #commit(publication: CommitPublication): void {\n let changed = false;\n for (const change of publication.changes) {\n if (change.type === 'task') changed = this.#failed(change.value) || changed;\n else if (change.type === 'document' && change.record.kind === 'pi.usage')\n this.#usageChanged();\n }\n if (changed) this.schedule();\n }\n\n #failed(task: TaskRecord<JsonValue, JsonValue, JsonValue>): boolean {\n if (task.state.status !== 'terminal') return false;\n const outcome = task.state.outcome;\n if (outcome.status !== 'faulted' && outcome.status !== 'orphaned') return false;\n this.#problem({\n id: `task:${task.id}`,\n at: this.#settings.now(),\n agentId: conversations(this.#options.agents.state()).get(task.conversationId) ?? null,\n kind: 'task',\n message: redacted(\n outcome.status === 'faulted' ? outcome.error.message : outcome.reason,\n this.#settings.secrets()\n ),\n });\n return true;\n }\n\n #usageChanged(): void {\n if (this.#usageTimer !== undefined) return;\n this.#usageTimer = this.#later(() => {\n this.#usageTimer = undefined;\n void this.#readUsage();\n }, this.#settings.usageMs);\n }\n\n #since(key: string): number {\n const at = this.#seen.get(key) ?? this.#settings.now();\n this.#next.set(key, at);\n return at;\n }\n\n #agent(agent: Agent, view: ConversationView | undefined, tools: Map<string, string>) {\n const secrets = this.#settings.secrets();\n const liveDoc = view?.docs['pi.live'] as Live | undefined;\n for (const slot of liveDoc?.tools ?? [])\n if (slot.taskId !== undefined) tools.set(String(slot.taskId), slot.name);\n const inbox = view?.docs['pi.inbox'] as { items?: unknown[] } | undefined;\n const doc = view?.docs['pi.agent'] as\n | { model?: { provider: string; modelId: string } }\n | undefined;\n const generation = liveDoc?.generation;\n const retry = generation?.retry\n ? {\n attempt: generation.attempt,\n since: this.#since(`retry:${agent.id}`),\n error: redacted(generation.retry.error, secrets),\n }\n : null;\n if (retry)\n this.#problem({\n id: `retry:${agent.id}:${retry.since}`,\n at: retry.since,\n agentId: agent.id,\n kind: 'retry',\n message: retry.error,\n });\n const last = lastAssistant(view);\n const failed =\n last?.message.stopReason === 'error'\n ? redacted(last.message.errorMessage || 'error', secrets)\n : null;\n if (failed && last)\n this.#problem({\n id: `turn:${last.id}`,\n at: this.#settings.now(),\n agentId: agent.id,\n kind: 'turn',\n message: failed,\n });\n return {\n id: agent.id,\n name: agent.name,\n kind: agent.kind,\n parentId: agent.parentId,\n model: doc?.model ? `${doc.model.provider}/${doc.model.modelId}` : null,\n running: Boolean(liveDoc?.run),\n queued: inbox?.items?.length ?? 0,\n tool: liveDoc?.tools?.find((slot) => slot.status === 'running')?.name ?? null,\n retry,\n failed,\n context: last ? contextOf(last.message) : null,\n };\n }\n\n #task(node: TaskGraphNode, owners: Map<number, string>, details: Map<string, string>) {\n const id = String(node.id);\n const status = node.state.status;\n return {\n id,\n kind: node.kind,\n detail: details.get(id) ?? null,\n agentId: owners.get(node.conversationId) ?? null,\n owner: node.owner === undefined ? null : String(node.owner),\n status,\n phase: phaseOf(node),\n background: node.background,\n aborting: node.abortRequested ? this.#since(`abort:${id}`) : null,\n since: this.#since(`task:${id}:${status}`),\n waits: node.state.status === 'waiting' ? node.state.on.length : 0,\n };\n }\n\n #process(entry: PsEntry, groups: Map<number, string>, programs: Map<number, string>) {\n const argv = entry.argv ?? [];\n const pgid = entry.pgid ?? entry.pid;\n const zombie = entry.state === 'Z';\n programs.set(entry.pid, program(argv));\n const uid = entry.uid;\n return {\n pid: entry.pid,\n ppid: entry.ppid ?? 0,\n pgid,\n user:\n uid === undefined ? null : (this.#users.get(uid) ?? (uid === 0 ? 'root' : `uid ${uid}`)),\n agentId: groups.get(pgid) ?? null,\n command: commandLine(argv, this.#settings.secrets()),\n state: zombie ? ('Z' as const) : ('S' as const),\n started: entry.started ?? 0,\n zombie: zombie ? this.#since(`zombie:${entry.pid}`) : null,\n tty: Boolean(entry.tty),\n rss: typeof entry.rss === 'number' ? entry.rss : null,\n };\n }\n\n #emit(): void {\n this.#lastBuild = this.#settings.now();\n this.#next = new Map();\n const registry = this.#options.agents.state();\n const views = this.#options.views.value ?? {};\n const agents = liveAgents(registry);\n const details = new Map<string, string>();\n const rows: MonitorAgent[] = agents.map((agent) =>\n this.#agent(agent, views[agent.id], details)\n );\n for (const scoop of Object.values(registry.scoops))\n details.set(String(scoop.anchor), scoop.name);\n const owners = conversations(registry);\n const tasks: MonitorTask[] = Object.values(this.#graph.tasks).map((node) =>\n this.#task(node, owners, details)\n );\n const groups = new Map<number, string>();\n for (const agent of agents)\n for (const pgid of this.#options.groups?.owned(agent.conversation) ?? [])\n groups.set(pgid, agent.id);\n const programs = new Map<number, string>();\n const processes: MonitorProcess[] | null =\n this.#processes?.map((entry) => this.#process(entry, groups, programs)) ?? null;\n this.#seen = this.#next;\n const feed: MonitorFeed = {\n open: true,\n at: this.#lastBuild,\n usage: this.#usage ? totals(this.#usage) : null,\n agents: rows,\n tasks,\n processes,\n problems: [...this.#problems],\n paused: this.#paused,\n };\n const key = JSON.stringify({ ...feed, at: 0 });\n if (key === this.#last) return;\n this.#last = key;\n this.#publish(feed, narrowed(feed, programs));\n }\n}\n\nexport function createMonitor(options: MonitorOptions): Monitor {\n const settings: Settings = {\n now: options.now ?? Date.now,\n timers: options.timers ?? globalTimers,\n context: options.context ?? BACKGROUND_CONTEXT,\n psMs: options.psMs ?? PS_MS,\n throttleMs: options.throttleMs ?? THROTTLE_MS,\n usageMs: options.usageMs ?? USAGE_MS,\n secrets: () => options.secrets?.() ?? [],\n };\n const { now, timers, context } = settings;\n const ttlMs = options.ttlMs ?? TTL_MS;\n const state = replicatedState<MonitorFeed>(emptyFeed());\n const viewState = replicatedState<MonitorFeed>(emptyFeed());\n const leases = new Map<string, number>();\n let session: Session | undefined;\n let sweep: unknown;\n const publish = (feed: MonitorFeed, view: MonitorFeed) => {\n state.replace(context, feed);\n viewState.replace(context, view);\n };\n const stop = () => {\n if (sweep !== undefined) timers.clear(sweep);\n sweep = undefined;\n const current = session;\n if (!current) return;\n session = undefined;\n current.stop();\n publish(\n { ...(state.value as MonitorFeed), open: false },\n { ...(viewState.value as MonitorFeed), open: false }\n );\n };\n const arm = () => {\n if (sweep !== undefined) timers.clear(sweep);\n sweep = timers.set(expire, Math.max(0, Math.min(...leases.values()) - now()));\n };\n const expire = () => {\n sweep = undefined;\n const at = now();\n for (const [lease, until] of [...leases]) if (until <= at) leases.delete(lease);\n if (leases.size) arm();\n else stop();\n };\n return {\n state,\n viewState,\n async open(lease, resync) {\n const id = lease ?? crypto.randomUUID();\n leases.set(id, now() + ttlMs);\n arm();\n if (!session) {\n session = new Session(options, settings, publish);\n session.start();\n } else if (resync) session.refresh();\n return { lease: id, ttlMs };\n },\n async close(lease) {\n if (!leases.delete(lease)) return;\n if (leases.size) arm();\n else stop();\n },\n active: () => session !== undefined,\n async dispose() {\n leases.clear();\n stop();\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { scrub } from "../mcp/credentials.js";
|
|
2
|
+
import { redactSecrets } from "../memory/format.js";
|
|
3
|
+
const TEXT_MAX = 160;
|
|
4
|
+
function cut(text, max = TEXT_MAX) {
|
|
5
|
+
return text.length > max ? `${text.slice(0, max - 1)}\u2026` : text;
|
|
6
|
+
}
|
|
7
|
+
function redacted(text, secrets) {
|
|
8
|
+
return cut(redactSecrets(scrub(text, secrets)).text.replace(/\s+/g, " ").trim());
|
|
9
|
+
}
|
|
10
|
+
const EXPORTS = /^export (?:[A-Z_][A-Z0-9_]*='(?:[^']|'\\'')*' ?)+; /;
|
|
11
|
+
function commandLine(argv, secrets) {
|
|
12
|
+
return redacted(argv.map((arg) => arg.replace(EXPORTS, "")).join(" "), secrets);
|
|
13
|
+
}
|
|
14
|
+
function program(argv) {
|
|
15
|
+
const first = argv[0] ?? "";
|
|
16
|
+
return cut(first.split("/").pop() || first);
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
TEXT_MAX,
|
|
20
|
+
commandLine,
|
|
21
|
+
cut,
|
|
22
|
+
program,
|
|
23
|
+
redacted
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/monitor/redact.ts"],
|
|
4
|
+
"sourcesContent": ["import { scrub } from '../mcp/credentials.ts';\nimport { redactSecrets } from '../memory/format.ts';\n\nexport const TEXT_MAX = 160;\n\nexport function cut(text: string, max = TEXT_MAX): string {\n return text.length > max ? `${text.slice(0, max - 1)}\u2026` : text;\n}\n\nexport function redacted(text: string, secrets: readonly string[]): string {\n return cut(redactSecrets(scrub(text, secrets)).text.replace(/\\s+/g, ' ').trim());\n}\n\nconst EXPORTS = /^export (?:[A-Z_][A-Z0-9_]*='(?:[^']|'\\\\'')*' ?)+; /;\n\nexport function commandLine(argv: readonly string[], secrets: readonly string[]): string {\n return redacted(argv.map((arg) => arg.replace(EXPORTS, '')).join(' '), secrets);\n}\n\nexport function program(argv: readonly string[]): string {\n const first = argv[0] ?? '';\n return cut(first.split('/').pop() || first);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,aAAa;AACtB,SAAS,qBAAqB;AAEvB,MAAM,WAAW;AAEjB,SAAS,IAAI,MAAc,MAAM,UAAkB;AACxD,SAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC,CAAC,WAAM;AAC5D;AAEO,SAAS,SAAS,MAAc,SAAoC;AACzE,SAAO,IAAI,cAAc,MAAM,MAAM,OAAO,CAAC,EAAE,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC;AACjF;AAEA,MAAM,UAAU;AAET,SAAS,YAAY,MAAyB,SAAoC;AACvF,SAAO,SAAS,KAAK,IAAI,CAAC,QAAQ,IAAI,QAAQ,SAAS,EAAE,CAAC,EAAE,KAAK,GAAG,GAAG,OAAO;AAChF;AAEO,SAAS,QAAQ,MAAiC;AACvD,QAAM,QAAQ,KAAK,CAAC,KAAK;AACzB,SAAO,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,KAAK,KAAK;AAC5C;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/readonly.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ServerError } from "@earendil-works/pi-server";
|
|
2
2
|
import { VIEW_ONLY } from "./view-only.js";
|
|
3
|
-
const READS = /* @__PURE__ */ new Set(["wait", "changesOpen"]);
|
|
3
|
+
const READS = /* @__PURE__ */ new Set(["wait", "changesOpen", "monitorOpen", "monitorClose"]);
|
|
4
4
|
function refuse() {
|
|
5
5
|
return Promise.reject(new ServerError("EACCES", VIEW_ONLY));
|
|
6
6
|
}
|
package/dist/readonly.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/readonly.ts"],
|
|
4
|
-
"sourcesContent": ["import { ServerError } from '@earendil-works/pi-server';\nimport type { AgentRemote } from './remote/host.ts';\nimport type { AgentControl, AgentSettings } from './services.ts';\nimport { VIEW_ONLY } from './view-only.ts';\n\nexport { VIEW_ONLY };\n\nconst READS = new Set<keyof AgentControl>(['wait', 'changesOpen']);\n\nfunction refuse(): Promise<never> {\n return Promise.reject(new ServerError('EACCES' as never, VIEW_ONLY));\n}\n\nconst refused = async () => ({\n accepted: false as const,\n submissionId: null,\n error: { code: 'EACCES', message: VIEW_ONLY },\n});\n\nconst ANSWERS: Partial<Record<keyof AgentControl, () => Promise<unknown>>> = {\n send: refused,\n compact: refused,\n compactAgent: refused,\n};\n\nexport function viewControl(control: AgentControl): AgentControl {\n const view: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(control))\n view[key] =\n typeof value !== 'function' || READS.has(key as keyof AgentControl)\n ? value\n : (ANSWERS[key as keyof AgentControl] ?? refuse);\n return view as unknown as AgentControl;\n}\n\nexport function viewSettings(settings: AgentSettings): AgentSettings {\n return { state: settings.state, connect: refuse, disconnect: refuse, signIn: refuse };\n}\n\nexport function viewRemote(remote: AgentRemote): AgentRemote {\n const mine = new Set<string>();\n return {\n prompt: async () => ({ ok: false, code: 'EACCES', message: VIEW_ONLY }),\n async watch(request, context) {\n const opened = await remote.watch(request, context);\n if (opened.ok) mine.add(opened.stream);\n return opened;\n },\n async next(stream, waitMs, context) {\n if (!mine.has(stream)) return { events: [], done: true };\n const batch = await remote.next(stream, waitMs, context);\n if (batch.done) mine.delete(stream);\n return batch;\n },\n async close(stream, context) {\n if (!mine.delete(stream)) return;\n await remote.close(stream, context);\n },\n abort: refuse,\n };\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,mBAAmB;AAG5B,SAAS,iBAAiB;AAI1B,MAAM,QAAQ,oBAAI,IAAwB,CAAC,QAAQ,
|
|
4
|
+
"sourcesContent": ["import { ServerError } from '@earendil-works/pi-server';\nimport type { AgentRemote } from './remote/host.ts';\nimport type { AgentControl, AgentSettings } from './services.ts';\nimport { VIEW_ONLY } from './view-only.ts';\n\nexport { VIEW_ONLY };\n\nconst READS = new Set<keyof AgentControl>(['wait', 'changesOpen', 'monitorOpen', 'monitorClose']);\n\nfunction refuse(): Promise<never> {\n return Promise.reject(new ServerError('EACCES' as never, VIEW_ONLY));\n}\n\nconst refused = async () => ({\n accepted: false as const,\n submissionId: null,\n error: { code: 'EACCES', message: VIEW_ONLY },\n});\n\nconst ANSWERS: Partial<Record<keyof AgentControl, () => Promise<unknown>>> = {\n send: refused,\n compact: refused,\n compactAgent: refused,\n};\n\nexport function viewControl(control: AgentControl): AgentControl {\n const view: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(control))\n view[key] =\n typeof value !== 'function' || READS.has(key as keyof AgentControl)\n ? value\n : (ANSWERS[key as keyof AgentControl] ?? refuse);\n return view as unknown as AgentControl;\n}\n\nexport function viewSettings(settings: AgentSettings): AgentSettings {\n return { state: settings.state, connect: refuse, disconnect: refuse, signIn: refuse };\n}\n\nexport function viewRemote(remote: AgentRemote): AgentRemote {\n const mine = new Set<string>();\n return {\n prompt: async () => ({ ok: false, code: 'EACCES', message: VIEW_ONLY }),\n async watch(request, context) {\n const opened = await remote.watch(request, context);\n if (opened.ok) mine.add(opened.stream);\n return opened;\n },\n async next(stream, waitMs, context) {\n if (!mine.has(stream)) return { events: [], done: true };\n const batch = await remote.next(stream, waitMs, context);\n if (batch.done) mine.delete(stream);\n return batch;\n },\n async close(stream, context) {\n if (!mine.delete(stream)) return;\n await remote.close(stream, context);\n },\n abort: refuse,\n };\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,mBAAmB;AAG5B,SAAS,iBAAiB;AAI1B,MAAM,QAAQ,oBAAI,IAAwB,CAAC,QAAQ,eAAe,eAAe,cAAc,CAAC;AAEhG,SAAS,SAAyB;AAChC,SAAO,QAAQ,OAAO,IAAI,YAAY,UAAmB,SAAS,CAAC;AACrE;AAEA,MAAM,UAAU,aAAa;AAAA,EAC3B,UAAU;AAAA,EACV,cAAc;AAAA,EACd,OAAO,EAAE,MAAM,UAAU,SAAS,UAAU;AAC9C;AAEA,MAAM,UAAuE;AAAA,EAC3E,MAAM;AAAA,EACN,SAAS;AAAA,EACT,cAAc;AAChB;AAEO,SAAS,YAAY,SAAqC;AAC/D,QAAM,OAAgC,CAAC;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO;AAC/C,SAAK,GAAG,IACN,OAAO,UAAU,cAAc,MAAM,IAAI,GAAyB,IAC9D,QACC,QAAQ,GAAyB,KAAK;AAC/C,SAAO;AACT;AAEO,SAAS,aAAa,UAAwC;AACnE,SAAO,EAAE,OAAO,SAAS,OAAO,SAAS,QAAQ,YAAY,QAAQ,QAAQ,OAAO;AACtF;AAEO,SAAS,WAAW,QAAkC;AAC3D,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO;AAAA,IACL,QAAQ,aAAa,EAAE,IAAI,OAAO,MAAM,UAAU,SAAS,UAAU;AAAA,IACrE,MAAM,MAAM,SAAS,SAAS;AAC5B,YAAM,SAAS,MAAM,OAAO,MAAM,SAAS,OAAO;AAClD,UAAI,OAAO,GAAI,MAAK,IAAI,OAAO,MAAM;AACrC,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,QAAQ,QAAQ,SAAS;AAClC,UAAI,CAAC,KAAK,IAAI,MAAM,EAAG,QAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,KAAK;AACvD,YAAM,QAAQ,MAAM,OAAO,KAAK,QAAQ,QAAQ,OAAO;AACvD,UAAI,MAAM,KAAM,MAAK,OAAO,MAAM;AAClC,aAAO;AAAA,IACT;AAAA,IACA,MAAM,MAAM,QAAQ,SAAS;AAC3B,UAAI,CAAC,KAAK,OAAO,MAAM,EAAG;AAC1B,YAAM,OAAO,MAAM,QAAQ,OAAO;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,EACT;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/services.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/services.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Context,\n defineService,\n type JsonValue,\n type ReplicatedState,\n} from '@earendil-works/chord';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { ChangesView } from './changes/git.ts';\nimport type { FrozenCone } from './freezer/index.ts';\nimport type { MemoryEntry, MemoryScope, MemoryTag } from './memory/format.ts';\nimport type { AgentRemote } from './remote/host.ts';\nimport type { Sprinkle } from './sprinkles/kind.ts';\n\nexport type SendMode = 'steer' | 'followUp' | 'reject';\n\nexport interface SendRequest {\n text: string;\n whenBusy: SendMode;\n requestId: string | null;\n agentId?: string | null;\n}\n\nexport interface OperationError {\n code: string;\n message: string;\n}\n\nexport type SendResponse =\n | { accepted: true; submissionId: string; error: null }\n | { accepted: false; submissionId: null; error: OperationError };\n\nexport type PromptResult =\n | { status: 'done'; text: string; reason: null }\n | { status: 'unanswered'; text: null; reason: string };\n\nexport interface AgentControl {\n send(request: SendRequest, context: Context): Promise<SendResponse>;\n wait(submissionId: string, context: Context): Promise<PromptResult>;\n withdraw(\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n abort(context: Context): Promise<void>;\n compact(instructions: string | null, context: Context): Promise<SendResponse>;\n compactAgent(\n agentId: string,\n instructions: string | null,\n context: Context\n ): Promise<SendResponse>;\n reset(handoff: string | null, context: Context): Promise<void>;\n configure(change: AgentSettingsChange, context: Context): Promise<void>;\n rewind(messageId: string | null, context: Context): Promise<Rewound>;\n rewindAgent(agentId: string, messageId: string | null, context: Context): Promise<Rewound>;\n resolveLick(\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n resolveAgentLick(\n agentId: string,\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n webhook(\n name: string,\n delivery: WebhookRequest,\n context: Context\n ): Promise<{ delivered: boolean }>;\n stopAgent(agentId: string, context: Context): Promise<void>;\n selectCone(agentId: string, context: Context): Promise<void>;\n createCone(name: string, context: Context): Promise<Created>;\n createScoop(parentId: string, name: string, context: Context): Promise<Created>;\n drop(agentId: string, context: Context): Promise<Created>;\n unqueue(\n agentId: string | null,\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n sprinkleSend(\n sprinkleId: string,\n payload: { action: string; data: JsonValue | null; target: string | null },\n context: Context\n ): Promise<{ delivered: boolean }>;\n sprinkleCall(\n sprinkleId: string,\n method: string,\n args: JsonValue[],\n context: Context\n ): Promise<JsonValue>;\n memorySave(draft: MemoryDraft, context: Context): Promise<MemoryEntry>;\n memoryRemove(id: string, context: Context): Promise<{ removed: boolean }>;\n freeze(agentId: string, context: Context): Promise<Created>;\n newChat(agentId: string, context: Context): Promise<Created>;\n thaw(frozenId: string, context: Context): Promise<Created>;\n discard(frozenId: string, context: Context): Promise<Created>;\n changesOpen(context: Context): Promise<void>;\n changeAccept(path: string, context: Context): Promise<Created>;\n changeRevert(path: string, context: Context): Promise<Created>;\n}\n\nexport interface MemoryDraft {\n id: string | null;\n scope: string;\n section: string;\n title: string;\n body: string;\n tag: MemoryTag | null;\n}\n\nexport type Created = { id: string; error: null } | { id: null; error: string };\n\nexport interface AgentSummary {\n id: string;\n name: string;\n kind: 'cone' | 'scoop';\n parentId: string | null;\n role: string | null;\n}\n\nexport interface AgentsSummary {\n active: string;\n agents: AgentSummary[];\n}\n\nexport type LickResolved =\n | { done: true; text: string; error: null }\n | { done: false; text: null; error: string };\n\nexport interface WebhookRequest {\n id: string | null;\n headers: Record<string, string>;\n body: string;\n}\n\nexport type Rewound =\n | { done: true; text: string; reason: null }\n | { done: false; text: null; reason: 'busy' | 'no-turn' };\n\nexport interface AgentSettingsChange {\n model: { provider: string; modelId: string } | null;\n thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null;\n agentId?: string | null;\n}\n\nexport const AgentControl = defineService<AgentControl>('slicc.agent.control');\n\nexport type Delivered = 'run' | 'steer' | 'follow-up';\n\nexport interface AgentTranscript {\n readonly state: ReplicatedState<ConversationView>;\n readonly deliveries: ReplicatedState<Record<string, Delivered>>;\n readonly agents: ReplicatedState<AgentsSummary>;\n readonly views: ReplicatedState<Record<string, ConversationView>>;\n readonly commands: ReplicatedState<Command[]>;\n readonly sprinkles: ReplicatedState<Sprinkle[]>;\n readonly memories: ReplicatedState<MemoryEntry[]>;\n readonly memoryScopes: ReplicatedState<MemoryScope[]>;\n readonly frozen: ReplicatedState<FrozenCone[]>;\n readonly changes: ReplicatedState<ChangesView>;\n}\n\nexport interface Command {\n name: string;\n description: string;\n kind: 'prompt' | 'skill';\n}\n\nexport const AgentTranscript = defineService<AgentTranscript>('slicc.agent.transcript');\n\nexport interface AgentSessions {\n attach(sessionId: string, context: Context): Promise<void>;\n detach(context: Context): Promise<void>;\n}\n\nexport const AgentSessions = defineService<AgentSessions>('slicc.agent.sessions');\n\nexport const AgentRemoteService = defineService<AgentRemote>('slicc.agent.remote');\n\nexport const AGENT_SESSION = 'agent';\n\nexport interface ModelChoice {\n id: string;\n label: string;\n provider: string;\n kind: 'chat' | 'classifier';\n reasoning: boolean;\n images?: boolean;\n contextWindow: number;\n}\n\nexport interface AccountState {\n id: string;\n provider: string;\n identity: string;\n status: 'connected' | 'disconnected' | 'expired';\n auth: 'api-key' | 'oauth';\n needs: 'cors-free-transport' | null;\n group?: 'providers' | 'mcp';\n secret?: 'api-key' | 'token';\n}\n\nexport interface BudgetState {\n provider: string;\n percent: number;\n window: 'weekly';\n resets: string;\n}\n\nexport interface SignIn {\n clientId: string;\n scopes: string;\n imsEnvironment: string;\n}\n\nexport interface McpSignIn {\n url: string;\n state: string;\n}\n\nexport interface SettingsState {\n models: ModelChoice[];\n accounts: AccountState[];\n budget?: BudgetState | null;\n}\n\nexport interface AgentSettings {\n readonly state: ReplicatedState<SettingsState>;\n connect(\n providerId: string,\n secret: string,\n region: string | null,\n context: Context\n ): Promise<void>;\n disconnect(providerId: string, context: Context): Promise<void>;\n signIn(providerId: string, context: Context): Promise<SignIn | McpSignIn | null>;\n}\n\nexport const AgentSettings = defineService<AgentSettings>('slicc.agent.settings');\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EAEE;AAAA,OAGK;
|
|
4
|
+
"sourcesContent": ["import {\n type Context,\n defineService,\n type JsonValue,\n type ReplicatedState,\n} from '@earendil-works/chord';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { ChangesView } from './changes/git.ts';\nimport type { FrozenCone } from './freezer/index.ts';\nimport type { MemoryEntry, MemoryScope, MemoryTag } from './memory/format.ts';\nimport type { AgentRemote } from './remote/host.ts';\nimport type { Sprinkle } from './sprinkles/kind.ts';\n\nexport type SendMode = 'steer' | 'followUp' | 'reject';\n\nexport interface SendRequest {\n text: string;\n whenBusy: SendMode;\n requestId: string | null;\n agentId?: string | null;\n}\n\nexport interface OperationError {\n code: string;\n message: string;\n}\n\nexport type SendResponse =\n | { accepted: true; submissionId: string; error: null }\n | { accepted: false; submissionId: null; error: OperationError };\n\nexport type PromptResult =\n | { status: 'done'; text: string; reason: null }\n | { status: 'unanswered'; text: null; reason: string };\n\nexport interface AgentControl {\n send(request: SendRequest, context: Context): Promise<SendResponse>;\n wait(submissionId: string, context: Context): Promise<PromptResult>;\n withdraw(\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n abort(context: Context): Promise<void>;\n compact(instructions: string | null, context: Context): Promise<SendResponse>;\n compactAgent(\n agentId: string,\n instructions: string | null,\n context: Context\n ): Promise<SendResponse>;\n reset(handoff: string | null, context: Context): Promise<void>;\n configure(change: AgentSettingsChange, context: Context): Promise<void>;\n rewind(messageId: string | null, context: Context): Promise<Rewound>;\n rewindAgent(agentId: string, messageId: string | null, context: Context): Promise<Rewound>;\n resolveLick(\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n resolveAgentLick(\n agentId: string,\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n webhook(\n name: string,\n delivery: WebhookRequest,\n context: Context\n ): Promise<{ delivered: boolean }>;\n stopAgent(agentId: string, context: Context): Promise<void>;\n selectCone(agentId: string, context: Context): Promise<void>;\n createCone(name: string, context: Context): Promise<Created>;\n createScoop(parentId: string, name: string, context: Context): Promise<Created>;\n drop(agentId: string, context: Context): Promise<Created>;\n unqueue(\n agentId: string | null,\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n sprinkleSend(\n sprinkleId: string,\n payload: { action: string; data: JsonValue | null; target: string | null },\n context: Context\n ): Promise<{ delivered: boolean }>;\n sprinkleCall(\n sprinkleId: string,\n method: string,\n args: JsonValue[],\n context: Context\n ): Promise<JsonValue>;\n memorySave(draft: MemoryDraft, context: Context): Promise<MemoryEntry>;\n memoryRemove(id: string, context: Context): Promise<{ removed: boolean }>;\n freeze(agentId: string, context: Context): Promise<Created>;\n newChat(agentId: string, context: Context): Promise<Created>;\n thaw(frozenId: string, context: Context): Promise<Created>;\n discard(frozenId: string, context: Context): Promise<Created>;\n changesOpen(context: Context): Promise<void>;\n changeAccept(path: string, context: Context): Promise<Created>;\n changeRevert(path: string, context: Context): Promise<Created>;\n monitorOpen(lease: string | null, resync: boolean, context: Context): Promise<MonitorLease>;\n monitorClose(lease: string, context: Context): Promise<void>;\n}\n\nexport interface MonitorLease {\n lease: string;\n ttlMs: number;\n}\n\nexport interface MonitorAgent {\n id: string;\n name: string;\n kind: 'cone' | 'scoop';\n parentId: string | null;\n model: string | null;\n running: boolean;\n queued: number;\n tool: string | null;\n retry: { attempt: number; since: number; error: string } | null;\n failed: string | null;\n context: number | null;\n}\n\nexport interface MonitorTask {\n id: string;\n kind: string;\n detail: string | null;\n agentId: string | null;\n owner: string | null;\n status: 'pending' | 'running' | 'waiting' | 'completing';\n phase: string;\n background: boolean;\n aborting: number | null;\n since: number;\n waits: number;\n}\n\nexport interface MonitorProcess {\n pid: number;\n ppid: number;\n pgid: number;\n user: string | null;\n agentId: string | null;\n command: string;\n state: 'S' | 'Z';\n started: number;\n zombie: number | null;\n tty: boolean;\n rss: number | null;\n}\n\nexport interface MonitorProblem {\n id: string;\n at: number;\n agentId: string | null;\n kind: 'task' | 'retry' | 'turn';\n message: string;\n}\n\nexport interface MonitorFeed {\n open: boolean;\n at: number;\n usage: { tokens: number; cost: number; free: boolean } | null;\n agents: MonitorAgent[];\n tasks: MonitorTask[];\n processes: MonitorProcess[] | null;\n problems: MonitorProblem[];\n paused: boolean;\n}\n\nexport interface MemoryDraft {\n id: string | null;\n scope: string;\n section: string;\n title: string;\n body: string;\n tag: MemoryTag | null;\n}\n\nexport type Created = { id: string; error: null } | { id: null; error: string };\n\nexport interface AgentSummary {\n id: string;\n name: string;\n kind: 'cone' | 'scoop';\n parentId: string | null;\n role: string | null;\n}\n\nexport interface AgentsSummary {\n active: string;\n agents: AgentSummary[];\n}\n\nexport type LickResolved =\n | { done: true; text: string; error: null }\n | { done: false; text: null; error: string };\n\nexport interface WebhookRequest {\n id: string | null;\n headers: Record<string, string>;\n body: string;\n}\n\nexport type Rewound =\n | { done: true; text: string; reason: null }\n | { done: false; text: null; reason: 'busy' | 'no-turn' };\n\nexport interface AgentSettingsChange {\n model: { provider: string; modelId: string } | null;\n thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null;\n agentId?: string | null;\n}\n\nexport const AgentControl = defineService<AgentControl>('slicc.agent.control');\n\nexport type Delivered = 'run' | 'steer' | 'follow-up';\n\nexport interface AgentTranscript {\n readonly state: ReplicatedState<ConversationView>;\n readonly deliveries: ReplicatedState<Record<string, Delivered>>;\n readonly agents: ReplicatedState<AgentsSummary>;\n readonly views: ReplicatedState<Record<string, ConversationView>>;\n readonly commands: ReplicatedState<Command[]>;\n readonly sprinkles: ReplicatedState<Sprinkle[]>;\n readonly memories: ReplicatedState<MemoryEntry[]>;\n readonly memoryScopes: ReplicatedState<MemoryScope[]>;\n readonly frozen: ReplicatedState<FrozenCone[]>;\n readonly changes: ReplicatedState<ChangesView>;\n readonly monitor: ReplicatedState<MonitorFeed>;\n}\n\nexport interface Command {\n name: string;\n description: string;\n kind: 'prompt' | 'skill';\n}\n\nexport const AgentTranscript = defineService<AgentTranscript>('slicc.agent.transcript');\n\nexport interface AgentSessions {\n attach(sessionId: string, context: Context): Promise<void>;\n detach(context: Context): Promise<void>;\n}\n\nexport const AgentSessions = defineService<AgentSessions>('slicc.agent.sessions');\n\nexport const AgentRemoteService = defineService<AgentRemote>('slicc.agent.remote');\n\nexport const AGENT_SESSION = 'agent';\n\nexport interface ModelChoice {\n id: string;\n label: string;\n provider: string;\n kind: 'chat' | 'classifier';\n reasoning: boolean;\n images?: boolean;\n contextWindow: number;\n}\n\nexport interface AccountState {\n id: string;\n provider: string;\n identity: string;\n status: 'connected' | 'disconnected' | 'expired';\n auth: 'api-key' | 'oauth';\n needs: 'cors-free-transport' | null;\n group?: 'providers' | 'mcp';\n secret?: 'api-key' | 'token';\n}\n\nexport interface BudgetState {\n provider: string;\n percent: number;\n window: 'weekly';\n resets: string;\n}\n\nexport interface SignIn {\n clientId: string;\n scopes: string;\n imsEnvironment: string;\n}\n\nexport interface McpSignIn {\n url: string;\n state: string;\n}\n\nexport interface SettingsState {\n models: ModelChoice[];\n accounts: AccountState[];\n budget?: BudgetState | null;\n}\n\nexport interface AgentSettings {\n readonly state: ReplicatedState<SettingsState>;\n connect(\n providerId: string,\n secret: string,\n region: string | null,\n context: Context\n ): Promise<void>;\n disconnect(providerId: string, context: Context): Promise<void>;\n signIn(providerId: string, context: Context): Promise<SignIn | McpSignIn | null>;\n}\n\nexport const AgentSettings = defineService<AgentSettings>('slicc.agent.settings');\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EAEE;AAAA,OAGK;AAgNA,MAAM,eAAe,cAA4B,qBAAqB;AAwBtE,MAAM,kBAAkB,cAA+B,wBAAwB;AAO/E,MAAM,gBAAgB,cAA6B,sBAAsB;AAEzE,MAAM,qBAAqB,cAA2B,oBAAoB;AAE1E,MAAM,gBAAgB;AA2DtB,MAAM,gBAAgB,cAA6B,sBAAsB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|