@jack200714/mafw 4.5.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 (631) hide show
  1. package/.opencode/mafw/.backup-v61/parametric/base-skill-manifest.yaml +2 -0
  2. package/.opencode/mafw/STATUS.md +6 -0
  3. package/.opencode/mafw/ledger.md +20 -0
  4. package/.opencode/mafw/memory/.harmonic_index.json +28 -0
  5. package/.opencode/mafw/memory/.review_queue.json +1 -0
  6. package/.opencode/mafw/memory/tier3/parametric.json +13 -0
  7. package/.opencode/mafw/memory/tier3/test-goal.json +19 -0
  8. package/.opencode/mafw/memory-index.json +6 -0
  9. package/.opencode/mafw/parametric/base-skill-manifest.yaml +2 -0
  10. package/.opencode/mafw/waves.json +4 -0
  11. package/.opencode/opencode.json +3 -0
  12. package/.opencode/plugins/mafw-plugin.ts +8 -0
  13. package/.opencode/skills/banner-design/SKILL.md +196 -0
  14. package/.opencode/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
  15. package/.opencode/skills/brand/SKILL.md +97 -0
  16. package/.opencode/skills/brand/references/approval-checklist.md +169 -0
  17. package/.opencode/skills/brand/references/asset-organization.md +157 -0
  18. package/.opencode/skills/brand/references/brand-guideline-template.md +140 -0
  19. package/.opencode/skills/brand/references/color-palette-management.md +186 -0
  20. package/.opencode/skills/brand/references/consistency-checklist.md +94 -0
  21. package/.opencode/skills/brand/references/logo-usage-rules.md +185 -0
  22. package/.opencode/skills/brand/references/messaging-framework.md +85 -0
  23. package/.opencode/skills/brand/references/typography-specifications.md +214 -0
  24. package/.opencode/skills/brand/references/update.md +118 -0
  25. package/.opencode/skills/brand/references/visual-identity.md +96 -0
  26. package/.opencode/skills/brand/references/voice-framework.md +88 -0
  27. package/.opencode/skills/brand/scripts/extract-colors.cjs +341 -0
  28. package/.opencode/skills/brand/scripts/inject-brand-context.cjs +349 -0
  29. package/.opencode/skills/brand/scripts/sync-brand-to-tokens.cjs +248 -0
  30. package/.opencode/skills/brand/scripts/tests/test_sync_brand_to_tokens.py +52 -0
  31. package/.opencode/skills/brand/scripts/validate-asset.cjs +387 -0
  32. package/.opencode/skills/brand/templates/brand-guidelines-starter.md +275 -0
  33. package/.opencode/skills/design/SKILL.md +313 -0
  34. package/.opencode/skills/design/data/cip/deliverables.csv +51 -0
  35. package/.opencode/skills/design/data/cip/industries.csv +21 -0
  36. package/.opencode/skills/design/data/cip/mockup-contexts.csv +21 -0
  37. package/.opencode/skills/design/data/cip/styles.csv +21 -0
  38. package/.opencode/skills/design/data/icon/styles.csv +16 -0
  39. package/.opencode/skills/design/data/logo/colors.csv +56 -0
  40. package/.opencode/skills/design/data/logo/industries.csv +56 -0
  41. package/.opencode/skills/design/data/logo/styles.csv +56 -0
  42. package/.opencode/skills/design/references/banner-sizes-and-styles.md +118 -0
  43. package/.opencode/skills/design/references/cip-deliverable-guide.md +95 -0
  44. package/.opencode/skills/design/references/cip-design.md +121 -0
  45. package/.opencode/skills/design/references/cip-prompt-engineering.md +84 -0
  46. package/.opencode/skills/design/references/cip-style-guide.md +68 -0
  47. package/.opencode/skills/design/references/design-routing.md +207 -0
  48. package/.opencode/skills/design/references/icon-design.md +122 -0
  49. package/.opencode/skills/design/references/logo-color-psychology.md +101 -0
  50. package/.opencode/skills/design/references/logo-design.md +92 -0
  51. package/.opencode/skills/design/references/logo-prompt-engineering.md +158 -0
  52. package/.opencode/skills/design/references/logo-style-guide.md +109 -0
  53. package/.opencode/skills/design/references/slides-copywriting-formulas.md +84 -0
  54. package/.opencode/skills/design/references/slides-create.md +4 -0
  55. package/.opencode/skills/design/references/slides-html-template.md +295 -0
  56. package/.opencode/skills/design/references/slides-layout-patterns.md +137 -0
  57. package/.opencode/skills/design/references/slides-strategies.md +94 -0
  58. package/.opencode/skills/design/references/slides.md +42 -0
  59. package/.opencode/skills/design/references/social-photos-design.md +329 -0
  60. package/.opencode/skills/design/scripts/cip/core.py +215 -0
  61. package/.opencode/skills/design/scripts/cip/generate.py +484 -0
  62. package/.opencode/skills/design/scripts/cip/render-html.py +424 -0
  63. package/.opencode/skills/design/scripts/cip/search.py +127 -0
  64. package/.opencode/skills/design/scripts/icon/generate.py +487 -0
  65. package/.opencode/skills/design/scripts/logo/core.py +175 -0
  66. package/.opencode/skills/design/scripts/logo/generate.py +362 -0
  67. package/.opencode/skills/design/scripts/logo/search.py +114 -0
  68. package/.opencode/skills/design-system/SKILL.md +244 -0
  69. package/.opencode/skills/design-system/data/slide-backgrounds.csv +11 -0
  70. package/.opencode/skills/design-system/data/slide-charts.csv +26 -0
  71. package/.opencode/skills/design-system/data/slide-color-logic.csv +14 -0
  72. package/.opencode/skills/design-system/data/slide-copy.csv +26 -0
  73. package/.opencode/skills/design-system/data/slide-layout-logic.csv +16 -0
  74. package/.opencode/skills/design-system/data/slide-layouts.csv +26 -0
  75. package/.opencode/skills/design-system/data/slide-strategies.csv +16 -0
  76. package/.opencode/skills/design-system/data/slide-typography.csv +15 -0
  77. package/.opencode/skills/design-system/references/component-specs.md +236 -0
  78. package/.opencode/skills/design-system/references/component-tokens.md +214 -0
  79. package/.opencode/skills/design-system/references/primitive-tokens.md +203 -0
  80. package/.opencode/skills/design-system/references/semantic-tokens.md +215 -0
  81. package/.opencode/skills/design-system/references/states-and-variants.md +241 -0
  82. package/.opencode/skills/design-system/references/tailwind-integration.md +251 -0
  83. package/.opencode/skills/design-system/references/token-architecture.md +224 -0
  84. package/.opencode/skills/design-system/scripts/embed-tokens.cjs +99 -0
  85. package/.opencode/skills/design-system/scripts/fetch-background.py +317 -0
  86. package/.opencode/skills/design-system/scripts/generate-slide.py +770 -0
  87. package/.opencode/skills/design-system/scripts/generate-tokens.cjs +205 -0
  88. package/.opencode/skills/design-system/scripts/html-token-validator.py +327 -0
  89. package/.opencode/skills/design-system/scripts/search-slides.py +218 -0
  90. package/.opencode/skills/design-system/scripts/slide-token-validator.py +35 -0
  91. package/.opencode/skills/design-system/scripts/slide_search_core.py +453 -0
  92. package/.opencode/skills/design-system/scripts/tests/test_validate_tokens.py +48 -0
  93. package/.opencode/skills/design-system/scripts/validate-tokens.cjs +246 -0
  94. package/.opencode/skills/design-system/templates/design-tokens-starter.json +143 -0
  95. package/.opencode/skills/frontend-design/LICENSE.txt +21 -0
  96. package/.opencode/skills/frontend-design/SKILL.md +115 -0
  97. package/.opencode/skills/mafw-automation-interview/SKILL.md +43 -0
  98. package/.opencode/skills/mafw-cli-scanner/SKILL.md +37 -0
  99. package/.opencode/skills/mafw-compression-verifier/SKILL.md +52 -0
  100. package/.opencode/skills/mafw-desktop-inspector/SKILL.md +170 -0
  101. package/.opencode/skills/mafw-execute/SKILL.md +62 -0
  102. package/.opencode/skills/mafw-gateway-restart/SKILL.md +87 -0
  103. package/.opencode/skills/mafw-github-scanner/SKILL.md +38 -0
  104. package/.opencode/skills/mafw-goal/SKILL.md +76 -0
  105. package/.opencode/skills/mafw-interview/SKILL.md +68 -0
  106. package/.opencode/skills/mafw-memory-extractor/SKILL.md +65 -0
  107. package/.opencode/skills/mafw-plan/SKILL.md +58 -0
  108. package/.opencode/skills/mafw-review/SKILL.md +85 -0
  109. package/.opencode/skills/runtime-plugin-authoring/SKILL.md +791 -0
  110. package/.opencode/skills/slides/SKILL.md +40 -0
  111. package/.opencode/skills/slides/references/copywriting-formulas.md +84 -0
  112. package/.opencode/skills/slides/references/create.md +4 -0
  113. package/.opencode/skills/slides/references/html-template.md +295 -0
  114. package/.opencode/skills/slides/references/layout-patterns.md +137 -0
  115. package/.opencode/skills/slides/references/slide-strategies.md +94 -0
  116. package/.opencode/skills/ui-styling/LICENSE.txt +202 -0
  117. package/.opencode/skills/ui-styling/SKILL.md +324 -0
  118. package/.opencode/skills/ui-styling/references/canvas-design-system.md +320 -0
  119. package/.opencode/skills/ui-styling/references/shadcn-accessibility.md +471 -0
  120. package/.opencode/skills/ui-styling/references/shadcn-components.md +424 -0
  121. package/.opencode/skills/ui-styling/references/shadcn-theming.md +373 -0
  122. package/.opencode/skills/ui-styling/references/tailwind-customization.md +483 -0
  123. package/.opencode/skills/ui-styling/references/tailwind-responsive.md +382 -0
  124. package/.opencode/skills/ui-styling/references/tailwind-utilities.md +455 -0
  125. package/.opencode/skills/ui-styling/scripts/requirements.txt +17 -0
  126. package/.opencode/skills/ui-styling/scripts/shadcn_add.py +308 -0
  127. package/.opencode/skills/ui-styling/scripts/tailwind_config_gen.py +473 -0
  128. package/.opencode/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
  129. package/.opencode/skills/ui-styling/scripts/tests/requirements.txt +3 -0
  130. package/.opencode/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
  131. package/.opencode/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +394 -0
  132. package/.opencode/skills/ui-ux-pro-max/SKILL.md +388 -0
  133. package/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +31 -0
  134. package/.opencode/skills/ui-ux-pro-max/data/charts.csv +26 -0
  135. package/.opencode/skills/ui-ux-pro-max/data/colors.csv +193 -0
  136. package/.opencode/skills/ui-ux-pro-max/data/google-fonts.csv +1924 -0
  137. package/.opencode/skills/ui-ux-pro-max/data/icons.csv +106 -0
  138. package/.opencode/skills/ui-ux-pro-max/data/landing.csv +35 -0
  139. package/.opencode/skills/ui-ux-pro-max/data/motion.csv +17 -0
  140. package/.opencode/skills/ui-ux-pro-max/data/products.csv +193 -0
  141. package/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  142. package/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -0
  143. package/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  144. package/.opencode/skills/ui-ux-pro-max/data/stacks/avalonia.csv +57 -0
  145. package/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  146. package/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  147. package/.opencode/skills/ui-ux-pro-max/data/stacks/javafx.csv +76 -0
  148. package/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  149. package/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
  150. package/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  151. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +71 -0
  152. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  153. package/.opencode/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  154. package/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  155. package/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  156. package/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  157. package/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  158. package/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
  159. package/.opencode/skills/ui-ux-pro-max/data/stacks/uno.csv +60 -0
  160. package/.opencode/skills/ui-ux-pro-max/data/stacks/uwp.csv +56 -0
  161. package/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  162. package/.opencode/skills/ui-ux-pro-max/data/stacks/winui.csv +60 -0
  163. package/.opencode/skills/ui-ux-pro-max/data/stacks/wpf.csv +57 -0
  164. package/.opencode/skills/ui-ux-pro-max/data/styles.csv +85 -0
  165. package/.opencode/skills/ui-ux-pro-max/data/typography.csv +75 -0
  166. package/.opencode/skills/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
  167. package/.opencode/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  168. package/.opencode/skills/ui-ux-pro-max/scripts/core.py +464 -0
  169. package/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +1479 -0
  170. package/.opencode/skills/ui-ux-pro-max/scripts/search.py +162 -0
  171. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_core.py +134 -0
  172. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_design_system_mode.py +159 -0
  173. package/.opencode/skills/ui-ux-pro-max/scripts/validate_data.py +114 -0
  174. package/LICENSE +21 -0
  175. package/README.md +199 -0
  176. package/bin/mafw.js +436 -0
  177. package/dist/hooks/bash-python-guide.d.ts +4 -0
  178. package/dist/hooks/bash-python-guide.d.ts.map +1 -0
  179. package/dist/hooks/bash-python-guide.js +67 -0
  180. package/dist/hooks/bash-python-guide.js.map +1 -0
  181. package/dist/hooks/handoff.d.ts +9 -0
  182. package/dist/hooks/handoff.d.ts.map +1 -0
  183. package/dist/hooks/handoff.js +8 -0
  184. package/dist/hooks/handoff.js.map +1 -0
  185. package/dist/hooks/hook-manager.d.ts +32 -0
  186. package/dist/hooks/hook-manager.d.ts.map +1 -0
  187. package/dist/hooks/hook-manager.js +91 -0
  188. package/dist/hooks/hook-manager.js.map +1 -0
  189. package/dist/hooks/llm-after.d.ts +8 -0
  190. package/dist/hooks/llm-after.d.ts.map +1 -0
  191. package/dist/hooks/llm-after.js +8 -0
  192. package/dist/hooks/llm-after.js.map +1 -0
  193. package/dist/hooks/media-ingest.d.ts +43 -0
  194. package/dist/hooks/media-ingest.d.ts.map +1 -0
  195. package/dist/hooks/media-ingest.js +269 -0
  196. package/dist/hooks/media-ingest.js.map +1 -0
  197. package/dist/hooks/memory-guide.d.ts +3 -0
  198. package/dist/hooks/memory-guide.d.ts.map +1 -0
  199. package/dist/hooks/memory-guide.js +47 -0
  200. package/dist/hooks/memory-guide.js.map +1 -0
  201. package/dist/hooks/observation-capture.d.ts +17 -0
  202. package/dist/hooks/observation-capture.d.ts.map +1 -0
  203. package/dist/hooks/observation-capture.js +20 -0
  204. package/dist/hooks/observation-capture.js.map +1 -0
  205. package/dist/hooks/session-compacting.d.ts +6 -0
  206. package/dist/hooks/session-compacting.d.ts.map +1 -0
  207. package/dist/hooks/session-compacting.js +6 -0
  208. package/dist/hooks/session-compacting.js.map +1 -0
  209. package/dist/hooks/session-ending.d.ts +20 -0
  210. package/dist/hooks/session-ending.d.ts.map +1 -0
  211. package/dist/hooks/session-ending.js +113 -0
  212. package/dist/hooks/session-ending.js.map +1 -0
  213. package/dist/hooks/session-recall.d.ts +2 -0
  214. package/dist/hooks/session-recall.d.ts.map +1 -0
  215. package/dist/hooks/session-recall.js +103 -0
  216. package/dist/hooks/session-recall.js.map +1 -0
  217. package/dist/hooks/session-start.d.ts +9 -0
  218. package/dist/hooks/session-start.d.ts.map +1 -0
  219. package/dist/hooks/session-start.js +42 -0
  220. package/dist/hooks/session-start.js.map +1 -0
  221. package/dist/hooks/tool-before.d.ts +10 -0
  222. package/dist/hooks/tool-before.d.ts.map +1 -0
  223. package/dist/hooks/tool-before.js +6 -0
  224. package/dist/hooks/tool-before.js.map +1 -0
  225. package/dist/hooks/tool-executed.d.ts +19 -0
  226. package/dist/hooks/tool-executed.d.ts.map +1 -0
  227. package/dist/hooks/tool-executed.js +12 -0
  228. package/dist/hooks/tool-executed.js.map +1 -0
  229. package/dist/hooks/user-profile.d.ts +2 -0
  230. package/dist/hooks/user-profile.d.ts.map +1 -0
  231. package/dist/hooks/user-profile.js +30 -0
  232. package/dist/hooks/user-profile.js.map +1 -0
  233. package/dist/hooks/user-prompt.d.ts +9 -0
  234. package/dist/hooks/user-prompt.d.ts.map +1 -0
  235. package/dist/hooks/user-prompt.js +8 -0
  236. package/dist/hooks/user-prompt.js.map +1 -0
  237. package/dist/hooks/voice-guide.d.ts +8 -0
  238. package/dist/hooks/voice-guide.d.ts.map +1 -0
  239. package/dist/hooks/voice-guide.js +101 -0
  240. package/dist/hooks/voice-guide.js.map +1 -0
  241. package/dist/plugin.d.ts +55 -0
  242. package/dist/plugin.d.ts.map +1 -0
  243. package/dist/plugin.js +342 -0
  244. package/dist/plugin.js.map +1 -0
  245. package/dist/tools/add-memory.d.ts +17 -0
  246. package/dist/tools/add-memory.d.ts.map +1 -0
  247. package/dist/tools/add-memory.js +60 -0
  248. package/dist/tools/add-memory.js.map +1 -0
  249. package/dist/tools/media-ask.d.ts +14 -0
  250. package/dist/tools/media-ask.d.ts.map +1 -0
  251. package/dist/tools/media-ask.js +224 -0
  252. package/dist/tools/media-ask.js.map +1 -0
  253. package/dist/tools/media-speak.d.ts +16 -0
  254. package/dist/tools/media-speak.d.ts.map +1 -0
  255. package/dist/tools/media-speak.js +78 -0
  256. package/dist/tools/media-speak.js.map +1 -0
  257. package/dist/tools/media-upload.d.ts +14 -0
  258. package/dist/tools/media-upload.d.ts.map +1 -0
  259. package/dist/tools/media-upload.js +155 -0
  260. package/dist/tools/media-upload.js.map +1 -0
  261. package/dist/tools/python-exec.d.ts +13 -0
  262. package/dist/tools/python-exec.d.ts.map +1 -0
  263. package/dist/tools/python-exec.js +99 -0
  264. package/dist/tools/python-exec.js.map +1 -0
  265. package/dist/tools/python-restart.d.ts +11 -0
  266. package/dist/tools/python-restart.d.ts.map +1 -0
  267. package/dist/tools/python-restart.js +33 -0
  268. package/dist/tools/python-restart.js.map +1 -0
  269. package/dist/utils/circuit-breaker.d.ts +23 -0
  270. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  271. package/dist/utils/circuit-breaker.js +75 -0
  272. package/dist/utils/circuit-breaker.js.map +1 -0
  273. package/dist/utils/config-loader.d.ts +20 -0
  274. package/dist/utils/config-loader.d.ts.map +1 -0
  275. package/dist/utils/config-loader.js +194 -0
  276. package/dist/utils/config-loader.js.map +1 -0
  277. package/dist/utils/fallback.d.ts +7 -0
  278. package/dist/utils/fallback.d.ts.map +1 -0
  279. package/dist/utils/fallback.js +20 -0
  280. package/dist/utils/fallback.js.map +1 -0
  281. package/dist/utils/git.d.ts +24 -0
  282. package/dist/utils/git.d.ts.map +1 -0
  283. package/dist/utils/git.js +71 -0
  284. package/dist/utils/git.js.map +1 -0
  285. package/dist/utils/github.d.ts +37 -0
  286. package/dist/utils/github.d.ts.map +1 -0
  287. package/dist/utils/github.js +53 -0
  288. package/dist/utils/github.js.map +1 -0
  289. package/dist/utils/global-path.d.ts +2 -0
  290. package/dist/utils/global-path.d.ts.map +1 -0
  291. package/dist/utils/global-path.js +32 -0
  292. package/dist/utils/global-path.js.map +1 -0
  293. package/dist/utils/logger.d.ts +6 -0
  294. package/dist/utils/logger.d.ts.map +1 -0
  295. package/dist/utils/logger.js +69 -0
  296. package/dist/utils/logger.js.map +1 -0
  297. package/dist/utils/obs-capture.d.ts +7 -0
  298. package/dist/utils/obs-capture.d.ts.map +1 -0
  299. package/dist/utils/obs-capture.js +49 -0
  300. package/dist/utils/obs-capture.js.map +1 -0
  301. package/dist/utils/retry.d.ts +11 -0
  302. package/dist/utils/retry.d.ts.map +1 -0
  303. package/dist/utils/retry.js +45 -0
  304. package/dist/utils/retry.js.map +1 -0
  305. package/dist/utils/self-wiring.d.ts +13 -0
  306. package/dist/utils/self-wiring.d.ts.map +1 -0
  307. package/dist/utils/self-wiring.js +86 -0
  308. package/dist/utils/self-wiring.js.map +1 -0
  309. package/dist/utils/state.d.ts +106 -0
  310. package/dist/utils/state.d.ts.map +1 -0
  311. package/dist/utils/state.js +166 -0
  312. package/dist/utils/state.js.map +1 -0
  313. package/dist/utils/status.d.ts +47 -0
  314. package/dist/utils/status.d.ts.map +1 -0
  315. package/dist/utils/status.js +147 -0
  316. package/dist/utils/status.js.map +1 -0
  317. package/dist/utils/ttl-map.d.ts +17 -0
  318. package/dist/utils/ttl-map.d.ts.map +1 -0
  319. package/dist/utils/ttl-map.js +67 -0
  320. package/dist/utils/ttl-map.js.map +1 -0
  321. package/gateway/dist/automation-engine.js +729 -0
  322. package/gateway/dist/chat/chat-sessions.js +95 -0
  323. package/gateway/dist/chat/graph-runner.js +76 -0
  324. package/gateway/dist/chat/index.js +7 -0
  325. package/gateway/dist/chat/intent-classifier.js +23 -0
  326. package/gateway/dist/config.js +416 -0
  327. package/gateway/dist/core/auth.js +96 -0
  328. package/gateway/dist/core/budget-guard.js +52 -0
  329. package/gateway/dist/core/compression/bm25-index.js +176 -0
  330. package/gateway/dist/core/compression/compression-pipeline.js +157 -0
  331. package/gateway/dist/core/compression/compression-strategy-selector.js +32 -0
  332. package/gateway/dist/core/compression/compression-verifier.js +79 -0
  333. package/gateway/dist/core/compression/diff-compressor.js +69 -0
  334. package/gateway/dist/core/compression/hybrid-compressor.js +104 -0
  335. package/gateway/dist/core/compression/lesson-compactor.js +114 -0
  336. package/gateway/dist/core/compression/memory-index.js +190 -0
  337. package/gateway/dist/core/compression/observation-classifier.js +41 -0
  338. package/gateway/dist/core/compression/observation-deduplicator.js +43 -0
  339. package/gateway/dist/core/compression/rrf-fusion.js +63 -0
  340. package/gateway/dist/core/compression/session-pruner.js +137 -0
  341. package/gateway/dist/core/compression/token-budget-allocator.js +141 -0
  342. package/gateway/dist/core/compression/vector-index.js +117 -0
  343. package/gateway/dist/core/compression/zero-token-compressor.js +80 -0
  344. package/gateway/dist/core/cost/cognitive-router.js +41 -0
  345. package/gateway/dist/core/cost/cost-estimator.js +63 -0
  346. package/gateway/dist/core/cost/types.js +19 -0
  347. package/gateway/dist/core/engine/degradation.js +159 -0
  348. package/gateway/dist/core/engine/goal-worktree-manager.js +131 -0
  349. package/gateway/dist/core/engine/lesson-manager.js +222 -0
  350. package/gateway/dist/core/engine/optimistic-sync.js +100 -0
  351. package/gateway/dist/core/engine/phase-orchestrator.js +153 -0
  352. package/gateway/dist/core/engine/report-generator.js +131 -0
  353. package/gateway/dist/core/engine/state-lock.js +91 -0
  354. package/gateway/dist/core/engine/task-branch-manager.js +102 -0
  355. package/gateway/dist/core/engine/wave-dependency.js +67 -0
  356. package/gateway/dist/core/engine/wave-executor.js +112 -0
  357. package/gateway/dist/core/goal-budget.js +63 -0
  358. package/gateway/dist/core/graph/entity-extractor.js +53 -0
  359. package/gateway/dist/core/graph/graph-searcher.js +120 -0
  360. package/gateway/dist/core/graph/knowledge-graph-manager.js +138 -0
  361. package/gateway/dist/core/graph/relation-inferencer.js +67 -0
  362. package/gateway/dist/core/graph/types.js +2 -0
  363. package/gateway/dist/core/hooks/handoff.js +7 -0
  364. package/gateway/dist/core/hooks/hook-manager.js +91 -0
  365. package/gateway/dist/core/hooks/llm-after.js +7 -0
  366. package/gateway/dist/core/hooks/observation-capture.js +19 -0
  367. package/gateway/dist/core/hooks/session-compacting.js +5 -0
  368. package/gateway/dist/core/hooks/session-ending.js +123 -0
  369. package/gateway/dist/core/hooks/session-start.js +51 -0
  370. package/gateway/dist/core/hooks/tool-before.js +5 -0
  371. package/gateway/dist/core/hooks/tool-executed.js +11 -0
  372. package/gateway/dist/core/hooks/user-prompt.js +7 -0
  373. package/gateway/dist/core/index.js +119 -0
  374. package/gateway/dist/core/langchain/agent-adapter.js +39 -0
  375. package/gateway/dist/core/langchain/index.js +12 -0
  376. package/gateway/dist/core/langchain/memory.js +35 -0
  377. package/gateway/dist/core/langchain/node-runner.js +115 -0
  378. package/gateway/dist/core/langchain/retriever.js +28 -0
  379. package/gateway/dist/core/langgraph/checkpointer.js +200 -0
  380. package/gateway/dist/core/langgraph/graph.js +57 -0
  381. package/gateway/dist/core/langgraph/index.js +25 -0
  382. package/gateway/dist/core/langgraph/loop-state.js +71 -0
  383. package/gateway/dist/core/langgraph/nodes/archive.node.js +27 -0
  384. package/gateway/dist/core/langgraph/nodes/execute.node.js +5 -0
  385. package/gateway/dist/core/langgraph/nodes/plan.node.js +101 -0
  386. package/gateway/dist/core/langgraph/nodes/review.node.js +89 -0
  387. package/gateway/dist/core/langgraph/nodes/sync.node.js +70 -0
  388. package/gateway/dist/core/langgraph/review-parser.js +35 -0
  389. package/gateway/dist/core/langgraph/signature-detector.js +23 -0
  390. package/gateway/dist/core/manager/goal-snapshot.js +73 -0
  391. package/gateway/dist/core/manager/milestone-push.js +81 -0
  392. package/gateway/dist/core/manager/question-ledger.js +121 -0
  393. package/gateway/dist/core/manager/system-rule-templates.js +76 -0
  394. package/gateway/dist/core/mcp/tools.js +562 -0
  395. package/gateway/dist/core/mcp/validator.js +165 -0
  396. package/gateway/dist/core/mcp-server.js +86 -0
  397. package/gateway/dist/core/memory/abstraction-distiller.js +44 -0
  398. package/gateway/dist/core/memory/cognitive-graph.js +103 -0
  399. package/gateway/dist/core/memory/energy-system.js +69 -0
  400. package/gateway/dist/core/memory/extractor.js +164 -0
  401. package/gateway/dist/core/memory/harmonic-index.js +530 -0
  402. package/gateway/dist/core/memory/harmonic-types.js +6 -0
  403. package/gateway/dist/core/memory/injector.js +111 -0
  404. package/gateway/dist/core/memory/l5-store.js +141 -0
  405. package/gateway/dist/core/memory/matcher.js +66 -0
  406. package/gateway/dist/core/memory/merger.js +95 -0
  407. package/gateway/dist/core/memory/migrate-v6.1.js +133 -0
  408. package/gateway/dist/core/memory/minhash-merger.js +195 -0
  409. package/gateway/dist/core/memory/observation-service.js +87 -0
  410. package/gateway/dist/core/memory/privacy-filter.js +163 -0
  411. package/gateway/dist/core/memory/reranker.js +208 -0
  412. package/gateway/dist/core/memory/review-scheduler.js +100 -0
  413. package/gateway/dist/core/memory/salience-perceptor.js +24 -0
  414. package/gateway/dist/core/memory/store.js +284 -0
  415. package/gateway/dist/core/memory/t1-store.js +183 -0
  416. package/gateway/dist/core/memory/t1-to-t2-compressor.js +119 -0
  417. package/gateway/dist/core/memory/validator.js +66 -0
  418. package/gateway/dist/core/plugin.js +902 -0
  419. package/gateway/dist/core/skills/mafw-execute/entry.js +226 -0
  420. package/gateway/dist/core/skills/mafw-goal/entry.js +203 -0
  421. package/gateway/dist/core/skills/mafw-plan/entry.js +184 -0
  422. package/gateway/dist/core/skills/mafw-review/entry.js +200 -0
  423. package/gateway/dist/core/storage/file-storage.js +120 -0
  424. package/gateway/dist/core/storage/sqlite-storage.js +205 -0
  425. package/gateway/dist/core/storage/types.js +2 -0
  426. package/gateway/dist/core/tools/archive-worktree.js +208 -0
  427. package/gateway/dist/core/tools/remote-cli.js +106 -0
  428. package/gateway/dist/core/tools/run-ask-user.js +79 -0
  429. package/gateway/dist/core/tools/run-execute-wave.js +32 -0
  430. package/gateway/dist/core/tools/run-plan.js +42 -0
  431. package/gateway/dist/core/tools/run-record-feedback.js +55 -0
  432. package/gateway/dist/core/tools/run-review.js +46 -0
  433. package/gateway/dist/core/tools/write-lesson.js +97 -0
  434. package/gateway/dist/core/utils/circuit-breaker.js +74 -0
  435. package/gateway/dist/core/utils/config-loader.js +203 -0
  436. package/gateway/dist/core/utils/fallback.js +19 -0
  437. package/gateway/dist/core/utils/git.js +70 -0
  438. package/gateway/dist/core/utils/github.js +52 -0
  439. package/gateway/dist/core/utils/global-path.js +41 -0
  440. package/gateway/dist/core/utils/logger.js +71 -0
  441. package/gateway/dist/core/utils/retry.js +44 -0
  442. package/gateway/dist/core/utils/state.js +175 -0
  443. package/gateway/dist/core/utils/status.js +156 -0
  444. package/gateway/dist/cost/service.js +17 -0
  445. package/gateway/dist/dashboard/api.js +1156 -0
  446. package/gateway/dist/dashboard/public/assets/index-DOXm39dm.css +1 -0
  447. package/gateway/dist/dashboard/public/index.html +13 -0
  448. package/gateway/dist/dashboard/server.js +140 -0
  449. package/gateway/dist/dashboard/types.js +2 -0
  450. package/gateway/dist/desktop-client.js +124 -0
  451. package/gateway/dist/eval-endpoint.js +219 -0
  452. package/gateway/dist/event-bus.js +7 -0
  453. package/gateway/dist/feedback/anchor-promotion.js +99 -0
  454. package/gateway/dist/feedback/deferred-memory.js +13 -0
  455. package/gateway/dist/feedback/miss-attribution.js +20 -0
  456. package/gateway/dist/graph/anchor-graph-store.js +113 -0
  457. package/gateway/dist/graph/anchor-graph.js +48 -0
  458. package/gateway/dist/health.js +53 -0
  459. package/gateway/dist/heartbeat.js +109 -0
  460. package/gateway/dist/index.js +6377 -0
  461. package/gateway/dist/interceptors/memory-injector.js +79 -0
  462. package/gateway/dist/ledger.js +121 -0
  463. package/gateway/dist/loop-monitor.js +74 -0
  464. package/gateway/dist/mcp/handlers/add-memory.js +113 -0
  465. package/gateway/dist/mcp/handlers/ask-user.js +63 -0
  466. package/gateway/dist/mcp/handlers/commit-heuristic.js +19 -0
  467. package/gateway/dist/mcp/handlers/create-goal.js +83 -0
  468. package/gateway/dist/mcp/handlers/desktop-click.js +18 -0
  469. package/gateway/dist/mcp/handlers/desktop-get-state.js +15 -0
  470. package/gateway/dist/mcp/handlers/desktop-navigate.js +18 -0
  471. package/gateway/dist/mcp/handlers/desktop-screenshot.js +16 -0
  472. package/gateway/dist/mcp/handlers/desktop-scroll.js +19 -0
  473. package/gateway/dist/mcp/handlers/desktop-type.js +19 -0
  474. package/gateway/dist/mcp/handlers/draft-automation-rule.js +45 -0
  475. package/gateway/dist/mcp/handlers/get-automation-history.js +15 -0
  476. package/gateway/dist/mcp/handlers/get-automation-rule.js +26 -0
  477. package/gateway/dist/mcp/handlers/get-axioms.js +14 -0
  478. package/gateway/dist/mcp/handlers/get-deltas.js +77 -0
  479. package/gateway/dist/mcp/handlers/get-memory.js +67 -0
  480. package/gateway/dist/mcp/handlers/get-model-route.js +16 -0
  481. package/gateway/dist/mcp/handlers/get-triage-item.js +17 -0
  482. package/gateway/dist/mcp/handlers/list-automation-rules.js +24 -0
  483. package/gateway/dist/mcp/handlers/list-triage-items.js +14 -0
  484. package/gateway/dist/mcp/handlers/load-state.js +54 -0
  485. package/gateway/dist/mcp/handlers/manager-answer-question.js +67 -0
  486. package/gateway/dist/mcp/handlers/manager-cancel-goal.js +58 -0
  487. package/gateway/dist/mcp/handlers/manager-get-evidence.js +57 -0
  488. package/gateway/dist/mcp/handlers/manager-get-goal-status.js +58 -0
  489. package/gateway/dist/mcp/handlers/manager-list-goals.js +60 -0
  490. package/gateway/dist/mcp/handlers/manager-list-pending-questions.js +67 -0
  491. package/gateway/dist/mcp/handlers/manager-set-goal.js +78 -0
  492. package/gateway/dist/mcp/handlers/merge-memory.js +184 -0
  493. package/gateway/dist/mcp/handlers/pin-memory.js +53 -0
  494. package/gateway/dist/mcp/handlers/propose-triage-decision.js +38 -0
  495. package/gateway/dist/mcp/handlers/record-feedback.js +59 -0
  496. package/gateway/dist/mcp/handlers/resolve-merge.js +92 -0
  497. package/gateway/dist/mcp/handlers/restart-agent.js +22 -0
  498. package/gateway/dist/mcp/handlers/run-automation.js +28 -0
  499. package/gateway/dist/mcp/handlers/search-hybrid.js +181 -0
  500. package/gateway/dist/mcp/handlers/supersede-memory.js +47 -0
  501. package/gateway/dist/mcp/handlers/update-state.js +59 -0
  502. package/gateway/dist/mcp/handlers/validate-rule.js +39 -0
  503. package/gateway/dist/mcp/sse-transport.js +97 -0
  504. package/gateway/dist/mcp/streamable-endpoint.js +98 -0
  505. package/gateway/dist/mcp/tool-registry.js +630 -0
  506. package/gateway/dist/media/media-agent.js +755 -0
  507. package/gateway/dist/media/media-plugin-loader.js +254 -0
  508. package/gateway/dist/media/media-runtime-executor.js +227 -0
  509. package/gateway/dist/media/media-service.js +199 -0
  510. package/gateway/dist/media/pi-adapter.js +159 -0
  511. package/gateway/dist/media/plugin-context.js +14 -0
  512. package/gateway/dist/media/tts-service.js +173 -0
  513. package/gateway/dist/memory/abstraction-matcher.js +28 -0
  514. package/gateway/dist/memory/consolidation-service.js +209 -0
  515. package/gateway/dist/memory/derived-terms.js +50 -0
  516. package/gateway/dist/memory/embedding-provider.js +330 -0
  517. package/gateway/dist/memory/embedding-runtime.js +174 -0
  518. package/gateway/dist/memory/event-log.js +84 -0
  519. package/gateway/dist/memory/gateway-db.js +465 -0
  520. package/gateway/dist/memory/harmonic-file-store.js +338 -0
  521. package/gateway/dist/memory/llamacpp-provider.js +370 -0
  522. package/gateway/dist/memory/okf-index-renderer.js +61 -0
  523. package/gateway/dist/memory/okf-migrator.js +71 -0
  524. package/gateway/dist/memory/okf-parser.js +57 -0
  525. package/gateway/dist/memory/okf-writer.js +107 -0
  526. package/gateway/dist/memory/service.js +81 -0
  527. package/gateway/dist/memory/t1-db.js +139 -0
  528. package/gateway/dist/memory/unmerge-cleanup.js +82 -0
  529. package/gateway/dist/memory/vector-store.js +246 -0
  530. package/gateway/dist/memory/write-queue.js +31 -0
  531. package/gateway/dist/metrics/collector.js +28 -0
  532. package/gateway/dist/mobile/device-store.js +123 -0
  533. package/gateway/dist/mobile/mdns-advertiser.js +55 -0
  534. package/gateway/dist/mobile/media-proxy.js +292 -0
  535. package/gateway/dist/mobile/pairing.js +139 -0
  536. package/gateway/dist/mobile/push-gateway.js +126 -0
  537. package/gateway/dist/mobile/tts-artifact.js +43 -0
  538. package/gateway/dist/opencode-adapter.js +241 -0
  539. package/gateway/dist/orchestration/outcome-recorder.js +218 -0
  540. package/gateway/dist/orchestration/policy.js +57 -0
  541. package/gateway/dist/orchestration/registry.js +47 -0
  542. package/gateway/dist/plugins/hub.js +188 -0
  543. package/gateway/dist/poll.js +110 -0
  544. package/gateway/dist/python/kernel-service.js +762 -0
  545. package/gateway/dist/recall/constraints-migrate.js +108 -0
  546. package/gateway/dist/recall/data-dir-migrate.js +120 -0
  547. package/gateway/dist/recall/gateway-db-migrate.js +134 -0
  548. package/gateway/dist/recall/index-scan.js +437 -0
  549. package/gateway/dist/recall/inject-format.js +222 -0
  550. package/gateway/dist/recall/legacy-t1-archive.js +86 -0
  551. package/gateway/dist/recall/memory-worker.js +128 -0
  552. package/gateway/dist/recall/pipeline-rules.js +76 -0
  553. package/gateway/dist/recall/recall-context.js +297 -0
  554. package/gateway/dist/recall/reflect-cursor.js +50 -0
  555. package/gateway/dist/recall/reflection.js +318 -0
  556. package/gateway/dist/recall/session-worker-pool.js +100 -0
  557. package/gateway/dist/recall/stale-verify.js +72 -0
  558. package/gateway/dist/recall/step-inject.js +173 -0
  559. package/gateway/dist/recall/time-anchor.js +143 -0
  560. package/gateway/dist/recall/ttl-map.js +72 -0
  561. package/gateway/dist/recall/turn-completion.js +44 -0
  562. package/gateway/dist/recall/turn-pipeline.js +150 -0
  563. package/gateway/dist/recovery.js +158 -0
  564. package/gateway/dist/resources/sdk-session.js +202 -0
  565. package/gateway/dist/retrieval/guided-retriever.js +131 -0
  566. package/gateway/dist/retrieval/idf-stats.js +31 -0
  567. package/gateway/dist/routes/embedding-config.js +100 -0
  568. package/gateway/dist/routes/goal-sessions.js +45 -0
  569. package/gateway/dist/routes/manager-rotate.js +55 -0
  570. package/gateway/dist/routes/media-switch.js +78 -0
  571. package/gateway/dist/routes/model-config.js +132 -0
  572. package/gateway/dist/routes/note-board.js +51 -0
  573. package/gateway/dist/routes/permission.js +43 -0
  574. package/gateway/dist/routes/pinned-recall.js +36 -0
  575. package/gateway/dist/routes/plugins.js +77 -0
  576. package/gateway/dist/routes/restart-agent.js +28 -0
  577. package/gateway/dist/routes/runtime-switch.js +80 -0
  578. package/gateway/dist/routes/session-branch.js +63 -0
  579. package/gateway/dist/routes/session-mutations.js +58 -0
  580. package/gateway/dist/routes/session-summarize.js +49 -0
  581. package/gateway/dist/routes/usage-plugins.js +251 -0
  582. package/gateway/dist/runtime/agent-definition.js +2 -0
  583. package/gateway/dist/runtime/auth.js +80 -0
  584. package/gateway/dist/runtime/completion-http.js +97 -0
  585. package/gateway/dist/runtime/contract.js +37 -0
  586. package/gateway/dist/runtime/loader.js +240 -0
  587. package/gateway/dist/runtime/normalize.js +59 -0
  588. package/gateway/dist/runtime/opencode-runtime.js +336 -0
  589. package/gateway/dist/runtime/pi/pi-agent-config.js +294 -0
  590. package/gateway/dist/runtime/pi/pi-approval-bridge.js +44 -0
  591. package/gateway/dist/runtime/pi/pi-approval-extension.js +62 -0
  592. package/gateway/dist/runtime/pi/pi-events.js +122 -0
  593. package/gateway/dist/runtime/pi/pi-messages.js +20 -0
  594. package/gateway/dist/runtime/pi/pi-provider.js +19 -0
  595. package/gateway/dist/runtime/pi/pi-session-storage.js +44 -0
  596. package/gateway/dist/runtime/pi/pi-session.js +328 -0
  597. package/gateway/dist/runtime/plugins/pi-runtime.js +285 -0
  598. package/gateway/dist/runtime/serve-for-runtime.js +22 -0
  599. package/gateway/dist/runtime/serve-sidecar.js +164 -0
  600. package/gateway/dist/runtime/serve-supervisor.js +80 -0
  601. package/gateway/dist/self-update.js +309 -0
  602. package/gateway/dist/skills/manager-agent-config.js +37 -0
  603. package/gateway/dist/skills/manager-identity.js +11 -0
  604. package/gateway/dist/skills/memory-curator-agent.js +55 -0
  605. package/gateway/dist/trajectory/api.js +154 -0
  606. package/gateway/dist/trajectory/backfill-provider.js +41 -0
  607. package/gateway/dist/trajectory/collector.js +337 -0
  608. package/gateway/dist/trajectory/trajectory-store.js +336 -0
  609. package/gateway/dist/trajectory/types.js +17 -0
  610. package/gateway/dist/tray/index.js +131 -0
  611. package/gateway/dist/tray/tray.ps1 +96 -0
  612. package/gateway/dist/types.js +2 -0
  613. package/gateway/dist/usage/builtin-plugins/commandcode.js +71 -0
  614. package/gateway/dist/usage/builtin-plugins/deepseek.js +56 -0
  615. package/gateway/dist/usage/builtin-plugins/gateway.js +127 -0
  616. package/gateway/dist/usage/builtin-plugins/kimi-for-coding.js +93 -0
  617. package/gateway/dist/usage/builtin-plugins/kimi.js +48 -0
  618. package/gateway/dist/usage/builtin-plugins/opencode-go.js +54 -0
  619. package/gateway/dist/usage/builtin-plugins/openrouter.js +48 -0
  620. package/gateway/dist/usage/builtin-plugins/siliconflow-cn.js +49 -0
  621. package/gateway/dist/usage/builtin-plugins/zhipuai-coding-plan.js +44 -0
  622. package/gateway/dist/usage/model-prices.js +39 -0
  623. package/gateway/dist/usage/model-stats.js +21 -0
  624. package/gateway/dist/usage/plugin-context.js +79 -0
  625. package/gateway/dist/usage/plugin-loader.js +280 -0
  626. package/gateway/dist/usage/templates.js +227 -0
  627. package/gateway/dist/usage/types.js +2 -0
  628. package/gateway/dist/usage/usage-poller.js +216 -0
  629. package/gateway/package.json +37 -0
  630. package/package.json +78 -0
  631. package/packages/tui/dist/cli.js +4664 -0
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fixMediaPayload = fixMediaPayload;
4
+ exports.createPiPromptAdapter = createPiPromptAdapter;
5
+ const auth_1 = require("../runtime/auth");
6
+ /**
7
+ * Pi media adapter — implements the gateway's PromptFn abstraction with
8
+ * pi-coding-agent as the media analysis engine.
9
+ *
10
+ * Flow (path A, verified POC):
11
+ * media file part (data URL) → PiAiImage carrier ({type:'image', data, mimeType})
12
+ * → pi's openai-completions serializer turns non-text parts into image_url
13
+ * → fixMediaPayload (onPayload hook) rewrites the wire format:
14
+ * video/* → { type:'video_url', video_url:{url} } (Xiaomi video format)
15
+ * audio/* → { type:'input_audio', input_audio:{data:url} } (Xiaomi audio format)
16
+ * → the configured model (e.g. xiaomi/mimo-v2.5) receives the media natively.
17
+ *
18
+ * Credentials are reused from opencode's auth.json (the provider must be
19
+ * connected in opencode, e.g. `xiaomi`); the key is injected at runtime via
20
+ * setRuntimeApiKey and never persisted by pi.
21
+ *
22
+ * The fixer is derived from pi-multimodal-proxy's fixVideoAudioPayload (MIT);
23
+ * the audio branch was changed to input_audio per the Xiaomi MiMo API docs.
24
+ */
25
+ function fixMediaPayload(payload) {
26
+ if (!payload || typeof payload !== 'object')
27
+ return undefined;
28
+ const p = payload;
29
+ const messages = p.messages;
30
+ if (!Array.isArray(messages))
31
+ return undefined;
32
+ let modified = false;
33
+ for (const msg of messages) {
34
+ if (!msg || typeof msg !== 'object')
35
+ continue;
36
+ const m = msg;
37
+ const content = m.content;
38
+ if (!Array.isArray(content))
39
+ continue;
40
+ for (let i = 0; i < content.length; i++) {
41
+ const block = content[i];
42
+ if (!block || typeof block !== 'object')
43
+ continue;
44
+ const b = block;
45
+ if (b.type === 'image_url' && b.image_url && typeof b.image_url === 'object') {
46
+ const iu = b.image_url;
47
+ const url = iu.url;
48
+ if (typeof url === 'string' && url.startsWith('data:')) {
49
+ const mimeMatch = url.match(/^data:([^;]+);/);
50
+ if (mimeMatch) {
51
+ const mime = mimeMatch[1].toLowerCase();
52
+ if (mime.startsWith('video/')) {
53
+ content[i] = { type: 'video_url', video_url: { url } };
54
+ modified = true;
55
+ }
56
+ else if (mime.startsWith('audio/')) {
57
+ // Xiaomi MiMo audio format: input_audio with the full data URI.
58
+ content[i] = { type: 'input_audio', input_audio: { data: url } };
59
+ modified = true;
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ return modified ? p : undefined;
67
+ }
68
+ function createPiPromptAdapter(deps = {}) {
69
+ const authPath = deps.authPath ?? (0, auth_1.DEFAULT_AUTH_PATH)();
70
+ const timeoutMs = deps.timeoutMs ?? 180_000;
71
+ let runtimePromise;
72
+ function runtime() {
73
+ if (!runtimePromise) {
74
+ // pi-coding-agent is ESM-only and this gateway package compiles to CJS.
75
+ // A static import (and even a tsc-compiled dynamic import) becomes a
76
+ // require() of an ESM package and throws, so load it through a runtime
77
+ // dynamic import() that tsc cannot rewrite.
78
+ runtimePromise = (async () => {
79
+ const imp = new Function('spec', 'return import(spec)');
80
+ const { ModelRuntime } = await imp('@earendil-works/pi-coding-agent');
81
+ const mr = await ModelRuntime.create({ signal: AbortSignal.timeout(30_000) });
82
+ return mr;
83
+ })();
84
+ runtimePromise.catch(() => { runtimePromise = undefined; });
85
+ }
86
+ return runtimePromise;
87
+ }
88
+ async function modelFor(provider, model) {
89
+ if (deps.getModel) {
90
+ const m = deps.getModel(provider, model);
91
+ if (!m)
92
+ throw new Error(`Model ${provider}/${model} not found`);
93
+ return m;
94
+ }
95
+ const mr = await runtime();
96
+ const m = mr.getModel(provider, model);
97
+ if (!m)
98
+ throw new Error(`Model ${provider}/${model} not found in pi registry`);
99
+ return m;
100
+ }
101
+ return async function piPrompt(parts, opts) {
102
+ const apiKey = deps.getApiKey
103
+ ? deps.getApiKey(opts.providerID)
104
+ : deps.credentials?.getApiKey(opts.providerID)
105
+ ?? (0, auth_1.readOpencodeAuth)(authPath)[opts.providerID]?.key;
106
+ if (!apiKey) {
107
+ throw new Error(`No API key for provider "${opts.providerID}" — connect it in opencode first (auth.json)`);
108
+ }
109
+ const filePart = parts.find((p) => p.type === 'file');
110
+ const textPart = parts.find((p) => p.type === 'text');
111
+ const model = await modelFor(opts.providerID, opts.modelID);
112
+ const content = [];
113
+ if (textPart && typeof textPart.text === 'string' && textPart.text.trim()) {
114
+ content.push({ type: 'text', text: textPart.text });
115
+ }
116
+ if (filePart && typeof filePart.url === 'string' && filePart.url.startsWith('data:')) {
117
+ const dataUrl = filePart.url;
118
+ const mime = filePart.mime || dataUrl.match(/^data:([^;]+);/)?.[1] || 'image/png';
119
+ const data = dataUrl.includes(',') ? dataUrl.split(',')[1] || '' : '';
120
+ // PiAiImage carrier — pi serializes it as image_url, fixMediaPayload
121
+ // rewrites the wire format to video_url / input_audio.
122
+ content.push({ type: 'image', data, mimeType: mime });
123
+ }
124
+ if (content.length === 0) {
125
+ throw new Error('Pi adapter requires at least one text or file part');
126
+ }
127
+ const mr = await runtime();
128
+ await mr.setRuntimeApiKey(opts.providerID, apiKey);
129
+ const logger = await import('../core/utils/logger.js');
130
+ try {
131
+ const response = await mr.complete(model, {
132
+ systemPrompt: 'You are a precise media analysis assistant. Answer the user\'s question about the attached media concisely and factually.',
133
+ messages: [
134
+ {
135
+ role: 'user',
136
+ content,
137
+ timestamp: Date.now(),
138
+ },
139
+ ],
140
+ }, {
141
+ apiKey,
142
+ onPayload: deps.fixPayload ?? fixMediaPayload,
143
+ signal: AbortSignal.timeout(timeoutMs),
144
+ });
145
+ if (response.stopReason === 'error' || response.stopReason === 'aborted') {
146
+ throw new Error(response.errorMessage || `Media analysis failed (${response.stopReason})`);
147
+ }
148
+ return (response.content || [])
149
+ .filter((c) => c.type === 'text' && typeof c.text === 'string')
150
+ .map((c) => c.text)
151
+ .join('\n')
152
+ .trim();
153
+ }
154
+ catch (err) {
155
+ logger.log.error(`[PiAdapter] ${opts.providerID}/${opts.modelID} baseUrl=${model.baseUrl} failed: ${err?.message || String(err)}`);
156
+ throw err;
157
+ }
158
+ };
159
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMediaPluginContext = createMediaPluginContext;
4
+ const config_1 = require("../config");
5
+ const logger_1 = require("../core/utils/logger");
6
+ const auth_1 = require("../runtime/auth");
7
+ function createMediaPluginContext(pluginName, credentials) {
8
+ return {
9
+ apiKey: (name) => (0, auth_1.getProviderApiKey)(name, undefined, credentials) ?? null,
10
+ fetch: (url, opts) => fetch(url, { ...opts, signal: opts?.signal ?? AbortSignal.timeout(60_000) }),
11
+ pluginConfig: (name) => config_1.config.raw.media?.pluginConfig?.[name] ?? null,
12
+ log: logger_1.log,
13
+ };
14
+ }
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TTS_VOICES = exports.TTS_DEFAULT_VOICE = exports.TTS_DEFAULT_MODEL = exports.TTS_DEFAULT_BASE_URL = void 0;
4
+ exports.resolveVoice = resolveVoice;
5
+ exports.createTtsService = createTtsService;
6
+ const auth_1 = require("../runtime/auth");
7
+ /**
8
+ * TtsService — MiMo-V2.5-TTS 语音合成客户端(直连小米 OpenAI 兼容端点)。
9
+ *
10
+ * 官方约束(speech-synthesis-v2.5):
11
+ * - 目标合成文本必须放在 role=assistant 的消息中(不可放 user)
12
+ * - user 消息可选:风格指令(自然语言控制)
13
+ * - audio.format: 'wav'(非流式)/ 'pcm16'(流式,24kHz mono)
14
+ * - audio.voice: 预置音色 ID
15
+ * - 响应:choices[0].message.audio.data(base64 音频)
16
+ *
17
+ * 认证复用 opencode auth.json 的 xiaomi provider key(与 pi-adapter 同源)。
18
+ */
19
+ exports.TTS_DEFAULT_BASE_URL = 'https://api.xiaomimimo.com/v1';
20
+ exports.TTS_DEFAULT_MODEL = 'mimo-v2.5-tts';
21
+ exports.TTS_DEFAULT_VOICE = '茉莉';
22
+ /** 预置音色(9 个 ID;mimo_default 集群相关,下拉建议用命名音色)。 */
23
+ exports.TTS_VOICES = [
24
+ { id: 'mimo_default', label: 'MiMo-默认(集群相关)', lang: 'auto' },
25
+ { id: '冰糖', label: '冰糖', lang: 'zh' },
26
+ { id: '茉莉', label: '茉莉', lang: 'zh' },
27
+ { id: '苏打', label: '苏打', lang: 'zh' },
28
+ { id: '白桦', label: '白桦', lang: 'zh' },
29
+ { id: 'Mia', label: 'Mia', lang: 'en' },
30
+ { id: 'Chloe', label: 'Chloe', lang: 'en' },
31
+ { id: 'Milo', label: 'Milo', lang: 'en' },
32
+ { id: 'Dean', label: 'Dean', lang: 'en' },
33
+ ];
34
+ /** 校验并取有效音色(非法/未配置时回退默认)。 */
35
+ function resolveVoice(cfg, voice) {
36
+ if (voice && voice.trim())
37
+ return voice.trim();
38
+ return cfg.defaultVoice || exports.TTS_DEFAULT_VOICE;
39
+ }
40
+ function createTtsService(deps) {
41
+ const authPath = deps.authPath;
42
+ const fetchImpl = deps.fetchImpl ?? fetch;
43
+ const provider = () => deps.config().media?.provider || 'xiaomi';
44
+ const ttsCfg = () => deps.config().media?.tts ?? {};
45
+ async function synthesize(input) {
46
+ const cfg = ttsCfg();
47
+ const key = (0, auth_1.getProviderApiKey)(provider(), authPath, deps.credentials);
48
+ if (!key) {
49
+ throw new Error(`No API key for provider "${provider()}" — connect it in opencode first (auth.json)`);
50
+ }
51
+ const text = (input.text || '').trim();
52
+ if (!text)
53
+ throw new Error('TTS requires non-empty text');
54
+ if (text.length > 2000)
55
+ throw new Error(`TTS text too long (${text.length} > 2000 chars)`);
56
+ const voice = resolveVoice(cfg, input.voice);
57
+ const baseUrl = (cfg.baseUrl || exports.TTS_DEFAULT_BASE_URL).replace(/\/+$/, '');
58
+ const model = cfg.model || exports.TTS_DEFAULT_MODEL;
59
+ const messages = [];
60
+ if (input.style && input.style.trim()) {
61
+ messages.push({ role: 'user', content: input.style.trim() });
62
+ }
63
+ // 官方约束:目标文本必须在 assistant 消息。
64
+ messages.push({ role: 'assistant', content: text });
65
+ const res = await fetchImpl(`${baseUrl}/chat/completions`, {
66
+ method: 'POST',
67
+ headers: {
68
+ 'Content-Type': 'application/json',
69
+ Authorization: `Bearer ${key}`,
70
+ },
71
+ body: JSON.stringify({
72
+ model,
73
+ messages,
74
+ audio: { format: 'wav', voice },
75
+ }),
76
+ signal: AbortSignal.timeout(120_000),
77
+ });
78
+ if (!res.ok) {
79
+ const detail = await res.text().catch(() => '');
80
+ throw new Error(`TTS HTTP ${res.status}: ${detail.slice(0, 300)}`);
81
+ }
82
+ const parsed = await res.json();
83
+ const data = parsed?.choices?.[0]?.message?.audio?.data;
84
+ if (typeof data !== 'string' || !data) {
85
+ const err = parsed?.error?.message || JSON.stringify(parsed).slice(0, 300);
86
+ throw new Error(`TTS empty audio response: ${err}`);
87
+ }
88
+ return {
89
+ audioDataUrl: `data:audio/wav;base64,${data}`,
90
+ mime: 'audio/wav',
91
+ voice,
92
+ };
93
+ }
94
+ /**
95
+ * 流式 TTS:pcm16(24kHz mono)分块输出。返回 async generator,每项是
96
+ * base64 编码的 PCM 块(chunk 边界可能切半个 sample,消费端需保留残余字节)。
97
+ * 调用方负责把块转 SSE 推给客户端。
98
+ */
99
+ async function* synthesizeStream(input, opts) {
100
+ const cfg = ttsCfg();
101
+ const key = (0, auth_1.getProviderApiKey)(provider(), authPath, deps.credentials);
102
+ if (!key) {
103
+ throw new Error(`No API key for provider "${provider()}" — connect it in opencode first (auth.json)`);
104
+ }
105
+ const text = (input.text || '').trim();
106
+ if (!text)
107
+ throw new Error('TTS requires non-empty text');
108
+ if (text.length > 2000)
109
+ throw new Error(`TTS text too long (${text.length} > 2000 chars)`);
110
+ const voice = resolveVoice(cfg, input.voice);
111
+ const baseUrl = (cfg.baseUrl || exports.TTS_DEFAULT_BASE_URL).replace(/\/+$/, '');
112
+ const model = cfg.model || exports.TTS_DEFAULT_MODEL;
113
+ const messages = [];
114
+ if (input.style && input.style.trim()) {
115
+ messages.push({ role: 'user', content: input.style.trim() });
116
+ }
117
+ messages.push({ role: 'assistant', content: text });
118
+ const res = await fetchImpl(`${baseUrl}/chat/completions`, {
119
+ method: 'POST',
120
+ headers: {
121
+ 'Content-Type': 'application/json',
122
+ Authorization: `Bearer ${key}`,
123
+ },
124
+ body: JSON.stringify({
125
+ model,
126
+ messages,
127
+ audio: { format: 'pcm16', voice },
128
+ stream: true,
129
+ }),
130
+ signal: AbortSignal.any([opts?.signal ?? new AbortController().signal, AbortSignal.timeout(120_000)]),
131
+ });
132
+ if (!res.ok || !res.body) {
133
+ const detail = await res.text().catch(() => '');
134
+ throw new Error(`TTS stream HTTP ${res.status}: ${detail.slice(0, 300)}`);
135
+ }
136
+ const reader = res.body.getReader();
137
+ const decoder = new TextDecoder();
138
+ let buf = '';
139
+ try {
140
+ while (true) {
141
+ const { done, value } = await reader.read();
142
+ if (done)
143
+ break;
144
+ buf += decoder.decode(value, { stream: true });
145
+ const lines = buf.split('\n');
146
+ buf = lines.pop() || '';
147
+ for (const line of lines) {
148
+ const t = line.trim();
149
+ if (!t.startsWith('data:'))
150
+ continue;
151
+ const payload = t.slice(5).trim();
152
+ if (payload === '[DONE]')
153
+ continue;
154
+ try {
155
+ const chunk = JSON.parse(payload);
156
+ const delta = chunk?.choices?.[0]?.delta;
157
+ const audioData = delta?.audio?.data;
158
+ if (typeof audioData === 'string' && audioData) {
159
+ yield { data: audioData, voice };
160
+ }
161
+ }
162
+ catch {
163
+ /* 跳过无法解析的块 */
164
+ }
165
+ }
166
+ }
167
+ }
168
+ finally {
169
+ reader.releaseLock();
170
+ }
171
+ }
172
+ return { synthesize, synthesizeStream };
173
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matchAbstraction = matchAbstraction;
4
+ const derived_terms_1 = require("./derived-terms");
5
+ const AUTO_THRESHOLD = 0.5;
6
+ const CONFLICT_THRESHOLD = 0.2;
7
+ function matchAbstraction(a, b) {
8
+ const tokensA = (0, derived_terms_1.tokenize)(a);
9
+ const tokensB = (0, derived_terms_1.tokenize)(b);
10
+ if (tokensA.length === 0 || tokensB.length === 0) {
11
+ return { similarity: 0, level: 'none' };
12
+ }
13
+ const wordsA = tokensA.filter(t => t.length > 2);
14
+ const wordsB = tokensB.filter(t => t.length > 2);
15
+ if (wordsA.length === 0 || wordsB.length === 0) {
16
+ return { similarity: 0, level: 'none' };
17
+ }
18
+ const setA = new Set(wordsA);
19
+ const setB = new Set(wordsB);
20
+ const intersection = new Set([...setA].filter(x => setB.has(x)));
21
+ const union = new Set([...setA, ...setB]);
22
+ const similarity = intersection.size / union.size;
23
+ if (similarity >= AUTO_THRESHOLD)
24
+ return { similarity, level: 'auto' };
25
+ if (similarity >= CONFLICT_THRESHOLD)
26
+ return { similarity, level: 'conflict' };
27
+ return { similarity, level: 'none' };
28
+ }
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ // P2: Memora-style memory consolidation.
3
+ //
4
+ // After a memory unit is written, recall embedding candidates above a cosine
5
+ // threshold; if any exist, an LLM judge decides UPDATE (merge into a single
6
+ // canonical entry) vs CREATE (keep separate). UPDATE merges the incoming unit
7
+ // with the older target (new content wins), soft-supersedes the target, and
8
+ // drops the stale vector — mirroring MinHash merge semantics but at the
9
+ // semantic level (cosine 0.8+ recall catches paraphrases char-level MinHash
10
+ // cannot see).
11
+ //
12
+ // The judge is a single OpenAI-compatible chat call reusing the worker-model
13
+ // transport (same resolution as IndexScan). All failures are fail-open: the
14
+ // unit simply stays as its own entry (never blocks or destroys writes).
15
+ //
16
+ // update-ratio stats (updated / judged) surface consolidation health — the
17
+ // Memora paper's sweet spot is ~16-22% (over-consolidation degrades quality).
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.ConsolidationService = void 0;
20
+ const logger_1 = require("../core/utils/logger");
21
+ const vector_store_1 = require("./vector-store");
22
+ const JUDGE_SYSTEM = `You are a memory management assistant. Given a NEW memory entry and similar existing entries, decide whether the new entry should UPDATE (merge into) an existing entry or be CREATEd as a separate memory.
23
+
24
+ Rules:
25
+ - UPDATE when both entries describe the same underlying subject/entity/topic with overlapping or complementary details (e.g. evolving state of the same project, updated preferences, new facts about the same person).
26
+ - CREATE when the subjects are merely similar in wording but refer to different entities, events, or aspects.
27
+ Respond with ONLY a JSON object:
28
+ {"action":"update","target_id":"<id of the entry to merge into>"} or {"action":"create"}`;
29
+ class ConsolidationService {
30
+ store;
31
+ vectors;
32
+ provider;
33
+ llm;
34
+ minCosine;
35
+ maxCandidates;
36
+ stats = { judged: 0, updates: 0, creates: 0 };
37
+ constructor(deps) {
38
+ this.store = deps.store;
39
+ this.vectors = deps.vectors;
40
+ this.provider = deps.provider;
41
+ this.llm = deps.llm;
42
+ this.minCosine = deps.minCosine ?? 0.8;
43
+ this.maxCandidates = deps.maxCandidates ?? 3;
44
+ }
45
+ getStats() {
46
+ const judged = this.stats.updates + this.stats.creates;
47
+ return {
48
+ ...this.stats,
49
+ updateRatio: judged === 0 ? 0 : this.stats.updates / judged,
50
+ };
51
+ }
52
+ /**
53
+ * Serial enqueue wrapper for the write path (onMemoryWritten). Errors are
54
+ * swallowed — consolidation must never break memory writes.
55
+ */
56
+ async enqueue(unit) {
57
+ try {
58
+ await this.consolidate(unit);
59
+ }
60
+ catch (err) {
61
+ logger_1.log.warn(`[Consolidation] enqueue error for ${unit?.id}: ${err?.message || err}`);
62
+ }
63
+ }
64
+ async consolidate(unit) {
65
+ if (!unit?.id)
66
+ return { action: 'skip', reason: 'no-unit' };
67
+ // Recursion guard: never re-consolidate merge products.
68
+ if (unit.merged_from && unit.merged_from.length > 0) {
69
+ return { action: 'skip', reason: 'merged-product' };
70
+ }
71
+ let vector = this.vectors.get(unit.id);
72
+ if (!vector) {
73
+ // The async indexer may not have flushed yet — embed on demand so the
74
+ // judge sees this unit in vector space immediately.
75
+ try {
76
+ const text = vector_store_1.EmbeddingIndexer.documentText(unit);
77
+ if (!text)
78
+ return { action: 'skip', reason: 'no-vector' };
79
+ const [vec] = await this.provider.embed([text], 'document');
80
+ if (!vec)
81
+ return { action: 'skip', reason: 'no-vector' };
82
+ this.vectors.upsert(unit.id, vec);
83
+ vector = vec;
84
+ }
85
+ catch (err) {
86
+ logger_1.log.warn(`[Consolidation] on-demand embed failed for ${unit.id}: ${err?.message || err}`);
87
+ return { action: 'skip', reason: 'embed-failed' };
88
+ }
89
+ }
90
+ const hits = this.vectors.searchByCosine(vector, this.maxCandidates + 1);
91
+ const candidateIds = [];
92
+ for (const h of hits) {
93
+ if (h.id === unit.id)
94
+ continue;
95
+ if (h.cosine < this.minCosine)
96
+ continue;
97
+ candidateIds.push(h.id);
98
+ if (candidateIds.length >= this.maxCandidates)
99
+ break;
100
+ }
101
+ if (candidateIds.length === 0)
102
+ return { action: 'create' };
103
+ if (!this.llm)
104
+ return { action: 'skip', reason: 'no-judge' };
105
+ this.stats.judged++;
106
+ const verdict = await this.judge(unit, candidateIds);
107
+ if (!verdict)
108
+ return { action: 'skip', reason: 'judge-error' };
109
+ if (verdict.action === 'create') {
110
+ this.stats.creates++;
111
+ return { action: 'create' };
112
+ }
113
+ const targetId = verdict.target_id && candidateIds.includes(verdict.target_id)
114
+ ? verdict.target_id
115
+ : undefined;
116
+ if (!targetId) {
117
+ // Judge hallucinated a target — not a valid decision, skip (no stats).
118
+ return { action: 'skip', reason: 'invalid-target' };
119
+ }
120
+ const merged = await this.mergeIntoNewer(unit, targetId);
121
+ this.stats.updates++;
122
+ return { action: 'update', targetId, mergedId: merged.id };
123
+ }
124
+ async mergeIntoNewer(incoming, targetId) {
125
+ const target = await this.store.read(targetId);
126
+ if (!target) {
127
+ // Target vanished mid-flight — nothing to merge.
128
+ return incoming;
129
+ }
130
+ const merged = {
131
+ ...incoming,
132
+ memory_value: `${incoming.memory_value}\n---\n[Updated ${new Date().toISOString()}] ${target.memory_value}`,
133
+ cue_anchors: dedupeCap([...(incoming.cue_anchors || []), ...(target.cue_anchors || [])], 8),
134
+ merged_from: [...(incoming.merged_from || []), target.id],
135
+ energy: Math.min(1, (incoming.energy ?? 0.8) + 0.15),
136
+ updated_at: new Date().toISOString(),
137
+ };
138
+ await this.store.write(merged, undefined, { skipMerge: true });
139
+ await this.store.markSuperseded(targetId, merged.id);
140
+ this.vectors.remove(targetId);
141
+ this.vectors.flush();
142
+ logger_1.log.info(`[Consolidation] merged ${targetId} into ${merged.id} (cosine candidate)`);
143
+ return merged;
144
+ }
145
+ async judge(unit, candidateIds) {
146
+ const llm = this.llm;
147
+ const candidatesBlock = [];
148
+ for (const id of candidateIds) {
149
+ const target = await this.store.read(id);
150
+ if (!target)
151
+ continue;
152
+ candidatesBlock.push(`EXISTING ENTRY:\nID: ${target.id}\nIndex: ${target.primary_abstraction}\nValue: ${target.memory_value}`);
153
+ }
154
+ if (candidatesBlock.length === 0)
155
+ return { action: 'create' };
156
+ const user = `NEW MEMORY ENTRY:\nID: ${unit.id}\nIndex: ${unit.primary_abstraction}\nValue: ${unit.memory_value}\n\n${candidatesBlock.join('\n\n')}\n\nShould the new entry UPDATE one of the existing entries, or be CREATEd separately?`;
157
+ const fetchFn = llm.fetchFn ?? globalThis.fetch.bind(globalThis);
158
+ const timeoutMs = llm.timeoutMs ?? 30_000;
159
+ try {
160
+ const resp = await Promise.race([
161
+ fetchFn(llm.baseUrl, {
162
+ method: 'POST',
163
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${llm.apiKey}` },
164
+ body: JSON.stringify({
165
+ model: llm.model,
166
+ messages: [
167
+ { role: 'system', content: JUDGE_SYSTEM },
168
+ { role: 'user', content: user },
169
+ ],
170
+ temperature: 0,
171
+ max_tokens: 200,
172
+ }),
173
+ }),
174
+ new Promise((_, reject) => {
175
+ const timer = setTimeout(() => reject(new Error('judge timeout')), timeoutMs);
176
+ timer.unref?.();
177
+ }),
178
+ ]);
179
+ if (!resp.ok)
180
+ throw new Error(`HTTP ${resp.status}`);
181
+ const data = await resp.json();
182
+ const content = data?.choices?.[0]?.message?.content ?? '';
183
+ const jsonText = content.replace(/```json|```/g, '').trim();
184
+ const start = jsonText.indexOf('{');
185
+ const end = jsonText.lastIndexOf('}');
186
+ if (start === -1 || end === -1)
187
+ return { action: 'create' };
188
+ const parsed = JSON.parse(jsonText.slice(start, end + 1));
189
+ if (parsed?.action !== 'update' && parsed?.action !== 'create')
190
+ return { action: 'create' };
191
+ return parsed;
192
+ }
193
+ catch (err) {
194
+ logger_1.log.warn(`[Consolidation] judge failed: ${err?.message || err}`);
195
+ return null;
196
+ }
197
+ }
198
+ }
199
+ exports.ConsolidationService = ConsolidationService;
200
+ function dedupeCap(items, cap) {
201
+ const out = [];
202
+ for (const item of items) {
203
+ if (item && !out.includes(item))
204
+ out.push(item);
205
+ if (out.length >= cap)
206
+ break;
207
+ }
208
+ return out;
209
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tokenize = tokenize;
4
+ exports.extractDerivedTerms = extractDerivedTerms;
5
+ function tokenize(text) {
6
+ const tokens = [];
7
+ let i = 0;
8
+ while (i < text.length) {
9
+ if (/[\u4e00-\u9fff]/.test(text[i])) {
10
+ if (i + 1 < text.length && /[\u4e00-\u9fff]/.test(text[i + 1])) {
11
+ tokens.push(text[i] + text[i + 1]);
12
+ }
13
+ else {
14
+ tokens.push(text[i]);
15
+ }
16
+ i++;
17
+ }
18
+ else if (/[a-zA-Z0-9]/.test(text[i])) {
19
+ let word = '';
20
+ while (i < text.length && /[a-zA-Z0-9]/.test(text[i])) {
21
+ word += text[i];
22
+ i++;
23
+ }
24
+ if (word.length > 0)
25
+ tokens.push(word.toLowerCase());
26
+ if (word.length > 1) {
27
+ for (let j = 0; j < word.length - 1; j++) {
28
+ tokens.push(word.slice(j, j + 2).toLowerCase());
29
+ }
30
+ }
31
+ }
32
+ else {
33
+ i++;
34
+ }
35
+ }
36
+ return [...new Set(tokens)];
37
+ }
38
+ function extractDerivedTerms(text, topK = 3) {
39
+ const terms = [];
40
+ const linkRegex = /\[\[([^\]]+)\]\]/g;
41
+ let match;
42
+ while ((match = linkRegex.exec(text)) !== null) {
43
+ terms.push(match[1]);
44
+ }
45
+ const entityRegex = /[A-Z][a-z]+[A-Z][a-z]+|[A-Z]{2,}[a-z]+[A-Z]|[a-z]+_[a-z]+/g;
46
+ while ((match = entityRegex.exec(text)) !== null) {
47
+ terms.push(match[0]);
48
+ }
49
+ return [...new Set(terms)].slice(0, topK);
50
+ }