@cluesmith/codev 3.3.3 → 3.3.5

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 (244) hide show
  1. package/dashboard-dist/assets/index-BuflRUi6.js +220 -0
  2. package/dashboard-dist/assets/index-BuflRUi6.js.map +1 -0
  3. package/dashboard-dist/assets/index-r3bZzLmX.css +32 -0
  4. package/dashboard-dist/index.html +2 -2
  5. package/dist/agent-farm/cli.d.ts.map +1 -1
  6. package/dist/agent-farm/cli.js +48 -0
  7. package/dist/agent-farm/cli.js.map +1 -1
  8. package/dist/agent-farm/commands/ide.d.ts +20 -0
  9. package/dist/agent-farm/commands/ide.d.ts.map +1 -0
  10. package/dist/agent-farm/commands/ide.js +138 -0
  11. package/dist/agent-farm/commands/ide.js.map +1 -0
  12. package/dist/agent-farm/commands/inbox.d.ts.map +1 -1
  13. package/dist/agent-farm/commands/inbox.js +15 -3
  14. package/dist/agent-farm/commands/inbox.js.map +1 -1
  15. package/dist/agent-farm/commands/send.d.ts +3 -2
  16. package/dist/agent-farm/commands/send.d.ts.map +1 -1
  17. package/dist/agent-farm/commands/send.js +40 -6
  18. package/dist/agent-farm/commands/send.js.map +1 -1
  19. package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
  20. package/dist/agent-farm/commands/spawn-worktree.js +28 -9
  21. package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
  22. package/dist/agent-farm/commands/tower.d.ts +21 -9
  23. package/dist/agent-farm/commands/tower.d.ts.map +1 -1
  24. package/dist/agent-farm/commands/tower.js +90 -30
  25. package/dist/agent-farm/commands/tower.js.map +1 -1
  26. package/dist/agent-farm/db/tower-owner.d.ts +168 -0
  27. package/dist/agent-farm/db/tower-owner.d.ts.map +1 -0
  28. package/dist/agent-farm/db/tower-owner.js +369 -0
  29. package/dist/agent-farm/db/tower-owner.js.map +1 -0
  30. package/dist/agent-farm/db/types.d.ts +30 -5
  31. package/dist/agent-farm/db/types.d.ts.map +1 -1
  32. package/dist/agent-farm/db/types.js.map +1 -1
  33. package/dist/agent-farm/lib/ide-record.d.ts +65 -0
  34. package/dist/agent-farm/lib/ide-record.d.ts.map +1 -0
  35. package/dist/agent-farm/lib/ide-record.js +118 -0
  36. package/dist/agent-farm/lib/ide-record.js.map +1 -0
  37. package/dist/agent-farm/lib/tunnel-client.d.ts +22 -0
  38. package/dist/agent-farm/lib/tunnel-client.d.ts.map +1 -1
  39. package/dist/agent-farm/lib/tunnel-client.js +53 -5
  40. package/dist/agent-farm/lib/tunnel-client.js.map +1 -1
  41. package/dist/agent-farm/servers/decisions/file.d.ts +50 -0
  42. package/dist/agent-farm/servers/decisions/file.d.ts.map +1 -0
  43. package/dist/agent-farm/servers/decisions/file.js +146 -0
  44. package/dist/agent-farm/servers/decisions/file.js.map +1 -0
  45. package/dist/agent-farm/servers/decisions/grammar.d.ts +36 -0
  46. package/dist/agent-farm/servers/decisions/grammar.d.ts.map +1 -0
  47. package/dist/agent-farm/servers/decisions/grammar.js +109 -0
  48. package/dist/agent-farm/servers/decisions/grammar.js.map +1 -0
  49. package/dist/agent-farm/servers/decisions/notice.d.ts +11 -0
  50. package/dist/agent-farm/servers/decisions/notice.d.ts.map +1 -0
  51. package/dist/agent-farm/servers/decisions/notice.js +18 -0
  52. package/dist/agent-farm/servers/decisions/notice.js.map +1 -0
  53. package/dist/agent-farm/servers/decisions/parse.d.ts +36 -0
  54. package/dist/agent-farm/servers/decisions/parse.d.ts.map +1 -0
  55. package/dist/agent-farm/servers/decisions/parse.js +308 -0
  56. package/dist/agent-farm/servers/decisions/parse.js.map +1 -0
  57. package/dist/agent-farm/servers/decisions/routes.d.ts +17 -0
  58. package/dist/agent-farm/servers/decisions/routes.d.ts.map +1 -0
  59. package/dist/agent-farm/servers/decisions/routes.js +160 -0
  60. package/dist/agent-farm/servers/decisions/routes.js.map +1 -0
  61. package/dist/agent-farm/servers/decisions/splice.d.ts +26 -0
  62. package/dist/agent-farm/servers/decisions/splice.d.ts.map +1 -0
  63. package/dist/agent-farm/servers/decisions/splice.js +120 -0
  64. package/dist/agent-farm/servers/decisions/splice.js.map +1 -0
  65. package/dist/agent-farm/servers/decisions/stamp.d.ts +4 -0
  66. package/dist/agent-farm/servers/decisions/stamp.d.ts.map +1 -0
  67. package/dist/agent-farm/servers/decisions/stamp.js +171 -0
  68. package/dist/agent-farm/servers/decisions/stamp.js.map +1 -0
  69. package/dist/agent-farm/servers/gate-profiles.d.ts +23 -2
  70. package/dist/agent-farm/servers/gate-profiles.d.ts.map +1 -1
  71. package/dist/agent-farm/servers/gate-profiles.js +43 -2
  72. package/dist/agent-farm/servers/gate-profiles.js.map +1 -1
  73. package/dist/agent-farm/servers/ide-forward.d.ts +62 -0
  74. package/dist/agent-farm/servers/ide-forward.d.ts.map +1 -0
  75. package/dist/agent-farm/servers/ide-forward.js +274 -0
  76. package/dist/agent-farm/servers/ide-forward.js.map +1 -0
  77. package/dist/agent-farm/servers/ide-server.d.ts +68 -0
  78. package/dist/agent-farm/servers/ide-server.d.ts.map +1 -0
  79. package/dist/agent-farm/servers/ide-server.js +281 -0
  80. package/dist/agent-farm/servers/ide-server.js.map +1 -0
  81. package/dist/agent-farm/servers/mailbox-delivery.d.ts +213 -4
  82. package/dist/agent-farm/servers/mailbox-delivery.d.ts.map +1 -1
  83. package/dist/agent-farm/servers/mailbox-delivery.js +489 -68
  84. package/dist/agent-farm/servers/mailbox-delivery.js.map +1 -1
  85. package/dist/agent-farm/servers/mailbox-wiring.d.ts +18 -4
  86. package/dist/agent-farm/servers/mailbox-wiring.d.ts.map +1 -1
  87. package/dist/agent-farm/servers/mailbox-wiring.js +94 -21
  88. package/dist/agent-farm/servers/mailbox-wiring.js.map +1 -1
  89. package/dist/agent-farm/servers/message-write.d.ts +138 -11
  90. package/dist/agent-farm/servers/message-write.d.ts.map +1 -1
  91. package/dist/agent-farm/servers/message-write.js +144 -35
  92. package/dist/agent-farm/servers/message-write.js.map +1 -1
  93. package/dist/agent-farm/servers/overview.d.ts +32 -15
  94. package/dist/agent-farm/servers/overview.d.ts.map +1 -1
  95. package/dist/agent-farm/servers/overview.js +181 -103
  96. package/dist/agent-farm/servers/overview.js.map +1 -1
  97. package/dist/agent-farm/servers/render-gate.d.ts +53 -0
  98. package/dist/agent-farm/servers/render-gate.d.ts.map +1 -1
  99. package/dist/agent-farm/servers/render-gate.js +135 -24
  100. package/dist/agent-farm/servers/render-gate.js.map +1 -1
  101. package/dist/agent-farm/servers/session-submit.d.ts +7 -4
  102. package/dist/agent-farm/servers/session-submit.d.ts.map +1 -1
  103. package/dist/agent-farm/servers/session-submit.js +7 -4
  104. package/dist/agent-farm/servers/session-submit.js.map +1 -1
  105. package/dist/agent-farm/servers/tower-cron.d.ts.map +1 -1
  106. package/dist/agent-farm/servers/tower-cron.js +4 -1
  107. package/dist/agent-farm/servers/tower-cron.js.map +1 -1
  108. package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
  109. package/dist/agent-farm/servers/tower-instances.js +6 -7
  110. package/dist/agent-farm/servers/tower-instances.js.map +1 -1
  111. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
  112. package/dist/agent-farm/servers/tower-routes.js +116 -18
  113. package/dist/agent-farm/servers/tower-routes.js.map +1 -1
  114. package/dist/agent-farm/servers/tower-server.js +64 -7
  115. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  116. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
  117. package/dist/agent-farm/servers/tower-terminals.js +53 -8
  118. package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
  119. package/dist/agent-farm/servers/tower-websocket.d.ts.map +1 -1
  120. package/dist/agent-farm/servers/tower-websocket.js +18 -1
  121. package/dist/agent-farm/servers/tower-websocket.js.map +1 -1
  122. package/dist/agent-farm/utils/message-format.d.ts +8 -0
  123. package/dist/agent-farm/utils/message-format.d.ts.map +1 -1
  124. package/dist/agent-farm/utils/message-format.js +21 -6
  125. package/dist/agent-farm/utils/message-format.js.map +1 -1
  126. package/dist/agent-farm/utils/port.d.ts +22 -0
  127. package/dist/agent-farm/utils/port.d.ts.map +1 -0
  128. package/dist/agent-farm/utils/port.js +35 -0
  129. package/dist/agent-farm/utils/port.js.map +1 -0
  130. package/dist/agent-farm/utils/server-utils.d.ts +26 -0
  131. package/dist/agent-farm/utils/server-utils.d.ts.map +1 -1
  132. package/dist/agent-farm/utils/server-utils.js +36 -0
  133. package/dist/agent-farm/utils/server-utils.js.map +1 -1
  134. package/dist/cli.js +2 -2
  135. package/dist/cli.js.map +1 -1
  136. package/dist/commands/consult/index.d.ts +20 -1
  137. package/dist/commands/consult/index.d.ts.map +1 -1
  138. package/dist/commands/consult/index.js +117 -3
  139. package/dist/commands/consult/index.js.map +1 -1
  140. package/dist/commands/consult/tree-tripwire.d.ts +177 -0
  141. package/dist/commands/consult/tree-tripwire.d.ts.map +1 -0
  142. package/dist/commands/consult/tree-tripwire.js +356 -0
  143. package/dist/commands/consult/tree-tripwire.js.map +1 -0
  144. package/dist/commands/doctor.d.ts +69 -0
  145. package/dist/commands/doctor.d.ts.map +1 -1
  146. package/dist/commands/doctor.js +163 -0
  147. package/dist/commands/doctor.js.map +1 -1
  148. package/dist/commands/generate-image.d.ts +5 -0
  149. package/dist/commands/generate-image.d.ts.map +1 -1
  150. package/dist/commands/generate-image.js +225 -4
  151. package/dist/commands/generate-image.js.map +1 -1
  152. package/dist/commands/porch/checks.d.ts +7 -1
  153. package/dist/commands/porch/checks.d.ts.map +1 -1
  154. package/dist/commands/porch/checks.js +77 -14
  155. package/dist/commands/porch/checks.js.map +1 -1
  156. package/dist/commands/porch/index.d.ts +38 -1
  157. package/dist/commands/porch/index.d.ts.map +1 -1
  158. package/dist/commands/porch/index.js +79 -43
  159. package/dist/commands/porch/index.js.map +1 -1
  160. package/dist/commands/porch/protocol.d.ts +4 -3
  161. package/dist/commands/porch/protocol.d.ts.map +1 -1
  162. package/dist/commands/porch/protocol.js +32 -5
  163. package/dist/commands/porch/protocol.js.map +1 -1
  164. package/dist/commands/porch/types.d.ts +2 -0
  165. package/dist/commands/porch/types.d.ts.map +1 -1
  166. package/dist/lib/agent-env.d.ts +95 -0
  167. package/dist/lib/agent-env.d.ts.map +1 -0
  168. package/dist/lib/agent-env.js +137 -0
  169. package/dist/lib/agent-env.js.map +1 -0
  170. package/dist/lib/config.d.ts +8 -0
  171. package/dist/lib/config.d.ts.map +1 -1
  172. package/dist/lib/config.js.map +1 -1
  173. package/dist/lib/forge-contracts.d.ts +10 -0
  174. package/dist/lib/forge-contracts.d.ts.map +1 -1
  175. package/dist/lib/forge-contracts.js.map +1 -1
  176. package/dist/lib/forge-rate-limit.d.ts +45 -0
  177. package/dist/lib/forge-rate-limit.d.ts.map +1 -0
  178. package/dist/lib/forge-rate-limit.js +89 -0
  179. package/dist/lib/forge-rate-limit.js.map +1 -0
  180. package/dist/lib/forge.d.ts +28 -0
  181. package/dist/lib/forge.d.ts.map +1 -1
  182. package/dist/lib/forge.js +63 -10
  183. package/dist/lib/forge.js.map +1 -1
  184. package/dist/lib/github.d.ts +13 -1
  185. package/dist/lib/github.d.ts.map +1 -1
  186. package/dist/lib/github.js +58 -15
  187. package/dist/lib/github.js.map +1 -1
  188. package/dist/lib/test-env.d.ts +17 -0
  189. package/dist/lib/test-env.d.ts.map +1 -1
  190. package/dist/lib/test-env.js +20 -0
  191. package/dist/lib/test-env.js.map +1 -1
  192. package/dist/terminal/pty-session.d.ts +122 -4
  193. package/dist/terminal/pty-session.d.ts.map +1 -1
  194. package/dist/terminal/pty-session.js +142 -7
  195. package/dist/terminal/pty-session.js.map +1 -1
  196. package/dist/terminal/session-manager.d.ts +23 -2
  197. package/dist/terminal/session-manager.d.ts.map +1 -1
  198. package/dist/terminal/session-manager.js +115 -36
  199. package/dist/terminal/session-manager.js.map +1 -1
  200. package/dist/terminal/session-screen.d.ts +34 -5
  201. package/dist/terminal/session-screen.d.ts.map +1 -1
  202. package/dist/terminal/session-screen.js +52 -6
  203. package/dist/terminal/session-screen.js.map +1 -1
  204. package/dist/terminal/terminal-replies.d.ts +102 -0
  205. package/dist/terminal/terminal-replies.d.ts.map +1 -0
  206. package/dist/terminal/terminal-replies.js +181 -0
  207. package/dist/terminal/terminal-replies.js.map +1 -0
  208. package/package.json +4 -4
  209. package/scripts/forge/github/pr-list.sh +6 -2
  210. package/scripts/forge/github/pr-search.sh +4 -2
  211. package/scripts/forge/gitlab/issue-search.sh +1 -0
  212. package/scripts/forge/gitlab/pr-search.sh +35 -2
  213. package/scripts/forge/linear/auth-status.sh +1 -0
  214. package/scripts/forge/linear/issue-comment.sh +1 -0
  215. package/scripts/forge/linear/issue-list.sh +1 -0
  216. package/scripts/forge/linear/issue-search.sh +1 -0
  217. package/scripts/forge/linear/issue-view.sh +1 -0
  218. package/scripts/forge/linear/recently-closed.sh +1 -0
  219. package/scripts/forge/linear/user-identity.sh +1 -0
  220. package/skeleton/.claude/skills/afx/SKILL.md +15 -0
  221. package/skeleton/.claude/skills/arch-init/SKILL.md +56 -9
  222. package/skeleton/.claude/skills/arch-save/SKILL.md +100 -9
  223. package/skeleton/.claude/skills/consult/SKILL.md +9 -0
  224. package/skeleton/.claude/skills/generate-image/SKILL.md +19 -2
  225. package/skeleton/.claude/skills/porch/SKILL.md +18 -0
  226. package/skeleton/.codex/skills/afx/SKILL.md +15 -0
  227. package/skeleton/.codex/skills/arch-init/SKILL.md +56 -9
  228. package/skeleton/.codex/skills/arch-save/SKILL.md +100 -9
  229. package/skeleton/.codex/skills/consult/SKILL.md +9 -0
  230. package/skeleton/.codex/skills/generate-image/SKILL.md +19 -2
  231. package/skeleton/.codex/skills/porch/SKILL.md +18 -0
  232. package/skeleton/protocol-schema.json +6 -0
  233. package/skeleton/protocols/maintain/protocol.md +5 -0
  234. package/skeleton/protocols/pir/prompts/review.md +0 -1
  235. package/skeleton/protocols/protocol-schema.json +6 -0
  236. package/skeleton/resources/commands/agent-farm.md +71 -2
  237. package/skeleton/resources/commands/consult.md +9 -2
  238. package/skeleton/roles/consultant.md +32 -0
  239. package/skeleton/templates/AGENTS.md +1 -1
  240. package/skeleton/templates/CLAUDE.md +1 -1
  241. package/skeleton/templates/cheatsheet.md +1 -1
  242. package/dashboard-dist/assets/index-CUIjS_Vb.js +0 -199
  243. package/dashboard-dist/assets/index-CUIjS_Vb.js.map +0 -1
  244. package/dashboard-dist/assets/index-DnYLy5C_.css +0 -32
