agent-yes 1.231.0 → 1.232.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/{SUPPORTED_CLIS-Cj00WOEz.js → SUPPORTED_CLIS-BP1BBtWO.js} +3 -3
  2. package/dist/{SUPPORTED_CLIS-BS2hYjrW.js → SUPPORTED_CLIS-D6J7QvLL.js} +2 -2
  3. package/dist/{agentShare-BBLXfmbU.js → agentShare-CDMFg0Rj.js} +2 -2
  4. package/dist/{callback-B8Bx8c-9.js → callback-B1kcLI1k.js} +3 -3
  5. package/dist/{callback-beueK8jU.js → callback-sBpq-n_6.js} +2 -2
  6. package/dist/{channels-mAf4ztTJ.js → channels-Boi4aNiY.js} +24 -6
  7. package/dist/{channels-CUOl2wrG.js → channels-Bu4DZzHk.js} +15 -2
  8. package/dist/channels.js +19 -3
  9. package/dist/cli.js +4 -4
  10. package/dist/index.js +2 -2
  11. package/dist/{notifyDaemon-CJfxTj46.js → notifyDaemon-BNCj9i2N.js} +2 -2
  12. package/dist/{rustBinary-d4ZUStzi.js → rustBinary-D8_DgkiI.js} +2 -2
  13. package/dist/{schedule-B4v3unjv.js → schedule-BVVQtiaS.js} +4 -4
  14. package/dist/{serve-Bf8JJcJG.js → serve-Bv_twI1k.js} +13 -13
  15. package/dist/{setup-Cth_2Kor.js → setup-BmoiDPZn.js} +2 -2
  16. package/dist/{subcommands-CFg6By2s.js → subcommands-CFC5HMmx.js} +1 -1
  17. package/dist/{subcommands-t140aQXd.js → subcommands-CXCoOuN6.js} +9 -9
  18. package/dist/{ts-BDMKe8RP.js → ts-Bb3CeS6-.js} +2 -2
  19. package/dist/{versionChecker-Bhv8OZAY.js → versionChecker-SHk3Fuvm.js} +2 -2
  20. package/dist/{ws-6kyIFJHL.js → ws-DDYVVQwl.js} +2 -2
  21. package/package.json +3 -1
  22. package/ts/channels/browser.ts +287 -0
  23. package/ts/channels/hlc.ts +67 -0
  24. package/ts/channels/index.ts +10 -0
  25. package/ts/channels/link.ts +103 -0
  26. package/ts/channels/op.ts +89 -0
  27. package/ts/channels/peer.ts +468 -0
  28. package/ts/channels/store.browser.ts +42 -0
  29. package/ts/channels/store.node.ts +72 -0
  30. package/ts/channels/store.ts +170 -0
  31. package/ts/channels.spec.ts +23 -0
  32. package/ts/channels.ts +50 -2
@@ -1,11 +1,11 @@
1
- import "./ts-BDMKe8RP.js";
1
+ import "./ts-Bb3CeS6-.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-Bhv8OZAY.js";
3
+ import "./versionChecker-SHk3Fuvm.js";
4
4
  import "./todoAutomation-x6guaQXc.js";
5
5
  import "./JsonlStore-CWOA3aDH.js";
6
6
  import "./globalPidIndex-Ca4sTr1b.js";
7
7
  import "./pidStore-Hjba3K6Q.js";
8
8
  import "./messageLog-zVGWLX7w.js";
9
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-BS2hYjrW.js";
9
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-D6J7QvLL.js";
10
10
 
11
11
  export { SUPPORTED_CLIS };
@@ -1,8 +1,8 @@
1
- import { t as CLIS_CONFIG } from "./ts-BDMKe8RP.js";
1
+ import { t as CLIS_CONFIG } from "./ts-Bb3CeS6-.js";
2
2
 
3
3
  //#region ts/SUPPORTED_CLIS.ts
4
4
  const SUPPORTED_CLIS = Object.keys(CLIS_CONFIG);
5
5
 
6
6
  //#endregion
7
7
  export { SUPPORTED_CLIS as t };
8
- //# sourceMappingURL=SUPPORTED_CLIS-BS2hYjrW.js.map
8
+ //# sourceMappingURL=SUPPORTED_CLIS-D6J7QvLL.js.map
@@ -3,7 +3,7 @@ import "./globalPidIndex-Ca4sTr1b.js";
3
3
  import "./messageLog-zVGWLX7w.js";
4
4
  import "./e2e-CYlKpfxa.js";
5
5
  import "./configShared-BXz2vi4Q.js";
6
- import { N as resolveOne } from "./subcommands-t140aQXd.js";
6
+ import { N as resolveOne } from "./subcommands-CXCoOuN6.js";
7
7
  import "./webrtcLink-CEYNs0pt.js";
8
8
  import "./remotes-BM3Zm8Wh.js";
9
9
  import { a as startShare } from "./share-D4K0JnHg.js";
