@songsid/agend 2.3.2 → 2.3.3-beta.2

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 (136) hide show
  1. package/dist/agent-cli-instructions.md +2 -2
  2. package/dist/agent-whats-new.d.ts +21 -0
  3. package/dist/agent-whats-new.js +52 -23
  4. package/dist/agent-whats-new.js.map +1 -1
  5. package/dist/authority/authority-state.js +1 -1
  6. package/dist/authority/authority-state.js.map +1 -1
  7. package/dist/authority/web-authority.d.ts +9 -4
  8. package/dist/authority/web-authority.js +10 -5
  9. package/dist/authority/web-authority.js.map +1 -1
  10. package/dist/backend/claude-code.d.ts +13 -1
  11. package/dist/backend/claude-code.js +20 -1
  12. package/dist/backend/claude-code.js.map +1 -1
  13. package/dist/backend/codex-session-lookup.d.ts +16 -3
  14. package/dist/backend/codex-session-lookup.js +45 -11
  15. package/dist/backend/codex-session-lookup.js.map +1 -1
  16. package/dist/backend/kiro-reconcile-store.js +8 -1
  17. package/dist/backend/kiro-reconcile-store.js.map +1 -1
  18. package/dist/backend/kiro.d.ts +0 -5
  19. package/dist/backend/kiro.js +0 -10
  20. package/dist/backend/kiro.js.map +1 -1
  21. package/dist/backend/types.d.ts +7 -4
  22. package/dist/backend/types.js.map +1 -1
  23. package/dist/cli.js +18 -3
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config-validator.js +4 -5
  26. package/dist/config-validator.js.map +1 -1
  27. package/dist/config.js +4 -2
  28. package/dist/config.js.map +1 -1
  29. package/dist/cross-instance-envelope.d.ts +10 -5
  30. package/dist/cross-instance-envelope.js +20 -17
  31. package/dist/cross-instance-envelope.js.map +1 -1
  32. package/dist/daemon.d.ts +90 -63
  33. package/dist/daemon.js +412 -317
  34. package/dist/daemon.js.map +1 -1
  35. package/dist/daily-summary.d.ts +8 -1
  36. package/dist/daily-summary.js +8 -5
  37. package/dist/daily-summary.js.map +1 -1
  38. package/dist/delivery-outbox.d.ts +31 -22
  39. package/dist/delivery-outbox.js +119 -161
  40. package/dist/delivery-outbox.js.map +1 -1
  41. package/dist/delivery-outbox.test.js +10 -25
  42. package/dist/delivery-outbox.test.js.map +1 -1
  43. package/dist/fleet-level-config.js +1 -1
  44. package/dist/fleet-level-config.js.map +1 -1
  45. package/dist/fleet-manager.d.ts +4 -21
  46. package/dist/fleet-manager.js +38 -159
  47. package/dist/fleet-manager.js.map +1 -1
  48. package/dist/fleet-service-owner.d.ts +11 -0
  49. package/dist/fleet-service-owner.js +3 -0
  50. package/dist/fleet-service-owner.js.map +1 -0
  51. package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +1 -1
  52. package/dist/general-knowledge/skills/fleet-restart/SKILL.md +1 -1
  53. package/dist/general-knowledge/skills/session-management/SKILL.md +1 -1
  54. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +4 -5
  55. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +4 -5
  56. package/dist/instance-lifecycle.js +23 -5
  57. package/dist/instance-lifecycle.js.map +1 -1
  58. package/dist/instructions.js +6 -7
  59. package/dist/instructions.js.map +1 -1
  60. package/dist/kiro-reconcile.js +3 -3
  61. package/dist/kiro-reconcile.js.map +1 -1
  62. package/dist/locale.js +8 -52
  63. package/dist/locale.js.map +1 -1
  64. package/dist/log-service.js +1 -1
  65. package/dist/log-service.js.map +1 -1
  66. package/dist/needs-you-hub.js +4 -1
  67. package/dist/needs-you-hub.js.map +1 -1
  68. package/dist/needs-you-live.d.ts +3 -1
  69. package/dist/needs-you-live.js +24 -2
  70. package/dist/needs-you-live.js.map +1 -1
  71. package/dist/needs-you.d.ts +6 -1
  72. package/dist/needs-you.js +4 -0
  73. package/dist/needs-you.js.map +1 -1
  74. package/dist/outbound-handlers.js +1 -1
  75. package/dist/outbound-handlers.js.map +1 -1
  76. package/dist/outbound-schemas.js +1 -1
  77. package/dist/outbound-schemas.js.map +1 -1
  78. package/dist/scheduler/task-board.d.ts +17 -25
  79. package/dist/scheduler/task-board.js +29 -39
  80. package/dist/scheduler/task-board.js.map +1 -1
  81. package/dist/sd-notify.d.ts +13 -14
  82. package/dist/sd-notify.js +62 -28
  83. package/dist/sd-notify.js.map +1 -1
  84. package/dist/settings-api.d.ts +0 -1
  85. package/dist/settings-api.js +1 -14
  86. package/dist/settings-api.js.map +1 -1
  87. package/dist/settings-effect.js +0 -2
  88. package/dist/settings-effect.js.map +1 -1
  89. package/dist/setup-wizard.d.ts +3 -0
  90. package/dist/setup-wizard.js +4 -2
  91. package/dist/setup-wizard.js.map +1 -1
  92. package/dist/task-board-waker.d.ts +40 -1
  93. package/dist/task-board-waker.js +110 -9
  94. package/dist/task-board-waker.js.map +1 -1
  95. package/dist/tmux-control.d.ts +1 -1
  96. package/dist/tmux-control.js +3 -2
  97. package/dist/tmux-control.js.map +1 -1
  98. package/dist/tmux-manager.js +18 -16
  99. package/dist/tmux-manager.js.map +1 -1
  100. package/dist/tmux-read.d.ts +2 -0
  101. package/dist/tmux-read.js +7 -1
  102. package/dist/tmux-read.js.map +1 -1
  103. package/dist/topic-commands.d.ts +2 -0
  104. package/dist/topic-commands.js +2 -1
  105. package/dist/topic-commands.js.map +1 -1
  106. package/dist/transcript-monitor.js +17 -0
  107. package/dist/transcript-monitor.js.map +1 -1
  108. package/dist/types.d.ts +7 -10
  109. package/dist/ui/panel-log.js +2 -2
  110. package/dist/ui/settings-appearance.js +3 -35
  111. package/dist/ui/settings-registry.js +0 -1
  112. package/dist/ui/settings-strings.js +4 -4
  113. package/dist/ui/settings-web-authority.js +4 -3
  114. package/dist/ui/shared/app-i18n.js +2 -2
  115. package/dist/update-check.d.ts +13 -4
  116. package/dist/update-check.js +17 -4
  117. package/dist/update-check.js.map +1 -1
  118. package/dist/web-experimental.d.ts +6 -2
  119. package/dist/web-experimental.js +8 -4
  120. package/dist/web-experimental.js.map +1 -1
  121. package/dist/web-settings-patch.d.ts +0 -1
  122. package/dist/web-settings-patch.js +3 -4
  123. package/dist/web-settings-patch.js.map +1 -1
  124. package/dist/workflow-templates/default.md +2 -2
  125. package/dist/working-recovery.d.ts +0 -2
  126. package/dist/working-recovery.js +2 -23
  127. package/dist/working-recovery.js.map +1 -1
  128. package/launcher/agend-install.cjs +7 -1
  129. package/launcher/fleet-service-owner.cjs +138 -0
  130. package/package.json +1 -1
  131. package/dist/task-board-summary.d.ts +0 -101
  132. package/dist/task-board-summary.js +0 -177
  133. package/dist/task-board-summary.js.map +0 -1
  134. package/dist/upgrade-notices.d.ts +0 -17
  135. package/dist/upgrade-notices.js +0 -93
  136. package/dist/upgrade-notices.js.map +0 -1
