agent-yes 1.236.0 → 1.237.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 (75) hide show
  1. package/dist/{JsonlStore-CWOA3aDH.js → JsonlStore-CPGIR0Wy.js} +1 -1
  2. package/dist/SUPPORTED_CLIS-C0RwjYrz.js +11 -0
  3. package/dist/{SUPPORTED_CLIS-C7bkkXue.js → SUPPORTED_CLIS-CDrJz9Xo.js} +2 -2
  4. package/dist/{agent-yes.config-BhjzWavn.js → agent-yes.config-DPtMM0S-.js} +2 -2
  5. package/dist/{agentShare-BxAaZ-UR.js → agentShare-Cl_J3dfx.js} +9 -9
  6. package/dist/{agentYesHome-CtHb5b71.js → agentYesHome-CtmsY6I-.js} +1 -1
  7. package/dist/browser-B3dOptjL.js +311 -0
  8. package/dist/browser-BRMyG4JA.js +13514 -0
  9. package/dist/callback-CFbkvqTh.js +12 -0
  10. package/dist/{callback-B1AWp2tC.js → callback-D0_AeyN1.js} +6 -6
  11. package/dist/{callbackCore-CcbVa8r2.js → callbackCore-CvmGSvrj.js} +1 -1
  12. package/dist/{callbackCore-Me97qn68.js → callbackCore-DAYcemCC.js} +1 -1
  13. package/dist/{channels-Lsot9pyU.js → channels-BiGUYTuz.js} +2 -2
  14. package/dist/{channels-DHXLnU4r.js → channels-CMNMFJlY.js} +6 -6
  15. package/dist/channels.js +6 -310
  16. package/dist/chunk-cZBX9HZv.js +20 -0
  17. package/dist/cli.js +11 -11
  18. package/dist/{configShared-BXz2vi4Q.js → configShared-9wVlbPyC.js} +1 -1
  19. package/dist/{cwdConflictWarn-ArYYtOGy.js → cwdConflictWarn-DWHWlBxS.js} +2 -2
  20. package/dist/{cwdDeprecation-BGX20-Fe.js → cwdDeprecation-Cd8Ykm2t.js} +1 -1
  21. package/dist/{e2e-CYlKpfxa.js → e2e-CEIdJGZ7.js} +1 -1
  22. package/dist/{expose-ByT4ef7C.js → expose-DROTwbyU.js} +1 -1
  23. package/dist/{forkNested-Bai0Q7BL.js → forkNested-DqPisz9d.js} +2 -2
  24. package/dist/{globalPidIndex-Ca4sTr1b.js → globalPidIndex-D9DOSd-c.js} +1 -1
  25. package/dist/index.js +7 -7
  26. package/dist/{messageLog-zVGWLX7w.js → messageLog-C-YIzhRj.js} +1 -1
  27. package/dist/{nodeRuntime-fVRbz6w6.js → nodeRuntime-Bf88NPqj.js} +2 -2
  28. package/dist/{notifyDaemon-Cxb0-5a0.js → notifyDaemon-D_8TRVHt.js} +8 -8
  29. package/dist/{openBrowser-DL-EO8Hi.js → openBrowser-ChLcPELv.js} +1 -1
  30. package/dist/{peer-68ZwnxLs.js → peer-B5JKF4BP.js} +3 -3
  31. package/dist/peer-D5lr1Afv.js +4 -0
  32. package/dist/{pidStore-Hjba3K6Q.js → pidStore-6EZd5DUv.js} +4 -4
  33. package/dist/pidStore-bCVS2Ldt.js +6 -0
  34. package/dist/{reaper-iQXyufgp.js → reaper-DP49VCKx.js} +2 -2
  35. package/dist/{reaper-pJpMYKmj.js → reaper-IhkB_RO0.js} +1 -1
  36. package/dist/{remotes-CF1LJLxY.js → remotes-BClMgQZW.js} +3 -3
  37. package/dist/{remotes-BDdfhL6N.js → remotes-Bem6WIyU.js} +3 -3
  38. package/dist/{runningLock-BFk3Mo8K.js → runningLock-DBoONoM-.js} +1 -1
  39. package/dist/{rustBinary-CFSG7it2.js → rustBinary-Bb9qJZ5w.js} +2 -2
  40. package/dist/{schedule-CXHdiUHa.js → schedule-B8Erb3y6.js} +11 -11
  41. package/dist/{serve-DEEwIlVV.js → serve-QejbNTr-.js} +187 -43
  42. package/dist/{setup-QfDtv5tw.js → setup-Dzi5Cc3g.js} +3 -3
  43. package/dist/{share-CDER9qNq.js → share--aHaPSjt.js} +2 -2
  44. package/dist/{share-D4K0JnHg.js → share-B9u8-I3y.js} +2 -2
  45. package/dist/{spawnGate-PwzImpOw.js → spawnGate-Bo_LFgt9.js} +3 -3
  46. package/dist/spawnGate-CuWCd2im.js +5 -0
  47. package/dist/{store-BXJERNbW.js → store-Ck0XRn-K.js} +1 -1
  48. package/dist/{subcommands-_Ci82sb1.js → subcommands-DFr-5FOL.js} +26 -21
  49. package/dist/{subcommands-m2DRpvHt.js → subcommands-ymJWO2iv.js} +7 -7
  50. package/dist/terminal-vNeFNLT8.js +138 -0
  51. package/dist/terminal.js +3 -0
  52. package/dist/{todoAutomation-x6guaQXc.js → todoAutomation-Buo457VO.js} +2 -2
  53. package/dist/{todoCli-CAMVVz9u.js → todoCli-CNNR9Czu.js} +4 -4
  54. package/dist/{tray-CF8xRQqt.js → tray-D5qFaqlS.js} +2 -2
  55. package/dist/{ts-D1FDmhc-.js → ts-Dd1FK7sR.js} +11 -28
  56. package/dist/{versionChecker-DJEtU1JU.js → versionChecker-XfEBINhH.js} +2 -2
  57. package/dist/{webrtcLink-CEYNs0pt.js → webrtcLink-VQhWmKOw.js} +2 -2
  58. package/dist/{webrtcRemote-CNC_bMH6.js → webrtcRemote-DJDtCTpj.js} +3 -3
  59. package/dist/widgets.js +7 -0
  60. package/dist/{workspaceConfig-CuGjX2_R.js → workspaceConfig-B7HaQ-MI.js} +2 -2
  61. package/dist/{ws-C7B4xWQl.js → ws-Dun8gGiV.js} +9 -9
  62. package/package.json +13 -1
  63. package/ts/serve.ts +144 -5
  64. package/ts/subcommands.ts +6 -0
  65. package/ts/termToken.spec.ts +44 -0
  66. package/ts/termToken.ts +85 -0
  67. package/ts/terminal/browser.ts +607 -0
  68. package/ts/terminal.spec.ts +50 -0
  69. package/ts/terminal.ts +245 -0
  70. package/ts/widgets.ts +14 -0
  71. package/dist/SUPPORTED_CLIS-BDXbzEWF.js +0 -11
  72. package/dist/callback-Dtk0wMsl.js +0 -12
  73. package/dist/peer-CX4qQx5U.js +0 -4
  74. package/dist/pidStore-Cp3HekUh.js +0 -6
  75. package/dist/spawnGate-C21TL4f2.js +0 -5