@@ -229,4 +229,4 @@ function transformEvent(rawEvent, agentId, forwarded) {
229
229
 
230
230
  //#endregion
231
231
  export { createScopedShare, listShares, revokeAllShares, revokeShare };
232
- //# sourceMappingURL=agentShare-BBLXfmbU.js.map
232
+ //# sourceMappingURL=agentShare-CDMFg0Rj.js.map
@@ -1,5 +1,5 @@
1
1
  import { t as agentYesHome } from "./agentYesHome-CtHb5b71.js";
2
- import { N as resolveOne } from "./subcommands-t140aQXd.js";
2
+ import { N as resolveOne } from "./subcommands-CXCoOuN6.js";
3
3
  import { a as mintCapability, o as parseExpires } from "./callbackCore-Me97qn68.js";
4
4
  import { randomBytes } from "node:crypto";
5
5
  import { mkdir, readFile, writeFile } from "node:fs/promises";
@@ -72,7 +72,7 @@ async function resolveBase(flag) {
72
72
  if (flag) return flag;
73
73
  if (process.env.AGENT_YES_CALLBACK_BASE) return process.env.AGENT_YES_CALLBACK_BASE;
74
74
  try {
75
- const { resolveLocalServeUrl } = await import("./serve-Bf8JJcJG.js");
75
+ const { resolveLocalServeUrl } = await import("./serve-Bv_twI1k.js");
76
76
  const url = await resolveLocalServeUrl();
77
77
  if (url) return url;
78
78
  } catch {}
@@ -187,4 +187,4 @@ async function cmdCallback(rest) {
187
187
 
188
188
  //#endregion
189
189
  export { loadOrCreateCallbackSecret as i, isCallbackRevoked as n, loadCallbackSecretReadOnly as r, cmdCallback as t };
190
- //# sourceMappingURL=callback-B8Bx8c-9.js.map
190
+ //# sourceMappingURL=callback-B1kcLI1k.js.map
@@ -3,10 +3,10 @@ import "./globalPidIndex-Ca4sTr1b.js";
3
3
  import "./messageLog-zVGWLX7w.js";
4
4
  import "./e2e-CYlKpfxa.js";
5
5
  import "./configShared-BXz2vi4Q.js";
6
- import "./subcommands-t140aQXd.js";
6
+ import "./subcommands-CXCoOuN6.js";
7
7
  import "./webrtcLink-CEYNs0pt.js";
8
8
  import "./remotes-BM3Zm8Wh.js";
9
9
  import "./callbackCore-Me97qn68.js";
10
- import { i as loadOrCreateCallbackSecret, n as isCallbackRevoked, r as loadCallbackSecretReadOnly, t as cmdCallback } from "./callback-B8Bx8c-9.js";
10
+ import { i as loadOrCreateCallbackSecret, n as isCallbackRevoked, r as loadCallbackSecretReadOnly, t as cmdCallback } from "./callback-B1kcLI1k.js";
11
11
 
12
12
  export { cmdCallback };
@@ -1,5 +1,5 @@
1
1
  import "./e2e-CYlKpfxa.js";
2
- import { a as formatChannelWebLink, i as formatChannelLink, n as deriveChannelId, o as isChannelLink, r as deriveRoom, s as parseChannelLink } from "./channels-CUOl2wrG.js";
2
+ import { a as formatChannelWebLink, c as secretFromTopic, i as formatChannelLink, n as deriveChannelId, o as isChannelLink, r as deriveRoom, s as parseChannelLink } from "./channels-Bu4DZzHk.js";
3
3
  import { a as renderThread, c as makeOp, f as hlcSend, n as maxHlc, o as sortOps, r as mergeOps, s as isValidOp } from "./store-Ba3SsoOx.js";
4
4
  import { appendFile, chmod, mkdir, readFile, rm, writeFile } from "fs/promises";
5
5
  import os from "os";
@@ -180,13 +180,14 @@ async function cmdChMk(cwd, args) {
180
180
  sighost: "value",
181
181
  name: "value",
182
182
  role: "value",
183
- salt: "value"
183
+ salt: "value",
184
+ topic: "value"
184
185
  });
185
186
  const topic = positional[0];
186
- if (!topic || positional.length > 1) throw new Error("usage: ay ch mk <topic> [--sighost H] [--name N] [--role R] [--salt HEX]");
187
+ if (!topic || positional.length > 1) throw new Error("usage: ay ch mk <name> [--topic <string>] [--sighost H] [--name N] [--role R] [--salt HEX]");
187
188
  const reg = await readRegistry(cwd);
188
189
  if (reg.channels[topic]) throw new Error(`channel "${topic}" already exists (ay ch rm ${topic} to replace)`);
189
- const s = typeof flags.salt === "string" ? flags.salt : randomBytes(32).toString("hex");
190
+ const s = typeof flags.topic === "string" ? await secretFromTopic(flags.topic) : typeof flags.salt === "string" ? flags.salt : randomBytes(32).toString("hex");
190
191
  const [channelId, room] = await Promise.all([deriveChannelId(s), deriveRoom(s)]);
191
192
  const entry = {
192
193
  topic,
@@ -481,8 +482,24 @@ async function cmdChEmbed(cwd, args) {
481
482
  process.stdout.write(`<!-- ay channel: ${topic} — anyone who can read this snippet can join -->\n<script type="module">\n import AyChannel from "https://${consoleHost}/w/channels.js";\n new AyChannel(${JSON.stringify(link)}).mount();\n<\/script>\n`);
482
483
  return 0;
483
484
  }
485
+ /** The page bookmarklet: derive a channel from the page URL and mount the widget. */
486
+ function buildBookmarklet(host, sighost) {
487
+ return `javascript:(async()=>{try{const{AyChannel}=await import('https://${host}/w/channels.js');const t=prompt('ay channel — topic (same topic = same room):',location.href);if(!t)return;let n=localStorage.getItem('ay29ch-name');if(!n){n=prompt('Your name:','guest')||'guest';localStorage.setItem('ay29ch-name',n);}const ch=await AyChannel.fromTopic(t,{sighost:'${sighost}',name:n});ch.mount(document.body,{open:true});}catch(e){alert('ay channel could not load — this page\\'s CSP may block it (works on your own apps, localhost, blogs, docs).\\n'+(e&&e.message||e));}})()`;
488
+ }
489
+ async function cmdChBookmarklet(_cwd, args) {
490
+ const { flags, positional } = parseFlags(args, {
491
+ host: "value",
492
+ sighost: "value"
493
+ });
494
+ if (positional.length) throw new Error("usage: ay ch bookmarklet [--host H] [--sighost H]");
495
+ const host = typeof flags.host === "string" ? flags.host : "agent-yes.com";
496
+ const sighost = typeof flags.sighost === "string" ? flags.sighost : "s.agent-yes.com";
497
+ process.stdout.write(buildBookmarklet(host, sighost) + "\n");
498
+ process.stderr.write("\n Make a new bookmark and paste the line above as its URL. Click it on any\n page to drop an ay-channel chat window joined to that page's URL (edit the\n prompt to change the topic). Same topic = same room, no invite needed.\n Heads-up: strict site CSP (GitHub/Google/…) blocks it; it works on your own\n apps, localhost, blogs, and docs.\n");
499
+ return 0;
500
+ }
484
501
  function chHelp() {
485
- process.stdout.write("ay ch - local-first E2E channels for AI ↔ humans (per-cwd, no server storage)\n\n ay ch mk <topic> [--name N] [--role R] create a channel, print an invite link\n ay ch join <link> [--as <topic>] join a channel from an invite link\n ay ch ls [--json] list channels in this project (+message counts)\n ay ch rm <topic> delete the local replica (peers unaffected)\n ay ch send <topic> <text…> post a message\n ay ch read <topic> [-n N] [--json] print the thread (last N)\n ay ch head <topic> [-n N] first N messages\n ay ch tail <topic> [-n N] [-f] last N (96), -f to follow\n ay ch sync <topic> [--quiet] hold the WebRTC mesh: live send/receive (Ctrl-C to stop)\n ay ch pipe <topic> sync + bridge stdin→send and inbound→stdout\n ay ch embed <topic> [--host H] print an HTML snippet embedding a floating chat widget\n\n identity: --name defaults to $AY_CH_NAME/OS user; --role to agent (in an agent) or human\n storage: <cwd>/.agent-yes/ch-<id>.jsonl (a full CRDT replica; cwd-scoped)\n live: run 'ay ch sync <topic>' (foreground/backgrounded) to join the mesh; then\n 'ay ch send/tail' compose with it through the shared replica file — no daemon\n");
502
+ process.stdout.write("ay ch - local-first E2E channels for AI ↔ humans (per-cwd, no server storage)\n\n ay ch mk <topic> [--name N] [--role R] create a channel, print an invite link\n ay ch join <link> [--as <topic>] join a channel from an invite link\n ay ch ls [--json] list channels in this project (+message counts)\n ay ch rm <topic> delete the local replica (peers unaffected)\n ay ch send <topic> <text…> post a message\n ay ch read <topic> [-n N] [--json] print the thread (last N)\n ay ch head <topic> [-n N] first N messages\n ay ch tail <topic> [-n N] [-f] last N (96), -f to follow\n ay ch sync <topic> [--quiet] hold the WebRTC mesh: live send/receive (Ctrl-C to stop)\n ay ch pipe <topic> sync + bridge stdin→send and inbound→stdout\n ay ch embed <topic> [--host H] print an HTML snippet embedding a floating chat widget\n ay ch bookmarklet [--host H] print a bookmarklet: any page joins a channel by its URL\n\n URL-topic: 'ay ch mk <name> --topic <string>' derives the SAME channel a\n bookmarklet on that URL joins (topic = public membership)\n identity: --name defaults to $AY_CH_NAME/OS user; --role to agent (in an agent) or human\n storage: <cwd>/.agent-yes/ch-<id>.jsonl (a full CRDT replica; cwd-scoped)\n live: run 'ay ch sync <topic>' (foreground/backgrounded) to join the mesh; then\n 'ay ch send/tail' compose with it through the shared replica file — no daemon\n");
486
503
  return 0;
487
504
  }
488
505
  /** `ay ch <sub> …` dispatcher (called from runSubcommand). */
@@ -506,6 +523,7 @@ async function cmdCh(args) {
506
523
  case "sync": return cmdChSync(cwd, rest);
507
524
  case "pipe": return cmdChPipe(cwd, rest);
508
525
  case "embed": return cmdChEmbed(cwd, rest);
526
+ case "bookmarklet": return cmdChBookmarklet(cwd, rest);
509
527
  case void 0:
510
528
  case "help":
511
529
  case "--help":
@@ -519,4 +537,4 @@ async function cmdCh(args) {
519
537
 
520
538
  //#endregion
521
539
  export { cmdCh };
522
- //# sourceMappingURL=channels-mAf4ztTJ.js.map
540
+ //# sourceMappingURL=channels-Boi4aNiY.js.map
@@ -19,6 +19,19 @@ async function deriveChannelId(s) {
19
19
  async function deriveRoom(s) {
20
20
  return "c" + (await sha256Hex(`ay/ch/room\n${validateS(s)}`)).slice(0, 12);
21
21
  }
22
+ /**
23
+ * Deterministic channel secret from a public topic string (e.g. a page URL) —
24
+ * `sha256("ay/ch/topic/v1\n" + topic)`, a full 64-hex S. Everyone who derives
25
+ * from the SAME topic gets the SAME channel, so a page can "join by its URL" with
26
+ * no invite exchange (the bookmarklet + `ay ch mk --topic`).
27
+ *
28
+ * SECURITY: this makes the channel PUBLIC to anyone who knows the topic (topic =
29
+ * membership). Message contents still stay E2E from the signaling server, but it
30
+ * is NOT a private channel — use a random secret (the default) for those.
31
+ */
32
+ async function secretFromTopic(topic) {
33
+ return sha256Hex(`ay/ch/topic/v1\n${topic}`);
34
+ }
22
35
  /** True if `str` looks like a channel invite link. */
23
36
  function isChannelLink(str) {
24
37
  return str.startsWith("ay://ch/") || /^https?:\/\//.test(str) && str.includes("#ch=");
@@ -70,5 +83,5 @@ function parseChannelLink(link) {
70
83
  }
71
84
 
72
85
  //#endregion
73
- export { formatChannelWebLink as a, formatChannelLink as i, deriveChannelId as n, isChannelLink as o, deriveRoom as r, parseChannelLink as s, CH_DEFAULT_SIGHOST as t };
74
- //# sourceMappingURL=channels-CUOl2wrG.js.map
86
+ export { formatChannelWebLink as a, secretFromTopic as c, formatChannelLink as i, deriveChannelId as n, isChannelLink as o, deriveRoom as r, parseChannelLink as s, CH_DEFAULT_SIGHOST as t };
87
+ //# sourceMappingURL=channels-Bu4DZzHk.js.map
package/dist/channels.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { d as randomHex } from "./e2e-CYlKpfxa.js";
2
- import { a as formatChannelWebLink, i as formatChannelLink, n as deriveChannelId, o as isChannelLink, r as deriveRoom, s as parseChannelLink, t as CH_DEFAULT_SIGHOST } from "./channels-CUOl2wrG.js";
2
+ import { a as formatChannelWebLink, c as secretFromTopic, i as formatChannelLink, n as deriveChannelId, o as isChannelLink, r as deriveRoom, s as parseChannelLink, t as CH_DEFAULT_SIGHOST } from "./channels-Bu4DZzHk.js";
3
3
  import { a as renderThread, c as makeOp, d as formatHlc, f as hlcSend, i as opsMissing, l as opId, n as maxHlc, o as sortOps, p as parseHlc, r as mergeOps, s as isValidOp, t as haveVector, u as compareHlc } from "./store-Ba3SsoOx.js";
4
4
  import { t as ChannelPeer } from "./peer-Cdzjr8Jd.js";
5
5
 
@@ -33,7 +33,7 @@ var LocalStorageStore = class {
33
33
 
34
34
  //#endregion
35
35
  //#region ts/channels/browser.ts
36
- var AyChannel = class {
36
+ var AyChannel = class AyChannel {
37
37
  room;
38
38
  sighost;
39
39
  s;
@@ -46,6 +46,22 @@ var AyChannel = class {
46
46
  listeners = /* @__PURE__ */ new Map();
47
47
  started = false;
48
48
  peers = 0;
49
+ /**
50
+ * Build a channel whose identity is DERIVED from a topic string (e.g. the page
51
+ * URL) — same topic ⇒ same room, no invite needed. Public to anyone with the
52
+ * topic (see secretFromTopic). This is what the page bookmarklet uses.
53
+ */
54
+ static async fromTopic(topic, opts) {
55
+ const s = await secretFromTopic(topic);
56
+ const sighost = opts?.sighost ?? "s.agent-yes.com";
57
+ return new AyChannel({
58
+ room: await deriveRoom(s),
59
+ sighost,
60
+ s,
61
+ name: opts?.name,
62
+ role: opts?.role
63
+ });
64
+ }
49
65
  constructor(info) {
50
66
  const o = typeof info === "string" ? { link: info } : info;
51
67
  const link = o.link ? parseChannelLink(o.link) : null;
@@ -235,5 +251,5 @@ const WIDGET_HTML = `
235
251
  `;
236
252
 
237
253
  //#endregion
238
- export { AyChannel, AyChannel as default, CH_DEFAULT_SIGHOST, compareHlc, deriveChannelId, deriveRoom, formatChannelLink, formatChannelWebLink, formatHlc, haveVector, hlcSend, isChannelLink, isValidOp, makeOp, maxHlc, mergeOps, opId, opsMissing, parseChannelLink, parseHlc, renderThread, sortOps };
254
+ export { AyChannel, AyChannel as default, CH_DEFAULT_SIGHOST, compareHlc, deriveChannelId, deriveRoom, formatChannelLink, formatChannelWebLink, formatHlc, haveVector, hlcSend, isChannelLink, isValidOp, makeOp, maxHlc, mergeOps, opId, opsMissing, parseChannelLink, parseHlc, renderThread, secretFromTopic, sortOps };
239
255
  //# sourceMappingURL=channels.js.map
package/dist/cli.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env bun
2
2
  import { t as invokedCliName } from "./invokedCli-uqM2YYA7.js";
3
3
  import { n as logger } from "./logger-CDIsZ-Pp.js";
4
- import { i as versionString, n as displayVersion, t as checkAndAutoUpdate } from "./versionChecker-Bhv8OZAY.js";
5
- import { n as getRustBinary } from "./rustBinary-d4ZUStzi.js";
4
+ import { i as versionString, n as displayVersion, t as checkAndAutoUpdate } from "./versionChecker-SHk3Fuvm.js";
5
+ import { n as getRustBinary } from "./rustBinary-D8_DgkiI.js";
6
6
  import { argv } from "process";
7
7
  import { spawn } from "child_process";
8
8
  import ms from "ms";
@@ -285,7 +285,7 @@ function buildRustArgs(argv, cliFromScript, supportedClis) {
285
285
  const rawArg = process.argv[2];
286
286
  const managerCommands = !invokedCliName(process.argv);
287
287
  const isHelpFlag = rawArg === "-h" || rawArg === "--help";
288
- const { isSubcommand, runSubcommand, cmdHelp } = await import("./subcommands-CFg6By2s.js");
288
+ const { isSubcommand, runSubcommand, cmdHelp } = await import("./subcommands-CFC5HMmx.js");
289
289
  if (isHelpFlag && process.argv.length === 3) {
290
290
  await cmdHelp(managerCommands);
291
291
  process.exit(0);
@@ -331,7 +331,7 @@ if (config.useRust) {
331
331
  }
332
332
  }
333
333
  if (rustBinary) {
334
- const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-Cj00WOEz.js");
334
+ const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-BP1BBtWO.js");
335
335
  const rustArgs = buildRustArgs(process.argv, config.cli, SUPPORTED_CLIS);
336
336
  if (config.verbose) {
337
337
  console.log(`[rust] Using binary: ${rustBinary}`);
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { a as hasTodoStore, c as AgentContext, i as answerAsk, n as agentYes, o as listAsks, r as config, s as listAsksForProject, t as CLIS_CONFIG } from "./ts-BDMKe8RP.js";
1
+ import { a as hasTodoStore, c as AgentContext, i as answerAsk, n as agentYes, o as listAsks, r as config, s as listAsksForProject, t as CLIS_CONFIG } from "./ts-Bb3CeS6-.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-Bhv8OZAY.js";
3
+ import "./versionChecker-SHk3Fuvm.js";
4
4
  import { _ as isKnownKind, a as renderTree, b as statesOf, c as monitorHint, d as openStore, f as DONE_STATE, g as initialState, h as canTransition, i as renderDigest, l as CycleError, m as ORPHANED_STATE, o as unblockedTasks, p as LIFECYCLES, r as openBlockers, s as describeBlock, t as reconcileTodos, u as TodoStore, v as nextStates, x as removeControlCharacters, y as requiredGate } from "./todoAutomation-x6guaQXc.js";
5
5
  import "./JsonlStore-CWOA3aDH.js";
6
6
  import "./globalPidIndex-Ca4sTr1b.js";
@@ -3,7 +3,7 @@ import "./globalPidIndex-Ca4sTr1b.js";
3
3
  import "./messageLog-zVGWLX7w.js";
4
4
  import "./e2e-CYlKpfxa.js";
5
5
  import "./configShared-BXz2vi4Q.js";
6
- import { $ as daemonLockDir, A as renderLogTailLines, G as appendEvent, K as gcInboxes, Q as shouldStealLock, S as listRecords, X as liveWatchers, Y as listInboxParents, Z as readInbox, _ as isPidAlive, c as deriveLiveState, et as daemonLockOwnerPath, q as hostId, tt as notifyDir } from "./subcommands-t140aQXd.js";
6
+ import { $ as daemonLockDir, A as renderLogTailLines, G as appendEvent, K as gcInboxes, Q as shouldStealLock, S as listRecords, X as liveWatchers, Y as listInboxParents, Z as readInbox, _ as isPidAlive, c as deriveLiveState, et as daemonLockOwnerPath, q as hostId, tt as notifyDir } from "./subcommands-CXCoOuN6.js";
7
7
  import "./webrtcLink-CEYNs0pt.js";
8
8
  import "./remotes-BM3Zm8Wh.js";
9
9
  import { mkdir, readFile, rename, rm, stat, writeFile } from "fs/promises";
@@ -589,4 +589,4 @@ async function ensureDaemon() {
589
589
 
590
590
  //#endregion
591
591
  export { daemonStatus, ensureDaemon, requestDaemonStop, runDaemon };
592
- //# sourceMappingURL=notifyDaemon-CJfxTj46.js.map
592
+ //# sourceMappingURL=notifyDaemon-BNCj9i2N.js.map
@@ -1,4 +1,4 @@
1
- import { r as getInstalledPackage } from "./versionChecker-Bhv8OZAY.js";
1
+ import { r as getInstalledPackage } from "./versionChecker-SHk3Fuvm.js";
2
2
  import { execFileSync } from "child_process";
3
3
  import { existsSync, mkdirSync, unlinkSync } from "fs";
4
4
  import { chmod, copyFile } from "fs/promises";
@@ -225,4 +225,4 @@ async function getRustBinary(options = {}) {
225
225
 
226
226
  //#endregion
227
227
  export { getRustBinary as n, findSpawnHiddenLauncher as t };
228
- //# sourceMappingURL=rustBinary-d4ZUStzi.js.map
228
+ //# sourceMappingURL=rustBinary-D8_DgkiI.js.map
@@ -1,12 +1,12 @@
1
- import "./ts-BDMKe8RP.js";
1
+ import "./ts-Bb3CeS6-.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-Bhv8OZAY.js";
3
+ import "./versionChecker-SHk3Fuvm.js";
4
4
  import "./todoAutomation-x6guaQXc.js";
5
5
  import "./JsonlStore-CWOA3aDH.js";
6
6
  import "./globalPidIndex-Ca4sTr1b.js";
7
7
  import "./pidStore-Hjba3K6Q.js";
8
8
  import "./messageLog-zVGWLX7w.js";
9
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-BS2hYjrW.js";
9
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-D6J7QvLL.js";
10
10
  import { d as resolveSpawnCwd } from "./workspaceConfig-DWLYPDdx.js";
11
11
  import { n as liveEnv, t as ensureNodeRuntime } from "./nodeRuntime-BF_kAOwO.js";
12
12
  import { createHash } from "node:crypto";
@@ -153,4 +153,4 @@ async function cmdSchedule(rest) {
153
153
 
154
154
  //#endregion
155
155
  export { cmdSchedule };
156
- //# sourceMappingURL=schedule-B4v3unjv.js.map
156
+ //# sourceMappingURL=schedule-BVVQtiaS.js.map
@@ -1,7 +1,7 @@
1
- import { i as answerAsk, l as CLAUDE_SESSION_PIN_ENV, o as listAsks } from "./ts-BDMKe8RP.js";
1
+ import { i as answerAsk, l as CLAUDE_SESSION_PIN_ENV, o as listAsks } from "./ts-Bb3CeS6-.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import { r as getInstalledPackage } from "./versionChecker-Bhv8OZAY.js";
4
- import { t as findSpawnHiddenLauncher } from "./rustBinary-d4ZUStzi.js";
3
+ import { r as getInstalledPackage } from "./versionChecker-SHk3Fuvm.js";
4
+ import { t as findSpawnHiddenLauncher } from "./rustBinary-D8_DgkiI.js";
5
5
  import { t as agentYesHome$1 } from "./agentYesHome-CtHb5b71.js";
6
6
  import { x as removeControlCharacters } from "./todoAutomation-x6guaQXc.js";
7
7
  import "./JsonlStore-CWOA3aDH.js";
@@ -11,12 +11,12 @@ import { r as recordInbox } from "./messageLog-zVGWLX7w.js";
11
11
  import { t as pgidForWrapper } from "./reaper-iQXyufgp.js";
12
12
  import "./e2e-CYlKpfxa.js";
13
13
  import "./configShared-BXz2vi4Q.js";
14
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-BS2hYjrW.js";
15
- import { A as renderLogTailLines, D as readPtysize, E as readNotes, J as isTransientLockMkdirError, M as renderRawLogLines, N as resolveOne, O as recentMessageEdges, R as snapshotStatus, S as listRecords, W as writeToIpc, b as isUserTyping, f as extractNeedsInput, j as renderRawLog, k as recentReadEdges, l as deriveLiveStatus, nt as TYPING_BADGE, o as controlCodeFromName, p as extractTaskCounts, u as extractBadges } from "./subcommands-t140aQXd.js";
14
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-D6J7QvLL.js";
15
+ import { A as renderLogTailLines, D as readPtysize, E as readNotes, J as isTransientLockMkdirError, M as renderRawLogLines, N as resolveOne, O as recentMessageEdges, R as snapshotStatus, S as listRecords, W as writeToIpc, b as isUserTyping, f as extractNeedsInput, j as renderRawLog, k as recentReadEdges, l as deriveLiveStatus, nt as TYPING_BADGE, o as controlCodeFromName, p as extractTaskCounts, u as extractBadges } from "./subcommands-CXCoOuN6.js";
16
16
  import "./webrtcLink-CEYNs0pt.js";
17
17
  import "./remotes-BM3Zm8Wh.js";
18
18
  import { i as frameVisitorMessage, s as verifyCapability, t as MAX_CALLBACK_MSG_BYTES } from "./callbackCore-Me97qn68.js";
19
- import { n as isCallbackRevoked, r as loadCallbackSecretReadOnly } from "./callback-B8Bx8c-9.js";
19
+ import { n as isCallbackRevoked, r as loadCallbackSecretReadOnly } from "./callback-B1kcLI1k.js";
20
20
  import { a as getSpawnHook, c as hasProvisionHook, d as resolveSpawnCwd, i as getProvisionRoot, l as hasSpawnHook, r as getProvisionHook, u as isProvisionAllowed } from "./workspaceConfig-DWLYPDdx.js";
21
21
  import { n as liveEnv, t as ensureNodeRuntime } from "./nodeRuntime-BF_kAOwO.js";
22
22
  import { r as spawnRejectionReason } from "./spawnGate-CRMR19Ql.js";
@@ -2038,7 +2038,7 @@ Options:
2038
2038
  }
2039
2039
  });
2040
2040
  if (req.method === "GET" && p === "/api/ws") {
2041
- const ws = await import("./ws-6kyIFJHL.js");
2041
+ const ws = await import("./ws-DDYVVQwl.js");
2042
2042
  try {
2043
2043
  await ws.loadProvision();
2044
2044
  } catch (e) {
@@ -2058,7 +2058,7 @@ Options:
2058
2058
  if (req.method === "GET" && p === "/api/ws/status") {
2059
2059
  const dirRaw = url.searchParams.get("path");
2060
2060
  if (!dirRaw) return new Response("missing ?path=<workspace dir>", { status: 400 });
2061
- const ws = await import("./ws-6kyIFJHL.js");
2061
+ const ws = await import("./ws-DDYVVQwl.js");
2062
2062
  let prov;
2063
2063
  try {
2064
2064
  prov = await ws.loadProvision();
@@ -2647,7 +2647,7 @@ Options:
2647
2647
  const perm = body.perm ?? "r";
2648
2648
  if (perm !== "r" && perm !== "rw") return new Response(`invalid perm ${perm} (want r or rw)`, { status: 400 });
2649
2649
  try {
2650
- const { createScopedShare } = await import("./agentShare-BBLXfmbU.js");
2650
+ const { createScopedShare } = await import("./agentShare-CDMFg0Rj.js");
2651
2651
  const share = await createScopedShare({
2652
2652
  agent: body.agent,
2653
2653
  perm,
@@ -2662,12 +2662,12 @@ Options:
2662
2662
  }
2663
2663
  }
2664
2664
  if (req.method === "GET" && p === "/api/shares") {
2665
- const { listShares } = await import("./agentShare-BBLXfmbU.js");
2665
+ const { listShares } = await import("./agentShare-CDMFg0Rj.js");
2666
2666
  return Response.json(listShares());
2667
2667
  }
2668
2668
  const revokeM = /^\/api\/share\/([^/]+)$/.exec(p);
2669
2669
  if (req.method === "DELETE" && revokeM) {
2670
- const { revokeShare } = await import("./agentShare-BBLXfmbU.js");
2670
+ const { revokeShare } = await import("./agentShare-CDMFg0Rj.js");
2671
2671
  const ok = revokeShare(decodeURIComponent(revokeM[1]));
2672
2672
  return new Response(ok ? "revoked" : "no such share", { status: ok ? 200 : 404 });
2673
2673
  }
@@ -2969,7 +2969,7 @@ Options:
2969
2969
  const shutdown = (resolve) => {
2970
2970
  if (heartbeat) clearInterval(heartbeat);
2971
2971
  closeShare?.();
2972
- import("./agentShare-BBLXfmbU.js").then((m) => m.revokeAllShares()).catch(() => {});
2972
+ import("./agentShare-CDMFg0Rj.js").then((m) => m.revokeAllShares()).catch(() => {});
2973
2973
  server?.stop();
2974
2974
  Promise.resolve(releaseHostLock?.()).catch(() => {}).then(resolve);
2975
2975
  };
@@ -2982,4 +2982,4 @@ Options:
2982
2982
 
2983
2983
  //#endregion
2984
2984
  export { cmdServe, resolveLocalServeUrl };
2985
- //# sourceMappingURL=serve-Bf8JJcJG.js.map
2985
+ //# sourceMappingURL=serve-Bv_twI1k.js.map
@@ -32,7 +32,7 @@ async function cmdSetup(rest) {
32
32
  if (!existsSync(abs)) process.stderr.write(` note: that directory doesn't exist yet — create it, or agents spawned there will fail\n`);
33
33
  if (noShare) return 0;
34
34
  process.stdout.write(`\nsharing this machine to agent-yes.com…\n`);
35
- const { cmdServe } = await import("./serve-Bf8JJcJG.js");
35
+ const { cmdServe } = await import("./serve-Bv_twI1k.js");
36
36
  return cmdServe([
37
37
  "install",
38
38
  "--share",
@@ -42,4 +42,4 @@ async function cmdSetup(rest) {
42
42
 
43
43
  //#endregion
44
44
  export { cmdSetup };
45
- //# sourceMappingURL=setup-Cth_2Kor.js.map
45
+ //# sourceMappingURL=setup-BmoiDPZn.js.map
@@ -3,7 +3,7 @@ import "./globalPidIndex-Ca4sTr1b.js";
3
3
  import "./messageLog-zVGWLX7w.js";
4
4
  import "./e2e-CYlKpfxa.js";
5
5
  import "./configShared-BXz2vi4Q.js";
6
- import { A as renderLogTailLines, B as stopTipForCli, C as matchKeyword, D as readPtysize, E as readNotes, F as resolveResumeArgs, H as waitForLogQuiet, I as restartHintLines, L as runSubcommand, M as renderRawLogLines, N as resolveOne, O as recentMessageEdges, P as resolveReadWindow, R as snapshotStatus, S as listRecords, T as readAgentPtysize, U as writeKeysPaced, V as submitAndConfirm, W as writeToIpc, _ as isPidAlive, a as cmdHelp, b as isUserTyping, c as deriveLiveState, d as extractMenu, f as extractNeedsInput, g as isExitRequest, h as isAgentStuck, i as backoffWhileTyping, j as renderRawLog, k as recentReadEdges, l as deriveLiveStatus, m as finalizedLines, n as READ_PAGE_DEFAULT, o as controlCodeFromName, p as extractTaskCounts, r as TYPING_WINDOW_MS, s as cursorAbs, t as GRACEFUL_EXIT_COMMANDS, u as extractBadges, v as isSlashCommand, w as menuSelectKeys, x as lastStdinAt, y as isSubcommand, z as stdinActivityPath } from "./subcommands-t140aQXd.js";
6
+ import { A as renderLogTailLines, B as stopTipForCli, C as matchKeyword, D as readPtysize, E as readNotes, F as resolveResumeArgs, H as waitForLogQuiet, I as restartHintLines, L as runSubcommand, M as renderRawLogLines, N as resolveOne, O as recentMessageEdges, P as resolveReadWindow, R as snapshotStatus, S as listRecords, T as readAgentPtysize, U as writeKeysPaced, V as submitAndConfirm, W as writeToIpc, _ as isPidAlive, a as cmdHelp, b as isUserTyping, c as deriveLiveState, d as extractMenu, f as extractNeedsInput, g as isExitRequest, h as isAgentStuck, i as backoffWhileTyping, j as renderRawLog, k as recentReadEdges, l as deriveLiveStatus, m as finalizedLines, n as READ_PAGE_DEFAULT, o as controlCodeFromName, p as extractTaskCounts, r as TYPING_WINDOW_MS, s as cursorAbs, t as GRACEFUL_EXIT_COMMANDS, u as extractBadges, v as isSlashCommand, w as menuSelectKeys, x as lastStdinAt, y as isSubcommand, z as stdinActivityPath } from "./subcommands-CXCoOuN6.js";
7
7
  import "./webrtcLink-CEYNs0pt.js";
8
8
  import "./remotes-BM3Zm8Wh.js";
9
9
 
@@ -1246,23 +1246,23 @@ async function runSubcommand(argv) {
1246
1246
  }
1247
1247
  case "ch":
1248
1248
  case "channels": {
1249
- const { cmdCh } = await import("./channels-mAf4ztTJ.js");
1249
+ const { cmdCh } = await import("./channels-Boi4aNiY.js");
1250
1250
  return cmdCh(rest);
1251
1251
  }
1252
1252
  case "serve": {
1253
- const { cmdServe } = await import("./serve-Bf8JJcJG.js");
1253
+ const { cmdServe } = await import("./serve-Bv_twI1k.js");
1254
1254
  return cmdServe(rest);
1255
1255
  }
1256
1256
  case "setup": {
1257
- const { cmdSetup } = await import("./setup-Cth_2Kor.js");
1257
+ const { cmdSetup } = await import("./setup-BmoiDPZn.js");
1258
1258
  return cmdSetup(rest);
1259
1259
  }
1260
1260
  case "ws": {
1261
- const { cmdWs } = await import("./ws-6kyIFJHL.js");
1261
+ const { cmdWs } = await import("./ws-DDYVVQwl.js");
1262
1262
  return cmdWs(rest);
1263
1263
  }
1264
1264
  case "schedule": {
1265
- const { cmdSchedule } = await import("./schedule-B4v3unjv.js");
1265
+ const { cmdSchedule } = await import("./schedule-BVVQtiaS.js");
1266
1266
  return cmdSchedule(rest);
1267
1267
  }
1268
1268
  case "remote": {
@@ -1274,7 +1274,7 @@ async function runSubcommand(argv) {
1274
1274
  return cmdExpose(rest);
1275
1275
  }
1276
1276
  case "callback": {
1277
- const { cmdCallback } = await import("./callback-beueK8jU.js");
1277
+ const { cmdCallback } = await import("./callback-sBpq-n_6.js");
1278
1278
  return cmdCallback(rest);
1279
1279
  }
1280
1280
  case "reap":
@@ -4312,7 +4312,7 @@ async function cmdNotify(rest) {
4312
4312
  }
4313
4313
  const ensure = async () => {
4314
4314
  if (!argv["ensure-daemon"]) return;
4315
- const { ensureDaemon } = await import("./notifyDaemon-CJfxTj46.js");
4315
+ const { ensureDaemon } = await import("./notifyDaemon-BNCj9i2N.js");
4316
4316
  await ensureDaemon().catch(() => null);
4317
4317
  };
4318
4318
  await heartbeatWatcher(parent, selfStartedAt);
@@ -4386,7 +4386,7 @@ async function cmdNotifyCursor(args) {
4386
4386
  }
4387
4387
  async function cmdNotifyd(rest) {
4388
4388
  const sub = rest[0] ?? "status";
4389
- const daemon = await import("./notifyDaemon-CJfxTj46.js");
4389
+ const daemon = await import("./notifyDaemon-BNCj9i2N.js");
4390
4390
  switch (sub) {
4391
4391
  case "run": return daemon.runDaemon();
4392
4392
  case "once": return daemon.runDaemon({ once: true });
@@ -4413,4 +4413,4 @@ async function cmdNotifyd(rest) {
4413
4413
 
4414
4414
  //#endregion
4415
4415
  export { daemonLockDir as $, renderLogTailLines as A, stopTipForCli as B, matchKeyword as C, readPtysize as D, readNotes as E, resolveResumeArgs as F, appendEvent as G, waitForLogQuiet as H, restartHintLines as I, isTransientLockMkdirError as J, gcInboxes as K, runSubcommand as L, renderRawLogLines as M, resolveOne as N, recentMessageEdges as O, resolveReadWindow as P, shouldStealLock as Q, snapshotStatus as R, listRecords as S, readAgentPtysize as T, writeKeysPaced as U, submitAndConfirm as V, writeToIpc as W, liveWatchers as X, listInboxParents as Y, readInbox as Z, isPidAlive as _, cmdHelp as a, isUserTyping as b, deriveLiveState as c, extractMenu as d, daemonLockOwnerPath as et, extractNeedsInput as f, isExitRequest as g, isAgentStuck as h, backoffWhileTyping as i, renderRawLog as j, recentReadEdges as k, deriveLiveStatus as l, finalizedLines as m, READ_PAGE_DEFAULT as n, TYPING_BADGE as nt, controlCodeFromName as o, extractTaskCounts as p, hostId as q, TYPING_WINDOW_MS as r, cursorAbs as s, GRACEFUL_EXIT_COMMANDS as t, notifyDir as tt, extractBadges as u, isSlashCommand as v, menuSelectKeys as w, lastStdinAt as x, isSubcommand as y, stdinActivityPath as z };
4416
- //# sourceMappingURL=subcommands-t140aQXd.js.map
4416
+ //# sourceMappingURL=subcommands-CXCoOuN6.js.map
@@ -1,5 +1,5 @@
1
1
  import { n as logger, t as addTransport } from "./logger-CDIsZ-Pp.js";
2
- import { r as getInstalledPackage } from "./versionChecker-Bhv8OZAY.js";
2
+ import { r as getInstalledPackage } from "./versionChecker-SHk3Fuvm.js";
3
3
  import { t as agentYesHome } from "./agentYesHome-CtHb5b71.js";
4
4
  import { d as openStore, p as LIFECYCLES, x as removeControlCharacters } from "./todoAutomation-x6guaQXc.js";
5
5
  import { i as shouldUseLock, r as releaseLock, t as acquireLock } from "./runningLock-BFk3Mo8K.js";
@@ -2044,4 +2044,4 @@ function sleep(ms) {
2044
2044
 
2045
2045
  //#endregion
2046
2046
  export { hasTodoStore as a, AgentContext as c, answerAsk as i, CLAUDE_SESSION_PIN_ENV as l, agentYes as n, listAsks as o, config as r, listAsksForProject as s, CLIS_CONFIG as t };
2047
- //# sourceMappingURL=ts-BDMKe8RP.js.map
2047
+ //# sourceMappingURL=ts-Bb3CeS6-.js.map
@@ -7,7 +7,7 @@ import { fileURLToPath } from "url";
7
7
 
8
8
  //#region package.json
9
9
  var name = "agent-yes";
10
- var version = "1.231.0";
10
+ var version = "1.232.0";
11
11
 
12
12
  //#endregion
13
13
  //#region ts/versionChecker.ts
@@ -215,4 +215,4 @@ async function displayVersion() {
215
215
 
216
216
  //#endregion
217
217
  export { versionString as i, displayVersion as n, getInstalledPackage as r, checkAndAutoUpdate as t };
218
- //# sourceMappingURL=versionChecker-Bhv8OZAY.js.map
218
+ //# sourceMappingURL=versionChecker-SHk3Fuvm.js.map
@@ -3,7 +3,7 @@ import "./globalPidIndex-Ca4sTr1b.js";
3
3
  import "./messageLog-zVGWLX7w.js";
4
4
  import "./e2e-CYlKpfxa.js";
5
5
  import "./configShared-BXz2vi4Q.js";
6
- import { S as listRecords } from "./subcommands-t140aQXd.js";
6
+ import { S as listRecords } from "./subcommands-CXCoOuN6.js";
7
7
  import "./webrtcLink-CEYNs0pt.js";
8
8
  import "./remotes-BM3Zm8Wh.js";
9
9
  import { i as getProvisionRoot } from "./workspaceConfig-DWLYPDdx.js";
@@ -418,4 +418,4 @@ async function cmdWs(args) {
418
418
 
419
419
  //#endregion
420
420
  export { WS_JSON_SCHEMA, cmdWs, collectWorkspaces, isPathInside, loadProvision, workspaceStatus };
421
- //# sourceMappingURL=ws-6kyIFJHL.js.map
421
+ //# sourceMappingURL=ws-DDYVVQwl.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-yes",
3
- "version": "1.231.0",
3
+ "version": "1.232.0",
4
4
  "description": "A wrapper tool that automates interactions with various AI CLI tools by automatically handling common prompts and responses.",
5
5
  "keywords": [
6
6
  "ai",
@@ -60,6 +60,8 @@
60
60
  "examples",
61
61
  "scripts",
62
62
  "ts/*.ts",
63
+ "ts/channels/*.ts",
64
+ "!ts/channels/*.spec.ts",
63
65
  "!dist/**/*.map",
64
66
  "dist/**/*.js",
65
67
  "lab/ui/console-logic.js",