@decibelsystems/tools 3.0.0 → 3.1.0

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 (253) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/dist/agentCommands.d.ts +0 -1
  3. package/dist/agentCommands.d.ts.map +1 -1
  4. package/dist/agentCommands.js +19 -8
  5. package/dist/agentCommands.js.map +1 -1
  6. package/dist/agentPresence.d.ts +5 -3
  7. package/dist/agentPresence.d.ts.map +1 -1
  8. package/dist/agentPresence.js +20 -29
  9. package/dist/agentPresence.js.map +1 -1
  10. package/dist/architectAdrs.d.ts +13 -1
  11. package/dist/architectAdrs.d.ts.map +1 -1
  12. package/dist/architectAdrs.js +83 -1
  13. package/dist/architectAdrs.js.map +1 -1
  14. package/dist/artifacts.d.ts +60 -0
  15. package/dist/artifacts.d.ts.map +1 -0
  16. package/dist/artifacts.js +208 -0
  17. package/dist/artifacts.js.map +1 -0
  18. package/dist/asks.d.ts +93 -0
  19. package/dist/asks.d.ts.map +1 -0
  20. package/dist/asks.js +383 -0
  21. package/dist/asks.js.map +1 -0
  22. package/dist/chat.d.ts +47 -0
  23. package/dist/chat.d.ts.map +1 -0
  24. package/dist/chat.js +288 -0
  25. package/dist/chat.js.map +1 -0
  26. package/dist/daemon.d.ts +14 -3
  27. package/dist/daemon.d.ts.map +1 -1
  28. package/dist/daemon.js +44 -14
  29. package/dist/daemon.js.map +1 -1
  30. package/dist/daemonConfig.d.ts +22 -0
  31. package/dist/daemonConfig.d.ts.map +1 -1
  32. package/dist/daemonConfig.js +11 -0
  33. package/dist/daemonConfig.js.map +1 -1
  34. package/dist/domain/issue.d.ts +19 -15
  35. package/dist/domain/issue.d.ts.map +1 -1
  36. package/dist/domain/issue.js +4 -32
  37. package/dist/domain/issue.js.map +1 -1
  38. package/dist/domain/issueCodec.d.ts.map +1 -1
  39. package/dist/domain/issueCodec.js +10 -0
  40. package/dist/domain/issueCodec.js.map +1 -1
  41. package/dist/domain/issueRepository.d.ts +35 -2
  42. package/dist/domain/issueRepository.d.ts.map +1 -1
  43. package/dist/domain/issueRepository.js +40 -1
  44. package/dist/domain/issueRepository.js.map +1 -1
  45. package/dist/domain/uid.d.ts +16 -0
  46. package/dist/domain/uid.d.ts.map +1 -0
  47. package/dist/domain/uid.js +43 -0
  48. package/dist/domain/uid.js.map +1 -0
  49. package/dist/facades/definitions.d.ts.map +1 -1
  50. package/dist/facades/definitions.js +46 -3
  51. package/dist/facades/definitions.js.map +1 -1
  52. package/dist/hq/defineAgent.d.ts.map +1 -1
  53. package/dist/hq/defineAgent.js +7 -11
  54. package/dist/hq/defineAgent.js.map +1 -1
  55. package/dist/httpServer.d.ts.map +1 -1
  56. package/dist/httpServer.js +201 -48
  57. package/dist/httpServer.js.map +1 -1
  58. package/dist/identity.d.ts +123 -0
  59. package/dist/identity.d.ts.map +1 -0
  60. package/dist/identity.js +312 -0
  61. package/dist/identity.js.map +1 -0
  62. package/dist/kernel.d.ts.map +1 -1
  63. package/dist/kernel.js +24 -1
  64. package/dist/kernel.js.map +1 -1
  65. package/dist/killSwitch.d.ts +117 -0
  66. package/dist/killSwitch.d.ts.map +1 -0
  67. package/dist/killSwitch.js +161 -0
  68. package/dist/killSwitch.js.map +1 -0
  69. package/dist/lib/atomicWrite.d.ts +23 -0
  70. package/dist/lib/atomicWrite.d.ts.map +1 -1
  71. package/dist/lib/atomicWrite.js +84 -0
  72. package/dist/lib/atomicWrite.js.map +1 -1
  73. package/dist/lib/recordIdAllocator.d.ts +21 -5
  74. package/dist/lib/recordIdAllocator.d.ts.map +1 -1
  75. package/dist/lib/recordIdAllocator.js +25 -7
  76. package/dist/lib/recordIdAllocator.js.map +1 -1
  77. package/dist/orgId.d.ts +23 -0
  78. package/dist/orgId.d.ts.map +1 -0
  79. package/dist/orgId.js +73 -0
  80. package/dist/orgId.js.map +1 -0
  81. package/dist/pairCli.d.ts +2 -0
  82. package/dist/pairCli.d.ts.map +1 -0
  83. package/dist/pairCli.js +97 -0
  84. package/dist/pairCli.js.map +1 -0
  85. package/dist/peerBroker.d.ts +40 -0
  86. package/dist/peerBroker.d.ts.map +1 -0
  87. package/dist/peerBroker.js +70 -0
  88. package/dist/peerBroker.js.map +1 -0
  89. package/dist/peerBrokerSupervisor.d.ts +21 -0
  90. package/dist/peerBrokerSupervisor.d.ts.map +1 -0
  91. package/dist/peerBrokerSupervisor.js +131 -0
  92. package/dist/peerBrokerSupervisor.js.map +1 -0
  93. package/dist/projectPaths.d.ts.map +1 -1
  94. package/dist/projectPaths.js +1 -19
  95. package/dist/projectPaths.js.map +1 -1
  96. package/dist/projectRegistry.d.ts +22 -0
  97. package/dist/projectRegistry.d.ts.map +1 -1
  98. package/dist/projectRegistry.js +58 -2
  99. package/dist/projectRegistry.js.map +1 -1
  100. package/dist/pty/boundary.d.ts +39 -0
  101. package/dist/pty/boundary.d.ts.map +1 -0
  102. package/dist/pty/boundary.js +100 -0
  103. package/dist/pty/boundary.js.map +1 -0
  104. package/dist/pty/errors.d.ts +6 -0
  105. package/dist/pty/errors.d.ts.map +1 -0
  106. package/dist/pty/errors.js +12 -0
  107. package/dist/pty/errors.js.map +1 -0
  108. package/dist/pty/fleet.d.ts +159 -0
  109. package/dist/pty/fleet.d.ts.map +1 -0
  110. package/dist/pty/fleet.js +543 -0
  111. package/dist/pty/fleet.js.map +1 -0
  112. package/dist/pty/launchProfile.d.ts +45 -0
  113. package/dist/pty/launchProfile.d.ts.map +1 -0
  114. package/dist/pty/launchProfile.js +149 -0
  115. package/dist/pty/launchProfile.js.map +1 -0
  116. package/dist/pty/openTerminal.d.ts +48 -0
  117. package/dist/pty/openTerminal.d.ts.map +1 -0
  118. package/dist/pty/openTerminal.js +185 -0
  119. package/dist/pty/openTerminal.js.map +1 -0
  120. package/dist/pty/pairDialog.d.ts +16 -0
  121. package/dist/pty/pairDialog.d.ts.map +1 -0
  122. package/dist/pty/pairDialog.js +121 -0
  123. package/dist/pty/pairDialog.js.map +1 -0
  124. package/dist/pty/pairing.d.ts +86 -0
  125. package/dist/pty/pairing.d.ts.map +1 -0
  126. package/dist/pty/pairing.js +351 -0
  127. package/dist/pty/pairing.js.map +1 -0
  128. package/dist/pty/routes.d.ts +49 -0
  129. package/dist/pty/routes.d.ts.map +1 -0
  130. package/dist/pty/routes.js +624 -0
  131. package/dist/pty/routes.js.map +1 -0
  132. package/dist/pty/sessions.d.ts +167 -0
  133. package/dist/pty/sessions.d.ts.map +1 -0
  134. package/dist/pty/sessions.js +513 -0
  135. package/dist/pty/sessions.js.map +1 -0
  136. package/dist/pty/tmux.d.ts +109 -0
  137. package/dist/pty/tmux.d.ts.map +1 -0
  138. package/dist/pty/tmux.js +271 -0
  139. package/dist/pty/tmux.js.map +1 -0
  140. package/dist/roster.d.ts +37 -0
  141. package/dist/roster.d.ts.map +1 -0
  142. package/dist/roster.js +126 -0
  143. package/dist/roster.js.map +1 -0
  144. package/dist/runtime/daemonMeta.d.ts +53 -0
  145. package/dist/runtime/daemonMeta.d.ts.map +1 -0
  146. package/dist/runtime/daemonMeta.js +121 -0
  147. package/dist/runtime/daemonMeta.js.map +1 -0
  148. package/dist/runtime/ensureRuntime.d.ts.map +1 -1
  149. package/dist/runtime/ensureRuntime.js +5 -10
  150. package/dist/runtime/ensureRuntime.js.map +1 -1
  151. package/dist/sentinelIssues.d.ts +16 -0
  152. package/dist/sentinelIssues.d.ts.map +1 -1
  153. package/dist/sentinelIssues.js +42 -1
  154. package/dist/sentinelIssues.js.map +1 -1
  155. package/dist/server.js +66 -5
  156. package/dist/server.js.map +1 -1
  157. package/dist/toolConfig.d.ts.map +1 -1
  158. package/dist/toolConfig.js +12 -0
  159. package/dist/toolConfig.js.map +1 -1
  160. package/dist/tools/agentic/agentQueue.d.ts.map +1 -1
  161. package/dist/tools/agentic/agentQueue.js +4 -0
  162. package/dist/tools/agentic/agentQueue.js.map +1 -1
  163. package/dist/tools/architect/index.d.ts +1 -0
  164. package/dist/tools/architect/index.d.ts.map +1 -1
  165. package/dist/tools/architect/index.js +45 -1
  166. package/dist/tools/architect/index.js.map +1 -1
  167. package/dist/tools/architect.d.ts.map +1 -1
  168. package/dist/tools/architect.js +59 -8
  169. package/dist/tools/architect.js.map +1 -1
  170. package/dist/tools/artifacts.d.ts +5 -0
  171. package/dist/tools/artifacts.d.ts.map +1 -0
  172. package/dist/tools/artifacts.js +89 -0
  173. package/dist/tools/artifacts.js.map +1 -0
  174. package/dist/tools/asks.d.ts +6 -0
  175. package/dist/tools/asks.d.ts.map +1 -0
  176. package/dist/tools/asks.js +104 -0
  177. package/dist/tools/asks.js.map +1 -0
  178. package/dist/tools/coordinator/index.d.ts +1 -0
  179. package/dist/tools/coordinator/index.d.ts.map +1 -1
  180. package/dist/tools/coordinator/index.js +42 -2
  181. package/dist/tools/coordinator/index.js.map +1 -1
  182. package/dist/tools/data-inspector.d.ts +1 -1
  183. package/dist/tools/data-inspector.d.ts.map +1 -1
  184. package/dist/tools/data-inspector.js +1 -1
  185. package/dist/tools/data-inspector.js.map +1 -1
  186. package/dist/tools/dojo/index.d.ts.map +1 -1
  187. package/dist/tools/dojo/index.js +52 -3
  188. package/dist/tools/dojo/index.js.map +1 -1
  189. package/dist/tools/dojo.d.ts +62 -1
  190. package/dist/tools/dojo.d.ts.map +1 -1
  191. package/dist/tools/dojo.js +84 -1
  192. package/dist/tools/dojo.js.map +1 -1
  193. package/dist/tools/guardian.d.ts +7 -0
  194. package/dist/tools/guardian.d.ts.map +1 -1
  195. package/dist/tools/guardian.js +146 -9
  196. package/dist/tools/guardian.js.map +1 -1
  197. package/dist/tools/index.d.ts.map +1 -1
  198. package/dist/tools/index.js +6 -0
  199. package/dist/tools/index.js.map +1 -1
  200. package/dist/tools/killswitch/index.d.ts +13 -0
  201. package/dist/tools/killswitch/index.d.ts.map +1 -0
  202. package/dist/tools/killswitch/index.js +138 -0
  203. package/dist/tools/killswitch/index.js.map +1 -0
  204. package/dist/tools/oracle/index.d.ts.map +1 -1
  205. package/dist/tools/oracle/index.js +8 -0
  206. package/dist/tools/oracle/index.js.map +1 -1
  207. package/dist/tools/oracle.d.ts +7 -0
  208. package/dist/tools/oracle.d.ts.map +1 -1
  209. package/dist/tools/oracle.js +22 -6
  210. package/dist/tools/oracle.js.map +1 -1
  211. package/dist/tools/provenance.d.ts +11 -2
  212. package/dist/tools/provenance.d.ts.map +1 -1
  213. package/dist/tools/provenance.js +26 -24
  214. package/dist/tools/provenance.js.map +1 -1
  215. package/dist/tools/registry/index.d.ts.map +1 -1
  216. package/dist/tools/registry/index.js +24 -0
  217. package/dist/tools/registry/index.js.map +1 -1
  218. package/dist/tools/sentinel/index.d.ts.map +1 -1
  219. package/dist/tools/sentinel/index.js +54 -2
  220. package/dist/tools/sentinel/index.js.map +1 -1
  221. package/dist/tools/sentinel.d.ts +50 -0
  222. package/dist/tools/sentinel.d.ts.map +1 -1
  223. package/dist/tools/sentinel.js +72 -7
  224. package/dist/tools/sentinel.js.map +1 -1
  225. package/dist/tools/shared/runTracker.d.ts +2 -0
  226. package/dist/tools/shared/runTracker.d.ts.map +1 -1
  227. package/dist/tools/shared/runTracker.js +38 -0
  228. package/dist/tools/shared/runTracker.js.map +1 -1
  229. package/dist/tools/swarm.d.ts +3 -1
  230. package/dist/tools/swarm.d.ts.map +1 -1
  231. package/dist/tools/swarm.js +6 -12
  232. package/dist/tools/swarm.js.map +1 -1
  233. package/dist/tools/voice/index.d.ts +1 -0
  234. package/dist/tools/voice/index.d.ts.map +1 -1
  235. package/dist/tools/voice/index.js +33 -2
  236. package/dist/tools/voice/index.js.map +1 -1
  237. package/dist/tools/voice.d.ts +48 -1
  238. package/dist/tools/voice.d.ts.map +1 -1
  239. package/dist/tools/voice.js +63 -3
  240. package/dist/tools/voice.js.map +1 -1
  241. package/dist/transports/bridge.d.ts.map +1 -1
  242. package/dist/transports/bridge.js +2 -1
  243. package/dist/transports/bridge.js.map +1 -1
  244. package/dist/transports/mcp.d.ts.map +1 -1
  245. package/dist/transports/mcp.js +2 -1
  246. package/dist/transports/mcp.js.map +1 -1
  247. package/dist/version.d.ts +5 -0
  248. package/dist/version.d.ts.map +1 -0
  249. package/dist/version.js +23 -0
  250. package/dist/version.js.map +1 -0
  251. package/package.json +13 -2
  252. package/templates/AGENT.md +3 -0
  253. package/templates/CLAUDE-decibel.md +11 -0
