@claude-flow/cli 3.32.3 → 3.32.4

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 (683) hide show
  1. package/.claude/helpers/helpers.manifest.json +2 -2
  2. package/catalog-manifest.json +2 -2
  3. package/dist/src/agenticow/speculative-exploration.d.ts +148 -0
  4. package/dist/src/agenticow/speculative-exploration.js +218 -0
  5. package/dist/src/appliance/gguf-engine.d.ts +91 -0
  6. package/dist/src/appliance/gguf-engine.js +425 -0
  7. package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
  8. package/dist/src/appliance/ruvllm-bridge.js +292 -0
  9. package/dist/src/appliance/rvfa-builder.d.ts +44 -0
  10. package/dist/src/appliance/rvfa-builder.js +329 -0
  11. package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
  12. package/dist/src/appliance/rvfa-distribution.js +370 -0
  13. package/dist/src/appliance/rvfa-format.d.ts +111 -0
  14. package/dist/src/appliance/rvfa-format.js +393 -0
  15. package/dist/src/appliance/rvfa-runner.d.ts +69 -0
  16. package/dist/src/appliance/rvfa-runner.js +237 -0
  17. package/dist/src/appliance/rvfa-signing.d.ts +123 -0
  18. package/dist/src/appliance/rvfa-signing.js +347 -0
  19. package/dist/src/auth/client.d.ts +89 -0
  20. package/dist/src/auth/client.js +242 -0
  21. package/dist/src/auth/constants.d.ts +7 -0
  22. package/dist/src/auth/constants.js +7 -0
  23. package/dist/src/auth/scopes.d.ts +14 -0
  24. package/dist/src/auth/scopes.js +21 -0
  25. package/dist/src/auth/security-bridge.d.ts +36 -0
  26. package/dist/src/auth/security-bridge.js +42 -0
  27. package/dist/src/auth/session.d.ts +20 -0
  28. package/dist/src/auth/session.js +32 -0
  29. package/dist/src/auth/state.d.ts +19 -0
  30. package/dist/src/auth/state.js +53 -0
  31. package/dist/src/auth/types.d.ts +27 -0
  32. package/dist/src/auth/types.js +11 -0
  33. package/dist/src/autopilot-state.d.ts +77 -0
  34. package/dist/src/autopilot-state.js +271 -0
  35. package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts +18 -0
  36. package/dist/src/benchmarks/gaia-agent-planning.smoke.js +253 -0
  37. package/dist/src/benchmarks/gaia-agent.d.ts +198 -0
  38. package/dist/src/benchmarks/gaia-agent.js +651 -0
  39. package/dist/src/benchmarks/gaia-causal-memory.d.ts +133 -0
  40. package/dist/src/benchmarks/gaia-causal-memory.js +281 -0
  41. package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts +22 -0
  42. package/dist/src/benchmarks/gaia-causal-memory.smoke.js +300 -0
  43. package/dist/src/benchmarks/gaia-convergence.d.ts +138 -0
  44. package/dist/src/benchmarks/gaia-convergence.js +260 -0
  45. package/dist/src/benchmarks/gaia-convergence.smoke.d.ts +19 -0
  46. package/dist/src/benchmarks/gaia-convergence.smoke.js +246 -0
  47. package/dist/src/benchmarks/gaia-critic.d.ts +123 -0
  48. package/dist/src/benchmarks/gaia-critic.js +312 -0
  49. package/dist/src/benchmarks/gaia-critic.smoke.d.ts +21 -0
  50. package/dist/src/benchmarks/gaia-critic.smoke.js +327 -0
  51. package/dist/src/benchmarks/gaia-decomposer.d.ts +125 -0
  52. package/dist/src/benchmarks/gaia-decomposer.js +350 -0
  53. package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts +21 -0
  54. package/dist/src/benchmarks/gaia-decomposer.smoke.js +228 -0
  55. package/dist/src/benchmarks/gaia-e2e-smoke.d.ts +27 -0
  56. package/dist/src/benchmarks/gaia-e2e-smoke.js +136 -0
  57. package/dist/src/benchmarks/gaia-extract.smoke.d.ts +45 -0
  58. package/dist/src/benchmarks/gaia-extract.smoke.js +242 -0
  59. package/dist/src/benchmarks/gaia-hardness/features.d.ts +46 -0
  60. package/dist/src/benchmarks/gaia-hardness/features.js +170 -0
  61. package/dist/src/benchmarks/gaia-hardness/predictor.d.ts +105 -0
  62. package/dist/src/benchmarks/gaia-hardness/predictor.js +260 -0
  63. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts +20 -0
  64. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js +235 -0
  65. package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts +51 -0
  66. package/dist/src/benchmarks/gaia-hardness/train-data-loader.js +179 -0
  67. package/dist/src/benchmarks/gaia-judge.d.ts +88 -0
  68. package/dist/src/benchmarks/gaia-judge.js +437 -0
  69. package/dist/src/benchmarks/gaia-loader.d.ts +87 -0
  70. package/dist/src/benchmarks/gaia-loader.js +326 -0
  71. package/dist/src/benchmarks/gaia-tools/file_read.d.ts +35 -0
  72. package/dist/src/benchmarks/gaia-tools/file_read.js +403 -0
  73. package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts +126 -0
  74. package/dist/src/benchmarks/gaia-tools/grounded_query.js +225 -0
  75. package/dist/src/benchmarks/gaia-tools/index.d.ts +32 -0
  76. package/dist/src/benchmarks/gaia-tools/index.js +36 -0
  77. package/dist/src/benchmarks/gaia-tools/types.d.ts +62 -0
  78. package/dist/src/benchmarks/gaia-tools/types.js +12 -0
  79. package/dist/src/benchmarks/gaia-tools/web_search.d.ts +30 -0
  80. package/dist/src/benchmarks/gaia-tools/web_search.js +210 -0
  81. package/dist/src/benchmarks/gaia-voting.d.ts +88 -0
  82. package/dist/src/benchmarks/gaia-voting.js +297 -0
  83. package/dist/src/benchmarks/gaia-voting.smoke.d.ts +20 -0
  84. package/dist/src/benchmarks/gaia-voting.smoke.js +332 -0
  85. package/dist/src/benchmarks/pretrain/index.d.ts +58 -0
  86. package/dist/src/benchmarks/pretrain/index.js +404 -0
  87. package/dist/src/business-pods/bbs-budget-tracker.d.ts +139 -0
  88. package/dist/src/business-pods/bbs-budget-tracker.js +358 -0
  89. package/dist/src/business-pods/domain-affinity-policy.d.ts +47 -0
  90. package/dist/src/business-pods/domain-affinity-policy.js +65 -0
  91. package/dist/src/business-pods/pod-schema.d.ts +96 -0
  92. package/dist/src/business-pods/pod-schema.js +225 -0
  93. package/dist/src/commands/advisor.d.ts +15 -0
  94. package/dist/src/commands/advisor.js +94 -0
  95. package/dist/src/commands/agent-wasm.d.ts +14 -0
  96. package/dist/src/commands/agent-wasm.js +333 -0
  97. package/dist/src/commands/agent.d.ts +8 -0
  98. package/dist/src/commands/agent.js +927 -0
  99. package/dist/src/commands/analyze.d.ts +19 -0
  100. package/dist/src/commands/analyze.js +2047 -0
  101. package/dist/src/commands/announcements.d.ts +17 -0
  102. package/dist/src/commands/announcements.js +0 -0
  103. package/dist/src/commands/appliance-advanced.d.ts +9 -0
  104. package/dist/src/commands/appliance-advanced.js +215 -0
  105. package/dist/src/commands/appliance.d.ts +8 -0
  106. package/dist/src/commands/appliance.js +404 -0
  107. package/dist/src/commands/auth.d.ts +15 -0
  108. package/dist/src/commands/auth.js +244 -0
  109. package/dist/src/commands/autopilot.d.ts +15 -0
  110. package/dist/src/commands/autopilot.js +407 -0
  111. package/dist/src/commands/benchmark.d.ts +10 -0
  112. package/dist/src/commands/benchmark.js +460 -0
  113. package/dist/src/commands/claims.d.ts +10 -0
  114. package/dist/src/commands/claims.js +620 -0
  115. package/dist/src/commands/cleanup.d.ts +13 -0
  116. package/dist/src/commands/cleanup.js +250 -0
  117. package/dist/src/commands/completions.d.ts +10 -0
  118. package/dist/src/commands/completions.js +539 -0
  119. package/dist/src/commands/config.d.ts +8 -0
  120. package/dist/src/commands/config.js +428 -0
  121. package/dist/src/commands/daemon.d.ts +59 -0
  122. package/dist/src/commands/daemon.js +1733 -0
  123. package/dist/src/commands/deployment.d.ts +10 -0
  124. package/dist/src/commands/deployment.js +672 -0
  125. package/dist/src/commands/doctor.d.ts +10 -0
  126. package/dist/src/commands/doctor.js +1902 -0
  127. package/dist/src/commands/eject.d.ts +33 -0
  128. package/dist/src/commands/eject.js +195 -0
  129. package/dist/src/commands/embeddings.d.ts +18 -0
  130. package/dist/src/commands/embeddings.js +1623 -0
  131. package/dist/src/commands/funnel.d.ts +18 -0
  132. package/dist/src/commands/funnel.js +302 -0
  133. package/dist/src/commands/gaia-bench.d.ts +40 -0
  134. package/dist/src/commands/gaia-bench.js +597 -0
  135. package/dist/src/commands/guidance.d.ts +8 -0
  136. package/dist/src/commands/guidance.js +556 -0
  137. package/dist/src/commands/hive-mind.d.ts +11 -0
  138. package/dist/src/commands/hive-mind.js +1319 -0
  139. package/dist/src/commands/hooks.d.ts +8 -0
  140. package/dist/src/commands/hooks.js +4606 -0
  141. package/dist/src/commands/index.d.ts +118 -0
  142. package/dist/src/commands/index.js +366 -0
  143. package/dist/src/commands/init.d.ts +13 -0
  144. package/dist/src/commands/init.js +1297 -0
  145. package/dist/src/commands/issues.d.ts +21 -0
  146. package/dist/src/commands/issues.js +567 -0
  147. package/dist/src/commands/mcp.d.ts +11 -0
  148. package/dist/src/commands/mcp.js +732 -0
  149. package/dist/src/commands/memory-backup.d.ts +11 -0
  150. package/dist/src/commands/memory-backup.js +46 -0
  151. package/dist/src/commands/memory-distill.d.ts +27 -0
  152. package/dist/src/commands/memory-distill.js +374 -0
  153. package/dist/src/commands/memory.d.ts +8 -0
  154. package/dist/src/commands/memory.js +1596 -0
  155. package/dist/src/commands/metaharness.d.ts +39 -0
  156. package/dist/src/commands/metaharness.js +215 -0
  157. package/dist/src/commands/migrate.d.ts +8 -0
  158. package/dist/src/commands/migrate.js +742 -0
  159. package/dist/src/commands/neural.d.ts +10 -0
  160. package/dist/src/commands/neural.js +4331 -0
  161. package/dist/src/commands/performance.d.ts +10 -0
  162. package/dist/src/commands/performance.js +583 -0
  163. package/dist/src/commands/plugins.d.ts +11 -0
  164. package/dist/src/commands/plugins.js +826 -0
  165. package/dist/src/commands/process.d.ts +10 -0
  166. package/dist/src/commands/process.js +694 -0
  167. package/dist/src/commands/progress.d.ts +11 -0
  168. package/dist/src/commands/progress.js +259 -0
  169. package/dist/src/commands/providers.d.ts +10 -0
  170. package/dist/src/commands/providers.js +502 -0
  171. package/dist/src/commands/proxy-lifecycle.d.ts +12 -0
  172. package/dist/src/commands/proxy-lifecycle.js +232 -0
  173. package/dist/src/commands/proxy.d.ts +21 -0
  174. package/dist/src/commands/proxy.js +398 -0
  175. package/dist/src/commands/route.d.ts +16 -0
  176. package/dist/src/commands/route.js +822 -0
  177. package/dist/src/commands/ruvector/backup.d.ts +11 -0
  178. package/dist/src/commands/ruvector/backup.js +747 -0
  179. package/dist/src/commands/ruvector/benchmark.d.ts +11 -0
  180. package/dist/src/commands/ruvector/benchmark.js +490 -0
  181. package/dist/src/commands/ruvector/import.d.ts +18 -0
  182. package/dist/src/commands/ruvector/import.js +373 -0
  183. package/dist/src/commands/ruvector/index.d.ts +29 -0
  184. package/dist/src/commands/ruvector/index.js +129 -0
  185. package/dist/src/commands/ruvector/init.d.ts +11 -0
  186. package/dist/src/commands/ruvector/init.js +467 -0
  187. package/dist/src/commands/ruvector/migrate.d.ts +11 -0
  188. package/dist/src/commands/ruvector/migrate.js +498 -0
  189. package/dist/src/commands/ruvector/optimize.d.ts +11 -0
  190. package/dist/src/commands/ruvector/optimize.js +505 -0
  191. package/dist/src/commands/ruvector/pg-utils.d.ts +14 -0
  192. package/dist/src/commands/ruvector/pg-utils.js +41 -0
  193. package/dist/src/commands/ruvector/setup.d.ts +18 -0
  194. package/dist/src/commands/ruvector/setup.js +765 -0
  195. package/dist/src/commands/ruvector/status.d.ts +11 -0
  196. package/dist/src/commands/ruvector/status.js +479 -0
  197. package/dist/src/commands/security.d.ts +10 -0
  198. package/dist/src/commands/security.js +1012 -0
  199. package/dist/src/commands/session.d.ts +8 -0
  200. package/dist/src/commands/session.js +757 -0
  201. package/dist/src/commands/settings.d.ts +19 -0
  202. package/dist/src/commands/settings.js +180 -0
  203. package/dist/src/commands/spinner.d.ts +16 -0
  204. package/dist/src/commands/spinner.js +329 -0
  205. package/dist/src/commands/start.d.ts +8 -0
  206. package/dist/src/commands/start.js +418 -0
  207. package/dist/src/commands/status.d.ts +8 -0
  208. package/dist/src/commands/status.js +608 -0
  209. package/dist/src/commands/swarm.d.ts +8 -0
  210. package/dist/src/commands/swarm.js +891 -0
  211. package/dist/src/commands/task.d.ts +8 -0
  212. package/dist/src/commands/task.js +675 -0
  213. package/dist/src/commands/transfer-store.d.ts +13 -0
  214. package/dist/src/commands/transfer-store.js +428 -0
  215. package/dist/src/commands/update.d.ts +8 -0
  216. package/dist/src/commands/update.js +276 -0
  217. package/dist/src/commands/verify.d.ts +19 -0
  218. package/dist/src/commands/verify.js +261 -0
  219. package/dist/src/commands/version.d.ts +42 -0
  220. package/dist/src/commands/version.js +106 -0
  221. package/dist/src/commands/workflow.d.ts +8 -0
  222. package/dist/src/commands/workflow.js +617 -0
  223. package/dist/src/config/harness-feedback-applier.d.ts +50 -0
  224. package/dist/src/config/harness-feedback-applier.js +122 -0
  225. package/dist/src/config/proven-config-refresh.d.ts +39 -0
  226. package/dist/src/config/proven-config-refresh.js +154 -0
  227. package/dist/src/config/proven-config-rvfa.d.ts +23 -0
  228. package/dist/src/config/proven-config-rvfa.js +73 -0
  229. package/dist/src/config/proven-config.d.ts +86 -0
  230. package/dist/src/config/proven-config.js +176 -0
  231. package/dist/src/config-adapter.d.ts +15 -0
  232. package/dist/src/config-adapter.js +186 -0
  233. package/dist/src/encryption/vault.d.ts +94 -0
  234. package/dist/src/encryption/vault.js +172 -0
  235. package/dist/src/fs-secure.d.ts +86 -0
  236. package/dist/src/fs-secure.js +133 -0
  237. package/dist/src/funnel/advisor-tip.d.ts +58 -0
  238. package/dist/src/funnel/advisor-tip.js +92 -0
  239. package/dist/src/funnel/attribution.d.ts +37 -0
  240. package/dist/src/funnel/attribution.js +101 -0
  241. package/dist/src/funnel/consent.d.ts +22 -0
  242. package/dist/src/funnel/consent.js +58 -0
  243. package/dist/src/funnel/credit-errors.d.ts +31 -0
  244. package/dist/src/funnel/credit-errors.js +88 -0
  245. package/dist/src/funnel/credit-notifier.d.ts +44 -0
  246. package/dist/src/funnel/credit-notifier.js +74 -0
  247. package/dist/src/funnel/disclosure.d.ts +47 -0
  248. package/dist/src/funnel/disclosure.js +109 -0
  249. package/dist/src/funnel/enrollment.d.ts +36 -0
  250. package/dist/src/funnel/enrollment.js +64 -0
  251. package/dist/src/funnel/environment.d.ts +17 -0
  252. package/dist/src/funnel/environment.js +39 -0
  253. package/dist/src/funnel/event-transport.d.ts +51 -0
  254. package/dist/src/funnel/event-transport.js +199 -0
  255. package/dist/src/funnel/events.d.ts +42 -0
  256. package/dist/src/funnel/events.js +150 -0
  257. package/dist/src/funnel/index.d.ts +21 -0
  258. package/dist/src/funnel/index.js +21 -0
  259. package/dist/src/funnel/insights.d.ts +50 -0
  260. package/dist/src/funnel/insights.js +120 -0
  261. package/dist/src/funnel/local-signals.d.ts +20 -0
  262. package/dist/src/funnel/local-signals.js +77 -0
  263. package/dist/src/funnel/message-transport.d.ts +51 -0
  264. package/dist/src/funnel/message-transport.js +149 -0
  265. package/dist/src/funnel/messages.d.ts +55 -0
  266. package/dist/src/funnel/messages.js +160 -0
  267. package/dist/src/funnel/payout.d.ts +40 -0
  268. package/dist/src/funnel/payout.js +60 -0
  269. package/dist/src/funnel/power-saver-notifier.d.ts +44 -0
  270. package/dist/src/funnel/power-saver-notifier.js +92 -0
  271. package/dist/src/funnel/precedence.d.ts +16 -0
  272. package/dist/src/funnel/precedence.js +85 -0
  273. package/dist/src/funnel/promo.d.ts +41 -0
  274. package/dist/src/funnel/promo.js +144 -0
  275. package/dist/src/funnel/rate-limit-notifier.d.ts +55 -0
  276. package/dist/src/funnel/rate-limit-notifier.js +102 -0
  277. package/dist/src/funnel/rotation.d.ts +19 -0
  278. package/dist/src/funnel/rotation.js +70 -0
  279. package/dist/src/funnel/state.d.ts +13 -0
  280. package/dist/src/funnel/state.js +52 -0
  281. package/dist/src/funnel/toggle-cooldown.d.ts +17 -0
  282. package/dist/src/funnel/toggle-cooldown.js +32 -0
  283. package/dist/src/funnel/types.d.ts +98 -0
  284. package/dist/src/funnel/types.js +26 -0
  285. package/dist/src/index.d.ts +81 -0
  286. package/dist/src/index.js +609 -0
  287. package/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
  288. package/dist/src/infrastructure/in-memory-repositories.js +264 -0
  289. package/dist/src/init/claudemd-generator.d.ts +16 -0
  290. package/dist/src/init/claudemd-generator.js +368 -0
  291. package/dist/src/init/executor.d.ts +41 -0
  292. package/dist/src/init/executor.js +2142 -0
  293. package/dist/src/init/helper-refresh.d.ts +79 -0
  294. package/dist/src/init/helper-refresh.js +347 -0
  295. package/dist/src/init/helper-signing.d.ts +37 -0
  296. package/dist/src/init/helper-signing.js +67 -0
  297. package/dist/src/init/helpers-generator.d.ts +87 -0
  298. package/dist/src/init/helpers-generator.js +1456 -0
  299. package/dist/src/init/index.d.ts +13 -0
  300. package/dist/src/init/index.js +15 -0
  301. package/dist/src/init/mcp-generator.d.ts +26 -0
  302. package/dist/src/init/mcp-generator.js +126 -0
  303. package/dist/src/init/memory-package-resolver.d.ts +53 -0
  304. package/dist/src/init/memory-package-resolver.js +118 -0
  305. package/dist/src/init/settings-generator.d.ts +14 -0
  306. package/dist/src/init/settings-generator.js +462 -0
  307. package/dist/src/init/statusline-generator.d.ts +28 -0
  308. package/dist/src/init/statusline-generator.js +177 -0
  309. package/dist/src/init/types.d.ts +331 -0
  310. package/dist/src/init/types.js +276 -0
  311. package/dist/src/log-filters.d.ts +46 -0
  312. package/dist/src/log-filters.js +107 -0
  313. package/dist/src/mcp-client.d.ts +92 -0
  314. package/dist/src/mcp-client.js +397 -0
  315. package/dist/src/mcp-server.d.ts +163 -0
  316. package/dist/src/mcp-server.js +751 -0
  317. package/dist/src/mcp-tools/agent-execute-core.d.ts +115 -0
  318. package/dist/src/mcp-tools/agent-execute-core.js +587 -0
  319. package/dist/src/mcp-tools/agent-tools.d.ts +9 -0
  320. package/dist/src/mcp-tools/agent-tools.js +837 -0
  321. package/dist/src/mcp-tools/agentbbs-tools.d.ts +28 -0
  322. package/dist/src/mcp-tools/agentbbs-tools.js +394 -0
  323. package/dist/src/mcp-tools/agentdb-tools.d.ts +35 -0
  324. package/dist/src/mcp-tools/agentdb-tools.js +1473 -0
  325. package/dist/src/mcp-tools/agenticow-loader.d.ts +59 -0
  326. package/dist/src/mcp-tools/agenticow-loader.js +105 -0
  327. package/dist/src/mcp-tools/agenticow-speculate-tools.d.ts +24 -0
  328. package/dist/src/mcp-tools/agenticow-speculate-tools.js +209 -0
  329. package/dist/src/mcp-tools/agenticow-tools.d.ts +36 -0
  330. package/dist/src/mcp-tools/agenticow-tools.js +360 -0
  331. package/dist/src/mcp-tools/analyze-tools.d.ts +38 -0
  332. package/dist/src/mcp-tools/analyze-tools.js +346 -0
  333. package/dist/src/mcp-tools/auto-install.d.ts +83 -0
  334. package/dist/src/mcp-tools/auto-install.js +131 -0
  335. package/dist/src/mcp-tools/autopilot-tools.d.ts +12 -0
  336. package/dist/src/mcp-tools/autopilot-tools.js +231 -0
  337. package/dist/src/mcp-tools/browser-intent-tools.d.ts +162 -0
  338. package/dist/src/mcp-tools/browser-intent-tools.js +548 -0
  339. package/dist/src/mcp-tools/browser-session-tools.d.ts +27 -0
  340. package/dist/src/mcp-tools/browser-session-tools.js +398 -0
  341. package/dist/src/mcp-tools/browser-tools.d.ts +21 -0
  342. package/dist/src/mcp-tools/browser-tools.js +760 -0
  343. package/dist/src/mcp-tools/business-pod-tools.d.ts +20 -0
  344. package/dist/src/mcp-tools/business-pod-tools.js +169 -0
  345. package/dist/src/mcp-tools/claims-tools.d.ts +12 -0
  346. package/dist/src/mcp-tools/claims-tools.js +863 -0
  347. package/dist/src/mcp-tools/config-tools.d.ts +8 -0
  348. package/dist/src/mcp-tools/config-tools.js +411 -0
  349. package/dist/src/mcp-tools/coordination-tools.d.ts +13 -0
  350. package/dist/src/mcp-tools/coordination-tools.js +729 -0
  351. package/dist/src/mcp-tools/daa-tools.d.ts +13 -0
  352. package/dist/src/mcp-tools/daa-tools.js +534 -0
  353. package/dist/src/mcp-tools/embeddings-tools.d.ts +9 -0
  354. package/dist/src/mcp-tools/embeddings-tools.js +904 -0
  355. package/dist/src/mcp-tools/github-tools.d.ts +9 -0
  356. package/dist/src/mcp-tools/github-tools.js +659 -0
  357. package/dist/src/mcp-tools/guidance-tools.d.ts +15 -0
  358. package/dist/src/mcp-tools/guidance-tools.js +639 -0
  359. package/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -0
  360. package/dist/src/mcp-tools/hive-mind-tools.js +953 -0
  361. package/dist/src/mcp-tools/hooks-tools.d.ts +65 -0
  362. package/dist/src/mcp-tools/hooks-tools.js +4836 -0
  363. package/dist/src/mcp-tools/http-fetch-tools.d.ts +55 -0
  364. package/dist/src/mcp-tools/http-fetch-tools.js +329 -0
  365. package/dist/src/mcp-tools/index.d.ts +34 -0
  366. package/dist/src/mcp-tools/index.js +40 -0
  367. package/dist/src/mcp-tools/managed-agent-tools.d.ts +22 -0
  368. package/dist/src/mcp-tools/managed-agent-tools.js +357 -0
  369. package/dist/src/mcp-tools/memory-tools.d.ts +14 -0
  370. package/dist/src/mcp-tools/memory-tools.js +1330 -0
  371. package/dist/src/mcp-tools/metaharness-tools.d.ts +51 -0
  372. package/dist/src/mcp-tools/metaharness-tools.js +684 -0
  373. package/dist/src/mcp-tools/neural-tools.d.ts +54 -0
  374. package/dist/src/mcp-tools/neural-tools.js +1168 -0
  375. package/dist/src/mcp-tools/performance-tools.d.ts +16 -0
  376. package/dist/src/mcp-tools/performance-tools.js +675 -0
  377. package/dist/src/mcp-tools/progress-tools.d.ts +14 -0
  378. package/dist/src/mcp-tools/progress-tools.js +348 -0
  379. package/dist/src/mcp-tools/request-tracker.d.ts +17 -0
  380. package/dist/src/mcp-tools/request-tracker.js +27 -0
  381. package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
  382. package/dist/src/mcp-tools/ruvllm-tools.js +355 -0
  383. package/dist/src/mcp-tools/security-tools.d.ts +18 -0
  384. package/dist/src/mcp-tools/security-tools.js +556 -0
  385. package/dist/src/mcp-tools/session-tools.d.ts +8 -0
  386. package/dist/src/mcp-tools/session-tools.js +517 -0
  387. package/dist/src/mcp-tools/swarm-tools.d.ts +37 -0
  388. package/dist/src/mcp-tools/swarm-tools.js +390 -0
  389. package/dist/src/mcp-tools/system-tools.d.ts +13 -0
  390. package/dist/src/mcp-tools/system-tools.js +688 -0
  391. package/dist/src/mcp-tools/task-tools.d.ts +8 -0
  392. package/dist/src/mcp-tools/task-tools.js +487 -0
  393. package/dist/src/mcp-tools/terminal-tools.d.ts +8 -0
  394. package/dist/src/mcp-tools/terminal-tools.js +306 -0
  395. package/dist/src/mcp-tools/testgen-tools.d.ts +26 -0
  396. package/dist/src/mcp-tools/testgen-tools.js +168 -0
  397. package/dist/src/mcp-tools/tool-loop-guardrail.d.ts +31 -0
  398. package/dist/src/mcp-tools/tool-loop-guardrail.js +71 -0
  399. package/dist/src/mcp-tools/transfer-tools.d.ts +14 -0
  400. package/dist/src/mcp-tools/transfer-tools.js +447 -0
  401. package/dist/src/mcp-tools/types.d.ts +8 -0
  402. package/dist/src/mcp-tools/types.js +8 -0
  403. package/dist/src/mcp-tools/validate-input.d.ts +9 -0
  404. package/dist/src/mcp-tools/validate-input.js +9 -0
  405. package/dist/src/mcp-tools/wasm-agent-tools.d.ts +13 -0
  406. package/dist/src/mcp-tools/wasm-agent-tools.js +840 -0
  407. package/dist/src/mcp-tools/workflow-tools.d.ts +8 -0
  408. package/dist/src/mcp-tools/workflow-tools.js +884 -0
  409. package/dist/src/memory/bge-embedder.d.ts +25 -0
  410. package/dist/src/memory/bge-embedder.js +121 -0
  411. package/dist/src/memory/cross-encoder-rerank.d.ts +33 -0
  412. package/dist/src/memory/cross-encoder-rerank.js +123 -0
  413. package/dist/src/memory/embedding-policy.d.ts +21 -0
  414. package/dist/src/memory/embedding-policy.js +30 -0
  415. package/dist/src/memory/embedding-quantization.d.ts +62 -0
  416. package/dist/src/memory/embedding-quantization.js +156 -0
  417. package/dist/src/memory/ewc-consolidation.d.ts +305 -0
  418. package/dist/src/memory/ewc-consolidation.js +611 -0
  419. package/dist/src/memory/graph-edge-writer.d.ts +95 -0
  420. package/dist/src/memory/graph-edge-writer.js +217 -0
  421. package/dist/src/memory/hybrid-retrieval.d.ts +77 -0
  422. package/dist/src/memory/hybrid-retrieval.js +192 -0
  423. package/dist/src/memory/intelligence.d.ts +405 -0
  424. package/dist/src/memory/intelligence.js +1316 -0
  425. package/dist/src/memory/lucene-bm25.d.ts +19 -0
  426. package/dist/src/memory/lucene-bm25.js +308 -0
  427. package/dist/src/memory/memory-bridge.d.ts +537 -0
  428. package/dist/src/memory/memory-bridge.js +2460 -0
  429. package/dist/src/memory/memory-initializer.d.ts +556 -0
  430. package/dist/src/memory/memory-initializer.js +3021 -0
  431. package/dist/src/memory/neural-package-bridge.d.ts +48 -0
  432. package/dist/src/memory/neural-package-bridge.js +87 -0
  433. package/dist/src/memory/rabitq-index.d.ts +60 -0
  434. package/dist/src/memory/rabitq-index.js +242 -0
  435. package/dist/src/memory/sona-optimizer.d.ts +267 -0
  436. package/dist/src/memory/sona-optimizer.js +779 -0
  437. package/dist/src/memory/structured-distill.d.ts +48 -0
  438. package/dist/src/memory/structured-distill.js +125 -0
  439. package/dist/src/output.d.ts +9 -0
  440. package/dist/src/output.js +9 -0
  441. package/dist/src/parser.d.ts +89 -0
  442. package/dist/src/parser.js +516 -0
  443. package/dist/src/plugins/manager.d.ts +133 -0
  444. package/dist/src/plugins/manager.js +415 -0
  445. package/dist/src/plugins/store/discovery.d.ts +99 -0
  446. package/dist/src/plugins/store/discovery.js +1224 -0
  447. package/dist/src/plugins/store/index.d.ts +76 -0
  448. package/dist/src/plugins/store/index.js +141 -0
  449. package/dist/src/plugins/store/search.d.ts +46 -0
  450. package/dist/src/plugins/store/search.js +230 -0
  451. package/dist/src/plugins/store/types.d.ts +279 -0
  452. package/dist/src/plugins/store/types.js +7 -0
  453. package/dist/src/plugins/tests/demo-plugin-store.d.ts +7 -0
  454. package/dist/src/plugins/tests/demo-plugin-store.js +126 -0
  455. package/dist/src/plugins/tests/standalone-test.d.ts +12 -0
  456. package/dist/src/plugins/tests/standalone-test.js +188 -0
  457. package/dist/src/plugins/tests/test-plugin-store.d.ts +7 -0
  458. package/dist/src/plugins/tests/test-plugin-store.js +206 -0
  459. package/dist/src/production/circuit-breaker.d.ts +101 -0
  460. package/dist/src/production/circuit-breaker.js +241 -0
  461. package/dist/src/production/error-handler.d.ts +92 -0
  462. package/dist/src/production/error-handler.js +299 -0
  463. package/dist/src/production/index.d.ts +23 -0
  464. package/dist/src/production/index.js +18 -0
  465. package/dist/src/production/monitoring.d.ts +161 -0
  466. package/dist/src/production/monitoring.js +356 -0
  467. package/dist/src/production/rate-limiter.d.ts +80 -0
  468. package/dist/src/production/rate-limiter.js +201 -0
  469. package/dist/src/production/retry.d.ts +48 -0
  470. package/dist/src/production/retry.js +179 -0
  471. package/dist/src/prompt.d.ts +44 -0
  472. package/dist/src/prompt.js +501 -0
  473. package/dist/src/proxy/install.d.ts +29 -0
  474. package/dist/src/proxy/install.js +135 -0
  475. package/dist/src/proxy/lifecycle.d.ts +61 -0
  476. package/dist/src/proxy/lifecycle.js +249 -0
  477. package/dist/src/proxy/paths.d.ts +34 -0
  478. package/dist/src/proxy/paths.js +70 -0
  479. package/dist/src/proxy/release.d.ts +47 -0
  480. package/dist/src/proxy/release.js +138 -0
  481. package/dist/src/proxy/token-bridge.d.ts +5 -0
  482. package/dist/src/proxy/token-bridge.js +61 -0
  483. package/dist/src/proxy/verify.d.ts +44 -0
  484. package/dist/src/proxy/verify.js +68 -0
  485. package/dist/src/runtime/headless.d.ts +60 -0
  486. package/dist/src/runtime/headless.js +284 -0
  487. package/dist/src/runtime/parent-death-watchdog.d.ts +42 -0
  488. package/dist/src/runtime/parent-death-watchdog.js +70 -0
  489. package/dist/src/ruvector/agent-wasm.d.ts +228 -0
  490. package/dist/src/ruvector/agent-wasm.js +463 -0
  491. package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
  492. package/dist/src/ruvector/ast-analyzer.js +277 -0
  493. package/dist/src/ruvector/codemods/engine.d.ts +45 -0
  494. package/dist/src/ruvector/codemods/engine.js +291 -0
  495. package/dist/src/ruvector/codemods/scope-analysis.d.ts +29 -0
  496. package/dist/src/ruvector/codemods/scope-analysis.js +162 -0
  497. package/dist/src/ruvector/coverage-router.d.ts +160 -0
  498. package/dist/src/ruvector/coverage-router.js +531 -0
  499. package/dist/src/ruvector/coverage-tools.d.ts +33 -0
  500. package/dist/src/ruvector/coverage-tools.js +157 -0
  501. package/dist/src/ruvector/diff-classifier.d.ts +175 -0
  502. package/dist/src/ruvector/diff-classifier.js +699 -0
  503. package/dist/src/ruvector/diskann-backend.d.ts +78 -0
  504. package/dist/src/ruvector/diskann-backend.js +310 -0
  505. package/dist/src/ruvector/enhanced-model-router.d.ts +172 -0
  506. package/dist/src/ruvector/enhanced-model-router.js +577 -0
  507. package/dist/src/ruvector/graph-analyzer.d.ts +187 -0
  508. package/dist/src/ruvector/graph-analyzer.js +929 -0
  509. package/dist/src/ruvector/graph-backend.d.ts +79 -0
  510. package/dist/src/ruvector/graph-backend.js +220 -0
  511. package/dist/src/ruvector/index.d.ts +38 -0
  512. package/dist/src/ruvector/index.js +86 -0
  513. package/dist/src/ruvector/lora-adapter.d.ts +292 -0
  514. package/dist/src/ruvector/lora-adapter.js +710 -0
  515. package/dist/src/ruvector/model-prices.d.ts +50 -0
  516. package/dist/src/ruvector/model-prices.js +72 -0
  517. package/dist/src/ruvector/model-router.d.ts +408 -0
  518. package/dist/src/ruvector/model-router.js +1162 -0
  519. package/dist/src/ruvector/neural-router.d.ts +182 -0
  520. package/dist/src/ruvector/neural-router.js +825 -0
  521. package/dist/src/ruvector/output-verifier.d.ts +83 -0
  522. package/dist/src/ruvector/output-verifier.js +277 -0
  523. package/dist/src/ruvector/q-learning-router.d.ts +227 -0
  524. package/dist/src/ruvector/q-learning-router.js +721 -0
  525. package/dist/src/ruvector/router-calibrator.d.ts +65 -0
  526. package/dist/src/ruvector/router-calibrator.js +120 -0
  527. package/dist/src/ruvector/router-parallel-recorder.d.ts +127 -0
  528. package/dist/src/ruvector/router-parallel-recorder.js +183 -0
  529. package/dist/src/ruvector/router-trajectory.d.ts +194 -0
  530. package/dist/src/ruvector/router-trajectory.js +281 -0
  531. package/dist/src/ruvector/run-transcript-recorder.d.ts +154 -0
  532. package/dist/src/ruvector/run-transcript-recorder.js +209 -0
  533. package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
  534. package/dist/src/ruvector/ruvllm-wasm.js +379 -0
  535. package/dist/src/ruvector/semantic-router.d.ts +77 -0
  536. package/dist/src/ruvector/semantic-router.js +178 -0
  537. package/dist/src/ruvector/task-embedder.d.ts +56 -0
  538. package/dist/src/ruvector/task-embedder.js +237 -0
  539. package/dist/src/ruvector/trajectory-tree.d.ts +113 -0
  540. package/dist/src/ruvector/trajectory-tree.js +237 -0
  541. package/dist/src/ruvector/vector-db.d.ts +73 -0
  542. package/dist/src/ruvector/vector-db.js +301 -0
  543. package/dist/src/ruvector/wasm-embedder.d.ts +13 -0
  544. package/dist/src/ruvector/wasm-embedder.js +143 -0
  545. package/dist/src/security/builtin-aidefence.d.ts +34 -0
  546. package/dist/src/security/builtin-aidefence.js +86 -0
  547. package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
  548. package/dist/src/services/agentic-flow-bridge.js +95 -0
  549. package/dist/src/services/ai-job-dedup.d.ts +61 -0
  550. package/dist/src/services/ai-job-dedup.js +136 -0
  551. package/dist/src/services/checkpoint-gate.d.ts +140 -0
  552. package/dist/src/services/checkpoint-gate.js +223 -0
  553. package/dist/src/services/claim-service.d.ts +204 -0
  554. package/dist/src/services/claim-service.js +818 -0
  555. package/dist/src/services/config-file-manager.d.ts +37 -0
  556. package/dist/src/services/config-file-manager.js +224 -0
  557. package/dist/src/services/container-worker-pool.d.ts +204 -0
  558. package/dist/src/services/container-worker-pool.js +589 -0
  559. package/dist/src/services/daemon-autostart.d.ts +17 -0
  560. package/dist/src/services/daemon-autostart.js +102 -0
  561. package/dist/src/services/distill-oracle.d.ts +190 -0
  562. package/dist/src/services/distill-oracle.js +349 -0
  563. package/dist/src/services/distill-tuning.d.ts +111 -0
  564. package/dist/src/services/distill-tuning.js +510 -0
  565. package/dist/src/services/evolve-proof.d.ts +253 -0
  566. package/dist/src/services/evolve-proof.js +343 -0
  567. package/dist/src/services/fable-harness.d.ts +208 -0
  568. package/dist/src/services/fable-harness.js +388 -0
  569. package/dist/src/services/git-workspace-identity.d.ts +42 -0
  570. package/dist/src/services/git-workspace-identity.js +99 -0
  571. package/dist/src/services/global-ai-budget.d.ts +135 -0
  572. package/dist/src/services/global-ai-budget.js +415 -0
  573. package/dist/src/services/harness-benchmark.d.ts +68 -0
  574. package/dist/src/services/harness-benchmark.js +94 -0
  575. package/dist/src/services/harness-canary.d.ts +60 -0
  576. package/dist/src/services/harness-canary.js +69 -0
  577. package/dist/src/services/harness-corpus-harvester.d.ts +51 -0
  578. package/dist/src/services/harness-corpus-harvester.js +74 -0
  579. package/dist/src/services/harness-flywheel-generations.d.ts +115 -0
  580. package/dist/src/services/harness-flywheel-generations.js +360 -0
  581. package/dist/src/services/harness-flywheel-runtime.d.ts +25 -0
  582. package/dist/src/services/harness-flywheel-runtime.js +92 -0
  583. package/dist/src/services/harness-flywheel.d.ts +48 -0
  584. package/dist/src/services/harness-flywheel.js +207 -0
  585. package/dist/src/services/harness-frozen-eval.d.ts +22 -0
  586. package/dist/src/services/harness-frozen-eval.js +66 -0
  587. package/dist/src/services/harness-hosts.d.ts +40 -0
  588. package/dist/src/services/harness-hosts.js +88 -0
  589. package/dist/src/services/harness-improvement-ledger.d.ts +63 -0
  590. package/dist/src/services/harness-improvement-ledger.js +101 -0
  591. package/dist/src/services/harness-loop.d.ts +53 -0
  592. package/dist/src/services/harness-loop.js +85 -0
  593. package/dist/src/services/harness-qualification.d.ts +66 -0
  594. package/dist/src/services/harness-qualification.js +143 -0
  595. package/dist/src/services/harness-replay.d.ts +37 -0
  596. package/dist/src/services/harness-replay.js +92 -0
  597. package/dist/src/services/harness-verify.d.ts +33 -0
  598. package/dist/src/services/harness-verify.js +26 -0
  599. package/dist/src/services/harness-worker.d.ts +23 -0
  600. package/dist/src/services/harness-worker.js +66 -0
  601. package/dist/src/services/headless-worker-executor.d.ts +358 -0
  602. package/dist/src/services/headless-worker-executor.js +1269 -0
  603. package/dist/src/services/index.d.ts +13 -0
  604. package/dist/src/services/index.js +11 -0
  605. package/dist/src/services/memory-backup.d.ts +53 -0
  606. package/dist/src/services/memory-backup.js +198 -0
  607. package/dist/src/services/memory-distillation.d.ts +41 -0
  608. package/dist/src/services/memory-distillation.js +277 -0
  609. package/dist/src/services/native-training.d.ts +68 -0
  610. package/dist/src/services/native-training.js +141 -0
  611. package/dist/src/services/registry-api.d.ts +58 -0
  612. package/dist/src/services/registry-api.js +146 -0
  613. package/dist/src/services/repo-supervisor.d.ts +70 -0
  614. package/dist/src/services/repo-supervisor.js +228 -0
  615. package/dist/src/services/ruvector-training.d.ts +222 -0
  616. package/dist/src/services/ruvector-training.js +693 -0
  617. package/dist/src/services/swarm-memory-branches.d.ts +135 -0
  618. package/dist/src/services/swarm-memory-branches.js +213 -0
  619. package/dist/src/services/weight-eft.d.ts +305 -0
  620. package/dist/src/services/weight-eft.js +296 -0
  621. package/dist/src/services/worker-daemon.d.ts +439 -0
  622. package/dist/src/services/worker-daemon.js +1865 -0
  623. package/dist/src/services/worker-queue.d.ts +194 -0
  624. package/dist/src/services/worker-queue.js +513 -0
  625. package/dist/src/services/workspace-lease.d.ts +55 -0
  626. package/dist/src/services/workspace-lease.js +191 -0
  627. package/dist/src/suggest.d.ts +53 -0
  628. package/dist/src/suggest.js +200 -0
  629. package/dist/src/transfer/anonymization/index.d.ts +25 -0
  630. package/dist/src/transfer/anonymization/index.js +175 -0
  631. package/dist/src/transfer/deploy-seraphine.d.ts +13 -0
  632. package/dist/src/transfer/deploy-seraphine.js +205 -0
  633. package/dist/src/transfer/export.d.ts +25 -0
  634. package/dist/src/transfer/export.js +113 -0
  635. package/dist/src/transfer/index.d.ts +12 -0
  636. package/dist/src/transfer/index.js +31 -0
  637. package/dist/src/transfer/ipfs/client.d.ts +109 -0
  638. package/dist/src/transfer/ipfs/client.js +307 -0
  639. package/dist/src/transfer/ipfs/upload.d.ts +95 -0
  640. package/dist/src/transfer/ipfs/upload.js +413 -0
  641. package/dist/src/transfer/models/seraphine.d.ts +72 -0
  642. package/dist/src/transfer/models/seraphine.js +373 -0
  643. package/dist/src/transfer/serialization/cfp.d.ts +49 -0
  644. package/dist/src/transfer/serialization/cfp.js +183 -0
  645. package/dist/src/transfer/storage/gcs.d.ts +82 -0
  646. package/dist/src/transfer/storage/gcs.js +272 -0
  647. package/dist/src/transfer/storage/index.d.ts +6 -0
  648. package/dist/src/transfer/storage/index.js +6 -0
  649. package/dist/src/transfer/store/discovery.d.ts +84 -0
  650. package/dist/src/transfer/store/discovery.js +382 -0
  651. package/dist/src/transfer/store/download.d.ts +70 -0
  652. package/dist/src/transfer/store/download.js +334 -0
  653. package/dist/src/transfer/store/index.d.ts +84 -0
  654. package/dist/src/transfer/store/index.js +153 -0
  655. package/dist/src/transfer/store/publish.d.ts +76 -0
  656. package/dist/src/transfer/store/publish.js +294 -0
  657. package/dist/src/transfer/store/registry.d.ts +58 -0
  658. package/dist/src/transfer/store/registry.js +285 -0
  659. package/dist/src/transfer/store/search.d.ts +54 -0
  660. package/dist/src/transfer/store/search.js +232 -0
  661. package/dist/src/transfer/store/tests/standalone-test.d.ts +12 -0
  662. package/dist/src/transfer/store/tests/standalone-test.js +190 -0
  663. package/dist/src/transfer/store/types.d.ts +193 -0
  664. package/dist/src/transfer/store/types.js +6 -0
  665. package/dist/src/transfer/test-seraphine.d.ts +6 -0
  666. package/dist/src/transfer/test-seraphine.js +105 -0
  667. package/dist/src/transfer/tests/test-store.d.ts +7 -0
  668. package/dist/src/transfer/tests/test-store.js +214 -0
  669. package/dist/src/transfer/types.d.ts +245 -0
  670. package/dist/src/transfer/types.js +6 -0
  671. package/dist/src/types.d.ts +13 -0
  672. package/dist/src/types.js +13 -0
  673. package/dist/src/update/checker.d.ts +34 -0
  674. package/dist/src/update/checker.js +191 -0
  675. package/dist/src/update/executor.d.ts +33 -0
  676. package/dist/src/update/executor.js +217 -0
  677. package/dist/src/update/index.d.ts +33 -0
  678. package/dist/src/update/index.js +64 -0
  679. package/dist/src/update/rate-limiter.d.ts +20 -0
  680. package/dist/src/update/rate-limiter.js +96 -0
  681. package/dist/src/update/validator.d.ts +17 -0
  682. package/dist/src/update/validator.js +123 -0
  683. package/package.json +1 -1
