@songsid/agend 2.3.2-beta.14 → 2.3.2-beta.15

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 (95) hide show
  1. package/dist/backend/codex-session-lookup.d.ts +15 -0
  2. package/dist/backend/codex-session-lookup.js +58 -0
  3. package/dist/backend/codex-session-lookup.js.map +1 -1
  4. package/dist/backend/codex.js +15 -4
  5. package/dist/backend/codex.js.map +1 -1
  6. package/dist/backend/kiro-classic-archive.d.ts +5 -0
  7. package/dist/backend/kiro-classic-archive.js +132 -7
  8. package/dist/backend/kiro-classic-archive.js.map +1 -1
  9. package/dist/backend/kiro-identity.d.ts +2 -0
  10. package/dist/backend/kiro-identity.js +4 -0
  11. package/dist/backend/kiro-identity.js.map +1 -1
  12. package/dist/backend/kiro-reconcile-store.d.ts +27 -0
  13. package/dist/backend/kiro-reconcile-store.js +344 -0
  14. package/dist/backend/kiro-reconcile-store.js.map +1 -0
  15. package/dist/backend/kiro-v2-store-worker.js +12 -3
  16. package/dist/backend/kiro-v2-store-worker.js.map +1 -1
  17. package/dist/backend/kiro-v2-store.d.ts +11 -0
  18. package/dist/backend/kiro-v2-store.js.map +1 -1
  19. package/dist/channel/mcp-tools.js +3 -1
  20. package/dist/channel/mcp-tools.js.map +1 -1
  21. package/dist/cli.js +17 -4
  22. package/dist/cli.js.map +1 -1
  23. package/dist/fleet-manager.d.ts +9 -1
  24. package/dist/fleet-manager.js +94 -8
  25. package/dist/fleet-manager.js.map +1 -1
  26. package/dist/general-instance.d.ts +24 -0
  27. package/dist/general-instance.js +53 -0
  28. package/dist/general-instance.js.map +1 -1
  29. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +2 -0
  30. package/dist/general-knowledge/skills/web-appearance/SKILL.md +2 -0
  31. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +6 -4
  32. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +6 -4
  33. package/dist/kiro-reconcile.d.ts +21 -0
  34. package/dist/kiro-reconcile.js +80 -0
  35. package/dist/kiro-reconcile.js.map +1 -0
  36. package/dist/kiro-tui-forensic.d.ts +7 -0
  37. package/dist/kiro-tui-forensic.js +17 -3
  38. package/dist/kiro-tui-forensic.js.map +1 -1
  39. package/dist/locale.js +20 -0
  40. package/dist/locale.js.map +1 -1
  41. package/dist/log-service.js +1 -1
  42. package/dist/log-service.js.map +1 -1
  43. package/dist/office-share-page.d.ts +3 -1
  44. package/dist/office-share-page.js +7 -2
  45. package/dist/office-share-page.js.map +1 -1
  46. package/dist/office-share-service.d.ts +4 -3
  47. package/dist/office-share-service.js +6 -6
  48. package/dist/office-share-service.js.map +1 -1
  49. package/dist/office-share.d.ts +17 -6
  50. package/dist/office-share.js +28 -11
  51. package/dist/office-share.js.map +1 -1
  52. package/dist/outbound-handlers.js +20 -1
  53. package/dist/outbound-handlers.js.map +1 -1
  54. package/dist/outbound-schemas.d.ts +6 -0
  55. package/dist/outbound-schemas.js +6 -0
  56. package/dist/outbound-schemas.js.map +1 -1
  57. package/dist/quickstart-api.d.ts +25 -1
  58. package/dist/quickstart-api.js +53 -6
  59. package/dist/quickstart-api.js.map +1 -1
  60. package/dist/service-installer.d.ts +13 -0
  61. package/dist/service-installer.js +15 -0
  62. package/dist/service-installer.js.map +1 -1
  63. package/dist/service-owner.d.ts +25 -0
  64. package/dist/service-owner.js +43 -2
  65. package/dist/service-owner.js.map +1 -1
  66. package/dist/setup-form.js +17 -3
  67. package/dist/setup-form.js.map +1 -1
  68. package/dist/setup-i18n.js +2 -0
  69. package/dist/setup-i18n.js.map +1 -1
  70. package/dist/tool-permissions.js +1 -0
  71. package/dist/tool-permissions.js.map +1 -1
  72. package/dist/ui/fleet-office-layout.js +14 -6
  73. package/dist/ui/fleet-office-pack.d.ts +4 -0
  74. package/dist/ui/fleet-office-pack.js +15 -5
  75. package/dist/ui/fleet-office-store.js +18 -3
  76. package/dist/ui/fleet-office-view.js +8 -0
  77. package/dist/ui/fleet-office-zones.js +10 -2
  78. package/dist/ui/fleet-office.js +36 -4
  79. package/dist/ui/office-share-dialog.js +31 -7
  80. package/dist/ui/panel-log.js +2 -2
  81. package/dist/ui/settings-strings.js +2 -0
  82. package/dist/ui/settings-wizard.js +15 -4
  83. package/dist/ui/shared/app.css +6 -0
  84. package/dist/ui/shared/setup-host-text.js +2 -0
  85. package/dist/web-api.js +74 -4
  86. package/dist/web-api.js.map +1 -1
  87. package/dist/web-office-pack-tools.d.ts +10 -1
  88. package/dist/web-office-pack-tools.js +36 -5
  89. package/dist/web-office-pack-tools.js.map +1 -1
  90. package/dist/web-office-skins.js +6 -0
  91. package/dist/web-office-skins.js.map +1 -1
  92. package/dist/web-office-store.d.ts +22 -3
  93. package/dist/web-office-store.js +44 -8
  94. package/dist/web-office-store.js.map +1 -1
  95. package/package.json +1 -1