@@ -1,11 +1,11 @@
1
1
  import { t as invokedCliName } from "./invokedCli-uqM2YYA7.js";
2
2
  import { n as logger } from "./logger-CDIsZ-Pp.js";
3
- import { t as agentYesHome } from "./agentYesHome-CtHb5b71.js";
4
- import { a as updateGlobalPidStatus, i as readGlobalPids } from "./globalPidIndex-Ca4sTr1b.js";
5
- import { a as recordOutbox, i as recordMessage, n as readMailbox, t as partyMatches } from "./messageLog-zVGWLX7w.js";
6
- import { t as loadSharedCliDefaults } from "./configShared-BXz2vi4Q.js";
7
- import { n as isWebrtcSpec } from "./webrtcLink-CEYNs0pt.js";
8
- import { a as resolveRemoteSpec, i as readRemotes } from "./remotes-BDdfhL6N.js";
3
+ import { t as agentYesHome } from "./agentYesHome-CtmsY6I-.js";
4
+ import { a as updateGlobalPidStatus, i as readGlobalPids } from "./globalPidIndex-D9DOSd-c.js";
5
+ import { a as recordOutbox, i as recordMessage, n as readMailbox, t as partyMatches } from "./messageLog-C-YIzhRj.js";
6
+ import { t as loadSharedCliDefaults } from "./configShared-9wVlbPyC.js";
7
+ import { n as isWebrtcSpec } from "./webrtcLink-VQhWmKOw.js";
8
+ import { a as resolveRemoteSpec, i as readRemotes } from "./remotes-Bem6WIyU.js";
9
9
  import ms from "ms";
10
10
  import yargs from "yargs";
11
11
  import { appendFile, mkdir, open, readFile, readdir, rename, rm, stat, writeFile } from "fs/promises";
