@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
package/dist/index.js CHANGED
@@ -13159,9 +13159,9 @@ async function readSequenceFromDb(cwd, accessor) {
13159
13159
  return isValidSequenceState(value) ? value : null;
13160
13160
  }
13161
13161
  const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
13162
- const { eq: eq11 } = await import("drizzle-orm");
13162
+ const { eq: eq12 } = await import("drizzle-orm");
13163
13163
  const db = await getDb3(cwd);
13164
- const rows = await db.select().from(schemaMeta).where(eq11(schemaMeta.key, SEQUENCE_META_KEY)).all();
13164
+ const rows = await db.select().from(schemaMeta).where(eq12(schemaMeta.key, SEQUENCE_META_KEY)).all();
13165
13165
  const raw = rows[0]?.value;
13166
13166
  if (!raw) return null;
13167
13167
  try {
@@ -14207,7 +14207,7 @@ async function linkPipelineAdr(projectRoot, taskId) {
14207
14207
  return result;
14208
14208
  }
14209
14209
  const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
14210
- const { and: and8, eq: eq11 } = await import("drizzle-orm");
14210
+ const { and: and9, eq: eq12 } = await import("drizzle-orm");
14211
14211
  const db = await getDb3(projectRoot);
14212
14212
  const now = (/* @__PURE__ */ new Date()).toISOString();
14213
14213
  for (const filePath of matchingFiles) {
@@ -14217,7 +14217,7 @@ async function linkPipelineAdr(projectRoot, taskId) {
14217
14217
  const fm = record2.frontmatter;
14218
14218
  const content = readFileSync5(filePath, "utf-8");
14219
14219
  const relativePath = `.cleo/adrs/${filename}`;
14220
- const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq11(architectureDecisions.id, record2.id)).all();
14220
+ const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq12(architectureDecisions.id, record2.id)).all();
14221
14221
  const rowBase = {
14222
14222
  id: record2.id,
14223
14223
  title: record2.title,
@@ -14237,19 +14237,19 @@ async function linkPipelineAdr(projectRoot, taskId) {
14237
14237
  updatedAt: now
14238
14238
  };
14239
14239
  if (existing.length > 0) {
14240
- await db.update(architectureDecisions).set(rowBase).where(eq11(architectureDecisions.id, record2.id));
14240
+ await db.update(architectureDecisions).set(rowBase).where(eq12(architectureDecisions.id, record2.id));
14241
14241
  } else {
14242
14242
  await db.insert(architectureDecisions).values({ ...rowBase, createdAt: now });
14243
14243
  }
14244
14244
  result.synced++;
14245
- await db.delete(adrTaskLinks).where(and8(eq11(adrTaskLinks.adrId, record2.id), eq11(adrTaskLinks.taskId, taskId)));
14245
+ await db.delete(adrTaskLinks).where(and9(eq12(adrTaskLinks.adrId, record2.id), eq12(adrTaskLinks.taskId, taskId)));
14246
14246
  await db.insert(adrTaskLinks).values({ adrId: record2.id, taskId, linkType: "implements" });
14247
14247
  result.linked.push({ adrId: record2.id, taskId });
14248
14248
  if (fm["Related ADRs"]) {
14249
14249
  const relatedIds = fm["Related ADRs"].split(",").map((r) => r.trim()).filter((r) => /^ADR-\d+$/.test(r));
14250
14250
  for (const toId of relatedIds) {
14251
14251
  try {
14252
- const targetExists = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq11(architectureDecisions.id, toId)).all();
14252
+ const targetExists = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq12(architectureDecisions.id, toId)).all();
14253
14253
  if (targetExists.length > 0) {
14254
14254
  await db.insert(adrRelations).values({ fromAdrId: record2.id, toAdrId: toId, relationType: "related" }).onConflictDoNothing();
14255
14255
  }
@@ -14272,248 +14272,8 @@ var init_link_pipeline = __esm({
14272
14272
  }
14273
14273
  });
14274
14274
 
14275
- // packages/core/src/agents/registry.ts
14276
- var registry_exports2 = {};
14277
- __export(registry_exports2, {
14278
- checkAgentHealth: () => checkAgentHealth,
14279
- classifyError: () => classifyError,
14280
- deregisterAgent: () => deregisterAgent,
14281
- generateAgentId: () => generateAgentId,
14282
- getAgentErrorHistory: () => getAgentErrorHistory,
14283
- getAgentInstance: () => getAgentInstance,
14284
- getHealthReport: () => getHealthReport,
14285
- heartbeat: () => heartbeat,
14286
- incrementTasksCompleted: () => incrementTasksCompleted,
14287
- listAgentInstances: () => listAgentInstances,
14288
- markCrashed: () => markCrashed,
14289
- registerAgent: () => registerAgent,
14290
- updateAgentStatus: () => updateAgentStatus
14291
- });
14292
- import { randomBytes } from "node:crypto";
14293
- import { and as and3, eq as eq5, inArray as inArray4, lt as lt2, sql as sql8 } from "drizzle-orm";
14294
- function generateAgentId() {
14295
- const now = /* @__PURE__ */ new Date();
14296
- const ts = now.toISOString().replace(/[-:T]/g, "").substring(0, 14);
14297
- const hex = randomBytes(3).toString("hex");
14298
- return `agt_${ts}_${hex}`;
14299
- }
14300
- async function registerAgent(opts, cwd) {
14301
- const db = await getDb(cwd);
14302
- const id = generateAgentId();
14303
- const now = (/* @__PURE__ */ new Date()).toISOString();
14304
- const row = {
14305
- id,
14306
- agentType: opts.agentType,
14307
- status: "starting",
14308
- sessionId: opts.sessionId ?? null,
14309
- taskId: opts.taskId ?? null,
14310
- startedAt: now,
14311
- lastHeartbeat: now,
14312
- stoppedAt: null,
14313
- errorCount: 0,
14314
- totalTasksCompleted: 0,
14315
- capacity: "1.0",
14316
- metadataJson: opts.metadata ? JSON.stringify(opts.metadata) : "{}",
14317
- parentAgentId: opts.parentAgentId ?? null
14318
- };
14319
- await db.insert(agentInstances).values(row);
14320
- return row;
14321
- }
14322
- async function deregisterAgent(id, cwd) {
14323
- const db = await getDb(cwd);
14324
- const now = (/* @__PURE__ */ new Date()).toISOString();
14325
- const existing = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
14326
- if (!existing) return null;
14327
- if (existing.status === "stopped") return existing;
14328
- await db.update(agentInstances).set({ status: "stopped", stoppedAt: now }).where(eq5(agentInstances.id, id));
14329
- return { ...existing, status: "stopped", stoppedAt: now };
14330
- }
14331
- async function heartbeat(id, cwd) {
14332
- const db = await getDb(cwd);
14333
- const now = (/* @__PURE__ */ new Date()).toISOString();
14334
- const existing = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
14335
- if (!existing) return null;
14336
- if (existing.status === "stopped" || existing.status === "crashed") {
14337
- return existing.status;
14338
- }
14339
- await db.update(agentInstances).set({ lastHeartbeat: now }).where(eq5(agentInstances.id, id));
14340
- return existing.status;
14341
- }
14342
- async function updateAgentStatus(id, opts, cwd) {
14343
- const db = await getDb(cwd);
14344
- const existing = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
14345
- if (!existing) return null;
14346
- const updates = {
14347
- status: opts.status
14348
- };
14349
- if (opts.taskId !== void 0) {
14350
- updates.taskId = opts.taskId;
14351
- }
14352
- if (opts.status === "active") {
14353
- updates.lastHeartbeat = (/* @__PURE__ */ new Date()).toISOString();
14354
- }
14355
- if (opts.status === "error" || opts.status === "crashed") {
14356
- updates.errorCount = existing.errorCount + 1;
14357
- if (opts.error) {
14358
- const errorType = classifyError(new Error(opts.error));
14359
- await db.insert(agentErrorLog).values({
14360
- agentId: id,
14361
- errorType,
14362
- message: opts.error,
14363
- occurredAt: (/* @__PURE__ */ new Date()).toISOString()
14364
- });
14365
- }
14366
- }
14367
- if (opts.status === "stopped") {
14368
- updates.stoppedAt = (/* @__PURE__ */ new Date()).toISOString();
14369
- }
14370
- await db.update(agentInstances).set(updates).where(eq5(agentInstances.id, id));
14371
- return { ...existing, ...updates };
14372
- }
14373
- async function incrementTasksCompleted(id, cwd) {
14374
- const db = await getDb(cwd);
14375
- await db.update(agentInstances).set({ totalTasksCompleted: sql8`${agentInstances.totalTasksCompleted} + 1` }).where(eq5(agentInstances.id, id));
14376
- }
14377
- async function listAgentInstances(filters, cwd) {
14378
- const db = await getDb(cwd);
14379
- const conditions = [];
14380
- if (filters?.status) {
14381
- const statuses = Array.isArray(filters.status) ? filters.status : [filters.status];
14382
- conditions.push(inArray4(agentInstances.status, statuses));
14383
- }
14384
- if (filters?.agentType) {
14385
- const types = Array.isArray(filters.agentType) ? filters.agentType : [filters.agentType];
14386
- conditions.push(inArray4(agentInstances.agentType, types));
14387
- }
14388
- if (filters?.sessionId) {
14389
- conditions.push(eq5(agentInstances.sessionId, filters.sessionId));
14390
- }
14391
- if (filters?.parentAgentId) {
14392
- conditions.push(eq5(agentInstances.parentAgentId, filters.parentAgentId));
14393
- }
14394
- if (conditions.length === 0) {
14395
- return db.select().from(agentInstances).all();
14396
- }
14397
- return db.select().from(agentInstances).where(and3(...conditions)).all();
14398
- }
14399
- async function getAgentInstance(id, cwd) {
14400
- const db = await getDb(cwd);
14401
- const row = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
14402
- return row ?? null;
14403
- }
14404
- function classifyError(error40) {
14405
- const message = error40 instanceof Error ? error40.message : String(error40);
14406
- for (const pattern of RETRIABLE_PATTERNS) {
14407
- if (pattern.test(message)) return "retriable";
14408
- }
14409
- for (const pattern of PERMANENT_PATTERNS) {
14410
- if (pattern.test(message)) return "permanent";
14411
- }
14412
- return "unknown";
14413
- }
14414
- async function getAgentErrorHistory(agentId, cwd) {
14415
- const db = await getDb(cwd);
14416
- return db.select().from(agentErrorLog).where(eq5(agentErrorLog.agentId, agentId)).all();
14417
- }
14418
- async function checkAgentHealth(thresholdMs = 3e4, cwd) {
14419
- const db = await getDb(cwd);
14420
- const cutoff = new Date(Date.now() - thresholdMs).toISOString();
14421
- return db.select().from(agentInstances).where(
14422
- and3(
14423
- inArray4(agentInstances.status, ["active", "idle", "starting"]),
14424
- lt2(agentInstances.lastHeartbeat, cutoff)
14425
- )
14426
- ).all();
14427
- }
14428
- async function markCrashed(id, reason, cwd) {
14429
- return updateAgentStatus(
14430
- id,
14431
- { status: "crashed", error: reason ?? "Heartbeat timeout \u2014 agent presumed crashed" },
14432
- cwd
14433
- );
14434
- }
14435
- async function getHealthReport(thresholdMs = 3e4, cwd) {
14436
- const allAgents = await listAgentInstances(void 0, cwd);
14437
- const staleAgents = await checkAgentHealth(thresholdMs, cwd);
14438
- const report = {
14439
- total: allAgents.length,
14440
- active: 0,
14441
- idle: 0,
14442
- starting: 0,
14443
- error: 0,
14444
- crashed: 0,
14445
- stopped: 0,
14446
- totalErrors: 0,
14447
- staleAgents
14448
- };
14449
- for (const agent of allAgents) {
14450
- switch (agent.status) {
14451
- case "active":
14452
- report.active++;
14453
- break;
14454
- case "idle":
14455
- report.idle++;
14456
- break;
14457
- case "starting":
14458
- report.starting++;
14459
- break;
14460
- case "error":
14461
- report.error++;
14462
- break;
14463
- case "crashed":
14464
- report.crashed++;
14465
- break;
14466
- case "stopped":
14467
- report.stopped++;
14468
- break;
14469
- }
14470
- report.totalErrors += agent.errorCount;
14471
- }
14472
- return report;
14473
- }
14474
- var RETRIABLE_PATTERNS, PERMANENT_PATTERNS;
14475
- var init_registry2 = __esm({
14476
- "packages/core/src/agents/registry.ts"() {
14477
- "use strict";
14478
- init_sqlite2();
14479
- init_agent_schema();
14480
- RETRIABLE_PATTERNS = [
14481
- /timeout/i,
14482
- /ECONNREFUSED/,
14483
- /ECONNRESET/,
14484
- /EPIPE/,
14485
- /ETIMEDOUT/,
14486
- /rate.?limit/i,
14487
- /429/,
14488
- /503/,
14489
- /502/,
14490
- /SQLITE_BUSY/i,
14491
- /database is locked/i,
14492
- /temporarily unavailable/i,
14493
- /too many requests/i,
14494
- /network/i,
14495
- /socket hang up/i
14496
- ];
14497
- PERMANENT_PATTERNS = [
14498
- /permission denied/i,
14499
- /EACCES/,
14500
- /authentication/i,
14501
- /unauthorized/i,
14502
- /401/,
14503
- /403/,
14504
- /404/,
14505
- /not found/i,
14506
- /invalid.*token/i,
14507
- /SQLITE_CONSTRAINT/i,
14508
- /syntax error/i,
14509
- /type error/i,
14510
- /reference error/i
14511
- ];
14512
- }
14513
- });
14514
-
14515
14275
  // packages/core/src/store/brain-accessor.ts
14516
- import { and as and4, asc as asc2, desc as desc2, eq as eq7, gte as gte2, or as or3 } from "drizzle-orm";
14276
+ import { and as and3, asc as asc2, desc as desc2, eq as eq5, gte as gte2, or as or3 } from "drizzle-orm";
14517
14277
  async function getBrainAccessor(cwd) {
14518
14278
  const db = await getBrainDb(cwd);
14519
14279
  return new BrainDataAccessor(db);
@@ -14533,30 +14293,30 @@ var init_brain_accessor = __esm({
14533
14293
  // =========================================================================
14534
14294
  async addDecision(row) {
14535
14295
  await this.db.insert(brainDecisions).values(row);
14536
- const result = await this.db.select().from(brainDecisions).where(eq7(brainDecisions.id, row.id));
14296
+ const result = await this.db.select().from(brainDecisions).where(eq5(brainDecisions.id, row.id));
14537
14297
  return result[0];
14538
14298
  }
14539
14299
  async getDecision(id) {
14540
- const result = await this.db.select().from(brainDecisions).where(eq7(brainDecisions.id, id));
14300
+ const result = await this.db.select().from(brainDecisions).where(eq5(brainDecisions.id, id));
14541
14301
  return result[0] ?? null;
14542
14302
  }
14543
14303
  async findDecisions(params = {}) {
14544
14304
  const conditions = [];
14545
14305
  if (params.type) {
14546
- conditions.push(eq7(brainDecisions.type, params.type));
14306
+ conditions.push(eq5(brainDecisions.type, params.type));
14547
14307
  }
14548
14308
  if (params.confidence) {
14549
- conditions.push(eq7(brainDecisions.confidence, params.confidence));
14309
+ conditions.push(eq5(brainDecisions.confidence, params.confidence));
14550
14310
  }
14551
14311
  if (params.outcome) {
14552
- conditions.push(eq7(brainDecisions.outcome, params.outcome));
14312
+ conditions.push(eq5(brainDecisions.outcome, params.outcome));
14553
14313
  }
14554
14314
  if (params.contextTaskId) {
14555
- conditions.push(eq7(brainDecisions.contextTaskId, params.contextTaskId));
14315
+ conditions.push(eq5(brainDecisions.contextTaskId, params.contextTaskId));
14556
14316
  }
14557
14317
  let query = this.db.select().from(brainDecisions).orderBy(desc2(brainDecisions.createdAt));
14558
14318
  if (conditions.length > 0) {
14559
- query = query.where(and4(...conditions));
14319
+ query = query.where(and3(...conditions));
14560
14320
  }
14561
14321
  if (params.limit) {
14562
14322
  query = query.limit(params.limit);
@@ -14564,34 +14324,34 @@ var init_brain_accessor = __esm({
14564
14324
  return query;
14565
14325
  }
14566
14326
  async updateDecision(id, updates) {
14567
- await this.db.update(brainDecisions).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq7(brainDecisions.id, id));
14327
+ await this.db.update(brainDecisions).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainDecisions.id, id));
14568
14328
  }
14569
14329
  // =========================================================================
14570
14330
  // Patterns CRUD
14571
14331
  // =========================================================================
14572
14332
  async addPattern(row) {
14573
14333
  await this.db.insert(brainPatterns).values(row);
14574
- const result = await this.db.select().from(brainPatterns).where(eq7(brainPatterns.id, row.id));
14334
+ const result = await this.db.select().from(brainPatterns).where(eq5(brainPatterns.id, row.id));
14575
14335
  return result[0];
14576
14336
  }
14577
14337
  async getPattern(id) {
14578
- const result = await this.db.select().from(brainPatterns).where(eq7(brainPatterns.id, id));
14338
+ const result = await this.db.select().from(brainPatterns).where(eq5(brainPatterns.id, id));
14579
14339
  return result[0] ?? null;
14580
14340
  }
14581
14341
  async findPatterns(params = {}) {
14582
14342
  const conditions = [];
14583
14343
  if (params.type) {
14584
- conditions.push(eq7(brainPatterns.type, params.type));
14344
+ conditions.push(eq5(brainPatterns.type, params.type));
14585
14345
  }
14586
14346
  if (params.impact) {
14587
- conditions.push(eq7(brainPatterns.impact, params.impact));
14347
+ conditions.push(eq5(brainPatterns.impact, params.impact));
14588
14348
  }
14589
14349
  if (params.minFrequency !== void 0) {
14590
14350
  conditions.push(gte2(brainPatterns.frequency, params.minFrequency));
14591
14351
  }
14592
14352
  let query = this.db.select().from(brainPatterns).orderBy(desc2(brainPatterns.frequency));
14593
14353
  if (conditions.length > 0) {
14594
- query = query.where(and4(...conditions));
14354
+ query = query.where(and3(...conditions));
14595
14355
  }
14596
14356
  if (params.limit) {
14597
14357
  query = query.limit(params.limit);
@@ -14599,18 +14359,18 @@ var init_brain_accessor = __esm({
14599
14359
  return query;
14600
14360
  }
14601
14361
  async updatePattern(id, updates) {
14602
- await this.db.update(brainPatterns).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq7(brainPatterns.id, id));
14362
+ await this.db.update(brainPatterns).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainPatterns.id, id));
14603
14363
  }
14604
14364
  // =========================================================================
14605
14365
  // Learnings CRUD
14606
14366
  // =========================================================================
14607
14367
  async addLearning(row) {
14608
14368
  await this.db.insert(brainLearnings).values(row);
14609
- const result = await this.db.select().from(brainLearnings).where(eq7(brainLearnings.id, row.id));
14369
+ const result = await this.db.select().from(brainLearnings).where(eq5(brainLearnings.id, row.id));
14610
14370
  return result[0];
14611
14371
  }
14612
14372
  async getLearning(id) {
14613
- const result = await this.db.select().from(brainLearnings).where(eq7(brainLearnings.id, id));
14373
+ const result = await this.db.select().from(brainLearnings).where(eq5(brainLearnings.id, id));
14614
14374
  return result[0] ?? null;
14615
14375
  }
14616
14376
  async findLearnings(params = {}) {
@@ -14619,11 +14379,11 @@ var init_brain_accessor = __esm({
14619
14379
  conditions.push(gte2(brainLearnings.confidence, params.minConfidence));
14620
14380
  }
14621
14381
  if (params.actionable !== void 0) {
14622
- conditions.push(eq7(brainLearnings.actionable, params.actionable));
14382
+ conditions.push(eq5(brainLearnings.actionable, params.actionable));
14623
14383
  }
14624
14384
  let query = this.db.select().from(brainLearnings).orderBy(desc2(brainLearnings.confidence));
14625
14385
  if (conditions.length > 0) {
14626
- query = query.where(and4(...conditions));
14386
+ query = query.where(and3(...conditions));
14627
14387
  }
14628
14388
  if (params.limit) {
14629
14389
  query = query.limit(params.limit);
@@ -14631,37 +14391,37 @@ var init_brain_accessor = __esm({
14631
14391
  return query;
14632
14392
  }
14633
14393
  async updateLearning(id, updates) {
14634
- await this.db.update(brainLearnings).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq7(brainLearnings.id, id));
14394
+ await this.db.update(brainLearnings).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainLearnings.id, id));
14635
14395
  }
14636
14396
  // =========================================================================
14637
14397
  // Observations CRUD
14638
14398
  // =========================================================================
14639
14399
  async addObservation(row) {
14640
14400
  await this.db.insert(brainObservations).values(row);
14641
- const result = await this.db.select().from(brainObservations).where(eq7(brainObservations.id, row.id));
14401
+ const result = await this.db.select().from(brainObservations).where(eq5(brainObservations.id, row.id));
14642
14402
  return result[0];
14643
14403
  }
14644
14404
  async getObservation(id) {
14645
- const result = await this.db.select().from(brainObservations).where(eq7(brainObservations.id, id));
14405
+ const result = await this.db.select().from(brainObservations).where(eq5(brainObservations.id, id));
14646
14406
  return result[0] ?? null;
14647
14407
  }
14648
14408
  async findObservations(params = {}) {
14649
14409
  const conditions = [];
14650
14410
  if (params.type) {
14651
- conditions.push(eq7(brainObservations.type, params.type));
14411
+ conditions.push(eq5(brainObservations.type, params.type));
14652
14412
  }
14653
14413
  if (params.project) {
14654
- conditions.push(eq7(brainObservations.project, params.project));
14414
+ conditions.push(eq5(brainObservations.project, params.project));
14655
14415
  }
14656
14416
  if (params.sourceType) {
14657
- conditions.push(eq7(brainObservations.sourceType, params.sourceType));
14417
+ conditions.push(eq5(brainObservations.sourceType, params.sourceType));
14658
14418
  }
14659
14419
  if (params.sourceSessionId) {
14660
- conditions.push(eq7(brainObservations.sourceSessionId, params.sourceSessionId));
14420
+ conditions.push(eq5(brainObservations.sourceSessionId, params.sourceSessionId));
14661
14421
  }
14662
14422
  let query = this.db.select().from(brainObservations).orderBy(desc2(brainObservations.createdAt));
14663
14423
  if (conditions.length > 0) {
14664
- query = query.where(and4(...conditions));
14424
+ query = query.where(and3(...conditions));
14665
14425
  }
14666
14426
  if (params.limit) {
14667
14427
  query = query.limit(params.limit);
@@ -14669,7 +14429,7 @@ var init_brain_accessor = __esm({
14669
14429
  return query;
14670
14430
  }
14671
14431
  async updateObservation(id, updates) {
14672
- await this.db.update(brainObservations).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq7(brainObservations.id, id));
14432
+ await this.db.update(brainObservations).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainObservations.id, id));
14673
14433
  }
14674
14434
  // =========================================================================
14675
14435
  // Memory Links CRUD
@@ -14679,22 +14439,22 @@ var init_brain_accessor = __esm({
14679
14439
  }
14680
14440
  async getLinksForMemory(memoryType, memoryId) {
14681
14441
  return this.db.select().from(brainMemoryLinks).where(
14682
- and4(
14683
- eq7(brainMemoryLinks.memoryType, memoryType),
14684
- eq7(brainMemoryLinks.memoryId, memoryId)
14442
+ and3(
14443
+ eq5(brainMemoryLinks.memoryType, memoryType),
14444
+ eq5(brainMemoryLinks.memoryId, memoryId)
14685
14445
  )
14686
14446
  ).orderBy(asc2(brainMemoryLinks.createdAt));
14687
14447
  }
14688
14448
  async getLinksForTask(taskId) {
14689
- return this.db.select().from(brainMemoryLinks).where(eq7(brainMemoryLinks.taskId, taskId)).orderBy(asc2(brainMemoryLinks.createdAt));
14449
+ return this.db.select().from(brainMemoryLinks).where(eq5(brainMemoryLinks.taskId, taskId)).orderBy(asc2(brainMemoryLinks.createdAt));
14690
14450
  }
14691
14451
  async removeLink(memoryType, memoryId, taskId, linkType) {
14692
14452
  await this.db.delete(brainMemoryLinks).where(
14693
- and4(
14694
- eq7(brainMemoryLinks.memoryType, memoryType),
14695
- eq7(brainMemoryLinks.memoryId, memoryId),
14696
- eq7(brainMemoryLinks.taskId, taskId),
14697
- eq7(brainMemoryLinks.linkType, linkType)
14453
+ and3(
14454
+ eq5(brainMemoryLinks.memoryType, memoryType),
14455
+ eq5(brainMemoryLinks.memoryId, memoryId),
14456
+ eq5(brainMemoryLinks.taskId, taskId),
14457
+ eq5(brainMemoryLinks.linkType, linkType)
14698
14458
  )
14699
14459
  );
14700
14460
  }
@@ -14703,27 +14463,27 @@ var init_brain_accessor = __esm({
14703
14463
  // =========================================================================
14704
14464
  async addStickyNote(row) {
14705
14465
  await this.db.insert(brainStickyNotes).values(row);
14706
- const result = await this.db.select().from(brainStickyNotes).where(eq7(brainStickyNotes.id, row.id));
14466
+ const result = await this.db.select().from(brainStickyNotes).where(eq5(brainStickyNotes.id, row.id));
14707
14467
  return result[0];
14708
14468
  }
14709
14469
  async getStickyNote(id) {
14710
- const result = await this.db.select().from(brainStickyNotes).where(eq7(brainStickyNotes.id, id));
14470
+ const result = await this.db.select().from(brainStickyNotes).where(eq5(brainStickyNotes.id, id));
14711
14471
  return result[0] ?? null;
14712
14472
  }
14713
14473
  async findStickyNotes(params = {}) {
14714
14474
  const conditions = [];
14715
14475
  if (params.status) {
14716
- conditions.push(eq7(brainStickyNotes.status, params.status));
14476
+ conditions.push(eq5(brainStickyNotes.status, params.status));
14717
14477
  }
14718
14478
  if (params.color) {
14719
- conditions.push(eq7(brainStickyNotes.color, params.color));
14479
+ conditions.push(eq5(brainStickyNotes.color, params.color));
14720
14480
  }
14721
14481
  if (params.priority) {
14722
- conditions.push(eq7(brainStickyNotes.priority, params.priority));
14482
+ conditions.push(eq5(brainStickyNotes.priority, params.priority));
14723
14483
  }
14724
14484
  let query = this.db.select().from(brainStickyNotes).orderBy(desc2(brainStickyNotes.createdAt));
14725
14485
  if (conditions.length > 0) {
14726
- query = query.where(and4(...conditions));
14486
+ query = query.where(and3(...conditions));
14727
14487
  }
14728
14488
  if (params.limit) {
14729
14489
  query = query.limit(params.limit);
@@ -14731,31 +14491,31 @@ var init_brain_accessor = __esm({
14731
14491
  return query;
14732
14492
  }
14733
14493
  async updateStickyNote(id, updates) {
14734
- await this.db.update(brainStickyNotes).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq7(brainStickyNotes.id, id));
14494
+ await this.db.update(brainStickyNotes).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainStickyNotes.id, id));
14735
14495
  }
14736
14496
  async deleteStickyNote(id) {
14737
- await this.db.delete(brainStickyNotes).where(eq7(brainStickyNotes.id, id));
14497
+ await this.db.delete(brainStickyNotes).where(eq5(brainStickyNotes.id, id));
14738
14498
  }
14739
14499
  // =========================================================================
14740
14500
  // PageIndex Node CRUD (T5383)
14741
14501
  // =========================================================================
14742
14502
  async addPageNode(node) {
14743
14503
  await this.db.insert(brainPageNodes).values(node);
14744
- const result = await this.db.select().from(brainPageNodes).where(eq7(brainPageNodes.id, node.id));
14504
+ const result = await this.db.select().from(brainPageNodes).where(eq5(brainPageNodes.id, node.id));
14745
14505
  return result[0];
14746
14506
  }
14747
14507
  async getPageNode(id) {
14748
- const result = await this.db.select().from(brainPageNodes).where(eq7(brainPageNodes.id, id));
14508
+ const result = await this.db.select().from(brainPageNodes).where(eq5(brainPageNodes.id, id));
14749
14509
  return result[0] ?? null;
14750
14510
  }
14751
14511
  async findPageNodes(params = {}) {
14752
14512
  const conditions = [];
14753
14513
  if (params.nodeType) {
14754
- conditions.push(eq7(brainPageNodes.nodeType, params.nodeType));
14514
+ conditions.push(eq5(brainPageNodes.nodeType, params.nodeType));
14755
14515
  }
14756
14516
  let query = this.db.select().from(brainPageNodes).orderBy(desc2(brainPageNodes.createdAt));
14757
14517
  if (conditions.length > 0) {
14758
- query = query.where(and4(...conditions));
14518
+ query = query.where(and3(...conditions));
14759
14519
  }
14760
14520
  if (params.limit) {
14761
14521
  query = query.limit(params.limit);
@@ -14764,9 +14524,9 @@ var init_brain_accessor = __esm({
14764
14524
  }
14765
14525
  async removePageNode(id) {
14766
14526
  await this.db.delete(brainPageEdges).where(
14767
- or3(eq7(brainPageEdges.fromId, id), eq7(brainPageEdges.toId, id))
14527
+ or3(eq5(brainPageEdges.fromId, id), eq5(brainPageEdges.toId, id))
14768
14528
  );
14769
- await this.db.delete(brainPageNodes).where(eq7(brainPageNodes.id, id));
14529
+ await this.db.delete(brainPageNodes).where(eq5(brainPageNodes.id, id));
14770
14530
  }
14771
14531
  // =========================================================================
14772
14532
  // PageIndex Edge CRUD (T5383)
@@ -14774,34 +14534,34 @@ var init_brain_accessor = __esm({
14774
14534
  async addPageEdge(edge) {
14775
14535
  await this.db.insert(brainPageEdges).values(edge);
14776
14536
  const result = await this.db.select().from(brainPageEdges).where(
14777
- and4(
14778
- eq7(brainPageEdges.fromId, edge.fromId),
14779
- eq7(brainPageEdges.toId, edge.toId),
14780
- eq7(brainPageEdges.edgeType, edge.edgeType)
14537
+ and3(
14538
+ eq5(brainPageEdges.fromId, edge.fromId),
14539
+ eq5(brainPageEdges.toId, edge.toId),
14540
+ eq5(brainPageEdges.edgeType, edge.edgeType)
14781
14541
  )
14782
14542
  );
14783
14543
  return result[0];
14784
14544
  }
14785
14545
  async getPageEdges(nodeId, direction = "both") {
14786
14546
  if (direction === "out") {
14787
- return this.db.select().from(brainPageEdges).where(eq7(brainPageEdges.fromId, nodeId)).orderBy(asc2(brainPageEdges.createdAt));
14547
+ return this.db.select().from(brainPageEdges).where(eq5(brainPageEdges.fromId, nodeId)).orderBy(asc2(brainPageEdges.createdAt));
14788
14548
  }
14789
14549
  if (direction === "in") {
14790
- return this.db.select().from(brainPageEdges).where(eq7(brainPageEdges.toId, nodeId)).orderBy(asc2(brainPageEdges.createdAt));
14550
+ return this.db.select().from(brainPageEdges).where(eq5(brainPageEdges.toId, nodeId)).orderBy(asc2(brainPageEdges.createdAt));
14791
14551
  }
14792
14552
  return this.db.select().from(brainPageEdges).where(
14793
14553
  or3(
14794
- eq7(brainPageEdges.fromId, nodeId),
14795
- eq7(brainPageEdges.toId, nodeId)
14554
+ eq5(brainPageEdges.fromId, nodeId),
14555
+ eq5(brainPageEdges.toId, nodeId)
14796
14556
  )
14797
14557
  ).orderBy(asc2(brainPageEdges.createdAt));
14798
14558
  }
14799
14559
  async getNeighbors(nodeId, edgeType) {
14800
- const conditions = [eq7(brainPageEdges.fromId, nodeId)];
14560
+ const conditions = [eq5(brainPageEdges.fromId, nodeId)];
14801
14561
  if (edgeType) {
14802
- conditions.push(eq7(brainPageEdges.edgeType, edgeType));
14562
+ conditions.push(eq5(brainPageEdges.edgeType, edgeType));
14803
14563
  }
14804
- const edges = await this.db.select().from(brainPageEdges).where(and4(...conditions));
14564
+ const edges = await this.db.select().from(brainPageEdges).where(and3(...conditions));
14805
14565
  if (edges.length === 0) return [];
14806
14566
  const neighborIds = edges.map((e) => e.toId);
14807
14567
  const nodes = [];
@@ -14813,10 +14573,10 @@ var init_brain_accessor = __esm({
14813
14573
  }
14814
14574
  async removePageEdge(fromId, toId, edgeType) {
14815
14575
  await this.db.delete(brainPageEdges).where(
14816
- and4(
14817
- eq7(brainPageEdges.fromId, fromId),
14818
- eq7(brainPageEdges.toId, toId),
14819
- eq7(brainPageEdges.edgeType, edgeType)
14576
+ and3(
14577
+ eq5(brainPageEdges.fromId, fromId),
14578
+ eq5(brainPageEdges.toId, toId),
14579
+ eq5(brainPageEdges.edgeType, edgeType)
14820
14580
  )
14821
14581
  );
14822
14582
  }
@@ -14824,6 +14584,246 @@ var init_brain_accessor = __esm({
14824
14584
  }
14825
14585
  });
14826
14586
 
14587
+ // packages/core/src/agents/registry.ts
14588
+ var registry_exports2 = {};
14589
+ __export(registry_exports2, {
14590
+ checkAgentHealth: () => checkAgentHealth,
14591
+ classifyError: () => classifyError,
14592
+ deregisterAgent: () => deregisterAgent,
14593
+ generateAgentId: () => generateAgentId,
14594
+ getAgentErrorHistory: () => getAgentErrorHistory,
14595
+ getAgentInstance: () => getAgentInstance,
14596
+ getHealthReport: () => getHealthReport,
14597
+ heartbeat: () => heartbeat,
14598
+ incrementTasksCompleted: () => incrementTasksCompleted,
14599
+ listAgentInstances: () => listAgentInstances,
14600
+ markCrashed: () => markCrashed,
14601
+ registerAgent: () => registerAgent,
14602
+ updateAgentStatus: () => updateAgentStatus
14603
+ });
14604
+ import { randomBytes as randomBytes2 } from "node:crypto";
14605
+ import { and as and4, eq as eq6, inArray as inArray4, lt as lt2, sql as sql8 } from "drizzle-orm";
14606
+ function generateAgentId() {
14607
+ const now = /* @__PURE__ */ new Date();
14608
+ const ts = now.toISOString().replace(/[-:T]/g, "").substring(0, 14);
14609
+ const hex = randomBytes2(3).toString("hex");
14610
+ return `agt_${ts}_${hex}`;
14611
+ }
14612
+ async function registerAgent(opts, cwd) {
14613
+ const db = await getDb(cwd);
14614
+ const id = generateAgentId();
14615
+ const now = (/* @__PURE__ */ new Date()).toISOString();
14616
+ const row = {
14617
+ id,
14618
+ agentType: opts.agentType,
14619
+ status: "starting",
14620
+ sessionId: opts.sessionId ?? null,
14621
+ taskId: opts.taskId ?? null,
14622
+ startedAt: now,
14623
+ lastHeartbeat: now,
14624
+ stoppedAt: null,
14625
+ errorCount: 0,
14626
+ totalTasksCompleted: 0,
14627
+ capacity: "1.0",
14628
+ metadataJson: opts.metadata ? JSON.stringify(opts.metadata) : "{}",
14629
+ parentAgentId: opts.parentAgentId ?? null
14630
+ };
14631
+ await db.insert(agentInstances).values(row);
14632
+ return row;
14633
+ }
14634
+ async function deregisterAgent(id, cwd) {
14635
+ const db = await getDb(cwd);
14636
+ const now = (/* @__PURE__ */ new Date()).toISOString();
14637
+ const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
14638
+ if (!existing) return null;
14639
+ if (existing.status === "stopped") return existing;
14640
+ await db.update(agentInstances).set({ status: "stopped", stoppedAt: now }).where(eq6(agentInstances.id, id));
14641
+ return { ...existing, status: "stopped", stoppedAt: now };
14642
+ }
14643
+ async function heartbeat(id, cwd) {
14644
+ const db = await getDb(cwd);
14645
+ const now = (/* @__PURE__ */ new Date()).toISOString();
14646
+ const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
14647
+ if (!existing) return null;
14648
+ if (existing.status === "stopped" || existing.status === "crashed") {
14649
+ return existing.status;
14650
+ }
14651
+ await db.update(agentInstances).set({ lastHeartbeat: now }).where(eq6(agentInstances.id, id));
14652
+ return existing.status;
14653
+ }
14654
+ async function updateAgentStatus(id, opts, cwd) {
14655
+ const db = await getDb(cwd);
14656
+ const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
14657
+ if (!existing) return null;
14658
+ const updates = {
14659
+ status: opts.status
14660
+ };
14661
+ if (opts.taskId !== void 0) {
14662
+ updates.taskId = opts.taskId;
14663
+ }
14664
+ if (opts.status === "active") {
14665
+ updates.lastHeartbeat = (/* @__PURE__ */ new Date()).toISOString();
14666
+ }
14667
+ if (opts.status === "error" || opts.status === "crashed") {
14668
+ updates.errorCount = existing.errorCount + 1;
14669
+ if (opts.error) {
14670
+ const errorType = classifyError(new Error(opts.error));
14671
+ await db.insert(agentErrorLog).values({
14672
+ agentId: id,
14673
+ errorType,
14674
+ message: opts.error,
14675
+ occurredAt: (/* @__PURE__ */ new Date()).toISOString()
14676
+ });
14677
+ }
14678
+ }
14679
+ if (opts.status === "stopped") {
14680
+ updates.stoppedAt = (/* @__PURE__ */ new Date()).toISOString();
14681
+ }
14682
+ await db.update(agentInstances).set(updates).where(eq6(agentInstances.id, id));
14683
+ return { ...existing, ...updates };
14684
+ }
14685
+ async function incrementTasksCompleted(id, cwd) {
14686
+ const db = await getDb(cwd);
14687
+ await db.update(agentInstances).set({ totalTasksCompleted: sql8`${agentInstances.totalTasksCompleted} + 1` }).where(eq6(agentInstances.id, id));
14688
+ }
14689
+ async function listAgentInstances(filters, cwd) {
14690
+ const db = await getDb(cwd);
14691
+ const conditions = [];
14692
+ if (filters?.status) {
14693
+ const statuses = Array.isArray(filters.status) ? filters.status : [filters.status];
14694
+ conditions.push(inArray4(agentInstances.status, statuses));
14695
+ }
14696
+ if (filters?.agentType) {
14697
+ const types = Array.isArray(filters.agentType) ? filters.agentType : [filters.agentType];
14698
+ conditions.push(inArray4(agentInstances.agentType, types));
14699
+ }
14700
+ if (filters?.sessionId) {
14701
+ conditions.push(eq6(agentInstances.sessionId, filters.sessionId));
14702
+ }
14703
+ if (filters?.parentAgentId) {
14704
+ conditions.push(eq6(agentInstances.parentAgentId, filters.parentAgentId));
14705
+ }
14706
+ if (conditions.length === 0) {
14707
+ return db.select().from(agentInstances).all();
14708
+ }
14709
+ return db.select().from(agentInstances).where(and4(...conditions)).all();
14710
+ }
14711
+ async function getAgentInstance(id, cwd) {
14712
+ const db = await getDb(cwd);
14713
+ const row = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
14714
+ return row ?? null;
14715
+ }
14716
+ function classifyError(error40) {
14717
+ const message = error40 instanceof Error ? error40.message : String(error40);
14718
+ for (const pattern of RETRIABLE_PATTERNS) {
14719
+ if (pattern.test(message)) return "retriable";
14720
+ }
14721
+ for (const pattern of PERMANENT_PATTERNS) {
14722
+ if (pattern.test(message)) return "permanent";
14723
+ }
14724
+ return "unknown";
14725
+ }
14726
+ async function getAgentErrorHistory(agentId, cwd) {
14727
+ const db = await getDb(cwd);
14728
+ return db.select().from(agentErrorLog).where(eq6(agentErrorLog.agentId, agentId)).all();
14729
+ }
14730
+ async function checkAgentHealth(thresholdMs = 3e4, cwd) {
14731
+ const db = await getDb(cwd);
14732
+ const cutoff = new Date(Date.now() - thresholdMs).toISOString();
14733
+ return db.select().from(agentInstances).where(
14734
+ and4(
14735
+ inArray4(agentInstances.status, ["active", "idle", "starting"]),
14736
+ lt2(agentInstances.lastHeartbeat, cutoff)
14737
+ )
14738
+ ).all();
14739
+ }
14740
+ async function markCrashed(id, reason, cwd) {
14741
+ return updateAgentStatus(
14742
+ id,
14743
+ { status: "crashed", error: reason ?? "Heartbeat timeout \u2014 agent presumed crashed" },
14744
+ cwd
14745
+ );
14746
+ }
14747
+ async function getHealthReport(thresholdMs = 3e4, cwd) {
14748
+ const allAgents = await listAgentInstances(void 0, cwd);
14749
+ const staleAgents = await checkAgentHealth(thresholdMs, cwd);
14750
+ const report = {
14751
+ total: allAgents.length,
14752
+ active: 0,
14753
+ idle: 0,
14754
+ starting: 0,
14755
+ error: 0,
14756
+ crashed: 0,
14757
+ stopped: 0,
14758
+ totalErrors: 0,
14759
+ staleAgents
14760
+ };
14761
+ for (const agent of allAgents) {
14762
+ switch (agent.status) {
14763
+ case "active":
14764
+ report.active++;
14765
+ break;
14766
+ case "idle":
14767
+ report.idle++;
14768
+ break;
14769
+ case "starting":
14770
+ report.starting++;
14771
+ break;
14772
+ case "error":
14773
+ report.error++;
14774
+ break;
14775
+ case "crashed":
14776
+ report.crashed++;
14777
+ break;
14778
+ case "stopped":
14779
+ report.stopped++;
14780
+ break;
14781
+ }
14782
+ report.totalErrors += agent.errorCount;
14783
+ }
14784
+ return report;
14785
+ }
14786
+ var RETRIABLE_PATTERNS, PERMANENT_PATTERNS;
14787
+ var init_registry2 = __esm({
14788
+ "packages/core/src/agents/registry.ts"() {
14789
+ "use strict";
14790
+ init_sqlite2();
14791
+ init_agent_schema();
14792
+ RETRIABLE_PATTERNS = [
14793
+ /timeout/i,
14794
+ /ECONNREFUSED/,
14795
+ /ECONNRESET/,
14796
+ /EPIPE/,
14797
+ /ETIMEDOUT/,
14798
+ /rate.?limit/i,
14799
+ /429/,
14800
+ /503/,
14801
+ /502/,
14802
+ /SQLITE_BUSY/i,
14803
+ /database is locked/i,
14804
+ /temporarily unavailable/i,
14805
+ /too many requests/i,
14806
+ /network/i,
14807
+ /socket hang up/i
14808
+ ];
14809
+ PERMANENT_PATTERNS = [
14810
+ /permission denied/i,
14811
+ /EACCES/,
14812
+ /authentication/i,
14813
+ /unauthorized/i,
14814
+ /401/,
14815
+ /403/,
14816
+ /404/,
14817
+ /not found/i,
14818
+ /invalid.*token/i,
14819
+ /SQLITE_CONSTRAINT/i,
14820
+ /syntax error/i,
14821
+ /type error/i,
14822
+ /reference error/i
14823
+ ];
14824
+ }
14825
+ });
14826
+
14827
14827
  // packages/core/src/store/project-detect.ts
14828
14828
  var project_detect_exports = {};
14829
14829
  __export(project_detect_exports, {
@@ -17866,19 +17866,19 @@ async function queryAudit(options) {
17866
17866
  try {
17867
17867
  const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
17868
17868
  const { auditLog: auditLog2 } = await Promise.resolve().then(() => (init_tasks_schema(), tasks_schema_exports));
17869
- const { and: and8, eq: eq11, gte: gte3, or: or4 } = await import("drizzle-orm");
17869
+ const { and: and9, eq: eq12, gte: gte3, or: or4 } = await import("drizzle-orm");
17870
17870
  const db = await getDb3(process.cwd());
17871
17871
  const conditions = [];
17872
- if (options?.sessionId) conditions.push(eq11(auditLog2.sessionId, options.sessionId));
17873
- if (options?.domain) conditions.push(eq11(auditLog2.domain, options.domain));
17872
+ if (options?.sessionId) conditions.push(eq12(auditLog2.sessionId, options.sessionId));
17873
+ if (options?.domain) conditions.push(eq12(auditLog2.domain, options.domain));
17874
17874
  if (options?.operation)
17875
17875
  conditions.push(
17876
- or4(eq11(auditLog2.operation, options.operation), eq11(auditLog2.action, options.operation))
17876
+ or4(eq12(auditLog2.operation, options.operation), eq12(auditLog2.action, options.operation))
17877
17877
  );
17878
- if (options?.taskId) conditions.push(eq11(auditLog2.taskId, options.taskId));
17878
+ if (options?.taskId) conditions.push(eq12(auditLog2.taskId, options.taskId));
17879
17879
  if (options?.since) conditions.push(gte3(auditLog2.timestamp, options.since));
17880
17880
  const limit = options?.limit ?? 1e3;
17881
- const rows = await db.select().from(auditLog2).where(conditions.length > 0 ? and8(...conditions) : void 0).orderBy(auditLog2.timestamp).limit(limit);
17881
+ const rows = await db.select().from(auditLog2).where(conditions.length > 0 ? and9(...conditions) : void 0).orderBy(auditLog2.timestamp).limit(limit);
17882
17882
  return rows.map((row) => ({
17883
17883
  timestamp: row.timestamp,
17884
17884
  sessionId: row.sessionId,
@@ -20061,8 +20061,8 @@ function detectEnvMode() {
20061
20061
  const devKv = {};
20062
20062
  const devLines = devContent.trim().split("\n");
20063
20063
  for (let i = 1; i < devLines.length; i++) {
20064
- const eq11 = devLines[i].indexOf("=");
20065
- if (eq11 > 0) devKv[devLines[i].slice(0, eq11).trim()] = devLines[i].slice(eq11 + 1).trim();
20064
+ const eq12 = devLines[i].indexOf("=");
20065
+ if (eq12 > 0) devKv[devLines[i].slice(0, eq12).trim()] = devLines[i].slice(eq12 + 1).trim();
20066
20066
  }
20067
20067
  if (devKv["mode"] === "dev-ts" && devKv["source"]) {
20068
20068
  const devSource = devKv["source"].replace(/\\/g, "/");
@@ -20375,7 +20375,7 @@ var init_config = __esm({
20375
20375
  "session.autoStart": false,
20376
20376
  "session.requireNotes": true,
20377
20377
  "session.multiSession": false,
20378
- "hierarchy.requireAcceptanceCriteria": true,
20378
+ "enforcement.acceptance.mode": "block",
20379
20379
  "lifecycle.mode": "strict"
20380
20380
  }
20381
20381
  },
@@ -20385,7 +20385,7 @@ var init_config = __esm({
20385
20385
  "session.autoStart": false,
20386
20386
  "session.requireNotes": false,
20387
20387
  "session.multiSession": true,
20388
- "hierarchy.requireAcceptanceCriteria": false,
20388
+ "enforcement.acceptance.mode": "warn",
20389
20389
  "lifecycle.mode": "advisory"
20390
20390
  }
20391
20391
  },
@@ -20395,7 +20395,7 @@ var init_config = __esm({
20395
20395
  "session.autoStart": false,
20396
20396
  "session.requireNotes": false,
20397
20397
  "session.multiSession": true,
20398
- "hierarchy.requireAcceptanceCriteria": false,
20398
+ "enforcement.acceptance.mode": "off",
20399
20399
  "lifecycle.mode": "off"
20400
20400
  }
20401
20401
  }
@@ -20774,13 +20774,13 @@ __export(pipeline_exports, {
20774
20774
  listPipelines: () => listPipelines,
20775
20775
  pipelineExists: () => pipelineExists
20776
20776
  });
20777
- import { and as and5, asc as asc3, desc as desc3, eq as eq8, sql as sql9 } from "drizzle-orm";
20777
+ import { and as and6, asc as asc3, desc as desc3, eq as eq9, sql as sql9 } from "drizzle-orm";
20778
20778
  async function initializePipeline(taskId, options = {}) {
20779
20779
  const db = await getDb();
20780
20780
  const now = /* @__PURE__ */ new Date();
20781
20781
  const startStage2 = options.startStage || "research";
20782
20782
  const initialStatus = options.initialStatus || "active";
20783
- const existing = await db.select().from(lifecyclePipelines).where(eq8(lifecyclePipelines.taskId, taskId)).limit(1).all();
20783
+ const existing = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
20784
20784
  if (existing.length > 0) {
20785
20785
  throw new CleoError(101 /* ALREADY_EXISTS */, `Pipeline already exists for task ${taskId}`);
20786
20786
  }
@@ -20829,13 +20829,13 @@ async function initializePipeline(taskId, options = {}) {
20829
20829
  }
20830
20830
  async function getPipeline(taskId) {
20831
20831
  const db = await getDb();
20832
- const result = await db.select().from(lifecyclePipelines).where(eq8(lifecyclePipelines.taskId, taskId)).limit(1).all();
20832
+ const result = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
20833
20833
  if (result.length === 0) {
20834
20834
  return null;
20835
20835
  }
20836
20836
  const row = result[0];
20837
20837
  const isActive = row.status === "active";
20838
- const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(eq8(lifecycleTransitions.pipelineId, row.id)).all();
20838
+ const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(eq9(lifecycleTransitions.pipelineId, row.id)).all();
20839
20839
  const transitionCount = Number(transitionResult[0]?.count || 0);
20840
20840
  return {
20841
20841
  id: taskId,
@@ -20858,7 +20858,7 @@ async function advanceStage(taskId, options) {
20858
20858
  if (!options.initiatedBy) {
20859
20859
  throw new CleoError(2 /* INVALID_INPUT */, "advanceStage() requires initiatedBy agent/user");
20860
20860
  }
20861
- const pipelineResult = await db.select().from(lifecyclePipelines).where(eq8(lifecyclePipelines.taskId, taskId)).limit(1).all();
20861
+ const pipelineResult = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
20862
20862
  if (pipelineResult.length === 0) {
20863
20863
  throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
20864
20864
  }
@@ -20866,9 +20866,9 @@ async function advanceStage(taskId, options) {
20866
20866
  const fromStage = pipeline2.currentStageId;
20867
20867
  const toStage = options.toStage;
20868
20868
  const currentStageResult = await db.select().from(lifecycleStages).where(
20869
- and5(
20870
- eq8(lifecycleStages.pipelineId, pipeline2.id),
20871
- eq8(lifecycleStages.stageName, fromStage)
20869
+ and6(
20870
+ eq9(lifecycleStages.pipelineId, pipeline2.id),
20871
+ eq9(lifecycleStages.stageName, fromStage)
20872
20872
  )
20873
20873
  ).limit(1).all();
20874
20874
  if (currentStageResult.length === 0) {
@@ -20879,9 +20879,9 @@ async function advanceStage(taskId, options) {
20879
20879
  }
20880
20880
  const currentStageRecord = currentStageResult[0];
20881
20881
  const targetStageResult = await db.select().from(lifecycleStages).where(
20882
- and5(
20883
- eq8(lifecycleStages.pipelineId, pipeline2.id),
20884
- eq8(lifecycleStages.stageName, toStage)
20882
+ and6(
20883
+ eq9(lifecycleStages.pipelineId, pipeline2.id),
20884
+ eq9(lifecycleStages.stageName, toStage)
20885
20885
  )
20886
20886
  ).limit(1).all();
20887
20887
  if (targetStageResult.length === 0) {
@@ -20894,14 +20894,14 @@ async function advanceStage(taskId, options) {
20894
20894
  await db.update(lifecycleStages).set({
20895
20895
  status: "completed",
20896
20896
  completedAt: now.toISOString()
20897
- }).where(eq8(lifecycleStages.id, currentStageRecord.id)).run();
20897
+ }).where(eq9(lifecycleStages.id, currentStageRecord.id)).run();
20898
20898
  await db.update(lifecycleStages).set({
20899
20899
  status: "in_progress",
20900
20900
  startedAt: now.toISOString()
20901
- }).where(eq8(lifecycleStages.id, targetStageRecord.id)).run();
20901
+ }).where(eq9(lifecycleStages.id, targetStageRecord.id)).run();
20902
20902
  await db.update(lifecyclePipelines).set({
20903
20903
  currentStageId: toStage
20904
- }).where(eq8(lifecyclePipelines.id, pipeline2.id)).run();
20904
+ }).where(eq9(lifecyclePipelines.id, pipeline2.id)).run();
20905
20905
  await db.insert(lifecycleTransitions).values({
20906
20906
  id: `${pipeline2.id}_${now.getTime()}_${Math.random().toString(36).slice(2, 7)}`,
20907
20907
  pipelineId: pipeline2.id,
@@ -20918,7 +20918,7 @@ async function advanceStage(taskId, options) {
20918
20918
  }
20919
20919
  async function getCurrentStage(taskId) {
20920
20920
  const db = await getDb();
20921
- const result = await db.select({ currentStageId: lifecyclePipelines.currentStageId }).from(lifecyclePipelines).where(eq8(lifecyclePipelines.taskId, taskId)).limit(1).all();
20921
+ const result = await db.select({ currentStageId: lifecyclePipelines.currentStageId }).from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
20922
20922
  if (result.length === 0) {
20923
20923
  throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
20924
20924
  }
@@ -20930,43 +20930,43 @@ async function listPipelines(options = {}) {
20930
20930
  const conditions = [];
20931
20931
  if (options.status) {
20932
20932
  conditions.push(
20933
- eq8(
20933
+ eq9(
20934
20934
  lifecyclePipelines.status,
20935
20935
  options.status
20936
20936
  )
20937
20937
  );
20938
20938
  }
20939
20939
  if (options.currentStage) {
20940
- conditions.push(eq8(lifecyclePipelines.currentStageId, options.currentStage));
20940
+ conditions.push(eq9(lifecyclePipelines.currentStageId, options.currentStage));
20941
20941
  }
20942
20942
  if (conditions.length > 0) {
20943
- const whereClause = conditions.length === 1 ? conditions[0] : and5(...conditions);
20943
+ const whereClause = conditions.length === 1 ? conditions[0] : and6(...conditions);
20944
20944
  query = db.select().from(lifecyclePipelines).where(whereClause);
20945
20945
  }
20946
20946
  if (options.orderBy) {
20947
20947
  const order = options.order === "asc" ? asc3 : desc3;
20948
20948
  switch (options.orderBy) {
20949
20949
  case "createdAt":
20950
- query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and5(...conditions) : void 0).orderBy(order(lifecyclePipelines.startedAt));
20950
+ query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(order(lifecyclePipelines.startedAt));
20951
20951
  break;
20952
20952
  case "currentStage":
20953
- query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and5(...conditions) : void 0).orderBy(order(lifecyclePipelines.currentStageId));
20953
+ query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(order(lifecyclePipelines.currentStageId));
20954
20954
  break;
20955
20955
  }
20956
20956
  } else {
20957
- query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and5(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt));
20957
+ query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt));
20958
20958
  }
20959
20959
  if (options.limit) {
20960
- query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and5(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt)).limit(options.limit);
20960
+ query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt)).limit(options.limit);
20961
20961
  }
20962
20962
  if (options.offset) {
20963
- query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and5(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt)).limit(options.limit || 100).offset(options.offset);
20963
+ query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt)).limit(options.limit || 100).offset(options.offset);
20964
20964
  }
20965
20965
  const results = await query.all();
20966
20966
  return Promise.all(
20967
20967
  results.map(async (row) => {
20968
20968
  const isActive = row.status === "active";
20969
- const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(eq8(lifecycleTransitions.pipelineId, row.id)).all();
20969
+ const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(eq9(lifecycleTransitions.pipelineId, row.id)).all();
20970
20970
  const transitionCount = Number(transitionResult[0]?.count || 0);
20971
20971
  return {
20972
20972
  id: row.taskId,
@@ -20985,7 +20985,7 @@ async function listPipelines(options = {}) {
20985
20985
  async function completePipeline(taskId, reason) {
20986
20986
  const db = await getDb();
20987
20987
  const now = /* @__PURE__ */ new Date();
20988
- const pipelineResult = await db.select().from(lifecyclePipelines).where(eq8(lifecyclePipelines.taskId, taskId)).limit(1).all();
20988
+ const pipelineResult = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
20989
20989
  if (pipelineResult.length === 0) {
20990
20990
  throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
20991
20991
  }
@@ -21000,21 +21000,21 @@ async function completePipeline(taskId, reason) {
21000
21000
  stageUpdate.metadataJson = JSON.stringify({ completionReason: reason });
21001
21001
  }
21002
21002
  await db.update(lifecycleStages).set(stageUpdate).where(
21003
- and5(
21004
- eq8(lifecycleStages.pipelineId, pipeline2.id),
21005
- eq8(lifecycleStages.stageName, pipeline2.currentStageId)
21003
+ and6(
21004
+ eq9(lifecycleStages.pipelineId, pipeline2.id),
21005
+ eq9(lifecycleStages.stageName, pipeline2.currentStageId)
21006
21006
  )
21007
21007
  ).run();
21008
21008
  }
21009
21009
  await db.update(lifecyclePipelines).set({
21010
21010
  status: "completed",
21011
21011
  completedAt: now.toISOString()
21012
- }).where(eq8(lifecyclePipelines.id, pipeline2.id)).run();
21012
+ }).where(eq9(lifecyclePipelines.id, pipeline2.id)).run();
21013
21013
  }
21014
21014
  async function cancelPipeline(taskId, reason) {
21015
21015
  const db = await getDb();
21016
21016
  const now = /* @__PURE__ */ new Date();
21017
- const pipelineResult = await db.select().from(lifecyclePipelines).where(eq8(lifecyclePipelines.taskId, taskId)).limit(1).all();
21017
+ const pipelineResult = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
21018
21018
  if (pipelineResult.length === 0) {
21019
21019
  throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
21020
21020
  }
@@ -21031,20 +21031,20 @@ async function cancelPipeline(taskId, reason) {
21031
21031
  blockedAt: now.toISOString(),
21032
21032
  blockReason: `Pipeline cancelled: ${reason}`
21033
21033
  }).where(
21034
- and5(
21035
- eq8(lifecycleStages.pipelineId, pipeline2.id),
21036
- eq8(lifecycleStages.stageName, pipeline2.currentStageId)
21034
+ and6(
21035
+ eq9(lifecycleStages.pipelineId, pipeline2.id),
21036
+ eq9(lifecycleStages.stageName, pipeline2.currentStageId)
21037
21037
  )
21038
21038
  ).run();
21039
21039
  }
21040
21040
  await db.update(lifecyclePipelines).set({
21041
21041
  status: "cancelled",
21042
21042
  completedAt: now.toISOString()
21043
- }).where(eq8(lifecyclePipelines.id, pipeline2.id)).run();
21043
+ }).where(eq9(lifecyclePipelines.id, pipeline2.id)).run();
21044
21044
  }
21045
21045
  async function pipelineExists(taskId) {
21046
21046
  const db = await getDb();
21047
- const result = await db.select({ count: sql9`count(*)` }).from(lifecyclePipelines).where(eq8(lifecyclePipelines.taskId, taskId)).all();
21047
+ const result = await db.select({ count: sql9`count(*)` }).from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).all();
21048
21048
  return (result[0]?.count || 0) > 0;
21049
21049
  }
21050
21050
  async function getPipelineStatistics() {
@@ -21088,12 +21088,12 @@ async function getPipelineStatistics() {
21088
21088
  }
21089
21089
  async function getPipelineStages(taskId) {
21090
21090
  const db = await getDb();
21091
- const pipelineResult = await db.select({ id: lifecyclePipelines.id }).from(lifecyclePipelines).where(eq8(lifecyclePipelines.taskId, taskId)).limit(1).all();
21091
+ const pipelineResult = await db.select({ id: lifecyclePipelines.id }).from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
21092
21092
  if (pipelineResult.length === 0) {
21093
21093
  throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
21094
21094
  }
21095
21095
  const pipelineId = pipelineResult[0].id;
21096
- const stages = await db.select().from(lifecycleStages).where(eq8(lifecycleStages.pipelineId, pipelineId)).orderBy(asc3(lifecycleStages.sequence)).all();
21096
+ const stages = await db.select().from(lifecycleStages).where(eq9(lifecycleStages.pipelineId, pipelineId)).orderBy(asc3(lifecycleStages.sequence)).all();
21097
21097
  return stages.map((stage) => ({
21098
21098
  id: stage.id,
21099
21099
  pipelineId: stage.pipelineId,
@@ -23949,9 +23949,9 @@ async function nexusRegister(projectPath, name2, permissions = "read") {
23949
23949
  const projectHash = generateProjectHash(projectPath);
23950
23950
  await nexusInit();
23951
23951
  const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
23952
- const { eq: eq11 } = await import("drizzle-orm");
23952
+ const { eq: eq12 } = await import("drizzle-orm");
23953
23953
  const db = await getNexusDb2();
23954
- const existingRows = await db.select().from(projectRegistry).where(eq11(projectRegistry.projectHash, projectHash));
23954
+ const existingRows = await db.select().from(projectRegistry).where(eq12(projectRegistry.projectHash, projectHash));
23955
23955
  const existing = existingRows[0];
23956
23956
  if (existing?.permissions) {
23957
23957
  throw new CleoError(
@@ -23960,7 +23960,7 @@ async function nexusRegister(projectPath, name2, permissions = "read") {
23960
23960
  );
23961
23961
  }
23962
23962
  if (!existing) {
23963
- const nameConflictRows = await db.select().from(projectRegistry).where(eq11(projectRegistry.name, projectName));
23963
+ const nameConflictRows = await db.select().from(projectRegistry).where(eq12(projectRegistry.name, projectName));
23964
23964
  if (nameConflictRows.length > 0) {
23965
23965
  throw new CleoError(
23966
23966
  6 /* VALIDATION_ERROR */,
@@ -23978,7 +23978,7 @@ async function nexusRegister(projectPath, name2, permissions = "read") {
23978
23978
  taskCount: meta.taskCount,
23979
23979
  labelsJson: JSON.stringify(meta.labels),
23980
23980
  lastSeen: now
23981
- }).where(eq11(projectRegistry.projectHash, projectHash));
23981
+ }).where(eq12(projectRegistry.projectHash, projectHash));
23982
23982
  } else {
23983
23983
  if (!projectId) {
23984
23984
  projectId = randomUUID3();
@@ -24016,9 +24016,9 @@ async function nexusUnregister(nameOrHash) {
24016
24016
  throw new CleoError(4 /* NOT_FOUND */, `Project not found in registry: ${nameOrHash}`);
24017
24017
  }
24018
24018
  const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
24019
- const { eq: eq11 } = await import("drizzle-orm");
24019
+ const { eq: eq12 } = await import("drizzle-orm");
24020
24020
  const db = await getNexusDb2();
24021
- await db.delete(projectRegistry).where(eq11(projectRegistry.projectHash, project.hash));
24021
+ await db.delete(projectRegistry).where(eq12(projectRegistry.projectHash, project.hash));
24022
24022
  await writeNexusAudit({
24023
24023
  action: "unregister",
24024
24024
  projectHash: project.hash,
@@ -24040,9 +24040,9 @@ async function nexusList() {
24040
24040
  async function nexusGetProject(nameOrHash) {
24041
24041
  try {
24042
24042
  const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
24043
- const { eq: eq11, or: or4 } = await import("drizzle-orm");
24043
+ const { eq: eq12, or: or4 } = await import("drizzle-orm");
24044
24044
  const db = await getNexusDb2();
24045
- const rows = await db.select().from(projectRegistry).where(or4(eq11(projectRegistry.projectHash, nameOrHash), eq11(projectRegistry.name, nameOrHash)));
24045
+ const rows = await db.select().from(projectRegistry).where(or4(eq12(projectRegistry.projectHash, nameOrHash), eq12(projectRegistry.name, nameOrHash)));
24046
24046
  const row = rows[0];
24047
24047
  if (!row) return null;
24048
24048
  return rowToProject(row);
@@ -24065,14 +24065,14 @@ async function nexusSync(nameOrHash) {
24065
24065
  const meta = await readProjectMeta(project.path);
24066
24066
  const now = (/* @__PURE__ */ new Date()).toISOString();
24067
24067
  const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
24068
- const { eq: eq11 } = await import("drizzle-orm");
24068
+ const { eq: eq12 } = await import("drizzle-orm");
24069
24069
  const db = await getNexusDb2();
24070
24070
  await db.update(projectRegistry).set({
24071
24071
  taskCount: meta.taskCount,
24072
24072
  labelsJson: JSON.stringify(meta.labels),
24073
24073
  lastSync: now,
24074
24074
  lastSeen: now
24075
- }).where(eq11(projectRegistry.projectHash, project.hash));
24075
+ }).where(eq12(projectRegistry.projectHash, project.hash));
24076
24076
  await writeNexusAudit({
24077
24077
  action: "sync",
24078
24078
  projectHash: project.hash,
@@ -24086,7 +24086,7 @@ async function nexusSyncAll() {
24086
24086
  let synced = 0;
24087
24087
  let failed = 0;
24088
24088
  const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
24089
- const { eq: eq11 } = await import("drizzle-orm");
24089
+ const { eq: eq12 } = await import("drizzle-orm");
24090
24090
  const db = await getNexusDb2();
24091
24091
  for (const project of projects) {
24092
24092
  try {
@@ -24097,7 +24097,7 @@ async function nexusSyncAll() {
24097
24097
  labelsJson: JSON.stringify(meta.labels),
24098
24098
  lastSync: now,
24099
24099
  lastSeen: now
24100
- }).where(eq11(projectRegistry.projectHash, project.hash));
24100
+ }).where(eq12(projectRegistry.projectHash, project.hash));
24101
24101
  synced++;
24102
24102
  } catch {
24103
24103
  failed++;
@@ -24117,9 +24117,9 @@ async function nexusSetPermission(nameOrHash, permission) {
24117
24117
  throw new CleoError(4 /* NOT_FOUND */, `Project not found in registry: ${nameOrHash}`);
24118
24118
  }
24119
24119
  const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
24120
- const { eq: eq11 } = await import("drizzle-orm");
24120
+ const { eq: eq12 } = await import("drizzle-orm");
24121
24121
  const db = await getNexusDb2();
24122
- await db.update(projectRegistry).set({ permissions: permission }).where(eq11(projectRegistry.projectHash, project.hash));
24122
+ await db.update(projectRegistry).set({ permissions: permission }).where(eq12(projectRegistry.projectHash, project.hash));
24123
24123
  await writeNexusAudit({
24124
24124
  action: "set-permission",
24125
24125
  projectHash: project.hash,
@@ -24135,12 +24135,12 @@ async function nexusReconcile(projectRoot) {
24135
24135
  }
24136
24136
  await nexusInit();
24137
24137
  const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
24138
- const { eq: eq11 } = await import("drizzle-orm");
24138
+ const { eq: eq12 } = await import("drizzle-orm");
24139
24139
  const db = await getNexusDb2();
24140
24140
  const projectId = await readProjectId(projectRoot);
24141
24141
  const currentHash = generateProjectHash(projectRoot);
24142
24142
  if (projectId) {
24143
- const hashRows2 = await db.select().from(projectRegistry).where(eq11(projectRegistry.projectHash, currentHash));
24143
+ const hashRows2 = await db.select().from(projectRegistry).where(eq12(projectRegistry.projectHash, currentHash));
24144
24144
  const hashMatch2 = hashRows2[0];
24145
24145
  if (hashMatch2 && hashMatch2.projectId !== projectId) {
24146
24146
  await writeNexusAudit({
@@ -24159,12 +24159,12 @@ async function nexusReconcile(projectRoot) {
24159
24159
  }
24160
24160
  }
24161
24161
  if (projectId) {
24162
- const idRows = await db.select().from(projectRegistry).where(eq11(projectRegistry.projectId, projectId));
24162
+ const idRows = await db.select().from(projectRegistry).where(eq12(projectRegistry.projectId, projectId));
24163
24163
  const existing = idRows[0];
24164
24164
  if (existing) {
24165
24165
  const now = (/* @__PURE__ */ new Date()).toISOString();
24166
24166
  if (existing.projectPath === projectRoot) {
24167
- await db.update(projectRegistry).set({ lastSeen: now }).where(eq11(projectRegistry.projectId, projectId));
24167
+ await db.update(projectRegistry).set({ lastSeen: now }).where(eq12(projectRegistry.projectId, projectId));
24168
24168
  await writeNexusAudit({
24169
24169
  action: "reconcile",
24170
24170
  projectHash: currentHash,
@@ -24180,7 +24180,7 @@ async function nexusReconcile(projectRoot) {
24180
24180
  projectPath: projectRoot,
24181
24181
  projectHash: currentHash,
24182
24182
  lastSeen: now
24183
- }).where(eq11(projectRegistry.projectId, projectId));
24183
+ }).where(eq12(projectRegistry.projectId, projectId));
24184
24184
  await writeNexusAudit({
24185
24185
  action: "reconcile",
24186
24186
  projectHash: currentHash,
@@ -24192,11 +24192,11 @@ async function nexusReconcile(projectRoot) {
24192
24192
  return { status: "path_updated", oldPath, newPath: projectRoot };
24193
24193
  }
24194
24194
  }
24195
- const hashRows = await db.select().from(projectRegistry).where(eq11(projectRegistry.projectHash, currentHash));
24195
+ const hashRows = await db.select().from(projectRegistry).where(eq12(projectRegistry.projectHash, currentHash));
24196
24196
  const hashMatch = hashRows[0];
24197
24197
  if (hashMatch) {
24198
24198
  const now = (/* @__PURE__ */ new Date()).toISOString();
24199
- await db.update(projectRegistry).set({ lastSeen: now }).where(eq11(projectRegistry.projectHash, currentHash));
24199
+ await db.update(projectRegistry).set({ lastSeen: now }).where(eq12(projectRegistry.projectHash, currentHash));
24200
24200
  await writeNexusAudit({
24201
24201
  action: "reconcile",
24202
24202
  projectHash: currentHash,
@@ -26401,7 +26401,7 @@ async function syncAdrsToDb(projectRoot) {
26401
26401
  return result;
26402
26402
  }
26403
26403
  const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
26404
- const { eq: eq11 } = await import("drizzle-orm");
26404
+ const { eq: eq12 } = await import("drizzle-orm");
26405
26405
  const db = await getDb3(projectRoot);
26406
26406
  const now = (/* @__PURE__ */ new Date()).toISOString();
26407
26407
  const allFiles = collectAdrFiles(adrsDir);
@@ -26435,15 +26435,15 @@ async function syncAdrsToDb(projectRoot) {
26435
26435
  topics: fm.Topics ?? null,
26436
26436
  updatedAt: now
26437
26437
  };
26438
- const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq11(architectureDecisions.id, record2.id)).all();
26438
+ const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq12(architectureDecisions.id, record2.id)).all();
26439
26439
  if (existing.length > 0) {
26440
- await db.update(architectureDecisions).set(rowBase).where(eq11(architectureDecisions.id, record2.id));
26440
+ await db.update(architectureDecisions).set(rowBase).where(eq12(architectureDecisions.id, record2.id));
26441
26441
  result.updated++;
26442
26442
  } else {
26443
26443
  await db.insert(architectureDecisions).values({ ...rowBase, createdAt: now });
26444
26444
  result.inserted++;
26445
26445
  }
26446
- await db.delete(adrTaskLinks).where(eq11(adrTaskLinks.adrId, record2.id));
26446
+ await db.delete(adrTaskLinks).where(eq12(adrTaskLinks.adrId, record2.id));
26447
26447
  if (fm["Related Tasks"]) {
26448
26448
  for (const taskId of parseTaskIds2(fm["Related Tasks"])) {
26449
26449
  await db.insert(adrTaskLinks).values({ adrId: record2.id, taskId, linkType: "related" });
@@ -26545,18 +26545,27 @@ __export(agents_exports, {
26545
26545
  AGENT_INSTANCE_STATUSES: () => AGENT_INSTANCE_STATUSES,
26546
26546
  AGENT_TYPES: () => AGENT_TYPES,
26547
26547
  DEFAULT_RETRY_POLICY: () => DEFAULT_RETRY_POLICY,
26548
+ HEARTBEAT_INTERVAL_MS: () => HEARTBEAT_INTERVAL_MS,
26549
+ MAX_TASKS_PER_AGENT: () => MAX_TASKS_PER_AGENT,
26550
+ STALE_THRESHOLD_MS: () => STALE_THRESHOLD_MS,
26548
26551
  agentErrorLog: () => agentErrorLog,
26549
26552
  agentInstances: () => agentInstances,
26550
26553
  calculateDelay: () => calculateDelay,
26551
- checkAgentHealth: () => checkAgentHealth,
26554
+ checkAgentHealth: () => checkAgentHealth2,
26552
26555
  classifyError: () => classifyError,
26553
26556
  createRetryPolicy: () => createRetryPolicy,
26554
26557
  deregisterAgent: () => deregisterAgent,
26558
+ detectCrashedAgents: () => detectCrashedAgents,
26559
+ detectStaleAgents: () => detectStaleAgents,
26555
26560
  findLeastLoadedAgent: () => findLeastLoadedAgent,
26561
+ findStaleAgentRows: () => checkAgentHealth,
26556
26562
  generateAgentId: () => generateAgentId,
26563
+ getAgentCapacity: () => getAgentCapacity,
26557
26564
  getAgentErrorHistory: () => getAgentErrorHistory,
26558
26565
  getAgentInstance: () => getAgentInstance,
26559
26566
  getAgentPerformanceHistory: () => getAgentPerformanceHistory,
26567
+ getAgentSpecializations: () => getAgentSpecializations,
26568
+ getAgentsByCapacity: () => getAgentsByCapacity,
26560
26569
  getAvailableCapacity: () => getAvailableCapacity,
26561
26570
  getCapacitySummary: () => getCapacitySummary,
26562
26571
  getHealthReport: () => getHealthReport,
@@ -26568,85 +26577,35 @@ __export(agents_exports, {
26568
26577
  markCrashed: () => markCrashed,
26569
26578
  processAgentLifecycleEvent: () => processAgentLifecycleEvent,
26570
26579
  recordAgentExecution: () => recordAgentExecution,
26580
+ recordAgentPerformance: () => recordAgentPerformance,
26571
26581
  recordFailurePattern: () => recordFailurePattern,
26582
+ recordHeartbeat: () => recordHeartbeat,
26572
26583
  recoverCrashedAgents: () => recoverCrashedAgents,
26573
26584
  registerAgent: () => registerAgent,
26574
26585
  shouldRetry: () => shouldRetry,
26575
26586
  storeHealingStrategy: () => storeHealingStrategy,
26587
+ updateAgentSpecializations: () => updateAgentSpecializations,
26576
26588
  updateAgentStatus: () => updateAgentStatus,
26577
26589
  updateCapacity: () => updateCapacity,
26578
26590
  withRetry: () => withRetry
26579
26591
  });
26580
- init_agent_schema();
26581
26592
 
26582
- // packages/core/src/agents/capacity.ts
26593
+ // packages/core/src/agents/agent-registry.ts
26583
26594
  init_sqlite2();
26584
26595
  init_agent_schema();
26585
- init_registry2();
26586
- import { eq as eq6 } from "drizzle-orm";
26587
- async function updateCapacity(id, capacity, cwd) {
26588
- if (capacity < 0 || capacity > 1) {
26589
- throw new Error(`Capacity must be between 0.0 and 1.0, got ${capacity}`);
26590
- }
26591
- const db = await getDb(cwd);
26592
- const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
26593
- if (!existing) return null;
26594
- const capacityStr = capacity.toFixed(4);
26595
- await db.update(agentInstances).set({ capacity: capacityStr }).where(eq6(agentInstances.id, id));
26596
- return { ...existing, capacity: capacityStr };
26597
- }
26598
- async function getAvailableCapacity(cwd) {
26599
- const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
26600
- return agents.reduce((sum, agent) => sum + parseCapacity(agent.capacity), 0);
26601
- }
26602
- async function findLeastLoadedAgent(agentType, cwd) {
26603
- const filters = agentType ? { status: ["active", "idle"], agentType } : { status: ["active", "idle"] };
26604
- const agents = await listAgentInstances(filters, cwd);
26605
- if (agents.length === 0) return null;
26606
- let best = agents[0];
26607
- let bestCapacity = parseCapacity(best.capacity);
26608
- for (let i = 1; i < agents.length; i++) {
26609
- const cap = parseCapacity(agents[i].capacity);
26610
- if (cap > bestCapacity) {
26611
- best = agents[i];
26612
- bestCapacity = cap;
26613
- }
26614
- }
26615
- return best;
26616
- }
26617
- async function isOverloaded(threshold = 0.1, cwd) {
26618
- const capacity = await getAvailableCapacity(cwd);
26619
- return capacity < threshold;
26620
- }
26621
- async function getCapacitySummary(threshold = 0.1, cwd) {
26622
- const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
26623
- const totalCapacity = agents.reduce((sum, a) => sum + parseCapacity(a.capacity), 0);
26624
- const activeAgentCount = agents.length;
26625
- return {
26626
- totalCapacity,
26627
- activeAgentCount,
26628
- averageCapacity: activeAgentCount > 0 ? totalCapacity / activeAgentCount : 0,
26629
- overloaded: totalCapacity < threshold,
26630
- threshold
26631
- };
26632
- }
26633
- function parseCapacity(value) {
26634
- if (!value) return 0;
26635
- const parsed = parseFloat(value);
26636
- return Number.isNaN(parsed) ? 0 : Math.max(0, Math.min(1, parsed));
26637
- }
26596
+ import { and as and5, eq as eq7, inArray as inArray5 } from "drizzle-orm";
26638
26597
 
26639
26598
  // packages/core/src/agents/execution-learning.ts
26640
26599
  init_brain_accessor();
26641
- import { randomBytes as randomBytes2 } from "node:crypto";
26600
+ import { randomBytes } from "node:crypto";
26642
26601
  function generateDecisionId() {
26643
- return `AGT-${randomBytes2(5).toString("hex")}`;
26602
+ return `AGT-${randomBytes(5).toString("hex")}`;
26644
26603
  }
26645
26604
  function generatePatternId() {
26646
- return `P-agt-${randomBytes2(4).toString("hex")}`;
26605
+ return `P-agt-${randomBytes(4).toString("hex")}`;
26647
26606
  }
26648
26607
  function generateObservationId() {
26649
- return `O-agt-${randomBytes2(4).toString("hex")}`;
26608
+ return `O-agt-${randomBytes(4).toString("hex")}`;
26650
26609
  }
26651
26610
  function nowSql() {
26652
26611
  return (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19);
@@ -26923,6 +26882,215 @@ function buildHealingSuggestion(agentType, taskType, errorType, frequency) {
26923
26882
  return `Unknown failure for ${agentType} on ${taskType} tasks (${frequency}x). Check agent logs, retry with fresh context, or reassign to a different agent type.`;
26924
26883
  }
26925
26884
 
26885
+ // packages/core/src/agents/agent-registry.ts
26886
+ init_registry2();
26887
+ var MAX_TASKS_PER_AGENT = 5;
26888
+ async function getAgentCapacity(agentId, cwd) {
26889
+ const db = await getDb(cwd);
26890
+ const agent = await db.select().from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
26891
+ if (!agent) return null;
26892
+ const isTerminal = agent.status === "stopped" || agent.status === "crashed";
26893
+ if (isTerminal) {
26894
+ return {
26895
+ agentId: agent.id,
26896
+ agentType: agent.agentType,
26897
+ status: agent.status,
26898
+ activeTasks: 0,
26899
+ remainingCapacity: 0,
26900
+ maxCapacity: MAX_TASKS_PER_AGENT,
26901
+ available: false
26902
+ };
26903
+ }
26904
+ const children = await db.select({ id: agentInstances.id }).from(agentInstances).where(
26905
+ and5(
26906
+ eq7(agentInstances.parentAgentId, agentId),
26907
+ inArray5(agentInstances.status, ["starting", "active", "idle", "error"])
26908
+ )
26909
+ ).all();
26910
+ const selfTask = agent.taskId != null ? 1 : 0;
26911
+ const activeTasks = selfTask + children.length;
26912
+ const remainingCapacity = Math.max(0, MAX_TASKS_PER_AGENT - activeTasks);
26913
+ return {
26914
+ agentId: agent.id,
26915
+ agentType: agent.agentType,
26916
+ status: agent.status,
26917
+ activeTasks,
26918
+ remainingCapacity,
26919
+ maxCapacity: MAX_TASKS_PER_AGENT,
26920
+ available: remainingCapacity > 0
26921
+ };
26922
+ }
26923
+ async function getAgentsByCapacity(agentType, cwd) {
26924
+ const filters = agentType ? { status: ["active", "idle"], agentType } : { status: ["active", "idle"] };
26925
+ const activeAgents = await listAgentInstances(filters, cwd);
26926
+ const capacities = await Promise.all(
26927
+ activeAgents.map((agent) => getAgentCapacity(agent.id, cwd))
26928
+ );
26929
+ return capacities.filter((c) => c !== null).sort((a, b) => b.remainingCapacity - a.remainingCapacity);
26930
+ }
26931
+ async function getAgentSpecializations(agentId, cwd) {
26932
+ const db = await getDb(cwd);
26933
+ const agent = await db.select({ metadataJson: agentInstances.metadataJson }).from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
26934
+ if (!agent) return [];
26935
+ try {
26936
+ const meta = JSON.parse(agent.metadataJson ?? "{}");
26937
+ const specs = meta.specializations;
26938
+ if (!Array.isArray(specs)) return [];
26939
+ return specs.filter((s) => typeof s === "string");
26940
+ } catch {
26941
+ return [];
26942
+ }
26943
+ }
26944
+ async function updateAgentSpecializations(agentId, specializations, cwd) {
26945
+ const db = await getDb(cwd);
26946
+ const agent = await db.select({ metadataJson: agentInstances.metadataJson }).from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
26947
+ if (!agent) return null;
26948
+ let existing = {};
26949
+ try {
26950
+ existing = JSON.parse(agent.metadataJson ?? "{}");
26951
+ } catch {
26952
+ }
26953
+ const updated = { ...existing, specializations };
26954
+ await db.update(agentInstances).set({ metadataJson: JSON.stringify(updated) }).where(eq7(agentInstances.id, agentId));
26955
+ return specializations;
26956
+ }
26957
+ async function recordAgentPerformance(agentId, metrics, cwd) {
26958
+ const db = await getDb(cwd);
26959
+ const agent = await db.select({ agentType: agentInstances.agentType, sessionId: agentInstances.sessionId }).from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
26960
+ if (!agent) return null;
26961
+ const event = {
26962
+ agentId,
26963
+ agentType: agent.agentType,
26964
+ taskId: metrics.taskId,
26965
+ taskType: metrics.taskType,
26966
+ outcome: metrics.outcome,
26967
+ taskLabels: metrics.taskLabels,
26968
+ sessionId: metrics.sessionId ?? agent.sessionId ?? void 0,
26969
+ durationMs: metrics.durationMs,
26970
+ errorMessage: metrics.errorMessage,
26971
+ errorType: metrics.errorType
26972
+ };
26973
+ const decision = await recordAgentExecution(event, cwd);
26974
+ return decision?.id ?? null;
26975
+ }
26976
+
26977
+ // packages/core/src/agents/index.ts
26978
+ init_agent_schema();
26979
+
26980
+ // packages/core/src/agents/capacity.ts
26981
+ init_sqlite2();
26982
+ init_agent_schema();
26983
+ init_registry2();
26984
+ import { eq as eq8 } from "drizzle-orm";
26985
+ async function updateCapacity(id, capacity, cwd) {
26986
+ if (capacity < 0 || capacity > 1) {
26987
+ throw new Error(`Capacity must be between 0.0 and 1.0, got ${capacity}`);
26988
+ }
26989
+ const db = await getDb(cwd);
26990
+ const existing = await db.select().from(agentInstances).where(eq8(agentInstances.id, id)).get();
26991
+ if (!existing) return null;
26992
+ const capacityStr = capacity.toFixed(4);
26993
+ await db.update(agentInstances).set({ capacity: capacityStr }).where(eq8(agentInstances.id, id));
26994
+ return { ...existing, capacity: capacityStr };
26995
+ }
26996
+ async function getAvailableCapacity(cwd) {
26997
+ const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
26998
+ return agents.reduce((sum, agent) => sum + parseCapacity(agent.capacity), 0);
26999
+ }
27000
+ async function findLeastLoadedAgent(agentType, cwd) {
27001
+ const filters = agentType ? { status: ["active", "idle"], agentType } : { status: ["active", "idle"] };
27002
+ const agents = await listAgentInstances(filters, cwd);
27003
+ if (agents.length === 0) return null;
27004
+ let best = agents[0];
27005
+ let bestCapacity = parseCapacity(best.capacity);
27006
+ for (let i = 1; i < agents.length; i++) {
27007
+ const cap = parseCapacity(agents[i].capacity);
27008
+ if (cap > bestCapacity) {
27009
+ best = agents[i];
27010
+ bestCapacity = cap;
27011
+ }
27012
+ }
27013
+ return best;
27014
+ }
27015
+ async function isOverloaded(threshold = 0.1, cwd) {
27016
+ const capacity = await getAvailableCapacity(cwd);
27017
+ return capacity < threshold;
27018
+ }
27019
+ async function getCapacitySummary(threshold = 0.1, cwd) {
27020
+ const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
27021
+ const totalCapacity = agents.reduce((sum, a) => sum + parseCapacity(a.capacity), 0);
27022
+ const activeAgentCount = agents.length;
27023
+ return {
27024
+ totalCapacity,
27025
+ activeAgentCount,
27026
+ averageCapacity: activeAgentCount > 0 ? totalCapacity / activeAgentCount : 0,
27027
+ overloaded: totalCapacity < threshold,
27028
+ threshold
27029
+ };
27030
+ }
27031
+ function parseCapacity(value) {
27032
+ if (!value) return 0;
27033
+ const parsed = parseFloat(value);
27034
+ return Number.isNaN(parsed) ? 0 : Math.max(0, Math.min(1, parsed));
27035
+ }
27036
+
27037
+ // packages/core/src/agents/health-monitor.ts
27038
+ init_registry2();
27039
+ var HEARTBEAT_INTERVAL_MS = 3e4;
27040
+ var STALE_THRESHOLD_MS = 3 * 6e4;
27041
+ var ALIVE_STATUSES = ["starting", "active", "idle"];
27042
+ async function recordHeartbeat(agentId, cwd) {
27043
+ return heartbeat(agentId, cwd);
27044
+ }
27045
+ async function checkAgentHealth2(agentId, thresholdMs = STALE_THRESHOLD_MS, cwd) {
27046
+ const all = await listAgentInstances(void 0, cwd);
27047
+ const agent = all.find((a) => a.id === agentId);
27048
+ if (!agent) return null;
27049
+ return buildHealthStatus(agent, thresholdMs);
27050
+ }
27051
+ async function detectStaleAgents(thresholdMs = STALE_THRESHOLD_MS, cwd) {
27052
+ const agents = await listAgentInstances({ status: ALIVE_STATUSES }, cwd);
27053
+ return agents.map((a) => buildHealthStatus(a, thresholdMs)).filter((s) => s.stale).sort((a, b) => b.heartbeatAgeMs - a.heartbeatAgeMs);
27054
+ }
27055
+ async function detectCrashedAgents(thresholdMs = STALE_THRESHOLD_MS, cwd) {
27056
+ const activeAgents = await listAgentInstances({ status: "active" }, cwd);
27057
+ const cutoff = new Date(Date.now() - thresholdMs).toISOString();
27058
+ const crashed = [];
27059
+ for (const agent of activeAgents) {
27060
+ if (agent.lastHeartbeat < cutoff) {
27061
+ const updated = await markCrashed(
27062
+ agent.id,
27063
+ `Heartbeat timeout \u2014 no heartbeat for >${Math.round(thresholdMs / 1e3)}s`,
27064
+ cwd
27065
+ );
27066
+ if (updated) {
27067
+ crashed.push(updated);
27068
+ }
27069
+ }
27070
+ }
27071
+ crashed.sort((a, b) => {
27072
+ const aHb = a.lastHeartbeat ?? "";
27073
+ const bHb = b.lastHeartbeat ?? "";
27074
+ return aHb < bHb ? -1 : aHb > bHb ? 1 : 0;
27075
+ });
27076
+ return crashed;
27077
+ }
27078
+ function buildHealthStatus(agent, thresholdMs) {
27079
+ const lastHeartbeatMs = new Date(agent.lastHeartbeat).getTime();
27080
+ const heartbeatAgeMs = Date.now() - lastHeartbeatMs;
27081
+ const stale = ALIVE_STATUSES.includes(agent.status) ? heartbeatAgeMs > thresholdMs : false;
27082
+ const healthy = !stale && ALIVE_STATUSES.includes(agent.status);
27083
+ return {
27084
+ agentId: agent.id,
27085
+ status: agent.status,
27086
+ lastHeartbeat: agent.lastHeartbeat,
27087
+ heartbeatAgeMs,
27088
+ healthy,
27089
+ stale,
27090
+ thresholdMs
27091
+ };
27092
+ }
27093
+
26926
27094
  // packages/core/src/agents/index.ts
26927
27095
  init_registry2();
26928
27096
 
@@ -39185,6 +39353,7 @@ __export(intelligence_exports, {
39185
39353
  gatherLearningContext: () => gatherLearningContext,
39186
39354
  matchPatterns: () => matchPatterns,
39187
39355
  predictAndStore: () => predictAndStore,
39356
+ predictImpact: () => predictImpact,
39188
39357
  predictValidationOutcome: () => predictValidationOutcome,
39189
39358
  scoreVerificationConfidence: () => scoreVerificationConfidence,
39190
39359
  storeDetectedPattern: () => storeDetectedPattern,
@@ -40374,6 +40543,116 @@ function generateRecommendation2(changeType, affectedCount, cascadeDepth, taskId
40374
40543
  return `${severity} impact: reprioritizing ${taskId} may reorder ${affectedCount} downstream task(s) across ${cascadeDepth} level(s) of dependencies.`;
40375
40544
  }
40376
40545
  }
40546
+ function scoreTaskMatch(change, task) {
40547
+ const STOP_WORDS3 = /* @__PURE__ */ new Set([
40548
+ "a",
40549
+ "an",
40550
+ "the",
40551
+ "and",
40552
+ "or",
40553
+ "in",
40554
+ "of",
40555
+ "to",
40556
+ "for",
40557
+ "with",
40558
+ "on",
40559
+ "at",
40560
+ "by",
40561
+ "is",
40562
+ "it",
40563
+ "be",
40564
+ "as",
40565
+ "if",
40566
+ "do",
40567
+ "not"
40568
+ ]);
40569
+ const tokenise = (text3) => text3.toLowerCase().split(/\W+/).filter((t) => t.length > 2 && !STOP_WORDS3.has(t));
40570
+ const changeTokens = new Set(tokenise(change));
40571
+ if (changeTokens.size === 0) return 0;
40572
+ const taskText = `${task.title ?? ""} ${task.description ?? ""}`;
40573
+ const taskTokens = new Set(tokenise(taskText));
40574
+ let matches = 0;
40575
+ for (const token of changeTokens) {
40576
+ if (taskTokens.has(token)) matches++;
40577
+ }
40578
+ return matches / changeTokens.size;
40579
+ }
40580
+ async function predictImpact(change, cwd, accessor, matchLimit = 5) {
40581
+ const acc = accessor ?? await getAccessor(cwd);
40582
+ const tasks2 = await loadAllTasks2(acc);
40583
+ const taskMap = new Map(tasks2.map((t) => [t.id, t]));
40584
+ const dependentsMap = buildDependentsMap(tasks2);
40585
+ const scored = tasks2.map((t) => ({ task: t, score: scoreTaskMatch(change, t) })).filter(({ score }) => score > 0).sort((a, b) => b.score - a.score);
40586
+ const seeds = scored.slice(0, matchLimit).map(({ task }) => task);
40587
+ if (seeds.length === 0) {
40588
+ return {
40589
+ change,
40590
+ matchedTasks: [],
40591
+ affectedTasks: [],
40592
+ totalAffected: 0,
40593
+ summary: `No tasks matched the change description "${change}".`
40594
+ };
40595
+ }
40596
+ const directMatchIds = new Set(seeds.map((t) => t.id));
40597
+ const exposureMap = /* @__PURE__ */ new Map();
40598
+ for (const id of directMatchIds) {
40599
+ exposureMap.set(id, "direct");
40600
+ }
40601
+ for (const seed of seeds) {
40602
+ const transitive = collectTransitiveDependents(seed.id, dependentsMap);
40603
+ for (const depId of transitive) {
40604
+ if (!exposureMap.has(depId)) {
40605
+ const isDirectDependent = (dependentsMap.get(seed.id) ?? /* @__PURE__ */ new Set()).has(depId);
40606
+ exposureMap.set(depId, isDirectDependent ? "dependent" : "transitive");
40607
+ }
40608
+ }
40609
+ }
40610
+ const EXPOSURE_ORDER = {
40611
+ direct: 0,
40612
+ dependent: 1,
40613
+ transitive: 2
40614
+ };
40615
+ const affectedTasks = [];
40616
+ for (const [id, exposure] of exposureMap) {
40617
+ const task = taskMap.get(id);
40618
+ if (!task) continue;
40619
+ const downstreamTransitive = collectTransitiveDependents(id, dependentsMap);
40620
+ const downstreamCount = downstreamTransitive.size;
40621
+ let reason;
40622
+ if (exposure === "direct") {
40623
+ reason = `Task title/description matched "${change}".`;
40624
+ } else if (exposure === "dependent") {
40625
+ const seedNames = seeds.filter((s) => (dependentsMap.get(s.id) ?? /* @__PURE__ */ new Set()).has(id)).map((s) => s.id).join(", ");
40626
+ reason = `Directly depends on matched task(s): ${seedNames}.`;
40627
+ } else {
40628
+ reason = "Downstream of a matched task via transitive dependency chain.";
40629
+ }
40630
+ affectedTasks.push({
40631
+ id,
40632
+ title: task.title,
40633
+ status: task.status,
40634
+ priority: task.priority,
40635
+ exposure,
40636
+ downstreamCount,
40637
+ reason
40638
+ });
40639
+ }
40640
+ affectedTasks.sort((a, b) => {
40641
+ const expDiff = EXPOSURE_ORDER[a.exposure] - EXPOSURE_ORDER[b.exposure];
40642
+ if (expDiff !== 0) return expDiff;
40643
+ return b.downstreamCount - a.downstreamCount;
40644
+ });
40645
+ const matchedTasks = affectedTasks.filter((t) => t.exposure === "direct");
40646
+ const totalAffected = affectedTasks.length;
40647
+ const summary = matchedTasks.length === 0 ? `No tasks matched "${change}".` : `${matchedTasks.length} task(s) matched "${change}"; ${totalAffected} total task(s) affected (including downstream).`;
40648
+ return {
40649
+ change,
40650
+ matchedTasks,
40651
+ affectedTasks,
40652
+ totalAffected,
40653
+ summary
40654
+ };
40655
+ }
40377
40656
 
40378
40657
  // packages/core/src/intelligence/patterns.ts
40379
40658
  import { randomBytes as randomBytes7 } from "node:crypto";
@@ -40889,13 +41168,13 @@ function extractYamlArray(content, field) {
40889
41168
  }
40890
41169
  const lines = content.split("\n");
40891
41170
  const items = [];
40892
- let inArray5 = false;
41171
+ let inArray6 = false;
40893
41172
  for (const line2 of lines) {
40894
41173
  if (line2.match(new RegExp(`^${field}:`))) {
40895
- inArray5 = true;
41174
+ inArray6 = true;
40896
41175
  continue;
40897
41176
  }
40898
- if (inArray5) {
41177
+ if (inArray6) {
40899
41178
  const itemMatch = line2.match(/^\s+-\s+["']?(.+?)["']?\s*$/);
40900
41179
  if (itemMatch) {
40901
41180
  items.push(itemMatch[1].trim());
@@ -41113,6 +41392,60 @@ function addIssue(params) {
41113
41392
  };
41114
41393
  }
41115
41394
 
41395
+ // packages/core/src/lib/index.ts
41396
+ var lib_exports = {};
41397
+ __export(lib_exports, {
41398
+ computeDelay: () => computeDelay,
41399
+ withRetry: () => withRetry2
41400
+ });
41401
+
41402
+ // packages/core/src/lib/retry.ts
41403
+ async function withRetry2(fn, options) {
41404
+ const maxAttempts = options?.maxAttempts ?? 3;
41405
+ const baseDelayMs = options?.baseDelayMs ?? 2e3;
41406
+ const maxDelayMs = options?.maxDelayMs ?? 3e4;
41407
+ const retryableErrors = options?.retryableErrors;
41408
+ let lastError;
41409
+ let totalDelayMs = 0;
41410
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
41411
+ try {
41412
+ return await fn();
41413
+ } catch (err) {
41414
+ lastError = err;
41415
+ const isLastAttempt = attempt === maxAttempts;
41416
+ if (isLastAttempt) break;
41417
+ if (retryableErrors !== void 0 && !isRetryable(err, retryableErrors)) break;
41418
+ const delay = computeDelay(attempt, baseDelayMs, maxDelayMs);
41419
+ totalDelayMs += delay;
41420
+ await sleep2(delay);
41421
+ }
41422
+ }
41423
+ const context = { attempts: maxAttempts, totalDelayMs };
41424
+ augmentError(lastError, context);
41425
+ throw lastError;
41426
+ }
41427
+ function computeDelay(attempt, baseDelayMs, maxDelayMs) {
41428
+ const exponential = baseDelayMs * 2 ** (attempt - 1);
41429
+ return Math.min(exponential, maxDelayMs);
41430
+ }
41431
+ function isRetryable(err, predicates) {
41432
+ const message = err instanceof Error ? err.message : String(err);
41433
+ return predicates.some((predicate) => {
41434
+ if (predicate instanceof RegExp) return predicate.test(message);
41435
+ return predicate(err);
41436
+ });
41437
+ }
41438
+ function augmentError(err, context) {
41439
+ if (err instanceof Error) {
41440
+ const mutableErr = err;
41441
+ mutableErr.attempts = context.attempts;
41442
+ mutableErr.totalDelayMs = context.totalDelayMs;
41443
+ }
41444
+ }
41445
+ function sleep2(ms) {
41446
+ return new Promise((resolve10) => setTimeout(resolve10, ms));
41447
+ }
41448
+
41116
41449
  // packages/core/src/lifecycle/index.ts
41117
41450
  var lifecycle_exports = {};
41118
41451
  __export(lifecycle_exports, {
@@ -41929,12 +42262,12 @@ async function getEnforcementMode(cwd) {
41929
42262
  }
41930
42263
  async function getLifecycleStatus(epicId, cwd) {
41931
42264
  const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
41932
- const { eq: eq11 } = await import("drizzle-orm");
42265
+ const { eq: eq12 } = await import("drizzle-orm");
41933
42266
  const db = await getDb3(cwd);
41934
42267
  const pipelineResult = await db.select({
41935
42268
  pipeline: lifecyclePipelines,
41936
42269
  task: tasks
41937
- }).from(lifecyclePipelines).innerJoin(tasks, eq11(lifecyclePipelines.taskId, tasks.id)).where(eq11(lifecyclePipelines.taskId, epicId)).limit(1);
42270
+ }).from(lifecyclePipelines).innerJoin(tasks, eq12(lifecyclePipelines.taskId, tasks.id)).where(eq12(lifecyclePipelines.taskId, epicId)).limit(1);
41938
42271
  if (pipelineResult.length === 0) {
41939
42272
  return {
41940
42273
  epicId,
@@ -41947,7 +42280,7 @@ async function getLifecycleStatus(epicId, cwd) {
41947
42280
  }
41948
42281
  const task = pipelineResult[0].task;
41949
42282
  const pipelineId = `pipeline-${epicId}`;
41950
- const stageRows = await db.select().from(lifecycleStages).where(eq11(lifecycleStages.pipelineId, pipelineId)).orderBy(lifecycleStages.sequence);
42283
+ const stageRows = await db.select().from(lifecycleStages).where(eq12(lifecycleStages.pipelineId, pipelineId)).orderBy(lifecycleStages.sequence);
41951
42284
  const stageDataMap = /* @__PURE__ */ new Map();
41952
42285
  for (const row of stageRows) {
41953
42286
  let parsedChain;
@@ -42016,10 +42349,10 @@ async function getLifecycleStatus(epicId, cwd) {
42016
42349
  }
42017
42350
  async function getLifecycleHistory(epicId, cwd) {
42018
42351
  const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
42019
- const { eq: eq11 } = await import("drizzle-orm");
42352
+ const { eq: eq12 } = await import("drizzle-orm");
42020
42353
  const db = await getDb3(cwd);
42021
42354
  const pipelineId = `pipeline-${epicId}`;
42022
- const stages = await db.select().from(lifecycleStages).where(eq11(lifecycleStages.pipelineId, pipelineId));
42355
+ const stages = await db.select().from(lifecycleStages).where(eq12(lifecycleStages.pipelineId, pipelineId));
42023
42356
  if (stages.length === 0) {
42024
42357
  return { epicId, history: [] };
42025
42358
  }
@@ -42049,7 +42382,7 @@ async function getLifecycleHistory(epicId, cwd) {
42049
42382
  }
42050
42383
  const stageIds = stages.map((s) => s.id);
42051
42384
  if (stageIds.length > 0) {
42052
- const gateResults = await db.select().from(lifecycleGateResults).where(eq11(lifecycleGateResults.stageId, stageIds[0]));
42385
+ const gateResults = await db.select().from(lifecycleGateResults).where(eq12(lifecycleGateResults.stageId, stageIds[0]));
42053
42386
  for (const gate of gateResults) {
42054
42387
  const stageName = stageIdToName.get(gate.stageId);
42055
42388
  if (stageName) {
@@ -42062,7 +42395,7 @@ async function getLifecycleHistory(epicId, cwd) {
42062
42395
  }
42063
42396
  }
42064
42397
  for (let i = 1; i < stageIds.length; i++) {
42065
- const additionalGates = await db.select().from(lifecycleGateResults).where(eq11(lifecycleGateResults.stageId, stageIds[i]));
42398
+ const additionalGates = await db.select().from(lifecycleGateResults).where(eq12(lifecycleGateResults.stageId, stageIds[i]));
42066
42399
  for (const gate of additionalGates) {
42067
42400
  const stageName = stageIdToName.get(gate.stageId);
42068
42401
  if (stageName) {
@@ -42081,16 +42414,16 @@ async function getLifecycleHistory(epicId, cwd) {
42081
42414
  }
42082
42415
  async function getLifecycleGates(epicId, cwd) {
42083
42416
  const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
42084
- const { eq: eq11 } = await import("drizzle-orm");
42417
+ const { eq: eq12 } = await import("drizzle-orm");
42085
42418
  const db = await getDb3(cwd);
42086
42419
  const pipelineId = `pipeline-${epicId}`;
42087
- const stages = await db.select().from(lifecycleStages).where(eq11(lifecycleStages.pipelineId, pipelineId));
42420
+ const stages = await db.select().from(lifecycleStages).where(eq12(lifecycleStages.pipelineId, pipelineId));
42088
42421
  if (stages.length === 0) {
42089
42422
  return {};
42090
42423
  }
42091
42424
  const gates = {};
42092
42425
  for (const stage of stages) {
42093
- const gateRows = await db.select().from(lifecycleGateResults).where(eq11(lifecycleGateResults.stageId, stage.id));
42426
+ const gateRows = await db.select().from(lifecycleGateResults).where(eq12(lifecycleGateResults.stageId, stage.id));
42094
42427
  if (gateRows.length > 0) {
42095
42428
  gates[stage.stageName] = {};
42096
42429
  for (const gateRow of gateRows) {
@@ -42154,7 +42487,7 @@ async function checkStagePrerequisites(epicId, targetStage, cwd) {
42154
42487
  }
42155
42488
  async function ensureLifecycleContext(epicId, stageName, cwd, options) {
42156
42489
  const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
42157
- const { eq: eq11 } = await import("drizzle-orm");
42490
+ const { eq: eq12 } = await import("drizzle-orm");
42158
42491
  const db = await getDb3(cwd);
42159
42492
  const pipelineId = `pipeline-${epicId}`;
42160
42493
  const stageId = `stage-${epicId}-${stageName}`;
@@ -42162,7 +42495,7 @@ async function ensureLifecycleContext(epicId, stageName, cwd, options) {
42162
42495
  getNativeDb2().prepare(
42163
42496
  `INSERT OR IGNORE INTO tasks (id, title, status, priority, created_at) VALUES (?, ?, 'pending', 'medium', datetime('now'))`
42164
42497
  ).run(epicId, `Task ${epicId}`);
42165
- const existingPipeline = await db.select().from(lifecyclePipelines).where(eq11(lifecyclePipelines.id, pipelineId)).limit(1).all();
42498
+ const existingPipeline = await db.select().from(lifecyclePipelines).where(eq12(lifecyclePipelines.id, pipelineId)).limit(1).all();
42166
42499
  if (existingPipeline.length === 0) {
42167
42500
  await db.insert(lifecyclePipelines).values({
42168
42501
  id: pipelineId,
@@ -42172,7 +42505,7 @@ async function ensureLifecycleContext(epicId, stageName, cwd, options) {
42172
42505
  startedAt: options.now
42173
42506
  }).run();
42174
42507
  }
42175
- const existingStage = await db.select().from(lifecycleStages).where(eq11(lifecycleStages.id, stageId)).limit(1).all();
42508
+ const existingStage = await db.select().from(lifecycleStages).where(eq12(lifecycleStages.id, stageId)).limit(1).all();
42176
42509
  if (existingStage.length === 0) {
42177
42510
  const sequence = isValidStage(stageName) ? STAGE_ORDER[stageName] : 0;
42178
42511
  await db.insert(lifecycleStages).values({
@@ -42185,7 +42518,7 @@ async function ensureLifecycleContext(epicId, stageName, cwd, options) {
42185
42518
  }).run();
42186
42519
  }
42187
42520
  if (options.updateCurrentStage) {
42188
- await db.update(lifecyclePipelines).set({ currentStageId: stageId }).where(eq11(lifecyclePipelines.id, pipelineId)).run();
42521
+ await db.update(lifecyclePipelines).set({ currentStageId: stageId }).where(eq12(lifecyclePipelines.id, pipelineId)).run();
42189
42522
  }
42190
42523
  return { db, pipelineId, stageId };
42191
42524
  }
@@ -42200,7 +42533,7 @@ async function recordStageProgress(epicId, stage, status, notes, cwd) {
42200
42533
  `Invalid status: ${status}. Valid: ${validStatuses.join(", ")}`
42201
42534
  );
42202
42535
  }
42203
- const { eq: eq11 } = await import("drizzle-orm");
42536
+ const { eq: eq12 } = await import("drizzle-orm");
42204
42537
  const now = (/* @__PURE__ */ new Date()).toISOString();
42205
42538
  const stageName = stage;
42206
42539
  const { db, stageId, pipelineId } = await ensureLifecycleContext(epicId, stage, cwd, {
@@ -42216,7 +42549,7 @@ async function recordStageProgress(epicId, stage, status, notes, cwd) {
42216
42549
  status,
42217
42550
  related: artifact.related
42218
42551
  };
42219
- const existingStage = await db.select().from(lifecycleStages).where(eq11(lifecycleStages.id, stageId)).limit(1).all();
42552
+ const existingStage = await db.select().from(lifecycleStages).where(eq12(lifecycleStages.id, stageId)).limit(1).all();
42220
42553
  const sequence = STAGE_ORDER[stage];
42221
42554
  const stageValues = {
42222
42555
  status,
@@ -42243,7 +42576,7 @@ async function recordStageProgress(epicId, stage, status, notes, cwd) {
42243
42576
  provenanceChainJson: JSON.stringify(provenanceChain)
42244
42577
  }).run();
42245
42578
  } else {
42246
- await db.update(lifecycleStages).set(stageValues).where(eq11(lifecycleStages.id, stageId)).run();
42579
+ await db.update(lifecycleStages).set(stageValues).where(eq12(lifecycleStages.id, stageId)).run();
42247
42580
  }
42248
42581
  if (status === "completed") {
42249
42582
  await linkProvenance(epicId, stageName, artifact.absolutePath, cwd);
@@ -42263,7 +42596,7 @@ async function resetStage(epicId, stage, reason, cwd) {
42263
42596
  if (!PIPELINE_STAGES.includes(stage)) {
42264
42597
  throw new CleoError(2 /* INVALID_INPUT */, `Invalid stage: ${stage}`);
42265
42598
  }
42266
- const { eq: eq11 } = await import("drizzle-orm");
42599
+ const { eq: eq12 } = await import("drizzle-orm");
42267
42600
  const now = (/* @__PURE__ */ new Date()).toISOString();
42268
42601
  const { db, stageId } = await ensureLifecycleContext(epicId, stage, cwd, {
42269
42602
  now,
@@ -42276,11 +42609,11 @@ async function resetStage(epicId, stage, reason, cwd) {
42276
42609
  skippedAt: null,
42277
42610
  skipReason: null,
42278
42611
  notesJson: JSON.stringify([`Reset: ${reason}`])
42279
- }).where(eq11(lifecycleStages.id, stageId)).run();
42612
+ }).where(eq12(lifecycleStages.id, stageId)).run();
42280
42613
  return { epicId, stage, reason };
42281
42614
  }
42282
42615
  async function passGate(epicId, gateName, agent, notes, cwd) {
42283
- const { eq: eq11 } = await import("drizzle-orm");
42616
+ const { eq: eq12 } = await import("drizzle-orm");
42284
42617
  const now = (/* @__PURE__ */ new Date()).toISOString();
42285
42618
  const stageName = gateName.split("-")[0];
42286
42619
  const gateId = `gate-${epicId}-${stageName}-${gateName}`;
@@ -42289,7 +42622,7 @@ async function passGate(epicId, gateName, agent, notes, cwd) {
42289
42622
  stageStatusOnCreate: "in_progress",
42290
42623
  updateCurrentStage: true
42291
42624
  });
42292
- const existingGate = await db.select().from(lifecycleGateResults).where(eq11(lifecycleGateResults.id, gateId)).limit(1).all();
42625
+ const existingGate = await db.select().from(lifecycleGateResults).where(eq12(lifecycleGateResults.id, gateId)).limit(1).all();
42293
42626
  const gateValues = {
42294
42627
  id: gateId,
42295
42628
  stageId,
@@ -42301,14 +42634,14 @@ async function passGate(epicId, gateName, agent, notes, cwd) {
42301
42634
  reason: null
42302
42635
  };
42303
42636
  if (existingGate.length > 0) {
42304
- await db.update(lifecycleGateResults).set(gateValues).where(eq11(lifecycleGateResults.id, gateId)).run();
42637
+ await db.update(lifecycleGateResults).set(gateValues).where(eq12(lifecycleGateResults.id, gateId)).run();
42305
42638
  } else {
42306
42639
  await db.insert(lifecycleGateResults).values(gateValues).run();
42307
42640
  }
42308
42641
  return { epicId, gateName, timestamp: now };
42309
42642
  }
42310
42643
  async function failGate(epicId, gateName, reason, cwd) {
42311
- const { eq: eq11 } = await import("drizzle-orm");
42644
+ const { eq: eq12 } = await import("drizzle-orm");
42312
42645
  const now = (/* @__PURE__ */ new Date()).toISOString();
42313
42646
  const stageName = gateName.split("-")[0];
42314
42647
  const gateId = `gate-${epicId}-${stageName}-${gateName}`;
@@ -42317,7 +42650,7 @@ async function failGate(epicId, gateName, reason, cwd) {
42317
42650
  stageStatusOnCreate: "in_progress",
42318
42651
  updateCurrentStage: true
42319
42652
  });
42320
- const existingGate = await db.select().from(lifecycleGateResults).where(eq11(lifecycleGateResults.id, gateId)).limit(1).all();
42653
+ const existingGate = await db.select().from(lifecycleGateResults).where(eq12(lifecycleGateResults.id, gateId)).limit(1).all();
42321
42654
  const gateValues = {
42322
42655
  id: gateId,
42323
42656
  stageId,
@@ -42329,7 +42662,7 @@ async function failGate(epicId, gateName, reason, cwd) {
42329
42662
  reason: reason ?? null
42330
42663
  };
42331
42664
  if (existingGate.length > 0) {
42332
- await db.update(lifecycleGateResults).set(gateValues).where(eq11(lifecycleGateResults.id, gateId)).run();
42665
+ await db.update(lifecycleGateResults).set(gateValues).where(eq12(lifecycleGateResults.id, gateId)).run();
42333
42666
  } else {
42334
42667
  await db.insert(lifecycleGateResults).values(gateValues).run();
42335
42668
  }
@@ -46463,6 +46796,7 @@ init_registry3();
46463
46796
  // packages/core/src/nexus/sharing/index.ts
46464
46797
  init_config();
46465
46798
  init_paths();
46799
+ init_git_checkpoint();
46466
46800
  import { existsSync as existsSync54, readdirSync as readdirSync22, statSync as statSync15 } from "node:fs";
46467
46801
  import { readFile as readFile10, writeFile as writeFile9 } from "node:fs/promises";
46468
46802
  import { join as join61, relative as relative5 } from "node:path";
@@ -46509,6 +46843,30 @@ function collectCleoFiles(cleoDir) {
46509
46843
  walk(cleoDir);
46510
46844
  return files.sort();
46511
46845
  }
46846
+ async function getCleoGitRemotes(cleoDir) {
46847
+ const result = await cleoGitCommand(["remote"], cleoDir);
46848
+ if (!result.success || !result.stdout) return [];
46849
+ return result.stdout.split("\n").map((r) => r.trim()).filter(Boolean);
46850
+ }
46851
+ async function hasCleoGitPendingChanges(cleoDir) {
46852
+ const result = await cleoGitCommand(["status", "--porcelain"], cleoDir);
46853
+ if (!result.success) return false;
46854
+ return result.stdout.length > 0;
46855
+ }
46856
+ async function getLastSyncTimestamp(cleoDir) {
46857
+ const result = await cleoGitCommand(["reflog", "--format=%gs %ci", "HEAD"], cleoDir);
46858
+ if (!result.success || !result.stdout) return null;
46859
+ for (const line2 of result.stdout.split("\n")) {
46860
+ const trimmed = line2.trim();
46861
+ if (/^(fetch|push|pull)\b/i.test(trimmed)) {
46862
+ const isoMatch = trimmed.match(/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [+-]\d{4})$/);
46863
+ if (isoMatch?.[1]) {
46864
+ return new Date(isoMatch[1]).toISOString();
46865
+ }
46866
+ }
46867
+ }
46868
+ return null;
46869
+ }
46512
46870
  async function getSharingStatus(cwd) {
46513
46871
  const config2 = await loadConfig(cwd);
46514
46872
  const sharing = config2.sharing;
@@ -46525,12 +46883,27 @@ async function getSharingStatus(cwd) {
46525
46883
  ignored.push(file2);
46526
46884
  }
46527
46885
  }
46886
+ const hasGit = isCleoGitInitialized(cleoDir);
46887
+ let remotes = [];
46888
+ let pendingChanges = false;
46889
+ let lastSync = null;
46890
+ if (hasGit) {
46891
+ [remotes, pendingChanges, lastSync] = await Promise.all([
46892
+ getCleoGitRemotes(cleoDir),
46893
+ hasCleoGitPendingChanges(cleoDir),
46894
+ getLastSyncTimestamp(cleoDir)
46895
+ ]);
46896
+ }
46528
46897
  return {
46529
46898
  mode: sharing.mode,
46530
46899
  allowlist: sharing.commitAllowlist,
46531
46900
  denylist: sharing.denylist,
46532
46901
  tracked,
46533
- ignored
46902
+ ignored,
46903
+ hasGit,
46904
+ remotes,
46905
+ pendingChanges,
46906
+ lastSync
46534
46907
  };
46535
46908
  }
46536
46909
  function generateGitignoreEntries(sharing) {
@@ -46585,25 +46958,25 @@ init_logger();
46585
46958
  init_sqlite2();
46586
46959
  init_tasks_schema();
46587
46960
  import { randomUUID as randomUUID4 } from "node:crypto";
46588
- import { and as and6, eq as eq9 } from "drizzle-orm";
46961
+ import { and as and7, eq as eq10 } from "drizzle-orm";
46589
46962
  async function getLinksByProvider(providerId, cwd) {
46590
46963
  const db = await getDb(cwd);
46591
- const rows = await db.select().from(externalTaskLinks).where(eq9(externalTaskLinks.providerId, providerId));
46964
+ const rows = await db.select().from(externalTaskLinks).where(eq10(externalTaskLinks.providerId, providerId));
46592
46965
  return rows.map(rowToLink);
46593
46966
  }
46594
46967
  async function getLinkByExternalId(providerId, externalId, cwd) {
46595
46968
  const db = await getDb(cwd);
46596
46969
  const rows = await db.select().from(externalTaskLinks).where(
46597
- and6(
46598
- eq9(externalTaskLinks.providerId, providerId),
46599
- eq9(externalTaskLinks.externalId, externalId)
46970
+ and7(
46971
+ eq10(externalTaskLinks.providerId, providerId),
46972
+ eq10(externalTaskLinks.externalId, externalId)
46600
46973
  )
46601
46974
  );
46602
46975
  return rows.length > 0 ? rowToLink(rows[0]) : null;
46603
46976
  }
46604
46977
  async function getLinksByTaskId(taskId, cwd) {
46605
46978
  const db = await getDb(cwd);
46606
- const rows = await db.select().from(externalTaskLinks).where(eq9(externalTaskLinks.taskId, taskId));
46979
+ const rows = await db.select().from(externalTaskLinks).where(eq10(externalTaskLinks.taskId, taskId));
46607
46980
  return rows.map(rowToLink);
46608
46981
  }
46609
46982
  async function createLink(params, cwd) {
@@ -46647,11 +47020,11 @@ async function touchLink(linkId, updates, cwd) {
46647
47020
  if (updates?.metadata !== void 0) {
46648
47021
  values.metadataJson = JSON.stringify(updates.metadata);
46649
47022
  }
46650
- await db.update(externalTaskLinks).set(values).where(eq9(externalTaskLinks.id, linkId));
47023
+ await db.update(externalTaskLinks).set(values).where(eq10(externalTaskLinks.id, linkId));
46651
47024
  }
46652
47025
  async function removeLinksByProvider(providerId, cwd) {
46653
47026
  const db = await getDb(cwd);
46654
- const result = await db.delete(externalTaskLinks).where(eq9(externalTaskLinks.providerId, providerId));
47027
+ const result = await db.delete(externalTaskLinks).where(eq10(externalTaskLinks.providerId, providerId));
46655
47028
  return Number(result.changes);
46656
47029
  }
46657
47030
  function rowToLink(row) {
@@ -49703,7 +50076,7 @@ import { execFileSync as execFileSync7 } from "node:child_process";
49703
50076
  import { existsSync as existsSync63, renameSync as renameSync5 } from "node:fs";
49704
50077
  import { readFile as readFile12 } from "node:fs/promises";
49705
50078
  import { join as join67 } from "node:path";
49706
- import { and as and7, count, desc as desc4, eq as eq10 } from "drizzle-orm";
50079
+ import { and as and8, count, desc as desc4, eq as eq11 } from "drizzle-orm";
49707
50080
  init_paths();
49708
50081
  init_tasks_schema();
49709
50082
 
@@ -50003,7 +50376,7 @@ function rowToManifest(row) {
50003
50376
  }
50004
50377
  async function findLatestPushedVersion(cwd) {
50005
50378
  const db = await getDb2(cwd);
50006
- const rows = await db.select({ version: releaseManifests.version }).from(releaseManifests).where(eq10(releaseManifests.status, "pushed")).orderBy(desc4(releaseManifests.pushedAt)).limit(1).all();
50379
+ const rows = await db.select({ version: releaseManifests.version }).from(releaseManifests).where(eq11(releaseManifests.status, "pushed")).orderBy(desc4(releaseManifests.pushedAt)).limit(1).all();
50007
50380
  return rows[0]?.version;
50008
50381
  }
50009
50382
  async function prepareRelease(version2, tasks2, notes, loadTasksFn, cwd) {
@@ -50015,7 +50388,7 @@ async function prepareRelease(version2, tasks2, notes, loadTasksFn, cwd) {
50015
50388
  }
50016
50389
  const normalizedVersion = normalizeVersion(version2);
50017
50390
  const db = await getDb2(cwd);
50018
- const existing = await db.select().from(releaseManifests).where(eq10(releaseManifests.version, normalizedVersion)).limit(1).all();
50391
+ const existing = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
50019
50392
  if (existing.length > 0) {
50020
50393
  throw new Error(`Release ${normalizedVersion} already exists (status: ${existing[0].status})`);
50021
50394
  }
@@ -50055,7 +50428,7 @@ async function generateReleaseChangelog(version2, loadTasksFn, cwd) {
50055
50428
  }
50056
50429
  const normalizedVersion = normalizeVersion(version2);
50057
50430
  const db = await getDb2(cwd);
50058
- const rows = await db.select().from(releaseManifests).where(eq10(releaseManifests.version, normalizedVersion)).limit(1).all();
50431
+ const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
50059
50432
  if (rows.length === 0) {
50060
50433
  throw new Error(`Release ${normalizedVersion} not found`);
50061
50434
  }
@@ -50192,7 +50565,7 @@ async function generateReleaseChangelog(version2, loadTasksFn, cwd) {
50192
50565
  sections.push("");
50193
50566
  }
50194
50567
  const changelog = sections.join("\n");
50195
- await db.update(releaseManifests).set({ changelog }).where(eq10(releaseManifests.version, normalizedVersion)).run();
50568
+ await db.update(releaseManifests).set({ changelog }).where(eq11(releaseManifests.version, normalizedVersion)).run();
50196
50569
  const changelogPath = join67(cwd ?? process.cwd(), "CHANGELOG.md");
50197
50570
  let existingChangelogContent = "";
50198
50571
  try {
@@ -50230,8 +50603,8 @@ async function listManifestReleases(optionsOrCwd, cwd) {
50230
50603
  const db = await getDb2(effectiveCwd);
50231
50604
  const totalRow = await db.select({ count: count() }).from(releaseManifests).get();
50232
50605
  const total = totalRow?.count ?? 0;
50233
- const conditions = options.status ? [eq10(releaseManifests.status, options.status)] : [];
50234
- const whereClause = conditions.length > 0 ? and7(...conditions) : void 0;
50606
+ const conditions = options.status ? [eq11(releaseManifests.status, options.status)] : [];
50607
+ const whereClause = conditions.length > 0 ? and8(...conditions) : void 0;
50235
50608
  const filteredRow = await db.select({ count: count() }).from(releaseManifests).where(whereClause).get();
50236
50609
  const filtered = filteredRow?.count ?? 0;
50237
50610
  let query = db.select().from(releaseManifests).where(whereClause).orderBy(desc4(releaseManifests.createdAt));
@@ -50262,7 +50635,7 @@ async function showManifestRelease(version2, cwd) {
50262
50635
  }
50263
50636
  const normalizedVersion = normalizeVersion(version2);
50264
50637
  const db = await getDb2(cwd);
50265
- const rows = await db.select().from(releaseManifests).where(eq10(releaseManifests.version, normalizedVersion)).limit(1).all();
50638
+ const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
50266
50639
  if (rows.length === 0) {
50267
50640
  throw new Error(`Release ${normalizedVersion} not found`);
50268
50641
  }
@@ -50274,7 +50647,7 @@ async function commitRelease(version2, cwd) {
50274
50647
  }
50275
50648
  const normalizedVersion = normalizeVersion(version2);
50276
50649
  const db = await getDb2(cwd);
50277
- const rows = await db.select().from(releaseManifests).where(eq10(releaseManifests.version, normalizedVersion)).limit(1).all();
50650
+ const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
50278
50651
  if (rows.length === 0) {
50279
50652
  throw new Error(`Release ${normalizedVersion} not found`);
50280
50653
  }
@@ -50284,7 +50657,7 @@ async function commitRelease(version2, cwd) {
50284
50657
  );
50285
50658
  }
50286
50659
  const committedAt = (/* @__PURE__ */ new Date()).toISOString();
50287
- await db.update(releaseManifests).set({ status: "committed", committedAt }).where(eq10(releaseManifests.version, normalizedVersion)).run();
50660
+ await db.update(releaseManifests).set({ status: "committed", committedAt }).where(eq11(releaseManifests.version, normalizedVersion)).run();
50288
50661
  return { version: normalizedVersion, status: "committed", committedAt };
50289
50662
  }
50290
50663
  async function tagRelease(version2, cwd) {
@@ -50293,12 +50666,12 @@ async function tagRelease(version2, cwd) {
50293
50666
  }
50294
50667
  const normalizedVersion = normalizeVersion(version2);
50295
50668
  const db = await getDb2(cwd);
50296
- const rows = await db.select().from(releaseManifests).where(eq10(releaseManifests.version, normalizedVersion)).limit(1).all();
50669
+ const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
50297
50670
  if (rows.length === 0) {
50298
50671
  throw new Error(`Release ${normalizedVersion} not found`);
50299
50672
  }
50300
50673
  const taggedAt = (/* @__PURE__ */ new Date()).toISOString();
50301
- await db.update(releaseManifests).set({ status: "tagged", taggedAt }).where(eq10(releaseManifests.version, normalizedVersion)).run();
50674
+ await db.update(releaseManifests).set({ status: "tagged", taggedAt }).where(eq11(releaseManifests.version, normalizedVersion)).run();
50302
50675
  return { version: normalizedVersion, status: "tagged", taggedAt };
50303
50676
  }
50304
50677
  async function runReleaseGates(version2, loadTasksFn, cwd, opts) {
@@ -50307,7 +50680,7 @@ async function runReleaseGates(version2, loadTasksFn, cwd, opts) {
50307
50680
  }
50308
50681
  const normalizedVersion = normalizeVersion(version2);
50309
50682
  const db = await getDb2(cwd);
50310
- const rows = await db.select().from(releaseManifests).where(eq10(releaseManifests.version, normalizedVersion)).limit(1).all();
50683
+ const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
50311
50684
  if (rows.length === 0) {
50312
50685
  throw new Error(`Release ${normalizedVersion} not found`);
50313
50686
  }
@@ -50455,7 +50828,7 @@ async function cancelRelease(version2, projectRoot) {
50455
50828
  }
50456
50829
  const normalizedVersion = normalizeVersion(version2);
50457
50830
  const db = await getDb2(projectRoot);
50458
- const rows = await db.select().from(releaseManifests).where(eq10(releaseManifests.version, normalizedVersion)).limit(1).all();
50831
+ const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
50459
50832
  if (rows.length === 0) {
50460
50833
  return {
50461
50834
  success: false,
@@ -50472,7 +50845,7 @@ async function cancelRelease(version2, projectRoot) {
50472
50845
  version: normalizedVersion
50473
50846
  };
50474
50847
  }
50475
- await db.delete(releaseManifests).where(eq10(releaseManifests.version, normalizedVersion)).run();
50848
+ await db.delete(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).run();
50476
50849
  return {
50477
50850
  success: true,
50478
50851
  message: `Release ${normalizedVersion} cancelled and removed`,
@@ -50485,12 +50858,12 @@ async function rollbackRelease(version2, reason, cwd) {
50485
50858
  }
50486
50859
  const normalizedVersion = normalizeVersion(version2);
50487
50860
  const db = await getDb2(cwd);
50488
- const rows = await db.select().from(releaseManifests).where(eq10(releaseManifests.version, normalizedVersion)).limit(1).all();
50861
+ const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
50489
50862
  if (rows.length === 0) {
50490
50863
  throw new Error(`Release ${normalizedVersion} not found`);
50491
50864
  }
50492
50865
  const previousStatus = rows[0].status;
50493
- await db.update(releaseManifests).set({ status: "rolled_back" }).where(eq10(releaseManifests.version, normalizedVersion)).run();
50866
+ await db.update(releaseManifests).set({ status: "rolled_back" }).where(eq11(releaseManifests.version, normalizedVersion)).run();
50494
50867
  return {
50495
50868
  version: normalizedVersion,
50496
50869
  previousStatus,
@@ -50600,7 +50973,7 @@ async function markReleasePushed(version2, pushedAt, cwd, provenance) {
50600
50973
  pushedAt,
50601
50974
  ...provenance?.commitSha != null ? { commitSha: provenance.commitSha } : {},
50602
50975
  ...provenance?.gitTag != null ? { gitTag: provenance.gitTag } : {}
50603
- }).where(eq10(releaseManifests.version, normalizedVersion)).run();
50976
+ }).where(eq11(releaseManifests.version, normalizedVersion)).run();
50604
50977
  }
50605
50978
  async function migrateReleasesJsonToSqlite(projectRoot) {
50606
50979
  const releasesPath = join67(getCleoDirAbsolute(projectRoot), "releases.json");
@@ -50620,7 +50993,7 @@ async function migrateReleasesJsonToSqlite(projectRoot) {
50620
50993
  const db = await getDb2(projectRoot);
50621
50994
  let migrated = 0;
50622
50995
  for (const r of raw.releases) {
50623
- const existing = await db.select({ id: releaseManifests.id }).from(releaseManifests).where(eq10(releaseManifests.version, r.version)).limit(1).all();
50996
+ const existing = await db.select({ id: releaseManifests.id }).from(releaseManifests).where(eq11(releaseManifests.version, r.version)).limit(1).all();
50624
50997
  if (existing.length > 0) continue;
50625
50998
  const id = `rel-${r.version.replace(/[^a-z0-9]/gi, "-")}`;
50626
50999
  await db.insert(releaseManifests).values({
@@ -56078,7 +56451,7 @@ async function queryTasks(cwd, since) {
56078
56451
  try {
56079
56452
  const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
56080
56453
  const { tasks: tasks2 } = await Promise.resolve().then(() => (init_tasks_schema(), tasks_schema_exports));
56081
- const { and: and8, gte: gte3 } = await import("drizzle-orm");
56454
+ const { and: and9, gte: gte3 } = await import("drizzle-orm");
56082
56455
  const db = await getDb3(cwd);
56083
56456
  const conditions = [];
56084
56457
  if (since) {
@@ -56092,7 +56465,7 @@ async function queryTasks(cwd, since) {
56092
56465
  sessionId: tasks2.sessionId,
56093
56466
  completedAt: tasks2.completedAt,
56094
56467
  createdAt: tasks2.createdAt
56095
- }).from(tasks2).where(conditions.length > 0 ? and8(...conditions) : void 0).all();
56468
+ }).from(tasks2).where(conditions.length > 0 ? and9(...conditions) : void 0).all();
56096
56469
  return rows;
56097
56470
  } catch (err) {
56098
56471
  log7.warn({ err }, "Failed to query tasks for workflow telemetry");
@@ -56103,7 +56476,7 @@ async function queryCompletionAuditRows(cwd, since) {
56103
56476
  try {
56104
56477
  const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
56105
56478
  const { auditLog: auditLog2 } = await Promise.resolve().then(() => (init_tasks_schema(), tasks_schema_exports));
56106
- const { and: and8, gte: gte3 } = await import("drizzle-orm");
56479
+ const { and: and9, gte: gte3 } = await import("drizzle-orm");
56107
56480
  const db = await getDb3(cwd);
56108
56481
  const conditions = [];
56109
56482
  if (since) conditions.push(gte3(auditLog2.timestamp, since));
@@ -56115,7 +56488,7 @@ async function queryCompletionAuditRows(cwd, since) {
56115
56488
  afterJson: auditLog2.afterJson,
56116
56489
  operation: auditLog2.operation,
56117
56490
  domain: auditLog2.domain
56118
- }).from(auditLog2).where(conditions.length > 0 ? and8(...conditions) : void 0).orderBy(auditLog2.timestamp).all();
56491
+ }).from(auditLog2).where(conditions.length > 0 ? and9(...conditions) : void 0).orderBy(auditLog2.timestamp).all();
56119
56492
  return allRows.filter((row) => {
56120
56493
  const isComplete = row.action === "task_completed" || row.action === "complete" || row.operation === "complete" && row.domain === "tasks";
56121
56494
  if (!isComplete && row.afterJson) {
@@ -64668,6 +65041,7 @@ export {
64668
65041
  isSuccessCode,
64669
65042
  isValidStatus,
64670
65043
  issue_exports as issue,
65044
+ lib_exports as lib,
64671
65045
  lifecycle_exports as lifecycle,
64672
65046
  lifecycleEvidenceTypeSchema,
64673
65047
  lifecycleGateResultSchema,