@@ -7,3 +7,27 @@ export declare const GENERAL_PAUSE_ERROR = "General cannot be paused";
7
7
  * general_topic covers renamed and per-world General instances.
8
8
  */
9
9
  export declare function isGeneralInstance(config: FleetConfig | null | undefined, name: string): boolean;
10
+ /** M-2069: the name a fleet's General has by default (the auto-created one, and the setup's first agent). */
11
+ export declare const GENERAL_NAME = "general";
12
+ /**
13
+ * M-2069: the topic a General on this connection is bound to: the chat's own General — Telegram's built-in General
14
+ * topic (thread 1), the Discord connection's general channel — never a new forum topic. Null for a Discord connection
15
+ * without a valid general channel: a new General is then left unbound, as the fleet's own General is (autoCreateTopics),
16
+ * and an adopted one keeps the topic it has.
17
+ */
18
+ export declare function generalTopicFor(channel: Record<string, unknown>): number | string | null;
19
+ /**
20
+ * M-2069: an agent named "general" is the General to its daemon, its tool profile and the pause guard, but the fleet
21
+ * picks its dispatcher by general_topic. In a chat fleet with no General, the auto-General would be skipped (its name
22
+ * is taken) and the fleet would run with no dispatcher. So that agent is made the General — on the primary connection,
23
+ * in the chat's own General topic where it has one (Telegram's thread 1; Discord's general channel — without one, it
24
+ * keeps the topic it has). On Telegram a stray forum topic it was given is left behind, unrouted. Left alone: a
25
+ * "general" bound to another connection, a fleet that already has a General, and (#2744 review) a "general" working in
26
+ * a folder AgEnD does not own (`ownFolder`) — the General's instructions would land in a project of the user's; the
27
+ * fleet then adds its General under a free name (Phase 3). Returns whether the config changed.
28
+ */
29
+ export declare function adoptGeneralByName(fleet: FleetConfig, logger: {
30
+ warn(obj: unknown, msg?: string): void;
31
+ }, ownFolder: (dir: string) => boolean): boolean;
32
+ /** M-2069: the first free name for a General the fleet creates: `base`, else `base-2`, `base-3`, … */
33
+ export declare function freeGeneralName(instances: Record<string, unknown>, base: string): string;
@@ -1,3 +1,4 @@
1
+ import { discordGeneralChannelId } from "./discord-general.js";
1
2
  /** Stable user-facing error shared by every manual pause entry point. */
2
3
  export const GENERAL_PAUSE_ERROR = "General cannot be paused";
