@cleocode/core 2026.3.76 → 2026.4.2

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 (473) hide show
  1. package/dist/agents/agent-schema.d.ts.map +1 -1
  2. package/dist/audit.d.ts +1 -1
  3. package/dist/audit.d.ts.map +1 -1
  4. package/dist/bootstrap.d.ts +2 -2
  5. package/dist/bootstrap.d.ts.map +1 -1
  6. package/dist/caamp/adapter.d.ts +6 -49
  7. package/dist/caamp/adapter.d.ts.map +1 -1
  8. package/dist/caamp/index.d.ts +2 -2
  9. package/dist/caamp/index.d.ts.map +1 -1
  10. package/dist/code/index.d.ts +10 -0
  11. package/dist/code/index.d.ts.map +1 -0
  12. package/dist/code/outline.d.ts +51 -0
  13. package/dist/code/outline.d.ts.map +1 -0
  14. package/dist/code/parser.d.ts +32 -0
  15. package/dist/code/parser.d.ts.map +1 -0
  16. package/dist/code/search.d.ts +42 -0
  17. package/dist/code/search.d.ts.map +1 -0
  18. package/dist/code/unfold.d.ts +44 -0
  19. package/dist/code/unfold.d.ts.map +1 -0
  20. package/dist/compliance/protocol-enforcement.d.ts +1 -1
  21. package/dist/compliance/protocol-rules.d.ts +1 -1
  22. package/dist/compliance/protocol-types.d.ts +2 -3
  23. package/dist/compliance/protocol-types.d.ts.map +1 -1
  24. package/dist/conduit/conduit-client.d.ts +14 -0
  25. package/dist/conduit/conduit-client.d.ts.map +1 -1
  26. package/dist/conduit/factory.d.ts +11 -1
  27. package/dist/conduit/factory.d.ts.map +1 -1
  28. package/dist/conduit/http-transport.d.ts +17 -5
  29. package/dist/conduit/http-transport.d.ts.map +1 -1
  30. package/dist/conduit/index.d.ts +5 -2
  31. package/dist/conduit/index.d.ts.map +1 -1
  32. package/dist/conduit/local-transport.d.ts +91 -0
  33. package/dist/conduit/local-transport.d.ts.map +1 -0
  34. package/dist/conduit/sse-transport.d.ts +68 -0
  35. package/dist/conduit/sse-transport.d.ts.map +1 -0
  36. package/dist/crypto/credentials.d.ts.map +1 -1
  37. package/dist/error-catalog.d.ts +3 -3
  38. package/dist/error-catalog.d.ts.map +1 -1
  39. package/dist/errors.d.ts +1 -1
  40. package/dist/hooks/handlers/index.d.ts +2 -2
  41. package/dist/hooks/handlers/index.d.ts.map +1 -1
  42. package/dist/hooks/handlers/notification-hooks.d.ts +31 -0
  43. package/dist/hooks/handlers/notification-hooks.d.ts.map +1 -0
  44. package/dist/index.d.ts +1 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +4646 -3476
  47. package/dist/index.js.map +4 -4
  48. package/dist/init.d.ts +6 -6
  49. package/dist/init.d.ts.map +1 -1
  50. package/dist/injection.d.ts.map +1 -1
  51. package/dist/internal.d.ts +7 -5
  52. package/dist/internal.d.ts.map +1 -1
  53. package/dist/lib/index.d.ts +1 -0
  54. package/dist/lib/index.d.ts.map +1 -1
  55. package/dist/lib/tree-sitter-languages.d.ts +29 -0
  56. package/dist/lib/tree-sitter-languages.d.ts.map +1 -0
  57. package/dist/logger.d.ts +3 -3
  58. package/dist/memory/brain-links.d.ts.map +1 -1
  59. package/dist/memory/brain-maintenance.d.ts +13 -0
  60. package/dist/memory/brain-maintenance.d.ts.map +1 -1
  61. package/dist/memory/brain-retrieval.d.ts +1 -1
  62. package/dist/memory/brain-retrieval.d.ts.map +1 -1
  63. package/dist/memory/decisions.d.ts.map +1 -1
  64. package/dist/memory/engine-compat.d.ts +392 -25
  65. package/dist/memory/engine-compat.d.ts.map +1 -1
  66. package/dist/memory/index.d.ts +416 -3
  67. package/dist/memory/index.d.ts.map +1 -1
  68. package/dist/metrics/token-service.d.ts +3 -3
  69. package/dist/metrics/token-service.d.ts.map +1 -1
  70. package/dist/orchestration/hierarchy.d.ts +32 -0
  71. package/dist/orchestration/hierarchy.d.ts.map +1 -0
  72. package/dist/orchestration/index.d.ts +1 -0
  73. package/dist/orchestration/index.d.ts.map +1 -1
  74. package/dist/paths.d.ts +335 -2
  75. package/dist/paths.d.ts.map +1 -1
  76. package/dist/routing/capability-matrix.d.ts +3 -3
  77. package/dist/routing/capability-matrix.d.ts.map +1 -1
  78. package/dist/scaffold.d.ts +422 -11
  79. package/dist/scaffold.d.ts.map +1 -1
  80. package/dist/security/input-sanitization.d.ts +2 -2
  81. package/dist/skills/dynamic-skill-generator.d.ts +3 -2
  82. package/dist/skills/dynamic-skill-generator.d.ts.map +1 -1
  83. package/dist/skills/routing-table.d.ts +4 -4
  84. package/dist/skills/routing-table.d.ts.map +1 -1
  85. package/dist/store/agent-registry-accessor.d.ts +10 -433
  86. package/dist/store/agent-registry-accessor.d.ts.map +1 -1
  87. package/dist/store/cross-db-cleanup.d.ts +34 -0
  88. package/dist/store/cross-db-cleanup.d.ts.map +1 -1
  89. package/dist/store/provider.d.ts +1 -1
  90. package/dist/store/signaldock-sqlite.d.ts.map +1 -1
  91. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  92. package/dist/store/sqlite.d.ts +1 -1
  93. package/dist/store/task-store.d.ts.map +1 -1
  94. package/dist/store/tasks-schema.d.ts +4 -228
  95. package/dist/store/tasks-schema.d.ts.map +1 -1
  96. package/dist/store/validation-schemas.d.ts +4 -5
  97. package/dist/store/validation-schemas.d.ts.map +1 -1
  98. package/dist/system/archive-analytics.d.ts +1 -1
  99. package/dist/system/health.d.ts +2 -2
  100. package/dist/system/health.d.ts.map +1 -1
  101. package/dist/system/runtime.d.ts +2 -1
  102. package/dist/system/runtime.d.ts.map +1 -1
  103. package/dist/tasks/list.d.ts +1 -1
  104. package/dist/tasks/list.d.ts.map +1 -1
  105. package/dist/tasks/task-ops.d.ts +415 -3
  106. package/dist/tasks/task-ops.d.ts.map +1 -1
  107. package/dist/templates/parser.d.ts +1 -1
  108. package/dist/ui/index.d.ts +1 -1
  109. package/dist/upgrade.d.ts +1 -1
  110. package/dist/upgrade.d.ts.map +1 -1
  111. package/dist/validation/operation-gate-validators.d.ts +1 -1
  112. package/dist/validation/operation-verification-gates.d.ts +3 -3
  113. package/dist/validation/param-utils.d.ts +6 -5
  114. package/dist/validation/param-utils.d.ts.map +1 -1
  115. package/dist/validation/validate-ops.d.ts +1 -1
  116. package/dist/validation/validate-ops.d.ts.map +1 -1
  117. package/package.json +19 -7
  118. package/src/__tests__/caamp-skill-install.test.js +0 -15
  119. package/src/__tests__/caamp-skill-install.test.js.map +1 -1
  120. package/src/__tests__/caamp-skill-install.test.ts +0 -16
  121. package/src/__tests__/injection-mvi-tiers.test.js +7 -7
  122. package/src/__tests__/injection-mvi-tiers.test.js.map +1 -1
  123. package/src/__tests__/injection-mvi-tiers.test.ts +55 -103
  124. package/src/agents/agent-schema.ts +2 -5
  125. package/src/audit.ts +2 -2
  126. package/src/bootstrap.ts +5 -39
  127. package/src/caamp/adapter.ts +3 -219
  128. package/src/caamp/index.ts +1 -13
  129. package/src/cant/__tests__/cant-agent-parse.test.d.ts.map +1 -0
  130. package/src/cant/__tests__/cant-agent-parse.test.js +77 -0
  131. package/src/cant/__tests__/cant-agent-parse.test.js.map +1 -0
  132. package/src/code/index.ts +10 -0
  133. package/src/code/outline.ts +214 -0
  134. package/src/code/parser.ts +331 -0
  135. package/src/code/search.ts +173 -0
  136. package/src/code/unfold.ts +204 -0
  137. package/src/codebase-map/analyzers/architecture.ts +2 -2
  138. package/src/compliance/protocol-enforcement.ts +1 -1
  139. package/src/compliance/protocol-rules.ts +1 -1
  140. package/src/compliance/protocol-types.ts +2 -3
  141. package/src/conduit/__tests__/dual-api-e2e.test.d.ts.map +1 -0
  142. package/src/conduit/__tests__/dual-api-e2e.test.js +178 -0
  143. package/src/conduit/__tests__/dual-api-e2e.test.js.map +1 -0
  144. package/src/conduit/__tests__/dual-api-e2e.test.ts +212 -0
  145. package/src/conduit/__tests__/local-credential-flow.test.d.ts.map +1 -0
  146. package/src/conduit/__tests__/local-credential-flow.test.js +185 -0
  147. package/src/conduit/__tests__/local-credential-flow.test.js.map +1 -0
  148. package/src/conduit/__tests__/local-credential-flow.test.ts +230 -0
  149. package/src/conduit/__tests__/local-transport.test.d.ts.map +1 -0
  150. package/src/conduit/__tests__/local-transport.test.js +404 -0
  151. package/src/conduit/__tests__/local-transport.test.js.map +1 -0
  152. package/src/conduit/__tests__/local-transport.test.ts +509 -0
  153. package/src/conduit/__tests__/sse-transport.test.d.ts.map +1 -0
  154. package/src/conduit/__tests__/sse-transport.test.js +291 -0
  155. package/src/conduit/__tests__/sse-transport.test.js.map +1 -0
  156. package/src/conduit/__tests__/sse-transport.test.ts +344 -0
  157. package/src/conduit/conduit-client.ts +14 -0
  158. package/src/conduit/factory.ts +29 -8
  159. package/src/conduit/http-transport.ts +78 -16
  160. package/src/conduit/index.ts +5 -2
  161. package/src/conduit/local-transport.ts +309 -0
  162. package/src/conduit/sse-transport.ts +382 -0
  163. package/src/crypto/credentials.ts +59 -13
  164. package/src/error-catalog.ts +3 -3
  165. package/src/errors.ts +1 -1
  166. package/src/hooks/__tests__/provider-hooks.test.js +4 -4
  167. package/src/hooks/__tests__/provider-hooks.test.js.map +1 -1
  168. package/src/hooks/__tests__/provider-hooks.test.ts +4 -4
  169. package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js +2 -2
  170. package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js.map +1 -1
  171. package/src/hooks/handlers/__tests__/hook-automation-e2e.test.ts +6 -4
  172. package/src/hooks/handlers/index.ts +2 -6
  173. package/src/hooks/handlers/notification-hooks.ts +65 -0
  174. package/src/index.ts +2 -1
  175. package/src/init.ts +14 -54
  176. package/src/injection.ts +4 -3
  177. package/src/internal.ts +7 -5
  178. package/src/lib/index.ts +8 -0
  179. package/src/lib/tree-sitter-languages.ts +88 -0
  180. package/src/logger.ts +5 -5
  181. package/src/memory/__tests__/brain-links.test.js +13 -0
  182. package/src/memory/__tests__/brain-links.test.js.map +1 -1
  183. package/src/memory/__tests__/brain-links.test.ts +14 -0
  184. package/src/memory/__tests__/brain-retrieval.test.js +9 -0
  185. package/src/memory/__tests__/brain-retrieval.test.js.map +1 -1
  186. package/src/memory/__tests__/brain-retrieval.test.ts +10 -0
  187. package/src/memory/__tests__/session-memory.test.js +16 -0
  188. package/src/memory/__tests__/session-memory.test.js.map +1 -1
  189. package/src/memory/__tests__/session-memory.test.ts +17 -0
  190. package/src/memory/brain-links.ts +17 -0
  191. package/src/memory/brain-maintenance.ts +33 -1
  192. package/src/memory/brain-retrieval.ts +19 -3
  193. package/src/memory/decisions.ts +18 -2
  194. package/src/memory/engine-compat.ts +392 -25
  195. package/src/memory/index.ts +417 -4
  196. package/src/metrics/token-service.ts +4 -4
  197. package/src/migration/index.ts +1 -1
  198. package/src/orchestration/hierarchy.ts +202 -0
  199. package/src/orchestration/index.ts +1 -0
  200. package/src/paths.ts +340 -5
  201. package/src/routing/capability-matrix.ts +49 -49
  202. package/src/scaffold.ts +428 -70
  203. package/src/security/input-sanitization.ts +4 -4
  204. package/src/sessions/__tests__/session-grade.integration.test.js +9 -9
  205. package/src/sessions/__tests__/session-grade.integration.test.ts +9 -9
  206. package/src/sessions/__tests__/session-grade.test.js +10 -10
  207. package/src/sessions/__tests__/session-grade.test.js.map +1 -1
  208. package/src/sessions/__tests__/session-grade.test.ts +10 -10
  209. package/src/sessions/session-grade.ts +4 -4
  210. package/src/skills/__tests__/dynamic-skill-generator.test.js +24 -26
  211. package/src/skills/__tests__/dynamic-skill-generator.test.js.map +1 -1
  212. package/src/skills/__tests__/dynamic-skill-generator.test.ts +24 -26
  213. package/src/skills/__tests__/routing-table.test.js +22 -22
  214. package/src/skills/__tests__/routing-table.test.js.map +1 -1
  215. package/src/skills/__tests__/routing-table.test.ts +23 -23
  216. package/src/skills/dynamic-skill-generator.ts +13 -24
  217. package/src/skills/routing-table.ts +4 -4
  218. package/src/store/__tests__/data-safety-central.test.js +8 -0
  219. package/src/store/__tests__/data-safety-central.test.js.map +1 -1
  220. package/src/store/__tests__/data-safety-central.test.ts +8 -0
  221. package/src/store/__tests__/safety-accessor.test.js +8 -0
  222. package/src/store/__tests__/safety-accessor.test.js.map +1 -1
  223. package/src/store/__tests__/safety-accessor.test.ts +8 -0
  224. package/src/store/agent-registry-accessor.ts +284 -108
  225. package/src/store/cross-db-cleanup.ts +175 -1
  226. package/src/store/provider.ts +2 -2
  227. package/src/store/signaldock-sqlite.ts +262 -60
  228. package/src/store/sqlite-data-accessor.ts +3 -0
  229. package/src/store/sqlite.ts +2 -2
  230. package/src/store/task-store.ts +8 -1
  231. package/src/store/tasks-schema.ts +5 -40
  232. package/src/system/__tests__/health.test.js +2 -2
  233. package/src/system/__tests__/health.test.js.map +1 -1
  234. package/src/system/__tests__/health.test.ts +2 -2
  235. package/src/system/archive-analytics.ts +1 -1
  236. package/src/system/health.ts +43 -19
  237. package/src/system/inject-generate.ts +20 -20
  238. package/src/system/runtime.ts +5 -4
  239. package/src/tasks/atomicity.ts +1 -1
  240. package/src/tasks/list.ts +1 -1
  241. package/src/tasks/task-ops.ts +415 -3
  242. package/src/templates/parser.ts +1 -1
  243. package/src/ui/index.ts +4 -4
  244. package/src/upgrade.ts +3 -14
  245. package/src/validation/operation-gate-validators.ts +1 -1
  246. package/src/validation/operation-verification-gates.ts +3 -3
  247. package/src/validation/param-utils.ts +11 -10
  248. package/src/validation/validate-ops.ts +6 -6
  249. package/templates/CLEO-INJECTION.md +38 -110
  250. package/dist/hooks/handlers/mcp-hooks.d.ts +0 -48
  251. package/dist/hooks/handlers/mcp-hooks.d.ts.map +0 -1
  252. package/dist/mcp/index.d.ts +0 -42
  253. package/dist/mcp/index.d.ts.map +0 -1
  254. package/src/__tests__/audit-prune.test.d.ts +0 -2
  255. package/src/__tests__/caamp-skill-install.test.d.ts +0 -14
  256. package/src/__tests__/cli-mcp-parity.integration.test.d.ts +0 -34
  257. package/src/__tests__/cli-mcp-parity.integration.test.d.ts.map +0 -1
  258. package/src/__tests__/cli-mcp-parity.integration.test.js +0 -898
  259. package/src/__tests__/cli-mcp-parity.integration.test.js.map +0 -1
  260. package/src/__tests__/cli-parity.test.d.ts +0 -9
  261. package/src/__tests__/config.test.d.ts +0 -7
  262. package/src/__tests__/core-parity.test.d.ts +0 -17
  263. package/src/__tests__/error-catalog.test.d.ts +0 -2
  264. package/src/__tests__/golden-parity.test.d.ts +0 -12
  265. package/src/__tests__/hooks.test.d.ts +0 -5
  266. package/src/__tests__/human-output.test.d.ts +0 -12
  267. package/src/__tests__/index-api-compat.test.d.ts +0 -2
  268. package/src/__tests__/init-e2e.test.d.ts +0 -12
  269. package/src/__tests__/injection-chain.test.d.ts +0 -18
  270. package/src/__tests__/injection-mvi-tiers.test.d.ts +0 -14
  271. package/src/__tests__/injection-shared.test.d.ts +0 -10
  272. package/src/__tests__/lafs-conformance.test.d.ts +0 -18
  273. package/src/__tests__/logger.test.d.ts +0 -2
  274. package/src/__tests__/mcp-install-verify.test.d.ts +0 -13
  275. package/src/__tests__/mcp-install-verify.test.d.ts.map +0 -1
  276. package/src/__tests__/mcp-install-verify.test.js +0 -177
  277. package/src/__tests__/mcp-install-verify.test.js.map +0 -1
  278. package/src/__tests__/mcp-install-verify.test.ts +0 -217
  279. package/src/__tests__/paths.test.d.ts +0 -7
  280. package/src/__tests__/project-info.test.d.ts +0 -2
  281. package/src/__tests__/rcsd-pipeline-e2e.test.d.ts +0 -14
  282. package/src/__tests__/remote.test.d.ts +0 -6
  283. package/src/__tests__/scaffold.test.d.ts +0 -6
  284. package/src/__tests__/schema-management.test.d.ts +0 -5
  285. package/src/__tests__/schema.test.d.ts +0 -2
  286. package/src/__tests__/sharing.test.d.ts +0 -6
  287. package/src/__tests__/snapshot.test.d.ts +0 -6
  288. package/src/__tests__/upgrade.test.d.ts +0 -7
  289. package/src/adapters/__tests__/discovery.test.d.ts +0 -6
  290. package/src/adapters/__tests__/manager.test.d.ts +0 -6
  291. package/src/agents/__tests__/agent-registry.test.d.ts +0 -12
  292. package/src/agents/__tests__/capacity.test.d.ts +0 -7
  293. package/src/agents/__tests__/execution-learning.test.d.ts +0 -14
  294. package/src/agents/__tests__/health-monitor.test.d.ts +0 -10
  295. package/src/agents/__tests__/registry.test.d.ts +0 -8
  296. package/src/agents/__tests__/retry.test.d.ts +0 -7
  297. package/src/compliance/__tests__/sync.test.d.ts +0 -5
  298. package/src/hooks/__tests__/provider-hooks.test.d.ts +0 -2
  299. package/src/hooks/__tests__/registry.test.d.ts +0 -2
  300. package/src/hooks/handlers/__tests__/error-hooks.test.d.ts +0 -2
  301. package/src/hooks/handlers/__tests__/file-hooks.test.d.ts +0 -2
  302. package/src/hooks/handlers/__tests__/hook-automation-e2e.test.d.ts +0 -13
  303. package/src/hooks/handlers/__tests__/mcp-hooks.test.d.ts +0 -2
  304. package/src/hooks/handlers/__tests__/mcp-hooks.test.d.ts.map +0 -1
  305. package/src/hooks/handlers/__tests__/mcp-hooks.test.js +0 -119
  306. package/src/hooks/handlers/__tests__/mcp-hooks.test.js.map +0 -1
  307. package/src/hooks/handlers/__tests__/mcp-hooks.test.ts +0 -150
  308. package/src/hooks/handlers/__tests__/session-hooks.test.d.ts +0 -2
  309. package/src/hooks/handlers/__tests__/task-hooks.test.d.ts +0 -2
  310. package/src/hooks/handlers/mcp-hooks.ts +0 -162
  311. package/src/intelligence/__tests__/adaptive-validation.test.d.ts +0 -11
  312. package/src/intelligence/__tests__/impact.test.d.ts +0 -16
  313. package/src/intelligence/__tests__/patterns.test.d.ts +0 -8
  314. package/src/intelligence/__tests__/prediction.test.d.ts +0 -8
  315. package/src/lib/__tests__/retry.test.d.ts +0 -7
  316. package/src/lifecycle/__tests__/chain-store.test.d.ts +0 -10
  317. package/src/lifecycle/__tests__/consolidate-rcasd.test.d.ts +0 -7
  318. package/src/lifecycle/__tests__/default-chain.test.d.ts +0 -7
  319. package/src/lifecycle/__tests__/frontmatter.test.d.ts +0 -7
  320. package/src/lifecycle/__tests__/lifecycle.test.d.ts +0 -7
  321. package/src/lifecycle/__tests__/pipeline.integration.test.d.ts +0 -19
  322. package/src/lifecycle/__tests__/rcasd-paths.test.d.ts +0 -7
  323. package/src/lifecycle/__tests__/resume-schema-contract.test.d.ts +0 -16
  324. package/src/lifecycle/__tests__/stage-record-provenance.integration.test.d.ts +0 -7
  325. package/src/lifecycle/__tests__/tessera-engine.test.d.ts +0 -10
  326. package/src/mcp/index.ts +0 -163
  327. package/src/memory/__tests__/auto-extract.test.d.ts +0 -7
  328. package/src/memory/__tests__/brain-automation.test.d.ts +0 -11
  329. package/src/memory/__tests__/brain-embedding.test.d.ts +0 -2
  330. package/src/memory/__tests__/brain-links.test.d.ts +0 -8
  331. package/src/memory/__tests__/brain-migration.test.d.ts +0 -8
  332. package/src/memory/__tests__/brain-retrieval.test.d.ts +0 -10
  333. package/src/memory/__tests__/brain-search.test.d.ts +0 -8
  334. package/src/memory/__tests__/claude-mem-migration.test.d.ts +0 -12
  335. package/src/memory/__tests__/decisions.test.d.ts +0 -8
  336. package/src/memory/__tests__/engine-compat.test.d.ts +0 -12
  337. package/src/memory/__tests__/memory-bridge.test.d.ts +0 -10
  338. package/src/memory/__tests__/pipeline-manifest-sqlite.test.d.ts +0 -13
  339. package/src/memory/__tests__/session-memory.test.d.ts +0 -9
  340. package/src/metrics/__tests__/model-provider-registry.test.d.ts +0 -2
  341. package/src/metrics/__tests__/provider-detection.test.d.ts +0 -2
  342. package/src/migration/__tests__/checksum.test.d.ts +0 -8
  343. package/src/migration/__tests__/logger.test.d.ts +0 -5
  344. package/src/migration/__tests__/migration-failure.integration.test.d.ts +0 -15
  345. package/src/migration/__tests__/migration.test.d.ts +0 -13
  346. package/src/migration/__tests__/state.test.d.ts +0 -8
  347. package/src/migration/__tests__/validate.test.d.ts +0 -8
  348. package/src/nexus/__tests__/deps.test.d.ts +0 -7
  349. package/src/nexus/__tests__/nexus-e2e.test.d.ts +0 -12
  350. package/src/nexus/__tests__/permissions.test.d.ts +0 -7
  351. package/src/nexus/__tests__/query.test.d.ts +0 -7
  352. package/src/nexus/__tests__/reconcile.test.d.ts +0 -7
  353. package/src/nexus/__tests__/registry.test.d.ts +0 -7
  354. package/src/nexus/__tests__/transfer.test.d.ts +0 -8
  355. package/src/observability/__tests__/index.test.d.ts +0 -7
  356. package/src/observability/__tests__/log-filter.test.d.ts +0 -7
  357. package/src/observability/__tests__/log-parser.test.d.ts +0 -7
  358. package/src/observability/__tests__/log-reader.test.d.ts +0 -7
  359. package/src/orchestration/__tests__/autonomous-spec.test.d.ts +0 -9
  360. package/src/orchestration/__tests__/orchestration.test.d.ts +0 -7
  361. package/src/orchestration/__tests__/protocol-validators.test.d.ts +0 -9
  362. package/src/phases/__tests__/deps.test.d.ts +0 -7
  363. package/src/phases/__tests__/phases.test.d.ts +0 -7
  364. package/src/release/__tests__/artifacts.test.d.ts +0 -7
  365. package/src/release/__tests__/cancel-release.test.d.ts +0 -10
  366. package/src/release/__tests__/changelog-writer.test.d.ts +0 -6
  367. package/src/release/__tests__/push-policy.test.d.ts +0 -14
  368. package/src/release/__tests__/release.test.d.ts +0 -11
  369. package/src/sequence/__tests__/allocate.test.d.ts +0 -6
  370. package/src/sessions/__tests__/briefing-blocked.test.d.ts +0 -6
  371. package/src/sessions/__tests__/briefing.test.d.ts +0 -11
  372. package/src/sessions/__tests__/handoff-integration.test.d.ts +0 -8
  373. package/src/sessions/__tests__/handoff.test.d.ts +0 -11
  374. package/src/sessions/__tests__/index.test.d.ts +0 -2
  375. package/src/sessions/__tests__/session-cleanup.test.d.ts +0 -7
  376. package/src/sessions/__tests__/session-edge-cases.test.d.ts +0 -9
  377. package/src/sessions/__tests__/session-find.test.d.ts +0 -9
  378. package/src/sessions/__tests__/session-grade.integration.test.d.ts +0 -11
  379. package/src/sessions/__tests__/session-grade.test.d.ts +0 -6
  380. package/src/sessions/__tests__/session-memory-bridge.test.d.ts +0 -2
  381. package/src/sessions/__tests__/sessions.test.d.ts +0 -7
  382. package/src/skills/__tests__/discovery.test.d.ts +0 -6
  383. package/src/skills/__tests__/dispatch.test.d.ts +0 -6
  384. package/src/skills/__tests__/dynamic-skill-generator.test.d.ts +0 -2
  385. package/src/skills/__tests__/manifests.test.d.ts +0 -6
  386. package/src/skills/__tests__/precedence.test.d.ts +0 -6
  387. package/src/skills/__tests__/routing-table.test.d.ts +0 -2
  388. package/src/skills/__tests__/skill-paths.test.d.ts +0 -7
  389. package/src/skills/__tests__/test-utility.test.d.ts +0 -7
  390. package/src/skills/__tests__/token.test.d.ts +0 -6
  391. package/src/skills/__tests__/validation.test.d.ts +0 -6
  392. package/src/skills/__tests__/version.test.d.ts +0 -5
  393. package/src/skills/injection/__tests__/subagent.test.d.ts +0 -2
  394. package/src/skills/orchestrator/__tests__/spawn-tier.test.d.ts +0 -2
  395. package/src/spawn/__tests__/adapter-registry.test.d.ts +0 -2
  396. package/src/stats/__tests__/stats.test.d.ts +0 -7
  397. package/src/sticky/__tests__/purge.test.d.ts +0 -9
  398. package/src/store/__tests__/atomic.test.d.ts +0 -7
  399. package/src/store/__tests__/backup.test.d.ts +0 -7
  400. package/src/store/__tests__/brain-accessor-pageindex.test.d.ts +0 -12
  401. package/src/store/__tests__/brain-accessor.test.d.ts +0 -10
  402. package/src/store/__tests__/brain-pageindex.test.d.ts +0 -11
  403. package/src/store/__tests__/brain-schema.test.d.ts +0 -11
  404. package/src/store/__tests__/brain-vec.test.d.ts +0 -11
  405. package/src/store/__tests__/collision-detection.test.d.ts +0 -11
  406. package/src/store/__tests__/data-safety-central.test.d.ts +0 -20
  407. package/src/store/__tests__/db-helpers.test.d.ts +0 -7
  408. package/src/store/__tests__/e2e-safety-integration.test.d.ts +0 -13
  409. package/src/store/__tests__/git-checkpoint.test.d.ts +0 -7
  410. package/src/store/__tests__/idempotent-migration.test.d.ts +0 -5
  411. package/src/store/__tests__/import-logging.test.d.ts +0 -7
  412. package/src/store/__tests__/import-sort.test.d.ts +0 -7
  413. package/src/store/__tests__/json.test.d.ts +0 -7
  414. package/src/store/__tests__/lifecycle-schema-parity.test.d.ts +0 -2
  415. package/src/store/__tests__/migration-integration.test.d.ts +0 -15
  416. package/src/store/__tests__/migration-retry.test.d.ts +0 -10
  417. package/src/store/__tests__/migration-safety.test.d.ts +0 -21
  418. package/src/store/__tests__/migration-sqlite.test.d.ts +0 -11
  419. package/src/store/__tests__/performance-safety.test.d.ts +0 -17
  420. package/src/store/__tests__/project-detect.test.d.ts +0 -6
  421. package/src/store/__tests__/project-registry.test.d.ts +0 -7
  422. package/src/store/__tests__/provider.test.d.ts +0 -9
  423. package/src/store/__tests__/relations.test.d.ts +0 -9
  424. package/src/store/__tests__/safety-accessor.test.d.ts +0 -18
  425. package/src/store/__tests__/sequence-validation.test.d.ts +0 -11
  426. package/src/store/__tests__/session-store.test.d.ts +0 -11
  427. package/src/store/__tests__/sqlite-backup.test.d.ts +0 -14
  428. package/src/store/__tests__/sqlite.test.d.ts +0 -11
  429. package/src/store/__tests__/task-store.test.d.ts +0 -11
  430. package/src/store/__tests__/test-db-helper.d.ts +0 -61
  431. package/src/store/__tests__/write-verification.test.d.ts +0 -11
  432. package/src/system/__tests__/cleanup.test.d.ts +0 -2
  433. package/src/system/__tests__/health.test.d.ts +0 -2
  434. package/src/task-work/__tests__/start-deps.test.d.ts +0 -6
  435. package/src/tasks/__tests__/add.test.d.ts +0 -7
  436. package/src/tasks/__tests__/archive.test.d.ts +0 -7
  437. package/src/tasks/__tests__/assignee.test.d.ts +0 -14
  438. package/src/tasks/__tests__/atomicity.test.d.ts +0 -6
  439. package/src/tasks/__tests__/cancel-ops.test.d.ts +0 -7
  440. package/src/tasks/__tests__/complete-unblocks.test.d.ts +0 -6
  441. package/src/tasks/__tests__/complete.test.d.ts +0 -7
  442. package/src/tasks/__tests__/delete.test.d.ts +0 -7
  443. package/src/tasks/__tests__/dependency-check.test.d.ts +0 -7
  444. package/src/tasks/__tests__/deps-ready.test.d.ts +0 -6
  445. package/src/tasks/__tests__/epic-enforcement.test.d.ts +0 -15
  446. package/src/tasks/__tests__/find.test.d.ts +0 -7
  447. package/src/tasks/__tests__/graph-ops.test.d.ts +0 -7
  448. package/src/tasks/__tests__/hierarchy-policy.test.d.ts +0 -6
  449. package/src/tasks/__tests__/hierarchy.test.d.ts +0 -7
  450. package/src/tasks/__tests__/id-generator.test.d.ts +0 -2
  451. package/src/tasks/__tests__/labels.test.d.ts +0 -7
  452. package/src/tasks/__tests__/list.test.d.ts +0 -7
  453. package/src/tasks/__tests__/minimal-test.test.d.ts +0 -2
  454. package/src/tasks/__tests__/phase-tracking.test.d.ts +0 -7
  455. package/src/tasks/__tests__/pipeline-stage.test.d.ts +0 -14
  456. package/src/tasks/__tests__/plan-priority.test.d.ts +0 -10
  457. package/src/tasks/__tests__/priority-normalization.test.d.ts +0 -7
  458. package/src/tasks/__tests__/relates.test.d.ts +0 -9
  459. package/src/tasks/__tests__/show-deps.test.d.ts +0 -6
  460. package/src/tasks/__tests__/show.test.d.ts +0 -7
  461. package/src/tasks/__tests__/staleness.test.d.ts +0 -7
  462. package/src/tasks/__tests__/task-ops-depends.test.d.ts +0 -6
  463. package/src/tasks/__tests__/update.test.d.ts +0 -7
  464. package/src/validation/__tests__/chain-validation.test.d.ts +0 -7
  465. package/src/validation/__tests__/compliance.test.d.ts +0 -7
  466. package/src/validation/__tests__/docs-sync.test.d.ts +0 -7
  467. package/src/validation/__tests__/doctor-gitignore.test.d.ts +0 -7
  468. package/src/validation/__tests__/doctor-injection.test.d.ts +0 -11
  469. package/src/validation/__tests__/doctor.test.d.ts +0 -7
  470. package/src/validation/__tests__/engine.test.d.ts +0 -7
  471. package/src/validation/__tests__/manifest.test.d.ts +0 -7
  472. package/src/validation/__tests__/protocol-common.test.d.ts +0 -7
  473. package/src/validation/__tests__/verification.test.d.ts +0 -7
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Dual-API E2E test — verify messaging across both SignalDock endpoints.
3
+ *
4
+ * Tests that agents can exchange messages on:
5
+ * 1. api.signaldock.io (canonical)
6
+ * 2. api.clawmsgr.com (legacy)
7
+ * 3. Local signaldock.db (offline)
8
+ *
9
+ * These tests hit real APIs and require valid credentials.
10
+ * Set SKIP_E2E=1 to skip when running in CI without network.
11
+ *
12
+ * @task T226
13
+ */
14
+
15
+ import { existsSync, readFileSync } from 'node:fs';
16
+ import { join } from 'node:path';
17
+ import { describe, expect, it } from 'vitest';
18
+ import { HttpTransport } from '../http-transport.js';
19
+
20
+ // ============================================================================
21
+ // Config helpers
22
+ // ============================================================================
23
+
24
+ const CLEO_DIR = join(process.cwd(), '.cleo');
25
+ const SKIP_E2E = process.env['SKIP_E2E'] === '1';
26
+
27
+ /** Load a ClawMsgr/SignalDock config file. */
28
+ function loadConfig(
29
+ filename: string,
30
+ ): { agentId: string; apiKey: string; apiBaseUrl: string } | null {
31
+ const path = join(CLEO_DIR, filename);
32
+ if (!existsSync(path)) return null;
33
+ try {
34
+ return JSON.parse(readFileSync(path, 'utf-8')) as {
35
+ agentId: string;
36
+ apiKey: string;
37
+ apiBaseUrl: string;
38
+ };
39
+ } catch {
40
+ return null;
41
+ }
42
+ }
43
+
44
+ /** Send a test message and verify it arrives. */
45
+ async function testMessageExchange(
46
+ apiBaseUrl: string,
47
+ senderConfig: { agentId: string; apiKey: string },
48
+ receiverAgentId: string,
49
+ ): Promise<{ sent: boolean; messageId: string | null; error: string | null }> {
50
+ const transport = new HttpTransport();
51
+ try {
52
+ await transport.connect({
53
+ agentId: senderConfig.agentId,
54
+ apiKey: senderConfig.apiKey,
55
+ apiBaseUrl,
56
+ });
57
+
58
+ const testContent = `/info @${receiverAgentId} #e2e-test T226 verification at ${new Date().toISOString()}`;
59
+ const result = await transport.push(receiverAgentId, testContent);
60
+
61
+ await transport.disconnect();
62
+ return { sent: true, messageId: result.messageId, error: null };
63
+ } catch (err) {
64
+ await transport.disconnect();
65
+ return { sent: false, messageId: null, error: String(err) };
66
+ }
67
+ }
68
+
69
+ // ============================================================================
70
+ // Test suite
71
+ // ============================================================================
72
+
73
+ describe('Dual-API E2E', () => {
74
+ // --------------------------------------------------------------------------
75
+ // Config verification
76
+ // --------------------------------------------------------------------------
77
+
78
+ describe('config files exist', () => {
79
+ it('has clawmsgr configs (legacy)', () => {
80
+ const config = loadConfig('clawmsgr-cleo-rust-lead.json');
81
+ if (!config) {
82
+ console.log('SKIP: clawmsgr config not found');
83
+ return;
84
+ }
85
+ expect(config.agentId).toBe('cleo-rust-lead');
86
+ expect(config.apiBaseUrl).toContain('clawmsgr.com');
87
+ });
88
+
89
+ it('has signaldock configs (canonical)', () => {
90
+ const config = loadConfig('signaldock-cleo-rust-lead.json');
91
+ if (!config) {
92
+ console.log('SKIP: signaldock config not found');
93
+ return;
94
+ }
95
+ expect(config.agentId).toBe('cleo-rust-lead');
96
+ expect(config.apiBaseUrl).toContain('signaldock.io');
97
+ });
98
+ });
99
+
100
+ // --------------------------------------------------------------------------
101
+ // API health checks
102
+ // --------------------------------------------------------------------------
103
+
104
+ describe('API health', () => {
105
+ it('api.signaldock.io is healthy', async () => {
106
+ if (SKIP_E2E) return;
107
+ const response = await fetch('https://api.signaldock.io/health', {
108
+ signal: AbortSignal.timeout(10_000),
109
+ });
110
+ expect(response.ok).toBe(true);
111
+ const data = (await response.json()) as { data?: { status?: string } };
112
+ expect(data.data?.status).toBe('ok');
113
+ });
114
+
115
+ it('api.clawmsgr.com is healthy', async () => {
116
+ if (SKIP_E2E) return;
117
+ const response = await fetch('https://api.clawmsgr.com/health', {
118
+ signal: AbortSignal.timeout(10_000),
119
+ });
120
+ expect(response.ok).toBe(true);
121
+ const data = (await response.json()) as { data?: { status?: string } };
122
+ expect(data.data?.status).toBe('ok');
123
+ });
124
+ });
125
+
126
+ // --------------------------------------------------------------------------
127
+ // Message exchange on api.signaldock.io
128
+ // --------------------------------------------------------------------------
129
+
130
+ describe('api.signaldock.io messaging', () => {
131
+ it('can send a message via signaldock.io', async () => {
132
+ if (SKIP_E2E) return;
133
+ const config = loadConfig('signaldock-cleo-rust-lead.json');
134
+ if (!config) {
135
+ console.log('SKIP: no signaldock config');
136
+ return;
137
+ }
138
+ const result = await testMessageExchange(
139
+ 'https://api.signaldock.io',
140
+ { agentId: config.agentId, apiKey: config.apiKey },
141
+ 'cleo-dev',
142
+ );
143
+ expect(result.sent).toBe(true);
144
+ expect(result.messageId).toBeDefined();
145
+ });
146
+ });
147
+
148
+ // --------------------------------------------------------------------------
149
+ // Message exchange on api.clawmsgr.com
150
+ // --------------------------------------------------------------------------
151
+
152
+ describe('api.clawmsgr.com messaging', () => {
153
+ it('can send a message via clawmsgr.com', async () => {
154
+ if (SKIP_E2E) return;
155
+ const config = loadConfig('clawmsgr-cleo-rust-lead.json');
156
+ if (!config) {
157
+ console.log('SKIP: no clawmsgr config');
158
+ return;
159
+ }
160
+ const result = await testMessageExchange(
161
+ 'https://api.clawmsgr.com',
162
+ { agentId: config.agentId, apiKey: config.apiKey },
163
+ 'cleo-dev',
164
+ );
165
+ expect(result.sent).toBe(true);
166
+ expect(result.messageId).toBeDefined();
167
+ });
168
+ });
169
+
170
+ // --------------------------------------------------------------------------
171
+ // Cross-API metadata consistency
172
+ // --------------------------------------------------------------------------
173
+
174
+ describe('cross-API consistency', () => {
175
+ it('agent profile exists on both APIs', async () => {
176
+ if (SKIP_E2E) return;
177
+ const clawConfig = loadConfig('clawmsgr-cleo-rust-lead.json');
178
+ const sdConfig = loadConfig('signaldock-cleo-rust-lead.json');
179
+ if (!clawConfig || !sdConfig) {
180
+ console.log('SKIP: missing configs');
181
+ return;
182
+ }
183
+
184
+ // Check agent exists on clawmsgr
185
+ const clawResp = await fetch('https://api.clawmsgr.com/agents/cleo-rust-lead', {
186
+ headers: {
187
+ Authorization: `Bearer ${clawConfig.apiKey}`,
188
+ 'X-Agent-Id': 'cleo-rust-lead',
189
+ },
190
+ signal: AbortSignal.timeout(10_000),
191
+ });
192
+
193
+ // Check agent exists on signaldock
194
+ const sdResp = await fetch('https://api.signaldock.io/agents/cleo-rust-lead', {
195
+ headers: {
196
+ Authorization: `Bearer ${sdConfig.apiKey}`,
197
+ 'X-Agent-Id': 'cleo-rust-lead',
198
+ },
199
+ signal: AbortSignal.timeout(10_000),
200
+ });
201
+
202
+ expect(clawResp.ok).toBe(true);
203
+ expect(sdResp.ok).toBe(true);
204
+
205
+ const clawData = (await clawResp.json()) as { data?: { agent?: { agentId?: string } } };
206
+ const sdData = (await sdResp.json()) as { data?: { agent?: { agentId?: string } } };
207
+
208
+ expect(clawData.data?.agent?.agentId).toBe('cleo-rust-lead');
209
+ expect(sdData.data?.agent?.agentId).toBe('cleo-rust-lead');
210
+ });
211
+ });
212
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-credential-flow.test.d.ts","sourceRoot":"","sources":["local-credential-flow.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Local credential flow — end-to-end validation.
3
+ *
4
+ * Tests the full lifecycle: signaldock.db creation → agent register →
5
+ * credential encryption/decryption → LocalTransport connect →
6
+ * push/poll/ack messaging.
7
+ *
8
+ * @task T227
9
+ */
10
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
11
+ import { tmpdir } from 'node:os';
12
+ import { join } from 'node:path';
13
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
14
+ import { ensureSignaldockDb, getSignaldockDbPath } from '../../store/signaldock-sqlite.js';
15
+ import { LocalTransport } from '../local-transport.js';
16
+ // ============================================================================
17
+ // Test helpers
18
+ // ============================================================================
19
+ let testDir;
20
+ let originalCwd;
21
+ async function setupTestEnvironment() {
22
+ const dir = join(tmpdir(), `credential-flow-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
23
+ mkdirSync(join(dir, '.cleo'), { recursive: true });
24
+ // Create a minimal .cleo/project-context.json so paths resolve
25
+ writeFileSync(join(dir, '.cleo', 'project-context.json'), JSON.stringify({ schemaVersion: '1.0.0', projectTypes: ['node'], primaryType: 'node' }));
26
+ return dir;
27
+ }
28
+ // ============================================================================
29
+ // Test suite
30
+ // ============================================================================
31
+ describe('Local Credential Flow E2E', () => {
32
+ beforeEach(async () => {
33
+ originalCwd = process.cwd();
34
+ testDir = await setupTestEnvironment();
35
+ process.chdir(testDir);
36
+ });
37
+ afterEach(() => {
38
+ process.chdir(originalCwd);
39
+ if (testDir && existsSync(testDir)) {
40
+ rmSync(testDir, { recursive: true, force: true });
41
+ }
42
+ });
43
+ // --------------------------------------------------------------------------
44
+ // Step 1: cleo init creates signaldock.db
45
+ // --------------------------------------------------------------------------
46
+ describe('Step 1: signaldock.db creation', () => {
47
+ it('ensureSignaldockDb creates the database file', async () => {
48
+ const result = await ensureSignaldockDb(testDir);
49
+ expect(result.action).toBe('created');
50
+ expect(existsSync(result.path)).toBe(true);
51
+ });
52
+ it('ensureSignaldockDb is idempotent', async () => {
53
+ const first = await ensureSignaldockDb(testDir);
54
+ const second = await ensureSignaldockDb(testDir);
55
+ expect(first.action).toBe('created');
56
+ expect(second.action).toBe('exists');
57
+ expect(first.path).toBe(second.path);
58
+ });
59
+ it('signaldock.db has the messages table', async () => {
60
+ await ensureSignaldockDb(testDir);
61
+ const dbPath = getSignaldockDbPath(testDir);
62
+ expect(existsSync(dbPath)).toBe(true);
63
+ // Verify by connecting LocalTransport (which checks for messages table)
64
+ const transport = new LocalTransport();
65
+ await transport.connect({
66
+ agentId: 'test',
67
+ apiKey: 'sk_test',
68
+ apiBaseUrl: 'http://localhost',
69
+ });
70
+ await transport.disconnect();
71
+ });
72
+ });
73
+ // --------------------------------------------------------------------------
74
+ // Step 2: LocalTransport availability
75
+ // --------------------------------------------------------------------------
76
+ describe('Step 2: LocalTransport availability', () => {
77
+ it('isAvailable returns false before init', () => {
78
+ const emptyDir = join(tmpdir(), `no-init-${Date.now()}`);
79
+ mkdirSync(join(emptyDir, '.cleo'), { recursive: true });
80
+ expect(LocalTransport.isAvailable(emptyDir)).toBe(false);
81
+ rmSync(emptyDir, { recursive: true, force: true });
82
+ });
83
+ it('isAvailable returns true after init', async () => {
84
+ await ensureSignaldockDb(testDir);
85
+ expect(LocalTransport.isAvailable(testDir)).toBe(true);
86
+ });
87
+ });
88
+ // --------------------------------------------------------------------------
89
+ // Step 3: Full messaging lifecycle
90
+ // --------------------------------------------------------------------------
91
+ describe('Step 3: messaging lifecycle', () => {
92
+ it('complete flow: init → connect → push → poll → ack', async () => {
93
+ // 1. Init signaldock.db
94
+ await ensureSignaldockDb(testDir);
95
+ // 2. Connect two agents
96
+ const agent1 = new LocalTransport();
97
+ const agent2 = new LocalTransport();
98
+ await agent1.connect({
99
+ agentId: 'cleo-rust-lead',
100
+ apiKey: 'sk_live_fake1',
101
+ apiBaseUrl: 'http://localhost',
102
+ });
103
+ await agent2.connect({
104
+ agentId: 'cleo-dev',
105
+ apiKey: 'sk_live_fake2',
106
+ apiBaseUrl: 'http://localhost',
107
+ });
108
+ // 3. Agent 1 sends a message to Agent 2
109
+ const sendResult = await agent1.push('cleo-dev', '/action @cleo-dev #test Hello from rust-lead');
110
+ expect(sendResult.messageId).toBeDefined();
111
+ // 4. Agent 2 polls and receives the message
112
+ const messages = await agent2.poll();
113
+ expect(messages).toHaveLength(1);
114
+ expect(messages[0].from).toBe('cleo-rust-lead');
115
+ expect(messages[0].content).toContain('Hello from rust-lead');
116
+ // 5. Agent 2 acknowledges the message
117
+ await agent2.ack([messages[0].id]);
118
+ // 6. Subsequent poll returns empty (message was acked)
119
+ const afterAck = await agent2.poll();
120
+ expect(afterAck).toHaveLength(0);
121
+ // 7. Agent 2 replies
122
+ const replyResult = await agent2.push('cleo-rust-lead', '/ack Received.');
123
+ expect(replyResult.messageId).toBeDefined();
124
+ // 8. Agent 1 receives the reply
125
+ const replies = await agent1.poll();
126
+ expect(replies).toHaveLength(1);
127
+ expect(replies[0].from).toBe('cleo-dev');
128
+ expect(replies[0].content).toBe('/ack Received.');
129
+ // Cleanup
130
+ await agent1.disconnect();
131
+ await agent2.disconnect();
132
+ });
133
+ it('messages persist across transport reconnections', async () => {
134
+ await ensureSignaldockDb(testDir);
135
+ // Send a message
136
+ const sender = new LocalTransport();
137
+ await sender.connect({
138
+ agentId: 'sender',
139
+ apiKey: 'sk_test',
140
+ apiBaseUrl: 'http://localhost',
141
+ });
142
+ await sender.push('receiver', 'persistent message');
143
+ await sender.disconnect();
144
+ // New transport instance reads the same DB
145
+ const receiver = new LocalTransport();
146
+ await receiver.connect({
147
+ agentId: 'receiver',
148
+ apiKey: 'sk_test',
149
+ apiBaseUrl: 'http://localhost',
150
+ });
151
+ const messages = await receiver.poll();
152
+ expect(messages).toHaveLength(1);
153
+ expect(messages[0].content).toBe('persistent message');
154
+ await receiver.disconnect();
155
+ });
156
+ it('multiple agents can communicate in the same conversation', async () => {
157
+ await ensureSignaldockDb(testDir);
158
+ const prime = new LocalTransport();
159
+ const rustLead = new LocalTransport();
160
+ const dbLead = new LocalTransport();
161
+ await prime.connect({ agentId: 'prime', apiKey: 'sk1', apiBaseUrl: 'http://localhost' });
162
+ await rustLead.connect({
163
+ agentId: 'rust-lead',
164
+ apiKey: 'sk2',
165
+ apiBaseUrl: 'http://localhost',
166
+ });
167
+ await dbLead.connect({ agentId: 'db-lead', apiKey: 'sk3', apiBaseUrl: 'http://localhost' });
168
+ // Prime sends to rust-lead
169
+ await prime.push('rust-lead', 'Fix cant-lsp');
170
+ // Prime sends to db-lead
171
+ await prime.push('db-lead', 'Review schemas');
172
+ // Each agent only sees their own messages
173
+ const rustMessages = await rustLead.poll();
174
+ const dbMessages = await dbLead.poll();
175
+ expect(rustMessages).toHaveLength(1);
176
+ expect(rustMessages[0].content).toBe('Fix cant-lsp');
177
+ expect(dbMessages).toHaveLength(1);
178
+ expect(dbMessages[0].content).toBe('Review schemas');
179
+ await prime.disconnect();
180
+ await rustLead.disconnect();
181
+ await dbLead.disconnect();
182
+ });
183
+ });
184
+ });
185
+ //# sourceMappingURL=local-credential-flow.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-credential-flow.test.js","sourceRoot":"","sources":["local-credential-flow.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Local credential flow — end-to-end validation.
3
+ *
4
+ * Tests the full lifecycle: signaldock.db creation → agent register →
5
+ * credential encryption/decryption → LocalTransport connect →
6
+ * push/poll/ack messaging.
7
+ *
8
+ * @task T227
9
+ */
10
+
11
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
12
+ import { tmpdir } from 'node:os';
13
+ import { join } from 'node:path';
14
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
15
+ import { ensureSignaldockDb, getSignaldockDbPath } from '../../store/signaldock-sqlite.js';
16
+ import { LocalTransport } from '../local-transport.js';
17
+
18
+ // ============================================================================
19
+ // Test helpers
20
+ // ============================================================================
21
+
22
+ let testDir: string;
23
+ let originalCwd: string;
24
+
25
+ async function setupTestEnvironment(): Promise<string> {
26
+ const dir = join(
27
+ tmpdir(),
28
+ `credential-flow-test-${Date.now()}-${Math.random().toString(36).slice(2)}`,
29
+ );
30
+ mkdirSync(join(dir, '.cleo'), { recursive: true });
31
+ // Create a minimal .cleo/project-context.json so paths resolve
32
+ writeFileSync(
33
+ join(dir, '.cleo', 'project-context.json'),
34
+ JSON.stringify({ schemaVersion: '1.0.0', projectTypes: ['node'], primaryType: 'node' }),
35
+ );
36
+ return dir;
37
+ }
38
+
39
+ // ============================================================================
40
+ // Test suite
41
+ // ============================================================================
42
+
43
+ describe('Local Credential Flow E2E', () => {
44
+ beforeEach(async () => {
45
+ originalCwd = process.cwd();
46
+ testDir = await setupTestEnvironment();
47
+ process.chdir(testDir);
48
+ });
49
+
50
+ afterEach(() => {
51
+ process.chdir(originalCwd);
52
+ if (testDir && existsSync(testDir)) {
53
+ rmSync(testDir, { recursive: true, force: true });
54
+ }
55
+ });
56
+
57
+ // --------------------------------------------------------------------------
58
+ // Step 1: cleo init creates signaldock.db
59
+ // --------------------------------------------------------------------------
60
+
61
+ describe('Step 1: signaldock.db creation', () => {
62
+ it('ensureSignaldockDb creates the database file', async () => {
63
+ const result = await ensureSignaldockDb(testDir);
64
+ expect(result.action).toBe('created');
65
+ expect(existsSync(result.path)).toBe(true);
66
+ });
67
+
68
+ it('ensureSignaldockDb is idempotent', async () => {
69
+ const first = await ensureSignaldockDb(testDir);
70
+ const second = await ensureSignaldockDb(testDir);
71
+ expect(first.action).toBe('created');
72
+ expect(second.action).toBe('exists');
73
+ expect(first.path).toBe(second.path);
74
+ });
75
+
76
+ it('signaldock.db has the messages table', async () => {
77
+ await ensureSignaldockDb(testDir);
78
+ const dbPath = getSignaldockDbPath(testDir);
79
+ expect(existsSync(dbPath)).toBe(true);
80
+
81
+ // Verify by connecting LocalTransport (which checks for messages table)
82
+ const transport = new LocalTransport();
83
+ await transport.connect({
84
+ agentId: 'test',
85
+ apiKey: 'sk_test',
86
+ apiBaseUrl: 'http://localhost',
87
+ });
88
+ await transport.disconnect();
89
+ });
90
+ });
91
+
92
+ // --------------------------------------------------------------------------
93
+ // Step 2: LocalTransport availability
94
+ // --------------------------------------------------------------------------
95
+
96
+ describe('Step 2: LocalTransport availability', () => {
97
+ it('isAvailable returns false before init', () => {
98
+ const emptyDir = join(tmpdir(), `no-init-${Date.now()}`);
99
+ mkdirSync(join(emptyDir, '.cleo'), { recursive: true });
100
+ expect(LocalTransport.isAvailable(emptyDir)).toBe(false);
101
+ rmSync(emptyDir, { recursive: true, force: true });
102
+ });
103
+
104
+ it('isAvailable returns true after init', async () => {
105
+ await ensureSignaldockDb(testDir);
106
+ expect(LocalTransport.isAvailable(testDir)).toBe(true);
107
+ });
108
+ });
109
+
110
+ // --------------------------------------------------------------------------
111
+ // Step 3: Full messaging lifecycle
112
+ // --------------------------------------------------------------------------
113
+
114
+ describe('Step 3: messaging lifecycle', () => {
115
+ it('complete flow: init → connect → push → poll → ack', async () => {
116
+ // 1. Init signaldock.db
117
+ await ensureSignaldockDb(testDir);
118
+
119
+ // 2. Connect two agents
120
+ const agent1 = new LocalTransport();
121
+ const agent2 = new LocalTransport();
122
+
123
+ await agent1.connect({
124
+ agentId: 'cleo-rust-lead',
125
+ apiKey: 'sk_live_fake1',
126
+ apiBaseUrl: 'http://localhost',
127
+ });
128
+ await agent2.connect({
129
+ agentId: 'cleo-dev',
130
+ apiKey: 'sk_live_fake2',
131
+ apiBaseUrl: 'http://localhost',
132
+ });
133
+
134
+ // 3. Agent 1 sends a message to Agent 2
135
+ const sendResult = await agent1.push(
136
+ 'cleo-dev',
137
+ '/action @cleo-dev #test Hello from rust-lead',
138
+ );
139
+ expect(sendResult.messageId).toBeDefined();
140
+
141
+ // 4. Agent 2 polls and receives the message
142
+ const messages = await agent2.poll();
143
+ expect(messages).toHaveLength(1);
144
+ expect(messages[0].from).toBe('cleo-rust-lead');
145
+ expect(messages[0].content).toContain('Hello from rust-lead');
146
+
147
+ // 5. Agent 2 acknowledges the message
148
+ await agent2.ack([messages[0].id]);
149
+
150
+ // 6. Subsequent poll returns empty (message was acked)
151
+ const afterAck = await agent2.poll();
152
+ expect(afterAck).toHaveLength(0);
153
+
154
+ // 7. Agent 2 replies
155
+ const replyResult = await agent2.push('cleo-rust-lead', '/ack Received.');
156
+ expect(replyResult.messageId).toBeDefined();
157
+
158
+ // 8. Agent 1 receives the reply
159
+ const replies = await agent1.poll();
160
+ expect(replies).toHaveLength(1);
161
+ expect(replies[0].from).toBe('cleo-dev');
162
+ expect(replies[0].content).toBe('/ack Received.');
163
+
164
+ // Cleanup
165
+ await agent1.disconnect();
166
+ await agent2.disconnect();
167
+ });
168
+
169
+ it('messages persist across transport reconnections', async () => {
170
+ await ensureSignaldockDb(testDir);
171
+
172
+ // Send a message
173
+ const sender = new LocalTransport();
174
+ await sender.connect({
175
+ agentId: 'sender',
176
+ apiKey: 'sk_test',
177
+ apiBaseUrl: 'http://localhost',
178
+ });
179
+ await sender.push('receiver', 'persistent message');
180
+ await sender.disconnect();
181
+
182
+ // New transport instance reads the same DB
183
+ const receiver = new LocalTransport();
184
+ await receiver.connect({
185
+ agentId: 'receiver',
186
+ apiKey: 'sk_test',
187
+ apiBaseUrl: 'http://localhost',
188
+ });
189
+ const messages = await receiver.poll();
190
+ expect(messages).toHaveLength(1);
191
+ expect(messages[0].content).toBe('persistent message');
192
+
193
+ await receiver.disconnect();
194
+ });
195
+
196
+ it('multiple agents can communicate in the same conversation', async () => {
197
+ await ensureSignaldockDb(testDir);
198
+
199
+ const prime = new LocalTransport();
200
+ const rustLead = new LocalTransport();
201
+ const dbLead = new LocalTransport();
202
+
203
+ await prime.connect({ agentId: 'prime', apiKey: 'sk1', apiBaseUrl: 'http://localhost' });
204
+ await rustLead.connect({
205
+ agentId: 'rust-lead',
206
+ apiKey: 'sk2',
207
+ apiBaseUrl: 'http://localhost',
208
+ });
209
+ await dbLead.connect({ agentId: 'db-lead', apiKey: 'sk3', apiBaseUrl: 'http://localhost' });
210
+
211
+ // Prime sends to rust-lead
212
+ await prime.push('rust-lead', 'Fix cant-lsp');
213
+ // Prime sends to db-lead
214
+ await prime.push('db-lead', 'Review schemas');
215
+
216
+ // Each agent only sees their own messages
217
+ const rustMessages = await rustLead.poll();
218
+ const dbMessages = await dbLead.poll();
219
+
220
+ expect(rustMessages).toHaveLength(1);
221
+ expect(rustMessages[0].content).toBe('Fix cant-lsp');
222
+ expect(dbMessages).toHaveLength(1);
223
+ expect(dbMessages[0].content).toBe('Review schemas');
224
+
225
+ await prime.disconnect();
226
+ await rustLead.disconnect();
227
+ await dbLead.disconnect();
228
+ });
229
+ });
230
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-transport.test.d.ts","sourceRoot":"","sources":["local-transport.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}