@cleocode/core 2026.3.58 → 2026.3.59

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 (857) hide show
  1. package/dist/agents/agent-registry.d.ts +206 -0
  2. package/dist/agents/agent-registry.d.ts.map +1 -0
  3. package/dist/agents/health-monitor.d.ts +161 -0
  4. package/dist/agents/health-monitor.d.ts.map +1 -0
  5. package/dist/agents/index.d.ts +3 -1
  6. package/dist/agents/index.d.ts.map +1 -1
  7. package/dist/agents/retry.d.ts +57 -4
  8. package/dist/agents/retry.d.ts.map +1 -1
  9. package/dist/backfill/index.d.ts +27 -0
  10. package/dist/backfill/index.d.ts.map +1 -1
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +880 -506
  14. package/dist/index.js.map +4 -4
  15. package/dist/intelligence/impact.d.ts +34 -1
  16. package/dist/intelligence/impact.d.ts.map +1 -1
  17. package/dist/intelligence/index.d.ts +2 -2
  18. package/dist/intelligence/index.d.ts.map +1 -1
  19. package/dist/intelligence/types.d.ts +60 -0
  20. package/dist/intelligence/types.d.ts.map +1 -1
  21. package/dist/internal.d.ts +5 -4
  22. package/dist/internal.d.ts.map +1 -1
  23. package/dist/lib/index.d.ts +10 -0
  24. package/dist/lib/index.d.ts.map +1 -0
  25. package/dist/lib/retry.d.ts +128 -0
  26. package/dist/lib/retry.d.ts.map +1 -0
  27. package/dist/nexus/sharing/index.d.ts +48 -2
  28. package/dist/nexus/sharing/index.d.ts.map +1 -1
  29. package/dist/stats/workflow-telemetry.d.ts +15 -0
  30. package/dist/stats/workflow-telemetry.d.ts.map +1 -1
  31. package/dist/store/cross-db-cleanup.d.ts +35 -0
  32. package/dist/store/cross-db-cleanup.d.ts.map +1 -1
  33. package/dist/tasks/complete.d.ts.map +1 -1
  34. package/dist/tasks/enforcement.d.ts.map +1 -1
  35. package/dist/tasks/epic-enforcement.d.ts +61 -0
  36. package/dist/tasks/epic-enforcement.d.ts.map +1 -1
  37. package/dist/tasks/pipeline-stage.d.ts +70 -1
  38. package/dist/tasks/pipeline-stage.d.ts.map +1 -1
  39. package/package.json +5 -5
  40. package/schemas/config.schema.json +37 -1547
  41. package/src/__tests__/sharing.test.ts +24 -0
  42. package/src/agents/__tests__/agent-registry.test.ts +351 -0
  43. package/src/agents/__tests__/health-monitor.test.ts +332 -0
  44. package/src/agents/agent-registry.ts +394 -0
  45. package/src/agents/health-monitor.ts +279 -0
  46. package/src/agents/index.ts +24 -1
  47. package/src/agents/retry.ts +57 -4
  48. package/src/backfill/index.ts +27 -0
  49. package/src/config.ts +3 -3
  50. package/src/index.ts +1 -0
  51. package/src/intelligence/__tests__/impact.test.ts +165 -1
  52. package/src/intelligence/impact.ts +203 -0
  53. package/src/intelligence/index.ts +3 -0
  54. package/src/intelligence/types.ts +76 -0
  55. package/src/internal.ts +20 -0
  56. package/src/lib/__tests__/retry.test.ts +321 -0
  57. package/src/lib/index.ts +16 -0
  58. package/src/lib/retry.ts +224 -0
  59. package/src/nexus/sharing/index.ts +142 -2
  60. package/src/stats/workflow-telemetry.ts +15 -0
  61. package/src/store/__tests__/session-store.test.ts +43 -7
  62. package/src/store/__tests__/task-store.test.ts +1 -1
  63. package/src/store/__tests__/test-db-helper.ts +7 -3
  64. package/src/store/cross-db-cleanup.ts +35 -0
  65. package/src/tasks/__tests__/epic-enforcement.test.ts +9 -4
  66. package/src/tasks/__tests__/minimal-test.test.ts +2 -2
  67. package/src/tasks/__tests__/update.test.ts +25 -25
  68. package/src/tasks/complete.ts +11 -6
  69. package/src/tasks/enforcement.ts +6 -3
  70. package/src/tasks/epic-enforcement.ts +61 -0
  71. package/src/tasks/pipeline-stage.ts +70 -1
  72. package/templates/config.template.json +5 -116
  73. package/templates/global-config.template.json +2 -44
  74. package/dist/adapters/adapter-registry.js +0 -64
  75. package/dist/adapters/adapter-registry.js.map +0 -1
  76. package/dist/adapters/discovery.js +0 -83
  77. package/dist/adapters/discovery.js.map +0 -1
  78. package/dist/adapters/index.js +0 -9
  79. package/dist/adapters/index.js.map +0 -1
  80. package/dist/adapters/manager.js +0 -260
  81. package/dist/adapters/manager.js.map +0 -1
  82. package/dist/admin/export-tasks.js +0 -171
  83. package/dist/admin/export-tasks.js.map +0 -1
  84. package/dist/admin/export.js +0 -103
  85. package/dist/admin/export.js.map +0 -1
  86. package/dist/admin/help.js +0 -106
  87. package/dist/admin/help.js.map +0 -1
  88. package/dist/admin/import-tasks.js +0 -182
  89. package/dist/admin/import-tasks.js.map +0 -1
  90. package/dist/admin/import.js +0 -129
  91. package/dist/admin/import.js.map +0 -1
  92. package/dist/admin/index.js +0 -13
  93. package/dist/admin/index.js.map +0 -1
  94. package/dist/adrs/find.js +0 -134
  95. package/dist/adrs/find.js.map +0 -1
  96. package/dist/adrs/index.js +0 -15
  97. package/dist/adrs/index.js.map +0 -1
  98. package/dist/adrs/link-pipeline.js +0 -160
  99. package/dist/adrs/link-pipeline.js.map +0 -1
  100. package/dist/adrs/list.js +0 -43
  101. package/dist/adrs/list.js.map +0 -1
  102. package/dist/adrs/parse.js +0 -51
  103. package/dist/adrs/parse.js.map +0 -1
  104. package/dist/adrs/show.js +0 -22
  105. package/dist/adrs/show.js.map +0 -1
  106. package/dist/adrs/sync.js +0 -188
  107. package/dist/adrs/sync.js.map +0 -1
  108. package/dist/adrs/types.js +0 -9
  109. package/dist/adrs/types.js.map +0 -1
  110. package/dist/adrs/validate.js +0 -57
  111. package/dist/adrs/validate.js.map +0 -1
  112. package/dist/agents/agent-schema.js +0 -80
  113. package/dist/agents/agent-schema.js.map +0 -1
  114. package/dist/agents/capacity.js +0 -116
  115. package/dist/agents/capacity.js.map +0 -1
  116. package/dist/agents/index.js +0 -21
  117. package/dist/agents/index.js.map +0 -1
  118. package/dist/agents/registry.js +0 -314
  119. package/dist/agents/registry.js.map +0 -1
  120. package/dist/agents/retry.js +0 -176
  121. package/dist/agents/retry.js.map +0 -1
  122. package/dist/audit-prune.js +0 -94
  123. package/dist/audit-prune.js.map +0 -1
  124. package/dist/audit.js +0 -68
  125. package/dist/audit.js.map +0 -1
  126. package/dist/bootstrap.js +0 -260
  127. package/dist/bootstrap.js.map +0 -1
  128. package/dist/caamp/adapter.js +0 -434
  129. package/dist/caamp/adapter.js.map +0 -1
  130. package/dist/caamp/capability-check.js +0 -38
  131. package/dist/caamp/capability-check.js.map +0 -1
  132. package/dist/caamp/index.js +0 -23
  133. package/dist/caamp/index.js.map +0 -1
  134. package/dist/caamp-init.js +0 -16
  135. package/dist/caamp-init.js.map +0 -1
  136. package/dist/cleo.js +0 -267
  137. package/dist/cleo.js.map +0 -1
  138. package/dist/codebase-map/analyzers/architecture.js +0 -130
  139. package/dist/codebase-map/analyzers/architecture.js.map +0 -1
  140. package/dist/codebase-map/analyzers/concerns.js +0 -122
  141. package/dist/codebase-map/analyzers/concerns.js.map +0 -1
  142. package/dist/codebase-map/analyzers/conventions.js +0 -149
  143. package/dist/codebase-map/analyzers/conventions.js.map +0 -1
  144. package/dist/codebase-map/analyzers/integrations.js +0 -108
  145. package/dist/codebase-map/analyzers/integrations.js.map +0 -1
  146. package/dist/codebase-map/analyzers/stack.js +0 -117
  147. package/dist/codebase-map/analyzers/stack.js.map +0 -1
  148. package/dist/codebase-map/analyzers/structure.js +0 -137
  149. package/dist/codebase-map/analyzers/structure.js.map +0 -1
  150. package/dist/codebase-map/analyzers/testing.js +0 -118
  151. package/dist/codebase-map/analyzers/testing.js.map +0 -1
  152. package/dist/codebase-map/index.js +0 -57
  153. package/dist/codebase-map/index.js.map +0 -1
  154. package/dist/codebase-map/store.js +0 -122
  155. package/dist/codebase-map/store.js.map +0 -1
  156. package/dist/codebase-map/summary.js +0 -152
  157. package/dist/codebase-map/summary.js.map +0 -1
  158. package/dist/compliance/index.js +0 -288
  159. package/dist/compliance/index.js.map +0 -1
  160. package/dist/compliance/protocol-enforcement.js +0 -332
  161. package/dist/compliance/protocol-enforcement.js.map +0 -1
  162. package/dist/compliance/protocol-rules.js +0 -786
  163. package/dist/compliance/protocol-rules.js.map +0 -1
  164. package/dist/compliance/protocol-types.js +0 -80
  165. package/dist/compliance/protocol-types.js.map +0 -1
  166. package/dist/compliance/store.js +0 -53
  167. package/dist/compliance/store.js.map +0 -1
  168. package/dist/config/build-config.js +0 -29
  169. package/dist/config/build-config.js.map +0 -1
  170. package/dist/config.js +0 -287
  171. package/dist/config.js.map +0 -1
  172. package/dist/constants.js +0 -18
  173. package/dist/constants.js.map +0 -1
  174. package/dist/context/index.js +0 -137
  175. package/dist/context/index.js.map +0 -1
  176. package/dist/engine-result.js +0 -12
  177. package/dist/engine-result.js.map +0 -1
  178. package/dist/error-catalog.js +0 -404
  179. package/dist/error-catalog.js.map +0 -1
  180. package/dist/error-registry.js +0 -393
  181. package/dist/error-registry.js.map +0 -1
  182. package/dist/errors.js +0 -167
  183. package/dist/errors.js.map +0 -1
  184. package/dist/hooks/handlers/error-hooks.js +0 -43
  185. package/dist/hooks/handlers/error-hooks.js.map +0 -1
  186. package/dist/hooks/handlers/file-hooks.js +0 -80
  187. package/dist/hooks/handlers/file-hooks.js.map +0 -1
  188. package/dist/hooks/handlers/index.js +0 -19
  189. package/dist/hooks/handlers/index.js.map +0 -1
  190. package/dist/hooks/handlers/mcp-hooks.js +0 -80
  191. package/dist/hooks/handlers/mcp-hooks.js.map +0 -1
  192. package/dist/hooks/handlers/session-hooks.js +0 -73
  193. package/dist/hooks/handlers/session-hooks.js.map +0 -1
  194. package/dist/hooks/handlers/task-hooks.js +0 -63
  195. package/dist/hooks/handlers/task-hooks.js.map +0 -1
  196. package/dist/hooks/index.js +0 -13
  197. package/dist/hooks/index.js.map +0 -1
  198. package/dist/hooks/payload-schemas.js +0 -163
  199. package/dist/hooks/payload-schemas.js.map +0 -1
  200. package/dist/hooks/provider-hooks.js +0 -34
  201. package/dist/hooks/provider-hooks.js.map +0 -1
  202. package/dist/hooks/registry.js +0 -176
  203. package/dist/hooks/registry.js.map +0 -1
  204. package/dist/hooks/types.js +0 -62
  205. package/dist/hooks/types.js.map +0 -1
  206. package/dist/hooks.js +0 -136
  207. package/dist/hooks.js.map +0 -1
  208. package/dist/init.js +0 -711
  209. package/dist/init.js.map +0 -1
  210. package/dist/inject/index.js +0 -82
  211. package/dist/inject/index.js.map +0 -1
  212. package/dist/injection.js +0 -343
  213. package/dist/injection.js.map +0 -1
  214. package/dist/intelligence/impact.js +0 -499
  215. package/dist/intelligence/impact.js.map +0 -1
  216. package/dist/intelligence/index.js +0 -17
  217. package/dist/intelligence/index.js.map +0 -1
  218. package/dist/intelligence/patterns.js +0 -492
  219. package/dist/intelligence/patterns.js.map +0 -1
  220. package/dist/intelligence/prediction.js +0 -499
  221. package/dist/intelligence/prediction.js.map +0 -1
  222. package/dist/intelligence/types.js +0 -13
  223. package/dist/intelligence/types.js.map +0 -1
  224. package/dist/internal.js +0 -258
  225. package/dist/internal.js.map +0 -1
  226. package/dist/issue/create.js +0 -121
  227. package/dist/issue/create.js.map +0 -1
  228. package/dist/issue/diagnostics.js +0 -59
  229. package/dist/issue/diagnostics.js.map +0 -1
  230. package/dist/issue/index.js +0 -10
  231. package/dist/issue/index.js.map +0 -1
  232. package/dist/issue/template-parser.js +0 -267
  233. package/dist/issue/template-parser.js.map +0 -1
  234. package/dist/json-schema-validator.js +0 -76
  235. package/dist/json-schema-validator.js.map +0 -1
  236. package/dist/lifecycle/chain-composition.js +0 -152
  237. package/dist/lifecycle/chain-composition.js.map +0 -1
  238. package/dist/lifecycle/chain-store.js +0 -246
  239. package/dist/lifecycle/chain-store.js.map +0 -1
  240. package/dist/lifecycle/consolidate-rcasd.js +0 -352
  241. package/dist/lifecycle/consolidate-rcasd.js.map +0 -1
  242. package/dist/lifecycle/default-chain.js +0 -167
  243. package/dist/lifecycle/default-chain.js.map +0 -1
  244. package/dist/lifecycle/evidence.js +0 -180
  245. package/dist/lifecycle/evidence.js.map +0 -1
  246. package/dist/lifecycle/frontmatter.js +0 -363
  247. package/dist/lifecycle/frontmatter.js.map +0 -1
  248. package/dist/lifecycle/index.js +0 -753
  249. package/dist/lifecycle/index.js.map +0 -1
  250. package/dist/lifecycle/pipeline.js +0 -656
  251. package/dist/lifecycle/pipeline.js.map +0 -1
  252. package/dist/lifecycle/rcasd-index.js +0 -326
  253. package/dist/lifecycle/rcasd-index.js.map +0 -1
  254. package/dist/lifecycle/rcasd-paths.js +0 -220
  255. package/dist/lifecycle/rcasd-paths.js.map +0 -1
  256. package/dist/lifecycle/resume.js +0 -864
  257. package/dist/lifecycle/resume.js.map +0 -1
  258. package/dist/lifecycle/stage-artifacts.js +0 -94
  259. package/dist/lifecycle/stage-artifacts.js.map +0 -1
  260. package/dist/lifecycle/stages.js +0 -534
  261. package/dist/lifecycle/stages.js.map +0 -1
  262. package/dist/lifecycle/state-machine.js +0 -516
  263. package/dist/lifecycle/state-machine.js.map +0 -1
  264. package/dist/lifecycle/tessera-engine.js +0 -249
  265. package/dist/lifecycle/tessera-engine.js.map +0 -1
  266. package/dist/logger.js +0 -140
  267. package/dist/logger.js.map +0 -1
  268. package/dist/mcp/index.js +0 -146
  269. package/dist/mcp/index.js.map +0 -1
  270. package/dist/memory/auto-extract.js +0 -143
  271. package/dist/memory/auto-extract.js.map +0 -1
  272. package/dist/memory/brain-embedding.js +0 -49
  273. package/dist/memory/brain-embedding.js.map +0 -1
  274. package/dist/memory/brain-lifecycle.js +0 -298
  275. package/dist/memory/brain-lifecycle.js.map +0 -1
  276. package/dist/memory/brain-links.js +0 -148
  277. package/dist/memory/brain-links.js.map +0 -1
  278. package/dist/memory/brain-migration.js +0 -149
  279. package/dist/memory/brain-migration.js.map +0 -1
  280. package/dist/memory/brain-reasoning.js +0 -215
  281. package/dist/memory/brain-reasoning.js.map +0 -1
  282. package/dist/memory/brain-retrieval.js +0 -474
  283. package/dist/memory/brain-retrieval.js.map +0 -1
  284. package/dist/memory/brain-row-types.js +0 -10
  285. package/dist/memory/brain-row-types.js.map +0 -1
  286. package/dist/memory/brain-search.js +0 -519
  287. package/dist/memory/brain-search.js.map +0 -1
  288. package/dist/memory/brain-similarity.js +0 -145
  289. package/dist/memory/brain-similarity.js.map +0 -1
  290. package/dist/memory/claude-mem-migration.js +0 -277
  291. package/dist/memory/claude-mem-migration.js.map +0 -1
  292. package/dist/memory/decisions.js +0 -148
  293. package/dist/memory/decisions.js.map +0 -1
  294. package/dist/memory/engine-compat.js +0 -1030
  295. package/dist/memory/engine-compat.js.map +0 -1
  296. package/dist/memory/index.js +0 -773
  297. package/dist/memory/index.js.map +0 -1
  298. package/dist/memory/learnings.js +0 -121
  299. package/dist/memory/learnings.js.map +0 -1
  300. package/dist/memory/memory-bridge.js +0 -289
  301. package/dist/memory/memory-bridge.js.map +0 -1
  302. package/dist/memory/patterns.js +0 -122
  303. package/dist/memory/patterns.js.map +0 -1
  304. package/dist/memory/pipeline-manifest-sqlite.js +0 -975
  305. package/dist/memory/pipeline-manifest-sqlite.js.map +0 -1
  306. package/dist/memory/session-memory.js +0 -226
  307. package/dist/memory/session-memory.js.map +0 -1
  308. package/dist/metrics/ab-test.js +0 -260
  309. package/dist/metrics/ab-test.js.map +0 -1
  310. package/dist/metrics/aggregation.js +0 -363
  311. package/dist/metrics/aggregation.js.map +0 -1
  312. package/dist/metrics/common.js +0 -64
  313. package/dist/metrics/common.js.map +0 -1
  314. package/dist/metrics/enums.js +0 -78
  315. package/dist/metrics/enums.js.map +0 -1
  316. package/dist/metrics/index.js +0 -19
  317. package/dist/metrics/index.js.map +0 -1
  318. package/dist/metrics/model-provider-registry.js +0 -88
  319. package/dist/metrics/model-provider-registry.js.map +0 -1
  320. package/dist/metrics/otel-integration.js +0 -263
  321. package/dist/metrics/otel-integration.js.map +0 -1
  322. package/dist/metrics/provider-detection.js +0 -103
  323. package/dist/metrics/provider-detection.js.map +0 -1
  324. package/dist/metrics/token-estimation.js +0 -253
  325. package/dist/metrics/token-estimation.js.map +0 -1
  326. package/dist/metrics/token-service.js +0 -450
  327. package/dist/metrics/token-service.js.map +0 -1
  328. package/dist/migration/agent-outputs.js +0 -316
  329. package/dist/migration/agent-outputs.js.map +0 -1
  330. package/dist/migration/checksum.js +0 -92
  331. package/dist/migration/checksum.js.map +0 -1
  332. package/dist/migration/index.js +0 -282
  333. package/dist/migration/index.js.map +0 -1
  334. package/dist/migration/logger.js +0 -360
  335. package/dist/migration/logger.js.map +0 -1
  336. package/dist/migration/preflight.js +0 -9
  337. package/dist/migration/preflight.js.map +0 -1
  338. package/dist/migration/state.js +0 -421
  339. package/dist/migration/state.js.map +0 -1
  340. package/dist/migration/validate.js +0 -241
  341. package/dist/migration/validate.js.map +0 -1
  342. package/dist/nexus/deps.js +0 -375
  343. package/dist/nexus/deps.js.map +0 -1
  344. package/dist/nexus/discover.js +0 -288
  345. package/dist/nexus/discover.js.map +0 -1
  346. package/dist/nexus/hash.js +0 -10
  347. package/dist/nexus/hash.js.map +0 -1
  348. package/dist/nexus/index.js +0 -38
  349. package/dist/nexus/index.js.map +0 -1
  350. package/dist/nexus/migrate-json-to-sqlite.js +0 -115
  351. package/dist/nexus/migrate-json-to-sqlite.js.map +0 -1
  352. package/dist/nexus/permissions.js +0 -105
  353. package/dist/nexus/permissions.js.map +0 -1
  354. package/dist/nexus/query.js +0 -175
  355. package/dist/nexus/query.js.map +0 -1
  356. package/dist/nexus/registry.js +0 -584
  357. package/dist/nexus/registry.js.map +0 -1
  358. package/dist/nexus/sharing/index.js +0 -179
  359. package/dist/nexus/sharing/index.js.map +0 -1
  360. package/dist/nexus/transfer-types.js +0 -8
  361. package/dist/nexus/transfer-types.js.map +0 -1
  362. package/dist/nexus/transfer.js +0 -263
  363. package/dist/nexus/transfer.js.map +0 -1
  364. package/dist/observability/index.js +0 -103
  365. package/dist/observability/index.js.map +0 -1
  366. package/dist/observability/log-filter.js +0 -63
  367. package/dist/observability/log-filter.js.map +0 -1
  368. package/dist/observability/log-parser.js +0 -99
  369. package/dist/observability/log-parser.js.map +0 -1
  370. package/dist/observability/log-reader.js +0 -139
  371. package/dist/observability/log-reader.js.map +0 -1
  372. package/dist/observability/types.js +0 -19
  373. package/dist/observability/types.js.map +0 -1
  374. package/dist/orchestration/analyze.js +0 -107
  375. package/dist/orchestration/analyze.js.map +0 -1
  376. package/dist/orchestration/bootstrap.js +0 -132
  377. package/dist/orchestration/bootstrap.js.map +0 -1
  378. package/dist/orchestration/context.js +0 -56
  379. package/dist/orchestration/context.js.map +0 -1
  380. package/dist/orchestration/critical-path.js +0 -100
  381. package/dist/orchestration/critical-path.js.map +0 -1
  382. package/dist/orchestration/index.js +0 -286
  383. package/dist/orchestration/index.js.map +0 -1
  384. package/dist/orchestration/parallel.js +0 -89
  385. package/dist/orchestration/parallel.js.map +0 -1
  386. package/dist/orchestration/protocol-validators.js +0 -524
  387. package/dist/orchestration/protocol-validators.js.map +0 -1
  388. package/dist/orchestration/skill-ops.js +0 -98
  389. package/dist/orchestration/skill-ops.js.map +0 -1
  390. package/dist/orchestration/status.js +0 -107
  391. package/dist/orchestration/status.js.map +0 -1
  392. package/dist/orchestration/unblock.js +0 -103
  393. package/dist/orchestration/unblock.js.map +0 -1
  394. package/dist/orchestration/validate-spawn.js +0 -67
  395. package/dist/orchestration/validate-spawn.js.map +0 -1
  396. package/dist/orchestration/waves.js +0 -86
  397. package/dist/orchestration/waves.js.map +0 -1
  398. package/dist/otel/index.js +0 -163
  399. package/dist/otel/index.js.map +0 -1
  400. package/dist/output.js +0 -132
  401. package/dist/output.js.map +0 -1
  402. package/dist/pagination.js +0 -61
  403. package/dist/pagination.js.map +0 -1
  404. package/dist/paths.js +0 -337
  405. package/dist/paths.js.map +0 -1
  406. package/dist/phases/deps.js +0 -369
  407. package/dist/phases/deps.js.map +0 -1
  408. package/dist/phases/index.js +0 -349
  409. package/dist/phases/index.js.map +0 -1
  410. package/dist/pipeline/index.js +0 -10
  411. package/dist/pipeline/index.js.map +0 -1
  412. package/dist/pipeline/phase.js +0 -45
  413. package/dist/pipeline/phase.js.map +0 -1
  414. package/dist/platform.js +0 -211
  415. package/dist/platform.js.map +0 -1
  416. package/dist/project-info.js +0 -84
  417. package/dist/project-info.js.map +0 -1
  418. package/dist/reconciliation/index.js +0 -10
  419. package/dist/reconciliation/index.js.map +0 -1
  420. package/dist/reconciliation/link-store.js +0 -129
  421. package/dist/reconciliation/link-store.js.map +0 -1
  422. package/dist/reconciliation/reconciliation-engine.js +0 -298
  423. package/dist/reconciliation/reconciliation-engine.js.map +0 -1
  424. package/dist/release/artifacts.js +0 -427
  425. package/dist/release/artifacts.js.map +0 -1
  426. package/dist/release/changelog-writer.js +0 -151
  427. package/dist/release/changelog-writer.js.map +0 -1
  428. package/dist/release/channel.js +0 -144
  429. package/dist/release/channel.js.map +0 -1
  430. package/dist/release/ci.js +0 -166
  431. package/dist/release/ci.js.map +0 -1
  432. package/dist/release/github-pr.js +0 -225
  433. package/dist/release/github-pr.js.map +0 -1
  434. package/dist/release/guards.js +0 -116
  435. package/dist/release/guards.js.map +0 -1
  436. package/dist/release/index.js +0 -22
  437. package/dist/release/index.js.map +0 -1
  438. package/dist/release/release-config.js +0 -158
  439. package/dist/release/release-config.js.map +0 -1
  440. package/dist/release/release-manifest.js +0 -1019
  441. package/dist/release/release-manifest.js.map +0 -1
  442. package/dist/release/version-bump.js +0 -255
  443. package/dist/release/version-bump.js.map +0 -1
  444. package/dist/remote/index.js +0 -257
  445. package/dist/remote/index.js.map +0 -1
  446. package/dist/repair.js +0 -89
  447. package/dist/repair.js.map +0 -1
  448. package/dist/research/index.js +0 -2
  449. package/dist/research/index.js.map +0 -1
  450. package/dist/roadmap/index.js +0 -59
  451. package/dist/roadmap/index.js.map +0 -1
  452. package/dist/routing/capability-matrix.js +0 -1550
  453. package/dist/routing/capability-matrix.js.map +0 -1
  454. package/dist/routing/index.js +0 -9
  455. package/dist/routing/index.js.map +0 -1
  456. package/dist/scaffold.js +0 -1158
  457. package/dist/scaffold.js.map +0 -1
  458. package/dist/schema-management.js +0 -295
  459. package/dist/schema-management.js.map +0 -1
  460. package/dist/security/index.js +0 -9
  461. package/dist/security/index.js.map +0 -1
  462. package/dist/security/input-sanitization.js +0 -321
  463. package/dist/security/input-sanitization.js.map +0 -1
  464. package/dist/sequence/index.js +0 -295
  465. package/dist/sequence/index.js.map +0 -1
  466. package/dist/sessions/assumptions.js +0 -54
  467. package/dist/sessions/assumptions.js.map +0 -1
  468. package/dist/sessions/briefing.js +0 -377
  469. package/dist/sessions/briefing.js.map +0 -1
  470. package/dist/sessions/context-alert.js +0 -222
  471. package/dist/sessions/context-alert.js.map +0 -1
  472. package/dist/sessions/context-inject.js +0 -61
  473. package/dist/sessions/context-inject.js.map +0 -1
  474. package/dist/sessions/context-monitor.js +0 -98
  475. package/dist/sessions/context-monitor.js.map +0 -1
  476. package/dist/sessions/decisions.js +0 -65
  477. package/dist/sessions/decisions.js.map +0 -1
  478. package/dist/sessions/find.js +0 -63
  479. package/dist/sessions/find.js.map +0 -1
  480. package/dist/sessions/handoff.js +0 -328
  481. package/dist/sessions/handoff.js.map +0 -1
  482. package/dist/sessions/hitl-warnings.js +0 -254
  483. package/dist/sessions/hitl-warnings.js.map +0 -1
  484. package/dist/sessions/index.js +0 -318
  485. package/dist/sessions/index.js.map +0 -1
  486. package/dist/sessions/session-archive.js +0 -40
  487. package/dist/sessions/session-archive.js.map +0 -1
  488. package/dist/sessions/session-cleanup.js +0 -59
  489. package/dist/sessions/session-cleanup.js.map +0 -1
  490. package/dist/sessions/session-drift.js +0 -134
  491. package/dist/sessions/session-drift.js.map +0 -1
  492. package/dist/sessions/session-enforcement.js +0 -140
  493. package/dist/sessions/session-enforcement.js.map +0 -1
  494. package/dist/sessions/session-grade.js +0 -253
  495. package/dist/sessions/session-grade.js.map +0 -1
  496. package/dist/sessions/session-history.js +0 -42
  497. package/dist/sessions/session-history.js.map +0 -1
  498. package/dist/sessions/session-id.js +0 -81
  499. package/dist/sessions/session-id.js.map +0 -1
  500. package/dist/sessions/session-memory-bridge.js +0 -52
  501. package/dist/sessions/session-memory-bridge.js.map +0 -1
  502. package/dist/sessions/session-show.js +0 -24
  503. package/dist/sessions/session-show.js.map +0 -1
  504. package/dist/sessions/session-stats.js +0 -69
  505. package/dist/sessions/session-stats.js.map +0 -1
  506. package/dist/sessions/session-suspend.js +0 -39
  507. package/dist/sessions/session-suspend.js.map +0 -1
  508. package/dist/sessions/session-switch.js +0 -51
  509. package/dist/sessions/session-switch.js.map +0 -1
  510. package/dist/sessions/session-view.js +0 -76
  511. package/dist/sessions/session-view.js.map +0 -1
  512. package/dist/sessions/statusline-setup.js +0 -85
  513. package/dist/sessions/statusline-setup.js.map +0 -1
  514. package/dist/sessions/types.js +0 -8
  515. package/dist/sessions/types.js.map +0 -1
  516. package/dist/signaldock/claude-code-transport.js +0 -107
  517. package/dist/signaldock/claude-code-transport.js.map +0 -1
  518. package/dist/signaldock/factory.js +0 -25
  519. package/dist/signaldock/factory.js.map +0 -1
  520. package/dist/signaldock/index.js +0 -9
  521. package/dist/signaldock/index.js.map +0 -1
  522. package/dist/signaldock/signaldock-transport.js +0 -122
  523. package/dist/signaldock/signaldock-transport.js.map +0 -1
  524. package/dist/signaldock/transport.js +0 -11
  525. package/dist/signaldock/transport.js.map +0 -1
  526. package/dist/signaldock/types.js +0 -11
  527. package/dist/signaldock/types.js.map +0 -1
  528. package/dist/skills/agents/config.js +0 -94
  529. package/dist/skills/agents/config.js.map +0 -1
  530. package/dist/skills/agents/install.js +0 -116
  531. package/dist/skills/agents/install.js.map +0 -1
  532. package/dist/skills/agents/registry.js +0 -161
  533. package/dist/skills/agents/registry.js.map +0 -1
  534. package/dist/skills/discovery.js +0 -333
  535. package/dist/skills/discovery.js.map +0 -1
  536. package/dist/skills/dispatch.js +0 -347
  537. package/dist/skills/dispatch.js.map +0 -1
  538. package/dist/skills/dynamic-skill-generator.js +0 -100
  539. package/dist/skills/dynamic-skill-generator.js.map +0 -1
  540. package/dist/skills/index.js +0 -44
  541. package/dist/skills/index.js.map +0 -1
  542. package/dist/skills/injection/subagent.js +0 -195
  543. package/dist/skills/injection/subagent.js.map +0 -1
  544. package/dist/skills/injection/token.js +0 -260
  545. package/dist/skills/injection/token.js.map +0 -1
  546. package/dist/skills/install.js +0 -40
  547. package/dist/skills/install.js.map +0 -1
  548. package/dist/skills/manifests/contribution.js +0 -175
  549. package/dist/skills/manifests/contribution.js.map +0 -1
  550. package/dist/skills/manifests/research.js +0 -281
  551. package/dist/skills/manifests/research.js.map +0 -1
  552. package/dist/skills/manifests/resolver.js +0 -146
  553. package/dist/skills/manifests/resolver.js.map +0 -1
  554. package/dist/skills/marketplace.js +0 -90
  555. package/dist/skills/marketplace.js.map +0 -1
  556. package/dist/skills/orchestrator/spawn.js +0 -178
  557. package/dist/skills/orchestrator/spawn.js.map +0 -1
  558. package/dist/skills/orchestrator/startup.js +0 -451
  559. package/dist/skills/orchestrator/startup.js.map +0 -1
  560. package/dist/skills/orchestrator/validator.js +0 -301
  561. package/dist/skills/orchestrator/validator.js.map +0 -1
  562. package/dist/skills/precedence-integration.js +0 -73
  563. package/dist/skills/precedence-integration.js.map +0 -1
  564. package/dist/skills/precedence-types.js +0 -16
  565. package/dist/skills/precedence-types.js.map +0 -1
  566. package/dist/skills/routing-table.js +0 -63
  567. package/dist/skills/routing-table.js.map +0 -1
  568. package/dist/skills/skill-paths.js +0 -220
  569. package/dist/skills/skill-paths.js.map +0 -1
  570. package/dist/skills/test-utility.js +0 -55
  571. package/dist/skills/test-utility.js.map +0 -1
  572. package/dist/skills/types.js +0 -118
  573. package/dist/skills/types.js.map +0 -1
  574. package/dist/skills/validation.js +0 -183
  575. package/dist/skills/validation.js.map +0 -1
  576. package/dist/skills/version.js +0 -57
  577. package/dist/skills/version.js.map +0 -1
  578. package/dist/snapshot/index.js +0 -188
  579. package/dist/snapshot/index.js.map +0 -1
  580. package/dist/spawn/adapter-registry.js +0 -246
  581. package/dist/spawn/adapter-registry.js.map +0 -1
  582. package/dist/spawn/index.js +0 -10
  583. package/dist/spawn/index.js.map +0 -1
  584. package/dist/stats/index.js +0 -339
  585. package/dist/stats/index.js.map +0 -1
  586. package/dist/sticky/archive.js +0 -47
  587. package/dist/sticky/archive.js.map +0 -1
  588. package/dist/sticky/convert.js +0 -235
  589. package/dist/sticky/convert.js.map +0 -1
  590. package/dist/sticky/create.js +0 -48
  591. package/dist/sticky/create.js.map +0 -1
  592. package/dist/sticky/id.js +0 -35
  593. package/dist/sticky/id.js.map +0 -1
  594. package/dist/sticky/index.js +0 -16
  595. package/dist/sticky/index.js.map +0 -1
  596. package/dist/sticky/list.js +0 -44
  597. package/dist/sticky/list.js.map +0 -1
  598. package/dist/sticky/purge.js +0 -45
  599. package/dist/sticky/purge.js.map +0 -1
  600. package/dist/sticky/show.js +0 -42
  601. package/dist/sticky/show.js.map +0 -1
  602. package/dist/sticky/types.js +0 -10
  603. package/dist/sticky/types.js.map +0 -1
  604. package/dist/store/atomic.js +0 -167
  605. package/dist/store/atomic.js.map +0 -1
  606. package/dist/store/backup.js +0 -94
  607. package/dist/store/backup.js.map +0 -1
  608. package/dist/store/brain-accessor.js +0 -397
  609. package/dist/store/brain-accessor.js.map +0 -1
  610. package/dist/store/brain-schema.js +0 -212
  611. package/dist/store/brain-schema.js.map +0 -1
  612. package/dist/store/brain-sqlite.js +0 -271
  613. package/dist/store/brain-sqlite.js.map +0 -1
  614. package/dist/store/cache.js +0 -168
  615. package/dist/store/cache.js.map +0 -1
  616. package/dist/store/chain-schema.js +0 -51
  617. package/dist/store/chain-schema.js.map +0 -1
  618. package/dist/store/converters.js +0 -120
  619. package/dist/store/converters.js.map +0 -1
  620. package/dist/store/data-accessor.js +0 -26
  621. package/dist/store/data-accessor.js.map +0 -1
  622. package/dist/store/data-safety-central.js +0 -269
  623. package/dist/store/data-safety-central.js.map +0 -1
  624. package/dist/store/data-safety.js +0 -274
  625. package/dist/store/data-safety.js.map +0 -1
  626. package/dist/store/db-helpers.js +0 -221
  627. package/dist/store/db-helpers.js.map +0 -1
  628. package/dist/store/export.js +0 -155
  629. package/dist/store/export.js.map +0 -1
  630. package/dist/store/file-utils.js +0 -270
  631. package/dist/store/file-utils.js.map +0 -1
  632. package/dist/store/git-checkpoint.js +0 -365
  633. package/dist/store/git-checkpoint.js.map +0 -1
  634. package/dist/store/import-logging.js +0 -139
  635. package/dist/store/import-logging.js.map +0 -1
  636. package/dist/store/import-remap.js +0 -145
  637. package/dist/store/import-remap.js.map +0 -1
  638. package/dist/store/import-sort.js +0 -121
  639. package/dist/store/import-sort.js.map +0 -1
  640. package/dist/store/index.js +0 -28
  641. package/dist/store/index.js.map +0 -1
  642. package/dist/store/json.js +0 -208
  643. package/dist/store/json.js.map +0 -1
  644. package/dist/store/lifecycle-store.js +0 -249
  645. package/dist/store/lifecycle-store.js.map +0 -1
  646. package/dist/store/lock.js +0 -70
  647. package/dist/store/lock.js.map +0 -1
  648. package/dist/store/migration-sqlite.js +0 -671
  649. package/dist/store/migration-sqlite.js.map +0 -1
  650. package/dist/store/nexus-schema.js +0 -62
  651. package/dist/store/nexus-schema.js.map +0 -1
  652. package/dist/store/nexus-sqlite.js +0 -217
  653. package/dist/store/nexus-sqlite.js.map +0 -1
  654. package/dist/store/nexus-validation-schemas.js +0 -40
  655. package/dist/store/nexus-validation-schemas.js.map +0 -1
  656. package/dist/store/parsers.js +0 -37
  657. package/dist/store/parsers.js.map +0 -1
  658. package/dist/store/project-detect.js +0 -457
  659. package/dist/store/project-detect.js.map +0 -1
  660. package/dist/store/provider.js +0 -101
  661. package/dist/store/provider.js.map +0 -1
  662. package/dist/store/safety-data-accessor.js +0 -243
  663. package/dist/store/safety-data-accessor.js.map +0 -1
  664. package/dist/store/schema.js +0 -7
  665. package/dist/store/schema.js.map +0 -1
  666. package/dist/store/session-store.js +0 -219
  667. package/dist/store/session-store.js.map +0 -1
  668. package/dist/store/sqlite-backup.js +0 -105
  669. package/dist/store/sqlite-backup.js.map +0 -1
  670. package/dist/store/sqlite-data-accessor.js +0 -742
  671. package/dist/store/sqlite-data-accessor.js.map +0 -1
  672. package/dist/store/sqlite.js +0 -489
  673. package/dist/store/sqlite.js.map +0 -1
  674. package/dist/store/status-registry.js +0 -8
  675. package/dist/store/status-registry.js.map +0 -1
  676. package/dist/store/task-store.js +0 -344
  677. package/dist/store/task-store.js.map +0 -1
  678. package/dist/store/tasks-schema.js +0 -574
  679. package/dist/store/tasks-schema.js.map +0 -1
  680. package/dist/store/typed-query.js +0 -15
  681. package/dist/store/typed-query.js.map +0 -1
  682. package/dist/store/validation-schemas.js +0 -278
  683. package/dist/store/validation-schemas.js.map +0 -1
  684. package/dist/system/archive-analytics.js +0 -277
  685. package/dist/system/archive-analytics.js.map +0 -1
  686. package/dist/system/archive-stats.js +0 -64
  687. package/dist/system/archive-stats.js.map +0 -1
  688. package/dist/system/audit.js +0 -145
  689. package/dist/system/audit.js.map +0 -1
  690. package/dist/system/backup.js +0 -99
  691. package/dist/system/backup.js.map +0 -1
  692. package/dist/system/cleanup.js +0 -134
  693. package/dist/system/cleanup.js.map +0 -1
  694. package/dist/system/health.js +0 -1054
  695. package/dist/system/health.js.map +0 -1
  696. package/dist/system/index.js +0 -18
  697. package/dist/system/index.js.map +0 -1
  698. package/dist/system/inject-generate.js +0 -122
  699. package/dist/system/inject-generate.js.map +0 -1
  700. package/dist/system/labels.js +0 -38
  701. package/dist/system/labels.js.map +0 -1
  702. package/dist/system/metrics.js +0 -61
  703. package/dist/system/metrics.js.map +0 -1
  704. package/dist/system/migrate.js +0 -43
  705. package/dist/system/migrate.js.map +0 -1
  706. package/dist/system/platform-paths.js +0 -80
  707. package/dist/system/platform-paths.js.map +0 -1
  708. package/dist/system/runtime.js +0 -161
  709. package/dist/system/runtime.js.map +0 -1
  710. package/dist/system/safestop.js +0 -99
  711. package/dist/system/safestop.js.map +0 -1
  712. package/dist/system/storage-preflight.js +0 -123
  713. package/dist/system/storage-preflight.js.map +0 -1
  714. package/dist/task-work/index.js +0 -155
  715. package/dist/task-work/index.js.map +0 -1
  716. package/dist/tasks/add.js +0 -510
  717. package/dist/tasks/add.js.map +0 -1
  718. package/dist/tasks/analyze.js +0 -85
  719. package/dist/tasks/analyze.js.map +0 -1
  720. package/dist/tasks/archive.js +0 -90
  721. package/dist/tasks/archive.js.map +0 -1
  722. package/dist/tasks/atomicity.js +0 -83
  723. package/dist/tasks/atomicity.js.map +0 -1
  724. package/dist/tasks/cancel-ops.js +0 -83
  725. package/dist/tasks/cancel-ops.js.map +0 -1
  726. package/dist/tasks/complete.js +0 -224
  727. package/dist/tasks/complete.js.map +0 -1
  728. package/dist/tasks/crossref-extract.js +0 -73
  729. package/dist/tasks/crossref-extract.js.map +0 -1
  730. package/dist/tasks/delete-preview.js +0 -192
  731. package/dist/tasks/delete-preview.js.map +0 -1
  732. package/dist/tasks/delete.js +0 -120
  733. package/dist/tasks/delete.js.map +0 -1
  734. package/dist/tasks/deletion-strategy.js +0 -200
  735. package/dist/tasks/deletion-strategy.js.map +0 -1
  736. package/dist/tasks/dependency-check.js +0 -278
  737. package/dist/tasks/dependency-check.js.map +0 -1
  738. package/dist/tasks/deps-ready.js +0 -32
  739. package/dist/tasks/deps-ready.js.map +0 -1
  740. package/dist/tasks/enforcement.js +0 -82
  741. package/dist/tasks/enforcement.js.map +0 -1
  742. package/dist/tasks/find.js +0 -148
  743. package/dist/tasks/find.js.map +0 -1
  744. package/dist/tasks/graph-cache.js +0 -127
  745. package/dist/tasks/graph-cache.js.map +0 -1
  746. package/dist/tasks/graph-ops.js +0 -171
  747. package/dist/tasks/graph-ops.js.map +0 -1
  748. package/dist/tasks/graph-rag.js +0 -328
  749. package/dist/tasks/graph-rag.js.map +0 -1
  750. package/dist/tasks/hierarchy-policy.js +0 -149
  751. package/dist/tasks/hierarchy-policy.js.map +0 -1
  752. package/dist/tasks/hierarchy.js +0 -185
  753. package/dist/tasks/hierarchy.js.map +0 -1
  754. package/dist/tasks/id-generator.js +0 -65
  755. package/dist/tasks/id-generator.js.map +0 -1
  756. package/dist/tasks/index.js +0 -14
  757. package/dist/tasks/index.js.map +0 -1
  758. package/dist/tasks/labels.js +0 -52
  759. package/dist/tasks/labels.js.map +0 -1
  760. package/dist/tasks/list.js +0 -68
  761. package/dist/tasks/list.js.map +0 -1
  762. package/dist/tasks/phase-tracking.js +0 -133
  763. package/dist/tasks/phase-tracking.js.map +0 -1
  764. package/dist/tasks/plan.js +0 -268
  765. package/dist/tasks/plan.js.map +0 -1
  766. package/dist/tasks/relates.js +0 -89
  767. package/dist/tasks/relates.js.map +0 -1
  768. package/dist/tasks/reparent.d.ts +0 -38
  769. package/dist/tasks/reparent.d.ts.map +0 -1
  770. package/dist/tasks/show.js +0 -78
  771. package/dist/tasks/show.js.map +0 -1
  772. package/dist/tasks/size-weighting.js +0 -86
  773. package/dist/tasks/size-weighting.js.map +0 -1
  774. package/dist/tasks/staleness.js +0 -86
  775. package/dist/tasks/staleness.js.map +0 -1
  776. package/dist/tasks/task-ops.js +0 -1340
  777. package/dist/tasks/task-ops.js.map +0 -1
  778. package/dist/tasks/update.js +0 -243
  779. package/dist/tasks/update.js.map +0 -1
  780. package/dist/templates/index.js +0 -10
  781. package/dist/templates/index.js.map +0 -1
  782. package/dist/templates/parser.js +0 -254
  783. package/dist/templates/parser.js.map +0 -1
  784. package/dist/ui/aliases.js +0 -153
  785. package/dist/ui/aliases.js.map +0 -1
  786. package/dist/ui/changelog.js +0 -184
  787. package/dist/ui/changelog.js.map +0 -1
  788. package/dist/ui/command-registry.js +0 -168
  789. package/dist/ui/command-registry.js.map +0 -1
  790. package/dist/ui/flags.js +0 -94
  791. package/dist/ui/flags.js.map +0 -1
  792. package/dist/ui/index.js +0 -24
  793. package/dist/ui/index.js.map +0 -1
  794. package/dist/ui/injection-legacy.d.ts +0 -26
  795. package/dist/ui/injection-legacy.d.ts.map +0 -1
  796. package/dist/ui/injection-legacy.js +0 -42
  797. package/dist/ui/injection-legacy.js.map +0 -1
  798. package/dist/upgrade.js +0 -901
  799. package/dist/upgrade.js.map +0 -1
  800. package/dist/validation/chain-validation.js +0 -146
  801. package/dist/validation/chain-validation.js.map +0 -1
  802. package/dist/validation/compliance.js +0 -155
  803. package/dist/validation/compliance.js.map +0 -1
  804. package/dist/validation/docs-sync.js +0 -212
  805. package/dist/validation/docs-sync.js.map +0 -1
  806. package/dist/validation/doctor/checks.js +0 -1069
  807. package/dist/validation/doctor/checks.js.map +0 -1
  808. package/dist/validation/doctor/index.js +0 -9
  809. package/dist/validation/doctor/index.js.map +0 -1
  810. package/dist/validation/doctor/project-cache.js +0 -160
  811. package/dist/validation/doctor/project-cache.js.map +0 -1
  812. package/dist/validation/doctor/utils.js +0 -155
  813. package/dist/validation/doctor/utils.js.map +0 -1
  814. package/dist/validation/engine.js +0 -902
  815. package/dist/validation/engine.js.map +0 -1
  816. package/dist/validation/gap-check.js +0 -175
  817. package/dist/validation/gap-check.js.map +0 -1
  818. package/dist/validation/index.js +0 -40
  819. package/dist/validation/index.js.map +0 -1
  820. package/dist/validation/manifest.js +0 -237
  821. package/dist/validation/manifest.js.map +0 -1
  822. package/dist/validation/operation-gate-validators.js +0 -724
  823. package/dist/validation/operation-gate-validators.js.map +0 -1
  824. package/dist/validation/operation-verification-gates.js +0 -532
  825. package/dist/validation/operation-verification-gates.js.map +0 -1
  826. package/dist/validation/param-utils.js +0 -139
  827. package/dist/validation/param-utils.js.map +0 -1
  828. package/dist/validation/protocol-common.js +0 -300
  829. package/dist/validation/protocol-common.js.map +0 -1
  830. package/dist/validation/protocols/consensus.js +0 -71
  831. package/dist/validation/protocols/consensus.js.map +0 -1
  832. package/dist/validation/protocols/contribution.js +0 -59
  833. package/dist/validation/protocols/contribution.js.map +0 -1
  834. package/dist/validation/protocols/decomposition.js +0 -59
  835. package/dist/validation/protocols/decomposition.js.map +0 -1
  836. package/dist/validation/protocols/implementation.js +0 -59
  837. package/dist/validation/protocols/implementation.js.map +0 -1
  838. package/dist/validation/protocols/release-protocol.js +0 -60
  839. package/dist/validation/protocols/release-protocol.js.map +0 -1
  840. package/dist/validation/protocols/research.js +0 -77
  841. package/dist/validation/protocols/research.js.map +0 -1
  842. package/dist/validation/protocols/specification.js +0 -84
  843. package/dist/validation/protocols/specification.js.map +0 -1
  844. package/dist/validation/protocols/testing-protocol.js +0 -70
  845. package/dist/validation/protocols/testing-protocol.js.map +0 -1
  846. package/dist/validation/protocols/validation-protocol.js +0 -70
  847. package/dist/validation/protocols/validation-protocol.js.map +0 -1
  848. package/dist/validation/schema-integrity.js +0 -170
  849. package/dist/validation/schema-integrity.js.map +0 -1
  850. package/dist/validation/schema-validator.js +0 -176
  851. package/dist/validation/schema-validator.js.map +0 -1
  852. package/dist/validation/validate-ops.js +0 -937
  853. package/dist/validation/validate-ops.js.map +0 -1
  854. package/dist/validation/validation-rules.js +0 -226
  855. package/dist/validation/validation-rules.js.map +0 -1
  856. package/dist/validation/verification.js +0 -321
  857. package/dist/validation/verification.js.map +0 -1
