@songsid/agend 2.3.2-beta.10 → 2.3.2-beta.12

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 (132) hide show
  1. package/README.md +4 -0
  2. package/README.zh-TW.md +4 -0
  3. package/dist/agent-cli.js +48 -0
  4. package/dist/agent-cli.js.map +1 -1
  5. package/dist/agent-endpoint.js +6 -0
  6. package/dist/agent-endpoint.js.map +1 -1
  7. package/dist/agent-whats-new.js +3 -0
  8. package/dist/agent-whats-new.js.map +1 -1
  9. package/dist/backend/kiro-classic-archive.d.ts +52 -0
  10. package/dist/backend/kiro-classic-archive.js +444 -0
  11. package/dist/backend/kiro-classic-archive.js.map +1 -0
  12. package/dist/backend/kiro-identity.d.ts +19 -0
  13. package/dist/backend/kiro-identity.js +43 -0
  14. package/dist/backend/kiro-identity.js.map +1 -1
  15. package/dist/backend/kiro-migration-verify.d.ts +10 -0
  16. package/dist/backend/kiro-migration-verify.js +52 -0
  17. package/dist/backend/kiro-migration-verify.js.map +1 -0
  18. package/dist/backend/kiro-v2-store-worker.js +21 -1
  19. package/dist/backend/kiro-v2-store-worker.js.map +1 -1
  20. package/dist/backend/kiro-v2-store.d.ts +8 -0
  21. package/dist/backend/kiro-v2-store.js.map +1 -1
  22. package/dist/backend/kiro.d.ts +99 -1
  23. package/dist/backend/kiro.js +352 -18
  24. package/dist/backend/kiro.js.map +1 -1
  25. package/dist/backend/types.d.ts +49 -0
  26. package/dist/backend/types.js +9 -0
  27. package/dist/backend/types.js.map +1 -1
  28. package/dist/channel/ipc-timeouts.js +3 -0
  29. package/dist/channel/ipc-timeouts.js.map +1 -1
  30. package/dist/channel/mcp-tools.js +12 -0
  31. package/dist/channel/mcp-tools.js.map +1 -1
  32. package/dist/cli.js +33 -0
  33. package/dist/cli.js.map +1 -1
  34. package/dist/config-validator.js +2 -0
  35. package/dist/config-validator.js.map +1 -1
  36. package/dist/config.js +2 -0
  37. package/dist/config.js.map +1 -1
  38. package/dist/daemon.d.ts +45 -0
  39. package/dist/daemon.js +342 -19
  40. package/dist/daemon.js.map +1 -1
  41. package/dist/dashboard-permissions.d.ts +15 -4
  42. package/dist/dashboard-permissions.js +49 -23
  43. package/dist/dashboard-permissions.js.map +1 -1
  44. package/dist/fleet-control-audit.d.ts +1 -1
  45. package/dist/fleet-control-audit.js +3 -0
  46. package/dist/fleet-control-audit.js.map +1 -1
  47. package/dist/fleet-manager.d.ts +61 -2
  48. package/dist/fleet-manager.js +421 -28
  49. package/dist/fleet-manager.js.map +1 -1
  50. package/dist/general-knowledge/skills/docker-install/SKILL.md +25 -0
  51. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +10 -0
  52. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +28 -0
  53. package/dist/general-knowledge/skills/web-appearance/SKILL.md +28 -0
  54. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +20 -2
  55. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +20 -2
  56. package/dist/instance-config-impact.js +2 -2
  57. package/dist/instance-config-impact.js.map +1 -1
  58. package/dist/instance-lifecycle.d.ts +4 -0
  59. package/dist/instance-lifecycle.js +7 -0
  60. package/dist/instance-lifecycle.js.map +1 -1
  61. package/dist/kiro-migrate.d.ts +11 -0
  62. package/dist/kiro-migrate.js +86 -31
  63. package/dist/kiro-migrate.js.map +1 -1
  64. package/dist/kiro-session-proof.d.ts +41 -0
  65. package/dist/kiro-session-proof.js +89 -0
  66. package/dist/kiro-session-proof.js.map +1 -0
  67. package/dist/kiro-tui-forensic.d.ts +5 -0
  68. package/dist/kiro-tui-forensic.js +3 -3
  69. package/dist/kiro-tui-forensic.js.map +1 -1
  70. package/dist/locale.js +142 -0
  71. package/dist/locale.js.map +1 -1
  72. package/dist/log-service.js +1 -1
  73. package/dist/log-service.js.map +1 -1
  74. package/dist/needs-you.d.ts +3 -1
  75. package/dist/needs-you.js +4 -2
  76. package/dist/needs-you.js.map +1 -1
  77. package/dist/office-share.d.ts +12 -2
  78. package/dist/office-share.js +27 -2
  79. package/dist/office-share.js.map +1 -1
  80. package/dist/outbound-schemas.d.ts +39 -0
  81. package/dist/outbound-schemas.js +29 -0
  82. package/dist/outbound-schemas.js.map +1 -1
  83. package/dist/remote-card-prompt.d.ts +38 -0
  84. package/dist/remote-card-prompt.js +86 -0
  85. package/dist/remote-card-prompt.js.map +1 -0
  86. package/dist/settings-change.js +8 -5
  87. package/dist/settings-change.js.map +1 -1
  88. package/dist/settings-instance-patch.js +1 -1
  89. package/dist/settings-instance-patch.js.map +1 -1
  90. package/dist/tool-permissions.js +17 -0
  91. package/dist/tool-permissions.js.map +1 -1
  92. package/dist/transcript-sources.d.ts +1 -0
  93. package/dist/transcript-sources.js +2 -1
  94. package/dist/transcript-sources.js.map +1 -1
  95. package/dist/types.d.ts +5 -0
  96. package/dist/ui/chat-store.js +3 -2
  97. package/dist/ui/chat-strings.js +2 -2
  98. package/dist/ui/fleet-office-editor.js +54 -2
  99. package/dist/ui/fleet-office-layout.js +44 -7
  100. package/dist/ui/fleet-office-pack.d.ts +9 -3
  101. package/dist/ui/fleet-office-pack.js +117 -19
  102. package/dist/ui/fleet-office-store.js +43 -0
  103. package/dist/ui/fleet-office-zones.js +92 -17
  104. package/dist/ui/fleet-office.js +102 -16
  105. package/dist/ui/panel-chat.js +14 -2
  106. package/dist/ui/panel-log.js +2 -2
  107. package/dist/ui/panel-needs.js +1 -1
  108. package/dist/ui/panel-settings.js +5 -5
  109. package/dist/ui/settings-model.js +17 -9
  110. package/dist/ui/settings-strings.js +2 -0
  111. package/dist/ui/shared/app-i18n.js +2 -2
  112. package/dist/ui/shared/app-stream.js +1 -1
  113. package/dist/ui/shared/app.css +18 -2
  114. package/dist/web-api.d.ts +5 -1
  115. package/dist/web-api.js +91 -3
  116. package/dist/web-api.js.map +1 -1
  117. package/dist/web-office-acts.js +2 -2
  118. package/dist/web-office-acts.js.map +1 -1
  119. package/dist/web-office-pack-read.d.ts +35 -0
  120. package/dist/web-office-pack-read.js +252 -0
  121. package/dist/web-office-pack-read.js.map +1 -0
  122. package/dist/web-office-pack-tools.d.ts +232 -0
  123. package/dist/web-office-pack-tools.js +754 -0
  124. package/dist/web-office-pack-tools.js.map +1 -0
  125. package/dist/web-office-skins.d.ts +68 -4
  126. package/dist/web-office-skins.js +318 -33
  127. package/dist/web-office-skins.js.map +1 -1
  128. package/dist/web-office-store.d.ts +21 -2
  129. package/dist/web-office-store.js +78 -18
  130. package/dist/web-office-store.js.map +1 -1
  131. package/package.json +1 -1
  132. package/templates/windows-shortcuts.ps1 +16 -15