@@ -1176,6 +1176,7 @@ const SUBCOMMANDS = new Set([
1176
1176
  "todo",
1177
1177
  "ch",
1178
1178
  "channels",
1179
+ "term",
1179
1180
  "serve",
1180
1181
  "schedule",
1181
1182
  "remote",
@@ -1241,44 +1242,48 @@ async function runSubcommand(argv) {
1241
1242
  case "restart": return await cmdRestart(rest);
1242
1243
  case "note": return await cmdNote(rest);
1243
1244
  case "todo": {
1244
- const { runTodoSubcommand } = await import("./todoCli-CAMVVz9u.js");
1245
+ const { runTodoSubcommand } = await import("./todoCli-CNNR9Czu.js");
1245
1246
  return runTodoSubcommand(rest);
1246
1247
  }
1247
1248
  case "ch":
1248
1249
  case "channels": {
1249
- const { cmdCh } = await import("./channels-DHXLnU4r.js");
1250
+ const { cmdCh } = await import("./channels-CMNMFJlY.js");
1250
1251
  return cmdCh(rest);
1251
1252
  }
1253
+ case "term": {
1254
+ const { cmdTerm } = await import("./terminal-vNeFNLT8.js");
1255
+ return cmdTerm(rest);
1256
+ }
1252
1257
  case "serve": {
1253
- const { cmdServe } = await import("./serve-DEEwIlVV.js");
1258
+ const { cmdServe } = await import("./serve-QejbNTr-.js");
1254
1259
  return cmdServe(rest);
1255
1260
  }
1256
1261
  case "setup": {
1257
- const { cmdSetup } = await import("./setup-QfDtv5tw.js");
1262
+ const { cmdSetup } = await import("./setup-Dzi5Cc3g.js");
1258
1263
  return cmdSetup(rest);
1259
1264
  }
1260
1265
  case "ws": {
1261
- const { cmdWs } = await import("./ws-C7B4xWQl.js");
1266
+ const { cmdWs } = await import("./ws-Dun8gGiV.js");
1262
1267
  return cmdWs(rest);
1263
1268
  }
1264
1269
  case "schedule": {
1265
- const { cmdSchedule } = await import("./schedule-CXHdiUHa.js");
1270
+ const { cmdSchedule } = await import("./schedule-B8Erb3y6.js");
1266
1271
  return cmdSchedule(rest);
1267
1272
  }
1268
1273
  case "remote": {
1269
- const { cmdRemote } = await import("./remotes-CF1LJLxY.js");
1274
+ const { cmdRemote } = await import("./remotes-BClMgQZW.js");
1270
1275
  return cmdRemote(rest);
1271
1276
  }
1272
1277
  case "expose": {
1273
- const { cmdExpose } = await import("./expose-ByT4ef7C.js");
1278
+ const { cmdExpose } = await import("./expose-DROTwbyU.js");
1274
1279
  return cmdExpose(rest);
1275
1280
  }
1276
1281
  case "callback": {
1277
- const { cmdCallback } = await import("./callback-Dtk0wMsl.js");
1282
+ const { cmdCallback } = await import("./callback-CFbkvqTh.js");
1278
1283
  return cmdCallback(rest);
1279
1284
  }
1280
1285
  case "reap":
1281
- await (await import("./reaper-pJpMYKmj.js")).sweep();
1286
+ await (await import("./reaper-IhkB_RO0.js")).sweep();
1282
1287
  return 0;
1283
1288
  case "help": return cmdHelp(managerCommands);
1284
1289
  default: return null;
@@ -1312,7 +1317,7 @@ async function cmdHelp(managerCommands = true) {
1312
1317
  const wsLines = managerCommands ? " ay ws ls [--status] list <owner>/<repo>/tree/<branch> workspaces\n ay ws new <owner>/<repo>[@branch] clone/refresh a workspace (ay ws help for more)\n" : ``;
1313
1318
  const self = process.env.AGENT_YES_PID ? await resolveSender() : null;
1314
1319
  const agentSection = self ? await buildAgentContextSection(self) : "";
1315
- process.stdout.write(agentSection + "ay - agent-yes CLI\n\nManagement:\n ay ls [keyword] list running agents\n ay tail [-f] [-n N] <keyword> last N lines (96), -f to follow\n ay read <keyword> [page opts] paginate: --last/--head N, --range A:B,\n --before-line L [--limit N]\n ay cat <keyword> full log\n ay head <keyword> first N lines\n ay send <keyword> <msg> send a message (keyword '.' = agent in this cwd)\n ay msgs [keyword] [--in|--out] inter-agent message log (sent + received)\n ay ch mk|join|send|read|tail <topic> local-first E2E channels: AI ↔ humans on a topic (ay ch help)\n ay key <keyword> <key...> send raw keystrokes (down/up/enter/esc/…) — drives menus\n ay select <keyword> <N> pick option N of a needs_input selection menu\n ay attach <keyword> interactive attach (detach: Ctrl-\\)\n ay stop <keyword> graceful shutdown (/exit for claude/codex)\n ay exit <keyword> [reason] graceful shutdown, recording who/why (= 'ay send <kw> exit')\n ay restart <keyword> [--fresh] stop (if live) + relaunch resuming the session; --fresh replays the prompt\n ay status <keyword> agent status snapshot\n ay result <keyword> [--wait] pull an agent's structured result envelope\n ay result set '<json>' (inside an agent) deposit your result envelope\n ay reap kill process groups leaked by dead agents\n" + wsLines + "\nRemote:\n" + setupLine + " ay schedule <when> <cli> -- <msg> run an agent on a schedule (HH:MM or cron)\n ay serve [--port N] start HTTP API server (prints token)\n ay serve status show serve daemon/server status\n ay remote add <alias> http://<token>@<host>:<port>\n ay remote ls / rm <alias> manage saved remotes\n ay expose <port> share localhost:<port> at https://<id>.agent-yes.com (private link)\n ay callback --expires 7d mint an embeddable message-me widget for one agent\n ay ls <token>@<host>:<port> connect inline (no alias needed)\n ay send <token>@<host>:<port>:<kw> <msg>\n\nRun an agent:\n ay [claude|codex|gemini|...] [options] -- [prompt]\n ay claude -- \"fix the bug in auth.ts\"\n ay claude --help full agent-runner options\n\nLabs (examples at https://github.com/snomiao/agent-yes/tree/main/lab):\n local-role-play/ designer + builder on one machine\n http-remote/ ay serve remote access demo\n p2p-pairing/ libp2p P2P (needs: cargo build --features swarm)\n");
1320
+ process.stdout.write(agentSection + "ay - agent-yes CLI\n\nManagement:\n ay ls [keyword] list running agents\n ay tail [-f] [-n N] <keyword> last N lines (96), -f to follow\n ay read <keyword> [page opts] paginate: --last/--head N, --range A:B,\n --before-line L [--limit N]\n ay cat <keyword> full log\n ay head <keyword> first N lines\n ay send <keyword> <msg> send a message (keyword '.' = agent in this cwd)\n ay msgs [keyword] [--in|--out] inter-agent message log (sent + received)\n ay ch mk|join|send|read|tail <topic> local-first E2E channels: AI ↔ humans on a topic (ay ch help)\n ay term embed <pid> <script> to embed a live read-only agent terminal in a page (ay term help)\n ay key <keyword> <key...> send raw keystrokes (down/up/enter/esc/…) — drives menus\n ay select <keyword> <N> pick option N of a needs_input selection menu\n ay attach <keyword> interactive attach (detach: Ctrl-\\)\n ay stop <keyword> graceful shutdown (/exit for claude/codex)\n ay exit <keyword> [reason] graceful shutdown, recording who/why (= 'ay send <kw> exit')\n ay restart <keyword> [--fresh] stop (if live) + relaunch resuming the session; --fresh replays the prompt\n ay status <keyword> agent status snapshot\n ay result <keyword> [--wait] pull an agent's structured result envelope\n ay result set '<json>' (inside an agent) deposit your result envelope\n ay reap kill process groups leaked by dead agents\n" + wsLines + "\nRemote:\n" + setupLine + " ay schedule <when> <cli> -- <msg> run an agent on a schedule (HH:MM or cron)\n ay serve [--port N] start HTTP API server (prints token)\n ay serve status show serve daemon/server status\n ay remote add <alias> http://<token>@<host>:<port>\n ay remote ls / rm <alias> manage saved remotes\n ay expose <port> share localhost:<port> at https://<id>.agent-yes.com (private link)\n ay callback --expires 7d mint an embeddable message-me widget for one agent\n ay ls <token>@<host>:<port> connect inline (no alias needed)\n ay send <token>@<host>:<port>:<kw> <msg>\n\nRun an agent:\n ay [claude|codex|gemini|...] [options] -- [prompt]\n ay claude -- \"fix the bug in auth.ts\"\n ay claude --help full agent-runner options\n\nLabs (examples at https://github.com/snomiao/agent-yes/tree/main/lab):\n local-role-play/ designer + builder on one machine\n http-remote/ ay serve remote access demo\n p2p-pairing/ libp2p P2P (needs: cargo build --features swarm)\n");
1316
1321
  return 0;
1317
1322
  }
1318
1323
  function matchKeyword(record, keyword) {
@@ -1692,7 +1697,7 @@ async function fetchRemoteRecordsRaw(url, token, opts) {
1692
1697
  let base = url;
1693
1698
  let bearer = token;
1694
1699
  if (isWebrtcSpec(url)) {
1695
- const { startWebrtcBridge } = await import("./webrtcRemote-CNC_bMH6.js");
1700
+ const { startWebrtcBridge } = await import("./webrtcRemote-DJDtCTpj.js");
1696
1701
  bridge = await startWebrtcBridge(url);
1697
1702
  base = bridge.baseUrl;
1698
1703
  bearer = bridge.token;
@@ -4312,7 +4317,7 @@ async function cmdNotify(rest) {
4312
4317
  }
4313
4318
  const ensure = async () => {
4314
4319
  if (!argv["ensure-daemon"]) return;
4315
- const { ensureDaemon } = await import("./notifyDaemon-Cxb0-5a0.js");
4320
+ const { ensureDaemon } = await import("./notifyDaemon-D_8TRVHt.js");
4316
4321
  await ensureDaemon().catch(() => null);
4317
4322
  };
4318
4323
  await heartbeatWatcher(parent, selfStartedAt);
@@ -4386,7 +4391,7 @@ async function cmdNotifyCursor(args) {
4386
4391
  }
4387
4392
  async function cmdNotifyd(rest) {
4388
4393
  const sub = rest[0] ?? "status";
4389
- const daemon = await import("./notifyDaemon-Cxb0-5a0.js");
4394
+ const daemon = await import("./notifyDaemon-D_8TRVHt.js");
4390
4395
  switch (sub) {
4391
4396
  case "run": return daemon.runDaemon();
4392
4397
  case "once": return daemon.runDaemon({ once: true });
@@ -4413,4 +4418,4 @@ async function cmdNotifyd(rest) {
4413
4418
 
4414
4419
  //#endregion
4415
4420
  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-_Ci82sb1.js.map
4421
+ //# sourceMappingURL=subcommands-DFr-5FOL.js.map
@@ -1,10 +1,10 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import "./globalPidIndex-Ca4sTr1b.js";
3
- import "./messageLog-zVGWLX7w.js";
4
- import "./e2e-CYlKpfxa.js";
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-_Ci82sb1.js";
7
- import "./webrtcLink-CEYNs0pt.js";
8
- import "./remotes-BDdfhL6N.js";
2
+ import "./globalPidIndex-D9DOSd-c.js";
3
+ import "./messageLog-C-YIzhRj.js";
4
+ import "./e2e-CEIdJGZ7.js";
5
+ import "./configShared-9wVlbPyC.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-DFr-5FOL.js";
7
+ import "./webrtcLink-VQhWmKOw.js";
8
+ import "./remotes-Bem6WIyU.js";
9
9
 
10
10
  export { cmdHelp, isSubcommand, runSubcommand };
@@ -0,0 +1,138 @@
1
+ //#region ts/terminal.ts
2
+ function parseFlags(args, known) {
3
+ const flags = {};
4
+ const positional = [];
5
+ for (let i = 0; i < args.length; i++) {
6
+ const a = args[i];
7
+ if (!a.startsWith("-") || a === "-") {
8
+ positional.push(a);
9
+ continue;
10
+ }
11
+ const eq = a.indexOf("=");
12
+ const name = eq === -1 ? a.replace(/^--?/, "") : a.slice(a.startsWith("--") ? 2 : 1, eq);
13
+ const kind = known[name];
14
+ if (!kind) throw new Error(`unknown flag ${a}`);
15
+ if (kind === "bool") {
16
+ if (eq !== -1) throw new Error(`--${name} takes no value`);
17
+ flags[name] = true;
18
+ } else {
19
+ const v = eq !== -1 ? a.slice(eq + 1) : args[++i];
20
+ if (v === void 0) throw new Error(`${a} requires a value`);
21
+ flags[name] = v;
22
+ }
23
+ }
24
+ return {
25
+ flags,
26
+ positional
27
+ };
28
+ }
29
+ /**
30
+ * The embed `<script>` snippet — a script (NOT an iframe) that loads the AyTerminal
31
+ * browser lib and mounts a read-only terminal in the page. Three modes trade off
32
+ * where the serve token lives: never in the file (`discover` — the safe default,
33
+ * the widget reads #k= / window.AY_TERM_TOKEN / localStorage), injected at runtime
34
+ * (`placeholder`), or baked in (`live`, loud warning — a serve token is full-fleet
35
+ * read+write until scoped read-only tokens land).
36
+ */
37
+ function buildTermEmbedSnippet(host, pid, mode) {
38
+ const imp = ` import AyTerminal from "https://${host}/w/terminal.js";\n`;
39
+ const originArg = mode.origin ? `origin: ${JSON.stringify(mode.origin)}, ` : "";
40
+ const roArg = mode.interactive ? `readOnly: false, ` : "";
41
+ const tokenArg = mode.kind === "live" ? `token: ${JSON.stringify(mode.token)}, ` : mode.kind === "placeholder" ? `token: window.AY_TERM_TOKEN, ` : "";
42
+ return `<!-- ay terminal: ${mode.interactive ? "interactive" : "read-only"} view of #${pid} — ${mode.kind === "live" ? `this snippet embeds a LIVE token — do NOT commit it to a public or deploy-bound file.` : mode.kind === "placeholder" ? `set window.AY_TERM_TOKEN at runtime; do NOT commit it.` : `no token in this file; the widget reads it from the page (#k= / window.AY_TERM_TOKEN / localStorage).`} Add <div id="ay-term" style="width:720px;height:420px"></div> where you want the terminal, or omit it to float in the corner. -->\n<script type="module">\n${imp} new AyTerminal({ ${originArg}${roArg}${tokenArg}pid: ${JSON.stringify(pid)} }).mount(document.getElementById("ay-term") ?? undefined);\n<\/script>\n`;
43
+ }
44
+ function cmdTermEmbed(args) {
45
+ const { flags, positional } = parseFlags(args, {
46
+ host: "value",
47
+ origin: "value",
48
+ token: "value",
49
+ placeholder: "bool",
50
+ interactive: "bool"
51
+ });
52
+ const pid = positional[0];
53
+ if (!pid || positional.length > 1) throw new Error("usage: ay term embed <pid|keyword> [--host H] [--origin URL] [--token TOK | --placeholder] [--interactive]");
54
+ if (flags.token && flags.placeholder) throw new Error("--token and --placeholder are mutually exclusive");
55
+ const host = typeof flags.host === "string" ? flags.host : "agent-yes.com";
56
+ const origin = typeof flags.origin === "string" ? flags.origin : void 0;
57
+ const interactive = flags.interactive === true;
58
+ const mode = flags.placeholder ? {
59
+ kind: "placeholder",
60
+ origin,
61
+ interactive
62
+ } : typeof flags.token === "string" ? {
63
+ kind: "live",
64
+ token: flags.token,
65
+ origin,
66
+ interactive
67
+ } : {
68
+ kind: "discover",
69
+ origin,
70
+ interactive
71
+ };
72
+ process.stdout.write(buildTermEmbedSnippet(host, pid, mode));
73
+ if (mode.kind === "discover") process.stderr.write("\n Token-free snippet — the widget reads the serve token from the page (#k= hash,\n window.AY_TERM_TOKEN, or the console's localStorage[\"ay.localToken\"]). Ideal when the\n page is served by the daemon itself (ay serve --http) with a #k=<token> link.\n");
74
+ else if (mode.kind === "placeholder") process.stderr.write("\n Placeholder — the token is NOT in the snippet; set window.AY_TERM_TOKEN at runtime\n (server-rendered / env), so a committed file carries no secret.\n");
75
+ else process.stderr.write("\n ⚠ This snippet embeds a LIVE serve token — full-fleet READ+WRITE for this daemon.\n Anyone who reads the page source gets it. Do NOT commit it to a public or\n deploy-bound file. Prefer --placeholder (runtime-injected) or the token-free\n default. Scoped read-only embed tokens are future work (need per-author signing).\n");
76
+ if (interactive) process.stderr.write(`\n ⚠ INTERACTIVE: keystrokes in the widget go to the agent's stdin. This needs a token\n that grants /api/send for #${pid} (the widget reverts to read-only on a 403). Prefer a\n scoped, short-TTL, single-session interactive token (future: ay term mint --interactive)\n over the master token — the master token is full-fleet RCE.\n`);
77
+ else process.stderr.write("\n Read-only mirror: it renders the agent's PTY but never types into it. Add --interactive\n (with a send-granting token) to let viewers type to the agent.\n");
78
+ process.stderr.write(` terminal.js must load from https://${host}/w/terminal.js.\n`);
79
+ if (!origin) process.stderr.write(" Same-origin: /api/tail sends no CORS headers, so the page must be served by the\n daemon (ay serve --http). For an arbitrary-origin page, pass --origin <daemon-url>\n (the daemon must be reachable + allow it); the WebRTC --share transport for any\n origin is a later phase.\n");
80
+ return 0;
81
+ }
82
+ /** Parse a TTL like "900", "30s", "15m", "2h" → seconds. */
83
+ function parseTtlSec(s) {
84
+ const m = /^(\d+)(s|m|h)?$/.exec(s.trim());
85
+ if (!m) throw new Error(`bad --ttl "${s}" (use e.g. 900, 30s, 15m, 2h)`);
86
+ const mult = m[2] === "h" ? 3600 : m[2] === "m" ? 60 : 1;
87
+ return Number(m[1]) * mult;
88
+ }
89
+ async function cmdTermMint(args) {
90
+ const { flags, positional } = parseFlags(args, {
91
+ ttl: "value",
92
+ ro: "bool",
93
+ interactive: "bool",
94
+ json: "bool"
95
+ });
96
+ const pid = positional[0];
97
+ if (!pid || positional.length > 1) throw new Error("usage: ay term mint <pid|keyword> [--ttl 15m] [--ro | --interactive] [--json]");
98
+ if (flags.ro && flags.interactive) throw new Error("--ro and --interactive are mutually exclusive");
99
+ const ttlSec = parseTtlSec(typeof flags.ttl === "string" ? flags.ttl : "15m");
100
+ const canSend = flags.interactive === true;
101
+ const { mintScopedTermToken } = await import("./serve-QejbNTr-.js");
102
+ const r = await mintScopedTermToken(pid, {
103
+ ttlSec,
104
+ canSend
105
+ });
106
+ if (flags.json === true) {
107
+ process.stdout.write(JSON.stringify(r) + "\n");
108
+ return 0;
109
+ }
110
+ process.stdout.write(r.token + "\n");
111
+ const mins = Math.round(ttlSec / 60);
112
+ process.stderr.write(`\n Scoped ${canSend ? "INTERACTIVE (read+write)" : "read-only"} token for #${r.pid}, expires in ~${mins}m (${(/* @__PURE__ */ new Date(r.exp * 1e3)).toISOString()}).\n It grants ONLY ${canSend ? "read+write of" : "read of"} #${r.pid} — no other agent, no spawn.\n Safe to embed in a page (this is NOT the master token):\n ay term embed ${r.pid} --token <token> ${canSend ? "--interactive " : ""}--origin <daemon-url>\n Short TTL is the backstop (serverless — no central revoke); re-mint when it lapses.\n`);
113
+ return 0;
114
+ }
115
+ function termHelp() {
116
+ process.stdout.write("ay term — embed a live, read-only agent terminal in a web page\n\nUsage:\n ay term embed <pid|keyword> [--host H] [--origin URL] [--token TOK | --placeholder] [--interactive]\n ay term mint <pid|keyword> [--ttl 15m] [--ro | --interactive] [--json]\n\n embed print a <script> snippet that mounts a read-only xterm mirror of the agent\n into <div id=\"ay-term\">, or a floating panel if that div is absent.\n mint mint a scoped, short-TTL token bound to ONE agent (read-only by default;\n --interactive also grants that agent's stdin) — safe to embed in a page,\n unlike the master serve token. Prints the token on stdout.\n\nFlags (embed):\n --host H CDN host serving terminal.js (default agent-yes.com)\n --origin URL daemon origin if the page is NOT served by the daemon (same-origin default)\n --token TOK bake a LIVE serve token into the snippet (⚠ full-fleet r/w; avoid committing)\n --placeholder read the token from window.AY_TERM_TOKEN at runtime (no secret in the file)\n --interactive wire the keyboard to the agent's stdin (needs a send-granting token; ⚠ opt-in)\n");
117
+ return 0;
118
+ }
119
+ async function cmdTerm(args) {
120
+ const sub = args[0];
121
+ const rest = args.slice(1);
122
+ switch (sub) {
123
+ case "embed": return cmdTermEmbed(rest);
124
+ case "mint": return cmdTermMint(rest);
125
+ case void 0:
126
+ case "help":
127
+ case "--help":
128
+ case "-h": return termHelp();
129
+ default:
130
+ process.stderr.write(`ay term: unknown subcommand "${sub}"\n\n`);
131
+ termHelp();
132
+ return 1;
133
+ }
134
+ }
135
+
136
+ //#endregion
137
+ export { cmdTerm };
138
+ //# sourceMappingURL=terminal-vNeFNLT8.js.map
@@ -0,0 +1,3 @@
1
+ import { t as AyTerminal } from "./browser-BRMyG4JA.js";
2
+
3
+ export { AyTerminal, AyTerminal as default };
@@ -1,4 +1,4 @@
1
- import { t as JsonlStore } from "./JsonlStore-CWOA3aDH.js";
1
+ import { t as JsonlStore } from "./JsonlStore-CPGIR0Wy.js";
2
2
  import path from "path";
3
3
  import { lock } from "proper-lockfile";
4
4
 
@@ -958,4 +958,4 @@ function reconcileTodos(tasks, agents, registeredGates) {
958
958
 
959
959
  //#endregion
960
960
  export { isKnownKind as _, renderTree as a, statesOf as b, monitorHint as c, openStore as d, DONE_STATE as f, initialState as g, canTransition as h, renderDigest as i, CycleError as l, ORPHANED_STATE as m, buildTreeJSON as n, unblockedTasks as o, LIFECYCLES as p, openBlockers as r, describeBlock as s, reconcileTodos as t, TodoStore as u, nextStates as v, removeControlCharacters as x, requiredGate as y };
961
- //# sourceMappingURL=todoAutomation-x6guaQXc.js.map
961
+ //# sourceMappingURL=todoAutomation-Buo457VO.js.map
@@ -1,7 +1,7 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import { _ as isKnownKind, a as renderTree, d as openStore, i as renderDigest, l as CycleError, n as buildTreeJSON, o as unblockedTasks, p as LIFECYCLES, s as describeBlock, t as reconcileTodos, x as removeControlCharacters } from "./todoAutomation-x6guaQXc.js";
3
- import "./JsonlStore-CWOA3aDH.js";
4
- import { i as readGlobalPids } from "./globalPidIndex-Ca4sTr1b.js";
2
+ import { _ as isKnownKind, a as renderTree, d as openStore, i as renderDigest, l as CycleError, n as buildTreeJSON, o as unblockedTasks, p as LIFECYCLES, s as describeBlock, t as reconcileTodos, x as removeControlCharacters } from "./todoAutomation-Buo457VO.js";
3
+ import "./JsonlStore-CPGIR0Wy.js";
4
+ import { i as readGlobalPids } from "./globalPidIndex-D9DOSd-c.js";
5
5
  import yargs from "yargs";
6
6
 
7
7
  //#region ts/todoCli.ts
@@ -456,4 +456,4 @@ async function runTodoSubcommand(rest0) {
456
456
 
457
457
  //#endregion
458
458
  export { runTodoSubcommand };
459
- //# sourceMappingURL=todoCli-CAMVVz9u.js.map
459
+ //# sourceMappingURL=todoCli-CNNR9Czu.js.map
@@ -1,4 +1,4 @@
1
- import { n as getRunningAgentCount } from "./runningLock-BFk3Mo8K.js";
1
+ import { n as getRunningAgentCount } from "./runningLock-DBoONoM-.js";
2
2
  import { existsSync } from "fs";
3
3
  import { mkdir, readFile, unlink, writeFile } from "fs/promises";
4
4
  import { homedir } from "os";
@@ -187,4 +187,4 @@ async function startTray() {
187
187
 
188
188
  //#endregion
189
189
  export { ensureTray, startTray };
190
- //# sourceMappingURL=tray-CF8xRQqt.js.map
190
+ //# sourceMappingURL=tray-D5qFaqlS.js.map
@@ -1,12 +1,13 @@
1
+ import { n as __esmMin, r as __exportAll } from "./chunk-cZBX9HZv.js";
1
2
  import { n as logger, t as addTransport } from "./logger-CDIsZ-Pp.js";
2
- import { r as getInstalledPackage } from "./versionChecker-DJEtU1JU.js";
3
- import { t as agentYesHome } from "./agentYesHome-CtHb5b71.js";
4
- import { d as openStore, p as LIFECYCLES, x as removeControlCharacters } from "./todoAutomation-x6guaQXc.js";
5
- import { i as shouldUseLock, r as releaseLock, t as acquireLock } from "./runningLock-BFk3Mo8K.js";
6
- import { i as readGlobalPids } from "./globalPidIndex-Ca4sTr1b.js";
7
- import { t as PidStore } from "./pidStore-Hjba3K6Q.js";
8
- import { r as recordInbox } from "./messageLog-zVGWLX7w.js";
9
- import { n as register, r as sweep } from "./reaper-iQXyufgp.js";
3
+ import { r as getInstalledPackage } from "./versionChecker-XfEBINhH.js";
4
+ import { t as agentYesHome } from "./agentYesHome-CtmsY6I-.js";
5
+ import { d as openStore, p as LIFECYCLES, x as removeControlCharacters } from "./todoAutomation-Buo457VO.js";
6
+ import { i as shouldUseLock, r as releaseLock, t as acquireLock } from "./runningLock-DBoONoM-.js";
7
+ import { i as readGlobalPids } from "./globalPidIndex-D9DOSd-c.js";
8
+ import { t as PidStore } from "./pidStore-6EZd5DUv.js";
9
+ import { r as recordInbox } from "./messageLog-C-YIzhRj.js";
10
+ import { n as register, r as sweep } from "./reaper-DP49VCKx.js";
10
11
  import { arch, platform } from "process";
11
12
  import { execSync } from "child_process";
12
13
  import { closeSync, constants, createReadStream, existsSync, mkdirSync, openSync } from "fs";
@@ -26,24 +27,6 @@ import { readFile as readFile$1 } from "node:fs/promises";
26
27
  import path$1 from "node:path";
27
28
  import { existsSync as existsSync$1 } from "node:fs";
28
29
 
29
- //#region \0rolldown/runtime.js
30
- var __defProp = Object.defineProperty;
31
- var __esmMin = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
32
- var __exportAll = (all, no_symbols) => {
33
- let target = {};
34
- for (var name in all) {
35
- __defProp(target, name, {
36
- get: all[name],
37
- enumerable: true
38
- });
39
- }
40
- if (!no_symbols) {
41
- __defProp(target, Symbol.toStringTag, { value: "Module" });
42
- }
43
- return target;
44
- };
45
-
46
- //#endregion
47
30
  //#region ts/xterm-proxy.ts
48
31
  const { Terminal } = xterm;
49
32
  /**
@@ -1285,7 +1268,7 @@ async function answerAsk(projectRoot, taskId, answer) {
1285
1268
 
1286
1269
  //#endregion
1287
1270
  //#region ts/index.ts
1288
- const config = await import("./agent-yes.config-BhjzWavn.js").then((mod) => mod.default || mod);
1271
+ const config = await import("./agent-yes.config-DPtMM0S-.js").then((mod) => mod.default || mod);
1289
1272
  const CLIS_CONFIG = config.clis;
1290
1273
  /**
1291
1274
  * Main function to run agent-cli with automatic yes/no responses
@@ -2044,4 +2027,4 @@ function sleep(ms) {
2044
2027
 
2045
2028
  //#endregion
2046
2029
  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-D1FDmhc-.js.map
2030
+ //# sourceMappingURL=ts-Dd1FK7sR.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.236.0";
10
+ var version = "1.237.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-DJEtU1JU.js.map
218
+ //# sourceMappingURL=versionChecker-XfEBINhH.js.map
@@ -1,4 +1,4 @@
1
- import { u as parseSecret } from "./e2e-CYlKpfxa.js";
1
+ import { u as parseSecret } from "./e2e-CEIdJGZ7.js";
2
2
 
3
3
  //#region ts/webrtcLink.ts
4
4
  const SIGNAL_SUBPROTOCOL = "ay-signal-1";
@@ -42,4 +42,4 @@ function isWebrtcSpec(spec) {
42
42
 
43
43
  //#endregion
44
44
  export { isWebrtcSpec as n, parseWebrtcLink as r, SIGNAL_SUBPROTOCOL as t };
45
- //# sourceMappingURL=webrtcLink-CEYNs0pt.js.map
45
+ //# sourceMappingURL=webrtcLink-VQhWmKOw.js.map
@@ -1,5 +1,5 @@
1
- import { a as computeTranscriptHash, c as open, d as randomHex, f as seal, l as packEnvelope, n as FLAG_CONFIRM, o as deriveAuthToken, p as unpackEnvelope, s as deriveDirKeys } from "./e2e-CYlKpfxa.js";
2
- import { n as isWebrtcSpec, r as parseWebrtcLink, t as SIGNAL_SUBPROTOCOL } from "./webrtcLink-CEYNs0pt.js";
1
+ import { a as computeTranscriptHash, c as open, d as randomHex, f as seal, l as packEnvelope, n as FLAG_CONFIRM, o as deriveAuthToken, p as unpackEnvelope, s as deriveDirKeys } from "./e2e-CEIdJGZ7.js";
2
+ import { n as isWebrtcSpec, r as parseWebrtcLink, t as SIGNAL_SUBPROTOCOL } from "./webrtcLink-VQhWmKOw.js";
3
3
  import { RTCPeerConnection } from "node-datachannel/polyfill";
4
4
 
5
5
  //#region ts/webrtcRemote.ts
@@ -256,4 +256,4 @@ async function startWebrtcBridge(link) {
256
256
 
257
257
  //#endregion
258
258
  export { startWebrtcBridge };
259
- //# sourceMappingURL=webrtcRemote-CNC_bMH6.js.map
259
+ //# sourceMappingURL=webrtcRemote-DJDtCTpj.js.map
@@ -0,0 +1,7 @@
1
+ import "./e2e-CEIdJGZ7.js";
2
+ import "./channels-BiGUYTuz.js";
3
+ import "./peer-B5JKF4BP.js";
4
+ import { t as AyChannel } from "./browser-B3dOptjL.js";
5
+ import { t as AyTerminal } from "./browser-BRMyG4JA.js";
6
+
7
+ export { AyChannel, AyTerminal };
@@ -1,4 +1,4 @@
1
- import { t as agentYesHome } from "./agentYesHome-CtHb5b71.js";
1
+ import { t as agentYesHome } from "./agentYesHome-CtmsY6I-.js";
2
2
  import { lstatSync, mkdirSync, readFileSync, statSync, writeFileSync } from "fs";
3
3
  import { homedir } from "os";
4
4
  import path from "path";
@@ -193,4 +193,4 @@ function resolveSpawnCwd(input) {
193
193
 
194
194
  //#endregion
195
195
  export { getSpawnHook as a, hasProvisionHook as c, resolveSpawnCwd as d, setWorkspaceRoot as f, getProvisionRoot as i, hasSpawnHook as l, getMinFreeMb as n, getSpawnWaitMs as o, getProvisionHook as r, getWorkspaceRoot as s, getMaxAgents as t, isProvisionAllowed as u };
196
- //# sourceMappingURL=workspaceConfig-CuGjX2_R.js.map
196
+ //# sourceMappingURL=workspaceConfig-B7HaQ-MI.js.map
@@ -1,12 +1,12 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import "./globalPidIndex-Ca4sTr1b.js";
3
- import "./messageLog-zVGWLX7w.js";
4
- import "./e2e-CYlKpfxa.js";
5
- import "./configShared-BXz2vi4Q.js";
6
- import { S as listRecords } from "./subcommands-_Ci82sb1.js";
7
- import "./webrtcLink-CEYNs0pt.js";
8
- import "./remotes-BDdfhL6N.js";
9
- import { i as getProvisionRoot } from "./workspaceConfig-CuGjX2_R.js";
2
+ import "./globalPidIndex-D9DOSd-c.js";
3
+ import "./messageLog-C-YIzhRj.js";
4
+ import "./e2e-CEIdJGZ7.js";
5
+ import "./configShared-9wVlbPyC.js";
6
+ import { S as listRecords } from "./subcommands-DFr-5FOL.js";
7
+ import "./webrtcLink-VQhWmKOw.js";
8
+ import "./remotes-Bem6WIyU.js";
9
+ import { i as getProvisionRoot } from "./workspaceConfig-B7HaQ-MI.js";
10
10
  import { existsSync } from "fs";
11
11
  import { lstat, opendir } from "fs/promises";
12
12
  import path from "path";
@@ -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-C7B4xWQl.js.map
421
+ //# sourceMappingURL=ws-Dun8gGiV.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-yes",
3
- "version": "1.236.0",
3
+ "version": "1.237.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",
@@ -62,6 +62,8 @@
62
62
  "ts/*.ts",
63
63
  "ts/channels/*.ts",
64
64
  "!ts/channels/*.spec.ts",
65
+ "ts/terminal/*.ts",
66
+ "!ts/terminal/*.spec.ts",
65
67
  "!dist/**/*.map",
66
68
  "dist/**/*.js",
67
69
  "lab/ui/console-logic.js",
@@ -87,6 +89,14 @@
87
89
  "./channels": {
88
90
  "types": "./ts/channels/browser.ts",
89
91
  "import": "./dist/channels.js"
92
+ },
93
+ "./terminal": {
94
+ "types": "./ts/terminal/browser.ts",
95
+ "import": "./dist/terminal.js"
96
+ },
97
+ "./widgets": {
98
+ "types": "./ts/widgets.ts",
99
+ "import": "./dist/widgets.js"
90
100
  }
91
101
  },
92
102
  "publishConfig": {
@@ -134,6 +144,8 @@
134
144
  },
135
145
  "devDependencies": {
136
146
  "@google/generative-ai": "^0.24.1",
147
+ "@xterm/addon-fit": "^0.11.0",
148
+ "@xterm/xterm": "^6.0.0",
137
149
  "@semantic-release/exec": "^7.1.0",
138
150
  "@semantic-release/git": "^10.0.1",
139
151
  "@types/bun": "^1.3.6",