@@ -0,0 +1,394 @@
1
+ /**
2
+ * Agent registry with capacity tracking for load balancing.
3
+ *
4
+ * Provides task-count-based capacity queries, specialization lookup,
5
+ * and performance recording on top of the existing `agent_instances` schema.
6
+ *
7
+ * Capacity model: each agent has a maximum of {@link MAX_TASKS_PER_AGENT}
8
+ * concurrent tasks. "Remaining capacity" is that constant minus the number of
9
+ * tasks currently assigned to an active agent instance.
10
+ *
11
+ * Specializations are stored as a `specializations` array inside the agent's
12
+ * `metadata_json` column. Use {@link updateAgentSpecializations} to write them.
13
+ *
14
+ * Performance recording delegates to the existing `recordAgentExecution`
15
+ * function in `execution-learning.ts` and wraps it with a simpler metrics
16
+ * interface suited for load-balancer callers.
17
+ *
18
+ * @module agents/agent-registry
19
+ * @task T041
20
+ * @epic T038
21
+ */
22
+
23
+ import { and, eq, inArray } from 'drizzle-orm';
24
+ import { getDb } from '../store/sqlite.js';
25
+ import { type AgentInstanceRow, type AgentType, agentInstances } from './agent-schema.js';
26
+ import {
27
+ type AgentExecutionEvent,
28
+ type AgentExecutionOutcome,
29
+ recordAgentExecution,
30
+ } from './execution-learning.js';
31
+ import { listAgentInstances } from './registry.js';
32
+
33
+ // ============================================================================
34
+ // Constants
35
+ // ============================================================================
36
+
37
+ /**
38
+ * Maximum number of tasks that can be concurrently assigned to one agent.
39
+ * Used as the upper bound for task-count-based capacity calculation.
40
+ */
41
+ export const MAX_TASKS_PER_AGENT = 5;
42
+
43
+ // ============================================================================
44
+ // Types
45
+ // ============================================================================
46
+
47
+ /**
48
+ * Task-count-based capacity for a single agent instance.
49
+ */
50
+ export interface AgentCapacity {
51
+ /** Agent instance ID. */
52
+ agentId: string;
53
+ /** Agent type classification. */
54
+ agentType: AgentType;
55
+ /** Current status of the agent. */
56
+ status: AgentInstanceRow['status'];
57
+ /** Number of tasks currently assigned to this agent. */
58
+ activeTasks: number;
59
+ /** Number of additional tasks this agent can accept (max - active). */
60
+ remainingCapacity: number;
61
+ /** Maximum tasks this agent can hold ({@link MAX_TASKS_PER_AGENT}). */
62
+ maxCapacity: number;
63
+ /** Whether this agent can accept new tasks. */
64
+ available: boolean;
65
+ }
66
+
67
+ /**
68
+ * Metrics provided when recording agent performance.
69
+ */
70
+ export interface AgentPerformanceMetrics {
71
+ /** Task ID that was processed. */
72
+ taskId: string;
73
+ /** Task type label (e.g. "epic", "task", "subtask"). */
74
+ taskType: string;
75
+ /** Outcome of the agent's work on the task. */
76
+ outcome: AgentExecutionOutcome;
77
+ /** Optional task labels for richer pattern classification. */
78
+ taskLabels?: string[];
79
+ /** Session ID the agent was operating under. */
80
+ sessionId?: string;
81
+ /** Duration of execution in milliseconds. */
82
+ durationMs?: number;
83
+ /** Error message if outcome is "failure". */
84
+ errorMessage?: string;
85
+ /** Error classification if outcome is "failure". */
86
+ errorType?: 'retriable' | 'permanent' | 'unknown';
87
+ }
88
+
89
+ // ============================================================================
90
+ // Capacity queries
91
+ // ============================================================================
92
+
93
+ /**
94
+ * Get task-count-based remaining capacity for an agent.
95
+ *
96
+ * Remaining capacity = {@link MAX_TASKS_PER_AGENT} minus the number of tasks
97
+ * currently routed to this agent instance (tracked via the `task_id` column
98
+ * on `agent_instances` — each instance handles one task at a time; child agents
99
+ * spawned by an orchestrator appear as sibling rows referencing the same
100
+ * `parent_agent_id`).
101
+ *
102
+ * For capacity purposes the "active tasks" count is derived from the number of
103
+ * non-terminal sibling rows that share the same `parent_agent_id` as this
104
+ * agent, plus 1 for the agent's own current task when `task_id` is set.
105
+ *
106
+ * @remarks
107
+ * Agents in terminal states (`stopped`, `crashed`) always return 0 remaining
108
+ * capacity because they cannot accept work.
109
+ *
110
+ * @param agentId - Agent instance ID (agt_...) to check
111
+ * @param cwd - Working directory used to resolve tasks.db path
112
+ * @returns Capacity breakdown or null if the agent does not exist
113
+ *
114
+ * @example
115
+ * ```ts
116
+ * const cap = await getAgentCapacity('agt_20260321120000_ab12cd', '/project');
117
+ * if (cap && cap.available) {
118
+ * console.log(`Agent can take ${cap.remainingCapacity} more tasks`);
119
+ * }
120
+ * ```
121
+ */
122
+ export async function getAgentCapacity(
123
+ agentId: string,
124
+ cwd?: string,
125
+ ): Promise<AgentCapacity | null> {
126
+ const db = await getDb(cwd);
127
+
128
+ const agent = await db.select().from(agentInstances).where(eq(agentInstances.id, agentId)).get();
129
+
130
+ if (!agent) return null;
131
+
132
+ // Terminal agents have zero capacity
133
+ const isTerminal = agent.status === 'stopped' || agent.status === 'crashed';
134
+ if (isTerminal) {
135
+ return {
136
+ agentId: agent.id,
137
+ agentType: agent.agentType,
138
+ status: agent.status,
139
+ activeTasks: 0,
140
+ remainingCapacity: 0,
141
+ maxCapacity: MAX_TASKS_PER_AGENT,
142
+ available: false,
143
+ };
144
+ }
145
+
146
+ // Count active child agents (subtasks delegated by this agent)
147
+ const children = await db
148
+ .select({ id: agentInstances.id })
149
+ .from(agentInstances)
150
+ .where(
151
+ and(
152
+ eq(agentInstances.parentAgentId, agentId),
153
+ inArray(agentInstances.status, ['starting', 'active', 'idle', 'error']),
154
+ ),
155
+ )
156
+ .all();
157
+
158
+ // The agent itself counts as 1 active task when it has a task assigned
159
+ const selfTask = agent.taskId != null ? 1 : 0;
160
+ const activeTasks = selfTask + children.length;
161
+ const remainingCapacity = Math.max(0, MAX_TASKS_PER_AGENT - activeTasks);
162
+
163
+ return {
164
+ agentId: agent.id,
165
+ agentType: agent.agentType,
166
+ status: agent.status,
167
+ activeTasks,
168
+ remainingCapacity,
169
+ maxCapacity: MAX_TASKS_PER_AGENT,
170
+ available: remainingCapacity > 0,
171
+ };
172
+ }
173
+
174
+ /**
175
+ * List all non-terminal agents sorted by remaining task capacity (descending).
176
+ *
177
+ * Returns agents with the most available slots first, enabling callers to
178
+ * select the least-loaded agent for new work assignment.
179
+ *
180
+ * @remarks
181
+ * Only agents in `active` or `idle` states are included — `starting` agents
182
+ * are excluded because they may not yet be ready to accept work.
183
+ * Terminal agents (`stopped`, `crashed`) are always omitted.
184
+ *
185
+ * @param agentType - Optional filter to limit results to one agent type
186
+ * @param cwd - Working directory used to resolve tasks.db path
187
+ * @returns Array of capacity entries sorted highest remaining capacity first
188
+ *
189
+ * @example
190
+ * ```ts
191
+ * const agents = await getAgentsByCapacity('executor', '/project');
192
+ * const best = agents[0]; // most available slots
193
+ * if (best && best.available) {
194
+ * await assignTask(best.agentId, taskId);
195
+ * }
196
+ * ```
197
+ */
198
+ export async function getAgentsByCapacity(
199
+ agentType?: AgentType,
200
+ cwd?: string,
201
+ ): Promise<AgentCapacity[]> {
202
+ const filters: Parameters<typeof listAgentInstances>[0] = agentType
203
+ ? { status: ['active', 'idle'] as ('active' | 'idle')[], agentType }
204
+ : { status: ['active', 'idle'] as ('active' | 'idle')[] };
205
+
206
+ const activeAgents = await listAgentInstances(filters, cwd);
207
+
208
+ const capacities = await Promise.all(
209
+ activeAgents.map((agent) => getAgentCapacity(agent.id, cwd)),
210
+ );
211
+
212
+ return capacities
213
+ .filter((c): c is AgentCapacity => c !== null)
214
+ .sort((a, b) => b.remainingCapacity - a.remainingCapacity);
215
+ }
216
+
217
+ // ============================================================================
218
+ // Specializations
219
+ // ============================================================================
220
+
221
+ /**
222
+ * Metadata shape stored in the agent_instances.metadata_json column.
223
+ * Only the subset relevant to specializations is typed here.
224
+ *
225
+ * @internal
226
+ */
227
+ interface AgentMetadata {
228
+ specializations?: string[];
229
+ [key: string]: unknown;
230
+ }
231
+
232
+ /**
233
+ * Get the specialization/skills list for an agent.
234
+ *
235
+ * Specializations are stored as a string array under the `specializations`
236
+ * key in the agent's `metadata_json` column. An empty array is returned when
237
+ * the field is absent or the agent is not found.
238
+ *
239
+ * @remarks
240
+ * Write specializations with {@link updateAgentSpecializations} when
241
+ * registering or updating an agent. The metadata column is a free-form JSON
242
+ * blob — specializations are one namespaced key inside it.
243
+ *
244
+ * @param agentId - Agent instance ID (agt_...)
245
+ * @param cwd - Working directory used to resolve tasks.db path
246
+ * @returns Array of specialization strings (empty if none recorded)
247
+ *
248
+ * @example
249
+ * ```ts
250
+ * const skills = await getAgentSpecializations('agt_20260321120000_ab12cd', '/project');
251
+ * // ['typescript', 'testing', 'documentation']
252
+ * if (skills.includes('typescript')) {
253
+ * console.log('Agent can handle TypeScript tasks');
254
+ * }
255
+ * ```
256
+ */
257
+ export async function getAgentSpecializations(agentId: string, cwd?: string): Promise<string[]> {
258
+ const db = await getDb(cwd);
259
+ const agent = await db
260
+ .select({ metadataJson: agentInstances.metadataJson })
261
+ .from(agentInstances)
262
+ .where(eq(agentInstances.id, agentId))
263
+ .get();
264
+
265
+ if (!agent) return [];
266
+
267
+ try {
268
+ const meta = JSON.parse(agent.metadataJson ?? '{}') as AgentMetadata;
269
+ const specs = meta.specializations;
270
+ if (!Array.isArray(specs)) return [];
271
+ return specs.filter((s): s is string => typeof s === 'string');
272
+ } catch {
273
+ return [];
274
+ }
275
+ }
276
+
277
+ /**
278
+ * Update the specializations list stored in an agent's metadata.
279
+ *
280
+ * Merges the new list into the existing `metadata_json` object, preserving
281
+ * any other keys already present. Returns the updated specializations list,
282
+ * or null if the agent was not found.
283
+ *
284
+ * @remarks
285
+ * This is a write-side companion to {@link getAgentSpecializations}. Call it
286
+ * after {@link registerAgent} to record the skills an agent was spawned with.
287
+ *
288
+ * @param agentId - Agent instance ID (agt_...)
289
+ * @param specializations - New specializations list (replaces existing)
290
+ * @param cwd - Working directory used to resolve tasks.db path
291
+ * @returns Updated specializations list, or null if agent not found
292
+ *
293
+ * @example
294
+ * ```ts
295
+ * await updateAgentSpecializations(
296
+ * 'agt_20260321120000_ab12cd',
297
+ * ['typescript', 'testing'],
298
+ * '/project',
299
+ * );
300
+ * ```
301
+ */
302
+ export async function updateAgentSpecializations(
303
+ agentId: string,
304
+ specializations: string[],
305
+ cwd?: string,
306
+ ): Promise<string[] | null> {
307
+ const db = await getDb(cwd);
308
+ const agent = await db
309
+ .select({ metadataJson: agentInstances.metadataJson })
310
+ .from(agentInstances)
311
+ .where(eq(agentInstances.id, agentId))
312
+ .get();
313
+
314
+ if (!agent) return null;
315
+
316
+ let existing: AgentMetadata = {};
317
+ try {
318
+ existing = JSON.parse(agent.metadataJson ?? '{}') as AgentMetadata;
319
+ } catch {
320
+ // Proceed with empty object if metadata is unparseable
321
+ }
322
+
323
+ const updated: AgentMetadata = { ...existing, specializations };
324
+ await db
325
+ .update(agentInstances)
326
+ .set({ metadataJson: JSON.stringify(updated) })
327
+ .where(eq(agentInstances.id, agentId));
328
+
329
+ return specializations;
330
+ }
331
+
332
+ // ============================================================================
333
+ // Performance recording
334
+ // ============================================================================
335
+
336
+ /**
337
+ * Record agent performance metrics to the BRAIN execution history.
338
+ *
339
+ * Translates a simplified {@link AgentPerformanceMetrics} object into the
340
+ * {@link AgentExecutionEvent} format expected by `execution-learning.ts` and
341
+ * delegates to {@link recordAgentExecution}. The agent type is resolved from
342
+ * the `agent_instances` table so callers only need to supply the agent ID.
343
+ *
344
+ * @remarks
345
+ * Recording is best-effort — if brain.db is unavailable the error is swallowed
346
+ * and null is returned, consistent with the rest of the execution-learning
347
+ * module. Agent lifecycle code is never disrupted by a brain write failure.
348
+ *
349
+ * @param agentId - Agent instance ID whose performance is being recorded
350
+ * @param metrics - Performance metrics for the task that was processed
351
+ * @param cwd - Working directory used to resolve tasks.db and brain.db paths
352
+ * @returns The brain decision ID if recorded, null on failure or not found
353
+ *
354
+ * @example
355
+ * ```ts
356
+ * const decisionId = await recordAgentPerformance('agt_20260321120000_ab12cd', {
357
+ * taskId: 'T041',
358
+ * taskType: 'task',
359
+ * outcome: 'success',
360
+ * durationMs: 4200,
361
+ * sessionId: 'ses_20260321_abc',
362
+ * }, '/project');
363
+ * ```
364
+ */
365
+ export async function recordAgentPerformance(
366
+ agentId: string,
367
+ metrics: AgentPerformanceMetrics,
368
+ cwd?: string,
369
+ ): Promise<string | null> {
370
+ const db = await getDb(cwd);
371
+ const agent = await db
372
+ .select({ agentType: agentInstances.agentType, sessionId: agentInstances.sessionId })
373
+ .from(agentInstances)
374
+ .where(eq(agentInstances.id, agentId))
375
+ .get();
376
+
377
+ if (!agent) return null;
378
+
379
+ const event: AgentExecutionEvent = {
380
+ agentId,
381
+ agentType: agent.agentType,
382
+ taskId: metrics.taskId,
383
+ taskType: metrics.taskType,
384
+ outcome: metrics.outcome,
385
+ taskLabels: metrics.taskLabels,
386
+ sessionId: metrics.sessionId ?? agent.sessionId ?? undefined,
387
+ durationMs: metrics.durationMs,
388
+ errorMessage: metrics.errorMessage,
389
+ errorType: metrics.errorType,
390
+ };
391
+
392
+ const decision = await recordAgentExecution(event, cwd);
393
+ return decision?.id ?? null;
394
+ }
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Agent Health Monitoring -- Heartbeat and crash detection for live agent instances.
3
+ *
4
+ * Provides the public-facing health API specified by T039:
5
+ * - `recordHeartbeat` — update last_heartbeat for a live agent
6
+ * - `checkAgentHealth` — check health of a specific agent by ID
7
+ * - `detectStaleAgents` — find agents whose heartbeat is older than threshold
8
+ * - `detectCrashedAgents` — find active agents with no heartbeat for >3 min
9
+ *
10
+ * These functions delegate to the lower-level `registry.ts` primitives
11
+ * (`heartbeat`, `checkAgentHealth`, `listAgentInstances`) and add the
12
+ * named, task-spec-aligned surface required for T039.
13
+ *
14
+ * @module agents/health-monitor
15
+ * @task T039
16
+ * @epic T038
17
+ */
18
+
19
+ import type { AgentInstanceRow, AgentInstanceStatus } from './agent-schema.js';
20
+ import { heartbeat, listAgentInstances, markCrashed } from './registry.js';
21
+
22
+ // ============================================================================
23
+ // Constants
24
+ // ============================================================================
25
+
26
+ /** Default heartbeat interval (30 seconds) per BRAIN spec. */
27
+ export const HEARTBEAT_INTERVAL_MS = 30_000;
28
+
29
+ /** Default staleness threshold: 3 minutes without a heartbeat. */
30
+ export const STALE_THRESHOLD_MS = 3 * 60_000;
31
+
32
+ /** Statuses considered "alive" for health-check purposes. */
33
+ const ALIVE_STATUSES: AgentInstanceStatus[] = ['starting', 'active', 'idle'];
34
+
35
+ // ============================================================================
36
+ // Types
37
+ // ============================================================================
38
+
39
+ /**
40
+ * Health status of a specific agent instance.
41
+ */
42
+ export interface AgentHealthStatus {
43
+ /** Agent instance ID. */
44
+ agentId: string;
45
+ /** Current DB status. */
46
+ status: AgentInstanceStatus;
47
+ /** ISO timestamp of the last recorded heartbeat. */
48
+ lastHeartbeat: string;
49
+ /** Milliseconds since the last heartbeat (at call time). */
50
+ heartbeatAgeMs: number;
51
+ /** Whether the agent is considered healthy (heartbeat within threshold). */
52
+ healthy: boolean;
53
+ /** Whether the agent is considered stale (heartbeat older than threshold). */
54
+ stale: boolean;
55
+ /** Threshold used for staleness determination (ms). */
56
+ thresholdMs: number;
57
+ }
58
+
59
+ // ============================================================================
60
+ // recordHeartbeat
61
+ // ============================================================================
62
+
63
+ /**
64
+ * Record a heartbeat for an agent instance.
65
+ *
66
+ * Updates `last_heartbeat` to the current time and returns the agent's
67
+ * current {@link AgentInstanceStatus}. Returns `null` if the agent does not
68
+ * exist or is already in a terminal state (`stopped` / `crashed`).
69
+ *
70
+ * This is the primary mechanism by which long-running agents signal liveness.
71
+ * Call this every {@link HEARTBEAT_INTERVAL_MS} (30 s) from the agent loop.
72
+ *
73
+ * @param agentId - The agent instance ID (e.g. `agt_20260322120000_a1b2c3`)
74
+ * @param cwd - Working directory used to resolve the tasks.db path (optional)
75
+ * @returns The agent's current status, or `null` if not found / terminal
76
+ *
77
+ * @remarks
78
+ * Terminal agents (`stopped`, `crashed`) will NOT have their heartbeat
79
+ * updated — the existing status is returned as-is so callers can detect
80
+ * external shutdown signals.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * // Inside the agent's main loop:
85
+ * const heartbeatTimer = setInterval(async () => {
86
+ * const status = await recordHeartbeat(agentId);
87
+ * if (status === 'stopped' || status === null) {
88
+ * // Orchestrator shut us down — exit cleanly
89
+ * clearInterval(heartbeatTimer);
90
+ * process.exit(0);
91
+ * }
92
+ * }, HEARTBEAT_INTERVAL_MS);
93
+ * ```
94
+ */
95
+ export async function recordHeartbeat(
96
+ agentId: string,
97
+ cwd?: string,
98
+ ): Promise<AgentInstanceStatus | null> {
99
+ return heartbeat(agentId, cwd);
100
+ }
101
+
102
+ // ============================================================================
103
+ // checkAgentHealth
104
+ // ============================================================================
105
+
106
+ /**
107
+ * Check the health of a specific agent instance by ID.
108
+ *
109
+ * Queries the agent's current record and returns a structured
110
+ * {@link AgentHealthStatus} describing staleness, heartbeat age, and
111
+ * whether the agent is considered healthy relative to `thresholdMs`.
112
+ *
113
+ * Returns `null` if the agent ID is not found in the database.
114
+ *
115
+ * @param agentId - The agent instance ID to check
116
+ * @param thresholdMs - Staleness threshold in milliseconds (default: 3 minutes)
117
+ * @param cwd - Working directory used to resolve the tasks.db path (optional)
118
+ * @returns {@link AgentHealthStatus} or `null` if the agent does not exist
119
+ *
120
+ * @remarks
121
+ * Returns null if the agent is not found. A non-null result includes
122
+ * staleness status based on the threshold comparison.
123
+ *
124
+ * @example
125
+ * ```ts
126
+ * const health = await checkAgentHealth('agt_20260322120000_a1b2c3');
127
+ * if (health && health.stale) {
128
+ * console.log(`Agent stale for ${health.heartbeatAgeMs}ms — presumed crashed`);
129
+ * }
130
+ * ```
131
+ */
132
+ export async function checkAgentHealth(
133
+ agentId: string,
134
+ thresholdMs: number = STALE_THRESHOLD_MS,
135
+ cwd?: string,
136
+ ): Promise<AgentHealthStatus | null> {
137
+ const all = await listAgentInstances(undefined, cwd);
138
+ const agent = all.find((a) => a.id === agentId);
139
+ if (!agent) return null;
140
+
141
+ return buildHealthStatus(agent, thresholdMs);
142
+ }
143
+
144
+ // ============================================================================
145
+ // detectStaleAgents
146
+ // ============================================================================
147
+
148
+ /**
149
+ * Find all non-terminal agents whose last heartbeat is older than `thresholdMs`.
150
+ *
151
+ * "Stale" means an agent with status `starting`, `active`, or `idle` has
152
+ * not sent a heartbeat within the threshold window. This is a precursor to
153
+ * crash detection — a stale agent may still recover if it is under heavy load.
154
+ *
155
+ * Agents with status `stopped` or `crashed` are excluded — they are already
156
+ * in a terminal state and do not participate in the heartbeat protocol.
157
+ *
158
+ * @param thresholdMs - Staleness threshold in ms (default: 3 minutes / 180 000 ms)
159
+ * @param cwd - Working directory used to resolve the tasks.db path (optional)
160
+ * @returns Array of {@link AgentHealthStatus} for each stale agent, sorted by
161
+ * heartbeat age descending (most-stale first)
162
+ *
163
+ * @remarks
164
+ * The default threshold matches the crash-detection window specified in T039:
165
+ * "timeout detection after 3 minutes".
166
+ *
167
+ * @example
168
+ * ```ts
169
+ * const stale = await detectStaleAgents();
170
+ * for (const s of stale) {
171
+ * console.log(`${s.agentId} has been stale for ${s.heartbeatAgeMs / 1000}s`);
172
+ * }
173
+ * ```
174
+ */
175
+ export async function detectStaleAgents(
176
+ thresholdMs: number = STALE_THRESHOLD_MS,
177
+ cwd?: string,
178
+ ): Promise<AgentHealthStatus[]> {
179
+ const agents = await listAgentInstances({ status: ALIVE_STATUSES }, cwd);
180
+
181
+ return agents
182
+ .map((a) => buildHealthStatus(a, thresholdMs))
183
+ .filter((s) => s.stale)
184
+ .sort((a, b) => b.heartbeatAgeMs - a.heartbeatAgeMs);
185
+ }
186
+
187
+ // ============================================================================
188
+ // detectCrashedAgents
189
+ // ============================================================================
190
+
191
+ /**
192
+ * Find agents with status `active` whose heartbeat has been silent for
193
+ * longer than `thresholdMs`, and mark them as `crashed` in the database.
194
+ *
195
+ * An agent is considered crashed when it:
196
+ * 1. Has status `active` (not `idle`, `starting`, `stopped`, or `crashed`)
197
+ * 2. Has not sent a heartbeat for longer than `thresholdMs`
198
+ *
199
+ * Each detected agent is immediately marked `crashed` via {@link markCrashed},
200
+ * incrementing its error count and writing a reason to `agent_error_log`.
201
+ *
202
+ * @param thresholdMs - Crash threshold in ms (default: 3 minutes / 180 000 ms)
203
+ * @param cwd - Working directory used to resolve the tasks.db path (optional)
204
+ * @returns Array of agent instance rows for each agent that was just marked
205
+ * `crashed`, sorted by last heartbeat ascending (oldest first).
206
+ *
207
+ * @remarks
208
+ * This function is WRITE-side: it mutates the database. Callers should run
209
+ * it on a schedule (e.g. every 60 s) from an orchestrator or health watchdog.
210
+ * For a read-only view, use {@link detectStaleAgents} instead.
211
+ *
212
+ * @example
213
+ * ```ts
214
+ * // Inside an orchestrator health watchdog:
215
+ * const crashed = await detectCrashedAgents();
216
+ * if (crashed.length > 0) {
217
+ * logger.warn({ crashed: crashed.map(a => a.id) }, 'Agents marked crashed');
218
+ * }
219
+ * ```
220
+ */
221
+ export async function detectCrashedAgents(
222
+ thresholdMs: number = STALE_THRESHOLD_MS,
223
+ cwd?: string,
224
+ ): Promise<AgentInstanceRow[]> {
225
+ // Only consider agents that are explicitly 'active' — idle/starting agents
226
+ // may not yet have established a regular heartbeat interval.
227
+ const activeAgents = await listAgentInstances({ status: 'active' }, cwd);
228
+ const cutoff = new Date(Date.now() - thresholdMs).toISOString();
229
+
230
+ const crashed: AgentInstanceRow[] = [];
231
+
232
+ for (const agent of activeAgents) {
233
+ if (agent.lastHeartbeat < cutoff) {
234
+ const updated = await markCrashed(
235
+ agent.id,
236
+ `Heartbeat timeout — no heartbeat for >${Math.round(thresholdMs / 1000)}s`,
237
+ cwd,
238
+ );
239
+ if (updated) {
240
+ crashed.push(updated);
241
+ }
242
+ }
243
+ }
244
+
245
+ // Sort oldest-heartbeat first (most severely stale)
246
+ crashed.sort((a, b) => {
247
+ const aHb = a.lastHeartbeat ?? '';
248
+ const bHb = b.lastHeartbeat ?? '';
249
+ return aHb < bHb ? -1 : aHb > bHb ? 1 : 0;
250
+ });
251
+
252
+ return crashed;
253
+ }
254
+
255
+ // ============================================================================
256
+ // Internal helpers
257
+ // ============================================================================
258
+
259
+ /**
260
+ * Build an {@link AgentHealthStatus} from a raw agent row.
261
+ */
262
+ function buildHealthStatus(agent: AgentInstanceRow, thresholdMs: number): AgentHealthStatus {
263
+ const lastHeartbeatMs = new Date(agent.lastHeartbeat).getTime();
264
+ const heartbeatAgeMs = Date.now() - lastHeartbeatMs;
265
+ const stale = ALIVE_STATUSES.includes(agent.status as AgentInstanceStatus)
266
+ ? heartbeatAgeMs > thresholdMs
267
+ : false;
268
+ const healthy = !stale && ALIVE_STATUSES.includes(agent.status as AgentInstanceStatus);
269
+
270
+ return {
271
+ agentId: agent.id,
272
+ status: agent.status as AgentInstanceStatus,
273
+ lastHeartbeat: agent.lastHeartbeat,
274
+ heartbeatAgeMs,
275
+ healthy,
276
+ stale,
277
+ thresholdMs,
278
+ };
279
+ }