@songsid/agend 2.2.0-alpha.1 → 2.2.0-alpha.3

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 (317) hide show
  1. package/README.md +6 -4
  2. package/README.zh-TW.md +6 -4
  3. package/dist/agent-cli.js +6 -1
  4. package/dist/agent-cli.js.map +1 -1
  5. package/dist/agent-endpoint.d.ts +4 -1
  6. package/dist/agent-endpoint.js +82 -14
  7. package/dist/agent-endpoint.js.map +1 -1
  8. package/dist/agent-token-header.d.ts +13 -0
  9. package/dist/agent-token-header.js +16 -0
  10. package/dist/agent-token-header.js.map +1 -0
  11. package/dist/atomic-write.d.ts +21 -0
  12. package/dist/atomic-write.js +65 -0
  13. package/dist/atomic-write.js.map +1 -0
  14. package/dist/auth-api.js +2 -0
  15. package/dist/auth-api.js.map +1 -1
  16. package/dist/backend/antigravity.js +4 -3
  17. package/dist/backend/antigravity.js.map +1 -1
  18. package/dist/backend/codex.d.ts +7 -0
  19. package/dist/backend/codex.js +7 -0
  20. package/dist/backend/codex.js.map +1 -1
  21. package/dist/backend/grok.js +1 -1
  22. package/dist/backend/grok.js.map +1 -1
  23. package/dist/backend/kiro.d.ts +7 -0
  24. package/dist/backend/kiro.js +82 -33
  25. package/dist/backend/kiro.js.map +1 -1
  26. package/dist/backend/muse.d.ts +7 -0
  27. package/dist/backend/muse.js +8 -1
  28. package/dist/backend/muse.js.map +1 -1
  29. package/dist/backend/types.d.ts +12 -0
  30. package/dist/backend/types.js.map +1 -1
  31. package/dist/binary-probe.d.ts +80 -0
  32. package/dist/binary-probe.js +182 -0
  33. package/dist/binary-probe.js.map +1 -0
  34. package/dist/cache-analysis.d.ts +92 -0
  35. package/dist/cache-analysis.js +147 -0
  36. package/dist/cache-analysis.js.map +1 -0
  37. package/dist/cache-ledger.d.ts +108 -0
  38. package/dist/cache-ledger.js +230 -0
  39. package/dist/cache-ledger.js.map +1 -0
  40. package/dist/cache-prices.d.ts +32 -0
  41. package/dist/cache-prices.js +73 -0
  42. package/dist/cache-prices.js.map +1 -0
  43. package/dist/cache-scan.d.ts +39 -0
  44. package/dist/cache-scan.js +115 -0
  45. package/dist/cache-scan.js.map +1 -0
  46. package/dist/cache-service.d.ts +131 -0
  47. package/dist/cache-service.js +452 -0
  48. package/dist/cache-service.js.map +1 -0
  49. package/dist/channel/adapters/discord.d.ts +5 -1
  50. package/dist/channel/adapters/discord.js +56 -11
  51. package/dist/channel/adapters/discord.js.map +1 -1
  52. package/dist/channel/adapters/telegram.d.ts +38 -1
  53. package/dist/channel/adapters/telegram.js +82 -0
  54. package/dist/channel/adapters/telegram.js.map +1 -1
  55. package/dist/channel/mcp-tools.js +1 -1
  56. package/dist/channel/mcp-tools.js.map +1 -1
  57. package/dist/channel/tool-router.d.ts +8 -1
  58. package/dist/channel/tool-router.js +4 -2
  59. package/dist/channel/tool-router.js.map +1 -1
  60. package/dist/channel/types.d.ts +21 -0
  61. package/dist/cli-entry.d.ts +19 -0
  62. package/dist/cli-entry.js +36 -0
  63. package/dist/cli-entry.js.map +1 -0
  64. package/dist/cli.js +376 -54
  65. package/dist/cli.js.map +1 -1
  66. package/dist/connection-secrets.d.ts +5 -0
  67. package/dist/connection-secrets.js.map +1 -1
  68. package/dist/cpu-profile.js +50 -0
  69. package/dist/cpu-profile.js.map +1 -1
  70. package/dist/daemon.d.ts +18 -0
  71. package/dist/daemon.js +256 -63
  72. package/dist/daemon.js.map +1 -1
  73. package/dist/delivery-outbox.d.ts +1 -0
  74. package/dist/delivery-outbox.js +12 -0
  75. package/dist/delivery-outbox.js.map +1 -1
  76. package/dist/discord-permissions.d.ts +33 -0
  77. package/dist/discord-permissions.js +42 -0
  78. package/dist/discord-permissions.js.map +1 -0
  79. package/dist/env-file.d.ts +11 -0
  80. package/dist/env-file.js +27 -0
  81. package/dist/env-file.js.map +1 -0
  82. package/dist/event-log.d.ts +4 -1
  83. package/dist/event-log.js +6 -3
  84. package/dist/event-log.js.map +1 -1
  85. package/dist/fleet-context.d.ts +5 -0
  86. package/dist/fleet-context.js.map +1 -1
  87. package/dist/fleet-control-audit.d.ts +5 -0
  88. package/dist/fleet-control-audit.js +7 -0
  89. package/dist/fleet-control-audit.js.map +1 -1
  90. package/dist/fleet-level-config.d.ts +8 -1
  91. package/dist/fleet-level-config.js +53 -0
  92. package/dist/fleet-level-config.js.map +1 -1
  93. package/dist/fleet-manager.d.ts +122 -7
  94. package/dist/fleet-manager.js +871 -152
  95. package/dist/fleet-manager.js.map +1 -1
  96. package/dist/fleet-stop-budget.d.ts +22 -0
  97. package/dist/fleet-stop-budget.js +95 -0
  98. package/dist/fleet-stop-budget.js.map +1 -0
  99. package/dist/full-restart.js +2 -3
  100. package/dist/full-restart.js.map +1 -1
  101. package/dist/general-knowledge/skills/persona-emoji/SKILL.md +3 -1
  102. package/dist/install-lock.d.ts +49 -0
  103. package/dist/install-lock.js +200 -0
  104. package/dist/install-lock.js.map +1 -0
  105. package/dist/instance-config-impact.js +3 -2
  106. package/dist/instance-config-impact.js.map +1 -1
  107. package/dist/kiro-transcript-lane.d.ts +8 -4
  108. package/dist/kiro-transcript-lane.js +66 -44
  109. package/dist/kiro-transcript-lane.js.map +1 -1
  110. package/dist/locale.js +96 -0
  111. package/dist/locale.js.map +1 -1
  112. package/dist/next-steps.d.ts +5 -0
  113. package/dist/next-steps.js +26 -0
  114. package/dist/next-steps.js.map +1 -0
  115. package/dist/outbound-handlers.js +8 -0
  116. package/dist/outbound-handlers.js.map +1 -1
  117. package/dist/outbound-schemas.d.ts +4 -0
  118. package/dist/outbound-schemas.js +7 -2
  119. package/dist/outbound-schemas.js.map +1 -1
  120. package/dist/outbox-open-error.d.ts +7 -0
  121. package/dist/outbox-open-error.js +15 -0
  122. package/dist/outbox-open-error.js.map +1 -0
  123. package/dist/package-preimage.d.ts +26 -0
  124. package/dist/package-preimage.js +96 -0
  125. package/dist/package-preimage.js.map +1 -0
  126. package/dist/pane-context-cache.d.ts +25 -0
  127. package/dist/pane-context-cache.js +73 -0
  128. package/dist/pane-context-cache.js.map +1 -0
  129. package/dist/paths.d.ts +0 -7
  130. package/dist/paths.js +8 -2
  131. package/dist/paths.js.map +1 -1
  132. package/dist/provider-probe.d.ts +15 -0
  133. package/dist/provider-probe.js +20 -0
  134. package/dist/provider-probe.js.map +1 -1
  135. package/dist/public-link-progress.d.ts +73 -0
  136. package/dist/public-link-progress.js +190 -0
  137. package/dist/public-link-progress.js.map +1 -0
  138. package/dist/public-web-gateway.js +2 -2
  139. package/dist/public-web-gateway.js.map +1 -1
  140. package/dist/public-web-link.d.ts +6 -1
  141. package/dist/public-web-link.js +87 -15
  142. package/dist/public-web-link.js.map +1 -1
  143. package/dist/quickstart-api.d.ts +93 -20
  144. package/dist/quickstart-api.js +194 -62
  145. package/dist/quickstart-api.js.map +1 -1
  146. package/dist/quickstart.d.ts +15 -0
  147. package/dist/quickstart.js +110 -33
  148. package/dist/quickstart.js.map +1 -1
  149. package/dist/reply-buttons-controller.d.ts +98 -0
  150. package/dist/reply-buttons-controller.js +174 -0
  151. package/dist/reply-buttons-controller.js.map +1 -0
  152. package/dist/reply-buttons.d.ts +113 -0
  153. package/dist/reply-buttons.js +208 -0
  154. package/dist/reply-buttons.js.map +1 -0
  155. package/dist/reply-dedup.js +3 -1
  156. package/dist/reply-dedup.js.map +1 -1
  157. package/dist/restart-guard.d.ts +53 -0
  158. package/dist/restart-guard.js +114 -0
  159. package/dist/restart-guard.js.map +1 -0
  160. package/dist/scheduler/db.js +6 -2
  161. package/dist/scheduler/db.js.map +1 -1
  162. package/dist/service-activation.d.ts +62 -7
  163. package/dist/service-activation.js +237 -55
  164. package/dist/service-activation.js.map +1 -1
  165. package/dist/service-installer.d.ts +56 -1
  166. package/dist/service-installer.js +152 -12
  167. package/dist/service-installer.js.map +1 -1
  168. package/dist/service-plan.d.ts +65 -0
  169. package/dist/service-plan.js +108 -0
  170. package/dist/service-plan.js.map +1 -0
  171. package/dist/settings-api.js +92 -10
  172. package/dist/settings-api.js.map +1 -1
  173. package/dist/settings-authority.d.ts +11 -0
  174. package/dist/settings-authority.js +128 -0
  175. package/dist/settings-authority.js.map +1 -0
  176. package/dist/settings-change.d.ts +5 -0
  177. package/dist/settings-change.js +37 -8
  178. package/dist/settings-change.js.map +1 -1
  179. package/dist/settings-confirmation.d.ts +3 -0
  180. package/dist/settings-confirmation.js +7 -1
  181. package/dist/settings-confirmation.js.map +1 -1
  182. package/dist/settings-effect.js +19 -7
  183. package/dist/settings-effect.js.map +1 -1
  184. package/dist/settings-http-confirmation.js +1 -1
  185. package/dist/settings-http-confirmation.js.map +1 -1
  186. package/dist/settings-redaction.d.ts +18 -0
  187. package/dist/settings-redaction.js +58 -0
  188. package/dist/settings-redaction.js.map +1 -0
  189. package/dist/setup-form.d.ts +9 -1
  190. package/dist/setup-form.js +25 -1
  191. package/dist/setup-form.js.map +1 -1
  192. package/dist/setup-host.js +15 -6
  193. package/dist/setup-host.js.map +1 -1
  194. package/dist/setup-wizard.js +27 -19
  195. package/dist/setup-wizard.js.map +1 -1
  196. package/dist/sqlite-open-errors.d.ts +12 -0
  197. package/dist/sqlite-open-errors.js +13 -0
  198. package/dist/sqlite-open-errors.js.map +1 -0
  199. package/dist/systemd-runtime.d.ts +15 -0
  200. package/dist/systemd-runtime.js +41 -0
  201. package/dist/systemd-runtime.js.map +1 -0
  202. package/dist/tmux-control.d.ts +44 -0
  203. package/dist/tmux-control.js +170 -21
  204. package/dist/tmux-control.js.map +1 -1
  205. package/dist/token-env-name.d.ts +37 -0
  206. package/dist/token-env-name.js +93 -0
  207. package/dist/token-env-name.js.map +1 -0
  208. package/dist/tool-permissions.js +5 -3
  209. package/dist/tool-permissions.js.map +1 -1
  210. package/dist/topic-commands.d.ts +7 -16
  211. package/dist/topic-commands.js +56 -85
  212. package/dist/topic-commands.js.map +1 -1
  213. package/dist/transcript-monitor.js +3 -0
  214. package/dist/transcript-monitor.js.map +1 -1
  215. package/dist/transcript-sources.d.ts +68 -0
  216. package/dist/transcript-sources.js +336 -29
  217. package/dist/transcript-sources.js.map +1 -1
  218. package/dist/transcript-turns.d.ts +39 -0
  219. package/dist/transcript-turns.js +58 -0
  220. package/dist/transcript-turns.js.map +1 -0
  221. package/dist/tunnel/cloudflared-install.d.ts +18 -0
  222. package/dist/tunnel/cloudflared-install.js +15 -1
  223. package/dist/tunnel/cloudflared-install.js.map +1 -1
  224. package/dist/turn-reply-guard.d.ts +3 -0
  225. package/dist/turn-reply-guard.js.map +1 -1
  226. package/dist/ui/chat-commands.js +43 -0
  227. package/dist/ui/chat-render.js +34 -8
  228. package/dist/ui/chat-store.js +51 -2
  229. package/dist/ui/chat-strings.js +30 -2
  230. package/dist/ui/chat-thread.js +141 -47
  231. package/dist/ui/first-run.js +64 -0
  232. package/dist/ui/fleet-cache.js +168 -0
  233. package/dist/ui/html-attachment.js +26 -0
  234. package/dist/ui/panel-chat.js +117 -23
  235. package/dist/ui/panel-fleet.js +31 -17
  236. package/dist/ui/panel-settings.js +29 -15
  237. package/dist/ui/preview-panel.js +237 -0
  238. package/dist/ui/preview.js +7 -3
  239. package/dist/ui/settings-apply.js +3 -1
  240. package/dist/ui/settings-dialogs.js +95 -25
  241. package/dist/ui/settings-discord.js +130 -0
  242. package/dist/ui/settings-model.js +21 -0
  243. package/dist/ui/settings-strings.js +50 -8
  244. package/dist/ui/settings-token.js +54 -0
  245. package/dist/ui/settings-wizard.js +63 -29
  246. package/dist/ui/shared/app-route.js +1 -1
  247. package/dist/ui/shared/app-shell.js +25 -37
  248. package/dist/ui/shared/app-store.js +5 -3
  249. package/dist/ui/shared/app-stream.js +2 -1
  250. package/dist/ui/shared/app.css +181 -5
  251. package/dist/ui/shared/app.js +2 -1
  252. package/dist/ui/shared/instance-nav.js +310 -0
  253. package/dist/ui/shared/panel-view.js +12 -190
  254. package/dist/ui/shared/signin.js +13 -1
  255. package/dist/ui/shared/ui-icons.js +2 -0
  256. package/dist/ui/shared/view-roster-store.js +5 -0
  257. package/dist/ui/shared/view-strings.js +12 -0
  258. package/dist/ui/signin.html +2 -1
  259. package/dist/update-dispatch.d.ts +28 -0
  260. package/dist/update-dispatch.js +73 -0
  261. package/dist/update-dispatch.js.map +1 -0
  262. package/dist/update-install.d.ts +78 -8
  263. package/dist/update-install.js +158 -30
  264. package/dist/update-install.js.map +1 -1
  265. package/dist/update-launch.d.ts +22 -0
  266. package/dist/update-launch.js +106 -0
  267. package/dist/update-launch.js.map +1 -0
  268. package/dist/update-marker.js +3 -8
  269. package/dist/update-marker.js.map +1 -1
  270. package/dist/usage/format-rich.js +7 -1
  271. package/dist/usage/format-rich.js.map +1 -1
  272. package/dist/usage/i18n-keys.d.ts +1 -1
  273. package/dist/usage/i18n-keys.js +1 -1
  274. package/dist/usage/i18n-keys.js.map +1 -1
  275. package/dist/usage/providers.d.ts +4 -0
  276. package/dist/usage/providers.js +2 -1
  277. package/dist/usage/providers.js.map +1 -1
  278. package/dist/usage/usage-api.js +48 -2
  279. package/dist/usage/usage-api.js.map +1 -1
  280. package/dist/view-api.d.ts +40 -0
  281. package/dist/view-api.js +28 -10
  282. package/dist/view-api.js.map +1 -1
  283. package/dist/web-api.d.ts +22 -0
  284. package/dist/web-api.js +115 -16
  285. package/dist/web-api.js.map +1 -1
  286. package/dist/web-auth.d.ts +8 -0
  287. package/dist/web-auth.js +34 -8
  288. package/dist/web-auth.js.map +1 -1
  289. package/dist/web-chat-history.d.ts +21 -0
  290. package/dist/web-chat-history.js +44 -0
  291. package/dist/web-chat-history.js.map +1 -1
  292. package/dist/web-commands.d.ts +77 -0
  293. package/dist/web-commands.js +81 -0
  294. package/dist/web-commands.js.map +1 -0
  295. package/dist/web-host-guard.d.ts +18 -2
  296. package/dist/web-host-guard.js +30 -5
  297. package/dist/web-host-guard.js.map +1 -1
  298. package/dist/web-session.d.ts +7 -1
  299. package/dist/web-session.js +23 -2
  300. package/dist/web-session.js.map +1 -1
  301. package/dist/web-shell-routes.d.ts +1 -1
  302. package/dist/web-shell-routes.js +1 -1
  303. package/dist/web-shell-routes.js.map +1 -1
  304. package/launcher/agend +110 -0
  305. package/launcher/agend-agent +110 -0
  306. package/launcher/agend-agent.cjs +4 -0
  307. package/launcher/agend.cjs +4 -0
  308. package/launcher/install-admission.cjs +105 -0
  309. package/launcher/launch.cjs +64 -0
  310. package/launcher/postinstall.cjs +118 -0
  311. package/launcher/run-in-process.cjs +13 -0
  312. package/launcher/runtime-platform.cjs +86 -0
  313. package/launcher/runtime-select.cjs +217 -0
  314. package/package.json +12 -4
  315. package/scripts/preinstall-guard.cjs +40 -21
  316. package/templates/launchd.plist.ejs +2 -2
  317. package/templates/systemd.service.ejs +4 -4
