@nac3/forge-cli 0.2.0-alpha.1

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 (561) hide show
  1. package/LICENSE +45 -0
  2. package/README.md +371 -0
  3. package/dist/bin/yf.d.ts +5 -0
  4. package/dist/bin/yf.d.ts.map +1 -0
  5. package/dist/bin/yf.js +86 -0
  6. package/dist/bin/yf.js.map +1 -0
  7. package/dist/chat/claude.d.ts +100 -0
  8. package/dist/chat/claude.d.ts.map +1 -0
  9. package/dist/chat/claude.js +228 -0
  10. package/dist/chat/claude.js.map +1 -0
  11. package/dist/chat/ingest_session.d.ts +97 -0
  12. package/dist/chat/ingest_session.d.ts.map +1 -0
  13. package/dist/chat/ingest_session.js +99 -0
  14. package/dist/chat/ingest_session.js.map +1 -0
  15. package/dist/chat/panel.d.ts +15 -0
  16. package/dist/chat/panel.d.ts.map +1 -0
  17. package/dist/chat/panel.js +1526 -0
  18. package/dist/chat/panel.js.map +1 -0
  19. package/dist/chat/persistence.d.ts +37 -0
  20. package/dist/chat/persistence.d.ts.map +1 -0
  21. package/dist/chat/persistence.js +91 -0
  22. package/dist/chat/persistence.js.map +1 -0
  23. package/dist/chat/server.d.ts +34 -0
  24. package/dist/chat/server.d.ts.map +1 -0
  25. package/dist/chat/server.js +1540 -0
  26. package/dist/chat/server.js.map +1 -0
  27. package/dist/chat/spec_extract.d.ts +35 -0
  28. package/dist/chat/spec_extract.d.ts.map +1 -0
  29. package/dist/chat/spec_extract.js +152 -0
  30. package/dist/chat/spec_extract.js.map +1 -0
  31. package/dist/chat/spec_plan.d.ts +65 -0
  32. package/dist/chat/spec_plan.d.ts.map +1 -0
  33. package/dist/chat/spec_plan.js +160 -0
  34. package/dist/chat/spec_plan.js.map +1 -0
  35. package/dist/chat/spec_scaffold.d.ts +95 -0
  36. package/dist/chat/spec_scaffold.d.ts.map +1 -0
  37. package/dist/chat/spec_scaffold.js +220 -0
  38. package/dist/chat/spec_scaffold.js.map +1 -0
  39. package/dist/chat/tools/git.d.ts +59 -0
  40. package/dist/chat/tools/git.d.ts.map +1 -0
  41. package/dist/chat/tools/git.js +313 -0
  42. package/dist/chat/tools/git.js.map +1 -0
  43. package/dist/chat/tools/github.d.ts +59 -0
  44. package/dist/chat/tools/github.d.ts.map +1 -0
  45. package/dist/chat/tools/github.js +310 -0
  46. package/dist/chat/tools/github.js.map +1 -0
  47. package/dist/chat/tools/lifecycle.d.ts +82 -0
  48. package/dist/chat/tools/lifecycle.d.ts.map +1 -0
  49. package/dist/chat/tools/lifecycle.js +295 -0
  50. package/dist/chat/tools/lifecycle.js.map +1 -0
  51. package/dist/chat/tools/manual.d.ts +26 -0
  52. package/dist/chat/tools/manual.d.ts.map +1 -0
  53. package/dist/chat/tools/manual.js +164 -0
  54. package/dist/chat/tools/manual.js.map +1 -0
  55. package/dist/chat/tools/reader.d.ts +80 -0
  56. package/dist/chat/tools/reader.d.ts.map +1 -0
  57. package/dist/chat/tools/reader.js +471 -0
  58. package/dist/chat/tools/reader.js.map +1 -0
  59. package/dist/chat/tools.d.ts +106 -0
  60. package/dist/chat/tools.d.ts.map +1 -0
  61. package/dist/chat/tools.js +587 -0
  62. package/dist/chat/tools.js.map +1 -0
  63. package/dist/codegen/e2e.d.ts +106 -0
  64. package/dist/codegen/e2e.d.ts.map +1 -0
  65. package/dist/codegen/e2e.js +931 -0
  66. package/dist/codegen/e2e.js.map +1 -0
  67. package/dist/codegen/v3_flow_emit.d.ts +70 -0
  68. package/dist/codegen/v3_flow_emit.d.ts.map +1 -0
  69. package/dist/codegen/v3_flow_emit.js +225 -0
  70. package/dist/codegen/v3_flow_emit.js.map +1 -0
  71. package/dist/commands/_stub.d.ts +2 -0
  72. package/dist/commands/_stub.d.ts.map +1 -0
  73. package/dist/commands/_stub.js +21 -0
  74. package/dist/commands/_stub.js.map +1 -0
  75. package/dist/commands/app.d.ts +31 -0
  76. package/dist/commands/app.d.ts.map +1 -0
  77. package/dist/commands/app.js +331 -0
  78. package/dist/commands/app.js.map +1 -0
  79. package/dist/commands/chat.d.ts +18 -0
  80. package/dist/commands/chat.d.ts.map +1 -0
  81. package/dist/commands/chat.js +76 -0
  82. package/dist/commands/chat.js.map +1 -0
  83. package/dist/commands/deploy.d.ts +21 -0
  84. package/dist/commands/deploy.d.ts.map +1 -0
  85. package/dist/commands/deploy.js +121 -0
  86. package/dist/commands/deploy.js.map +1 -0
  87. package/dist/commands/doctor.d.ts +14 -0
  88. package/dist/commands/doctor.d.ts.map +1 -0
  89. package/dist/commands/doctor.js +280 -0
  90. package/dist/commands/doctor.js.map +1 -0
  91. package/dist/commands/figma.d.ts +32 -0
  92. package/dist/commands/figma.d.ts.map +1 -0
  93. package/dist/commands/figma.js +141 -0
  94. package/dist/commands/figma.js.map +1 -0
  95. package/dist/commands/gen-flow-tests.d.ts +8 -0
  96. package/dist/commands/gen-flow-tests.d.ts.map +1 -0
  97. package/dist/commands/gen-flow-tests.js +78 -0
  98. package/dist/commands/gen-flow-tests.js.map +1 -0
  99. package/dist/commands/gen-tests.d.ts +9 -0
  100. package/dist/commands/gen-tests.d.ts.map +1 -0
  101. package/dist/commands/gen-tests.js +118 -0
  102. package/dist/commands/gen-tests.js.map +1 -0
  103. package/dist/commands/license.d.ts +14 -0
  104. package/dist/commands/license.d.ts.map +1 -0
  105. package/dist/commands/license.js +182 -0
  106. package/dist/commands/license.js.map +1 -0
  107. package/dist/commands/log.d.ts +19 -0
  108. package/dist/commands/log.d.ts.map +1 -0
  109. package/dist/commands/log.js +101 -0
  110. package/dist/commands/log.js.map +1 -0
  111. package/dist/commands/migrate.d.ts +118 -0
  112. package/dist/commands/migrate.d.ts.map +1 -0
  113. package/dist/commands/migrate.js +1410 -0
  114. package/dist/commands/migrate.js.map +1 -0
  115. package/dist/commands/mobile.d.ts +27 -0
  116. package/dist/commands/mobile.d.ts.map +1 -0
  117. package/dist/commands/mobile.js +90 -0
  118. package/dist/commands/mobile.js.map +1 -0
  119. package/dist/commands/new.d.ts +32 -0
  120. package/dist/commands/new.d.ts.map +1 -0
  121. package/dist/commands/new.js +107 -0
  122. package/dist/commands/new.js.map +1 -0
  123. package/dist/commands/pilot.d.ts +8 -0
  124. package/dist/commands/pilot.d.ts.map +1 -0
  125. package/dist/commands/pilot.js +104 -0
  126. package/dist/commands/pilot.js.map +1 -0
  127. package/dist/commands/projects.d.ts +21 -0
  128. package/dist/commands/projects.d.ts.map +1 -0
  129. package/dist/commands/projects.js +238 -0
  130. package/dist/commands/projects.js.map +1 -0
  131. package/dist/commands/publish.d.ts +35 -0
  132. package/dist/commands/publish.d.ts.map +1 -0
  133. package/dist/commands/publish.js +194 -0
  134. package/dist/commands/publish.js.map +1 -0
  135. package/dist/commands/repo.d.ts +59 -0
  136. package/dist/commands/repo.d.ts.map +1 -0
  137. package/dist/commands/repo.js +178 -0
  138. package/dist/commands/repo.js.map +1 -0
  139. package/dist/commands/review-screens.d.ts +28 -0
  140. package/dist/commands/review-screens.d.ts.map +1 -0
  141. package/dist/commands/review-screens.js +345 -0
  142. package/dist/commands/review-screens.js.map +1 -0
  143. package/dist/commands/scenarios.d.ts +23 -0
  144. package/dist/commands/scenarios.d.ts.map +1 -0
  145. package/dist/commands/scenarios.js +304 -0
  146. package/dist/commands/scenarios.js.map +1 -0
  147. package/dist/commands/ship.d.ts +18 -0
  148. package/dist/commands/ship.d.ts.map +1 -0
  149. package/dist/commands/ship.js +41 -0
  150. package/dist/commands/ship.js.map +1 -0
  151. package/dist/commands/test.d.ts +29 -0
  152. package/dist/commands/test.d.ts.map +1 -0
  153. package/dist/commands/test.js +62 -0
  154. package/dist/commands/test.js.map +1 -0
  155. package/dist/commands/tunnel.d.ts +22 -0
  156. package/dist/commands/tunnel.d.ts.map +1 -0
  157. package/dist/commands/tunnel.js +77 -0
  158. package/dist/commands/tunnel.js.map +1 -0
  159. package/dist/commands/validate.d.ts +14 -0
  160. package/dist/commands/validate.d.ts.map +1 -0
  161. package/dist/commands/validate.js +51 -0
  162. package/dist/commands/validate.js.map +1 -0
  163. package/dist/commands/vault.d.ts +32 -0
  164. package/dist/commands/vault.d.ts.map +1 -0
  165. package/dist/commands/vault.js +489 -0
  166. package/dist/commands/vault.js.map +1 -0
  167. package/dist/commands/voice.d.ts +16 -0
  168. package/dist/commands/voice.d.ts.map +1 -0
  169. package/dist/commands/voice.js +69 -0
  170. package/dist/commands/voice.js.map +1 -0
  171. package/dist/core/cascade_router.d.ts +90 -0
  172. package/dist/core/cascade_router.d.ts.map +1 -0
  173. package/dist/core/cascade_router.js +131 -0
  174. package/dist/core/cascade_router.js.map +1 -0
  175. package/dist/core/cf_tunnel.d.ts +52 -0
  176. package/dist/core/cf_tunnel.d.ts.map +1 -0
  177. package/dist/core/cf_tunnel.js +134 -0
  178. package/dist/core/cf_tunnel.js.map +1 -0
  179. package/dist/core/gha_dispatcher.d.ts +48 -0
  180. package/dist/core/gha_dispatcher.d.ts.map +1 -0
  181. package/dist/core/gha_dispatcher.js +198 -0
  182. package/dist/core/gha_dispatcher.js.map +1 -0
  183. package/dist/core/logger.d.ts +89 -0
  184. package/dist/core/logger.d.ts.map +1 -0
  185. package/dist/core/logger.js +245 -0
  186. package/dist/core/logger.js.map +1 -0
  187. package/dist/core/mode.d.ts +26 -0
  188. package/dist/core/mode.d.ts.map +1 -0
  189. package/dist/core/mode.js +122 -0
  190. package/dist/core/mode.js.map +1 -0
  191. package/dist/core/pairing.d.ts +40 -0
  192. package/dist/core/pairing.d.ts.map +1 -0
  193. package/dist/core/pairing.js +145 -0
  194. package/dist/core/pairing.js.map +1 -0
  195. package/dist/core/pilot_setup.d.ts +29 -0
  196. package/dist/core/pilot_setup.d.ts.map +1 -0
  197. package/dist/core/pilot_setup.js +119 -0
  198. package/dist/core/pilot_setup.js.map +1 -0
  199. package/dist/core/polar.d.ts +81 -0
  200. package/dist/core/polar.d.ts.map +1 -0
  201. package/dist/core/polar.js +175 -0
  202. package/dist/core/polar.js.map +1 -0
  203. package/dist/core/project_picker.d.ts +56 -0
  204. package/dist/core/project_picker.d.ts.map +1 -0
  205. package/dist/core/project_picker.js +86 -0
  206. package/dist/core/project_picker.js.map +1 -0
  207. package/dist/core/projects.d.ts +58 -0
  208. package/dist/core/projects.d.ts.map +1 -0
  209. package/dist/core/projects.js +146 -0
  210. package/dist/core/projects.js.map +1 -0
  211. package/dist/core/projects_sync.d.ts +80 -0
  212. package/dist/core/projects_sync.d.ts.map +1 -0
  213. package/dist/core/projects_sync.js +278 -0
  214. package/dist/core/projects_sync.js.map +1 -0
  215. package/dist/core/remote_runner.d.ts +70 -0
  216. package/dist/core/remote_runner.d.ts.map +1 -0
  217. package/dist/core/remote_runner.js +133 -0
  218. package/dist/core/remote_runner.js.map +1 -0
  219. package/dist/core/repo_state.d.ts +24 -0
  220. package/dist/core/repo_state.d.ts.map +1 -0
  221. package/dist/core/repo_state.js +109 -0
  222. package/dist/core/repo_state.js.map +1 -0
  223. package/dist/core/target.d.ts +31 -0
  224. package/dist/core/target.d.ts.map +1 -0
  225. package/dist/core/target.js +121 -0
  226. package/dist/core/target.js.map +1 -0
  227. package/dist/deploy/aws.d.ts +43 -0
  228. package/dist/deploy/aws.d.ts.map +1 -0
  229. package/dist/deploy/aws.js +173 -0
  230. package/dist/deploy/aws.js.map +1 -0
  231. package/dist/figma/api.d.ts +35 -0
  232. package/dist/figma/api.d.ts.map +1 -0
  233. package/dist/figma/api.js +40 -0
  234. package/dist/figma/api.js.map +1 -0
  235. package/dist/figma/decorator.d.ts +74 -0
  236. package/dist/figma/decorator.d.ts.map +1 -0
  237. package/dist/figma/decorator.js +210 -0
  238. package/dist/figma/decorator.js.map +1 -0
  239. package/dist/figma/heuristics.d.ts +29 -0
  240. package/dist/figma/heuristics.d.ts.map +1 -0
  241. package/dist/figma/heuristics.js +110 -0
  242. package/dist/figma/heuristics.js.map +1 -0
  243. package/dist/figma/normalize.d.ts +33 -0
  244. package/dist/figma/normalize.d.ts.map +1 -0
  245. package/dist/figma/normalize.js +101 -0
  246. package/dist/figma/normalize.js.map +1 -0
  247. package/dist/figma/tokens.d.ts +23 -0
  248. package/dist/figma/tokens.d.ts.map +1 -0
  249. package/dist/figma/tokens.js +111 -0
  250. package/dist/figma/tokens.js.map +1 -0
  251. package/dist/figma/types.d.ts +118 -0
  252. package/dist/figma/types.d.ts.map +1 -0
  253. package/dist/figma/types.js +12 -0
  254. package/dist/figma/types.js.map +1 -0
  255. package/dist/i18n/index.d.ts +48 -0
  256. package/dist/i18n/index.d.ts.map +1 -0
  257. package/dist/i18n/index.js +135 -0
  258. package/dist/i18n/index.js.map +1 -0
  259. package/dist/i18n/types.d.ts +52 -0
  260. package/dist/i18n/types.d.ts.map +1 -0
  261. package/dist/i18n/types.js +85 -0
  262. package/dist/i18n/types.js.map +1 -0
  263. package/dist/index.d.ts +12 -0
  264. package/dist/index.d.ts.map +1 -0
  265. package/dist/index.js +11 -0
  266. package/dist/index.js.map +1 -0
  267. package/dist/lan/mdns_packet.d.ts +74 -0
  268. package/dist/lan/mdns_packet.d.ts.map +1 -0
  269. package/dist/lan/mdns_packet.js +247 -0
  270. package/dist/lan/mdns_packet.js.map +1 -0
  271. package/dist/lan/mdns_service.d.ts +102 -0
  272. package/dist/lan/mdns_service.d.ts.map +1 -0
  273. package/dist/lan/mdns_service.js +206 -0
  274. package/dist/lan/mdns_service.js.map +1 -0
  275. package/dist/license/activate.d.ts +33 -0
  276. package/dist/license/activate.d.ts.map +1 -0
  277. package/dist/license/activate.js +135 -0
  278. package/dist/license/activate.js.map +1 -0
  279. package/dist/license/fingerprint.d.ts +2 -0
  280. package/dist/license/fingerprint.d.ts.map +1 -0
  281. package/dist/license/fingerprint.js +29 -0
  282. package/dist/license/fingerprint.js.map +1 -0
  283. package/dist/license/hito4_client.d.ts +24 -0
  284. package/dist/license/hito4_client.d.ts.map +1 -0
  285. package/dist/license/hito4_client.js +103 -0
  286. package/dist/license/hito4_client.js.map +1 -0
  287. package/dist/license/index.d.ts +22 -0
  288. package/dist/license/index.d.ts.map +1 -0
  289. package/dist/license/index.js +125 -0
  290. package/dist/license/index.js.map +1 -0
  291. package/dist/license/types.d.ts +38 -0
  292. package/dist/license/types.d.ts.map +1 -0
  293. package/dist/license/types.js +9 -0
  294. package/dist/license/types.js.map +1 -0
  295. package/dist/migrate/ai-apply.d.ts +198 -0
  296. package/dist/migrate/ai-apply.d.ts.map +1 -0
  297. package/dist/migrate/ai-apply.js +833 -0
  298. package/dist/migrate/ai-apply.js.map +1 -0
  299. package/dist/migrate/ai-decorator.d.ts +87 -0
  300. package/dist/migrate/ai-decorator.d.ts.map +1 -0
  301. package/dist/migrate/ai-decorator.js +203 -0
  302. package/dist/migrate/ai-decorator.js.map +1 -0
  303. package/dist/migrate/apply.d.ts +28 -0
  304. package/dist/migrate/apply.d.ts.map +1 -0
  305. package/dist/migrate/apply.js +119 -0
  306. package/dist/migrate/apply.js.map +1 -0
  307. package/dist/migrate/audit.d.ts +9 -0
  308. package/dist/migrate/audit.d.ts.map +1 -0
  309. package/dist/migrate/audit.js +197 -0
  310. package/dist/migrate/audit.js.map +1 -0
  311. package/dist/migrate/diff.d.ts +28 -0
  312. package/dist/migrate/diff.d.ts.map +1 -0
  313. package/dist/migrate/diff.js +154 -0
  314. package/dist/migrate/diff.js.map +1 -0
  315. package/dist/migrate/html-orchestrator.d.ts +81 -0
  316. package/dist/migrate/html-orchestrator.d.ts.map +1 -0
  317. package/dist/migrate/html-orchestrator.js +233 -0
  318. package/dist/migrate/html-orchestrator.js.map +1 -0
  319. package/dist/migrate/html-walker.d.ts +93 -0
  320. package/dist/migrate/html-walker.d.ts.map +1 -0
  321. package/dist/migrate/html-walker.js +288 -0
  322. package/dist/migrate/html-walker.js.map +1 -0
  323. package/dist/migrate/js-template-walker.d.ts +118 -0
  324. package/dist/migrate/js-template-walker.d.ts.map +1 -0
  325. package/dist/migrate/js-template-walker.js +644 -0
  326. package/dist/migrate/js-template-walker.js.map +1 -0
  327. package/dist/migrate/manifest-validator.d.ts +30 -0
  328. package/dist/migrate/manifest-validator.d.ts.map +1 -0
  329. package/dist/migrate/manifest-validator.js +261 -0
  330. package/dist/migrate/manifest-validator.js.map +1 -0
  331. package/dist/migrate/overrides.d.ts +58 -0
  332. package/dist/migrate/overrides.d.ts.map +1 -0
  333. package/dist/migrate/overrides.js +193 -0
  334. package/dist/migrate/overrides.js.map +1 -0
  335. package/dist/migrate/plugin-scope.d.ts +42 -0
  336. package/dist/migrate/plugin-scope.d.ts.map +1 -0
  337. package/dist/migrate/plugin-scope.js +94 -0
  338. package/dist/migrate/plugin-scope.js.map +1 -0
  339. package/dist/migrate/types.d.ts +45 -0
  340. package/dist/migrate/types.d.ts.map +1 -0
  341. package/dist/migrate/types.js +9 -0
  342. package/dist/migrate/types.js.map +1 -0
  343. package/dist/migrate/verb-inference.d.ts +37 -0
  344. package/dist/migrate/verb-inference.d.ts.map +1 -0
  345. package/dist/migrate/verb-inference.js +274 -0
  346. package/dist/migrate/verb-inference.js.map +1 -0
  347. package/dist/nac3/attrs.d.ts +87 -0
  348. package/dist/nac3/attrs.d.ts.map +1 -0
  349. package/dist/nac3/attrs.js +134 -0
  350. package/dist/nac3/attrs.js.map +1 -0
  351. package/dist/nac3/scenario_dsl.d.ts +71 -0
  352. package/dist/nac3/scenario_dsl.d.ts.map +1 -0
  353. package/dist/nac3/scenario_dsl.js +191 -0
  354. package/dist/nac3/scenario_dsl.js.map +1 -0
  355. package/dist/nac3/tokens.d.ts +126 -0
  356. package/dist/nac3/tokens.d.ts.map +1 -0
  357. package/dist/nac3/tokens.js +138 -0
  358. package/dist/nac3/tokens.js.map +1 -0
  359. package/dist/reader/parsers/csv.d.ts +42 -0
  360. package/dist/reader/parsers/csv.d.ts.map +1 -0
  361. package/dist/reader/parsers/csv.js +221 -0
  362. package/dist/reader/parsers/csv.js.map +1 -0
  363. package/dist/reader/parsers/docx.d.ts +31 -0
  364. package/dist/reader/parsers/docx.d.ts.map +1 -0
  365. package/dist/reader/parsers/docx.js +51 -0
  366. package/dist/reader/parsers/docx.js.map +1 -0
  367. package/dist/reader/parsers/epub.d.ts +39 -0
  368. package/dist/reader/parsers/epub.d.ts.map +1 -0
  369. package/dist/reader/parsers/epub.js +265 -0
  370. package/dist/reader/parsers/epub.js.map +1 -0
  371. package/dist/reader/parsers/html.d.ts +40 -0
  372. package/dist/reader/parsers/html.d.ts.map +1 -0
  373. package/dist/reader/parsers/html.js +386 -0
  374. package/dist/reader/parsers/html.js.map +1 -0
  375. package/dist/reader/parsers/md.d.ts +30 -0
  376. package/dist/reader/parsers/md.d.ts.map +1 -0
  377. package/dist/reader/parsers/md.js +199 -0
  378. package/dist/reader/parsers/md.js.map +1 -0
  379. package/dist/reader/parsers/pdf.d.ts +39 -0
  380. package/dist/reader/parsers/pdf.d.ts.map +1 -0
  381. package/dist/reader/parsers/pdf.js +220 -0
  382. package/dist/reader/parsers/pdf.js.map +1 -0
  383. package/dist/reader/parsers/rtf.d.ts +37 -0
  384. package/dist/reader/parsers/rtf.d.ts.map +1 -0
  385. package/dist/reader/parsers/rtf.js +347 -0
  386. package/dist/reader/parsers/rtf.js.map +1 -0
  387. package/dist/reader/parsers/source.d.ts +32 -0
  388. package/dist/reader/parsers/source.d.ts.map +1 -0
  389. package/dist/reader/parsers/source.js +122 -0
  390. package/dist/reader/parsers/source.js.map +1 -0
  391. package/dist/reader/parsers/txt.d.ts +25 -0
  392. package/dist/reader/parsers/txt.d.ts.map +1 -0
  393. package/dist/reader/parsers/txt.js +56 -0
  394. package/dist/reader/parsers/txt.js.map +1 -0
  395. package/dist/reader/parsers/xlsx.d.ts +33 -0
  396. package/dist/reader/parsers/xlsx.d.ts.map +1 -0
  397. package/dist/reader/parsers/xlsx.js +143 -0
  398. package/dist/reader/parsers/xlsx.js.map +1 -0
  399. package/dist/reader/registry.d.ts +39 -0
  400. package/dist/reader/registry.d.ts.map +1 -0
  401. package/dist/reader/registry.js +172 -0
  402. package/dist/reader/registry.js.map +1 -0
  403. package/dist/reader/search.d.ts +27 -0
  404. package/dist/reader/search.d.ts.map +1 -0
  405. package/dist/reader/search.js +77 -0
  406. package/dist/reader/search.js.map +1 -0
  407. package/dist/reader/state.d.ts +56 -0
  408. package/dist/reader/state.d.ts.map +1 -0
  409. package/dist/reader/state.js +179 -0
  410. package/dist/reader/state.js.map +1 -0
  411. package/dist/reader/types.d.ts +119 -0
  412. package/dist/reader/types.d.ts.map +1 -0
  413. package/dist/reader/types.js +23 -0
  414. package/dist/reader/types.js.map +1 -0
  415. package/dist/ship/run.d.ts +26 -0
  416. package/dist/ship/run.d.ts.map +1 -0
  417. package/dist/ship/run.js +123 -0
  418. package/dist/ship/run.js.map +1 -0
  419. package/dist/template/index.d.ts +50 -0
  420. package/dist/template/index.d.ts.map +1 -0
  421. package/dist/template/index.js +140 -0
  422. package/dist/template/index.js.map +1 -0
  423. package/dist/ui/colors.d.ts +13 -0
  424. package/dist/ui/colors.d.ts.map +1 -0
  425. package/dist/ui/colors.js +26 -0
  426. package/dist/ui/colors.js.map +1 -0
  427. package/dist/validate/index.d.ts +19 -0
  428. package/dist/validate/index.d.ts.map +1 -0
  429. package/dist/validate/index.js +181 -0
  430. package/dist/validate/index.js.map +1 -0
  431. package/dist/vault/catalog.d.ts +55 -0
  432. package/dist/vault/catalog.d.ts.map +1 -0
  433. package/dist/vault/catalog.js +424 -0
  434. package/dist/vault/catalog.js.map +1 -0
  435. package/dist/vault/crypto.d.ts +82 -0
  436. package/dist/vault/crypto.d.ts.map +1 -0
  437. package/dist/vault/crypto.js +173 -0
  438. package/dist/vault/crypto.js.map +1 -0
  439. package/dist/vault/git_askpass.d.ts +26 -0
  440. package/dist/vault/git_askpass.d.ts.map +1 -0
  441. package/dist/vault/git_askpass.js +104 -0
  442. package/dist/vault/git_askpass.js.map +1 -0
  443. package/dist/vault/migrator.d.ts +57 -0
  444. package/dist/vault/migrator.d.ts.map +1 -0
  445. package/dist/vault/migrator.js +204 -0
  446. package/dist/vault/migrator.js.map +1 -0
  447. package/dist/vault/redactor.d.ts +73 -0
  448. package/dist/vault/redactor.d.ts.map +1 -0
  449. package/dist/vault/redactor.js +182 -0
  450. package/dist/vault/redactor.js.map +1 -0
  451. package/dist/vault/store.d.ts +132 -0
  452. package/dist/vault/store.d.ts.map +1 -0
  453. package/dist/vault/store.js +335 -0
  454. package/dist/vault/store.js.map +1 -0
  455. package/dist/version.d.ts +8 -0
  456. package/dist/version.d.ts.map +1 -0
  457. package/dist/version.js +8 -0
  458. package/dist/version.js.map +1 -0
  459. package/dist/voice/chunker.d.ts +43 -0
  460. package/dist/voice/chunker.d.ts.map +1 -0
  461. package/dist/voice/chunker.js +133 -0
  462. package/dist/voice/chunker.js.map +1 -0
  463. package/dist/voice/config.d.ts +14 -0
  464. package/dist/voice/config.d.ts.map +1 -0
  465. package/dist/voice/config.js +51 -0
  466. package/dist/voice/config.js.map +1 -0
  467. package/dist/voice/intents.d.ts +71 -0
  468. package/dist/voice/intents.d.ts.map +1 -0
  469. package/dist/voice/intents.js +0 -0
  470. package/dist/voice/intents.js.map +1 -0
  471. package/dist/voice/providers/elevenlabs.d.ts +53 -0
  472. package/dist/voice/providers/elevenlabs.d.ts.map +1 -0
  473. package/dist/voice/providers/elevenlabs.js +159 -0
  474. package/dist/voice/providers/elevenlabs.js.map +1 -0
  475. package/dist/voice/providers/google.d.ts +56 -0
  476. package/dist/voice/providers/google.d.ts.map +1 -0
  477. package/dist/voice/providers/google.js +253 -0
  478. package/dist/voice/providers/google.js.map +1 -0
  479. package/dist/voice/providers/whisper.d.ts +44 -0
  480. package/dist/voice/providers/whisper.d.ts.map +1 -0
  481. package/dist/voice/providers/whisper.js +179 -0
  482. package/dist/voice/providers/whisper.js.map +1 -0
  483. package/dist/voice/registry.d.ts +35 -0
  484. package/dist/voice/registry.d.ts.map +1 -0
  485. package/dist/voice/registry.js +48 -0
  486. package/dist/voice/registry.js.map +1 -0
  487. package/dist/voice/router.d.ts +62 -0
  488. package/dist/voice/router.d.ts.map +1 -0
  489. package/dist/voice/router.js +175 -0
  490. package/dist/voice/router.js.map +1 -0
  491. package/dist/voice/types.d.ts +116 -0
  492. package/dist/voice/types.d.ts.map +1 -0
  493. package/dist/voice/types.js +22 -0
  494. package/dist/voice/types.js.map +1 -0
  495. package/dist/voice/voiceprint/enrollment.d.ts +36 -0
  496. package/dist/voice/voiceprint/enrollment.d.ts.map +1 -0
  497. package/dist/voice/voiceprint/enrollment.js +71 -0
  498. package/dist/voice/voiceprint/enrollment.js.map +1 -0
  499. package/dist/voice/voiceprint/identify.d.ts +16 -0
  500. package/dist/voice/voiceprint/identify.d.ts.map +1 -0
  501. package/dist/voice/voiceprint/identify.js +20 -0
  502. package/dist/voice/voiceprint/identify.js.map +1 -0
  503. package/dist/voice/voiceprint/liveness.d.ts +90 -0
  504. package/dist/voice/voiceprint/liveness.d.ts.map +1 -0
  505. package/dist/voice/voiceprint/liveness.js +251 -0
  506. package/dist/voice/voiceprint/liveness.js.map +1 -0
  507. package/dist/voice/voiceprint/match.d.ts +54 -0
  508. package/dist/voice/voiceprint/match.d.ts.map +1 -0
  509. package/dist/voice/voiceprint/match.js +88 -0
  510. package/dist/voice/voiceprint/match.js.map +1 -0
  511. package/dist/voice/voiceprint/providers/local-mfcc-stub.d.ts +44 -0
  512. package/dist/voice/voiceprint/providers/local-mfcc-stub.d.ts.map +1 -0
  513. package/dist/voice/voiceprint/providers/local-mfcc-stub.js +92 -0
  514. package/dist/voice/voiceprint/providers/local-mfcc-stub.js.map +1 -0
  515. package/dist/voice/voiceprint/store.d.ts +60 -0
  516. package/dist/voice/voiceprint/store.d.ts.map +1 -0
  517. package/dist/voice/voiceprint/store.js +155 -0
  518. package/dist/voice/voiceprint/store.js.map +1 -0
  519. package/dist/voice/voiceprint/trust.d.ts +90 -0
  520. package/dist/voice/voiceprint/trust.d.ts.map +1 -0
  521. package/dist/voice/voiceprint/trust.js +150 -0
  522. package/dist/voice/voiceprint/trust.js.map +1 -0
  523. package/dist/voice/voiceprint/types.d.ts +100 -0
  524. package/dist/voice/voiceprint/types.d.ts.map +1 -0
  525. package/dist/voice/voiceprint/types.js +23 -0
  526. package/dist/voice/voiceprint/types.js.map +1 -0
  527. package/dist/voice/wake.d.ts +64 -0
  528. package/dist/voice/wake.d.ts.map +1 -0
  529. package/dist/voice/wake.js +143 -0
  530. package/dist/voice/wake.js.map +1 -0
  531. package/docs/manuals/manual.ar.html +91 -0
  532. package/docs/manuals/manual.de.html +100 -0
  533. package/docs/manuals/manual.en.html +118 -0
  534. package/docs/manuals/manual.es.html +120 -0
  535. package/docs/manuals/manual.fr.html +102 -0
  536. package/docs/manuals/manual.hi.html +93 -0
  537. package/docs/manuals/manual.it.html +93 -0
  538. package/docs/manuals/manual.ja.html +97 -0
  539. package/docs/manuals/manual.pt.html +103 -0
  540. package/docs/manuals/manual.zh.html +89 -0
  541. package/package.json +94 -0
  542. package/src/i18n/catalogs/ar.json +86 -0
  543. package/src/i18n/catalogs/de.json +86 -0
  544. package/src/i18n/catalogs/en.json +86 -0
  545. package/src/i18n/catalogs/es.json +86 -0
  546. package/src/i18n/catalogs/fr.json +86 -0
  547. package/src/i18n/catalogs/hi.json +86 -0
  548. package/src/i18n/catalogs/it.json +86 -0
  549. package/src/i18n/catalogs/ja.json +86 -0
  550. package/src/i18n/catalogs/pt.json +86 -0
  551. package/src/i18n/catalogs/zh.json +86 -0
  552. package/templates/react-app/README.md +43 -0
  553. package/templates/react-app/index.html +12 -0
  554. package/templates/react-app/package.json +35 -0
  555. package/templates/react-app/src/App.tsx +106 -0
  556. package/templates/react-app/src/main.tsx +21 -0
  557. package/templates/react-app/src/nac/manifest.ts +46 -0
  558. package/templates/react-app/src/styles.css +68 -0
  559. package/templates/react-app/tsconfig.json +19 -0
  560. package/templates/react-app/vite.config.ts +12 -0
  561. package/templates/react-app/yujin.forge.json +15 -0
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Vault store: persistent, atomic, slot-based credential storage.
3
+ *
4
+ * File layout under the configured config directory (typically
5
+ * ~/.yujin-forge/):
6
+ *
7
+ * vault.salt 16 bytes of CSPRNG, written once per install
8
+ * vault.json JSON metadata + per-slot ciphertexts (base64)
9
+ *
10
+ * The salt is in its own file so it survives any corruption of
11
+ * vault.json -- worst case, the user re-enters their keys but does
12
+ * not need to regenerate the salt.
13
+ *
14
+ * Atomic writes: every persist writes to a `.tmp` sibling, fsyncs,
15
+ * then renames. Process death between write and rename leaves the
16
+ * old file intact; the orphan tmp is cleaned up on next open.
17
+ *
18
+ * Slot names: lowercase alphanumeric + underscore + hyphen,
19
+ * starting with a letter. Hard-rejected loudly otherwise.
20
+ *
21
+ * The list() surface returns metadata only: name, the first 4
22
+ * characters of the plaintext (so the user can confirm
23
+ * "yes, this is my key"), the plaintext length, and timestamps.
24
+ * Never returns ciphertext or plaintext beyond the prefix.
25
+ *
26
+ * Loud failures (per ROADMAP sec 12.2): every error path throws
27
+ * with a message explaining what went wrong.
28
+ *
29
+ * ASCII-only.
30
+ */
31
+ import { promises as fs } from 'node:fs';
32
+ import path from 'node:path';
33
+ import { computeMachineFingerprint, deriveVaultKey, encrypt, decrypt, generateSalt, } from './crypto.js';
34
+ import { inferKind, lookupCatalog, } from './catalog.js';
35
+ /* Bump on every schema change. v1 = baseline (initial release).
36
+ * v2 = adds typed slots: { kind, expiry, last_test_at, last_test_ok }.
37
+ * Read-side accepts v1 and migrates in-place to v2 on next
38
+ * write. Write-side always emits v2. */
39
+ export const VAULT_STORE_VERSION = 2;
40
+ const VAULT_FILENAME = 'vault.json';
41
+ const SALT_FILENAME = 'vault.salt';
42
+ const TMP_SUFFIX = '.tmp';
43
+ const SLOT_NAME_RE = /^[a-z][a-z0-9_-]*$/;
44
+ export class Vault {
45
+ configDir;
46
+ salt;
47
+ key;
48
+ fingerprint;
49
+ slots;
50
+ constructor(configDir, salt, key, fingerprint, slots) {
51
+ this.configDir = configDir;
52
+ this.salt = salt;
53
+ this.key = key;
54
+ this.fingerprint = fingerprint;
55
+ this.slots = slots;
56
+ }
57
+ /**
58
+ * Open or create the vault at configDir.
59
+ * - Creates configDir if missing.
60
+ * - Reads or generates vault.salt.
61
+ * - Derives the master key.
62
+ * - Reads vault.json or starts with an empty slot set.
63
+ * - Cleans up any orphan vault.json.tmp from a previous crashed write.
64
+ */
65
+ static async open(opts) {
66
+ if (!opts.configDir || !path.isAbsolute(opts.configDir)) {
67
+ throw new Error('Vault.open: configDir must be an absolute path (got ' + JSON.stringify(opts.configDir) + ')');
68
+ }
69
+ await fs.mkdir(opts.configDir, { recursive: true });
70
+ /* Clean up any orphan tmp file from a previous crashed write. */
71
+ const tmpPath = path.join(opts.configDir, VAULT_FILENAME + TMP_SUFFIX);
72
+ try {
73
+ await fs.unlink(tmpPath);
74
+ }
75
+ catch (err) {
76
+ if (err.code !== 'ENOENT')
77
+ throw err;
78
+ }
79
+ const fingerprint = opts.fingerprint ?? computeMachineFingerprint();
80
+ /* Load or create salt. */
81
+ const saltPath = path.join(opts.configDir, SALT_FILENAME);
82
+ let salt;
83
+ try {
84
+ salt = await fs.readFile(saltPath);
85
+ if (salt.length < 16) {
86
+ throw new Error('vault.salt is corrupted (only ' + salt.length + ' bytes -- expected at least 16). '
87
+ + 'Delete ' + saltPath + ' to reset the vault. Existing slots will be unreadable.');
88
+ }
89
+ }
90
+ catch (err) {
91
+ if (err.code !== 'ENOENT')
92
+ throw err;
93
+ salt = generateSalt();
94
+ await atomicWrite(saltPath, salt);
95
+ }
96
+ const key = deriveVaultKey(fingerprint, salt);
97
+ /* Load slots or start empty. Accept v1 and v2 on read; the
98
+ * write path always emits the current VAULT_STORE_VERSION
99
+ * (v2 today). On v1 -> v2 read, slot kinds are inferred from
100
+ * the catalog and the file is rewritten on the next set/remove. */
101
+ const vaultPath = path.join(opts.configDir, VAULT_FILENAME);
102
+ let slots = {};
103
+ let needsMigrationRewrite = false;
104
+ try {
105
+ const raw = await fs.readFile(vaultPath, 'utf-8');
106
+ const parsedAny = JSON.parse(raw);
107
+ if (!parsedAny || typeof parsedAny !== 'object') {
108
+ throw new Error('vault.json is not a JSON object');
109
+ }
110
+ const ver = parsedAny.version;
111
+ if (ver !== 1 && ver !== VAULT_STORE_VERSION) {
112
+ throw new Error('vault.json version mismatch (got ' + String(ver) + ', expected '
113
+ + VAULT_STORE_VERSION + ' or 1). The vault may have been written by a future Forge.');
114
+ }
115
+ if (!parsedAny.slots || typeof parsedAny.slots !== 'object') {
116
+ throw new Error('vault.json missing slots map');
117
+ }
118
+ const parsed = parsedAny;
119
+ slots = parsed.slots;
120
+ if (parsed.version === 1) {
121
+ /* Migrate v1 -> v2 by enriching each slot with its
122
+ * inferred kind. The actual file rewrite happens on
123
+ * the next write (lazy migration -- avoids touching
124
+ * the file just by opening read-only paths). */
125
+ needsMigrationRewrite = true;
126
+ for (const name of Object.keys(slots)) {
127
+ const slot = slots[name];
128
+ if (!slot.kind)
129
+ slot.kind = inferKind(name);
130
+ }
131
+ }
132
+ }
133
+ catch (err) {
134
+ const code = err.code;
135
+ if (code !== 'ENOENT')
136
+ throw err;
137
+ /* First install -- empty slots. Persist immediately so the
138
+ file exists and subsequent opens take the happy path. */
139
+ }
140
+ const vault = new Vault(opts.configDir, salt, key, fingerprint, slots);
141
+ /* Persist on first creation so vault.json exists from the start.
142
+ * Also persist on v1 -> v2 migration so the file is upgraded
143
+ * even when no slot write happens. */
144
+ if (!(await fileExists(vaultPath))) {
145
+ await vault.persist();
146
+ }
147
+ else if (needsMigrationRewrite) {
148
+ await vault.persist();
149
+ }
150
+ return vault;
151
+ }
152
+ /** True when the slot has a stored value. */
153
+ has(slotName) {
154
+ return Object.prototype.hasOwnProperty.call(this.slots, slotName);
155
+ }
156
+ /** Slot metadata for every slot, sorted by name. Never returns
157
+ * ciphertext or plaintext beyond the 4-char prefix. */
158
+ list() {
159
+ return Object.entries(this.slots)
160
+ .map(([name, slot]) => ({
161
+ name,
162
+ prefix: slot.prefix,
163
+ length: slot.length,
164
+ created_at: slot.created_at,
165
+ updated_at: slot.updated_at,
166
+ kind: slot.kind ?? inferKind(name),
167
+ ...(slot.expiry ? { expiry: slot.expiry } : {}),
168
+ ...(slot.last_test_at ? { last_test_at: slot.last_test_at } : {}),
169
+ ...(typeof slot.last_test_ok === 'boolean' ? { last_test_ok: slot.last_test_ok } : {}),
170
+ in_catalog: lookupCatalog(name) !== undefined,
171
+ }))
172
+ .sort((a, b) => a.name.localeCompare(b.name));
173
+ }
174
+ /** Encrypt + persist a plaintext into the named slot. Overwrites
175
+ * if the slot already existed; the original created_at is
176
+ * preserved while updated_at is bumped.
177
+ *
178
+ * Options (all optional):
179
+ * - kind: override the kind (default = inferKind(slotName)).
180
+ * - expiry: ISO 8601 expiry. When omitted, the existing
181
+ * expiry is preserved (or cleared if you pass null).
182
+ */
183
+ async set(slotName, plaintext, opts = {}) {
184
+ if (!SLOT_NAME_RE.test(slotName)) {
185
+ throw new Error('vault slot name must match ' + SLOT_NAME_RE.source
186
+ + ' (lowercase alphanumeric + underscore + hyphen, starting with a letter). Got: '
187
+ + JSON.stringify(slotName));
188
+ }
189
+ if (typeof plaintext !== 'string' || plaintext.length === 0) {
190
+ throw new Error('vault.set requires a non-empty plaintext string for slot ' + slotName);
191
+ }
192
+ const blob = encrypt(plaintext, this.key);
193
+ const now = new Date().toISOString();
194
+ const previous = this.slots[slotName];
195
+ const kind = opts.kind ?? previous?.kind ?? inferKind(slotName);
196
+ let expiry;
197
+ if (opts.expiry === null)
198
+ expiry = undefined;
199
+ else if (opts.expiry !== undefined)
200
+ expiry = opts.expiry;
201
+ else
202
+ expiry = previous?.expiry;
203
+ this.slots[slotName] = {
204
+ ciphertext_b64: blob.toString('base64'),
205
+ prefix: plaintext.slice(0, 4),
206
+ length: plaintext.length,
207
+ created_at: previous?.created_at ?? now,
208
+ updated_at: now,
209
+ kind,
210
+ ...(expiry ? { expiry } : {}),
211
+ /* Reset last_test_* on set; a new value invalidates the
212
+ old test outcome. */
213
+ };
214
+ await this.persist();
215
+ }
216
+ /** Decrypt and return the plaintext for a slot. Throws if the
217
+ * slot is missing or the ciphertext is corrupted. This is the
218
+ * ONLY path that surfaces plaintext, and it is server-side only
219
+ * -- never called from a route handler that returns to the
220
+ * browser. */
221
+ get(slotName) {
222
+ const slot = this.slots[slotName];
223
+ if (!slot) {
224
+ throw new Error('vault slot not found: ' + slotName);
225
+ }
226
+ const blob = Buffer.from(slot.ciphertext_b64, 'base64');
227
+ return decrypt(blob, this.key);
228
+ }
229
+ /** Remove a slot. Returns true if the slot existed, false
230
+ * otherwise. Persists on success. */
231
+ async remove(slotName) {
232
+ if (!Object.prototype.hasOwnProperty.call(this.slots, slotName)) {
233
+ return false;
234
+ }
235
+ delete this.slots[slotName];
236
+ await this.persist();
237
+ return true;
238
+ }
239
+ /** Rotate a slot: replace its plaintext with a new one. Equivalent
240
+ * to set() but expresses intent ("the old value is gone") in
241
+ * CLI surfaces. Same created_at preservation behaviour as set. */
242
+ async rotate(slotName, newPlaintext) {
243
+ await this.set(slotName, newPlaintext);
244
+ }
245
+ /** Probe the stored credential against the external service.
246
+ * Looks up the catalog entry for `slotName`. When no test
247
+ * function is defined, returns ok=true with detail "no probe
248
+ * registered" so the UI can still report something. Persists
249
+ * last_test_at + last_test_ok on the slot. */
250
+ async test(slotName, opts = {}) {
251
+ const slot = this.slots[slotName];
252
+ if (!slot)
253
+ throw new Error('vault slot not found: ' + slotName);
254
+ const entry = lookupCatalog(slotName);
255
+ const timeoutMs = opts.timeoutMs ?? 5000;
256
+ let result;
257
+ if (!entry || !entry.test) {
258
+ result = { ok: true, status: 0, latency_ms: 0,
259
+ detail: entry ? 'no probe registered for this slot' : 'custom slot -- no probe' };
260
+ }
261
+ else {
262
+ const plaintext = this.get(slotName);
263
+ try {
264
+ result = await entry.test(plaintext, { timeoutMs });
265
+ }
266
+ catch (err) {
267
+ result = {
268
+ ok: false, status: 0, latency_ms: 0,
269
+ detail: err instanceof Error ? err.message : String(err),
270
+ };
271
+ }
272
+ }
273
+ slot.last_test_at = new Date().toISOString();
274
+ slot.last_test_ok = result.ok;
275
+ await this.persist();
276
+ return result;
277
+ }
278
+ /** Total number of slots currently stored. */
279
+ size() {
280
+ return Object.keys(this.slots).length;
281
+ }
282
+ /** Read-only view of the directory where this vault lives. */
283
+ configDirPath() {
284
+ return this.configDir;
285
+ }
286
+ async persist() {
287
+ const vaultPath = path.join(this.configDir, VAULT_FILENAME);
288
+ /* Ensure every slot has a kind before persisting; legacy
289
+ v1 slots loaded just now may lack it. */
290
+ for (const name of Object.keys(this.slots)) {
291
+ const s = this.slots[name];
292
+ if (!s.kind)
293
+ s.kind = inferKind(name);
294
+ }
295
+ const payload = {
296
+ version: VAULT_STORE_VERSION,
297
+ slots: this.slots,
298
+ };
299
+ const body = Buffer.from(JSON.stringify(payload, null, 2), 'utf-8');
300
+ await atomicWrite(vaultPath, body);
301
+ }
302
+ }
303
+ /**
304
+ * Write data to targetPath atomically. Layout: write to
305
+ * `<targetPath>.tmp`, fsync, rename. A crash between fsync and
306
+ * rename leaves the original intact and orphans the tmp; Vault.open
307
+ * cleans the orphan up on next launch.
308
+ */
309
+ async function atomicWrite(targetPath, data) {
310
+ const tmpPath = targetPath + TMP_SUFFIX;
311
+ await fs.writeFile(tmpPath, data, { mode: 0o600 });
312
+ /* fsync to make sure the bytes hit the disk before we rename --
313
+ otherwise a power loss between write and rename could leave the
314
+ "renamed" file pointing to an empty inode on some filesystems. */
315
+ const fh = await fs.open(tmpPath, 'r+');
316
+ try {
317
+ await fh.sync();
318
+ }
319
+ finally {
320
+ await fh.close();
321
+ }
322
+ await fs.rename(tmpPath, targetPath);
323
+ }
324
+ async function fileExists(p) {
325
+ try {
326
+ await fs.stat(p);
327
+ return true;
328
+ }
329
+ catch (err) {
330
+ if (err.code === 'ENOENT')
331
+ return false;
332
+ throw err;
333
+ }
334
+ }
335
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/vault/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Yujin Forge CLI version. Single source of truth -- package.json
3
+ * reads from this at publish time (the publish script copies it
4
+ * into the npm metadata) so we don't end up with two versions
5
+ * drifting.
6
+ */
7
+ export declare const VERSION = "0.2.0-alpha.1";
8
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Yujin Forge CLI version. Single source of truth -- package.json
3
+ * reads from this at publish time (the publish script copies it
4
+ * into the npm metadata) so we don't end up with two versions
5
+ * drifting.
6
+ */
7
+ export const VERSION = '0.2.0-alpha.1';
8
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * TTS chunker (V1.24 of HITO 1).
3
+ *
4
+ * Splits a paragraph or section of spoken text into TTS-friendly
5
+ * chunks so the panel can pipeline fetches and start playing the
6
+ * first chunk while later chunks are still being synthesised by
7
+ * the provider. End-to-end voice latency on a 500-word section
8
+ * drops from ~3s (single round-trip) to ~600ms (first sentence
9
+ * arrives + plays while the rest streams in).
10
+ *
11
+ * Sentence boundary detection is regex-based + conservative:
12
+ *
13
+ * - '.', '!', '?' followed by whitespace (and not preceded by
14
+ * a single uppercase letter or common abbreviation) end a
15
+ * sentence.
16
+ * - ';' ends a clause-level break only when the buffered
17
+ * chunk is already longer than ~120 chars (so we don't
18
+ * over-fragment short sentences).
19
+ * - Double newline always ends a chunk (paragraph boundary).
20
+ *
21
+ * After sentence splitting, we still cap each chunk at
22
+ * `maxLen` chars (default 300). Anything over that gets
23
+ * subdivided on the nearest whitespace.
24
+ *
25
+ * Pure function. No node / no DOM. Easy to unit-test.
26
+ *
27
+ * ASCII-only.
28
+ */
29
+ export interface ChunkOptions {
30
+ /** Maximum characters per chunk after sentence splitting.
31
+ * Default 300. Anything between 200 and 500 is sensible:
32
+ * too short and the provider per-call overhead dominates;
33
+ * too long and the first-audio latency we are trying to
34
+ * hide reappears. */
35
+ maxLen?: number;
36
+ /** When a clause-level break (;) appears, only honour it if
37
+ * the buffered chunk is already longer than this. Default
38
+ * 120. */
39
+ semicolonBreakAtLen?: number;
40
+ }
41
+ /** Split `text` into sentence-aware chunks. */
42
+ export declare function splitIntoTtsChunks(text: string, opts?: ChunkOptions): string[];
43
+ //# sourceMappingURL=chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/voice/chunker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,WAAW,YAAY;IAC3B;;;;0BAIsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;eAEW;IACX,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAmCD,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,MAAM,EAAE,CAqElF"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * TTS chunker (V1.24 of HITO 1).
3
+ *
4
+ * Splits a paragraph or section of spoken text into TTS-friendly
5
+ * chunks so the panel can pipeline fetches and start playing the
6
+ * first chunk while later chunks are still being synthesised by
7
+ * the provider. End-to-end voice latency on a 500-word section
8
+ * drops from ~3s (single round-trip) to ~600ms (first sentence
9
+ * arrives + plays while the rest streams in).
10
+ *
11
+ * Sentence boundary detection is regex-based + conservative:
12
+ *
13
+ * - '.', '!', '?' followed by whitespace (and not preceded by
14
+ * a single uppercase letter or common abbreviation) end a
15
+ * sentence.
16
+ * - ';' ends a clause-level break only when the buffered
17
+ * chunk is already longer than ~120 chars (so we don't
18
+ * over-fragment short sentences).
19
+ * - Double newline always ends a chunk (paragraph boundary).
20
+ *
21
+ * After sentence splitting, we still cap each chunk at
22
+ * `maxLen` chars (default 300). Anything over that gets
23
+ * subdivided on the nearest whitespace.
24
+ *
25
+ * Pure function. No node / no DOM. Easy to unit-test.
26
+ *
27
+ * ASCII-only.
28
+ */
29
+ const DEFAULT_MAX_LEN = 300;
30
+ /** Lowered from 120 to 80 after V1.24 testing -- 120 was too
31
+ * aggressive at keeping long compound sentences together;
32
+ * 80 splits on semicolons in real spec prose. */
33
+ const DEFAULT_SEMICOLON_BREAK = 80;
34
+ /** Multi-letter abbreviations whose trailing period must NOT
35
+ * split a sentence. Case-insensitive. */
36
+ const MULTI_LETTER_ABBREVIATIONS = new Set([
37
+ 'sr', 'sra', 'srta', 'dr', 'dra', 'prof', 'mr', 'mrs', 'ms',
38
+ 'st', 'ave', 'av', 'no', 'num', 'pag', 'pg', 'vol', 'ed',
39
+ 'cap', 'fig', 'ej', 'etc', 'aprox', 'lic',
40
+ /* Common in spec / dev docs. */
41
+ 'js', 'ts', 'py', 'sh', 'md', 'html', 'css', 'cli',
42
+ 'api', 'rfc', 'iso', 'utc', 'utf', 'cpu', 'gpu', 'ram',
43
+ ]);
44
+ /** True when the character(s) immediately before the boundary
45
+ * position belong to a known abbreviation. Single-letter
46
+ * abbreviations only count when the letter is uppercase
47
+ * (e.g. "T. S. Eliot" -- but NOT "a. b. c."). */
48
+ function isAbbreviationBefore(text, dotPos) {
49
+ let start = dotPos - 1;
50
+ while (start >= 0 && /[a-zA-Z]/.test(text.charAt(start)))
51
+ start -= 1;
52
+ start += 1;
53
+ if (start >= dotPos)
54
+ return false;
55
+ const word = text.slice(start, dotPos);
56
+ if (word.length === 1) {
57
+ return /[A-Z]/.test(word);
58
+ }
59
+ return MULTI_LETTER_ABBREVIATIONS.has(word.toLowerCase());
60
+ }
61
+ /** Split `text` into sentence-aware chunks. */
62
+ export function splitIntoTtsChunks(text, opts = {}) {
63
+ const maxLen = Math.max(40, opts.maxLen ?? DEFAULT_MAX_LEN);
64
+ const semiBreak = Math.max(40, opts.semicolonBreakAtLen ?? DEFAULT_SEMICOLON_BREAK);
65
+ const trimmed = text.replace(/\s+/g, ' ').trim();
66
+ if (!trimmed)
67
+ return [];
68
+ const chunks = [];
69
+ let buf = '';
70
+ let i = 0;
71
+ function flush() {
72
+ const t = buf.trim();
73
+ if (t)
74
+ chunks.push(t);
75
+ buf = '';
76
+ }
77
+ function flushAtMaxLen() {
78
+ /* Long chunk without a natural break -- subdivide on the
79
+ nearest whitespace before maxLen. */
80
+ while (buf.length > maxLen) {
81
+ let cut = buf.lastIndexOf(' ', maxLen);
82
+ if (cut < maxLen / 2)
83
+ cut = maxLen;
84
+ const piece = buf.slice(0, cut).trim();
85
+ if (piece)
86
+ chunks.push(piece);
87
+ buf = buf.slice(cut).trimStart();
88
+ }
89
+ }
90
+ while (i < trimmed.length) {
91
+ const ch = trimmed.charAt(i);
92
+ buf += ch;
93
+ /* Hard paragraph break already collapsed by the initial
94
+ /\s+/ replace; we therefore only see single spaces +
95
+ sentence punctuation as natural cut points. */
96
+ const isSentencePunct = ch === '.' || ch === '!' || ch === '?';
97
+ const isSemicolon = ch === ';';
98
+ if (isSentencePunct) {
99
+ const next = trimmed.charAt(i + 1);
100
+ if (next === '' || next === ' ') {
101
+ /* Period of abbreviation? Then do not split. */
102
+ if (ch === '.' && isAbbreviationBefore(trimmed, i)) {
103
+ i += 1;
104
+ continue;
105
+ }
106
+ /* Decimal in the middle of digits ("1.23")? No split. */
107
+ if (ch === '.' && /\d/.test(trimmed.charAt(i - 1) || '')
108
+ && /\d/.test(trimmed.charAt(i + 1) || '')) {
109
+ i += 1;
110
+ continue;
111
+ }
112
+ i += 1;
113
+ if (trimmed.charAt(i) === ' ')
114
+ i += 1;
115
+ flush();
116
+ continue;
117
+ }
118
+ }
119
+ else if (isSemicolon && buf.length >= semiBreak) {
120
+ i += 1;
121
+ if (trimmed.charAt(i) === ' ')
122
+ i += 1;
123
+ flush();
124
+ continue;
125
+ }
126
+ i += 1;
127
+ if (buf.length > maxLen)
128
+ flushAtMaxLen();
129
+ }
130
+ flush();
131
+ return chunks;
132
+ }
133
+ //# sourceMappingURL=chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/voice/chunker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type WakeMatchResult } from './wake.js';
2
+ export declare const VOICE_CONFIG_VERSION = 1;
3
+ export interface VoiceConfig {
4
+ version: 1;
5
+ /** Extra aliases the user wants matched (e.g. "koe", "yoo-jin"). */
6
+ wake_aliases_extra: string[];
7
+ /** Levenshtein cap. 0 = exact-only. 2 = default. */
8
+ wake_max_distance: number;
9
+ }
10
+ export declare function readVoiceConfig(): Promise<VoiceConfig>;
11
+ export declare function writeVoiceConfig(cfg: VoiceConfig): Promise<void>;
12
+ /** Match a wake-word against the user's configured alias set. */
13
+ export declare function matchConfiguredWakeWord(input: string): Promise<WakeMatchResult>;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/voice/config.ts"],"names":[],"mappings":"AAYA,OAAO,EAA+B,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAE9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,oEAAoE;IACpE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,oDAAoD;IACpD,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAWD,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAe5D;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED,iEAAiE;AACjE,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAIrF"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Voice configuration -- per-device, plain JSON (not a secret).
3
+ *
4
+ * Lives at ~/.yujin-forge/voice.json. Holds the user's extra
5
+ * wake-word aliases + max Levenshtein distance. Defaults are
6
+ * applied at read time; an absent file is fine.
7
+ *
8
+ * ASCII-only.
9
+ */
10
+ import { promises as fs } from 'node:fs';
11
+ import path from 'node:path';
12
+ import os from 'node:os';
13
+ import { mergeAliases, matchWakeWord } from './wake.js';
14
+ export const VOICE_CONFIG_VERSION = 1;
15
+ function voiceConfigPath() {
16
+ const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
17
+ return path.join(home, '.yujin-forge', 'voice.json');
18
+ }
19
+ function defaultConfig() {
20
+ return { version: 1, wake_aliases_extra: [], wake_max_distance: 2 };
21
+ }
22
+ export async function readVoiceConfig() {
23
+ const p = voiceConfigPath();
24
+ try {
25
+ const buf = await fs.readFile(p, 'utf8');
26
+ const obj = JSON.parse(buf);
27
+ return {
28
+ version: 1,
29
+ wake_aliases_extra: Array.isArray(obj.wake_aliases_extra) ? obj.wake_aliases_extra : [],
30
+ wake_max_distance: typeof obj.wake_max_distance === 'number' ? obj.wake_max_distance : 2,
31
+ };
32
+ }
33
+ catch (err) {
34
+ const code = err.code;
35
+ if (code === 'ENOENT')
36
+ return defaultConfig();
37
+ throw err;
38
+ }
39
+ }
40
+ export async function writeVoiceConfig(cfg) {
41
+ const p = voiceConfigPath();
42
+ await fs.mkdir(path.dirname(p), { recursive: true });
43
+ await fs.writeFile(p, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
44
+ }
45
+ /** Match a wake-word against the user's configured alias set. */
46
+ export async function matchConfiguredWakeWord(input) {
47
+ const cfg = await readVoiceConfig();
48
+ const aliases = mergeAliases(cfg.wake_aliases_extra);
49
+ return matchWakeWord(input, { aliases, maxDistance: cfg.wake_max_distance });
50
+ }
51
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/voice/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAwB,MAAM,WAAW,CAAC;AAE9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAUtC,SAAS,eAAe;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACzE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,kBAAkB,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACpD,OAAO;YACL,OAAO,EAAE,CAAC;YACV,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;YACvF,iBAAiB,EAAE,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;SACzF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,aAAa,EAAE,CAAC;QAC9C,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAgB;IACrD,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAa;IACzD,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACrD,OAAO,aAAa,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC/E,CAAC"}