@@ -0,0 +1,11 @@
1
+ export declare const fleetServiceOwner: {
2
+ updateRefusal(home: string, options?: {
3
+ locale?: string;
4
+ }): string | null;
5
+ restartRefusal(home: string, service: {
6
+ unit: string;
7
+ user: boolean;
8
+ }, options?: {
9
+ locale?: string;
10
+ }): string | null;
11
+ };
@@ -0,0 +1,3 @@
1
+ import { createRequire } from "node:module";
2
+ export const fleetServiceOwner = createRequire(import.meta.url)("../launcher/fleet-service-owner.cjs");
3
+ //# sourceMappingURL=fleet-service-owner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-service-owner.js","sourceRoot":"","sources":["../src/fleet-service-owner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,qCAAqC,CAGpG,CAAC"}
@@ -29,7 +29,7 @@ When an instance reports back, classify the outcome:
29
29
  - Success → Summarize key results for user. Omit internal coordination noise.
30
30
  - Partial → State what succeeded, what remains, proposed next steps.
31
31
  - Failure → Retry up to 2 times. If still failing: try alternative instance, reduce scope, or return partial result clearly marked.
32
- - No response → when a `[system:reply-overdue]` notice arrives (after 15 min by default), check `describe_instance` and `delivery_status` before asking again. If still silent: report to user with options.
32
+ - No response → check `describe_instance` and `delivery_status` before asking again (the owner is reminded on its own; you are not notified). If still silent: report to user with options.
33
33
 
