@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,150 @@
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 { DEFAULT_VOICEPRINT_CONFIG } from './types.js';
39
+ export function freshTrustState() {
40
+ return {
41
+ override: null,
42
+ lastMatch: null,
43
+ activeIdentity: null,
44
+ };
45
+ }
46
+ /**
47
+ * Decide whether an operation may proceed given the current
48
+ * trust state + voice config.
49
+ *
50
+ * The caller is the chat tool dispatcher (server-side). On
51
+ * `requires_liveness: true` the dispatcher does NOT execute
52
+ * the tool immediately -- it kicks off a liveness challenge
53
+ * UI, waits for the result, then re-invokes decideTrust with
54
+ * the fresh identify outcome.
55
+ */
56
+ export function decideTrust(operationClass, state, config = DEFAULT_VOICEPRINT_CONFIG) {
57
+ /* Safe ops are never gated. They land regardless of trust
58
+ state for a usable read-only experience. */
59
+ if (operationClass === 'safe') {
60
+ return {
61
+ allowed: true,
62
+ requires_liveness: false,
63
+ reason: 'safe operation -- read-only, no gating',
64
+ layer: 1,
65
+ };
66
+ }
67
+ /* Irreversible ops ALWAYS require liveness, regardless of
68
+ trust state. Layer 3 is non-overridable. */
69
+ if (operationClass === 'irreversible') {
70
+ return {
71
+ allowed: false,
72
+ requires_liveness: true,
73
+ reason: 'irreversible operation -- liveness check required',
74
+ layer: 3,
75
+ };
76
+ }
77
+ /* Standard ops: Layer 2 override wins, then Layer 1. */
78
+ if (state.override === 'off') {
79
+ return {
80
+ allowed: false,
81
+ requires_liveness: false,
82
+ reason: 'trust mode off -- explicit user confirmation required',
83
+ layer: 2,
84
+ };
85
+ }
86
+ if (state.override === 'on') {
87
+ return {
88
+ allowed: true,
89
+ requires_liveness: false,
90
+ reason: 'trust mode forced on by user',
91
+ layer: 2,
92
+ };
93
+ }
94
+ /* Layer 1: voiceprint match. */
95
+ if (state.lastMatch === null) {
96
+ /* No identify() ran yet -- err on the side of explicit
97
+ confirmation. */
98
+ return {
99
+ allowed: false,
100
+ requires_liveness: false,
101
+ reason: 'no voiceprint match yet -- speak once to identify yourself',
102
+ layer: 1,
103
+ };
104
+ }
105
+ if (state.lastMatch.matched === null) {
106
+ /* Speaker not recognised. */
107
+ if (config.permissive) {
108
+ return {
109
+ allowed: true,
110
+ requires_liveness: false,
111
+ reason: 'permissive mode -- unknown speaker allowed',
112
+ layer: 1,
113
+ };
114
+ }
115
+ return {
116
+ allowed: false,
117
+ requires_liveness: false,
118
+ reason: 'unknown speaker -- enroll first or toggle trust mode',
119
+ layer: 1,
120
+ };
121
+ }
122
+ /* Match found -- proceed. */
123
+ return {
124
+ allowed: true,
125
+ requires_liveness: false,
126
+ reason: 'voiceprint match: ' + state.lastMatch.matched
127
+ + ' (score ' + state.lastMatch.score.toFixed(2) + ')',
128
+ layer: 1,
129
+ };
130
+ }
131
+ /**
132
+ * Apply a fresh identify() outcome to the trust state. Mutates
133
+ * the state in place + returns it for chaining. When the match
134
+ * lands and there is no active identity yet, the matched name
135
+ * becomes the active identity for the session.
136
+ */
137
+ export function ingestIdentify(state, match) {
138
+ state.lastMatch = match;
139
+ if (state.activeIdentity === null && match.matched) {
140
+ state.activeIdentity = match.matched;
141
+ }
142
+ return state;
143
+ }
144
+ /** Explicit user toggle (Layer 2). null clears the override
145
+ * and falls back to Layer 1. */
146
+ export function setOverride(state, override) {
147
+ state.override = override;
148
+ return state;
149
+ }
150
+ //# sourceMappingURL=trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust.js","sourceRoot":"","sources":["../../../src/voice/voiceprint/trust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Voiceprint subsystem -- type surface.
3
+ *
4
+ * The voiceprint subsystem identifies who is speaking by
5
+ * computing a fixed-size embedding from an audio sample and
6
+ * comparing it against enrolled embeddings via cosine similarity.
7
+ *
8
+ * Provider pattern mirrors STT/TTS: an interface + multiple
9
+ * implementations registered with an ID. Default (alpha) is
10
+ * `local-mfcc-stub` -- a pure-Node placeholder good enough to
11
+ * exercise the state machine + types but NOT production
12
+ * quality. SpeechBrain via Python sidecar lands later;
13
+ * Google Speaker Recognition cloud is the configurable
14
+ * primary per Pablo's G-VOICE-1 decision (2026-05-23).
15
+ *
16
+ * ASCII-only.
17
+ */
18
+ /** Identifiers for voiceprint providers. Open string union --
19
+ * same pattern as the STT/TTS provider ids. */
20
+ export type VoiceprintProviderId = 'local-mfcc-stub' | 'speechbrain-py' | 'google' | string;
21
+ /** A computed embedding. Vectors are typically 256-dimensional
22
+ * but the size is provider-specific; we store the length
23
+ * alongside for sanity checks. */
24
+ export interface VoiceprintEmbedding {
25
+ /** Embedding vector. Floats, typically L2-normalised by the
26
+ * provider so cosine == dot product. */
27
+ vector: number[];
28
+ /** Length of vector. Stored explicitly so a deserialised
29
+ * embedding can be validated cheaply. */
30
+ length: number;
31
+ /** Provider id that produced the embedding. Required so
32
+ * matches across providers can be flagged loudly. */
33
+ source: VoiceprintProviderId;
34
+ /** ISO 8601 timestamp of enrollment. Audit trail. */
35
+ enrolled_at: string;
36
+ }
37
+ /** A request to extract an embedding from audio bytes. */
38
+ export interface VoiceprintExtractRequest {
39
+ audio: Buffer;
40
+ /** Audio format. Same enum as the STT request. */
41
+ format: 'webm' | 'ogg' | 'wav' | 'mp3' | 'flac' | 'mp4';
42
+ }
43
+ /** Provider interface every voiceprint backend implements. */
44
+ export interface VoiceprintProvider {
45
+ readonly id: VoiceprintProviderId;
46
+ /** Embedding dimensionality this provider produces.
47
+ * Mismatches across providers fail the match step
48
+ * loudly. */
49
+ readonly embeddingSize: number;
50
+ /** True when the provider has everything it needs.
51
+ * Local stub is always ready; cloud providers check the
52
+ * vault for credentials. */
53
+ readyToRun(): Promise<boolean>;
54
+ /** Extract an embedding from the audio. */
55
+ extract(req: VoiceprintExtractRequest): Promise<VoiceprintEmbedding>;
56
+ }
57
+ /** User-facing voiceprint configuration. Persisted in the same
58
+ * ~/.yujin-forge/voice-config.json under the `voiceprint` key
59
+ * added in this slice. */
60
+ export interface VoiceprintConfig {
61
+ /** Active provider. */
62
+ provider: VoiceprintProviderId;
63
+ /** Cosine similarity threshold above which a match counts as
64
+ * the enrolled speaker. Default 0.75 (conservative). */
65
+ threshold: number;
66
+ /** When true, mismatches do NOT block tool dispatch -- they
67
+ * only annotate the audit log. Useful in development. */
68
+ permissive: boolean;
69
+ }
70
+ export declare const DEFAULT_VOICEPRINT_CONFIG: VoiceprintConfig;
71
+ /** A single enrolled identity. Multiple identities can be
72
+ * enrolled per install (parent + child + helper sharing a
73
+ * workstation). */
74
+ export interface EnrolledIdentity {
75
+ /** Stable identifier (snake_case). Used as a key in the
76
+ * enrollment store. */
77
+ name: string;
78
+ /** The embedding extracted during enrollment. */
79
+ embedding: VoiceprintEmbedding;
80
+ /** Human-readable label shown to the user
81
+ * ("Pablo", "Mama", "Helper"). */
82
+ label: string;
83
+ /** Free-form notes for the audit trail. */
84
+ notes?: string;
85
+ }
86
+ /** Result of a match against the enrolled set. */
87
+ export interface MatchResult {
88
+ /** Name of the best-matching enrolled identity, or null when
89
+ * no enrolled embedding exceeded the threshold. */
90
+ matched: string | null;
91
+ /** Cosine similarity score of the best match. */
92
+ score: number;
93
+ /** All scores for transparency / debugging. Map of name ->
94
+ * score, sorted descending. */
95
+ ranked: Array<{
96
+ name: string;
97
+ score: number;
98
+ }>;
99
+ }
100
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/voice/voiceprint/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;gDACgD;AAChD,MAAM,MAAM,oBAAoB,GAC5B,iBAAiB,GACjB,gBAAgB,GAChB,QAAQ,GACR,MAAM,CAAC;AAEX;;mCAEmC;AACnC,MAAM,WAAW,mBAAmB;IAClC;6CACyC;IACzC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;8CAC0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf;0DACsD;IACtD,MAAM,EAAE,oBAAoB,CAAC;IAC7B,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,0DAA0D;AAC1D,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;CACzD;AAED,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,oBAAoB,CAAC;IAClC;;kBAEc;IACd,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B;;iCAE6B;IAC7B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,2CAA2C;IAC3C,OAAO,CAAC,GAAG,EAAE,wBAAwB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACtE;AAED;;2BAE2B;AAC3B,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B;6DACyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB;8DAC0D;IAC1D,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,yBAAyB,EAAE,gBAIvC,CAAC;AAEF;;oBAEoB;AACpB,MAAM,WAAW,gBAAgB;IAC/B;4BACwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,SAAS,EAAE,mBAAmB,CAAC;IAC/B;uCACmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B;wDACoD;IACpD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd;oCACgC;IAChC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Voiceprint subsystem -- type surface.
3
+ *
4
+ * The voiceprint subsystem identifies who is speaking by
5
+ * computing a fixed-size embedding from an audio sample and
6
+ * comparing it against enrolled embeddings via cosine similarity.
7
+ *
8
+ * Provider pattern mirrors STT/TTS: an interface + multiple
9
+ * implementations registered with an ID. Default (alpha) is
10
+ * `local-mfcc-stub` -- a pure-Node placeholder good enough to
11
+ * exercise the state machine + types but NOT production
12
+ * quality. SpeechBrain via Python sidecar lands later;
13
+ * Google Speaker Recognition cloud is the configurable
14
+ * primary per Pablo's G-VOICE-1 decision (2026-05-23).
15
+ *
16
+ * ASCII-only.
17
+ */
18
+ export const DEFAULT_VOICEPRINT_CONFIG = {
19
+ provider: 'local-mfcc-stub',
20
+ threshold: 0.75,
21
+ permissive: false,
22
+ };
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/voice/voiceprint/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA+DH,MAAM,CAAC,MAAM,yBAAyB,GAAqB;IACzD,QAAQ,EAAE,iBAAiB;IAC3B,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,KAAK;CAClB,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Wake-word matcher (PLAN soft #8).
3
+ *
4
+ * Problem (Pablo 2026-05-26): "Yujin" pronounces as "yu-yin"
5
+ * in Japanese, but STT providers trained mostly on English
6
+ * write the audio back as a noisy set of variants:
7
+ * "yujin" / "yuyin" / "you jin" / "u jin" / "yujín" / etc.
8
+ *
9
+ * A literal match against "yujin" would miss most utterances.
10
+ *
11
+ * Strategy (A + C combined):
12
+ * A. Default alias list covers the variants we know STTs
13
+ * emit + Levenshtein distance ≤ 2 catches the rest.
14
+ * B. User can extend the alias list per-device via the
15
+ * vault slot `wake_aliases` (comma-separated). The
16
+ * `yf voice config --aliases X,Y,Z` CLI persists it.
17
+ *
18
+ * Pre-processing:
19
+ * - lowercase
20
+ * - strip accents (NFD + ASCII filter)
21
+ * - strip dashes, periods, commas
22
+ * - collapse whitespace
23
+ *
24
+ * Match algorithm:
25
+ * - exact alias match -> hit
26
+ * - fuzzy Levenshtein distance 0..2 against any alias -> hit
27
+ * - else miss
28
+ *
29
+ * The matcher is invoked on the FIRST window of every voice
30
+ * turn; once it fires, intents.ts takes over for the rest of
31
+ * the utterance.
32
+ *
33
+ * ASCII-only.
34
+ */
35
+ export declare const DEFAULT_WAKE_ALIASES: readonly string[];
36
+ export interface WakeMatchResult {
37
+ hit: boolean;
38
+ /** Alias the matcher hit on (canonical form). */
39
+ matched_alias?: string;
40
+ /** Distance from the alias (0 = exact, 1-2 = fuzzy). */
41
+ distance?: number;
42
+ /** Normalised version of the input that the matcher saw. */
43
+ normalised: string;
44
+ }
45
+ export interface WakeMatchOptions {
46
+ /** Override or extend the default alias set. When provided,
47
+ * replaces DEFAULT_WAKE_ALIASES entirely (use mergeAliases
48
+ * to combine). */
49
+ aliases?: readonly string[];
50
+ /** Maximum Levenshtein distance accepted. Default 2. */
51
+ maxDistance?: number;
52
+ }
53
+ /** Normalise a transcript chunk so STT noise (accents,
54
+ * punctuation, casing) does not block the match. */
55
+ export declare function normaliseWakeInput(input: string): string;
56
+ /** Classic Levenshtein. O(n*m). For wake-word strings (< 20
57
+ * chars) the cost is trivial. */
58
+ export declare function levenshtein(a: string, b: string): number;
59
+ /** Run the wake-word matcher against the input. */
60
+ export declare function matchWakeWord(input: string, opts?: WakeMatchOptions): WakeMatchResult;
61
+ /** Merge user-provided aliases with the defaults, dedup +
62
+ * normalised. */
63
+ export declare function mergeAliases(extra: readonly string[]): string[];
64
+ //# sourceMappingURL=wake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wake.d.ts","sourceRoot":"","sources":["../../src/voice/wake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAMH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAcjD,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,OAAO,CAAC;IACb,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;uBAEmB;IACnB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;qDACqD;AACrD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASxD;AAED;kCACkC;AAClC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBxD;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,gBAAqB,GAC1B,eAAe,CAsCjB;AAED;kBACkB;AAClB,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAW/D"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Wake-word matcher (PLAN soft #8).
3
+ *
4
+ * Problem (Pablo 2026-05-26): "Yujin" pronounces as "yu-yin"
5
+ * in Japanese, but STT providers trained mostly on English
6
+ * write the audio back as a noisy set of variants:
7
+ * "yujin" / "yuyin" / "you jin" / "u jin" / "yujín" / etc.
8
+ *
9
+ * A literal match against "yujin" would miss most utterances.
10
+ *
11
+ * Strategy (A + C combined):
12
+ * A. Default alias list covers the variants we know STTs
13
+ * emit + Levenshtein distance ≤ 2 catches the rest.
14
+ * B. User can extend the alias list per-device via the
15
+ * vault slot `wake_aliases` (comma-separated). The
16
+ * `yf voice config --aliases X,Y,Z` CLI persists it.
17
+ *
18
+ * Pre-processing:
19
+ * - lowercase
20
+ * - strip accents (NFD + ASCII filter)
21
+ * - strip dashes, periods, commas
22
+ * - collapse whitespace
23
+ *
24
+ * Match algorithm:
25
+ * - exact alias match -> hit
26
+ * - fuzzy Levenshtein distance 0..2 against any alias -> hit
27
+ * - else miss
28
+ *
29
+ * The matcher is invoked on the FIRST window of every voice
30
+ * turn; once it fires, intents.ts takes over for the rest of
31
+ * the utterance.
32
+ *
33
+ * ASCII-only.
34
+ */
35
+ /* Default aliases we know STTs emit for "Yujin" / "yu-yin".
36
+ * Accented forms ("yujín", "yuyín") would normalise into the
37
+ * un-accented variants -- keep only the canonical post-normalise
38
+ * shapes here so mergeAliases dedup math stays predictable. */
39
+ export const DEFAULT_WAKE_ALIASES = [
40
+ 'yujin',
41
+ 'yuyin',
42
+ 'you jin',
43
+ 'you yin',
44
+ 'u jin',
45
+ 'yu jin',
46
+ 'yu yin',
47
+ 'yoo jin',
48
+ 'yoo yin',
49
+ 'yujim',
50
+ 'yuyim',
51
+ 'yu shin',
52
+ 'you shin',
53
+ ];
54
+ /** Normalise a transcript chunk so STT noise (accents,
55
+ * punctuation, casing) does not block the match. */
56
+ export function normaliseWakeInput(input) {
57
+ const lower = input.toLowerCase();
58
+ /* NFD decomposes accented chars into base + combining mark;
59
+ the [̀-ͯ] range covers all combining diacritics. */
60
+ const stripped = lower.normalize('NFD').replace(/[̀-ͯ]/g, '');
61
+ /* Strip punctuation that STTs sometimes insert. */
62
+ const noPunct = stripped.replace(/[.,;:!?\-_'"]/g, ' ');
63
+ /* Collapse whitespace. */
64
+ return noPunct.replace(/\s+/g, ' ').trim();
65
+ }
66
+ /** Classic Levenshtein. O(n*m). For wake-word strings (< 20
67
+ * chars) the cost is trivial. */
68
+ export function levenshtein(a, b) {
69
+ if (a === b)
70
+ return 0;
71
+ if (a.length === 0)
72
+ return b.length;
73
+ if (b.length === 0)
74
+ return a.length;
75
+ /* Rolling 2-row matrix to keep memory tight. */
76
+ let prev = new Array(b.length + 1);
77
+ let curr = new Array(b.length + 1);
78
+ for (let j = 0; j <= b.length; j++)
79
+ prev[j] = j;
80
+ for (let i = 1; i <= a.length; i++) {
81
+ curr[0] = i;
82
+ for (let j = 1; j <= b.length; j++) {
83
+ const cost = a.charCodeAt(i - 1) === b.charCodeAt(j - 1) ? 0 : 1;
84
+ curr[j] = Math.min(curr[j - 1] + 1, /* insert */ prev[j] + 1, /* delete */ prev[j - 1] + cost);
85
+ }
86
+ [prev, curr] = [curr, prev];
87
+ }
88
+ return prev[b.length];
89
+ }
90
+ /** Run the wake-word matcher against the input. */
91
+ export function matchWakeWord(input, opts = {}) {
92
+ const normalised = normaliseWakeInput(input);
93
+ if (normalised.length === 0) {
94
+ return { hit: false, normalised };
95
+ }
96
+ const aliases = (opts.aliases ?? DEFAULT_WAKE_ALIASES).map((a) => normaliseWakeInput(a));
97
+ const maxDist = opts.maxDistance ?? 2;
98
+ /* Build candidates: the full normalised string, every single
99
+ token, and every contiguous pair of tokens. This catches
100
+ filler-prefixed utterances like "hey yujin" / "ok yu jin"
101
+ plus single-word matches when STT misses spaces. */
102
+ const tokens = normalised.split(' ');
103
+ const candidates = [normalised];
104
+ for (let i = 0; i < tokens.length; i++) {
105
+ candidates.push(tokens[i]);
106
+ if (i + 1 < tokens.length)
107
+ candidates.push(tokens[i] + ' ' + tokens[i + 1]);
108
+ }
109
+ let best = null;
110
+ for (const c of candidates) {
111
+ for (const a of aliases) {
112
+ const d = levenshtein(c, a);
113
+ if (d <= maxDist) {
114
+ if (!best || d < best.distance)
115
+ best = { alias: a, distance: d };
116
+ }
117
+ }
118
+ }
119
+ if (best) {
120
+ return {
121
+ hit: true,
122
+ matched_alias: best.alias,
123
+ distance: best.distance,
124
+ normalised,
125
+ };
126
+ }
127
+ return { hit: false, normalised };
128
+ }
129
+ /** Merge user-provided aliases with the defaults, dedup +
130
+ * normalised. */
131
+ export function mergeAliases(extra) {
132
+ const seen = new Set();
133
+ const out = [];
134
+ for (const a of [...DEFAULT_WAKE_ALIASES, ...extra]) {
135
+ const norm = normaliseWakeInput(a);
136
+ if (norm.length > 0 && !seen.has(norm)) {
137
+ seen.add(norm);
138
+ out.push(norm);
139
+ }
140
+ }
141
+ return out;
142
+ }
143
+ //# sourceMappingURL=wake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wake.js","sourceRoot":"","sources":["../../src/voice/wake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ <!DOCTYPE html>
2
+ <html lang="ar" dir="rtl">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Yujin Forge -- دليل المستخدم</title>
6
+ </head>
7
+ <body>
8
+
9
+ <h1>Yujin Forge -- دليل المستخدم</h1>
10
+
11
+ <p>مساعد تطوير صوتي أولاً لبناء تطبيقات React + NAC-3. مصمم
12
+ ليتمكن مرافق أو طفل يتعلم البرمجة من تشغيله دون الحاجة إلى
13
+ لمس الطرفية.</p>
14
+
15
+ <h2>مرحباً</h2>
16
+
17
+ <p>يقوم Yujin Forge بثلاثة أشياء بسيطة:</p>
18
+ <ul>
19
+ <li>يقرأ المستندات بصوت عالٍ (PDF، Word، HTML، MD، EPUB،
20
+ CSV، Excel، الكود المصدري، txt، RTF).</li>
21
+ <li>يأخذ مواصفات التصميم ويولد كود التطبيق تلقائياً.</li>
22
+ <li>يتحدث مع مساعد ذكاء اصطناعي يعرف مشروعك: قراءة البيان،
23
+ البحث في SPEC، تحرير المكونات، إجراء الالتزامات.</li>
24
+ </ul>
25
+
26
+ <h2>التثبيت</h2>
27
+
28
+ <ol>
29
+ <li>قم بتثبيت Node.js 18.17 أو أحدث من nodejs.org.</li>
30
+ <li>في الطرفية: <pre>npm install -g @yujin/forge-cli@alpha</pre></li>
31
+ <li>تحقق باستخدام <code>yf --version</code>.</li>
32
+ <li>قم بتشغيل <code>yf doctor</code>.</li>
33
+ </ol>
34
+
35
+ <h2>التشغيل الأول</h2>
36
+
37
+ <pre>yf chat</pre>
38
+
39
+ <p>يفتح المتصفح لوحة Yujin. انقر فوق زر <strong>المفاتيح</strong>
40
+ وحمّل مفاتيح API. يظهر كل مفتاح مرة واحدة فقط عند إدخاله.</p>
41
+
42
+ <h2>الأوامر الصوتية</h2>
43
+
44
+ <p>يفهم Yujin الإسبانية والإنجليزية والبرتغالية والفرنسية
45
+ والألمانية والإيطالية واليابانية والصينية والهندية والعربية.</p>
46
+
47
+ <table border="1">
48
+ <tr><th>تقول</th><th>ماذا يحدث</th></tr>
49
+ <tr><td>"افتح <em>الملف</em>"</td><td>يفتح المستند.</td></tr>
50
+ <tr><td>"التالي" / "استمر"</td><td>ينتقل إلى الكتلة التالية.</td></tr>
51
+ <tr><td>"ابحث عن <em>كلمة</em>"</td><td>يبحث ويقرأ أول تطابق.</td></tr>
52
+ <tr><td>"علامة هنا باسم <em>اسم</em>"</td><td>يضع علامة مرجعية.</td></tr>
53
+ <tr><td>"انتقل إلى العلامة <em>اسم</em>"</td><td>يعود إلى العلامة.</td></tr>
54
+ <tr><td>"تلخيص"</td><td>يعيد قراءة آخر الكتل.</td></tr>
55
+ <tr><td>"افتح الدليل"</td><td>يفتح هذا الدليل بلغتك.</td></tr>
56
+ </table>
57
+
58
+ <h2>استيعاب المواصفات</h2>
59
+
60
+ <p>اسحب ملف مواصفات إلى اللوحة. تظهر شاشة بنفسجية بها كانجي.
61
+ أفلت الملف عليها.</p>
62
+
63
+ <ol>
64
+ <li>يقرأ Yujin المستند.</li>
65
+ <li>يستخرج Claude المتطلبات والكيانات ونقاط النهاية والمكونات.</li>
66
+ <li>يقدم Claude خطة للملفات المراد إنشاؤها.</li>
67
+ <li>يعرض Yujin الخطة. قل "موافق".</li>
68
+ <li>ينشئ الملفات في مجلد مشروعك.</li>
69
+ <li>إذا حدث خطأ، قل "تراجع".</li>
70
+ </ol>
71
+
72
+ <h2>حل المشكلات</h2>
73
+
74
+ <dl>
75
+ <dt>الميكروفون لا يعمل</dt>
76
+ <dd>يطلب المتصفح الإذن لأول مرة. انقر فوق القفل بجانب URL.</dd>
77
+ <dt>لا يفهمني</dt>
78
+ <dd>حمّل مفتاح OpenAI في خانة <code>openai</code>.</dd>
79
+ <dt>الصوت سيء</dt>
80
+ <dd>حمّل مفتاح ElevenLabs للحصول على صوت أكثر طبيعية.</dd>
81
+ <dt>أريد البدء من جديد</dt>
82
+ <dd>أغلق Yujin. احذف <code>~/.yujin-forge/</code>.
83
+ قم بتشغيل <code>yf chat</code> مرة أخرى.</dd>
84
+ </dl>
85
+
86
+ <h2>الدعم</h2>
87
+
88
+ <p>الدعم: <a href="mailto:pablo@rpaforce.com">pablo@rpaforce.com</a></p>
89
+
90
+ </body>
91
+ </html>