@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,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handoffHook = handoffHook;
4
- async function handoffHook(ctx) {
5
- if (ctx.context) {
6
- }
7
- }
8
- //# sourceMappingURL=handoff.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/hooks/handoff.ts"],"names":[],"mappings":";;AAQA,kCAIC;AAJM,KAAK,UAAU,WAAW,CAAC,GAAmB;IAEnD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -1,32 +0,0 @@
1
- export interface HookContext {
2
- event: string;
3
- data: any;
4
- config: {
5
- hookFailBehavior: 'continue' | 'stop';
6
- timeout: number;
7
- };
8
- [key: string]: any;
9
- }
10
- export interface HookRegistration {
11
- name: string;
12
- event: string;
13
- handler: (context: HookContext) => Promise<void>;
14
- priority: number;
15
- timeout?: number;
16
- }
17
- export declare class HookManager {
18
- private hooks;
19
- private config;
20
- constructor(config?: {
21
- failBehavior?: string;
22
- timeout?: number;
23
- });
24
- register(hook: HookRegistration): void;
25
- registerMany(hooks: HookRegistration[]): void;
26
- unregister(name: string): boolean;
27
- execute(event: string, context: Partial<HookContext>): Promise<void>;
28
- getHooks(event?: string): HookRegistration[];
29
- clear(): void;
30
- size(): number;
31
- }
32
- //# sourceMappingURL=hook-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-manager.d.ts","sourceRoot":"","sources":["../../src/hooks/hook-manager.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,EAAE;QAAE,gBAAgB,EAAE,UAAU,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,MAAM,CAAyD;gBAE3D,MAAM,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAQhE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAStC,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAM7C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAc3B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAW5C,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,MAAM;CAOf"}
@@ -1,91 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HookManager = void 0;
4
- class HookManager {
5
- hooks;
6
- config;
7
- constructor(config) {
8
- this.hooks = new Map();
9
- this.config = {
10
- failBehavior: config?.failBehavior || 'continue',
11
- timeout: config?.timeout ?? 30000
12
- };
13
- }
14
- register(hook) {
15
- const event = hook.event;
16
- if (!this.hooks.has(event)) {
17
- this.hooks.set(event, []);
18
- }
19
- this.hooks.get(event).push(hook);
20
- this.hooks.get(event).sort((a, b) => a.priority - b.priority);
21
- }
22
- registerMany(hooks) {
23
- for (const hook of hooks) {
24
- this.register(hook);
25
- }
26
- }
27
- unregister(name) {
28
- for (const [event, registrations] of this.hooks) {
29
- const index = registrations.findIndex(h => h.name === name);
30
- if (index !== -1) {
31
- registrations.splice(index, 1);
32
- if (registrations.length === 0) {
33
- this.hooks.delete(event);
34
- }
35
- return true;
36
- }
37
- }
38
- return false;
39
- }
40
- async execute(event, context) {
41
- const registrations = this.hooks.get(event);
42
- if (!registrations || registrations.length === 0) {
43
- return;
44
- }
45
- const fullContext = {
46
- event,
47
- data: context.data,
48
- config: this.config,
49
- ...context
50
- };
51
- for (const hook of registrations) {
52
- const timeout = hook.timeout ?? this.config.timeout;
53
- try {
54
- await Promise.race([
55
- hook.handler(fullContext),
56
- new Promise((_, reject) => setTimeout(() => reject(new Error(`Hook "${hook.name}" timed out after ${timeout}ms`)), timeout))
57
- ]);
58
- }
59
- catch (err) {
60
- if (this.config.failBehavior === 'continue') {
61
- console.error(`[HookManager] Hook "${hook.name}" failed: ${err.message}`);
62
- }
63
- else {
64
- throw err;
65
- }
66
- }
67
- }
68
- }
69
- getHooks(event) {
70
- if (event) {
71
- return [...(this.hooks.get(event) || [])];
72
- }
73
- const result = [];
74
- for (const registrations of this.hooks.values()) {
75
- result.push(...registrations);
76
- }
77
- return result;
78
- }
79
- clear() {
80
- this.hooks.clear();
81
- }
82
- size() {
83
- let count = 0;
84
- for (const registrations of this.hooks.values()) {
85
- count += registrations.length;
86
- }
87
- return count;
88
- }
89
- }
90
- exports.HookManager = HookManager;
91
- //# sourceMappingURL=hook-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-manager.js","sourceRoot":"","sources":["../../src/hooks/hook-manager.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- export interface LlmAfterContext {
2
- sessionID: string;
3
- messageID?: string;
4
- partID?: string;
5
- text?: string;
6
- }
7
- export declare function llmAfterHook(ctx: LlmAfterContext): Promise<void>;
8
- //# sourceMappingURL=llm-after.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm-after.d.ts","sourceRoot":"","sources":["../../src/hooks/llm-after.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE"}
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.llmAfterHook = llmAfterHook;
4
- async function llmAfterHook(ctx) {
5
- if (!ctx.text)
6
- return;
7
- }
8
- //# sourceMappingURL=llm-after.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm-after.js","sourceRoot":"","sources":["../../src/hooks/llm-after.ts"],"names":[],"mappings":";;AAOA,oCAEC;AAFM,KAAK,UAAU,YAAY,CAAC,GAAoB;IACrD,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,OAAO;AACxB,CAAC"}
@@ -1,43 +0,0 @@
1
- export declare function makeMediaPointer(taskId: string, contextId: string, mediaName: string): string;
2
- /** 兼容旧版指针(mafw_vision 时代),保证旧会话遗留指针幂等。 */
3
- export declare function makeVisionPointer(taskId: string, contextId: string, mediaName: string): string;
4
- /** 判断一个 part 是否已是媒体指针(幂等,兼容新旧前缀)。 */
5
- export declare function isMediaPointerPart(part: any): boolean;
6
- /** @deprecated 兼容旧名(isMediaPointerPart 即新实现)。 */
7
- export declare function isVisionPointerPart(part: any): boolean;
8
- export declare function isMediaPart(part: any): boolean;
9
- /** 读取媒体为 data URL:data: 直通;file:// 经 fileURLToPath(Windows
10
- * file:///C:/... 三斜杠 + percent-encoding + 盘符);裸路径直读;http(s) fetch。 */
11
- export declare function mediaDataFromSource(source: string, mediaType: string): Promise<string>;
12
- /** @deprecated 兼容旧名。 */
13
- export declare function imageDataFromSource(source: string, mediaType: string): Promise<string>;
14
- export declare function messageText(parts: any[]): string;
15
- /** 共享:由 data URL + 提示文本创建 A2A 媒体任务(ingest 与 mafw_media_ask 共用)。 */
16
- export declare function createMediaTask(dataUrl: string, hint: string): Promise<{
17
- id: string;
18
- contextId: string;
19
- }>;
20
- /** @deprecated 兼容旧名。 */
21
- export declare function createVisionTask(dataUrl: string, hint: string): Promise<{
22
- id: string;
23
- contextId: string;
24
- }>;
25
- export declare function mediaIngestHook(input: any, output: any): Promise<any>;
26
- /** @deprecated 兼容旧名。 */
27
- export declare const visionIngestHook: typeof mediaIngestHook;
28
- /**
29
- * 写库前媒体转引用(chat.message hook 用):把图片/视频/音频 file part 提前建
30
- * A2A 任务并替换为文本指针,避免大 base64 写进会话消息导致 SQLite 写库失败,
31
- * 也避免 transform 每步循环重复建任务(图片每步重复分析的根因)。
32
- *
33
- * - 图片/视频/音频统一处理(图片不再走 opencode normalize——主模型是纯文本,
34
- * 图片从不直接发给主模型,只经 mafw_media_ask 分析)
35
- * - 幂等:已是指针的 part 跳过
36
- * - 图片特殊回退:base64 超 MediaAgent 上限(20MB raw ≈ 15MB base64)或建任务
37
- * 失败时保留 file part——opencode image.normalize 会缩小写库,transform 兜底
38
- * 下步重试;视频/音频失败 → 错误文本 part(无 normalize 兜底)
39
- * - fail-open:绝不抛异常(否则整个用户消息发送失败)
40
- * - 无媒体时快路径直接返回(无 await,不阻塞)
41
- */
42
- export declare function ingestLargeMediaBeforeStore(output: any): Promise<void>;
43
- //# sourceMappingURL=media-ingest.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"media-ingest.d.ts","sourceRoot":"","sources":["../../src/hooks/media-ingest.ts"],"names":[],"mappings":"AA6BA,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7F;AAED,0CAA0C;AAC1C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9F;AAED,qCAAqC;AACrC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAGrD;AAED,iDAAiD;AACjD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAEtD;AAaD,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAK9C;AAED;uEACuE;AACvE,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ5F;AAED,wBAAwB;AACxB,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtF;AAUD,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,CAMhD;AAwCD,mEAAmE;AACnE,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAE/G;AAED,wBAAwB;AACxB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAE1G;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAsC3E;AAED,wBAAwB;AACxB,eAAO,MAAM,gBAAgB,wBAAkB,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC5E"}
@@ -1,269 +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.visionIngestHook = void 0;
27
- exports.makeMediaPointer = makeMediaPointer;
28
- exports.makeVisionPointer = makeVisionPointer;
29
- exports.isMediaPointerPart = isMediaPointerPart;
30
- exports.isVisionPointerPart = isVisionPointerPart;
31
- exports.isMediaPart = isMediaPart;
32
- exports.mediaDataFromSource = mediaDataFromSource;
33
- exports.imageDataFromSource = imageDataFromSource;
34
- exports.messageText = messageText;
35
- exports.createMediaTask = createMediaTask;
36
- exports.createVisionTask = createVisionTask;
37
- exports.mediaIngestHook = mediaIngestHook;
38
- exports.ingestLargeMediaBeforeStore = ingestLargeMediaBeforeStore;
39
- const fs = __importStar(require("fs"));
40
- const crypto_1 = require("crypto");
41
- const node_url_1 = require("node:url");
42
- /**
43
- * media-ingest — 标准 opencode 下的图片/视频/音频入口(仅建任务 + 指针,
44
- * 无描述、无转发)。
45
- *
46
- * 桌面端(MafwShell)发媒体时只发文本指针,不产生 media part;而标准
47
- * opencode TUI/CLI 粘贴图片/视频/音频会以 file part 进入消息流。本 hook 在
48
- * experimental.chat.messages.transform 中检测这些 media part:
49
- *
50
- * ① 提取媒体数据(data URL 直接用 / 本地路径读文件 → base64)
51
- * ② 调 gateway /a2a SendMessage 建任务(用户消息文本作 focus hint)
52
- * ③ 把该 part 替换为文本指针(taskID/contextID/媒体名)
53
- *
54
- * 之后由推理 Agent(LLM)自主决定调用 mafw_media_ask 追问 —— 本 hook 不产生
55
- * 描述、不转发用户消息。失败时替换为显式提示(含原因),不阻塞 LLM。
56
- *
57
- * 幂等:已是 [媒体附件 或旧 [视觉附件 开头的指针 part 不再处理。
58
- * MEDIA_INGEST=off(兼容 VISION_INGEST=off)可关。
59
- */
60
- const GATEWAY_PORT = process.env.MAFW_SERVER_API_PORT || process.env.MAFW_GATEWAY_PORT || '3000';
61
- const A2A_URL = `http://127.0.0.1:${GATEWAY_PORT}/a2a`;
62
- const POINTER_PREFIX = '[媒体附件';
63
- const LEGACY_POINTER_PREFIX = '[视觉附件';
64
- function makeMediaPointer(taskId, contextId, mediaName) {
65
- return `${POINTER_PREFIX} taskID: ${taskId} contextID: ${contextId}(媒体: ${mediaName}),这是用户发给你的媒体消息(图片/视频/音频)——调用 mafw_media_ask 工具获取其内容后直接回应(taskID 填 ${taskId})]`;
66
- }
67
- /** 兼容旧版指针(mafw_vision 时代),保证旧会话遗留指针幂等。 */
68
- function makeVisionPointer(taskId, contextId, mediaName) {
69
- return makeMediaPointer(taskId, contextId, mediaName);
70
- }
71
- /** 判断一个 part 是否已是媒体指针(幂等,兼容新旧前缀)。 */
72
- function isMediaPointerPart(part) {
73
- if (typeof part?.text !== 'string')
74
- return false;
75
- return part.text.startsWith(POINTER_PREFIX) || part.text.startsWith(LEGACY_POINTER_PREFIX);
76
- }
77
- /** @deprecated 兼容旧名(isMediaPointerPart 即新实现)。 */
78
- function isVisionPointerPart(part) {
79
- return isMediaPointerPart(part);
80
- }
81
- function isMediaPart(part) {
82
- if (part?.type !== 'file' && part?.type !== 'image')
83
- return false;
84
- const mime = part?.mediaType || part?.mime || '';
85
- return typeof mime === 'string' &&
86
- (mime.startsWith('image/') || mime.startsWith('video/') || mime.startsWith('audio/'));
87
- }
88
- /** 读取媒体为 data URL:data: 直通;file:// 经 fileURLToPath(Windows
89
- * file:///C:/... 三斜杠 + percent-encoding + 盘符);裸路径直读;http(s) fetch。 */
90
- async function mediaDataFromSource(source, mediaType) {
91
- if (source.startsWith('data:'))
92
- return source;
93
- if (/^https?:\/\//i.test(source)) {
94
- return fetchRemoteMedia(source, mediaType);
95
- }
96
- const path = source.startsWith('file://') ? (0, node_url_1.fileURLToPath)(source) : source;
97
- const bytes = fs.readFileSync(path);
98
- return `data:${mediaType || 'image/png'};base64,${bytes.toString('base64')}`;
99
- }
100
- /** @deprecated 兼容旧名。 */
101
- function imageDataFromSource(source, mediaType) {
102
- return mediaDataFromSource(source, mediaType);
103
- }
104
- async function fetchRemoteMedia(url, mediaType) {
105
- const res = await fetch(url, { signal: AbortSignal.timeout(30_000) });
106
- if (!res.ok)
107
- throw new Error(`远程媒体下载失败:HTTP ${res.status}`);
108
- const buf = Buffer.from(await res.arrayBuffer());
109
- const mime = res.headers.get('content-type')?.split(';')[0] || mediaType || 'image/png';
110
- return `data:${mime};base64,${buf.toString('base64')}`;
111
- }
112
- function messageText(parts) {
113
- return parts
114
- .filter((p) => p?.type === 'text' && typeof p.text === 'string' && !p.synthetic && !isMediaPointerPart(p))
115
- .map((p) => p.text.trim())
116
- .filter(Boolean)
117
- .join('\n');
118
- }
119
- async function createTask(dataUrl, hint) {
120
- const b64 = dataUrl.split(',')[1] || '';
121
- const mediaType = dataUrl.match(/^data:([^;]+);/)?.[1] || 'application/octet-stream';
122
- const ext = mediaType.split('/')[1]?.split(';')[0]?.split('+')[0] || 'bin';
123
- const body = {
124
- jsonrpc: '2.0',
125
- id: 1,
126
- method: 'SendMessage',
127
- params: {
128
- message: {
129
- messageId: `ingest-${(0, crypto_1.randomUUID)()}`,
130
- role: 1, // ROLE_USER
131
- parts: [
132
- { raw: b64, mediaType, filename: `paste.${ext}` },
133
- ...(hint ? [{ text: hint }] : []),
134
- ],
135
- },
136
- },
137
- };
138
- const res = await fetch(A2A_URL, {
139
- method: 'POST',
140
- headers: { 'Content-Type': 'application/json', 'A2A-Version': '1.0' },
141
- body: JSON.stringify(body),
142
- signal: AbortSignal.timeout(120_000),
143
- });
144
- if (!res.ok)
145
- throw new Error(`gateway HTTP ${res.status}`);
146
- const parsed = await res.json();
147
- if (parsed?.error)
148
- throw new Error(parsed.error?.message || JSON.stringify(parsed.error));
149
- const task = parsed?.result?.task;
150
- if (!task?.id)
151
- throw new Error('gateway 未返回任务');
152
- if (task?.status?.state === 'TASK_STATE_FAILED') {
153
- const parts = task?.status?.message?.parts ?? [];
154
- const reason = parts.map((p) => p?.text || '').join('').trim() || '未知错误';
155
- throw new Error(reason);
156
- }
157
- return { id: task.id, contextId: task.contextId };
158
- }
159
- /** 共享:由 data URL + 提示文本创建 A2A 媒体任务(ingest 与 mafw_media_ask 共用)。 */
160
- async function createMediaTask(dataUrl, hint) {
161
- return createTask(dataUrl, hint);
162
- }
163
- /** @deprecated 兼容旧名。 */
164
- function createVisionTask(dataUrl, hint) {
165
- return createMediaTask(dataUrl, hint);
166
- }
167
- async function mediaIngestHook(input, output) {
168
- const flag = (process.env.MEDIA_INGEST || process.env.VISION_INGEST || '').toLowerCase();
169
- if (flag === 'off')
170
- return output;
171
- const messages = output?.messages;
172
- if (!Array.isArray(messages) || messages.length === 0)
173
- return output;
174
- for (const msg of messages) {
175
- const isUser = msg?.role === 'user' || msg?.info?.role === 'user';
176
- if (!isUser)
177
- continue;
178
- const parts = Array.isArray(msg?.parts) ? msg.parts : [];
179
- if (parts.length === 0)
180
- continue;
181
- const hint = messageText(parts);
182
- for (let i = 0; i < parts.length; i++) {
183
- const part = parts[i];
184
- if (!isMediaPart(part) || isMediaPointerPart(part))
185
- continue;
186
- const mediaType = part?.mediaType || part?.mime || 'image/png';
187
- const source = typeof part?.url === 'string' ? part.url : '';
188
- const mediaName = part?.filename || '媒体文件';
189
- try {
190
- const dataUrl = await mediaDataFromSource(source, mediaType);
191
- const task = await createTask(dataUrl, hint);
192
- // 原地替换为文本指针(保留原 part id 以便服务端回显合并)
193
- const pointer = makeMediaPointer(task.id, task.contextId, mediaName);
194
- parts[i] = { ...part, type: 'text', text: pointer, url: undefined, mediaType: undefined };
195
- }
196
- catch (err) {
197
- parts[i] = {
198
- ...part,
199
- type: 'text',
200
- text: `[媒体未送达 Media Agent:${err.message}]`,
201
- url: undefined,
202
- mediaType: undefined,
203
- };
204
- }
205
- }
206
- }
207
- return output;
208
- }
209
- /** @deprecated 兼容旧名。 */
210
- exports.visionIngestHook = mediaIngestHook;
211
- /**
212
- * 写库前媒体转引用(chat.message hook 用):把图片/视频/音频 file part 提前建
213
- * A2A 任务并替换为文本指针,避免大 base64 写进会话消息导致 SQLite 写库失败,
214
- * 也避免 transform 每步循环重复建任务(图片每步重复分析的根因)。
215
- *
216
- * - 图片/视频/音频统一处理(图片不再走 opencode normalize——主模型是纯文本,
217
- * 图片从不直接发给主模型,只经 mafw_media_ask 分析)
218
- * - 幂等:已是指针的 part 跳过
219
- * - 图片特殊回退:base64 超 MediaAgent 上限(20MB raw ≈ 15MB base64)或建任务
220
- * 失败时保留 file part——opencode image.normalize 会缩小写库,transform 兜底
221
- * 下步重试;视频/音频失败 → 错误文本 part(无 normalize 兜底)
222
- * - fail-open:绝不抛异常(否则整个用户消息发送失败)
223
- * - 无媒体时快路径直接返回(无 await,不阻塞)
224
- */
225
- async function ingestLargeMediaBeforeStore(output) {
226
- const flag = (process.env.MEDIA_INGEST || process.env.VISION_INGEST || '').toLowerCase();
227
- if (flag === 'off')
228
- return;
229
- try {
230
- const parts = Array.isArray(output?.parts) ? output.parts : [];
231
- if (parts.length === 0)
232
- return;
233
- if (!parts.some((p) => isMediaPart(p) && !isMediaPointerPart(p)))
234
- return;
235
- const hint = messageText(parts);
236
- await Promise.all(parts.map(async (part, i) => {
237
- if (!isMediaPart(part) || isMediaPointerPart(part))
238
- return;
239
- const mediaType = part?.mediaType || part?.mime || '';
240
- const source = typeof part?.url === 'string' ? part.url : '';
241
- const mediaName = part?.filename || '媒体文件';
242
- const isImage = mediaType.startsWith('image/');
243
- // 图片超限:保留 file part(normalize 缩小 → transform 兜底重试)
244
- if (isImage && source.length > 15 * 1024 * 1024)
245
- return;
246
- try {
247
- const dataUrl = await mediaDataFromSource(source, mediaType);
248
- const task = await createTask(dataUrl, hint);
249
- const pointer = makeMediaPointer(task.id, task.contextId, mediaName);
250
- parts[i] = { ...part, type: 'text', text: pointer, url: undefined, mediaType: undefined };
251
- }
252
- catch (err) {
253
- if (isImage)
254
- return; // 图片失败保留 file part,normalize + transform 兜底可重试
255
- parts[i] = {
256
- ...part,
257
- type: 'text',
258
- text: `[媒体未送达 Media Agent:${String(err?.message ?? err).slice(0, 200)}]`,
259
- url: undefined,
260
- mediaType: undefined,
261
- };
262
- }
263
- }));
264
- }
265
- catch {
266
- // 全量兜底:绝不让 hook 异常导致用户消息发送失败。
267
- }
268
- }
269
- //# sourceMappingURL=media-ingest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"media-ingest.js","sourceRoot":"","sources":["../../src/hooks/media-ingest.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export declare function buildMemoryGuide(): string;
2
- export declare function memoryGuideHook(input: any, output: any): any;
3
- //# sourceMappingURL=memory-guide.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-guide.d.ts","sourceRoot":"","sources":["../../src/hooks/memory-guide.ts"],"names":[],"mappings":"AAoCA,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAI5D"}
@@ -1,47 +0,0 @@
1
- "use strict";
2
- // OptMem-style memory guide: injected into the system prompt (every turn) so
3
- // the agent actively operates the harmonic memory system instead of relying on
4
- // passive recall injection alone. Modeled on OptMem's `## Memory` block
5
- // (https://github.com/VictorTaelin/OptMem): mandatory write-on-learning,
6
- // search-when-unsure, and subagents never touch memory tools.
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.buildMemoryGuide = buildMemoryGuide;
9
- exports.memoryGuideHook = memoryGuideHook;
10
- const GUIDE_HEADER = `<memory-guide>`;
11
- const GUIDE_FOOTER = `</memory-guide>`;
12
- const GUIDE_BODY = `## 记忆
13
-
14
- 你的长期记忆由 MAFW 谐波记忆系统管理,跨会话、压缩与模型更替存续。
15
- 不主动记录,你将无法记得过去的决定、偏好与教训。
16
-
17
- ### 工作中:主动写入(必做)
18
- - 学到新知识、用户明确陈述的偏好与约束、完成的重要工作、踩过的坑
19
- → 调用 mafw_add_memory(按内容选择 semantic / episodic / procedural,附 cueAnchors 关键词,每条一句话)
20
- - 不写冗余记忆
21
-
22
- ### 需要旧记忆:主动检索与取回
23
- - 新任务开始、或不确定此事是否已知 → 调用 mafw_search_hybrid 检索
24
- - <recall> 指针(#mem-xxxxxx)要依据其内容行动前 → 调用 mafw_get_memory(id 用 #mem- 后 6 位) 取全文
25
-
26
- ### 披露层(pinned)
27
- - 用户身份/画像、长期偏好与约束 → mafw_add_memory 时 pinned: true(每轮保证注入);任务相关、易变内容不要 pin
28
- - 偏好/事实变了 → 新写一条并带 supersedes: 旧id(旧版自动失效,历史保留)
29
- - 需要 pin/unpin 已有记忆 → mafw_pin_memory
30
-
31
- ### 便签板(sticky)
32
- - 用户说"记下来 / 记住 / 别忘了" → mafw_add_memory 时带 sticky: true(默认 7 天,stickyDays 可调)
33
- → 便签板上每轮必见,到期自动下架(记忆本体保留可检索)
34
- - 事已办完 → mafw_pin_memory { id, sticky: false } 下架;需要延期 → sticky: true + stickyDays 续期
35
-
36
- ### 子代理
37
- 子代理不得调用 mafw_add_memory / mafw_search_hybrid(防止重复写入),由父会话统一管理`;
38
- function buildMemoryGuide() {
39
- return `${GUIDE_HEADER}\n${GUIDE_BODY}\n${GUIDE_FOOTER}`;
40
- }
41
- function memoryGuideHook(input, output) {
42
- if (!output.system)
43
- output.system = [];
44
- output.system.push(buildMemoryGuide());
45
- return output;
46
- }
47
- //# sourceMappingURL=memory-guide.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-guide.js","sourceRoot":"","sources":["../../src/hooks/memory-guide.ts"],"names":[],"mappings":";AAAA,6EAA6E;AAC7E,+EAA+E;AAC/E,wEAAwE;AACxE,yEAAyE;AACzE,8DAA8D;;AAgC9D,4CAEC;AAED,0CAIC;AAtCD,MAAM,YAAY,GAAG,gBAAgB,CAAA;AACrC,MAAM,YAAY,GAAG,iBAAiB,CAAA;AAEtC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;8DAyB2C,CAAA;AAE9D,SAAgB,gBAAgB;IAC9B,OAAO,GAAG,YAAY,KAAK,UAAU,KAAK,YAAY,EAAE,CAAA;AAC1D,CAAC;AAED,SAAgB,eAAe,CAAC,KAAU,EAAE,MAAW;IACrD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,EAAE,CAAA;IACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACtC,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -1,17 +0,0 @@
1
- export interface Observation {
2
- type: 'observation';
3
- tool: string;
4
- args: string;
5
- output: string;
6
- timestamp: string;
7
- summary: string;
8
- }
9
- export interface CaptureResult {
10
- observation?: Observation;
11
- }
12
- export declare function captureObservation(ctx: {
13
- toolName: string;
14
- output: string;
15
- args?: string;
16
- }): Promise<CaptureResult>;
17
- //# sourceMappingURL=observation-capture.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observation-capture.d.ts","sourceRoot":"","sources":["../../src/hooks/observation-capture.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,aAAa,CAAC,CAiBzB"}
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.captureObservation = captureObservation;
4
- async function captureObservation(ctx) {
5
- const outputLength = ctx.output?.length || 0;
6
- const summary = outputLength > 200
7
- ? ctx.output.substring(0, 100) + '...' + ctx.output.substring(outputLength - 100)
8
- : ctx.output;
9
- return {
10
- observation: {
11
- type: 'observation',
12
- tool: ctx.toolName,
13
- args: ctx.args || '',
14
- output: ctx.output || '',
15
- timestamp: new Date().toISOString(),
16
- summary
17
- }
18
- };
19
- }
20
- //# sourceMappingURL=observation-capture.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observation-capture.js","sourceRoot":"","sources":["../../src/hooks/observation-capture.ts"],"names":[],"mappings":";;AAaA,gDAqBC;AArBM,KAAK,UAAU,kBAAkB,CAAC,GAIxC;IACC,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,YAAY,GAAG,GAAG;QAChC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,GAAG,GAAG,CAAC;QACjF,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IAGf,OAAO;QACL,WAAW,EAAE;YACX,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO;SACR;KACF,CAAC;AACJ,CAAC"}
@@ -1,6 +0,0 @@
1
- export interface SessionCompactingContext {
2
- sessionID: string;
3
- projectDir?: string;
4
- }
5
- export declare function sessionCompactingHook(ctx: SessionCompactingContext): Promise<void>;
6
- //# sourceMappingURL=session-compacting.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-compacting.d.ts","sourceRoot":"","sources":["../../src/hooks/session-compacting.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CACxF"}
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sessionCompactingHook = sessionCompactingHook;
4
- async function sessionCompactingHook(ctx) {
5
- }
6
- //# sourceMappingURL=session-compacting.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-compacting.js","sourceRoot":"","sources":["../../src/hooks/session-compacting.ts"],"names":[],"mappings":";;AAKA,sDACC;AADM,KAAK,UAAU,qBAAqB,CAAC,GAA6B;AACzE,CAAC"}