@@ -41,7 +41,9 @@ export function kiroMigrationPrompt(plan, running) {
41
41
  t("kiro_migrate.prompt_title", plan.name),
42
42
  plan.classicId ? t("kiro_migrate.prompt_carry", plan.classicId) : t("kiro_migrate.prompt_fresh"),
43
43
  t("kiro_migrate.prompt_one_way"),
44
- running ? t("kiro_migrate.prompt_restart") : t("kiro_migrate.prompt_next_start"),
44
+ t("kiro_migrate.prompt_verify"),
45
+ t("kiro_migrate.prompt_sudo"),
46
+ running ? t("kiro_migrate.prompt_restart") : t("kiro_migrate.prompt_start_verify"),
45
47
  ].join("\n");
46
48
  }
47
49
  /**
@@ -59,47 +61,100 @@ export async function applyKiroMigration(deps, plan) {
59
61
  if (found.workingDirectory !== plan.workingDirectory || found.credentialProfile !== plan.credentialProfile || again.classicId !== plan.classicId) {
60
62
  return { ok: false, text: t("kiro_migrate.changed", plan.name) };
61
63
  }
62
- const { inst } = found;
63
- const before = inst.kiro_ui;
64
- const restoreConfig = () => { if (before === undefined)
65
- delete inst.kiro_ui;
66
- else
67
- inst.kiro_ui = before; };
68
- inst.kiro_ui = "tui";
64
+ let lease;
69
65
  try {
70
- deps.saveFleetConfig();
66
+ lease = deps.reserve(plan.name);
71
67
  }
72
68
  catch (err) {
73
- restoreConfig();
74
- return { ok: false, text: t("kiro_migrate.save_failed", plan.name, err.message) };
69
+ return { ok: false, text: t("kiro_migrate.failed", plan.name, err.message) };
75
70
  }
76
- const opts = { agendHome: deps.agendHome, instance: plan.name, workingDirectory: plan.workingDirectory, credentialProfile: plan.credentialProfile };
77
- let armed;
71
+ let switched = false;
72
+ const configuredModel = found.inst.model;
73
+ const current = () => {
74
+ if (!lease.current())
75
+ throw new Error(t("kiro_migrate.superseded"));
76
+ const config = deps.fleetConfig(), inst = config?.instances[plan.name];
77
+ if (!inst || inst.model !== configuredModel || (inst.backend ?? config?.defaults?.backend ?? "claude-code") !== "kiro-cli"
78
+ || (inst.kiro_ui ?? "legacy") !== (switched ? "tui" : "legacy") || inst.working_directory !== plan.workingDirectory
79
+ || instanceCredentialProfile(inst, config?.defaults, "kiro-cli") !== plan.credentialProfile)
80
+ throw new Error(t("kiro_migrate.superseded"));
81
+ };
78
82
  try {
79
- armed = armKiroTuiMigration(opts);
80
- }
81
- catch {
82
- armed = { kind: "refused", reason: "unreadable" };
83
- }
84
- if (armed.kind === "refused" || armed.classicId !== plan.classicId) {
85
- if (armed.kind === "ready" && armed.classicId)
86
- disarmKiroTuiMigration(opts);
87
- restoreConfig();
83
+ const model = await deps.preflight(plan.name, plan);
84
+ current();
85
+ // The idle/version check awaited: re-check the original pin before any write.
86
+ const checked = inspectKiroTuiMigration({ agendHome: deps.agendHome, instance: plan.name, workingDirectory: plan.workingDirectory, credentialProfile: plan.credentialProfile });
87
+ if (checked.kind !== "ready" || checked.classicId !== plan.classicId || found.inst.kiro_ui && found.inst.kiro_ui !== "legacy")
88
+ throw new Error(t("kiro_migrate.changed", plan.name));
89
+ const inst = deps.fleetConfig().instances[plan.name];
90
+ const before = inst.kiro_ui;
91
+ const restoreConfig = () => { if (before === undefined)
92
+ delete inst.kiro_ui;
93
+ else
94
+ inst.kiro_ui = before; };
95
+ inst.kiro_ui = "tui";
88
96
  try {
89
97
  deps.saveFleetConfig();
90
98
  }
91
- catch { /* the running classic CLI is untouched; the next save writes it again */ }
92
- return { ok: false, text: armed.kind === "refused" ? refusal(plan.name, armed) : t("kiro_migrate.changed", plan.name) };
93
- }
94
- const carried = plan.classicId ? t("kiro_migrate.done_carry", plan.classicId) : t("kiro_migrate.done_fresh");
95
- if (deps.status(plan.name) !== "running")
96
- return { ok: true, text: `${t("kiro_migrate.done_next_start", plan.name)} ${carried}` };
97
- try {
99
+ catch (err) {
100
+ restoreConfig();
101
+ return { ok: false, text: t("kiro_migrate.save_failed", plan.name, err.message) };
102
+ }
103
+ const opts = { agendHome: deps.agendHome, instance: plan.name, workingDirectory: plan.workingDirectory, credentialProfile: plan.credentialProfile };
104
+ let armed;
105
+ try {
106
+ armed = armKiroTuiMigration(opts);
107
+ }
108
+ catch {
109
+ armed = { kind: "refused", reason: "unreadable" };
110
+ }
111
+ if (armed.kind === "refused" || armed.classicId !== plan.classicId) {
112
+ if (armed.kind === "ready" && armed.classicId)
113
+ disarmKiroTuiMigration(opts);
114
+ restoreConfig();
115
+ try {
116
+ deps.saveFleetConfig();
117
+ }
118
+ catch (err) {
119
+ // The accepted disk config may still say TUI without an adoption: persist a stop instead of risking fresh.
120
+ switched = true;
121
+ throw err;
122
+ }
123
+ return { ok: false, text: armed.kind === "refused" ? refusal(plan.name, armed) : t("kiro_migrate.changed", plan.name) };
124
+ }
125
+ switched = true;
126
+ current();
98
127
  await deps.restart(plan.name);
128
+ current();
129
+ if (!plan.classicId) {
130
+ // Explicit startFresh remains an explicit new conversation, never an automatic fallback.
131
+ return { ok: true, text: `${t("kiro_migrate.done", plan.name)} ${t("kiro_migrate.done_fresh")}` };
132
+ }
133
+ await deps.verify(plan.name, plan.classicId, model, false);
134
+ current();
135
+ // The second ordinary restart stops our CLI, archives its frozen classic row in launch preparation,
136
+ // then must resume the exact same V2 id. No picker and no model prompt are submitted.
137
+ await deps.restart(plan.name);
138
+ current();
139
+ const verified = await deps.verify(plan.name, plan.classicId, model, true);
140
+ current();
141
+ return { ok: true, text: t("kiro_migrate.verified", plan.name, plan.classicId, model, verified.forensic) };
99
142
  }