3
4
  /**
@@ -8,4 +9,56 @@ export const GENERAL_PAUSE_ERROR = "General cannot be paused";
8
9
  export function isGeneralInstance(config, name) {
9
10
  return name === "general" || config?.instances[name]?.general_topic === true;
10
11
  }
12
+ /** M-2069: the name a fleet's General has by default (the auto-created one, and the setup's first agent). */
13
+ export const GENERAL_NAME = "general";
14
+ /**
15
+ * M-2069: the topic a General on this connection is bound to: the chat's own General — Telegram's built-in General
16
+ * topic (thread 1), the Discord connection's general channel — never a new forum topic. Null for a Discord connection
17
+ * without a valid general channel: a new General is then left unbound, as the fleet's own General is (autoCreateTopics),
18
+ * and an adopted one keeps the topic it has.
19
+ */
20
+ export function generalTopicFor(channel) {
21
+ if (channel.type === "telegram")
22
+ return 1;
23
+ if (channel.type !== "discord")
24
+ return null;
25
+ const general = discordGeneralChannelId(channel);
26
+ return general != null && /^\d{17,}$/.test(general) ? general : null;
27
+ }
28
+ /**
29
+ * M-2069: an agent named "general" is the General to its daemon, its tool profile and the pause guard, but the fleet
30
+ * picks its dispatcher by general_topic. In a chat fleet with no General, the auto-General would be skipped (its name
31
+ * is taken) and the fleet would run with no dispatcher. So that agent is made the General — on the primary connection,
32
+ * in the chat's own General topic where it has one (Telegram's thread 1; Discord's general channel — without one, it
33
+ * keeps the topic it has). On Telegram a stray forum topic it was given is left behind, unrouted. Left alone: a
34
+ * "general" bound to another connection, a fleet that already has a General, and (#2744 review) a "general" working in
35
+ * a folder AgEnD does not own (`ownFolder`) — the General's instructions would land in a project of the user's; the
36
+ * fleet then adds its General under a free name (Phase 3). Returns whether the config changed.
37
+ */
38
+ export function adoptGeneralByName(fleet, logger, ownFolder) {
39
+ const channels = (fleet.channels ?? (fleet.channel ? [fleet.channel] : []));
40
+ if (!channels.length || !Object.hasOwn(fleet.instances, GENERAL_NAME))
41
+ return false;
42
+ const inst = fleet.instances[GENERAL_NAME];
43
+ if (inst.general_topic === true || Object.values(fleet.instances).some(cfg => cfg.general_topic === true))
44
+ return false;
45
+ const primary = channels[0], primaryId = String(primary.id ?? primary.type);
46
+ if (inst.channel_id != null && inst.channel_id !== primaryId)
47
+ return false;
48
+ if (!ownFolder(inst.working_directory))
49
+ return false;
50
+ const topic = generalTopicFor(primary), from = inst.topic_id ?? null;
51
+ inst.general_topic = true;
52
+ if (topic != null)
53
+ inst.topic_id = topic;
54
+ logger.warn({ name: GENERAL_NAME, topic_from: from, topic_to: inst.topic_id ?? null }, "An agent named general had no general_topic and the fleet had no General — made it the General (its chat's General topic)");
55
+ return true;
56
+ }
57
+ /** M-2069: the first free name for a General the fleet creates: `base`, else `base-2`, `base-3`, … */
58
+ export function freeGeneralName(instances, base) {
59
+ let name = base;
60
+ for (let n = 2; Object.hasOwn(instances, name); n++)
61
+ name = `${base}-${n}`;
62
+ return name;
63
+ }
11
64
  //# sourceMappingURL=general-instance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"general-instance.js","sourceRoot":"","sources":["../src/general-instance.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAE9D;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAsC,EAAE,IAAY;IACpF,OAAO,IAAI,KAAK,SAAS,IAAI,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"general-instance.js","sourceRoot":"","sources":["../src/general-instance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,yEAAyE;AACzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAE9D;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAsC,EAAE,IAAY;IACpF,OAAO,IAAI,KAAK,SAAS,IAAI,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;AAC/E,CAAC;AAED,6GAA6G;AAC7G,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgC;IAC9D,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,OAAO,IAAI,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAkB,EAAE,MAAkD,EAAE,SAAmC;IAC5I,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAA8C,CAAC;IACzH,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IACpF,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,KAAK,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACxH,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC3E,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IACrE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC1B,IAAI,KAAK,IAAI,IAAI;QAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACzC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,EACnF,2HAA2H,CAAC,CAAC;IAC/H,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,eAAe,CAAC,SAAkC,EAAE,IAAY;IAC9E,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -312,6 +312,8 @@ tools are not in your list), you can publish them yourself instead of asking a p
312
312
  built-in style (pixel, studio, cozy).
313
313
  - Every change is logged with each picture's sha256 and told to the fleet's admins. At most **20 batches and 200 MiB an
314
314
  hour**: one call is one batch (up to 16 packs), so send a whole set of fixes in one `packs: [...]`.
315
+ - `office_pack_check` has its own allowance: at most **60 checks and 1 GiB (as sent) an hour**. Every check counts,
316
+ passed or refused, so fix what a refusal names before checking again. `office_pack_list` shows `check_left`.
315
317
 
316
318
  The skin-pack manifest format — every key, its ranges, a minimal example — and the limits are in the Office guide:
317
319
  [docs/office.md → Make a skin pack](https://github.com/songsid/AgEnD/blob/main/docs/office.md#make-a-skin-pack). Point people there too when they ask how the Office works.
@@ -320,6 +320,8 @@ tools are not in your list), you can publish them yourself instead of asking a p
320
320
  built-in style (pixel, studio, cozy).