@@ -2,12 +2,11 @@
2
2
  * Tower command - launches the tower dashboard showing all instances
3
3
  */
4
4
  import { resolve } from 'node:path';
5
- import { existsSync, mkdirSync, appendFileSync } from 'node:fs';
5
+ import { existsSync, mkdirSync, appendFileSync, statSync, readFileSync } from 'node:fs';
6
6
  import http from 'node:http';
7
7
  import { logger, fatal } from '../utils/logger.js';
8
8
  import { spawn } from 'node:child_process';
9
9
  import { getConfig } from '../utils/config.js';
10
- import { execSync } from 'node:child_process';
11
10
  import { DEFAULT_TOWER_PORT, AGENT_FARM_DIR } from '../lib/tower-client.js';
12
11
  import { ensureLocalKey } from '@cluesmith/codev-core/auth';
13
12
  import { TOWER_KEY_HEADER } from '@cluesmith/codev-types';
@@ -15,6 +14,8 @@ import { isPortAvailable } from '../utils/shell.js';
15
14
  import Database from 'better-sqlite3';
16
15
  import { getGlobalDbPath } from '../db/index.js';
17
16
  import { activeStateDbPath, planMigration } from '../db/consolidate.js';
17
+ import { sanitizeAgentEnv, findClaudeSessionMarkers } from '../../lib/agent-env.js';
18
+ import { getProcessesOnPort } from '../utils/port.js';
18
19
  // Log file location
