@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,58 @@
1
+ /**
2
+ * #1510: turn boundaries from a CLI's own transcript, for the reply-completion guard of a backend whose pane alone is
3
+ * not proof that a turn ended (codex; recordings in tests/fixtures/reply-guard-1510).
4
+ *
5
+ * The guard asks one question after its idle confirmation: did the turn that took THIS delivery end, and has nothing
6
+ * started since? Ownership is evidence, not shape: the turn is the one whose user message is the text AgEnD pasted,
7
+ * written after the delivery armed. Rollouts are shared by working directory, so another instance's turn in the same
8
+ * directory never carries our text — no match is "unknown", and unknown never starts a recovery (fail-safe).
9
+ */
10
+ /** The same words, whatever the paste did to line breaks and indentation. */
11
+ export function normalizeTurnText(text) {
12
+ return text.replace(/\s+/g, "");
13
+ }
14
+ const MAX_TURNS = 64;
15
+ /** A user record this much older than the arm is an earlier message with the same words, not this delivery. */
16
+ const ARM_SKEW_MS = 30_000;
17
+ export class TranscriptTurnLedger {
18
+ turns = [];
19
+ observe(events) {
20
+ for (const e of events) {
21
+ if (e.kind === "start") {
22
+ if (!e.turnId || this.turns.some(t => t.id === e.turnId))
23
+ continue;
24
+ this.turns.push({ id: e.turnId, users: [] });
25
+ if (this.turns.length > MAX_TURNS)
26
+ this.turns.splice(0, this.turns.length - MAX_TURNS);
27
+ continue;
28
+ }
29
+ const turn = e.turnId ? this.turns.find(t => t.id === e.turnId) : undefined;
30
+ if (!turn)
31
+ continue; // a record from a turn whose start we never read cannot be attributed
32
+ if (e.kind === "user")
33
+ turn.users.push({ text: normalizeTurnText(e.text), at: e.at });
34
+ else
35
+ turn.end = e.end;
36
+ }
37
+ }
38
+ /** Forget everything: the daemon does this for each new transcript monitor (a launch re-baselines the source). */
39
+ reset() { this.turns = []; }
40
+ /** See TranscriptTurnVerdict. `armedAt` is the wall-clock time the delivery armed the guard. */
41
+ verdict(deliveredText, armedAt) {
42
+ const wanted = deliveredText ? normalizeTurnText(deliveredText) : "";
43
+ if (!wanted)
44
+ return "unknown";
45
+ let ours = -1;
46
+ for (let i = this.turns.length - 1; i >= 0 && ours < 0; i--) {
47
+ if (this.turns[i].users.some(u => u.at >= armedAt - ARM_SKEW_MS && u.text.includes(wanted)))
48
+ ours = i;
49
+ }
50
+ if (ours < 0)
51
+ return "unknown";
52
+ if (this.turns.slice(ours).some(t => !t.end))
53
+ return "running";
54
+ const end = this.turns[ours].end;
55
+ return end === "aborted" ? "aborted" : end === "error" ? "error" : "ended";
56
+ }
57
+ }
58
+ //# sourceMappingURL=transcript-turns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-turns.js","sourceRoot":"","sources":["../src/transcript-turns.ts"],"names":[],"mappings":"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"}
@@ -59,6 +59,13 @@ export interface EnsureCloudflaredOptions {
59
59
  version: string;
60
60
  asset: string;
61
61
  }) => void | Promise<void>;
62
+ /**
63
+ * Where the install is, for a caller that shows it as it happens. Never awaited and never allowed to throw into
64
+ * the install: `checked` says whether a download is needed, `downloading` follows the bytes (`total` is the
65
+ * response's Content-Length, null when it sent none), `verifying` covers the checksum, extraction and rename.
66
+ * Only the call that starts an install hears it; one that joins an install already running does not.
67
+ */
68
+ onProgress?: (progress: CloudflaredInstallProgress) => void;
62
69
  /** Test seams. */
