@songsid/agend 2.1.6-beta.3 → 2.1.6-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/agent-endpoint.d.ts +18 -0
  2. package/dist/agent-endpoint.js +53 -2
  3. package/dist/agent-endpoint.js.map +1 -1
  4. package/dist/backend/claude-code.js +24 -0
  5. package/dist/backend/claude-code.js.map +1 -1
  6. package/dist/backend/factory.js +4 -1
  7. package/dist/backend/factory.js.map +1 -1
  8. package/dist/backend/muse.d.ts +90 -0
  9. package/dist/backend/muse.js +428 -0
  10. package/dist/backend/muse.js.map +1 -0
  11. package/dist/backend/types.d.ts +2 -0
  12. package/dist/backend/types.js.map +1 -1
  13. package/dist/channel/access-manager.d.ts +20 -0
  14. package/dist/channel/access-manager.js +25 -0
  15. package/dist/channel/access-manager.js.map +1 -1
  16. package/dist/channel/adapters/discord.d.ts +3 -0
  17. package/dist/channel/adapters/discord.js +13 -10
  18. package/dist/channel/adapters/discord.js.map +1 -1
  19. package/dist/channel/markdown-chunk.d.ts +8 -3
  20. package/dist/channel/markdown-chunk.js +12 -3
  21. package/dist/channel/markdown-chunk.js.map +1 -1
  22. package/dist/channel/mcp-server.js +9 -12
  23. package/dist/channel/mcp-server.js.map +1 -1
  24. package/dist/channel/mcp-tools.d.ts +6 -2
  25. package/dist/channel/mcp-tools.js +6 -36
  26. package/dist/channel/mcp-tools.js.map +1 -1
  27. package/dist/channel/tool-router.js +12 -2
  28. package/dist/channel/tool-router.js.map +1 -1
  29. package/dist/config-validator.js +21 -5
  30. package/dist/config-validator.js.map +1 -1
  31. package/dist/daemon.js +19 -6
  32. package/dist/daemon.js.map +1 -1
  33. package/dist/event-log.d.ts +9 -0
  34. package/dist/event-log.js +21 -0
  35. package/dist/event-log.js.map +1 -1
  36. package/dist/fleet-manager.d.ts +64 -0
  37. package/dist/fleet-manager.js +233 -26
  38. package/dist/fleet-manager.js.map +1 -1
  39. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +11 -1
  40. package/dist/instance-lifecycle.js +8 -4
  41. package/dist/instance-lifecycle.js.map +1 -1
  42. package/dist/logger.js +42 -25
  43. package/dist/logger.js.map +1 -1
  44. package/dist/outbound-schemas.d.ts +1 -0
  45. package/dist/outbound-schemas.js +1 -1
  46. package/dist/outbound-schemas.js.map +1 -1
  47. package/dist/quickstart-api.d.ts +3 -0
  48. package/dist/quickstart-api.js +1 -0
  49. package/dist/quickstart-api.js.map +1 -1
  50. package/dist/scheduler/db.js +17 -5
  51. package/dist/scheduler/db.js.map +1 -1
  52. package/dist/scheduler/db.test.js +34 -1
  53. package/dist/scheduler/db.test.js.map +1 -1
  54. package/dist/scheduler/types.d.ts +4 -0
  55. package/dist/scheduler/types.js.map +1 -1
  56. package/dist/setup-wizard.js +4 -0
  57. package/dist/setup-wizard.js.map +1 -1
  58. package/dist/steer-capability.js +4 -1
  59. package/dist/steer-capability.js.map +1 -1
  60. package/dist/tmux-manager.js +29 -4
  61. package/dist/tmux-manager.js.map +1 -1
  62. package/dist/tool-permissions-notice.d.ts +38 -0
  63. package/dist/tool-permissions-notice.js +92 -0
  64. package/dist/tool-permissions-notice.js.map +1 -0
  65. package/dist/tool-permissions.d.ts +93 -0
  66. package/dist/tool-permissions.js +216 -0
  67. package/dist/tool-permissions.js.map +1 -0
  68. package/dist/topic-commands.js +1 -0
  69. package/dist/topic-commands.js.map +1 -1
  70. package/dist/web-api.js +2 -1
  71. package/dist/web-api.js.map +1 -1
  72. package/dist/web-terminal.d.ts +30 -1
  73. package/dist/web-terminal.js +86 -3
  74. package/dist/web-terminal.js.map +1 -1
  75. package/package.json +2 -1
