@jack200714/mafw 4.5.1 → 4.5.2

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 (320) hide show
  1. package/README.md +5 -2
  2. package/bin/mafw.js +16 -14
  3. package/package.json +1 -7
  4. package/.opencode/mafw/.backup-v61/parametric/base-skill-manifest.yaml +0 -2
  5. package/.opencode/mafw/STATUS.md +0 -6
  6. package/.opencode/mafw/ledger.md +0 -20
  7. package/.opencode/mafw/memory/.harmonic_index.json +0 -28
  8. package/.opencode/mafw/memory/.review_queue.json +0 -1
  9. package/.opencode/mafw/memory/tier3/parametric.json +0 -13
  10. package/.opencode/mafw/memory/tier3/test-goal.json +0 -19
  11. package/.opencode/mafw/memory-index.json +0 -6
  12. package/.opencode/mafw/parametric/base-skill-manifest.yaml +0 -2
  13. package/.opencode/mafw/waves.json +0 -4
  14. package/.opencode/opencode.json +0 -3
  15. package/.opencode/plugins/mafw-plugin.ts +0 -8
  16. package/.opencode/skills/banner-design/SKILL.md +0 -196
  17. package/.opencode/skills/banner-design/references/banner-sizes-and-styles.md +0 -118
  18. package/.opencode/skills/brand/SKILL.md +0 -97
  19. package/.opencode/skills/brand/references/approval-checklist.md +0 -169
  20. package/.opencode/skills/brand/references/asset-organization.md +0 -157
  21. package/.opencode/skills/brand/references/brand-guideline-template.md +0 -140
  22. package/.opencode/skills/brand/references/color-palette-management.md +0 -186
  23. package/.opencode/skills/brand/references/consistency-checklist.md +0 -94
  24. package/.opencode/skills/brand/references/logo-usage-rules.md +0 -185
  25. package/.opencode/skills/brand/references/messaging-framework.md +0 -85
  26. package/.opencode/skills/brand/references/typography-specifications.md +0 -214
  27. package/.opencode/skills/brand/references/update.md +0 -118
  28. package/.opencode/skills/brand/references/visual-identity.md +0 -96
  29. package/.opencode/skills/brand/references/voice-framework.md +0 -88
  30. package/.opencode/skills/brand/scripts/extract-colors.cjs +0 -341
  31. package/.opencode/skills/brand/scripts/inject-brand-context.cjs +0 -349
  32. package/.opencode/skills/brand/scripts/sync-brand-to-tokens.cjs +0 -248
  33. package/.opencode/skills/brand/scripts/tests/test_sync_brand_to_tokens.py +0 -52
  34. package/.opencode/skills/brand/scripts/validate-asset.cjs +0 -387
  35. package/.opencode/skills/brand/templates/brand-guidelines-starter.md +0 -275
  36. package/.opencode/skills/design/SKILL.md +0 -313
  37. package/.opencode/skills/design/data/cip/deliverables.csv +0 -51
  38. package/.opencode/skills/design/data/cip/industries.csv +0 -21
  39. package/.opencode/skills/design/data/cip/mockup-contexts.csv +0 -21
  40. package/.opencode/skills/design/data/cip/styles.csv +0 -21
  41. package/.opencode/skills/design/data/icon/styles.csv +0 -16
  42. package/.opencode/skills/design/data/logo/colors.csv +0 -56
  43. package/.opencode/skills/design/data/logo/industries.csv +0 -56
  44. package/.opencode/skills/design/data/logo/styles.csv +0 -56
  45. package/.opencode/skills/design/references/banner-sizes-and-styles.md +0 -118
  46. package/.opencode/skills/design/references/cip-deliverable-guide.md +0 -95
  47. package/.opencode/skills/design/references/cip-design.md +0 -121
  48. package/.opencode/skills/design/references/cip-prompt-engineering.md +0 -84
  49. package/.opencode/skills/design/references/cip-style-guide.md +0 -68
  50. package/.opencode/skills/design/references/design-routing.md +0 -207
  51. package/.opencode/skills/design/references/icon-design.md +0 -122
  52. package/.opencode/skills/design/references/logo-color-psychology.md +0 -101
  53. package/.opencode/skills/design/references/logo-design.md +0 -92
  54. package/.opencode/skills/design/references/logo-prompt-engineering.md +0 -158
  55. package/.opencode/skills/design/references/logo-style-guide.md +0 -109
  56. package/.opencode/skills/design/references/slides-copywriting-formulas.md +0 -84
  57. package/.opencode/skills/design/references/slides-create.md +0 -4
  58. package/.opencode/skills/design/references/slides-html-template.md +0 -295
  59. package/.opencode/skills/design/references/slides-layout-patterns.md +0 -137
  60. package/.opencode/skills/design/references/slides-strategies.md +0 -94
  61. package/.opencode/skills/design/references/slides.md +0 -42
  62. package/.opencode/skills/design/references/social-photos-design.md +0 -329
  63. package/.opencode/skills/design/scripts/cip/core.py +0 -215
  64. package/.opencode/skills/design/scripts/cip/generate.py +0 -484
  65. package/.opencode/skills/design/scripts/cip/render-html.py +0 -424
  66. package/.opencode/skills/design/scripts/cip/search.py +0 -127
  67. package/.opencode/skills/design/scripts/icon/generate.py +0 -487
  68. package/.opencode/skills/design/scripts/logo/core.py +0 -175
  69. package/.opencode/skills/design/scripts/logo/generate.py +0 -362
  70. package/.opencode/skills/design/scripts/logo/search.py +0 -114
  71. package/.opencode/skills/design-system/SKILL.md +0 -244
  72. package/.opencode/skills/design-system/data/slide-backgrounds.csv +0 -11
  73. package/.opencode/skills/design-system/data/slide-charts.csv +0 -26
  74. package/.opencode/skills/design-system/data/slide-color-logic.csv +0 -14
  75. package/.opencode/skills/design-system/data/slide-copy.csv +0 -26
  76. package/.opencode/skills/design-system/data/slide-layout-logic.csv +0 -16
  77. package/.opencode/skills/design-system/data/slide-layouts.csv +0 -26
  78. package/.opencode/skills/design-system/data/slide-strategies.csv +0 -16
  79. package/.opencode/skills/design-system/data/slide-typography.csv +0 -15
  80. package/.opencode/skills/design-system/references/component-specs.md +0 -236
  81. package/.opencode/skills/design-system/references/component-tokens.md +0 -214
  82. package/.opencode/skills/design-system/references/primitive-tokens.md +0 -203
  83. package/.opencode/skills/design-system/references/semantic-tokens.md +0 -215
  84. package/.opencode/skills/design-system/references/states-and-variants.md +0 -241
  85. package/.opencode/skills/design-system/references/tailwind-integration.md +0 -251
  86. package/.opencode/skills/design-system/references/token-architecture.md +0 -224
  87. package/.opencode/skills/design-system/scripts/embed-tokens.cjs +0 -99
  88. package/.opencode/skills/design-system/scripts/fetch-background.py +0 -317
  89. package/.opencode/skills/design-system/scripts/generate-slide.py +0 -770
  90. package/.opencode/skills/design-system/scripts/generate-tokens.cjs +0 -205
  91. package/.opencode/skills/design-system/scripts/html-token-validator.py +0 -327
  92. package/.opencode/skills/design-system/scripts/search-slides.py +0 -218
  93. package/.opencode/skills/design-system/scripts/slide-token-validator.py +0 -35
  94. package/.opencode/skills/design-system/scripts/slide_search_core.py +0 -453
  95. package/.opencode/skills/design-system/scripts/tests/test_validate_tokens.py +0 -48
  96. package/.opencode/skills/design-system/scripts/validate-tokens.cjs +0 -246
  97. package/.opencode/skills/design-system/templates/design-tokens-starter.json +0 -143
  98. package/.opencode/skills/frontend-design/LICENSE.txt +0 -21
  99. package/.opencode/skills/frontend-design/SKILL.md +0 -115
  100. package/.opencode/skills/mafw-automation-interview/SKILL.md +0 -43
  101. package/.opencode/skills/mafw-cli-scanner/SKILL.md +0 -37
  102. package/.opencode/skills/mafw-compression-verifier/SKILL.md +0 -52
  103. package/.opencode/skills/mafw-desktop-inspector/SKILL.md +0 -170
  104. package/.opencode/skills/mafw-execute/SKILL.md +0 -62
  105. package/.opencode/skills/mafw-gateway-restart/SKILL.md +0 -87
  106. package/.opencode/skills/mafw-github-scanner/SKILL.md +0 -38
  107. package/.opencode/skills/mafw-goal/SKILL.md +0 -76
  108. package/.opencode/skills/mafw-interview/SKILL.md +0 -68
  109. package/.opencode/skills/mafw-memory-extractor/SKILL.md +0 -65
  110. package/.opencode/skills/mafw-plan/SKILL.md +0 -58
  111. package/.opencode/skills/mafw-review/SKILL.md +0 -85
  112. package/.opencode/skills/runtime-plugin-authoring/SKILL.md +0 -791
  113. package/.opencode/skills/slides/SKILL.md +0 -40
  114. package/.opencode/skills/slides/references/copywriting-formulas.md +0 -84
  115. package/.opencode/skills/slides/references/create.md +0 -4
  116. package/.opencode/skills/slides/references/html-template.md +0 -295
  117. package/.opencode/skills/slides/references/layout-patterns.md +0 -137
  118. package/.opencode/skills/slides/references/slide-strategies.md +0 -94
  119. package/.opencode/skills/ui-styling/LICENSE.txt +0 -202
  120. package/.opencode/skills/ui-styling/SKILL.md +0 -324
  121. package/.opencode/skills/ui-styling/references/canvas-design-system.md +0 -320
  122. package/.opencode/skills/ui-styling/references/shadcn-accessibility.md +0 -471
  123. package/.opencode/skills/ui-styling/references/shadcn-components.md +0 -424
  124. package/.opencode/skills/ui-styling/references/shadcn-theming.md +0 -373
  125. package/.opencode/skills/ui-styling/references/tailwind-customization.md +0 -483
  126. package/.opencode/skills/ui-styling/references/tailwind-responsive.md +0 -382
  127. package/.opencode/skills/ui-styling/references/tailwind-utilities.md +0 -455
  128. package/.opencode/skills/ui-styling/scripts/requirements.txt +0 -17
  129. package/.opencode/skills/ui-styling/scripts/shadcn_add.py +0 -308
  130. package/.opencode/skills/ui-styling/scripts/tailwind_config_gen.py +0 -473
  131. package/.opencode/skills/ui-styling/scripts/tests/coverage-ui.json +0 -1
  132. package/.opencode/skills/ui-styling/scripts/tests/requirements.txt +0 -3
  133. package/.opencode/skills/ui-styling/scripts/tests/test_shadcn_add.py +0 -266
  134. package/.opencode/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +0 -394
  135. package/.opencode/skills/ui-ux-pro-max/SKILL.md +0 -388
  136. package/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +0 -31
  137. package/.opencode/skills/ui-ux-pro-max/data/charts.csv +0 -26
  138. package/.opencode/skills/ui-ux-pro-max/data/colors.csv +0 -193
  139. package/.opencode/skills/ui-ux-pro-max/data/google-fonts.csv +0 -1924
  140. package/.opencode/skills/ui-ux-pro-max/data/icons.csv +0 -106
  141. package/.opencode/skills/ui-ux-pro-max/data/landing.csv +0 -35
  142. package/.opencode/skills/ui-ux-pro-max/data/motion.csv +0 -17
  143. package/.opencode/skills/ui-ux-pro-max/data/products.csv +0 -193
  144. package/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +0 -45
  145. package/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +0 -51
  146. package/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +0 -54
  147. package/.opencode/skills/ui-ux-pro-max/data/stacks/avalonia.csv +0 -57
  148. package/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  149. package/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  150. package/.opencode/skills/ui-ux-pro-max/data/stacks/javafx.csv +0 -76
  151. package/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  152. package/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +0 -51
  153. package/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  154. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -71
  155. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  156. package/.opencode/skills/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  157. package/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +0 -54
  158. package/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  159. package/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  160. package/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  161. package/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +0 -54
  162. package/.opencode/skills/ui-ux-pro-max/data/stacks/uno.csv +0 -60
  163. package/.opencode/skills/ui-ux-pro-max/data/stacks/uwp.csv +0 -56
  164. package/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  165. package/.opencode/skills/ui-ux-pro-max/data/stacks/winui.csv +0 -60
  166. package/.opencode/skills/ui-ux-pro-max/data/stacks/wpf.csv +0 -57
  167. package/.opencode/skills/ui-ux-pro-max/data/styles.csv +0 -85
  168. package/.opencode/skills/ui-ux-pro-max/data/typography.csv +0 -75
  169. package/.opencode/skills/ui-ux-pro-max/data/ui-reasoning.csv +0 -162
  170. package/.opencode/skills/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  171. package/.opencode/skills/ui-ux-pro-max/scripts/core.py +0 -464
  172. package/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +0 -1479
  173. package/.opencode/skills/ui-ux-pro-max/scripts/search.py +0 -162
  174. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_core.py +0 -134
  175. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_design_system_mode.py +0 -159
  176. package/.opencode/skills/ui-ux-pro-max/scripts/validate_data.py +0 -114
  177. package/dist/hooks/bash-python-guide.d.ts +0 -4
  178. package/dist/hooks/bash-python-guide.d.ts.map +0 -1
  179. package/dist/hooks/bash-python-guide.js +0 -67
  180. package/dist/hooks/bash-python-guide.js.map +0 -1
  181. package/dist/hooks/handoff.d.ts +0 -9
  182. package/dist/hooks/handoff.d.ts.map +0 -1
  183. package/dist/hooks/handoff.js +0 -8
  184. package/dist/hooks/handoff.js.map +0 -1
  185. package/dist/hooks/hook-manager.d.ts +0 -32
  186. package/dist/hooks/hook-manager.d.ts.map +0 -1
  187. package/dist/hooks/hook-manager.js +0 -91
  188. package/dist/hooks/hook-manager.js.map +0 -1
  189. package/dist/hooks/llm-after.d.ts +0 -8
  190. package/dist/hooks/llm-after.d.ts.map +0 -1
  191. package/dist/hooks/llm-after.js +0 -8
  192. package/dist/hooks/llm-after.js.map +0 -1
  193. package/dist/hooks/media-ingest.d.ts +0 -43
  194. package/dist/hooks/media-ingest.d.ts.map +0 -1
  195. package/dist/hooks/media-ingest.js +0 -269
  196. package/dist/hooks/media-ingest.js.map +0 -1
  197. package/dist/hooks/memory-guide.d.ts +0 -3
  198. package/dist/hooks/memory-guide.d.ts.map +0 -1
  199. package/dist/hooks/memory-guide.js +0 -47
  200. package/dist/hooks/memory-guide.js.map +0 -1
  201. package/dist/hooks/observation-capture.d.ts +0 -17
  202. package/dist/hooks/observation-capture.d.ts.map +0 -1
  203. package/dist/hooks/observation-capture.js +0 -20
  204. package/dist/hooks/observation-capture.js.map +0 -1
  205. package/dist/hooks/session-compacting.d.ts +0 -6
  206. package/dist/hooks/session-compacting.d.ts.map +0 -1
  207. package/dist/hooks/session-compacting.js +0 -6
  208. package/dist/hooks/session-compacting.js.map +0 -1
  209. package/dist/hooks/session-ending.d.ts +0 -20
  210. package/dist/hooks/session-ending.d.ts.map +0 -1
  211. package/dist/hooks/session-ending.js +0 -113
  212. package/dist/hooks/session-ending.js.map +0 -1
  213. package/dist/hooks/session-recall.d.ts +0 -2
  214. package/dist/hooks/session-recall.d.ts.map +0 -1
  215. package/dist/hooks/session-recall.js +0 -103
  216. package/dist/hooks/session-recall.js.map +0 -1
  217. package/dist/hooks/session-start.d.ts +0 -9
  218. package/dist/hooks/session-start.d.ts.map +0 -1
  219. package/dist/hooks/session-start.js +0 -42
  220. package/dist/hooks/session-start.js.map +0 -1
  221. package/dist/hooks/tool-before.d.ts +0 -10
  222. package/dist/hooks/tool-before.d.ts.map +0 -1
  223. package/dist/hooks/tool-before.js +0 -6
  224. package/dist/hooks/tool-before.js.map +0 -1
  225. package/dist/hooks/tool-executed.d.ts +0 -19
  226. package/dist/hooks/tool-executed.d.ts.map +0 -1
  227. package/dist/hooks/tool-executed.js +0 -12
  228. package/dist/hooks/tool-executed.js.map +0 -1
  229. package/dist/hooks/user-profile.d.ts +0 -2
  230. package/dist/hooks/user-profile.d.ts.map +0 -1
  231. package/dist/hooks/user-profile.js +0 -30
  232. package/dist/hooks/user-profile.js.map +0 -1
  233. package/dist/hooks/user-prompt.d.ts +0 -9
  234. package/dist/hooks/user-prompt.d.ts.map +0 -1
  235. package/dist/hooks/user-prompt.js +0 -8
  236. package/dist/hooks/user-prompt.js.map +0 -1
  237. package/dist/hooks/voice-guide.d.ts +0 -8
  238. package/dist/hooks/voice-guide.d.ts.map +0 -1
  239. package/dist/hooks/voice-guide.js +0 -101
  240. package/dist/hooks/voice-guide.js.map +0 -1
  241. package/dist/plugin.d.ts +0 -55
  242. package/dist/plugin.d.ts.map +0 -1
  243. package/dist/plugin.js +0 -342
  244. package/dist/plugin.js.map +0 -1
  245. package/dist/tools/add-memory.d.ts +0 -17
  246. package/dist/tools/add-memory.d.ts.map +0 -1
  247. package/dist/tools/add-memory.js +0 -60
  248. package/dist/tools/add-memory.js.map +0 -1
  249. package/dist/tools/media-ask.d.ts +0 -14
  250. package/dist/tools/media-ask.d.ts.map +0 -1
  251. package/dist/tools/media-ask.js +0 -224
  252. package/dist/tools/media-ask.js.map +0 -1
  253. package/dist/tools/media-speak.d.ts +0 -16
  254. package/dist/tools/media-speak.d.ts.map +0 -1
  255. package/dist/tools/media-speak.js +0 -78
  256. package/dist/tools/media-speak.js.map +0 -1
  257. package/dist/tools/media-upload.d.ts +0 -14
  258. package/dist/tools/media-upload.d.ts.map +0 -1
  259. package/dist/tools/media-upload.js +0 -155
  260. package/dist/tools/media-upload.js.map +0 -1
  261. package/dist/tools/python-exec.d.ts +0 -13
  262. package/dist/tools/python-exec.d.ts.map +0 -1
  263. package/dist/tools/python-exec.js +0 -99
  264. package/dist/tools/python-exec.js.map +0 -1
  265. package/dist/tools/python-restart.d.ts +0 -11
  266. package/dist/tools/python-restart.d.ts.map +0 -1
  267. package/dist/tools/python-restart.js +0 -33
  268. package/dist/tools/python-restart.js.map +0 -1
  269. package/dist/utils/circuit-breaker.d.ts +0 -23
  270. package/dist/utils/circuit-breaker.d.ts.map +0 -1
  271. package/dist/utils/circuit-breaker.js +0 -75
  272. package/dist/utils/circuit-breaker.js.map +0 -1
  273. package/dist/utils/config-loader.d.ts +0 -20
  274. package/dist/utils/config-loader.d.ts.map +0 -1
  275. package/dist/utils/config-loader.js +0 -194
  276. package/dist/utils/config-loader.js.map +0 -1
  277. package/dist/utils/fallback.d.ts +0 -7
  278. package/dist/utils/fallback.d.ts.map +0 -1
  279. package/dist/utils/fallback.js +0 -20
  280. package/dist/utils/fallback.js.map +0 -1
  281. package/dist/utils/git.d.ts +0 -24
  282. package/dist/utils/git.d.ts.map +0 -1
  283. package/dist/utils/git.js +0 -71
  284. package/dist/utils/git.js.map +0 -1
  285. package/dist/utils/github.d.ts +0 -37
  286. package/dist/utils/github.d.ts.map +0 -1
  287. package/dist/utils/github.js +0 -53
  288. package/dist/utils/github.js.map +0 -1
  289. package/dist/utils/global-path.d.ts +0 -2
  290. package/dist/utils/global-path.d.ts.map +0 -1
  291. package/dist/utils/global-path.js +0 -32
  292. package/dist/utils/global-path.js.map +0 -1
  293. package/dist/utils/logger.d.ts +0 -6
  294. package/dist/utils/logger.d.ts.map +0 -1
  295. package/dist/utils/logger.js +0 -69
  296. package/dist/utils/logger.js.map +0 -1
  297. package/dist/utils/obs-capture.d.ts +0 -7
  298. package/dist/utils/obs-capture.d.ts.map +0 -1
  299. package/dist/utils/obs-capture.js +0 -49
  300. package/dist/utils/obs-capture.js.map +0 -1
  301. package/dist/utils/retry.d.ts +0 -11
  302. package/dist/utils/retry.d.ts.map +0 -1
  303. package/dist/utils/retry.js +0 -45
  304. package/dist/utils/retry.js.map +0 -1
  305. package/dist/utils/self-wiring.d.ts +0 -13
  306. package/dist/utils/self-wiring.d.ts.map +0 -1
  307. package/dist/utils/self-wiring.js +0 -86
  308. package/dist/utils/self-wiring.js.map +0 -1
  309. package/dist/utils/state.d.ts +0 -106
  310. package/dist/utils/state.d.ts.map +0 -1
  311. package/dist/utils/state.js +0 -166
  312. package/dist/utils/state.js.map +0 -1
  313. package/dist/utils/status.d.ts +0 -47
  314. package/dist/utils/status.d.ts.map +0 -1
  315. package/dist/utils/status.js +0 -147
  316. package/dist/utils/status.js.map +0 -1
  317. package/dist/utils/ttl-map.d.ts +0 -17
  318. package/dist/utils/ttl-map.d.ts.map +0 -1
  319. package/dist/utils/ttl-map.js +0 -67
  320. package/dist/utils/ttl-map.js.map +0 -1
@@ -1,224 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"media-ask.js","sourceRoot":"","sources":["../../src/tools/media-ask.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,78 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"media-speak.js","sourceRoot":"","sources":["../../src/tools/media-speak.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,155 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"media-upload.js","sourceRoot":"","sources":["../../src/tools/media-upload.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,99 +0,0 @@
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