@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,224 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mediaAskTool = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const zod_1 = require("zod");
6
+ const node_url_1 = require("node:url");
7
+ const media_ingest_1 = require("../hooks/media-ingest");
8
+ const media_upload_1 = require("./media-upload");
9
+ /**
10
+ * mafw_media_ask — 推理 Agent(LLM)主动追问 Media Agent 的插件工具。
11
+ *
12
+ * LLM 在推理过程中看到会话里的媒体指针([媒体附件 taskID: x contextID: y])
13
+ * 后自主决定调用本工具;工具 handler 作为标准 A2A 客户端,把 LLM 的问题
14
+ * 转成 A2A SendMessage 发给 gateway 的 MediaAgent:
15
+ *
16
+ * ① GetTask { id: taskID } → 取 contextId(校验任务存在)
17
+ * ② SendMessage { contextId,
18
+ * referenceTaskIds: [taskID],
19
+ * message: { role: user, parts: [{ text: question }] } }
20
+ * → Media Agent 基于任务历史(媒体 + 前序问答)返回文字描述
21
+ * ③ 返回回答 + 新任务 taskID(继续追问用新 ID,媒体不重传)
22
+ *
23
+ * 语义:纯 A2A 协作,无 MCP、无 transform 自动转发 —— 由推理 Agent 主动驱动。
24
+ */
25
+ const GATEWAY_PORT = process.env.MAFW_SERVER_API_PORT || process.env.MAFW_GATEWAY_PORT || '3000';
26
+ const A2A_URL = `http://127.0.0.1:${GATEWAY_PORT}/a2a`;
27
+ const TIMEOUT_MS = 120_000;
28
+ // 已复用过的 taskID(首答复用去重)。Map + 简单 TTL 防无界增长:
29
+ // ingest 建任务时 MediaAgent 已用 hint 分析过,首次追问直接复用已有回答。
30
+ const reusedTaskIds = new Map();
31
+ const REUSE_TTL_MS = 24 * 60 * 60 * 1000;
32
+ function markReused(taskId) {
33
+ const now = Date.now();
34
+ reusedTaskIds.set(taskId, now);
35
+ for (const [id, ts] of reusedTaskIds) {
36
+ if (now - ts > REUSE_TTL_MS)
37
+ reusedTaskIds.delete(id);
38
+ }
39
+ }
40
+ function isReused(taskId) {
41
+ const ts = reusedTaskIds.get(taskId);
42
+ return ts !== undefined && Date.now() - ts <= REUSE_TTL_MS;
43
+ }
44
+ /** 从 GetTask 结果里提取建任务时的 hint(首个 user 消息文本)。 */
45
+ function taskHint(task) {
46
+ const history = task?.task?.history ?? task?.history ?? [];
47
+ for (const h of history) {
48
+ if (h?.role !== 1)
49
+ continue; // ROLE_USER
50
+ const text = (h?.message?.parts ?? [])
51
+ .filter((p) => typeof p?.text === 'string' && p.text.trim())
52
+ .map((p) => p.text)
53
+ .join(' ')
54
+ .trim();
55
+ if (text)
56
+ return text;
57
+ }
58
+ return '';
59
+ }
60
+ /** hint 与 question 语义相近才允许首答复用(避免答非所问)。 */
61
+ function hintCoversQuestion(hint, question) {
62
+ const h = hint.trim().slice(0, 30);
63
+ const q = question.trim().slice(0, 30);
64
+ if (!h || !q)
65
+ return false;
66
+ return h.includes(q) || q.includes(h);
67
+ }
68
+ async function a2aRequest(method, params, signal) {
69
+ const res = await fetch(A2A_URL, {
70
+ method: 'POST',
71
+ headers: { 'Content-Type': 'application/json', 'A2A-Version': '1.0' },
72
+ body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
73
+ signal,
74
+ });
75
+ if (!res.ok)
76
+ throw new Error(`gateway HTTP ${res.status}`);
77
+ const parsed = await res.json();
78
+ if (parsed?.error) {
79
+ const reason = parsed.error?.data?.[0]?.reason || '';
80
+ throw new Error(parsed.error?.message || JSON.stringify(parsed.error));
81
+ }
82
+ return parsed?.result;
83
+ }
84
+ function taskAnswer(task) {
85
+ const parts = task?.status?.message?.parts ?? [];
86
+ return parts
87
+ .map((p) => (typeof p?.text === 'string' ? p.text : ''))
88
+ .join('')
89
+ .trim();
90
+ }
91
+ exports.mediaAskTool = {
92
+ description: '分析或追问图片/视频/音频。当会话中存在 [媒体附件 taskID: xxx contextID: yyy] 指针时,传 taskID 追问 Media Agent;' +
93
+ '若手头只有媒体文件路径(如历史消息/工具返回里的 file 媒体),传 mediaPath 会自动上传并创建任务后再追问。' +
94
+ '参数:taskID — 从指针中提取的 taskID(与 mediaPath 二选一);mediaPath — 本地媒体文件绝对路径(与 taskID 二选一);' +
95
+ 'question — 你想问这个媒体的具体问题(如"分析缺陷"、"这段视频里发生了什么"、"音频说了什么")。' +
96
+ '注意:音频任务的首轮分析已返回自然语言的内容转写 + 情绪/语调轨迹 + 意图描述——' +
97
+ '转写即用户语音消息的内容本身,直接据此理解并回应,不要在回复中复述/重复转写文本;' +
98
+ '返回:Media Agent 的分析结果文本,以及新任务 taskID(继续追问请用新 taskID,媒体不会重新上传)。',
99
+ args: {
100
+ taskID: zod_1.z.string().optional().describe('从 [媒体附件 taskID: xxx] 指针中提取的 taskID(与 mediaPath 二选一)'),
101
+ mediaPath: zod_1.z.string().optional().describe('本地媒体文件绝对路径(与 taskID 二选一;传此参数会自动上传媒体并创建任务)'),
102
+ question: zod_1.z.string().describe('要问这个媒体的具体问题'),
103
+ },
104
+ async execute({ taskID, mediaPath, question }, ctx) {
105
+ const signal = AbortSignal.any([ctx.abort, AbortSignal.timeout(TIMEOUT_MS)]);
106
+ try {
107
+ let activeTaskID = taskID;
108
+ let activeContextId;
109
+ if (activeTaskID) {
110
+ // ① GetTask → contextId(校验任务存在;TaskNotFound 会在此抛出)
111
+ const task = await a2aRequest('GetTask', { id: activeTaskID }, signal);
112
+ activeContextId = task?.task?.contextId ?? task?.contextId;
113
+ if (!activeContextId) {
114
+ const reason = task?.task?.status?.message?.parts?.map((p) => p?.text || '').join('') || '';
115
+ return {
116
+ title: 'Media Agent 调用失败',
117
+ output: `任务 ${activeTaskID} 不存在或已被清理,请重新上传媒体。${reason ? `(${reason})` : ''}`,
118
+ metadata: { taskID: activeTaskID },
119
+ };
120
+ }
121
+ // 首答复用:ingest 建任务时 hint=用户消息已让 MediaAgent 分析过,
122
+ // 首次追问且 question 与 hint 语义相近 → 直接复用已有回答(避免重复分析)
123
+ const state = task?.task?.status?.state ?? task?.status?.state;
124
+ const existing = taskAnswer(task?.task ?? task);
125
+ if (state === 'TASK_STATE_COMPLETED' && existing && !isReused(activeTaskID)) {
126
+ const hint = taskHint(task);
127
+ if (hintCoversQuestion(hint, question)) {
128
+ markReused(activeTaskID);
129
+ return {
130
+ title: 'Media Agent 回答',
131
+ output: existing + '\n(复用 ingest 分析结果;继续追问请再次调用本工具)',
132
+ metadata: { taskID: activeTaskID },
133
+ };
134
+ }
135
+ }
136
+ }
137
+ else if (mediaPath) {
138
+ // 无 taskID 但有媒体路径:读取媒体 → 建任务(hint = 问题)
139
+ let mediaType;
140
+ if (mediaPath.startsWith('data:')) {
141
+ mediaType = mediaPath.match(/^data:([^;]+);/)?.[1];
142
+ }
143
+ else {
144
+ // fileURLToPath handles Windows file:///C:/... (triple slash) and
145
+ // percent-encoding; a manual slice would break both.
146
+ const path = mediaPath.startsWith('file://') ? (0, node_url_1.fileURLToPath)(mediaPath) : mediaPath;
147
+ const ext = path.slice(path.lastIndexOf('.')).toLowerCase();
148
+ mediaType = media_upload_1.MEDIA_EXT_MIME[ext];
149
+ }
150
+ if (!mediaType) {
151
+ return {
152
+ title: 'Media Agent 调用失败',
153
+ output: `不支持的媒体格式:${mediaPath.includes('.') ? mediaPath.slice(mediaPath.lastIndexOf('.')).toLowerCase() : '(data URL 无 mime)'}`,
154
+ metadata: { mediaPath },
155
+ };
156
+ }
157
+ const dataUrl = await (0, media_ingest_1.mediaDataFromSource)(mediaPath, mediaType);
158
+ const created = await (0, media_ingest_1.createMediaTask)(dataUrl, question);
159
+ activeTaskID = created.id;
160
+ activeContextId = created.contextId;
161
+ // 首答复用:建任务时 hint=question 恒成立——任务已完成则直接返回其回答
162
+ //(避免 SendMessage 再分析一次;newTaskID 保持追问契约)
163
+ const createdTask = await a2aRequest('GetTask', { id: activeTaskID }, signal);
164
+ const cState = createdTask?.task?.status?.state ?? createdTask?.status?.state;
165
+ const cAnswer = taskAnswer(createdTask?.task ?? createdTask);
166
+ if (cState === 'TASK_STATE_COMPLETED' && cAnswer) {
167
+ markReused(activeTaskID);
168
+ return {
169
+ title: 'Media Agent 回答',
170
+ output: cAnswer,
171
+ metadata: { taskID: activeTaskID, newTaskID: activeTaskID },
172
+ };
173
+ }
174
+ }
175
+ else {
176
+ return {
177
+ title: 'Media Agent 调用失败',
178
+ output: '缺少参数:请提供 taskID(媒体附件指针)或 mediaPath(媒体文件路径)。',
179
+ metadata: {},
180
+ };
181
+ }
182
+ // ② SendMessage → 多轮追问(引用前序任务,媒体不重传)
183
+ const result = await a2aRequest('SendMessage', {
184
+ message: {
185
+ messageId: `ask-${(0, crypto_1.randomUUID)()}`,
186
+ role: 1, // ROLE_USER
187
+ contextId: activeContextId,
188
+ referenceTaskIds: [activeTaskID],
189
+ parts: [{ text: question }],
190
+ },
191
+ }, signal);
192
+ const t = result?.task;
193
+ const state = t?.status?.state;
194
+ const answer = taskAnswer(t);
195
+ if (state === 'TASK_STATE_FAILED') {
196
+ return {
197
+ title: 'Media Agent 分析失败',
198
+ output: answer || 'Media Agent 分析失败,请稍后重试。',
199
+ metadata: { taskID: activeTaskID },
200
+ };
201
+ }
202
+ if (!answer) {
203
+ return {
204
+ title: 'Media Agent 返回空',
205
+ output: 'Media Agent 未返回描述,请稍后重试。',
206
+ metadata: { taskID: activeTaskID },
207
+ };
208
+ }
209
+ return {
210
+ title: 'Media Agent 回答',
211
+ output: answer + `\n(新任务 taskID: ${t?.id},继续追问请用新 taskID)`,
212
+ metadata: { taskID: activeTaskID, newTaskID: t?.id },
213
+ };
214
+ }
215
+ catch (err) {
216
+ return {
217
+ title: 'Media Agent 不可用',
218
+ output: `Media Agent 调用失败:${err.message}(请稍后重试)`,
219
+ metadata: { taskID: taskID ?? undefined, mediaPath: mediaPath ?? undefined },
220
+ };
221
+ }
222
+ },
223
+ };
224
+ //# sourceMappingURL=media-ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-ask.js","sourceRoot":"","sources":["../../src/tools/media-ask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ /** djb2 hash(与桌面端 ChatPane.hashText 同实现):标记携带文本指纹,前端据此去重(流式已播过则不重复播 artifact)。 */
3
+ export declare function hashText(s: string): string;
4
+ export interface MediaSpeakTool {
5
+ description: string;
6
+ args: Record<string, z.ZodTypeAny>;
7
+ execute: (args: {
8
+ text: string;
9
+ voice?: string;
10
+ style?: string;
11
+ }, ctx: {
12
+ abort: AbortSignal;
13
+ }) => Promise<unknown>;
14
+ }
15
+ export declare const mediaSpeakTool: MediaSpeakTool;
16
+ //# sourceMappingURL=media-speak.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-speak.d.ts","sourceRoot":"","sources":["../../src/tools/media-speak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAexB,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI1C;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,EAAE;QAAE,KAAK,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACpH;AAED,eAAO,MAAM,cAAc,EAAE,cAiD5B,CAAC"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mediaSpeakTool = void 0;
4
+ exports.hashText = hashText;
5
+ const zod_1 = require("zod");
6
+ /**
7
+ * mafw_media_speak — 文本转语音(MiMo-V2.5-TTS,预置音色)。
8
+ *
9
+ * 主 Agent 需要以语音形式回复时调用本工具。gateway 调用小米 TTS 合成 wav,
10
+ * 存入 artifact 并返回引用标记。工具返回 `[语音回复 art:<id> 音色:<voice>]`,
11
+ * 主 Agent 必须把该标记**原样**包含在回复文本中,桌面端据此渲染音频播放器。
12
+ *
13
+ * 音色(预置):冰糖 / 茉莉 / 苏打 / 白桦 / Mia / Chloe / Milo / Dean。
14
+ */
15
+ const GATEWAY_PORT = process.env.MAFW_SERVER_API_PORT || process.env.MAFW_GATEWAY_PORT || '3000';
16
+ const TTS_URL = `http://127.0.0.1:${GATEWAY_PORT}/api/tts`;
17
+ /** djb2 hash(与桌面端 ChatPane.hashText 同实现):标记携带文本指纹,前端据此去重(流式已播过则不重复播 artifact)。 */
18
+ function hashText(s) {
19
+ let h = 5381;
20
+ for (let i = 0; i < s.length; i++)
21
+ h = ((h << 5) + h + s.charCodeAt(i)) >>> 0;
22
+ return h.toString(16).padStart(8, '0');
23
+ }
24
+ exports.mediaSpeakTool = {
25
+ description: '将文本合成为语音(MiMo-V2.5-TTS 预置音色)。当你需要以语音形式回复用户时调用——' +
26
+ '尤其是用户通过语音消息输入(消息含音频媒体附件指针)时,你必须调用本工具以语音形式回复。' +
27
+ '参数:text — 要合成的文本(不超过 2000 字符);voice — 音色(可选,预置:冰糖/茉莉/苏打/白桦/Mia/Chloe/Milo/Dean,默认茉莉);' +
28
+ 'style — 发音风格指令(可选,如"轻快上扬的语调")。' +
29
+ 'text 支持音频标签精细控制(无需额外参数):开头加 (风格) 指定整体风格(如 (慵懒)/(磁性)/(东北话)/(粤语)/(唱歌)歌词),' +
30
+ '文中可插入 [标签](如 [笑]/[叹气]/[低语]/[语速加快])做细粒度调节。' +
31
+ '返回:[语音回复 art:<id> 音色:<voice> h:<hash>] 标记。你必须在回复文本中原样包含该标记,桌面端会据此自动播放语音(h 为文本指纹,桌面端用于流式去重,原样保留即可)。',
32
+ args: {
33
+ text: zod_1.z.string().describe('要合成的文本(≤2000 字符)'),
34
+ voice: zod_1.z.string().optional().describe('预置音色:冰糖/茉莉/苏打/白桦/Mia/Chloe/Milo/Dean(默认茉莉)'),
35
+ style: zod_1.z.string().optional().describe('发音风格指令(可选,如"轻快上扬的语调,语速稍快")'),
36
+ },
37
+ async execute({ text, voice, style }, ctx) {
38
+ const signal = AbortSignal.any([ctx.abort, AbortSignal.timeout(130_000)]);
39
+ try {
40
+ const res = await fetch(TTS_URL, {
41
+ method: 'POST',
42
+ headers: { 'Content-Type': 'application/json' },
43
+ body: JSON.stringify({ text, voice, style }),
44
+ signal,
45
+ });
46
+ if (!res.ok) {
47
+ let detail = '';
48
+ try {
49
+ const j = await res.json();
50
+ detail = j?.error || '';
51
+ }
52
+ catch { /* ignore */ }
53
+ return {
54
+ title: '语音合成失败',
55
+ output: `语音合成失败:HTTP ${res.status}${detail ? `(${detail})` : ''}`,
56
+ metadata: {},
57
+ };
58
+ }
59
+ const j = await res.json();
60
+ if (!j?.artifactId) {
61
+ return { title: '语音合成失败', output: '语音合成未返回音频引用。', metadata: {} };
62
+ }
63
+ return {
64
+ title: '语音已生成',
65
+ output: `[语音回复 art:${j.artifactId} 音色:${j.voice || voice || '默认'} h:${hashText(text)}]`,
66
+ metadata: { artifactId: j.artifactId, voice: j.voice || voice, url: j.url },
67
+ };
68
+ }
69
+ catch (err) {
70
+ return {
71
+ title: '语音合成不可用',
72
+ output: `语音合成调用失败:${err.message}(请稍后重试)`,
73
+ metadata: {},
74
+ };
75
+ }
76
+ },
77
+ };
78
+ //# sourceMappingURL=media-speak.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-speak.js","sourceRoot":"","sources":["../../src/tools/media-speak.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ export declare const MEDIA_EXT_MIME: Record<string, string>;
3
+ export interface MediaUploadTool {
4
+ description: string;
5
+ args: Record<string, z.ZodTypeAny>;
6
+ execute: (args: {
7
+ mediaPath: string;
8
+ question?: string;
9
+ }, ctx: {
10
+ abort: AbortSignal;
11
+ }) => Promise<unknown>;
12
+ }
13
+ export declare const mediaUploadTool: MediaUploadTool;
14
+ //# sourceMappingURL=media-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-upload.d.ts","sourceRoot":"","sources":["../../src/tools/media-upload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkBjD,CAAC;AASF,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,EAAE;QAAE,KAAK,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5G;AAED,eAAO,MAAM,eAAe,EAAE,eAwF7B,CAAC"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.mediaUploadTool = exports.MEDIA_EXT_MIME = void 0;
27
+ const fs = __importStar(require("fs"));
28
+ const crypto_1 = require("crypto");
29
+ const zod_1 = require("zod");
30
+ const media_ingest_1 = require("../hooks/media-ingest");
31
+ /**
32
+ * mafw_media_upload — 上传本地图片/视频/音频到 Media Agent(建任务),返回
33
+ * 指针文本。
34
+ *
35
+ * 推理 Agent 在用户给出本地媒体文件路径(或自己截的图/录的音)时主动调用,
36
+ * 之后用返回的 taskID 通过 mafw_media_ask 多轮追问。走标准 A2A SendMessage。
37
+ */
38
+ const GATEWAY_PORT = process.env.MAFW_SERVER_API_PORT || process.env.MAFW_GATEWAY_PORT || '3000';
39
+ const A2A_URL = `http://127.0.0.1:${GATEWAY_PORT}/a2a`;
40
+ exports.MEDIA_EXT_MIME = {
41
+ '.png': 'image/png',
42
+ '.jpg': 'image/jpeg',
43
+ '.jpeg': 'image/jpeg',
44
+ '.gif': 'image/gif',
45
+ '.webp': 'image/webp',
46
+ '.bmp': 'image/bmp',
47
+ '.mp4': 'video/mp4',
48
+ '.webm': 'video/webm',
49
+ '.mov': 'video/quicktime',
50
+ '.mkv': 'video/x-matroska',
51
+ '.ogg': 'video/ogg',
52
+ '.mp3': 'audio/mpeg',
53
+ '.wav': 'audio/wav',
54
+ '.m4a': 'audio/mp4',
55
+ '.flac': 'audio/flac',
56
+ '.aac': 'audio/aac',
57
+ '.opus': 'audio/ogg',
58
+ };
59
+ // 与 gateway MediaAgent 的大小上限对齐(base64 ≈ bytes × 1.33)
60
+ const MAX_BYTES = {
61
+ 'image/': 20 * 1024 * 1024,
62
+ 'video/': 50 * 1024 * 1024,
63
+ 'audio/': 25 * 1024 * 1024,
64
+ };
65
+ exports.mediaUploadTool = {
66
+ description: '上传一个本地图片/视频/音频文件到 Media Agent 并返回引用指针。当用户给出本地媒体文件路径(图片、视频、音频)时调用此工具,' +
67
+ '之后可用返回的 taskID 通过 mafw_media_ask 对该媒体多轮追问。' +
68
+ '参数:mediaPath — 本地媒体文件的绝对路径(图片 png/jpg/jpeg/gif/webp/bmp;视频 mp4/webm/mov/mkv/ogg;音频 mp3/wav/m4a/flac/aac/opus);question — 可选的首个问题。' +
69
+ '返回:Media Agent 任务引用(含 taskID),以及首个问题的回答(若有)。',
70
+ args: {
71
+ mediaPath: zod_1.z.string().describe('本地媒体文件绝对路径(图片/视频/音频)'),
72
+ question: zod_1.z.string().optional().describe('可选的首个问题'),
73
+ },
74
+ async execute({ mediaPath, question }, ctx) {
75
+ const signal = AbortSignal.any([ctx.abort, AbortSignal.timeout(60_000)]);
76
+ try {
77
+ const path = mediaPath.startsWith('file://') ? mediaPath.slice('file://'.length) : mediaPath;
78
+ const ext = path.slice(path.lastIndexOf('.')).toLowerCase();
79
+ const mediaType = exports.MEDIA_EXT_MIME[ext];
80
+ if (!mediaType) {
81
+ return {
82
+ title: '上传失败',
83
+ output: `不支持的媒体格式:${ext || '(无扩展名)'}(支持 png/jpg/jpeg/gif/webp/bmp / mp4/webm/mov/mkv/ogg / mp3/wav/m4a/flac/aac/opus)`,
84
+ metadata: { mediaPath },
85
+ };
86
+ }
87
+ const bytes = fs.readFileSync(path);
88
+ const kindPrefix = mediaType.split('/')[0] + '/';
89
+ const max = MAX_BYTES[kindPrefix] ?? Infinity;
90
+ if (bytes.length > max) {
91
+ return {
92
+ title: '上传失败',
93
+ output: `媒体过大:${(bytes.length / (1024 * 1024)).toFixed(1)}MB 超过上限 ${(max / (1024 * 1024)).toFixed(0)}MB(${mediaType})`,
94
+ metadata: { mediaPath },
95
+ };
96
+ }
97
+ const body = {
98
+ jsonrpc: '2.0',
99
+ id: 1,
100
+ method: 'SendMessage',
101
+ params: {
102
+ message: {
103
+ messageId: `upload-${(0, crypto_1.randomUUID)()}`,
104
+ role: 1, // ROLE_USER
105
+ parts: [
106
+ { raw: bytes.toString('base64'), mediaType, filename: path.split(/[\\/]/).pop() || 'media.bin' },
107
+ ...(question ? [{ text: question }] : []),
108
+ ],
109
+ },
110
+ },
111
+ };
112
+ const res = await fetch(A2A_URL, {
113
+ method: 'POST',
114
+ headers: { 'Content-Type': 'application/json', 'A2A-Version': '1.0' },
115
+ body: JSON.stringify(body),
116
+ signal,
117
+ });
118
+ if (!res.ok)
119
+ throw new Error(`gateway HTTP ${res.status}`);
120
+ const parsed = await res.json();
121
+ if (parsed?.error)
122
+ throw new Error(parsed.error?.message || JSON.stringify(parsed.error));
123
+ const task = parsed?.result?.task;
124
+ if (!task?.id)
125
+ throw new Error('gateway 未返回任务');
126
+ const state = task?.status?.state;
127
+ const answer = (task?.status?.message?.parts ?? [])
128
+ .map((p) => (typeof p?.text === 'string' ? p.text : ''))
129
+ .join('')
130
+ .trim();
131
+ if (state === 'TASK_STATE_FAILED') {
132
+ return {
133
+ title: 'Media Agent 分析失败',
134
+ output: answer || 'Media Agent 分析失败,请稍后重试。',
135
+ metadata: { mediaPath, taskID: task.id },
136
+ };
137
+ }
138
+ const pointer = (0, media_ingest_1.makeMediaPointer)(task.id, task.contextId, path.split(/[\\/]/).pop() || 'media.bin');
139
+ const extra = answer ? `\n首个问题回答:${answer}` : '';
140
+ return {
141
+ title: '媒体已上传',
142
+ output: `${pointer}${extra}`,
143
+ metadata: { mediaPath, taskID: task.id, contextID: task.contextId },
144
+ };
145
+ }
146
+ catch (err) {
147
+ return {
148
+ title: '上传失败',
149
+ output: `媒体上传失败:${err.message}`,
150
+ metadata: { mediaPath },
151
+ };
152
+ }
153
+ },
154
+ };
155
+ //# sourceMappingURL=media-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-upload.js","sourceRoot":"","sources":["../../src/tools/media-upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { z } from 'zod';
2
+ export interface PythonExecTool {
3
+ description: string;
4
+ args: Record<string, z.ZodTypeAny>;
5
+ execute: (args: {
6
+ code: string;
7
+ }, ctx: {
8
+ sessionID: string;
9
+ abort: AbortSignal;
10
+ }) => Promise<unknown>;
11
+ }
12
+ export declare const pythonExecTool: PythonExecTool;
13
+ //# sourceMappingURL=python-exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-exec.d.ts","sourceRoot":"","sources":["../../src/tools/python-exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,EAAE,CACP,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EACtB,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,CAAA;KAAE,KAC3C,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAED,eAAO,MAAM,cAAc,EAAE,cAgF5B,CAAC"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pythonExecTool = void 0;
4
+ const zod_1 = require("zod");
5
+ /**
6
+ * mafw_python — 在会话的持久 Python 内核中执行代码(Prime Agent / Jupyter kernel 架构)。
7
+ *
8
+ * 变量、导入、数据跨调用保持(同一会话共享一个内核)。适合:数据分析/统计/
9
+ * 科学计算/多步计算(后续代码要复用前面的变量与结果)。matplotlib 图表会以
10
+ * 图片附件返回,可用 mafw_media_upload / mafw_media_ask 查看。
11
+ */
12
+ const GATEWAY_PORT = process.env.MAFW_SERVER_API_PORT || process.env.MAFW_GATEWAY_PORT || '3000';
13
+ const EXECUTE_URL = `http://127.0.0.1:${GATEWAY_PORT}/api/python/execute`;
14
+ exports.pythonExecTool = {
15
+ description: '在会话的持久 Python 内核中执行代码(数据分析/统计/科学计算/多步计算时优先用本工具,' +
16
+ '不要用 bash 里的 python -c —— 本工具变量和导入跨调用保持,无需重复定义)。' +
17
+ '例如:先执行 x = [1,2,3],下一次调用可直接 print(sum(x))。' +
18
+ 'matplotlib 图表会作为图片附件返回,可用 mafw_media_upload/mafw_media_ask 查看。' +
19
+ '项目代码、测试、CLI、依赖检查请用 bash 走项目自己的环境。参数:code — 要执行的 Python 代码。',
20
+ args: {
21
+ code: zod_1.z.string().describe('要执行的 Python 代码(状态跨调用保持)'),
22
+ },
23
+ async execute({ code }, ctx) {
24
+ const signal = AbortSignal.any([ctx.abort, AbortSignal.timeout(180_000)]);
25
+ try {
26
+ const res = await fetch(EXECUTE_URL, {
27
+ method: 'POST',
28
+ headers: { 'Content-Type': 'application/json' },
29
+ body: JSON.stringify({ sessionID: ctx.sessionID, code }),
30
+ signal,
31
+ });
32
+ if (!res.ok) {
33
+ const body = await res.json().catch(() => ({}));
34
+ return { title: 'Python 执行失败', output: `内核请求失败:${body?.error || res.status}`, metadata: {} };
35
+ }
36
+ const r = await res.json();
37
+ // Structured payload for the desktop tool card (MafwPythonCard).
38
+ // Images are capped to keep part.state.metadata reasonable.
39
+ const images = (r.attachments || [])
40
+ .filter((a) => typeof a?.data === 'string')
41
+ .slice(0, 4)
42
+ .map((a) => ({
43
+ mimeType: a.mimeType || 'image/png',
44
+ data: a.data.length > 1_400_000 ? '' : a.data,
45
+ }))
46
+ .filter((a) => a.data);
47
+ const meta = {
48
+ status: r.status,
49
+ durationMs: r.durationMs,
50
+ truncated: !!r.truncated,
51
+ stdout: typeof r.stdout === 'string' ? r.stdout : '',
52
+ stderr: typeof r.stderr === 'string' ? r.stderr : '',
53
+ result: typeof r.result === 'string' ? r.result : '',
54
+ error: r.error ? { ename: r.error.ename, evalue: r.error.evalue, traceback: Array.isArray(r.error.traceback) ? r.error.traceback : [] } : undefined,
55
+ images,
56
+ kernelRestarted: !!r.kernelRestarted,
57
+ };
58
+ if (r.status === 'error' && r.error) {
59
+ const traceback = Array.isArray(r.error.traceback) ? r.error.traceback.join('\n') : '';
60
+ const brief = traceback ? traceback.split('\n').slice(-6).join('\n') : `${r.error.ename}: ${r.error.evalue}`;
61
+ return {
62
+ title: 'Python 执行出错',
63
+ output: `代码执行出错:${r.error.ename}: ${r.error.evalue}\n${brief}\n(会话内核状态保留,可修改后重试)`,
64
+ metadata: { python: meta },
65
+ };
66
+ }
67
+ if (r.status === 'aborted') {
68
+ return { title: 'Python 执行已中止', output: '执行已超时或中断(内核已打断,可重试或重启内核)', metadata: { python: meta } };
69
+ }
70
+ const parts = [];
71
+ if (r.kernelRestarted)
72
+ parts.push('<python_kernel_reset> 内核已重启,之前的变量/导入已丢失,请重新定义。</python_kernel_reset>');
73
+ if (r.stdout)
74
+ parts.push(r.stdout);
75
+ if (r.result)
76
+ parts.push(r.result);
77
+ if (r.stderr)
78
+ parts.push(`stderr:\n${r.stderr}`);
79
+ if (r.truncated)
80
+ parts.push('...(输出已截断)');
81
+ if ((r.attachments || []).length > 0)
82
+ parts.push(`[生成 ${r.attachments.length} 张图片]`);
83
+ const output = parts.join('\n') || '(无输出)';
84
+ return {
85
+ title: 'Python 执行结果',
86
+ output,
87
+ metadata: { python: meta },
88
+ };
89
+ }
90
+ catch (err) {
91
+ return {
92
+ title: 'Python 内核不可用',
93
+ output: `内核调用失败:${err.message}(可用 mafw_python_restart 重启内核)`,
94
+ metadata: {},
95
+ };
96
+ }
97
+ },
98
+ };
99
+ //# sourceMappingURL=python-exec.js.map