@jack200714/mafw 4.5.1 → 4.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/README.md +5 -2
  2. package/bin/mafw.js +16 -14
  3. package/package.json +1 -7
  4. package/.opencode/mafw/.backup-v61/parametric/base-skill-manifest.yaml +0 -2
  5. package/.opencode/mafw/STATUS.md +0 -6
  6. package/.opencode/mafw/ledger.md +0 -20
  7. package/.opencode/mafw/memory/.harmonic_index.json +0 -28
  8. package/.opencode/mafw/memory/.review_queue.json +0 -1
  9. package/.opencode/mafw/memory/tier3/parametric.json +0 -13
  10. package/.opencode/mafw/memory/tier3/test-goal.json +0 -19
  11. package/.opencode/mafw/memory-index.json +0 -6
  12. package/.opencode/mafw/parametric/base-skill-manifest.yaml +0 -2
  13. package/.opencode/mafw/waves.json +0 -4
  14. package/.opencode/opencode.json +0 -3
  15. package/.opencode/plugins/mafw-plugin.ts +0 -8
  16. package/.opencode/skills/banner-design/SKILL.md +0 -196
  17. package/.opencode/skills/banner-design/references/banner-sizes-and-styles.md +0 -118
  18. package/.opencode/skills/brand/SKILL.md +0 -97
  19. package/.opencode/skills/brand/references/approval-checklist.md +0 -169
  20. package/.opencode/skills/brand/references/asset-organization.md +0 -157
  21. package/.opencode/skills/brand/references/brand-guideline-template.md +0 -140
  22. package/.opencode/skills/brand/references/color-palette-management.md +0 -186
  23. package/.opencode/skills/brand/references/consistency-checklist.md +0 -94
  24. package/.opencode/skills/brand/references/logo-usage-rules.md +0 -185
  25. package/.opencode/skills/brand/references/messaging-framework.md +0 -85
  26. package/.opencode/skills/brand/references/typography-specifications.md +0 -214
  27. package/.opencode/skills/brand/references/update.md +0 -118
  28. package/.opencode/skills/brand/references/visual-identity.md +0 -96
  29. package/.opencode/skills/brand/references/voice-framework.md +0 -88
  30. package/.opencode/skills/brand/scripts/extract-colors.cjs +0 -341
  31. package/.opencode/skills/brand/scripts/inject-brand-context.cjs +0 -349
  32. package/.opencode/skills/brand/scripts/sync-brand-to-tokens.cjs +0 -248
  33. package/.opencode/skills/brand/scripts/tests/test_sync_brand_to_tokens.py +0 -52
  34. package/.opencode/skills/brand/scripts/validate-asset.cjs +0 -387
  35. package/.opencode/skills/brand/templates/brand-guidelines-starter.md +0 -275
  36. package/.opencode/skills/design/SKILL.md +0 -313
  37. package/.opencode/skills/design/data/cip/deliverables.csv +0 -51
  38. package/.opencode/skills/design/data/cip/industries.csv +0 -21
  39. package/.opencode/skills/design/data/cip/mockup-contexts.csv +0 -21
  40. package/.opencode/skills/design/data/cip/styles.csv +0 -21
  41. package/.opencode/skills/design/data/icon/styles.csv +0 -16
  42. package/.opencode/skills/design/data/logo/colors.csv +0 -56
  43. package/.opencode/skills/design/data/logo/industries.csv +0 -56
  44. package/.opencode/skills/design/data/logo/styles.csv +0 -56
  45. package/.opencode/skills/design/references/banner-sizes-and-styles.md +0 -118
  46. package/.opencode/skills/design/references/cip-deliverable-guide.md +0 -95
  47. package/.opencode/skills/design/references/cip-design.md +0 -121
  48. package/.opencode/skills/design/references/cip-prompt-engineering.md +0 -84
  49. package/.opencode/skills/design/references/cip-style-guide.md +0 -68
  50. package/.opencode/skills/design/references/design-routing.md +0 -207
  51. package/.opencode/skills/design/references/icon-design.md +0 -122
  52. package/.opencode/skills/design/references/logo-color-psychology.md +0 -101
  53. package/.opencode/skills/design/references/logo-design.md +0 -92
  54. package/.opencode/skills/design/references/logo-prompt-engineering.md +0 -158
  55. package/.opencode/skills/design/references/logo-style-guide.md +0 -109
  56. package/.opencode/skills/design/references/slides-copywriting-formulas.md +0 -84
  57. package/.opencode/skills/design/references/slides-create.md +0 -4
  58. package/.opencode/skills/design/references/slides-html-template.md +0 -295
  59. package/.opencode/skills/design/references/slides-layout-patterns.md +0 -137
  60. package/.opencode/skills/design/references/slides-strategies.md +0 -94
  61. package/.opencode/skills/design/references/slides.md +0 -42
  62. package/.opencode/skills/design/references/social-photos-design.md +0 -329
  63. package/.opencode/skills/design/scripts/cip/core.py +0 -215
  64. package/.opencode/skills/design/scripts/cip/generate.py +0 -484
  65. package/.opencode/skills/design/scripts/cip/render-html.py +0 -424
  66. package/.opencode/skills/design/scripts/cip/search.py +0 -127
  67. package/.opencode/skills/design/scripts/icon/generate.py +0 -487
  68. package/.opencode/skills/design/scripts/logo/core.py +0 -175
  69. package/.opencode/skills/design/scripts/logo/generate.py +0 -362
  70. package/.opencode/skills/design/scripts/logo/search.py +0 -114
  71. package/.opencode/skills/design-system/SKILL.md +0 -244
  72. package/.opencode/skills/design-system/data/slide-backgrounds.csv +0 -11
  73. package/.opencode/skills/design-system/data/slide-charts.csv +0 -26
  74. package/.opencode/skills/design-system/data/slide-color-logic.csv +0 -14
  75. package/.opencode/skills/design-system/data/slide-copy.csv +0 -26
  76. package/.opencode/skills/design-system/data/slide-layout-logic.csv +0 -16
  77. package/.opencode/skills/design-system/data/slide-layouts.csv +0 -26
  78. package/.opencode/skills/design-system/data/slide-strategies.csv +0 -16
  79. package/.opencode/skills/design-system/data/slide-typography.csv +0 -15
  80. package/.opencode/skills/design-system/references/component-specs.md +0 -236
  81. package/.opencode/skills/design-system/references/component-tokens.md +0 -214
  82. package/.opencode/skills/design-system/references/primitive-tokens.md +0 -203
  83. package/.opencode/skills/design-system/references/semantic-tokens.md +0 -215
  84. package/.opencode/skills/design-system/references/states-and-variants.md +0 -241
  85. package/.opencode/skills/design-system/references/tailwind-integration.md +0 -251
  86. package/.opencode/skills/design-system/references/token-architecture.md +0 -224
  87. package/.opencode/skills/design-system/scripts/embed-tokens.cjs +0 -99
  88. package/.opencode/skills/design-system/scripts/fetch-background.py +0 -317
  89. package/.opencode/skills/design-system/scripts/generate-slide.py +0 -770
  90. package/.opencode/skills/design-system/scripts/generate-tokens.cjs +0 -205
  91. package/.opencode/skills/design-system/scripts/html-token-validator.py +0 -327
  92. package/.opencode/skills/design-system/scripts/search-slides.py +0 -218
  93. package/.opencode/skills/design-system/scripts/slide-token-validator.py +0 -35
  94. package/.opencode/skills/design-system/scripts/slide_search_core.py +0 -453
  95. package/.opencode/skills/design-system/scripts/tests/test_validate_tokens.py +0 -48
  96. package/.opencode/skills/design-system/scripts/validate-tokens.cjs +0 -246
  97. package/.opencode/skills/design-system/templates/design-tokens-starter.json +0 -143
  98. package/.opencode/skills/frontend-design/LICENSE.txt +0 -21
  99. package/.opencode/skills/frontend-design/SKILL.md +0 -115
  100. package/.opencode/skills/mafw-automation-interview/SKILL.md +0 -43
  101. package/.opencode/skills/mafw-cli-scanner/SKILL.md +0 -37
  102. package/.opencode/skills/mafw-compression-verifier/SKILL.md +0 -52
  103. package/.opencode/skills/mafw-desktop-inspector/SKILL.md +0 -170
  104. package/.opencode/skills/mafw-execute/SKILL.md +0 -62
  105. package/.opencode/skills/mafw-gateway-restart/SKILL.md +0 -87
  106. package/.opencode/skills/mafw-github-scanner/SKILL.md +0 -38
  107. package/.opencode/skills/mafw-goal/SKILL.md +0 -76
  108. package/.opencode/skills/mafw-interview/SKILL.md +0 -68
  109. package/.opencode/skills/mafw-memory-extractor/SKILL.md +0 -65
  110. package/.opencode/skills/mafw-plan/SKILL.md +0 -58
  111. package/.opencode/skills/mafw-review/SKILL.md +0 -85
  112. package/.opencode/skills/runtime-plugin-authoring/SKILL.md +0 -791
  113. package/.opencode/skills/slides/SKILL.md +0 -40
  114. package/.opencode/skills/slides/references/copywriting-formulas.md +0 -84
  115. package/.opencode/skills/slides/references/create.md +0 -4
  116. package/.opencode/skills/slides/references/html-template.md +0 -295
  117. package/.opencode/skills/slides/references/layout-patterns.md +0 -137
  118. package/.opencode/skills/slides/references/slide-strategies.md +0 -94
  119. package/.opencode/skills/ui-styling/LICENSE.txt +0 -202
  120. package/.opencode/skills/ui-styling/SKILL.md +0 -324
  121. package/.opencode/skills/ui-styling/references/canvas-design-system.md +0 -320
  122. package/.opencode/skills/ui-styling/references/shadcn-accessibility.md +0 -471
  123. package/.opencode/skills/ui-styling/references/shadcn-components.md +0 -424
  124. package/.opencode/skills/ui-styling/references/shadcn-theming.md +0 -373
  125. package/.opencode/skills/ui-styling/references/tailwind-customization.md +0 -483
  126. package/.opencode/skills/ui-styling/references/tailwind-responsive.md +0 -382
  127. package/.opencode/skills/ui-styling/references/tailwind-utilities.md +0 -455
  128. package/.opencode/skills/ui-styling/scripts/requirements.txt +0 -17
  129. package/.opencode/skills/ui-styling/scripts/shadcn_add.py +0 -308
  130. package/.opencode/skills/ui-styling/scripts/tailwind_config_gen.py +0 -473
  131. package/.opencode/skills/ui-styling/scripts/tests/coverage-ui.json +0 -1
  132. package/.opencode/skills/ui-styling/scripts/tests/requirements.txt +0 -3
  133. package/.opencode/skills/ui-styling/scripts/tests/test_shadcn_add.py +0 -266
  134. package/.opencode/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +0 -394
  135. package/.opencode/skills/ui-ux-pro-max/SKILL.md +0 -388
  136. package/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +0 -31
  137. package/.opencode/skills/ui-ux-pro-max/data/charts.csv +0 -26
  138. package/.opencode/skills/ui-ux-pro-max/data/colors.csv +0 -193
  139. package/.opencode/skills/ui-ux-pro-max/data/google-fonts.csv +0 -1924
  140. package/.opencode/skills/ui-ux-pro-max/data/icons.csv +0 -106
  141. package/.opencode/skills/ui-ux-pro-max/data/landing.csv +0 -35
  142. package/.opencode/skills/ui-ux-pro-max/data/motion.csv +0 -17
  143. package/.opencode/skills/ui-ux-pro-max/data/products.csv +0 -193
  144. package/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +0 -45
  145. package/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +0 -51
  146. package/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +0 -54
  147. package/.opencode/skills/ui-ux-pro-max/data/stacks/avalonia.csv +0 -57
  148. package/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  149. package/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  150. package/.opencode/skills/ui-ux-pro-max/data/stacks/javafx.csv +0 -76
  151. package/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  152. package/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +0 -51
  153. package/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  154. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -71
  155. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  156. package/.opencode/skills/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  157. package/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +0 -54
  158. package/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  159. package/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  160. package/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  161. package/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +0 -54
  162. package/.opencode/skills/ui-ux-pro-max/data/stacks/uno.csv +0 -60
  163. package/.opencode/skills/ui-ux-pro-max/data/stacks/uwp.csv +0 -56
  164. package/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  165. package/.opencode/skills/ui-ux-pro-max/data/stacks/winui.csv +0 -60
  166. package/.opencode/skills/ui-ux-pro-max/data/stacks/wpf.csv +0 -57
  167. package/.opencode/skills/ui-ux-pro-max/data/styles.csv +0 -85
  168. package/.opencode/skills/ui-ux-pro-max/data/typography.csv +0 -75
  169. package/.opencode/skills/ui-ux-pro-max/data/ui-reasoning.csv +0 -162
  170. package/.opencode/skills/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  171. package/.opencode/skills/ui-ux-pro-max/scripts/core.py +0 -464
  172. package/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +0 -1479
  173. package/.opencode/skills/ui-ux-pro-max/scripts/search.py +0 -162
  174. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_core.py +0 -134
  175. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_design_system_mode.py +0 -159
  176. package/.opencode/skills/ui-ux-pro-max/scripts/validate_data.py +0 -114
  177. package/dist/hooks/bash-python-guide.d.ts +0 -4
  178. package/dist/hooks/bash-python-guide.d.ts.map +0 -1
  179. package/dist/hooks/bash-python-guide.js +0 -67
  180. package/dist/hooks/bash-python-guide.js.map +0 -1
  181. package/dist/hooks/handoff.d.ts +0 -9
  182. package/dist/hooks/handoff.d.ts.map +0 -1
  183. package/dist/hooks/handoff.js +0 -8
  184. package/dist/hooks/handoff.js.map +0 -1
  185. package/dist/hooks/hook-manager.d.ts +0 -32
  186. package/dist/hooks/hook-manager.d.ts.map +0 -1
  187. package/dist/hooks/hook-manager.js +0 -91
  188. package/dist/hooks/hook-manager.js.map +0 -1
  189. package/dist/hooks/llm-after.d.ts +0 -8
  190. package/dist/hooks/llm-after.d.ts.map +0 -1
  191. package/dist/hooks/llm-after.js +0 -8
  192. package/dist/hooks/llm-after.js.map +0 -1
  193. package/dist/hooks/media-ingest.d.ts +0 -43
  194. package/dist/hooks/media-ingest.d.ts.map +0 -1
  195. package/dist/hooks/media-ingest.js +0 -269
  196. package/dist/hooks/media-ingest.js.map +0 -1
  197. package/dist/hooks/memory-guide.d.ts +0 -3
  198. package/dist/hooks/memory-guide.d.ts.map +0 -1
  199. package/dist/hooks/memory-guide.js +0 -47
  200. package/dist/hooks/memory-guide.js.map +0 -1
  201. package/dist/hooks/observation-capture.d.ts +0 -17
  202. package/dist/hooks/observation-capture.d.ts.map +0 -1
  203. package/dist/hooks/observation-capture.js +0 -20
  204. package/dist/hooks/observation-capture.js.map +0 -1
  205. package/dist/hooks/session-compacting.d.ts +0 -6
  206. package/dist/hooks/session-compacting.d.ts.map +0 -1
  207. package/dist/hooks/session-compacting.js +0 -6
  208. package/dist/hooks/session-compacting.js.map +0 -1
  209. package/dist/hooks/session-ending.d.ts +0 -20
  210. package/dist/hooks/session-ending.d.ts.map +0 -1
  211. package/dist/hooks/session-ending.js +0 -113
  212. package/dist/hooks/session-ending.js.map +0 -1
  213. package/dist/hooks/session-recall.d.ts +0 -2
  214. package/dist/hooks/session-recall.d.ts.map +0 -1
  215. package/dist/hooks/session-recall.js +0 -103
  216. package/dist/hooks/session-recall.js.map +0 -1
  217. package/dist/hooks/session-start.d.ts +0 -9
  218. package/dist/hooks/session-start.d.ts.map +0 -1
  219. package/dist/hooks/session-start.js +0 -42
  220. package/dist/hooks/session-start.js.map +0 -1
  221. package/dist/hooks/tool-before.d.ts +0 -10
  222. package/dist/hooks/tool-before.d.ts.map +0 -1
  223. package/dist/hooks/tool-before.js +0 -6
  224. package/dist/hooks/tool-before.js.map +0 -1
  225. package/dist/hooks/tool-executed.d.ts +0 -19
  226. package/dist/hooks/tool-executed.d.ts.map +0 -1
  227. package/dist/hooks/tool-executed.js +0 -12
  228. package/dist/hooks/tool-executed.js.map +0 -1
  229. package/dist/hooks/user-profile.d.ts +0 -2
  230. package/dist/hooks/user-profile.d.ts.map +0 -1
  231. package/dist/hooks/user-profile.js +0 -30
  232. package/dist/hooks/user-profile.js.map +0 -1
  233. package/dist/hooks/user-prompt.d.ts +0 -9
  234. package/dist/hooks/user-prompt.d.ts.map +0 -1
  235. package/dist/hooks/user-prompt.js +0 -8
  236. package/dist/hooks/user-prompt.js.map +0 -1
  237. package/dist/hooks/voice-guide.d.ts +0 -8
  238. package/dist/hooks/voice-guide.d.ts.map +0 -1
  239. package/dist/hooks/voice-guide.js +0 -101
  240. package/dist/hooks/voice-guide.js.map +0 -1
  241. package/dist/plugin.d.ts +0 -55
  242. package/dist/plugin.d.ts.map +0 -1
  243. package/dist/plugin.js +0 -342
  244. package/dist/plugin.js.map +0 -1
  245. package/dist/tools/add-memory.d.ts +0 -17
  246. package/dist/tools/add-memory.d.ts.map +0 -1
  247. package/dist/tools/add-memory.js +0 -60
  248. package/dist/tools/add-memory.js.map +0 -1
  249. package/dist/tools/media-ask.d.ts +0 -14
  250. package/dist/tools/media-ask.d.ts.map +0 -1
  251. package/dist/tools/media-ask.js +0 -224
  252. package/dist/tools/media-ask.js.map +0 -1
  253. package/dist/tools/media-speak.d.ts +0 -16
  254. package/dist/tools/media-speak.d.ts.map +0 -1
  255. package/dist/tools/media-speak.js +0 -78
  256. package/dist/tools/media-speak.js.map +0 -1
  257. package/dist/tools/media-upload.d.ts +0 -14
  258. package/dist/tools/media-upload.d.ts.map +0 -1
  259. package/dist/tools/media-upload.js +0 -155
  260. package/dist/tools/media-upload.js.map +0 -1
  261. package/dist/tools/python-exec.d.ts +0 -13
  262. package/dist/tools/python-exec.d.ts.map +0 -1
  263. package/dist/tools/python-exec.js +0 -99
  264. package/dist/tools/python-exec.js.map +0 -1
  265. package/dist/tools/python-restart.d.ts +0 -11
  266. package/dist/tools/python-restart.d.ts.map +0 -1
  267. package/dist/tools/python-restart.js +0 -33
  268. package/dist/tools/python-restart.js.map +0 -1
  269. package/dist/utils/circuit-breaker.d.ts +0 -23
  270. package/dist/utils/circuit-breaker.d.ts.map +0 -1
  271. package/dist/utils/circuit-breaker.js +0 -75
  272. package/dist/utils/circuit-breaker.js.map +0 -1
  273. package/dist/utils/config-loader.d.ts +0 -20
  274. package/dist/utils/config-loader.d.ts.map +0 -1
  275. package/dist/utils/config-loader.js +0 -194
  276. package/dist/utils/config-loader.js.map +0 -1
  277. package/dist/utils/fallback.d.ts +0 -7
  278. package/dist/utils/fallback.d.ts.map +0 -1
  279. package/dist/utils/fallback.js +0 -20
  280. package/dist/utils/fallback.js.map +0 -1
  281. package/dist/utils/git.d.ts +0 -24
  282. package/dist/utils/git.d.ts.map +0 -1
  283. package/dist/utils/git.js +0 -71
  284. package/dist/utils/git.js.map +0 -1
  285. package/dist/utils/github.d.ts +0 -37
  286. package/dist/utils/github.d.ts.map +0 -1
  287. package/dist/utils/github.js +0 -53
  288. package/dist/utils/github.js.map +0 -1
  289. package/dist/utils/global-path.d.ts +0 -2
  290. package/dist/utils/global-path.d.ts.map +0 -1
  291. package/dist/utils/global-path.js +0 -32
  292. package/dist/utils/global-path.js.map +0 -1
  293. package/dist/utils/logger.d.ts +0 -6
  294. package/dist/utils/logger.d.ts.map +0 -1
  295. package/dist/utils/logger.js +0 -69
  296. package/dist/utils/logger.js.map +0 -1
  297. package/dist/utils/obs-capture.d.ts +0 -7
  298. package/dist/utils/obs-capture.d.ts.map +0 -1
  299. package/dist/utils/obs-capture.js +0 -49
  300. package/dist/utils/obs-capture.js.map +0 -1
  301. package/dist/utils/retry.d.ts +0 -11
  302. package/dist/utils/retry.d.ts.map +0 -1
  303. package/dist/utils/retry.js +0 -45
  304. package/dist/utils/retry.js.map +0 -1
  305. package/dist/utils/self-wiring.d.ts +0 -13
  306. package/dist/utils/self-wiring.d.ts.map +0 -1
  307. package/dist/utils/self-wiring.js +0 -86
  308. package/dist/utils/self-wiring.js.map +0 -1
  309. package/dist/utils/state.d.ts +0 -106
  310. package/dist/utils/state.d.ts.map +0 -1
  311. package/dist/utils/state.js +0 -166
  312. package/dist/utils/state.js.map +0 -1
  313. package/dist/utils/status.d.ts +0 -47
  314. package/dist/utils/status.d.ts.map +0 -1
  315. package/dist/utils/status.js +0 -147
  316. package/dist/utils/status.js.map +0 -1
  317. package/dist/utils/ttl-map.d.ts +0 -17
  318. package/dist/utils/ttl-map.d.ts.map +0 -1
  319. package/dist/utils/ttl-map.js +0 -67
  320. package/dist/utils/ttl-map.js.map +0 -1
