@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,471 @@
1
+ /**
2
+ * Reader chat tools (V1.28 of HITO 1).
3
+ *
4
+ * Exposes the reader subsystem (V1.14+) to the chat catalog.
5
+ * Single shared session map at module scope so the user can
6
+ * open a doc in one chat turn and continue navigating it in
7
+ * the next.
8
+ *
9
+ * Tools:
10
+ * forge.reader.open(path)
11
+ * forge.reader.list_documents()
12
+ * forge.reader.read_section(doc_id, index?)
13
+ * forge.reader.next_block(doc_id)
14
+ * forge.reader.search(doc_id, query, max?)
15
+ * forge.reader.bookmark_set(doc_id, name)
16
+ * forge.reader.bookmark_jump(doc_id, name)
17
+ * forge.reader.recap(doc_id, window?)
18
+ *
19
+ * All read-only (requires_approval=false). The reader does
20
+ * not write to the project; it parses + remembers state +
21
+ * answers queries.
22
+ *
23
+ * Loud failures per ROADMAP sec 12.2.
24
+ *
25
+ * ASCII-only.
26
+ */
27
+ import path from 'node:path';
28
+ import { promises as fs } from 'node:fs';
29
+ import { parseDocument } from '../../reader/registry.js';
30
+ import { startSession, advanceCursor, setBookmark, jumpToBookmark, getBlock, seekSectionByIndex, recordSpoken, } from '../../reader/state.js';
31
+ import { searchDocument } from '../../reader/search.js';
32
+ import { isText } from '../../reader/state.js';
33
+ /** Shared session map at module scope. */
34
+ const SESSIONS = new Map();
35
+ let _recapSummarizer = null;
36
+ export function setRecapSummarizer(impl) {
37
+ _recapSummarizer = impl;
38
+ }
39
+ /** Test seam. */
40
+ export function _resetReaderForTests() {
41
+ SESSIONS.clear();
42
+ _recapSummarizer = null;
43
+ }
44
+ /* ============================================================
45
+ * Specs
46
+ * ============================================================ */
47
+ export const READER_OPEN_SPEC = {
48
+ name: 'forge.reader.open',
49
+ description: 'Open a document for reading. Auto-detects format (txt / md / source / ...). Returns the doc_id + title + section count + first block.',
50
+ input_schema: {
51
+ type: 'object',
52
+ properties: {
53
+ path: { type: 'string', description: 'Path to the document. Relative to projectRoot or absolute.' },
54
+ },
55
+ required: ['path'],
56
+ },
57
+ requires_approval: false,
58
+ };
59
+ export const READER_LIST_DOCS_SPEC = {
60
+ name: 'forge.reader.list_documents',
61
+ description: 'List all documents currently open in this chat session.',
62
+ input_schema: { type: 'object', properties: {}, required: [] },
63
+ requires_approval: false,
64
+ };
65
+ export const READER_READ_SECTION_SPEC = {
66
+ name: 'forge.reader.read_section',
67
+ description: 'Return the blocks of a section. With no index, returns the current section under the cursor.',
68
+ input_schema: {
69
+ type: 'object',
70
+ properties: {
71
+ doc_id: { type: 'string', description: 'Document id returned by forge.reader.open.' },
72
+ index: { type: 'number', description: 'Optional 0-based section index. Default: current section.' },
73
+ },
74
+ required: ['doc_id'],
75
+ },
76
+ requires_approval: false,
77
+ };
78
+ export const READER_NEXT_BLOCK_SPEC = {
79
+ name: 'forge.reader.next_block',
80
+ description: 'Advance the reader cursor one block forward. Returns the new block contents.',
81
+ input_schema: {
82
+ type: 'object',
83
+ properties: {
84
+ doc_id: { type: 'string' },
85
+ },
86
+ required: ['doc_id'],
87
+ },
88
+ requires_approval: false,
89
+ };
90
+ export const READER_SEARCH_SPEC = {
91
+ name: 'forge.reader.search',
92
+ description: 'Full-text search across a document. Returns top hits sorted by match count.',
93
+ input_schema: {
94
+ type: 'object',
95
+ properties: {
96
+ doc_id: { type: 'string' },
97
+ query: { type: 'string' },
98
+ max: { type: 'number', description: 'Max hits. Default 20, max 100.' },
99
+ },
100
+ required: ['doc_id', 'query'],
101
+ },
102
+ requires_approval: false,
103
+ };
104
+ export const READER_BOOKMARK_SET_SPEC = {
105
+ name: 'forge.reader.bookmark_set',
106
+ description: 'Set a named bookmark at the current cursor position.',
107
+ input_schema: {
108
+ type: 'object',
109
+ properties: {
110
+ doc_id: { type: 'string' },
111
+ name: { type: 'string', description: 'Bookmark name (lowercase + digits + _ -). Must start with a letter.' },
112
+ },
113
+ required: ['doc_id', 'name'],
114
+ },
115
+ requires_approval: false,
116
+ };
117
+ export const READER_BOOKMARK_JUMP_SPEC = {
118
+ name: 'forge.reader.bookmark_jump',
119
+ description: 'Jump the cursor to a previously-set bookmark.',
120
+ input_schema: {
121
+ type: 'object',
122
+ properties: {
123
+ doc_id: { type: 'string' },
124
+ name: { type: 'string' },
125
+ },
126
+ required: ['doc_id', 'name'],
127
+ },
128
+ requires_approval: false,
129
+ };
130
+ export const READER_RECAP_SPEC = {
131
+ name: 'forge.reader.recap',
132
+ description: 'Return the last N spoken blocks from the reader playback buffer. Default window 10. mode="summary" returns a Claude-generated 1-2 sentence summary instead of literal blocks (charges tokens; gated by env YF_ENABLE_CLAUDE_RECAP=1).',
133
+ input_schema: {
134
+ type: 'object',
135
+ properties: {
136
+ doc_id: { type: 'string' },
137
+ window: { type: 'number', description: 'How many recent blocks to include. Default 10, max 60.' },
138
+ mode: { type: 'string', enum: ['literal', 'summary'], description: 'literal (default) returns the blocks verbatim; summary calls Claude to compress into 1-2 sentences. summary costs tokens.' },
139
+ },
140
+ required: ['doc_id'],
141
+ },
142
+ requires_approval: false,
143
+ };
144
+ /* ============================================================
145
+ * Implementations
146
+ * ============================================================ */
147
+ function getSession(docId) {
148
+ const s = SESSIONS.get(docId);
149
+ if (!s)
150
+ throw new Error('reader: no open document with id ' + docId + ' -- call forge.reader.open first');
151
+ return s;
152
+ }
153
+ export async function runReaderOpen(args, ctx) {
154
+ if (typeof args.path !== 'string' || args.path.trim() === '') {
155
+ return { tool: READER_OPEN_SPEC.name, result: { error: 'path is required and must be a non-empty string' }, is_error: true, display: 'no path' };
156
+ }
157
+ const abs = path.isAbsolute(args.path) ? args.path : path.join(ctx.projectRoot, args.path);
158
+ let buffer;
159
+ try {
160
+ buffer = await fs.readFile(abs);
161
+ }
162
+ catch (err) {
163
+ return { tool: READER_OPEN_SPEC.name, result: { error: 'could not read file: ' + (err instanceof Error ? err.message : String(err)) }, is_error: true, display: 'read failed' };
164
+ }
165
+ const filename = path.basename(abs);
166
+ let doc;
167
+ try {
168
+ doc = await parseDocument({ filename, buffer });
169
+ }
170
+ catch (err) {
171
+ return { tool: READER_OPEN_SPEC.name, result: { error: err instanceof Error ? err.message : String(err) }, is_error: true, display: 'parse failed' };
172
+ }
173
+ const session = startSession(doc);
174
+ SESSIONS.set(doc.id, session);
175
+ /* First text block contents for immediate playback by the
176
+ caller. */
177
+ let firstText = '';
178
+ if (session.cursor_block_id) {
179
+ try {
180
+ const b = getBlock(doc, session.cursor_block_id);
181
+ if (isText(b))
182
+ firstText = b.text;
183
+ }
184
+ catch { /* empty doc */ }
185
+ }
186
+ return {
187
+ tool: READER_OPEN_SPEC.name,
188
+ result: {
189
+ doc_id: doc.id,
190
+ filename: doc.filename,
191
+ format: doc.format,
192
+ title: doc.title,
193
+ sections: doc.sections.length,
194
+ cursor_block_id: session.cursor_block_id,
195
+ first_text: firstText,
196
+ },
197
+ display: 'opened ' + doc.filename + ' (' + doc.sections.length + ' section(s))',
198
+ };
199
+ }
200
+ export async function runReaderListDocuments() {
201
+ const entries = Array.from(SESSIONS.values()).map((s) => ({
202
+ doc_id: s.doc.id,
203
+ filename: s.doc.filename,
204
+ format: s.doc.format,
205
+ title: s.doc.title,
206
+ sections: s.doc.sections.length,
207
+ cursor_block_id: s.cursor_block_id,
208
+ state: s.state,
209
+ }));
210
+ return {
211
+ tool: READER_LIST_DOCS_SPEC.name,
212
+ result: { documents: entries },
213
+ display: entries.length + ' document(s) open',
214
+ };
215
+ }
216
+ export async function runReaderReadSection(args) {
217
+ let session;
218
+ try {
219
+ session = getSession(args.doc_id);
220
+ }
221
+ catch (err) {
222
+ return { tool: READER_READ_SECTION_SPEC.name, result: { error: err instanceof Error ? err.message : String(err) }, is_error: true, display: 'no doc' };
223
+ }
224
+ let sectionIndex;
225
+ if (typeof args.index === 'number') {
226
+ if (args.index < 0 || args.index >= session.doc.sections.length) {
227
+ return { tool: READER_READ_SECTION_SPEC.name, result: { error: 'section index out of range: ' + args.index }, is_error: true, display: 'bad index' };
228
+ }
229
+ sectionIndex = args.index;
230
+ seekSectionByIndex(session, sectionIndex);
231
+ }
232
+ else {
233
+ /* Find the section that contains the current cursor. */
234
+ const cursorBlock = session.cursor_block_id;
235
+ sectionIndex = session.doc.sections.findIndex((sec) => sec.blocks.some((b) => b.id === cursorBlock));
236
+ if (sectionIndex < 0)
237
+ sectionIndex = 0;
238
+ }
239
+ const sec = session.doc.sections[sectionIndex];
240
+ return {
241
+ tool: READER_READ_SECTION_SPEC.name,
242
+ result: {
243
+ doc_id: args.doc_id,
244
+ section_index: sectionIndex,
245
+ heading: sec.heading,
246
+ level: sec.level,
247
+ blocks: sec.blocks.map((b) => ({
248
+ id: b.id,
249
+ kind: b.kind,
250
+ ...(isText(b) ? { text: b.text } : { summary: b.summary, content: b.content }),
251
+ })),
252
+ },
253
+ display: 'read section ' + sectionIndex + ': ' + (sec.heading || '(no heading)'),
254
+ };
255
+ }
256
+ export async function runReaderNextBlock(args) {
257
+ let session;
258
+ try {
259
+ session = getSession(args.doc_id);
260
+ }
261
+ catch (err) {
262
+ return { tool: READER_NEXT_BLOCK_SPEC.name, result: { error: err instanceof Error ? err.message : String(err) }, is_error: true, display: 'no doc' };
263
+ }
264
+ const next = advanceCursor(session);
265
+ if (!next) {
266
+ return {
267
+ tool: READER_NEXT_BLOCK_SPEC.name,
268
+ result: { doc_id: args.doc_id, at_end: true },
269
+ display: 'end of document',
270
+ };
271
+ }
272
+ const block = getBlock(session.doc, next);
273
+ if (isText(block)) {
274
+ recordSpoken(session, block.text);
275
+ return {
276
+ tool: READER_NEXT_BLOCK_SPEC.name,
277
+ result: {
278
+ doc_id: args.doc_id,
279
+ block_id: block.id,
280
+ kind: block.kind,
281
+ text: block.text,
282
+ at_end: false,
283
+ },
284
+ display: 'next: ' + block.text.slice(0, 60),
285
+ };
286
+ }
287
+ return {
288
+ tool: READER_NEXT_BLOCK_SPEC.name,
289
+ result: {
290
+ doc_id: args.doc_id,
291
+ block_id: block.id,
292
+ kind: block.kind,
293
+ summary: block.summary,
294
+ at_end: false,
295
+ },
296
+ display: 'next (non-text): ' + block.summary,
297
+ };
298
+ }
299
+ export async function runReaderSearch(args) {
300
+ let session;
301
+ try {
302
+ session = getSession(args.doc_id);
303
+ }
304
+ catch (err) {
305
+ return { tool: READER_SEARCH_SPEC.name, result: { error: err instanceof Error ? err.message : String(err) }, is_error: true, display: 'no doc' };
306
+ }
307
+ if (typeof args.query !== 'string' || args.query.trim() === '') {
308
+ return { tool: READER_SEARCH_SPEC.name, result: { error: 'query is required and must be non-empty' }, is_error: true, display: 'no query' };
309
+ }
310
+ const hits = searchDocument(session.doc, args.query, args.max !== undefined ? { max: args.max } : {});
311
+ return {
312
+ tool: READER_SEARCH_SPEC.name,
313
+ result: { doc_id: args.doc_id, query: args.query, hits },
314
+ display: 'found ' + hits.length + ' hit(s) for "' + args.query.slice(0, 40) + '"',
315
+ };
316
+ }
317
+ export async function runReaderBookmarkSet(args) {
318
+ let session;
319
+ try {
320
+ session = getSession(args.doc_id);
321
+ }
322
+ catch (err) {
323
+ return { tool: READER_BOOKMARK_SET_SPEC.name, result: { error: err instanceof Error ? err.message : String(err) }, is_error: true, display: 'no doc' };
324
+ }
325
+ try {
326
+ setBookmark(session, args.name);
327
+ }
328
+ catch (err) {
329
+ return { tool: READER_BOOKMARK_SET_SPEC.name, result: { error: err instanceof Error ? err.message : String(err) }, is_error: true, display: 'bad name' };
330
+ }
331
+ return {
332
+ tool: READER_BOOKMARK_SET_SPEC.name,
333
+ result: { doc_id: args.doc_id, name: args.name, at_block: session.cursor_block_id },
334
+ display: 'bookmarked ' + args.name + ' at ' + session.cursor_block_id,
335
+ };
336
+ }
337
+ export async function runReaderBookmarkJump(args) {
338
+ let session;
339
+ try {
340
+ session = getSession(args.doc_id);
341
+ }
342
+ catch (err) {
343
+ return { tool: READER_BOOKMARK_JUMP_SPEC.name, result: { error: err instanceof Error ? err.message : String(err) }, is_error: true, display: 'no doc' };
344
+ }
345
+ const r = jumpToBookmark(session, args.name);
346
+ if (!r.ok) {
347
+ return { tool: READER_BOOKMARK_JUMP_SPEC.name, result: { error: r.reason ?? 'unknown' }, is_error: true, display: 'no bookmark' };
348
+ }
349
+ return {
350
+ tool: READER_BOOKMARK_JUMP_SPEC.name,
351
+ result: { doc_id: args.doc_id, name: args.name, cursor_block_id: r.new_cursor },
352
+ display: 'jumped to ' + args.name,
353
+ };
354
+ }
355
+ /** V1.26 polish -- join recap blocks into a single TTS-friendly
356
+ * narrative string. Each block ends with a sentence terminator
357
+ * so the chunker (V1.24) splits cleanly at block boundaries.
358
+ * Blocks already ending in terminal punctuation are left
359
+ * alone; bare blocks get a trailing period. */
360
+ function _buildRecapNarrative(blocks) {
361
+ if (blocks.length === 0)
362
+ return '';
363
+ return blocks
364
+ .map((b) => {
365
+ const t = b.trim();
366
+ if (!t)
367
+ return '';
368
+ if (/[.!?;:]$/.test(t))
369
+ return t;
370
+ return t + '.';
371
+ })
372
+ .filter((s) => s)
373
+ .join(' ');
374
+ }
375
+ export async function runReaderRecap(args) {
376
+ let session;
377
+ try {
378
+ session = getSession(args.doc_id);
379
+ }
380
+ catch (err) {
381
+ return { tool: READER_RECAP_SPEC.name, result: { error: err instanceof Error ? err.message : String(err) }, is_error: true, display: 'no doc' };
382
+ }
383
+ let window = args.window;
384
+ if (typeof window !== 'number' || !Number.isFinite(window) || window < 1)
385
+ window = 10;
386
+ if (window > 60)
387
+ window = 60;
388
+ const tail = session.recent_spoken.slice(-window);
389
+ const narrative = _buildRecapNarrative(tail);
390
+ const mode = args.mode === 'summary' ? 'summary' : 'literal';
391
+ /* V1.26b -- Claude-summarised recap (opt-in, costs tokens).
392
+ Two gates:
393
+ 1. env var YF_ENABLE_CLAUDE_RECAP must be set to '1'.
394
+ 2. A summariser must be installed via setRecapSummarizer
395
+ (the chat server installs it at boot when a Claude
396
+ client is available).
397
+ Either gate failing returns a loud error explaining how
398
+ to enable -- no silent degradation. */
399
+ if (mode === 'summary') {
400
+ if (process.env['YF_ENABLE_CLAUDE_RECAP'] !== '1') {
401
+ return {
402
+ tool: READER_RECAP_SPEC.name,
403
+ result: {
404
+ error: 'summary mode requires YF_ENABLE_CLAUDE_RECAP=1 in env. This mode calls Claude on every recap and charges tokens; see docs/RECAP_CLAUDE_COSTS.md before enabling.',
405
+ },
406
+ is_error: true,
407
+ display: 'summary disabled by env',
408
+ };
409
+ }
410
+ if (!_recapSummarizer) {
411
+ return {
412
+ tool: READER_RECAP_SPEC.name,
413
+ result: {
414
+ error: 'summary mode requires a Claude summariser installed via setRecapSummarizer. The chat server installs it when CLAUDE_API_KEY is in the vault.',
415
+ },
416
+ is_error: true,
417
+ display: 'summary not installed',
418
+ };
419
+ }
420
+ if (tail.length === 0) {
421
+ return {
422
+ tool: READER_RECAP_SPEC.name,
423
+ result: { doc_id: args.doc_id, window, blocks: [], text: '', narrative: '', summary: '', mode },
424
+ display: 'recap: nothing to summarise',
425
+ };
426
+ }
427
+ let summary;
428
+ try {
429
+ const langOpt = session.doc.language ? { language: session.doc.language } : {};
430
+ summary = await _recapSummarizer(tail, langOpt);
431
+ }
432
+ catch (err) {
433
+ return {
434
+ tool: READER_RECAP_SPEC.name,
435
+ result: { error: 'summary call failed: ' + (err instanceof Error ? err.message : String(err)) },
436
+ is_error: true,
437
+ display: 'summary failed',
438
+ };
439
+ }
440
+ return {
441
+ tool: READER_RECAP_SPEC.name,
442
+ result: {
443
+ doc_id: args.doc_id,
444
+ window,
445
+ blocks: tail,
446
+ text: summary,
447
+ narrative,
448
+ summary,
449
+ mode,
450
+ },
451
+ display: 'recap (summary): ' + tail.length + ' block(s)',
452
+ };
453
+ }
454
+ return {
455
+ tool: READER_RECAP_SPEC.name,
456
+ result: {
457
+ doc_id: args.doc_id,
458
+ window,
459
+ blocks: tail,
460
+ /* V1.26 -- joined narrative for voice playback. Clients
461
+ that read .text first (V1.32 dispatcher) get a single
462
+ smooth read of the recent context. Clients that prefer
463
+ the structured list still have .blocks. */
464
+ text: narrative,
465
+ narrative,
466
+ mode,
467
+ },
468
+ display: 'recap: ' + tail.length + ' recent block(s)',
469
+ };
470
+ }
471
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/chat/tools/reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAgB,MAAM,0BAA0B,CAAC;AACvE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG/C,0CAA0C;AAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;AAelD,IAAI,gBAAgB,GAA2B,IAAI,CAAC;AACpD,MAAM,UAAU,kBAAkB,CAAC,IAA4B;IAC7D,gBAAgB,GAAG,IAAI,CAAC;AAC1B,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,oBAAoB;IAClC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,gBAAgB,GAAG,IAAI,CAAC;AAC1B,CAAC;AAED;;kEAEkE;AAElE,MAAM,CAAC,MAAM,gBAAgB,GAAa;IACxC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,uIAAuI;IACpJ,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4DAA4D,EAAE;SACpG;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;IACD,iBAAiB,EAAE,KAAK;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAa;IAC7C,IAAI,EAAE,6BAA6B;IACnC,WAAW,EAAE,yDAAyD;IACtE,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC9D,iBAAiB,EAAE,KAAK;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAa;IAChD,IAAI,EAAE,2BAA2B;IACjC,WAAW,EAAE,8FAA8F;IAC3G,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;YACrF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2DAA2D,EAAE;SACpG;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;IACD,iBAAiB,EAAE,KAAK;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAa;IAC9C,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EAAE,8EAA8E;IAC3F,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;IACD,iBAAiB,EAAE,KAAK;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAa;IAC1C,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,6EAA6E;IAC1F,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,GAAG,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;SACzE;QACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC9B;IACD,iBAAiB,EAAE,KAAK;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAa;IAChD,IAAI,EAAE,2BAA2B;IACjC,WAAW,EAAE,sDAAsD;IACnE,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,IAAI,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qEAAqE,EAAE;SAC/G;QACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC7B;IACD,iBAAiB,EAAE,KAAK;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAa;IACjD,IAAI,EAAE,4BAA4B;IAClC,WAAW,EAAE,+CAA+C;IAC5D,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,IAAI,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;QACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC7B;IACD,iBAAiB,EAAE,KAAK;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAa;IACzC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,uOAAuO;IACpP,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wDAAwD,EAAE;YACjG,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,2HAA2H,EAAE;SACjM;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;IACD,iBAAiB,EAAE,KAAK;CACzB,CAAC;AAEF;;kEAEkE;AAElE,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,KAAK,GAAG,kCAAkC,CAAC,CAAC;IAC1G,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAsB,EACtB,GAAgB;IAEhB,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC7D,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,iDAAiD,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACnJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3F,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,uBAAuB,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAClL,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IACvJ,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC9B;iBACa;IACb,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,CAAC,CAAC;gBAAE,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO;QACL,IAAI,EAAE,gBAAgB,CAAC,IAAI;QAC3B,MAAM,EAAE;YACN,MAAM,EAAE,GAAG,CAAC,EAAE;YACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM;YAC7B,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,UAAU,EAAE,SAAS;SACtB;QACD,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,cAAc;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE;QAChB,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ;QACxB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;QACpB,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK;QAClB,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM;QAC/B,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,IAAI,EAAE,qBAAqB,CAAC,IAAI;QAChC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE;QAC9B,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,mBAAmB;KAC9C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAwC;IACjF,IAAI,OAAsB,CAAC;IAC3B,IAAI,CAAC;QAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAC1C,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACzJ,CAAC;IACD,IAAI,YAAoB,CAAC;IACzB,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAChE,OAAO,EAAE,IAAI,EAAE,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,8BAA8B,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACvJ,CAAC;QACD,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1B,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,wDAAwD;QACxD,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;QAC5C,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC;QACrG,IAAI,YAAY,GAAG,CAAC;YAAE,YAAY,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAE,CAAC;IAChD,OAAO;QACL,IAAI,EAAE,wBAAwB,CAAC,IAAI;QACnC,MAAM,EAAE;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,YAAY;YAC3B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/E,CAAC,CAAC;SACJ;QACD,OAAO,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,cAAc,CAAC;KACjF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAwB;IAC/D,IAAI,OAAsB,CAAC;IAC3B,IAAI,CAAC;QAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAC1C,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACvJ,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,IAAI,EAAE,sBAAsB,CAAC,IAAI;YACjC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;YAC7C,OAAO,EAAE,iBAAiB;SAC3B,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO;YACL,IAAI,EAAE,sBAAsB,CAAC,IAAI;YACjC,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK;aACd;YACD,OAAO,EAAE,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SAC5C,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,sBAAsB,CAAC,IAAI;QACjC,MAAM,EAAE;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK;SACd;QACD,OAAO,EAAE,mBAAmB,GAAG,KAAK,CAAC,OAAO;KAC7C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAqD;IACzF,IAAI,OAAsB,CAAC;IAC3B,IAAI,CAAC;QAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAC1C,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACnJ,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/D,OAAO,EAAE,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,yCAAyC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAC9I,CAAC;IACD,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtG,OAAO;QACL,IAAI,EAAE,kBAAkB,CAAC,IAAI;QAC7B,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QACxD,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;KAClF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAsC;IAC/E,IAAI,OAAsB,CAAC;IAC3B,IAAI,CAAC;QAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAC1C,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACzJ,CAAC;IACD,IAAI,CAAC;QACH,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAC3J,CAAC;IACD,OAAO;QACL,IAAI,EAAE,wBAAwB,CAAC,IAAI;QACnC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,eAAe,EAAE;QACnF,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,eAAe;KACtE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAsC;IAChF,IAAI,OAAsB,CAAC;IAC3B,IAAI,CAAC;QAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAC1C,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC1J,CAAC;IACD,MAAM,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IACpI,CAAC;IACD,OAAO;QACL,IAAI,EAAE,yBAAyB,CAAC,IAAI;QACpC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,UAAU,EAAE;QAC/E,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC,IAAI;KAClC,CAAC;AACJ,CAAC;AAED;;;;gDAIgD;AAChD,SAAS,oBAAoB,CAAC,MAAgB;IAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAClB,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,GAAG,CAAC;IACjB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SAChB,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAuE;IAC1G,IAAI,OAAsB,CAAC;IAC3B,IAAI,CAAC;QAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAC1C,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAClJ,CAAC;IACD,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACzB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,MAAM,GAAG,EAAE,CAAC;IACtF,IAAI,MAAM,GAAG,EAAE;QAAE,MAAM,GAAG,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7D;;;;;;;6CAOyC;IACzC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,GAAG,EAAE,CAAC;YAClD,OAAO;gBACL,IAAI,EAAE,iBAAiB,CAAC,IAAI;gBAC5B,MAAM,EAAE;oBACN,KAAK,EAAE,kKAAkK;iBAC1K;gBACD,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,yBAAyB;aACnC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO;gBACL,IAAI,EAAE,iBAAiB,CAAC,IAAI;gBAC5B,MAAM,EAAE;oBACN,KAAK,EAAE,8IAA8I;iBACtJ;gBACD,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,uBAAuB;aACjC,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,IAAI,EAAE,iBAAiB,CAAC,IAAI;gBAC5B,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE;gBAC/F,OAAO,EAAE,6BAA6B;aACvC,CAAC;QACJ,CAAC;QACD,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,OAAO,GAA0B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtG,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,IAAI,EAAE,iBAAiB,CAAC,IAAI;gBAC5B,MAAM,EAAE,EAAE,KAAK,EAAE,uBAAuB,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC/F,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,gBAAgB;aAC1B,CAAC;QACJ,CAAC;QACD,OAAO;YACL,IAAI,EAAE,iBAAiB,CAAC,IAAI;YAC5B,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM;gBACN,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,OAAO;gBACb,SAAS;gBACT,OAAO;gBACP,IAAI;aACL;YACD,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC,MAAM,GAAG,WAAW;SACzD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,iBAAiB,CAAC,IAAI;QAC5B,MAAM,EAAE;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM;YACN,MAAM,EAAE,IAAI;YACZ;;;yDAG6C;YAC7C,IAAI,EAAE,SAAS;YACf,SAAS;YACT,IAAI;SACL;QACD,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,kBAAkB;KACtD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Yujin Forge -- chat tool catalog.
3
+ *
4
+ * The chat panel exposes a set of `forge.*` tools that Claude can
5
+ * call via Anthropic's tool_use protocol. Each tool has:
6
+ *
7
+ * - A JSON-schema description Claude consumes.
8
+ * - A pure implementation that takes the tool args + the chat
9
+ * context (project root + license state) and returns a
10
+ * serialisable result.
11
+ * - A `requires_approval` flag. Read-only tools auto-execute;
12
+ * write-class tools queue an approval request in the chat UI.
13
+ *
14
+ * Tonight's slice (v0.3.0 differentiator, foundation only):
15
+ *
16
+ * - `forge.read_manifest` -- read manifest.json from the project
17
+ * root and return the elements array (or a slice when the LLM
18
+ * asks for a specific plugin slug).
19
+ *
20
+ * Pending slices (not in this commit):
21
+ * - `forge.write_component(path, source)` -- write-class, approval
22
+ * gated.
23
+ * - `forge.run_tests(pattern)` -- exec `npm test -- <pattern>`.
24
+ * - `forge.run_migration_step(step_id)` -- atomic AST mutation.
25
+ * - `forge.consult_nac_spec(query)` -- RAG over docs/SPEC.md.
26
+ * - Wire into ClaudeClient's chat() via tool_use payload.
27
+ * - Approval-flow UI in src/chat/panel.ts.
28
+ *
29
+ * Pure: no Anthropic call, no UI dependency. Easy to unit-test.
30
+ *
31
+ * ASCII-only.
32
+ */
33
+ /** JSON schema shape Anthropic expects for tool_use. */
34
+ export interface ToolSpec {
35
+ name: string;
36
+ description: string;
37
+ input_schema: {
38
+ type: 'object';
39
+ properties: Record<string, {
40
+ type: string;
41
+ description?: string;
42
+ enum?: readonly string[] | string[];
43
+ }>;
44
+ required: string[];
45
+ };
46
+ /** Forge-internal flag the chat UI consults before invoking. */
47
+ requires_approval: boolean;
48
+ }
49
+ export interface ToolContext {
50
+ /** Absolute project root the chat is anchored at. */
51
+ projectRoot: string;
52
+ }
53
+ export interface ToolResult {
54
+ /** Tool name that produced this result (kept for the audit log). */
55
+ tool: string;
56
+ /** Either parsed structured data or a free-text fallback. */
57
+ result: unknown;
58
+ /** True when the tool ran but failed gracefully (e.g. manifest
59
+ not found). The chat surfaces these to the model as
60
+ structured errors instead of crashes. */
61
+ is_error?: boolean;
62
+ /** Human-readable message for the action trace. */
63
+ display?: string;
64
+ }
65
+ export declare const READ_MANIFEST_SPEC: ToolSpec;
66
+ export declare function runReadManifest(args: {
67
+ plugin_slug?: string;
68
+ }, ctx: ToolContext): Promise<ToolResult>;
69
+ export declare const CONSULT_NAC_SPEC: ToolSpec;
70
+ export interface SpecHit {
71
+ /** Nearest H1/H2/H3 heading above the matched paragraph. */
72
+ heading: string;
73
+ /** First ~240 chars of the matched paragraph. */
74
+ snippet: string;
75
+ /** Position score (higher = better lexical match). */
76
+ score: number;
77
+ }
78
+ export declare function runConsultNacSpec(args: {
79
+ query: string;
80
+ max_results?: number;
81
+ }, ctx: ToolContext): Promise<ToolResult>;
82
+ /** Split markdown body into (heading, paragraph) pairs, score
83
+ * each paragraph against the query, return top-N hits. Pure +
84
+ * exported for tests. */
85
+ export declare function searchSpec(body: string, query: string, max?: number): SpecHit[];
86
+ export declare const LIST_FILES_SPEC: ToolSpec;
87
+ export declare function runListFiles(args: {
88
+ subdir?: string;
89
+ glob?: string;
90
+ max_files?: number;
91
+ }, ctx: ToolContext): Promise<ToolResult>;
92
+ /** Compile a glob like "*.tsx" / "App.*" into a basename matcher.
93
+ * Only handles "*" and "?" -- enough for the common adopter case
94
+ * and keeps the implementation dependency-free.
95
+ * Exported for tests. */
96
+ export declare function compileBasenameGlob(glob: string | undefined): ((name: string) => boolean) | null;
97
+ export declare const READ_FILE_SPEC: ToolSpec;
98
+ export declare function runReadFile(args: {
99
+ path: string;
100
+ max_bytes?: number;
101
+ }, ctx: ToolContext): Promise<ToolResult>;
102
+ export declare const FORGE_TOOL_SPECS: ToolSpec[];
103
+ /** Dispatch a tool by name with the args Anthropic returned. Returns
104
+ * a ToolResult ready to be serialised into a tool_result block. */
105
+ export declare function runForgeTool(name: string, args: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult>;
106
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/chat/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAqDH,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;QACxG,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,gEAAgE;IAChE,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,MAAM,EAAE,OAAO,CAAC;IAChB;;gDAE4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,eAAO,MAAM,kBAAkB,EAAE,QAchC,CAAC;AAEF,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA+C3G;AAMD,eAAO,MAAM,gBAAgB,EAAE,QAkB9B,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7C,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAmDrB;AAED;;0BAE0B;AAC1B,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAU,GAAG,OAAO,EAAE,CAkClF;AAoBD,eAAO,MAAM,eAAe,EAAE,QAsB7B,CAAC;AAOF,wBAAsB,YAAY,CAChC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5D,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAkErB;AASD;;;0BAG0B;AAC1B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,IAAI,CAUhG;AAMD,eAAO,MAAM,cAAc,EAAE,QAkB5B,CAAC;AAKF,wBAAsB,WAAW,CAC/B,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1C,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAiGrB;AAaD,eAAO,MAAM,gBAAgB,EAAE,QAAQ,EAqCtC,CAAC;AAEF;oEACoE;AACpE,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAwDrB"}