agent-yes 1.274.0 → 1.275.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 (28) hide show
  1. package/dist/{SUPPORTED_CLIS-DibEQVjZ.js → SUPPORTED_CLIS-CBBBtJ4_.js} +3 -3
  2. package/dist/{SUPPORTED_CLIS-CNrMN-89.js → SUPPORTED_CLIS-DHk85zfy.js} +2 -2
  3. package/dist/{agentShare-YWrrxqN2.js → agentShare-CaSaTksu.js} +2 -2
  4. package/dist/{callback-DwnU5Bnx.js → callback-DpzzyOsY.js} +3 -3
  5. package/dist/{callback-DK1hFHPw.js → callback-Se8JJTZ9.js} +2 -2
  6. package/dist/cli.js +5 -5
  7. package/dist/{cmdPs-tpr2ARd3.js → cmdPs-C6BKjicc.js} +2 -2
  8. package/dist/index.js +2 -2
  9. package/dist/{notifyDaemon-Dx5sjDIx.js → notifyDaemon-ej83JK7y.js} +2 -2
  10. package/dist/{parentPingLoop-DV7fBiMN.js → parentPingLoop-ke06LhOS.js} +2 -2
  11. package/dist/{rustBinary-DDwz4LdD.js → rustBinary-BWXier75.js} +2 -2
  12. package/dist/{rustBinary-B7cNTxWn.js → rustBinary-D5xxABSh.js} +2 -2
  13. package/dist/{schedule-Bc5tKPJi.js → schedule-CSB8FTTu.js} +4 -4
  14. package/dist/{serve-ClCAkuSj.js → serve-B6aYKTLs.js} +17 -17
  15. package/dist/{setup-D6v3wsXq.js → setup-MM_Sn30Q.js} +2 -2
  16. package/dist/{subcommands-DLqtyQdw.js → subcommands-DAqYMqVx.js} +1 -1
  17. package/dist/{subcommands-D0TqxBxb.js → subcommands-Em1Mjajb.js} +15 -15
  18. package/dist/{terminal-Dzu-PTIU.js → terminal-Bg1GFfRw.js} +2 -2
  19. package/dist/{trayApp-DCG8CjCV.js → trayApp-ChDq575c.js} +2 -2
  20. package/dist/trayApp-Dieq8pPs.js +5 -0
  21. package/dist/{ts-BmGAFUb7.js → ts-CUI0pmYw.js} +3 -3
  22. package/dist/{versionChecker-DzWZizq2.js → versionChecker-B7eWJMXy.js} +2 -2
  23. package/dist/{widget-hU12_Sog.js → widget-vCVi9QYk.js} +3 -3
  24. package/dist/{ws-jKReYJJw.js → ws-D2An6-fY.js} +2 -2
  25. package/dist/{ws-pRbF59zo.js → ws-MQ5iyIWn.js} +2 -2
  26. package/lab/ui/index.html +185 -9
  27. package/package.json +1 -1
  28. package/dist/trayApp-kjebnTl9.js +0 -5
@@ -1,12 +1,12 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import "./versionChecker-DzWZizq2.js";
3
- import "./ts-BmGAFUb7.js";
2
+ import "./versionChecker-B7eWJMXy.js";
3
+ import "./ts-CUI0pmYw.js";
4
4
  import "./todoAutomation-CbVVS4re.js";
5
5
  import "./JsonlStore-BqF7AQ6E.js";
6
6
  import "./globalPidIndex-DoaKEUkO.js";
7
7
  import "./pidStore-B73xnAeT.js";
8
8
  import "./messageLog-DdjBNqgt.js";
9
9
  import "./todoStore-DF6vxHgV.js";
10
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-CNrMN-89.js";
10
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-DHk85zfy.js";
11
11
 
12
12
  export { SUPPORTED_CLIS };
@@ -1,8 +1,8 @@
1
- import { t as CLIS_CONFIG } from "./ts-BmGAFUb7.js";
1
+ import { t as CLIS_CONFIG } from "./ts-CUI0pmYw.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-CNrMN-89.js.map
8
+ //# sourceMappingURL=SUPPORTED_CLIS-DHk85zfy.js.map
@@ -3,7 +3,7 @@ import "./globalPidIndex-DoaKEUkO.js";
3
3
  import "./messageLog-DdjBNqgt.js";
4
4
  import "./e2e-z1xpwSAg.js";
5
5
  import "./configShared-DKTgiz7K.js";
6
- import { z as resolveOne } from "./subcommands-D0TqxBxb.js";
6
+ import { z as resolveOne } from "./subcommands-Em1Mjajb.js";
7
7
  import "./notifyStore-2SWKGwZI.js";
8
8
  import "./webrtcLink-DLaJfTcB.js";
9
9
  import "./remotes-Cdlaj7AP.js";
