@songsid/agend 2.3.2-beta.9 → 2.3.3-beta.1

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 (285) hide show
  1. package/README.md +6 -0
  2. package/README.zh-TW.md +6 -0
  3. package/dist/agent-cli-instructions.md +2 -2
  4. package/dist/agent-cli.js +48 -0
  5. package/dist/agent-cli.js.map +1 -1
  6. package/dist/agent-endpoint.js +6 -0
  7. package/dist/agent-endpoint.js.map +1 -1
  8. package/dist/agent-whats-new.d.ts +21 -0
  9. package/dist/agent-whats-new.js +53 -21
  10. package/dist/agent-whats-new.js.map +1 -1
  11. package/dist/auth-api.js +2 -0
  12. package/dist/auth-api.js.map +1 -1
  13. package/dist/backend/claude-code.d.ts +13 -1
  14. package/dist/backend/claude-code.js +43 -2
  15. package/dist/backend/claude-code.js.map +1 -1
  16. package/dist/backend/codex-session-lookup.d.ts +15 -0
  17. package/dist/backend/codex-session-lookup.js +58 -0
  18. package/dist/backend/codex-session-lookup.js.map +1 -1
  19. package/dist/backend/codex.js +15 -4
  20. package/dist/backend/codex.js.map +1 -1
  21. package/dist/backend/kiro-classic-archive.d.ts +57 -0
  22. package/dist/backend/kiro-classic-archive.js +622 -0
  23. package/dist/backend/kiro-classic-archive.js.map +1 -0
  24. package/dist/backend/kiro-classic-links.d.ts +24 -0
  25. package/dist/backend/kiro-classic-links.js +135 -0
  26. package/dist/backend/kiro-classic-links.js.map +1 -0
  27. package/dist/backend/kiro-identity.d.ts +100 -1
  28. package/dist/backend/kiro-identity.js +262 -31
  29. package/dist/backend/kiro-identity.js.map +1 -1
  30. package/dist/backend/kiro-migration-verify.d.ts +10 -0
  31. package/dist/backend/kiro-migration-verify.js +52 -0
  32. package/dist/backend/kiro-migration-verify.js.map +1 -0
  33. package/dist/backend/kiro-reconcile-store.d.ts +27 -0
  34. package/dist/backend/kiro-reconcile-store.js +351 -0
  35. package/dist/backend/kiro-reconcile-store.js.map +1 -0
  36. package/dist/backend/kiro-v2-store-worker.js +35 -1
  37. package/dist/backend/kiro-v2-store-worker.js.map +1 -1
  38. package/dist/backend/kiro-v2-store.d.ts +31 -1
  39. package/dist/backend/kiro-v2-store.js +22 -12
  40. package/dist/backend/kiro-v2-store.js.map +1 -1
  41. package/dist/backend/kiro.d.ts +124 -6
  42. package/dist/backend/kiro.js +553 -39
  43. package/dist/backend/kiro.js.map +1 -1
  44. package/dist/backend/types.d.ts +109 -4
  45. package/dist/backend/types.js +9 -0
  46. package/dist/backend/types.js.map +1 -1
  47. package/dist/cache-service.d.ts +13 -1
  48. package/dist/cache-service.js +45 -2
  49. package/dist/cache-service.js.map +1 -1
  50. package/dist/channel/ipc-timeouts.js +3 -0
  51. package/dist/channel/ipc-timeouts.js.map +1 -1
  52. package/dist/channel/mcp-tools.js +40 -5
  53. package/dist/channel/mcp-tools.js.map +1 -1
  54. package/dist/channel/tool-router.js +2 -1
  55. package/dist/channel/tool-router.js.map +1 -1
  56. package/dist/classic-channel-manager.d.ts +6 -0
  57. package/dist/classic-channel-manager.js +25 -0
  58. package/dist/classic-channel-manager.js.map +1 -1
  59. package/dist/cli.js +52 -6
  60. package/dist/cli.js.map +1 -1
  61. package/dist/config-validator.d.ts +7 -1
  62. package/dist/config-validator.js +20 -9
  63. package/dist/config-validator.js.map +1 -1
  64. package/dist/config.js +2 -0
  65. package/dist/config.js.map +1 -1
  66. package/dist/cross-instance-envelope.d.ts +10 -5
  67. package/dist/cross-instance-envelope.js +20 -17
  68. package/dist/cross-instance-envelope.js.map +1 -1
  69. package/dist/daemon.d.ts +125 -63
  70. package/dist/daemon.js +694 -330
  71. package/dist/daemon.js.map +1 -1
  72. package/dist/dashboard-permissions.d.ts +15 -4
  73. package/dist/dashboard-permissions.js +49 -23
  74. package/dist/dashboard-permissions.js.map +1 -1
  75. package/dist/delivery-outbox.d.ts +27 -22
  76. package/dist/delivery-outbox.js +109 -161
  77. package/dist/delivery-outbox.js.map +1 -1
  78. package/dist/delivery-outbox.test.js +10 -25
  79. package/dist/delivery-outbox.test.js.map +1 -1
  80. package/dist/doctor.js +2 -1
  81. package/dist/doctor.js.map +1 -1
  82. package/dist/fleet-control-audit.d.ts +1 -1
  83. package/dist/fleet-control-audit.js +3 -0
  84. package/dist/fleet-control-audit.js.map +1 -1
  85. package/dist/fleet-manager.d.ts +94 -15
  86. package/dist/fleet-manager.js +597 -133
  87. package/dist/fleet-manager.js.map +1 -1
  88. package/dist/forged-envelope-scan.d.ts +9 -0
  89. package/dist/forged-envelope-scan.js +30 -5
  90. package/dist/forged-envelope-scan.js.map +1 -1
  91. package/dist/general-instance.d.ts +24 -0
  92. package/dist/general-instance.js +53 -0
  93. package/dist/general-instance.js.map +1 -1
  94. package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +1 -1
  95. package/dist/general-knowledge/skills/docker-install/SKILL.md +25 -0
  96. package/dist/general-knowledge/skills/fleet-config/SKILL.md +5 -3
  97. package/dist/general-knowledge/skills/fleet-restart/SKILL.md +1 -1
  98. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +34 -0
  99. package/dist/general-knowledge/skills/session-management/SKILL.md +2 -2
  100. package/dist/general-knowledge/skills/tui-effort/SKILL.md +1 -1
  101. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +32 -0
  102. package/dist/general-knowledge/skills/web-appearance/SKILL.md +32 -0
  103. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +57 -17
  104. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +57 -17
  105. package/dist/instance-config-impact.js +3 -2
  106. package/dist/instance-config-impact.js.map +1 -1
  107. package/dist/instance-lifecycle.d.ts +4 -0
  108. package/dist/instance-lifecycle.js +28 -5
  109. package/dist/instance-lifecycle.js.map +1 -1
  110. package/dist/instructions.js +6 -7
  111. package/dist/instructions.js.map +1 -1
  112. package/dist/kiro-migrate.d.ts +19 -2
  113. package/dist/kiro-migrate.js +133 -35
  114. package/dist/kiro-migrate.js.map +1 -1
  115. package/dist/kiro-reconcile.d.ts +21 -0
  116. package/dist/kiro-reconcile.js +88 -0
  117. package/dist/kiro-reconcile.js.map +1 -0
  118. package/dist/kiro-session-proof.d.ts +41 -0
  119. package/dist/kiro-session-proof.js +89 -0
  120. package/dist/kiro-session-proof.js.map +1 -0
  121. package/dist/kiro-tui-forensic.d.ts +19 -0
  122. package/dist/kiro-tui-forensic.js +124 -0
  123. package/dist/kiro-tui-forensic.js.map +1 -0
  124. package/dist/locale.js +202 -16
  125. package/dist/locale.js.map +1 -1
  126. package/dist/log-service.js +3 -3
  127. package/dist/log-service.js.map +1 -1
  128. package/dist/needs-you.d.ts +3 -1
  129. package/dist/needs-you.js +4 -2
  130. package/dist/needs-you.js.map +1 -1
  131. package/dist/office-levels.d.ts +64 -0
  132. package/dist/office-levels.js +66 -0
  133. package/dist/office-levels.js.map +1 -0
  134. package/dist/office-share-page.d.ts +3 -1
  135. package/dist/office-share-page.js +8 -3
  136. package/dist/office-share-page.js.map +1 -1
  137. package/dist/office-share-service.d.ts +6 -3
  138. package/dist/office-share-service.js +12 -8
  139. package/dist/office-share-service.js.map +1 -1
  140. package/dist/office-share.d.ts +45 -8
  141. package/dist/office-share.js +75 -15
  142. package/dist/office-share.js.map +1 -1
  143. package/dist/outbound-handlers.js +21 -2
  144. package/dist/outbound-handlers.js.map +1 -1
  145. package/dist/outbound-schemas.d.ts +47 -2
  146. package/dist/outbound-schemas.js +42 -3
  147. package/dist/outbound-schemas.js.map +1 -1
  148. package/dist/public-web-gateway.js +1 -1
  149. package/dist/public-web-gateway.js.map +1 -1
  150. package/dist/quickstart-api.d.ts +39 -1
  151. package/dist/quickstart-api.js +115 -17
  152. package/dist/quickstart-api.js.map +1 -1
  153. package/dist/remote-card-answer.d.ts +83 -0
  154. package/dist/remote-card-answer.js +208 -0
  155. package/dist/remote-card-answer.js.map +1 -0
  156. package/dist/remote-card-prompt.d.ts +38 -0
  157. package/dist/remote-card-prompt.js +86 -0
  158. package/dist/remote-card-prompt.js.map +1 -0
  159. package/dist/scheduler/task-board.d.ts +44 -17
  160. package/dist/scheduler/task-board.js +95 -36
  161. package/dist/scheduler/task-board.js.map +1 -1
  162. package/dist/sd-notify.d.ts +13 -14
  163. package/dist/sd-notify.js +62 -28
  164. package/dist/sd-notify.js.map +1 -1
  165. package/dist/service-installer.d.ts +13 -0
  166. package/dist/service-installer.js +15 -0
  167. package/dist/service-installer.js.map +1 -1
  168. package/dist/service-owner.d.ts +25 -0
  169. package/dist/service-owner.js +43 -2
  170. package/dist/service-owner.js.map +1 -1
  171. package/dist/settings-api.d.ts +2 -1
  172. package/dist/settings-api.js +19 -26
  173. package/dist/settings-api.js.map +1 -1
  174. package/dist/settings-change.js +10 -5
  175. package/dist/settings-change.js.map +1 -1
  176. package/dist/settings-effect.js +7 -6
  177. package/dist/settings-effect.js.map +1 -1
  178. package/dist/settings-instance-patch.js +1 -1
  179. package/dist/settings-instance-patch.js.map +1 -1
  180. package/dist/setup-form.d.ts +2 -2
  181. package/dist/setup-form.js +139 -93
  182. package/dist/setup-form.js.map +1 -1
  183. package/dist/setup-i18n.d.ts +25 -0
  184. package/dist/setup-i18n.js +226 -0
  185. package/dist/setup-i18n.js.map +1 -0
  186. package/dist/task-board-waker.d.ts +40 -1
  187. package/dist/task-board-waker.js +115 -9
  188. package/dist/task-board-waker.js.map +1 -1
  189. package/dist/tmux-control.d.ts +1 -1
  190. package/dist/tmux-control.js +3 -2
  191. package/dist/tmux-control.js.map +1 -1
  192. package/dist/tmux-manager.js +18 -16
  193. package/dist/tmux-manager.js.map +1 -1
  194. package/dist/tmux-read.d.ts +2 -0
  195. package/dist/tmux-read.js +7 -1
  196. package/dist/tmux-read.js.map +1 -1
  197. package/dist/tool-permissions.js +18 -0
  198. package/dist/tool-permissions.js.map +1 -1
  199. package/dist/topic-commands.d.ts +2 -0
  200. package/dist/topic-commands.js +2 -1
  201. package/dist/topic-commands.js.map +1 -1
  202. package/dist/transcript-sources.d.ts +1 -0
  203. package/dist/transcript-sources.js +20 -3
  204. package/dist/transcript-sources.js.map +1 -1
  205. package/dist/types.d.ts +11 -5
  206. package/dist/ui/backend-signin.js +4 -3
  207. package/dist/ui/chat-store.js +3 -2
  208. package/dist/ui/chat-strings.js +2 -2
  209. package/dist/ui/fleet-office-card.js +114 -0
  210. package/dist/ui/fleet-office-editor.js +81 -9
  211. package/dist/ui/fleet-office-layout.js +56 -11
  212. package/dist/ui/fleet-office-levels.js +105 -0
  213. package/dist/ui/fleet-office-model.js +9 -1
  214. package/dist/ui/fleet-office-pack.d.ts +15 -3
  215. package/dist/ui/fleet-office-pack.js +177 -23
  216. package/dist/ui/fleet-office-skin.js +39 -3
  217. package/dist/ui/fleet-office-store.js +74 -3
  218. package/dist/ui/fleet-office-view.js +8 -0
  219. package/dist/ui/fleet-office-zones.js +102 -19
  220. package/dist/ui/fleet-office.js +308 -44
  221. package/dist/ui/fleet-org.js +2 -0
  222. package/dist/ui/fleet-task-card.js +2 -2
  223. package/dist/ui/fleet-task-common.js +30 -7
  224. package/dist/ui/fleet-task-work.js +2 -2
  225. package/dist/ui/fleet-tasks.js +10 -11
  226. package/dist/ui/office-share-dialog.js +31 -7
  227. package/dist/ui/office-share-page.js +1 -0
  228. package/dist/ui/panel-chat.js +14 -2
  229. package/dist/ui/panel-log.js +6 -6
  230. package/dist/ui/panel-needs.js +1 -1
  231. package/dist/ui/panel-settings.js +16 -8
  232. package/dist/ui/settings-appearance.js +3 -35
  233. package/dist/ui/settings-discord.js +3 -2
  234. package/dist/ui/settings-guests.js +17 -7
  235. package/dist/ui/settings-model.js +17 -9
  236. package/dist/ui/settings-registry.js +1 -1
  237. package/dist/ui/settings-strings.js +18 -6
  238. package/dist/ui/settings-token.js +3 -2
  239. package/dist/ui/settings-wizard.js +25 -9
  240. package/dist/ui/shared/app-i18n.js +2 -2
  241. package/dist/ui/shared/app-stream.js +1 -1
  242. package/dist/ui/shared/app.css +70 -2
  243. package/dist/ui/shared/setup-host-text.js +107 -0
  244. package/dist/ui/structured-signin.js +89 -38
  245. package/dist/update-check.d.ts +13 -4
  246. package/dist/update-check.js +17 -4
  247. package/dist/update-check.js.map +1 -1
  248. package/dist/usage-rollup.d.ts +34 -3
  249. package/dist/usage-rollup.js +56 -3
  250. package/dist/usage-rollup.js.map +1 -1
  251. package/dist/web-api.d.ts +10 -1
  252. package/dist/web-api.js +207 -17
  253. package/dist/web-api.js.map +1 -1
  254. package/dist/web-auth.js +1 -1
  255. package/dist/web-auth.js.map +1 -1
  256. package/dist/web-experimental.d.ts +6 -2
  257. package/dist/web-experimental.js +8 -4
  258. package/dist/web-experimental.js.map +1 -1
  259. package/dist/web-office-acts.d.ts +5 -2
  260. package/dist/web-office-acts.js +9 -4
  261. package/dist/web-office-acts.js.map +1 -1
  262. package/dist/web-office-pack-read.d.ts +35 -0
  263. package/dist/web-office-pack-read.js +252 -0
  264. package/dist/web-office-pack-read.js.map +1 -0
  265. package/dist/web-office-pack-tools.d.ts +241 -0
  266. package/dist/web-office-pack-tools.js +785 -0
  267. package/dist/web-office-pack-tools.js.map +1 -0
  268. package/dist/web-office-skins.d.ts +68 -4
  269. package/dist/web-office-skins.js +324 -33
  270. package/dist/web-office-skins.js.map +1 -1
  271. package/dist/web-office-store.d.ts +47 -4
  272. package/dist/web-office-store.js +124 -23
  273. package/dist/web-office-store.js.map +1 -1
  274. package/dist/web-settings-patch.d.ts +3 -2
  275. package/dist/web-settings-patch.js +7 -5
  276. package/dist/web-settings-patch.js.map +1 -1
  277. package/dist/workflow-templates/default.md +3 -3
  278. package/dist/working-recovery.d.ts +0 -2
  279. package/dist/working-recovery.js +2 -23
  280. package/dist/working-recovery.js.map +1 -1
  281. package/package.json +2 -2
  282. package/templates/windows-shortcuts.ps1 +18 -17
  283. package/dist/upgrade-notices.d.ts +0 -17
  284. package/dist/upgrade-notices.js +0 -93
  285. package/dist/upgrade-notices.js.map +0 -1
