@runcore-sh/runcore 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -19
- package/brain-template/agents/README.md +20 -0
- package/brain-template/identity/README.md +20 -0
- package/brain-template/identity/brand.md +25 -0
- package/brain-template/identity/principles.md +21 -0
- package/brain-template/identity/tone-of-voice.md +23 -0
- package/brain-template/knowledge/notes/tier-gated-ui-spec.md +1 -1
- package/brain-template/metrics/README.md +13 -0
- package/brain-template/operations/goals.yaml +12 -0
- package/brain-template/operations/todos.md +17 -0
- package/brain-template/ops/README.md +13 -0
- package/brain-template/scheduling/README.md +2 -2
- package/brain-template/skills/README.md +23 -0
- package/brain-template/templates/README.md +9 -0
- package/brain-template/training/README.md +20 -0
- package/dictionary.json +2 -2
- package/dist/activity/log.d.ts +3 -0
- package/dist/activity/log.d.ts.map +1 -1
- package/dist/activity/log.js +12 -0
- package/dist/activity/log.js.map +1 -1
- package/dist/agents/autonomous.js +1 -0
- package/dist/agents/autonomous.js.map +1 -1
- package/dist/agents/commit.d.ts.map +1 -1
- package/dist/agents/commit.js +3 -10
- package/dist/agents/commit.js.map +1 -1
- package/dist/agents/dedup-guard.d.ts.map +1 -1
- package/dist/agents/dedup-guard.js +26 -23
- package/dist/agents/dedup-guard.js.map +1 -1
- package/dist/agents/feed.d.ts +69 -0
- package/dist/agents/feed.d.ts.map +1 -0
- package/dist/agents/feed.js +176 -0
- package/dist/agents/feed.js.map +1 -0
- package/dist/agents/governance.d.ts +14 -0
- package/dist/agents/governance.d.ts.map +1 -1
- package/dist/agents/governance.js +73 -1
- package/dist/agents/governance.js.map +1 -1
- package/dist/agents/governed-spawn.d.ts +12 -0
- package/dist/agents/governed-spawn.d.ts.map +1 -1
- package/dist/agents/governed-spawn.js +8 -2
- package/dist/agents/governed-spawn.js.map +1 -1
- package/dist/agents/index.d.ts +2 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +1 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/issue-reporter.d.ts +15 -0
- package/dist/agents/issue-reporter.d.ts.map +1 -0
- package/dist/agents/issue-reporter.js +123 -0
- package/dist/agents/issue-reporter.js.map +1 -0
- package/dist/agents/issues.d.ts +33 -0
- package/dist/agents/issues.d.ts.map +1 -0
- package/dist/agents/issues.js +141 -0
- package/dist/agents/issues.js.map +1 -0
- package/dist/agents/reflection.js +3 -3
- package/dist/agents/reflection.js.map +1 -1
- package/dist/agents/runtime/driver.d.ts.map +1 -1
- package/dist/agents/runtime/driver.js +1 -2
- package/dist/agents/runtime/driver.js.map +1 -1
- package/dist/agents/runtime/manager.d.ts.map +1 -1
- package/dist/agents/runtime/manager.js +1 -0
- package/dist/agents/runtime/manager.js.map +1 -1
- package/dist/agents/runtime/types.d.ts +2 -0
- package/dist/agents/runtime/types.d.ts.map +1 -1
- package/dist/agents/spawn.d.ts.map +1 -1
- package/dist/agents/spawn.js +20 -26
- package/dist/agents/spawn.js.map +1 -1
- package/dist/agents/store.d.ts.map +1 -1
- package/dist/agents/store.js +34 -1
- package/dist/agents/store.js.map +1 -1
- package/dist/agents/types.d.ts +27 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/auth/identity.d.ts +3 -0
- package/dist/auth/identity.d.ts.map +1 -1
- package/dist/auth/identity.js +9 -1
- package/dist/auth/identity.js.map +1 -1
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +4 -0
- package/dist/auth/middleware.js.map +1 -1
- package/dist/calibration/conversation.d.ts +46 -0
- package/dist/calibration/conversation.d.ts.map +1 -0
- package/dist/calibration/conversation.js +295 -0
- package/dist/calibration/conversation.js.map +1 -0
- package/dist/calibration/index.d.ts +5 -0
- package/dist/calibration/index.d.ts.map +1 -0
- package/dist/calibration/index.js +5 -0
- package/dist/calibration/index.js.map +1 -0
- package/dist/calibration/runner.d.ts +127 -0
- package/dist/calibration/runner.d.ts.map +1 -0
- package/dist/calibration/runner.js +307 -0
- package/dist/calibration/runner.js.map +1 -0
- package/dist/calibration/store.d.ts +49 -0
- package/dist/calibration/store.d.ts.map +1 -0
- package/dist/calibration/store.js +140 -0
- package/dist/calibration/store.js.map +1 -0
- package/dist/calibration/types.d.ts +93 -0
- package/dist/calibration/types.d.ts.map +1 -0
- package/dist/calibration/types.js +53 -0
- package/dist/calibration/types.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +17 -2
- package/dist/cli.js.map +1 -1
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +28 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +181 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +76 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +93 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/dictionary/challenge.d.ts +66 -0
- package/dist/dictionary/challenge.d.ts.map +1 -0
- package/dist/dictionary/challenge.js +145 -0
- package/dist/dictionary/challenge.js.map +1 -0
- package/dist/dictionary/client.d.ts +32 -0
- package/dist/dictionary/client.d.ts.map +1 -0
- package/dist/dictionary/client.js +139 -0
- package/dist/dictionary/client.js.map +1 -0
- package/dist/dictionary/compatibility.d.ts +8 -0
- package/dist/dictionary/compatibility.d.ts.map +1 -0
- package/dist/dictionary/compatibility.js +56 -0
- package/dist/dictionary/compatibility.js.map +1 -0
- package/dist/dictionary/index.d.ts +22 -0
- package/dist/dictionary/index.d.ts.map +1 -0
- package/dist/dictionary/index.js +15 -0
- package/dist/dictionary/index.js.map +1 -0
- package/dist/dictionary/matcher.d.ts +18 -0
- package/dist/dictionary/matcher.d.ts.map +1 -0
- package/dist/dictionary/matcher.js +98 -0
- package/dist/dictionary/matcher.js.map +1 -0
- package/dist/dictionary/publisher.d.ts +17 -0
- package/dist/dictionary/publisher.d.ts.map +1 -0
- package/dist/dictionary/publisher.js +156 -0
- package/dist/dictionary/publisher.js.map +1 -0
- package/dist/dictionary/sync.d.ts +28 -0
- package/dist/dictionary/sync.d.ts.map +1 -0
- package/dist/dictionary/sync.js +268 -0
- package/dist/dictionary/sync.js.map +1 -0
- package/dist/dictionary/types.d.ts +75 -0
- package/dist/dictionary/types.d.ts.map +1 -0
- package/dist/dictionary/types.js +8 -0
- package/dist/dictionary/types.js.map +1 -0
- package/dist/dictionary/updater.d.ts +23 -0
- package/dist/dictionary/updater.d.ts.map +1 -0
- package/dist/dictionary/updater.js +84 -0
- package/dist/dictionary/updater.js.map +1 -0
- package/dist/dictionary/versioning.d.ts +15 -0
- package/dist/dictionary/versioning.d.ts.map +1 -0
- package/dist/dictionary/versioning.js +52 -0
- package/dist/dictionary/versioning.js.map +1 -0
- package/dist/errors.d.ts +36 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +66 -0
- package/dist/errors.js.map +1 -0
- package/dist/events/event-bus.d.ts +37 -0
- package/dist/events/event-bus.d.ts.map +1 -0
- package/dist/events/event-bus.js +261 -0
- package/dist/events/event-bus.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +2 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +71 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +7 -0
- package/dist/events/types.js.map +1 -0
- package/dist/feed/client.d.ts +34 -0
- package/dist/feed/client.d.ts.map +1 -0
- package/dist/feed/client.js +206 -0
- package/dist/feed/client.js.map +1 -0
- package/dist/feed/index.d.ts +61 -0
- package/dist/feed/index.d.ts.map +1 -0
- package/dist/feed/index.js +115 -0
- package/dist/feed/index.js.map +1 -0
- package/dist/feed/metrics.d.ts +51 -0
- package/dist/feed/metrics.d.ts.map +1 -0
- package/dist/feed/metrics.js +84 -0
- package/dist/feed/metrics.js.map +1 -0
- package/dist/feed/mixer.d.ts +89 -0
- package/dist/feed/mixer.d.ts.map +1 -0
- package/dist/feed/mixer.js +230 -0
- package/dist/feed/mixer.js.map +1 -0
- package/dist/feed/tiers.d.ts +15 -0
- package/dist/feed/tiers.d.ts.map +1 -0
- package/dist/feed/tiers.js +75 -0
- package/dist/feed/tiers.js.map +1 -0
- package/dist/feed/types.d.ts +76 -0
- package/dist/feed/types.d.ts.map +1 -0
- package/dist/feed/types.js +6 -0
- package/dist/feed/types.js.map +1 -0
- package/dist/files/registry.d.ts +77 -0
- package/dist/files/registry.d.ts.map +1 -0
- package/dist/files/registry.js +222 -0
- package/dist/files/registry.js.map +1 -0
- package/dist/google/plugin.d.ts +17 -0
- package/dist/google/plugin.d.ts.map +1 -0
- package/dist/google/plugin.js +169 -0
- package/dist/google/plugin.js.map +1 -0
- package/dist/health/checker.d.ts.map +1 -1
- package/dist/health/checker.js +14 -4
- package/dist/health/checker.js.map +1 -1
- package/dist/health/checks/openrouter.js +1 -1
- package/dist/health/checks/openrouter.js.map +1 -1
- package/dist/health/checks.d.ts +1 -1
- package/dist/health/checks.d.ts.map +1 -1
- package/dist/health/checks.js +9 -3
- package/dist/health/checks.js.map +1 -1
- package/dist/ledger/distance.d.ts +19 -0
- package/dist/ledger/distance.d.ts.map +1 -0
- package/dist/ledger/distance.js +70 -0
- package/dist/ledger/distance.js.map +1 -0
- package/dist/ledger/index.d.ts +8 -0
- package/dist/ledger/index.d.ts.map +1 -0
- package/dist/ledger/index.js +7 -0
- package/dist/ledger/index.js.map +1 -0
- package/dist/ledger/store.d.ts +27 -0
- package/dist/ledger/store.d.ts.map +1 -0
- package/dist/ledger/store.js +123 -0
- package/dist/ledger/store.js.map +1 -0
- package/dist/ledger/types.d.ts +109 -0
- package/dist/ledger/types.d.ts.map +1 -0
- package/dist/ledger/types.js +57 -0
- package/dist/ledger/types.js.map +1 -0
- package/dist/literacy.d.ts +50 -0
- package/dist/literacy.d.ts.map +1 -0
- package/dist/literacy.js +141 -0
- package/dist/literacy.js.map +1 -0
- package/dist/llm/complete.d.ts.map +1 -1
- package/dist/llm/complete.js +36 -3
- package/dist/llm/complete.js.map +1 -1
- package/dist/llm/fetch-guard.d.ts.map +1 -1
- package/dist/llm/fetch-guard.js +2 -0
- package/dist/llm/fetch-guard.js.map +1 -1
- package/dist/llm/membrane.d.ts +5 -0
- package/dist/llm/membrane.d.ts.map +1 -1
- package/dist/llm/membrane.js +48 -8
- package/dist/llm/membrane.js.map +1 -1
- package/dist/llm/nlp-detect.d.ts +17 -0
- package/dist/llm/nlp-detect.d.ts.map +1 -0
- package/dist/llm/nlp-detect.js +45 -0
- package/dist/llm/nlp-detect.js.map +1 -0
- package/dist/llm/ollama.d.ts +5 -0
- package/dist/llm/ollama.d.ts.map +1 -1
- package/dist/llm/ollama.js +39 -1
- package/dist/llm/ollama.js.map +1 -1
- package/dist/llm/openrouter.d.ts.map +1 -1
- package/dist/llm/openrouter.js +17 -1
- package/dist/llm/openrouter.js.map +1 -1
- package/dist/llm/providers/ollama.d.ts +7 -2
- package/dist/llm/providers/ollama.d.ts.map +1 -1
- package/dist/llm/providers/ollama.js +109 -17
- package/dist/llm/providers/ollama.js.map +1 -1
- package/dist/llm/providers/openrouter.js +1 -1
- package/dist/llm/providers/openrouter.js.map +1 -1
- package/dist/llm/sensitive-registry.d.ts +6 -0
- package/dist/llm/sensitive-registry.d.ts.map +1 -1
- package/dist/llm/sensitive-registry.js +60 -1
- package/dist/llm/sensitive-registry.js.map +1 -1
- package/dist/mcp-server.js +25 -18
- package/dist/mcp-server.js.map +1 -1
- package/dist/metrics/collector.d.ts +6 -0
- package/dist/metrics/collector.d.ts.map +1 -1
- package/dist/metrics/collector.js +150 -0
- package/dist/metrics/collector.js.map +1 -1
- package/dist/metrics/types.d.ts +1 -1
- package/dist/metrics/types.d.ts.map +1 -1
- package/dist/middleware/error-handler.d.ts +13 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +71 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/notifications/channels/adapter.d.ts +28 -0
- package/dist/notifications/channels/adapter.d.ts.map +1 -0
- package/dist/notifications/channels/adapter.js +55 -0
- package/dist/notifications/channels/adapter.js.map +1 -0
- package/dist/notifications/channels/index.d.ts +6 -0
- package/dist/notifications/channels/index.d.ts.map +1 -0
- package/dist/notifications/channels/index.js +6 -0
- package/dist/notifications/channels/index.js.map +1 -0
- package/dist/notifications/channels/log.d.ts +15 -0
- package/dist/notifications/channels/log.d.ts.map +1 -0
- package/dist/notifications/channels/log.js +29 -0
- package/dist/notifications/channels/log.js.map +1 -0
- package/dist/notifications/engine.d.ts +37 -0
- package/dist/notifications/engine.d.ts.map +1 -0
- package/dist/notifications/engine.js +198 -0
- package/dist/notifications/engine.js.map +1 -0
- package/dist/notifications/index.d.ts +12 -3
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +15 -3
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/types.d.ts +97 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +14 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/onboarding/bootstrap.d.ts +51 -0
- package/dist/onboarding/bootstrap.d.ts.map +1 -0
- package/dist/onboarding/bootstrap.js +92 -0
- package/dist/onboarding/bootstrap.js.map +1 -0
- package/dist/onboarding/conversation.d.ts +131 -0
- package/dist/onboarding/conversation.d.ts.map +1 -0
- package/dist/onboarding/conversation.js +259 -0
- package/dist/onboarding/conversation.js.map +1 -0
- package/dist/onboarding/flow.d.ts +63 -0
- package/dist/onboarding/flow.d.ts.map +1 -0
- package/dist/onboarding/flow.js +287 -0
- package/dist/onboarding/flow.js.map +1 -0
- package/dist/onboarding/index.d.ts +17 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +23 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/name-extraction.d.ts +42 -0
- package/dist/onboarding/name-extraction.d.ts.map +1 -0
- package/dist/onboarding/name-extraction.js +164 -0
- package/dist/onboarding/name-extraction.js.map +1 -0
- package/dist/onboarding/nerve-link.d.ts +23 -0
- package/dist/onboarding/nerve-link.d.ts.map +1 -0
- package/dist/onboarding/nerve-link.js +24 -0
- package/dist/onboarding/nerve-link.js.map +1 -0
- package/dist/onboarding/phases.d.ts +66 -0
- package/dist/onboarding/phases.d.ts.map +1 -0
- package/dist/onboarding/phases.js +167 -0
- package/dist/onboarding/phases.js.map +1 -0
- package/dist/onboarding/safe-word.d.ts +39 -0
- package/dist/onboarding/safe-word.d.ts.map +1 -0
- package/dist/onboarding/safe-word.js +90 -0
- package/dist/onboarding/safe-word.js.map +1 -0
- package/dist/onboarding/types.d.ts +124 -0
- package/dist/onboarding/types.d.ts.map +1 -0
- package/dist/onboarding/types.js +46 -0
- package/dist/onboarding/types.js.map +1 -0
- package/dist/openloop/resolution-scanner.d.ts +1 -1
- package/dist/openloop/resolution-scanner.d.ts.map +1 -1
- package/dist/openloop/resolution-scanner.js +4 -14
- package/dist/openloop/resolution-scanner.js.map +1 -1
- package/dist/plugins/index.d.ts +24 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +91 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/status.d.ts +10 -0
- package/dist/plugins/status.d.ts.map +1 -0
- package/dist/plugins/status.js +12 -0
- package/dist/plugins/status.js.map +1 -0
- package/dist/posture/index.d.ts +2 -2
- package/dist/posture/index.d.ts.map +1 -1
- package/dist/posture/index.js +1 -1
- package/dist/posture/index.js.map +1 -1
- package/dist/posture/types.d.ts +34 -0
- package/dist/posture/types.d.ts.map +1 -1
- package/dist/posture/types.js +28 -0
- package/dist/posture/types.js.map +1 -1
- package/dist/pulse/activation-event.d.ts +5 -4
- package/dist/pulse/activation-event.d.ts.map +1 -1
- package/dist/pulse/activation-event.js +31 -8
- package/dist/pulse/activation-event.js.map +1 -1
- package/dist/pulse/activation-log.d.ts.map +1 -1
- package/dist/pulse/activation-log.js.map +1 -1
- package/dist/pulse/index.d.ts +3 -0
- package/dist/pulse/index.d.ts.map +1 -1
- package/dist/pulse/index.js +4 -0
- package/dist/pulse/index.js.map +1 -1
- package/dist/pulse/tier.d.ts +67 -0
- package/dist/pulse/tier.d.ts.map +1 -0
- package/dist/pulse/tier.js +104 -0
- package/dist/pulse/tier.js.map +1 -0
- package/dist/pulse/work.d.ts +66 -0
- package/dist/pulse/work.d.ts.map +1 -0
- package/dist/pulse/work.js +117 -0
- package/dist/pulse/work.js.map +1 -0
- package/dist/runtime-lock.d.ts +51 -0
- package/dist/runtime-lock.d.ts.map +1 -0
- package/dist/runtime-lock.js +147 -0
- package/dist/runtime-lock.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1244 -188
- package/dist/server.js.map +1 -1
- package/dist/services/whatsapp.js +1 -1
- package/dist/services/whatsapp.js.map +1 -1
- package/dist/settings.d.ts +15 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +48 -1
- package/dist/settings.js.map +1 -1
- package/dist/skills/index.d.ts +2 -2
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +2 -2
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/registry.d.ts +53 -142
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +249 -611
- package/dist/skills/registry.js.map +1 -1
- package/dist/stream/emitter.d.ts +36 -0
- package/dist/stream/emitter.d.ts.map +1 -0
- package/dist/stream/emitter.js +177 -0
- package/dist/stream/emitter.js.map +1 -0
- package/dist/stream/index.d.ts +4 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +3 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/types.d.ts +100 -0
- package/dist/stream/types.d.ts.map +1 -0
- package/dist/stream/types.js +19 -0
- package/dist/stream/types.js.map +1 -0
- package/dist/threads/index.d.ts +3 -0
- package/dist/threads/index.d.ts.map +1 -0
- package/dist/threads/index.js +2 -0
- package/dist/threads/index.js.map +1 -0
- package/dist/threads/store.d.ts +36 -0
- package/dist/threads/store.d.ts.map +1 -0
- package/dist/threads/store.js +171 -0
- package/dist/threads/store.js.map +1 -0
- package/dist/threads/types.d.ts +16 -0
- package/dist/threads/types.d.ts.map +1 -0
- package/dist/threads/types.js +6 -0
- package/dist/threads/types.js.map +1 -0
- package/dist/tick/index.d.ts +10 -0
- package/dist/tick/index.d.ts.map +1 -0
- package/dist/tick/index.js +8 -0
- package/dist/tick/index.js.map +1 -0
- package/dist/tick/runner.d.ts +56 -0
- package/dist/tick/runner.d.ts.map +1 -0
- package/dist/tick/runner.js +235 -0
- package/dist/tick/runner.js.map +1 -0
- package/dist/tick/types.d.ts +73 -0
- package/dist/tick/types.d.ts.map +1 -0
- package/dist/tick/types.js +8 -0
- package/dist/tick/types.js.map +1 -0
- package/dist/tier/types.js +3 -3
- package/dist/tier/types.js.map +1 -1
- package/dist/ui-sync.d.ts +34 -0
- package/dist/ui-sync.d.ts.map +1 -0
- package/dist/ui-sync.js +108 -0
- package/dist/ui-sync.js.map +1 -0
- package/dist/utils/git.d.ts +12 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +44 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/volumes/index.d.ts +3 -0
- package/dist/volumes/index.d.ts.map +1 -0
- package/dist/volumes/index.js +2 -0
- package/dist/volumes/index.js.map +1 -0
- package/dist/volumes/manager.d.ts +83 -0
- package/dist/volumes/manager.d.ts.map +1 -0
- package/dist/volumes/manager.js +462 -0
- package/dist/volumes/manager.js.map +1 -0
- package/dist/volumes/types.d.ts +66 -0
- package/dist/volumes/types.d.ts.map +1 -0
- package/dist/volumes/types.js +8 -0
- package/dist/volumes/types.js.map +1 -0
- package/package.json +8 -5
- package/public/avatar/Hey-Dash_en_windows_v4_0_0.zip +0 -0
- package/public/avatar/README.md +43 -0
- package/public/avatar/cache/06fa55aececcc478.mp4 +0 -0
- package/public/avatar/cache/07a65738ba170827.mp4 +0 -0
- package/public/avatar/cache/08b6f4880f59a385.mp4 +0 -0
- package/public/avatar/cache/0ef9e0e78d715af4.mp4 +0 -0
- package/public/avatar/cache/0fa85e9e8f444a8b.mp4 +0 -0
- package/public/avatar/cache/1185fd491f413406.mp4 +0 -0
- package/public/avatar/cache/1b374d5390258fea.mp4 +0 -0
- package/public/avatar/cache/1e2367029b92f8aa.mp4 +0 -0
- package/public/avatar/cache/272c004a41087de5.mp4 +0 -0
- package/public/avatar/cache/2a0f3ff34d92521a.mp4 +0 -0
- package/public/avatar/cache/307a6f70859aeab8.mp4 +0 -0
- package/public/avatar/cache/332384e088ca214b.mp4 +0 -0
- package/public/avatar/cache/39fc4e81574d14ed.mp4 +0 -0
- package/public/avatar/cache/4a5c6051c1ef6a71.mp4 +0 -0
- package/public/avatar/cache/51f4aa76398c8c29.mp4 +0 -0
- package/public/avatar/cache/5d9a960bbf71732c.mp4 +0 -0
- package/public/avatar/cache/5e0954401e15af89.mp4 +0 -0
- package/public/avatar/cache/884ae6717fcacdd5.mp4 +0 -0
- package/public/avatar/cache/8ea0b7220d139615.mp4 +0 -0
- package/public/avatar/cache/9b9c4f7b8508eecc.mp4 +0 -0
- package/public/avatar/cache/9be1030ec2aa2b01.mp4 +0 -0
- package/public/avatar/cache/b35f7a3d558f22cb.mp4 +0 -0
- package/public/avatar/cache/be89f49970672374.mp4 +0 -0
- package/public/avatar/cache/c11fdc99479492b6.mp4 +0 -0
- package/public/avatar/cache/c900811e3382ac6d.mp4 +0 -0
- package/public/avatar/cache/d42a73667acf5716.mp4 +0 -0
- package/public/avatar/cache/e539f247a8908603.mp4 +0 -0
- package/public/avatar/cache/e78fceae2373b7c1.mp4 +0 -0
- package/public/avatar/cache/ec95af57d33b3f07.mp4 +0 -0
- package/public/avatar/cache/eeb8d775f40dbe2c.mp4 +0 -0
- package/public/avatar/dash_headhshot_v1.png +0 -0
- package/public/avatar/idle.mp4 +0 -0
- package/public/avatar/photo.png +0 -0
- package/public/board.html +6 -0
- package/public/browser.html +6 -2
- package/public/demo-data/Family Photos/2024/christmas-dinner.txt +13 -0
- package/public/demo-data/Family Photos/2025/summer-cookout.txt +13 -0
- package/public/demo-data/Financial/Insurance/auto-policy.txt +26 -0
- package/public/demo-data/Financial/Insurance/homeowners-policy.txt +20 -0
- package/public/demo-data/Financial/Taxes/property-tax-2025.txt +18 -0
- package/public/demo-data/Financial/Taxes/w2-2025.txt +18 -0
- package/public/demo-data/Health Records/lab-results-2026.txt +26 -0
- package/public/demo-data/Health Records/prescription-list.txt +24 -0
- package/public/demo-data/Health Records/vaccination-record.csv +8 -0
- package/public/demo-data/Legal/Estate/beneficiary-contacts.csv +4 -0
- package/public/demo-data/Legal/Estate/will-summary.txt +22 -0
- package/public/demo-data/Recipes/christmas-cookies.md +25 -0
- package/public/demo-data/Recipes/grandmas-chili.md +30 -0
- package/public/demo-data/Work/Contracts/lawn-service-2026.txt +23 -0
- package/public/demo-data/Work/Projects/project-status.md +19 -0
- package/public/demo-data/passwords.txt +13 -0
- package/public/demo-ingest.html +388 -0
- package/public/help.html +4 -1
- package/public/icon-192.png +0 -0
- package/public/icon-512.png +0 -0
- package/public/index.html +2641 -574
- package/public/library.html +51 -29
- package/public/manifest.json +21 -0
- package/public/nerve/icon-192.svg +6 -0
- package/public/nerve/icon-512.svg +6 -0
- package/public/nerve/index.html +698 -0
- package/public/nerve/manifest.json +24 -0
- package/public/nerve/sw.js +84 -0
- package/public/observatory.html +5 -1
- package/public/ops.html +33 -3
- package/public/pulse.html +3 -0
- package/public/registry.html +6 -2
- package/public/roadmap.html +7 -2
- package/public/sw.js +65 -0
- package/brain-template/registry.md +0 -566
- package/brain-template/rest_api-integration.md +0 -522
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed module — public API.
|
|
3
|
+
* Wires FeedClient + MixingEngine + Metrics into a single facade.
|
|
4
|
+
*
|
|
5
|
+
* Portability: Field/compost resonance is injectable via ResonanceComputer.
|
|
6
|
+
* Without it, the feed works — compost signals are simply skipped.
|
|
7
|
+
*/
|
|
8
|
+
import { MixingEngine, type ResonanceComputer, type FieldShape } from "./mixer.js";
|
|
9
|
+
import type { FeedConfig, FeedTier, MixedInsight, FeedStatus } from "./types.js";
|
|
10
|
+
import type { LongTermMemoryStore } from "../memory/long-term.js";
|
|
11
|
+
import type { WorkingMemory } from "../types.js";
|
|
12
|
+
export interface FeedOptions {
|
|
13
|
+
config: FeedConfig;
|
|
14
|
+
ltm: LongTermMemoryStore;
|
|
15
|
+
/** Optional resonance computer for compost signal filtering. */
|
|
16
|
+
resonanceComputer?: ResonanceComputer;
|
|
17
|
+
/** Optional initial field shape for compost resonance. */
|
|
18
|
+
fieldShape?: FieldShape;
|
|
19
|
+
}
|
|
20
|
+
export declare class Feed {
|
|
21
|
+
private client;
|
|
22
|
+
private mixer;
|
|
23
|
+
private metricsCollector;
|
|
24
|
+
private ltm;
|
|
25
|
+
private workingMemory;
|
|
26
|
+
private unsubscribe;
|
|
27
|
+
constructor(options: FeedOptions);
|
|
28
|
+
/** Start the feed. Brain/agents/nerves work without this — it's additive. */
|
|
29
|
+
start(): void;
|
|
30
|
+
/** Stop the feed. Everything else keeps working. */
|
|
31
|
+
stop(): void;
|
|
32
|
+
/** Update working memory reference (call each turn so mixer has fresh context). */
|
|
33
|
+
setWorkingMemory(wm: WorkingMemory): void;
|
|
34
|
+
/** Update the local field shape (refreshes resonance in the mixer). */
|
|
35
|
+
setFieldShape(shape: FieldShape): void;
|
|
36
|
+
/** Set the resonance computer for compost signal processing. */
|
|
37
|
+
setResonanceComputer(computer: ResonanceComputer): void;
|
|
38
|
+
/** Get mixed insights relevant to a query, for injection into context assembly. */
|
|
39
|
+
getInsightsForContext(query: string, limit?: number): MixedInsight[];
|
|
40
|
+
/** Get all recent insights sorted by relevance. */
|
|
41
|
+
getInsights(limit?: number): MixedInsight[];
|
|
42
|
+
/** Format insights as a context block for injection into supporting content. */
|
|
43
|
+
formatInsightsForContext(query: string, limit?: number): string;
|
|
44
|
+
/** Current tier. */
|
|
45
|
+
get tier(): FeedTier;
|
|
46
|
+
/** Update subscription tier. */
|
|
47
|
+
setTier(tier: FeedTier): void;
|
|
48
|
+
/** Feed health status. */
|
|
49
|
+
getStatus(): FeedStatus;
|
|
50
|
+
/** Feed metrics for dashboards/reporting. */
|
|
51
|
+
getMetrics(): import("./metrics.js").FeedMetrics;
|
|
52
|
+
/** Access the mixing engine for custom strategy registration. */
|
|
53
|
+
getMixer(): MixingEngine;
|
|
54
|
+
private handleNewItems;
|
|
55
|
+
}
|
|
56
|
+
export type { FeedConfig, FeedItem, FeedTier, FeedSignalType, FeedStatus, MixedInsight, TierCapabilities, } from "./types.js";
|
|
57
|
+
export { FeedClient } from "./client.js";
|
|
58
|
+
export { MixingEngine, type MixStrategy, type LocalContext, type BrainStats, type ResonanceComputer, type FieldShape, type CompostSignal, type ResonanceResult } from "./mixer.js";
|
|
59
|
+
export { FeedMetricsCollector, type FeedMetrics } from "./metrics.js";
|
|
60
|
+
export { getTierCapabilities, tierMeetsMinimum, filterByTier, isSignalAvailable } from "./tiers.js";
|
|
61
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feed/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,KAAK,EAAE,UAAU,EAAY,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,mBAAmB,CAAC;IACzB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,WAAW,CAA6B;gBAEpC,OAAO,EAAE,WAAW;IAchC,6EAA6E;IAC7E,KAAK,IAAI,IAAI;IAKb,oDAAoD;IACpD,IAAI,IAAI,IAAI;IAQZ,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI;IAIzC,uEAAuE;IACvE,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAItC,gEAAgE;IAChE,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIvD,mFAAmF;IACnF,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE;IAQ/D,mDAAmD;IACnD,WAAW,CAAC,KAAK,SAAK,GAAG,YAAY,EAAE;IAIvC,gFAAgF;IAChF,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM;IAU1D,oBAAoB;IACpB,IAAI,IAAI,IAAI,QAAQ,CAEnB;IAED,gCAAgC;IAChC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAK7B,0BAA0B;IAC1B,SAAS,IAAI,UAAU;IASvB,6CAA6C;IAC7C,UAAU;IAIV,iEAAiE;IACjE,QAAQ,IAAI,YAAY;YAMV,cAAc;CAY7B;AAGD,YAAY,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,UAAU,EACV,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AACnL,OAAO,EAAE,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed module — public API.
|
|
3
|
+
* Wires FeedClient + MixingEngine + Metrics into a single facade.
|
|
4
|
+
*
|
|
5
|
+
* Portability: Field/compost resonance is injectable via ResonanceComputer.
|
|
6
|
+
* Without it, the feed works — compost signals are simply skipped.
|
|
7
|
+
*/
|
|
8
|
+
import { FeedClient } from "./client.js";
|
|
9
|
+
import { MixingEngine } from "./mixer.js";
|
|
10
|
+
import { FeedMetricsCollector } from "./metrics.js";
|
|
11
|
+
export class Feed {
|
|
12
|
+
client;
|
|
13
|
+
mixer;
|
|
14
|
+
metricsCollector;
|
|
15
|
+
ltm;
|
|
16
|
+
workingMemory = null;
|
|
17
|
+
unsubscribe = null;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.client = new FeedClient(options.config);
|
|
20
|
+
this.mixer = new MixingEngine();
|
|
21
|
+
this.metricsCollector = new FeedMetricsCollector(options.config.tier);
|
|
22
|
+
this.ltm = options.ltm;
|
|
23
|
+
if (options.resonanceComputer) {
|
|
24
|
+
this.mixer.setResonanceComputer(options.resonanceComputer);
|
|
25
|
+
}
|
|
26
|
+
if (options.fieldShape) {
|
|
27
|
+
this.mixer.setFieldShape(options.fieldShape);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Start the feed. Brain/agents/nerves work without this — it's additive. */
|
|
31
|
+
start() {
|
|
32
|
+
this.unsubscribe = this.client.onItems(items => this.handleNewItems(items));
|
|
33
|
+
this.client.start();
|
|
34
|
+
}
|
|
35
|
+
/** Stop the feed. Everything else keeps working. */
|
|
36
|
+
stop() {
|
|
37
|
+
this.client.stop();
|
|
38
|
+
if (this.unsubscribe) {
|
|
39
|
+
this.unsubscribe();
|
|
40
|
+
this.unsubscribe = null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Update working memory reference (call each turn so mixer has fresh context). */
|
|
44
|
+
setWorkingMemory(wm) {
|
|
45
|
+
this.workingMemory = wm;
|
|
46
|
+
}
|
|
47
|
+
/** Update the local field shape (refreshes resonance in the mixer). */
|
|
48
|
+
setFieldShape(shape) {
|
|
49
|
+
this.mixer.setFieldShape(shape);
|
|
50
|
+
}
|
|
51
|
+
/** Set the resonance computer for compost signal processing. */
|
|
52
|
+
setResonanceComputer(computer) {
|
|
53
|
+
this.mixer.setResonanceComputer(computer);
|
|
54
|
+
}
|
|
55
|
+
/** Get mixed insights relevant to a query, for injection into context assembly. */
|
|
56
|
+
getInsightsForContext(query, limit = 3) {
|
|
57
|
+
const insights = this.mixer.getRelevantInsights(query, limit);
|
|
58
|
+
for (const _ of insights) {
|
|
59
|
+
this.metricsCollector.recordInsightSurfaced();
|
|
60
|
+
}
|
|
61
|
+
return insights;
|
|
62
|
+
}
|
|
63
|
+
/** Get all recent insights sorted by relevance. */
|
|
64
|
+
getInsights(limit = 10) {
|
|
65
|
+
return this.mixer.getInsights(limit);
|
|
66
|
+
}
|
|
67
|
+
/** Format insights as a context block for injection into supporting content. */
|
|
68
|
+
formatInsightsForContext(query, limit = 3) {
|
|
69
|
+
const insights = this.getInsightsForContext(query, limit);
|
|
70
|
+
if (insights.length === 0)
|
|
71
|
+
return "";
|
|
72
|
+
const lines = insights.map(i => `- [${i.feedSignalType}] ${i.insight} (relevance: ${(i.relevance * 100).toFixed(0)}%)`);
|
|
73
|
+
return `Feed insights:\n${lines.join("\n")}`;
|
|
74
|
+
}
|
|
75
|
+
/** Current tier. */
|
|
76
|
+
get tier() {
|
|
77
|
+
return this.client.getStatus().tier;
|
|
78
|
+
}
|
|
79
|
+
/** Update subscription tier. */
|
|
80
|
+
setTier(tier) {
|
|
81
|
+
this.client.setTier(tier);
|
|
82
|
+
this.metricsCollector.setTier(tier);
|
|
83
|
+
}
|
|
84
|
+
/** Feed health status. */
|
|
85
|
+
getStatus() {
|
|
86
|
+
const clientStatus = this.client.getStatus();
|
|
87
|
+
return {
|
|
88
|
+
...clientStatus,
|
|
89
|
+
insightsGenerated: this.mixer.insightCount,
|
|
90
|
+
avgRelevance: this.mixer.avgRelevance,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Feed metrics for dashboards/reporting. */
|
|
94
|
+
getMetrics() {
|
|
95
|
+
return this.metricsCollector.getMetrics();
|
|
96
|
+
}
|
|
97
|
+
/** Access the mixing engine for custom strategy registration. */
|
|
98
|
+
getMixer() {
|
|
99
|
+
return this.mixer;
|
|
100
|
+
}
|
|
101
|
+
// --- Private ---
|
|
102
|
+
async handleNewItems(items) {
|
|
103
|
+
this.metricsCollector.setConnected(true);
|
|
104
|
+
this.metricsCollector.recordItemsReceived(items.length, items.map(i => i.type));
|
|
105
|
+
const insights = await this.mixer.mix(items, this.ltm, this.workingMemory);
|
|
106
|
+
if (insights.length > 0) {
|
|
107
|
+
this.metricsCollector.recordInsights(insights);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export { FeedClient } from "./client.js";
|
|
112
|
+
export { MixingEngine } from "./mixer.js";
|
|
113
|
+
export { FeedMetricsCollector } from "./metrics.js";
|
|
114
|
+
export { getTierCapabilities, tierMeetsMinimum, filterByTier, isSignalAvailable } from "./tiers.js";
|
|
115
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feed/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed metrics — measure feed value and engagement.
|
|
3
|
+
* Tracks whether the feed is earning its price.
|
|
4
|
+
*/
|
|
5
|
+
import type { FeedTier, FeedSignalType, MixedInsight, FeedStatus } from "./types.js";
|
|
6
|
+
export interface FeedMetrics {
|
|
7
|
+
/** Total feed items received since startup. */
|
|
8
|
+
itemsReceived: number;
|
|
9
|
+
/** Items by signal type. */
|
|
10
|
+
itemsByType: Partial<Record<FeedSignalType, number>>;
|
|
11
|
+
/** Total insights generated by the mixing engine. */
|
|
12
|
+
insightsGenerated: number;
|
|
13
|
+
/** Insights that were surfaced to the user (injected into context). */
|
|
14
|
+
insightsSurfaced: number;
|
|
15
|
+
/** Average relevance score of generated insights. */
|
|
16
|
+
avgRelevance: number;
|
|
17
|
+
/** Feed uptime ratio (connected time / total time). */
|
|
18
|
+
uptimeRatio: number;
|
|
19
|
+
/** Current tier. */
|
|
20
|
+
tier: FeedTier;
|
|
21
|
+
/** Timestamp of first item received. */
|
|
22
|
+
firstItemAt: string | null;
|
|
23
|
+
/** Timestamp of most recent item. */
|
|
24
|
+
lastItemAt: string | null;
|
|
25
|
+
}
|
|
26
|
+
export declare class FeedMetricsCollector {
|
|
27
|
+
private itemsReceived;
|
|
28
|
+
private itemsByType;
|
|
29
|
+
private insightsGenerated;
|
|
30
|
+
private insightsSurfaced;
|
|
31
|
+
private relevanceSum;
|
|
32
|
+
private connectedMs;
|
|
33
|
+
private totalMs;
|
|
34
|
+
private lastTickAt;
|
|
35
|
+
private connected;
|
|
36
|
+
private tier;
|
|
37
|
+
private firstItemAt;
|
|
38
|
+
private lastItemAt;
|
|
39
|
+
constructor(tier: FeedTier);
|
|
40
|
+
/** Call periodically (or before reading metrics) to update uptime tracking. */
|
|
41
|
+
tick(): void;
|
|
42
|
+
recordItemsReceived(count: number, types: FeedSignalType[]): void;
|
|
43
|
+
recordInsights(insights: MixedInsight[]): void;
|
|
44
|
+
recordInsightSurfaced(): void;
|
|
45
|
+
setConnected(connected: boolean): void;
|
|
46
|
+
setTier(tier: FeedTier): void;
|
|
47
|
+
getMetrics(): FeedMetrics;
|
|
48
|
+
/** Snapshot for feed status reporting. */
|
|
49
|
+
toFeedStatus(cachedItems: number): FeedStatus;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/feed/metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAErF,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,gBAAgB,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,wCAAwC;IACxC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qCAAqC;IACrC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,UAAU,CAAuB;gBAE7B,IAAI,EAAE,QAAQ;IAI1B,+EAA+E;IAC/E,IAAI,IAAI,IAAI;IAUZ,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAUjE,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAO9C,qBAAqB,IAAI,IAAI;IAI7B,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAKtC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAI7B,UAAU,IAAI,WAAW;IAezB,0CAA0C;IAC1C,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU;CAW9C"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed metrics — measure feed value and engagement.
|
|
3
|
+
* Tracks whether the feed is earning its price.
|
|
4
|
+
*/
|
|
5
|
+
export class FeedMetricsCollector {
|
|
6
|
+
itemsReceived = 0;
|
|
7
|
+
itemsByType = {};
|
|
8
|
+
insightsGenerated = 0;
|
|
9
|
+
insightsSurfaced = 0;
|
|
10
|
+
relevanceSum = 0;
|
|
11
|
+
connectedMs = 0;
|
|
12
|
+
totalMs = 0;
|
|
13
|
+
lastTickAt = Date.now();
|
|
14
|
+
connected = false;
|
|
15
|
+
tier;
|
|
16
|
+
firstItemAt = null;
|
|
17
|
+
lastItemAt = null;
|
|
18
|
+
constructor(tier) {
|
|
19
|
+
this.tier = tier;
|
|
20
|
+
}
|
|
21
|
+
/** Call periodically (or before reading metrics) to update uptime tracking. */
|
|
22
|
+
tick() {
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
const elapsed = now - this.lastTickAt;
|
|
25
|
+
this.totalMs += elapsed;
|
|
26
|
+
if (this.connected) {
|
|
27
|
+
this.connectedMs += elapsed;
|
|
28
|
+
}
|
|
29
|
+
this.lastTickAt = now;
|
|
30
|
+
}
|
|
31
|
+
recordItemsReceived(count, types) {
|
|
32
|
+
this.itemsReceived += count;
|
|
33
|
+
const now = new Date().toISOString();
|
|
34
|
+
if (!this.firstItemAt)
|
|
35
|
+
this.firstItemAt = now;
|
|
36
|
+
this.lastItemAt = now;
|
|
37
|
+
for (const t of types) {
|
|
38
|
+
this.itemsByType[t] = (this.itemsByType[t] ?? 0) + 1;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
recordInsights(insights) {
|
|
42
|
+
this.insightsGenerated += insights.length;
|
|
43
|
+
for (const i of insights) {
|
|
44
|
+
this.relevanceSum += i.relevance;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
recordInsightSurfaced() {
|
|
48
|
+
this.insightsSurfaced++;
|
|
49
|
+
}
|
|
50
|
+
setConnected(connected) {
|
|
51
|
+
this.tick();
|
|
52
|
+
this.connected = connected;
|
|
53
|
+
}
|
|
54
|
+
setTier(tier) {
|
|
55
|
+
this.tier = tier;
|
|
56
|
+
}
|
|
57
|
+
getMetrics() {
|
|
58
|
+
this.tick();
|
|
59
|
+
return {
|
|
60
|
+
itemsReceived: this.itemsReceived,
|
|
61
|
+
itemsByType: { ...this.itemsByType },
|
|
62
|
+
insightsGenerated: this.insightsGenerated,
|
|
63
|
+
insightsSurfaced: this.insightsSurfaced,
|
|
64
|
+
avgRelevance: this.insightsGenerated > 0 ? this.relevanceSum / this.insightsGenerated : 0,
|
|
65
|
+
uptimeRatio: this.totalMs > 0 ? this.connectedMs / this.totalMs : 0,
|
|
66
|
+
tier: this.tier,
|
|
67
|
+
firstItemAt: this.firstItemAt,
|
|
68
|
+
lastItemAt: this.lastItemAt,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Snapshot for feed status reporting. */
|
|
72
|
+
toFeedStatus(cachedItems) {
|
|
73
|
+
this.tick();
|
|
74
|
+
return {
|
|
75
|
+
connected: this.connected,
|
|
76
|
+
tier: this.tier,
|
|
77
|
+
lastReceivedAt: this.lastItemAt,
|
|
78
|
+
itemsCached: cachedItems,
|
|
79
|
+
insightsGenerated: this.insightsGenerated,
|
|
80
|
+
avgRelevance: this.insightsGenerated > 0 ? this.relevanceSum / this.insightsGenerated : 0,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/feed/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MixingEngine — the core of the feed business model.
|
|
3
|
+
* Combines public/paid feed signal with private local brain data.
|
|
4
|
+
*
|
|
5
|
+
* KEY INVARIANT: Private data never leaves this host.
|
|
6
|
+
* The mix is computed locally. runcore.sh never sees the result.
|
|
7
|
+
*
|
|
8
|
+
* Portability: ResonanceComputer is injectable. The compost/field system
|
|
9
|
+
* injects the concrete implementation at runtime. Without it, compost
|
|
10
|
+
* signals are simply skipped — all other strategies work standalone.
|
|
11
|
+
*/
|
|
12
|
+
import type { FeedItem, MixedInsight, FeedSignalType } from "./types.js";
|
|
13
|
+
import type { MemoryEntry, WorkingMemory } from "../types.js";
|
|
14
|
+
import type { LongTermMemoryStore } from "../memory/long-term.js";
|
|
15
|
+
/** Shape of a field — opaque to the mixer, interpreted by the resonance computer. */
|
|
16
|
+
export type FieldShape = Record<string, number>;
|
|
17
|
+
/** Compost signal extracted from a feed item payload. */
|
|
18
|
+
export interface CompostSignal {
|
|
19
|
+
id: string;
|
|
20
|
+
signalType: string;
|
|
21
|
+
pattern: Record<string, unknown>;
|
|
22
|
+
originShape: FieldShape;
|
|
23
|
+
producedAt: string;
|
|
24
|
+
receivedAt: string;
|
|
25
|
+
}
|
|
26
|
+
/** Result of computing resonance between a compost signal and a local field. */
|
|
27
|
+
export interface ResonanceResult {
|
|
28
|
+
score: number;
|
|
29
|
+
shouldSurface: boolean;
|
|
30
|
+
dimensions: Array<{
|
|
31
|
+
dimension: string;
|
|
32
|
+
similarity: number;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
/** Injectable interface for computing compost resonance. */
|
|
36
|
+
export interface ResonanceComputer {
|
|
37
|
+
compute(signal: CompostSignal, localShape: FieldShape): ResonanceResult;
|
|
38
|
+
}
|
|
39
|
+
/** Strategy for mixing a specific signal type with local data. */
|
|
40
|
+
export interface MixStrategy {
|
|
41
|
+
signalType: FeedSignalType;
|
|
42
|
+
/** Compute a mixed insight from a feed item + local context. Returns null if not relevant. */
|
|
43
|
+
mix(item: FeedItem, localContext: LocalContext): MixedInsight | null;
|
|
44
|
+
}
|
|
45
|
+
/** Local context snapshot provided to mix strategies. Never transmitted. */
|
|
46
|
+
export interface LocalContext {
|
|
47
|
+
recentMemories: MemoryEntry[];
|
|
48
|
+
workingMemory: WorkingMemory | null;
|
|
49
|
+
/** Summary stats about the brain (counts, not content). */
|
|
50
|
+
brainStats: BrainStats;
|
|
51
|
+
}
|
|
52
|
+
export interface BrainStats {
|
|
53
|
+
totalMemories: number;
|
|
54
|
+
episodicCount: number;
|
|
55
|
+
semanticCount: number;
|
|
56
|
+
proceduralCount: number;
|
|
57
|
+
activeGoal: string | null;
|
|
58
|
+
agentCount: number;
|
|
59
|
+
}
|
|
60
|
+
export declare class MixingEngine {
|
|
61
|
+
private strategies;
|
|
62
|
+
private insights;
|
|
63
|
+
private maxInsights;
|
|
64
|
+
private fieldShape;
|
|
65
|
+
private resonanceComputer;
|
|
66
|
+
constructor();
|
|
67
|
+
/** Set the local field shape for compost resonance filtering. */
|
|
68
|
+
setFieldShape(shape: FieldShape): void;
|
|
69
|
+
/** Set the resonance computer for compost signal processing. */
|
|
70
|
+
setResonanceComputer(computer: ResonanceComputer): void;
|
|
71
|
+
private createCompostStrategy;
|
|
72
|
+
/** Register a custom mix strategy for a signal type. */
|
|
73
|
+
registerStrategy(strategy: MixStrategy): void;
|
|
74
|
+
/**
|
|
75
|
+
* Mix a batch of feed items with local brain context.
|
|
76
|
+
* Returns only the insights that are relevant (relevance > 0).
|
|
77
|
+
*/
|
|
78
|
+
mix(items: FeedItem[], ltm: LongTermMemoryStore, workingMemory: WorkingMemory | null): Promise<MixedInsight[]>;
|
|
79
|
+
/** Get recent mixed insights, sorted by relevance. */
|
|
80
|
+
getInsights(limit?: number): MixedInsight[];
|
|
81
|
+
/** Get insights relevant to a query (simple keyword match on insight text). */
|
|
82
|
+
getRelevantInsights(query: string, limit?: number): MixedInsight[];
|
|
83
|
+
/** Total insights generated (for metrics). */
|
|
84
|
+
get insightCount(): number;
|
|
85
|
+
/** Average relevance of stored insights. */
|
|
86
|
+
get avgRelevance(): number;
|
|
87
|
+
private buildLocalContext;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=mixer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixer.d.ts","sourceRoot":"","sources":["../../src/feed/mixer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAIlE,qFAAqF;AACrF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,WAAW,EAAE,UAAU,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AAED,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,GAAG,eAAe,CAAC;CACzE;AAID,kEAAkE;AAClE,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,cAAc,CAAC;IAC3B,8FAA8F;IAC9F,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,GAAG,YAAY,GAAG,IAAI,CAAC;CACtE;AAED,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,2DAA2D;IAC3D,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,WAAW,CAAO;IAC1B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,iBAAiB,CAAkC;;IAW3D,iEAAiE;IACjE,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAItC,gEAAgE;IAChE,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIvD,OAAO,CAAC,qBAAqB;IAoC7B,wDAAwD;IACxD,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAI7C;;;OAGG;IACG,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,mBAAmB,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAuBpH,sDAAsD;IACtD,WAAW,CAAC,KAAK,SAAK,GAAG,YAAY,EAAE;IAMvC,+EAA+E;IAC/E,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE;IAU7D,8CAA8C;IAC9C,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,4CAA4C;IAC5C,IAAI,YAAY,IAAI,MAAM,CAIzB;YAEa,iBAAiB;CAyBhC"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MixingEngine — the core of the feed business model.
|
|
3
|
+
* Combines public/paid feed signal with private local brain data.
|
|
4
|
+
*
|
|
5
|
+
* KEY INVARIANT: Private data never leaves this host.
|
|
6
|
+
* The mix is computed locally. runcore.sh never sees the result.
|
|
7
|
+
*
|
|
8
|
+
* Portability: ResonanceComputer is injectable. The compost/field system
|
|
9
|
+
* injects the concrete implementation at runtime. Without it, compost
|
|
10
|
+
* signals are simply skipped — all other strategies work standalone.
|
|
11
|
+
*/
|
|
12
|
+
// ─── Engine ─────────────────────────────────────────────────────────────────
|
|
13
|
+
export class MixingEngine {
|
|
14
|
+
strategies = new Map();
|
|
15
|
+
insights = [];
|
|
16
|
+
maxInsights = 100;
|
|
17
|
+
fieldShape = null;
|
|
18
|
+
resonanceComputer = null;
|
|
19
|
+
constructor() {
|
|
20
|
+
// Register built-in strategies
|
|
21
|
+
this.registerStrategy(patternIntelligenceStrategy);
|
|
22
|
+
this.registerStrategy(securityPatchStrategy);
|
|
23
|
+
this.registerStrategy(dictionaryUpdateStrategy);
|
|
24
|
+
this.registerStrategy(communitySignalStrategy);
|
|
25
|
+
this.registerStrategy(this.createCompostStrategy());
|
|
26
|
+
}
|
|
27
|
+
/** Set the local field shape for compost resonance filtering. */
|
|
28
|
+
setFieldShape(shape) {
|
|
29
|
+
this.fieldShape = shape;
|
|
30
|
+
}
|
|
31
|
+
/** Set the resonance computer for compost signal processing. */
|
|
32
|
+
setResonanceComputer(computer) {
|
|
33
|
+
this.resonanceComputer = computer;
|
|
34
|
+
}
|
|
35
|
+
createCompostStrategy() {
|
|
36
|
+
return {
|
|
37
|
+
signalType: "compost",
|
|
38
|
+
mix: (item, _ctx) => {
|
|
39
|
+
if (!this.fieldShape || !this.resonanceComputer)
|
|
40
|
+
return null;
|
|
41
|
+
// Extract compost signal from feed item payload
|
|
42
|
+
const signal = {
|
|
43
|
+
id: item.id,
|
|
44
|
+
signalType: item.payload["signalType"] ?? "unknown",
|
|
45
|
+
pattern: item.payload["pattern"] ?? {},
|
|
46
|
+
originShape: item.payload["originShape"],
|
|
47
|
+
producedAt: item.publishedAt,
|
|
48
|
+
receivedAt: item.receivedAt,
|
|
49
|
+
};
|
|
50
|
+
if (!signal.originShape)
|
|
51
|
+
return null;
|
|
52
|
+
const result = this.resonanceComputer.compute(signal, this.fieldShape);
|
|
53
|
+
if (!result.shouldSurface)
|
|
54
|
+
return null;
|
|
55
|
+
return {
|
|
56
|
+
feedItemId: item.id,
|
|
57
|
+
feedSignalType: "compost",
|
|
58
|
+
insight: `Compost pattern "${item.title}" resonates with your field (${(result.score * 100).toFixed(0)}%). Signal type: ${signal.signalType}.`,
|
|
59
|
+
relevance: result.score,
|
|
60
|
+
localSources: result.dimensions
|
|
61
|
+
.filter(d => d.similarity > 0.7)
|
|
62
|
+
.map(d => d.dimension),
|
|
63
|
+
mixedAt: new Date().toISOString(),
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** Register a custom mix strategy for a signal type. */
|
|
69
|
+
registerStrategy(strategy) {
|
|
70
|
+
this.strategies.set(strategy.signalType, strategy);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Mix a batch of feed items with local brain context.
|
|
74
|
+
* Returns only the insights that are relevant (relevance > 0).
|
|
75
|
+
*/
|
|
76
|
+
async mix(items, ltm, workingMemory) {
|
|
77
|
+
const localContext = await this.buildLocalContext(ltm, workingMemory);
|
|
78
|
+
const newInsights = [];
|
|
79
|
+
for (const item of items) {
|
|
80
|
+
const strategy = this.strategies.get(item.type);
|
|
81
|
+
if (!strategy)
|
|
82
|
+
continue;
|
|
83
|
+
const insight = strategy.mix(item, localContext);
|
|
84
|
+
if (insight && insight.relevance > 0) {
|
|
85
|
+
newInsights.push(insight);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Store insights
|
|
89
|
+
this.insights.push(...newInsights);
|
|
90
|
+
if (this.insights.length > this.maxInsights) {
|
|
91
|
+
this.insights = this.insights.slice(-this.maxInsights);
|
|
92
|
+
}
|
|
93
|
+
return newInsights;
|
|
94
|
+
}
|
|
95
|
+
/** Get recent mixed insights, sorted by relevance. */
|
|
96
|
+
getInsights(limit = 10) {
|
|
97
|
+
return [...this.insights]
|
|
98
|
+
.sort((a, b) => b.relevance - a.relevance)
|
|
99
|
+
.slice(0, limit);
|
|
100
|
+
}
|
|
101
|
+
/** Get insights relevant to a query (simple keyword match on insight text). */
|
|
102
|
+
getRelevantInsights(query, limit = 5) {
|
|
103
|
+
const terms = query.toLowerCase().split(/\s+/).filter(t => t.length > 2);
|
|
104
|
+
if (terms.length === 0)
|
|
105
|
+
return this.getInsights(limit);
|
|
106
|
+
return this.insights
|
|
107
|
+
.filter(i => terms.some(t => i.insight.toLowerCase().includes(t)))
|
|
108
|
+
.sort((a, b) => b.relevance - a.relevance)
|
|
109
|
+
.slice(0, limit);
|
|
110
|
+
}
|
|
111
|
+
/** Total insights generated (for metrics). */
|
|
112
|
+
get insightCount() {
|
|
113
|
+
return this.insights.length;
|
|
114
|
+
}
|
|
115
|
+
/** Average relevance of stored insights. */
|
|
116
|
+
get avgRelevance() {
|
|
117
|
+
if (this.insights.length === 0)
|
|
118
|
+
return 0;
|
|
119
|
+
const sum = this.insights.reduce((acc, i) => acc + i.relevance, 0);
|
|
120
|
+
return sum / this.insights.length;
|
|
121
|
+
}
|
|
122
|
+
async buildLocalContext(ltm, workingMemory) {
|
|
123
|
+
const [episodic, semantic, procedural] = await Promise.all([
|
|
124
|
+
ltm.list("episodic"),
|
|
125
|
+
ltm.list("semantic"),
|
|
126
|
+
ltm.list("procedural"),
|
|
127
|
+
]);
|
|
128
|
+
const allMemories = [...episodic, ...semantic, ...procedural];
|
|
129
|
+
const recentMemories = allMemories
|
|
130
|
+
.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())
|
|
131
|
+
.slice(0, 50); // last 50 for mix context
|
|
132
|
+
return {
|
|
133
|
+
recentMemories,
|
|
134
|
+
workingMemory,
|
|
135
|
+
brainStats: {
|
|
136
|
+
totalMemories: allMemories.length,
|
|
137
|
+
episodicCount: episodic.length,
|
|
138
|
+
semanticCount: semantic.length,
|
|
139
|
+
proceduralCount: procedural.length,
|
|
140
|
+
activeGoal: workingMemory?.activeGoal ?? null,
|
|
141
|
+
agentCount: 0, // populated by caller if needed
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// --- Built-in mix strategies ---
|
|
147
|
+
const patternIntelligenceStrategy = {
|
|
148
|
+
signalType: "pattern_intelligence",
|
|
149
|
+
mix(item, ctx) {
|
|
150
|
+
const pattern = item.payload["pattern"];
|
|
151
|
+
if (!pattern)
|
|
152
|
+
return null;
|
|
153
|
+
// Check if pattern is relevant to local brain state
|
|
154
|
+
const patternTerms = pattern.toLowerCase().split(/\s+/).filter(t => t.length > 3);
|
|
155
|
+
const matchingMemories = ctx.recentMemories.filter(m => patternTerms.some(t => m.content.toLowerCase().includes(t)));
|
|
156
|
+
if (matchingMemories.length === 0)
|
|
157
|
+
return null;
|
|
158
|
+
const relevance = Math.min(1, matchingMemories.length / 5);
|
|
159
|
+
const localSources = [...new Set(matchingMemories.map(m => m.type))];
|
|
160
|
+
return {
|
|
161
|
+
feedItemId: item.id,
|
|
162
|
+
feedSignalType: item.type,
|
|
163
|
+
insight: `Field pattern "${item.title}" may apply to your brain. ${matchingMemories.length} local memories relate to this pattern.`,
|
|
164
|
+
relevance,
|
|
165
|
+
localSources,
|
|
166
|
+
mixedAt: new Date().toISOString(),
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
const securityPatchStrategy = {
|
|
171
|
+
signalType: "security_patch",
|
|
172
|
+
mix(item, _ctx) {
|
|
173
|
+
// Security patches are always relevant
|
|
174
|
+
return {
|
|
175
|
+
feedItemId: item.id,
|
|
176
|
+
feedSignalType: item.type,
|
|
177
|
+
insight: `Security update: ${item.title}. Apply immediately.`,
|
|
178
|
+
relevance: 1.0,
|
|
179
|
+
localSources: ["membrane"],
|
|
180
|
+
mixedAt: new Date().toISOString(),
|
|
181
|
+
};
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
const dictionaryUpdateStrategy = {
|
|
185
|
+
signalType: "dictionary_update",
|
|
186
|
+
mix(item, ctx) {
|
|
187
|
+
const topics = item.payload["topics"] ?? [];
|
|
188
|
+
if (topics.length === 0) {
|
|
189
|
+
return {
|
|
190
|
+
feedItemId: item.id,
|
|
191
|
+
feedSignalType: item.type,
|
|
192
|
+
insight: `Dictionary update: ${item.title}.`,
|
|
193
|
+
relevance: 0.5,
|
|
194
|
+
localSources: [],
|
|
195
|
+
mixedAt: new Date().toISOString(),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// Check overlap with local procedural/semantic knowledge
|
|
199
|
+
const matchCount = ctx.recentMemories.filter(m => topics.some(t => m.content.toLowerCase().includes(t.toLowerCase()))).length;
|
|
200
|
+
const relevance = matchCount > 0 ? Math.min(1, 0.3 + matchCount * 0.15) : 0.3;
|
|
201
|
+
return {
|
|
202
|
+
feedItemId: item.id,
|
|
203
|
+
feedSignalType: item.type,
|
|
204
|
+
insight: `Dictionary update: ${item.title}. ${matchCount > 0 ? `Touches ${matchCount} areas of your existing knowledge.` : "New area for your brain."}`,
|
|
205
|
+
relevance,
|
|
206
|
+
localSources: matchCount > 0 ? ["semantic", "procedural"] : [],
|
|
207
|
+
mixedAt: new Date().toISOString(),
|
|
208
|
+
};
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
const communitySignalStrategy = {
|
|
212
|
+
signalType: "community_signal",
|
|
213
|
+
mix(item, ctx) {
|
|
214
|
+
const trend = item.payload["trend"];
|
|
215
|
+
if (!trend)
|
|
216
|
+
return null;
|
|
217
|
+
// Light relevance based on brain size — more active brains benefit more from community signal
|
|
218
|
+
const relevance = ctx.brainStats.totalMemories > 100 ? 0.6 :
|
|
219
|
+
ctx.brainStats.totalMemories > 10 ? 0.4 : 0.2;
|
|
220
|
+
return {
|
|
221
|
+
feedItemId: item.id,
|
|
222
|
+
feedSignalType: item.type,
|
|
223
|
+
insight: `Community trend: ${item.title}. ${trend}`,
|
|
224
|
+
relevance,
|
|
225
|
+
localSources: ["aggregate"],
|
|
226
|
+
mixedAt: new Date().toISOString(),
|
|
227
|
+
};
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=mixer.js.map
|