@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,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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"}