@@ -0,0 +1,124 @@
1
+ /** #2598 B1: read-only, bounded snapshot of the explicitly owned TUI conversation.
2
+ * This is a forensic history scan, not proof of the pane's current session (the raw Log gate stays closed).
3
+ */
4
+ import { closeSync, constants, fstatSync, lstatSync, openSync, readSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { basename, join } from "node:path";
7
+ export const KIRO_FORENSIC_MAX_BYTES = 64 * 1024 * 1024;
8
+ const META_MAX_BYTES = 8 * 1024 * 1024;
9
+ const LINE_MAX_BYTES = 4 * 1024 * 1024;
10
+ const plain = (value) => !!value && typeof value === "object" && !Array.isArray(value);
11
+ /** Callers using a tiny emptiness probe must distinguish work from an unsafe file. */
12
+ export class KiroTuiSnapshotSizeError extends Error {
13
+ path;
14
+ maxBytes;
15
+ actualBytes;
16
+ constructor(path, maxBytes, actualBytes) {
17
+ super(`TUI session ${JSON.stringify(basename(path))} exceeds the scan size limit (${actualBytes} > ${maxBytes} bytes)`);
18
+ this.path = path;
19
+ this.maxBytes = maxBytes;
20
+ this.actualBytes = actualBytes;
21
+ }
22
+ }
23
+ /** Refuse symlinks/devices/foreign files and read exactly the size observed at open, not an unbounded live tail. */
24
+ export function snapshotKiroTuiFile(path, maxBytes) {
25
+ const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
26
+ try {
27
+ const before = fstatSync(fd);
28
+ if (!before.isFile() || (process.getuid && before.uid !== process.getuid())) {
29
+ throw new Error(`TUI session ${JSON.stringify(basename(path))} is not an owned regular file`);
30
+ }
31
+ if (before.size > maxBytes)
32
+ throw new KiroTuiSnapshotSizeError(path, maxBytes, before.size);
33
+ const bytes = Buffer.alloc(before.size);
34
+ let offset = 0;
35
+ while (offset < bytes.length) {
36
+ const got = readSync(fd, bytes, offset, bytes.length - offset, offset);
37
+ if (!got)
38
+ throw new Error("TUI session was truncated while scanning");
39
+ offset += got;
40
+ }
41
+ const after = fstatSync(fd);
42
+ if (after.size < before.size || (after.size === before.size && after.mtimeMs !== before.mtimeMs))
43
+ throw new Error("TUI session changed while scanning");
44
+ const samePath = () => {
45
+ try {
46
+ const current = lstatSync(path);
47
+ return current.isFile() && current.dev === before.dev && current.ino === before.ino && current.size >= before.size
48
+ && (current.size > before.size || current.mtimeMs === before.mtimeMs);
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ };
54
+ return { text: new TextDecoder("utf-8", { fatal: true }).decode(bytes), unchanged: samePath };
55
+ }
56
+ finally {
57
+ closeSync(fd);
58
+ }
59
+ }
60
+ /** Tool input is assistant-authored too; returned output and user prompts never enter this walk. */
61
+ function inputStrings(value, texts, depth = 0) {
62
+ if (depth > 64)
63
+ throw new Error("TUI tool input exceeds the nesting limit");
64
+ if (typeof value === "string")
65
+ texts.push(value);
66
+ else if (Array.isArray(value))
67
+ for (const item of value)
68
+ inputStrings(item, texts, depth + 1);
69
+ else if (plain(value))
70
+ for (const item of Object.values(value))
71
+ inputStrings(item, texts, depth + 1);
72
+ }
73
+ export function readKiroTuiAssistantTexts(opts) {
74
+ try {
75
+ if (!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,199}$/.test(opts.sessionId) || !opts.stillOwned())
76
+ throw new Error("TUI session ownership is not proven");
77
+ // Same V2 root convention as kiroV2SessionsDir; credential profiles relocate classic only.
78
+ const root = opts.sessionsDir ?? join(process.env.KIRO_HOME?.trim() || join(homedir(), ".kiro"), "sessions", "cli");
79
+ const metadata = snapshotKiroTuiFile(join(root, `${opts.sessionId}.json`), META_MAX_BYTES);
80
+ const meta = JSON.parse(metadata.text);
81
+ if (!plain(meta) || meta.session_id !== opts.sessionId
82
+ || (meta.session_created_reason === "subagent" && meta.exported_from_v1 !== true)) {
83
+ throw new Error("TUI metadata does not match the owned pin, or is an ordinary child session");
84
+ }
85
+ const transcript = snapshotKiroTuiFile(join(root, `${opts.sessionId}.jsonl`), KIRO_FORENSIC_MAX_BYTES);
86
+ const texts = [];
87
+ let records = 0;
88
+ for (const line of transcript.text.split("\n")) {
89
+ if (!line.trim())
90
+ continue;
91
+ if (Buffer.byteLength(line) > LINE_MAX_BYTES)
92
+ throw new Error("TUI record exceeds the scan line limit");
93
+ const record = JSON.parse(line);
94
+ if (!plain(record) || record.version !== "v1" || !plain(record.data))
95
+ throw new Error("Unsupported TUI record schema");
96
+ records++;
97
+ if (record.kind === "Prompt" || record.kind === "ToolResults")
98
+ continue;
99
+ if (record.kind !== "AssistantMessage" || !Array.isArray(record.data.content))
100
+ throw new Error("Unsupported TUI assistant record");
101
+ for (const block of record.data.content) {
102
+ if (!plain(block))
103
+ throw new Error("Unsupported TUI assistant block");
104
+ if (block.kind === "text" && typeof block.data === "string")
105
+ texts.push(block.data);
106
+ else if (block.kind === "toolUse" && plain(block.data) && plain(block.data.input))
107
+ inputStrings(block.data.input, texts);
108
+ else
109
+ throw new Error("Unsupported TUI assistant block");
110
+ }
111
+ }
112
+ if (!records)
113
+ throw new Error("TUI transcript has no complete records");
114
+ if (!metadata.unchanged() || !transcript.unchanged() || !opts.stillOwned())
115
+ throw new Error("TUI session or ownership changed while scanning; rerun the scan");
116
+ return { kind: "ok", conversationId: opts.sessionId, texts };
117
+ }
118
+ catch (error) {
119
+ // Fixed prefix plus the local failure; no transcript text is included in the diagnostic.
120
+ const reason = error instanceof SyntaxError || error instanceof TypeError ? "TUI session contains malformed JSON or UTF-8" : error.message;
121
+ return { kind: "unreadable", reason };
122
+ }
123
+ }
124
+ //# sourceMappingURL=kiro-tui-forensic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiro-tui-forensic.js","sourceRoot":"","sources":["../src/kiro-tui-forensic.ts"],"names":[],"mappings":"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"}
package/dist/locale.js CHANGED
@@ -178,6 +178,7 @@ const enMessages = {
178
178
  "dashboard.start_web_ack": "✅ You can now use /web in your group.",
179
179
  "web.public_login_notice": "🔐 New web sign-in · public: {0} (session {1}). If this was not you, use /web revoke.",
180
180
  "office_share.all": "All offices",
181
+ "office_share.whole": "the whole fleet",
181
182
  "office_share.created_notice": "🏢 {0} shared the Office ({1}) for {2}: anyone with the link can watch it, read-only. Revoke it in Settings → Access & security.",
182
183
  "office_share.revoked_notice": "🏢 {0} revoked the Office share link ({1}).",
183
184
  "office_share.revoked_all_notice": "🏢 {0} revoked {1} Office share links.",
@@ -231,6 +232,7 @@ const enMessages = {
231
232
  "needs.reason.hang": "Not responding",
232
233
  "needs.reason.exited": "Exited",
233
234
  "needs.reason.assist": "Waiting at its terminal",
235
+ "needs.reason.question": "Asking you a question",
234
236
  "needs.reason.permission": "Permission needed",
235
237
  "needs.reason.dangerous_command": "Dangerous command waiting",
236
238
  "needs.reason.login": "Sign-in needed",
@@ -293,7 +295,6 @@ const enMessages = {
293
295
  "board_summary.project_waiting": "{0} waiting for you",
294
296
  "board_summary.project_blocked": "{0} blocked",
295
297
  "board_summary.footer": "The board: Fleet › Tasks on the dashboard.",
296
- "upgrade.web_chat": "🆕 AgEnD 2.2 adds web chat. You can keep chatting here.\nAdmins: send /web in General, then press a sign-in button to get a code.",
297
298
  "dashboard.remote_hint": "📱 These links open on the fleet's own machine only. To use web chat from a phone or another computer: {0}",
298
299
  "fleet.starting_retry": "The fleet is still starting. Try again when startup finishes.",
299
300
  "fleet.ready": "Fleet ready. {0}/{1} instances running. v{2}",
@@ -355,12 +356,53 @@ const enMessages = {
355
356
  "kiro_migrate.refused_unreadable": "AgEnD cannot read the kiro conversation records of '{0}', so it cannot tell which conversation to carry. Nothing was changed.",
356
357
  "kiro_migrate.refused_name": "'{0}' cannot be recorded as a kiro conversation owner.",
357
358
  "kiro_migrate.no_classic": "'{0}' has no classic conversation on record to carry over (it started fresh, or ran without its own record). Moving it would start an empty TUI conversation; ask again with start_fresh: true if that is intended.",
359
+ "kiro_migrate.prompt_verify": "After carrying it, AgEnD archives the frozen classic duplicate, then performs a plain restart and verifies the same conversation, model, transcript source and forensic reader. Any failure leaves it stopped.",
360
+ "kiro_migrate.prompt_sudo": "If this instance uses sudo or an interactive password, TUI handling may differ. Confirm only if you accept that change.",
361
+ "kiro_migrate.prompt_start_verify": "It is stopped: confirming starts it to carry and verify the conversation.",
362
+ "kiro_migrate.verified": "✅ {0}: TUI migration verified after a plain restart. Conversation {1}; model {2}; V2 transcript attached; forensic verdict: {3}.",
363
+ "kiro_migrate.failed": "⛔ {0}: TUI migration did not complete ({1}). The conversation is kept. Inspect the cause before an explicit retry. Never switch back to classic.",
364
+ "kiro_migrate.stop_unconfirmed": "Stopping the instance could not be confirmed; an admin must inspect it.",
365
+ "kiro_migrate.in_progress": "A migration or lifecycle operation is already in progress for this instance.",
366
+ "kiro_migrate.superseded": "The instance was stopped, replaced or reconfigured during migration.",
367
+ "kiro_migrate.version_required": "This verified migration requires kiro-cli 2.34+ with TUI v2 and per-instance agents.",
368
+ "kiro_migrate.idle_required": "Wait until the instance is idle with no interactive prompt, then retry.",
369
+ "kiro_migrate.model_unknown": "The current model could not be proven; migration has not started.",
370
+ "kiro_migrate.verification_failed": "The same idle V2 conversation, model and transcript source could not be verified within 60 seconds.",
358
371
  "kiro_migrate.prompt_title": "🔀 Move {0} from kiro classic to the TUI engine?",
359
372
  "kiro_migrate.prompt_carry": "Its classic conversation {0} is resumed once under the TUI: kiro copies the whole history over, and the classic copy stops being updated.",
373
+ "kiro_migrate.prompt_compacted": "Its classic conversation {0} was compacted since its last restart and went on as {1}; the move carries {1}.",
374
+ "kiro_migrate.refused_compaction": "{0} was not moved: its classic conversation {1} may have gone on after a /compact, and where can't be proven ({2}). Carrying {1} could leave newer work behind; nothing was changed.",
375
+ "kiro_migrate.compaction_unreadable": "kiro's store could not be read",
376
+ "kiro_migrate.compaction_over_budget": "kiro's store is too big to check within the time limit whether it was compacted",
377
+ "kiro_migrate.compaction_ambiguous": "{0} was compacted into more than one conversation: {1}",
378
+ "kiro_migrate.compaction_not_ours": "{0} was compacted into {1}, which another instance claims or this one gave up",
360
379
  "kiro_migrate.prompt_fresh": "It has no classic conversation to carry: it starts an empty TUI conversation.",
361
380
  "kiro_migrate.prompt_one_way": "One-way: afterwards AgEnD refuses to launch it on classic again (that would resume the old copy and lose the work done since).",
362
381
  "kiro_migrate.prompt_restart": "It is running: it restarts now (about 1–3 minutes).",
363
382
  "kiro_migrate.prompt_next_start": "It is not running: the move takes effect at its next start.",
383
+ "office_packs.applied": "Office packs — {0}: {1}",
384
+ "office_packs.pending": "Office packs — {0} asks to {1}.\nApprove or reject it here or on the Office page (Fleet → Org chart → Office → Edit offices); it waits {2} h, then nothing changes.",
385
+ "office_packs.approve_button": "Approve",
386
+ "office_packs.reject_button": "Reject",
387
+ "office_packs.approved": "Office packs — approved by {0} for {1}: {2}",
388
+ "office_packs.rejected": "Office packs — rejected by {0}; nothing changed ({1}: {2}).",
389
+ "office_packs.failed": "Office packs — approved, but not applied ({0}: {1}): {2}",
390
+ "office_packs.expired": "Office packs — not approved in time; nothing changed: {0}",
391
+ "office_packs.gone": "This pack change is no longer pending.",
392
+ "office_packs.upload_item": "{0} “{1}” ({2} files, {3})",
393
+ "office_packs.replaces": "replacing version {0} (kept for a restore)",
394
+ "office_packs.drops": "and dropping {0} layout override(s) that no longer fit — {1}",
395
+ "office_packs.drops_more": "…and {0} more",
396
+ "office_packs.delete": "delete {0} (its previous version too)",
397
+ "office_packs.delete_keep": "delete {0} (its previous version kept)",
398
+ "office_packs.restore": "restored {0} to its previous version {1}",
399
+ "office_packs.restore_pending": "restore {0} to its previous version",
400
+ "office_packs.style": "draw office {0} in {1}",
401
+ "office_packs.upload": "upload {0}",
402
+ "office_packs.uploaded": "uploaded {0}",
403
+ "office_packs.deleted": "deleted {0} (its previous version too)",
404
+ "office_packs.deleted_keep": "deleted {0} (its previous version kept)",
405
+ "office_packs.styled": "now draws office {0} in {1}",
364
406
  "kiro_migrate.confirm_button": "Move it",
365
407
  "kiro_migrate.cancel_button": "Cancel",
366
408
  "kiro_migrate.expired": "The kiro move of {0} was not confirmed in time; nothing was changed.",
@@ -373,6 +415,17 @@ const enMessages = {
373
415
  "kiro_migrate.done_restart_failed": "⚠️ {0} is set to kiro's TUI engine, but its restart failed ({1}); the move happens at its next start.",
374
416
  "kiro_migrate.done_carry": "Its first TUI launch resumes its classic conversation {0} once and records it as its own; if that launch starts fresh instead, it says so in its topic.",
375
417
  "kiro_migrate.done_fresh": "It starts with an empty conversation.",
418
+ "kiro_reconcile.audit_failed": "Reconciliation audit log is unavailable; no changes were made.",
419
+ "kiro_reconcile.stopped_required": "Reconciliation requires a stopped TUI fleet instance with an explicit model and directory.",
420
+ "kiro_reconcile.changed": "Reconciliation evidence or instance ownership changed; request confirmation again.",
421
+ "kiro_reconcile.applying": "Reconciling the saved conversations of {0}…",
422
+ "kiro_reconcile.prompt": "Reconcile {0}?\nKeep original conversation: {1}\nArchive intact (never delete): {2}\nPreserve both V2 file sets, repair the original pin, archive its frozen classic duplicate, then verify two starts with the same model. A failure stops in place. A receipt allows rollback into a stopped hold.",
423
+ "kiro_reconcile.rollback_prompt": "Roll back reconciliation for {0}?\nKeep ID: {1}\nArchived ID: {2}\nRestore the prior AgEnD identity and exact frozen classic index rows into a stopped hold. All V2 files and archives stay intact. Nothing is started.",
424
+ "kiro_reconcile.done": "{0}: original conversation restored and plain restart verified. Archive/rollback receipt: {1}. Both V2 conversations are preserved.",
425
+ "kiro_reconcile.rolled_back": "{0}: prior identity restored; instance stays stopped. Archives retained. Receipt: {1}.",
426
+ "kiro_reconcile.verification_failed": "{0}: conversation selection and archival completed, but restart verification did not complete: {1}. Saved conversations and the receipt are retained. Inspect the instance before further action; do not repeat reconciliation. Receipt: {2}.",
427
+ "kiro_reconcile.failed_no_receipt": "{0}: reconciliation did not complete: {1}. No fresh or classic fallback. No receipt was returned; inspect the Log before retrying.",
428
+ "kiro_reconcile.failed": "{0}: reconciliation did not complete: {1}. No fresh or classic fallback. Inspect the receipt before retrying.",
376
429
  "kiro_migrate.requested": "Asked in General for a fleet admin's confirmation. Nothing changes until it is confirmed.",
377
430
  "kiro_migrate.no_general": "There is no General topic to ask a fleet admin in, so the move cannot be confirmed.",
378
431
  "kiro.engine_floor": "{0} has run on kiro's {2} engine, so AgEnD will not launch it on {1}: that would resume the old copy of its conversation from before the move and lose everything done since. Set kiro_ui back to {2}.",
@@ -387,8 +440,28 @@ const enMessages = {
387
440
  "kiro.switch_unrecorded": "kiro: the instance now runs as its own agent, but AgEnD could not record that; the next launch checks again and keeps the shared entries until it can.",
388
441
  "agy.instructions_link_dangling": "agy: {0} is a symlink to a file that does not exist. AgEnD left it as it is and did not write this instance's fleet instructions, so agy starts without them. Point the link at an existing file or remove it; the next launch writes them.",
389
442
  "kiro.switch_timeout": "kiro: the resumed conversation did not switch to this instance's agent within {0}s. It keeps running as before, with its shared entries kept; the next launch tries again.",
443
+ "kiro.session_id_mismatch": "kiro: /session-id on the pane is {1}, but this launch pinned {0}. AgEnD did not guess another conversation from files.",
444
+ "kiro.session_id_unread": "kiro: /session-id did not print an id on the pane after launch. AgEnD did not guess a conversation from files.",
390
445
  "kiro.version_untested": "kiro-cli {0} is newer than the newest version AgEnD has been run with ({1}). AgEnD read its launch flags from `kiro-cli chat --help`; if anything misbehaves, report the version.",
391
446
  "inst.cli_unsupported": "⛔ `{0}` was not started: {1}",
447
+ "kiro.carry_resume_failed": "The carried Kiro conversation could not be resumed safely. Its pin and history are kept; this instance is stopped.",
448
+ "kiro.archive_done": "The frozen classic conversation was archived and removed from Kiro's duplicate index: {0}",
449
+ "kiro.carry_pin_repaired": "The abandoned carried V2 pin was restored; empty replacement sessions were left untouched.",
450
+ "kiro.compaction_followed": "kiro: conversation {0} was compacted and went on as {1}; resuming {1}.",
451
+ "kiro.compaction_kept_unreadable": "kiro: resuming {0} as recorded: kiro's store could not be read to check whether it was compacted into a newer conversation.",
452
+ "kiro.compaction_kept_over_budget": "kiro: resuming {0} as recorded: kiro's store is too big to check within the time limit whether it was compacted into a newer conversation.",
453
+ "kiro.compaction_kept_ambiguous": "kiro: resuming {0}: conversation {1} was compacted into more than one conversation ({2}), so which one is this instance's cannot be told.",
454
+ "kiro.compaction_kept_not_ours": "kiro: resuming {0}: conversation {1} was compacted into {2}, but {2} is claimed by another instance or was given up.",
455
+ "kiro.claim_lost": "kiro: starting a new conversation, because the recorded conversation {0} is no longer this instance's ({1}). It stays in kiro's store.",
456
+ "kiro.claim_lost_missing": "its claim file is missing",
457
+ "kiro.claim_lost_incomplete": "its claim file is incomplete; a complete claim is the instance name followed by a newline",
458
+ "kiro.claim_lost_other_owner": "another instance claims it",
459
+ "kiro.claim_lost_abandoned": "it was given up",
460
+ "kiro.archive_failed": "The carried Kiro conversation is kept; its archive/repair could not be proven safe: {0}",
461
+ "kiro.archive_remedy": "Keep this instance stopped, resolve the store/ownership issue, then start it again. Do not start fresh or switch to classic.",
462
+ "inst.kiro_resume_ambiguous": "Kiro lists this instance's saved session twice (classic and V2). The session is kept and the instance is stopped.",
463
+ "inst.kiro_resume_ambiguous_remedy": "Resolve the duplicate store entry, then start this instance again.",
464
+ "fleet.resume_blocked": "⛔ Not started ({0}): {1}\n{2}",
392
465
  "fleet.cli_unsupported": "⛔ Not started ({0}): {1}\nThese instances will not be retried automatically; start them again once the CLI or the configuration is changed.",
393
466
  "fleet.kiro_incompat_general": "[system:kiro-incompat] The installed kiro-cli cannot run these kiro instances as configured, so AgEnD stopped them and will not retry: {0}.\nReason: {1}\nThe user has already been shown this in the fleet's General topic. Their conversations are intact — nothing was converted or deleted. Load the kiro-engine-migration skill and call kiro_engine_status to see each instance's engine, versions and what is blocking it, so you can explain it and the options when the user asks. Do not reply to this message, and do not start, restart or migrate any instance on your own.",
394
467
  "inst.mcp_never_connected_auto": "⚠️ `{0}`'s CLI is running, but AgEnD's MCP server never connected to it — the instance has no agend tools (it cannot reply or reach other instances). It will restart itself once idle to retry (the session is kept). If this repeats, check the CLI's MCP startup output in its pane.",
@@ -438,7 +511,6 @@ const enMessages = {
438
511
  "web.command_public_refused": "{0} is not available over the public link.",
439
512
  "web.command_unknown": "{0} is not a command the web chat runs. Send it as a message instead.",
440
513
  "web.command_no_choices": "{0} has nothing to choose from for this instance.",
441
- "inst.reply_drop_unrecovered": "⚠️ Still no confirmed reply after one retry. Ask it to continue if you saw nothing.",
442
514
  "interactive.kind.permission": "permission confirmation",
443
515
  "interactive.kind.dangerous_command": "dangerous command confirmation",
444
516
  "interactive.kind.login": "login",
@@ -466,6 +538,31 @@ const enMessages = {
466
538
  "interactive.expired": "⌛ Interactive prompt assistance for {0} expired.",
467
539
  "interactive.self_assist": "⚠️ {0} is General itself and cannot self-assist while blocked. Use tmux attach.",
468
540
  "interactive.delivery_failed": "❌ Could not deliver the assistance request for {0} to General.",
541
+ "card.question_intro": "❓ {0} is asking you:",
542
+ "card.question_hint": "Tap an answer below.",
543
+ "card.question_hint_text": "Tap an answer below, or reply to this message to answer in your own words.",
544
+ "card.recommended": "(recommended)",
545
+ "card.skip": "⏭ Skip",
546
+ "card.answer_in_words": "✍️ Answer in words",
547
+ "card.sub_intro": "❓ {0}: choose what to include",
548
+ "card.sub_all": "All: {0}",
549
+ "card.sub_all_short": "all of them",
550
+ "card.sub_only": "Only {0}",
551
+ "card.back": "↩ Back",
552
+ "card.input_intro": "🔐 An MCP server ({0}) is asking {1} for input:",
553
+ "card.input_hint": "Fill it in at the instance's terminal (Dashboard → View), or:",
554
+ "card.decline": "Decline",
555
+ "card.cancel": "Cancel",
556
+ "card.in_words": "an answer in words",
557
+ "card.answered": "✅ {0} answered: {1}",
558
+ "card.opened_sub": "↪ {0} chose {1} — its parts are asked next.",
559
+ "card.went_back": "↩ {0} went back to the options.",
560
+ "card.answered_in_pane": "This question was answered at the instance's terminal.",
561
+ "card.stale": "This question to {0} was already answered or has changed.",
562
+ "card.refused": "{0}'s question could not take that answer as it is now — it is asked again below.",
563
+ "card.stopped": "Could not confirm that answer on {0}'s screen, so nothing more was sent — check its terminal (Dashboard → View).",
564
+ "card.expired": "These buttons expired — {0} is still waiting: answer at its terminal (Dashboard → View).",
565
+ "card.someone_on_dashboard": "someone on the dashboard",
469
566
  "interactive.assist_request": "[system] Interactive input assistance was confirmed for {0} (prompt type: {1}). Inspect that instance's tmux pane, report what operation is waiting, and ask the user for explicit authorization before sending any input. Never ask for or accept a password in chat; passwords must be entered directly in tmux by the operator.",
470
567
  "exit.instance_notice": "🛑 {0} stopped normally (exit code 0). An administrator can restart it from General.",
471
568
  "exit.general_notice": "🛑 {0} stopped (normal exit). Restart it?",
@@ -1152,6 +1249,7 @@ const enMessages = {
1152
1249
  "delivery.fleet_uncertain_silent_schedule": "⚠️ A silent schedule's paste into {0} could not be confirmed ({3}). It is not re-sent and not listed in Needs you; the next run goes ahead as usual.\noperation_id={1}; target={0}; delivery_id={2}; state=uncertain",
1153
1250
  "delivery.fleet_failed_silent_schedule": "❌ A silent schedule's paste into {0} was not delivered ({3}). It is not listed in Needs you; the next run goes ahead as usual.\noperation_id={1}; target={0}; delivery_id={2}; state=failed",
1154
1251
  "delivery.expired": "{0} cross-instance message(s) reached the 24-hour waiting limit. Delivery is still unconfirmed for {1} of them; they may already have arrived, so do not resend those. Notices to the sending instances have been queued.",
1252
+ "delivery.cancelled_unsent": "⏹ Cancelled. {0} message(s) you sent to {1} before the cancel were not delivered (marked ❌). Send them again if you still need them.",
1155
1253
  "delivery.lane_waiting": "⚠️ The message to {0} is still waiting after {1} minutes. We are waiting for its current process to report the result or be replaced before sending another message.\ndelivery_id={2}",
1156
1254
  "delivery.restart_blocked": "{0} is still stopped because we could not confirm that its previous CLI window closed. Check that window before restarting so a message is not sent twice.",
1157
1255
  "delivery.error_expired": "The message reached its waiting time limit.",
@@ -1169,13 +1267,7 @@ const enMessages = {
1169
1267
  "delivery.status_cancelled": "The message was cancelled.",
1170
1268
  "delivery.outcome_uncertain": "[system:delivery-outcome] Delivery to {0} could not be confirmed. Do not resend until an operator checks what happened.\n{1}\noperation_id={2}; delivery_id={3}; target={0}; state=uncertain",
1171
1269
  "delivery.outcome_failed": "[system:delivery-outcome] The message to {0} was not delivered after retries or the waiting period ended. Report this to the operator.\n{1}\noperation_id={2}; delivery_id={3}; target={0}; state=failed",
1172
- "delivery.post_restart": "[system:delivery-outcome] Your message to {0} was accepted before the restart. Do not resend this operation. Ask the operator to check delivery_status for its current status.\n{1}\noperation_id={2}; target={0}; current_state={3}",
1173
1270
  "delivery.reply_turn_ended": "[system:reply-pending] Your turn ended without answering {0}. Send your conclusion with report_result now; terminal text does not reach them.\ncorrelation_id={1}; asked={2}",
1174
- "delivery.reply_restart": "[system:reply-pending] A restart left these requests unanswered. Use report_result with each request's correlation_id; terminal text does not reach the requester. Check delivery_status for omitted requests or shortened IDs; do not resend the original requests.",
1175
- "delivery.reply_restart_more": "+{0} more requests (delivery_status)",
1176
- "delivery.reply_expired": "[system:reply-overdue] The reply requested from {0} has expired without an answer recorded. It will not be reminded again. Check with describe_instance or delivery_status; ask again if it is still needed.\ncorrelation_id={1}; asked={2}",
1177
- "delivery.reply_overdue": "[system:reply-overdue] {0} has not replied and is not working on anything now. Check with describe_instance or delivery_status, or ask again.\ncorrelation_id={1}; asked={2}{3}",
1178
- "delivery.reply_reminded": "; reminded={0}",
1179
1271
  "delivery.wake_auth": "⏸️ {0} is paused because its login failed. {1} message(s) are waiting. Fix the login, then use /wake.",
1180
1272
  "delivery.wake_waiting": "⚠️ {0} has {1} message(s) waiting for {2} minutes.\nReason: {3}",
1181
1273
  "delivery.wake_failed": "⚠️ {0} could not be woken after {1} attempts. {2} message(s) are still waiting; we will try again.\nDetails: {3}",
@@ -1322,6 +1414,7 @@ const enMessages = {
1322
1414
  "cli.service_retry": "Check your service manager, then retry: {0}",
1323
1415
  "cli.service_direct_hint": "If the service cannot run on this host, start the fleet without it: agend fleet start --direct",
1324
1416
  "cli.service_redirect": "ℹ An AgEnD service is installed here ({0}): running `agend {1}` so the service manager owns the fleet.",
1417
+ "cli.service_redirect_notify": "⚠ This process looks like a systemd unit waiting for READY (NOTIFY_SOCKET is set), but it handed the fleet to the service above and exits without starting one. If this unit runs its own fleet, use `agend fleet start --direct` in its ExecStart.",
1325
1418
  "cli.instance_restarted": "Instance \"{0}\" restarted (immediate)",
1326
1419
  "cli.restart_failed": "Restart failed: {0}",
1327
1420
  "cli.fleet_unreachable": "Cannot connect to fleet (port {0}). Is the fleet running?",
@@ -1498,6 +1591,7 @@ const zhTWMessages = {
1498
1591
  "dashboard.start_web_ack": "✅ 你現在可以在群組裡使用 /web 了。",
1499
1592
  "web.public_login_notice": "🔐 有新的網頁登入 · 公開入口:{0}(session {1})。如果不是你,請用 /web revoke。",
1500
1593
  "office_share.all": "所有辦公室",
1594
+ "office_share.whole": "整個 fleet",
1501
1595
  "office_share.created_notice": "🏢 {0} 分享了辦公室({1}),時間 {2}:拿到連結的人都能唯讀觀看。可在 設定 → 存取與安全 撤銷。",
1502
1596
  "office_share.revoked_notice": "🏢 {0} 撤銷了辦公室分享連結({1})。",
1503
1597
  "office_share.revoked_all_notice": "🏢 {0} 撤銷了 {1} 個辦公室分享連結。",
@@ -1551,6 +1645,7 @@ const zhTWMessages = {
1551
1645
  "needs.reason.hang": "沒有回應",
1552
1646
  "needs.reason.exited": "已結束",
1553
1647
  "needs.reason.assist": "在終端機上等待",
1648
+ "needs.reason.question": "正在問你問題",
1554
1649
  "needs.reason.permission": "需要權限",
1555
1650
  "needs.reason.dangerous_command": "危險指令待確認",
1556
1651
  "needs.reason.login": "需要登入",
@@ -1613,7 +1708,6 @@ const zhTWMessages = {
1613
1708
  "board_summary.project_waiting": "等你確認 {0}",
1614
1709
  "board_summary.project_blocked": "卡住 {0}",
1615
1710
  "board_summary.footer": "看板:網頁的 Fleet › Tasks。",
1616
- "upgrade.web_chat": "🆕 AgEnD 2.2:新增網頁聊天,這裡也照常使用。\n管理員:在 General 傳 /web,再按登入按鈕取碼。",
1617
1711
  "dashboard.remote_hint": "📱 這些連結只能在 Fleet 所在的那台電腦上開。要用手機或其他電腦開網頁聊天:{0}",
1618
1712
  "fleet.starting_retry": "Fleet 還在啟動,請等啟動完成後再試。",
1619
1713
  "fleet.ready": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2}",
@@ -1675,12 +1769,53 @@ const zhTWMessages = {
1675
1769
  "kiro_migrate.refused_unreadable": "AgEnD 讀不到 '{0}' 的 kiro 對話紀錄,無法判斷要帶哪個對話過去。什麼都沒改。",
1676
1770
  "kiro_migrate.refused_name": "'{0}' 無法登記為 kiro 對話的擁有者。",
1677
1771
  "kiro_migrate.no_classic": "'{0}' 沒有可帶過去的經典對話紀錄(它是全新開始,或沒有自己的紀錄)。搬過去會是空的 TUI 對話;若確實要這樣,請加上 start_fresh: true 再要求一次。",
1772
+ "kiro_migrate.prompt_verify": "帶入後會備份並移出凍結的 classic 副本,再做一次一般重啟,驗證同一對話、模型、逐字紀錄來源與鑑識讀取器;失敗就停止。",
1773
+ "kiro_migrate.prompt_sudo": "若此 instance 使用 sudo 或互動式密碼,TUI 的處理可能不同;請確認你接受這項差異再搬移。",
1774
+ "kiro_migrate.prompt_start_verify": "它目前已停止;確認後會啟動它,帶入並驗證對話。",
1775
+ "kiro_migrate.verified": "✅ {0}:TUI 搬移已通過一般重啟驗證。對話 {1};模型 {2};已接上 V2 逐字紀錄;鑑識結果:{3}。",
1776
+ "kiro_migrate.failed": "⛔ {0}:TUI 搬移未完成({1})。對話已保留。請先查明原因再明確重試,不要切回 classic。",
1777
+ "kiro_migrate.stop_unconfirmed": "無法確認 instance 已停止,請管理員檢查。",
1778
+ "kiro_migrate.in_progress": "此 instance 已有搬移或啟停作業正在執行。",
1779
+ "kiro_migrate.superseded": "搬移期間 instance 已被停止、取代或變更設定。",
1780
+ "kiro_migrate.version_required": "完整搬移驗證需要支援 TUI v2 與獨立 agent 的 kiro-cli 2.34 以上版本。",
1781
+ "kiro_migrate.idle_required": "請等 instance 閒置且沒有互動提示後再重試。",
1782
+ "kiro_migrate.model_unknown": "無法確認目前的模型;搬移尚未開始。",
1783
+ "kiro_migrate.verification_failed": "60 秒內無法驗證同一個閒置 V2 對話、模型與逐字紀錄來源。",
1678
1784
  "kiro_migrate.prompt_title": "🔀 要把 {0} 從 kiro 經典引擎搬到 TUI 引擎嗎?",
1679
1785
  "kiro_migrate.prompt_carry": "它的經典對話 {0} 會在 TUI 下接續一次:kiro 會把整段歷史複製過去,經典那份從此不再更新。",
1786
+ "kiro_migrate.prompt_compacted": "它的經典對話 {0} 在上次重啟後被壓縮過,並在 {1} 繼續;這次搬移會帶走 {1}。",
1787
+ "kiro_migrate.refused_compaction": "{0} 沒有搬移:它的經典對話 {1} 可能在 /compact 後換成別的對話繼續,但無法證明是哪一個({2})。直接帶走 {1} 可能會丟下較新的內容;什麼都沒改。",
1788
+ "kiro_migrate.compaction_unreadable": "讀不到 kiro 的儲存區",
1789
+ "kiro_migrate.compaction_over_budget": "kiro 的儲存區太大,無法在時限內確認它是否已被壓縮",
1790
+ "kiro_migrate.compaction_ambiguous": "{0} 被壓縮成不只一個對話:{1}",
1791
+ "kiro_migrate.compaction_not_ours": "{0} 被壓縮成 {1},但 {1} 已被其他 instance 認領,或被這個 instance 放棄",
1680
1792
  "kiro_migrate.prompt_fresh": "它沒有可帶的經典對話:會從空的 TUI 對話開始。",
1681
1793
  "kiro_migrate.prompt_one_way": "單向:之後 AgEnD 不會再用經典引擎啟動它(那會接回舊副本,失去之後做的事)。",
1682
1794
  "kiro_migrate.prompt_restart": "它正在執行:會立刻重啟(約 1–3 分鐘)。",
1683
1795
  "kiro_migrate.prompt_next_start": "它沒在執行:下次啟動時生效。",
1796
+ "office_packs.applied": "辦公室外觀包 — {0}:{1}",
1797
+ "office_packs.pending": "辦公室外觀包 — {0} 要求:{1}。\n請在這裡或辦公室頁面(Fleet → 組織圖 → 辦公室 → 編輯辦公室)核准或拒絕;等 {2} 小時,逾時就什麼都不改。",
1798
+ "office_packs.approve_button": "核准",
1799
+ "office_packs.reject_button": "拒絕",
1800
+ "office_packs.approved": "辦公室外觀包 — {0} 已核准 {1} 的變更:{2}",
1801
+ "office_packs.rejected": "辦公室外觀包 — {0} 已拒絕;什麼都沒改({1}:{2})。",
1802
+ "office_packs.failed": "辦公室外觀包 — 已核准,但沒有套用({0}:{1}):{2}",
1803
+ "office_packs.expired": "辦公室外觀包 — 沒有及時核准;什麼都沒改:{0}",
1804
+ "office_packs.gone": "這項外觀包變更已不在等待中。",
1805
+ "office_packs.upload_item": "{0}「{1}」({2} 個檔案,{3})",
1806
+ "office_packs.replaces": "取代版本 {0}(保留以便還原)",
1807
+ "office_packs.drops": "並移除 {0} 項已不合用的版面調整——{1}",
1808
+ "office_packs.drops_more": "…另有 {0} 項",
1809
+ "office_packs.delete": "刪除 {0}(連同上一版)",
1810
+ "office_packs.delete_keep": "刪除 {0}(保留上一版)",
1811
+ "office_packs.restore": "已把 {0} 還原到上一版 {1}",
1812
+ "office_packs.restore_pending": "把 {0} 還原到上一版",
1813
+ "office_packs.style": "把辦公室 {0} 改用 {1}",
1814
+ "office_packs.upload": "上傳 {0}",
1815
+ "office_packs.uploaded": "上傳了 {0}",
1816
+ "office_packs.deleted": "刪除了 {0}(連同上一版)",
1817
+ "office_packs.deleted_keep": "刪除了 {0}(保留上一版)",
1818
+ "office_packs.styled": "辦公室 {0} 改用 {1} 了",
1684
1819
  "kiro_migrate.confirm_button": "搬過去",
1685
1820
  "kiro_migrate.cancel_button": "取消",
1686
1821
  "kiro_migrate.expired": "{0} 的 kiro 搬移沒有及時確認;什麼都沒改。",
@@ -1693,6 +1828,17 @@ const zhTWMessages = {
1693
1828
  "kiro_migrate.done_restart_failed": "⚠️ {0} 已設為 kiro 的 TUI 引擎,但重啟失敗({1});下次啟動時搬移。",
1694
1829
  "kiro_migrate.done_carry": "它第一次以 TUI 啟動時會接續經典對話 {0} 一次,並登記為它自己的對話;若那次啟動改開新對話,會在它的 topic 說明。",
1695
1830
  "kiro_migrate.done_fresh": "它會從空的對話開始。",
1831
+ "kiro_reconcile.audit_failed": "對話處理的稽核紀錄目前無法寫入,沒有進行任何變更。",
1832
+ "kiro_reconcile.stopped_required": "接續處理需要已停止的 TUI fleet agent,並明確設定模型與目錄。",
1833
+ "kiro_reconcile.changed": "接續處理的證據或 agent 擁有權已改變,請重新要求確認。",
1834
+ "kiro_reconcile.applying": "正在處理 {0} 的已儲存對話…",
1835
+ "kiro_reconcile.prompt": "要處理 {0} 的對話嗎?\n保留原對話:{1}\n完整封存(絕不刪除):{2}\n會保留兩份 V2 檔案、修復原對話登記、備份並移出凍結的經典副本,再以相同模型驗證兩次啟動。失敗就停止;可用收據復原到停止等待的狀態。",
1836
+ "kiro_reconcile.rollback_prompt": "要復原 {0} 的對話處理嗎?\n保留的對話 ID:{1}\n封存的對話 ID:{2}\n會復原先前的 AgEnD 登記與凍結的經典索引原始資料,並維持停止;所有 V2 檔與封存都保留,不啟動任何 agent。",
1837
+ "kiro_reconcile.done": "{0}:已接回原對話,並驗證一般重啟。封存/復原收據:{1}。兩份 V2 對話都已保留。",
1838
+ "kiro_reconcile.rolled_back": "{0}:已復原先前登記並維持停止,封存仍保留。收據:{1}。",
1839
+ "kiro_reconcile.verification_failed": "{0}:對話選擇與封存已完成,但重新啟動驗證未完成:{1}。對話檔與收據均保留,請先檢查 agent 狀態,勿重做對話處理。收據:{2}。",
1840
+ "kiro_reconcile.failed_no_receipt": "{0}:對話處理未完成:{1}。沒有改開新對話或切回經典模式;未取得收據,重試前請先查看紀錄。",
1841
+ "kiro_reconcile.failed": "{0}:對話處理未完成:{1}。沒有改開新對話或切回經典模式;重試前請先檢查收據。",
1696
1842
  "kiro_migrate.requested": "已在 General 請 fleet admin 確認。確認前不會有任何變更。",
1697
1843
  "kiro_migrate.no_general": "沒有 General topic 可以請 fleet admin 確認,所以無法搬移。",
1698
1844
  "kiro.engine_floor": "{0} 已經在 kiro 的 {2} 引擎上執行過,所以 AgEnD 不會用 {1} 啟動它:那會接回搬移前的舊對話副本,之後做的事全部遺失。請把 kiro_ui 改回 {2}。",
@@ -1707,8 +1853,28 @@ const zhTWMessages = {
1707
1853
  "kiro.switch_unrecorded": "kiro:instance 已經切換成自己的 agent,但 AgEnD 無法記錄這件事;下次啟動會再檢查,在記錄成功前保留共用設定。",
1708
1854
  "agy.instructions_link_dangling": "agy:{0} 是指向不存在檔案的符號連結。AgEnD 保留原狀,沒有寫入這個 instance 的艦隊指示,所以 agy 這次啟動時沒有這些指示。請讓連結指向存在的檔案或移除它,下次啟動就會寫入。",
1709
1855
  "kiro.switch_timeout": "kiro:恢復的對話沒有在 {0} 秒內切換成這個 instance 的 agent。它會照舊繼續執行並保留共用設定;下次啟動會再試。",
1856
+ "kiro.session_id_mismatch": "kiro:pane 上 /session-id 是 {1},但這次啟動釘的是 {0}。AgEnD 沒有從檔案猜測另一個對話。",
1857
+ "kiro.session_id_unread": "kiro:啟動後 pane 沒有印出 /session-id。AgEnD 沒有從檔案猜測對話。",
1710
1858
  "kiro.version_untested": "kiro-cli {0} 比 AgEnD 實際跑過的最新版本({1})還新。啟動參數是依照 `kiro-cli chat --help` 判斷的;若有異常,請回報這個版本。",
1711
1859
  "inst.cli_unsupported": "⛔ `{0}` 沒有啟動:{1}",
1860
+ "kiro.carry_resume_failed": "無法安全接續帶入的 Kiro 對話;固定 id 與歷史都已保留,此 instance 已停止。",
1861
+ "kiro.archive_done": "已將凍結的 classic 對話備份並移出 Kiro 的重複索引:{0}",
1862
+ "kiro.carry_pin_repaired": "已恢復原本帶入的 V2 對話固定 id;空白的替代 session 都保留未動。",
1863
+ "kiro.compaction_followed": "kiro:對話 {0} 已被壓縮,並在 {1} 繼續;改為恢復 {1}。",
1864
+ "kiro.compaction_kept_unreadable": "kiro:照紀錄恢復 {0}:無法讀取 kiro 的儲存區,無法確認它是否已被壓縮成較新的對話。",
1865
+ "kiro.compaction_kept_over_budget": "kiro:照紀錄恢復 {0}:kiro 的儲存區太大,無法在時限內確認它是否已被壓縮成較新的對話。",
1866
+ "kiro.compaction_kept_ambiguous": "kiro:恢復 {0}:對話 {1} 被壓縮成不只一個對話({2}),無法判斷哪一個屬於這個 instance。",
1867
+ "kiro.compaction_kept_not_ours": "kiro:恢復 {0}:對話 {1} 已被壓縮成 {2},但 {2} 已被其他 instance 認領或已被放棄。",
1868
+ "kiro.claim_lost": "kiro:開新對話,因為紀錄中的對話 {0} 已不屬於這個 instance({1})。該對話仍保留在 kiro 的儲存區。",
1869
+ "kiro.claim_lost_missing": "認領檔不見了",
1870
+ "kiro.claim_lost_incomplete": "認領檔不完整;完整的認領檔是 instance 名稱加上一個換行",
1871
+ "kiro.claim_lost_other_owner": "已被其他 instance 認領",
1872
+ "kiro.claim_lost_abandoned": "已被放棄",
1873
+ "kiro.archive_failed": "已保留帶入的 Kiro 對話,但無法證明備份/修復可以安全進行:{0}",
1874
+ "kiro.archive_remedy": "請維持此 instance 停止,處理 store/所有權問題後再啟動;不要改開新對話或切回 classic。",
1875
+ "inst.kiro_resume_ambiguous": "Kiro 在 classic 與 V2 各列出一次這個 instance 的已存對話。對話已保留,instance 已停止。",
1876
+ "inst.kiro_resume_ambiguous_remedy": "請先處理 store 中的重複紀錄,再啟動這個 instance。",
1877
+ "fleet.resume_blocked": "⛔ 沒有啟動({0}):{1}\n{2}",
1712
1878
  "fleet.cli_unsupported": "⛔ 沒有啟動({0}):{1}\n這些 instance 不會自動重試;換了 CLI 或修改設定之後再啟動即可。",
1713
1879
  "fleet.kiro_incompat_general": "[system:kiro-incompat] 已安裝的 kiro-cli 無法照設定執行這些 kiro instance,所以 AgEnD 已停下它們,不會自動重試:{0}。\n原因:{1}\n使用者已經在 fleet 的 General topic 看到這則通知。它們的對話都還在 —— 沒有任何東西被轉換或刪除。請載入 kiro-engine-migration skill,並呼叫 kiro_engine_status 看每個 instance 的 engine、版本以及卡住的原因,以便在使用者詢問時說明狀況與可行選項。不要回覆這則訊息,也不要自行啟動、重啟或遷移任何 instance。",
1714
1880
  "inst.mcp_never_connected_auto": "⚠️ `{0}` 的 CLI 在執行,但 AgEnD 的 MCP server 一直沒有連上 —— 這個 instance 目前沒有 agend 工具(無法 reply / 跨 instance 通訊)。等它閒置後會自動重啟再試一次(session 會保留)。若重複發生,請看它 pane 裡 CLI 的 MCP 啟動訊息。",
@@ -1758,7 +1924,6 @@ const zhTWMessages = {
1758
1924
  "web.command_public_refused": "公開連結無法使用 {0}。",
1759
1925
  "web.command_unknown": "{0} 不是 web chat 可執行的指令,請改成一般訊息送出。",
1760
1926
  "web.command_no_choices": "這個 instance 的 {0} 沒有可選的項目。",
1761
- "inst.reply_drop_unrecovered": "⚠️ 補送後仍沒確認到回覆,沒收到請叫它繼續。",
1762
1927
  "interactive.kind.permission": "權限確認",
1763
1928
  "interactive.kind.dangerous_command": "危險命令確認",
1764
1929
  "interactive.kind.login": "登入",
@@ -1786,6 +1951,31 @@ const zhTWMessages = {
1786
1951
  "interactive.expired": "⌛ {0} 的人工輸入協助請求已逾時。",
1787
1952
  "interactive.self_assist": "⚠️ {0} 就是 General;阻塞時無法自助。請直接使用 tmux attach。",
1788
1953
  "interactive.delivery_failed": "❌ 無法把 {0} 的協助請求送進 General。",
1954
+ "card.question_intro": "❓ {0} 在問你:",
1955
+ "card.question_hint": "請點下方的答案。",
1956
+ "card.question_hint_text": "請點下方的答案,或回覆這則訊息用自己的話回答。",
1957
+ "card.recommended": "(建議)",
1958
+ "card.skip": "⏭ 略過",
1959
+ "card.answer_in_words": "✍️ 用文字回答",
1960
+ "card.sub_intro": "❓ {0}:選擇要包含哪些",
1961
+ "card.sub_all": "全部:{0}",
1962
+ "card.sub_all_short": "全部",
1963
+ "card.sub_only": "只要 {0}",
1964
+ "card.back": "↩ 返回",
1965
+ "card.input_intro": "🔐 MCP server({0})要求 {1} 提供輸入:",
1966
+ "card.input_hint": "請在該 instance 的終端機填寫(儀表板 → View),或:",
1967
+ "card.decline": "拒絕",
1968
+ "card.cancel": "取消",
1969
+ "card.in_words": "文字回答",
1970
+ "card.answered": "✅ {0} 回答了:{1}",
1971
+ "card.opened_sub": "↪ {0} 選了 {1},接著會問要包含哪些。",
1972
+ "card.went_back": "↩ {0} 回到選項。",
1973
+ "card.answered_in_pane": "這個問題已在該 instance 的終端機上回答。",
1974
+ "card.stale": "{0} 的這個問題已經回答或已改變。",
1975
+ "card.refused": "{0} 的問題目前無法接受這個答案,下方會重新詢問。",
1976
+ "card.stopped": "無法在 {0} 的畫面上確認這個答案,因此沒有再送出任何按鍵;請查看它的終端機(儀表板 → View)。",
1977
+ "card.expired": "這些按鈕已過期,{0} 仍在等待:請在它的終端機回答(儀表板 → View)。",
1978
+ "card.someone_on_dashboard": "儀表板上的使用者",
1789
1979
  "interactive.assist_request": "[system] 已確認協助 {0} 的人工輸入(提示類型:{1})。請查看該 instance 的 tmux pane,向使用者回報正在等待的操作,並在輸入任何內容前取得明確授權。絕不可要求或接受使用者在聊天中傳送密碼;密碼只能由操作員直接在 tmux 輸入。",
1790
1980
  "exit.instance_notice": "🛑 {0} 已停止(正常退出,exit code 0)。管理員可至 General 重新啟動。",
1791
1981
  "exit.general_notice": "🛑 {0} 已停止(正常退出)。要重新啟動嗎?",
@@ -2472,6 +2662,7 @@ const zhTWMessages = {
2472
2662
  "delivery.fleet_uncertain_silent_schedule": "⚠️ 無法確認靜默排程貼到 {0} 的內容是否已送達({3})。不會重送,也不會列入「需要你」;下一次排程照常執行。\noperation_id={1}; target={0}; delivery_id={2}; state=uncertain",
2473
2663
  "delivery.fleet_failed_silent_schedule": "❌ 靜默排程貼到 {0} 的內容未送達({3})。不會列入「需要你」;下一次排程照常執行。\noperation_id={1}; target={0}; delivery_id={2}; state=failed",
2474
2664
  "delivery.expired": "有 {0} 筆跨 instance 訊息已等滿 24 小時。其中 {1} 筆仍無法確認是否送達,可能已送達,請不要重送;通知已排入佇列,等待送給寄件的 instance。",
2665
+ "delivery.cancelled_unsent": "⏹ 已取消。你在取消前傳給 {1} 的 {0} 則訊息沒有送出(已標 ❌),還需要的話請再傳一次。",
2475
2666
  "delivery.lane_waiting": "⚠️ 送往 {0} 的訊息已等了 {1} 分鐘。下一筆會等目前的程序回報結果或被替換後再送。\ndelivery_id={2}",
2476
2667
  "delivery.restart_blocked": "{0} 暫時保持停止,因為無法確認先前的 CLI 視窗已關閉。請先檢查該視窗再重啟,以免訊息重複送出。",
2477
2668
  "delivery.error_expired": "這筆訊息已達等待期限。",
@@ -2489,13 +2680,7 @@ const zhTWMessages = {
2489
2680
  "delivery.status_cancelled": "訊息已取消。",
2490
2681
  "delivery.outcome_uncertain": "[system:delivery-outcome] 無法確認送往 {0} 的訊息是否已送達。請先讓操作者查明結果,不要重送。\n{1}\noperation_id={2}; delivery_id={3}; target={0}; state=uncertain",
2491
2682
  "delivery.outcome_failed": "[system:delivery-outcome] 送往 {0} 的訊息在重試後或等待期限結束時仍未送達。請向操作者回報。\n{1}\noperation_id={2}; delivery_id={3}; target={0}; state=failed",
2492
- "delivery.post_restart": "[system:delivery-outcome] 重啟前已收下你送往 {0} 的訊息。請不要重送,請操作者用 delivery_status 查看目前結果。\n{1}\noperation_id={2}; target={0}; current_state={3}",
2493
2683
  "delivery.reply_turn_ended": "[system:reply-pending] 這一輪已結束,但你還沒回覆 {0}。請現在用 report_result 回報結論;終端裡的文字不會送到對方。\ncorrelation_id={1}; asked={2}",
2494
- "delivery.reply_restart": "[system:reply-pending] 重啟時,以下請求尚未收到回覆。請用 report_result 搭配各請求的 correlation_id 回報;終端裡的文字不會送到寄件者。省略的請求或縮短的識別碼請查 delivery_status;不要重送原始請求。",
2495
- "delivery.reply_restart_more": "+{0} 個其他請求(delivery_status)",
2496
- "delivery.reply_expired": "[system:reply-overdue] 向 {0} 要求的回覆已逾期,仍未記錄到回答,之後不再提醒。請用 describe_instance 或 delivery_status 查看;如仍需要,請重新詢問。\ncorrelation_id={1}; asked={2}",
2497
- "delivery.reply_overdue": "[system:reply-overdue] {0} 還沒回覆,目前也沒有在進行工作。請用 describe_instance 或 delivery_status 查看,或再詢問一次。\ncorrelation_id={1}; asked={2}{3}",
2498
- "delivery.reply_reminded": ";上次提醒={0}",
2499
2684
  "delivery.wake_auth": "⏸️ {0} 因登入失敗而暫停,有 {1} 筆訊息在等待。請先修好登入,再用 /wake 喚醒。",
2500
2685
  "delivery.wake_waiting": "⚠️ {0} 有 {1} 筆訊息已等了 {2} 分鐘。\n原因:{3}",
2501
2686
  "delivery.wake_failed": "⚠️ 嘗試 {1} 次後仍無法喚醒 {0}。有 {2} 筆訊息在等待,系統會再試。\n詳細原因:{3}",
@@ -2640,6 +2825,7 @@ const zhTWMessages = {
2640
2825
  "cli.service_retry": "請檢查服務管理員後再試:{0}",
2641
2826
  "cli.service_direct_hint": "如果這台主機無法執行服務,可以不透過服務啟動 fleet:agend fleet start --direct",
2642
2827
  "cli.service_redirect": "ℹ 這台主機已安裝 AgEnD 服務({0}):改為執行 `agend {1}`,讓服務管理員管理 fleet。",
2828
+ "cli.service_redirect_notify": "⚠ 這個程序看起來是等待 READY 的 systemd unit(已設定 NOTIFY_SOCKET),但它把 fleet 交給上面的服務,自己沒有啟動 fleet 就結束了。如果這個 unit 執行的是它自己的 fleet,請在它的 ExecStart 使用 `agend fleet start --direct`。",
2643
2829
  "cli.instance_restarted": "Instance「{0}」已重新啟動(立即)",
2644
2830
  "cli.restart_failed": "重新啟動失敗:{0}",
2645
2831
  "cli.fleet_unreachable": "無法連線到 fleet(port {0})。fleet 有在執行嗎?",