@@ -230,4 +230,4 @@ function transformEvent(rawEvent, agentId, forwarded) {
230
230
 
231
231
  //#endregion
232
232
  export { createScopedShare, listShares, revokeAllShares, revokeShare };
233
- //# sourceMappingURL=agentShare-YWrrxqN2.js.map
233
+ //# sourceMappingURL=agentShare-CaSaTksu.js.map
@@ -1,5 +1,5 @@
1
1
  import { t as agentYesHome } from "./agentYesHome-BNtn19J4.js";
2
- import { z as resolveOne } from "./subcommands-D0TqxBxb.js";
2
+ import { z as resolveOne } from "./subcommands-Em1Mjajb.js";
3
3
  import { a as mintCapability, o as parseExpires } from "./callbackCore-Bl2gGcxg.js";
4
4
  import { randomBytes } from "node:crypto";
5
5
  import { chmodSync, readFileSync, renameSync, writeFileSync } from "node:fs";
@@ -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-ClCAkuSj.js");
75
+ const { resolveLocalServeUrl } = await import("./serve-B6aYKTLs.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-DwnU5Bnx.js.map
190
+ //# sourceMappingURL=callback-DpzzyOsY.js.map
@@ -3,11 +3,11 @@ import "./globalPidIndex-DoaKEUkO.js";
3
3
  import "./messageLog-DdjBNqgt.js";
4
4
  import "./e2e-z1xpwSAg.js";
5
5
  import "./configShared-DKTgiz7K.js";
6
- import "./subcommands-D0TqxBxb.js";
6
+ import "./subcommands-Em1Mjajb.js";
7
7
  import "./notifyStore-2SWKGwZI.js";
8
8
  import "./webrtcLink-DLaJfTcB.js";
9
9
  import "./remotes-Cdlaj7AP.js";
10
10
  import "./callbackCore-Bl2gGcxg.js";
11
- import { i as loadOrCreateCallbackSecret, n as isCallbackRevoked, r as loadCallbackSecretReadOnly, t as cmdCallback } from "./callback-DwnU5Bnx.js";
11
+ import { i as loadOrCreateCallbackSecret, n as isCallbackRevoked, r as loadCallbackSecretReadOnly, t as cmdCallback } from "./callback-DpzzyOsY.js";
12
12
 
13
13
  export { cmdCallback };
package/dist/cli.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env bun
2
2
  import { t as invokedCliName } from "./invokedCli-zdFbz1ST.js";
3
3
  import { n as logger } from "./logger-CDIsZ-Pp.js";
4
- import { a as versionString, r as displayVersion, t as checkAndAutoUpdate } from "./versionChecker-DzWZizq2.js";
5
- import { l as getRustBinary } from "./rustBinary-DDwz4LdD.js";
4
+ import { a as versionString, r as displayVersion, t as checkAndAutoUpdate } from "./versionChecker-B7eWJMXy.js";
5
+ import { l as getRustBinary } from "./rustBinary-BWXier75.js";
6
6
  import { argv } from "process";
7
7
  import { spawn } from "child_process";
8
8
  import ms from "ms";
@@ -295,7 +295,7 @@ function buildRustArgs(argv, cliFromScript, supportedClis) {
295
295
  const rawArg = process.argv[2];
296
296
  const managerCommands = !invokedCliName(process.argv);
297
297
  const isHelpFlag = rawArg === "-h" || rawArg === "--help";
298
- const { isSubcommand, runSubcommand, cmdHelp, isUnknownManagerToken, isBareManagerInvocation } = await import("./subcommands-DLqtyQdw.js");
298
+ const { isSubcommand, runSubcommand, cmdHelp, isUnknownManagerToken, isBareManagerInvocation } = await import("./subcommands-DAqYMqVx.js");
299
299
  if (isHelpFlag && process.argv.length === 3) {
300
300
  await cmdHelp(managerCommands);
301
301
  process.exit(0);
@@ -309,7 +309,7 @@ function buildRustArgs(argv, cliFromScript, supportedClis) {
309
309
  process.exit(code ?? 0);
310
310
  }
311
311
  {
312
- const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-DibEQVjZ.js");
312
+ const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-CBBBtJ4_.js");
313
313
  if (isUnknownManagerToken(rawArg, managerCommands, SUPPORTED_CLIS)) {
314
314
  process.stderr.write(`ay: unknown subcommand or CLI '${rawArg}'.\n See 'ay help' for subcommands. To run an agent, name a CLI:\n 'ay <cli> …' (e.g. 'ay claude …') or 'ay --cli <cli> …'.\n`);
315
315
  process.exit(1);
@@ -360,7 +360,7 @@ if (config.useRust) {
360
360
  }
361
361
  }
362
362
  if (rustBinary) {
363
- const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-DibEQVjZ.js");
363
+ const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-CBBBtJ4_.js");
364
364
  const rustArgs = buildRustArgs(process.argv, config.cli, SUPPORTED_CLIS);
365
365
  if (config.verbose) {
366
366
  console.log(`[rust] Using binary: ${rustBinary}`);
@@ -3,7 +3,7 @@ import "./globalPidIndex-DoaKEUkO.js";
3
3
  import "./messageLog-DdjBNqgt.js";
4
4
  import "./e2e-z1xpwSAg.js";
5
5
  import "./configShared-DKTgiz7K.js";
6
- import { $ as buildAgentForest, D as listRecords, et as flattenForest, u as deriveLiveState } from "./subcommands-D0TqxBxb.js";
6
+ import { $ as buildAgentForest, D as listRecords, et as flattenForest, u as deriveLiveState } from "./subcommands-Em1Mjajb.js";
7
7
  import "./notifyStore-2SWKGwZI.js";
8
8
  import "./webrtcLink-DLaJfTcB.js";
9
9
  import "./remotes-Cdlaj7AP.js";
@@ -574,4 +574,4 @@ function readPpidSync(pid) {
574
574
 
575
575
  //#endregion
576
576
  export { cmdPs };
577
- //# sourceMappingURL=cmdPs-tpr2ARd3.js.map
577
+ //# sourceMappingURL=cmdPs-C6BKjicc.js.map
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import "./versionChecker-DzWZizq2.js";
3
- import { a as hasTodoStore, i as answerAsk, l as AgentContext, n as agentYes, o as listAsks, r as config, s as listAsksForProject, t as CLIS_CONFIG } from "./ts-BmGAFUb7.js";
2
+ import "./versionChecker-B7eWJMXy.js";
3
+ import { a as hasTodoStore, i as answerAsk, l as AgentContext, n as agentYes, o as listAsks, r as config, s as listAsksForProject, t as CLIS_CONFIG } from "./ts-CUI0pmYw.js";
4
4
  import { a as renderTree, c as describeBlock, i as renderDigest, l as monitorHint, o as unblockedTasks, r as openBlockers, t as reconcileTodos, u as removeControlCharacters } from "./todoAutomation-CbVVS4re.js";
5
5
  import "./JsonlStore-BqF7AQ6E.js";
6
6
  import "./globalPidIndex-DoaKEUkO.js";
@@ -3,7 +3,7 @@ import "./globalPidIndex-DoaKEUkO.js";
3
3
  import "./messageLog-DdjBNqgt.js";
4
4
  import "./e2e-z1xpwSAg.js";
5
5
  import "./configShared-DKTgiz7K.js";
6
- import { D as listRecords, I as renderLogTailLines, b as isPidAlive, u as deriveLiveState } from "./subcommands-D0TqxBxb.js";
6
+ import { D as listRecords, I as renderLogTailLines, b as isPidAlive, u as deriveLiveState } from "./subcommands-Em1Mjajb.js";
7
7
  import { f as readInbox, g as daemonLockOwnerPath, h as daemonLockDir, i as gcInboxes, l as listInboxParents, m as shouldStealLock, n as appendEvent, s as hostId, u as liveWatchers, x as notifyDir } from "./notifyStore-2SWKGwZI.js";
8
8
  import "./webrtcLink-DLaJfTcB.js";
9
9
  import "./remotes-Cdlaj7AP.js";
@@ -863,4 +863,4 @@ async function ensureDaemon() {
863
863
 
864
864
  //#endregion
865
865
  export { daemonStatus, ensureDaemon, requestDaemonStop, runDaemon };
866
- //# sourceMappingURL=notifyDaemon-Dx5sjDIx.js.map
866
+ //# sourceMappingURL=notifyDaemon-ej83JK7y.js.map
@@ -338,7 +338,7 @@ async function isParentWatching(parentWrapperPid, parentAgentPid, selfAgentPid,
338
338
  logger.debug("[parent-ping] watcher lookup failed:", error);
339
339
  }
340
340
  try {
341
- const { lastReadAt, READ_WINDOW_MS } = await import("./subcommands-DLqtyQdw.js");
341
+ const { lastReadAt, READ_WINDOW_MS } = await import("./subcommands-DAqYMqVx.js");
342
342
  const last = await lastReadAt(`agent:${parentAgentPid}`, selfAgentPid);
343
343
  if (last !== null && now - last <= READ_WINDOW_MS) return true;
344
344
  } catch (error) {
@@ -466,4 +466,4 @@ function startParentPingLoop(opts) {
466
466
 
467
467
  //#endregion
468
468
  export { startParentPingLoop };
469
- //# sourceMappingURL=parentPingLoop-DV7fBiMN.js.map
469
+ //# sourceMappingURL=parentPingLoop-ke06LhOS.js.map
@@ -1,4 +1,4 @@
1
- import { i as getInstalledPackage, n as compareVersions } from "./versionChecker-DzWZizq2.js";
1
+ import { i as getInstalledPackage, n as compareVersions } from "./versionChecker-B7eWJMXy.js";
2
2
  import { execFileSync } from "child_process";
3
3
  import { existsSync, mkdirSync, readdirSync, rmSync, statSync, unlinkSync } from "fs";
4
4
  import { chmod, copyFile } from "fs/promises";
@@ -310,4 +310,4 @@ async function getRustBinary(options = {}) {
310
310
 
311
311
  //#endregion
312
312
  export { gcOldBinaryDirs as a, getDownloadUrl as c, findTrayLauncher as i, getRustBinary as l, findRustBinary as n, getBinDir as o, findSpawnHiddenLauncher as r, getBinaryName as s, downloadBinary as t };
313
- //# sourceMappingURL=rustBinary-DDwz4LdD.js.map
313
+ //# sourceMappingURL=rustBinary-BWXier75.js.map
@@ -1,4 +1,4 @@
1
- import "./versionChecker-DzWZizq2.js";
2
- import { a as gcOldBinaryDirs, c as getDownloadUrl, i as findTrayLauncher, l as getRustBinary, n as findRustBinary, o as getBinDir, r as findSpawnHiddenLauncher, s as getBinaryName, t as downloadBinary } from "./rustBinary-DDwz4LdD.js";
1
+ import "./versionChecker-B7eWJMXy.js";
2
+ import { a as gcOldBinaryDirs, c as getDownloadUrl, i as findTrayLauncher, l as getRustBinary, n as findRustBinary, o as getBinDir, r as findSpawnHiddenLauncher, s as getBinaryName, t as downloadBinary } from "./rustBinary-BWXier75.js";
3
3
 
4
4
  export { gcOldBinaryDirs };
@@ -1,13 +1,13 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import "./versionChecker-DzWZizq2.js";
3
- import "./ts-BmGAFUb7.js";
2
+ import "./versionChecker-B7eWJMXy.js";
3
+ import "./ts-CUI0pmYw.js";
4
4
  import "./todoAutomation-CbVVS4re.js";
5
5
  import "./JsonlStore-BqF7AQ6E.js";
6
6
  import "./globalPidIndex-DoaKEUkO.js";
7
7
  import "./pidStore-B73xnAeT.js";
8
8
  import "./messageLog-DdjBNqgt.js";
9
9
  import "./todoStore-DF6vxHgV.js";
10
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-CNrMN-89.js";
10
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-DHk85zfy.js";
11
11
  import { f as resolveSpawnCwd } from "./workspaceConfig-DctWuxUP.js";
12
12
  import { n as liveEnv, t as ensureNodeRuntime } from "./nodeRuntime-C_LtZrpR.js";
13
13
  import { createHash } from "node:crypto";
@@ -154,4 +154,4 @@ async function cmdSchedule(rest) {
154
154
 
155
155
  //#endregion
156
156
  export { cmdSchedule };
157
- //# sourceMappingURL=schedule-Bc5tKPJi.js.map
157
+ //# sourceMappingURL=schedule-CSB8FTTu.js.map
@@ -1,7 +1,7 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import { i as getInstalledPackage } from "./versionChecker-DzWZizq2.js";
3
- import { r as findSpawnHiddenLauncher } from "./rustBinary-DDwz4LdD.js";
4
- import { c as permissionBadge, i as answerAsk, o as listAsks, u as CLAUDE_SESSION_PIN_ENV } from "./ts-BmGAFUb7.js";
2
+ import { i as getInstalledPackage } from "./versionChecker-B7eWJMXy.js";
3
+ import { r as findSpawnHiddenLauncher } from "./rustBinary-BWXier75.js";
4
+ import { c as permissionBadge, i as answerAsk, o as listAsks, u as CLAUDE_SESSION_PIN_ENV } from "./ts-CUI0pmYw.js";
5
5
  import { t as agentYesHome$1 } from "./agentYesHome-BNtn19J4.js";
6
6
  import { u as removeControlCharacters } from "./todoAutomation-CbVVS4re.js";
7
7
  import "./JsonlStore-BqF7AQ6E.js";
@@ -12,18 +12,18 @@ import { t as pgidForWrapper } from "./reaper-UimuuTfO.js";
12
12
  import "./todoStore-DF6vxHgV.js";
13
13
  import "./e2e-z1xpwSAg.js";
14
14
  import "./configShared-DKTgiz7K.js";
15
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-CNrMN-89.js";
16
- import { D as listRecords, F as recentReadEdges, I as renderLogTailLines, L as renderRawLog, M as readNotes, N as readPtysize, P as recentMessageEdges, Q as TYPING_BADGE, R as renderRawLogLines, W as snapshotStatus, X as writeToIpc, Z as withIpcLock, c as controlCodeFromName, d as deriveLiveStatus, f as extractBadges, h as extractTaskCounts, j as readLogForRender, m as extractNeedsInput, w as isUserTyping, z as resolveOne } from "./subcommands-D0TqxBxb.js";
15
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-DHk85zfy.js";
16
+ import { D as listRecords, F as recentReadEdges, I as renderLogTailLines, L as renderRawLog, M as readNotes, N as readPtysize, P as recentMessageEdges, Q as TYPING_BADGE, R as renderRawLogLines, W as snapshotStatus, X as writeToIpc, Z as withIpcLock, c as controlCodeFromName, d as deriveLiveStatus, f as extractBadges, h as extractTaskCounts, j as readLogForRender, m as extractNeedsInput, w as isUserTyping, z as resolveOne } from "./subcommands-Em1Mjajb.js";
17
17
  import { c as isTransientLockMkdirError } from "./notifyStore-2SWKGwZI.js";
18
18
  import "./webrtcLink-DLaJfTcB.js";
19
19
  import "./remotes-Cdlaj7AP.js";
20
20
  import { i as frameVisitorMessage, s as verifyCapability, t as MAX_CALLBACK_MSG_BYTES } from "./callbackCore-Bl2gGcxg.js";
21
- import { n as isCallbackRevoked, r as loadCallbackSecretReadOnly } from "./callback-DwnU5Bnx.js";
21
+ import { n as isCallbackRevoked, r as loadCallbackSecretReadOnly } from "./callback-DpzzyOsY.js";
22
22
  import { a as getProvisionRoot, d as isProvisionAllowed, f as resolveSpawnCwd, i as getProvisionHook, l as hasProvisionHook, o as getSpawnHook, t as allowsSkipPermissions, u as hasSpawnHook } from "./workspaceConfig-DctWuxUP.js";
23
23
  import { n as liveEnv, t as ensureNodeRuntime } from "./nodeRuntime-C_LtZrpR.js";
24
- import { i as importProvisionModule } from "./ws-pRbF59zo.js";
24
+ import { i as importProvisionModule } from "./ws-MQ5iyIWn.js";
25
25
  import { r as spawnRejectionReason } from "./spawnGate-DtC_ffme.js";
26
- import { i as launchTray } from "./trayApp-DCG8CjCV.js";
26
+ import { i as launchTray } from "./trayApp-ChDq575c.js";
27
27
  import yargs from "yargs";
28
28
  import { appendFile, mkdir, open, readFile, readdir, rename, rm, stat, unlink, writeFile } from "fs/promises";
29
29
  import { arch, cpus, freemem, homedir, hostname, loadavg, platform, totalmem, uptime, userInfo } from "os";
@@ -2436,7 +2436,7 @@ Options:
2436
2436
  }
2437
2437
  });
2438
2438
  if (req.method === "GET" && p === "/api/ws") {
2439
- const ws = await import("./ws-jKReYJJw.js");
2439
+ const ws = await import("./ws-D2An6-fY.js");
2440
2440
  try {
2441
2441
  await ws.loadProvision();
2442
2442
  } catch (e) {
@@ -2456,7 +2456,7 @@ Options:
2456
2456
  if (req.method === "GET" && p === "/api/ws/status") {
2457
2457
  const dirRaw = url.searchParams.get("path");
2458
2458
  if (!dirRaw) return new Response("missing ?path=<workspace dir>", { status: 400 });
2459
- const ws = await import("./ws-jKReYJJw.js");
2459
+ const ws = await import("./ws-D2An6-fY.js");
2460
2460
  let prov;
2461
2461
  try {
2462
2462
  prov = await ws.loadProvision();
@@ -2478,7 +2478,7 @@ Options:
2478
2478
  }
2479
2479
  }
2480
2480
  if (req.method === "GET" && p === "/api/ws/repos") {
2481
- const ws = await import("./ws-jKReYJJw.js");
2481
+ const ws = await import("./ws-D2An6-fY.js");
2482
2482
  try {
2483
2483
  await ws.loadProvision();
2484
2484
  } catch (e) {
@@ -2559,7 +2559,7 @@ Options:
2559
2559
  const m = /^([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)$/.exec(repoParam);
2560
2560
  if (!m || m[1] === "." || m[1] === ".." || m[2] === "." || m[2] === "..") return new Response("missing/invalid ?repo=<owner>/<repo>", { status: 400 });
2561
2561
  const [, owner, repo] = m;
2562
- const ws = await import("./ws-jKReYJJw.js");
2562
+ const ws = await import("./ws-D2An6-fY.js");
2563
2563
  let prov;
2564
2564
  try {
2565
2565
  prov = await ws.loadProvision();
@@ -3470,7 +3470,7 @@ Options:
3470
3470
  const perm = body.perm ?? "r";
3471
3471
  if (perm !== "r" && perm !== "rw") return new Response(`invalid perm ${perm} (want r or rw)`, { status: 400 });
3472
3472
  try {
3473
- const { createScopedShare } = await import("./agentShare-YWrrxqN2.js");
3473
+ const { createScopedShare } = await import("./agentShare-CaSaTksu.js");
3474
3474
  const share = await createScopedShare({
3475
3475
  agent: body.agent,
3476
3476
  perm,
@@ -3485,12 +3485,12 @@ Options:
3485
3485
  }
3486
3486
  }
3487
3487
  if (req.method === "GET" && p === "/api/shares") {
3488
- const { listShares } = await import("./agentShare-YWrrxqN2.js");
3488
+ const { listShares } = await import("./agentShare-CaSaTksu.js");
3489
3489
  return Response.json(listShares());
3490
3490
  }
3491
3491
  const revokeM = /^\/api\/share\/([^/]+)$/.exec(p);
3492
3492
  if (req.method === "DELETE" && revokeM) {
3493
- const { revokeShare } = await import("./agentShare-YWrrxqN2.js");
3493
+ const { revokeShare } = await import("./agentShare-CaSaTksu.js");
3494
3494
  const ok = revokeShare(decodeURIComponent(revokeM[1]));
3495
3495
  return new Response(ok ? "revoked" : "no such share", { status: ok ? 200 : 404 });
3496
3496
  }
@@ -3795,7 +3795,7 @@ Options:
3795
3795
  const shutdown = (resolve) => {
3796
3796
  if (heartbeat) clearInterval(heartbeat);
3797
3797
  closeShare?.();
3798
- import("./agentShare-YWrrxqN2.js").then((m) => m.revokeAllShares()).catch(() => {});
3798
+ import("./agentShare-CaSaTksu.js").then((m) => m.revokeAllShares()).catch(() => {});
3799
3799
  server?.stop();
3800
3800
  Promise.resolve(releaseHostLock?.()).catch(() => {}).then(resolve);
3801
3801
  };
@@ -3808,4 +3808,4 @@ Options:
3808
3808
 
3809
3809
  //#endregion
3810
3810
  export { cmdServe, loadTokenReadOnly, mintScopedTermToken, resolveDaemonHttpBase, resolveLocalServeUrl };
3811
- //# sourceMappingURL=serve-ClCAkuSj.js.map
3811
+ //# sourceMappingURL=serve-B6aYKTLs.js.map
@@ -40,7 +40,7 @@ async function cmdSetup(rest) {
40
40
  } catch {}
41
41
  if (noShare) return 0;
42
42
  process.stdout.write(`\nsharing this machine to agent-yes.com…\n`);
43
- const { cmdServe } = await import("./serve-ClCAkuSj.js");
43
+ const { cmdServe } = await import("./serve-B6aYKTLs.js");
44
44
  return cmdServe([
45
45
  "install",
46
46
  "--share",
@@ -50,4 +50,4 @@ async function cmdSetup(rest) {
50
50
 
51
51
  //#endregion
52
52
  export { cmdSetup };
53
- //# sourceMappingURL=setup-D6v3wsXq.js.map
53
+ //# sourceMappingURL=setup-MM_Sn30Q.js.map
@@ -3,7 +3,7 @@ import "./globalPidIndex-DoaKEUkO.js";
3
3
  import "./messageLog-DdjBNqgt.js";
4
4
  import "./e2e-z1xpwSAg.js";
5
5
  import "./configShared-DKTgiz7K.js";
6
- import { A as readAgentPtysize, B as resolveReadWindow, C as isUnknownManagerToken, D as listRecords, E as lastStdinAt, F as recentReadEdges, G as stdinActivityPath, H as restartHintLines, I as renderLogTailLines, J as waitForLogQuiet, K as stopTipForCli, L as renderRawLog, M as readNotes, N as readPtysize, O as matchKeyword, P as recentMessageEdges, R as renderRawLogLines, S as isSubcommand, T as lastReadAt, U as runSubcommand, V as resolveResumeArgs, W as snapshotStatus, X as writeToIpc, Y as writeKeysPaced, _ as isAgentStuck, a as TYPING_WINDOW_MS, b as isPidAlive, c as controlCodeFromName, d as deriveLiveStatus, f as extractBadges, g as finalizedLines, h as extractTaskCounts, i as READ_WINDOW_MS, j as readLogForRender, k as menuSelectKeys, l as cursorAbs, m as extractNeedsInput, n as MAX_RENDER_BYTES, o as backoffWhileTyping, p as extractMenu, q as submitAndConfirm, r as READ_PAGE_DEFAULT, s as cmdHelp, t as GRACEFUL_EXIT_COMMANDS, u as deriveLiveState, v as isBareManagerInvocation, w as isUserTyping, x as isSlashCommand, y as isExitRequest, z as resolveOne } from "./subcommands-D0TqxBxb.js";
6
+ import { A as readAgentPtysize, B as resolveReadWindow, C as isUnknownManagerToken, D as listRecords, E as lastStdinAt, F as recentReadEdges, G as stdinActivityPath, H as restartHintLines, I as renderLogTailLines, J as waitForLogQuiet, K as stopTipForCli, L as renderRawLog, M as readNotes, N as readPtysize, O as matchKeyword, P as recentMessageEdges, R as renderRawLogLines, S as isSubcommand, T as lastReadAt, U as runSubcommand, V as resolveResumeArgs, W as snapshotStatus, X as writeToIpc, Y as writeKeysPaced, _ as isAgentStuck, a as TYPING_WINDOW_MS, b as isPidAlive, c as controlCodeFromName, d as deriveLiveStatus, f as extractBadges, g as finalizedLines, h as extractTaskCounts, i as READ_WINDOW_MS, j as readLogForRender, k as menuSelectKeys, l as cursorAbs, m as extractNeedsInput, n as MAX_RENDER_BYTES, o as backoffWhileTyping, p as extractMenu, q as submitAndConfirm, r as READ_PAGE_DEFAULT, s as cmdHelp, t as GRACEFUL_EXIT_COMMANDS, u as deriveLiveState, v as isBareManagerInvocation, w as isUserTyping, x as isSlashCommand, y as isExitRequest, z as resolveOne } from "./subcommands-Em1Mjajb.js";
7
7
  import "./notifyStore-2SWKGwZI.js";
8
8
  import "./webrtcLink-DLaJfTcB.js";
9
9
  import "./remotes-Cdlaj7AP.js";
@@ -904,7 +904,7 @@ async function runSubcommand(argv) {
904
904
  switch (sub) {
905
905
  case "ls":
906
906
  case "list": return await cmdLs(rest);
907
- case "ps": return await (await import("./cmdPs-tpr2ARd3.js")).cmdPs(rest);
907
+ case "ps": return await (await import("./cmdPs-C6BKjicc.js")).cmdPs(rest);
908
908
  case "status": return await cmdStatus(rest);
909
909
  case "whoami": return await cmdWhoami(rest);
910
910
  case "result": return await cmdResult(rest);
@@ -951,35 +951,35 @@ async function runSubcommand(argv) {
951
951
  return cmdCh(rest);
952
952
  }
953
953
  case "term": {
954
- const { cmdTerm } = await import("./terminal-Dzu-PTIU.js");
954
+ const { cmdTerm } = await import("./terminal-Bg1GFfRw.js");
955
955
  return cmdTerm(rest);
956
956
  }
957
957
  case "widget": {
958
- const { cmdWidget } = await import("./widget-hU12_Sog.js");
958
+ const { cmdWidget } = await import("./widget-vCVi9QYk.js");
959
959
  return cmdWidget(rest);
960
960
  }
961
961
  case "mint": {
962
- const { cmdMint } = await import("./widget-hU12_Sog.js");
962
+ const { cmdMint } = await import("./widget-vCVi9QYk.js");
963
963
  return cmdMint(rest);
964
964
  }
965
965
  case "serve": {
966
- const { cmdServe } = await import("./serve-ClCAkuSj.js");
966
+ const { cmdServe } = await import("./serve-B6aYKTLs.js");
967
967
  return cmdServe(rest);
968
968
  }
969
969
  case "tray": {
970
- const { cmdTray } = await import("./trayApp-kjebnTl9.js");
970
+ const { cmdTray } = await import("./trayApp-Dieq8pPs.js");
971
971
  return cmdTray(rest);
972
972
  }
973
973
  case "setup": {
974
- const { cmdSetup } = await import("./setup-D6v3wsXq.js");
974
+ const { cmdSetup } = await import("./setup-MM_Sn30Q.js");
975
975
  return cmdSetup(rest);
976
976
  }
977
977
  case "ws": {
978
- const { cmdWs } = await import("./ws-jKReYJJw.js");
978
+ const { cmdWs } = await import("./ws-D2An6-fY.js");
979
979
  return cmdWs(rest);
980
980
  }
981
981
  case "schedule": {
982
- const { cmdSchedule } = await import("./schedule-Bc5tKPJi.js");
982
+ const { cmdSchedule } = await import("./schedule-CSB8FTTu.js");
983
983
  return cmdSchedule(rest);
984
984
  }
985
985
  case "remote": {
@@ -991,14 +991,14 @@ async function runSubcommand(argv) {
991
991
  return cmdExpose(rest);
992
992
  }
993
993
  case "callback": {
994
- const { cmdCallback } = await import("./callback-DK1hFHPw.js");
994
+ const { cmdCallback } = await import("./callback-Se8JJTZ9.js");
995
995
  return cmdCallback(rest);
996
996
  }
997
997
  case "reap":
998
998
  await (await import("./reaper-BDMiMfwK.js")).sweep();
999
999
  return 0;
1000
1000
  case "gc": {
1001
- const { gcOldBinaryDirs } = await import("./rustBinary-B7cNTxWn.js");
1001
+ const { gcOldBinaryDirs } = await import("./rustBinary-D5xxABSh.js");
1002
1002
  const res = gcOldBinaryDirs();
1003
1003
  if (res.removed.length === 0) process.stdout.write("no old agent-yes binary cache dirs to remove\n");
1004
1004
  else {
@@ -3474,7 +3474,7 @@ async function cmdAttach(rest) {
3474
3474
  const winsizeDir = path.join(ayHome, "winsize");
3475
3475
  await mkdir(winsizeDir, { recursive: true });
3476
3476
  const winsizePath = path.join(winsizeDir, String(record.pid));
3477
- const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-ClCAkuSj.js");
3477
+ const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-B6aYKTLs.js");
3478
3478
  const daemonBase = await resolveDaemonHttpBase().catch(() => null);
3479
3479
  const daemonToken = daemonBase ? await loadTokenReadOnly().catch(() => null) ?? "" : "";
3480
3480
  const capViewer = `attach:${process.pid}`;
@@ -4192,7 +4192,7 @@ async function cmdNotify(rest) {
4192
4192
  }
4193
4193
  const ensure = async () => {
4194
4194
  if (!argv["ensure-daemon"]) return;
4195
- const { ensureDaemon } = await import("./notifyDaemon-Dx5sjDIx.js");
4195
+ const { ensureDaemon } = await import("./notifyDaemon-ej83JK7y.js");
4196
4196
  await ensureDaemon().catch(() => null);
4197
4197
  };
4198
4198
  await heartbeatWatcher(parent, selfStartedAt);
@@ -4266,7 +4266,7 @@ async function cmdNotifyCursor(args) {
4266
4266
  }
4267
4267
  async function cmdNotifyd(rest) {
4268
4268
  const sub = rest[0] ?? "status";
4269
- const daemon = await import("./notifyDaemon-Dx5sjDIx.js");
4269
+ const daemon = await import("./notifyDaemon-ej83JK7y.js");
4270
4270
  switch (sub) {
4271
4271
  case "run": return daemon.runDaemon();
4272
4272
  case "once": return daemon.runDaemon({ once: true });
@@ -4293,4 +4293,4 @@ async function cmdNotifyd(rest) {
4293
4293
 
4294
4294
  //#endregion
4295
4295
  export { buildAgentForest as $, readAgentPtysize as A, resolveReadWindow as B, isUnknownManagerToken as C, listRecords as D, lastStdinAt as E, recentReadEdges as F, stdinActivityPath as G, restartHintLines as H, renderLogTailLines as I, waitForLogQuiet as J, stopTipForCli as K, renderRawLog as L, readNotes as M, readPtysize as N, matchKeyword as O, recentMessageEdges as P, TYPING_BADGE as Q, renderRawLogLines as R, isSubcommand as S, lastReadAt as T, runSubcommand as U, resolveResumeArgs as V, snapshotStatus as W, writeToIpc as X, writeKeysPaced as Y, withIpcLock as Z, isAgentStuck as _, TYPING_WINDOW_MS as a, isPidAlive as b, controlCodeFromName as c, deriveLiveStatus as d, flattenForest as et, extractBadges as f, finalizedLines as g, extractTaskCounts as h, READ_WINDOW_MS as i, readLogForRender as j, menuSelectKeys as k, cursorAbs as l, extractNeedsInput as m, MAX_RENDER_BYTES as n, backoffWhileTyping as o, extractMenu as p, submitAndConfirm as q, READ_PAGE_DEFAULT as r, cmdHelp as s, GRACEFUL_EXIT_COMMANDS as t, deriveLiveState as u, isBareManagerInvocation as v, isUserTyping as w, isSlashCommand as x, isExitRequest as y, resolveOne as z };
4296
- //# sourceMappingURL=subcommands-D0TqxBxb.js.map
4296
+ //# sourceMappingURL=subcommands-Em1Mjajb.js.map
@@ -98,7 +98,7 @@ async function cmdTermMint(args) {
98
98
  if (flags.ro && flags.interactive) throw new Error("--ro and --interactive are mutually exclusive");
99
99
  const ttlSec = parseTtlSec(typeof flags.ttl === "string" ? flags.ttl : "15m");
100
100
  const canSend = flags.interactive === true;
101
- const { mintScopedTermToken } = await import("./serve-ClCAkuSj.js");
101
+ const { mintScopedTermToken } = await import("./serve-B6aYKTLs.js");
102
102
  const r = await mintScopedTermToken(pid, {
103
103
  ttlSec,
104
104
  canSend
@@ -135,4 +135,4 @@ async function cmdTerm(args) {
135
135
 
136
136
  //#endregion
137
137
  export { cmdTerm };
138
- //# sourceMappingURL=terminal-Dzu-PTIU.js.map
138
+ //# sourceMappingURL=terminal-Bg1GFfRw.js.map
@@ -1,4 +1,4 @@
1
- import { i as findTrayLauncher } from "./rustBinary-DDwz4LdD.js";
1
+ import { i as findTrayLauncher } from "./rustBinary-BWXier75.js";
2
2
  import { t as agentYesHome } from "./agentYesHome-BNtn19J4.js";
3
3
  import { existsSync } from "node:fs";
4
4
  import path from "node:path";
@@ -97,4 +97,4 @@ async function cmdTray(args) {
97
97
 
98
98
  //#endregion
99
99
  export { trayHiddenMarker as a, launchTray as i, hasDesktop as n, isTrayHidden as r, cmdTray as t };
100
- //# sourceMappingURL=trayApp-DCG8CjCV.js.map
100
+ //# sourceMappingURL=trayApp-ChDq575c.js.map
@@ -0,0 +1,5 @@
1
+ import "./versionChecker-B7eWJMXy.js";
2
+ import "./rustBinary-BWXier75.js";
3
+ import { a as trayHiddenMarker, i as launchTray, n as hasDesktop, r as isTrayHidden, t as cmdTray } from "./trayApp-ChDq575c.js";
4
+
5
+ export { cmdTray };
@@ -1,6 +1,6 @@
1
1
  import { n as __esmMin, r as __exportAll } from "./chunk-cZBX9HZv.js";
2
2
  import { n as logger, t as addTransport } from "./logger-CDIsZ-Pp.js";
3
- import { i as getInstalledPackage } from "./versionChecker-DzWZizq2.js";
3
+ import { i as getInstalledPackage } from "./versionChecker-B7eWJMXy.js";
4
4
  import { t as agentYesHome } from "./agentYesHome-BNtn19J4.js";
5
5
  import { u as removeControlCharacters } from "./todoAutomation-CbVVS4re.js";
6
6
  import { i as shouldUseLock, r as releaseLock, t as acquireLock } from "./runningLock-BOIPD_Vs.js";
@@ -2071,7 +2071,7 @@ async function agentYes({ cli, cliArgs = [], skipPermissions = false, prompt, ro
2071
2071
  }, 100);
2072
2072
  const cleanupHeartbeat = () => clearInterval(heartbeatInterval);
2073
2073
  shell.onExit(cleanupHeartbeat);
2074
- const { startParentPingLoop } = await import("./parentPingLoop-DV7fBiMN.js");
2074
+ const { startParentPingLoop } = await import("./parentPingLoop-ke06LhOS.js");
2075
2075
  const parentPingLoop = startParentPingLoop({
2076
2076
  parentPid,
2077
2077
  selfWrapperPid: process.pid,
@@ -2334,4 +2334,4 @@ function sleep(ms) {
2334
2334
 
2335
2335
  //#endregion
2336
2336
  export { hasTodoStore as a, permissionBadge as c, answerAsk as i, AgentContext as l, agentYes as n, listAsks as o, config as r, listAsksForProject as s, CLIS_CONFIG as t, CLAUDE_SESSION_PIN_ENV as u };
2337
- //# sourceMappingURL=ts-BmGAFUb7.js.map
2337
+ //# sourceMappingURL=ts-CUI0pmYw.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.274.0";
10
+ var version = "1.275.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 a, getInstalledPackage as i, compareVersions as n, displayVersion as r, checkAndAutoUpdate as t };
218
- //# sourceMappingURL=versionChecker-DzWZizq2.js.map
218
+ //# sourceMappingURL=versionChecker-B7eWJMXy.js.map
@@ -28,7 +28,7 @@ function parseFlags(args, known) {
28
28
  }
29
29
  /** Resolve the local daemon base URL + token (flags override discovery). */
30
30
  async function daemonTarget(flags) {
31
- const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-ClCAkuSj.js");
31
+ const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-B6aYKTLs.js");
32
32
  const base = typeof flags.base === "string" ? flags.base : await resolveDaemonHttpBase();
33
33
  if (!base) throw new Error("no running ay serve daemon found — start `ay serve` or pass --base <url> (e.g. http://127.0.0.1:PORT)");
34
34
  const token = typeof flags.token === "string" ? flags.token : await loadTokenReadOnly() ?? "";
@@ -186,7 +186,7 @@ async function cmdMint(args) {
186
186
  const bad = caps.filter((c) => !KNOWN_CAPS.has(c));
187
187
  if (bad.length) throw new Error(`unknown cap(s): ${bad.join(", ")} (valid: ${[...KNOWN_CAPS].join(", ")})`);
188
188
  const ttlSec = parseTtlSec(typeof flags.ttl === "string" ? flags.ttl : "15m");
189
- const { mintScopedTermToken } = await import("./serve-ClCAkuSj.js");
189
+ const { mintScopedTermToken } = await import("./serve-B6aYKTLs.js");
190
190
  const r = await mintScopedTermToken(target, {
191
191
  ttlSec,
192
192
  caps
@@ -202,4 +202,4 @@ async function cmdMint(args) {
202
202
 
203
203
  //#endregion
204
204
  export { cmdMint, cmdWidget };
205
- //# sourceMappingURL=widget-hU12_Sog.js.map
205
+ //# sourceMappingURL=widget-vCVi9QYk.js.map
@@ -3,10 +3,10 @@ import "./globalPidIndex-DoaKEUkO.js";
3
3
  import "./messageLog-DdjBNqgt.js";
4
4
  import "./e2e-z1xpwSAg.js";
5
5
  import "./configShared-DKTgiz7K.js";
6
- import "./subcommands-D0TqxBxb.js";
6
+ import "./subcommands-Em1Mjajb.js";
7
7
  import "./notifyStore-2SWKGwZI.js";
8
8
  import "./webrtcLink-DLaJfTcB.js";
9
9
  import "./remotes-Cdlaj7AP.js";
10
- import { a as isPathInside, c as walkWorkspaces, i as importProvisionModule, l as workspaceStatus, n as cmdWs, o as loadProvision, r as collectWorkspaces, s as resolveOperand, t as WS_JSON_SCHEMA } from "./ws-pRbF59zo.js";
10
+ import { a as isPathInside, c as walkWorkspaces, i as importProvisionModule, l as workspaceStatus, n as cmdWs, o as loadProvision, r as collectWorkspaces, s as resolveOperand, t as WS_JSON_SCHEMA } from "./ws-MQ5iyIWn.js";
11
11
 
12
12
  export { WS_JSON_SCHEMA, cmdWs, collectWorkspaces, isPathInside, loadProvision, walkWorkspaces, workspaceStatus };
@@ -1,4 +1,4 @@
1
- import { D as listRecords } from "./subcommands-D0TqxBxb.js";
1
+ import { D as listRecords } from "./subcommands-Em1Mjajb.js";
2
2
  import { a as getProvisionRoot } from "./workspaceConfig-DctWuxUP.js";
3
3
  import { existsSync } from "fs";
4
4
  import { lstat, opendir } from "fs/promises";
@@ -424,4 +424,4 @@ async function cmdWs(args) {
424
424
 
425
425
  //#endregion
426
426
  export { isPathInside as a, walkWorkspaces as c, importProvisionModule as i, workspaceStatus as l, cmdWs as n, loadProvision as o, collectWorkspaces as r, resolveOperand as s, WS_JSON_SCHEMA as t };
427
- //# sourceMappingURL=ws-pRbF59zo.js.map
427
+ //# sourceMappingURL=ws-MQ5iyIWn.js.map
package/lab/ui/index.html CHANGED
@@ -144,7 +144,10 @@
144
144
  }
145
145
 
146
146
  /* ---- left: list ---- */
147
+ /* position:relative anchors the floating "+ New agent" FAB (see .newbtn)
148
+ to this panel, so it rides the splitter instead of the viewport. */
147
149
  .left {
150
+ position: relative;
148
151
  display: flex;
149
152
  flex-direction: column;
150
153
  min-width: 0;
@@ -1053,26 +1056,82 @@
1053
1056
  margin-top: 16px;
1054
1057
  }
1055
1058
 
1056
- /* new-agent button (header) + spawn form (reuses the launch overlay shell) */
1059
+ /* new-agent button (floating FAB) + spawn form (reuses the launch overlay shell) */
1057
1060
  .metaright {
1058
1061
  display: flex;
1059
1062
  align-items: center;
1060
1063
  gap: 10px;
1061
1064
  }
1065
+ /* Floats over the bottom-right of the left panel and can be dragged
1066
+ anywhere inside it (position persisted as right/bottom offsets — see the
1067
+ drag IIFE near the splitter's). z-index sits above the list + its wire
1068
+ overlay but below every modal/overlay, so it never covers a dialog.
1069
+ The solid-accent look here is also the no-backdrop-filter fallback:
1070
+ translucent without a blur behind it would be unreadable over rows. */
1062
1071
  .newbtn {
1072
+ position: absolute;
1073
+ right: 14px;
1074
+ bottom: max(14px, var(--sab));
1075
+ z-index: 10;
1063
1076
  background: var(--accent);
1064
1077
  color: var(--bg);
1065
- border: 0;
1066
- border-radius: 7px;
1078
+ border: 1px solid transparent;
1079
+ border-radius: 999px;
1067
1080
  font-weight: 600;
1068
1081
  font-size: 11.5px;
1069
- padding: 4px 11px;
1082
+ padding: 7px 14px;
1070
1083
  cursor: pointer;
1071
1084
  line-height: 1.6;
1085
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.28);
1086
+ touch-action: none; /* pointermove must not be stolen by scroll-to-pan */
1087
+ user-select: none;
1088
+ -webkit-user-select: none;
1089
+ -webkit-tap-highlight-color: transparent;
1090
+ transition:
1091
+ background 0.18s ease,
1092
+ color 0.18s ease,
1093
+ box-shadow 0.18s ease;
1072
1094
  }
1073
1095
  .newbtn:hover {
1074
1096
  filter: brightness(1.12);
1075
1097
  }
1098
+ .newbtn.dragging {
1099
+ cursor: grabbing;
1100
+ transition: none; /* follow the pointer 1:1, don't lag behind it */
1101
+ }
1102
+ /* Liquid-glass idle state, only where the platform can actually blur what's
1103
+ behind the button (Safari/Chrome/Edge, and Firefox with the pref on).
1104
+ Unfocused = translucent tinted glass with a specular rim; hover / keyboard
1105
+ focus / drag snap it back to the opaque accent pill above. */
1106
+ @supports (
1107
+ ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) and
1108
+ (background: color-mix(in srgb, red, blue))
1109
+ ) {
1110
+ .newbtn {
1111
+ background: color-mix(in srgb, var(--accent) 16%, transparent);
1112
+ color: var(--accent);
1113
+ border-color: color-mix(in srgb, var(--fg) 18%, transparent);
1114
+ -webkit-backdrop-filter: blur(14px) saturate(180%);
1115
+ backdrop-filter: blur(14px) saturate(180%);
1116
+ box-shadow:
1117
+ 0 4px 14px rgba(0, 0, 0, 0.22),
1118
+ inset 0 1px 0 color-mix(in srgb, #fff 34%, transparent),
1119
+ inset 0 -1px 0 color-mix(in srgb, #000 14%, transparent);
1120
+ }
1121
+ .newbtn:hover,
1122
+ .newbtn:focus-visible,
1123
+ .newbtn.dragging {
1124
+ background: var(--accent);
1125
+ color: var(--bg);
1126
+ border-color: transparent;
1127
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.32);
1128
+ }
1129
+ }
1130
+ @media (prefers-reduced-motion: reduce) {
1131
+ .newbtn {
1132
+ transition: none;
1133
+ }
1134
+ }
1076
1135
  .viewbtn {
1077
1136
  background: transparent;
1078
1137
  border: 1px solid var(--line);
@@ -1181,8 +1240,10 @@
1181
1240
  overflow-y: auto;
1182
1241
  flex: 1;
1183
1242
  min-height: 0;
1184
- /* clear the home-indicator / gesture bar so the last row stays tappable */
1185
- padding-bottom: var(--sab);
1243
+ /* clear the home-indicator / gesture bar so the last row stays tappable,
1244
+ plus room for the floating New-agent FAB parked at the bottom-right
1245
+ without it the last row can never be scrolled out from under the button. */
1246
+ padding-bottom: calc(var(--sab) + 60px);
1186
1247
  }
1187
1248
  .row {
1188
1249
  padding: 11px 18px;
@@ -2079,15 +2140,21 @@
2079
2140
  </button>
2080
2141
  </div>
2081
2142
  </span>
2082
- <button id="newbtn" class="newbtn" title="spawn a new agent on this fleet">
2083
- + New agent
2084
- </button>
2085
2143
  <span id="conn" class="connbadge" title="rooms — click to manage">● local</span>
2086
2144
  </span>
2087
2145
  </div>
2088
2146
  <div class="rooms" id="rooms" style="display: none"></div>
2089
2147
  </div>
2090
2148
  <div class="list" id="list"></div>
2149
+ <!-- Floating spawn FAB: last child of .left so it paints over the list;
2150
+ absolutely positioned + draggable inside the panel (see .newbtn). -->
2151
+ <button
2152
+ id="newbtn"
2153
+ class="newbtn"
2154
+ title="spawn a new agent on this fleet — drag to move the button"
2155
+ >
2156
+ + New agent
2157
+ </button>
2091
2158
  </div>
2092
2159
 
2093
2160
  <div class="splitter" id="splitter" title="drag to resize"></div>
@@ -8830,6 +8897,115 @@ my.translate = async (text, lang) => {
8830
8897
  sp.addEventListener("pointerup", end);
8831
8898
  sp.addEventListener("pointercancel", end);
8832
8899
  })();
8900
+
8901
+ // ---- draggable floating "+ New agent" FAB ------------------------------
8902
+ // The button floats over the bottom-right of the left panel and can be
8903
+ // parked anywhere inside it. The position is stored as offsets from the
8904
+ // panel's RIGHT/BOTTOM edges (not left/top) so it stays put when the
8905
+ // splitter resizes the panel or the layout flips to the mobile column.
8906
+ (function () {
8907
+ const btn = $("newbtn");
8908
+ const left = document.querySelector(".left");
8909
+ if (!btn || !left) return;
8910
+ const KEY = "ay.newbtnPos";
8911
+ const EDGE = 8; // never let the button hang off the panel
8912
+ const THRESH = 5; // px of travel before a press counts as a drag
8913
+ let pos = null; // {r,b} the user's intent, pre-clamp
8914
+ let drag = null;
8915
+ let suppressClick = false;
8916
+
8917
+ // Clamp against the CURRENT panel box on every apply: a saved position
8918
+ // from a wide panel must not push the button out of a narrow one, but
8919
+ // `pos` keeps the original intent so widening restores it.
8920
+ function apply() {
8921
+ if (!pos) return;
8922
+ const lr = left.getBoundingClientRect();
8923
+ if (!lr.width || !lr.height) return; // panel hidden (mobile detail view)
8924
+ const maxR = Math.max(EDGE, lr.width - btn.offsetWidth - EDGE);
8925
+ const maxB = Math.max(EDGE, lr.height - btn.offsetHeight - EDGE);
8926
+ btn.style.right = Math.min(Math.max(pos.r, EDGE), maxR) + "px";
8927
+ btn.style.bottom = Math.min(Math.max(pos.b, EDGE), maxB) + "px";
8928
+ }
8929
+
8930
+ try {
8931
+ const s = JSON.parse(localStorage.getItem(KEY) || "null");
8932
+ if (s && isFinite(s.r) && isFinite(s.b)) pos = { r: +s.r, b: +s.b };
8933
+ } catch {}
8934
+ apply();
8935
+ // Re-clamp whenever the panel box changes — window resize, splitter drag
8936
+ // (which never fires a window resize), or the mobile column flip.
8937
+ if (typeof ResizeObserver === "function") new ResizeObserver(apply).observe(left);
8938
+ else addEventListener("resize", apply);
8939
+
8940
+ btn.addEventListener("pointerdown", (e) => {
8941
+ if (e.pointerType === "mouse" && e.button !== 0) return;
8942
+ const lr = left.getBoundingClientRect();
8943
+ const br = btn.getBoundingClientRect();
8944
+ drag = {
8945
+ id: e.pointerId,
8946
+ x: e.clientX,
8947
+ y: e.clientY,
8948
+ r: lr.right - br.right,
8949
+ b: lr.bottom - br.bottom,
8950
+ moved: false,
8951
+ };
8952
+ suppressClick = false;
8953
+ try {
8954
+ btn.setPointerCapture(e.pointerId);
8955
+ } catch {}
8956
+ });
8957
+
8958
+ btn.addEventListener("pointermove", (e) => {
8959
+ if (!drag || e.pointerId !== drag.id) return;
8960
+ const dx = e.clientX - drag.x;
8961
+ const dy = e.clientY - drag.y;
8962
+ if (!drag.moved) {
8963
+ if (Math.abs(dx) + Math.abs(dy) < THRESH) return;
8964
+ drag.moved = true;
8965
+ btn.classList.add("dragging");
8966
+ }
8967
+ e.preventDefault(); // no text selection / scroll chaining mid-drag
8968
+ pos = { r: drag.r - dx, b: drag.b - dy };
8969
+ apply();
8970
+ });
8971
+
8972
+ const end = (e) => {
8973
+ if (!drag || e.pointerId !== drag.id) return;
8974
+ const moved = drag.moved;
8975
+ drag = null;
8976
+ btn.classList.remove("dragging");
8977
+ try {
8978
+ btn.releasePointerCapture(e.pointerId);
8979
+ } catch {}
8980
+ if (!moved) return;
8981
+ // Persist what's actually on screen (the clamped value), so a later
8982
+ // resize can't spring the button back to somewhere off-panel.
8983
+ pos = { r: parseFloat(btn.style.right) || EDGE, b: parseFloat(btn.style.bottom) || EDGE };
8984
+ try {
8985
+ localStorage.setItem(KEY, JSON.stringify(pos));
8986
+ } catch {}
8987
+ suppressClick = true; // pointerup on a <button> still emits a click
8988
+ };
8989
+ btn.addEventListener("pointerup", end);
8990
+ btn.addEventListener("pointercancel", end);
8991
+
8992
+ // Swallow the click a finished drag synthesizes. It has to be a CAPTURE
8993
+ // listener on an ancestor: capture on document runs before the target's
8994
+ // own bubble listener (showNew), which was registered first and would
8995
+ // otherwise win.
8996
+ document.addEventListener(
8997
+ "click",
8998
+ (e) => {
8999
+ if (!suppressClick) return;
9000
+ suppressClick = false;
9001
+ if (e.target === btn || btn.contains(e.target)) {
9002
+ e.stopPropagation();
9003
+ e.preventDefault();
9004
+ }
9005
+ },
9006
+ true,
9007
+ );
9008
+ })();
8833
9009
  boot();
8834
9010
  </script>
8835
9011
  </body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-yes",
3
- "version": "1.274.0",
3
+ "version": "1.275.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",
@@ -1,5 +0,0 @@
1
- import "./versionChecker-DzWZizq2.js";
2
- import "./rustBinary-DDwz4LdD.js";
3
- import { a as trayHiddenMarker, i as launchTray, n as hasDesktop, r as isTrayHidden, t as cmdTray } from "./trayApp-DCG8CjCV.js";
4
-
5
- export { cmdTray };