@jack200714/mafw 4.5.1 → 4.8.0

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 (330) hide show
  1. package/README.md +5 -2
  2. package/bin/mafw.js +16 -14
  3. package/gateway/dist/index.js +52 -38
  4. package/gateway/dist/media/media-plugin-loader.js +0 -12
  5. package/gateway/dist/plugins/hub.js +153 -19
  6. package/gateway/dist/routes/plugins.js +15 -5
  7. package/gateway/dist/runtime/event-broadcast.js +33 -0
  8. package/gateway/dist/runtime/loader.js +23 -13
  9. package/gateway/dist/usage/builtin-plugins/gateway.js +25 -3
  10. package/gateway/dist/usage/plugin-loader.js +0 -11
  11. package/gateway/package.json +2 -2
  12. package/package.json +1 -7
  13. package/packages/tui/dist/cli.js +8 -3
  14. package/.opencode/mafw/.backup-v61/parametric/base-skill-manifest.yaml +0 -2
  15. package/.opencode/mafw/STATUS.md +0 -6
  16. package/.opencode/mafw/ledger.md +0 -20
  17. package/.opencode/mafw/memory/.harmonic_index.json +0 -28
  18. package/.opencode/mafw/memory/.review_queue.json +0 -1
  19. package/.opencode/mafw/memory/tier3/parametric.json +0 -13
  20. package/.opencode/mafw/memory/tier3/test-goal.json +0 -19
  21. package/.opencode/mafw/memory-index.json +0 -6
  22. package/.opencode/mafw/parametric/base-skill-manifest.yaml +0 -2
  23. package/.opencode/mafw/waves.json +0 -4
  24. package/.opencode/opencode.json +0 -3
  25. package/.opencode/plugins/mafw-plugin.ts +0 -8
  26. package/.opencode/skills/banner-design/SKILL.md +0 -196
  27. package/.opencode/skills/banner-design/references/banner-sizes-and-styles.md +0 -118
  28. package/.opencode/skills/brand/SKILL.md +0 -97
  29. package/.opencode/skills/brand/references/approval-checklist.md +0 -169
  30. package/.opencode/skills/brand/references/asset-organization.md +0 -157
  31. package/.opencode/skills/brand/references/brand-guideline-template.md +0 -140
  32. package/.opencode/skills/brand/references/color-palette-management.md +0 -186
  33. package/.opencode/skills/brand/references/consistency-checklist.md +0 -94
  34. package/.opencode/skills/brand/references/logo-usage-rules.md +0 -185
  35. package/.opencode/skills/brand/references/messaging-framework.md +0 -85
  36. package/.opencode/skills/brand/references/typography-specifications.md +0 -214
  37. package/.opencode/skills/brand/references/update.md +0 -118
  38. package/.opencode/skills/brand/references/visual-identity.md +0 -96
  39. package/.opencode/skills/brand/references/voice-framework.md +0 -88
  40. package/.opencode/skills/brand/scripts/extract-colors.cjs +0 -341
  41. package/.opencode/skills/brand/scripts/inject-brand-context.cjs +0 -349
  42. package/.opencode/skills/brand/scripts/sync-brand-to-tokens.cjs +0 -248
  43. package/.opencode/skills/brand/scripts/tests/test_sync_brand_to_tokens.py +0 -52
  44. package/.opencode/skills/brand/scripts/validate-asset.cjs +0 -387
  45. package/.opencode/skills/brand/templates/brand-guidelines-starter.md +0 -275
  46. package/.opencode/skills/design/SKILL.md +0 -313
  47. package/.opencode/skills/design/data/cip/deliverables.csv +0 -51
  48. package/.opencode/skills/design/data/cip/industries.csv +0 -21
  49. package/.opencode/skills/design/data/cip/mockup-contexts.csv +0 -21
  50. package/.opencode/skills/design/data/cip/styles.csv +0 -21
  51. package/.opencode/skills/design/data/icon/styles.csv +0 -16
  52. package/.opencode/skills/design/data/logo/colors.csv +0 -56
  53. package/.opencode/skills/design/data/logo/industries.csv +0 -56
  54. package/.opencode/skills/design/data/logo/styles.csv +0 -56
  55. package/.opencode/skills/design/references/banner-sizes-and-styles.md +0 -118
  56. package/.opencode/skills/design/references/cip-deliverable-guide.md +0 -95
  57. package/.opencode/skills/design/references/cip-design.md +0 -121
  58. package/.opencode/skills/design/references/cip-prompt-engineering.md +0 -84
  59. package/.opencode/skills/design/references/cip-style-guide.md +0 -68
  60. package/.opencode/skills/design/references/design-routing.md +0 -207
  61. package/.opencode/skills/design/references/icon-design.md +0 -122
  62. package/.opencode/skills/design/references/logo-color-psychology.md +0 -101
  63. package/.opencode/skills/design/references/logo-design.md +0 -92
  64. package/.opencode/skills/design/references/logo-prompt-engineering.md +0 -158
  65. package/.opencode/skills/design/references/logo-style-guide.md +0 -109
  66. package/.opencode/skills/design/references/slides-copywriting-formulas.md +0 -84
  67. package/.opencode/skills/design/references/slides-create.md +0 -4
  68. package/.opencode/skills/design/references/slides-html-template.md +0 -295
  69. package/.opencode/skills/design/references/slides-layout-patterns.md +0 -137
  70. package/.opencode/skills/design/references/slides-strategies.md +0 -94
  71. package/.opencode/skills/design/references/slides.md +0 -42
  72. package/.opencode/skills/design/references/social-photos-design.md +0 -329
  73. package/.opencode/skills/design/scripts/cip/core.py +0 -215
  74. package/.opencode/skills/design/scripts/cip/generate.py +0 -484
  75. package/.opencode/skills/design/scripts/cip/render-html.py +0 -424
  76. package/.opencode/skills/design/scripts/cip/search.py +0 -127
  77. package/.opencode/skills/design/scripts/icon/generate.py +0 -487
  78. package/.opencode/skills/design/scripts/logo/core.py +0 -175
  79. package/.opencode/skills/design/scripts/logo/generate.py +0 -362
  80. package/.opencode/skills/design/scripts/logo/search.py +0 -114
  81. package/.opencode/skills/design-system/SKILL.md +0 -244
  82. package/.opencode/skills/design-system/data/slide-backgrounds.csv +0 -11
  83. package/.opencode/skills/design-system/data/slide-charts.csv +0 -26
  84. package/.opencode/skills/design-system/data/slide-color-logic.csv +0 -14
  85. package/.opencode/skills/design-system/data/slide-copy.csv +0 -26
  86. package/.opencode/skills/design-system/data/slide-layout-logic.csv +0 -16
  87. package/.opencode/skills/design-system/data/slide-layouts.csv +0 -26
  88. package/.opencode/skills/design-system/data/slide-strategies.csv +0 -16
  89. package/.opencode/skills/design-system/data/slide-typography.csv +0 -15
  90. package/.opencode/skills/design-system/references/component-specs.md +0 -236
  91. package/.opencode/skills/design-system/references/component-tokens.md +0 -214
  92. package/.opencode/skills/design-system/references/primitive-tokens.md +0 -203
  93. package/.opencode/skills/design-system/references/semantic-tokens.md +0 -215
  94. package/.opencode/skills/design-system/references/states-and-variants.md +0 -241
  95. package/.opencode/skills/design-system/references/tailwind-integration.md +0 -251
  96. package/.opencode/skills/design-system/references/token-architecture.md +0 -224
  97. package/.opencode/skills/design-system/scripts/embed-tokens.cjs +0 -99
  98. package/.opencode/skills/design-system/scripts/fetch-background.py +0 -317
  99. package/.opencode/skills/design-system/scripts/generate-slide.py +0 -770
  100. package/.opencode/skills/design-system/scripts/generate-tokens.cjs +0 -205
  101. package/.opencode/skills/design-system/scripts/html-token-validator.py +0 -327
  102. package/.opencode/skills/design-system/scripts/search-slides.py +0 -218
  103. package/.opencode/skills/design-system/scripts/slide-token-validator.py +0 -35
  104. package/.opencode/skills/design-system/scripts/slide_search_core.py +0 -453
  105. package/.opencode/skills/design-system/scripts/tests/test_validate_tokens.py +0 -48
  106. package/.opencode/skills/design-system/scripts/validate-tokens.cjs +0 -246
  107. package/.opencode/skills/design-system/templates/design-tokens-starter.json +0 -143
  108. package/.opencode/skills/frontend-design/LICENSE.txt +0 -21
  109. package/.opencode/skills/frontend-design/SKILL.md +0 -115
  110. package/.opencode/skills/mafw-automation-interview/SKILL.md +0 -43
  111. package/.opencode/skills/mafw-cli-scanner/SKILL.md +0 -37
  112. package/.opencode/skills/mafw-compression-verifier/SKILL.md +0 -52
  113. package/.opencode/skills/mafw-desktop-inspector/SKILL.md +0 -170
  114. package/.opencode/skills/mafw-execute/SKILL.md +0 -62
  115. package/.opencode/skills/mafw-gateway-restart/SKILL.md +0 -87
  116. package/.opencode/skills/mafw-github-scanner/SKILL.md +0 -38
  117. package/.opencode/skills/mafw-goal/SKILL.md +0 -76
  118. package/.opencode/skills/mafw-interview/SKILL.md +0 -68
  119. package/.opencode/skills/mafw-memory-extractor/SKILL.md +0 -65
  120. package/.opencode/skills/mafw-plan/SKILL.md +0 -58
  121. package/.opencode/skills/mafw-review/SKILL.md +0 -85
  122. package/.opencode/skills/runtime-plugin-authoring/SKILL.md +0 -791
  123. package/.opencode/skills/slides/SKILL.md +0 -40
  124. package/.opencode/skills/slides/references/copywriting-formulas.md +0 -84
  125. package/.opencode/skills/slides/references/create.md +0 -4
  126. package/.opencode/skills/slides/references/html-template.md +0 -295
  127. package/.opencode/skills/slides/references/layout-patterns.md +0 -137
  128. package/.opencode/skills/slides/references/slide-strategies.md +0 -94
  129. package/.opencode/skills/ui-styling/LICENSE.txt +0 -202
  130. package/.opencode/skills/ui-styling/SKILL.md +0 -324
  131. package/.opencode/skills/ui-styling/references/canvas-design-system.md +0 -320
  132. package/.opencode/skills/ui-styling/references/shadcn-accessibility.md +0 -471
  133. package/.opencode/skills/ui-styling/references/shadcn-components.md +0 -424
  134. package/.opencode/skills/ui-styling/references/shadcn-theming.md +0 -373
  135. package/.opencode/skills/ui-styling/references/tailwind-customization.md +0 -483
  136. package/.opencode/skills/ui-styling/references/tailwind-responsive.md +0 -382
  137. package/.opencode/skills/ui-styling/references/tailwind-utilities.md +0 -455
  138. package/.opencode/skills/ui-styling/scripts/requirements.txt +0 -17
  139. package/.opencode/skills/ui-styling/scripts/shadcn_add.py +0 -308
  140. package/.opencode/skills/ui-styling/scripts/tailwind_config_gen.py +0 -473
  141. package/.opencode/skills/ui-styling/scripts/tests/coverage-ui.json +0 -1
  142. package/.opencode/skills/ui-styling/scripts/tests/requirements.txt +0 -3
  143. package/.opencode/skills/ui-styling/scripts/tests/test_shadcn_add.py +0 -266
  144. package/.opencode/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +0 -394
  145. package/.opencode/skills/ui-ux-pro-max/SKILL.md +0 -388
  146. package/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +0 -31
  147. package/.opencode/skills/ui-ux-pro-max/data/charts.csv +0 -26
  148. package/.opencode/skills/ui-ux-pro-max/data/colors.csv +0 -193
  149. package/.opencode/skills/ui-ux-pro-max/data/google-fonts.csv +0 -1924
  150. package/.opencode/skills/ui-ux-pro-max/data/icons.csv +0 -106
  151. package/.opencode/skills/ui-ux-pro-max/data/landing.csv +0 -35
  152. package/.opencode/skills/ui-ux-pro-max/data/motion.csv +0 -17
  153. package/.opencode/skills/ui-ux-pro-max/data/products.csv +0 -193
  154. package/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +0 -45
  155. package/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +0 -51
  156. package/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +0 -54
  157. package/.opencode/skills/ui-ux-pro-max/data/stacks/avalonia.csv +0 -57
  158. package/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  159. package/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  160. package/.opencode/skills/ui-ux-pro-max/data/stacks/javafx.csv +0 -76
  161. package/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  162. package/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +0 -51
  163. package/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  164. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -71
  165. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  166. package/.opencode/skills/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  167. package/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +0 -54
  168. package/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  169. package/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  170. package/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  171. package/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +0 -54
  172. package/.opencode/skills/ui-ux-pro-max/data/stacks/uno.csv +0 -60
  173. package/.opencode/skills/ui-ux-pro-max/data/stacks/uwp.csv +0 -56
  174. package/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  175. package/.opencode/skills/ui-ux-pro-max/data/stacks/winui.csv +0 -60
  176. package/.opencode/skills/ui-ux-pro-max/data/stacks/wpf.csv +0 -57
  177. package/.opencode/skills/ui-ux-pro-max/data/styles.csv +0 -85
  178. package/.opencode/skills/ui-ux-pro-max/data/typography.csv +0 -75
  179. package/.opencode/skills/ui-ux-pro-max/data/ui-reasoning.csv +0 -162
  180. package/.opencode/skills/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  181. package/.opencode/skills/ui-ux-pro-max/scripts/core.py +0 -464
  182. package/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +0 -1479
  183. package/.opencode/skills/ui-ux-pro-max/scripts/search.py +0 -162
  184. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_core.py +0 -134
  185. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_design_system_mode.py +0 -159
  186. package/.opencode/skills/ui-ux-pro-max/scripts/validate_data.py +0 -114
  187. package/dist/hooks/bash-python-guide.d.ts +0 -4
  188. package/dist/hooks/bash-python-guide.d.ts.map +0 -1
  189. package/dist/hooks/bash-python-guide.js +0 -67
  190. package/dist/hooks/bash-python-guide.js.map +0 -1
  191. package/dist/hooks/handoff.d.ts +0 -9
  192. package/dist/hooks/handoff.d.ts.map +0 -1
  193. package/dist/hooks/handoff.js +0 -8
  194. package/dist/hooks/handoff.js.map +0 -1
  195. package/dist/hooks/hook-manager.d.ts +0 -32
  196. package/dist/hooks/hook-manager.d.ts.map +0 -1
  197. package/dist/hooks/hook-manager.js +0 -91
  198. package/dist/hooks/hook-manager.js.map +0 -1
  199. package/dist/hooks/llm-after.d.ts +0 -8
  200. package/dist/hooks/llm-after.d.ts.map +0 -1
  201. package/dist/hooks/llm-after.js +0 -8
  202. package/dist/hooks/llm-after.js.map +0 -1
  203. package/dist/hooks/media-ingest.d.ts +0 -43
  204. package/dist/hooks/media-ingest.d.ts.map +0 -1
  205. package/dist/hooks/media-ingest.js +0 -269
  206. package/dist/hooks/media-ingest.js.map +0 -1
  207. package/dist/hooks/memory-guide.d.ts +0 -3
  208. package/dist/hooks/memory-guide.d.ts.map +0 -1
  209. package/dist/hooks/memory-guide.js +0 -47
  210. package/dist/hooks/memory-guide.js.map +0 -1
  211. package/dist/hooks/observation-capture.d.ts +0 -17
  212. package/dist/hooks/observation-capture.d.ts.map +0 -1
  213. package/dist/hooks/observation-capture.js +0 -20
  214. package/dist/hooks/observation-capture.js.map +0 -1
  215. package/dist/hooks/session-compacting.d.ts +0 -6
  216. package/dist/hooks/session-compacting.d.ts.map +0 -1
  217. package/dist/hooks/session-compacting.js +0 -6
  218. package/dist/hooks/session-compacting.js.map +0 -1
  219. package/dist/hooks/session-ending.d.ts +0 -20
  220. package/dist/hooks/session-ending.d.ts.map +0 -1
  221. package/dist/hooks/session-ending.js +0 -113
  222. package/dist/hooks/session-ending.js.map +0 -1
  223. package/dist/hooks/session-recall.d.ts +0 -2
  224. package/dist/hooks/session-recall.d.ts.map +0 -1
  225. package/dist/hooks/session-recall.js +0 -103
  226. package/dist/hooks/session-recall.js.map +0 -1
  227. package/dist/hooks/session-start.d.ts +0 -9
  228. package/dist/hooks/session-start.d.ts.map +0 -1
  229. package/dist/hooks/session-start.js +0 -42
  230. package/dist/hooks/session-start.js.map +0 -1
  231. package/dist/hooks/tool-before.d.ts +0 -10
  232. package/dist/hooks/tool-before.d.ts.map +0 -1
  233. package/dist/hooks/tool-before.js +0 -6
  234. package/dist/hooks/tool-before.js.map +0 -1
  235. package/dist/hooks/tool-executed.d.ts +0 -19
  236. package/dist/hooks/tool-executed.d.ts.map +0 -1
  237. package/dist/hooks/tool-executed.js +0 -12
  238. package/dist/hooks/tool-executed.js.map +0 -1
  239. package/dist/hooks/user-profile.d.ts +0 -2
  240. package/dist/hooks/user-profile.d.ts.map +0 -1
  241. package/dist/hooks/user-profile.js +0 -30
  242. package/dist/hooks/user-profile.js.map +0 -1
  243. package/dist/hooks/user-prompt.d.ts +0 -9
  244. package/dist/hooks/user-prompt.d.ts.map +0 -1
  245. package/dist/hooks/user-prompt.js +0 -8
  246. package/dist/hooks/user-prompt.js.map +0 -1
  247. package/dist/hooks/voice-guide.d.ts +0 -8
  248. package/dist/hooks/voice-guide.d.ts.map +0 -1
  249. package/dist/hooks/voice-guide.js +0 -101
  250. package/dist/hooks/voice-guide.js.map +0 -1
  251. package/dist/plugin.d.ts +0 -55
  252. package/dist/plugin.d.ts.map +0 -1
  253. package/dist/plugin.js +0 -342
  254. package/dist/plugin.js.map +0 -1
  255. package/dist/tools/add-memory.d.ts +0 -17
  256. package/dist/tools/add-memory.d.ts.map +0 -1
  257. package/dist/tools/add-memory.js +0 -60
  258. package/dist/tools/add-memory.js.map +0 -1
  259. package/dist/tools/media-ask.d.ts +0 -14
  260. package/dist/tools/media-ask.d.ts.map +0 -1
  261. package/dist/tools/media-ask.js +0 -224
  262. package/dist/tools/media-ask.js.map +0 -1
  263. package/dist/tools/media-speak.d.ts +0 -16
  264. package/dist/tools/media-speak.d.ts.map +0 -1
  265. package/dist/tools/media-speak.js +0 -78
  266. package/dist/tools/media-speak.js.map +0 -1
  267. package/dist/tools/media-upload.d.ts +0 -14
  268. package/dist/tools/media-upload.d.ts.map +0 -1
  269. package/dist/tools/media-upload.js +0 -155
  270. package/dist/tools/media-upload.js.map +0 -1
  271. package/dist/tools/python-exec.d.ts +0 -13
  272. package/dist/tools/python-exec.d.ts.map +0 -1
  273. package/dist/tools/python-exec.js +0 -99
  274. package/dist/tools/python-exec.js.map +0 -1
  275. package/dist/tools/python-restart.d.ts +0 -11
  276. package/dist/tools/python-restart.d.ts.map +0 -1
  277. package/dist/tools/python-restart.js +0 -33
  278. package/dist/tools/python-restart.js.map +0 -1
  279. package/dist/utils/circuit-breaker.d.ts +0 -23
  280. package/dist/utils/circuit-breaker.d.ts.map +0 -1
  281. package/dist/utils/circuit-breaker.js +0 -75
  282. package/dist/utils/circuit-breaker.js.map +0 -1
  283. package/dist/utils/config-loader.d.ts +0 -20
  284. package/dist/utils/config-loader.d.ts.map +0 -1
  285. package/dist/utils/config-loader.js +0 -194
  286. package/dist/utils/config-loader.js.map +0 -1
  287. package/dist/utils/fallback.d.ts +0 -7
  288. package/dist/utils/fallback.d.ts.map +0 -1
  289. package/dist/utils/fallback.js +0 -20
  290. package/dist/utils/fallback.js.map +0 -1
  291. package/dist/utils/git.d.ts +0 -24
  292. package/dist/utils/git.d.ts.map +0 -1
  293. package/dist/utils/git.js +0 -71
  294. package/dist/utils/git.js.map +0 -1
  295. package/dist/utils/github.d.ts +0 -37
  296. package/dist/utils/github.d.ts.map +0 -1
  297. package/dist/utils/github.js +0 -53
  298. package/dist/utils/github.js.map +0 -1
  299. package/dist/utils/global-path.d.ts +0 -2
  300. package/dist/utils/global-path.d.ts.map +0 -1
  301. package/dist/utils/global-path.js +0 -32
  302. package/dist/utils/global-path.js.map +0 -1
  303. package/dist/utils/logger.d.ts +0 -6
  304. package/dist/utils/logger.d.ts.map +0 -1
  305. package/dist/utils/logger.js +0 -69
  306. package/dist/utils/logger.js.map +0 -1
  307. package/dist/utils/obs-capture.d.ts +0 -7
  308. package/dist/utils/obs-capture.d.ts.map +0 -1
  309. package/dist/utils/obs-capture.js +0 -49
  310. package/dist/utils/obs-capture.js.map +0 -1
  311. package/dist/utils/retry.d.ts +0 -11
  312. package/dist/utils/retry.d.ts.map +0 -1
  313. package/dist/utils/retry.js +0 -45
  314. package/dist/utils/retry.js.map +0 -1
  315. package/dist/utils/self-wiring.d.ts +0 -13
  316. package/dist/utils/self-wiring.d.ts.map +0 -1
  317. package/dist/utils/self-wiring.js +0 -86
  318. package/dist/utils/self-wiring.js.map +0 -1
  319. package/dist/utils/state.d.ts +0 -106
  320. package/dist/utils/state.d.ts.map +0 -1
  321. package/dist/utils/state.js +0 -166
  322. package/dist/utils/state.js.map +0 -1
  323. package/dist/utils/status.d.ts +0 -47
  324. package/dist/utils/status.d.ts.map +0 -1
  325. package/dist/utils/status.js +0 -147
  326. package/dist/utils/status.js.map +0 -1
  327. package/dist/utils/ttl-map.d.ts +0 -17
  328. package/dist/utils/ttl-map.d.ts.map +0 -1
  329. package/dist/utils/ttl-map.js +0 -67
  330. 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":";;;AAAA,mCAAoC;AACpC,6BAAwB;AACxB,uCAAyC;AACzC,wDAA6E;AAC7E,iDAAgD;AAEhD;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC;AACjG,MAAM,OAAO,GAAG,oBAAoB,YAAY,MAAM,CAAC;AAEvD,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B,2CAA2C;AAC3C,mDAAmD;AACnD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAChD,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACzC,SAAS,UAAU,CAAC,MAAc;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC;QACrC,IAAI,GAAG,GAAG,EAAE,GAAG,YAAY;YAAE,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AACD,SAAS,QAAQ,CAAC,MAAc;IAC9B,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,YAAY,CAAC;AAC7D,CAAC;AAED,+CAA+C;AAC/C,SAAS,QAAQ,CAAC,IAAS;IACzB,MAAM,OAAO,GAAU,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;IAClE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC;YAAE,SAAS,CAAC,YAAY;QACzC,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;aACnC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAChE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aACvB,IAAI,CAAC,GAAG,CAAC;aACT,IAAI,EAAE,CAAC;QACV,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,2CAA2C;AAC3C,SAAS,kBAAkB,CAAC,IAAY,EAAE,QAAgB;IACxD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,MAAe,EAAE,MAAmB;IAC5E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;QAC/B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,EAAE;QACrE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC/D,MAAM;KACP,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAQ,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,MAAM,EAAE,MAAM,CAAC;AACxB,CAAC;AAED,SAAS,UAAU,CAAC,IAAS;IAC3B,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;IACjD,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC5D,IAAI,CAAC,EAAE,CAAC;SACR,IAAI,EAAE,CAAC;AACZ,CAAC;AAQY,QAAA,YAAY,GAAiB;IACxC,WAAW,EACT,qFAAqF;QACrF,+DAA+D;QAC/D,mFAAmF;QACnF,yDAAyD;QACzD,6CAA6C;QAC7C,2CAA2C;QAC3C,+DAA+D;IACjE,IAAI,EAAE;QACJ,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QAC7F,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACtF,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KAC7C;IACD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,GAAG;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC;YACH,IAAI,YAAY,GAAG,MAAM,CAAC;YAC1B,IAAI,eAAmC,CAAC;YAExC,IAAI,YAAY,EAAE,CAAC;gBACjB,mDAAmD;gBACnD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;gBACvE,eAAe,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,SAAS,CAAC;gBAC3D,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;oBACjG,OAAO;wBACL,KAAK,EAAE,kBAAkB;wBACzB,MAAM,EAAE,MAAM,YAAY,qBAAqB,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBAC5E,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;qBACnC,CAAC;gBACJ,CAAC;gBACD,+CAA+C;gBAC/C,gDAAgD;gBAChD,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;gBAC/D,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;gBAChD,IAAI,KAAK,KAAK,sBAAsB,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC5E,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC5B,IAAI,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;wBACvC,UAAU,CAAC,YAAY,CAAC,CAAC;wBACzB,OAAO;4BACL,KAAK,EAAE,gBAAgB;4BACvB,MAAM,EAAE,QAAQ,GAAG,iCAAiC;4BACpD,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;yBACnC,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,SAAS,EAAE,CAAC;gBACrB,wCAAwC;gBACxC,IAAI,SAA6B,CAAC;gBAClC,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACrD,CAAC;qBAAM,CAAC;oBACN,kEAAkE;oBAClE,qDAAqD;oBACrD,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAa,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBACpF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC5D,SAAS,GAAG,6BAAc,CAAC,GAAG,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO;wBACL,KAAK,EAAE,kBAAkB;wBACzB,MAAM,EAAE,YAAY,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,mBAAmB,EAAE;wBAC/H,QAAQ,EAAE,EAAE,SAAS,EAAE;qBACxB,CAAC;gBACJ,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,IAAA,kCAAmB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAChE,MAAM,OAAO,GAAG,MAAM,IAAA,8BAAe,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACzD,YAAY,GAAG,OAAO,CAAC,EAAE,CAAC;gBAC1B,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;gBACpC,6CAA6C;gBAC7C,yCAAyC;gBACzC,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC9E,MAAM,MAAM,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC;gBAC9E,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,EAAE,IAAI,IAAI,WAAW,CAAC,CAAC;gBAC7D,IAAI,MAAM,KAAK,sBAAsB,IAAI,OAAO,EAAE,CAAC;oBACjD,UAAU,CAAC,YAAY,CAAC,CAAC;oBACzB,OAAO;wBACL,KAAK,EAAE,gBAAgB;wBACvB,MAAM,EAAE,OAAO;wBACf,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE;qBAC5D,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,KAAK,EAAE,kBAAkB;oBACzB,MAAM,EAAE,6CAA6C;oBACrD,QAAQ,EAAE,EAAE;iBACb,CAAC;YACJ,CAAC;YAED,qCAAqC;YACrC,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,aAAa,EACb;gBACE,OAAO,EAAE;oBACP,SAAS,EAAE,OAAO,IAAA,mBAAU,GAAE,EAAE;oBAChC,IAAI,EAAE,CAAC,EAAE,YAAY;oBACrB,SAAS,EAAE,eAAe;oBAC1B,gBAAgB,EAAE,CAAC,YAAY,CAAC;oBAChC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;iBAC5B;aACF,EACD,MAAM,CACP,CAAC;YACF,MAAM,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC;YACvB,MAAM,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC;YAC/B,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAE7B,IAAI,KAAK,KAAK,mBAAmB,EAAE,CAAC;gBAClC,OAAO;oBACL,KAAK,EAAE,kBAAkB;oBACzB,MAAM,EAAE,MAAM,IAAI,yBAAyB;oBAC3C,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;iBACnC,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;oBACL,KAAK,EAAE,iBAAiB;oBACxB,MAAM,EAAE,0BAA0B;oBAClC,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;iBACnC,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,gBAAgB;gBACvB,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC,EAAE,EAAE,kBAAkB;gBAC1D,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE;aACrD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,KAAK,EAAE,iBAAiB;gBACxB,MAAM,EAAE,oBAAqB,GAAa,CAAC,OAAO,SAAS;gBAC3D,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,SAAS,EAAE;aAC7E,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -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