@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.
- package/README.md +5 -2
- package/bin/mafw.js +16 -14
- package/gateway/dist/index.js +52 -38
- package/gateway/dist/media/media-plugin-loader.js +0 -12
- package/gateway/dist/plugins/hub.js +153 -19
- package/gateway/dist/routes/plugins.js +15 -5
- package/gateway/dist/runtime/event-broadcast.js +33 -0
- package/gateway/dist/runtime/loader.js +23 -13
- package/gateway/dist/usage/builtin-plugins/gateway.js +25 -3
- package/gateway/dist/usage/plugin-loader.js +0 -11
- package/gateway/package.json +2 -2
- package/package.json +1 -7
- package/packages/tui/dist/cli.js +8 -3
- package/.opencode/mafw/.backup-v61/parametric/base-skill-manifest.yaml +0 -2
- package/.opencode/mafw/STATUS.md +0 -6
- package/.opencode/mafw/ledger.md +0 -20
- package/.opencode/mafw/memory/.harmonic_index.json +0 -28
- package/.opencode/mafw/memory/.review_queue.json +0 -1
- package/.opencode/mafw/memory/tier3/parametric.json +0 -13
- package/.opencode/mafw/memory/tier3/test-goal.json +0 -19
- package/.opencode/mafw/memory-index.json +0 -6
- package/.opencode/mafw/parametric/base-skill-manifest.yaml +0 -2
- package/.opencode/mafw/waves.json +0 -4
- package/.opencode/opencode.json +0 -3
- package/.opencode/plugins/mafw-plugin.ts +0 -8
- package/.opencode/skills/banner-design/SKILL.md +0 -196
- package/.opencode/skills/banner-design/references/banner-sizes-and-styles.md +0 -118
- package/.opencode/skills/brand/SKILL.md +0 -97
- package/.opencode/skills/brand/references/approval-checklist.md +0 -169
- package/.opencode/skills/brand/references/asset-organization.md +0 -157
- package/.opencode/skills/brand/references/brand-guideline-template.md +0 -140
- package/.opencode/skills/brand/references/color-palette-management.md +0 -186
- package/.opencode/skills/brand/references/consistency-checklist.md +0 -94
- package/.opencode/skills/brand/references/logo-usage-rules.md +0 -185
- package/.opencode/skills/brand/references/messaging-framework.md +0 -85
- package/.opencode/skills/brand/references/typography-specifications.md +0 -214
- package/.opencode/skills/brand/references/update.md +0 -118
- package/.opencode/skills/brand/references/visual-identity.md +0 -96
- package/.opencode/skills/brand/references/voice-framework.md +0 -88
- package/.opencode/skills/brand/scripts/extract-colors.cjs +0 -341
- package/.opencode/skills/brand/scripts/inject-brand-context.cjs +0 -349
- package/.opencode/skills/brand/scripts/sync-brand-to-tokens.cjs +0 -248
- package/.opencode/skills/brand/scripts/tests/test_sync_brand_to_tokens.py +0 -52
- package/.opencode/skills/brand/scripts/validate-asset.cjs +0 -387
- package/.opencode/skills/brand/templates/brand-guidelines-starter.md +0 -275
- package/.opencode/skills/design/SKILL.md +0 -313
- package/.opencode/skills/design/data/cip/deliverables.csv +0 -51
- package/.opencode/skills/design/data/cip/industries.csv +0 -21
- package/.opencode/skills/design/data/cip/mockup-contexts.csv +0 -21
- package/.opencode/skills/design/data/cip/styles.csv +0 -21
- package/.opencode/skills/design/data/icon/styles.csv +0 -16
- package/.opencode/skills/design/data/logo/colors.csv +0 -56
- package/.opencode/skills/design/data/logo/industries.csv +0 -56
- package/.opencode/skills/design/data/logo/styles.csv +0 -56
- package/.opencode/skills/design/references/banner-sizes-and-styles.md +0 -118
- package/.opencode/skills/design/references/cip-deliverable-guide.md +0 -95
- package/.opencode/skills/design/references/cip-design.md +0 -121
- package/.opencode/skills/design/references/cip-prompt-engineering.md +0 -84
- package/.opencode/skills/design/references/cip-style-guide.md +0 -68
- package/.opencode/skills/design/references/design-routing.md +0 -207
- package/.opencode/skills/design/references/icon-design.md +0 -122
- package/.opencode/skills/design/references/logo-color-psychology.md +0 -101
- package/.opencode/skills/design/references/logo-design.md +0 -92
- package/.opencode/skills/design/references/logo-prompt-engineering.md +0 -158
- package/.opencode/skills/design/references/logo-style-guide.md +0 -109
- package/.opencode/skills/design/references/slides-copywriting-formulas.md +0 -84
- package/.opencode/skills/design/references/slides-create.md +0 -4
- package/.opencode/skills/design/references/slides-html-template.md +0 -295
- package/.opencode/skills/design/references/slides-layout-patterns.md +0 -137
- package/.opencode/skills/design/references/slides-strategies.md +0 -94
- package/.opencode/skills/design/references/slides.md +0 -42
- package/.opencode/skills/design/references/social-photos-design.md +0 -329
- package/.opencode/skills/design/scripts/cip/core.py +0 -215
- package/.opencode/skills/design/scripts/cip/generate.py +0 -484
- package/.opencode/skills/design/scripts/cip/render-html.py +0 -424
- package/.opencode/skills/design/scripts/cip/search.py +0 -127
- package/.opencode/skills/design/scripts/icon/generate.py +0 -487
- package/.opencode/skills/design/scripts/logo/core.py +0 -175
- package/.opencode/skills/design/scripts/logo/generate.py +0 -362
- package/.opencode/skills/design/scripts/logo/search.py +0 -114
- package/.opencode/skills/design-system/SKILL.md +0 -244
- package/.opencode/skills/design-system/data/slide-backgrounds.csv +0 -11
- package/.opencode/skills/design-system/data/slide-charts.csv +0 -26
- package/.opencode/skills/design-system/data/slide-color-logic.csv +0 -14
- package/.opencode/skills/design-system/data/slide-copy.csv +0 -26
- package/.opencode/skills/design-system/data/slide-layout-logic.csv +0 -16
- package/.opencode/skills/design-system/data/slide-layouts.csv +0 -26
- package/.opencode/skills/design-system/data/slide-strategies.csv +0 -16
- package/.opencode/skills/design-system/data/slide-typography.csv +0 -15
- package/.opencode/skills/design-system/references/component-specs.md +0 -236
- package/.opencode/skills/design-system/references/component-tokens.md +0 -214
- package/.opencode/skills/design-system/references/primitive-tokens.md +0 -203
- package/.opencode/skills/design-system/references/semantic-tokens.md +0 -215
- package/.opencode/skills/design-system/references/states-and-variants.md +0 -241
- package/.opencode/skills/design-system/references/tailwind-integration.md +0 -251
- package/.opencode/skills/design-system/references/token-architecture.md +0 -224
- package/.opencode/skills/design-system/scripts/embed-tokens.cjs +0 -99
- package/.opencode/skills/design-system/scripts/fetch-background.py +0 -317
- package/.opencode/skills/design-system/scripts/generate-slide.py +0 -770
- package/.opencode/skills/design-system/scripts/generate-tokens.cjs +0 -205
- package/.opencode/skills/design-system/scripts/html-token-validator.py +0 -327
- package/.opencode/skills/design-system/scripts/search-slides.py +0 -218
- package/.opencode/skills/design-system/scripts/slide-token-validator.py +0 -35
- package/.opencode/skills/design-system/scripts/slide_search_core.py +0 -453
- package/.opencode/skills/design-system/scripts/tests/test_validate_tokens.py +0 -48
- package/.opencode/skills/design-system/scripts/validate-tokens.cjs +0 -246
- package/.opencode/skills/design-system/templates/design-tokens-starter.json +0 -143
- package/.opencode/skills/frontend-design/LICENSE.txt +0 -21
- package/.opencode/skills/frontend-design/SKILL.md +0 -115
- package/.opencode/skills/mafw-automation-interview/SKILL.md +0 -43
- package/.opencode/skills/mafw-cli-scanner/SKILL.md +0 -37
- package/.opencode/skills/mafw-compression-verifier/SKILL.md +0 -52
- package/.opencode/skills/mafw-desktop-inspector/SKILL.md +0 -170
- package/.opencode/skills/mafw-execute/SKILL.md +0 -62
- package/.opencode/skills/mafw-gateway-restart/SKILL.md +0 -87
- package/.opencode/skills/mafw-github-scanner/SKILL.md +0 -38
- package/.opencode/skills/mafw-goal/SKILL.md +0 -76
- package/.opencode/skills/mafw-interview/SKILL.md +0 -68
- package/.opencode/skills/mafw-memory-extractor/SKILL.md +0 -65
- package/.opencode/skills/mafw-plan/SKILL.md +0 -58
- package/.opencode/skills/mafw-review/SKILL.md +0 -85
- package/.opencode/skills/runtime-plugin-authoring/SKILL.md +0 -791
- package/.opencode/skills/slides/SKILL.md +0 -40
- package/.opencode/skills/slides/references/copywriting-formulas.md +0 -84
- package/.opencode/skills/slides/references/create.md +0 -4
- package/.opencode/skills/slides/references/html-template.md +0 -295
- package/.opencode/skills/slides/references/layout-patterns.md +0 -137
- package/.opencode/skills/slides/references/slide-strategies.md +0 -94
- package/.opencode/skills/ui-styling/LICENSE.txt +0 -202
- package/.opencode/skills/ui-styling/SKILL.md +0 -324
- package/.opencode/skills/ui-styling/references/canvas-design-system.md +0 -320
- package/.opencode/skills/ui-styling/references/shadcn-accessibility.md +0 -471
- package/.opencode/skills/ui-styling/references/shadcn-components.md +0 -424
- package/.opencode/skills/ui-styling/references/shadcn-theming.md +0 -373
- package/.opencode/skills/ui-styling/references/tailwind-customization.md +0 -483
- package/.opencode/skills/ui-styling/references/tailwind-responsive.md +0 -382
- package/.opencode/skills/ui-styling/references/tailwind-utilities.md +0 -455
- package/.opencode/skills/ui-styling/scripts/requirements.txt +0 -17
- package/.opencode/skills/ui-styling/scripts/shadcn_add.py +0 -308
- package/.opencode/skills/ui-styling/scripts/tailwind_config_gen.py +0 -473
- package/.opencode/skills/ui-styling/scripts/tests/coverage-ui.json +0 -1
- package/.opencode/skills/ui-styling/scripts/tests/requirements.txt +0 -3
- package/.opencode/skills/ui-styling/scripts/tests/test_shadcn_add.py +0 -266
- package/.opencode/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +0 -394
- package/.opencode/skills/ui-ux-pro-max/SKILL.md +0 -388
- package/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +0 -31
- package/.opencode/skills/ui-ux-pro-max/data/charts.csv +0 -26
- package/.opencode/skills/ui-ux-pro-max/data/colors.csv +0 -193
- package/.opencode/skills/ui-ux-pro-max/data/google-fonts.csv +0 -1924
- package/.opencode/skills/ui-ux-pro-max/data/icons.csv +0 -106
- package/.opencode/skills/ui-ux-pro-max/data/landing.csv +0 -35
- package/.opencode/skills/ui-ux-pro-max/data/motion.csv +0 -17
- package/.opencode/skills/ui-ux-pro-max/data/products.csv +0 -193
- package/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +0 -45
- package/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +0 -51
- package/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +0 -54
- package/.opencode/skills/ui-ux-pro-max/data/stacks/avalonia.csv +0 -57
- package/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
- package/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
- package/.opencode/skills/ui-ux-pro-max/data/stacks/javafx.csv +0 -76
- package/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
- package/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +0 -51
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -71
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
- package/.opencode/skills/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
- package/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +0 -54
- package/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
- package/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
- package/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
- package/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +0 -54
- package/.opencode/skills/ui-ux-pro-max/data/stacks/uno.csv +0 -60
- package/.opencode/skills/ui-ux-pro-max/data/stacks/uwp.csv +0 -56
- package/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +0 -50
- package/.opencode/skills/ui-ux-pro-max/data/stacks/winui.csv +0 -60
- package/.opencode/skills/ui-ux-pro-max/data/stacks/wpf.csv +0 -57
- package/.opencode/skills/ui-ux-pro-max/data/styles.csv +0 -85
- package/.opencode/skills/ui-ux-pro-max/data/typography.csv +0 -75
- package/.opencode/skills/ui-ux-pro-max/data/ui-reasoning.csv +0 -162
- package/.opencode/skills/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
- package/.opencode/skills/ui-ux-pro-max/scripts/core.py +0 -464
- package/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +0 -1479
- package/.opencode/skills/ui-ux-pro-max/scripts/search.py +0 -162
- package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_core.py +0 -134
- package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_design_system_mode.py +0 -159
- package/.opencode/skills/ui-ux-pro-max/scripts/validate_data.py +0 -114
- package/dist/hooks/bash-python-guide.d.ts +0 -4
- package/dist/hooks/bash-python-guide.d.ts.map +0 -1
- package/dist/hooks/bash-python-guide.js +0 -67
- package/dist/hooks/bash-python-guide.js.map +0 -1
- package/dist/hooks/handoff.d.ts +0 -9
- package/dist/hooks/handoff.d.ts.map +0 -1
- package/dist/hooks/handoff.js +0 -8
- package/dist/hooks/handoff.js.map +0 -1
- package/dist/hooks/hook-manager.d.ts +0 -32
- package/dist/hooks/hook-manager.d.ts.map +0 -1
- package/dist/hooks/hook-manager.js +0 -91
- package/dist/hooks/hook-manager.js.map +0 -1
- package/dist/hooks/llm-after.d.ts +0 -8
- package/dist/hooks/llm-after.d.ts.map +0 -1
- package/dist/hooks/llm-after.js +0 -8
- package/dist/hooks/llm-after.js.map +0 -1
- package/dist/hooks/media-ingest.d.ts +0 -43
- package/dist/hooks/media-ingest.d.ts.map +0 -1
- package/dist/hooks/media-ingest.js +0 -269
- package/dist/hooks/media-ingest.js.map +0 -1
- package/dist/hooks/memory-guide.d.ts +0 -3
- package/dist/hooks/memory-guide.d.ts.map +0 -1
- package/dist/hooks/memory-guide.js +0 -47
- package/dist/hooks/memory-guide.js.map +0 -1
- package/dist/hooks/observation-capture.d.ts +0 -17
- package/dist/hooks/observation-capture.d.ts.map +0 -1
- package/dist/hooks/observation-capture.js +0 -20
- package/dist/hooks/observation-capture.js.map +0 -1
- package/dist/hooks/session-compacting.d.ts +0 -6
- package/dist/hooks/session-compacting.d.ts.map +0 -1
- package/dist/hooks/session-compacting.js +0 -6
- package/dist/hooks/session-compacting.js.map +0 -1
- package/dist/hooks/session-ending.d.ts +0 -20
- package/dist/hooks/session-ending.d.ts.map +0 -1
- package/dist/hooks/session-ending.js +0 -113
- package/dist/hooks/session-ending.js.map +0 -1
- package/dist/hooks/session-recall.d.ts +0 -2
- package/dist/hooks/session-recall.d.ts.map +0 -1
- package/dist/hooks/session-recall.js +0 -103
- package/dist/hooks/session-recall.js.map +0 -1
- package/dist/hooks/session-start.d.ts +0 -9
- package/dist/hooks/session-start.d.ts.map +0 -1
- package/dist/hooks/session-start.js +0 -42
- package/dist/hooks/session-start.js.map +0 -1
- package/dist/hooks/tool-before.d.ts +0 -10
- package/dist/hooks/tool-before.d.ts.map +0 -1
- package/dist/hooks/tool-before.js +0 -6
- package/dist/hooks/tool-before.js.map +0 -1
- package/dist/hooks/tool-executed.d.ts +0 -19
- package/dist/hooks/tool-executed.d.ts.map +0 -1
- package/dist/hooks/tool-executed.js +0 -12
- package/dist/hooks/tool-executed.js.map +0 -1
- package/dist/hooks/user-profile.d.ts +0 -2
- package/dist/hooks/user-profile.d.ts.map +0 -1
- package/dist/hooks/user-profile.js +0 -30
- package/dist/hooks/user-profile.js.map +0 -1
- package/dist/hooks/user-prompt.d.ts +0 -9
- package/dist/hooks/user-prompt.d.ts.map +0 -1
- package/dist/hooks/user-prompt.js +0 -8
- package/dist/hooks/user-prompt.js.map +0 -1
- package/dist/hooks/voice-guide.d.ts +0 -8
- package/dist/hooks/voice-guide.d.ts.map +0 -1
- package/dist/hooks/voice-guide.js +0 -101
- package/dist/hooks/voice-guide.js.map +0 -1
- package/dist/plugin.d.ts +0 -55
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js +0 -342
- package/dist/plugin.js.map +0 -1
- package/dist/tools/add-memory.d.ts +0 -17
- package/dist/tools/add-memory.d.ts.map +0 -1
- package/dist/tools/add-memory.js +0 -60
- package/dist/tools/add-memory.js.map +0 -1
- package/dist/tools/media-ask.d.ts +0 -14
- package/dist/tools/media-ask.d.ts.map +0 -1
- package/dist/tools/media-ask.js +0 -224
- package/dist/tools/media-ask.js.map +0 -1
- package/dist/tools/media-speak.d.ts +0 -16
- package/dist/tools/media-speak.d.ts.map +0 -1
- package/dist/tools/media-speak.js +0 -78
- package/dist/tools/media-speak.js.map +0 -1
- package/dist/tools/media-upload.d.ts +0 -14
- package/dist/tools/media-upload.d.ts.map +0 -1
- package/dist/tools/media-upload.js +0 -155
- package/dist/tools/media-upload.js.map +0 -1
- package/dist/tools/python-exec.d.ts +0 -13
- package/dist/tools/python-exec.d.ts.map +0 -1
- package/dist/tools/python-exec.js +0 -99
- package/dist/tools/python-exec.js.map +0 -1
- package/dist/tools/python-restart.d.ts +0 -11
- package/dist/tools/python-restart.d.ts.map +0 -1
- package/dist/tools/python-restart.js +0 -33
- package/dist/tools/python-restart.js.map +0 -1
- package/dist/utils/circuit-breaker.d.ts +0 -23
- package/dist/utils/circuit-breaker.d.ts.map +0 -1
- package/dist/utils/circuit-breaker.js +0 -75
- package/dist/utils/circuit-breaker.js.map +0 -1
- package/dist/utils/config-loader.d.ts +0 -20
- package/dist/utils/config-loader.d.ts.map +0 -1
- package/dist/utils/config-loader.js +0 -194
- package/dist/utils/config-loader.js.map +0 -1
- package/dist/utils/fallback.d.ts +0 -7
- package/dist/utils/fallback.d.ts.map +0 -1
- package/dist/utils/fallback.js +0 -20
- package/dist/utils/fallback.js.map +0 -1
- package/dist/utils/git.d.ts +0 -24
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js +0 -71
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/github.d.ts +0 -37
- package/dist/utils/github.d.ts.map +0 -1
- package/dist/utils/github.js +0 -53
- package/dist/utils/github.js.map +0 -1
- package/dist/utils/global-path.d.ts +0 -2
- package/dist/utils/global-path.d.ts.map +0 -1
- package/dist/utils/global-path.js +0 -32
- package/dist/utils/global-path.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -6
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -69
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/obs-capture.d.ts +0 -7
- package/dist/utils/obs-capture.d.ts.map +0 -1
- package/dist/utils/obs-capture.js +0 -49
- package/dist/utils/obs-capture.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -11
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js +0 -45
- package/dist/utils/retry.js.map +0 -1
- package/dist/utils/self-wiring.d.ts +0 -13
- package/dist/utils/self-wiring.d.ts.map +0 -1
- package/dist/utils/self-wiring.js +0 -86
- package/dist/utils/self-wiring.js.map +0 -1
- package/dist/utils/state.d.ts +0 -106
- package/dist/utils/state.d.ts.map +0 -1
- package/dist/utils/state.js +0 -166
- package/dist/utils/state.js.map +0 -1
- package/dist/utils/status.d.ts +0 -47
- package/dist/utils/status.d.ts.map +0 -1
- package/dist/utils/status.js +0 -147
- package/dist/utils/status.js.map +0 -1
- package/dist/utils/ttl-map.d.ts +0 -17
- package/dist/utils/ttl-map.d.ts.map +0 -1
- package/dist/utils/ttl-map.js +0 -67
- 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 +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":";;AAoEA,8CAiCC;AArGD,8CAAyC;AAEzC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAA;AAChG,MAAM,UAAU,GAAG,oBAAoB,YAAY,qBAAqB,CAAA;AAExE,6EAA6E;AAC7E,+EAA+E;AAC/E,6EAA6E;AAC7E,mCAAmC;AACnC,MAAM,eAAe,GAAG,IAAI,gBAAM,CAAiB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;AAEvE,2EAA2E;AAC3E,wEAAwE;AACxE,oEAAoE;AACpE,SAAS,iBAAiB,CAAC,GAAQ;IACjC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QAAE,OAAO,IAAI,CAAA;IAC/B,IAAI,OAAO,GAAG,EAAE,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAA;IACnG,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,WAAW,CAAC,GAAQ;IAC3B,IAAI,OAAO,GAAG,EAAE,OAAO,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,OAAO,CAAA;IACxD,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,KAAK;aACb,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAC1D,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;aAChF,IAAI,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,2EAA2E;AAC3E,6EAA6E;AAC7E,wEAAwE;AACxE,SAAS,sBAAsB,CAAC,QAAe,EAAE,MAA0B;IACzE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/D,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,MAAM,CAAC,CAAA;IAC7D,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACrC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;AAC5B,CAAC;AAED,SAAS,UAAU,CAAC,QAAe;IACjC,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;SAC/B,IAAI,CAAC,IAAI,CAAC;SACV,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAClB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAa,EAAE,SAAiB;IACzD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC5C,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,GAAG,UAAU,cAAc,kBAAkB,CAAC,SAAS,CAAC,UAAU,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE;YACrH,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAA;QACF,YAAY,CAAC,OAAO,CAAC,CAAA;QACrB,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;QACtC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAA;QACpC,OAAO;YACL,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI;SACjC,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC3B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,KAAU,EAAE,MAAW;IAC7D,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAA;IACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAA;IAExC,6EAA6E;IAC7E,4DAA4D;IAC5D,MAAM,SAAS,GACb,KAAK,EAAE,SAAS;QACf,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,SAAgC;QACrF,EAAE,CAAA;IACJ,IAAI,CAAC,SAAS;QAAE,OAAO,MAAM,CAAA;IAE7B,MAAM,SAAS,GAAG,sBAAsB,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;IAClF,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;IACnC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,MAAM,CAAA;IAEhC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IAElD,uEAAuE;IACvE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACtC,IAAI,QAAQ,EAAE,IAAI,EAAE,EAAE;QAAE,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAExE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,wEAAwE;QACxE,wEAAwE;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,EAAE,CAAA;QACvE,IAAI,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/E,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -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 +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 +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 +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 +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 +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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"}
|