63
70
  fetchImpl?: (url: string, init: {
64
71
  signal: AbortSignal;
@@ -76,6 +83,17 @@ export interface EnsureCloudflaredOptions {
76
83
  /** Test seam: the uid AgEnD's directories must belong to (default: this process's). */
77
84
  uid?: number;
78
85
  }
86
+ export type CloudflaredInstallProgress = {
87
+ readonly phase: "checked";
88
+ readonly download: boolean;
89
+ readonly version: string;
90
+ } | {
91
+ readonly phase: "downloading";
92
+ readonly received: number;
93
+ readonly total: number | null;
94
+ } | {
95
+ readonly phase: "verifying";
96
+ };
79
97
  export interface EnsureCloudflaredResult {
80
98
  path: string;
81
99
  /** `path`: the user's own, on PATH. `agend`: ours, already installed and verified. `downloaded`: ours, just now. */
@@ -67,6 +67,12 @@ export function releaseUrl(asset, version = CLOUDFLARED_PIN.version) {
67
67
  /** No cloudflared binary is this big; a response that is has gone wrong. */
68
68
  const MAX_DOWNLOAD_BYTES = 200 * 1024 * 1024;
69
69
  const DOWNLOAD_TIMEOUT_MS = 5 * 60_000;
70
+ function tell(opts, progress) {
71
+ try {
72
+ opts.onProgress?.(progress);
73
+ }
74
+ catch { /* a display must never break the install */ }
75
+ }
70
76
  const inFlight = new Map();
71
77
  /** A cloudflared to run: the user's own on PATH, else AgEnD's verified copy (downloaded when needed). */
72
78
  export async function ensureCloudflared(opts) {
@@ -97,8 +103,11 @@ async function installOrReuse(opts, dir) {
97
103
  // A bin someone else could have written: its contents are not ours to trust.
98
104
  if ((await privateDirectory(opts.dataDir, dir, uid)) === "was-open")
99
105
  await discardInstall(target);
100
- if (await installedAndIntact(target, pin.version, asset, uid))
106
+ if (await installedAndIntact(target, pin.version, asset, uid)) {
107
+ tell(opts, { phase: "checked", download: false, version: pin.version });
101
108
  return { path: target, source: "agend" };
109
+ }
110
+ tell(opts, { phase: "checked", download: true, version: pin.version });
102
111
  throwIfCancelled(opts.signal);
103
112
  await opts.onDownloading?.({ version: pin.version, asset: asset.name });
104
113
  // A cancel that arrived while the notice was being posted stops it here: no fetch starts.
@@ -193,6 +202,7 @@ async function download(asset, version, dir, target, opts) {
193
202
  const stampTmp = `${stampPath(target)}.${tag}`;
194
203
  try {
195
204
  const sha = await fetchToFile(releaseUrl(asset, version), part, opts);
205
+ tell(opts, { phase: "verifying" });
196
206
  if (sha !== asset.sha256) {
197
207
  throw new CloudflaredInstallError("checksum-mismatch", `${asset.name}: SHA256 ${sha} does not match the pinned ${asset.sha256}`);
198
208
  }
@@ -268,6 +278,9 @@ async function fetchToFile(url, file, opts) {
268
278
  throw new CloudflaredInstallError("download-failed", `HTTP ${res.status}`);
269
279
  const reader = res.body.getReader();
270
280
  const hash = createHash("sha256");
281
+ const length = Number(res.headers?.get?.("content-length") ?? "");
282
+ const total = Number.isSafeInteger(length) && length > 0 ? length : null;
283
+ tell(opts, { phase: "downloading", received: 0, total });
271
284
  let handle;
272
285
  try {
273
286
  handle = await open(file, "wx", 0o600);
@@ -292,6 +305,7 @@ async function fetchToFile(url, file, opts) {
292
305
  throw new CloudflaredInstallError("download-failed", "the download is larger than any cloudflared");
293
306
  hash.update(chunk.value);
294
307
  await writeAll(handle, chunk.value, file);
308
+ tell(opts, { phase: "downloading", received: bytes, total });
295
309
  }
296
310
  }
297
311
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflared-install.js","sourceRoot":"","sources":["../../src/tunnel/cloudflared-install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloudflared-install.js","sourceRoot":"","sources":["../../src/tunnel/cloudflared-install.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,9 @@ export interface TurnReplyTarget {
6
6
  messageId?: string;
7
7
  correlationId?: string;
8
8
  inboundMarker?: string;
9
+ /** #1510: exactly what was pasted, and when (wall clock) — how a transcript turn is proven to be this delivery's. */
10
+ deliveredText?: string;
11
+ deliveredAt?: number;
9
12
  }
10
13
  export type TurnReplyPhase = "awaiting" | "recovering";
11
14
  export interface ReplyAttemptToken {
@@ -1 +1 @@
1
- {"version":3,"file":"turn-reply-guard.js","sourceRoot":"","sources":["../src/turn-reply-guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"turn-reply-guard.js","sourceRoot":"","sources":["../src/turn-reply-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ // #1269 (4): the composer's slash commands — the instance's own chat commands, the ones its Discord/Telegram topic
2
+ // accepts (the server runs them through the same handlers and command table: POST /ui/command). Pure: what the
3
+ // palette offers for a draft, and whether a draft is a command to run. Anything else starting with "/" is an
4
+ // ordinary message, as before.
5
+
6
+ /** The commands, in the palette's order. `arg`: the argument hint ("" = none; [..] optional, <..> required). */
7
+ export const CHAT_COMMANDS = [
8
+ { name: "ctx", arg: "" },
9
+ { name: "compact", arg: "[instructions]" },
10
+ { name: "clear", arg: "" },
11
+ { name: "model", arg: "[name]" },
12
+ { name: "effort", arg: "[level]" },
13
+ { name: "cancel", arg: "" },
14
+ { name: "btw", arg: "<question>" },
15
+ { name: "steer", arg: "<text>" },
16
+ { name: "pause", arg: "" },
17
+ { name: "wake", arg: "" },
18
+ { name: "save", arg: "<file>" },
19
+ ];
20
+ const BY_NAME = new Map(CHAT_COMMANDS.map((c) => [c.name, c]));
21
+
22
+ /**
23
+ * The palette for a draft: null when it is not one (no leading "/", or past the command's name), else the commands
24
+ * whose name starts with what was typed (possibly none: then it goes as a message).
25
+ */
26
+ export function paletteFor(draft) {
27
+ const m = /^\/([a-z]*)$/.exec(draft || "");
28
+ if (!m) return null;
29
+ return CHAT_COMMANDS.filter((c) => c.name.startsWith(m[1]));
30
+ }
31
+
32
+ /** `/name args` for a known command → { command, args }; anything else (unknown, not a command) → null. */
33
+ export function parseCommandLine(draft) {
34
+ const m = /^\/([a-z]+)(?:[ \t]+([\s\S]*))?$/.exec((draft || "").trim());
35
+ if (!m || !BY_NAME.has(m[1])) return null;
36
+ return { command: m[1], args: (m[2] || "").trim() };
37
+ }
38
+
39
+ /** Commands that act without an argument but need one to be useful: Enter on `/btw` alone completes, it does not run. */
40
+ export function needsArgument(command) {
41
+ const c = BY_NAME.get(command);
42
+ return !!c && c.arg.startsWith("<");
43
+ }
@@ -300,6 +300,21 @@
300
300
  * id, in id order, the newest `cap` kept. The same message can arrive twice — from /ui/history and from the
301
301
  * stream — and must show once.
302
302
  */
303
+ function buttonsRank(b) { return b && b.state !== "open" ? 1 : 0; }
304
+ /**
305
+ * #1266: a reply's buttons changed (one was chosen, or they expired): the message carrying them, by its set id.
306
+ * Returns the list unchanged when no message carries that set.
307
+ */
308
+ function applyReplyButtons(list, buttons) {
309
+ if (!Array.isArray(list) || !buttons || typeof buttons.id !== "string") return list;
310
+ var i = -1;
311
+ for (var j = list.length - 1; j >= 0; j--) if (list[j] && list[j].buttons && list[j].buttons.id === buttons.id) { i = j; break; }
312
+ if (i < 0 || buttonsRank(list[i].buttons) > buttonsRank(buttons)) return list;
313
+ var out = list.slice();
314
+ out[i] = Object.assign({}, list[i], { buttons: buttons });
315
+ return out;
316
+ }
317
+
303
318
  function mergeMessages(existing, incoming, cap) {
304
319
  var seen = {};
305
320
  var out = [];
@@ -312,7 +327,9 @@
312
327
  // The same message again (history after the stream): the copy that got further shows its ticks.
313
328
  var had = out[seen[k]];
314
329
  var next = nextDeliveryState(had.delivery, m.delivery);
315
- if (next !== had.delivery) out[seen[k]] = Object.assign({}, had, { delivery: next });
330
+ if (next !== had.delivery) out[seen[k]] = had = Object.assign({}, had, { delivery: next });
331
+ // #1266: …and the copy whose buttons got further (open → chosen / expired) shows them.
332
+ if (m.buttons && (!had.buttons || buttonsRank(m.buttons) > buttonsRank(had.buttons))) out[seen[k]] = Object.assign({}, had, { buttons: m.buttons });
316
333
  return;
317
334
  }
318
335
  seen[k] = out.length;
@@ -372,8 +389,8 @@
372
389
  return Number(scrollHeight) - Number(scrollTop) - Number(clientHeight) <= (slack == null ? 48 : slack);
373
390
  }
374
391
 
375
- /** A paste longer than this many characters becomes a text file instead of filling the composer (#1307). */
376
- var LONG_PASTE_CHARS = 10000;
392
+ /** A paste longer than this many characters becomes a text file instead of filling the composer (#1307; 4,000 per #1269). */
393
+ var LONG_PASTE_CHARS = 4000;
377
394
  function isLongPaste(text) { return typeof text === "string" && text.length > LONG_PASTE_CHARS; }
378
395
 
379
396
  /** How long a turn has run, as m:ss (h:mm:ss past an hour); never negative. */
@@ -446,15 +463,24 @@
446
463
  return { kept: kept, rejected: rejected };
447
464
  }
448
465
 
466
+ /** #1306 §6.1 (Q4): an attachment a preview card is offered for — a fleet-issued id, a non-image named *.html / *.htm. */
467
+ function isHtmlAttachment(a) {
468
+ return !!a && typeof a.id === "string" && /^[0-9a-f]{32}$/.test(a.id) && a.kind !== "photo" && typeof a.name === "string" && /\.html?$/i.test(a.name.trim());
469
+ }
470
+
449
471
  /**
450
472
  * The files shown with a message. Only an id the fleet issued (32 hex) becomes a URL, and only under
451
473
  * /ui/file/; a name is text. Images are shown (and open full size), other files are download links.
474
+ * With { htmlCards: true } (a server-marked agent reply, as for renderMarkdown) each .html/.htm file also gets an
475
+ * empty card placeholder <div class="html-card" data-att="<id>"> after the list — the id is 32 hex, nothing else.
452
476
  */
453
- function attachmentsHtml(attachments) {
477
+ function attachmentsHtml(attachments, opts) {
454
478
  if (!Array.isArray(attachments)) return "";
455
- var out = [];
479
+ var cards = !!(opts && opts.htmlCards);
480
+ var out = [], after = [];
456
481
  attachments.forEach(function (a) {
457
482
  if (!a || typeof a.id !== "string" || !/^[0-9a-f]{32}$/.test(a.id)) return;
483
+ if (cards && isHtmlAttachment(a)) after.push('<div class="html-card" data-att="' + a.id + '"></div>');
458
484
  var url = "/ui/file/" + a.id;
459
485
  var name = escapeHtml(a.name || "file");
460
486
  if (a.kind === "photo") {
@@ -463,13 +489,13 @@
463
489
  out.push('<a class="att-file" href="' + url + '" download="' + name + '">📎 ' + name + ' <span class="att-size">' + escapeHtml(formatSize(a.size)) + "</span></a>");
464
490
  }
465
491
  });
466
- return out.length ? '<div class="atts">' + out.join("") + "</div>" : "";
492
+ return (out.length ? '<div class="atts">' + out.join("") + "</div>" : "") + after.join("");
467
493
  }
468
494
 
469
495
  return {
470
- renderMarkdown: renderMarkdown, escapeHtml: escapeHtml, mergeMessages: mergeMessages, composerKey: composerKey,
496
+ renderMarkdown: renderMarkdown, escapeHtml: escapeHtml, mergeMessages: mergeMessages, applyReplyButtons: applyReplyButtons, composerKey: composerKey,
471
497
  settleFailedSend: settleFailedSend, putBack: putBack,
472
- FILE_LIMITS: FILE_LIMITS, formatSize: formatSize, checkFiles: checkFiles, attachmentsHtml: attachmentsHtml,
498
+ FILE_LIMITS: FILE_LIMITS, formatSize: formatSize, checkFiles: checkFiles, attachmentsHtml: attachmentsHtml, isHtmlAttachment: isHtmlAttachment,
473
499
  nextDeliveryState: nextDeliveryState, applyDelivery: applyDelivery, deliveryHtml: deliveryHtml, isBusy: isBusy,
474
500
  isNearBottom: isNearBottom, CODE_FOLD_LINES: CODE_FOLD_LINES, lineCount: lineCount,
475
501
  LONG_PASTE_CHARS: LONG_PASTE_CHARS, isLongPaste: isLongPaste, formatElapsed: formatElapsed,
@@ -15,8 +15,10 @@ const R = () => globalThis.AgendChatRender;
15
15
  export function createChatStore(deps) {
16
16
  const s = {
17
17
  msgs: {}, drafts: {}, failedSends: {}, pendingFiles: {}, sending: {}, inFlightFiles: {},
18
- prompts: {}, workingSince: {}, stopping: {}, cancelling: {}, scrollMemo: {}, historyRead: new Set(),
18
+ prompts: {}, workingSince: {}, stopping: {}, cancelling: {}, scrollMemo: {}, historyRead: new Set(), rbBusy: new Set(),
19
19
  exec: {}, awaiting: {}, current: null,
20
+ // #1269: the last chat command per instance — { command, busy, text?, error?, choices? } — shown above the composer.
21
+ commands: {},
20
22
  };
21
23
  const subs = new Set();
22
24
  const pastedTexts = new WeakMap();
@@ -78,6 +80,24 @@ export function createChatStore(deps) {
78
80
  }
79
81
  for (const i of touched) changed(i, "msgs");
80
82
  }
83
+ /** #1266: a reply's buttons ended — its message shows it. */
84
+ function applyReplyButtons(u) {
85
+ if (!u || typeof u.instance !== "string") return;
86
+ const before = s.msgs[u.instance];
87
+ s.msgs[u.instance] = R().applyReplyButtons(before, u.buttons);
88
+ if (s.msgs[u.instance] !== before) changed(u.instance, "msgs");
89
+ }
90
+ /** #1266: click one of a reply's buttons (the first click anywhere answers for everyone). */
91
+ async function clickReplyButton(instance, id, index) {
92
+ if (s.rbBusy.has(id)) return;
93
+ s.rbBusy.add(id); changed(instance, "msgs");
94
+ let r;
95
+ try { r = await api("POST", "/ui/reply-button", { instance, id, index }); }
96
+ catch (err) { r = { error: err && err.message ? err.message : t("chat.disconnected") }; }
97
+ s.rbBusy.delete(id); changed(instance, "msgs");
98
+ if (!r || !r.answered) deps.toast(r && r.error ? r.error : t("chat.disconnected"), false);
99
+ }
100
+
81
101
  /** Read an instance's history once per page (the first time a person opens its chat). */
82
102
  async function openHistory(name, lease) {
83
103
  if (s.historyRead.has(name)) return false;
@@ -265,6 +285,33 @@ export function createChatStore(deps) {
265
285
  changed(target);
266
286
  }
267
287
 
288
+ // ── Chat commands (#1269): the instance's own /ctx, /compact, /clear, /model … through POST /ui/command. One command
289
+ // at a time per instance, claimed before the request goes (a double Enter sends nothing more). /clear answers with a
290
+ // confirmation first: asked in the app's dialog, and a yes counts only while `alive()` (the chat that asked is still
291
+ // the one on screen) — the token is the server's, used once, for the instance as it was when asked.
292
+ async function runCommand(target, command, args, opts = {}) {
293
+ if (!target || !commandFree(target)) return;
294
+ const alive = opts.alive || (() => true);
295
+ s.commands[target] = { command, busy: true };
296
+ changed(target);
297
+ const post = async (extra) => {
298
+ try { return await api("POST", "/ui/command", { instance: target, command, ...(args ? { args } : {}), ...extra }); }
299
+ catch (err) { return { error: err && err.message ? err.message : t("chat.disconnected") }; }
300
+ };
301
+ let r = await post({});
302
+ if (r && r.confirm) {
303
+ const yes = deps.confirm ? await deps.confirm({ title: `/${command}`, message: r.confirm.message, confirmLabel: t("chat.cmdConfirm"), danger: true }) : false;
304
+ if (!yes || !alive()) { delete s.commands[target]; changed(target); return; }
305
+ r = await post({ confirm: r.confirm.token });
306
+ }
307
+ s.commands[target] = r && r.choices ? { command, busy: false, choices: r.choices }
308
+ : r && r.error ? { command, busy: false, error: r.error } : { command, busy: false, text: (r && r.text) || "" };
309
+ changed(target);
310
+ }
311
+ function dismissCommand(target) { delete s.commands[target]; changed(target); }
312
+ /** Whether a command can start for `target` now (none is out): checked before a typed command line is consumed. */
313
+ const commandFree = (target) => !(s.commands[target] && s.commands[target].busy);
314
+
268
315
  /** Wire the store to the app's stream, for the life of the page. */
269
316
  function attach(stream) {
270
317
  stream.on("status", applyStatus);
@@ -275,6 +322,7 @@ export function createChatStore(deps) {
275
322
  stream.on("prompt", onPrompt);
276
323
  stream.on("prompts", applyPrompts);
277
324
  stream.on("prompt_resolved", resolvePrompt);
325
+ stream.on("reply_buttons", applyReplyButtons);
278
326
  }
279
327
 
280
328
  return {
@@ -283,7 +331,8 @@ export function createChatStore(deps) {
283
331
  setCurrent(name) { s.current = name; },
284
332
  attach, applyStatus, applyActivity, ingest, applyDeliveries, openHistory,
285
333
  onPrompt, applyPrompts, resolvePrompt, answerPrompt, answerByNonce, holdPrompt, releasePrompt, promptsFor,
334
+ applyReplyButtons, clickReplyButton,
286
335
  uploadFile, send, addFiles, removeFile, attachPastedText, fileBackAsText, isPasted, putBack, discardFailed, setDraft,
287
- cancelReply, isUser,
336
+ cancelReply, isUser, runCommand, dismissCommand, commandFree,
288
337
  };
289
338
  }
@@ -3,6 +3,13 @@ import { register } from "/assets/app-i18n.js";
3
3
 
4
4
  register("chat", {
5
5
  en: {
6
+ cmdConfirm: "Clear", cmdRunning: "Running /{0}…", cmdNotCommand: "Not a command here — Enter sends it as a message.", cmdDismiss: "Dismiss", cmdCommands: "Commands",
7
+ cmdChoose: "Choose", cmdCurrent: "current", chipCompact: "Compact", chipClear: "Clear…", chipContext: "Context {0}% used",
8
+ chipModel: "Model: {0} — choose another", chipEffort: "Effort: {0} — choose another",
9
+ cmd_ctx: "Context use, model and effort", cmd_compact: "Compact the conversation", cmd_clear: "Clear the conversation (asks first)",
10
+ cmd_model: "Show or switch the model", cmd_effort: "Show or set the reasoning effort", cmd_cancel: "Stop the current reply",
11
+ cmd_btw: "A side question that does not interrupt", cmd_steer: "Send into the current turn", cmd_pause: "Pause the instance",
12
+ cmd_wake: "Wake a paused instance", cmd_save: "Save the conversation to a file",
6
13
  tourTitle: "Welcome to web chat", tourStep: "{0} of {1}", tourBack: "Back", tourNext: "Next", tourDone: "Got it", tourSkip: "Skip",
7
14
  tour1: "Pick an instance in the list to chat with it. On a phone, ☰ opens the list.",
8
15
  tour2: "It is the same conversation as its Telegram or Discord chat: what you send here shows up there too, and the agent's replies show up in both.",
@@ -12,12 +19,19 @@ register("chat", {
12
19
  a11yWorking: "{0} started working", a11yIdle: "{0} finished", a11yReplied: "{0} replied", conversationWith: "Conversation with {0}",
13
20
  stopping: "Stopping {0}…", awaiting: "{0} is waiting for your input", approxNote: "Read from the terminal, so approximate", elapsedTitle: "Time since this page saw it start (approximate)",
14
21
  dropHere: "Drop files to attach them", asText: "As text", pasteAttached: "A long paste ({0} characters) was attached as a text file", pasteKeptAsText: "No room for another attachment: the long paste stays as text",
15
- send: "Send", composerPlaceholder: "Message {0}…", composerHint: "Enter to send · Shift+Enter for a new line · Esc stops the reply", attachTitle: "Attach files (images, PDF, text — or paste / drop them)",
22
+ send: "Send", composerPlaceholder: "Message {0}…", composerHint: "Enter to send · Shift+Enter for a new line · / for commands · Esc stops the reply", attachTitle: "Attach files (images, PDF, text — or paste / drop them)",
16
23
  pvPreview: "Preview", pvStop: "Stop", pvDownload: "Download", pvMenu: "Preview options", pvHtml: "HTML",
17
24
  pvAllowButton: "Allow previews", pvAllow: "Allow HTML previews on this device — they may be able to send data out", pvDisallow: "Stop allowing HTML previews on this device",
18
25
  pvConfirm: "Allow HTML previews on this device?\n\nA preview runs the agent's HTML in an isolated frame. It cannot use your login, but it may be able to send data out, and it can slow or freeze this tab. You still click Preview each time.",
19
26
  pvNever: "Never preview HTML on this device", pvNeverUndo: "Let this device preview HTML again", pvStarting: "Starting the preview…",
20
27
  pvChanged: "Preview stopped — the message changed. Preview again.", pvTruncated: "Truncated — ask the agent to send it as a .html file.",
28
+ pvLoading: "Reading the file…", pvAttOver: "This file is over 1 MiB; it is not previewed.",
29
+ pvAttGone: "This file is no longer available here (it changed, or the fleet restarted). Ask the agent to send it again.",
30
+ pvAttFailed: "Could not read this file. Try again.",
31
+ rbGroup: "Choices", rbChosen: "Chosen by {0}", rbExpired: "Expired — reply in text",
32
+ pvOpenPanel: "Open in panel", pvInPanel: "Shown in the panel.", pvPanel: "HTML preview", pvSource: "From {0}, {1} — show the message",
33
+ pvPage: "Page", pvCode: "Code", pvReload: "Reload", pvClose: "Close the panel", pvBack: "Back to the chat", pvResize: "Resize the preview panel",
34
+ pvNewer: "A newer version is in the reply from {0}.", pvNewerShow: "Show it", pvPanelIdle: "Click Preview to run it here.",
21
35
  previews: "Allow HTML previews on this device",
22
36
  copy: "Copy", copyMessage: "Copy this reply", copied: "Copied", copyFailed: "Copy failed", wrap: "Wrap", showAll: "Show all {0} lines", showLess: "Show less", jumpLatest: "Latest", newBelow: "{0} new",
23
37
  disconnected: "disconnected", tick_queued: "Waiting behind another message", tick_processing: "Handed to the agent", tick_delivered: "The agent has it", tick_failed: "Not delivered", tick_cancelled: "Dropped by Stop",
@@ -35,6 +49,13 @@ register("chat", {
35
49
  configured: "(configured)", fleetDefault: "(fleet default)",
36
50
  },
37
51
  "zh-TW": {
52
+ cmdConfirm: "清空", cmdRunning: "執行 /{0} 中…", cmdNotCommand: "這裡沒有這個指令——按 Enter 會當成一般訊息送出。", cmdDismiss: "關閉", cmdCommands: "指令",
53
+ cmdChoose: "選擇", cmdCurrent: "目前", chipCompact: "壓縮", chipClear: "清空…", chipContext: "已用 {0}% 的 context",
54
+ chipModel: "模型:{0}——選擇其他", chipEffort: "推理強度:{0}——選擇其他",
55
+ cmd_ctx: "context 用量、模型與推理強度", cmd_compact: "壓縮對話", cmd_clear: "清空對話(會先確認)",
56
+ cmd_model: "查看或切換模型", cmd_effort: "查看或設定推理強度", cmd_cancel: "停止目前的回覆",
57
+ cmd_btw: "不打斷目前工作的旁問", cmd_steer: "送進目前這一輪", cmd_pause: "暫停 instance",
58
+ cmd_wake: "喚醒已暫停的 instance", cmd_save: "把對話存成檔案",
38
59
  tourTitle: "歡迎使用網頁聊天", tourStep: "{0} / {1}", tourBack: "上一步", tourNext: "下一步", tourDone: "知道了", tourSkip: "略過",
39
60
  tour1: "在清單裡選一個 instance,就能跟它對話。手機上請按 ☰ 打開清單。",
40
61
  tour2: "這和它在 Telegram 或 Discord 上的是同一段對話:在這裡送出的訊息那邊也看得到,Agent 的回覆兩邊都會出現。",
@@ -44,12 +65,19 @@ register("chat", {
44
65
  a11yWorking: "{0} 開始工作", a11yIdle: "{0} 已完成", a11yReplied: "{0} 已回覆", conversationWith: "與 {0} 的對話",
45
66
  stopping: "正在中止 {0}…", awaiting: "{0} 正在等你回應", approxNote: "從終端畫面判讀,僅供參考", elapsedTitle: "從這個頁面看到它開始工作起算(約略)",
46
67
  dropHere: "放開即可附加檔案", asText: "改為文字", pasteAttached: "貼上的長文字({0} 個字元)已改為文字檔附加", pasteKeptAsText: "附件已滿,貼上的長文字保留為一般文字",
47
- send: "送出", composerPlaceholder: "傳訊息給 {0}…", composerHint: "Enter 送出 · Shift+Enter 換行 · Esc 中止回覆", attachTitle: "附加檔案(圖片、PDF、文字檔,也可以貼上或拖曳)",
68
+ send: "送出", composerPlaceholder: "傳訊息給 {0}…", composerHint: "Enter 送出 · Shift+Enter 換行 · / 叫出指令 · Esc 中止回覆", attachTitle: "附加檔案(圖片、PDF、文字檔,也可以貼上或拖曳)",
48
69
  pvPreview: "預覽", pvStop: "停止", pvDownload: "下載", pvMenu: "預覽選項", pvHtml: "HTML",
49
70
  pvAllowButton: "允許預覽", pvAllow: "允許這台裝置預覽 HTML(預覽可能把資料傳出去)", pvDisallow: "不再允許這台裝置預覽 HTML",
50
71
  pvConfirm: "要允許這台裝置預覽 HTML 嗎?\n\n預覽會在隔離的框架裡執行 agent 的 HTML。它無法使用你的登入,但可能把資料傳出去,也可能讓這個分頁變慢或卡住。每次仍需要你按「預覽」。",
51
72
  pvNever: "這台裝置永不預覽 HTML", pvNeverUndo: "讓這台裝置再次可以預覽 HTML", pvStarting: "正在啟動預覽…",
52
73
  pvChanged: "預覽已停止——訊息內容變了。請再預覽一次。", pvTruncated: "內容被截斷——請 agent 改用 .html 檔案傳送。",
74
+ pvLoading: "正在讀取檔案…", pvAttOver: "這個檔案超過 1 MiB,不提供預覽。",
75
+ pvAttGone: "這裡已無法取得這個檔案(檔案已變更,或艦隊已重新啟動)。請 agent 再傳一次。",
76
+ pvAttFailed: "無法讀取這個檔案,請再試一次。",
77
+ rbGroup: "選項", rbChosen: "{0} 已選擇", rbExpired: "已逾時,請直接回覆文字",
78
+ pvOpenPanel: "在面板中開啟", pvInPanel: "已在面板中顯示。", pvPanel: "HTML 預覽", pvSource: "來自 {0},{1}——顯示該訊息",
79
+ pvPage: "頁面", pvCode: "程式碼", pvReload: "重新載入", pvClose: "關閉面板", pvBack: "回到對話", pvResize: "調整預覽面板寬度",
80
+ pvNewer: "{0} 的回覆裡有較新的版本。", pvNewerShow: "顯示", pvPanelIdle: "按「預覽」在這裡執行。",
53
81
  previews: "允許這台裝置預覽 HTML",
54
82
  copy: "複製", copyMessage: "複製這則回覆", copied: "已複製", copyFailed: "複製失敗", wrap: "換行", showAll: "展開全部 {0} 行", showLess: "收合", jumpLatest: "最新", newBelow: "{0} 則新訊息",
55
83
  disconnected: "已斷線", tick_queued: "排在前一則訊息之後", tick_processing: "已交給 agent", tick_delivered: "agent 已收到", tick_failed: "未送達", tick_cancelled: "已被中止取消",