@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
|
@@ -0,0 +1,86 @@
|
|
|
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 () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.archiveLegacyT1 = archiveLegacyT1;
|
|
37
|
+
// One-time archival of the legacy spiral-*.jsonl T1 observation files (turnID
|
|
38
|
+
// era before the SQLite T1 store). Files move into tier1/archive/ (preserving
|
|
39
|
+
// the goalId subdirectory structure) so nothing is lost. Idempotent via an
|
|
40
|
+
// ARCHIVED marker file.
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const logger_1 = require("../core/utils/logger");
|
|
44
|
+
function archiveLegacyT1(projectDirs) {
|
|
45
|
+
let archived = 0;
|
|
46
|
+
let projects = 0;
|
|
47
|
+
for (const projectDir of projectDirs) {
|
|
48
|
+
const tier1 = path.join(projectDir, '.mafw', 'memory', 'tier1');
|
|
49
|
+
if (!fs.existsSync(tier1))
|
|
50
|
+
continue;
|
|
51
|
+
const archive = path.join(tier1, 'archive');
|
|
52
|
+
if (fs.existsSync(path.join(archive, 'ARCHIVED')))
|
|
53
|
+
continue;
|
|
54
|
+
// spiral files live under tier1/<goalId>/ (and legacy flat tier1/).
|
|
55
|
+
const spiralFiles = [];
|
|
56
|
+
const scan = (dir, relDir) => {
|
|
57
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
58
|
+
if (entry.name === 'archive')
|
|
59
|
+
continue;
|
|
60
|
+
const full = path.join(dir, entry.name);
|
|
61
|
+
if (entry.isDirectory())
|
|
62
|
+
scan(full, path.join(relDir, entry.name));
|
|
63
|
+
else if (entry.name.endsWith('.jsonl'))
|
|
64
|
+
spiralFiles.push({ from: full, rel: path.join(relDir, entry.name) });
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
scan(tier1, '');
|
|
68
|
+
if (spiralFiles.length === 0)
|
|
69
|
+
continue;
|
|
70
|
+
try {
|
|
71
|
+
for (const f of spiralFiles) {
|
|
72
|
+
const dest = path.join(archive, f.rel);
|
|
73
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
74
|
+
fs.renameSync(f.from, dest);
|
|
75
|
+
}
|
|
76
|
+
fs.writeFileSync(path.join(archive, 'ARCHIVED'), new Date().toISOString(), 'utf-8');
|
|
77
|
+
archived += spiralFiles.length;
|
|
78
|
+
projects++;
|
|
79
|
+
logger_1.log.info(`[t1-archive] moved ${spiralFiles.length} legacy spiral files to ${archive}`);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
logger_1.log.warn(`[t1-archive] failed for ${tier1}: ${err.message}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { archived, projects };
|
|
86
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Persistent LLM execution channel for the memory pipelines. One long-lived
|
|
3
|
+
// gateway-internal session per worker, lazily created and reused (mirrors the
|
|
4
|
+
// /api/llm/compress pattern but uses the synchronous `session.prompt` so the
|
|
5
|
+
// caller gets the extracted text back). Failure invalidates the cached session
|
|
6
|
+
// so the next call re-creates it; sessions rotate periodically to keep the
|
|
7
|
+
// accumulated history (and its token cost) bounded.
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MemoryWorker = void 0;
|
|
10
|
+
class MemoryWorker {
|
|
11
|
+
client;
|
|
12
|
+
opts;
|
|
13
|
+
sessionId = null;
|
|
14
|
+
label;
|
|
15
|
+
promptCount = 0;
|
|
16
|
+
lastPromptAt = 0;
|
|
17
|
+
constructor(client, opts) {
|
|
18
|
+
this.client = client;
|
|
19
|
+
this.opts = opts;
|
|
20
|
+
this.label = opts.label ?? 'memory-worker';
|
|
21
|
+
}
|
|
22
|
+
/** Lazily (re)create the worker session. Persistent: no rotation — the same
|
|
23
|
+
* session is reused for every prompt; only failures / serve restarts
|
|
24
|
+
* invalidate it. Throws on failure — caller decides fallback. */
|
|
25
|
+
async ensureSession() {
|
|
26
|
+
if (this.sessionId)
|
|
27
|
+
return this.sessionId;
|
|
28
|
+
const created = await this.client.session.create({ directory: this.opts.directory });
|
|
29
|
+
this.sessionId = created?.id ?? null;
|
|
30
|
+
if (!this.sessionId)
|
|
31
|
+
throw new Error('memory worker: failed to create session');
|
|
32
|
+
console.log(`[MemoryWorker] ${this.label} created session ${this.sessionId}`);
|
|
33
|
+
this.opts.onSessionCreated?.(this.sessionId);
|
|
34
|
+
return this.sessionId;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Compact the session after an idle period to bound the per-prompt token cost.
|
|
38
|
+
* Uses opencode's native session.summarize() so the system prefix and recent
|
|
39
|
+
* context survive. Falls back to rotation (dispose + recreate) on failure.
|
|
40
|
+
*/
|
|
41
|
+
async maybeCompact(sessionId, model) {
|
|
42
|
+
const compactIdleMs = this.opts.compactIdleMs ?? 8 * 60 * 60 * 1000;
|
|
43
|
+
if (compactIdleMs <= 0)
|
|
44
|
+
return;
|
|
45
|
+
if (this.promptCount === 0 || this.lastPromptAt === 0)
|
|
46
|
+
return;
|
|
47
|
+
const idleMs = Date.now() - this.lastPromptAt;
|
|
48
|
+
if (idleMs < compactIdleMs)
|
|
49
|
+
return;
|
|
50
|
+
const timeoutMs = this.opts.promptTimeoutMs ?? 120_000;
|
|
51
|
+
try {
|
|
52
|
+
const res = await Promise.race([
|
|
53
|
+
this.client.session.summarize({
|
|
54
|
+
sessionID: sessionId,
|
|
55
|
+
...(model ? { providerID: model.providerID, modelID: model.modelID } : {}),
|
|
56
|
+
}),
|
|
57
|
+
new Promise((_, reject) => {
|
|
58
|
+
const timer = setTimeout(() => reject(new Error(`${this.label}: summarize timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
59
|
+
timer.unref?.();
|
|
60
|
+
}),
|
|
61
|
+
]);
|
|
62
|
+
const ok = res;
|
|
63
|
+
if (ok === true) {
|
|
64
|
+
console.log(`[MemoryWorker] ${this.label} compacted session ${sessionId}`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(`[MemoryWorker] ${this.label} summarize returned ${ok}; session ${sessionId} kept`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
// Summarize failed — rotate this worker session. A fresh session is
|
|
72
|
+
// cheaper than keeping an ever-growing history.
|
|
73
|
+
console.warn(`[MemoryWorker] ${this.label} summarize failed, rotating: ${err.message}`);
|
|
74
|
+
await this.dispose();
|
|
75
|
+
throw err; // caller sees the prompt-like failure; next prompt creates a new session
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Run one extraction/reflection prompt. Returns the assistant text reply.
|
|
80
|
+
* Bounded by promptTimeoutMs (default 120s) so a hung LLM call can never
|
|
81
|
+
* lock the whole pipeline (the action-level guard is skip-once semantics).
|
|
82
|
+
* Any failure invalidates the cached session and rethrows.
|
|
83
|
+
*/
|
|
84
|
+
async prompt(message, system, model, agent) {
|
|
85
|
+
const sessionId = await this.ensureSession();
|
|
86
|
+
await this.maybeCompact(sessionId, model);
|
|
87
|
+
const timeoutMs = this.opts.promptTimeoutMs ?? 120_000;
|
|
88
|
+
try {
|
|
89
|
+
const result = await Promise.race([
|
|
90
|
+
this.client.session.prompt({
|
|
91
|
+
sessionID: sessionId,
|
|
92
|
+
parts: [{ type: 'text', text: message }],
|
|
93
|
+
...(system ? { system } : {}),
|
|
94
|
+
...(model ? { model } : {}),
|
|
95
|
+
...(agent ? { agent } : {}),
|
|
96
|
+
}),
|
|
97
|
+
new Promise((_, reject) => {
|
|
98
|
+
const timer = setTimeout(() => reject(new Error(`${this.label}: prompt timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
99
|
+
timer.unref?.(); // never keep the process alive just for the timeout
|
|
100
|
+
}),
|
|
101
|
+
]);
|
|
102
|
+
const text = (Array.isArray(result?.parts)
|
|
103
|
+
? result.parts.filter((p) => p?.type === 'text').map((p) => p.text).join('\n')
|
|
104
|
+
: '') || '';
|
|
105
|
+
this.promptCount++;
|
|
106
|
+
this.lastPromptAt = Date.now();
|
|
107
|
+
return text;
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
this.sessionId = null;
|
|
111
|
+
throw err;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async dispose() {
|
|
115
|
+
if (this.sessionId) {
|
|
116
|
+
try {
|
|
117
|
+
await this.client.session.delete({ sessionID: this.sessionId });
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// ignore
|
|
121
|
+
}
|
|
122
|
+
this.promptCount = 0;
|
|
123
|
+
this.lastPromptAt = 0;
|
|
124
|
+
this.sessionId = null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.MemoryWorker = MemoryWorker;
|
|
@@ -0,0 +1,76 @@
|
|
|
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 () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ensureMemoryPipelineRules = ensureMemoryPipelineRules;
|
|
37
|
+
// Idempotent provisioning of the memory-pipeline cron rules
|
|
38
|
+
// (turn-compress hourly, memory-reflect daily). Fresh installs otherwise have
|
|
39
|
+
// no rules and the pipelines never run.
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const logger_1 = require("../core/utils/logger");
|
|
43
|
+
const RULES = [
|
|
44
|
+
{ id: 'turn-compress', schedule: '0 * * * *', timezone: 'UTC', action: 'memory:turnCompress' },
|
|
45
|
+
{ id: 'memory-reflect', schedule: '0 3 * * *', timezone: 'UTC', action: 'memory:reflect' },
|
|
46
|
+
// Daily energy decay — memories fade by elapsed time (0.005/day base rate).
|
|
47
|
+
{ id: 'memory-decay', schedule: '30 3 * * *', timezone: 'UTC', action: 'memory:decay' },
|
|
48
|
+
// Weekly stale-memory verification — the curator re-checks high-value
|
|
49
|
+
// procedural/semantic memories against the live environment (read-only
|
|
50
|
+
// probes) and supersedes contradicted ones (env-probing curation).
|
|
51
|
+
{ id: 'memory-review', schedule: '0 4 * * 0', timezone: 'UTC', action: 'memory:review' },
|
|
52
|
+
];
|
|
53
|
+
function ensureMemoryPipelineRules(mafwDir) {
|
|
54
|
+
const dir = path.join(mafwDir, 'automations');
|
|
55
|
+
for (const rule of RULES) {
|
|
56
|
+
const file = path.join(dir, `${rule.id}.json`);
|
|
57
|
+
if (fs.existsSync(file))
|
|
58
|
+
continue;
|
|
59
|
+
try {
|
|
60
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
61
|
+
fs.writeFileSync(file, JSON.stringify({
|
|
62
|
+
id: rule.id,
|
|
63
|
+
enabled: true,
|
|
64
|
+
trigger: { type: 'cron', schedule: rule.schedule, timezone: rule.timezone },
|
|
65
|
+
action: { type: rule.action },
|
|
66
|
+
skill: '',
|
|
67
|
+
args: {},
|
|
68
|
+
onResult: { type: 'goal' },
|
|
69
|
+
}, null, 2), 'utf-8');
|
|
70
|
+
logger_1.log.info(`[Scheduler] provisioned pipeline rule ${rule.id}`);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
logger_1.log.warn(`[Scheduler] failed to provision rule ${rule.id}: ${err.message}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.blobPenalty = blobPenalty;
|
|
4
|
+
exports.searchRecallMemories = searchRecallMemories;
|
|
5
|
+
exports.mergeScanResults = mergeScanResults;
|
|
6
|
+
exports.searchRecallMemoriesSync = searchRecallMemoriesSync;
|
|
7
|
+
const config_1 = require("../config");
|
|
8
|
+
const logger_1 = require("../core/utils/logger");
|
|
9
|
+
/**
|
|
10
|
+
* Detect multi-hop/comparison questions that need facts from multiple sessions.
|
|
11
|
+
* Returns sub-queries that decompose the question into independent searches.
|
|
12
|
+
*/
|
|
13
|
+
function decomposeMultiHopQuery(query) {
|
|
14
|
+
const lower = query.toLowerCase();
|
|
15
|
+
const subQueries = [];
|
|
16
|
+
// Comparison patterns: "how much older/younger", "difference between", "compare", "vs"
|
|
17
|
+
const isComparison = /\b(how much|what is the|difference between|compare|vs\.?|older|younger|more|less|bigger|smaller|higher|lower|faster|slower|better|worse)\b/i.test(query);
|
|
18
|
+
// Temporal/aggregation: "average", "total", "sum", "count", "when did"
|
|
19
|
+
const hasAggregation = /\b(average|total|sum|count|how many|how often|when did|what time|which)\b/i.test(query);
|
|
20
|
+
if (isComparison || hasAggregation) {
|
|
21
|
+
// Extract noun phrases as entity candidates
|
|
22
|
+
// Simple heuristic: words that are not common question words
|
|
23
|
+
const questionWords = new Set(['how', 'what', 'when', 'where', 'why', 'which', 'who', 'whom', 'whose', 'is', 'are', 'was', 'were', 'do', 'does', 'did', 'have', 'has', 'had', 'can', 'could', 'will', 'would', 'should', 'may', 'might', 'shall', 'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for', 'of', 'with', 'by', 'from', 'as', 'into', 'than', 'that', 'this', 'these', 'those', 'it', 'its', 'my', 'your', 'our', 'their', 'his', 'her', 'i', 'me', 'we', 'you', 'they', 'he', 'she']);
|
|
24
|
+
const words = lower.replace(/[^a-z0-9\s]/g, ' ').split(/\s+/).filter(w => w.length >= 2 && !questionWords.has(w));
|
|
25
|
+
// Sub-query 1: personal/user info patterns
|
|
26
|
+
const userPatterns = words.filter(w => /\b(age|birthday|born|live|work|job|salary|income|family|married|single|children|kid|pet|car|house|home|school|college|university|degree|major|hobby|interest|preference|like|dislike|favorite|eat|drink|travel|visit|read|watch|listen)\b/.test(w));
|
|
27
|
+
if (userPatterns.length > 0) {
|
|
28
|
+
subQueries.push('user ' + userPatterns.join(' '));
|
|
29
|
+
}
|
|
30
|
+
// Sub-query 2: entity/topic patterns
|
|
31
|
+
const entityWords = words.filter(w => !userPatterns.includes(w));
|
|
32
|
+
if (entityWords.length > 0) {
|
|
33
|
+
subQueries.push(entityWords.join(' '));
|
|
34
|
+
}
|
|
35
|
+
// Sub-query 3: the full noun phrase (without question words)
|
|
36
|
+
if (words.length >= 2) {
|
|
37
|
+
subQueries.push(words.join(' '));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return subQueries.slice(0, 4); // Cap at 4 sub-queries
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Extract key entities from a query for cross-session topic linking.
|
|
44
|
+
* Looks for quoted strings, camelCase/PascalCase identifiers, ALL_CAPS words,
|
|
45
|
+
* common technical terms, and natural language entity nouns.
|
|
46
|
+
*/
|
|
47
|
+
function extractQueryEntities(query) {
|
|
48
|
+
const entities = [];
|
|
49
|
+
// Quoted strings (e.g., "React", 'auth module')
|
|
50
|
+
const quoted = query.match(/['"]([^'"]+)['"]/g);
|
|
51
|
+
if (quoted) {
|
|
52
|
+
for (const q of quoted) {
|
|
53
|
+
const inner = q.slice(1, -1).trim();
|
|
54
|
+
if (inner.length >= 2)
|
|
55
|
+
entities.push(inner);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// camelCase/PascalCase identifiers (e.g., "getUserAuth", "AuthModule")
|
|
59
|
+
const camelPascal = query.match(/\b[A-Z][a-z]+(?:[A-Z][a-z]+)+\b/g);
|
|
60
|
+
if (camelPascal) {
|
|
61
|
+
for (const c of camelPascal) {
|
|
62
|
+
entities.push(c);
|
|
63
|
+
// Also add split version: "getUserAuth" -> "get User Auth"
|
|
64
|
+
const split = c.replace(/([a-z])([A-Z])/g, '$1 $2');
|
|
65
|
+
if (split !== c)
|
|
66
|
+
entities.push(split);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// ALL_CAPS words (e.g., "API", "URL", "HTTP")
|
|
70
|
+
const allCaps = query.match(/\b[A-Z]{2,}\b/g);
|
|
71
|
+
if (allCaps) {
|
|
72
|
+
for (const a of allCaps) {
|
|
73
|
+
if (a.length >= 2 && !['THE', 'AND', 'FOR', 'NOT', 'BUT', 'ARE', 'WAS', 'HAS', 'CAN', 'DID', 'DOES'].includes(a)) {
|
|
74
|
+
entities.push(a);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Natural language entity nouns (common content words that appear in memories)
|
|
79
|
+
const lower = query.toLowerCase();
|
|
80
|
+
const nlEntities = lower.match(/\b(?:age|birthday|salary|income|department|employee|manager|team|company|project|product|feature|service|server|database|api|endpoint|config|setting|preference|language|framework|library|tool|plugin|extension|theme|template|pattern|convention|standard|protocol|interface|model|schema|type|class|function|method|module|package|library|framework|component|file|directory|path|url|link|user|admin|role|permission|access|session|token|auth|oauth|jwt|deploy|build|test|debug|error|exception|log|monitor|metric|alert|notification|webhook|cron|schedule|timer|cache|queue|stack|tree|graph|node|edge|list|map|set|dict|array|string|number|boolean|null|undefined|true|false|yes|no|ok|done|failed|success|pending|active|inactive|enabled|disabled|public|private|internal|external|local|remote|global|shared|custom|default|primary|secondary|main|sub|child|parent|root|head|tail|first|last|next|prev|current|old|new|temporary|permanent)\b/g);
|
|
81
|
+
if (nlEntities) {
|
|
82
|
+
for (const e of nlEntities) {
|
|
83
|
+
if (e.length >= 3 && !entities.includes(e)) {
|
|
84
|
+
entities.push(e);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Deduplicate and return (case-insensitive dedup)
|
|
89
|
+
const seen = new Set();
|
|
90
|
+
const unique = [];
|
|
91
|
+
for (const e of entities) {
|
|
92
|
+
const lower = e.toLowerCase();
|
|
93
|
+
if (!seen.has(lower) && lower.length >= 2) {
|
|
94
|
+
seen.add(lower);
|
|
95
|
+
unique.push(e);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return unique.slice(0, 10); // Cap at 10 entities
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Expand a query by searching for entity-related memories.
|
|
102
|
+
* Uses both entity extraction and multi-hop decomposition to catch
|
|
103
|
+
* cross-session topic links that BM25 might miss.
|
|
104
|
+
*/
|
|
105
|
+
function expandQuery(index, query, pushed, topK = 3) {
|
|
106
|
+
const expandedScores = new Map();
|
|
107
|
+
const accumulate = (hits, weight) => {
|
|
108
|
+
const norms = maxNormalize(hits.map(h => h.score));
|
|
109
|
+
hits.forEach((h, i) => {
|
|
110
|
+
if (pushed.has(h.entry.id) || h.entry.superseded_by)
|
|
111
|
+
return;
|
|
112
|
+
const existing = expandedScores.get(h.entry.id) || 0;
|
|
113
|
+
expandedScores.set(h.entry.id, existing + norms[i] * weight);
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
// Strategy 1: entity-based expansion (individual entity searches)
|
|
117
|
+
const entities = extractQueryEntities(query);
|
|
118
|
+
for (const entity of entities) {
|
|
119
|
+
const hits = fetchScored(index, entity, topK, {});
|
|
120
|
+
accumulate(hits, 0.4);
|
|
121
|
+
}
|
|
122
|
+
// Strategy 2: multi-hop decomposition (sub-query searches)
|
|
123
|
+
const subQueries = decomposeMultiHopQuery(query);
|
|
124
|
+
for (const sq of subQueries) {
|
|
125
|
+
const hits = fetchScored(index, sq, topK, {});
|
|
126
|
+
accumulate(hits, 0.35);
|
|
127
|
+
}
|
|
128
|
+
// Sort by accumulated score
|
|
129
|
+
return [...expandedScores.entries()]
|
|
130
|
+
.map(([id, score]) => ({ id, score }))
|
|
131
|
+
.sort((a, b) => b.score - a.score)
|
|
132
|
+
.slice(0, topK * 2);
|
|
133
|
+
}
|
|
134
|
+
/** Multi-topic blob abstraction (chained MinHash merges) 鈥?dilutes precision. */
|
|
135
|
+
function blobPenalty(abstraction) {
|
|
136
|
+
const segs = (abstraction || '').split('|').map(s => s.trim()).filter(Boolean).length;
|
|
137
|
+
return segs >= 4 ? 0.5 : 1;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Max-normalize scores to [0,1] (score/max). Deliberately NOT min-max: min-max
|
|
141
|
+
* stretches the weakest candidate to 0, which makes any multiplicative penalty
|
|
142
|
+
* unable to flip order among few candidates and exaggerates raw-score gaps.
|
|
143
|
+
*/
|
|
144
|
+
function maxNormalize(values) {
|
|
145
|
+
if (values.length === 0)
|
|
146
|
+
return [];
|
|
147
|
+
const max = Math.max(...values);
|
|
148
|
+
if (max <= 0)
|
|
149
|
+
return values.map(() => 0);
|
|
150
|
+
return values.map(v => v / max);
|
|
151
|
+
}
|
|
152
|
+
/** Fetch scored candidates preferring searchScored (raw scores) with a legacy search() fallback. */
|
|
153
|
+
function fetchScored(index, query, topK, options) {
|
|
154
|
+
if (typeof index.searchScored === 'function') {
|
|
155
|
+
return index.searchScored(query, topK, { retriever: options.retriever ?? 'bm25' }) || [];
|
|
156
|
+
}
|
|
157
|
+
return (index.search(query, topK, options) || []).map((e) => ({ entry: e, score: 0.5 }));
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Search recall memories using BM25 + query expansion. This is the *sync*
|
|
161
|
+
* recall path (<50ms): the plugin-side client aborts after 100ms, so the
|
|
162
|
+
* index scan must never be awaited here 鈥?its results arrive via async
|
|
163
|
+
* prefetch snapshots merged by mergeScanResults() instead.
|
|
164
|
+
*
|
|
165
|
+
* Scoring: candidate-set-normalized BM25 脳 blob penalty as the base; expansion
|
|
166
|
+
* hits add norm 脳 0.4 per entity; scan direct/graph hits get fixed boosts
|
|
167
|
+
* (0.35 / 0.2). energy no longer doubles as the score.
|
|
168
|
+
*/
|
|
169
|
+
async function searchRecallMemories(index, query, pushed, topK = 3, options = {}) {
|
|
170
|
+
if (!index)
|
|
171
|
+
return [];
|
|
172
|
+
const scored = fetchScored(index, query, topK * 2, options)
|
|
173
|
+
.filter((s) => s.entry && !pushed.has(s.entry.id) && !s.entry.superseded_by);
|
|
174
|
+
const norms = maxNormalize(scored.map((s) => s.score));
|
|
175
|
+
const resultMap = new Map();
|
|
176
|
+
scored.forEach((s, i) => {
|
|
177
|
+
resultMap.set(s.entry.id, {
|
|
178
|
+
id: s.entry.id,
|
|
179
|
+
primary_abstraction: s.entry.primary_abstraction || '',
|
|
180
|
+
memory_value: s.entry.memory_value || s.entry.content || '',
|
|
181
|
+
energy: s.entry.energy || 0,
|
|
182
|
+
score: norms[i] * blobPenalty(s.entry.primary_abstraction),
|
|
183
|
+
type: s.entry.type,
|
|
184
|
+
created_at: s.entry.created_at,
|
|
185
|
+
source: 'bm25',
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
// Query expansion: entity / sub-query hits join with a RELATIVE weight
|
|
189
|
+
// (norm 脳 0.4, capped) instead of flat energy 鈥?wide blobs no longer rack
|
|
190
|
+
// up multiples of a constant.
|
|
191
|
+
const expandedResults = expandQuery(index, query, pushed, topK);
|
|
192
|
+
for (const exp of expandedResults) {
|
|
193
|
+
if (resultMap.has(exp.id))
|
|
194
|
+
continue; // Already from BM25 鈥?don't override
|
|
195
|
+
const entry = index.getIndex?.()?.entries?.find((e) => e.id === exp.id);
|
|
196
|
+
if (!entry || entry.superseded_by)
|
|
197
|
+
continue;
|
|
198
|
+
resultMap.set(exp.id, {
|
|
199
|
+
id: exp.id,
|
|
200
|
+
primary_abstraction: entry.primary_abstraction || '',
|
|
201
|
+
memory_value: entry.memory_value || entry.content || '',
|
|
202
|
+
energy: entry.energy || 0,
|
|
203
|
+
score: exp.score * blobPenalty(entry.primary_abstraction),
|
|
204
|
+
type: entry.type,
|
|
205
|
+
created_at: entry.created_at,
|
|
206
|
+
source: 'expansion',
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
// Merge scan results if a prefetch snapshot is provided (never awaited 鈥?
|
|
210
|
+
// snapshots are precomputed, so this is a pure in-memory operation).
|
|
211
|
+
const scanSnapshot = options.scanSnapshot;
|
|
212
|
+
if (scanSnapshot && scanSnapshot.relevantIds.length > 0) {
|
|
213
|
+
const expanded = mergeScanResults(resultMap, scanSnapshot, index, pushed);
|
|
214
|
+
logger_1.log.info(`[Recall] bm25=${scored.length} scan=${scanSnapshot.relevantIds.length} expanded=${expanded} union=${resultMap.size} confidence=${scanSnapshot.confidence}`);
|
|
215
|
+
}
|
|
216
|
+
// Sort by score descending, then slice to topK
|
|
217
|
+
const results = [...resultMap.values()]
|
|
218
|
+
.sort((a, b) => b.score - a.score)
|
|
219
|
+
.slice(0, topK);
|
|
220
|
+
return results;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Merge precomputed scan results into a recall result map: anchor-graph 1-hop
|
|
224
|
+
* expansion, dedup against BM25 (BM25 wins, direct scan hits get a +0.3 boost,
|
|
225
|
+
* graph neighbors +0.15). Pure function over in-memory data 鈥?safe to call on
|
|
226
|
+
* the sync recall path with a prefetch snapshot.
|
|
227
|
+
*/
|
|
228
|
+
function mergeScanResults(resultMap, scanResult, index, pushed) {
|
|
229
|
+
const indexEntries = index?.getIndex?.()?.entries || [];
|
|
230
|
+
// Anchor graph 1-hop expansion: for each scan-selected ID, bring in its
|
|
231
|
+
// graph neighbors. This catches multi-session relationships that the
|
|
232
|
+
// scan alone might miss (e.g., scan picks "restaurant" but not "hotel
|
|
233
|
+
// near the restaurant" 鈥?the graph edge connects them).
|
|
234
|
+
const graphStore = index?.getAnchorGraphStore?.();
|
|
235
|
+
const expandedIds = new Set(scanResult.relevantIds);
|
|
236
|
+
if (graphStore) {
|
|
237
|
+
for (const id of scanResult.relevantIds) {
|
|
238
|
+
try {
|
|
239
|
+
const neighbors = graphStore.getNeighbors([id], config_1.config.search.graph.maxNeighbors, new Set(scanResult.relevantIds));
|
|
240
|
+
for (const [nbId] of neighbors) {
|
|
241
|
+
expandedIds.add(nbId);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch { /* non-fatal */ }
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
let expandedCount = 0;
|
|
248
|
+
for (const id of expandedIds) {
|
|
249
|
+
if (resultMap.has(id)) {
|
|
250
|
+
// Already from BM25 鈥?mark as 'both'
|
|
251
|
+
resultMap.get(id).source = 'both';
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (pushed.has(id))
|
|
255
|
+
continue;
|
|
256
|
+
const entry = indexEntries.find((e) => e.id === id);
|
|
257
|
+
if (!entry || entry.superseded_by)
|
|
258
|
+
continue;
|
|
259
|
+
expandedCount++;
|
|
260
|
+
const isDirectScan = scanResult.relevantIds.includes(id);
|
|
261
|
+
const boost = isDirectScan ? 0.35 : 0.2;
|
|
262
|
+
resultMap.set(id, {
|
|
263
|
+
id: entry.id,
|
|
264
|
+
primary_abstraction: entry.primary_abstraction || '',
|
|
265
|
+
memory_value: entry.memory_value || entry.content || '',
|
|
266
|
+
energy: entry.energy || 0,
|
|
267
|
+
score: boost * blobPenalty(entry.primary_abstraction),
|
|
268
|
+
type: entry.type,
|
|
269
|
+
created_at: entry.created_at,
|
|
270
|
+
source: isDirectScan ? 'scan' : 'scan+graph',
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return expandedCount;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Synchronous BM25-only search (backward compatible).
|
|
277
|
+
* Used by step injection and other latency-sensitive paths.
|
|
278
|
+
* Shares the normalized scoring with the async variant.
|
|
279
|
+
*/
|
|
280
|
+
function searchRecallMemoriesSync(index, query, pushed, topK = 3, options = {}) {
|
|
281
|
+
if (!index)
|
|
282
|
+
return [];
|
|
283
|
+
const scored = fetchScored(index, query, topK * 2, options)
|
|
284
|
+
.filter((s) => s.entry && !pushed.has(s.entry.id) && !s.entry.superseded_by)
|
|
285
|
+
.slice(0, topK);
|
|
286
|
+
const norms = maxNormalize(scored.map((s) => s.score));
|
|
287
|
+
return scored.map((s, i) => ({
|
|
288
|
+
id: s.entry.id,
|
|
289
|
+
primary_abstraction: s.entry.primary_abstraction || '',
|
|
290
|
+
memory_value: s.entry.memory_value || s.entry.content || '',
|
|
291
|
+
energy: s.entry.energy || 0,
|
|
292
|
+
score: norms[i] * blobPenalty(s.entry.primary_abstraction),
|
|
293
|
+
type: s.entry.type,
|
|
294
|
+
created_at: s.entry.created_at,
|
|
295
|
+
source: 'bm25',
|
|
296
|
+
})).sort((a, b) => b.score - a.score);
|
|
297
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReflectCursor = exports.MAX_IDS_PER_SESSION = void 0;
|
|
4
|
+
exports.MAX_IDS_PER_SESSION = 500;
|
|
5
|
+
const SCOPE = 'reflect-cursor';
|
|
6
|
+
class ReflectCursor {
|
|
7
|
+
db;
|
|
8
|
+
constructor(db) {
|
|
9
|
+
this.db = db;
|
|
10
|
+
}
|
|
11
|
+
reflectedIds(sessionID) {
|
|
12
|
+
const ids = this.db.kvGet(SCOPE, sessionID);
|
|
13
|
+
return new Set(Array.isArray(ids) ? ids : []);
|
|
14
|
+
}
|
|
15
|
+
isReflected(sessionID, id) {
|
|
16
|
+
const ids = this.db.kvGet(SCOPE, sessionID);
|
|
17
|
+
return Array.isArray(ids) && ids.includes(id);
|
|
18
|
+
}
|
|
19
|
+
/** Mark ids as reflected (atomic single-row upsert). */
|
|
20
|
+
markReflected(sessionID, ids) {
|
|
21
|
+
if (ids.length === 0)
|
|
22
|
+
return;
|
|
23
|
+
const existing = this.db.kvGet(SCOPE, sessionID) ?? [];
|
|
24
|
+
const seen = new Set(existing);
|
|
25
|
+
for (const id of ids) {
|
|
26
|
+
if (!seen.has(id)) {
|
|
27
|
+
seen.add(id);
|
|
28
|
+
existing.push(id);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// bound the list (prune oldest beyond the cap)
|
|
32
|
+
const trimmed = existing.length > exports.MAX_IDS_PER_SESSION ? existing.slice(-exports.MAX_IDS_PER_SESSION) : existing;
|
|
33
|
+
this.db.kvSet(SCOPE, sessionID, trimmed);
|
|
34
|
+
}
|
|
35
|
+
/** Drop ids that no longer exist in the index (best-effort maintenance). */
|
|
36
|
+
prune(liveIds) {
|
|
37
|
+
for (const { key, value } of this.db.kvAll(SCOPE)) {
|
|
38
|
+
if (!Array.isArray(value))
|
|
39
|
+
continue;
|
|
40
|
+
const kept = value.filter((id) => liveIds.has(id));
|
|
41
|
+
if (kept.length !== value.length) {
|
|
42
|
+
if (kept.length === 0)
|
|
43
|
+
this.db.kvDelete(SCOPE, key);
|
|
44
|
+
else
|
|
45
|
+
this.db.kvSet(SCOPE, key, kept);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.ReflectCursor = ReflectCursor;
|