@@ -0,0 +1,347 @@
1
+ /**
2
+ * RVFA Ed25519 Code Signing -- Digital signatures for RVFA appliance files.
3
+ *
4
+ * Provides tamper detection and publisher identity verification using
5
+ * Ed25519 (RFC 8032) via Node.js native crypto. Zero external dependencies.
6
+ *
7
+ * @module @claude-flow/cli/appliance/rvfa-signing
8
+ */
9
+ import { generateKeyPairSync, createHash, sign, verify, createPublicKey, createPrivateKey, } from 'node:crypto';
10
+ import { readFile, writeFile, stat, chmod, mkdir } from 'node:fs/promises';
11
+ // ── Constants ────────────────────────────────────────────────
12
+ const PREAMBLE_SIZE = 12; // 4B magic + 4B version + 4B header_len
13
+ const SHA256_SIZE = 32;
14
+ const KEY_FILE_MODE = 0o600;
15
+ // ── Key Management ───────────────────────────────────────────
16
+ /** Compute the fingerprint of a public key: first 16 hex chars of its SHA256. */
17
+ function computeFingerprint(publicKeyPem) {
18
+ return createHash('sha256')
19
+ .update(publicKeyPem, 'utf-8')
20
+ .digest('hex')
21
+ .slice(0, 16);
22
+ }
23
+ /**
24
+ * Generate a new Ed25519 key pair for RVFA signing.
25
+ */
26
+ export async function generateKeyPair() {
27
+ const { publicKey, privateKey } = generateKeyPairSync('ed25519', {
28
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
29
+ privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
30
+ });
31
+ const pubBuf = Buffer.from(publicKey, 'utf-8');
32
+ const privBuf = Buffer.from(privateKey, 'utf-8');
33
+ const fingerprint = computeFingerprint(publicKey);
34
+ return { publicKey: pubBuf, privateKey: privBuf, fingerprint };
35
+ }
36
+ /**
37
+ * Save a key pair to disk as PEM files.
38
+ *
39
+ * @param keyPair The key pair to persist.
40
+ * @param dir Directory to write files into.
41
+ * @param name Base name for the key files (default: 'rvfa-signing').
42
+ * @returns Paths to the written public and private key files.
43
+ */
44
+ export async function saveKeyPair(keyPair, dir, name = 'rvfa-signing') {
45
+ await mkdir(dir, { recursive: true });
46
+ const pubPath = `${dir}/${name}.pub`;
47
+ const privPath = `${dir}/${name}.key`;
48
+ await writeFile(pubPath, keyPair.publicKey);
49
+ await writeFile(privPath, keyPair.privateKey, { mode: KEY_FILE_MODE });
50
+ // Ensure private key has restrictive permissions even on existing files
51
+ await chmod(privPath, KEY_FILE_MODE);
52
+ return { publicKeyPath: pubPath, privateKeyPath: privPath };
53
+ }
54
+ /**
55
+ * Load a key pair from PEM files on disk.
56
+ *
57
+ * @param dir Directory containing the key files.
58
+ * @param name Base name for the key files (default: 'rvfa-signing').
59
+ */
60
+ export async function loadKeyPair(dir, name = 'rvfa-signing') {
61
+ const pubPath = `${dir}/${name}.pub`;
62
+ const privPath = `${dir}/${name}.key`;
63
+ const publicKey = await readFile(pubPath);
64
+ const privateKey = await readFile(privPath);
65
+ // Warn if private key permissions are too open
66
+ const privStat = await stat(privPath);
67
+ const mode = privStat.mode & 0o777;
68
+ if (mode & 0o077) {
69
+ console.warn(`[rvfa-signing] WARNING: Private key ${privPath} has open permissions ` +
70
+ `(${mode.toString(8)}). Consider running: chmod 600 ${privPath}`);
71
+ }
72
+ const fingerprint = computeFingerprint(publicKey.toString('utf-8'));
73
+ return { publicKey, privateKey, fingerprint };
74
+ }
75
+ /**
76
+ * Load a public key from a single PEM file.
77
+ */
78
+ export async function loadPublicKey(path) {
79
+ return readFile(path);
80
+ }
81
+ // ── Internal Helpers ─────────────────────────────────────────
82
+ /**
83
+ * Recursively sort object keys for canonical JSON serialization.
84
+ * Produces deterministic output regardless of insertion order.
85
+ */
86
+ function canonicalJson(value) {
87
+ return JSON.stringify(value, (_key, val) => {
88
+ if (val !== null && typeof val === 'object' && !Array.isArray(val) && !Buffer.isBuffer(val)) {
89
+ const sorted = {};
90
+ for (const k of Object.keys(val).sort()) {
91
+ sorted[k] = val[k];
92
+ }
93
+ return sorted;
94
+ }
95
+ return val;
96
+ });
97
+ }
98
+ /**
99
+ * Parse an RVFA binary into its components without full validation.
100
+ * Returns the header object, header JSON bytes, section data region, and footer.
101
+ */
102
+ function parseRvfaBinary(buf) {
103
+ if (buf.length < PREAMBLE_SIZE + SHA256_SIZE) {
104
+ throw new Error('Buffer too small to be a valid RVFA file');
105
+ }
106
+ const magic = buf.subarray(0, 4).toString('ascii');
107
+ if (magic !== 'RVFA') {
108
+ throw new Error(`Invalid RVFA magic: expected "RVFA", got "${magic}"`);
109
+ }
110
+ const headerLen = buf.readUInt32LE(8);
111
+ const headerStart = PREAMBLE_SIZE;
112
+ const headerEnd = headerStart + headerLen;
113
+ if (headerEnd > buf.length - SHA256_SIZE) {
114
+ throw new Error('Header length extends beyond buffer');
115
+ }
116
+ const headerJson = buf.subarray(headerStart, headerEnd).toString('utf-8');
117
+ let header;
118
+ try {
119
+ header = JSON.parse(headerJson);
120
+ }
121
+ catch {
122
+ throw new Error('Failed to parse RVFA header JSON');
123
+ }
124
+ const footer = buf.subarray(buf.length - SHA256_SIZE);
125
+ const sectionData = buf.subarray(headerEnd, buf.length - SHA256_SIZE);
126
+ return { header, headerStart, headerEnd, sectionData, footer };
127
+ }
128
+ /**
129
+ * Compute the signing digest for an RVFA file.
130
+ *
131
+ * The digest is SHA256 of: canonical_header_json (without signature field)
132
+ * + section_data_bytes
133
+ * + footer_32_bytes
134
+ */
135
+ function computeSigningDigest(header, sectionData, footer) {
136
+ // Strip signature field from header for digest computation
137
+ const stripped = { ...header };
138
+ delete stripped.signature;
139
+ const canonical = Buffer.from(canonicalJson(stripped), 'utf-8');
140
+ return createHash('sha256')
141
+ .update(canonical)
142
+ .update(sectionData)
143
+ .update(footer)
144
+ .digest();
145
+ }
146
+ /** Convert a Buffer or PEM string into a KeyObject. */
147
+ function toPrivateKeyObject(key) {
148
+ const pem = Buffer.isBuffer(key) ? key.toString('utf-8') : key;
149
+ return createPrivateKey(pem);
150
+ }
151
+ /** Convert a Buffer or PEM string into a KeyObject. */
152
+ function toPublicKeyObject(key) {
153
+ const pem = Buffer.isBuffer(key) ? key.toString('utf-8') : key;
154
+ return createPublicKey(pem);
155
+ }
156
+ /**
157
+ * Rebuild the RVFA binary with an updated header.
158
+ *
159
+ * Preserves the original preamble version, recalculates header length,
160
+ * and keeps section data and footer intact.
161
+ */
162
+ function rebuildRvfa(originalBuf, newHeader, sectionData, footer) {
163
+ const headerJson = Buffer.from(JSON.stringify(newHeader), 'utf-8');
164
+ // Preamble: magic + version + new header length
165
+ const preamble = Buffer.alloc(PREAMBLE_SIZE);
166
+ originalBuf.copy(preamble, 0, 0, 8); // magic + version unchanged
167
+ preamble.writeUInt32LE(headerJson.length, 8);
168
+ return Buffer.concat([preamble, headerJson, sectionData, footer]);
169
+ }
170
+ // ── RvfaSigner ───────────────────────────────────────────────
171
+ /**
172
+ * Signs RVFA appliance files and data with Ed25519.
173
+ */
174
+ export class RvfaSigner {
175
+ keyObj;
176
+ fingerprint;
177
+ constructor(privateKey) {
178
+ this.keyObj = toPrivateKeyObject(privateKey);
179
+ // Derive public key to compute fingerprint
180
+ const pubPem = createPublicKey(this.keyObj)
181
+ .export({ type: 'spki', format: 'pem' });
182
+ this.fingerprint = computeFingerprint(pubPem);
183
+ }
184
+ /**
185
+ * Sign an RVFA appliance file in-place.
186
+ *
187
+ * Algorithm:
188
+ * 1. Read and parse the RVFA binary
189
+ * 2. Strip any existing signature from the header
190
+ * 3. Compute SHA256 of [canonical_header + section_data + footer]
191
+ * 4. Sign the digest with Ed25519
192
+ * 5. Embed signature metadata into the header
193
+ * 6. Write the updated binary back to the file
194
+ *
195
+ * @param rvfaPath Path to the .rvf appliance file.
196
+ * @param signedBy Optional publisher name.
197
+ * @returns The signature metadata that was embedded.
198
+ */
199
+ async signAppliance(rvfaPath, signedBy) {
200
+ const buf = await readFile(rvfaPath);
201
+ const { header, sectionData, footer } = parseRvfaBinary(buf);
202
+ // Compute digest over header (without signature) + sections + footer
203
+ const digest = computeSigningDigest(header, sectionData, footer);
204
+ // Ed25519 sign
205
+ const sig = sign(null, digest, this.keyObj);
206
+ const metadata = {
207
+ algorithm: 'ed25519',
208
+ publicKeyFingerprint: this.fingerprint,
209
+ signature: sig.toString('hex'),
210
+ signedAt: new Date().toISOString(),
211
+ signedBy,
212
+ scope: 'full',
213
+ };
214
+ // Embed signature in header and rebuild
215
+ header.signature = metadata;
216
+ const rebuilt = rebuildRvfa(buf, header, sectionData, footer);
217
+ await writeFile(rvfaPath, rebuilt);
218
+ return metadata;
219
+ }
220
+ /**
221
+ * Sign a section footer hash (detached signature).
222
+ *
223
+ * @param footerHash The 32-byte SHA256 footer hash from an RVFA file.
224
+ * @returns Hex-encoded Ed25519 signature.
225
+ */
226
+ async signSections(footerHash) {
227
+ if (footerHash.length !== SHA256_SIZE) {
228
+ throw new Error(`Footer hash must be ${SHA256_SIZE} bytes, got ${footerHash.length}`);
229
+ }
230
+ const sig = sign(null, footerHash, this.keyObj);
231
+ return sig.toString('hex');
232
+ }
233
+ /**
234
+ * Sign an RVFP patch file (detached signature).
235
+ *
236
+ * @param patchData The raw patch binary data.
237
+ * @returns Hex-encoded Ed25519 signature.
238
+ */
239
+ async signPatch(patchData) {
240
+ const digest = createHash('sha256').update(patchData).digest();
241
+ const sig = sign(null, digest, this.keyObj);
242
+ return sig.toString('hex');
243
+ }
244
+ }
245
+ // ── RvfaVerifier ─────────────────────────────────────────────
246
+ /**
247
+ * Verifies Ed25519 signatures on RVFA appliance files and data.
248
+ */
249
+ export class RvfaVerifier {
250
+ keyObj;
251
+ fingerprint;
252
+ constructor(publicKey) {
253
+ this.keyObj = toPublicKeyObject(publicKey);
254
+ const pem = Buffer.isBuffer(publicKey) ? publicKey.toString('utf-8') : publicKey;
255
+ this.fingerprint = computeFingerprint(pem);
256
+ }
257
+ /**
258
+ * Verify the Ed25519 signature embedded in an RVFA appliance file.
259
+ *
260
+ * @param rvfaPath Path to the .rvf appliance file.
261
+ * @returns Verification result with details and any errors.
262
+ */
263
+ async verifyAppliance(rvfaPath) {
264
+ const errors = [];
265
+ let buf;
266
+ try {
267
+ buf = await readFile(rvfaPath);
268
+ }
269
+ catch (err) {
270
+ return { valid: false, errors: [`Failed to read file: ${err.message}`] };
271
+ }
272
+ let parsed;
273
+ try {
274
+ parsed = parseRvfaBinary(buf);
275
+ }
276
+ catch (err) {
277
+ return { valid: false, errors: [`Invalid RVFA file: ${err.message}`] };
278
+ }
279
+ const { header, sectionData, footer } = parsed;
280
+ // Extract signature metadata from header
281
+ const sigRaw = header.signature;
282
+ if (!sigRaw || typeof sigRaw !== 'object') {
283
+ return { valid: false, errors: ['No signature found in RVFA header'] };
284
+ }
285
+ const sigMeta = sigRaw;
286
+ if (sigMeta.algorithm !== 'ed25519') {
287
+ errors.push(`Unsupported algorithm: ${String(sigMeta.algorithm)}`);
288
+ return { valid: false, errors };
289
+ }
290
+ if (typeof sigMeta.signature !== 'string' || !sigMeta.signature) {
291
+ errors.push('Signature field is missing or empty');
292
+ return { valid: false, errors };
293
+ }
294
+ // Recompute the digest the same way the signer did
295
+ const digest = computeSigningDigest(header, sectionData, footer);
296
+ // Verify
297
+ let sigBuf;
298
+ try {
299
+ sigBuf = Buffer.from(sigMeta.signature, 'hex');
300
+ }
301
+ catch {
302
+ errors.push('Signature is not valid hex');
303
+ return { valid: false, errors };
304
+ }
305
+ let valid;
306
+ try {
307
+ valid = verify(null, digest, this.keyObj, sigBuf);
308
+ }
309
+ catch (err) {
310
+ errors.push(`Verification error: ${err.message}`);
311
+ return { valid: false, errors };
312
+ }
313
+ if (!valid) {
314
+ errors.push('Ed25519 signature verification failed: data may be tampered');
315
+ }
316
+ return {
317
+ valid,
318
+ signerFingerprint: sigMeta.publicKeyFingerprint,
319
+ signedAt: sigMeta.signedAt,
320
+ signedBy: sigMeta.signedBy,
321
+ errors,
322
+ };
323
+ }
324
+ /**
325
+ * Verify a detached Ed25519 signature over arbitrary data.
326
+ *
327
+ * @param data The data that was signed.
328
+ * @param signature Hex-encoded Ed25519 signature.
329
+ */
330
+ async verifyDetached(data, signature) {
331
+ const digest = createHash('sha256').update(data).digest();
332
+ const sigBuf = Buffer.from(signature, 'hex');
333
+ return verify(null, digest, this.keyObj, sigBuf);
334
+ }
335
+ /**
336
+ * Verify an RVFP patch file signature.
337
+ *
338
+ * @param patchData The raw patch binary data.
339
+ * @param signature Hex-encoded Ed25519 signature.
340
+ */
341
+ async verifyPatch(patchData, signature) {
342
+ const digest = createHash('sha256').update(patchData).digest();
343
+ const sigBuf = Buffer.from(signature, 'hex');
344
+ return verify(null, digest, this.keyObj, sigBuf);
345
+ }
346
+ }
347
+ //# sourceMappingURL=rvfa-signing.js.map
@@ -0,0 +1,89 @@
1
+ /**
2
+ * `ruflo auth login` flow orchestration (ADR-306) — composes
3
+ * `@claude-flow/security`'s ported OAuth primitives (loopback PKCE, OOB
4
+ * manual-paste, refresh) the same way meta-proxy's `oauth/login.rs`
5
+ * orchestrates its own Rust primitives. See security-bridge.ts for why the
6
+ * package is loaded lazily, and oauth/client.ts (in @claude-flow/security)
7
+ * for why this targets the live `auth.cognitum.one` surface rather than
8
+ * ADR-308's unconfirmed `/v1/auth/*` spec.
9
+ *
10
+ * @module auth/client
11
+ */
12
+ import { type OAuthTokenResponse } from './security-bridge.js';
13
+ /** Refresh before there is less than one minute left on the access token. */
14
+ export declare const ACCESS_TOKEN_REFRESH_WINDOW_MS = 60000;
15
+ export interface LoginResult {
16
+ tokens: OAuthTokenResponse;
17
+ method: 'pkce' | 'device' | 'token-stdin';
18
+ }
19
+ /**
20
+ * Best-effort headlessness signal — a false negative just means the browser
21
+ * flow is attempted and a real browser opens fine anyway; a false positive
22
+ * means the user falls back to the manual OOB flow, which always works
23
+ * regardless. Mirrors meta-proxy's `login.rs::is_probably_headless()`.
24
+ */
25
+ export declare function isProbablyHeadless(): boolean;
26
+ /**
27
+ * Validates the OAuth callback params against the request that started the
28
+ * flow — the CSRF-critical step, extracted so it's independently testable.
29
+ * Order matters: an explicit `error` (user denied) and a missing code are
30
+ * reported as their own reasons; a missing or mismatched `state` is always
31
+ * a state-mismatch, even when a code is present.
32
+ */
33
+ export declare function validateCallback(error: string | null, code: string | null, returnedState: string | null, expectedState: string): {
34
+ ok: true;
35
+ code: string;
36
+ } | {
37
+ ok: false;
38
+ reason: 'denied' | 'state-mismatch';
39
+ detail?: string;
40
+ };
41
+ export declare class LoginCancelledError extends Error {
42
+ constructor();
43
+ }
44
+ export declare class LoginDeniedError extends Error {
45
+ constructor(detail: string);
46
+ }
47
+ export declare class StateMismatchError extends Error {
48
+ constructor();
49
+ }
50
+ export declare class NotLoggedInError extends Error {
51
+ constructor(profile: string);
52
+ }
53
+ export declare class SessionOnlyExpiredError extends Error {
54
+ constructor(profile: string);
55
+ }
56
+ export declare class ScopeConsentMismatchError extends Error {
57
+ constructor(profile: string, scopes: string[]);
58
+ }
59
+ /** Browser-based loopback PKCE login — the ADR-306 default for an interactive desktop. */
60
+ export declare function browserLogin(print: (line: string) => void): Promise<LoginResult>;
61
+ /** Headless fallback: prints the authorize URL with the OOB redirect, prompts for the pasted code. */
62
+ export declare function manualLogin(print: (line: string) => void, input?: NodeJS.ReadableStream): Promise<LoginResult>;
63
+ /**
64
+ * `--token-stdin`: reads one JSON object from stdin,
65
+ * `{access_token, refresh_token?, expires_in, scope}`. Wire format is not
66
+ * specified by ADR-306 — defined here as typed JSON rather than a bare
67
+ * token string, so scope/expiry are explicit rather than inferred.
68
+ */
69
+ export declare function tokenStdinLogin(input?: NodeJS.ReadableStream): Promise<LoginResult>;
70
+ /**
71
+ * Refreshes an access token. Classifies failure into network-unreachable
72
+ * vs. a reachable-but-erroring server so callers can print an honest
73
+ * message instead of collapsing both into "offline" (ADR-308 failure
74
+ * policy: local ruflo functionality is never affected by auth being
75
+ * unavailable, but the diagnostic should say WHY it's unavailable).
76
+ */
77
+ export declare function refreshAccessToken(refreshTokenValue: string): Promise<OAuthTokenResponse>;
78
+ /**
79
+ * Returns an access token suitable for an authenticated call.
80
+ *
81
+ * Fast path: a process-memory token with more than one minute remaining.
82
+ * Slow path: load the profile's refresh token from the OS keychain, perform
83
+ * one refresh, persist a rotated refresh token BEFORE exposing the new access
84
+ * token, then update metadata and the process cache. Refresh is deliberately
85
+ * demand-driven: offline-safe commands such as plain `auth status` never call
86
+ * this function and therefore never create background traffic or retry loops.
87
+ */
88
+ export declare function getValidAccessToken(profileName?: string): Promise<string>;
89
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1,242 @@
1
+ /**
2
+ * `ruflo auth login` flow orchestration (ADR-306) — composes
3
+ * `@claude-flow/security`'s ported OAuth primitives (loopback PKCE, OOB
4
+ * manual-paste, refresh) the same way meta-proxy's `oauth/login.rs`
5
+ * orchestrates its own Rust primitives. See security-bridge.ts for why the
6
+ * package is loaded lazily, and oauth/client.ts (in @claude-flow/security)
7
+ * for why this targets the live `auth.cognitum.one` surface rather than
8
+ * ADR-308's unconfirmed `/v1/auth/*` spec.
9
+ *
10
+ * @module auth/client
11
+ */
12
+ import * as readline from 'node:readline/promises';
13
+ import { existsSync } from 'node:fs';
14
+ import { loadSecurityOAuth } from './security-bridge.js';
15
+ import { KEYCHAIN_SERVICE } from './constants.js';
16
+ import { getProfile, setProfile } from './state.js';
17
+ import { getSessionToken, setSessionToken } from './session.js';
18
+ import { hasConsent } from '../funnel/index.js';
19
+ import { domainForScope } from './scopes.js';
20
+ /** Refresh before there is less than one minute left on the access token. */
21
+ export const ACCESS_TOKEN_REFRESH_WINDOW_MS = 60_000;
22
+ /**
23
+ * Best-effort headlessness signal — a false negative just means the browser
24
+ * flow is attempted and a real browser opens fine anyway; a false positive
25
+ * means the user falls back to the manual OOB flow, which always works
26
+ * regardless. Mirrors meta-proxy's `login.rs::is_probably_headless()`.
27
+ */
28
+ export function isProbablyHeadless() {
29
+ return Boolean(process.env.SSH_CONNECTION || process.env.SSH_TTY || process.env.CONTAINER || existsDockerEnv());
30
+ }
31
+ function existsDockerEnv() {
32
+ try {
33
+ return existsSync('/.dockerenv');
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ /**
40
+ * Validates the OAuth callback params against the request that started the
41
+ * flow — the CSRF-critical step, extracted so it's independently testable.
42
+ * Order matters: an explicit `error` (user denied) and a missing code are
43
+ * reported as their own reasons; a missing or mismatched `state` is always
44
+ * a state-mismatch, even when a code is present.
45
+ */
46
+ export function validateCallback(error, code, returnedState, expectedState) {
47
+ if (error)
48
+ return { ok: false, reason: 'denied', detail: error };
49
+ if (!code)
50
+ return { ok: false, reason: 'denied', detail: 'no authorization code received' };
51
+ if (!returnedState || returnedState !== expectedState)
52
+ return { ok: false, reason: 'state-mismatch' };
53
+ return { ok: true, code };
54
+ }
55
+ export class LoginCancelledError extends Error {
56
+ constructor() {
57
+ super('login cancelled: no code was entered');
58
+ this.name = 'LoginCancelledError';
59
+ }
60
+ }
61
+ export class LoginDeniedError extends Error {
62
+ constructor(detail) {
63
+ super(`authorization was denied or failed: ${detail}`);
64
+ this.name = 'LoginDeniedError';
65
+ }
66
+ }
67
+ export class StateMismatchError extends Error {
68
+ constructor() {
69
+ super('state mismatch — the OAuth callback did not match the request this CLI sent');
70
+ this.name = 'StateMismatchError';
71
+ }
72
+ }
73
+ export class NotLoggedInError extends Error {
74
+ constructor(profile) {
75
+ super(`not logged in for profile "${profile}" — run: ruflo auth login --profile ${profile}`);
76
+ this.name = 'NotLoggedInError';
77
+ }
78
+ }
79
+ export class SessionOnlyExpiredError extends Error {
80
+ constructor(profile) {
81
+ super(`profile "${profile}" has no persisted refresh token and its in-memory access token is ` +
82
+ `absent or expiring — run: ruflo auth login --profile ${profile}`);
83
+ this.name = 'SessionOnlyExpiredError';
84
+ }
85
+ }
86
+ export class ScopeConsentMismatchError extends Error {
87
+ constructor(profile, scopes) {
88
+ super(`profile "${profile}" has scope(s) without matching local consent: ${scopes.join(', ')} — ` +
89
+ 'authenticated capability denied');
90
+ this.name = 'ScopeConsentMismatchError';
91
+ }
92
+ }
93
+ /** Browser-based loopback PKCE login — the ADR-306 default for an interactive desktop. */
94
+ export async function browserLogin(print) {
95
+ const sec = await loadSecurityOAuth();
96
+ const server = await sec.CallbackServer.bind();
97
+ const pkce = sec.generatePkce();
98
+ const url = sec.authorizeUrl(server.redirectUri, pkce.state, pkce.codeChallenge);
99
+ print('Opening your browser to sign in to Cognitum...');
100
+ print(`If it doesn't open automatically, visit:\n\n ${url}\n`);
101
+ await sec.openBrowser(url).catch(() => { }); // best-effort — the URL above is always the fallback
102
+ print('Waiting for you to finish signing in...');
103
+ const result = await server.awaitCallback();
104
+ const validated = validateCallback(result.error, result.code, result.state, pkce.state);
105
+ if (!validated.ok) {
106
+ if (validated.reason === 'state-mismatch')
107
+ throw new StateMismatchError();
108
+ throw new LoginDeniedError(validated.detail ?? 'unknown');
109
+ }
110
+ const tokens = await sec.exchangeCode(validated.code, pkce.codeVerifier, server.redirectUri);
111
+ return { tokens, method: 'pkce' };
112
+ }
113
+ /** Headless fallback: prints the authorize URL with the OOB redirect, prompts for the pasted code. */
114
+ export async function manualLogin(print, input = process.stdin) {
115
+ const sec = await loadSecurityOAuth();
116
+ print('Browser-based callback unavailable (SSH/container detected, or --no-browser).\n');
117
+ const pkce = sec.generatePkce();
118
+ const url = sec.authorizeUrl(sec.OOB_REDIRECT_URI, pkce.state, pkce.codeChallenge);
119
+ print(`Open this URL in a browser and authorize:\n\n ${url}\n`);
120
+ // `rl.question()` resolves on a newline-terminated 'line' event — if `input`
121
+ // ends without ever emitting one (e.g. stdin closed early, or piped input
122
+ // with no trailing newline), it hangs forever rather than treating EOF as
123
+ // a cancellation. Race it against the interface's own 'close' event so an
124
+ // early EOF resolves to "" (-> LoginCancelledError below) instead of hanging.
125
+ const rl = readline.createInterface({ input, terminal: false });
126
+ let code;
127
+ try {
128
+ const closed = new Promise((resolve) => rl.once('close', () => resolve('')));
129
+ code = (await Promise.race([rl.question('Paste the code shown after authorizing: '), closed])).trim();
130
+ }
131
+ finally {
132
+ rl.close();
133
+ }
134
+ if (!code)
135
+ throw new LoginCancelledError();
136
+ const tokens = await sec.exchangeManualCode(code, pkce.codeVerifier);
137
+ return { tokens, method: 'device' };
138
+ }
139
+ /**
140
+ * `--token-stdin`: reads one JSON object from stdin,
141
+ * `{access_token, refresh_token?, expires_in, scope}`. Wire format is not
142
+ * specified by ADR-306 — defined here as typed JSON rather than a bare
143
+ * token string, so scope/expiry are explicit rather than inferred.
144
+ */
145
+ export async function tokenStdinLogin(input = process.stdin) {
146
+ const chunks = [];
147
+ for await (const chunk of input)
148
+ chunks.push(chunk);
149
+ const raw = Buffer.concat(chunks).toString('utf-8').trim();
150
+ if (!raw)
151
+ throw new Error('--token-stdin: no input received on stdin');
152
+ let parsed;
153
+ try {
154
+ parsed = JSON.parse(raw);
155
+ }
156
+ catch {
157
+ throw new Error('--token-stdin expects a single JSON object: {"access_token","refresh_token"?,"expires_in","scope"}');
158
+ }
159
+ if (!parsed.access_token)
160
+ throw new Error('--token-stdin: JSON is missing required field "access_token"');
161
+ const tokens = {
162
+ access_token: parsed.access_token,
163
+ token_type: 'Bearer',
164
+ refresh_token: parsed.refresh_token,
165
+ expires_in: parsed.expires_in,
166
+ };
167
+ return { tokens, method: 'token-stdin' };
168
+ }
169
+ /**
170
+ * Refreshes an access token. Classifies failure into network-unreachable
171
+ * vs. a reachable-but-erroring server so callers can print an honest
172
+ * message instead of collapsing both into "offline" (ADR-308 failure
173
+ * policy: local ruflo functionality is never affected by auth being
174
+ * unavailable, but the diagnostic should say WHY it's unavailable).
175
+ */
176
+ export async function refreshAccessToken(refreshTokenValue) {
177
+ const sec = await loadSecurityOAuth();
178
+ try {
179
+ return await sec.refreshToken(refreshTokenValue);
180
+ }
181
+ catch (e) {
182
+ if (e instanceof sec.OAuthError) {
183
+ if (e.code === 'network') {
184
+ throw new Error('Could not reach the Cognitum auth service. ruflo core functionality is unaffected — ' +
185
+ 'sign-in is not required for local use.');
186
+ }
187
+ throw new Error(`Cognitum auth service returned an unexpected response: ${e.message}`);
188
+ }
189
+ throw e;
190
+ }
191
+ }
192
+ /**
193
+ * Returns an access token suitable for an authenticated call.
194
+ *
195
+ * Fast path: a process-memory token with more than one minute remaining.
196
+ * Slow path: load the profile's refresh token from the OS keychain, perform
197
+ * one refresh, persist a rotated refresh token BEFORE exposing the new access
198
+ * token, then update metadata and the process cache. Refresh is deliberately
199
+ * demand-driven: offline-safe commands such as plain `auth status` never call
200
+ * this function and therefore never create background traffic or retry loops.
201
+ */
202
+ export async function getValidAccessToken(profileName = 'default') {
203
+ const profile = getProfile(profileName);
204
+ if (!profile)
205
+ throw new NotLoggedInError(profileName);
206
+ const scopesWithoutConsent = profile.scopes.filter((scope) => {
207
+ const domain = domainForScope(scope);
208
+ return domain !== undefined && !hasConsent(domain);
209
+ });
210
+ if (scopesWithoutConsent.length > 0) {
211
+ throw new ScopeConsentMismatchError(profileName, scopesWithoutConsent);
212
+ }
213
+ const cached = getSessionToken(profileName, ACCESS_TOKEN_REFRESH_WINDOW_MS);
214
+ if (cached)
215
+ return cached;
216
+ if (!profile.keychainRef)
217
+ throw new SessionOnlyExpiredError(profileName);
218
+ const sec = await loadSecurityOAuth();
219
+ const keychain = await sec.createKeychainAdapter();
220
+ const refreshTokenValue = await keychain.getSecret(KEYCHAIN_SERVICE, profile.keychainRef);
221
+ if (!refreshTokenValue)
222
+ throw new SessionOnlyExpiredError(profileName);
223
+ const refreshed = await refreshAccessToken(refreshTokenValue);
224
+ if (!refreshed.access_token)
225
+ throw new Error('Cognitum refresh response did not contain an access token');
226
+ // Cognitum rotates refresh tokens with reuse detection. Commit the rotated
227
+ // credential first; if this write fails, do not publish/cache the access
228
+ // token and do not retry the already-spent old refresh token here.
229
+ if (refreshed.refresh_token) {
230
+ await keychain.setSecret(KEYCHAIN_SERVICE, profile.keychainRef, refreshed.refresh_token);
231
+ }
232
+ const expiresAtMs = Date.now() + Math.max(0, refreshed.expires_in ?? 0) * 1000;
233
+ setSessionToken(profileName, refreshed.access_token, expiresAtMs);
234
+ setProfile(profileName, {
235
+ ...profile,
236
+ accountId: refreshed.account_email ?? profile.accountId,
237
+ accessTokenExpiresAt: new Date(expiresAtMs).toISOString(),
238
+ linkedAt: new Date().toISOString(),
239
+ });
240
+ return refreshed.access_token;
241
+ }
242
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Shared ADR-306 constants — split out so `commands/auth.ts` and
3
+ * `auth/client.ts` reference the same keychain service name rather than two
4
+ * independently-typed string literals that could silently drift apart.
5
+ */
6
+ export declare const KEYCHAIN_SERVICE = "ruflo-cognitum-auth";
7
+ //# sourceMappingURL=constants.d.ts.map