@jack200714/mafw 4.5.1
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/.opencode/mafw/.backup-v61/parametric/base-skill-manifest.yaml +2 -0
- package/.opencode/mafw/STATUS.md +6 -0
- package/.opencode/mafw/ledger.md +20 -0
- package/.opencode/mafw/memory/.harmonic_index.json +28 -0
- package/.opencode/mafw/memory/.review_queue.json +1 -0
- package/.opencode/mafw/memory/tier3/parametric.json +13 -0
- package/.opencode/mafw/memory/tier3/test-goal.json +19 -0
- package/.opencode/mafw/memory-index.json +6 -0
- package/.opencode/mafw/parametric/base-skill-manifest.yaml +2 -0
- package/.opencode/mafw/waves.json +4 -0
- package/.opencode/opencode.json +3 -0
- package/.opencode/plugins/mafw-plugin.ts +8 -0
- package/.opencode/skills/banner-design/SKILL.md +196 -0
- package/.opencode/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
- package/.opencode/skills/brand/SKILL.md +97 -0
- package/.opencode/skills/brand/references/approval-checklist.md +169 -0
- package/.opencode/skills/brand/references/asset-organization.md +157 -0
- package/.opencode/skills/brand/references/brand-guideline-template.md +140 -0
- package/.opencode/skills/brand/references/color-palette-management.md +186 -0
- package/.opencode/skills/brand/references/consistency-checklist.md +94 -0
- package/.opencode/skills/brand/references/logo-usage-rules.md +185 -0
- package/.opencode/skills/brand/references/messaging-framework.md +85 -0
- package/.opencode/skills/brand/references/typography-specifications.md +214 -0
- package/.opencode/skills/brand/references/update.md +118 -0
- package/.opencode/skills/brand/references/visual-identity.md +96 -0
- package/.opencode/skills/brand/references/voice-framework.md +88 -0
- package/.opencode/skills/brand/scripts/extract-colors.cjs +341 -0
- package/.opencode/skills/brand/scripts/inject-brand-context.cjs +349 -0
- package/.opencode/skills/brand/scripts/sync-brand-to-tokens.cjs +248 -0
- package/.opencode/skills/brand/scripts/tests/test_sync_brand_to_tokens.py +52 -0
- package/.opencode/skills/brand/scripts/validate-asset.cjs +387 -0
- package/.opencode/skills/brand/templates/brand-guidelines-starter.md +275 -0
- package/.opencode/skills/design/SKILL.md +313 -0
- package/.opencode/skills/design/data/cip/deliverables.csv +51 -0
- package/.opencode/skills/design/data/cip/industries.csv +21 -0
- package/.opencode/skills/design/data/cip/mockup-contexts.csv +21 -0
- package/.opencode/skills/design/data/cip/styles.csv +21 -0
- package/.opencode/skills/design/data/icon/styles.csv +16 -0
- package/.opencode/skills/design/data/logo/colors.csv +56 -0
- package/.opencode/skills/design/data/logo/industries.csv +56 -0
- package/.opencode/skills/design/data/logo/styles.csv +56 -0
- package/.opencode/skills/design/references/banner-sizes-and-styles.md +118 -0
- package/.opencode/skills/design/references/cip-deliverable-guide.md +95 -0
- package/.opencode/skills/design/references/cip-design.md +121 -0
- package/.opencode/skills/design/references/cip-prompt-engineering.md +84 -0
- package/.opencode/skills/design/references/cip-style-guide.md +68 -0
- package/.opencode/skills/design/references/design-routing.md +207 -0
- package/.opencode/skills/design/references/icon-design.md +122 -0
- package/.opencode/skills/design/references/logo-color-psychology.md +101 -0
- package/.opencode/skills/design/references/logo-design.md +92 -0
- package/.opencode/skills/design/references/logo-prompt-engineering.md +158 -0
- package/.opencode/skills/design/references/logo-style-guide.md +109 -0
- package/.opencode/skills/design/references/slides-copywriting-formulas.md +84 -0
- package/.opencode/skills/design/references/slides-create.md +4 -0
- package/.opencode/skills/design/references/slides-html-template.md +295 -0
- package/.opencode/skills/design/references/slides-layout-patterns.md +137 -0
- package/.opencode/skills/design/references/slides-strategies.md +94 -0
- package/.opencode/skills/design/references/slides.md +42 -0
- package/.opencode/skills/design/references/social-photos-design.md +329 -0
- package/.opencode/skills/design/scripts/cip/core.py +215 -0
- package/.opencode/skills/design/scripts/cip/generate.py +484 -0
- package/.opencode/skills/design/scripts/cip/render-html.py +424 -0
- package/.opencode/skills/design/scripts/cip/search.py +127 -0
- package/.opencode/skills/design/scripts/icon/generate.py +487 -0
- package/.opencode/skills/design/scripts/logo/core.py +175 -0
- package/.opencode/skills/design/scripts/logo/generate.py +362 -0
- package/.opencode/skills/design/scripts/logo/search.py +114 -0
- package/.opencode/skills/design-system/SKILL.md +244 -0
- package/.opencode/skills/design-system/data/slide-backgrounds.csv +11 -0
- package/.opencode/skills/design-system/data/slide-charts.csv +26 -0
- package/.opencode/skills/design-system/data/slide-color-logic.csv +14 -0
- package/.opencode/skills/design-system/data/slide-copy.csv +26 -0
- package/.opencode/skills/design-system/data/slide-layout-logic.csv +16 -0
- package/.opencode/skills/design-system/data/slide-layouts.csv +26 -0
- package/.opencode/skills/design-system/data/slide-strategies.csv +16 -0
- package/.opencode/skills/design-system/data/slide-typography.csv +15 -0
- package/.opencode/skills/design-system/references/component-specs.md +236 -0
- package/.opencode/skills/design-system/references/component-tokens.md +214 -0
- package/.opencode/skills/design-system/references/primitive-tokens.md +203 -0
- package/.opencode/skills/design-system/references/semantic-tokens.md +215 -0
- package/.opencode/skills/design-system/references/states-and-variants.md +241 -0
- package/.opencode/skills/design-system/references/tailwind-integration.md +251 -0
- package/.opencode/skills/design-system/references/token-architecture.md +224 -0
- package/.opencode/skills/design-system/scripts/embed-tokens.cjs +99 -0
- package/.opencode/skills/design-system/scripts/fetch-background.py +317 -0
- package/.opencode/skills/design-system/scripts/generate-slide.py +770 -0
- package/.opencode/skills/design-system/scripts/generate-tokens.cjs +205 -0
- package/.opencode/skills/design-system/scripts/html-token-validator.py +327 -0
- package/.opencode/skills/design-system/scripts/search-slides.py +218 -0
- package/.opencode/skills/design-system/scripts/slide-token-validator.py +35 -0
- package/.opencode/skills/design-system/scripts/slide_search_core.py +453 -0
- package/.opencode/skills/design-system/scripts/tests/test_validate_tokens.py +48 -0
- package/.opencode/skills/design-system/scripts/validate-tokens.cjs +246 -0
- package/.opencode/skills/design-system/templates/design-tokens-starter.json +143 -0
- package/.opencode/skills/frontend-design/LICENSE.txt +21 -0
- package/.opencode/skills/frontend-design/SKILL.md +115 -0
- package/.opencode/skills/mafw-automation-interview/SKILL.md +43 -0
- package/.opencode/skills/mafw-cli-scanner/SKILL.md +37 -0
- package/.opencode/skills/mafw-compression-verifier/SKILL.md +52 -0
- package/.opencode/skills/mafw-desktop-inspector/SKILL.md +170 -0
- package/.opencode/skills/mafw-execute/SKILL.md +62 -0
- package/.opencode/skills/mafw-gateway-restart/SKILL.md +87 -0
- package/.opencode/skills/mafw-github-scanner/SKILL.md +38 -0
- package/.opencode/skills/mafw-goal/SKILL.md +76 -0
- package/.opencode/skills/mafw-interview/SKILL.md +68 -0
- package/.opencode/skills/mafw-memory-extractor/SKILL.md +65 -0
- package/.opencode/skills/mafw-plan/SKILL.md +58 -0
- package/.opencode/skills/mafw-review/SKILL.md +85 -0
- package/.opencode/skills/runtime-plugin-authoring/SKILL.md +791 -0
- package/.opencode/skills/slides/SKILL.md +40 -0
- package/.opencode/skills/slides/references/copywriting-formulas.md +84 -0
- package/.opencode/skills/slides/references/create.md +4 -0
- package/.opencode/skills/slides/references/html-template.md +295 -0
- package/.opencode/skills/slides/references/layout-patterns.md +137 -0
- package/.opencode/skills/slides/references/slide-strategies.md +94 -0
- package/.opencode/skills/ui-styling/LICENSE.txt +202 -0
- package/.opencode/skills/ui-styling/SKILL.md +324 -0
- package/.opencode/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/.opencode/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/.opencode/skills/ui-styling/references/shadcn-components.md +424 -0
- package/.opencode/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/.opencode/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/.opencode/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/.opencode/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/.opencode/skills/ui-styling/scripts/requirements.txt +17 -0
- package/.opencode/skills/ui-styling/scripts/shadcn_add.py +308 -0
- package/.opencode/skills/ui-styling/scripts/tailwind_config_gen.py +473 -0
- package/.opencode/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/.opencode/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/.opencode/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/.opencode/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +394 -0
- package/.opencode/skills/ui-ux-pro-max/SKILL.md +388 -0
- package/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +31 -0
- package/.opencode/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/.opencode/skills/ui-ux-pro-max/data/colors.csv +193 -0
- package/.opencode/skills/ui-ux-pro-max/data/google-fonts.csv +1924 -0
- package/.opencode/skills/ui-ux-pro-max/data/icons.csv +106 -0
- package/.opencode/skills/ui-ux-pro-max/data/landing.csv +35 -0
- package/.opencode/skills/ui-ux-pro-max/data/motion.csv +17 -0
- package/.opencode/skills/ui-ux-pro-max/data/products.csv +193 -0
- package/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/avalonia.csv +57 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/javafx.csv +76 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +71 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/uno.csv +60 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/uwp.csv +56 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/winui.csv +60 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/wpf.csv +57 -0
- package/.opencode/skills/ui-ux-pro-max/data/styles.csv +85 -0
- package/.opencode/skills/ui-ux-pro-max/data/typography.csv +75 -0
- package/.opencode/skills/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
- package/.opencode/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/core.py +464 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +1479 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/search.py +162 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_core.py +134 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_design_system_mode.py +159 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/validate_data.py +114 -0
- package/LICENSE +21 -0
- package/README.md +199 -0
- package/bin/mafw.js +436 -0
- package/dist/hooks/bash-python-guide.d.ts +4 -0
- package/dist/hooks/bash-python-guide.d.ts.map +1 -0
- package/dist/hooks/bash-python-guide.js +67 -0
- package/dist/hooks/bash-python-guide.js.map +1 -0
- package/dist/hooks/handoff.d.ts +9 -0
- package/dist/hooks/handoff.d.ts.map +1 -0
- package/dist/hooks/handoff.js +8 -0
- package/dist/hooks/handoff.js.map +1 -0
- package/dist/hooks/hook-manager.d.ts +32 -0
- package/dist/hooks/hook-manager.d.ts.map +1 -0
- package/dist/hooks/hook-manager.js +91 -0
- package/dist/hooks/hook-manager.js.map +1 -0
- package/dist/hooks/llm-after.d.ts +8 -0
- package/dist/hooks/llm-after.d.ts.map +1 -0
- package/dist/hooks/llm-after.js +8 -0
- package/dist/hooks/llm-after.js.map +1 -0
- package/dist/hooks/media-ingest.d.ts +43 -0
- package/dist/hooks/media-ingest.d.ts.map +1 -0
- package/dist/hooks/media-ingest.js +269 -0
- package/dist/hooks/media-ingest.js.map +1 -0
- package/dist/hooks/memory-guide.d.ts +3 -0
- package/dist/hooks/memory-guide.d.ts.map +1 -0
- package/dist/hooks/memory-guide.js +47 -0
- package/dist/hooks/memory-guide.js.map +1 -0
- package/dist/hooks/observation-capture.d.ts +17 -0
- package/dist/hooks/observation-capture.d.ts.map +1 -0
- package/dist/hooks/observation-capture.js +20 -0
- package/dist/hooks/observation-capture.js.map +1 -0
- package/dist/hooks/session-compacting.d.ts +6 -0
- package/dist/hooks/session-compacting.d.ts.map +1 -0
- package/dist/hooks/session-compacting.js +6 -0
- package/dist/hooks/session-compacting.js.map +1 -0
- package/dist/hooks/session-ending.d.ts +20 -0
- package/dist/hooks/session-ending.d.ts.map +1 -0
- package/dist/hooks/session-ending.js +113 -0
- package/dist/hooks/session-ending.js.map +1 -0
- package/dist/hooks/session-recall.d.ts +2 -0
- package/dist/hooks/session-recall.d.ts.map +1 -0
- package/dist/hooks/session-recall.js +103 -0
- package/dist/hooks/session-recall.js.map +1 -0
- package/dist/hooks/session-start.d.ts +9 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +42 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/hooks/tool-before.d.ts +10 -0
- package/dist/hooks/tool-before.d.ts.map +1 -0
- package/dist/hooks/tool-before.js +6 -0
- package/dist/hooks/tool-before.js.map +1 -0
- package/dist/hooks/tool-executed.d.ts +19 -0
- package/dist/hooks/tool-executed.d.ts.map +1 -0
- package/dist/hooks/tool-executed.js +12 -0
- package/dist/hooks/tool-executed.js.map +1 -0
- package/dist/hooks/user-profile.d.ts +2 -0
- package/dist/hooks/user-profile.d.ts.map +1 -0
- package/dist/hooks/user-profile.js +30 -0
- package/dist/hooks/user-profile.js.map +1 -0
- package/dist/hooks/user-prompt.d.ts +9 -0
- package/dist/hooks/user-prompt.d.ts.map +1 -0
- package/dist/hooks/user-prompt.js +8 -0
- package/dist/hooks/user-prompt.js.map +1 -0
- package/dist/hooks/voice-guide.d.ts +8 -0
- package/dist/hooks/voice-guide.d.ts.map +1 -0
- package/dist/hooks/voice-guide.js +101 -0
- package/dist/hooks/voice-guide.js.map +1 -0
- package/dist/plugin.d.ts +55 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +342 -0
- package/dist/plugin.js.map +1 -0
- package/dist/tools/add-memory.d.ts +17 -0
- package/dist/tools/add-memory.d.ts.map +1 -0
- package/dist/tools/add-memory.js +60 -0
- package/dist/tools/add-memory.js.map +1 -0
- package/dist/tools/media-ask.d.ts +14 -0
- package/dist/tools/media-ask.d.ts.map +1 -0
- package/dist/tools/media-ask.js +224 -0
- package/dist/tools/media-ask.js.map +1 -0
- package/dist/tools/media-speak.d.ts +16 -0
- package/dist/tools/media-speak.d.ts.map +1 -0
- package/dist/tools/media-speak.js +78 -0
- package/dist/tools/media-speak.js.map +1 -0
- package/dist/tools/media-upload.d.ts +14 -0
- package/dist/tools/media-upload.d.ts.map +1 -0
- package/dist/tools/media-upload.js +155 -0
- package/dist/tools/media-upload.js.map +1 -0
- package/dist/tools/python-exec.d.ts +13 -0
- package/dist/tools/python-exec.d.ts.map +1 -0
- package/dist/tools/python-exec.js +99 -0
- package/dist/tools/python-exec.js.map +1 -0
- package/dist/tools/python-restart.d.ts +11 -0
- package/dist/tools/python-restart.d.ts.map +1 -0
- package/dist/tools/python-restart.js +33 -0
- package/dist/tools/python-restart.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +23 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +75 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/config-loader.d.ts +20 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +194 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/fallback.d.ts +7 -0
- package/dist/utils/fallback.d.ts.map +1 -0
- package/dist/utils/fallback.js +20 -0
- package/dist/utils/fallback.js.map +1 -0
- package/dist/utils/git.d.ts +24 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +71 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/github.d.ts +37 -0
- package/dist/utils/github.d.ts.map +1 -0
- package/dist/utils/github.js +53 -0
- package/dist/utils/github.js.map +1 -0
- package/dist/utils/global-path.d.ts +2 -0
- package/dist/utils/global-path.d.ts.map +1 -0
- package/dist/utils/global-path.js +32 -0
- package/dist/utils/global-path.js.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +69 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/obs-capture.d.ts +7 -0
- package/dist/utils/obs-capture.d.ts.map +1 -0
- package/dist/utils/obs-capture.js +49 -0
- package/dist/utils/obs-capture.js.map +1 -0
- package/dist/utils/retry.d.ts +11 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +45 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/self-wiring.d.ts +13 -0
- package/dist/utils/self-wiring.d.ts.map +1 -0
- package/dist/utils/self-wiring.js +86 -0
- package/dist/utils/self-wiring.js.map +1 -0
- package/dist/utils/state.d.ts +106 -0
- package/dist/utils/state.d.ts.map +1 -0
- package/dist/utils/state.js +166 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/status.d.ts +47 -0
- package/dist/utils/status.d.ts.map +1 -0
- package/dist/utils/status.js +147 -0
- package/dist/utils/status.js.map +1 -0
- package/dist/utils/ttl-map.d.ts +17 -0
- package/dist/utils/ttl-map.d.ts.map +1 -0
- package/dist/utils/ttl-map.js +67 -0
- package/dist/utils/ttl-map.js.map +1 -0
- package/gateway/dist/automation-engine.js +729 -0
- package/gateway/dist/chat/chat-sessions.js +95 -0
- package/gateway/dist/chat/graph-runner.js +76 -0
- package/gateway/dist/chat/index.js +7 -0
- package/gateway/dist/chat/intent-classifier.js +23 -0
- package/gateway/dist/config.js +416 -0
- package/gateway/dist/core/auth.js +96 -0
- package/gateway/dist/core/budget-guard.js +52 -0
- package/gateway/dist/core/compression/bm25-index.js +176 -0
- package/gateway/dist/core/compression/compression-pipeline.js +157 -0
- package/gateway/dist/core/compression/compression-strategy-selector.js +32 -0
- package/gateway/dist/core/compression/compression-verifier.js +79 -0
- package/gateway/dist/core/compression/diff-compressor.js +69 -0
- package/gateway/dist/core/compression/hybrid-compressor.js +104 -0
- package/gateway/dist/core/compression/lesson-compactor.js +114 -0
- package/gateway/dist/core/compression/memory-index.js +190 -0
- package/gateway/dist/core/compression/observation-classifier.js +41 -0
- package/gateway/dist/core/compression/observation-deduplicator.js +43 -0
- package/gateway/dist/core/compression/rrf-fusion.js +63 -0
- package/gateway/dist/core/compression/session-pruner.js +137 -0
- package/gateway/dist/core/compression/token-budget-allocator.js +141 -0
- package/gateway/dist/core/compression/vector-index.js +117 -0
- package/gateway/dist/core/compression/zero-token-compressor.js +80 -0
- package/gateway/dist/core/cost/cognitive-router.js +41 -0
- package/gateway/dist/core/cost/cost-estimator.js +63 -0
- package/gateway/dist/core/cost/types.js +19 -0
- package/gateway/dist/core/engine/degradation.js +159 -0
- package/gateway/dist/core/engine/goal-worktree-manager.js +131 -0
- package/gateway/dist/core/engine/lesson-manager.js +222 -0
- package/gateway/dist/core/engine/optimistic-sync.js +100 -0
- package/gateway/dist/core/engine/phase-orchestrator.js +153 -0
- package/gateway/dist/core/engine/report-generator.js +131 -0
- package/gateway/dist/core/engine/state-lock.js +91 -0
- package/gateway/dist/core/engine/task-branch-manager.js +102 -0
- package/gateway/dist/core/engine/wave-dependency.js +67 -0
- package/gateway/dist/core/engine/wave-executor.js +112 -0
- package/gateway/dist/core/goal-budget.js +63 -0
- package/gateway/dist/core/graph/entity-extractor.js +53 -0
- package/gateway/dist/core/graph/graph-searcher.js +120 -0
- package/gateway/dist/core/graph/knowledge-graph-manager.js +138 -0
- package/gateway/dist/core/graph/relation-inferencer.js +67 -0
- package/gateway/dist/core/graph/types.js +2 -0
- package/gateway/dist/core/hooks/handoff.js +7 -0
- package/gateway/dist/core/hooks/hook-manager.js +91 -0
- package/gateway/dist/core/hooks/llm-after.js +7 -0
- package/gateway/dist/core/hooks/observation-capture.js +19 -0
- package/gateway/dist/core/hooks/session-compacting.js +5 -0
- package/gateway/dist/core/hooks/session-ending.js +123 -0
- package/gateway/dist/core/hooks/session-start.js +51 -0
- package/gateway/dist/core/hooks/tool-before.js +5 -0
- package/gateway/dist/core/hooks/tool-executed.js +11 -0
- package/gateway/dist/core/hooks/user-prompt.js +7 -0
- package/gateway/dist/core/index.js +119 -0
- package/gateway/dist/core/langchain/agent-adapter.js +39 -0
- package/gateway/dist/core/langchain/index.js +12 -0
- package/gateway/dist/core/langchain/memory.js +35 -0
- package/gateway/dist/core/langchain/node-runner.js +115 -0
- package/gateway/dist/core/langchain/retriever.js +28 -0
- package/gateway/dist/core/langgraph/checkpointer.js +200 -0
- package/gateway/dist/core/langgraph/graph.js +57 -0
- package/gateway/dist/core/langgraph/index.js +25 -0
- package/gateway/dist/core/langgraph/loop-state.js +71 -0
- package/gateway/dist/core/langgraph/nodes/archive.node.js +27 -0
- package/gateway/dist/core/langgraph/nodes/execute.node.js +5 -0
- package/gateway/dist/core/langgraph/nodes/plan.node.js +101 -0
- package/gateway/dist/core/langgraph/nodes/review.node.js +89 -0
- package/gateway/dist/core/langgraph/nodes/sync.node.js +70 -0
- package/gateway/dist/core/langgraph/review-parser.js +35 -0
- package/gateway/dist/core/langgraph/signature-detector.js +23 -0
- package/gateway/dist/core/manager/goal-snapshot.js +73 -0
- package/gateway/dist/core/manager/milestone-push.js +81 -0
- package/gateway/dist/core/manager/question-ledger.js +121 -0
- package/gateway/dist/core/manager/system-rule-templates.js +76 -0
- package/gateway/dist/core/mcp/tools.js +562 -0
- package/gateway/dist/core/mcp/validator.js +165 -0
- package/gateway/dist/core/mcp-server.js +86 -0
- package/gateway/dist/core/memory/abstraction-distiller.js +44 -0
- package/gateway/dist/core/memory/cognitive-graph.js +103 -0
- package/gateway/dist/core/memory/energy-system.js +69 -0
- package/gateway/dist/core/memory/extractor.js +164 -0
- package/gateway/dist/core/memory/harmonic-index.js +530 -0
- package/gateway/dist/core/memory/harmonic-types.js +6 -0
- package/gateway/dist/core/memory/injector.js +111 -0
- package/gateway/dist/core/memory/l5-store.js +141 -0
- package/gateway/dist/core/memory/matcher.js +66 -0
- package/gateway/dist/core/memory/merger.js +95 -0
- package/gateway/dist/core/memory/migrate-v6.1.js +133 -0
- package/gateway/dist/core/memory/minhash-merger.js +195 -0
- package/gateway/dist/core/memory/observation-service.js +87 -0
- package/gateway/dist/core/memory/privacy-filter.js +163 -0
- package/gateway/dist/core/memory/reranker.js +208 -0
- package/gateway/dist/core/memory/review-scheduler.js +100 -0
- package/gateway/dist/core/memory/salience-perceptor.js +24 -0
- package/gateway/dist/core/memory/store.js +284 -0
- package/gateway/dist/core/memory/t1-store.js +183 -0
- package/gateway/dist/core/memory/t1-to-t2-compressor.js +119 -0
- package/gateway/dist/core/memory/validator.js +66 -0
- package/gateway/dist/core/plugin.js +902 -0
- package/gateway/dist/core/skills/mafw-execute/entry.js +226 -0
- package/gateway/dist/core/skills/mafw-goal/entry.js +203 -0
- package/gateway/dist/core/skills/mafw-plan/entry.js +184 -0
- package/gateway/dist/core/skills/mafw-review/entry.js +200 -0
- package/gateway/dist/core/storage/file-storage.js +120 -0
- package/gateway/dist/core/storage/sqlite-storage.js +205 -0
- package/gateway/dist/core/storage/types.js +2 -0
- package/gateway/dist/core/tools/archive-worktree.js +208 -0
- package/gateway/dist/core/tools/remote-cli.js +106 -0
- package/gateway/dist/core/tools/run-ask-user.js +79 -0
- package/gateway/dist/core/tools/run-execute-wave.js +32 -0
- package/gateway/dist/core/tools/run-plan.js +42 -0
- package/gateway/dist/core/tools/run-record-feedback.js +55 -0
- package/gateway/dist/core/tools/run-review.js +46 -0
- package/gateway/dist/core/tools/write-lesson.js +97 -0
- package/gateway/dist/core/utils/circuit-breaker.js +74 -0
- package/gateway/dist/core/utils/config-loader.js +203 -0
- package/gateway/dist/core/utils/fallback.js +19 -0
- package/gateway/dist/core/utils/git.js +70 -0
- package/gateway/dist/core/utils/github.js +52 -0
- package/gateway/dist/core/utils/global-path.js +41 -0
- package/gateway/dist/core/utils/logger.js +71 -0
- package/gateway/dist/core/utils/retry.js +44 -0
- package/gateway/dist/core/utils/state.js +175 -0
- package/gateway/dist/core/utils/status.js +156 -0
- package/gateway/dist/cost/service.js +17 -0
- package/gateway/dist/dashboard/api.js +1156 -0
- package/gateway/dist/dashboard/public/assets/index-DOXm39dm.css +1 -0
- package/gateway/dist/dashboard/public/index.html +13 -0
- package/gateway/dist/dashboard/server.js +140 -0
- package/gateway/dist/dashboard/types.js +2 -0
- package/gateway/dist/desktop-client.js +124 -0
- package/gateway/dist/eval-endpoint.js +219 -0
- package/gateway/dist/event-bus.js +7 -0
- package/gateway/dist/feedback/anchor-promotion.js +99 -0
- package/gateway/dist/feedback/deferred-memory.js +13 -0
- package/gateway/dist/feedback/miss-attribution.js +20 -0
- package/gateway/dist/graph/anchor-graph-store.js +113 -0
- package/gateway/dist/graph/anchor-graph.js +48 -0
- package/gateway/dist/health.js +53 -0
- package/gateway/dist/heartbeat.js +109 -0
- package/gateway/dist/index.js +6377 -0
- package/gateway/dist/interceptors/memory-injector.js +79 -0
- package/gateway/dist/ledger.js +121 -0
- package/gateway/dist/loop-monitor.js +74 -0
- package/gateway/dist/mcp/handlers/add-memory.js +113 -0
- package/gateway/dist/mcp/handlers/ask-user.js +63 -0
- package/gateway/dist/mcp/handlers/commit-heuristic.js +19 -0
- package/gateway/dist/mcp/handlers/create-goal.js +83 -0
- package/gateway/dist/mcp/handlers/desktop-click.js +18 -0
- package/gateway/dist/mcp/handlers/desktop-get-state.js +15 -0
- package/gateway/dist/mcp/handlers/desktop-navigate.js +18 -0
- package/gateway/dist/mcp/handlers/desktop-screenshot.js +16 -0
- package/gateway/dist/mcp/handlers/desktop-scroll.js +19 -0
- package/gateway/dist/mcp/handlers/desktop-type.js +19 -0
- package/gateway/dist/mcp/handlers/draft-automation-rule.js +45 -0
- package/gateway/dist/mcp/handlers/get-automation-history.js +15 -0
- package/gateway/dist/mcp/handlers/get-automation-rule.js +26 -0
- package/gateway/dist/mcp/handlers/get-axioms.js +14 -0
- package/gateway/dist/mcp/handlers/get-deltas.js +77 -0
- package/gateway/dist/mcp/handlers/get-memory.js +67 -0
- package/gateway/dist/mcp/handlers/get-model-route.js +16 -0
- package/gateway/dist/mcp/handlers/get-triage-item.js +17 -0
- package/gateway/dist/mcp/handlers/list-automation-rules.js +24 -0
- package/gateway/dist/mcp/handlers/list-triage-items.js +14 -0
- package/gateway/dist/mcp/handlers/load-state.js +54 -0
- package/gateway/dist/mcp/handlers/manager-answer-question.js +67 -0
- package/gateway/dist/mcp/handlers/manager-cancel-goal.js +58 -0
- package/gateway/dist/mcp/handlers/manager-get-evidence.js +57 -0
- package/gateway/dist/mcp/handlers/manager-get-goal-status.js +58 -0
- package/gateway/dist/mcp/handlers/manager-list-goals.js +60 -0
- package/gateway/dist/mcp/handlers/manager-list-pending-questions.js +67 -0
- package/gateway/dist/mcp/handlers/manager-set-goal.js +78 -0
- package/gateway/dist/mcp/handlers/merge-memory.js +184 -0
- package/gateway/dist/mcp/handlers/pin-memory.js +53 -0
- package/gateway/dist/mcp/handlers/propose-triage-decision.js +38 -0
- package/gateway/dist/mcp/handlers/record-feedback.js +59 -0
- package/gateway/dist/mcp/handlers/resolve-merge.js +92 -0
- package/gateway/dist/mcp/handlers/restart-agent.js +22 -0
- package/gateway/dist/mcp/handlers/run-automation.js +28 -0
- package/gateway/dist/mcp/handlers/search-hybrid.js +181 -0
- package/gateway/dist/mcp/handlers/supersede-memory.js +47 -0
- package/gateway/dist/mcp/handlers/update-state.js +59 -0
- package/gateway/dist/mcp/handlers/validate-rule.js +39 -0
- package/gateway/dist/mcp/sse-transport.js +97 -0
- package/gateway/dist/mcp/streamable-endpoint.js +98 -0
- package/gateway/dist/mcp/tool-registry.js +630 -0
- package/gateway/dist/media/media-agent.js +755 -0
- package/gateway/dist/media/media-plugin-loader.js +254 -0
- package/gateway/dist/media/media-runtime-executor.js +227 -0
- package/gateway/dist/media/media-service.js +199 -0
- package/gateway/dist/media/pi-adapter.js +159 -0
- package/gateway/dist/media/plugin-context.js +14 -0
- package/gateway/dist/media/tts-service.js +173 -0
- package/gateway/dist/memory/abstraction-matcher.js +28 -0
- package/gateway/dist/memory/consolidation-service.js +209 -0
- package/gateway/dist/memory/derived-terms.js +50 -0
- package/gateway/dist/memory/embedding-provider.js +330 -0
- package/gateway/dist/memory/embedding-runtime.js +174 -0
- package/gateway/dist/memory/event-log.js +84 -0
- package/gateway/dist/memory/gateway-db.js +465 -0
- package/gateway/dist/memory/harmonic-file-store.js +338 -0
- package/gateway/dist/memory/llamacpp-provider.js +370 -0
- package/gateway/dist/memory/okf-index-renderer.js +61 -0
- package/gateway/dist/memory/okf-migrator.js +71 -0
- package/gateway/dist/memory/okf-parser.js +57 -0
- package/gateway/dist/memory/okf-writer.js +107 -0
- package/gateway/dist/memory/service.js +81 -0
- package/gateway/dist/memory/t1-db.js +139 -0
- package/gateway/dist/memory/unmerge-cleanup.js +82 -0
- package/gateway/dist/memory/vector-store.js +246 -0
- package/gateway/dist/memory/write-queue.js +31 -0
- package/gateway/dist/metrics/collector.js +28 -0
- package/gateway/dist/mobile/device-store.js +123 -0
- package/gateway/dist/mobile/mdns-advertiser.js +55 -0
- package/gateway/dist/mobile/media-proxy.js +292 -0
- package/gateway/dist/mobile/pairing.js +139 -0
- package/gateway/dist/mobile/push-gateway.js +126 -0
- package/gateway/dist/mobile/tts-artifact.js +43 -0
- package/gateway/dist/opencode-adapter.js +241 -0
- package/gateway/dist/orchestration/outcome-recorder.js +218 -0
- package/gateway/dist/orchestration/policy.js +57 -0
- package/gateway/dist/orchestration/registry.js +47 -0
- package/gateway/dist/plugins/hub.js +188 -0
- package/gateway/dist/poll.js +110 -0
- package/gateway/dist/python/kernel-service.js +762 -0
- package/gateway/dist/recall/constraints-migrate.js +108 -0
- package/gateway/dist/recall/data-dir-migrate.js +120 -0
- package/gateway/dist/recall/gateway-db-migrate.js +134 -0
- package/gateway/dist/recall/index-scan.js +437 -0
- package/gateway/dist/recall/inject-format.js +222 -0
- package/gateway/dist/recall/legacy-t1-archive.js +86 -0
- package/gateway/dist/recall/memory-worker.js +128 -0
- package/gateway/dist/recall/pipeline-rules.js +76 -0
- package/gateway/dist/recall/recall-context.js +297 -0
- package/gateway/dist/recall/reflect-cursor.js +50 -0
- package/gateway/dist/recall/reflection.js +318 -0
- package/gateway/dist/recall/session-worker-pool.js +100 -0
- package/gateway/dist/recall/stale-verify.js +72 -0
- package/gateway/dist/recall/step-inject.js +173 -0
- package/gateway/dist/recall/time-anchor.js +143 -0
- package/gateway/dist/recall/ttl-map.js +72 -0
- package/gateway/dist/recall/turn-completion.js +44 -0
- package/gateway/dist/recall/turn-pipeline.js +150 -0
- package/gateway/dist/recovery.js +158 -0
- package/gateway/dist/resources/sdk-session.js +202 -0
- package/gateway/dist/retrieval/guided-retriever.js +131 -0
- package/gateway/dist/retrieval/idf-stats.js +31 -0
- package/gateway/dist/routes/embedding-config.js +100 -0
- package/gateway/dist/routes/goal-sessions.js +45 -0
- package/gateway/dist/routes/manager-rotate.js +55 -0
- package/gateway/dist/routes/media-switch.js +78 -0
- package/gateway/dist/routes/model-config.js +132 -0
- package/gateway/dist/routes/note-board.js +51 -0
- package/gateway/dist/routes/permission.js +43 -0
- package/gateway/dist/routes/pinned-recall.js +36 -0
- package/gateway/dist/routes/plugins.js +77 -0
- package/gateway/dist/routes/restart-agent.js +28 -0
- package/gateway/dist/routes/runtime-switch.js +80 -0
- package/gateway/dist/routes/session-branch.js +63 -0
- package/gateway/dist/routes/session-mutations.js +58 -0
- package/gateway/dist/routes/session-summarize.js +49 -0
- package/gateway/dist/routes/usage-plugins.js +251 -0
- package/gateway/dist/runtime/agent-definition.js +2 -0
- package/gateway/dist/runtime/auth.js +80 -0
- package/gateway/dist/runtime/completion-http.js +97 -0
- package/gateway/dist/runtime/contract.js +37 -0
- package/gateway/dist/runtime/loader.js +240 -0
- package/gateway/dist/runtime/normalize.js +59 -0
- package/gateway/dist/runtime/opencode-runtime.js +336 -0
- package/gateway/dist/runtime/pi/pi-agent-config.js +294 -0
- package/gateway/dist/runtime/pi/pi-approval-bridge.js +44 -0
- package/gateway/dist/runtime/pi/pi-approval-extension.js +62 -0
- package/gateway/dist/runtime/pi/pi-events.js +122 -0
- package/gateway/dist/runtime/pi/pi-messages.js +20 -0
- package/gateway/dist/runtime/pi/pi-provider.js +19 -0
- package/gateway/dist/runtime/pi/pi-session-storage.js +44 -0
- package/gateway/dist/runtime/pi/pi-session.js +328 -0
- package/gateway/dist/runtime/plugins/pi-runtime.js +285 -0
- package/gateway/dist/runtime/serve-for-runtime.js +22 -0
- package/gateway/dist/runtime/serve-sidecar.js +164 -0
- package/gateway/dist/runtime/serve-supervisor.js +80 -0
- package/gateway/dist/self-update.js +309 -0
- package/gateway/dist/skills/manager-agent-config.js +37 -0
- package/gateway/dist/skills/manager-identity.js +11 -0
- package/gateway/dist/skills/memory-curator-agent.js +55 -0
- package/gateway/dist/trajectory/api.js +154 -0
- package/gateway/dist/trajectory/backfill-provider.js +41 -0
- package/gateway/dist/trajectory/collector.js +337 -0
- package/gateway/dist/trajectory/trajectory-store.js +336 -0
- package/gateway/dist/trajectory/types.js +17 -0
- package/gateway/dist/tray/index.js +131 -0
- package/gateway/dist/tray/tray.ps1 +96 -0
- package/gateway/dist/types.js +2 -0
- package/gateway/dist/usage/builtin-plugins/commandcode.js +71 -0
- package/gateway/dist/usage/builtin-plugins/deepseek.js +56 -0
- package/gateway/dist/usage/builtin-plugins/gateway.js +127 -0
- package/gateway/dist/usage/builtin-plugins/kimi-for-coding.js +93 -0
- package/gateway/dist/usage/builtin-plugins/kimi.js +48 -0
- package/gateway/dist/usage/builtin-plugins/opencode-go.js +54 -0
- package/gateway/dist/usage/builtin-plugins/openrouter.js +48 -0
- package/gateway/dist/usage/builtin-plugins/siliconflow-cn.js +49 -0
- package/gateway/dist/usage/builtin-plugins/zhipuai-coding-plan.js +44 -0
- package/gateway/dist/usage/model-prices.js +39 -0
- package/gateway/dist/usage/model-stats.js +21 -0
- package/gateway/dist/usage/plugin-context.js +79 -0
- package/gateway/dist/usage/plugin-loader.js +280 -0
- package/gateway/dist/usage/templates.js +227 -0
- package/gateway/dist/usage/types.js +2 -0
- package/gateway/dist/usage/usage-poller.js +216 -0
- package/gateway/package.json +37 -0
- package/package.json +78 -0
- package/packages/tui/dist/cli.js +4664 -0
package/README.md
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<img src="packages/desktop/icons/master/app-icon-1024.png" width="120" alt="MAFW — Mafu">
|
|
4
|
+
|
|
5
|
+
# MAFW
|
|
6
|
+
|
|
7
|
+
**Memory-Augmented Framework for Work**
|
|
8
|
+
|
|
9
|
+
会话结束、上下文压缩、模型更替之后——记忆依然存续的 AI Agent 工作平台
|
|
10
|
+
|
|
11
|
+
[](LICENSE)
|
|
12
|
+
[](https://www.npmjs.com/package/@jack200714/mafw)
|
|
13
|
+
[](https://github.com/Jackli-2022/mafw/actions/workflows/ci.yml)
|
|
14
|
+
[](https://github.com/Jackli-2022/mafw)
|
|
15
|
+
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 这是什么
|
|
21
|
+
|
|
22
|
+
MAFW 是一个以**谐波记忆(Harmonic Memory)**为核心的 AI Agent 工作平台。
|
|
23
|
+
它不再只是某个编辑器的插件,而是由四个部分组成的完整系统:
|
|
24
|
+
|
|
25
|
+
| 组件 | 形态 | 作用 |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| **Gateway** | 常驻进程(HTTP API :3000 + 事件流) | 记忆存取、Goal 编排、自动化引擎、全部业务中枢 |
|
|
28
|
+
| **Desktop** | Electron 应用 | 对话、Goal 管理、记忆看板、审批与自动化配置的完整 GUI |
|
|
29
|
+
| **TUI** | `mafw tui` 命令 | 终端全功能界面:Chat / Goals / Memory / Triage(markdown 渲染、鼠标点选) |
|
|
30
|
+
| **CLI** | `mafw` 命令 | Gateway 的启动、守护、诊断与运维 |
|
|
31
|
+
| **opencode 插件** | 可选接入 | 在 opencode 内获得记忆注入与 `mafw_*` 工具(其一入口,非必需) |
|
|
32
|
+
|
|
33
|
+
核心命题:**让 Agent 跨会话、跨上下文压缩、跨模型更替地记住你的偏好、决策与踩过的坑。**
|
|
34
|
+
|
|
35
|
+
## 核心特性
|
|
36
|
+
|
|
37
|
+
### 🧠 谐波记忆
|
|
38
|
+
|
|
39
|
+
- **统一 HarmonicUnit 模型**:episodic / semantic / procedural / global 四类,层级只是标签,检索无视类型
|
|
40
|
+
- **OKF 存储**(Open Knowledge Format):每条记忆一个 Markdown 文件(frontmatter + 正文),人可直接阅读编辑;索引是纯可推导产物,丢了可重建
|
|
41
|
+
- **BM25 检索**:`primary_abstraction` + `cue_anchors` 上的倒排检索 × 能量 × 显著度,1000 条记忆 ~2-3ms
|
|
42
|
+
- **能量系统**:检索/反馈加成、按天衰减(显著度越高衰减越慢),重要的事自然浮起,琐碎的事自然沉底
|
|
43
|
+
- **MinHash 合并**:跨层相似记忆自动 soft-supersede 合并,历史版本可追溯
|
|
44
|
+
- **Pinned 披露层 + Sticky 便签板**:身份画像每轮必见,"记下来"类提醒限时必达
|
|
45
|
+
- **主动记忆引导**(OptMem 式):Agent 自主决定何时写入、何时检索,而非被动灌注
|
|
46
|
+
- **环境探测式维护**:记忆 curator 写入前用只读工具验证候选记忆(propose–probe–commit),
|
|
47
|
+
每周自动重验高价值记忆、被环境证伪的走 supersedes 链更新——能量衰减管"淡忘",探测验证管"内容有效性"
|
|
48
|
+
|
|
49
|
+
### 🤖 Goal 编排
|
|
50
|
+
|
|
51
|
+
- **Manager Agent**:拆解目标 → plan / execute / review 循环,里程碑自动推送;创建即计划评审门(review-then-run)
|
|
52
|
+
- **回合预算**:goal 可设 `maxTurns` / `maxCostUsd`,超限自动硬停(BudgetGuard)
|
|
53
|
+
- **每轮目标快照**注入,compaction 免疫;`/btw` 支线问答不污染主线
|
|
54
|
+
- **演化观测**(RSI Phase 1):goal 结果、会话映射、失败签名全量落库,为策略演化铺路
|
|
55
|
+
|
|
56
|
+
### 🖥️ Desktop 应用
|
|
57
|
+
|
|
58
|
+
Rail 侧边栏 + TabStrip 布局:`chat / goals / memory / approvals / triage / automation / notes` 全功能 GUI,
|
|
59
|
+
右 Dock 内置上下文用量、分模型成本统计与配额窗口,15s 轮询实时刷新。
|
|
60
|
+
|
|
61
|
+
v1.20 交互面:**steering**(忙碌回合排队续发)、会话分支(fork / revert / unrevert)、全局命令面板(Ctrl+P)、
|
|
62
|
+
每会话审批模式(manual / auto + 预算上限)、系统托盘与 OS 通知、会话导出 Markdown、@file 文件提及、
|
|
63
|
+
transcript 搜索(Ctrl+F);UI 工具卡插件系统支持 `.js` 文件自定义工具执行卡(v2:依赖声明 + 流式渲染)。
|
|
64
|
+
|
|
65
|
+
### 🎬 媒体理解
|
|
66
|
+
|
|
67
|
+
图片 / 视频 / 音频经 A2A 协议接入 Media Agent,主模型原生多模态分析(非文本描述转述),
|
|
68
|
+
每模态可独立配置引擎与模型,支持插件扩展。
|
|
69
|
+
|
|
70
|
+
### 🐍 持久 Python 内核
|
|
71
|
+
|
|
72
|
+
会话级 Jupyter kernel(ZeroMQ wire 协议),变量与导入跨工具调用保持,matplotlib 出图直接回传。
|
|
73
|
+
|
|
74
|
+
### ⚙️ 自动化引擎
|
|
75
|
+
|
|
76
|
+
Cron 规则驱动:记忆衰减、回合聚合压缩(每小时)、反思管线、stale 记忆重验(每周);triage 队列让关键决定仍由你确认。
|
|
77
|
+
|
|
78
|
+
### 🔌 Runtime 能力契约
|
|
79
|
+
|
|
80
|
+
Gateway 与 Agent runtime 之间是能力自声明契约(Tier 0-2):内置 opencode runtime、pi runtime 插件、
|
|
81
|
+
external 托管模式可热切换,无需重启。契约能力面覆盖会话分支(fork / revert)、回合预算、
|
|
82
|
+
结果信封(usage / finish)、三值审批回复(once / always / reject)、原生 question 通道等。
|
|
83
|
+
|
|
84
|
+
## 基准
|
|
85
|
+
|
|
86
|
+
LongMemEval-S(session 粒度,谐波记忆管线):
|
|
87
|
+
|
|
88
|
+
| 指标 | 早期 | 当前 |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| L1 检索 Recall@10 | 47.4% | **94.9%** |
|
|
91
|
+
| L1 Recall@1 | 5.8% | **58.6%** |
|
|
92
|
+
| L2 端到端 QA 准确率 | 16.7% | **66.7%** |
|
|
93
|
+
|
|
94
|
+
评测代码:`evaluation/longmemeval/`(数据隔离,不污染真实记忆库)。
|
|
95
|
+
|
|
96
|
+
## 架构
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
Desktop (Electron) CLI (mafw) opencode 插件
|
|
100
|
+
│ │ │
|
|
101
|
+
└───────────── HTTP :3000 / SSE ───────┘
|
|
102
|
+
│
|
|
103
|
+
┌──────┴───────┐
|
|
104
|
+
│ Gateway │
|
|
105
|
+
└──────┬───────┘
|
|
106
|
+
┌──────────┬──────┴──────┬───────────┐
|
|
107
|
+
谐波记忆系统 Goal 编排引擎 自动化引擎 媒体/内核/用量
|
|
108
|
+
OKF + 索引 manager/plan/ cron 规则 A2A · Jupyter
|
|
109
|
+
能量·合并 execute/review 衰减·压缩 provider 插件
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
数据根目录 `~/.mafw/`:记忆 OKF 文件、统一数据库、日志、配置覆盖。
|
|
113
|
+
|
|
114
|
+
## 快速开始
|
|
115
|
+
|
|
116
|
+
### 1. 启动 Gateway
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
npm install -g @jack200714/mafw
|
|
120
|
+
|
|
121
|
+
mafw start # 前台启动
|
|
122
|
+
mafw daemon # 后台守护
|
|
123
|
+
mafw status # 查看状态
|
|
124
|
+
mafw tui # 终端界面(Chat / Goals / Memory / Triage)
|
|
125
|
+
mafw dashboard # 打开 Web Dashboard
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 2. 桌面应用
|
|
129
|
+
|
|
130
|
+
安装包内置 Gateway,开箱即用(无需先装 npm 包)。下载:
|
|
131
|
+
[GitHub Releases 最新版](https://github.com/Jackli-2022/mafw/releases/latest)
|
|
132
|
+
|
|
133
|
+
| 平台 | 安装包 |
|
|
134
|
+
|---|---|
|
|
135
|
+
| Windows | `mafw-desktop-win-x64.exe`(nsis,未签名) |
|
|
136
|
+
| Linux | `AppImage`(需 `chmod +x`)/ `.deb` / `.rpm` |
|
|
137
|
+
|
|
138
|
+
或从源码构建:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
git clone https://github.com/Jackli-2022/mafw
|
|
142
|
+
cd mafw && npm install # npm workspaces
|
|
143
|
+
cd packages/desktop
|
|
144
|
+
npx electron-vite build
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 3. opencode 接入(可选)
|
|
148
|
+
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"plugin": ["@jack200714/mafw"],
|
|
152
|
+
"mcp": { "mafw": { "type": "remote", "url": "http://127.0.0.1:3000/mcp", "enabled": true } }
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
插件激活时自动补写缺失的 MCP 接线并备份原配置(fail-open)。
|
|
157
|
+
|
|
158
|
+
## 仓库结构
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
packages/desktop/ Electron 桌面应用(main / preload / renderer)
|
|
162
|
+
packages/tui/ 终端界面(pi-tui)
|
|
163
|
+
gateway/ Gateway 核心(HTTP API、记忆、编排、自动化、媒体、内核)
|
|
164
|
+
src/ opencode 插件(hooks / tools / MCP 自接线)
|
|
165
|
+
.github/workflows/ CI:双 OS 验证;tag v* 自动出桌面安装包(draft release)
|
|
166
|
+
evaluation/longmemeval/ LongMemEval 记忆基准
|
|
167
|
+
docs/ 设计文档与实施计划
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 文档
|
|
171
|
+
|
|
172
|
+
| 文档 | 位置 |
|
|
173
|
+
|---|---|
|
|
174
|
+
| 架构总览(AGENTS.md) | `AGENTS.md` |
|
|
175
|
+
| Gateway 架构 | `docs/architecture/gateway.md` |
|
|
176
|
+
| Plugin 架构 | `docs/architecture/plugin.md` |
|
|
177
|
+
| 谐波记忆 v6.3 | `docs/superpowers/specs/2026-07-02-v6.3-harmonic-memory-m1-m3.md` |
|
|
178
|
+
| OKF 存储迁移 v6.8 | `docs/superpowers/specs/2026-07-16-okf-migration-design.md` |
|
|
179
|
+
| Desktop 图标(茉芙/Mafu) | `docs/superpowers/specs/2026-09-10-desktop-icon-design.md` |
|
|
180
|
+
| 记忆基准 | `evaluation/README.md` |
|
|
181
|
+
|
|
182
|
+
## 声明
|
|
183
|
+
|
|
184
|
+
MAFW Desktop 应用图标「茉芙 / Mafu」由 AI 辅助生成(智谱 CogView-4)并经人工后处理。
|
|
185
|
+
|
|
186
|
+
## 参考与致谢
|
|
187
|
+
|
|
188
|
+
MAFW 的设计站在这些项目与研究的肩膀上:
|
|
189
|
+
|
|
190
|
+
| 参考 | 与 MAFW 的关系 |
|
|
191
|
+
|---|---|
|
|
192
|
+
| [opencode](https://github.com/sst/opencode) | 插件宿主平台;Desktop 端(`packages/desktop`)源自其桌面架构并深度改造(MAFW Rail/Tabs/Config、gateway sidecar 等) |
|
|
193
|
+
| [Memora](https://arxiv.org/abs/2602.03315)(Microsoft M365 Research, ICML 2026) | 谐波记忆系统的架构参照:`primary_abstraction` / `cue_anchors` / `memory_value` 三元数据模型与其同构;embedding 相似度合并 + LLM UPDATE/CREATE 裁判(ConsolidationService)采用其方案;其 LongMemEval-S 87.4% SOTA 是本项目记忆管线设计的方向验证 |
|
|
194
|
+
| [Grounding Agent Memory](https://arxiv.org/abs/2609.11060)(Microsoft, 2026) | 环境探测式记忆维护(Environment-Probing Curation)的方案来源:post-task curator 以最小权限只读工具在写入前验证候选记忆(propose–probe–commit)、定期重验并刷新 stale 条目;其 CLBench/APEX 实验证明该机制同时提升正确率并降低 task-agent 成本 |
|
|
195
|
+
| OKF(Open Knowledge Format) | 记忆存储层:Markdown + frontmatter、每记忆一文件,索引视为纯可推导产物;设计见 `docs/superpowers/specs/2026-07-16-okf-migration-design.md` |
|
|
196
|
+
|
|
197
|
+
## 许可
|
|
198
|
+
|
|
199
|
+
MIT
|
package/bin/mafw.js
ADDED
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { spawn, execSync } = require('child_process');
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const http = require('http');
|
|
7
|
+
const os = require('os');
|
|
8
|
+
|
|
9
|
+
const pkg = require('../package.json');
|
|
10
|
+
const CONFIG_DIR = path.join(os.homedir(), '.config', 'mafw');
|
|
11
|
+
const PID_FILE = path.join(CONFIG_DIR, 'gateway.pid');
|
|
12
|
+
const LOG_DIR = path.join(os.homedir(), '.mafw', 'logs');
|
|
13
|
+
const LOG_FILE = path.join(LOG_DIR, 'mafw.log');
|
|
14
|
+
const GATEWAY_SCRIPT = path.resolve(__dirname, '..', 'gateway', 'dist', 'index.js');
|
|
15
|
+
const GATEWAY_PORT = process.env.MAFW_GATEWAY_PORT || process.env.MAFW_SERVER_API_PORT || '3000';
|
|
16
|
+
const GATEWAY_URL = process.env.MAFW_GATEWAY_URL || `http://localhost:${GATEWAY_PORT}`;
|
|
17
|
+
|
|
18
|
+
const USAGE = `
|
|
19
|
+
MAFW CLI v${pkg.version}
|
|
20
|
+
|
|
21
|
+
Usage: mafw <command> [options]
|
|
22
|
+
|
|
23
|
+
Process Commands:
|
|
24
|
+
start Start Gateway in foreground
|
|
25
|
+
daemon Start Gateway in background (detached)
|
|
26
|
+
stop Stop running Gateway
|
|
27
|
+
status Show Gateway status (PID / health)
|
|
28
|
+
restart Restart Gateway
|
|
29
|
+
logs Show recent logs (last 50 lines)
|
|
30
|
+
|
|
31
|
+
API Commands:
|
|
32
|
+
health Gateway health check (GET /health)
|
|
33
|
+
stats Gateway statistics (GET /api/stats)
|
|
34
|
+
restart-agent Restart the agent serve process (POST /api/runtime/restart-agent)
|
|
35
|
+
projects List registered projects (GET /api/projects)
|
|
36
|
+
goals List active goals (GET /api/goals)
|
|
37
|
+
register <dir> Register a project (POST /register)
|
|
38
|
+
sessions List sessions (GET /api/sessions)
|
|
39
|
+
control <action> <goalId> Control goal (pause|abort|force-phase)
|
|
40
|
+
memory-search <query> Memory context injection (GET /api/memory/merged-search)
|
|
41
|
+
automations List automation rules (GET /api/automations)
|
|
42
|
+
approvals List pending approvals (GET /api/approvals)
|
|
43
|
+
triage List triage items (GET /api/triage)
|
|
44
|
+
|
|
45
|
+
Service Commands:
|
|
46
|
+
service-register Register as OS-level auto-start service
|
|
47
|
+
service-unregister Unregister OS-level service
|
|
48
|
+
|
|
49
|
+
Utility Commands:
|
|
50
|
+
config Show gateway config
|
|
51
|
+
dashboard Open Dashboard in browser
|
|
52
|
+
tui Open terminal UI (chat + goals/memory/triage)
|
|
53
|
+
uninstall Uninstall instructions
|
|
54
|
+
version Show version
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
const COMMANDS = [
|
|
58
|
+
'start', 'daemon', 'stop', 'status', 'restart', 'logs',
|
|
59
|
+
'health', 'stats', 'projects', 'goals', 'register',
|
|
60
|
+
'sessions', 'control', 'memory-search',
|
|
61
|
+
'automations', 'approvals', 'triage', 'restart-agent',
|
|
62
|
+
'service-register', 'service-unregister',
|
|
63
|
+
'config', 'dashboard', 'uninstall', 'version', 'update', 'tui',
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
function httpRequest(method, urlPath, body) {
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
const url = new URL(urlPath, GATEWAY_URL);
|
|
69
|
+
const opts = {
|
|
70
|
+
hostname: url.hostname,
|
|
71
|
+
port: url.port,
|
|
72
|
+
path: url.pathname + url.search,
|
|
73
|
+
method,
|
|
74
|
+
headers: { 'Content-Type': 'application/json' },
|
|
75
|
+
timeout: 10000,
|
|
76
|
+
};
|
|
77
|
+
const req = http.request(opts, (res) => {
|
|
78
|
+
let data = '';
|
|
79
|
+
res.on('data', (chunk) => data += chunk);
|
|
80
|
+
res.on('end', () => {
|
|
81
|
+
try {
|
|
82
|
+
resolve({ status: res.statusCode, body: JSON.parse(data) });
|
|
83
|
+
} catch {
|
|
84
|
+
resolve({ status: res.statusCode, body: data });
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
req.on('error', (err) => reject(err));
|
|
89
|
+
req.on('timeout', () => { req.destroy(); reject(new Error('Request timeout')); });
|
|
90
|
+
if (body) req.write(JSON.stringify(body));
|
|
91
|
+
req.end();
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function ensureDirs() {
|
|
96
|
+
if (!fs.existsSync(CONFIG_DIR)) fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
97
|
+
if (!fs.existsSync(LOG_DIR)) fs.mkdirSync(LOG_DIR, { recursive: true });
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function readPid() {
|
|
101
|
+
if (!fs.existsSync(PID_FILE)) return null;
|
|
102
|
+
return fs.readFileSync(PID_FILE, 'utf-8').trim();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function isRunning(pid) {
|
|
106
|
+
try { process.kill(Number(pid), 0); return true; }
|
|
107
|
+
catch { return false; }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function writePid(pid) { fs.writeFileSync(PID_FILE, String(pid)); }
|
|
111
|
+
function removePid() { try { fs.unlinkSync(PID_FILE); } catch {} }
|
|
112
|
+
|
|
113
|
+
function startGateway(background) {
|
|
114
|
+
ensureDirs();
|
|
115
|
+
const existingPid = readPid();
|
|
116
|
+
if (existingPid && isRunning(existingPid)) {
|
|
117
|
+
console.log(`Gateway already running (PID: ${existingPid})`);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (existingPid) removePid();
|
|
121
|
+
|
|
122
|
+
if (!fs.existsSync(GATEWAY_SCRIPT)) {
|
|
123
|
+
console.error(`Gateway script not found: ${GATEWAY_SCRIPT}`);
|
|
124
|
+
console.error('Run: cd gateway && npm run build');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const child = spawn(process.execPath, [GATEWAY_SCRIPT], {
|
|
129
|
+
stdio: background ? ['ignore', 'pipe', 'pipe'] : 'inherit',
|
|
130
|
+
detached: background,
|
|
131
|
+
windowsHide: true,
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
writePid(child.pid);
|
|
135
|
+
|
|
136
|
+
if (background) {
|
|
137
|
+
// Diagnostics: capture stderr to a file (a detached gateway that crashes
|
|
138
|
+
// silently otherwise leaves no trace). stdout is discarded; the gateway's
|
|
139
|
+
// own file logging covers normal logs.
|
|
140
|
+
// NOTE: use a raw fd + writeSync — a fs.WriteStream here never ends, which
|
|
141
|
+
// keeps the parent's event loop alive so `mafw daemon` hangs (and any
|
|
142
|
+
// tree-kill then takes the detached gateway down with it).
|
|
143
|
+
const errLog = path.join(LOG_DIR, 'gateway-stderr.log');
|
|
144
|
+
try { if (!fs.existsSync(LOG_DIR)) fs.mkdirSync(LOG_DIR, { recursive: true }); } catch {}
|
|
145
|
+
const errFd = fs.openSync(errLog, 'a');
|
|
146
|
+
if (child.stderr) {
|
|
147
|
+
child.stderr.on('data', (chunk) => { try { fs.writeSync(errFd, chunk); } catch {} });
|
|
148
|
+
}
|
|
149
|
+
if (child.stdout) child.stdout.destroy();
|
|
150
|
+
child.unref();
|
|
151
|
+
console.log(`Gateway started in background (PID: ${child.pid})`);
|
|
152
|
+
console.log(`Logs: ${LOG_FILE}`);
|
|
153
|
+
} else {
|
|
154
|
+
console.log(`Gateway starting (PID: ${child.pid})`);
|
|
155
|
+
child.on('exit', (code) => { removePid(); process.exit(code); });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function stopGateway() {
|
|
160
|
+
const pid = readPid();
|
|
161
|
+
if (!pid) { console.log('Gateway not running'); return; }
|
|
162
|
+
if (!isRunning(pid)) {
|
|
163
|
+
console.log('Gateway not running (stale PID)');
|
|
164
|
+
removePid();
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
process.kill(Number(pid), 'SIGTERM');
|
|
169
|
+
console.log(`Gateway stopped (PID: ${pid})`);
|
|
170
|
+
} catch (err) {
|
|
171
|
+
console.error(`Failed to stop: ${err.message}`);
|
|
172
|
+
}
|
|
173
|
+
removePid();
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function showStatus() {
|
|
177
|
+
const pid = readPid();
|
|
178
|
+
if (!pid || !isRunning(pid)) {
|
|
179
|
+
console.log('Gateway: STOPPED');
|
|
180
|
+
if (pid) removePid();
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
console.log(`Gateway: RUNNING (PID: ${pid})`);
|
|
184
|
+
console.log(`URL: ${GATEWAY_URL}`);
|
|
185
|
+
console.log(`Logs: ${LOG_FILE}`);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function showLogs() {
|
|
189
|
+
if (!fs.existsSync(LOG_FILE)) {
|
|
190
|
+
console.log('No logs yet');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const lines = fs.readFileSync(LOG_FILE, 'utf-8').split(/\r?\n/);
|
|
194
|
+
const tail = lines.length > 50 ? lines.slice(-50) : lines;
|
|
195
|
+
console.log(tail.join('\n'));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
async function callApi(name, method, urlPath, body) {
|
|
199
|
+
try {
|
|
200
|
+
const res = await httpRequest(method || 'GET', urlPath, body);
|
|
201
|
+
if (res.status >= 400) {
|
|
202
|
+
console.error(`Error ${res.status}: ${typeof res.body === 'string' ? res.body : JSON.stringify(res.body)}`);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
console.log(JSON.stringify(res.body, null, 2));
|
|
206
|
+
} catch (err) {
|
|
207
|
+
console.error(`API call failed: ${err.message}`);
|
|
208
|
+
console.error(`Is the gateway running? Try: mafw start`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function registerService() {
|
|
213
|
+
ensureDirs();
|
|
214
|
+
const script = path.resolve(GATEWAY_SCRIPT);
|
|
215
|
+
const platform = process.platform;
|
|
216
|
+
if (platform === 'win32') {
|
|
217
|
+
const taskName = 'MAFW-Gateway';
|
|
218
|
+
const cmd = `schtasks /create /tn "${taskName}" /tr "node \\"${script}\\"" /sc onlogon /rl highest /f`;
|
|
219
|
+
try { execSync(cmd, { stdio: 'inherit' }); console.log(`Scheduled task "${taskName}" registered`); }
|
|
220
|
+
catch (err) { console.error(`Failed: ${err.message}`); process.exit(1); }
|
|
221
|
+
} else if (platform === 'darwin') {
|
|
222
|
+
const agentDir = path.join(os.homedir(), 'Library', 'LaunchAgents');
|
|
223
|
+
const plistPath = path.join(agentDir, 'com.mafw.gateway.plist');
|
|
224
|
+
if (!fs.existsSync(agentDir)) fs.mkdirSync(agentDir, { recursive: true });
|
|
225
|
+
const plist = `<?xml version="1.0" encoding="UTF-8"?>
|
|
226
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
227
|
+
<plist version="1.0">
|
|
228
|
+
<dict>
|
|
229
|
+
<key>Label</key>
|
|
230
|
+
<string>com.mafw.gateway</string>
|
|
231
|
+
<key>ProgramArguments</key>
|
|
232
|
+
<array><string>/usr/local/bin/node</string><string>${script}</string></array>
|
|
233
|
+
<key>RunAtLoad</key><true/>
|
|
234
|
+
<key>KeepAlive</key><true/>
|
|
235
|
+
<key>StandardOutPath</key><string>${LOG_FILE}</string>
|
|
236
|
+
<key>StandardErrorPath</key><string>${LOG_FILE}</string>
|
|
237
|
+
</dict>
|
|
238
|
+
</plist>`;
|
|
239
|
+
fs.writeFileSync(plistPath, plist, 'utf-8');
|
|
240
|
+
try { execSync(`launchctl load "${plistPath}"`, { stdio: 'inherit' }); console.log(`LaunchAgent registered: ${plistPath}`); }
|
|
241
|
+
catch (err) { console.error(`Failed: ${err.message}`); }
|
|
242
|
+
} else {
|
|
243
|
+
const unitDir = path.join(os.homedir(), '.config', 'systemd', 'user');
|
|
244
|
+
const unitPath = path.join(unitDir, 'mafw-gateway.service');
|
|
245
|
+
if (!fs.existsSync(unitDir)) fs.mkdirSync(unitDir, { recursive: true });
|
|
246
|
+
const unit = `[Unit]
|
|
247
|
+
Description=MAFW Gateway
|
|
248
|
+
After=network.target
|
|
249
|
+
[Service]
|
|
250
|
+
ExecStart=/usr/bin/node ${script}
|
|
251
|
+
Restart=on-failure
|
|
252
|
+
RestartSec=5
|
|
253
|
+
StandardOutput=append:${LOG_FILE}
|
|
254
|
+
StandardError=append:${LOG_FILE}
|
|
255
|
+
[Install]
|
|
256
|
+
WantedBy=default.target`;
|
|
257
|
+
fs.writeFileSync(unitPath, unit, 'utf-8');
|
|
258
|
+
try {
|
|
259
|
+
execSync('systemctl --user daemon-reload', { stdio: 'inherit' });
|
|
260
|
+
execSync('systemctl --user enable mafw-gateway.service', { stdio: 'inherit' });
|
|
261
|
+
console.log(`systemd service registered: ${unitPath}`);
|
|
262
|
+
} catch (err) { console.error(`Failed: ${err.message}`); }
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function unregisterService() {
|
|
267
|
+
const platform = process.platform;
|
|
268
|
+
if (platform === 'win32') {
|
|
269
|
+
try { execSync('schtasks /delete /tn "MAFW-Gateway" /f', { stdio: 'inherit' }); console.log('Scheduled task unregistered'); }
|
|
270
|
+
catch (err) { console.error(`Failed: ${err.message}`); }
|
|
271
|
+
} else if (platform === 'darwin') {
|
|
272
|
+
const plistPath = path.join(os.homedir(), 'Library', 'LaunchAgents', 'com.mafw.gateway.plist');
|
|
273
|
+
if (fs.existsSync(plistPath)) {
|
|
274
|
+
try { execSync(`launchctl unload "${plistPath}"`, { stdio: 'inherit' }); fs.unlinkSync(plistPath); console.log('LaunchAgent unregistered'); }
|
|
275
|
+
catch (err) { console.error(`Failed: ${err.message}`); }
|
|
276
|
+
} else { console.log('No LaunchAgent found'); }
|
|
277
|
+
} else {
|
|
278
|
+
try {
|
|
279
|
+
execSync('systemctl --user disable mafw-gateway.service', { stdio: 'inherit' });
|
|
280
|
+
const unitPath = path.join(os.homedir(), '.config', 'systemd', 'user', 'mafw-gateway.service');
|
|
281
|
+
if (fs.existsSync(unitPath)) fs.unlinkSync(unitPath);
|
|
282
|
+
console.log('systemd service unregistered');
|
|
283
|
+
} catch (err) { console.error(`Failed: ${err.message}`); }
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function openDashboard() {
|
|
288
|
+
const url = `http://localhost:${Number(GATEWAY_PORT)}/`;
|
|
289
|
+
console.log(`Opening Dashboard: ${url}`);
|
|
290
|
+
try {
|
|
291
|
+
if (process.platform === 'win32') execSync(`start "" "${url}"`, { stdio: 'ignore' });
|
|
292
|
+
else if (process.platform === 'darwin') execSync(`open "${url}"`, { stdio: 'ignore' });
|
|
293
|
+
else execSync(`xdg-open "${url}"`, { stdio: 'ignore' });
|
|
294
|
+
} catch { console.log(`Open in browser: ${url}`); }
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function showConfig() {
|
|
298
|
+
const configFile = path.join(CONFIG_DIR, 'config.json');
|
|
299
|
+
if (fs.existsSync(configFile)) {
|
|
300
|
+
console.log(fs.readFileSync(configFile, 'utf-8'));
|
|
301
|
+
} else {
|
|
302
|
+
console.log('{}');
|
|
303
|
+
console.log(`(Create ${configFile} to set persistent config)`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function showUninstall() {
|
|
308
|
+
console.log(`
|
|
309
|
+
MAFW Uninstall
|
|
310
|
+
|
|
311
|
+
1. Remove plugin from opencode.json:
|
|
312
|
+
- Edit ~/.config/opencode/config.json
|
|
313
|
+
- Remove "@jack200714/mafw" from plugins array
|
|
314
|
+
|
|
315
|
+
2. Delete plugin data:
|
|
316
|
+
rm -rf ~/.config/mafw
|
|
317
|
+
rm -rf ~/.mafw
|
|
318
|
+
|
|
319
|
+
3. Uninstall npm package:
|
|
320
|
+
npm uninstall -g @jack200714/mafw
|
|
321
|
+
|
|
322
|
+
4. Stop Gateway:
|
|
323
|
+
mafw stop
|
|
324
|
+
`);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
async function main() {
|
|
328
|
+
const cmd = process.argv[2];
|
|
329
|
+
if (!cmd || cmd === '--help' || cmd === '-h') { console.log(USAGE); return; }
|
|
330
|
+
|
|
331
|
+
if (!COMMANDS.includes(cmd)) {
|
|
332
|
+
console.error(`Unknown command: ${cmd}`);
|
|
333
|
+
console.log(USAGE);
|
|
334
|
+
process.exit(1);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
switch (cmd) {
|
|
338
|
+
case 'start': startGateway(false); break;
|
|
339
|
+
case 'daemon': startGateway(true); break;
|
|
340
|
+
case 'stop': stopGateway(); break;
|
|
341
|
+
case 'status': showStatus(); break;
|
|
342
|
+
case 'restart':
|
|
343
|
+
stopGateway();
|
|
344
|
+
startGateway(true);
|
|
345
|
+
break;
|
|
346
|
+
case 'logs': showLogs(); break;
|
|
347
|
+
|
|
348
|
+
case 'health': await callApi('health', 'GET', '/health'); break;
|
|
349
|
+
case 'restart-agent': await callApi('restart-agent', 'POST', '/api/runtime/restart-agent'); break;
|
|
350
|
+
case 'stats': await callApi('stats', 'GET', '/api/stats'); break;
|
|
351
|
+
case 'projects': await callApi('projects', 'GET', '/api/projects'); break;
|
|
352
|
+
case 'goals': await callApi('goals', 'GET', '/api/goals'); break;
|
|
353
|
+
case 'sessions': await callApi('sessions', 'GET', '/api/sessions'); break;
|
|
354
|
+
case 'automations': await callApi('automations', 'GET', '/api/automations'); break;
|
|
355
|
+
case 'approvals': await callApi('approvals', 'GET', '/api/approvals'); break;
|
|
356
|
+
case 'triage': await callApi('triage', 'GET', '/api/triage'); break;
|
|
357
|
+
|
|
358
|
+
case 'register': {
|
|
359
|
+
const dir = process.argv[3];
|
|
360
|
+
if (!dir) { console.error('Usage: mafw register <projectDir>'); process.exit(1); }
|
|
361
|
+
await callApi('register', 'POST', '/register', { projectDir: path.resolve(dir), mafwDir: path.join(path.resolve(dir), '.mafw') });
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
case 'control': {
|
|
365
|
+
const action = process.argv[3];
|
|
366
|
+
const goalId = process.argv[4];
|
|
367
|
+
if (!action || !goalId) { console.error('Usage: mafw control <pause|abort|force-phase> <goalId>'); process.exit(1); }
|
|
368
|
+
await callApi('control', 'POST', '/control', { action: action.toUpperCase(), goalId });
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
case 'memory-search': {
|
|
372
|
+
const query = process.argv.slice(3).join(' ');
|
|
373
|
+
if (!query) { console.error('Usage: mafw memory-search <query>'); process.exit(1); }
|
|
374
|
+
await callApi('memory-search', 'GET', `/api/memory/merged-search?query=${encodeURIComponent(query)}`);
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
case 'service-register': registerService(); break;
|
|
379
|
+
case 'service-unregister': unregisterService(); break;
|
|
380
|
+
case 'config': showConfig(); break;
|
|
381
|
+
case 'dashboard': openDashboard(); break;
|
|
382
|
+
case 'uninstall': showUninstall(); break;
|
|
383
|
+
case 'version': console.log(`v${pkg.version}`); break;
|
|
384
|
+
case 'update': requestUpdate(); break;
|
|
385
|
+
case 'tui': launchTui(); break;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// `mafw update`: write the self-update token (atomic tmp+rename). The running
|
|
390
|
+
// gateway watches ~/.mafw/pending-restart.json, rebuilds itself and hands off
|
|
391
|
+
// to a takeover process; it then notifies the caller session.
|
|
392
|
+
function requestUpdate() {
|
|
393
|
+
const pid = readPid();
|
|
394
|
+
if (!pid || !isRunning(pid)) {
|
|
395
|
+
console.error('Gateway is not running. Start it first: mafw start / mafw daemon');
|
|
396
|
+
process.exit(1);
|
|
397
|
+
}
|
|
398
|
+
ensureDirs();
|
|
399
|
+
const token = {
|
|
400
|
+
target: 'gateway',
|
|
401
|
+
action: 'update',
|
|
402
|
+
reason: 'mafw update (CLI)',
|
|
403
|
+
requestedAt: new Date().toISOString(),
|
|
404
|
+
delayMs: 3000,
|
|
405
|
+
};
|
|
406
|
+
const tmp = path.join(CONFIG_DIR, 'pending-restart.json.tmp');
|
|
407
|
+
const dst = path.join(os.homedir(), '.mafw', 'pending-restart.json');
|
|
408
|
+
try {
|
|
409
|
+
fs.mkdirSync(path.dirname(dst), { recursive: true });
|
|
410
|
+
fs.writeFileSync(tmp, JSON.stringify(token, null, 2), 'utf-8');
|
|
411
|
+
fs.renameSync(tmp, dst);
|
|
412
|
+
console.log('Update requested: gateway will rebuild and restart itself (~3s).');
|
|
413
|
+
} catch (err) {
|
|
414
|
+
console.error(`Failed to write update token: ${err.message}`);
|
|
415
|
+
process.exit(1);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// `mafw tui`: launch the terminal UI (packages/tui). stdio inherit so the TUI
|
|
420
|
+
// owns the console; windowsHide:false because a TUI needs a visible console
|
|
421
|
+
// (unlike gateway sidecar spawns, which must set it true).
|
|
422
|
+
function launchTui() {
|
|
423
|
+
const tuiScript = path.resolve(__dirname, '..', 'packages', 'tui', 'dist', 'cli.js');
|
|
424
|
+
if (!fs.existsSync(tuiScript)) {
|
|
425
|
+
console.error('TUI not built. Run: npm run build');
|
|
426
|
+
process.exit(1);
|
|
427
|
+
}
|
|
428
|
+
const child = spawn(process.execPath, [tuiScript, ...process.argv.slice(3)], {
|
|
429
|
+
stdio: 'inherit',
|
|
430
|
+
windowsHide: false,
|
|
431
|
+
});
|
|
432
|
+
child.on('exit', (code) => process.exit(code ?? 0));
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
main().catch(err => { console.error(err.message); process.exit(1); });
|
|
436
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash-python-guide.d.ts","sourceRoot":"","sources":["../../src/hooks/bash-python-guide.ts"],"names":[],"mappings":"AAmCA,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CA6B5D;AAED,mBAAmB;AACnB,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|