19
20
  const LOG_FILE = resolve(AGENT_FARM_DIR, 'tower.log');
20
21
  // Startup verification settings
@@ -120,42 +121,67 @@ async function isServerResponding(port) {
120
121
  });
121
122
  }
122
123
  /**
123
- * Wait for the server to start responding
124
+ * Wait for a freshly spawned Tower to become ready, returning which of the three outcomes
125
+ * occurred. `isReady` is the readiness probe (port answering); `isDaemonAlive` reports whether
126
+ * the spawned daemon process is still running. Both are injectable so the outcome logic can be
127
+ * exercised deterministically without spawning a real server.
128
+ *
129
+ * The tower-server IS the daemon, so once it exits the port can never come up — hence a dead
130
+ * daemon short-circuits to `exited`. A final readiness re-probe closes the benign race where the
131
+ * daemon answered readiness in the same tick it was observed to exit.
124
132
  */
125
- async function waitForServer(port) {
133
+ export async function waitForServerOutcome(isReady, isDaemonAlive, opts = {}) {
134
+ const timeoutMs = opts.timeoutMs ?? STARTUP_TIMEOUT_MS;
135
+ const intervalMs = opts.intervalMs ?? STARTUP_CHECK_INTERVAL_MS;
126
136
  const startTime = Date.now();
127
- while (Date.now() - startTime < STARTUP_TIMEOUT_MS) {
128
- if (await isServerResponding(port)) {
129
- return true;
137
+ while (Date.now() - startTime < timeoutMs) {
138
+ if (await isReady()) {
139
+ return 'started';
130
140
  }
131
- await new Promise((r) => setTimeout(r, STARTUP_CHECK_INTERVAL_MS));
141
+ if (!isDaemonAlive()) {
142
+ // The daemon is gone before the port answered. Re-probe once to close the benign race
143
+ // where it answered readiness in the same tick it was observed to exit.
144
+ if (await isReady()) {
145
+ return 'started';
146
+ }
147
+ return 'exited';
148
+ }
149
+ await new Promise((r) => setTimeout(r, intervalMs));
150
+ }
151
+ // Budget exhausted. The daemon may have exited during the final sleep — check once more so a
152
+ // fast-exit landing on the deadline is reported as `exited`, not a misleading `timeout`.
153
+ if (!isDaemonAlive()) {
154
+ if (await isReady()) {
155
+ return 'started';
156
+ }
157
+ return 'exited';
158
+ }
159
+ return 'timeout';
160
+ }
161
+ /** Current byte length of the tower log (0 if absent) — the boundary for {@link readLogSince}. */
162
+ function currentLogOffset() {
163
+ try {
164
+ return statSync(LOG_FILE).size;
165
+ }
166
+ catch {
167
+ return 0;
132
168
  }
133
- return false;
134
169
  }
135
170
  /**
136
- * Get the PID(s) of the process *listening* on a port (the server), not its
137
- * clients.
138
- *
139
- * `-sTCP:LISTEN` is load-bearing (#991): without it, `lsof -ti :PORT` also
140
- * returns every process holding an *established* client socket to the port —
141
- * notably the VSCode extension host (its SSE stream + terminal WebSockets) and
142
- * dashboard browsers. `afx tower stop` SIGTERMs whatever this returns, so the
143
- * unfiltered form would kill the editor's extension host (and every open
144
- * terminal with it), not just the Tower server.
171
+ * Read everything appended to the tower log since `offset` bytes. Surfaces a fast-exiting
172
+ * daemon's own output (e.g. the owner-lock guard's teaching error) verbatim, without dragging in
173
+ * stale lines from previous runs. Returns '' if the file is gone or nothing new was written.
145
174
  */
146
- export function getProcessesOnPort(port) {
175
+ function readLogSince(offset) {
147
176
  try {
148
- const result = execSync(`lsof -ti :${port} -sTCP:LISTEN 2>/dev/null`, { encoding: 'utf-8' });
149
- return result
150
- .trim()
151
- .split('\n')
152
- .map((line) => parseInt(line, 10))
153
- .filter((pid) => !isNaN(pid));
177
+ const buf = readFileSync(LOG_FILE);
178
+ return buf.subarray(Math.min(offset, buf.length)).toString('utf8').trim();
154
179
  }
155
180
  catch {
156
- return [];
181
+ return '';
157
182
  }
158
183
  }
184
+ export { getProcessesOnPort } from '../utils/port.js';
159
185
  /**
160
186
  * Start the tower dashboard
161
187
  */
@@ -216,10 +242,19 @@ export async function towerStart(options = {}) {
216
242
  logger.kv('Log file', LOG_FILE);
217
243
  logToFile(`Starting tower server on port ${port}`);
218
244
  logToFile(`Command: ${command} ${args.join(' ')}`);
245
+ // Issue #1219: scrub Claude Code session markers before daemonizing. Starting
246
+ // Tower from inside a Claude Code session is routine, and the markers it plants
247
+ // would otherwise bake into the daemon and cascade into every agent it spawns,
248
+ // silently disabling transcript saving (and therefore resume) for all of them.
249
+ const inheritedMarkers = findClaudeSessionMarkers(process.env);
250
+ if (inheritedMarkers.length > 0) {
251
+ logger.info(`Scrubbed inherited Claude Code session markers: ${inheritedMarkers.join(', ')}`);
252
+ logToFile(`Scrubbed inherited Claude Code session markers: ${inheritedMarkers.join(', ')}`);
253
+ }
219
254
  // Start tower server fully detached - stdio: 'ignore' ensures parent can exit
220
255
  const serverProcess = spawn(command, args, {
221
256
  cwd: process.cwd(),
222
- env: process.env,
257
+ env: sanitizeAgentEnv(process.env),
223
258
  detached: true,
224
259
  stdio: 'ignore', // Must be 'ignore' for true daemonization
225
260
  });
@@ -230,14 +265,39 @@ export async function towerStart(options = {}) {
230
265
  // Detach from parent process
231
266
  serverProcess.unref();
232
267
  logToFile(`Spawned tower server with PID ${serverProcess.pid}`);
268
+ // Issue #1691: track the daemon's liveness and mark where its own log output begins, so the
269
+ // readiness wait can distinguish a fast-exit (owner-lock refusal, early boot failure) from a
270
+ // genuine hang — and, on a fast-exit, surface the daemon's teaching error verbatim instead of
271
+ // a generic timeout. The offset is captured here (after the launcher's own pre-spawn writes)
272
+ // so readLogSince() returns only what THIS daemon run appended.
273
+ let daemonExited = false;
274
+ serverProcess.on('exit', () => {
275
+ daemonExited = true;
276
+ });
277
+ const logOffsetAtSpawn = currentLogOffset();
233
278
  const dashboardUrl = `http://localhost:${port}`;
234
279
  if (wait) {
235
280
  // Wait for server to actually start responding
236
281
  logger.info('Waiting for server to start...');
237
- const started = await waitForServer(port);
238
- if (!started) {
282
+ const outcome = await waitForServerOutcome(() => isServerResponding(port), () => !daemonExited);
283
+ if (outcome === 'exited') {
284
+ // The daemon died before the port came up: a refusal (the #1629 owner-lock guard) or an
285
+ // early boot failure. Surface its own log output verbatim so the user sees the teaching
286
+ // error, not a generic timeout indistinguishable from a real hang (Issue #1691).
287
+ const reason = readLogSince(logOffsetAtSpawn);
288
+ logToFile('Tower server exited during startup before responding');
289
+ logger.error('Tower server exited during startup before it became ready:');
290
+ if (reason) {
291
+ console.error(`\n${reason}\n`);
292
+ }
293
+ else {
294
+ logger.error(`No output was captured. Check logs at: ${LOG_FILE}`);
295
+ }
296
+ process.exit(1);
297
+ }
298
+ if (outcome === 'timeout') {
239
299
  logToFile(`Tower server failed to respond within ${STARTUP_TIMEOUT_MS}ms`);
240
- logger.error(`Tower server failed to start within ${STARTUP_TIMEOUT_MS / 1000}s`);
300
+ logger.error(`Tower server did not respond within ${STARTUP_TIMEOUT_MS / 1000}s and is still running (status unknown).`);
241
301
  logger.error(`Check logs at: ${LOG_FILE}`);
242
302
  process.exit(1);
243
303
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tower.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/tower.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tower.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/tower.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * global.db owner lock (Issue #1629).
3
+ *
4
+ * The port bind in tower-server.ts is a SAME-PORT mutex only: a second Tower on
5
+ * a DIFFERENT port can still open the same global.db. That is exactly how the
6
+ * incident happened — a test Tower on port 14733 exported `AGENT_FARM_DIR`
7
+ * instead of `CODEV_AGENT_FARM_DIR` (#1515), so it resolved to the production
8
+ * `~/.agent-farm` and opened the live `global.db` (port and DB path are set by
9
+ * independent inputs: the port is a CLI arg, the DB comes from AGENT_FARM_DIR).
10
+ * Its startup reconcile then reconnected every live shellper socket (a shellper
11
+ * holds ONE client), stealing them from the real Tower on 4100, and the
12
+ * stale-row sweep deleted the rows.
13
+ *
14
+ * This module makes the second Tower REFUSE to start instead. The owner record
15
+ * is an exclusive LOCK FILE sitting next to the exact global.db being contended
16
+ * (`<db path>.tower-owner`), so it travels with that file: cross-`CODEV_AGENT_FARM_DIR`
17
+ * isolation is untouched (an isolated DB carries its own lock), and two isolated
18
+ * test Towers on different DB files never share a lock. Acquisition is an atomic
19
+ * `O_EXCL` create — the filesystem itself resolves a race between two starters. A
20
+ * second Tower reads the lock at boot, before reconcile; if a live Tower owns the
21
+ * DB it refuses loudly, otherwise it claims. A dead owner self-clears — a crashed
22
+ * Tower's lock has a dead pid, so the legitimate restart just reclaims.
23
+ *
24
+ * The lock is deliberately NOT a table in global.db: ownership is ephemeral
25
+ * process state (a cleanly-stopped Tower leaves nothing behind), so it needs no
26
+ * durable schema, no migration, and it sits naturally alongside the other
27
+ * runtime artifacts in AGENT_FARM_DIR (`tower.log`, `local-key`).
28
+ */
29
+ /** The owner record persisted in the lock file next to global.db. */
30
+ export interface TowerOwner {
31
+ /** pid of the Tower process that owns this global.db. */
32
+ pid: number;
33
+ /** Port that Tower is listening on (the liveness probe target). */
34
+ port: number;
35
+ /** Machine the owning Tower runs on (diagnostic only). */
36
+ hostname: string;
37
+ /** When ownership was claimed (epoch ms; also the compare-and-set discriminator). */
38
+ startedAt: number;
39
+ /** Resolved AGENT_FARM_DIR the owner opened — surfaced in the conflict error. */
40
+ dbDir: string;
41
+ /**
42
+ * Interface the owner listens on — the liveness probe's target host. Default
43
+ * `127.0.0.1`; bridge mode may bind a specific non-loopback host, and probing
44
+ * loopback would then miss it (a false "gone" → hijack). `0.0.0.0`/`::` are
45
+ * resolved back to loopback for the probe.
46
+ */
47
+ bindHost: string;
48
+ }
49
+ /**
50
+ * The lock file for the active global.db: the DB path plus `.tower-owner`.
51
+ *
52
+ * The suffix is deliberately NOT `.lock`: SQLite's `unix-dotfile` VFS (a fallback
53
+ * on filesystems without POSIX locks) creates `<db>.lock`, which would collide.
54
+ * `.tower-owner` avoids every SQLite auxiliary name (`-wal`, `-shm`, `-journal`,
55
+ * `-mj*`, and the dotfile VFS's `.lock`).
56
+ */
57
+ export declare function defaultLockFile(): string;
58
+ /**
59
+ * Read the owner record from the lock file, or null if the lock is absent or its
60
+ * contents are unusable (corrupt / a partial write from a crashed acquire — the
61
+ * caller clears and reclaims those). A genuine IO error other than "not found"
62
+ * (permission, EISDIR) is rethrown so the boot guard fails CLOSED.
63
+ */
64
+ export declare function readTowerOwner(lockFile: string): TowerOwner | null;
65
+ /** Overwrite the lock file with `owner` (non-atomic; for takeover seams / tests). */
66
+ export declare function writeTowerOwner(lockFile: string, owner: TowerOwner): void;
67
+ /**
68
+ * Remove the lock file, but ONLY if it is still ours (pid match). Best-effort: a
69
+ * hard kill (SIGKILL) never reaches this, and the dead-pid liveness check
70
+ * self-clears the stale lock on the next start regardless. Called on graceful
71
+ * shutdown so the lock reflects reality between a clean stop and the next start.
72
+ */
73
+ export declare function releaseTowerOwnerIfMine(lockFile: string, pid: number): void;
74
+ /**
75
+ * The three distinguishable states of the owner's `/health` port.
76
+ * - `tower`: a live Tower answered — a healthy 200, OR a 503 `STARTING_UP` while
77
+ * its readiness gate holds requests mid-boot. Both mean a live Tower owns it.
78
+ * - `gone`: proof the owner is NOT here — the connection was refused (port free),
79
+ * or a non-Tower process answered (a squatter on a recycled port/pid). Claim.
80
+ * - `unreachable`: inconclusive — a timeout or transport error. A live Tower
81
+ * under load (its `/health` shells out to `ps -A`) or mid-boot can miss the
82
+ * budget, so this must NOT be read as "gone". The caller treats it as live.
83
+ */
84
+ export type HealthProbe = 'tower' | 'gone' | 'unreachable';
85
+ /**
86
+ * Probe `GET /health` on `host`:`port` (unauthenticated per server-utils).
87
+ *
88
+ * The budget is generous by default: `/health` calls `getInstances()` and shells
89
+ * out to `ps -A` (a 5s timeout of its own), so under the incident's load — 60+
90
+ * shellpers, a busy event loop — a tight budget would time out and be misread as
91
+ * "no Tower here", failing OPEN on the one guard that prevents data loss. Only
92
+ * paid on the conflict path (a live pid on a different port), so it costs nothing
93
+ * on the common restart.
94
+ */
95
+ export declare function probeTowerHealth(host: string, port: number, timeoutMs?: number): Promise<HealthProbe>;
96
+ /**
97
+ * Resolve the host to probe from the owner's recorded bind interface. A wildcard
98
+ * bind (`0.0.0.0` / `::` / bracketed `[::]` as validateHost emits) accepts
99
+ * loopback, so probe `127.0.0.1`; a specific bridge host is probed directly
100
+ * (probing loopback would falsely read 'gone').
101
+ */
102
+ export declare function resolveProbeHost(bindHost: string | null | undefined): string;
103
+ /** Injectable liveness seams — real implementations by default; fakes in tests. */
104
+ export interface OwnerLivenessDeps {
105
+ isAlive?: (pid: number) => boolean;
106
+ probe?: (host: string, port: number) => Promise<HealthProbe>;
107
+ }
108
+ /**
109
+ * Decide whether the recorded owner is a live Tower this process must yield to.
110
+ *
111
+ * - same port AND same bind interface as us: our own `server.listen` succeeded
112
+ * on that exact interface:port, and an identical bind is exclusive, so no other
113
+ * process holds it — any prior owner recorded there is gone. Claim. The bind
114
+ * interface must match: a wildcard bind (`0.0.0.0:P`) and a loopback bind
115
+ * (`127.0.0.1:P`) COEXIST on the same port, so `port` alone matching does not
116
+ * prove a differently-bound owner is gone — that path falls through to the probe.
117
+ * - dead owner pid: stale (a crashed Tower / a clean stop that outran the
118
+ * release). Claim — this is the self-clearing legitimate restart.
119
+ * - live pid: probe the owner's port. Only a `gone` result (connection refused,
120
+ * or a non-Tower response) proves the owner is absent → claim. A `tower`
121
+ * response, OR an `unreachable` inconclusive probe against a still-live pid, is
122
+ * treated as a live owner → refuse. This fails CLOSED: a loaded or mid-boot
123
+ * Tower whose `/health` misses the budget is never mistaken for a free DB.
124
+ */
125
+ export declare function ownerIsLive(owner: TowerOwner, myPort: number, myBindHost: string, deps?: OwnerLivenessDeps): Promise<boolean>;
126
+ /** Outcome of {@link claimGlobalDbOwnership}. */
127
+ export type ClaimResult = {
128
+ ok: true;
129
+ } | {
130
+ ok: false;
131
+ conflict: TowerOwner;
132
+ };
133
+ /**
134
+ * Boot guard: refuse if the DB already has a LIVE owner, otherwise claim
135
+ * ownership by writing the lock file. A decision plus a lock write — the caller
136
+ * decides how to fail loudly (log + exit).
137
+ *
138
+ * Acquisition is atomic against a concurrent second Tower: {@link tryAcquire}
139
+ * writes a full temp file and hard-links it onto the path, so the filesystem
140
+ * resolves a two-starter race (one link wins, the other gets EEXIST) with no
141
+ * empty-file window. A stale lock (dead / absent owner) is cleared with a
142
+ * compare-and-set on its contents and the link retried; the invariant preserved
143
+ * is "never remove a LIVE owner's lock". Under persistent churn the claim refuses
144
+ * rather than forcing the lock.
145
+ */
146
+ export declare function claimGlobalDbOwnership(opts: {
147
+ /** Lock file path; defaults to the active global.db's `.lock` sibling. */
148
+ lockFile?: string;
149
+ pid: number;
150
+ port: number;
151
+ dbDir: string;
152
+ /** Interface this Tower listens on (default `127.0.0.1`); persisted as the probe target. */
153
+ bindHost?: string;
154
+ deps?: OwnerLivenessDeps;
155
+ }): Promise<ClaimResult>;
156
+ /**
157
+ * The loud, teaching error for a refused start. Names the live owner (pid/port/
158
+ * host) and the shared DB, and — because the misconfiguration that triggered the
159
+ * incident was a mistyped env var — spells out the `AGENT_FARM_DIR` vs
160
+ * `CODEV_AGENT_FARM_DIR` fix.
161
+ *
162
+ * This string is user-visible at the CLI (surfaced by the launcher on a fast-exit,
163
+ * Issue #1691), so it carries no internal issue numbers — the incident context
164
+ * (#1629's shellper hijack, the #1515 mistyped-env-var trigger) stays here in the
165
+ * comment, not in the text a user reads.
166
+ */
167
+ export declare function ownershipConflictMessage(conflict: TowerOwner, dbDir: string): string;
168
+ //# sourceMappingURL=tower-owner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tower-owner.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/db/tower-owner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AASH,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAOD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAsBlE;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAGzE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAO3E;AAYD;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC;AAE3D;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CA6DnG;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAQ5E;AAED,mFAAmF;AACnF,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CAC9D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED,iDAAiD;AACjD,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAA;CAAE,CAAC;AAiExC;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B,GAAG,OAAO,CAAC,WAAW,CAAC,CAoCvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CASpF"}