@@ -0,0 +1,428 @@
1
+ import { join } from "node:path";
2
+ import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync, chmodSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { createHash } from "node:crypto";
5
+ import { resolveBinary, shellQuote, validateModel, warnIfModelMismatch } from "./types.js";
6
+ import { appendWithMarker, removeMarker } from "./marker-utils.js";
7
+ /** Session ids are UUIDs (e.g. "01a0c784-fb91-…"); guard before shell interpolation. */
8
+ const SESSION_ID_RE = /^[0-9a-fA-F-]{8,}$/;
9
+ /**
10
+ * Enough of a session log to reach the `route_facts` record that names the
11
+ * working directory. Measured on a live session: `"cwd"` landed at byte 3899 of
12
+ * a 450KB log, at sequence 4. 64KiB is ~16x that headroom and keeps the scan
13
+ * cheap even with dozens of sessions on disk.
14
+ */
15
+ const SESSION_HEAD_BYTES = 65_536;
16
+ /** Read the workspace a session was started in, without reading the whole log. */
17
+ export function museSessionCwd(head) {
18
+ return head.match(/"cwd":"((?:[^"\\]|\\.)*)"/)?.[1]?.replace(/\\(.)/g, "$1") ?? null;
19
+ }
20
+ /**
21
+ * Meta Muse Code — the `muse` CLI (v1.3.0 verified).
22
+ *
23
+ * Everything below was confirmed against live sessions on 2026-09-22 rather
24
+ * than read out of `--help`, because the two disagree in the places that
25
+ * matter. Three findings shaped this file:
26
+ *
27
+ * 1. The input prompt `❯` stays on screen the entire time muse works, so the
28
+ * ready pattern alone can never say "idle" — hence getBusyPattern().
29
+ * 2. Ctrl+C is QUIT (twice), not cancel. The TUI's own hint is "esc to
30
+ * interrupt", and Escape is what stops a run. Wiring C-c to cancel would
31
+ * have left every instance one stray keypress from death.
32
+ * 3. `--disable-approval` alone still stops at a workspace-trust dialog. It
33
+ * needs `--trust-workspace` beside it to reach the prompt unattended.
34
+ */
35
+ export class MuseBackend {
36
+ instanceDir;
37
+ binaryName = "muse";
38
+ binaryPath;
39
+ // Cached from buildCommand/writeConfig so getSessionId() (which takes no
40
+ // args) can match sessions against this instance's workspace.
41
+ workingDirectory;
42
+ constructor(instanceDir) {
43
+ this.instanceDir = instanceDir;
44
+ this.binaryPath = resolveBinary("muse");
45
+ }
46
+ buildCommand(config) {
47
+ this.workingDirectory = config.workingDirectory;
48
+ // `muse` on PATH is a launcher script that checks for a new release, may
49
+ // replace the binary underneath us, and records an update notice that the
50
+ // next start prints. A fleet agent can run for days; an update arriving
51
+ // mid-run would repaint the pane and swap the CLI. One year in seconds
52
+ // keeps the check quiet while staying inside the launcher's own numeric
53
+ // guard (a non-numeric value also disables it, but undocumented).
54
+ let cmd = `MUSE_UPDATE_INTERVAL_SECONDS=31536000 ${this.binaryPath}`;
55
+ // Verified: `--disable-approval` on its own leaves the session parked on
56
+ // "Do you trust this workspace?" forever. Trust is a separate axis, so both
57
+ // flags are needed to reach the prompt unattended.
58
+ //
59
+ // NOT `--yolo`: that disables approval, trust AND the OS sandbox. The
60
+ // sandbox was measured to permit what an agent actually needs — writes in
61
+ // the workspace and to the temp dir, and outbound network through the proxy
62
+ // (curl to example.com returned 200) — so there is nothing to buy by
63
+ // switching it off, and a sandboxed shell is worth keeping.
64
+ if (config.skipPermissions !== false)
65
+ cmd += " --disable-approval --trust-workspace";
66
+ if (config.model) {
67
+ const model = validateModel(config.model);
68
+ warnIfModelMismatch("muse", model);
69
+ cmd += ` --model ${shellQuote(model)}`;
70
+ }
71
+ // muse accepts none|minimal|low|medium|high|xhigh|max|ultra; AgEnD's levels
72
+ // are a subset, so whatever the fleet holds is passed through unchanged.
73
+ if (config.effort)
74
+ cmd += ` --reasoning-effort ${shellQuote(config.effort)}`;
75
+ // Resume is a SUBCOMMAND, and root options may sit on either side of it
76
+ // (stated in `muse resume --help`, and verified: root flags + `resume <id>`
77
+ // launched into the prior conversation with the model flag applied).
78
+ // `resume --last` is workspace-scoped and would silently adopt a session the
79
+ // user started by hand in the same directory, so we resume the id we
80
+ // persisted and nothing else.
81
+ if (!config.skipResume) {
82
+ const sid = this.storedSessionId();
83
+ if (sid)
84
+ cmd += ` resume ${sid}`;
85
+ }
86
+ return cmd;
87
+ }
88
+ /** The daemon's persisted session id (written from getSessionId()), for resume. */
89
+ storedSessionId() {
90
+ try {
91
+ const sid = readFileSync(join(this.instanceDir, "session-id"), "utf-8").trim();
92
+ return SESSION_ID_RE.test(sid) ? sid : null;
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ /**
99
+ * Per-instance MCP key. Instance names can be CJK (persona channels), and a
100
+ * settings file shared by every instance needs keys that cannot collide, so a
101
+ * non-ASCII name becomes an ASCII slug plus a hash of the original.
102
+ */
103
+ mcpKey(mcpName, instanceName) {
104
+ const ascii = instanceName.replace(/[^\x20-\x7E]/g, "");
105
+ if (ascii === instanceName)
106
+ return `agend-${mcpName}-${instanceName}`;
107
+ const slug = ascii.replace(/[^A-Za-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
108
+ const hash = createHash("md5").update(instanceName).digest("hex").slice(0, 8);
109
+ return slug ? `agend-${mcpName}-${slug}-${hash}` : `agend-${mcpName}-${hash}`;
110
+ }
111
+ /** `$XDG_CONFIG_HOME/muse/settings.json`, else `~/.config/muse/settings.json`. */
112
+ settingsPath() {
113
+ const base = process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
114
+ return join(base, "muse", "settings.json");
115
+ }
116
+ writeConfig(config) {
117
+ this.workingDirectory = config.workingDirectory;
118
+ // Muse reads MCP servers from ONE file — the user-level settings.json. It
119
+ // has no project-level equivalent (checked: `muse init` scaffolds AGENTS.md
120
+ // and nothing else, and the binary documents a single `$CONFIG_DIR` path).
121
+ // So this writes into the user's own settings, which means two rules:
122
+ // every key we did not put there is preserved, and ours are namespaced per
123
+ // instance so instances sharing a machine cannot overwrite each other.
124
+ //
125
+ // Isolating this per instance would mean relocating XDG_CONFIG_HOME, which
126
+ // also moves auth.json — the user's login. Not worth doing blind; left as a
127
+ // follow-up for whoever needs per-instance muse credentials.
128
+ const settingsPath = this.settingsPath();
129
+ let root = {};
130
+ try {
131
+ root = JSON.parse(readFileSync(settingsPath, "utf-8"));
132
+ }
133
+ catch { /* new file */ }
134
+ if (typeof root.schema_version !== "number")
135
+ root.schema_version = 1;
136
+ const servers = (root.mcpServers ?? {});
137
+ // Drop our own stale entries whose wrapper script is gone (deleted instance,
138
+ // cleared instance dir). Never touch a key we did not write.
139
+ for (const [key, val] of Object.entries(servers)) {
140
+ if (!key.startsWith("agend-"))
141
+ continue;
142
+ const cmd = val?.command;
143
+ if (typeof cmd === "string" && !existsSync(cmd))
144
+ delete servers[key];
145
+ }
146
+ for (const [name, entry] of Object.entries(config.mcpServers)) {
147
+ const allEnv = { ...entry.env, AGEND_INSTANCE_NAME: config.instanceName };
148
+ // Same wrapper as grok/kiro. Two jobs: export the env explicitly rather
149
+ // than trusting the CLI to forward the entry's `env` block, and wait for
150
+ // the IPC socket to exist — a server that starts first would fail to
151
+ // connect and every fleet tool (reply/react/…) would be dead for the run.
152
+ const wrapperPath = join(this.instanceDir, `mcp-wrapper-${name}.sh`);
153
+ const envExports = Object.entries(allEnv)
154
+ .map(([k, v]) => `export ${k}='${String(v).replace(/'/g, "'\\''")}'`)
155
+ .join("\n");
156
+ // 0o700: the wrapper inlines sensitive env (tokens, socket paths).
157
+ writeFileSync(wrapperPath, `#!/bin/bash\n${envExports}\n# Wait for IPC socket to be ready (up to 10s)\nfor i in $(seq 1 20); do [ -S "$AGEND_SOCKET_PATH" ] && break; sleep 0.5; done\nexec ${entry.command} ${entry.args.map((a) => JSON.stringify(a)).join(" ")}\n`, { mode: 0o700 });
158
+ chmodSync(wrapperPath, 0o700);
159
+ // Entry shape per muse's own documentation: type/command/args/env/mode.
160
+ // "optional" so a server that fails to start degrades the session instead
161
+ // of stopping it.
162
+ servers[this.mcpKey(name, config.instanceName)] = {
163
+ type: "stdio",
164
+ command: wrapperPath,
165
+ args: [],
166
+ mode: "optional",
167
+ };
168
+ }
169
+ root.mcpServers = servers;
170
+ try {
171
+ mkdirSync(join(settingsPath, ".."), { recursive: true });
172
+ writeFileSync(settingsPath, JSON.stringify(root, null, 2));
173
+ }
174
+ catch { /* best effort — a muse without MCP still starts */ }
175
+ // `muse init` scaffolds AGENTS.md and the binary reads it as project rules,
176
+ // the same convention as codex and grok. Additive + idempotent via marker.
177
+ if (config.instructions) {
178
+ try {
179
+ appendWithMarker(join(config.workingDirectory, "AGENTS.md"), config.instanceName, config.instructions);
180
+ }
181
+ catch { /* best effort */ }
182
+ }
183
+ }
184
+ requiresDeliveryEnterRetry() {
185
+ // Measured, not inferred. An Enter that arrives in the same keystroke burst
186
+ // as the text is taken as a NEWLINE: `tmux send-keys "probe N" Enter`
187
+ // failed to submit three times out of three, and the drafts stacked up in
188
+ // the input box —
189
+ //
190
+ // ❯ probe 1
191
+ // probe 2
192
+ // probe 3
193
+ //
194
+ // The damage is not a lost message but a merged one: the next Enter submits
195
+ // the whole draft as a single turn. The daemon's waitForPasteSettle already
196
+ // opens the gap muse needs (a paste followed by Enter a second later
197
+ // submitted every time, including mid-turn), so this is insurance against
198
+ // the case where the settle wait is blind and falls back to a fixed delay.
199
+ //
200
+ // Safe on every delivery, both preconditions verified live: a bare Enter is
201
+ // a no-op at an empty idle prompt, and a no-op mid-turn with empty input.
202
+ return true;
203
+ }
204
+ getReadyPattern() {
205
+ // The ready screen carries the `Muse Code <version>` header and an empty
206
+ // `❯` input row. Both survive scrollback, which is fine — this pattern only
207
+ // has to say "the TUI is up"; getBusyPattern() is what says "not now".
208
+ return /❯|Muse Code \d/m;
209
+ }
210
+ /**
211
+ * The working line, which is on screen only while muse is generating.
212
+ *
213
+ * Required for the same reason grok and claude-code needed one: the input box
214
+ * (and therefore `❯`) stays visible the whole time muse works, so the ready
215
+ * pattern is effectively constant-true and the instance would never be seen
216
+ * as busy — no hang detection, and a frozen CLI reported as idle.
217
+ *
218
+ * Sampled from a live run. The phase word changes (`Thinking`, `Working`,
219
+ * `Double checking`) and the leading glyph cycles (◇ ◆ ◈), so neither is the
220
+ * anchor. What every working frame has, and no idle frame does, is the
221
+ * interrupt hint muse prints beside the elapsed timer:
222
+ *
223
+ * ◇ Thinking (2s · esc to interrupt)
224
+ * ◆ Double checking (4s · esc to interrupt)
225
+ *
226
+ * Anchoring on the glyph would be wrong in a way that matters: completed
227
+ * output lines start with `◆ ` too (`◆ Panes split the dark screen`), so a
228
+ * glyph-anchored pattern would pin a finished instance in `working` forever.
229
+ */
230
+ getBusyPattern() {
231
+ return /\(\s*\d+(?:\.\d+)?s\s*·\s*esc to interrupt\s*\)/;
232
+ }
233
+ getErrorPatterns() {
234
+ // NOTE: an Escape-interrupted run prints "interrupting run" in the status
235
+ // bar. That is normal user-initiated behaviour, not an error — nothing here
236
+ // matches it, and nothing that does should be added.
237
+ return [
238
+ { pattern: /rate.?limit|too many requests|\b429\b/i, type: "rate_limit", action: "failover", message: "Muse rate limit reached" },
239
+ { pattern: /unauthorized|authentication (failed|error)|\b401\b|muse login/i, type: "auth_error", action: "pause", message: "Muse authentication error" },
240
+ { pattern: /quota|usage limit|out of credits/i, type: "quota", action: "notify", message: "Muse quota exhausted" },
241
+ ];
242
+ }
243
+ getStartupDialogs() {
244
+ return [
245
+ // Workspace trust. `--trust-workspace` normally prevents this from ever
246
+ // appearing; it is still handled because an instance configured with
247
+ // skip_permissions: false gets neither flag and would otherwise hang
248
+ // here forever. Verified layout: a two-row menu, option 1 preselected,
249
+ // "Use Up/Down or 1/2, then Enter."
250
+ {
251
+ pattern: /Do you trust this workspace\?/,
252
+ keys: ["1", "Enter"],
253
+ description: "Muse workspace trust — choose 'Trust and continue'",
254
+ },
255
+ // Login is BLOCKING and cannot be auto-dismissed — the user has to
256
+ // complete it. Empty keys mean the daemon sends nothing but keeps
257
+ // treating the screen as not-ready, so a login page is never mistaken
258
+ // for the idle prompt.
259
+ {
260
+ pattern: /muse login|Log in to (Meta|continue)|device code/i,
261
+ keys: [],
262
+ description: "Muse login — wait for the user to authenticate (no auto-dismiss)",
263
+ },
264
+ ];
265
+ }
266
+ getRuntimeDialogs() {
267
+ return [
268
+ // Net for a tool-approval prompt arriving despite --disable-approval (an
269
+ // enterprise policy can pin approval on). Muse's menus are numbered with
270
+ // the first option preselected, same shape as the trust dialog.
271
+ {
272
+ pattern: /Allow this (tool|command)|Approve this (tool|command)|1\s+(Allow|Approve)/i,
273
+ keys: ["1", "Enter"],
274
+ description: "Muse tool approval — allow",
275
+ },
276
+ ];
277
+ }
278
+ getContextUsage() {
279
+ // Muse reports context only inside `/status` ("98% left · 23.8K used /
280
+ // 1008K"), not on the persistent status bar, so there is nothing a passive
281
+ // reader can see between turns. Returning a stale or invented number would
282
+ // be worse than none.
283
+ return null;
284
+ }
285
+ getSessionId() {
286
+ // Sessions live at ~/.local/share/muse/sessions/<YYYY>/<MM>/<DD>/<uuid>/,
287
+ // filed by date rather than by workspace, so the workspace has to be read
288
+ // out of each session's own log (`route_facts` names the cwd near the top).
289
+ // Returns the most recently ACTIVE session started in this instance's
290
+ // directory, which is what the daemon persists for resume.
291
+ if (!this.workingDirectory)
292
+ return null;
293
+ try {
294
+ const root = join(homedir(), ".local", "share", "muse", "sessions");
295
+ let newestId = null;
296
+ let newestMtime = -1;
297
+ for (const sessionDir of museSessionDirs(root)) {
298
+ const name = sessionDir.slice(sessionDir.lastIndexOf("/") + 1);
299
+ if (!SESSION_ID_RE.test(name))
300
+ continue;
301
+ let head;
302
+ try {
303
+ const fd = readFileSync(join(sessionDir, "session.jsonl"), { encoding: "utf-8", flag: "r" });
304
+ head = fd.slice(0, SESSION_HEAD_BYTES);
305
+ }
306
+ catch {
307
+ continue;
308
+ }
309
+ if (museSessionCwd(head) !== this.workingDirectory)
310
+ continue;
311
+ // Activity = latest inner-file mtime. The directory's own mtime does not
312
+ // move when a log is appended, and is misleadingly recent for a session
313
+ // that was only just created — it must not outrank a resumed older
314
+ // session whose log was written to seconds ago.
315
+ let activity = -1;
316
+ try {
317
+ for (const f of readdirSync(sessionDir)) {
318
+ try {
319
+ const m = statSync(join(sessionDir, f)).mtimeMs;
320
+ if (m > activity)
321
+ activity = m;
322
+ }
323
+ catch { /* skip */ }
324
+ }
325
+ }
326
+ catch { /* unreadable */ }
327
+ if (activity > newestMtime) {
328
+ newestMtime = activity;
329
+ newestId = name;
330
+ }
331
+ }
332
+ return newestId;
333
+ }
334
+ catch {
335
+ return null;
336
+ }
337
+ }
338
+ // `/quit` is muse's own "quit when idle". The key chord is Ctrl+C pressed
339
+ // TWICE ("Press Ctrl-C again to quit") — kept as the fallback, with the count
340
+ // the TUI actually requires.
341
+ getQuitCommand() { return "/quit"; }
342
+ getQuitKey() { return "C-c"; }
343
+ getQuitKeyPresses() { return 2; }
344
+ getCompactCommand() { return "/compact"; }
345
+ getClearCommand() { return "/clear"; }
346
+ /**
347
+ * Escape, not Ctrl+C. Verified both ways on a live session: Escape mid-run
348
+ * put "interrupting run" in the status bar and returned the prompt with the
349
+ * partial answer kept, while Ctrl+C armed the quit confirmation ("Press
350
+ * Ctrl-C again to quit"). Cancelling with C-c would leave every instance one
351
+ * stray keypress from exiting.
352
+ */
353
+ getCancelKey() { return "Escape"; }
354
+ // `/effort` is in the TUI command list, so a level change needs no restart.
355
+ getEffortStrategy() { return "runtime"; }
356
+ // muse also accepts none|minimal|ultra, which AgEnD has no level for; the
357
+ // canonical five map straight through.
358
+ getEffortLevels() { return ["low", "medium", "high", "xhigh", "max"]; }
359
+ // `/model` opens an arrow-key picker, not a one-shot command → restart.
360
+ getModelSwitchStrategy() { return "restart"; }
361
+ async listModels() {
362
+ // muse has no models subcommand (the command table is: resume, exec,
363
+ // config, export, trace, skills, plugins, sandbox, schema, serve,
364
+ // session-message, mcp, auth, login, logout, init). This set was read off
365
+ // the live `/model` picker; the `-contributor` variants are the same models
366
+ // with content sharing enabled, which the picker spells out.
367
+ return [
368
+ { id: "muse-spark-1.3", label: "muse-spark-1.3" },
369
+ { id: "muse-spark-1.3-contributor", label: "muse-spark-1.3-contributor (shares content)" },
370
+ { id: "muse-spark-1.2", label: "muse-spark-1.2" },
371
+ { id: "muse-spark-1.2-contributor", label: "muse-spark-1.2-contributor (shares content)" },
372
+ ];
373
+ }
374
+ async probeCLIEnv() {
375
+ const { probeCliVersion } = await import("./types.js");
376
+ // The selected model is the one thing muse persists where we can read it.
377
+ let currentModel;
378
+ try {
379
+ const settings = JSON.parse(readFileSync(this.settingsPath(), "utf-8"));
380
+ if (typeof settings.model === "string")
381
+ currentModel = settings.model;
382
+ }
383
+ catch { /* best effort */ }
384
+ return { version: probeCliVersion(this.binaryPath), models: await this.listModels(), currentModel };
385
+ }
386
+ cleanup(config) {
387
+ try {
388
+ const settingsPath = this.settingsPath();
389
+ const root = JSON.parse(readFileSync(settingsPath, "utf-8"));
390
+ if (root.mcpServers) {
391
+ for (const name of Object.keys(config.mcpServers)) {
392
+ delete root.mcpServers[this.mcpKey(name, config.instanceName)];
393
+ }
394
+ writeFileSync(settingsPath, JSON.stringify(root, null, 2));
395
+ }
396
+ }
397
+ catch { /* best effort */ }
398
+ try {
399
+ removeMarker(join(config.workingDirectory, "AGENTS.md"), config.instanceName);
400
+ }
401
+ catch { /* best effort */ }
402
+ }
403
+ }
404
+ /** Every `<year>/<month>/<day>/<uuid>` directory under the session store. */
405
+ export function museSessionDirs(root) {
406
+ const out = [];
407
+ const children = (dir) => {
408
+ try {
409
+ return readdirSync(dir);
410
+ }
411
+ catch {
412
+ return [];
413
+ }
414
+ };
415
+ for (const year of children(root)) {
416
+ if (!/^\d{4}$/.test(year))
417
+ continue;
418
+ for (const month of children(join(root, year))) {
419
+ for (const day of children(join(root, year, month))) {
420
+ for (const session of children(join(root, year, month, day))) {
421
+ out.push(join(root, year, month, day, session));
422
+ }
423
+ }
424
+ }
425
+ }
426
+ return out;
427
+ }
428
+ //# sourceMappingURL=muse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muse.js","sourceRoot":"","sources":["../../src/backend/muse.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,8 @@ export interface ErrorPattern {
52
52
  * when the match can't be re-derived. Receives the LAST match in the pane,
53
53
  * i.e. the most recent occurrence. */
54
54
  formatMessage?: (match: RegExpMatchArray) => string;
55
+ /** Run the backend's live quota check before surfacing a quota notice. */
56
+ verifyQuota?: boolean;
55
57
  /** Skip the 5-min per-type notification cooldown so every occurrence notifies
56
58
  * (e.g. Kiro "Response timed out" — each timeout should reach the user). */
57
59
  skipCooldown?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,12 @@ export declare class AccessManager {
4
4
  private statePath;
5
5
  private state;
6
6
  private failedAttempts;
7
+ /**
8
+ * The mode that came out of the state file, or undefined when the file had
9
+ * none. Kept separately because the constructor fills `state.mode` in from
10
+ * the config when the file is silent, after which the two are indistinguishable.
11
+ */
12
+ private persistedMode?;
7
13
  constructor(config: AccessConfig, statePath: string);
8
14
  private persist;
9
15
  private pruneExpired;
@@ -13,6 +19,20 @@ export declare class AccessManager {
13
19
  confirmCode(code: string, callerUserId?: string): boolean;
14
20
  setMode(mode: "pairing" | "locked" | "open"): void;
15
21
  getMode(): "pairing" | "locked" | "open";
22
+ /**
23
+ * The configured mode that the state file is overriding, or null when they
24
+ * agree or nothing was persisted.
25
+ *
26
+ * State wins on purpose — a pairing that happened at runtime must survive a
27
+ * fleet restart — but the first `persist()` freezes whatever the mode was at
28
+ * the time, and from then on editing `access.mode` in fleet.yaml changes
29
+ * nothing. Without this, that reads as "my config edit did nothing" with no
30
+ * way to find out why.
31
+ *
32
+ * Reported rather than logged from here: the CLI also builds an AccessManager
33
+ * with a synthetic config, where a mismatch means nothing.
34
+ */
35
+ overriddenConfigMode(): "pairing" | "locked" | "open" | null;
16
36
  getAllowedUsers(): (number | string)[];
17
37
  removeUser(userId: number | string): boolean;
18
38
  }
@@ -5,6 +5,12 @@ export class AccessManager {
5
5
  statePath;
6
6
  state;
7
7
  failedAttempts = new Map();
8
+ /**
9
+ * The mode that came out of the state file, or undefined when the file had
10
+ * none. Kept separately because the constructor fills `state.mode` in from
11
+ * the config when the file is silent, after which the two are indistinguishable.
12
+ */
13
+ persistedMode;
8
14
  constructor(config, statePath) {
9
15
  this.config = config;
10
16
  this.statePath = statePath;
@@ -13,6 +19,7 @@ export class AccessManager {
13
19
  try {
14
20
  const raw = readFileSync(statePath, "utf8");
15
21
  const saved = JSON.parse(raw);
22
+ this.persistedMode = saved.mode;
16
23
  this.state = {
17
24
  mode: saved.mode,
18
25
  allowed_users: saved.allowed_users ?? [],
@@ -138,6 +145,24 @@ export class AccessManager {
138
145
  getMode() {
139
146
  return this.state.mode ?? this.config.mode;
140
147
  }
148
+ /**
149
+ * The configured mode that the state file is overriding, or null when they
150
+ * agree or nothing was persisted.
151
+ *
152
+ * State wins on purpose — a pairing that happened at runtime must survive a
153
+ * fleet restart — but the first `persist()` freezes whatever the mode was at
154
+ * the time, and from then on editing `access.mode` in fleet.yaml changes
155
+ * nothing. Without this, that reads as "my config edit did nothing" with no
156
+ * way to find out why.
157
+ *
158
+ * Reported rather than logged from here: the CLI also builds an AccessManager
159
+ * with a synthetic config, where a mismatch means nothing.
160
+ */
161
+ overriddenConfigMode() {
162
+ if (this.persistedMode === undefined)
163
+ return null;
164
+ return this.persistedMode === this.config.mode ? null : this.config.mode;
165
+ }
141
166
  getAllowedUsers() {
142
167
  return [...this.state.allowed_users];
143
168
  }
@@ -1 +1 @@
1
- {"version":3,"file":"access-manager.js","sourceRoot":"","sources":["../../src/channel/access-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"access-manager.js","sourceRoot":"","sources":["../../src/channel/access-manager.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,9 @@ export declare const DISCORD_START_BACKEND_CHOICES: readonly [{
21
21
  }, {
22
22
  readonly name: "Grok Build";
23
23
  readonly value: "grok";
24
+ }, {
25
+ readonly name: "Meta Muse Code";
26
+ readonly value: "muse";
24
27
  }];
25
28
  export interface DiscordAdapterOptions {
26
29
  id: string;