34
34
  ## Shared Decisions
35
35
 
@@ -35,7 +35,7 @@ agend update --yes # from a fleet session: the installed channel's la
35
35
  agend update --version 2.2.0 --yes # a specific version
36
36
  ```
37
37
 
38
- It installs the selected release, checks the install, and restarts the fleet service. `--alpha` / `--beta` / `--stable` pick a channel; details in docs/cli.md. A beta install stays on the beta channel: to move it to the stable release (for example from a 2.3.2 beta to 2.3.2), use `agend update --stable --yes`, and only when the user asked for it.
38
+ It installs the selected release, checks the install, and restarts the fleet service. `--alpha` / `--beta` / `--stable` pick a channel; details in docs/cli.md. A beta install stays on the beta channel and keeps getting betas.
39
39
 
40
40
  **Manual restart (if update isn't needed):**
41
41
  ```bash
@@ -6,7 +6,7 @@ roles: [general]
6
6
 
7
7
  ## Auth failure (auto-pause)
8
8
 
9
- When AgEnD sees `auth_error` it **pauses** that instance (`pausePending` sticky):
9
+ When AgEnD sees `auth_error` and its token-free auth check does not vouch for the login, it **pauses** that instance (`pausePending` sticky). Auth text on the pane alone (an agent quoting a login message) changes nothing:
10
10
  - One notification **per backend** (not per instance) — log in once, same-backend peers recover.
11
11
  - Auth is **per backend**: one re-login restores every instance on that backend (claude-code, codex, kiro-cli, grok, opencode, antigravity, muse).
12
12
  - Re-login: `/login <backend>` (opencode: `opencode auth login` in a terminal), then wake the affected instance.
@@ -107,8 +107,8 @@ just **✓ Verified**, with the until-when in its tooltip, its accessible name a
107
107
  browser's messages then carry the account's authority in their delivery receipt for `max_session_hours` (default 48).
108
108
  Not me signs that browser out, also after Confirm, from the same card. At most one card waits per browser, and 3 an hour
109
109
  per account. Never for a guest. Over the admin's own named link (#2453) only with **Also over my named link**
110
- (`named_link`, off by default); over the temporary public link `/web` opens only with **Also over the temporary public
111
- link** (`quick_link`, off by default, §0.3). That authority ends with the link, and the card says "over your named link"
110
+ (`named_link`, off by default); over the temporary public link `/web` opens while **Also over the temporary public
111
+ link** is on (`quick_link`, on by default since #2819, §0.3; `quick_link: false` turns it off). That authority ends with the link, and the card says "over your named link"
112
112
  or "over the temporary public link". When a browser can't be authorized, the line says why (with a link to Settings when the switch, "Only
113
113
  this computer" or the named-link option is the reason). Settings → Access & security → **Web authority** (`web.verified_authority`, on
114
114
  by default) has the switch, **Only this computer can authorize** (`loopback_only`), **Also over my named link** (shown
@@ -194,8 +194,7 @@ A prompt shows its own answer buttons (first answer wins); a delivery has **Ackn
194
194
  "Paused: sign-in needed" has **Sign in** when the dashboard can run that login (#2233); every item has **Open chat**. **Notify me on this device** (Turn on / Turn off) gives desktop notifications while the
195
195
  tab is hidden — per browser, not on phones or plain-HTTP addresses. Config: `needs_you.live_message` (default on),
196
196
  `needs_you.dm` (default off), `needs_you.task_board` (default off: the task board's cards waiting
197
- for you — set `true` to list them). The task board's daily summary is `defaults.task_board.summary_at` (off unless set,
198
- e.g. `"09:00"`).
197
+ for you — set `true` to list them).
199
198
 