321
321
  - Every change is logged with each picture's sha256 and told to the fleet's admins. At most **20 batches and 200 MiB an
322
322
  hour**: one call is one batch (up to 16 packs), so send a whole set of fixes in one `packs: [...]`.
323
+ - `office_pack_check` has its own allowance: at most **60 checks and 1 GiB (as sent) an hour**. Every check counts,
324
+ passed or refused, so fix what a refusal names before checking again. `office_pack_list` shows `check_left`.
323
325
 
324
326
  The skin-pack manifest format — every key, its ranges, a minimal example — and the limits are in the Office guide:
325
327
  [docs/office.md → Make a skin pack](https://github.com/songsid/AgEnD/blob/main/docs/office.md#make-a-skin-pack). Point people there too when they ask how the Office works.
@@ -274,13 +274,14 @@ ways with `walkDown`, `walkUp` and `walkSide`, the side one mirrored for left).
274
274
  packs** on (`office_pack_access`, Dashboard access) can check, upload, replace, delete and restore packs itself (one
275
275
  previous version kept per pack); **Agents changing packs** under the packs names those agents, sets whether their changes
276
276
  **Need my yes** (the default) or **Apply at once**, and approves or rejects the waiting ones (also from the notice's
277
- buttons in General); every change is logged and told in General. **Style** (per browser for the whole fleet, per office for a stored one): **Desks**,
277
+ buttons in General); every change is logged and told in General. **Style** (per office for a stored one; for the whole fleet, #2716, an admin's pick is kept on the host for every device and share link, anyone else's stays in their browser): **Desks**,
278
278
  **Studio** (one scene — Work, Lounge, Help desk, Nap corner — where each instance walks to the area for its state),
279
279
  **Cozy** (#2631: the same in a warm pixel-art office drawn as one picture; its notice board says a skin pack can
280
280
  restyle it; the default for a browser that has not picked a style and for a new office — a saved office keeps its
281
281
  own) or an uploaded pack; one the page cannot load is drawn as Desks with a note. On a stored office in Studio,
282
282
  Cozy or a pack,
283
- **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door and
283
+ **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door, the mail drop
284
+ (an envelope: where letters from other offices land; dashed on a pack without a `mailDrop`, #2736) and
284
285
  waypoints (or Tab to one and use the arrow keys, Shift for 10), add or remove waypoints and join or unjoin
285
286
  corridors; an item that sleeps at bedtime (a pack's `night`) has a night handle too ("Item {id} (night)": its night
286
287
  picture faint, a moon, a line to its day place; on the day place while it sleeps in place) — drag it to give the item
@@ -301,7 +302,7 @@ only. Hover and click work across
301
302
  tiles; a tile's label, or a double-click on it, opens that office; traffic between offices flies straight across.
302
303
  Edit offices and Edit layout wait for a single office.
303
304
  **Share…** (#2636; an admin session, on the dashboard reached directly or over the public link — never read-only or a guest; the URL shows only to its maker, in the dialog) makes an Office share
304
- link: anyone who opens it watches one office (or **All offices**) live, read-only, with no sign-in — names, identity
305
+ link: anyone who opens it watches **Whole fleet** (#2716, in the fleet's style), one office or **All offices** live, in the link's **Look** (#2715: Light, Dark or the viewer's device; default what the maker's dashboard shows now), read-only, with no sign-in — names, identity
305
306
  colours and states, every 5 s; no chat, no clicks into anything, no settings; agents' `office_set` lines only when
306
307
  **Include agents' own status lines** is ticked; hidden instances never. 1 h by default, 15 min to 24 h
307
308
  (`web.office_share.max_hours`); at most 10 open. Its own quick tunnel (`https://<random>.trycloudflare.com/o/<token>`)
@@ -311,7 +312,8 @@ says to try again in a few minutes (no retry). `web.office_share.enabled: false`
311
312
 
312
313
  The Office fills the Fleet panel and moves like the Canvas (#2540): drag to pan, the wheel or a pinch to zoom,
313
314
  **+** / **−** / **Fit** / **Fill** at the top right (the zoom shown as a percentage above them) or the `+ - 0` keys
314
- (with the office focused), an overview at the bottom right to jump (not on a phone). It takes the whole panel: the
315
+ (with the office focused), an overview at the bottom right to jump (not on a phone; hidden while a single office
316
+ is all in view, #2737). It takes the whole panel: the
315
317
  Fleet area's full width, down to the window's foot. **Fit** shows the whole scene as large as the panel allows
316
318
  (any scale, so it fills the panel's width or height); **Fill** (a toggle, kept per office) fills the panel instead,
317
319
  cropping what overflows — drag to see it. **+** / **−** step in pixel levels (each logical unit a whole number of
@@ -286,13 +286,14 @@ ways with `walkDown`, `walkUp` and `walkSide`, the side one mirrored for left).
286
286
  packs** on (`office_pack_access`, Dashboard access) can check, upload, replace, delete and restore packs itself (one
287
287
  previous version kept per pack); **Agents changing packs** under the packs names those agents, sets whether their changes
288
288
  **Need my yes** (the default) or **Apply at once**, and approves or rejects the waiting ones (also from the notice's
289
- buttons in General); every change is logged and told in General. **Style** (per browser for the whole fleet, per office for a stored one): **Desks**,
289
+ buttons in General); every change is logged and told in General. **Style** (per office for a stored one; for the whole fleet, #2716, an admin's pick is kept on the host for every device and share link, anyone else's stays in their browser): **Desks**,
290
290
  **Studio** (one scene — Work, Lounge, Help desk, Nap corner — where each instance walks to the area for its state),
291
291
  **Cozy** (#2631: the same in a warm pixel-art office drawn as one picture; its notice board says a skin pack can
292
292
  restyle it; the default for a browser that has not picked a style and for a new office — a saved office keeps its
293
293
  own) or an uploaded pack; one the page cannot load is drawn as Desks with a note. On a stored office in Studio,
294
294
  Cozy or a pack,
295
- **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door and
295
+ **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door, the mail drop
296
+ (an envelope: where letters from other offices land; dashed on a pack without a `mailDrop`, #2736) and
296
297
  waypoints (or Tab to one and use the arrow keys, Shift for 10), add or remove waypoints and join or unjoin
297
298
  corridors; an item that sleeps at bedtime (a pack's `night`) has a night handle too ("Item {id} (night)": its night
298
299
  picture faint, a moon, a line to its day place; on the day place while it sleeps in place) — drag it to give the item
@@ -316,7 +317,7 @@ only. Hover and click work across
316
317
  tiles; a tile's label, or a double-click on it, opens that office; traffic between offices flies straight across.
317
318
  Edit offices and Edit layout wait for a single office.
318
319
  **Share…** (#2636; an admin session, on the dashboard reached directly or over the public link — never read-only or a guest; the URL shows only to its maker, in the dialog) makes an Office share
319
- link: anyone who opens it watches one office (or **All offices**) live, read-only, with no sign-in — names, identity
320
+ link: anyone who opens it watches **Whole fleet** (#2716, in the fleet's style), one office or **All offices** live, in the link's **Look** (#2715: Light, Dark or the viewer's device; default what the maker's dashboard shows now), read-only, with no sign-in — names, identity
320
321
  colours and states, every 5 s; no chat, no clicks into anything, no settings; agents' `office_set` lines only when
321
322
  **Include agents' own status lines** is ticked; hidden instances never. 1 h by default, 15 min to 24 h
322
323
  (`web.office_share.max_hours`); at most 10 open. Its own quick tunnel (`https://<random>.trycloudflare.com/o/<token>`)
@@ -326,7 +327,8 @@ says to try again in a few minutes (no retry). `web.office_share.enabled: false`
326
327
 
327
328
  The Office fills the Fleet panel and moves like the Canvas (#2540): drag to pan, the wheel or a pinch to zoom,
328
329
  **+** / **−** / **Fit** / **Fill** at the top right (the zoom shown as a percentage above them) or the `+ - 0` keys
329
- (with the office focused), an overview at the bottom right to jump (not on a phone). It takes the whole panel: the
330
+ (with the office focused), an overview at the bottom right to jump (not on a phone; hidden while a single office
331
+ is all in view, #2737). It takes the whole panel: the
330
332
  Fleet area's full width, down to the window's foot. **Fit** shows the whole scene as large as the panel allows
331
333
  (any scale, so it fills the panel's width or height); **Fill** (a toggle, kept per office) fills the panel instead,
332
334
  cropping what overflows — drag to see it. **+** / **−** step in pixel levels (each logical unit a whole number of
@@ -0,0 +1,21 @@
1
+ /** Confirmed option A only: keep the original carried session, preserve the named newer alternative. */
2
+ import type { KiroMigrateDeps } from "./kiro-migrate.js";
3
+ import type { KiroReconcileInput, KiroReconcilePlan } from "./backend/kiro-reconcile-store.js";
4
+ export interface KiroReconcileDeps extends KiroMigrateDeps {
5
+ store(input: KiroReconcileInput, plan?: KiroReconcilePlan, actor?: string, rollbackReceipt?: string): Promise<{
6
+ plan?: KiroReconcilePlan;
7
+ receipt?: string;
8
+ }>;
9
+ }
10
+ export interface KiroReconciliation {
11
+ name: string;
12
+ input: KiroReconcileInput;
13
+ plan: KiroReconcilePlan;
14
+ }
15
+ export declare function planKiroReconciliation(deps: KiroReconcileDeps, name: string, keep: string, archive: string, rollbackReceipt?: string): Promise<KiroReconciliation>;
16
+ export declare function kiroReconciliationPrompt(p: KiroReconciliation): string;
17
+ export declare function applyKiroReconciliation(deps: KiroReconcileDeps, p: KiroReconciliation, actor: string): Promise<{
18
+ ok: boolean;
19
+ text: string;
20
+ receipt?: string;
21
+ }>;
@@ -0,0 +1,80 @@
1
+ import { instanceCredentialProfile } from "./backend/credential-profile.js";
2
+ import { kiroV1DbPath, kiroV2SessionsDir } from "./backend/kiro.js";
3
+ import { t } from "./locale.js";
4
+ function target(deps, name, keep, archive) {
5
+ const fleet = deps.fleetConfig(), inst = fleet?.instances[name];
6
+ if (!inst || (inst.backend ?? fleet?.defaults?.backend) !== "kiro-cli" || inst.kiro_ui !== "tui" || !inst.working_directory
7
+ || !inst.model || !["stopped", "paused"].includes(deps.status(name)))
8
+ throw new Error(t("kiro_reconcile.stopped_required"));
9
+ const profile = instanceCredentialProfile(inst, fleet?.defaults, "kiro-cli");
10
+ return { agendHome: deps.agendHome, instance: name, workingDirectory: inst.working_directory, credentialProfile: profile,
11
+ sessionId: keep, archiveId: archive, sessionsDir: kiroV2SessionsDir(), dbPath: kiroV1DbPath(profile), model: inst.model };
12
+ }
13
+ export async function planKiroReconciliation(deps, name, keep, archive, rollbackReceipt) {
14
+ const input = target(deps, name, keep, archive), result = await deps.store(input, undefined, undefined, rollbackReceipt);
15
+ if (!result.plan || JSON.stringify(target(deps, name, keep, archive)) !== JSON.stringify(input))
16
+ throw new Error(t("kiro_reconcile.changed"));
17
+ return { name, input, plan: result.plan };
18
+ }
19
+ export function kiroReconciliationPrompt(p) {
20
+ return t(p.plan.rollbackReceipt ? "kiro_reconcile.rollback_prompt" : "kiro_reconcile.prompt", p.name, p.input.sessionId, p.input.archiveId);
21
+ }
22
+ export async function applyKiroReconciliation(deps, p, actor) {
23
+ let lease;
24
+ try {
25
+ lease = deps.reserve(p.name);
26
+ }
27
+ catch (error) {
28
+ return { ok: false, text: t("kiro_reconcile.failed", p.name, error.message) };
29
+ }
30
+ let receipt;
31
+ const current = () => {
32
+ if (!lease.current())
33
+ throw new Error(t("kiro_reconcile.changed"));
34
+ const config = deps.fleetConfig()?.instances[p.name];
35
+ if (!config || (config.backend ?? deps.fleetConfig()?.defaults?.backend) !== "kiro-cli" || config.kiro_ui !== "tui" || config.model !== p.input.model || config.working_directory !== p.input.workingDirectory
36
+ || instanceCredentialProfile(config, deps.fleetConfig()?.defaults, "kiro-cli") !== p.input.credentialProfile)
37
+ throw new Error(t("kiro_reconcile.changed"));
38
+ };
39
+ try {
40
+ if (JSON.stringify(target(deps, p.name, p.input.sessionId, p.input.archiveId)) !== JSON.stringify(p.input))
41
+ throw new Error(t("kiro_reconcile.changed"));
42
+ current();
43
+ const model = await deps.preflight(p.name, { name: p.name, workingDirectory: p.input.workingDirectory, credentialProfile: p.input.credentialProfile, classicId: p.input.sessionId });
44
+ current();
45
+ if (model !== p.input.model)
46
+ throw new Error(t("kiro_reconcile.changed"));
47
+ const result = await deps.store(p.input, p.plan, actor);
48
+ receipt = result.receipt;
49
+ current();
50
+ if (!receipt)
51
+ throw new Error(t("kiro_reconcile.changed"));
52
+ if (!p.plan.rollbackReceipt) {
53
+ await deps.restart(p.name);
54
+ current();
55
+ await deps.verify(p.name, p.input.sessionId, p.input.model, true);
56
+ current();
57
+ await deps.restart(p.name);
58
+ current();
59
+ await deps.verify(p.name, p.input.sessionId, p.input.model, true);
60
+ current();
61
+ }
62
+ return { ok: true, receipt, text: t(p.plan.rollbackReceipt ? "kiro_reconcile.rolled_back" : "kiro_reconcile.done", p.name, receipt) };
63
+ }
64
+ catch (error) {
65
+ let reason = error instanceof SyntaxError ? "Malformed reconciliation data" : error.message;
66
+ if (lease.current()) {
67
+ try {
68
+ await deps.stop(p.name);
69
+ }
70
+ catch {
71
+ reason += " " + t("kiro_migrate.stop_unconfirmed");
72
+ }
73
+ }
74
+ return { ok: false, ...(receipt ? { receipt } : {}), text: t("kiro_reconcile.failed", p.name, reason) };
75
+ }
76
+ finally {
77
+ lease.release();
78
+ }
79
+ }
80
+ //# sourceMappingURL=kiro-reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiro-reconcile.js","sourceRoot":"","sources":["../src/kiro-reconcile.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,12 @@
1
1
  import type { KiroScanRead } from "./forged-envelope-scan.js";
2
2
  export declare const KIRO_FORENSIC_MAX_BYTES: number;
3
+ /** Callers using a tiny emptiness probe must distinguish work from an unsafe file. */
4
+ export declare class KiroTuiSnapshotSizeError extends Error {
5
+ readonly path: string;
6
+ readonly maxBytes: number;
7
+ readonly actualBytes: number;
8
+ constructor(path: string, maxBytes: number, actualBytes: number);
9
+ }
3
10
  /** Refuse symlinks/devices/foreign files and read exactly the size observed at open, not an unbounded live tail. */
4
11
  export declare function snapshotKiroTuiFile(path: string, maxBytes: number): {
5
12
  text: string;
@@ -3,19 +3,33 @@
3
3
  */
4
4
  import { closeSync, constants, fstatSync, lstatSync, openSync, readSync } from "node:fs";
5
5
  import { homedir } from "node:os";
6
- import { join } from "node:path";
6
+ import { basename, join } from "node:path";
7
7
  export const KIRO_FORENSIC_MAX_BYTES = 64 * 1024 * 1024;
8
8
  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
+ /** 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
+ }
11
23
  /** Refuse symlinks/devices/foreign files and read exactly the size observed at open, not an unbounded live tail. */
12
24
  export function snapshotKiroTuiFile(path, maxBytes) {
13
25
  const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
14
26
  try {
15
27
  const before = fstatSync(fd);
16
- if (!before.isFile() || (process.getuid && before.uid !== process.getuid()) || before.size > maxBytes) {
17
- throw new Error("TUI session is not an owned regular file within the scan size limit");
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`);
18
30
  }
31
+ if (before.size > maxBytes)
32
+ throw new KiroTuiSnapshotSizeError(path, maxBytes, before.size);
19
33
  const bytes = Buffer.alloc(before.size);
20
34
  let offset = 0;
21
35
  while (offset < bytes.length) {
@@ -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
@@ -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.",
@@ -415,6 +416,14 @@ const enMessages = {
415
416
  "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.",
416
417
  "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.",
417
418
  "kiro_migrate.done_fresh": "It starts with an empty conversation.",
419
+ "kiro_reconcile.audit_failed": "Reconciliation audit log is unavailable; no changes were made.",
420
+ "kiro_reconcile.stopped_required": "Reconciliation requires a stopped TUI fleet instance with an explicit model and directory.",
421
+ "kiro_reconcile.changed": "Reconciliation evidence or instance ownership changed; request confirmation again.",
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.failed": "{0}: reconciliation did not complete: {1}. No fresh or classic fallback. Inspect the receipt before retrying.",
418
427
  "kiro_migrate.requested": "Asked in General for a fleet admin's confirmation. Nothing changes until it is confirmed.",
419
428
  "kiro_migrate.no_general": "There is no General topic to ask a fleet admin in, so the move cannot be confirmed.",
420
429
  "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}.",
@@ -1409,6 +1418,7 @@ const enMessages = {
1409
1418
  "cli.service_retry": "Check your service manager, then retry: {0}",
1410
1419
  "cli.service_direct_hint": "If the service cannot run on this host, start the fleet without it: agend fleet start --direct",
1411
1420
  "cli.service_redirect": "ℹ An AgEnD service is installed here ({0}): running `agend {1}` so the service manager owns the fleet.",
1421
+ "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.",
1412
1422
  "cli.instance_restarted": "Instance \"{0}\" restarted (immediate)",
1413
1423
  "cli.restart_failed": "Restart failed: {0}",
1414
1424
  "cli.fleet_unreachable": "Cannot connect to fleet (port {0}). Is the fleet running?",
@@ -1585,6 +1595,7 @@ const zhTWMessages = {
1585
1595
  "dashboard.start_web_ack": "✅ 你現在可以在群組裡使用 /web 了。",
1586
1596
  "web.public_login_notice": "🔐 有新的網頁登入 · 公開入口:{0}(session {1})。如果不是你,請用 /web revoke。",
1587
1597
  "office_share.all": "所有辦公室",
1598
+ "office_share.whole": "整個 fleet",
1588
1599
  "office_share.created_notice": "🏢 {0} 分享了辦公室({1}),時間 {2}:拿到連結的人都能唯讀觀看。可在 設定 → 存取與安全 撤銷。",
1589
1600
  "office_share.revoked_notice": "🏢 {0} 撤銷了辦公室分享連結({1})。",
1590
1601
  "office_share.revoked_all_notice": "🏢 {0} 撤銷了 {1} 個辦公室分享連結。",
@@ -1822,6 +1833,14 @@ const zhTWMessages = {
1822
1833
  "kiro_migrate.done_restart_failed": "⚠️ {0} 已設為 kiro 的 TUI 引擎,但重啟失敗({1});下次啟動時搬移。",
1823
1834
  "kiro_migrate.done_carry": "它第一次以 TUI 啟動時會接續經典對話 {0} 一次,並登記為它自己的對話;若那次啟動改開新對話,會在它的 topic 說明。",
1824
1835
  "kiro_migrate.done_fresh": "它會從空的對話開始。",
1836
+ "kiro_reconcile.audit_failed": "對話處理的稽核紀錄目前無法寫入,沒有進行任何變更。",
1837
+ "kiro_reconcile.stopped_required": "接續處理需要已停止的 TUI fleet agent,並明確設定模型與目錄。",
1838
+ "kiro_reconcile.changed": "接續處理的證據或 agent 擁有權已改變,請重新要求確認。",
1839
+ "kiro_reconcile.prompt": "要處理 {0} 的對話嗎?\n保留原對話:{1}\n完整封存(絕不刪除):{2}\n會保留兩份 V2 檔案、修復原對話登記、備份並移出凍結的經典副本,再以相同模型驗證兩次啟動。失敗就停止;可用收據復原到停止等待的狀態。",
1840
+ "kiro_reconcile.rollback_prompt": "要復原 {0} 的對話處理嗎?\n保留的對話 ID:{1}\n封存的對話 ID:{2}\n會復原先前的 AgEnD 登記與凍結的經典索引原始資料,並維持停止;所有 V2 檔與封存都保留,不啟動任何 agent。",
1841
+ "kiro_reconcile.done": "{0}:已接回原對話,並驗證一般重啟。封存/復原收據:{1}。兩份 V2 對話都已保留。",
1842
+ "kiro_reconcile.rolled_back": "{0}:已復原先前登記並維持停止,封存仍保留。收據:{1}。",
1843
+ "kiro_reconcile.failed": "{0}:對話處理未完成:{1}。沒有改開新對話或切回經典模式;重試前請先檢查收據。",
1825
1844
  "kiro_migrate.requested": "已在 General 請 fleet admin 確認。確認前不會有任何變更。",
1826
1845
  "kiro_migrate.no_general": "沒有 General topic 可以請 fleet admin 確認,所以無法搬移。",
1827
1846
  "kiro.engine_floor": "{0} 已經在 kiro 的 {2} 引擎上執行過,所以 AgEnD 不會用 {1} 啟動它:那會接回搬移前的舊對話副本,之後做的事全部遺失。請把 kiro_ui 改回 {2}。",
@@ -2814,6 +2833,7 @@ const zhTWMessages = {
2814
2833
  "cli.service_retry": "請檢查服務管理員後再試:{0}",
2815
2834
  "cli.service_direct_hint": "如果這台主機無法執行服務,可以不透過服務啟動 fleet:agend fleet start --direct",
2816
2835
  "cli.service_redirect": "ℹ 這台主機已安裝 AgEnD 服務({0}):改為執行 `agend {1}`,讓服務管理員管理 fleet。",
2836
+ "cli.service_redirect_notify": "⚠ 這個程序看起來是等待 READY 的 systemd unit(已設定 NOTIFY_SOCKET),但它把 fleet 交給上面的服務,自己沒有啟動 fleet 就結束了。如果這個 unit 執行的是它自己的 fleet,請在它的 ExecStart 使用 `agend fleet start --direct`。",
2817
2837
  "cli.instance_restarted": "Instance「{0}」已重新啟動(立即)",
2818
2838
  "cli.restart_failed": "重新啟動失敗:{0}",
2819
2839
  "cli.fleet_unreachable": "無法連線到 fleet(port {0})。fleet 有在執行嗎?",