@songsid/agend 2.3.0 → 2.3.2-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +1 -1
  2. package/README.zh-TW.md +1 -1
  3. package/dist/authority/authority-state.d.ts +4 -0
  4. package/dist/authority/authority-state.js +16 -10
  5. package/dist/authority/authority-state.js.map +1 -1
  6. package/dist/authority/session-authorizations.d.ts +7 -1
  7. package/dist/authority/session-authorizations.js +6 -4
  8. package/dist/authority/session-authorizations.js.map +1 -1
  9. package/dist/authority/web-authority.d.ts +19 -6
  10. package/dist/authority/web-authority.js +22 -8
  11. package/dist/authority/web-authority.js.map +1 -1
  12. package/dist/backend/muse.d.ts +20 -2
  13. package/dist/backend/muse.js +154 -16
  14. package/dist/backend/muse.js.map +1 -1
  15. package/dist/channel/adapters/discord.d.ts +2 -0
  16. package/dist/channel/adapters/discord.js +33 -3
  17. package/dist/channel/adapters/discord.js.map +1 -1
  18. package/dist/channel/adapters/telegram.d.ts +1 -1
  19. package/dist/channel/adapters/telegram.js +3 -35
  20. package/dist/channel/adapters/telegram.js.map +1 -1
  21. package/dist/channel/mcp-tools.js +5 -5
  22. package/dist/channel/mcp-tools.js.map +1 -1
  23. package/dist/channel/types.d.ts +11 -0
  24. package/dist/cli.js +6 -3
  25. package/dist/cli.js.map +1 -1
  26. package/dist/config-validator.js +42 -5
  27. package/dist/config-validator.js.map +1 -1
  28. package/dist/daemon.d.ts +47 -3
  29. package/dist/daemon.js +380 -60
  30. package/dist/daemon.js.map +1 -1
  31. package/dist/delivery-outbox.d.ts +23 -1
  32. package/dist/delivery-outbox.js +114 -17
  33. package/dist/delivery-outbox.js.map +1 -1
  34. package/dist/doctor.d.ts +3 -0
  35. package/dist/doctor.js +9 -0
  36. package/dist/doctor.js.map +1 -1
  37. package/dist/event-log.d.ts +5 -0
  38. package/dist/event-log.js +13 -0
  39. package/dist/event-log.js.map +1 -1
  40. package/dist/fleet-context.d.ts +1 -1
  41. package/dist/fleet-lock.d.ts +6 -0
  42. package/dist/fleet-lock.js +19 -0
  43. package/dist/fleet-lock.js.map +1 -1
  44. package/dist/fleet-manager.d.ts +174 -2
  45. package/dist/fleet-manager.js +678 -68
  46. package/dist/fleet-manager.js.map +1 -1
  47. package/dist/fleet-process-handlers.d.ts +1 -0
  48. package/dist/fleet-process-handlers.js +9 -1
  49. package/dist/fleet-process-handlers.js.map +1 -1
  50. package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +11 -0
  51. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +4 -4
  52. package/dist/general-knowledge/skills/web-appearance/SKILL.md +7 -7
  53. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +109 -57
  54. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +110 -58
  55. package/dist/guest-seen-people.d.ts +38 -0
  56. package/dist/guest-seen-people.js +78 -0
  57. package/dist/guest-seen-people.js.map +1 -0
  58. package/dist/instance-config-impact.js +4 -1
  59. package/dist/instance-config-impact.js.map +1 -1
  60. package/dist/instance-lifecycle.d.ts +2 -0
  61. package/dist/instance-lifecycle.js +27 -1
  62. package/dist/instance-lifecycle.js.map +1 -1
  63. package/dist/locale.js +62 -12
  64. package/dist/locale.js.map +1 -1
  65. package/dist/log-service.js +1 -0
  66. package/dist/log-service.js.map +1 -1
  67. package/dist/mac-auto-restore.d.ts +117 -0
  68. package/dist/mac-auto-restore.js +294 -0
  69. package/dist/mac-auto-restore.js.map +1 -0
  70. package/dist/needs-you.js +1 -0
  71. package/dist/needs-you.js.map +1 -1
  72. package/dist/outbound-handlers.d.ts +2 -2
  73. package/dist/outbound-handlers.js +5 -5
  74. package/dist/outbound-handlers.js.map +1 -1
  75. package/dist/outbound-schemas.d.ts +2 -0
  76. package/dist/outbound-schemas.js +2 -0
  77. package/dist/outbound-schemas.js.map +1 -1
  78. package/dist/public-web-gateway.js +9 -1
  79. package/dist/public-web-gateway.js.map +1 -1
  80. package/dist/search/search-index.d.ts +10 -2
  81. package/dist/search/search-index.js +17 -4
  82. package/dist/search/search-index.js.map +1 -1
  83. package/dist/service-installer.d.ts +23 -1
  84. package/dist/service-installer.js +40 -11
  85. package/dist/service-installer.js.map +1 -1
  86. package/dist/session-oom-stop.d.ts +45 -0
  87. package/dist/session-oom-stop.js +259 -0
  88. package/dist/session-oom-stop.js.map +1 -0
  89. package/dist/session-oom.d.ts +13 -0
  90. package/dist/session-oom.js +119 -7
  91. package/dist/session-oom.js.map +1 -1
  92. package/dist/settings-api.d.ts +27 -1
  93. package/dist/settings-api.js +108 -2
  94. package/dist/settings-api.js.map +1 -1
  95. package/dist/settings-change.js +37 -3
  96. package/dist/settings-change.js.map +1 -1
  97. package/dist/settings-effect.js +5 -2
  98. package/dist/settings-effect.js.map +1 -1
  99. package/dist/spawn-gate.d.ts +2 -0
  100. package/dist/spawn-gate.js +17 -4
  101. package/dist/spawn-gate.js.map +1 -1
  102. package/dist/start-attempt.d.ts +15 -1
  103. package/dist/start-attempt.js +35 -5
  104. package/dist/start-attempt.js.map +1 -1
  105. package/dist/start-failure-chat.d.ts +41 -0
  106. package/dist/start-failure-chat.js +159 -0
  107. package/dist/start-failure-chat.js.map +1 -0
  108. package/dist/start-failure-notice.d.ts +4 -0
  109. package/dist/start-failure-notice.js +8 -0
  110. package/dist/start-failure-notice.js.map +1 -1
  111. package/dist/start-failure.d.ts +49 -0
  112. package/dist/start-failure.js +141 -1
  113. package/dist/start-failure.js.map +1 -1
  114. package/dist/telegram-api-root.d.ts +1 -0
  115. package/dist/telegram-api-root.js +40 -0
  116. package/dist/telegram-api-root.js.map +1 -0
  117. package/dist/turn-reply-guard.d.ts +25 -0
  118. package/dist/turn-reply-guard.js +111 -12
  119. package/dist/turn-reply-guard.js.map +1 -1
  120. package/dist/types.d.ts +21 -3
  121. package/dist/ui/backend-signin.js +5 -2
  122. package/dist/ui/chat-ambient.js +1 -1
  123. package/dist/ui/chat-effects.js +4 -4
  124. package/dist/ui/chat-render.js +5 -2
  125. package/dist/ui/chat-strings.js +2 -2
  126. package/dist/ui/chat-thread.js +2 -2
  127. package/dist/ui/first-run.js +2 -2
  128. package/dist/ui/fleet-canvas-view.js +114 -0
  129. package/dist/ui/fleet-canvas.js +15 -77
  130. package/dist/ui/fleet-office-editor.js +80 -5
  131. package/dist/ui/fleet-office-layout.js +197 -0
  132. package/dist/ui/fleet-office-model.js +6 -3
  133. package/dist/ui/fleet-office-pack.d.ts +39 -0
  134. package/dist/ui/fleet-office-pack.js +240 -29
  135. package/dist/ui/fleet-office-skin.js +130 -21
  136. package/dist/ui/fleet-office-store.js +75 -4
  137. package/dist/ui/fleet-office-view.js +154 -0
  138. package/dist/ui/fleet-office-zones.js +95 -33
  139. package/dist/ui/fleet-office.js +530 -94
  140. package/dist/ui/fleet-usage.js +7 -6
  141. package/dist/ui/panel-chat.js +20 -7
  142. package/dist/ui/panel-details.js +2 -2
  143. package/dist/ui/panel-fleet.js +11 -77
  144. package/dist/ui/panel-log.js +5 -5
  145. package/dist/ui/panel-settings.js +586 -164
  146. package/dist/ui/search-dialog.js +26 -7
  147. package/dist/ui/settings-appearance.js +82 -29
  148. package/dist/ui/settings-apply.js +42 -7
  149. package/dist/ui/settings-dialogs.js +68 -22
  150. package/dist/ui/settings-draft.js +51 -0
  151. package/dist/ui/settings-guests.js +244 -78
  152. package/dist/ui/settings-learn.js +2 -2
  153. package/dist/ui/settings-model.js +2 -0
  154. package/dist/ui/settings-registry.js +142 -0
  155. package/dist/ui/settings-strings.js +108 -44
  156. package/dist/ui/settings-web-authority.js +34 -23
  157. package/dist/ui/shared/app-i18n.js +14 -0
  158. package/dist/ui/shared/app-nav.js +10 -5
  159. package/dist/ui/shared/app-prefs.js +80 -2
  160. package/dist/ui/shared/app-route.js +39 -5
  161. package/dist/ui/shared/app-shell.js +80 -8
  162. package/dist/ui/shared/app-stream.js +2 -1
  163. package/dist/ui/shared/app.css +251 -20
  164. package/dist/ui/shared/app.js +3 -0
  165. package/dist/ui/shared/effect-stock-trust.js +1 -1
  166. package/dist/ui/shared/identity-color.js +4 -4
  167. package/dist/ui/shared/signin.js +2 -2
  168. package/dist/ui/shared/ui-dialog.js +6 -1
  169. package/dist/ui/shared/ui-icons.js +2 -0
  170. package/dist/ui/shared/usage-dialog.js +21 -11
  171. package/dist/ui/shared/view-strings.js +2 -0
  172. package/dist/ui/shared/web-authorize.js +13 -12
  173. package/dist/web-api.d.ts +9 -3
  174. package/dist/web-api.js +161 -6
  175. package/dist/web-api.js.map +1 -1
  176. package/dist/web-auth.js +7 -1
  177. package/dist/web-auth.js.map +1 -1
  178. package/dist/web-experimental.d.ts +1 -1
  179. package/dist/web-experimental.js +1 -1
  180. package/dist/web-experimental.js.map +1 -1
  181. package/dist/web-mod-agent.js +2 -2
  182. package/dist/web-mod-agent.js.map +1 -1
  183. package/dist/web-office-skins.d.ts +108 -0
  184. package/dist/web-office-skins.js +298 -0
  185. package/dist/web-office-skins.js.map +1 -0
  186. package/dist/web-office-store.d.ts +8 -2
  187. package/dist/web-office-store.js +37 -7
  188. package/dist/web-office-store.js.map +1 -1
  189. package/dist/web-settings-patch.d.ts +6 -0
  190. package/dist/web-settings-patch.js +61 -4
  191. package/dist/web-settings-patch.js.map +1 -1
  192. package/dist/web-shell-routes.d.ts +4 -2
  193. package/dist/web-shell-routes.js +17 -7
  194. package/dist/web-shell-routes.js.map +1 -1
  195. package/dist/working-recovery.d.ts +104 -0
  196. package/dist/working-recovery.js +263 -0
  197. package/dist/working-recovery.js.map +1 -0
  198. package/dist/working-state-journal.d.ts +70 -0
  199. package/dist/working-state-journal.js +106 -0
  200. package/dist/working-state-journal.js.map +1 -0
  201. package/package.json +1 -1