@@ -0,0 +1,543 @@
1
+ // ============================================================================
2
+ // Fleet ledger and restore (decibel-hq ADR-0018 D1, D2, D5)
3
+ // ============================================================================
4
+ // Claude Code keeps ~/.claude/sessions/<pid>.json for every live session and
5
+ // deletes it on exit. A 30 s sweep reads those files and records each live CLI
6
+ // session in ~/.decibel/fleet/ledger.json, so "yesterday's fleet" is the
7
+ // daemon's own record, never whatever happens to be on disk in the morning.
8
+ //
9
+ // Rules that are easy to break:
10
+ //
11
+ // * Only `<pid>.json` is read. Each has a sibling `<pid>.<hash>.key` that is
12
+ // never read, logged or shipped (pinned by a test).
13
+ // * Live = ps still lists the pid AND its start time equals `procStart`.
14
+ // procStart is `ps -o lstart` in UTC and the C locale; comparing against
15
+ // local time would call every live session stale. A stale file left by a
16
+ // crash or hard reboot fails the check.
17
+ // * A row records SPANS of sightings, not one first..last interval. A
18
+ // session resumed today keeps its uuid; one interval from yesterday to now
19
+ // would bridge the overnight gap and merge yesterday's fleet into today's.
20
+ // * "Last fleet" = the most recent CLOSED work period (nothing live in it)
21
+ // plus the current open period. Opening one claude by hand in the morning
22
+ // must not hide yesterday's six.
23
+ // * Restore accepts only uuids in the ledger, and never one that is live:
24
+ // one transcript, one writer.
25
+ // ============================================================================
26
+ import { execFile } from 'child_process';
27
+ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync } from 'fs';
28
+ import { homedir } from 'os';
29
+ import { join } from 'path';
30
+ import { log } from '../config.js';
31
+ import { SessionError } from './errors.js';
32
+ import { cleanEnv } from './tmux.js';
33
+ import { loadLaunchProfile, defaultProfile } from './launchProfile.js';
34
+ import { availableProjects, projectForPath, isUuid, resolveClaude, spawnSession, } from './sessions.js';
35
+ export const SWEEP_MS = 30_000;
36
+ const PERSIST_EVERY_MS = 5 * 60_000;
37
+ const RETAIN_MS = 14 * 24 * 3600_000;
38
+ /** Sightings closer than this join one span (a daemon restart or slow sweep). */
39
+ const SPAN_JOIN_MS = 3 * SWEEP_MS;
40
+ const MAX_SPANS = 20;
41
+ /** A just-restored session is not in ~/.claude/sessions until claude is up. */
42
+ const RESTORE_GRACE_MS = 2 * 60_000;
43
+ const RESTORE_STAGGER_MS = 250;
44
+ const MAX_RESTORE_IDS = 50;
45
+ // ----------------------------------------------------------------------------
46
+ // Reading Claude Code's session files
47
+ // ----------------------------------------------------------------------------
48
+ const SESSION_FILE_RE = /^\d+\.json$/;
49
+ export function defaultSessionsDir() {
50
+ return process.env.DECIBEL_CLAUDE_SESSIONS_DIR || join(homedir(), '.claude', 'sessions');
51
+ }
52
+ export function defaultFleetDir() {
53
+ return process.env.DECIBEL_FLEET_DIR || join(homedir(), '.decibel', 'fleet');
54
+ }
55
+ /**
56
+ * Every `<pid>.json` in the directory. A file that does not parse is skipped
57
+ * (Claude may be mid-write). A file that parses but lacks sessionId, cwd,
58
+ * procStart or pid is shape drift: reported, never guessed around.
59
+ */
60
+ export function readSessionFiles(dir) {
61
+ if (!existsSync(dir))
62
+ return { files: [] };
63
+ const files = [];
64
+ let drift;
65
+ for (const entry of readdirSync(dir)) {
66
+ if (!SESSION_FILE_RE.test(entry))
67
+ continue;
68
+ let raw;
69
+ try {
70
+ raw = JSON.parse(readFileSync(join(dir, entry), 'utf-8'));
71
+ }
72
+ catch {
73
+ continue;
74
+ }
75
+ const o = raw;
76
+ if (!o || typeof o !== 'object' || typeof o.pid !== 'number' || !isUuid(o.sessionId) ||
77
+ typeof o.cwd !== 'string' || typeof o.procStart !== 'string') {
78
+ drift ??= `${entry} lacks pid, sessionId, cwd or procStart`;
79
+ continue;
80
+ }
81
+ files.push({
82
+ pid: o.pid,
83
+ sessionId: o.sessionId,
84
+ cwd: o.cwd,
85
+ procStart: o.procStart,
86
+ kind: typeof o.kind === 'string' ? o.kind : undefined,
87
+ entrypoint: typeof o.entrypoint === 'string' ? o.entrypoint : undefined,
88
+ name: typeof o.name === 'string' ? o.name : undefined,
89
+ nameSource: typeof o.nameSource === 'string' ? o.nameSource : undefined,
90
+ });
91
+ }
92
+ return { files, drift };
93
+ }
94
+ const squash = (s) => s.trim().replace(/\s+/g, ' ');
95
+ /** `ps` start times for the pids still running, as procStart writes them. */
96
+ export function psProcStarts(pids) {
97
+ const out = new Map();
98
+ if (!pids.length)
99
+ return Promise.resolve(out);
100
+ return new Promise((resolve) => {
101
+ // ps exits 1 when some pid is gone and still prints the rest.
102
+ execFile('ps', ['-o', 'pid=,lstart=', '-p', pids.join(',')], { env: { ...process.env, LC_ALL: 'C', TZ: 'UTC' }, timeout: 5000 }, (_err, stdout) => {
103
+ for (const line of String(stdout ?? '').split('\n')) {
104
+ const m = line.match(/^\s*(\d+)\s+(.+)$/);
105
+ if (m)
106
+ out.set(Number(m[1]), squash(m[2]));
107
+ }
108
+ resolve(out);
109
+ });
110
+ });
111
+ }
112
+ /**
113
+ * Merge every row's spans into work periods: a gap longer than gapMs with
114
+ * nothing seen splits them. A live row's last span runs to now and marks its
115
+ * period live.
116
+ */
117
+ export function workPeriods(ledger, live, gapMs, now) {
118
+ const spans = [];
119
+ for (const [id, row] of Object.entries(ledger.sessions)) {
120
+ row.spans.forEach((s, i) => {
121
+ const isLive = live.has(id) && i === row.spans.length - 1;
122
+ spans.push({ id, from: Date.parse(s.from), to: isLive ? now : Date.parse(s.to), live: isLive });
123
+ });
124
+ }
125
+ spans.sort((a, b) => a.from - b.from);
126
+ const clusters = [];
127
+ for (const s of spans) {
128
+ const cur = clusters[clusters.length - 1];
129
+ if (cur && s.from <= cur.end + gapMs) {
130
+ cur.end = Math.max(cur.end, s.to);
131
+ cur.live ||= s.live;
132
+ cur.ids.add(s.id);
133
+ }
134
+ else {
135
+ clusters.push({ start: s.from, end: s.to, live: s.live, ids: new Set([s.id]) });
136
+ }
137
+ }
138
+ return clusters;
139
+ }
140
+ /**
141
+ * Which rows are pre-selected. Claude derives names as `<dir>-<2 hex>`, unique
142
+ * per session, so a derived name groups by project: one session per repo is
143
+ * the morning pattern, and a /clear or a quick second claude must not double
144
+ * it. A name Ben set himself keeps its own group. The newest row in a group is
145
+ * selected, unless that newest row is live (the repo is already open).
146
+ */
147
+ function groupKey(row) {
148
+ return row.name && row.name_source && row.name_source !== 'derived' ? `${row.project_id}\0${row.name}` : row.project_id;
149
+ }
150
+ // ----------------------------------------------------------------------------
151
+ // The fleet
152
+ // ----------------------------------------------------------------------------
153
+ function emptyLedger() {
154
+ return { version: 1, sessions: {}, restored_periods: {} };
155
+ }
156
+ export class Fleet {
157
+ ledger = null;
158
+ live = new Set();
159
+ status = 'ok';
160
+ reason;
161
+ lastPersist = 0;
162
+ dirty = false;
163
+ sweeping = null;
164
+ recentlyRestored = new Map();
165
+ d;
166
+ constructor(deps = {}) {
167
+ this.d = {
168
+ sessionsDir: deps.sessionsDir ?? defaultSessionsDir,
169
+ fleetDir: deps.fleetDir ?? defaultFleetDir,
170
+ projects: deps.projects ?? availableProjects,
171
+ procStarts: deps.procStarts ?? psProcStarts,
172
+ spawn: deps.spawn ?? ((projectId, resume, cwd) => spawnSession({ project_id: projectId, resume }, { cwd })),
173
+ profile: deps.profile ?? loadLaunchProfile,
174
+ now: deps.now ?? Date.now,
175
+ stagger: deps.stagger ?? ((ms) => new Promise((r) => setTimeout(r, ms))),
176
+ };
177
+ }
178
+ ledgerPath() {
179
+ return join(this.d.fleetDir(), 'ledger.json');
180
+ }
181
+ load() {
182
+ if (this.ledger)
183
+ return this.ledger;
184
+ const path = this.ledgerPath();
185
+ try {
186
+ if (existsSync(path)) {
187
+ const v = JSON.parse(readFileSync(path, 'utf-8'));
188
+ if (v && v.version === 1 && v.sessions && typeof v.sessions === 'object') {
189
+ v.restored_periods ??= {};
190
+ return (this.ledger = v);
191
+ }
192
+ }
193
+ }
194
+ catch (err) {
195
+ // Keep the bad file for inspection; never silently overwrite history.
196
+ const aside = `${path}.corrupt-${this.d.now()}`;
197
+ try {
198
+ renameSync(path, aside);
199
+ }
200
+ catch {
201
+ /* already gone */
202
+ }
203
+ log(`Fleet: ledger unreadable (${err instanceof Error ? err.message : String(err)}); moved to ${aside}`);
204
+ }
205
+ return (this.ledger = emptyLedger());
206
+ }
207
+ /** Write the ledger atomically (tmp + rename). */
208
+ persist() {
209
+ if (!this.ledger)
210
+ return;
211
+ const dir = this.d.fleetDir();
212
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
213
+ const path = this.ledgerPath();
214
+ const tmp = `${path}.${process.pid}.tmp`;
215
+ writeFileSync(tmp, JSON.stringify(this.ledger, null, 2), { mode: 0o600 });
216
+ renameSync(tmp, path);
217
+ this.lastPersist = this.d.now();
218
+ this.dirty = false;
219
+ }
220
+ /** One sweep. Concurrent callers share the one in flight. */
221
+ sweep() {
222
+ this.sweeping ??= this.doSweep().finally(() => {
223
+ this.sweeping = null;
224
+ });
225
+ return this.sweeping;
226
+ }
227
+ async doSweep() {
228
+ const ledger = this.load();
229
+ const { files, drift } = readSessionFiles(this.d.sessionsDir());
230
+ if (drift) {
231
+ if (this.status !== 'unavailable')
232
+ log(`Fleet: session file shape changed (${drift}); fleet unavailable`);
233
+ this.status = 'unavailable';
234
+ this.reason = `Claude Code session files changed shape: ${drift}`;
235
+ this.live = new Set();
236
+ return;
237
+ }
238
+ if (this.reason?.startsWith('Claude Code session files')) {
239
+ this.status = 'ok';
240
+ this.reason = undefined;
241
+ }
242
+ const projects = this.d.projects();
243
+ const candidates = [];
244
+ for (const f of files) {
245
+ if (f.kind !== 'interactive' || f.entrypoint !== 'cli')
246
+ continue;
247
+ const project = projectForPath(f.cwd, projects);
248
+ if (project)
249
+ candidates.push({ f, project });
250
+ }
251
+ const starts = await this.d.procStarts(candidates.map((c) => c.f.pid));
252
+ const now = this.d.now();
253
+ const nowIso = new Date(now).toISOString();
254
+ const nextLive = new Set();
255
+ for (const { f, project } of candidates) {
256
+ const started = starts.get(f.pid);
257
+ if (started === undefined || squash(started) !== squash(f.procStart))
258
+ continue;
259
+ nextLive.add(f.sessionId);
260
+ let row = ledger.sessions[f.sessionId];
261
+ if (!row) {
262
+ row = ledger.sessions[f.sessionId] = {
263
+ project_id: project.id, cwd: f.cwd, kind: f.kind, entrypoint: f.entrypoint,
264
+ first_seen: nowIso, last_seen: nowIso, spans: [],
265
+ };
266
+ this.dirty = true;
267
+ }
268
+ row.project_id = project.id;
269
+ row.cwd = f.cwd;
270
+ if (f.name)
271
+ row.name = f.name;
272
+ if (f.nameSource)
273
+ row.name_source = f.nameSource;
274
+ row.last_seen = nowIso;
275
+ const last = row.spans[row.spans.length - 1];
276
+ if (last && now - Date.parse(last.to) <= SPAN_JOIN_MS)
277
+ last.to = nowIso;
278
+ else {
279
+ row.spans.push({ from: nowIso, to: nowIso });
280
+ if (row.spans.length > MAX_SPANS)
281
+ row.spans.splice(0, row.spans.length - MAX_SPANS);
282
+ this.dirty = true;
283
+ }
284
+ }
285
+ // Retention.
286
+ for (const [id, row] of Object.entries(ledger.sessions)) {
287
+ if (now - Date.parse(row.last_seen) > RETAIN_MS) {
288
+ delete ledger.sessions[id];
289
+ this.dirty = true;
290
+ }
291
+ }
292
+ for (const [start, at] of Object.entries(ledger.restored_periods)) {
293
+ if (now - Date.parse(at) > RETAIN_MS)
294
+ delete ledger.restored_periods[start];
295
+ }
296
+ const changed = nextLive.size !== this.live.size || [...nextLive].some((id) => !this.live.has(id));
297
+ this.live = nextLive;
298
+ if (changed || this.dirty || now - this.lastPersist >= PERSIST_EVERY_MS) {
299
+ try {
300
+ this.persist();
301
+ }
302
+ catch (err) {
303
+ log(`Fleet: could not write the ledger: ${err instanceof Error ? err.message : String(err)}`);
304
+ }
305
+ }
306
+ }
307
+ /** Mark the fleet unavailable from outside (the start-up contract check). */
308
+ markUnavailable(reason) {
309
+ this.status = 'unavailable';
310
+ this.reason = reason;
311
+ }
312
+ liveIds() {
313
+ return new Set(this.live);
314
+ }
315
+ gapHours() {
316
+ try {
317
+ return this.d.profile().period_gap_hours;
318
+ }
319
+ catch {
320
+ return defaultProfile().period_gap_hours;
321
+ }
322
+ }
323
+ /** GET /sessions/last-fleet. Computed at read time from the ledger. */
324
+ lastFleet() {
325
+ const gapHours = this.gapHours();
326
+ const base = { status: this.status, period_gap_hours: gapHours, sessions: [] };
327
+ if (this.status === 'unavailable')
328
+ return { ...base, reason: this.reason };
329
+ const ledger = this.load();
330
+ const now = this.d.now();
331
+ const clusters = workPeriods(ledger, this.live, gapHours * 3600_000, now);
332
+ const lastCluster = clusters[clusters.length - 1];
333
+ const open = lastCluster?.live ? lastCluster : undefined;
334
+ const closed = [...clusters].reverse().find((c) => !c.live);
335
+ const out = { ...base };
336
+ if (closed) {
337
+ const start = new Date(closed.start).toISOString();
338
+ out.closed_period = { start, end: new Date(closed.end).toISOString() };
339
+ const restoredAt = ledger.restored_periods[start];
340
+ if (restoredAt)
341
+ out.closed_period.restored_at = restoredAt;
342
+ }
343
+ if (open)
344
+ out.open_period = { start: new Date(open.start).toISOString() };
345
+ const ids = new Set([...(closed?.ids ?? []), ...(open?.ids ?? [])]);
346
+ const rows = [];
347
+ for (const id of ids) {
348
+ const r = ledger.sessions[id];
349
+ if (!r)
350
+ continue;
351
+ rows.push({
352
+ claude_session_id: id,
353
+ project_id: r.project_id,
354
+ cwd: r.cwd,
355
+ ...(r.name ? { name: r.name } : {}),
356
+ first_seen: r.first_seen,
357
+ last_seen: r.last_seen,
358
+ period: open?.ids.has(id) ? 'open' : 'closed',
359
+ live: this.live.has(id),
360
+ default_selected: false,
361
+ });
362
+ }
363
+ const newest = new Map();
364
+ for (const row of rows) {
365
+ const key = groupKey(ledger.sessions[row.claude_session_id]);
366
+ const cur = newest.get(key);
367
+ if (!cur || row.last_seen > cur.last_seen)
368
+ newest.set(key, row);
369
+ }
370
+ for (const row of newest.values())
371
+ if (!row.live)
372
+ row.default_selected = true;
373
+ rows.sort((a, b) => a.project_id.localeCompare(b.project_id) || b.last_seen.localeCompare(a.last_seen));
374
+ out.sessions = rows;
375
+ return out;
376
+ }
377
+ /**
378
+ * POST /sessions/restore. With no ids, the default-selected rows. Sweeps
379
+ * first, so "live" is current rather than up to 30 s old.
380
+ */
381
+ async restore(sessionIds) {
382
+ if (sessionIds !== undefined &&
383
+ (!Array.isArray(sessionIds) || sessionIds.length > MAX_RESTORE_IDS || !sessionIds.every(isUuid))) {
384
+ throw new SessionError(400, 'BAD_REQUEST', `session_ids must be a list of at most ${MAX_RESTORE_IDS} Claude session uuids.`);
385
+ }
386
+ await this.sweep();
387
+ if (this.status === 'unavailable') {
388
+ throw new SessionError(503, 'FLEET_UNAVAILABLE', this.reason ?? 'The fleet ledger is unavailable.');
389
+ }
390
+ const fleet = this.lastFleet();
391
+ const ids = [...new Set(sessionIds ?? fleet.sessions.filter((r) => r.default_selected).map((r) => r.claude_session_id))];
392
+ return { results: await this.restoreIds(ids, fleet) };
393
+ }
394
+ async restoreIds(ids, fleet) {
395
+ const ledger = this.load();
396
+ const now = this.d.now();
397
+ for (const [id, at] of this.recentlyRestored)
398
+ if (now - at > RESTORE_GRACE_MS)
399
+ this.recentlyRestored.delete(id);
400
+ const closedIds = new Set(fleet.sessions.filter((r) => r.period === 'closed').map((r) => r.claude_session_id));
401
+ let restoredFromClosed = false;
402
+ let slot = 0;
403
+ const results = await Promise.all(ids.map(async (id) => {
404
+ const row = ledger.sessions[id];
405
+ if (!row)
406
+ return { claude_session_id: id, status: 'failed', code: 'NOT_IN_LEDGER', error: 'This session was never recorded by the daemon.' };
407
+ const base = { claude_session_id: id, project_id: row.project_id };
408
+ if (this.live.has(id) || this.recentlyRestored.has(id))
409
+ return { ...base, status: 'skipped_live' };
410
+ this.recentlyRestored.set(id, now);
411
+ await this.d.stagger(RESTORE_STAGGER_MS * slot++);
412
+ try {
413
+ const r = await this.d.spawn(row.project_id, id, row.cwd);
414
+ if (closedIds.has(id))
415
+ restoredFromClosed = true;
416
+ const out = { ...base, status: r.needs_attention ? 'needs_attention' : 'restored', session_key: r.session_key, attach_argv: r.attach_argv };
417
+ if (r.needs_attention)
418
+ Object.assign(out, r.needs_attention);
419
+ return out;
420
+ }
421
+ catch (err) {
422
+ this.recentlyRestored.delete(id);
423
+ if (err instanceof SessionError)
424
+ return { ...base, status: 'failed', code: err.code, error: err.message };
425
+ log(`Fleet: restoring ${id} failed: ${err instanceof Error ? err.message : String(err)}`);
426
+ return { ...base, status: 'failed', code: 'SPAWN_FAILED', error: 'internal error' };
427
+ }
428
+ }));
429
+ if (restoredFromClosed && fleet.closed_period) {
430
+ ledger.restored_periods[fleet.closed_period.start] = new Date(this.d.now()).toISOString();
431
+ try {
432
+ this.persist();
433
+ }
434
+ catch (err) {
435
+ log(`Fleet: could not write the ledger: ${err instanceof Error ? err.message : String(err)}`);
436
+ }
437
+ }
438
+ const n = results.filter((r) => r.status === 'restored' || r.status === 'needs_attention').length;
439
+ if (ids.length)
440
+ log(`Fleet: restore of ${ids.length} session(s): ${n} started`);
441
+ return results;
442
+ }
443
+ /**
444
+ * restore_on_start (D5). Only when nothing is live (a daemon restarted
445
+ * mid-day must not drop yesterday's sessions on top of today's), and each
446
+ * closed period at most once: restored_at is written BEFORE spawning, so a
447
+ * daemon that crash-loops does not restore again.
448
+ */
449
+ async restoreOnStart() {
450
+ let profile;
451
+ try {
452
+ profile = this.d.profile();
453
+ }
454
+ catch (err) {
455
+ log(`Fleet: restore_on_start skipped: ${err instanceof Error ? err.message : String(err)}`);
456
+ return null;
457
+ }
458
+ if (!profile.restore_on_start || this.status === 'unavailable')
459
+ return null;
460
+ const fleet = this.lastFleet();
461
+ if (fleet.open_period || !fleet.closed_period || fleet.closed_period.restored_at)
462
+ return null;
463
+ const ledger = this.load();
464
+ ledger.restored_periods[fleet.closed_period.start] = new Date(this.d.now()).toISOString();
465
+ this.persist();
466
+ const ids = fleet.sessions.filter((r) => r.default_selected).map((r) => r.claude_session_id);
467
+ log(`Fleet: restore_on_start, restoring ${ids.length} session(s) from ${fleet.closed_period.start}`);
468
+ return this.restoreIds(ids, fleet);
469
+ }
470
+ }
471
+ // ----------------------------------------------------------------------------
472
+ // Daemon wiring
473
+ // ----------------------------------------------------------------------------
474
+ let instance = null;
475
+ export function fleet() {
476
+ return (instance ??= new Fleet());
477
+ }
478
+ /** Test seam. */
479
+ export function _setFleet(f) {
480
+ instance = f;
481
+ }
482
+ /**
483
+ * The start-up contract check: `claude agents --json` is the documented view
484
+ * of the same live set. A session it lists that the files do not is drift.
485
+ * When claude itself cannot be run, the files stay authoritative.
486
+ */
487
+ export function agentsContractCheck(f) {
488
+ execFile(resolveClaude(), ['agents', '--json'], { timeout: 30_000, env: cleanEnv() }, (err, stdout) => {
489
+ if (err) {
490
+ log(`Fleet: claude agents --json unavailable (${err.message.split('\n')[0]}); relying on the session files`);
491
+ return;
492
+ }
493
+ let listed;
494
+ try {
495
+ listed = JSON.parse(String(stdout));
496
+ if (!Array.isArray(listed))
497
+ throw new Error('not an array');
498
+ }
499
+ catch (e) {
500
+ log(`Fleet: claude agents --json output not understood (${e instanceof Error ? e.message : String(e)})`);
501
+ return;
502
+ }
503
+ const { files } = readSessionFiles(defaultSessionsDir());
504
+ const onDisk = new Set(files.map((x) => x.sessionId));
505
+ const missing = listed.filter((a) => a.kind === 'interactive' && isUuid(a.sessionId) && !onDisk.has(a.sessionId));
506
+ // A session that exited between the two reads is gone from both; one that
507
+ // started in between is on disk. Only a listed-but-never-on-disk id is drift.
508
+ if (missing.length) {
509
+ f.markUnavailable(`claude agents --json lists ${missing.length} live session(s) with no file in ~/.claude/sessions`);
510
+ log(`Fleet: contract check failed: ${missing.length} session(s) listed by claude agents have no session file`);
511
+ }
512
+ });
513
+ }
514
+ /** Start the 30 s sweep. Returns a stop function that flushes the ledger. */
515
+ export function startFleetSweep() {
516
+ const f = fleet();
517
+ let stopped = false;
518
+ const tick = () => {
519
+ if (stopped)
520
+ return;
521
+ f.sweep().catch((err) => log(`Fleet: sweep failed: ${err instanceof Error ? err.message : String(err)}`));
522
+ };
523
+ void f.sweep()
524
+ .then(async () => {
525
+ agentsContractCheck(f);
526
+ await f.restoreOnStart();
527
+ })
528
+ .catch((err) => log(`Fleet: start-up failed: ${err instanceof Error ? err.message : String(err)}`));
529
+ const timer = setInterval(tick, SWEEP_MS);
530
+ timer.unref?.();
531
+ log('Fleet: sweeping ~/.claude/sessions every 30 s');
532
+ return () => {
533
+ stopped = true;
534
+ clearInterval(timer);
535
+ try {
536
+ f.persist();
537
+ }
538
+ catch {
539
+ /* best effort */
540
+ }
541
+ };
542
+ }
543
+ //# sourceMappingURL=fleet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../src/pty/fleet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /** `claude --permission-mode` choices, Claude Code 2.1.281. */
2
+ export declare const PERMISSION_MODES: readonly ["acceptEdits", "auto", "bypassPermissions", "manual", "dontAsk", "plan"];
3
+ export type PermissionMode = (typeof PERMISSION_MODES)[number];
4
+ export interface LaunchProfile {
5
+ permission_mode?: PermissionMode;
6
+ dev_channels: string[];
7
+ period_gap_hours: number;
8
+ restore_on_start: boolean;
9
+ tmux: TmuxProfile;
10
+ }
11
+ /** Options for the daemon's owned tmux server (ISS-0205). */
12
+ export interface TmuxProfile {
13
+ mouse: boolean;
14
+ history_limit: number;
15
+ }
16
+ export declare const DEFAULT_PERIOD_GAP_HOURS = 4;
17
+ /** Scrollback lines per pane. A pane's limit is fixed when it is created. */
18
+ export declare const DEFAULT_HISTORY_LIMIT = 50000;
19
+ export declare function defaultProfile(): LaunchProfile;
20
+ /** Resolved per call so tests (and a changed $HOME) are honoured. */
21
+ export declare function launchProfilePath(): string;
22
+ /** Validate a parsed launch.json. Throws a message naming the first problem. */
23
+ export declare function parseLaunchProfile(raw: unknown): LaunchProfile;
24
+ /**
25
+ * The profile, read per call (the file is tiny and spawns are rare, so an edit
26
+ * takes effect without a restart). Throws LAUNCH_PROFILE_INVALID when the file
27
+ * exists and is wrong.
28
+ */
29
+ export declare function loadLaunchProfile(): LaunchProfile;
30
+ /**
31
+ * claude flags for a profile. Each channel gets its own flag, placed last: the
32
+ * flag is undocumented, and repeating it is safe whether it takes one value or
33
+ * many, where a second bare value could otherwise be read as a prompt.
34
+ */
35
+ export declare function profileArgs(p: LaunchProfile): string[];
36
+ /**
37
+ * Lets tmux pass OSC 8 hyperlinks (which Claude Code emits) through to an
38
+ * xterm-family client, so links are clickable in Ghostty and HQ's pane. Always
39
+ * on; it costs nothing. A FIXED index, not `set -as`: this runs before every
40
+ * spawn, and appending would grow the array by one entry each time.
41
+ */
42
+ export declare const HYPERLINKS_FEATURE_INDEX = 20;
43
+ /** Options for the owned server, as one ';'-separated tmux invocation. */
44
+ export declare function tmuxOptionArgs(t: TmuxProfile): string[];
45
+ //# sourceMappingURL=launchProfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchProfile.d.ts","sourceRoot":"","sources":["../../src/pty/launchProfile.ts"],"names":[],"mappings":"AAyBA,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,oFAAqF,CAAC;AACnH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAM/D,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAI5C,wBAAgB,cAAc,IAAI,aAAa,CAQ9C;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAkD9D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,CAYjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,EAAE,CAKtD;AAED;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE,CAMvD"}