@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 @@
1
+ {"version":3,"file":"liveness.js","sourceRoot":"","sources":["../../../src/voice/voiceprint/liveness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Voiceprint matcher.
3
+ *
4
+ * Cosine similarity between a target embedding and each
5
+ * enrolled identity's embedding. Returns the ranked list for
6
+ * transparency + the best match if it exceeds the threshold.
7
+ *
8
+ * Two cross-provider safety nets:
9
+ * - The target's `source` is compared against each enrolled
10
+ * embedding's `source`. Mismatches DO NOT crash -- they get
11
+ * a warning + are excluded from the match. Reason:
12
+ * embeddings from different providers live in different
13
+ * vector spaces; the cosine is meaningless across them.
14
+ * - Dimensionality mismatch between target and enrolled
15
+ * embedding also excludes that pair with a warning.
16
+ *
17
+ * Pure math. No IO, no audio decoding.
18
+ *
19
+ * ASCII-only.
20
+ */
21
+ import type { EnrolledIdentity, MatchResult, VoiceprintEmbedding } from './types.js';
22
+ /** Cosine similarity in [-1, 1]. Exported for tests. */
23
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
24
+ export interface MatchOptions {
25
+ /** Cosine score above which a match counts as the enrolled
26
+ * speaker. Default 0.75 per G-VOICE-2 (2026-05-23). */
27
+ threshold?: number;
28
+ /** When true, the matcher includes cross-provider pairs with
29
+ * the provider mismatch noted on the rank entry. Default
30
+ * false -- safer to skip them. */
31
+ allowCrossProvider?: boolean;
32
+ }
33
+ export interface MatchSkipNote {
34
+ name: string;
35
+ reason: 'provider_mismatch' | 'dimensionality_mismatch';
36
+ target_source: string;
37
+ enrolled_source: string;
38
+ target_length: number;
39
+ enrolled_length: number;
40
+ }
41
+ export interface MatchOutput extends MatchResult {
42
+ /** Identities skipped during matching, with the reason.
43
+ * Visible for debugging + helpful for upgrading from the
44
+ * stub to a real provider (provider mismatch happens when
45
+ * the user re-enrolls with a different backend). */
46
+ skipped: MatchSkipNote[];
47
+ }
48
+ /**
49
+ * Compare a target embedding against every enrolled identity.
50
+ * Returns the ranked list + the best name above the threshold,
51
+ * or null if no match qualifies.
52
+ */
53
+ export declare function matchEmbedding(target: VoiceprintEmbedding, enrolled: EnrolledIdentity[], opts?: MatchOptions): MatchOutput;
54
+ //# sourceMappingURL=match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../../src/voice/voiceprint/match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAkBjE;AAED,MAAM,WAAW,YAAY;IAC3B;4DACwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;uCAEmC;IACnC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,mBAAmB,GAAG,yBAAyB,CAAC;IACxD,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C;;;yDAGqD;IACrD,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,IAAI,GAAE,YAAiB,GACtB,WAAW,CA6Cb"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Voiceprint matcher.
3
+ *
4
+ * Cosine similarity between a target embedding and each
5
+ * enrolled identity's embedding. Returns the ranked list for
6
+ * transparency + the best match if it exceeds the threshold.
7
+ *
8
+ * Two cross-provider safety nets:
9
+ * - The target's `source` is compared against each enrolled
10
+ * embedding's `source`. Mismatches DO NOT crash -- they get
11
+ * a warning + are excluded from the match. Reason:
12
+ * embeddings from different providers live in different
13
+ * vector spaces; the cosine is meaningless across them.
14
+ * - Dimensionality mismatch between target and enrolled
15
+ * embedding also excludes that pair with a warning.
16
+ *
17
+ * Pure math. No IO, no audio decoding.
18
+ *
19
+ * ASCII-only.
20
+ */
21
+ /** Cosine similarity in [-1, 1]. Exported for tests. */
22
+ export function cosineSimilarity(a, b) {
23
+ if (a.length !== b.length) {
24
+ throw new Error('cosineSimilarity: dimensionality mismatch (' + a.length + ' vs ' + b.length + ')');
25
+ }
26
+ let dot = 0;
27
+ let aNorm = 0;
28
+ let bNorm = 0;
29
+ for (let i = 0; i < a.length; i++) {
30
+ const av = a[i] ?? 0;
31
+ const bv = b[i] ?? 0;
32
+ dot += av * bv;
33
+ aNorm += av * av;
34
+ bNorm += bv * bv;
35
+ }
36
+ if (aNorm === 0 || bNorm === 0)
37
+ return 0;
38
+ return dot / (Math.sqrt(aNorm) * Math.sqrt(bNorm));
39
+ }
40
+ /**
41
+ * Compare a target embedding against every enrolled identity.
42
+ * Returns the ranked list + the best name above the threshold,
43
+ * or null if no match qualifies.
44
+ */
45
+ export function matchEmbedding(target, enrolled, opts = {}) {
46
+ const threshold = opts.threshold ?? 0.75;
47
+ const allowCross = !!opts.allowCrossProvider;
48
+ const ranked = [];
49
+ const skipped = [];
50
+ for (const id of enrolled) {
51
+ const tgt = target;
52
+ const ref = id.embedding;
53
+ if (!allowCross && tgt.source !== ref.source) {
54
+ skipped.push({
55
+ name: id.name,
56
+ reason: 'provider_mismatch',
57
+ target_source: tgt.source,
58
+ enrolled_source: ref.source,
59
+ target_length: tgt.length,
60
+ enrolled_length: ref.length,
61
+ });
62
+ continue;
63
+ }
64
+ if (tgt.vector.length !== ref.vector.length) {
65
+ skipped.push({
66
+ name: id.name,
67
+ reason: 'dimensionality_mismatch',
68
+ target_source: tgt.source,
69
+ enrolled_source: ref.source,
70
+ target_length: tgt.length,
71
+ enrolled_length: ref.length,
72
+ });
73
+ continue;
74
+ }
75
+ const score = cosineSimilarity(tgt.vector, ref.vector);
76
+ ranked.push({ name: id.name, score });
77
+ }
78
+ ranked.sort((a, b) => b.score - a.score);
79
+ const best = ranked[0];
80
+ const matched = best && best.score >= threshold ? best.name : null;
81
+ return {
82
+ matched,
83
+ score: best ? best.score : 0,
84
+ ranked,
85
+ skipped,
86
+ };
87
+ }
88
+ //# sourceMappingURL=match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.js","sourceRoot":"","sources":["../../../src/voice/voiceprint/match.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Local MFCC-ish voiceprint provider -- ALPHA STUB.
3
+ *
4
+ * This provider is a PLACEHOLDER for the alpha. It extracts a
5
+ * fixed-size embedding from audio bytes using simple
6
+ * deterministic hashing + byte-level statistics. It is good
7
+ * enough to:
8
+ *
9
+ * - Exercise the state machine + types of the voiceprint
10
+ * subsystem.
11
+ * - Discriminate between two clearly-different audio
12
+ * samples in unit tests.
13
+ *
14
+ * It is NOT production quality. Specifically:
15
+ * - It does not decode webm / mp4 / mp3. It hashes the raw
16
+ * bytes as they arrive.
17
+ * - Two recordings of the same voice with different
18
+ * microphones or codecs will hash to different embeddings.
19
+ * - The matcher works against bytes, not speech features.
20
+ *
21
+ * Replace with `speechbrain-py` (Python sidecar + x-vector
22
+ * model) or `google` (Speaker Recognition cloud) before the
23
+ * v1.0 release.
24
+ *
25
+ * The interface this stub implements is the same one the real
26
+ * providers will fulfil, so the state machine, store, and
27
+ * trust layer never change.
28
+ *
29
+ * Loud about its limitations -- the constructor logs once per
30
+ * process so the developer cannot ship it accidentally.
31
+ *
32
+ * ASCII-only.
33
+ */
34
+ import type { VoiceprintEmbedding, VoiceprintExtractRequest, VoiceprintProvider } from '../types.js';
35
+ declare const EMBEDDING_SIZE = 256;
36
+ export declare class LocalMfccStubProvider implements VoiceprintProvider {
37
+ readonly id = "local-mfcc-stub";
38
+ readonly embeddingSize = 256;
39
+ readyToRun(): Promise<boolean>;
40
+ extract(req: VoiceprintExtractRequest): Promise<VoiceprintEmbedding>;
41
+ }
42
+ /** Exported for tests. */
43
+ export { EMBEDDING_SIZE };
44
+ //# sourceMappingURL=local-mfcc-stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-mfcc-stub.d.ts","sourceRoot":"","sources":["../../../../src/voice/voiceprint/providers/local-mfcc-stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB,QAAA,MAAM,cAAc,MAAM,CAAC;AAE3B,qBAAa,qBAAsB,YAAW,kBAAkB;IAC9D,QAAQ,CAAC,EAAE,qBAAqB;IAChC,QAAQ,CAAC,aAAa,OAAkB;IAElC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAM9B,OAAO,CAAC,GAAG,EAAE,wBAAwB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA2C3E;AAED,0BAA0B;AAC1B,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Local MFCC-ish voiceprint provider -- ALPHA STUB.
3
+ *
4
+ * This provider is a PLACEHOLDER for the alpha. It extracts a
5
+ * fixed-size embedding from audio bytes using simple
6
+ * deterministic hashing + byte-level statistics. It is good
7
+ * enough to:
8
+ *
9
+ * - Exercise the state machine + types of the voiceprint
10
+ * subsystem.
11
+ * - Discriminate between two clearly-different audio
12
+ * samples in unit tests.
13
+ *
14
+ * It is NOT production quality. Specifically:
15
+ * - It does not decode webm / mp4 / mp3. It hashes the raw
16
+ * bytes as they arrive.
17
+ * - Two recordings of the same voice with different
18
+ * microphones or codecs will hash to different embeddings.
19
+ * - The matcher works against bytes, not speech features.
20
+ *
21
+ * Replace with `speechbrain-py` (Python sidecar + x-vector
22
+ * model) or `google` (Speaker Recognition cloud) before the
23
+ * v1.0 release.
24
+ *
25
+ * The interface this stub implements is the same one the real
26
+ * providers will fulfil, so the state machine, store, and
27
+ * trust layer never change.
28
+ *
29
+ * Loud about its limitations -- the constructor logs once per
30
+ * process so the developer cannot ship it accidentally.
31
+ *
32
+ * ASCII-only.
33
+ */
34
+ import { createHash } from 'node:crypto';
35
+ const EMBEDDING_SIZE = 256;
36
+ export class LocalMfccStubProvider {
37
+ id = 'local-mfcc-stub';
38
+ embeddingSize = EMBEDDING_SIZE;
39
+ async readyToRun() {
40
+ /* Pure local stub -- always ready. The user does not need
41
+ to configure any credential to use it. */
42
+ return true;
43
+ }
44
+ async extract(req) {
45
+ if (!req.audio || req.audio.length === 0) {
46
+ throw new Error('local-mfcc-stub: audio buffer is empty');
47
+ }
48
+ /* Deterministic embedding: take 8 SHA-256 hashes seeded with
49
+ successive 32-byte windows from the audio, project each
50
+ byte to a float in [-1, 1], normalise the resulting vector. */
51
+ const vector = new Array(EMBEDDING_SIZE).fill(0);
52
+ const audio = req.audio;
53
+ const window = Math.max(1, Math.floor(audio.length / 8));
54
+ for (let chunk = 0; chunk < 8; chunk++) {
55
+ const start = chunk * window;
56
+ const end = Math.min(audio.length, start + window);
57
+ if (start >= end)
58
+ break;
59
+ const h = createHash('sha256');
60
+ h.update(audio.subarray(start, end));
61
+ const digest = h.digest();
62
+ /* Each SHA-256 hash is 32 bytes; spread across 32 slots
63
+ of our 256-dim vector. */
64
+ for (let i = 0; i < 32; i++) {
65
+ const idx = chunk * 32 + i;
66
+ if (idx < EMBEDDING_SIZE) {
67
+ /* Map byte 0..255 to roughly -1..1. */
68
+ vector[idx] = (digest[i] - 128) / 128;
69
+ }
70
+ }
71
+ }
72
+ /* L2-normalise so cosine == dot product downstream. */
73
+ let norm = 0;
74
+ for (const v of vector)
75
+ norm += v * v;
76
+ norm = Math.sqrt(norm);
77
+ if (norm > 0) {
78
+ for (let i = 0; i < vector.length; i++) {
79
+ vector[i] = vector[i] / norm;
80
+ }
81
+ }
82
+ return {
83
+ vector,
84
+ length: vector.length,
85
+ source: this.id,
86
+ enrolled_at: new Date().toISOString(),
87
+ };
88
+ }
89
+ }
90
+ /** Exported for tests. */
91
+ export { EMBEDDING_SIZE };
92
+ //# sourceMappingURL=local-mfcc-stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-mfcc-stub.js","sourceRoot":"","sources":["../../../../src/voice/voiceprint/providers/local-mfcc-stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,MAAM,OAAO,qBAAqB;IACvB,EAAE,GAAG,iBAAiB,CAAC;IACvB,aAAa,GAAG,cAAc,CAAC;IAExC,KAAK,CAAC,UAAU;QACd;oDAC4C;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAA6B;QACzC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QACD;;yEAEiE;QACjE,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACzD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;YACnD,IAAI,KAAK,IAAI,GAAG;gBAAE,MAAM;YACxB,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YAC1B;wCAC4B;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC3B,IAAI,GAAG,GAAG,cAAc,EAAE,CAAC;oBACzB,uCAAuC;oBACvC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;QACD,uDAAuD;QACvD,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC;YAChC,CAAC;QACH,CAAC;QACD,OAAO;YACL,MAAM;YACN,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;IACJ,CAAC;CACF;AAED,0BAA0B;AAC1B,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Voiceprint store -- persisted enrolled identities.
3
+ *
4
+ * Storage:
5
+ * ~/.yujin-forge/voiceprints.json (atomic-write, mode 0o600)
6
+ *
7
+ * Why a separate file (not the vault):
8
+ * - Embeddings are larger than typical credentials
9
+ * (256 floats ~= a few KB serialised). Keeping them out of
10
+ * vault.json keeps the vault file small + fast to load on
11
+ * every credential check.
12
+ * - Voiceprints have different threat semantics (auth data,
13
+ * not secret tokens). Same machine-fingerprint encryption
14
+ * is overkill; we keep the file readable but the embeddings
15
+ * themselves are not secret -- they cannot be reversed back
16
+ * into audio.
17
+ *
18
+ * The store API mirrors Vault: open / has / get / set / remove
19
+ * / list. Atomic write per operation. List returns metadata
20
+ * only (name, label, source, length, enrolled_at) -- never the
21
+ * raw vector.
22
+ *
23
+ * Loud failures per ROADMAP sec 12.2.
24
+ *
25
+ * ASCII-only.
26
+ */
27
+ import type { EnrolledIdentity } from './types.js';
28
+ export interface VoiceprintMetadata {
29
+ name: string;
30
+ label: string;
31
+ source: string;
32
+ embedding_length: number;
33
+ enrolled_at: string;
34
+ has_notes: boolean;
35
+ }
36
+ export interface VoiceprintStoreOptions {
37
+ /** Absolute path to the config dir (typically ~/.yujin-forge). */
38
+ configDir: string;
39
+ }
40
+ export declare class VoiceprintStore {
41
+ private readonly configDir;
42
+ private identities;
43
+ private constructor();
44
+ /** Open or create the store. Cleans up orphan .tmp from a
45
+ * previous crashed write. */
46
+ static open(opts: VoiceprintStoreOptions): Promise<VoiceprintStore>;
47
+ has(name: string): boolean;
48
+ size(): number;
49
+ list(): VoiceprintMetadata[];
50
+ /** Server-side only: returns the raw identity including the
51
+ * embedding vector. Used by the matcher. Never wired to a
52
+ * route handler that returns to the browser. */
53
+ get(name: string): EnrolledIdentity;
54
+ /** All enrolled identities. Server-side only. */
55
+ all(): EnrolledIdentity[];
56
+ set(identity: EnrolledIdentity): Promise<void>;
57
+ remove(name: string): Promise<boolean>;
58
+ private persist;
59
+ }
60
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/voice/voiceprint/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,YAAY,CAAC;AAYxE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAAmC;IAErD,OAAO;IAKP;kCAC8B;WACjB,IAAI,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC;IAqCzE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,kBAAkB,EAAE;IAa5B;;qDAEiD;IACjD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB;IAMnC,iDAAiD;IACjD,GAAG,IAAI,gBAAgB,EAAE;IAInB,GAAG,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB9C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAS9B,OAAO;CAYtB"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Voiceprint store -- persisted enrolled identities.
3
+ *
4
+ * Storage:
5
+ * ~/.yujin-forge/voiceprints.json (atomic-write, mode 0o600)
6
+ *
7
+ * Why a separate file (not the vault):
8
+ * - Embeddings are larger than typical credentials
9
+ * (256 floats ~= a few KB serialised). Keeping them out of
10
+ * vault.json keeps the vault file small + fast to load on
11
+ * every credential check.
12
+ * - Voiceprints have different threat semantics (auth data,
13
+ * not secret tokens). Same machine-fingerprint encryption
14
+ * is overkill; we keep the file readable but the embeddings
15
+ * themselves are not secret -- they cannot be reversed back
16
+ * into audio.
17
+ *
18
+ * The store API mirrors Vault: open / has / get / set / remove
19
+ * / list. Atomic write per operation. List returns metadata
20
+ * only (name, label, source, length, enrolled_at) -- never the
21
+ * raw vector.
22
+ *
23
+ * Loud failures per ROADMAP sec 12.2.
24
+ *
25
+ * ASCII-only.
26
+ */
27
+ import { promises as fs } from 'node:fs';
28
+ import path from 'node:path';
29
+ const FILENAME = 'voiceprints.json';
30
+ const TMP_SUFFIX = '.tmp';
31
+ const FILE_VERSION = 1;
32
+ const NAME_RE = /^[a-z][a-z0-9_-]*$/;
33
+ export class VoiceprintStore {
34
+ configDir;
35
+ identities;
36
+ constructor(configDir, identities) {
37
+ this.configDir = configDir;
38
+ this.identities = identities;
39
+ }
40
+ /** Open or create the store. Cleans up orphan .tmp from a
41
+ * previous crashed write. */
42
+ static async open(opts) {
43
+ if (!opts.configDir || !path.isAbsolute(opts.configDir)) {
44
+ throw new Error('VoiceprintStore.open: configDir must be an absolute path');
45
+ }
46
+ await fs.mkdir(opts.configDir, { recursive: true });
47
+ const tmpPath = path.join(opts.configDir, FILENAME + TMP_SUFFIX);
48
+ try {
49
+ await fs.unlink(tmpPath);
50
+ }
51
+ catch (err) {
52
+ if (err.code !== 'ENOENT')
53
+ throw err;
54
+ }
55
+ const filePath = path.join(opts.configDir, FILENAME);
56
+ let identities = {};
57
+ try {
58
+ const raw = await fs.readFile(filePath, 'utf-8');
59
+ const parsed = JSON.parse(raw);
60
+ if (!parsed || typeof parsed !== 'object') {
61
+ throw new Error('voiceprints.json is not an object');
62
+ }
63
+ if (parsed.version !== FILE_VERSION) {
64
+ throw new Error('voiceprints.json version mismatch (got ' + parsed.version
65
+ + ', expected ' + FILE_VERSION + ')');
66
+ }
67
+ if (!parsed.identities || typeof parsed.identities !== 'object') {
68
+ throw new Error('voiceprints.json missing identities map');
69
+ }
70
+ identities = parsed.identities;
71
+ }
72
+ catch (err) {
73
+ if (err.code !== 'ENOENT')
74
+ throw err;
75
+ /* First use -- empty store. */
76
+ }
77
+ return new VoiceprintStore(opts.configDir, identities);
78
+ }
79
+ has(name) {
80
+ return Object.prototype.hasOwnProperty.call(this.identities, name);
81
+ }
82
+ size() {
83
+ return Object.keys(this.identities).length;
84
+ }
85
+ list() {
86
+ return Object.entries(this.identities)
87
+ .map(([name, id]) => ({
88
+ name,
89
+ label: id.label,
90
+ source: id.embedding.source,
91
+ embedding_length: id.embedding.length,
92
+ enrolled_at: id.embedding.enrolled_at,
93
+ has_notes: !!(id.notes && id.notes.trim() !== ''),
94
+ }))
95
+ .sort((a, b) => a.name.localeCompare(b.name));
96
+ }
97
+ /** Server-side only: returns the raw identity including the
98
+ * embedding vector. Used by the matcher. Never wired to a
99
+ * route handler that returns to the browser. */
100
+ get(name) {
101
+ const id = this.identities[name];
102
+ if (!id)
103
+ throw new Error('voiceprint identity not found: ' + name);
104
+ return id;
105
+ }
106
+ /** All enrolled identities. Server-side only. */
107
+ all() {
108
+ return Object.values(this.identities);
109
+ }
110
+ async set(identity) {
111
+ if (!NAME_RE.test(identity.name)) {
112
+ throw new Error('voiceprint name must match ' + NAME_RE.source
113
+ + ' (lowercase alphanumeric + underscore + hyphen, starting with a letter). Got: '
114
+ + JSON.stringify(identity.name));
115
+ }
116
+ if (!identity.label || typeof identity.label !== 'string') {
117
+ throw new Error('voiceprint set: label is required');
118
+ }
119
+ if (!identity.embedding || !Array.isArray(identity.embedding.vector) || identity.embedding.vector.length === 0) {
120
+ throw new Error('voiceprint set: embedding vector is missing or empty');
121
+ }
122
+ if (identity.embedding.length !== identity.embedding.vector.length) {
123
+ throw new Error('voiceprint set: embedding length mismatch (claimed '
124
+ + identity.embedding.length + ', actual ' + identity.embedding.vector.length + ')');
125
+ }
126
+ this.identities[identity.name] = { ...identity };
127
+ await this.persist();
128
+ }
129
+ async remove(name) {
130
+ if (!Object.prototype.hasOwnProperty.call(this.identities, name)) {
131
+ return false;
132
+ }
133
+ delete this.identities[name];
134
+ await this.persist();
135
+ return true;
136
+ }
137
+ async persist() {
138
+ const filePath = path.join(this.configDir, FILENAME);
139
+ const payload = {
140
+ version: FILE_VERSION,
141
+ identities: this.identities,
142
+ };
143
+ const tmpPath = filePath + TMP_SUFFIX;
144
+ await fs.writeFile(tmpPath, JSON.stringify(payload, null, 2), { mode: 0o600 });
145
+ const fh = await fs.open(tmpPath, 'r+');
146
+ try {
147
+ await fh.sync();
148
+ }
149
+ finally {
150
+ await fh.close();
151
+ }
152
+ await fs.rename(tmpPath, filePath);
153
+ }
154
+ }
155
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/voice/voiceprint/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Trust state machine for the voice subsystem.
3
+ *
4
+ * Five layers, concentric. Outer layers ALWAYS apply -- a user
5
+ * who switches off the voiceprint check (Layer 2) still has
6
+ * the audit log (Layer 4) and the optional institutional
7
+ * remote review (Layer 5) on top.
8
+ *
9
+ * Layer 5: institutional log auditable from another device
10
+ * Layer 4: rollback command + audit log
11
+ * Layer 3: liveness check before irreversible ops
12
+ * Layer 2: explicit voice toggle ("modo confianza on/off")
13
+ * Layer 1: voiceprint match -> trust mode ON by default
14
+ *
15
+ * Operations are classified as:
16
+ *
17
+ * - safe: read-only. Never gated. Examples:
18
+ * forge.read_manifest, list_files,
19
+ * consult_nac_spec, reader operations.
20
+ * - standard: writes a file, runs tests, captures flow.
21
+ * Gated by Layer 1 (voiceprint match
22
+ * auto-approves; mismatch -> explicit
23
+ * confirmation unless permissive=true).
24
+ * - irreversible: npm publish, git push --force, delete
25
+ * branch, delete file. Gated by Layer 3
26
+ * (liveness check regardless of trust state).
27
+ *
28
+ * The state machine is per-session: the explicit toggle
29
+ * applies until the chat / mic session ends. Persisting the
30
+ * toggle across sessions is intentionally OFF -- a fresh
31
+ * boot starts with Layer 1 active (voiceprint required).
32
+ *
33
+ * Loud failures: anything that would gate an op surfaces a
34
+ * voice-readable reason the panel renders.
35
+ *
36
+ * ASCII-only.
37
+ */
38
+ import type { MatchOutput } from './match.js';
39
+ import type { VoiceprintConfig } from './types.js';
40
+ export type OperationClass = 'safe' | 'standard' | 'irreversible';
41
+ export interface TrustState {
42
+ /** Explicit user override (Layer 2). null = no override,
43
+ * trust follows the voiceprint match (Layer 1). 'on' =
44
+ * force trust regardless of voiceprint. 'off' = force
45
+ * explicit confirmation regardless of voiceprint. */
46
+ override: 'on' | 'off' | null;
47
+ /** The most recent identify() output. null when no voice
48
+ * turn has happened yet in this session. */
49
+ lastMatch: MatchOutput | null;
50
+ /** Identity name that owns the session, once Layer 1
51
+ * promotes them. null when no identity is locked in. */
52
+ activeIdentity: string | null;
53
+ }
54
+ export interface TrustDecision {
55
+ /** True when the op may proceed without further checks. */
56
+ allowed: boolean;
57
+ /** True when a liveness challenge must happen first
58
+ * (Layer 3). When true, the caller plays a random-phrase
59
+ * prompt + records + re-runs identify; only then is the
60
+ * op dispatched. */
61
+ requires_liveness: boolean;
62
+ /** Voice-readable reason (Spanish first, English fallback)
63
+ * for the panel + TTS. */
64
+ reason: string;
65
+ /** Which layer made the decision. Helpful in the audit log. */
66
+ layer: 1 | 2 | 3 | 4 | 5;
67
+ }
68
+ export declare function freshTrustState(): TrustState;
69
+ /**
70
+ * Decide whether an operation may proceed given the current
71
+ * trust state + voice config.
72
+ *
73
+ * The caller is the chat tool dispatcher (server-side). On
74
+ * `requires_liveness: true` the dispatcher does NOT execute
75
+ * the tool immediately -- it kicks off a liveness challenge
76
+ * UI, waits for the result, then re-invokes decideTrust with
77
+ * the fresh identify outcome.
78
+ */
79
+ export declare function decideTrust(operationClass: OperationClass, state: TrustState, config?: VoiceprintConfig): TrustDecision;
80
+ /**
81
+ * Apply a fresh identify() outcome to the trust state. Mutates
82
+ * the state in place + returns it for chaining. When the match
83
+ * lands and there is no active identity yet, the matched name
84
+ * becomes the active identity for the session.
85
+ */
86
+ export declare function ingestIdentify(state: TrustState, match: MatchOutput): TrustState;
87
+ /** Explicit user toggle (Layer 2). null clears the override
88
+ * and falls back to Layer 1. */
89
+ export declare function setOverride(state: TrustState, override: 'on' | 'off' | null): TrustState;
90
+ //# sourceMappingURL=trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../../src/voice/voiceprint/trust.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,cAAc,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB;;;0DAGsD;IACtD,QAAQ,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IAC9B;iDAC6C;IAC7C,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B;6DACyD;IACzD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB;;;yBAGqB;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B;+BAC2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC1B;AAED,wBAAgB,eAAe,IAAI,UAAU,CAM5C;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,UAAU,EACjB,MAAM,GAAE,gBAA4C,GACnD,aAAa,CA6Ef;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,CAMhF;AAED;iCACiC;AACjC,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,UAAU,CAGxF"}