100
143
  catch (err) {
101
- return { ok: true, text: `${t("kiro_migrate.done_restart_failed", plan.name, err.message)} ${carried}` };
144
+ let reason = err.message;
145
+ // Never roll a carried conversation back to its now-frozen classic copy.
146
+ if (switched && lease.current()) {
147
+ try {
148
+ await deps.stop(plan.name);
149
+ }
150
+ catch {
151
+ reason += " " + t("kiro_migrate.stop_unconfirmed");
152
+ }
153
+ }
154
+ return { ok: false, text: t("kiro_migrate.failed", plan.name, reason) };
155
+ }
156
+ finally {
157
+ lease.release();
102
158
  }
103
- return { ok: true, text: `${t("kiro_migrate.done", plan.name)} ${carried}` };
104
159
  }
105
160
  //# sourceMappingURL=kiro-migrate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kiro-migrate.js","sourceRoot":"","sources":["../src/kiro-migrate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kiro-migrate.js","sourceRoot":"","sources":["../src/kiro-migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export declare const KIRO_SESSION_ID_COMMAND = "/session-id";
2
+ export declare const KIRO_SESSION_PROOF_FILE = "kiro-session-proof.json";
3
+ export type KiroObservedSessionId = string | "none";
4
+ export type KiroSessionIdProof = {
5
+ kind: "match";
6
+ id: string;
7
+ } | {
8
+ kind: "fresh";
9
+ id: string;
10
+ } | {
11
+ kind: "none";
12
+ } | {
13
+ kind: "mismatch";
14
+ pinned: string;
15
+ observed: KiroObservedSessionId;
16
+ } | {
17
+ kind: "unread";
18
+ };
19
+ /**
20
+ * Compare the pane's `/session-id` with the launch pin. `unread` and `mismatch`
21
+ * must not be repaired by listing session files.
22
+ */
23
+ export declare function proveKiroSessionId(pinned: string | null, observed: KiroObservedSessionId | null): KiroSessionIdProof;
24
+ /** `/title <name>` for tui/V3. Empty or newline-bearing names are refused. */
25
+ export declare function kiroTitleCommand(instanceName: string): string | null;
26
+ export interface KiroSessionProofRecord {
27
+ version: 1;
28
+ sessionId: string;
29
+ kind: "match" | "fresh";
30
+ source: "/session-id";
31
+ provenAt: number;
32
+ }
33
+ /** Persist kiro's own `/session-id` as proven. Does not write identity claims. */
34
+ export declare function recordKiroSessionProof(instanceDir: string, rec: {
35
+ sessionId: string;
36
+ kind: "match" | "fresh";
37
+ provenAt?: number;
38
+ }): KiroSessionProofRecord;
39
+ /** This launch did not prove an id — drop a stale proof from an earlier launch. */
40
+ export declare function clearKiroSessionProof(instanceDir: string): void;
41
+ export declare function readKiroSessionProof(instanceDir: string): KiroSessionProofRecord | null;
@@ -0,0 +1,89 @@
1
+ /**
2
+ * M-2025 / survey #2681 candidates 5 and 10: after a tui or V3 launch, AgEnD types
3
+ * `/session-id` and `/title` into an idle composer. The session id is kiro's own
4
+ * announcement (tui.js `showSessionId`), compared with the pin from #2617. A
5
+ * mismatch is logged and surfaced; the pin is never replaced by a file-store guess.
6
+ * A match (or a fresh launch that named an id) is recorded as proven in the
7
+ * instance dir — that file is not an identity claim.
8
+ * Legacy has no these commands: it keeps the tmux window name.
9
+ *
10
+ * Live 2.34.0 tui.js:
11
+ * showSessionId → announceSystem(`Session ID: ${id}\nResume with: kiro-cli --resume-id ${id}`)
12
+ * or `Session ID: none`
13
+ * updateTitle → showAlert(`Title set: ${title}`), or `Terminal title is disabled …` (the default)
14
+ * The pane readers live with kiro's other layout readers (backend/kiro.ts: readKiroCommandComposer,
15
+ * readKiroSessionIdAlert); the daemon types each command only into a positively empty composer and
16
+ * takes the id only from an alert that was not on the pane before it typed (#2683).
17
+ */
18
+ import { readFileSync, rmSync } from "node:fs";
19
+ import { join } from "node:path";
20
+ import { writeFileAtomic } from "./backend/kiro-engine-ledger.js";
21
+ import { ensureInstanceDir } from "./private-dir.js";
22
+ export const KIRO_SESSION_ID_COMMAND = "/session-id";
23
+ export const KIRO_SESSION_PROOF_FILE = "kiro-session-proof.json";
24
+ /** Same shape kiro-identity uses for conversation ids. */
25
+ const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,199}$/;
26
+ /**
27
+ * Compare the pane's `/session-id` with the launch pin. `unread` and `mismatch`
28
+ * must not be repaired by listing session files.
29
+ */
30
+ export function proveKiroSessionId(pinned, observed) {
31
+ if (observed === null)
32
+ return { kind: "unread" };
33
+ if (pinned && observed !== pinned)
34
+ return { kind: "mismatch", pinned, observed };
35
+ if (observed === "none")
36
+ return { kind: "none" };
37
+ if (!pinned)
38
+ return { kind: "fresh", id: observed };
39
+ return { kind: "match", id: observed };
40
+ }
41
+ /** `/title <name>` for tui/V3. Empty or newline-bearing names are refused. */
42
+ export function kiroTitleCommand(instanceName) {
43
+ const name = instanceName.trim();
44
+ if (!name || /[\n\r]/.test(name))
45
+ return null;
46
+ return `/title ${name}`;
47
+ }
48
+ function proofPath(instanceDir) {
49
+ return join(instanceDir, KIRO_SESSION_PROOF_FILE);
50
+ }
51
+ /** Persist kiro's own `/session-id` as proven. Does not write identity claims. */
52
+ export function recordKiroSessionProof(instanceDir, rec) {
53
+ if (!SAFE_ID.test(rec.sessionId) || rec.sessionId === "none") {
54
+ throw new Error("kiro session proof refuses this id");
55
+ }
56
+ const written = {
57
+ version: 1,
58
+ sessionId: rec.sessionId,
59
+ kind: rec.kind,
60
+ source: "/session-id",
61
+ provenAt: rec.provenAt ?? Date.now(),
62
+ };
63
+ ensureInstanceDir(instanceDir);
64
+ writeFileAtomic(proofPath(instanceDir), JSON.stringify(written) + "\n");
65
+ return written;
66
+ }
67
+ /** This launch did not prove an id — drop a stale proof from an earlier launch. */
68
+ export function clearKiroSessionProof(instanceDir) {
69
+ rmSync(proofPath(instanceDir), { force: true });
70
+ }
71
+ export function readKiroSessionProof(instanceDir) {
72
+ try {
73
+ const parsed = JSON.parse(readFileSync(proofPath(instanceDir), "utf8"));
74
+ if (!parsed || typeof parsed !== "object")
75
+ return null;
76
+ const rec = parsed;
77
+ if (rec.version !== 1 || (rec.kind !== "match" && rec.kind !== "fresh"))
78
+ return null;
79
+ if (rec.source !== "/session-id" || typeof rec.sessionId !== "string" || typeof rec.provenAt !== "number")
80
+ return null;
81
+ if (!SAFE_ID.test(rec.sessionId) || rec.sessionId === "none")
82
+ return null;
83
+ return { version: 1, sessionId: rec.sessionId, kind: rec.kind, source: "/session-id", provenAt: rec.provenAt };
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ //# sourceMappingURL=kiro-session-proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiro-session-proof.js","sourceRoot":"","sources":["../src/kiro-session-proof.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,10 @@
1
1
  import type { KiroScanRead } from "./forged-envelope-scan.js";
2
2
  export declare const KIRO_FORENSIC_MAX_BYTES: number;
3
+ /** Refuse symlinks/devices/foreign files and read exactly the size observed at open, not an unbounded live tail. */
4
+ export declare function snapshotKiroTuiFile(path: string, maxBytes: number): {
5
+ text: string;
6
+ unchanged: () => boolean;
7
+ };
3
8
  export declare function readKiroTuiAssistantTexts(opts: {
4
9
  sessionId: string;
5
10
  sessionsDir?: string;
@@ -9,7 +9,7 @@ const META_MAX_BYTES = 8 * 1024 * 1024;
9
9
  const LINE_MAX_BYTES = 4 * 1024 * 1024;
10
10
  const plain = (value) => !!value && typeof value === "object" && !Array.isArray(value);
11
11
  /** Refuse symlinks/devices/foreign files and read exactly the size observed at open, not an unbounded live tail. */
12
- function snapshot(path, maxBytes) {
12
+ export function snapshotKiroTuiFile(path, maxBytes) {
13
13
  const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
14
14
  try {
15
15
  const before = fstatSync(fd);
@@ -62,13 +62,13 @@ export function readKiroTuiAssistantTexts(opts) {
62
62
  throw new Error("TUI session ownership is not proven");
63
63
  // Same V2 root convention as kiroV2SessionsDir; credential profiles relocate classic only.
64
64
  const root = opts.sessionsDir ?? join(process.env.KIRO_HOME?.trim() || join(homedir(), ".kiro"), "sessions", "cli");
65
- const metadata = snapshot(join(root, `${opts.sessionId}.json`), META_MAX_BYTES);
65
+ const metadata = snapshotKiroTuiFile(join(root, `${opts.sessionId}.json`), META_MAX_BYTES);
66
66
  const meta = JSON.parse(metadata.text);
67
67
  if (!plain(meta) || meta.session_id !== opts.sessionId
68
68
  || (meta.session_created_reason === "subagent" && meta.exported_from_v1 !== true)) {
69
69
  throw new Error("TUI metadata does not match the owned pin, or is an ordinary child session");
70
70
  }
71
- const transcript = snapshot(join(root, `${opts.sessionId}.jsonl`), KIRO_FORENSIC_MAX_BYTES);
71
+ const transcript = snapshotKiroTuiFile(join(root, `${opts.sessionId}.jsonl`), KIRO_FORENSIC_MAX_BYTES);
72
72
  const texts = [];
73
73
  let records = 0;
74
74
  for (const line of transcript.text.split("\n")) {
@@ -1 +1 @@
1
- {"version":3,"file":"kiro-tui-forensic.js","sourceRoot":"","sources":["../src/kiro-tui-forensic.ts"],"names":[],"mappings":"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"}
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
@@ -231,6 +231,7 @@ const enMessages = {
231
231
  "needs.reason.hang": "Not responding",
232
232
  "needs.reason.exited": "Exited",
233
233
  "needs.reason.assist": "Waiting at its terminal",
234
+ "needs.reason.question": "Asking you a question",
234
235
  "needs.reason.permission": "Permission needed",
235
236
  "needs.reason.dangerous_command": "Dangerous command waiting",
236
237
  "needs.reason.login": "Sign-in needed",
@@ -355,12 +356,47 @@ 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.",
360
373
  "kiro_migrate.prompt_fresh": "It has no classic conversation to carry: it starts an empty TUI conversation.",
361
374
  "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
375
  "kiro_migrate.prompt_restart": "It is running: it restarts now (about 1–3 minutes).",
363
376
  "kiro_migrate.prompt_next_start": "It is not running: the move takes effect at its next start.",
377
+ "office_packs.applied": "Office packs — {0}: {1}",
378
+ "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.",
379
+ "office_packs.approve_button": "Approve",
380
+ "office_packs.reject_button": "Reject",
381
+ "office_packs.approved": "Office packs — approved by {0} for {1}: {2}",
382
+ "office_packs.rejected": "Office packs — rejected by {0}; nothing changed ({1}: {2}).",
383
+ "office_packs.failed": "Office packs — approved, but not applied ({0}: {1}): {2}",
384
+ "office_packs.expired": "Office packs — not approved in time; nothing changed: {0}",
385
+ "office_packs.gone": "This pack change is no longer pending.",
386
+ "office_packs.upload_item": "{0} “{1}” ({2} files, {3})",
387
+ "office_packs.replaces": "replacing version {0} (kept for a restore)",
388
+ "office_packs.drops": "and dropping {0} layout override(s) that no longer fit — {1}",
389
+ "office_packs.drops_more": "…and {0} more",
390
+ "office_packs.delete": "delete {0} (its previous version too)",
391
+ "office_packs.delete_keep": "delete {0} (its previous version kept)",
392
+ "office_packs.restore": "restored {0} to its previous version {1}",
393
+ "office_packs.restore_pending": "restore {0} to its previous version",
394
+ "office_packs.style": "draw office {0} in {1}",
395
+ "office_packs.upload": "upload {0}",
396
+ "office_packs.uploaded": "uploaded {0}",
397
+ "office_packs.deleted": "deleted {0} (its previous version too)",
398
+ "office_packs.deleted_keep": "deleted {0} (its previous version kept)",
399
+ "office_packs.styled": "now draws office {0} in {1}",
364
400
  "kiro_migrate.confirm_button": "Move it",
365
401
  "kiro_migrate.cancel_button": "Cancel",
366
402
  "kiro_migrate.expired": "The kiro move of {0} was not confirmed in time; nothing was changed.",
@@ -387,8 +423,18 @@ const enMessages = {
387
423
  "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
424
  "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
425
  "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.",
426
+ "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.",
427
+ "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
428
  "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
429
  "inst.cli_unsupported": "⛔ `{0}` was not started: {1}",
430
+ "kiro.carry_resume_failed": "The carried Kiro conversation could not be resumed safely. Its pin and history are kept; this instance is stopped.",
431
+ "kiro.archive_done": "The frozen classic conversation was archived and removed from Kiro's duplicate index: {0}",
432
+ "kiro.carry_pin_repaired": "The abandoned carried V2 pin was restored; empty replacement sessions were left untouched.",
433
+ "kiro.archive_failed": "The carried Kiro conversation is kept; its archive/repair could not be proven safe: {0}",
434
+ "kiro.archive_remedy": "Keep this instance stopped, resolve the store/ownership issue, then start it again. Do not start fresh or switch to classic.",
435
+ "inst.kiro_resume_ambiguous": "Kiro lists this instance's saved session twice (classic and V2). The session is kept and the instance is stopped.",
436
+ "inst.kiro_resume_ambiguous_remedy": "Resolve the duplicate store entry, then start this instance again.",
437
+ "fleet.resume_blocked": "⛔ Not started ({0}): {1}\n{2}",
392
438
  "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
439
  "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
440
  "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.",
@@ -466,6 +512,31 @@ const enMessages = {
466
512
  "interactive.expired": "⌛ Interactive prompt assistance for {0} expired.",
467
513
  "interactive.self_assist": "⚠️ {0} is General itself and cannot self-assist while blocked. Use tmux attach.",
468
514
  "interactive.delivery_failed": "❌ Could not deliver the assistance request for {0} to General.",
515
+ "card.question_intro": "❓ {0} is asking you:",
516
+ "card.question_hint": "Tap an answer below.",
517
+ "card.question_hint_text": "Tap an answer below, or reply to this message to answer in your own words.",
518
+ "card.recommended": "(recommended)",
519
+ "card.skip": "⏭ Skip",
520
+ "card.answer_in_words": "✍️ Answer in words",
521
+ "card.sub_intro": "❓ {0}: choose what to include",
522
+ "card.sub_all": "All: {0}",
523
+ "card.sub_all_short": "all of them",
524
+ "card.sub_only": "Only {0}",
525
+ "card.back": "↩ Back",
526
+ "card.input_intro": "🔐 An MCP server ({0}) is asking {1} for input:",
527
+ "card.input_hint": "Fill it in at the instance's terminal (Dashboard → View), or:",
528
+ "card.decline": "Decline",
529
+ "card.cancel": "Cancel",
530
+ "card.in_words": "an answer in words",
531
+ "card.answered": "✅ {0} answered: {1}",
532
+ "card.opened_sub": "↪ {0} chose {1} — its parts are asked next.",
533
+ "card.went_back": "↩ {0} went back to the options.",
534
+ "card.answered_in_pane": "This question was answered at the instance's terminal.",
535
+ "card.stale": "This question to {0} was already answered or has changed.",
536
+ "card.refused": "{0}'s question could not take that answer as it is now — it is asked again below.",
537
+ "card.stopped": "Could not confirm that answer on {0}'s screen, so nothing more was sent — check its terminal (Dashboard → View).",
538
+ "card.expired": "These buttons expired — {0} is still waiting: answer at its terminal (Dashboard → View).",
539
+ "card.someone_on_dashboard": "someone on the dashboard",
469
540
  "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
541
  "exit.instance_notice": "🛑 {0} stopped normally (exit code 0). An administrator can restart it from General.",
471
542
  "exit.general_notice": "🛑 {0} stopped (normal exit). Restart it?",
@@ -1551,6 +1622,7 @@ const zhTWMessages = {
1551
1622
  "needs.reason.hang": "沒有回應",
1552
1623
  "needs.reason.exited": "已結束",
1553
1624
  "needs.reason.assist": "在終端機上等待",
1625
+ "needs.reason.question": "正在問你問題",
1554
1626
  "needs.reason.permission": "需要權限",
1555
1627
  "needs.reason.dangerous_command": "危險指令待確認",
1556
1628
  "needs.reason.login": "需要登入",
@@ -1675,12 +1747,47 @@ const zhTWMessages = {
1675
1747
  "kiro_migrate.refused_unreadable": "AgEnD 讀不到 '{0}' 的 kiro 對話紀錄,無法判斷要帶哪個對話過去。什麼都沒改。",
1676
1748
  "kiro_migrate.refused_name": "'{0}' 無法登記為 kiro 對話的擁有者。",
1677
1749
  "kiro_migrate.no_classic": "'{0}' 沒有可帶過去的經典對話紀錄(它是全新開始,或沒有自己的紀錄)。搬過去會是空的 TUI 對話;若確實要這樣,請加上 start_fresh: true 再要求一次。",
1750
+ "kiro_migrate.prompt_verify": "帶入後會備份並移出凍結的 classic 副本,再做一次一般重啟,驗證同一對話、模型、逐字紀錄來源與鑑識讀取器;失敗就停止。",
1751
+ "kiro_migrate.prompt_sudo": "若此 instance 使用 sudo 或互動式密碼,TUI 的處理可能不同;請確認你接受這項差異再搬移。",
1752
+ "kiro_migrate.prompt_start_verify": "它目前已停止;確認後會啟動它,帶入並驗證對話。",
1753
+ "kiro_migrate.verified": "✅ {0}:TUI 搬移已通過一般重啟驗證。對話 {1};模型 {2};已接上 V2 逐字紀錄;鑑識結果:{3}。",
1754
+ "kiro_migrate.failed": "⛔ {0}:TUI 搬移未完成({1})。對話已保留。請先查明原因再明確重試,不要切回 classic。",
1755
+ "kiro_migrate.stop_unconfirmed": "無法確認 instance 已停止,請管理員檢查。",
1756
+ "kiro_migrate.in_progress": "此 instance 已有搬移或啟停作業正在執行。",
1757
+ "kiro_migrate.superseded": "搬移期間 instance 已被停止、取代或變更設定。",
1758
+ "kiro_migrate.version_required": "完整搬移驗證需要支援 TUI v2 與獨立 agent 的 kiro-cli 2.34 以上版本。",
1759
+ "kiro_migrate.idle_required": "請等 instance 閒置且沒有互動提示後再重試。",
1760
+ "kiro_migrate.model_unknown": "無法確認目前的模型;搬移尚未開始。",
1761
+ "kiro_migrate.verification_failed": "60 秒內無法驗證同一個閒置 V2 對話、模型與逐字紀錄來源。",
1678
1762
  "kiro_migrate.prompt_title": "🔀 要把 {0} 從 kiro 經典引擎搬到 TUI 引擎嗎?",
1679
1763
  "kiro_migrate.prompt_carry": "它的經典對話 {0} 會在 TUI 下接續一次:kiro 會把整段歷史複製過去,經典那份從此不再更新。",
1680
1764
  "kiro_migrate.prompt_fresh": "它沒有可帶的經典對話:會從空的 TUI 對話開始。",
1681
1765
  "kiro_migrate.prompt_one_way": "單向:之後 AgEnD 不會再用經典引擎啟動它(那會接回舊副本,失去之後做的事)。",
1682
1766
  "kiro_migrate.prompt_restart": "它正在執行:會立刻重啟(約 1–3 分鐘)。",
1683
1767
  "kiro_migrate.prompt_next_start": "它沒在執行:下次啟動時生效。",
1768
+ "office_packs.applied": "辦公室外觀包 — {0}:{1}",
1769
+ "office_packs.pending": "辦公室外觀包 — {0} 要求:{1}。\n請在這裡或辦公室頁面(Fleet → 組織圖 → 辦公室 → 編輯辦公室)核准或拒絕;等 {2} 小時,逾時就什麼都不改。",
1770
+ "office_packs.approve_button": "核准",
1771
+ "office_packs.reject_button": "拒絕",
1772
+ "office_packs.approved": "辦公室外觀包 — {0} 已核准 {1} 的變更:{2}",
1773
+ "office_packs.rejected": "辦公室外觀包 — {0} 已拒絕;什麼都沒改({1}:{2})。",
1774
+ "office_packs.failed": "辦公室外觀包 — 已核准,但沒有套用({0}:{1}):{2}",
1775
+ "office_packs.expired": "辦公室外觀包 — 沒有及時核准;什麼都沒改:{0}",
1776
+ "office_packs.gone": "這項外觀包變更已不在等待中。",
1777
+ "office_packs.upload_item": "{0}「{1}」({2} 個檔案,{3})",
1778
+ "office_packs.replaces": "取代版本 {0}(保留以便還原)",
1779
+ "office_packs.drops": "並移除 {0} 項已不合用的版面調整——{1}",
1780
+ "office_packs.drops_more": "…另有 {0} 項",
1781
+ "office_packs.delete": "刪除 {0}(連同上一版)",
1782
+ "office_packs.delete_keep": "刪除 {0}(保留上一版)",
1783
+ "office_packs.restore": "已把 {0} 還原到上一版 {1}",
1784
+ "office_packs.restore_pending": "把 {0} 還原到上一版",
1785
+ "office_packs.style": "把辦公室 {0} 改用 {1}",
1786
+ "office_packs.upload": "上傳 {0}",
1787
+ "office_packs.uploaded": "上傳了 {0}",
1788
+ "office_packs.deleted": "刪除了 {0}(連同上一版)",
1789
+ "office_packs.deleted_keep": "刪除了 {0}(保留上一版)",
1790
+ "office_packs.styled": "辦公室 {0} 改用 {1} 了",
1684
1791
  "kiro_migrate.confirm_button": "搬過去",
1685
1792
  "kiro_migrate.cancel_button": "取消",
1686
1793
  "kiro_migrate.expired": "{0} 的 kiro 搬移沒有及時確認;什麼都沒改。",
@@ -1707,8 +1814,18 @@ const zhTWMessages = {
1707
1814
  "kiro.switch_unrecorded": "kiro:instance 已經切換成自己的 agent,但 AgEnD 無法記錄這件事;下次啟動會再檢查,在記錄成功前保留共用設定。",
1708
1815
  "agy.instructions_link_dangling": "agy:{0} 是指向不存在檔案的符號連結。AgEnD 保留原狀,沒有寫入這個 instance 的艦隊指示,所以 agy 這次啟動時沒有這些指示。請讓連結指向存在的檔案或移除它,下次啟動就會寫入。",
1709
1816
  "kiro.switch_timeout": "kiro:恢復的對話沒有在 {0} 秒內切換成這個 instance 的 agent。它會照舊繼續執行並保留共用設定;下次啟動會再試。",
1817
+ "kiro.session_id_mismatch": "kiro:pane 上 /session-id 是 {1},但這次啟動釘的是 {0}。AgEnD 沒有從檔案猜測另一個對話。",
1818
+ "kiro.session_id_unread": "kiro:啟動後 pane 沒有印出 /session-id。AgEnD 沒有從檔案猜測對話。",
1710
1819
  "kiro.version_untested": "kiro-cli {0} 比 AgEnD 實際跑過的最新版本({1})還新。啟動參數是依照 `kiro-cli chat --help` 判斷的;若有異常,請回報這個版本。",
1711
1820
  "inst.cli_unsupported": "⛔ `{0}` 沒有啟動:{1}",
1821
+ "kiro.carry_resume_failed": "無法安全接續帶入的 Kiro 對話;固定 id 與歷史都已保留,此 instance 已停止。",
1822
+ "kiro.archive_done": "已將凍結的 classic 對話備份並移出 Kiro 的重複索引:{0}",
1823
+ "kiro.carry_pin_repaired": "已恢復原本帶入的 V2 對話固定 id;空白的替代 session 都保留未動。",
1824
+ "kiro.archive_failed": "已保留帶入的 Kiro 對話,但無法證明備份/修復可以安全進行:{0}",
1825
+ "kiro.archive_remedy": "請維持此 instance 停止,處理 store/所有權問題後再啟動;不要改開新對話或切回 classic。",
1826
+ "inst.kiro_resume_ambiguous": "Kiro 在 classic 與 V2 各列出一次這個 instance 的已存對話。對話已保留,instance 已停止。",
1827
+ "inst.kiro_resume_ambiguous_remedy": "請先處理 store 中的重複紀錄,再啟動這個 instance。",
1828
+ "fleet.resume_blocked": "⛔ 沒有啟動({0}):{1}\n{2}",
1712
1829
  "fleet.cli_unsupported": "⛔ 沒有啟動({0}):{1}\n這些 instance 不會自動重試;換了 CLI 或修改設定之後再啟動即可。",
1713
1830
  "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
1831
  "inst.mcp_never_connected_auto": "⚠️ `{0}` 的 CLI 在執行,但 AgEnD 的 MCP server 一直沒有連上 —— 這個 instance 目前沒有 agend 工具(無法 reply / 跨 instance 通訊)。等它閒置後會自動重啟再試一次(session 會保留)。若重複發生,請看它 pane 裡 CLI 的 MCP 啟動訊息。",
@@ -1786,6 +1903,31 @@ const zhTWMessages = {
1786
1903
  "interactive.expired": "⌛ {0} 的人工輸入協助請求已逾時。",
1787
1904
  "interactive.self_assist": "⚠️ {0} 就是 General;阻塞時無法自助。請直接使用 tmux attach。",
1788
1905
  "interactive.delivery_failed": "❌ 無法把 {0} 的協助請求送進 General。",
1906
+ "card.question_intro": "❓ {0} 在問你:",
1907
+ "card.question_hint": "請點下方的答案。",
1908
+ "card.question_hint_text": "請點下方的答案,或回覆這則訊息用自己的話回答。",
1909
+ "card.recommended": "(建議)",
1910
+ "card.skip": "⏭ 略過",
1911
+ "card.answer_in_words": "✍️ 用文字回答",
1912
+ "card.sub_intro": "❓ {0}:選擇要包含哪些",
1913
+ "card.sub_all": "全部:{0}",
1914
+ "card.sub_all_short": "全部",
1915
+ "card.sub_only": "只要 {0}",
1916
+ "card.back": "↩ 返回",
1917
+ "card.input_intro": "🔐 MCP server({0})要求 {1} 提供輸入:",
1918
+ "card.input_hint": "請在該 instance 的終端機填寫(儀表板 → View),或:",
1919
+ "card.decline": "拒絕",
1920
+ "card.cancel": "取消",
1921
+ "card.in_words": "文字回答",
1922
+ "card.answered": "✅ {0} 回答了:{1}",
1923
+ "card.opened_sub": "↪ {0} 選了 {1},接著會問要包含哪些。",
1924
+ "card.went_back": "↩ {0} 回到選項。",
1925
+ "card.answered_in_pane": "這個問題已在該 instance 的終端機上回答。",
1926
+ "card.stale": "{0} 的這個問題已經回答或已改變。",
1927
+ "card.refused": "{0} 的問題目前無法接受這個答案,下方會重新詢問。",
1928
+ "card.stopped": "無法在 {0} 的畫面上確認這個答案,因此沒有再送出任何按鍵;請查看它的終端機(儀表板 → View)。",
1929
+ "card.expired": "這些按鈕已過期,{0} 仍在等待:請在它的終端機回答(儀表板 → View)。",
1930
+ "card.someone_on_dashboard": "儀表板上的使用者",
1789
1931
  "interactive.assist_request": "[system] 已確認協助 {0} 的人工輸入(提示類型:{1})。請查看該 instance 的 tmux pane,向使用者回報正在等待的操作,並在輸入任何內容前取得明確授權。絕不可要求或接受使用者在聊天中傳送密碼;密碼只能由操作員直接在 tmux 輸入。",
1790
1932
  "exit.instance_notice": "🛑 {0} 已停止(正常退出,exit code 0)。管理員可至 General 重新啟動。",
1791
1933
  "exit.general_notice": "🛑 {0} 已停止(正常退出)。要重新啟動嗎?",