200
199
  ## Search
201
200
 
@@ -256,7 +255,7 @@ Telegram topic, and **Open chat**.
256
255
 
257
256
  **The Office guide** (`docs/office.md` in the AgEnD repository; `docs/office.zh-TW.md` in Traditional Chinese) is the one page for people: setting up offices, the
258
257
  skin-pack manifest format and its limits, Edit layout and seat reservations, bedtime, share links, agents' office and
259
- pack tools, and rolling back. Point people there for more than the summary below; it marks what is not released yet.
258
+ pack tools, and rolling back. Point people there for more than the summary below; it lists the version each feature came in.
260
259
 
261
260
  **Office** (the third view, remembered per device) draws the same fleet as a pixel office: a room per team, a desk
262
261
  per instance with a name tag, General and "Not in a team" in the **Lobby**. Each little person is its state: typing
@@ -115,8 +115,8 @@ just **✓ Verified**, with the until-when in its tooltip, its accessible name a
115
115
  browser's messages then carry the account's authority in their delivery receipt for `max_session_hours` (default 48).
116
116
  Not me signs that browser out, also after Confirm, from the same card. At most one card waits per browser, and 3 an hour
117
117
  per account. Never for a guest. Over the admin's own named link (#2453) only with **Also over my named link**
118
- (`named_link`, off by default); over the temporary public link `/web` opens only with **Also over the temporary public
119
- link** (`quick_link`, off by default, §0.3). That authority ends with the link, and the card says "over your named link"
118
+ (`named_link`, off by default); over the temporary public link `/web` opens while **Also over the temporary public
119
+ link** is on (`quick_link`, on by default since #2819, §0.3; `quick_link: false` turns it off). That authority ends with the link, and the card says "over your named link"
120
120
  or "over the temporary public link". When a browser can't be authorized, the line says why (with a link to Settings when the switch, "Only
121
121
  this computer" or the named-link option is the reason). Settings → Access & security → **Web authority** (`web.verified_authority`, on
122
122
  by default) has the switch, **Only this computer can authorize** (`loopback_only`), **Also over my named link** (shown
@@ -203,8 +203,7 @@ A prompt shows its own answer buttons (first answer wins); a delivery has **Ackn
203
203
  "Paused: sign-in needed" has **Sign in** when the dashboard can run that login (#2233); every item has **Open chat**. **Notify me on this device** (Turn on / Turn off) gives desktop notifications while the
204
204
  tab is hidden — per browser, not on phones or plain-HTTP addresses. Config: `needs_you.live_message` (default on),
205
205
  `needs_you.dm` (default off), `needs_you.task_board` (default off: the task board's cards waiting
206
- for you — set `true` to list them). The task board's daily summary is `defaults.task_board.summary_at` (off unless set,
207
- e.g. `"09:00"`).
206
+ for you — set `true` to list them).
208
207
 
209
208
  ## Search
210
209
 
@@ -267,7 +266,7 @@ Telegram topic, and **Open chat**.
267
266
 
268
267
  **The Office guide** (`docs/office.md` in the AgEnD repository; `docs/office.zh-TW.md` in Traditional Chinese) is the one page for people: setting up offices, the
269
268
  skin-pack manifest format and its limits, Edit layout and seat reservations, bedtime, share links, agents' office and
270
- pack tools, and rolling back. Point people there for more than the summary below; it marks what is not released yet.
269
+ pack tools, and rolling back. Point people there for more than the summary below; it lists the version each feature came in.
271
270
 
272
271
  **Office** (the third view, remembered per device) draws the same fleet as a pixel office: a room per team, a desk