@@ -0,0 +1,96 @@
1
+ /**
2
+ * #1450 C6: what a failed transition restores. npm rolls a global install back only while its own lifecycle runs; a
3
+ * failure AFTER npm succeeded — the target does not verify, its service cannot be proven or loaded — needs the
4
+ * previous package back. "Reinstall the previous version" is not a rollback: an older package has no install hook to
5
+ * re-provision anything, and a service written for the new one names a Node inside the new package.
6
+ *
7
+ * So before npm runs the updater copies the installed package (with its node_modules, so its bundled runtime) to
8
+ * `<prefix>/.agend-rollback/<version>-<ts>/agend` — the same filesystem, so a restore is a rename — and records where
9
+ * its bin links point. Restoring renames the new tree aside, renames the preimage in, and puts the bin links back.
10
+ * After a successful transition only the newest preimage is kept (for a later repair); older ones are removed.
11
+ */
12
+ import { cpSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, readlinkSync, renameSync, rmSync, symlinkSync, unlinkSync } from "node:fs";
13
+ import { join } from "node:path";
14
+ export const ROLLBACK_DIR = ".agend-rollback";
15
+ const BINS = ["agend", "agend-agent"];
16
+ /** The installed package under `root` (npm's global node_modules), copied aside — or null when none is installed. */
17
+ export function takePackagePreimage(root, prefix, now) {
18
+ const pkg = join(root, "@songsid", "agend");
19
+ if (!existsSync(join(pkg, "package.json")))
20
+ return { ok: true, preimage: null };
21
+ let version;
22
+ try {
23
+ version = String(JSON.parse(readFileSync(join(pkg, "package.json"), "utf8")).version);
24
+ }
25
+ catch {
26
+ return { ok: false, reason: `the installed ${pkg}/package.json cannot be read` };
27
+ }
28
+ const dir = join(prefix, ROLLBACK_DIR, `${version}-${now.toISOString().replace(/[:.]/g, "-")}`);
29
+ try {
30
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
31
+ cpSync(pkg, join(dir, "agend"), { recursive: true, verbatimSymlinks: true, preserveTimestamps: true });
32
+ }
33
+ catch (err) {
34
+ rmSync(dir, { recursive: true, force: true });
35
+ return { ok: false, reason: `the installed package could not be copied aside for a rollback (${err.message})` };
36
+ }
37
+ const links = {};
38
+ for (const bin of BINS) {
39
+ try {
40
+ links[bin] = lstatSync(join(prefix, "bin", bin)).isSymbolicLink() ? readlinkSync(join(prefix, "bin", bin)) : null;
41
+ }
42
+ catch {
43
+ links[bin] = null;
44
+ }
45
+ }
46
+ return { ok: true, preimage: { dir, version, links } };
47
+ }
48
+ /** Put the preimage back in place of whatever npm installed; the replaced tree is removed once the swap is done. */
49
+ export function restorePackagePreimage(root, prefix, p) {
50
+ const pkg = join(root, "@songsid", "agend");
51
+ const aside = join(p.dir, "replaced");
52
+ try {
53
+ if (existsSync(pkg))
54
+ renameSync(pkg, aside);
55
+ renameSync(join(p.dir, "agend"), pkg);
56
+ }
57
+ catch (err) {
58
+ return { ok: false, reason: `the previous package could not be put back from ${p.dir} (${err.message})` };
59
+ }
60
+ for (const bin of BINS) {
61
+ const link = join(prefix, "bin", bin);
62
+ try {
63
+ unlinkSync(link);
64
+ }
65
+ catch { /* absent */ }
66
+ const target = p.links[bin];
67
+ if (target) {
68
+ try {
69
+ symlinkSync(target, link);
70
+ }
71
+ catch (err) {
72
+ return { ok: false, reason: `${link} could not be restored (${err.message})` };
73
+ }
74
+ }
75
+ }
76
+ rmSync(aside, { recursive: true, force: true });
77
+ rmSync(p.dir, { recursive: true, force: true });
78
+ return { ok: true };
79
+ }
80
+ /** After a successful transition: keep only `keep` (the newest preimage), remove every other one. */
81
+ export function prunePreimages(prefix, keep) {
82
+ const base = join(prefix, ROLLBACK_DIR);
83
+ let entries = [];
84
+ try {
85
+ entries = readdirSync(base);
86
+ }
87
+ catch {
88
+ return;
89
+ }
90
+ for (const name of entries) {
91
+ if (keep && join(base, name) === keep.dir)
92
+ continue;
93
+ rmSync(join(base, name), { recursive: true, force: true });
94
+ }
95
+ }
96
+ //# sourceMappingURL=package-preimage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-preimage.js","sourceRoot":"","sources":["../src/package-preimage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type TokenContextRatio } from "./context-percent.js";
2
+ /** Captured pane owner; the producer keeps this operation permanently revoked after replacement/stop. */
3
+ export interface PaneContextSource {
4
+ readonly owner: object;
5
+ readonly generation: string;
6
+ isCurrent(): boolean;
7
+ /** Production uses the manager's bounded control-mode read lane (60 lines, 2s including queueing). */
8
+ capture(): Promise<string>;
9
+ }
10
+ export interface PaneContextValue {
11
+ context: number | null;
12
+ tokenRatio: TokenContextRatio | null;
13
+ }
14
+ /** One refresh per current pane owner; transport fallback belongs to its bounded manager read lane. */
15
+ export declare class PaneContextCache {
16
+ private now;
17
+ private entries;
18
+ constructor(now?: () => number);
19
+ private key;
20
+ private current;
21
+ resolve(dataDir: string, instance: string, backend: string, source?: PaneContextSource | null): PaneContextValue;
22
+ record(dataDir: string, instance: string, backend: string, value: PaneContextValue, source?: PaneContextSource | null): void;
23
+ forget(instance: string): void;
24
+ private refresh;
25
+ }
@@ -0,0 +1,73 @@
1
+ import { parseContextPercent, parseTokenContextRatio } from "./context-percent.js";
2
+ const empty = () => ({ context: null, tokenRatio: null });
3
+ /** One refresh per current pane owner; transport fallback belongs to its bounded manager read lane. */
4
+ export class PaneContextCache {
5
+ now;
6
+ entries = new Map();
7
+ constructor(now = () => performance.now()) {
8
+ this.now = now;
9
+ }
10
+ key(dataDir, instance) { return JSON.stringify([dataDir, instance]); }
11
+ current(source) {
12
+ try {
13
+ return source.isCurrent();
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ resolve(dataDir, instance, backend, source) {
20
+ const key = this.key(dataDir, instance);
21
+ if (!source || !this.current(source)) {
22
+ this.entries.delete(key);
23
+ return empty();
24
+ }
25
+ let entry = this.entries.get(key);
26
+ if (!entry || entry.backend !== backend || entry.source.owner !== source.owner
27
+ || entry.source.generation !== source.generation || !this.current(entry.source)) {
28
+ entry = { instance, backend, source, at: -Infinity, value: empty(), inFlight: false };
29
+ this.entries.set(key, entry);
30
+ }
31
+ if (!entry.inFlight && this.now() - entry.at >= 8_000) {
32
+ entry.inFlight = true;
33
+ void this.refresh(key, entry);
34
+ }
35
+ return { ...entry.value };
36
+ }
37
+ record(dataDir, instance, backend, value, source) {
38
+ if (!source || !this.current(source))
39
+ return;
40
+ this.entries.set(this.key(dataDir, instance), { instance, backend, source, at: this.now(), value, inFlight: false });
41
+ }
42
+ forget(instance) {
43
+ for (const [key, entry] of this.entries)
44
+ if (entry.instance === instance)
45
+ this.entries.delete(key);
46
+ }
47
+ async refresh(key, entry) {
48
+ let value = empty();
49
+ try {
50
+ if (!this.current(entry.source))
51
+ return;
52
+ const pane = await entry.source.capture();
53
+ if (!this.current(entry.source))
54
+ return;
55
+ const tokenRatio = entry.backend === "grok" ? parseTokenContextRatio(pane) : null;
56
+ value = { context: tokenRatio?.percentage ?? parseContextPercent(pane), tokenRatio };
57
+ }
58
+ catch { /* unavailable remains unknown, as with the prior scrape */ }
59
+ finally {
60
+ // Forget/re-create, cancel, stop, respawn and a new pane cannot accept this old result.
61
+ if (this.entries.get(key) === entry) {
62
+ if (!this.current(entry.source))
63
+ this.entries.delete(key);
64
+ else {
65
+ entry.value = value;
66
+ entry.at = this.now();
67
+ entry.inFlight = false;
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ //# sourceMappingURL=pane-context-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pane-context-cache.js","sourceRoot":"","sources":["../src/pane-context-cache.ts"],"names":[],"mappings":"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"}
package/dist/paths.d.ts CHANGED
@@ -1,12 +1,5 @@
1
1
  /** Resolve the AgEnD data directory. Override with AGEND_HOME env var. */
2
2
  export declare function getAgendHome(): string;
3
- /**
4
- * The user's real AgEnD home: `.agend` in the home directory from the
5
- * password database, NOT `$HOME`. A test or throwaway fleet that changes HOME
6
- * (and AGEND_HOME with it) must not be mistaken for the user's own fleet.
7
- * Null when the password database cannot be read: falling back to homedir()
8
- * would trust `$HOME` again (#1128 review), so then no home is the default.
9
- */
10
3
  export declare function realDefaultAgendHome(): string | null;
11
4
  /**
12
5
  * Whether this process's AgEnD home is the user's real default one — the only
package/dist/paths.js CHANGED
@@ -14,13 +14,19 @@ export function getAgendHome() {
14
14
  * Null when the password database cannot be read: falling back to homedir()
15
15
  * would trust `$HOME` again (#1128 review), so then no home is the default.
16
16
  */
17
+ let verifiedDefaultHome;
17
18
  export function realDefaultAgendHome() {
19
+ const uid = process.getuid?.() ?? null;
20
+ if (verifiedDefaultHome?.uid === uid)
21
+ return verifiedDefaultHome.home;
18
22
  try {
19
- return join(userInfo().homedir, ".agend");
23
+ const home = join(userInfo().homedir, ".agend");
24
+ verifiedDefaultHome = { uid, home };
25
+ return home;
20
26
  }
21
27
  catch {
22
28
  return null;
23
- }
29
+ } // unknown never trusts HOME, and may retry a later OS lookup
24
30
  }
25
31
  /**
26
32
  * Whether this process's AgEnD home is the user's real default one — the only
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,0EAA0E;AAC1E,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe,YAAY,EAAE;IAC9D,0EAA0E;IAC1E,uEAAuE;IACvE,yEAAyE;IACzE,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,4EAA4E;IAC5E,2EAA2E;IAC3E,4EAA4E;IAC5E,YAAY;IACZ,OAAO,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,QAAuB;IACtE,OAAO,QAAQ,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACjF,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,QAAuB;IACrE,OAAO,QAAQ,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,kBAAkB;IAChC,OAAO,kBAAkB,CAAC,YAAY,EAAE,EAAE,oBAAoB,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,iBAAiB,CAAC,YAAY,EAAE,EAAE,oBAAoB,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QACnC,4EAA4E;QAC5E,6EAA6E;QAC7E,IAAI,CAAC;YAAC,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACpG,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,21 @@ export interface TelegramStartResult {
18
18
  export declare function redactProviderError(error: unknown, secret?: string): string;
19
19
  export declare function verifyDiscordToken(token: string, doFetch?: typeof fetch): Promise<BotIdentity>;
20
20
  export declare function listDiscordGuilds(token: string, doFetch?: typeof fetch): Promise<DiscordGuild[]>;
21
+ export interface DiscordTextChannel {
22
+ id: string;
23
+ name: string;
24
+ }
25
+ /**
26
+ * #1519 P3: a server's text channels, as the bot sees them (GET /guilds/{id}/channels with its token), in Discord's
27
+ * order — for the General channel picker. A guild the bot is not in, or one it cannot list, is { ok: false }.
28
+ */
29
+ export declare function listDiscordTextChannels(token: string, guildId: string, doFetch?: typeof fetch): Promise<{
30
+ ok: true;
31
+ channels: DiscordTextChannel[];
32
+ } | {
33
+ ok: false;
34
+ error: string;
35
+ }>;
21
36
  export declare function verifyTelegramToken(token: string, doFetch?: typeof fetch): Promise<BotIdentity>;
22
37
  /** Long-polling `getUpdates` has one consumer. A second one takes turns with the
23
38
  * first and both miss messages, which is why a running fleet must never be
@@ -43,6 +43,26 @@ export async function listDiscordGuilds(token, doFetch = fetch) {
43
43
  return [];
44
44
  }
45
45
  }
46
+ /**
47
+ * #1519 P3: a server's text channels, as the bot sees them (GET /guilds/{id}/channels with its token), in Discord's
48
+ * order — for the General channel picker. A guild the bot is not in, or one it cannot list, is { ok: false }.
49
+ */
50
+ export async function listDiscordTextChannels(token, guildId, doFetch = fetch) {
51
+ if (!/^\d{1,20}$/.test(guildId))
52
+ return { ok: false, error: "guild id must be numeric" };
53
+ try {
54
+ const res = await doFetch(`${DISCORD_API}/guilds/${guildId}/channels`, { headers: { Authorization: `Bot ${token}` } });
55
+ if (!res.ok)
56
+ return { ok: false, error: `Discord replied ${res.status}` };
57
+ const rows = (await res.json());
58
+ const text = (Array.isArray(rows) ? rows : []).filter(c => c && c.type === 0 && typeof c.id === "string" && typeof c.name === "string");
59
+ text.sort((a, b) => (a.position ?? 0) - (b.position ?? 0));
60
+ return { ok: true, channels: text.map(c => ({ id: c.id, name: c.name })) };
61
+ }
62
+ catch (err) {
63
+ return { ok: false, error: redactProviderError(err, token) };
64
+ }
65
+ }
46
66
  export async function verifyTelegramToken(token, doFetch = fetch) {
47
67
  try {
48
68
  const res = await doFetch(`https://api.telegram.org/bot${token}/getMe`);
@@ -1 +1 @@
1
- {"version":3,"file":"provider-probe.js","sourceRoot":"","sources":["../src/provider-probe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-probe.js","sourceRoot":"","sources":["../src/provider-probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import type { CloudflaredInstallErrorKind } from "./tunnel/cloudflared-install.js";
2
+ export type PublicLinkStep = "check" | "download" | "verify" | "tunnel" | "address" | "deliver";
3
+ /** Why a step failed, as one of a fixed set: each has its own static sentence. */
4
+ export type PublicLinkFailure = "unsupported-platform" | "download-failed" | "checksum-mismatch" | "install-failed" | "cancelled" | "spawn-failed" | "no-address" | "unreachable" | "lease-held" | "gateway-failed" | "delivery-failed" | "closed" | "unknown";
5
+ export interface PublicLinkProgress {
6
+ readonly startedAt: number;
7
+ /** Steps begun so far, in order; the last one without `endedAt` is the one running. */
8
+ readonly steps: ReadonlyArray<{
9
+ readonly step: PublicLinkStep;
10
+ readonly startedAt: number;
11
+ readonly endedAt?: number;
12
+ }>;
13
+ /** `checking` until the install answered; `download` shows ①–③, `installed` hides them. */
14
+ readonly install: "checking" | "installed" | "download";
15
+ readonly version?: string;
16
+ readonly download?: {
17
+ readonly received: number;
18
+ readonly total: number | null;
19
+ };
20
+ readonly failed?: {
21
+ readonly step: PublicLinkStep;
22
+ readonly reason: PublicLinkFailure;
23
+ };
24
+ }
25
+ /** The install's and the tunnel's error kinds, folded into the reasons a user is shown. */
26
+ export declare function failureOf(kind: CloudflaredInstallErrorKind | string | undefined): PublicLinkFailure;
27
+ /** Builds the snapshots; each change hands a new immutable one to `emit`. */
28
+ export declare class PublicLinkProgressTracker {
29
+ private readonly now;
30
+ private readonly emit;
31
+ private state;
32
+ constructor(now: () => number, emit: (p: PublicLinkProgress) => void);
33
+ get snapshot(): PublicLinkProgress;
34
+ private set;
35
+ /** Ends the running step (if any) and begins `step`. A step already begun is not begun again. */
36
+ begin(step: PublicLinkStep, extra?: Partial<Pick<PublicLinkProgress, "install" | "version" | "download">>): void;
37
+ installChecked(download: boolean, version: string): void;
38
+ downloaded(received: number, total: number | null): void;
39
+ /** Every running step ends now. */
40
+ complete(): void;
41
+ fail(reason: PublicLinkFailure): void;
42
+ }
43
+ /** The message text for one snapshot, at monotonic time `now`; `outcome` is the closing line once it is decided. */
44
+ export declare function renderPublicLinkProgress(p: PublicLinkProgress, now: number, outcome?: string): string;
45
+ /**
46
+ * Edits one message with the latest text, no more often than `minIntervalMs`: a burst of changes (download bytes)
47
+ * becomes one edit carrying the newest. While open it refreshes every `heartbeatMs`, so the seconds move even when
48
+ * nothing else does. One edit at a time, an unchanged text is never sent again (Telegram refuses "not modified"),
49
+ * and two failed edits in a row stop it (the message or its token is gone). `close` waits out the edit in flight,
50
+ * so whatever the caller writes next lands after it.
51
+ */
52
+ export declare class ThrottledMessageEditor {
53
+ private readonly opts;
54
+ private render;
55
+ private lastText;
56
+ private lastSentAt;
57
+ private inFlight;
58
+ private timer;
59
+ private closed;
60
+ private failures;
61
+ constructor(opts: {
62
+ edit: (text: string) => Promise<void>;
63
+ now: () => number;
64
+ minIntervalMs: number;
65
+ heartbeatMs: number;
66
+ onError?: (err: unknown) => void;
67
+ });
68
+ update(render: () => string): void;
69
+ private pump;
70
+ private arm;
71
+ /** No edit after this one returns; the one in flight has settled. */
72
+ close(): Promise<void>;
73
+ }
@@ -0,0 +1,190 @@
1
+ /**
2
+ * What opening a temporary public link is doing, step by step, for the message the admin clicked on.
3
+ *
4
+ * ① check cloudflared ② download it ③ verify it — only when AgEnD's pinned copy must be fetched
5
+ * ④ start the tunnel ⑤ wait for the public address ⑥ deliver the link privately
6
+ *
7
+ * The text goes where the button was: a Discord ephemeral reply, or the Telegram menu in General. So it holds
8
+ * only static words, numbers and durations — never the link, the code, a path or a platform's error text.
9
+ * Durations are monotonic (performance.now), so a wall-clock jump cannot make a step take negative time.
10
+ */
11
+ import { t } from "./locale.js";
12
+ const STEPS = ["check", "download", "verify", "tunnel", "address", "deliver"];
13
+ const NUMBERS = { check: "①", download: "②", verify: "③", tunnel: "④", address: "⑤", deliver: "⑥" };
14
+ /** The install's and the tunnel's error kinds, folded into the reasons a user is shown. */
15
+ export function failureOf(kind) {
16
+ switch (kind) {
17
+ case "unsupported-platform":
18
+ case "download-failed":
19
+ case "checksum-mismatch":
20
+ case "install-failed":
21
+ case "cancelled":
22
+ case "lease-held":
23
+ return kind;
24
+ case "binary-missing":
25
+ case "binary-not-executable":
26
+ case "spawn-failed":
27
+ case "not-logged-in":
28
+ return "spawn-failed";
29
+ case "no-url":
30
+ case "bad-url":
31
+ case "timeout":
32
+ return "no-address";
33
+ case "readiness-failed":
34
+ return "unreachable";
35
+ default:
36
+ return "unknown";
37
+ }
38
+ }
39
+ /** Builds the snapshots; each change hands a new immutable one to `emit`. */
40
+ export class PublicLinkProgressTracker {
41
+ now;
42
+ emit;
43
+ state;
44
+ constructor(now, emit) {
45
+ this.now = now;
46
+ this.emit = emit;
47
+ const at = now();
48
+ this.state = { startedAt: at, steps: [{ step: "check", startedAt: at }], install: "checking" };
49
+ }
50
+ get snapshot() { return this.state; }
51
+ set(next) { this.state = next; this.emit(next); }
52
+ /** Ends the running step (if any) and begins `step`. A step already begun is not begun again. */
53
+ begin(step, extra = {}) {
54
+ if (this.state.failed || this.state.steps.some(s => s.step === step)) {
55
+ if (Object.keys(extra).length)
56
+ this.set({ ...this.state, ...extra });
57
+ return;
58
+ }
59
+ const at = this.now();
60
+ const steps = this.state.steps.map(s => s.endedAt === undefined ? { ...s, endedAt: at } : s);
61
+ this.set({ ...this.state, ...extra, steps: [...steps, { step, startedAt: at }] });
62
+ }
63
+ installChecked(download, version) {
64
+ if (download)
65
+ this.begin("download", { install: "download", version });
66
+ else
67
+ this.set({ ...this.state, install: "installed", version });
68
+ }
69
+ downloaded(received, total) { this.set({ ...this.state, download: { received, total } }); }
70
+ /** Every running step ends now. */
71
+ complete() {
72
+ const at = this.now();
73
+ this.set({ ...this.state, steps: this.state.steps.map(s => s.endedAt === undefined ? { ...s, endedAt: at } : s) });
74
+ }
75
+ fail(reason) {
76
+ if (this.state.failed)
77
+ return;
78
+ const running = [...this.state.steps].reverse().find(s => s.endedAt === undefined) ?? this.state.steps.at(-1);
79
+ const at = this.now();
80
+ this.set({ ...this.state, failed: { step: running.step, reason }, steps: this.state.steps.map(s => s.endedAt === undefined ? { ...s, endedAt: at } : s) });
81
+ }
82
+ }
83
+ function seconds(ms) { return Math.max(0, Math.floor(ms / 1000)); }
84
+ function megabytes(bytes) { return (bytes / (1024 * 1024)).toFixed(1); }
85
+ /** The message text for one snapshot, at monotonic time `now`; `outcome` is the closing line once it is decided. */
86
+ export function renderPublicLinkProgress(p, now, outcome) {
87
+ const shown = STEPS.filter(step => p.install === "download" || !["download", "verify"].includes(step))
88
+ .filter(step => p.install !== "installed" || step !== "check");
89
+ const end = Math.max(...p.steps.map(s => s.endedAt ?? now));
90
+ const lines = [t("dashboard.progress.title", seconds((outcome !== undefined || p.failed ? end : now) - p.startedAt))];
91
+ for (const step of shown) {
92
+ const begun = p.steps.find(s => s.step === step);
93
+ const label = `${NUMBERS[step]} ${stepLabel(step, p)}`;
94
+ if (!begun) {
95
+ lines.push(`▫️ ${label}`);
96
+ continue;
97
+ }
98
+ const took = seconds((begun.endedAt ?? now) - begun.startedAt);
99
+ if (p.failed?.step === step)
100
+ lines.push(`❌ ${label} · ${t("dashboard.progress.seconds", took)} — ${t(`dashboard.progress.fail.${p.failed.reason}`)}`);
101
+ else if (begun.endedAt !== undefined)
102
+ lines.push(`✅ ${label} · ${t("dashboard.progress.seconds", took)}`);
103
+ else
104
+ lines.push(`⏳ ${label} · ${t("dashboard.progress.seconds", took)}`);
105
+ }
106
+ if (outcome)
107
+ lines.push("", outcome);
108
+ return lines.join("\n");
109
+ }
110
+ function stepLabel(step, p) {
111
+ switch (step) {
112
+ case "check":
113
+ return p.install === "download" ? t("dashboard.progress.check_download", p.version ?? "") : t("dashboard.progress.check");
114
+ case "download": {
115
+ const d = p.download;
116
+ if (!d)
117
+ return t("dashboard.progress.download");
118
+ return d.total ? t("dashboard.progress.download_of", megabytes(d.received), megabytes(d.total)) : t("dashboard.progress.download_bytes", megabytes(d.received));
119
+ }
120
+ default:
121
+ return t(`dashboard.progress.${step}`);
122
+ }
123
+ }
124
+ /**
125
+ * Edits one message with the latest text, no more often than `minIntervalMs`: a burst of changes (download bytes)
126
+ * becomes one edit carrying the newest. While open it refreshes every `heartbeatMs`, so the seconds move even when
127
+ * nothing else does. One edit at a time, an unchanged text is never sent again (Telegram refuses "not modified"),
128
+ * and two failed edits in a row stop it (the message or its token is gone). `close` waits out the edit in flight,
129
+ * so whatever the caller writes next lands after it.
130
+ */
131
+ export class ThrottledMessageEditor {
132
+ opts;
133
+ render = null;
134
+ lastText = null;
135
+ lastSentAt = Number.NEGATIVE_INFINITY;
136
+ inFlight = null;
137
+ timer = null;
138
+ closed = false;
139
+ failures = 0;
140
+ constructor(opts) {
141
+ this.opts = opts;
142
+ }
143
+ update(render) {
144
+ if (this.closed)
145
+ return;
146
+ this.render = render;
147
+ this.pump();
148
+ }
149
+ pump() {
150
+ if (this.closed || this.inFlight || !this.render)
151
+ return;
152
+ const wait = this.lastSentAt + this.opts.minIntervalMs - this.opts.now();
153
+ if (wait > 0) {
154
+ this.arm(wait);
155
+ return;
156
+ }
157
+ const text = this.render();
158
+ if (text === this.lastText) {
159
+ this.arm(this.opts.heartbeatMs);
160
+ return;
161
+ }
162
+ if (this.timer) {
163
+ clearTimeout(this.timer);
164
+ this.timer = null;
165
+ }
166
+ this.lastText = text;
167
+ this.lastSentAt = this.opts.now();
168
+ this.inFlight = this.opts.edit(text).then(() => { this.failures = 0; }, err => { this.failures++; this.opts.onError?.(err); if (this.failures >= 2)
169
+ this.closed = true; }).finally(() => { this.inFlight = null; if (!this.closed)
170
+ this.arm(this.opts.heartbeatMs); });
171
+ }
172
+ arm(ms) {
173
+ if (this.closed)
174
+ return;
175
+ if (this.timer)
176
+ clearTimeout(this.timer);
177
+ this.timer = setTimeout(() => { this.timer = null; this.pump(); }, Math.max(0, ms));
178
+ this.timer.unref?.();
179
+ }
180
+ /** No edit after this one returns; the one in flight has settled. */
181
+ async close() {
182
+ this.closed = true;
183
+ if (this.timer) {
184
+ clearTimeout(this.timer);
185
+ this.timer = null;
186
+ }
187
+ await this.inFlight;
188
+ }
189
+ }
190
+ //# sourceMappingURL=public-link-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-link-progress.js","sourceRoot":"","sources":["../src/public-link-progress.ts"],"names":[],"mappings":"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"}
@@ -25,9 +25,9 @@ export function isPublicWebRoute(method, path) {
25
25
  return true;
26
26
  if (method === "GET" && /^\/ui\/js\/[a-z0-9_-]+\.js$/.test(path))
27
27
  return true;
28
- if (method === "GET" && /^\/ui\/(backends|poll|history|file\/[^/]+|prompts|instance\/[^/]+|instances|tasks(?:\/[^/]+)?|schedules(?:\/[^/]+)?|teams(?:\/[^/]+)?|config|org)$/.test(path))
28
+ if (method === "GET" && /^\/ui\/(backends|poll|history|file\/[^/]+|prompts|instance\/[^/]+|instances|tasks(?:\/[^/]+)?|schedules(?:\/[^/]+)?|teams(?:\/[^/]+)?|config|org|cache)$/.test(path))
29
29
  return true;
30
- if (method === "POST" && /^\/ui\/(send|upload|prompt|needs\/ack|cancel\/[^/]+|stop\/[^/]+|start\/[^/]+|instances\/[^/]+\/delete|restart\/[^/]+|instances|tasks|schedules|teams|config)$/.test(path))
30
+ if (method === "POST" && /^\/ui\/(send|upload|prompt|reply-button|command|needs\/ack|cancel\/[^/]+|stop\/[^/]+|start\/[^/]+|instances\/[^/]+\/delete|restart\/[^/]+|instances|tasks|schedules|teams|config)$/.test(path))
31
31
  return true;
32
32
  if (((method === "POST" && /^\/ui\/tasks\/[^/]+$/.test(path))) || (method === "DELETE" && /^\/ui\/(schedules|teams)\/[^/]+$/.test(path)))
33
33
  return true;