@@ -1,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":";;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,4CAEC;AAGD,8CAEC;AAGD,gDAGC;AAGD,kDAEC;AAaD,kCAKC;AAID,kDAQC;AAGD,kDAEC;AAUD,kCAMC;AAyCD,0CAEC;AAGD,4CAEC;AAED,0CAsCC;AAmBD,kEAoCC;AAjPD,uCAAyB;AACzB,mCAAoC;AACpC,uCAAyC;AAEzC;;;;;;;;;;;;;;;;;GAiBG;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,cAAc,GAAG,OAAO,CAAC;AAC/B,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC,SAAgB,gBAAgB,CAAC,MAAc,EAAE,SAAiB,EAAE,SAAiB;IACnF,OAAO,GAAG,cAAc,YAAY,MAAM,eAAe,SAAS,QAAQ,SAAS,qEAAqE,MAAM,IAAI,CAAC;AACrK,CAAC;AAED,0CAA0C;AAC1C,SAAgB,iBAAiB,CAAC,MAAc,EAAE,SAAiB,EAAE,SAAiB;IACpF,OAAO,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;AAED,qCAAqC;AACrC,SAAgB,kBAAkB,CAAC,IAAS;IAC1C,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAC7F,CAAC;AAED,iDAAiD;AACjD,SAAgB,mBAAmB,CAAC,IAAS;IAC3C,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAaD,SAAgB,WAAW,CAAC,IAAS;IACnC,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,IAAI,IAAI,EAAE,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,IAAI,GAAG,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;IACjD,OAAO,OAAO,IAAI,KAAK,QAAQ;QAC7B,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED;uEACuE;AAChE,KAAK,UAAU,mBAAmB,CAAC,MAAc,EAAE,SAAiB;IACzE,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAa,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,QAAQ,SAAS,IAAI,WAAW,WAAW,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,wBAAwB;AACxB,SAAgB,mBAAmB,CAAC,MAAc,EAAE,SAAiB;IACnE,OAAO,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,SAAiB;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtE,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,IAAI,WAAW,CAAC;IACxF,OAAO,QAAQ,IAAI,WAAW,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,SAAgB,WAAW,CAAC,KAAY;IACtC,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;SAC9G,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,IAAY;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,0BAA0B,CAAC;IACrF,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IAC3E,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,KAAK;QACd,EAAE,EAAE,CAAC;QACL,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE;YACN,OAAO,EAAE;gBACP,SAAS,EAAE,UAAU,IAAA,mBAAU,GAAE,EAAE;gBACnC,IAAI,EAAE,CAAC,EAAE,YAAY;gBACrB,KAAK,EAAE;oBACL,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE;oBACjD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBAClC;aACF;SACF;KACF,CAAC;IACF,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,IAAI,CAAC;QAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;KACrC,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;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC;IAClC,IAAI,CAAC,IAAI,EAAE,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IAChD,IAAI,IAAI,EAAE,MAAM,EAAE,KAAK,KAAK,mBAAmB,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AACpD,CAAC;AAED,mEAAmE;AAC5D,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,IAAY;IACjE,OAAO,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,wBAAwB;AACxB,SAAgB,gBAAgB,CAAC,OAAe,EAAE,IAAY;IAC5D,OAAO,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,KAAU,EAAE,MAAW;IAC3D,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACzF,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAErE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,KAAK,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;QAClE,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,KAAK,GAAU,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEjC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC7D,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,IAAI,IAAI,WAAW,CAAC;YAC/D,MAAM,MAAM,GAAW,OAAO,IAAI,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,SAAS,GAAW,IAAI,EAAE,QAAQ,IAAI,MAAM,CAAC;YAEnD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC7D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC7C,mCAAmC;gBACnC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACrE,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;YAC5F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,KAAK,CAAC,CAAC,CAAC,GAAG;oBACT,GAAG,IAAI;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,sBAAuB,GAAa,CAAC,OAAO,GAAG;oBACrD,GAAG,EAAE,SAAS;oBACd,SAAS,EAAE,SAAS;iBACrB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wBAAwB;AACX,QAAA,gBAAgB,GAAG,eAAe,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,2BAA2B,CAAC,MAAW;IAC3D,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACzF,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO;IAC3B,IAAI,CAAC;QACH,MAAM,KAAK,GAAU,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO;QAEzE,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;YAC5C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC3D,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;YACtD,MAAM,MAAM,GAAW,OAAO,IAAI,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,SAAS,GAAW,IAAI,EAAE,QAAQ,IAAI,MAAM,CAAC;YACnD,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/C,mDAAmD;YACnD,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;gBAAE,OAAO;YACxD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC7D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC7C,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACrE,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;YAC5F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,OAAO;oBAAE,OAAO,CAAC,+CAA+C;gBACpE,KAAK,CAAC,CAAC,CAAC,GAAG;oBACT,GAAG,IAAI;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,sBAAsB,MAAM,CAAE,GAAa,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;oBACnF,GAAG,EAAE,SAAS;oBACd,SAAS,EAAE,SAAS;iBACrB,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;AACH,CAAC"}
@@ -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"}