273
272
  per instance with a name tag, General and "Not in a team" in the **Lobby**. Each little person is its state: typing
@@ -603,6 +603,22 @@ export class InstanceLifecycle {
603
603
  else
604
604
  this.ctx.reactMessageStatus(name, data.chatId, data.messageId, "failed", data.threadId);
605
605
  }, this.ctx.logger, `daemon.message_failed[${name}]`));
606
+ // #2770: a cancel dropped these before they reached the CLI. Each is marked ❌ and the person is told once, instead of
607
+ // the messages quietly ending "uncertain".
608
+ daemon.on("human_messages_cancelled", safeHandler((data) => {
609
+ const messages = Array.isArray(data?.messages) ? data.messages : [];
610
+ if (!messages.length)
611
+ return;
612
+ this.ctx.eventLog?.insert(name, "messages_cancelled", { count: messages.length });
613
+ this.ctx.logger.info({ name, count: messages.length }, "Messages dropped by a cancel before delivery — telling the person");
614
+ for (const m of messages) {
615
+ if (this.ctx.finishDeliveryStatus)
616
+ this.ctx.finishDeliveryStatus(name, m.chatId, m.messageId, "failed", m.threadId);
617
+ else
618
+ this.ctx.reactMessageStatus(name, m.chatId, m.messageId, "failed", m.threadId);
619
+ }
620
+ this.ctx.notifyInstanceTopic(name, t("delivery.cancelled_unsent", messages.length, name));
621
+ }, this.ctx.logger, `daemon.human_messages_cancelled[${name}]`));
606
622
  }
607
623
  attachIncidentHandlers(name, daemon) {
608
624
  daemon.on("capacity_nudge_cancelled", safeHandler((data) => {
@@ -931,6 +947,8 @@ export class InstanceLifecycle {
931
947
  this.ctx.notifyFleetError?.(t("fleet.dialog_answer_ignored", instancePlace(name), data.description, String(data.attempts)));
932
948
  }, this.ctx.logger, `daemon.dialog_answer_ignored[${name}]`));
933
949
  daemon.on("instance_interaction", () => this.ctx.onAttentionChanged?.(name));
950
+ // #2822: a usage-limit hold began or ended — Needs you lists it while it lasts.
951
+ daemon.on("usage_hold", () => this.ctx.onAttentionChanged?.(name));
934
952
  daemon.on("interactive_prompt", safeHandler(async (data) => {
935
953
  this.ctx.eventLog?.insert(name, "interactive_prompt", { kind: data.kind });
936
954
  this.ctx.logger.warn({ name, kind: data.kind, prompt: data.prompt }, "Instance is waiting for interactive terminal input");
@@ -1010,14 +1028,14 @@ export class InstanceLifecycle {
1010
1028
  if (data.type === "auth_error") {
1011
1029
  const verdict = authVerdict = await this.verifyAuthError(name);
1012
1030
  if (verdict === "valid") {
1013
- this.ctx.logger.info({ name, backend: this.backendOf(name) }, "auth-error pattern ignored — token-free auth check passed (likely conversation text)");
1014
- // Dropping the incident is not enough: the daemon armed its auth
1015
- // suspicion and recovery gate before emitting, and leaving those set
1016
- // would silently suppress hang notifications and MCP auto-restart for
1017
- // an instance whose credentials are demonstrably fine.
1031
+ this.ctx.logger.debug({ name, backend: this.backendOf(name) }, "auth-error pattern ignored — token-free auth check passed (likely conversation text)");
1032
+ // #2795: a pattern match armed nothing, so this only drops it. A login-screen report did arm the auth
1033
+ // suspicion, and leaving that set would suppress hang notifications and MCP auto-restart.
1018
1034
  this.daemons.get(name)?.clearSuspectedAuthFailure();
1019
1035
  return;
1020
1036
  }
1037
+ // #2795: not vouched for — only now is a pattern match an auth failure on the daemon.
1038
+ this.daemons.get(name)?.confirmAuthFailure?.();
1021
1039
  }
1022
1040
  // #2648: a kiro model error — the resumed conversation's saved model retired, or the instance's own model
1023
1041
  // unavailable. Restart once on kiro's default (no model of its own), else say it once; never on every start.