@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,20 +0,0 @@
1
- /**
2
- * session-ending Hook — 异常兜底
3
- *
4
- * 职责:
5
- * 1. Session 正常结束时遍历 state 文件反查 sessionId
6
- * 2. 检查 state 是否已更新(nextAction !== WAIT_PHASE_COMPLETE)
7
- * 3. 如果 Skill Entry 因为异常没来得及更新 state,写入异常状态
8
- * 4. Scheduler 下一轮 poll 会读取新 nextAction,重建 Session
9
- *
10
- * 设计原则:
11
- * - 只兜底,不承载主路径状态更新
12
- * - 遍历所有 state 文件,不假设 sessionId 格式包含 goalId
13
- * - 如果 state 已正常更新,无操作
14
- */
15
- export interface HookContext {
16
- sessionId: string;
17
- projectDir?: string;
18
- }
19
- export declare function sessionEndingHook(hookContext: HookContext): Promise<void>;
20
- //# sourceMappingURL=session-ending.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-ending.d.ts","sourceRoot":"","sources":["../../src/hooks/session-ending.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF/E"}
@@ -1,113 +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.sessionEndingHook = sessionEndingHook;
27
- const fs = __importStar(require("fs"));
28
- const path = __importStar(require("path"));
29
- const state_1 = require("../utils/state");
30
- async function sessionEndingHook(hookContext) {
31
- const sessionId = hookContext.sessionId || hookContext.sessionID || '';
32
- const projectDir = hookContext.projectDir || process.cwd();
33
- const mafwDir = path.join(projectDir, '.mafw');
34
- const stateDir = path.join(mafwDir, 'state');
35
- // Pre-compact protection: detect high-energy memories (goal-independent)
36
- try {
37
- const parametricDir = path.join(projectDir, '.mafw/parametric');
38
- if (fs.existsSync(parametricDir)) {
39
- const files = fs.readdirSync(parametricDir).filter(f => f.endsWith('.json'));
40
- let highEnergyCount = 0;
41
- for (const file of files) {
42
- try {
43
- const data = JSON.parse(fs.readFileSync(path.join(parametricDir, file), 'utf-8'));
44
- if ((data.energy_score || data.energy || 0) > 0.8)
45
- highEnergyCount++;
46
- }
47
- catch { /* skip unparseable files */ }
48
- }
49
- if (highEnergyCount > 0) {
50
- console.log(`[mafw:pre-compact] Preserving ${highEnergyCount} high-energy memories`);
51
- }
52
- }
53
- }
54
- catch { /* ignore parametric errors */ }
55
- // 1. 遍历所有 state 文件,找到包含该 sessionId 的 goal
56
- if (!fs.existsSync(stateDir)) {
57
- console.warn(`[hook:session-ending] State directory not found: ${stateDir}`);
58
- return;
59
- }
60
- const stateFiles = fs.readdirSync(stateDir).filter(f => f.endsWith('.json'));
61
- let targetGoalId = null;
62
- let targetPhase = null;
63
- for (const file of stateFiles) {
64
- const statePath = path.join(stateDir, file);
65
- try {
66
- const state = JSON.parse(fs.readFileSync(statePath, 'utf-8'));
67
- for (const [phase, session] of Object.entries(state.sessions || {})) {
68
- const sess = session;
69
- if (sess.id === sessionId && sess.active) {
70
- targetGoalId = state.goalId;
71
- targetPhase = phase;
72
- break;
73
- }
74
- }
75
- if (targetGoalId)
76
- break;
77
- }
78
- catch (err) {
79
- console.warn(`[hook:session-ending] Failed to parse ${file}: ${err.message}`);
80
- }
81
- }
82
- if (!targetGoalId) {
83
- console.warn(`[hook:session-ending] No active state found for session ${sessionId}`);
84
- return;
85
- }
86
- // 2. 兜底检查:如果 state 的 nextAction 还是 WAIT_PHASE_COMPLETE,
87
- // 说明 Skill Entry 没来得及更新 state(异常或超时)
88
- try {
89
- const state = await (0, state_1.loadState)(targetGoalId, projectDir);
90
- if (state.nextAction === 'WAIT_PHASE_COMPLETE') {
91
- console.warn(`[hook:session-ending] Session ${sessionId} (${targetPhase}) ended without state update for ${targetGoalId}`);
92
- // 写入异常状态,让 Scheduler 重建
93
- await (0, state_1.updateState)(targetGoalId, {
94
- nextAction: `CREATE_${targetPhase.toUpperCase()}_SESSION`,
95
- error: 'session_ended_without_state_update',
96
- sessions: {
97
- ...state.sessions,
98
- [targetPhase]: {
99
- ...state.sessions[targetPhase],
100
- destroyedAt: new Date().toISOString(),
101
- active: false
102
- }
103
- }
104
- }, projectDir);
105
- }
106
- else {
107
- }
108
- }
109
- catch (err) {
110
- console.error(`[hook:session-ending] Failed to load state for ${targetGoalId}: ${err.message}`);
111
- }
112
- }
113
- //# sourceMappingURL=session-ending.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-ending.js","sourceRoot":"","sources":["../../src/hooks/session-ending.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function sessionRecallHook(input: any, output: any): Promise<any>;
2
- //# sourceMappingURL=session-recall.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-recall.d.ts","sourceRoot":"","sources":["../../src/hooks/session-recall.ts"],"names":[],"mappings":"AAoEA,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAiC7E"}
@@ -1,103 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sessionRecallHook = sessionRecallHook;
4
- const ttl_map_1 = require("../utils/ttl-map");
5
- const GATEWAY_PORT = process.env.MAFW_SERVER_API_PORT || process.env.MAFW_GATEWAY_PORT || '3000';
6
- const RECALL_URL = `http://127.0.0.1:${GATEWAY_PORT}/api/recall/context`;
7
- // Per-session cursor: the ID of the last *real* message processed. Synthetic
8
- // `<recall>` parts injected by this hook are appended to a real user message's
9
- // parts (marked `synthetic:true`) and never advance the cursor. TTL releases
10
- // entries for ended/idle sessions.
11
- const cursorBySession = new ttl_map_1.TtlMap(24 * 60 * 60 * 1000);
12
- // Synthetic <recall> parts injected by this hook are appended to real user
13
- // messages' parts (marked `synthetic:true`). Real messages always carry
14
- // `info.id`; the <recall> text marker is kept for legacy detection.
15
- function isInjectedMessage(msg) {
16
- if (!msg?.info?.id)
17
- return true;
18
- if (typeof msg?.content === 'string' && msg.content.trimStart().startsWith('<recall>'))
19
- return true;
20
- return false;
21
- }
22
- function extractText(msg) {
23
- if (typeof msg?.content === 'string')
24
- return msg.content;
25
- if (msg?.parts) {
26
- return msg.parts
27
- .filter((p) => p.type === 'text' || p.type === 'tool')
28
- .map((p) => p.text || p.content || p.input || p.output || JSON.stringify(p))
29
- .join(' ');
30
- }
31
- return '';
32
- }
33
- // Incremental messages after the cursor. If the cursor ID is gone (history
34
- // edited/truncated), fall back to the last 8 real messages — never including
35
- // synthetic <recall> parts — so injected pointers are not re-processed.
36
- function getIncrementalMessages(messages, lastId) {
37
- const real = messages.filter((m) => !isInjectedMessage(m));
38
- if (!lastId)
39
- return real;
40
- const idx = real.findIndex((m) => m.info?.id === lastId);
41
- if (idx === -1)
42
- return real.slice(-8);
43
- return real.slice(idx + 1);
44
- }
45
- function buildQuery(messages) {
46
- return messages
47
- .map((m) => extractText(m))
48
- .join('\n')
49
- .slice(0, 500);
50
- }
51
- async function fetchRecall(query, sessionID) {
52
- if (!query.trim())
53
- return { pointers: null };
54
- try {
55
- const controller = new AbortController();
56
- const timeout = setTimeout(() => controller.abort(), 100);
57
- const res = await fetch(`${RECALL_URL}?sessionID=${encodeURIComponent(sessionID)}&query=${encodeURIComponent(query)}`, {
58
- signal: controller.signal,
59
- });
60
- clearTimeout(timeout);
61
- if (!res.ok)
62
- return { pointers: null };
63
- const body = await res.json();
64
- return {
65
- pointers: body?.pointers || null,
66
- };
67
- }
68
- catch {
69
- return { pointers: null };
70
- }
71
- }
72
- async function sessionRecallHook(input, output) {
73
- const messages = output?.messages || [];
74
- if (messages.length === 0)
75
- return output;
76
- // The transform hook input is `{}` (no sessionID); recover it from the first
77
- // real message's info so per-session cursors stay isolated.
78
- const sessionID = input?.sessionID ||
79
- messages.find((m) => m.info?.sessionID)?.info?.sessionID ||
80
- '';
81
- if (!sessionID)
82
- return output;
83
- const increment = getIncrementalMessages(messages, cursorBySession.get(sessionID));
84
- const query = buildQuery(increment);
85
- if (!query.trim())
86
- return output;
87
- const recall = await fetchRecall(query, sessionID);
88
- // Advance cursor past the last real message (injected parts excluded).
89
- const real = messages.filter((m) => !isInjectedMessage(m));
90
- const lastReal = real[real.length - 1];
91
- if (lastReal?.info?.id)
92
- cursorBySession.set(sessionID, lastReal.info.id);
93
- if (recall.pointers) {
94
- // Inject into a real user message's parts (valid message shape — a bare
95
- // `{ role, content }` push crashes toModelMessagesEffect's parts scan).
96
- const lastUser = real.filter((m) => m.info?.role === 'user').pop();
97
- if (lastUser && Array.isArray(lastUser.parts)) {
98
- lastUser.parts.push({ type: 'text', text: recall.pointers, synthetic: true });
99
- }
100
- }
101
- return output;
102
- }
103
- //# sourceMappingURL=session-recall.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-recall.js","sourceRoot":"","sources":["../../src/hooks/session-recall.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- export interface SessionStartContext {
2
- sessionId: string;
3
- goalId?: string;
4
- projectDir?: string;
5
- }
6
- export declare function sessionStartHook(ctx: SessionStartContext, options?: {
7
- mafwDir?: string;
8
- }): Promise<void>;
9
- //# sourceMappingURL=session-start.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9G"}
@@ -1,42 +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.sessionStartHook = sessionStartHook;
27
- const fs = __importStar(require("fs"));
28
- const path = __importStar(require("path"));
29
- async function sessionStartHook(ctx, options) {
30
- const projectDir = ctx.projectDir || process.cwd();
31
- const mafwDir = options?.mafwDir || path.join(projectDir, '.mafw');
32
- const goalDir = path.join(mafwDir, 'goals');
33
- if (fs.existsSync(goalDir)) {
34
- const files = fs.readdirSync(goalDir).filter(f => f.endsWith('.md'));
35
- if (files.length > 0) {
36
- const latest = files.sort().reverse()[0];
37
- const goalPath = path.join(goalDir, latest);
38
- const goalContent = fs.readFileSync(goalPath, 'utf-8');
39
- }
40
- }
41
- }
42
- //# sourceMappingURL=session-start.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AASA,4CAcC;AAvBD,uCAAyB;AACzB,2CAA6B;AAQtB,KAAK,UAAU,gBAAgB,CAAC,GAAwB,EAAE,OAA8B;IAC7F,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACnD,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAG5C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,10 +0,0 @@
1
- export interface ToolBeforeContext {
2
- tool: string;
3
- sessionID: string;
4
- callID?: string;
5
- args?: any;
6
- }
7
- export declare function toolBeforeHook(ctx: ToolBeforeContext): Promise<{
8
- args?: any;
9
- } | void>;
10
- //# sourceMappingURL=tool-before.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-before.d.ts","sourceRoot":"","sources":["../../src/hooks/tool-before.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,GAAG,CAAA;CAAE,GAAG,IAAI,CAAC,CAC3F"}
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toolBeforeHook = toolBeforeHook;
4
- async function toolBeforeHook(ctx) {
5
- }
6
- //# sourceMappingURL=tool-before.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-before.js","sourceRoot":"","sources":["../../src/hooks/tool-before.ts"],"names":[],"mappings":";;AAOA,wCACC;AADM,KAAK,UAAU,cAAc,CAAC,GAAsB;AAC3D,CAAC"}
@@ -1,19 +0,0 @@
1
- /**
2
- * tool-executed Hook — 工具输出压缩
3
- *
4
- * 职责:
5
- * 1. 工具输出过大时自动压缩
6
- * 2. 触发 L1 压缩:Session Pruner
7
- * 3. 只压缩,不修改业务逻辑
8
- *
9
- * 设计原则:
10
- * - 横切关注点,不承载业务逻辑
11
- * - 压缩阈值:1000 tokens
12
- */
13
- export interface ToolExecutedHookContext {
14
- toolName: string;
15
- output: string;
16
- projectDir?: string;
17
- }
18
- export declare function toolExecutedHook(hookContext: ToolExecutedHookContext): Promise<void>;
19
- //# sourceMappingURL=tool-executed.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-executed.d.ts","sourceRoot":"","sources":["../../src/hooks/tool-executed.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1F"}
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toolExecutedHook = toolExecutedHook;
4
- const observation_capture_1 = require("./observation-capture");
5
- async function toolExecutedHook(hookContext) {
6
- const { toolName, output, projectDir } = hookContext;
7
- if (output.length > 1000) {
8
- const truncated = output.length > 2000 ? output.slice(0, 500) + '\n... [TRUNCATED] ...\n' + output.slice(-500) : output;
9
- }
10
- await (0, observation_capture_1.captureObservation)({ toolName, output, args: '' });
11
- }
12
- //# sourceMappingURL=tool-executed.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-executed.js","sourceRoot":"","sources":["../../src/hooks/tool-executed.ts"],"names":[],"mappings":";;AAqBA,4CAQC;AA7BD,+DAA2D;AAqBpD,KAAK,UAAU,gBAAgB,CAAC,WAAoC;IACzE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC;IAErD,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,yBAAyB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1H,CAAC;IAED,MAAM,IAAA,wCAAkB,EAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AAC3D,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function userProfileSystemHook(_input: any, output: any): Promise<any>;
2
- //# sourceMappingURL=user-profile.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-profile.d.ts","sourceRoot":"","sources":["../../src/hooks/user-profile.ts"],"names":[],"mappings":"AAQA,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAgBlF"}
@@ -1,30 +0,0 @@
1
- "use strict";
2
- // Disclosure layer injection: fetches the pinned <user-profile> block from the
3
- // gateway and appends it to the system prompt (after <memory-guide>, so the
4
- // static prefix stays cacheable). Fail-open: any error/timeout means no block,
5
- // never an exception — LLM flow must not be blocked by memory injection.
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.userProfileSystemHook = userProfileSystemHook;
8
- const GATEWAY_PORT = process.env.MAFW_SERVER_API_PORT || process.env.MAFW_GATEWAY_PORT || '3000';
9
- const PINNED_URL = `http://127.0.0.1:${GATEWAY_PORT}/api/recall/pinned`;
10
- async function userProfileSystemHook(_input, output) {
11
- try {
12
- const controller = new AbortController();
13
- const timeout = setTimeout(() => controller.abort(), 150);
14
- const res = await fetch(PINNED_URL, { signal: controller.signal });
15
- clearTimeout(timeout);
16
- if (!res.ok)
17
- return output;
18
- const body = await res.json();
19
- if (body?.profile) {
20
- if (!output.system)
21
- output.system = [];
22
- output.system.push(body.profile);
23
- }
24
- }
25
- catch {
26
- // fail-open: gateway down / timeout → no disclosure block this turn
27
- }
28
- return output;
29
- }
30
- //# sourceMappingURL=user-profile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-profile.js","sourceRoot":"","sources":["../../src/hooks/user-profile.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,4EAA4E;AAC5E,+EAA+E;AAC/E,yEAAyE;;AAKzE,sDAgBC;AAnBD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAA;AAChG,MAAM,UAAU,GAAG,oBAAoB,YAAY,oBAAoB,CAAA;AAEhE,KAAK,UAAU,qBAAqB,CAAC,MAAW,EAAE,MAAW;IAClE,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAA;QACzD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QAClE,YAAY,CAAC,OAAO,CAAC,CAAA;QACrB,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,MAAM,CAAA;QAC1B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAA;QACpC,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,EAAE,CAAA;YACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;IACtE,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -1,9 +0,0 @@
1
- export interface UserPromptContext {
2
- sessionID: string;
3
- messageID?: string;
4
- agent?: string;
5
- model?: string;
6
- text?: string;
7
- }
8
- export declare function userPromptHook(ctx: UserPromptContext): Promise<void>;
9
- //# sourceMappingURL=user-prompt.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-prompt.d.ts","sourceRoot":"","sources":["../../src/hooks/user-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E"}
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.userPromptHook = userPromptHook;
4
- async function userPromptHook(ctx) {
5
- if (!ctx.text)
6
- return;
7
- }
8
- //# sourceMappingURL=user-prompt.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-prompt.js","sourceRoot":"","sources":["../../src/hooks/user-prompt.ts"],"names":[],"mappings":";;AAQA,wCAEC;AAFM,KAAK,UAAU,cAAc,CAAC,GAAsB;IACzD,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,OAAO;AACxB,CAAC"}
@@ -1,8 +0,0 @@
1
- export declare function buildVoiceGuide(): string;
2
- /** 判断 user 消息是否含音频媒体(media part mime audio/* 或音频指针/文件名)。 */
3
- export declare function messageHasAudio(msg: any): boolean;
4
- /** messages.transform:更新会话语音输入状态。 */
5
- export declare function voiceGuideMessagesHook(input: any, output: any): any;
6
- /** system.transform:语音输入会话注入引导块。 */
7
- export declare function voiceGuideSystemHook(input: any, output: any): any;
8
- //# sourceMappingURL=voice-guide.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"voice-guide.d.ts","sourceRoot":"","sources":["../../src/hooks/voice-guide.ts"],"names":[],"mappings":"AAoCA,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAajD;AAED,qCAAqC;AACrC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAmBnE;AAED,oCAAoC;AACpC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAajE"}
@@ -1,101 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildVoiceGuide = buildVoiceGuide;
4
- exports.messageHasAudio = messageHasAudio;
5
- exports.voiceGuideMessagesHook = voiceGuideMessagesHook;
6
- exports.voiceGuideSystemHook = voiceGuideSystemHook;
7
- const media_ingest_1 = require("./media-ingest");
8
- /**
9
- * voice-guide — 语音输入 → 引导主 Agent 以语音回复(调用 mafw_media_speak)。
10
- *
11
- * 场景:用户用语音消息(桌面录音 / 标准 opencode 粘贴音频)提问时,agent 看到的是
12
- * 音频媒体指针或 audio file part,但没有任何提示告诉它"用户在用语音,请用语音回复"。
13
- * 本 hook 在语音输入轮给 system 上下文注入 <voice-guide> 引导,稳定 agent 决策。
14
- *
15
- * 实现:
16
- * - voiceGuideMessagesHook(experimental.chat.messages.transform):
17
- * 检测当前轮 user 消息是否含音频 → 会话级状态置位;纯文本消息清除。
18
- * - voiceGuideSystemHook(experimental.chat.system.transform):
19
- * 状态命中 → output.system.push 引导块(memory-guide 同款注入路径)。
20
- * - 时序容错:messages/system transform 顺序无保证,状态延迟一轮也持续注入
21
- * (引导对该会话后续轮次仍有效,直到出现纯文本消息)。
22
- */
23
- const AUDIO_EXT_RE = /\.(wav|mp3|m4a|ogg|flac|opus|aac|wma)(\s*[)\]),]|$)/i;
24
- /** 会话级语音输入状态:sessionID → 最近语音输入时间戳(ms)。 */
25
- const voiceSessionMap = new Map();
26
- /** 语音引导状态有效期(ms):状态存活期间 system 注入持续生效。 */
27
- const VOICE_STATE_TTL_MS = 10 * 60 * 1000;
28
- const GUIDE_HEADER = '<voice-guide>';
29
- const GUIDE_FOOTER = '</voice-guide>';
30
- const GUIDE_BODY = `## 语音对话
31
- 用户正在通过语音消息与你对话(语音输入)。媒体附件中的音频就是用户发给你的消息内容:
32
- 调用 mafw_media_ask 工具获取其内容后,把它当作用户的直接输入来回应(就像用户打字给你一样),
33
- 不要在回复中复述/重复语音内容(除非用户明确要求)。
34
- 同时请以语音形式回复:调用 mafw_media_speak 工具(text=你的回复内容,voice 可按需选择),
35
- 并把返回的 [语音回复 art:...] 标记原样包含在回复文本中。`;
36
- function buildVoiceGuide() {
37
- return `${GUIDE_HEADER}\n${GUIDE_BODY}\n${GUIDE_FOOTER}`;
38
- }
39
- /** 判断 user 消息是否含音频媒体(media part mime audio/* 或音频指针/文件名)。 */
40
- function messageHasAudio(msg) {
41
- const parts = Array.isArray(msg?.parts) ? msg.parts : [];
42
- for (const part of parts) {
43
- const mime = part?.mediaType || part?.mime || '';
44
- if (typeof mime === 'string' && mime.startsWith('audio/'))
45
- return true;
46
- if ((0, media_ingest_1.isMediaPointerPart)(part)) {
47
- const text = part?.text || '';
48
- const nameMatch = text.match(/媒体:\s*([^)\]]+)/);
49
- const name = nameMatch ? nameMatch[1] : '';
50
- if (AUDIO_EXT_RE.test(name))
51
- return true;
52
- }
53
- }
54
- return false;
55
- }
56
- /** messages.transform:更新会话语音输入状态。 */
57
- function voiceGuideMessagesHook(input, output) {
58
- const messages = Array.isArray(output?.messages) ? output.messages : [];
59
- let sessionID = input?.sessionID;
60
- let hasVoice = false;
61
- let hasText = false;
62
- for (const msg of messages) {
63
- if (msg?.role !== 'user' && msg?.info?.role !== 'user')
64
- continue;
65
- if (!sessionID)
66
- sessionID = msg?.sessionID || msg?.info?.sessionID;
67
- if (messageHasAudio(msg))
68
- hasVoice = true;
69
- const parts = Array.isArray(msg?.parts) ? msg.parts : [];
70
- if (parts.some((p) => typeof p?.text === 'string' && !(0, media_ingest_1.isMediaPointerPart)(p)))
71
- hasText = true;
72
- }
73
- if (!sessionID)
74
- return output;
75
- if (hasVoice) {
76
- voiceSessionMap.set(sessionID, Date.now());
77
- }
78
- else if (hasText) {
79
- voiceSessionMap.delete(sessionID);
80
- }
81
- return output;
82
- }
83
- /** system.transform:语音输入会话注入引导块。 */
84
- function voiceGuideSystemHook(input, output) {
85
- const sessionID = input?.sessionID;
86
- if (!sessionID)
87
- return output;
88
- const at = voiceSessionMap.get(sessionID);
89
- if (at === undefined || Date.now() - at > VOICE_STATE_TTL_MS) {
90
- if (at !== undefined)
91
- voiceSessionMap.delete(sessionID);
92
- return output;
93
- }
94
- if (!Array.isArray(output?.system))
95
- output.system = [];
96
- if (!output.system.some((s) => typeof s === 'string' && s.includes(GUIDE_HEADER))) {
97
- output.system.push(buildVoiceGuide());
98
- }
99
- return output;
100
- }
101
- //# sourceMappingURL=voice-guide.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"voice-guide.js","sourceRoot":"","sources":["../../src/hooks/voice-guide.ts"],"names":[],"mappings":"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"}