@@ -0,0 +1,263 @@
1
+ import { createHash } from "node:crypto";
2
+ export const WORKING_RECOVERY_KIND = "working_recovery";
3
+ export const RECOVERY_STABLE_MS = 120_000;
4
+ export const RECOVERY_NORMAL_MS = 30_000;
5
+ export const RECOVERY_PACE_MS = 5_000;
6
+ const digest = (value) => createHash("sha256").update(JSON.stringify(value)).digest("hex");
7
+ export function buildWorkingRecoveryPrompt(tasks, cause, advisory) {
8
+ const ids = tasks.filter(r => r.kind === "task").slice(0, 16).map(r => r.id);
9
+ return `[system:working-recovery] Interrupted work; observed cause: unknown interruption${cause === "unknown_interruption" ? "" : `; prior requested action: ${cause}`}. `
10
+ + (advisory ? "Advisory: background state is unknown. " : "")
11
+ + `Task references: ${JSON.stringify(ids)}. Inspect existing jobs, processes, worktrees, receipts and each current card first. `
12
+ + "Continue only unfinished work still assigned to you, then report normally. Never restart a command or re-send a delegation blindly; do not replay the original request. "
13
+ + "This is one informational continuation for this work episode.";
14
+ }
15
+ /** Work identity, not boot identity: another failed boot must not create another prompt. */
16
+ export function recoveryKey(instance, snapshot) {
17
+ return digest([instance, snapshot.observation.configuration, snapshot.observation.sessionId,
18
+ snapshot.observation.turn, snapshot.observation.recoveryDeliveryId ?? null,
19
+ [...snapshot.references].sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b)))]);
20
+ }
21
+ /** Stage 3 owns task-only episodes. The legacy turn/obligation owners remain intact until stage 4. */
22
+ export function decideWorkingRecovery(episode, live, enabled, card) {
23
+ if (!enabled)
24
+ return { outcome: "deferred", reason: "opted_out" };
25
+ const snapshot = episode.snapshot, previous = snapshot.observation;
26
+ if (previous.turn?.cancelled || previous.turn?.completionDelivered)
27
+ return { outcome: "excluded", reason: "turn_terminal" };
28
+ if (!live)
29
+ return { outcome: "deferred", reason: "not_running" };
30
+ if (live.stopped)
31
+ return { outcome: "excluded", reason: "session_oom_stopped" };
32
+ if (live.cancelled)
33
+ return { outcome: "excluded", reason: "cancelled" };
34
+ if (previous.configuration !== live.configuration)
35
+ return { outcome: "excluded", reason: "configuration_changed" };
36
+ if (!previous.sessionId || !live.sessionId)
37
+ return { outcome: "deferred", reason: "session_unknown" };
38
+ if (live.freshChoice)
39
+ return { outcome: "excluded", reason: "fresh_session_choice" };
40
+ if (previous.sessionId !== live.sessionId && !live.crashLoopFresh)
41
+ return { outcome: "excluded", reason: "session_changed" };
42
+ if (live.legacyPending)
43
+ return { outcome: "deferred", reason: "legacy_pending" };
44
+ if (previous.turn || live.legacyCovered || snapshot.references.some(r => r.kind === "owed")) {
45
+ return { outcome: "excluded", reason: "legacy_owned" };
46
+ }
47
+ if (snapshot.unavailable.length || snapshot.totalReferences > snapshot.references.length)
48
+ return { outcome: "deferred", reason: "references_incomplete" };
49
+ const tasks = [];
50
+ for (const ref of snapshot.references) {
51
+ if (ref.kind !== "task")
52
+ continue; // waiting on another agent never authorizes a resend
53
+ const current = card(ref.id);
54
+ if (current === null)
55
+ return { outcome: "deferred", reason: "task_store_unavailable" };
56
+ if (!current || current.assignee !== episode.instance || ["done", "cancelled", "open"].includes(current.status))
57
+ continue;
58
+ if (current.status !== "claimed")
59
+ return { outcome: "deferred", reason: "task_waiting" };
60
+ if (current.version !== ref.version)
61
+ return { outcome: "excluded", reason: "task_changed" };
62
+ tasks.push(ref);
63
+ }
64
+ if (!tasks.length)
65
+ return { outcome: "excluded", reason: "no_unfinished_task" };
66
+ if (live.nativeWork)
67
+ return { outcome: "excluded", reason: "native_reengaged" };
68
+ if (live.paused || !live.idle)
69
+ return { outcome: "deferred", reason: "not_idle" };
70
+ if (live.background === true)
71
+ return { outcome: "deferred", reason: "background_running" };
72
+ return { outcome: "ready", tasks, advisory: live.background === null };
73
+ }
74
+ /** Authoritative recovery state on the SAME SQLite connection as the outbox. */
75
+ export class WorkingRecoveryStore {
76
+ db;
77
+ constructor(db) {
78
+ this.db = db;
79
+ db.exec(`CREATE TABLE IF NOT EXISTS working_recovery_episodes (
80
+ instance_name TEXT PRIMARY KEY, episode_key TEXT NOT NULL, episode_group TEXT NOT NULL,
81
+ snapshot_json TEXT NOT NULL CHECK(length(CAST(snapshot_json AS BLOB))<=8192),
82
+ outcome TEXT NOT NULL, reason TEXT NOT NULL, delivery_id TEXT
83
+ );
84
+ CREATE TABLE IF NOT EXISTS working_recovery_receipts (episode_key TEXT PRIMARY KEY, outcome TEXT NOT NULL, reason TEXT NOT NULL);
85
+ CREATE TABLE IF NOT EXISTS working_recovery_run (singleton INTEGER PRIMARY KEY CHECK(singleton=1),
86
+ boot_id TEXT NOT NULL, pid INTEGER NOT NULL, started_at INTEGER NOT NULL, requested_cause TEXT);
87
+ CREATE TABLE IF NOT EXISTS working_recovery_summaries (episode_group TEXT PRIMARY KEY);
88
+ CREATE TABLE IF NOT EXISTS working_recovery_cancellations (instance_name TEXT PRIMARY KEY, configuration TEXT NOT NULL, session_id TEXT);`);
89
+ }
90
+ beginRun(bootId, pid, now) {
91
+ return this.db.transaction(() => {
92
+ const previous = this.db.prepare("SELECT boot_id,requested_cause FROM working_recovery_run WHERE singleton=1").get();
93
+ if (previous?.boot_id === bootId)
94
+ return "unknown_interruption";
95
+ this.db.prepare("INSERT OR REPLACE INTO working_recovery_run VALUES(1,?,?,?,NULL)").run(bootId, pid, now);
96
+ return previous?.requested_cause === "manual_restart" || previous?.requested_cause === "update" ? previous.requested_cause : "unknown_interruption";
97
+ })();
98
+ }
99
+ requested(bootId, cause) {
100
+ this.db.prepare("UPDATE working_recovery_run SET requested_cause=? WHERE singleton=1 AND boot_id=?").run(cause, bootId);
101
+ }
102
+ clearRequested(bootId) {
103
+ this.db.prepare("UPDATE working_recovery_run SET requested_cause=NULL WHERE singleton=1 AND boot_id=?").run(bootId);
104
+ }
105
+ cancel(instance, configuration, sessionId) {
106
+ this.db.prepare("INSERT OR REPLACE INTO working_recovery_cancellations VALUES(?,?,?)").run(instance, configuration, sessionId);
107
+ }
108
+ cancelled(instance, snapshot) {
109
+ const row = this.db.prepare("SELECT configuration,session_id FROM working_recovery_cancellations WHERE instance_name=?").get(instance);
110
+ return !!row && row.configuration === snapshot.observation.configuration && row.session_id === snapshot.observation.sessionId;
111
+ }
112
+ discover(instance, snapshot) {
113
+ const key = recoveryKey(instance, snapshot);
114
+ this.db.transaction(() => {
115
+ const receipt = this.db.prepare("SELECT outcome,reason FROM working_recovery_receipts WHERE episode_key=?").get(key);
116
+ const current = this.get(instance);
117
+ if (current?.key === key)
118
+ return;
119
+ // An admitted/uncertain delivery is owned by the outbox, never replaced by a new candidate.
120
+ if (current?.outcome === "admitted" && current.deliveryId) {
121
+ const delivery = this.db.prepare("SELECT state FROM deliveries WHERE delivery_id=?").get(current.deliveryId);
122
+ if (!delivery || !["delivered", "failed", "cancelled"].includes(delivery.state))
123
+ return;
124
+ }
125
+ this.db.prepare(`INSERT OR REPLACE INTO working_recovery_episodes VALUES(?,?,?,?,?,?,NULL)`)
126
+ .run(instance, key, snapshot.managerBootId, JSON.stringify(snapshot), receipt?.outcome ?? "deferred", receipt?.reason ?? "awaiting_stability");
127
+ })();
128
+ }
129
+ get(instance) {
130
+ const row = this.db.prepare("SELECT * FROM working_recovery_episodes WHERE instance_name=?").get(instance);
131
+ return row ? { instance: row.instance_name, key: row.episode_key, group: row.episode_group, snapshot: JSON.parse(row.snapshot_json),
132
+ outcome: row.outcome, reason: row.reason, deliveryId: row.delivery_id } : null;
133
+ }
134
+ list() {
135
+ return this.db.prepare("SELECT instance_name FROM working_recovery_episodes ORDER BY instance_name").all().map(r => this.get(r.instance_name));
136
+ }
137
+ clearPrior(episode) {
138
+ this.db.prepare("UPDATE working_state_journal SET prior_json=NULL WHERE instance_name=? AND prior_json=?")
139
+ .run(episode.instance, JSON.stringify(episode.snapshot));
140
+ }
141
+ decision(episode, outcome, reason) {
142
+ const before = this.get(episode.instance);
143
+ if (before?.key !== episode.key || before.outcome === "admitted"
144
+ || before.outcome === outcome && before.reason === reason)
145
+ return;
146
+ this.db.transaction(() => {
147
+ const current = this.get(episode.instance);
148
+ if (current?.key !== episode.key || current.outcome === "admitted")
149
+ return;
150
+ this.db.prepare("UPDATE working_recovery_episodes SET outcome=?,reason=? WHERE instance_name=? AND episode_key=?").run(outcome, reason, episode.instance, episode.key);
151
+ if (outcome === "excluded") {
152
+ this.db.prepare("INSERT OR IGNORE INTO working_recovery_receipts VALUES(?,?,?)").run(episode.key, outcome, reason);
153
+ this.clearPrior(episode);
154
+ }
155
+ })();
156
+ }
157
+ /** The delivery admission and episode receipt commit together, or neither does. */
158
+ admit(episode, insert, advisory = false) {
159
+ return this.db.transaction(() => {
160
+ const current = this.get(episode.instance);
161
+ if (current?.key !== episode.key || current.outcome !== "deferred")
162
+ return false;
163
+ if (this.db.prepare("SELECT 1 FROM working_recovery_receipts WHERE episode_key=?").get(episode.key))
164
+ return false;
165
+ const deliveryId = insert();
166
+ this.db.prepare("UPDATE working_recovery_episodes SET outcome='admitted',reason=?,delivery_id=? WHERE instance_name=? AND episode_key=?")
167
+ .run(advisory ? "advisory_background_unknown" : "outbox_owned", deliveryId, episode.instance, episode.key);
168
+ this.db.prepare("INSERT INTO working_recovery_receipts VALUES(?,'admitted',?)")
169
+ .run(episode.key, advisory ? "advisory_background_unknown" : "outbox_owned");
170
+ this.clearPrior(episode);
171
+ return true;
172
+ })();
173
+ }
174
+ summary(group, insert) {
175
+ return this.db.transaction(() => {
176
+ if (this.db.prepare("SELECT 1 FROM working_recovery_summaries WHERE episode_group=?").get(group))
177
+ return false;
178
+ insert();
179
+ this.db.prepare("INSERT INTO working_recovery_summaries VALUES(?)").run(group);
180
+ return true;
181
+ })();
182
+ }
183
+ }
184
+ /** No spawn or native probes. Missing prerequisites leave the durable candidate deferred. */
185
+ export class WorkingRecoveryCoordinator {
186
+ deps;
187
+ readyAt = null;
188
+ normalAt = null;
189
+ lastAdmittedAt = Number.NEGATIVE_INFINITY;
190
+ lastDispatchedAt = Number.NEGATIVE_INFINITY;
191
+ dispatchOwner = null;
192
+ constructor(deps) {
193
+ this.deps = deps;
194
+ }
195
+ ready() { this.readyAt = this.deps.now(); this.normalAt = null; }
196
+ reset() { this.readyAt = null; this.normalAt = null; }
197
+ stable() {
198
+ const now = this.deps.now(), p = this.deps.pressure();
199
+ if (!this.deps.active() || this.deps.storm() || p.level !== "normal" || p.sampledAt === null || p.recovering) {
200
+ this.normalAt = null;
201
+ return false;
202
+ }
203
+ this.normalAt ??= now;
204
+ return this.readyAt !== null && now - this.readyAt >= RECOVERY_STABLE_MS && now - this.normalAt >= RECOVERY_NORMAL_MS;
205
+ }
206
+ verdict(episode) {
207
+ if (this.deps.store.cancelled(episode.instance, episode.snapshot))
208
+ return { outcome: "excluded", reason: "cancelled" };
209
+ return decideWorkingRecovery(episode, this.deps.live(episode.instance), this.deps.enabled(episode.instance), this.deps.card);
210
+ }
211
+ tick() {
212
+ if (!this.stable())
213
+ return;
214
+ for (const row of this.deps.store.list()) {
215
+ if (row.outcome !== "deferred")
216
+ continue;
217
+ const verdict = this.verdict(row);
218
+ if (verdict.outcome !== "ready") {
219
+ this.deps.store.decision(row, verdict.outcome, verdict.reason);
220
+ if (row.reason !== verdict.reason || row.outcome !== verdict.outcome)
221
+ this.deps.log(row, verdict.outcome, verdict.reason);
222
+ continue;
223
+ }
224
+ if (!this.deps.laneFree(row.instance) || this.deps.now() - this.lastAdmittedAt < RECOVERY_PACE_MS)
225
+ continue;
226
+ if (this.deps.admit(row, verdict.tasks, verdict.advisory)) {
227
+ this.lastAdmittedAt = this.deps.now();
228
+ this.deps.log(row, "admitted", verdict.advisory ? "advisory_background_unknown" : "outbox_owned");
229
+ }
230
+ }
231
+ const rows = this.deps.store.list();
232
+ for (const group of new Set(rows.map(row => row.group))) {
233
+ const members = rows.filter(row => row.group === group);
234
+ // Finish the paced admission sweep before the single summary, so every
235
+ // advisory admission in that sweep is named, rather than only its first row.
236
+ if (members.some(row => row.outcome === "deferred" && this.verdict(row).outcome === "ready"))
237
+ continue;
238
+ this.deps.summary(group, members);
239
+ }
240
+ }
241
+ /** Called again by the local pane writer, including after every awaited prerequisite. */
242
+ accepts(instance, key) {
243
+ if (!this.stable())
244
+ return false;
245
+ const row = this.deps.store.get(instance);
246
+ return !!row && row.key === key && row.outcome === "admitted" && this.verdict(row).outcome === "ready";
247
+ }
248
+ /** Recovered queued rows also pass this physical-write pace, independently of admission. */
249
+ canDispatch(instance, key) {
250
+ return this.dispatchOwner === null && this.deps.now() - this.lastDispatchedAt >= RECOVERY_PACE_MS
251
+ && this.accepts(instance, key);
252
+ }
253
+ reserveDispatch(instance, key) {
254
+ if (!this.canDispatch(instance, key))
255
+ return null;
256
+ const owner = { instance, key };
257
+ this.dispatchOwner = owner;
258
+ this.lastDispatchedAt = this.deps.now();
259
+ return () => { if (this.dispatchOwner === owner)
260
+ this.dispatchOwner = null; };
261
+ }
262
+ }
263
+ //# sourceMappingURL=working-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-recovery.js","sourceRoot":"","sources":["../src/working-recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import type Database from "better-sqlite3";
2
+ /** Metadata only. Stage 1 observes; these records never authorize a resume. */
3
+ export declare const WORKING_STATE_MAX_BYTES: number;
4
+ export declare const WORKING_STATE_MAX_REFS = 16;
5
+ export type WorkingStateReason = "published" | "execution" | "background" | "turn_started" | "turn_closed" | "completion_delivered" | "cancelled" | "before_stop" | "before_spawn" | "process" | "supervision_ended" | "tasks" | "obligations";
6
+ export interface WorkingStateOwner {
7
+ bootId: string;
8
+ spawnGeneration: number;
9
+ launchAttempt: number;
10
+ launchFenceEpoch: number;
11
+ }
12
+ export interface WorkingStateTurn {
13
+ generation: number;
14
+ deliveryId: string | null;
15
+ correlationId: string | null;
16
+ messageId: string | null;
17
+ cancelled: boolean;
18
+ completionDelivered: boolean;
19
+ }
20
+ export interface WorkingStateObservation {
21
+ owner: WorkingStateOwner;
22
+ backend: string;
23
+ /** A digest, never a raw workspace/profile or transcript path. */
24
+ configuration: string;
25
+ executionState: "idle" | "working" | "stuck" | "paused" | null;
26
+ processStatus: "running" | "crashed" | "stopped";
27
+ backgroundWork: boolean | null;
28
+ turn: WorkingStateTurn | null;
29
+ /** No generic getSessionId discovery is allowed on this observation path. */
30
+ sessionId: string | null;
31
+ backendTurnId: null;
32
+ /** A confirmed local continuation starts a demonstrably resumed work interval. */
33
+ recoveryDeliveryId?: string;
34
+ }
35
+ export type WorkingStateReference = {
36
+ kind: "task";
37
+ id: string;
38
+ version: number;
39
+ status: "claimed" | "blocked" | "review";
40
+ } | {
41
+ kind: "owed" | "waiting";
42
+ correlationId: string;
43
+ requester: string;
44
+ owner: string;
45
+ deliveryId: string;
46
+ };
47
+ export interface WorkingStateSnapshot {
48
+ version: 1;
49
+ managerBootId: string;
50
+ observedAt: number;
51
+ lastActivityAt: number | null;
52
+ reason: WorkingStateReason;
53
+ observation: WorkingStateObservation;
54
+ references: WorkingStateReference[];
55
+ totalReferences: number;
56
+ unavailable: Array<"tasks" | "obligations">;
57
+ }
58
+ export interface WorkingStateEntry {
59
+ instance: string;
60
+ revision: number;
61
+ current: WorkingStateSnapshot;
62
+ prior: WorkingStateSnapshot | null;
63
+ }
64
+ /** Two bounded snapshots per instance: latest, plus first unconsumed interruption. */
65
+ export declare class WorkingStateJournal {
66
+ private readonly db;
67
+ constructor(db: Database.Database);
68
+ get(instance: string): WorkingStateEntry | undefined;
69
+ observe(instance: string, input: WorkingStateSnapshot): WorkingStateEntry | null;
70
+ }
@@ -0,0 +1,106 @@
1
+ /** Metadata only. Stage 1 observes; these records never authorize a resume. */
2
+ export const WORKING_STATE_MAX_BYTES = 8 * 1024;
3
+ export const WORKING_STATE_MAX_REFS = 16;
4
+ const reasons = new Set(["published", "execution", "background", "turn_started", "turn_closed", "completion_delivered", "cancelled", "before_stop", "before_spawn", "process", "supervision_ended", "tasks", "obligations"]);
5
+ const id = (v) => typeof v === "string" && v.length > 0 && Buffer.byteLength(v) <= 256 && !/[\u0000-\u001f\u007f]/.test(v);
6
+ const integer = (v) => Number.isSafeInteger(v) && v >= 0;
7
+ /** Whitelist every field: callers cannot accidentally persist a pane/config/message. */
8
+ function bounded(input) {
9
+ const o = input.observation, owner = o.owner, turn = o.turn;
10
+ if (!id(input.managerBootId) || !reasons.has(input.reason) || !Number.isFinite(input.observedAt)
11
+ || !id(owner.bootId) || ![owner.spawnGeneration, owner.launchAttempt, owner.launchFenceEpoch].every(integer)
12
+ || !id(o.backend) || !/^[a-f0-9]{64}$/.test(o.configuration)
13
+ || ![null, "idle", "working", "stuck", "paused"].includes(o.executionState)
14
+ || !["running", "crashed", "stopped"].includes(o.processStatus))
15
+ throw new Error("Invalid working-state observation");
16
+ const refs = [];
17
+ for (const ref of input.references.slice(0, WORKING_STATE_MAX_REFS)) {
18
+ if (ref.kind === "task" && id(ref.id) && integer(ref.version) && ["claimed", "blocked", "review"].includes(ref.status)) {
19
+ refs.push({ kind: "task", id: ref.id, version: ref.version, status: ref.status });
20
+ }
21
+ else if ((ref.kind === "owed" || ref.kind === "waiting") && [ref.correlationId, ref.requester, ref.owner, ref.deliveryId].every(id)) {
22
+ refs.push({ kind: ref.kind, correlationId: ref.correlationId, requester: ref.requester, owner: ref.owner, deliveryId: ref.deliveryId });
23
+ }
24
+ }
25
+ const value = {
26
+ version: 1, managerBootId: input.managerBootId, observedAt: input.observedAt, reason: input.reason,
27
+ lastActivityAt: typeof input.lastActivityAt === "number" && Number.isFinite(input.lastActivityAt) ? input.lastActivityAt : null,
28
+ observation: {
29
+ owner: { bootId: owner.bootId, spawnGeneration: owner.spawnGeneration, launchAttempt: owner.launchAttempt, launchFenceEpoch: owner.launchFenceEpoch },
30
+ backend: o.backend, configuration: o.configuration, executionState: o.executionState, processStatus: o.processStatus,
31
+ backgroundWork: typeof o.backgroundWork === "boolean" ? o.backgroundWork : null,
32
+ turn: turn && integer(turn.generation) ? { generation: turn.generation,
33
+ deliveryId: id(turn.deliveryId) ? turn.deliveryId : null, correlationId: id(turn.correlationId) ? turn.correlationId : null,
34
+ messageId: id(turn.messageId) ? turn.messageId : null, cancelled: turn.cancelled === true, completionDelivered: turn.completionDelivered === true } : null,
35
+ sessionId: id(o.sessionId) ? o.sessionId : null, backendTurnId: null,
36
+ ...(id(o.recoveryDeliveryId) ? { recoveryDeliveryId: o.recoveryDeliveryId } : {}),
37
+ },
38
+ references: refs, totalReferences: Math.max(integer(input.totalReferences) ? input.totalReferences : 0, input.references.length),
39
+ unavailable: ["tasks", "obligations"].filter(x => input.unavailable.includes(x)),
40
+ };
41
+ while (Buffer.byteLength(JSON.stringify(value)) > WORKING_STATE_MAX_BYTES && value.references.length)
42
+ value.references.pop();
43
+ if (Buffer.byteLength(JSON.stringify(value)) > WORKING_STATE_MAX_BYTES)
44
+ throw new Error("Working-state observation exceeds its byte budget");
45
+ return value;
46
+ }
47
+ function notable(s) {
48
+ const turn = s.observation.turn;
49
+ return s.totalReferences > 0 || s.observation.backgroundWork === true || (!!turn && !turn.cancelled && !turn.completionDelivered)
50
+ || (s.observation.executionState === "working" && !turn?.cancelled && !turn?.completionDelivered);
51
+ }
52
+ /** Two bounded snapshots per instance: latest, plus first unconsumed interruption. */
53
+ export class WorkingStateJournal {
54
+ db;
55
+ constructor(db) {
56
+ this.db = db;
57
+ db.exec(`CREATE TABLE IF NOT EXISTS working_state_journal (
58
+ instance_name TEXT PRIMARY KEY, revision INTEGER NOT NULL,
59
+ current_json TEXT NOT NULL CHECK(length(CAST(current_json AS BLOB)) <= 8192),
60
+ prior_json TEXT CHECK(prior_json IS NULL OR length(CAST(prior_json AS BLOB)) <= 8192)
61
+ )`);
62
+ }
63
+ get(instance) {
64
+ const row = this.db.prepare("SELECT revision,current_json,prior_json FROM working_state_journal WHERE instance_name=?").get(instance);
65
+ if (!row)
66
+ return undefined;
67
+ return { instance, revision: row.revision, current: JSON.parse(row.current_json), prior: row.prior_json ? JSON.parse(row.prior_json) : null };
68
+ }
69
+ observe(instance, input) {
70
+ if (!id(instance))
71
+ throw new Error("Invalid working-state instance");
72
+ let snapshot = bounded(input);
73
+ return this.db.transaction(() => {
74
+ const previous = this.get(instance);
75
+ // A confirmed continuation identifies work, not a CLI generation. A
76
+ // replacement may temporarily lack session ownership; recover the marker
77
+ // only after it proves the same configuration/session, never for a fresh one.
78
+ if (!snapshot.observation.recoveryDeliveryId && snapshot.observation.sessionId) {
79
+ const matching = [previous?.current, previous?.prior].find(s => s?.observation.recoveryDeliveryId
80
+ && s.observation.configuration === snapshot.observation.configuration
81
+ && s.observation.sessionId === snapshot.observation.sessionId);
82
+ if (matching) {
83
+ snapshot.observation.recoveryDeliveryId = matching.observation.recoveryDeliveryId;
84
+ snapshot = bounded(snapshot); // The inherited metadata must also fit the byte budget.
85
+ }
86
+ }
87
+ // Exact heartbeats do not write or emit. The caller observes changes, not polling.
88
+ const comparable = (s) => JSON.stringify({ ...s, observedAt: 0, reason: "observation" });
89
+ const boundary = snapshot.reason === "before_stop" || snapshot.reason === "before_spawn";
90
+ if (previous && comparable(previous.current) === comparable(snapshot)
91
+ && !(boundary && previous.current.reason !== snapshot.reason))
92
+ return null;
93
+ let prior = previous?.prior ?? null;
94
+ if (!prior && previous?.current.managerBootId !== snapshot.managerBootId && previous && notable(previous.current))
95
+ prior = previous.current;
96
+ if (!prior && boundary && notable(snapshot))
97
+ prior = snapshot;
98
+ const revision = (previous?.revision ?? 0) + 1;
99
+ this.db.prepare(`INSERT INTO working_state_journal(instance_name,revision,current_json,prior_json) VALUES(?,?,?,?)
100
+ ON CONFLICT(instance_name) DO UPDATE SET revision=excluded.revision,current_json=excluded.current_json,prior_json=excluded.prior_json`)
101
+ .run(instance, revision, JSON.stringify(snapshot), prior ? JSON.stringify(prior) : null);
102
+ return { instance, revision, current: snapshot, prior };
103
+ })();
104
+ }
105
+ }
106
+ //# sourceMappingURL=working-state-journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-state-journal.js","sourceRoot":"","sources":["../src/working-state-journal.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@songsid/agend",
3
- "version": "2.3.0",
3
+ "version": "2.3.2-beta.1",
4
4
  "description": "Multi-agent fleet daemon — run coding CLIs (Claude, Muse, Codex, OpenCode) from Discord or Telegram",
5
5
  "type": "module",
6
6
  "bin": {