@pellux/goodvibes-tui 0.18.11 → 0.18.12
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/CHANGELOG.md +22 -0
- package/README.md +1 -1
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +2 -2
- package/src/core/conversation-rendering.ts +2 -2
- package/src/core/conversation.ts +5 -5
- package/src/core/orchestrator.ts +13 -11
- package/src/daemon/facade-composition.ts +8 -8
- package/src/daemon/facade.ts +8 -8
- package/src/daemon/types.ts +3 -3
- package/src/input/command-registry.ts +3 -3
- package/src/input/commands/session-content.ts +2 -2
- package/src/input/commands/session-workflow.ts +1 -1
- package/src/input/handler-feed.ts +1 -1
- package/src/input/session-picker-modal.ts +1 -1
- package/src/panels/builtin/agent.ts +1 -0
- package/src/panels/builtin/operations.ts +1 -0
- package/src/panels/builtin/session.ts +1 -1
- package/src/panels/builtin/shared.ts +2 -2
- package/src/panels/context-visualizer-panel.ts +4 -1
- package/src/panels/provider-health-domains.ts +5 -1
- package/src/panels/provider-health-panel.ts +5 -1
- package/src/panels/session-browser-panel.ts +1 -1
- package/src/panels/token-budget-panel.ts +6 -2
- package/src/plugins/loader.ts +2 -2
- package/src/runtime/bootstrap-command-context.ts +3 -3
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +2 -2
- package/src/runtime/bootstrap-hook-bridge.ts +1 -1
- package/src/runtime/bootstrap-shell.ts +1 -1
- package/src/runtime/bootstrap.ts +5 -4
- package/src/runtime/services.ts +2 -2
- package/src/runtime/ui-read-models-observability-security.ts +2 -2
- package/src/runtime/ui-read-models-observability-system.ts +1 -1
- package/src/runtime/ui-service-queries.ts +1 -1
- package/src/tools/index.ts +1 -1
- package/src/version.ts +1 -1
- package/src/acp/connection.ts +0 -447
- package/src/acp/index.ts +0 -7
- package/src/acp/manager.ts +0 -1
- package/src/adapters/bluebubbles/index.ts +0 -127
- package/src/adapters/discord/index.ts +0 -297
- package/src/adapters/github/index.ts +0 -73
- package/src/adapters/google-chat/index.ts +0 -119
- package/src/adapters/imessage/index.ts +0 -92
- package/src/adapters/index.ts +0 -15
- package/src/adapters/matrix/index.ts +0 -116
- package/src/adapters/mattermost/index.ts +0 -151
- package/src/adapters/msteams/index.ts +0 -180
- package/src/adapters/ntfy/index.ts +0 -118
- package/src/adapters/signal/index.ts +0 -92
- package/src/adapters/slack/index.ts +0 -323
- package/src/adapters/telegram/index.ts +0 -160
- package/src/adapters/types.ts +0 -97
- package/src/adapters/webhook/index.ts +0 -178
- package/src/adapters/whatsapp/index.ts +0 -135
- package/src/agents/message-bus-core.ts +0 -312
- package/src/agents/message-bus.ts +0 -2
- package/src/agents/orchestrator-prompts.ts +0 -351
- package/src/agents/orchestrator-runner.ts +0 -668
- package/src/agents/orchestrator.ts +0 -438
- package/src/agents/session.ts +0 -108
- package/src/agents/worktree.ts +0 -153
- package/src/agents/wrfc-config.ts +0 -47
- package/src/agents/wrfc-controller.ts +0 -747
- package/src/agents/wrfc-gate-runtime.ts +0 -75
- package/src/agents/wrfc-reporting.ts +0 -284
- package/src/agents/wrfc-runtime-events.ts +0 -150
- package/src/agents/wrfc-types.ts +0 -67
- package/src/automation/delivery-manager.ts +0 -368
- package/src/automation/index.ts +0 -72
- package/src/automation/manager-runtime-delivery.ts +0 -139
- package/src/automation/manager-runtime-events.ts +0 -131
- package/src/automation/manager-runtime-execution.ts +0 -511
- package/src/automation/manager-runtime-helpers.ts +0 -433
- package/src/automation/manager-runtime-job-mutations.ts +0 -175
- package/src/automation/manager-runtime-reconcile.ts +0 -148
- package/src/automation/manager-runtime-scheduling.ts +0 -189
- package/src/automation/manager-runtime-sync.ts +0 -54
- package/src/automation/manager-runtime.ts +0 -721
- package/src/automation/manager.ts +0 -10
- package/src/automation/service.ts +0 -242
- package/src/channels/builtin/account-actions.ts +0 -490
- package/src/channels/builtin/accounts.ts +0 -433
- package/src/channels/builtin/contracts.ts +0 -405
- package/src/channels/builtin/plugins.ts +0 -308
- package/src/channels/builtin/rendering.ts +0 -174
- package/src/channels/builtin/setup-schema.ts +0 -504
- package/src/channels/builtin/shared.ts +0 -96
- package/src/channels/builtin/surfaces.ts +0 -57
- package/src/channels/builtin/targets.ts +0 -693
- package/src/channels/builtin-runtime.ts +0 -443
- package/src/channels/delivery/shared.ts +0 -199
- package/src/channels/delivery/strategies-bridge.ts +0 -246
- package/src/channels/delivery/strategies-core.ts +0 -299
- package/src/channels/delivery/strategies-enterprise.ts +0 -178
- package/src/channels/delivery/types.ts +0 -59
- package/src/channels/delivery-router.ts +0 -127
- package/src/channels/index.ts +0 -77
- package/src/channels/plugin-registry.ts +0 -551
- package/src/channels/provider-runtime.ts +0 -330
- package/src/channels/reply-pipeline.ts +0 -522
- package/src/channels/route-manager.ts +0 -340
- package/src/channels/surface-registry.ts +0 -186
- package/src/config/helper-model.ts +0 -1
- package/src/config/manager.ts +0 -8
- package/src/config/subscription-auth.ts +0 -31
- package/src/config/tool-llm.ts +0 -110
- package/src/control-plane/approval-broker.ts +0 -351
- package/src/control-plane/gateway.ts +0 -1
- package/src/control-plane/index.ts +0 -54
- package/src/control-plane/media-contract-schemas.ts +0 -1
- package/src/control-plane/method-catalog-admin.ts +0 -1
- package/src/control-plane/method-catalog-channels.ts +0 -1
- package/src/control-plane/method-catalog-control-automation.ts +0 -1
- package/src/control-plane/method-catalog-control-core.ts +0 -1
- package/src/control-plane/method-catalog-control.ts +0 -1
- package/src/control-plane/method-catalog-events.ts +0 -1
- package/src/control-plane/method-catalog-knowledge.ts +0 -1
- package/src/control-plane/method-catalog-media.ts +0 -1
- package/src/control-plane/method-catalog-runtime.ts +0 -1
- package/src/control-plane/method-catalog-shared.ts +0 -1
- package/src/control-plane/method-catalog.ts +0 -1
- package/src/control-plane/operator-contract-schemas-admin.ts +0 -1
- package/src/control-plane/operator-contract-schemas-channels.ts +0 -1
- package/src/control-plane/operator-contract-schemas-control.ts +0 -1
- package/src/control-plane/operator-contract-schemas-domains.ts +0 -1
- package/src/control-plane/operator-contract-schemas-knowledge.ts +0 -1
- package/src/control-plane/operator-contract-schemas-media.ts +0 -1
- package/src/control-plane/operator-contract-schemas-permissions.ts +0 -1
- package/src/control-plane/operator-contract-schemas-remote.ts +0 -1
- package/src/control-plane/operator-contract-schemas-runtime.ts +0 -1
- package/src/control-plane/operator-contract-schemas-shared.ts +0 -1
- package/src/control-plane/operator-contract-schemas-telemetry.ts +0 -1
- package/src/control-plane/operator-contract-schemas.ts +0 -1
- package/src/control-plane/operator-contract.ts +0 -165
- package/src/control-plane/session-broker.ts +0 -780
- package/src/core/compaction-sections.ts +0 -492
- package/src/core/compaction-types.ts +0 -147
- package/src/core/context-compaction.ts +0 -542
- package/src/core/conversation-compaction.ts +0 -68
- package/src/core/conversation-diff.ts +0 -55
- package/src/core/conversation-utils.ts +0 -72
- package/src/core/event-replay.ts +0 -287
- package/src/core/orchestrator-context-runtime.ts +0 -407
- package/src/core/orchestrator-follow-up-runtime.ts +0 -134
- package/src/core/orchestrator-runtime.ts +0 -132
- package/src/core/orchestrator-tool-runtime.ts +0 -468
- package/src/core/orchestrator-turn-helpers.ts +0 -355
- package/src/core/orchestrator-turn-loop.ts +0 -443
- package/src/core/plan-command-handler.ts +0 -169
- package/src/core/transcript-events/classify.ts +0 -95
- package/src/core/transcript-events/index.ts +0 -15
- package/src/daemon/control-plane.ts +0 -522
- package/src/daemon/helpers.ts +0 -74
- package/src/daemon/http/router-route-contexts.ts +0 -370
- package/src/daemon/http/router.ts +0 -531
- package/src/daemon/http-listener.ts +0 -301
- package/src/daemon/index.ts +0 -1
- package/src/daemon/server.ts +0 -1
- package/src/daemon/service-manager.ts +0 -413
- package/src/daemon/surface-actions.ts +0 -183
- package/src/daemon/surface-delivery.ts +0 -530
- package/src/daemon/transport-events.ts +0 -110
- package/src/export/markdown.ts +0 -213
- package/src/export/session-export.ts +0 -1
- package/src/git/index.ts +0 -1
- package/src/git/service.ts +0 -414
- package/src/hooks/chain-engine.ts +0 -414
- package/src/hooks/dispatcher.ts +0 -414
- package/src/hooks/hook-api.ts +0 -170
- package/src/hooks/index.ts +0 -48
- package/src/hooks/runners/agent.ts +0 -93
- package/src/hooks/runners/prompt.ts +0 -69
- package/src/hooks/workbench.ts +0 -360
- package/src/integrations/index.ts +0 -42
- package/src/integrations/notifier.ts +0 -206
- package/src/integrations/webhooks.ts +0 -1
- package/src/knowledge/consolidation.ts +0 -346
- package/src/knowledge/graphql.ts +0 -324
- package/src/knowledge/index.ts +0 -60
- package/src/knowledge/ingest-compile.ts +0 -386
- package/src/knowledge/ingest-context.ts +0 -18
- package/src/knowledge/ingest-inputs.ts +0 -387
- package/src/knowledge/ingest.ts +0 -1
- package/src/knowledge/internal.ts +0 -257
- package/src/knowledge/knowledge-api.ts +0 -432
- package/src/knowledge/lint.ts +0 -121
- package/src/knowledge/memory-sync.ts +0 -62
- package/src/knowledge/packet.ts +0 -370
- package/src/knowledge/scheduling.ts +0 -283
- package/src/knowledge/service.ts +0 -715
- package/src/mcp/client.ts +0 -383
- package/src/mcp/index.ts +0 -12
- package/src/mcp/mcp-api.ts +0 -90
- package/src/mcp/registry.ts +0 -1
- package/src/media/builtin-image-understanding.ts +0 -303
- package/src/media/builtin-providers.ts +0 -26
- package/src/media/index.ts +0 -18
- package/src/multimodal/index.ts +0 -13
- package/src/multimodal/service.ts +0 -492
- package/src/permissions/briefs/build.ts +0 -88
- package/src/permissions/manager.ts +0 -1
- package/src/plugins/api.ts +0 -383
- package/src/plugins/manager.ts +0 -481
- package/src/profiles/shape.ts +0 -58
- package/src/providers/amazon-bedrock-mantle.ts +0 -50
- package/src/providers/amazon-bedrock.ts +0 -61
- package/src/providers/anthropic-compat.ts +0 -373
- package/src/providers/anthropic-sdk-provider.ts +0 -230
- package/src/providers/anthropic-vertex.ts +0 -59
- package/src/providers/anthropic.ts +0 -469
- package/src/providers/auto-register.ts +0 -417
- package/src/providers/builtin-catalog.ts +0 -326
- package/src/providers/builtin-registry.ts +0 -575
- package/src/providers/cache-planner.ts +0 -258
- package/src/providers/capabilities.ts +0 -1
- package/src/providers/custom-loader.ts +0 -425
- package/src/providers/discovered-compat.ts +0 -7
- package/src/providers/discovered-factory.ts +0 -61
- package/src/providers/discovered-traits.ts +0 -138
- package/src/providers/gemini.ts +0 -462
- package/src/providers/github-copilot.ts +0 -254
- package/src/providers/index.ts +0 -1
- package/src/providers/interface.ts +0 -185
- package/src/providers/llama-cpp.ts +0 -402
- package/src/providers/lm-studio-helpers.ts +0 -367
- package/src/providers/lm-studio.ts +0 -484
- package/src/providers/model-catalog-cache.ts +0 -221
- package/src/providers/model-catalog-notifications.ts +0 -97
- package/src/providers/model-catalog-synthetic.ts +0 -202
- package/src/providers/model-catalog.ts +0 -211
- package/src/providers/model-limits.ts +0 -1
- package/src/providers/ollama.ts +0 -469
- package/src/providers/openai-codex.ts +0 -472
- package/src/providers/openai-compat.ts +0 -615
- package/src/providers/openai.ts +0 -231
- package/src/providers/optimizer.ts +0 -1
- package/src/providers/provider-api.ts +0 -1
- package/src/providers/registry-helpers.ts +0 -34
- package/src/providers/registry-models.ts +0 -77
- package/src/providers/registry-types.ts +0 -67
- package/src/providers/registry.ts +0 -1
- package/src/providers/runtime-metadata.ts +0 -149
- package/src/providers/runtime-snapshot.ts +0 -130
- package/src/providers/synthetic.ts +0 -561
- package/src/providers/tier-prompts.ts +0 -84
- package/src/providers/tool-formats.ts +0 -414
- package/src/runtime/auth/inspection.ts +0 -125
- package/src/runtime/bootstrap-background.ts +0 -157
- package/src/runtime/bootstrap-helpers.ts +0 -88
- package/src/runtime/bootstrap-runtime-events.ts +0 -254
- package/src/runtime/bootstrap-services.ts +0 -197
- package/src/runtime/compaction/index.ts +0 -1
- package/src/runtime/compaction/lifecycle.ts +0 -1
- package/src/runtime/compaction/manager.ts +0 -474
- package/src/runtime/compaction/quality-score.ts +0 -1
- package/src/runtime/compaction/resume-repair.ts +0 -1
- package/src/runtime/compaction/strategies/autocompact.ts +0 -1
- package/src/runtime/compaction/strategies/boundary-commit.ts +0 -1
- package/src/runtime/compaction/strategies/collapse.ts +0 -1
- package/src/runtime/compaction/strategies/index.ts +0 -1
- package/src/runtime/compaction/strategies/microcompact.ts +0 -1
- package/src/runtime/compaction/strategies/reactive.ts +0 -1
- package/src/runtime/compaction/types.ts +0 -1
- package/src/runtime/ecosystem/recommendations.ts +0 -117
- package/src/runtime/emitters/agents.ts +0 -96
- package/src/runtime/emitters/automation.ts +0 -112
- package/src/runtime/emitters/communication.ts +0 -53
- package/src/runtime/emitters/compaction.ts +0 -161
- package/src/runtime/emitters/control-plane.ts +0 -65
- package/src/runtime/emitters/deliveries.ts +0 -65
- package/src/runtime/emitters/forensics.ts +0 -17
- package/src/runtime/emitters/index.ts +0 -59
- package/src/runtime/emitters/knowledge.ts +0 -129
- package/src/runtime/emitters/mcp.ts +0 -95
- package/src/runtime/emitters/ops.ts +0 -163
- package/src/runtime/emitters/orchestration.ts +0 -87
- package/src/runtime/emitters/permissions.ts +0 -98
- package/src/runtime/emitters/planner.ts +0 -23
- package/src/runtime/emitters/plugins.ts +0 -78
- package/src/runtime/emitters/providers.ts +0 -30
- package/src/runtime/emitters/routes.ts +0 -57
- package/src/runtime/emitters/security.ts +0 -53
- package/src/runtime/emitters/session.ts +0 -93
- package/src/runtime/emitters/surfaces.ts +0 -57
- package/src/runtime/emitters/tasks.ts +0 -69
- package/src/runtime/emitters/tools.ts +0 -140
- package/src/runtime/emitters/transport.ts +0 -78
- package/src/runtime/emitters/turn.ts +0 -155
- package/src/runtime/emitters/ui.ts +0 -57
- package/src/runtime/emitters/watchers.ts +0 -57
- package/src/runtime/emitters/workflows.ts +0 -79
- package/src/runtime/eval/index.ts +0 -48
- package/src/runtime/eval/runner.ts +0 -163
- package/src/runtime/eval/suites.ts +0 -264
- package/src/runtime/events/domain-map.ts +0 -148
- package/src/runtime/events/index.ts +0 -1
- package/src/runtime/events/turn.ts +0 -1
- package/src/runtime/events/workflows.ts +0 -1
- package/src/runtime/forensics/collector.ts +0 -693
- package/src/runtime/forensics/index.ts +0 -23
- package/src/runtime/foundation-clients.ts +0 -78
- package/src/runtime/foundation-services.ts +0 -96
- package/src/runtime/guidance.ts +0 -183
- package/src/runtime/health/effect-handlers.ts +0 -189
- package/src/runtime/health/index.ts +0 -70
- package/src/runtime/health/wiring.ts +0 -115
- package/src/runtime/integration/helpers.ts +0 -640
- package/src/runtime/lifecycle.ts +0 -107
- package/src/runtime/mcp/index.ts +0 -68
- package/src/runtime/mcp/manager.ts +0 -513
- package/src/runtime/network/inbound.ts +0 -131
- package/src/runtime/network/index.ts +0 -30
- package/src/runtime/network/outbound.ts +0 -292
- package/src/runtime/network/shared.ts +0 -82
- package/src/runtime/operator-client.ts +0 -235
- package/src/runtime/ops/control-plane.ts +0 -363
- package/src/runtime/ops/index.ts +0 -122
- package/src/runtime/ops/playbooks/index.ts +0 -10
- package/src/runtime/ops/playbooks/session-unrecoverable.ts +0 -196
- package/src/runtime/ops/playbooks/stuck-turn.ts +0 -197
- package/src/runtime/ops/runtime-context.ts +0 -100
- package/src/runtime/ops-api.ts +0 -27
- package/src/runtime/orchestration/spawn-policy.ts +0 -83
- package/src/runtime/peer-client.ts +0 -404
- package/src/runtime/perf/index.ts +0 -57
- package/src/runtime/perf/slo-collector.ts +0 -375
- package/src/runtime/permissions/index.ts +0 -190
- package/src/runtime/permissions/policy-runtime.ts +0 -1
- package/src/runtime/permissions/preflight.ts +0 -101
- package/src/runtime/permissions/rule-suggestions.ts +0 -36
- package/src/runtime/plugins/hot-reload.ts +0 -221
- package/src/runtime/plugins/index.ts +0 -84
- package/src/runtime/plugins/lifecycle.ts +0 -95
- package/src/runtime/plugins/manager.ts +0 -474
- package/src/runtime/plugins/manifest.ts +0 -167
- package/src/runtime/plugins/quarantine.ts +0 -202
- package/src/runtime/plugins/trust.ts +0 -291
- package/src/runtime/plugins/types.ts +0 -205
- package/src/runtime/provider-accounts/registry.ts +0 -326
- package/src/runtime/remote/distributed-runtime-contract-schemas.ts +0 -386
- package/src/runtime/remote/index.ts +0 -488
- package/src/runtime/remote/runner-registry.ts +0 -438
- package/src/runtime/remote/supervisor.ts +0 -70
- package/src/runtime/runtime-hook-api.ts +0 -5
- package/src/runtime/runtime-knowledge-api.ts +0 -14
- package/src/runtime/runtime-mcp-api.ts +0 -5
- package/src/runtime/runtime-ops-api.ts +0 -86
- package/src/runtime/runtime-provider-api.ts +0 -18
- package/src/runtime/session-maintenance.ts +0 -188
- package/src/runtime/session-persistence.ts +0 -288
- package/src/runtime/session-return-context.ts +0 -195
- package/src/runtime/settings/control-plane-store.ts +0 -258
- package/src/runtime/settings/control-plane.ts +0 -599
- package/src/runtime/shell-command-extensions.ts +0 -54
- package/src/runtime/shell-command-ops.ts +0 -207
- package/src/runtime/shell-command-platform.ts +0 -47
- package/src/runtime/shell-command-services.ts +0 -143
- package/src/runtime/shell-command-workspace.ts +0 -31
- package/src/runtime/tasks/adapters/acp-adapter.ts +0 -211
- package/src/runtime/tasks/adapters/agent-adapter.ts +0 -208
- package/src/runtime/tasks/adapters/index.ts +0 -16
- package/src/runtime/tasks/adapters/process-adapter.ts +0 -214
- package/src/runtime/tasks/adapters/scheduler-adapter.ts +0 -193
- package/src/runtime/tasks/index.ts +0 -68
- package/src/runtime/tasks/manager.ts +0 -415
- package/src/runtime/telemetry/api-helpers.ts +0 -517
- package/src/runtime/telemetry/api.ts +0 -768
- package/src/runtime/telemetry/index.ts +0 -178
- package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +0 -440
- package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +0 -200
- package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +0 -18
- package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +0 -204
- package/src/runtime/telemetry/instrumentation/domain-bridge.ts +0 -125
- package/src/runtime/telemetry/instrumentation/index.ts +0 -67
- package/src/runtime/tools/context.ts +0 -114
- package/src/runtime/tools/index.ts +0 -46
- package/src/runtime/tools/phased-executor.ts +0 -448
- package/src/runtime/tools/phases/budget.ts +0 -130
- package/src/runtime/tools/phases/execute.ts +0 -69
- package/src/runtime/tools/phases/index.ts +0 -13
- package/src/runtime/tools/phases/map-output.ts +0 -98
- package/src/runtime/tools/phases/permission.ts +0 -133
- package/src/runtime/tools/phases/posthook.ts +0 -57
- package/src/runtime/tools/phases/prehook.ts +0 -68
- package/src/runtime/tools/phases/validate.ts +0 -53
- package/src/runtime/transports/direct.ts +0 -73
- package/src/runtime/transports/http-helpers.ts +0 -218
- package/src/runtime/transports/http-types.ts +0 -364
- package/src/runtime/transports/http.ts +0 -629
- package/src/runtime/transports/realtime.ts +0 -50
- package/src/runtime/transports/remote-events.ts +0 -16
- package/src/runtime/transports/shared.ts +0 -39
- package/src/runtime/transports/ui-runtime-events.ts +0 -35
- package/src/runtime/ui-events.ts +0 -46
- package/src/runtime/worktree/registry.ts +0 -252
- package/src/sessions/manager.ts +0 -14
- package/src/state/file-watcher.ts +0 -294
- package/src/state/index.ts +0 -56
- package/src/state/knowledge-injection.ts +0 -214
- package/src/state/memory-embedding-http.ts +0 -642
- package/src/state/memory-embeddings.ts +0 -312
- package/src/state/memory-ingest.ts +0 -132
- package/src/state/memory-registry.ts +0 -111
- package/src/state/memory-store-helpers.ts +0 -160
- package/src/state/memory-store.ts +0 -728
- package/src/state/memory-vector-store.ts +0 -418
- package/src/templates/manager.ts +0 -187
- package/src/tools/agent/index.ts +0 -610
- package/src/tools/agent/manager.ts +0 -476
- package/src/tools/analyze/git-modes.ts +0 -380
- package/src/tools/analyze/index.ts +0 -128
- package/src/tools/channel/agent-tools.ts +0 -16
- package/src/tools/channel/index.ts +0 -268
- package/src/tools/control/index.ts +0 -90
- package/src/tools/edit/core.ts +0 -619
- package/src/tools/edit/index.ts +0 -4
- package/src/tools/edit/phased.ts +0 -33
- package/src/tools/fetch/index.ts +0 -3
- package/src/tools/fetch/phased.ts +0 -34
- package/src/tools/fetch/runtime.ts +0 -499
- package/src/tools/mcp/index.ts +0 -190
- package/src/tools/remote-trigger/index.ts +0 -130
- package/src/tools/shared/auto-heal.ts +0 -282
- package/src/tools/state/index.ts +0 -688
- package/src/tools/web-search/index.ts +0 -38
- package/src/tools/write/index.ts +0 -604
- package/src/tools/write/phased.ts +0 -41
- package/src/types/generated/foundation-client-types.ts +0 -22
- package/src/watchers/index.ts +0 -11
- package/src/watchers/registry.ts +0 -517
- package/src/web-search/index.ts +0 -26
- package/src/web-search/provider-registry.ts +0 -64
- package/src/web-search/providers/brave.ts +0 -100
- package/src/web-search/providers/duckduckgo.ts +0 -270
- package/src/web-search/providers/exa.ts +0 -77
- package/src/web-search/providers/firecrawl.ts +0 -90
- package/src/web-search/providers/perplexity.ts +0 -86
- package/src/web-search/providers/searxng.ts +0 -88
- package/src/web-search/providers/shared.ts +0 -249
- package/src/web-search/providers/tavily.ts +0 -90
- package/src/web-search/service.ts +0 -142
|
@@ -1,728 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MemoryStore — project memory substrate.
|
|
3
|
-
*
|
|
4
|
-
* Durable, provenance-rich memory for decisions, constraints, incidents, and
|
|
5
|
-
* patterns. Backed by SQLite via SQLiteStore. Survives process restarts and is
|
|
6
|
-
* queryable by runtime/panel/context enrichment consumers.
|
|
7
|
-
*
|
|
8
|
-
* Provenance links can reference: session, turn, task, event, or file.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { randomUUID } from 'node:crypto';
|
|
12
|
-
import { SQLiteStore } from '@pellux/goodvibes-sdk/platform/state/sqlite-store';
|
|
13
|
-
import {
|
|
14
|
-
SqliteVecMemoryIndex,
|
|
15
|
-
type MemoryVectorStats,
|
|
16
|
-
resolveMemoryVectorDbPath,
|
|
17
|
-
} from '@pellux/goodvibes-sdk/platform/state/memory-vector-store';
|
|
18
|
-
import {
|
|
19
|
-
HASHED_MEMORY_EMBEDDING_PROVIDER,
|
|
20
|
-
MemoryEmbeddingProviderRegistry,
|
|
21
|
-
type MemoryEmbeddingDoctorReport,
|
|
22
|
-
} from '@pellux/goodvibes-sdk/platform/state/memory-embeddings';
|
|
23
|
-
import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
|
|
24
|
-
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
25
|
-
import {
|
|
26
|
-
clampConfidence,
|
|
27
|
-
createSchema,
|
|
28
|
-
isReviewCandidate,
|
|
29
|
-
isReviewFlagged,
|
|
30
|
-
normalizeReviewState,
|
|
31
|
-
normalizeScope,
|
|
32
|
-
recordMatchesPostSqlFilter,
|
|
33
|
-
reviewQueueScore,
|
|
34
|
-
rowToRecord,
|
|
35
|
-
safeParseJson,
|
|
36
|
-
scoreRecord,
|
|
37
|
-
} from '@pellux/goodvibes-sdk/platform/state/memory-store-helpers';
|
|
38
|
-
|
|
39
|
-
// ── Types ─────────────────────────────────────────────────────────────────────
|
|
40
|
-
|
|
41
|
-
export type MemoryClass =
|
|
42
|
-
| 'decision'
|
|
43
|
-
| 'constraint'
|
|
44
|
-
| 'incident'
|
|
45
|
-
| 'pattern'
|
|
46
|
-
| 'fact'
|
|
47
|
-
| 'risk'
|
|
48
|
-
| 'runbook'
|
|
49
|
-
| 'architecture'
|
|
50
|
-
| 'ownership';
|
|
51
|
-
|
|
52
|
-
export type MemoryScope = 'session' | 'project' | 'team';
|
|
53
|
-
|
|
54
|
-
export type MemoryReviewState = 'fresh' | 'reviewed' | 'stale' | 'contradicted';
|
|
55
|
-
|
|
56
|
-
export type ProvenanceLinkKind = 'session' | 'turn' | 'task' | 'event' | 'file';
|
|
57
|
-
|
|
58
|
-
export interface ProvenanceLink {
|
|
59
|
-
kind: ProvenanceLinkKind;
|
|
60
|
-
/** The referenced identifier (session ID, turn number, task ID, event ID, or file path). */
|
|
61
|
-
ref: string;
|
|
62
|
-
/** Optional human-readable label. */
|
|
63
|
-
label?: string;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export interface MemoryRecord {
|
|
67
|
-
/** Auto-assigned, unique within the store. */
|
|
68
|
-
id: string;
|
|
69
|
-
/** Scope of the record for retrieval and sharing workflows. */
|
|
70
|
-
scope: MemoryScope;
|
|
71
|
-
/** Memory class — governs retrieval priority and display grouping. */
|
|
72
|
-
cls: MemoryClass;
|
|
73
|
-
/** Brief summary (one sentence). */
|
|
74
|
-
summary: string;
|
|
75
|
-
/** Optional expanded detail. */
|
|
76
|
-
detail?: string;
|
|
77
|
-
/** Tags for search and grouping. */
|
|
78
|
-
tags: string[];
|
|
79
|
-
/** Provenance links back to the source context. */
|
|
80
|
-
provenance: ProvenanceLink[];
|
|
81
|
-
/** Operator/state review signal. */
|
|
82
|
-
reviewState: MemoryReviewState;
|
|
83
|
-
/** Confidence score from 0-100. Higher means the record is more trusted for retrieval. */
|
|
84
|
-
confidence: number;
|
|
85
|
-
/** Last explicit review timestamp, if any. */
|
|
86
|
-
reviewedAt?: number;
|
|
87
|
-
/** Reviewer identity, if recorded. */
|
|
88
|
-
reviewedBy?: string;
|
|
89
|
-
/** If stale/contradicted, why. */
|
|
90
|
-
staleReason?: string;
|
|
91
|
-
/** Creation timestamp (epoch ms). */
|
|
92
|
-
createdAt: number;
|
|
93
|
-
/** Last updated timestamp (epoch ms). */
|
|
94
|
-
updatedAt: number;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export interface MemoryLink {
|
|
98
|
-
/** ID of the source record. */
|
|
99
|
-
fromId: string;
|
|
100
|
-
/** ID of the target record. */
|
|
101
|
-
toId: string;
|
|
102
|
-
/** Human-readable relationship label, e.g. "caused", "supersedes". */
|
|
103
|
-
relation: string;
|
|
104
|
-
/** Creation timestamp (epoch ms). */
|
|
105
|
-
createdAt: number;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export interface MemorySearchFilter {
|
|
109
|
-
scope?: MemoryScope;
|
|
110
|
-
cls?: MemoryClass;
|
|
111
|
-
tags?: string[];
|
|
112
|
-
/** Full-text substring match on summary and detail. */
|
|
113
|
-
query?: string;
|
|
114
|
-
/** Use the sqlite-vec semantic index for query ranking when available. */
|
|
115
|
-
semantic?: boolean;
|
|
116
|
-
/** Return records created after this timestamp. */
|
|
117
|
-
since?: number;
|
|
118
|
-
/** Match a specific review state or a small set of states. */
|
|
119
|
-
reviewState?: MemoryReviewState | MemoryReviewState[];
|
|
120
|
-
/** Minimum confidence threshold, 0-100. */
|
|
121
|
-
minConfidence?: number;
|
|
122
|
-
/** Restrict to records with at least one matching provenance kind. */
|
|
123
|
-
provenanceKinds?: ProvenanceLinkKind[];
|
|
124
|
-
/** Convenience flag for review queue retrieval. */
|
|
125
|
-
staleOnly?: boolean;
|
|
126
|
-
limit?: number;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export interface MemoryAddOptions {
|
|
130
|
-
scope?: MemoryScope;
|
|
131
|
-
cls: MemoryClass;
|
|
132
|
-
summary: string;
|
|
133
|
-
detail?: string;
|
|
134
|
-
tags?: string[];
|
|
135
|
-
provenance?: ProvenanceLink[];
|
|
136
|
-
review?: {
|
|
137
|
-
state?: MemoryReviewState;
|
|
138
|
-
confidence?: number;
|
|
139
|
-
reviewedAt?: number;
|
|
140
|
-
reviewedBy?: string;
|
|
141
|
-
staleReason?: string;
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export interface MemoryReviewPatch {
|
|
146
|
-
state?: MemoryReviewState;
|
|
147
|
-
confidence?: number;
|
|
148
|
-
reviewedBy?: string;
|
|
149
|
-
staleReason?: string;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export interface MemoryBundle {
|
|
153
|
-
schemaVersion: 'v1';
|
|
154
|
-
exportedAt: number;
|
|
155
|
-
scope: MemoryScope | 'all';
|
|
156
|
-
recordCount: number;
|
|
157
|
-
linkCount: number;
|
|
158
|
-
records: MemoryRecord[];
|
|
159
|
-
links: MemoryLink[];
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export interface MemoryImportResult {
|
|
163
|
-
importedRecords: number;
|
|
164
|
-
skippedRecords: number;
|
|
165
|
-
importedLinks: number;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
export interface MemorySemanticSearchResult {
|
|
169
|
-
record: MemoryRecord;
|
|
170
|
-
distance: number;
|
|
171
|
-
similarity: number;
|
|
172
|
-
score: number;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
export interface MemoryStoreOptions {
|
|
176
|
-
embeddingRegistry: MemoryEmbeddingProviderRegistry;
|
|
177
|
-
enableVectorIndex?: boolean;
|
|
178
|
-
vectorDbPath?: string;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
export interface MemoryDoctorReport {
|
|
182
|
-
readonly vector: MemoryVectorStats;
|
|
183
|
-
readonly embeddings: MemoryEmbeddingDoctorReport;
|
|
184
|
-
readonly checkedAt: number;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export { MemoryRegistry } from '@pellux/goodvibes-sdk/platform/state/memory-registry';
|
|
188
|
-
|
|
189
|
-
// ── MemoryStore ───────────────────────────────────────────────────────────────
|
|
190
|
-
|
|
191
|
-
export class MemoryStore {
|
|
192
|
-
private sqlite: SQLiteStore;
|
|
193
|
-
private vectorIndex: SqliteVecMemoryIndex | null;
|
|
194
|
-
private ready = false;
|
|
195
|
-
private rebuildVectorIndexPromise: Promise<MemoryVectorStats> | null = null;
|
|
196
|
-
private readonly embeddingRegistry: MemoryEmbeddingProviderRegistry;
|
|
197
|
-
|
|
198
|
-
constructor(dbPath: string | undefined, options: MemoryStoreOptions) {
|
|
199
|
-
this.sqlite = new SQLiteStore(dbPath);
|
|
200
|
-
this.embeddingRegistry = options.embeddingRegistry;
|
|
201
|
-
this.vectorIndex = options.enableVectorIndex === false
|
|
202
|
-
? null
|
|
203
|
-
: new SqliteVecMemoryIndex(
|
|
204
|
-
options.vectorDbPath ?? resolveMemoryVectorDbPath(dbPath),
|
|
205
|
-
undefined,
|
|
206
|
-
this.embeddingRegistry,
|
|
207
|
-
);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
async init(): Promise<void> {
|
|
211
|
-
if (this.ready) return;
|
|
212
|
-
await this.sqlite.init(createSchema as Parameters<SQLiteStore['init']>[0]);
|
|
213
|
-
this.ready = true;
|
|
214
|
-
this.vectorIndex?.init();
|
|
215
|
-
this.rebuildVectorIndex();
|
|
216
|
-
logger.info('MemoryStore: initialized', { ready: true });
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
get isReady(): boolean {
|
|
220
|
-
return this.ready;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/** Add a new memory record. Returns the created record. */
|
|
224
|
-
async add(opts: MemoryAddOptions): Promise<MemoryRecord> {
|
|
225
|
-
if (!this.ready) throw new Error('MemoryStore: not initialized');
|
|
226
|
-
|
|
227
|
-
const now = Date.now();
|
|
228
|
-
const id = `mem_${now.toString(36)}_${randomUUID().replace(/-/g, '').slice(0, 8)}`;
|
|
229
|
-
|
|
230
|
-
const record: MemoryRecord = {
|
|
231
|
-
id,
|
|
232
|
-
scope: opts.scope ?? 'project',
|
|
233
|
-
cls: opts.cls,
|
|
234
|
-
summary: opts.summary,
|
|
235
|
-
detail: opts.detail,
|
|
236
|
-
tags: opts.tags ?? [],
|
|
237
|
-
provenance: opts.provenance ?? [],
|
|
238
|
-
reviewState: opts.review?.state ?? 'fresh',
|
|
239
|
-
confidence: clampConfidence(opts.review?.confidence ?? 60),
|
|
240
|
-
reviewedAt: opts.review?.reviewedAt,
|
|
241
|
-
reviewedBy: opts.review?.reviewedBy,
|
|
242
|
-
staleReason: opts.review?.staleReason,
|
|
243
|
-
createdAt: now,
|
|
244
|
-
updatedAt: now,
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
this.sqlite.run(
|
|
248
|
-
`INSERT INTO memory_records
|
|
249
|
-
(id, scope, cls, summary, detail, tags, provenance, review_state, confidence, reviewed_at, reviewed_by, stale_reason, created_at, updated_at)
|
|
250
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
251
|
-
[
|
|
252
|
-
record.id,
|
|
253
|
-
record.scope,
|
|
254
|
-
record.cls,
|
|
255
|
-
record.summary,
|
|
256
|
-
record.detail ?? null,
|
|
257
|
-
JSON.stringify(record.tags),
|
|
258
|
-
JSON.stringify(record.provenance),
|
|
259
|
-
record.reviewState,
|
|
260
|
-
record.confidence,
|
|
261
|
-
record.reviewedAt ?? null,
|
|
262
|
-
record.reviewedBy ?? null,
|
|
263
|
-
record.staleReason ?? null,
|
|
264
|
-
record.createdAt,
|
|
265
|
-
record.updatedAt,
|
|
266
|
-
],
|
|
267
|
-
);
|
|
268
|
-
|
|
269
|
-
logger.info('MemoryStore: record added', { id, cls: opts.cls });
|
|
270
|
-
this.vectorIndex?.upsert(record);
|
|
271
|
-
this.persist();
|
|
272
|
-
return record;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/** Retrieve a single record by ID. */
|
|
276
|
-
get(id: string): MemoryRecord | null {
|
|
277
|
-
if (!this.ready) return null;
|
|
278
|
-
|
|
279
|
-
const rows = this.sqlite.exec(
|
|
280
|
-
`SELECT id, scope, cls, summary, detail, tags, provenance, review_state, confidence, reviewed_at, reviewed_by, stale_reason, created_at, updated_at
|
|
281
|
-
FROM memory_records WHERE id = ? LIMIT 1`,
|
|
282
|
-
[id],
|
|
283
|
-
);
|
|
284
|
-
|
|
285
|
-
if (!rows.length || !rows[0].values.length) return null;
|
|
286
|
-
return rowToRecord(rows[0].columns, rows[0].values[0]);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
/** Search records with an optional filter. */
|
|
290
|
-
search(filter: MemorySearchFilter = {}): MemoryRecord[] {
|
|
291
|
-
if (!this.ready) return [];
|
|
292
|
-
if (filter.semantic) {
|
|
293
|
-
return this.searchSemantic(filter).map((entry) => entry.record);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
const conditions: string[] = [];
|
|
297
|
-
const params: (string | number)[] = [];
|
|
298
|
-
|
|
299
|
-
if (filter.scope) {
|
|
300
|
-
conditions.push('scope = ?');
|
|
301
|
-
params.push(filter.scope);
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
if (filter.cls) {
|
|
305
|
-
conditions.push('cls = ?');
|
|
306
|
-
params.push(filter.cls);
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
if (filter.since) {
|
|
310
|
-
conditions.push('created_at >= ?');
|
|
311
|
-
params.push(filter.since);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
if (filter.reviewState) {
|
|
315
|
-
if (Array.isArray(filter.reviewState)) {
|
|
316
|
-
conditions.push(`review_state IN (${filter.reviewState.map(() => '?').join(', ')})`);
|
|
317
|
-
params.push(...filter.reviewState);
|
|
318
|
-
} else {
|
|
319
|
-
conditions.push('review_state = ?');
|
|
320
|
-
params.push(filter.reviewState);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
if (filter.query) {
|
|
325
|
-
const escaped = filter.query.replace(/%/g, '\\%').replace(/_/g, '\\_');
|
|
326
|
-
conditions.push("(summary LIKE ? ESCAPE '\\' OR detail LIKE ? ESCAPE '\\')");
|
|
327
|
-
params.push(`%${escaped}%`, `%${escaped}%`);
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
if (filter.tags?.length) {
|
|
331
|
-
for (const tag of filter.tags) {
|
|
332
|
-
const escapedTag = tag.replace(/%/g, '\\%').replace(/_/g, '\\_');
|
|
333
|
-
conditions.push("tags LIKE ? ESCAPE '\\'");
|
|
334
|
-
params.push(`%"${escapedTag}"%`);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
339
|
-
const rows = this.sqlite.exec(
|
|
340
|
-
`SELECT id, scope, cls, summary, detail, tags, provenance, review_state, confidence, reviewed_at, reviewed_by, stale_reason, created_at, updated_at
|
|
341
|
-
FROM memory_records ${where}
|
|
342
|
-
ORDER BY updated_at DESC, created_at DESC`,
|
|
343
|
-
params,
|
|
344
|
-
);
|
|
345
|
-
|
|
346
|
-
if (!rows.length) return [];
|
|
347
|
-
|
|
348
|
-
let records = rows[0].values.map(v => rowToRecord(rows[0].columns, v));
|
|
349
|
-
|
|
350
|
-
if (filter.minConfidence !== undefined) {
|
|
351
|
-
records = records.filter((record) => record.confidence >= filter.minConfidence!);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
if (filter.provenanceKinds?.length) {
|
|
355
|
-
const allowed = new Set(filter.provenanceKinds);
|
|
356
|
-
records = records.filter((record) => record.provenance.some((link) => allowed.has(link.kind)));
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
if (filter.staleOnly) {
|
|
360
|
-
records = records.filter((record) => isReviewFlagged(record));
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
records = records.sort((a, b) => scoreRecord(b, filter) - scoreRecord(a, filter) || b.updatedAt - a.updatedAt || b.createdAt - a.createdAt);
|
|
364
|
-
|
|
365
|
-
if (filter.limit !== undefined) {
|
|
366
|
-
records = records.slice(0, filter.limit);
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
return records;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
searchSemantic(filter: MemorySearchFilter = {}): MemorySemanticSearchResult[] {
|
|
373
|
-
if (!this.ready) return [];
|
|
374
|
-
const query = filter.query?.trim();
|
|
375
|
-
if (!query) {
|
|
376
|
-
return this.search({ ...filter, semantic: false }).map((record) => ({
|
|
377
|
-
record,
|
|
378
|
-
distance: Number.POSITIVE_INFINITY,
|
|
379
|
-
similarity: 0,
|
|
380
|
-
score: scoreRecord(record, { ...filter, semantic: false }),
|
|
381
|
-
}));
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
const requestedLimit = Math.max(1, filter.limit ?? 10);
|
|
385
|
-
const vectorFilter = {
|
|
386
|
-
...filter,
|
|
387
|
-
limit: Math.max(requestedLimit * 8, 50),
|
|
388
|
-
};
|
|
389
|
-
const candidates = this.vectorIndex?.search(query, vectorFilter) ?? [];
|
|
390
|
-
if (candidates.length === 0) {
|
|
391
|
-
return this.search({ ...filter, semantic: false }).map((record) => ({
|
|
392
|
-
record,
|
|
393
|
-
distance: Number.POSITIVE_INFINITY,
|
|
394
|
-
similarity: 0,
|
|
395
|
-
score: scoreRecord(record, { ...filter, semantic: false }),
|
|
396
|
-
}));
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
const results: MemorySemanticSearchResult[] = [];
|
|
400
|
-
for (const candidate of candidates) {
|
|
401
|
-
const record = this.get(candidate.id);
|
|
402
|
-
if (!record) continue;
|
|
403
|
-
if (!recordMatchesPostSqlFilter(record, filter)) continue;
|
|
404
|
-
const lexicalScore = scoreRecord(record, { ...filter, query: undefined, semantic: false });
|
|
405
|
-
results.push({
|
|
406
|
-
record,
|
|
407
|
-
distance: candidate.distance,
|
|
408
|
-
similarity: candidate.similarity,
|
|
409
|
-
score: candidate.similarity * 100 + lexicalScore * 0.25,
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
return results
|
|
414
|
-
.sort((a, b) => b.score - a.score || a.distance - b.distance || b.record.updatedAt - a.record.updatedAt)
|
|
415
|
-
.slice(0, requestedLimit);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
reviewQueue(limit = 10): MemoryRecord[] {
|
|
419
|
-
const records = this.search({ limit: Math.max(limit * 4, 25) });
|
|
420
|
-
const candidates = records.filter((record) => isReviewCandidate(record));
|
|
421
|
-
return candidates
|
|
422
|
-
.sort((a, b) => reviewQueueScore(b) - reviewQueueScore(a) || b.updatedAt - a.updatedAt || b.createdAt - a.createdAt)
|
|
423
|
-
.slice(0, limit);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
exportBundle(filter: MemorySearchFilter = {}): MemoryBundle {
|
|
427
|
-
const records = this.search(filter);
|
|
428
|
-
const recordIds = new Set(records.map((record) => record.id));
|
|
429
|
-
const links: MemoryLink[] = [];
|
|
430
|
-
for (const record of records) {
|
|
431
|
-
for (const link of this.linksFor(record.id)) {
|
|
432
|
-
if (!recordIds.has(link.fromId) || !recordIds.has(link.toId)) continue;
|
|
433
|
-
const duplicate = links.some((existing) => (
|
|
434
|
-
existing.fromId === link.fromId
|
|
435
|
-
&& existing.toId === link.toId
|
|
436
|
-
&& existing.relation === link.relation
|
|
437
|
-
));
|
|
438
|
-
if (!duplicate) links.push(link);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
return {
|
|
443
|
-
schemaVersion: 'v1',
|
|
444
|
-
exportedAt: Date.now(),
|
|
445
|
-
scope: filter.scope ?? 'all',
|
|
446
|
-
recordCount: records.length,
|
|
447
|
-
linkCount: links.length,
|
|
448
|
-
records,
|
|
449
|
-
links,
|
|
450
|
-
};
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
async importBundle(bundle: MemoryBundle): Promise<MemoryImportResult> {
|
|
454
|
-
if (!this.ready) throw new Error('MemoryStore: not initialized');
|
|
455
|
-
|
|
456
|
-
let importedRecords = 0;
|
|
457
|
-
let skippedRecords = 0;
|
|
458
|
-
let importedLinks = 0;
|
|
459
|
-
|
|
460
|
-
for (const record of bundle.records) {
|
|
461
|
-
if (this.get(record.id)) {
|
|
462
|
-
skippedRecords++;
|
|
463
|
-
continue;
|
|
464
|
-
}
|
|
465
|
-
this.sqlite.run(
|
|
466
|
-
`INSERT INTO memory_records
|
|
467
|
-
(id, scope, cls, summary, detail, tags, provenance, review_state, confidence, reviewed_at, reviewed_by, stale_reason, created_at, updated_at)
|
|
468
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
469
|
-
[
|
|
470
|
-
record.id,
|
|
471
|
-
normalizeScope(record.scope),
|
|
472
|
-
record.cls,
|
|
473
|
-
record.summary,
|
|
474
|
-
record.detail ?? null,
|
|
475
|
-
JSON.stringify(record.tags),
|
|
476
|
-
JSON.stringify(record.provenance),
|
|
477
|
-
normalizeReviewState(record.reviewState),
|
|
478
|
-
clampConfidence(record.confidence),
|
|
479
|
-
record.reviewedAt ?? null,
|
|
480
|
-
record.reviewedBy ?? null,
|
|
481
|
-
record.staleReason ?? null,
|
|
482
|
-
record.createdAt,
|
|
483
|
-
record.updatedAt,
|
|
484
|
-
],
|
|
485
|
-
);
|
|
486
|
-
importedRecords++;
|
|
487
|
-
this.vectorIndex?.upsert(record);
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
for (const link of bundle.links) {
|
|
491
|
-
if (!this.get(link.fromId) || !this.get(link.toId)) continue;
|
|
492
|
-
this.sqlite.run(
|
|
493
|
-
`INSERT OR REPLACE INTO memory_links (from_id, to_id, relation, created_at)
|
|
494
|
-
VALUES (?, ?, ?, ?)`,
|
|
495
|
-
[link.fromId, link.toId, link.relation, link.createdAt],
|
|
496
|
-
);
|
|
497
|
-
importedLinks++;
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
logger.info('MemoryStore: bundle imported', { importedRecords, skippedRecords, importedLinks });
|
|
501
|
-
this.persist();
|
|
502
|
-
return { importedRecords, skippedRecords, importedLinks };
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
/** Create a directed link between two records. */
|
|
506
|
-
async link(fromId: string, toId: string, relation: string): Promise<MemoryLink | null> {
|
|
507
|
-
if (!this.ready) return null;
|
|
508
|
-
|
|
509
|
-
const from = this.get(fromId);
|
|
510
|
-
const to = this.get(toId);
|
|
511
|
-
|
|
512
|
-
if (!from) {
|
|
513
|
-
logger.warn('MemoryStore: link source not found', { fromId });
|
|
514
|
-
return null;
|
|
515
|
-
}
|
|
516
|
-
if (!to) {
|
|
517
|
-
logger.warn('MemoryStore: link target not found', { toId });
|
|
518
|
-
return null;
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
const now = Date.now();
|
|
522
|
-
|
|
523
|
-
try {
|
|
524
|
-
this.sqlite.run(
|
|
525
|
-
`INSERT OR REPLACE INTO memory_links (from_id, to_id, relation, created_at)
|
|
526
|
-
VALUES (?, ?, ?, ?)`,
|
|
527
|
-
[fromId, toId, relation, now],
|
|
528
|
-
);
|
|
529
|
-
} catch (err) {
|
|
530
|
-
logger.error('MemoryStore: link insert failed', {
|
|
531
|
-
error: summarizeError(err),
|
|
532
|
-
});
|
|
533
|
-
return null;
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
this.persist();
|
|
537
|
-
return { fromId, toId, relation, createdAt: now };
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
/** Get all links where this record is either source or target. */
|
|
541
|
-
linksFor(id: string): MemoryLink[] {
|
|
542
|
-
if (!this.ready) return [];
|
|
543
|
-
|
|
544
|
-
const rows = this.sqlite.exec(
|
|
545
|
-
`SELECT from_id, to_id, relation, created_at
|
|
546
|
-
FROM memory_links
|
|
547
|
-
WHERE from_id = ? OR to_id = ?
|
|
548
|
-
ORDER BY created_at DESC`,
|
|
549
|
-
[id, id],
|
|
550
|
-
);
|
|
551
|
-
|
|
552
|
-
if (!rows.length) return [];
|
|
553
|
-
|
|
554
|
-
return rows[0].values.map(v => {
|
|
555
|
-
const col = rows[0].columns;
|
|
556
|
-
return {
|
|
557
|
-
fromId: String(v[col.indexOf('from_id')]),
|
|
558
|
-
toId: String(v[col.indexOf('to_id')]),
|
|
559
|
-
relation: String(v[col.indexOf('relation')]),
|
|
560
|
-
createdAt: Number(v[col.indexOf('created_at')]),
|
|
561
|
-
};
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
/** Update mutable fields of an existing record. */
|
|
566
|
-
update(id: string, patch: { scope?: MemoryScope; summary?: string; detail?: string; tags?: string[] }): MemoryRecord | null {
|
|
567
|
-
if (!this.ready) return null;
|
|
568
|
-
|
|
569
|
-
const existing = this.get(id);
|
|
570
|
-
if (!existing) {
|
|
571
|
-
logger.warn('MemoryStore: update target not found', { id });
|
|
572
|
-
return null;
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
const now = Date.now();
|
|
576
|
-
const newScope = patch.scope ?? existing.scope;
|
|
577
|
-
const newSummary = patch.summary ?? existing.summary;
|
|
578
|
-
const newDetail = patch.detail !== undefined ? patch.detail : existing.detail;
|
|
579
|
-
const newTags = patch.tags ?? existing.tags;
|
|
580
|
-
|
|
581
|
-
this.sqlite.run(
|
|
582
|
-
`UPDATE memory_records
|
|
583
|
-
SET scope = ?, summary = ?, detail = ?, tags = ?, updated_at = ?
|
|
584
|
-
WHERE id = ?`,
|
|
585
|
-
[newScope, newSummary, newDetail ?? null, JSON.stringify(newTags), now, id],
|
|
586
|
-
);
|
|
587
|
-
|
|
588
|
-
logger.info('MemoryStore: record updated', { id });
|
|
589
|
-
const updated = { ...existing, scope: newScope, summary: newSummary, detail: newDetail, tags: newTags, updatedAt: now };
|
|
590
|
-
this.vectorIndex?.upsert(updated);
|
|
591
|
-
this.persist();
|
|
592
|
-
return updated;
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
review(id: string, patch: MemoryReviewPatch): MemoryRecord | null {
|
|
596
|
-
if (!this.ready) return null;
|
|
597
|
-
|
|
598
|
-
const existing = this.get(id);
|
|
599
|
-
if (!existing) {
|
|
600
|
-
logger.warn('MemoryStore: review target not found', { id });
|
|
601
|
-
return null;
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
const now = Date.now();
|
|
605
|
-
const reviewState = patch.state ?? existing.reviewState;
|
|
606
|
-
const confidence = clampConfidence(patch.confidence ?? existing.confidence);
|
|
607
|
-
const reviewedAt = now;
|
|
608
|
-
const reviewedBy = patch.reviewedBy ?? existing.reviewedBy;
|
|
609
|
-
const staleReason = reviewState === 'stale' || reviewState === 'contradicted'
|
|
610
|
-
? (patch.staleReason ?? existing.staleReason ?? 'marked by operator')
|
|
611
|
-
: undefined;
|
|
612
|
-
|
|
613
|
-
this.sqlite.run(
|
|
614
|
-
`UPDATE memory_records
|
|
615
|
-
SET review_state = ?, confidence = ?, reviewed_at = ?, reviewed_by = ?, stale_reason = ?, updated_at = ?
|
|
616
|
-
WHERE id = ?`,
|
|
617
|
-
[
|
|
618
|
-
reviewState,
|
|
619
|
-
confidence,
|
|
620
|
-
reviewedAt,
|
|
621
|
-
reviewedBy ?? null,
|
|
622
|
-
staleReason ?? null,
|
|
623
|
-
now,
|
|
624
|
-
id,
|
|
625
|
-
],
|
|
626
|
-
);
|
|
627
|
-
|
|
628
|
-
logger.info('MemoryStore: record reviewed', { id, reviewState, confidence });
|
|
629
|
-
const reviewed = { ...existing, reviewState, confidence, reviewedAt, reviewedBy, staleReason, updatedAt: now };
|
|
630
|
-
this.vectorIndex?.upsert(reviewed);
|
|
631
|
-
this.persist();
|
|
632
|
-
return reviewed;
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
/** Delete a record and all its links. */
|
|
636
|
-
delete(id: string): boolean {
|
|
637
|
-
if (!this.ready) return false;
|
|
638
|
-
|
|
639
|
-
const existing = this.get(id);
|
|
640
|
-
if (!existing) return false;
|
|
641
|
-
|
|
642
|
-
// Delete links explicitly as well as via FK cascade; sql.js may load older
|
|
643
|
-
// stores with FK enforcement disabled for a connection.
|
|
644
|
-
this.sqlite.run('DELETE FROM memory_links WHERE from_id = ? OR to_id = ?', [id, id]);
|
|
645
|
-
this.sqlite.run('DELETE FROM memory_records WHERE id = ?', [id]);
|
|
646
|
-
this.vectorIndex?.delete(id);
|
|
647
|
-
logger.info('MemoryStore: record deleted', { id });
|
|
648
|
-
this.persist();
|
|
649
|
-
return true;
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
rebuildVectorIndex(): MemoryVectorStats {
|
|
653
|
-
if (!this.ready) return this.vectorStats();
|
|
654
|
-
const rows = this.sqlite.exec(
|
|
655
|
-
`SELECT id, scope, cls, summary, detail, tags, provenance, review_state, confidence, reviewed_at, reviewed_by, stale_reason, created_at, updated_at
|
|
656
|
-
FROM memory_records
|
|
657
|
-
ORDER BY updated_at DESC, created_at DESC`,
|
|
658
|
-
);
|
|
659
|
-
const records = rows.length ? rows[0].values.map((value) => rowToRecord(rows[0].columns, value)) : [];
|
|
660
|
-
this.vectorIndex?.sync(records);
|
|
661
|
-
return this.vectorStats();
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
async rebuildVectorIndexAsync(): Promise<MemoryVectorStats> {
|
|
665
|
-
if (!this.ready) return this.vectorStats();
|
|
666
|
-
if (!this.rebuildVectorIndexPromise) {
|
|
667
|
-
this.rebuildVectorIndexPromise = (async () => {
|
|
668
|
-
try {
|
|
669
|
-
const rows = this.sqlite.exec(
|
|
670
|
-
`SELECT id, scope, cls, summary, detail, tags, provenance, review_state, confidence, reviewed_at, reviewed_by, stale_reason, created_at, updated_at
|
|
671
|
-
FROM memory_records
|
|
672
|
-
ORDER BY updated_at DESC, created_at DESC`,
|
|
673
|
-
);
|
|
674
|
-
const records = rows.length ? rows[0].values.map((value) => rowToRecord(rows[0].columns, value)) : [];
|
|
675
|
-
if (this.vectorIndex?.syncAsync) {
|
|
676
|
-
await this.vectorIndex.syncAsync(records, { force: true });
|
|
677
|
-
} else {
|
|
678
|
-
this.vectorIndex?.sync(records);
|
|
679
|
-
}
|
|
680
|
-
return this.vectorStats();
|
|
681
|
-
} finally {
|
|
682
|
-
this.rebuildVectorIndexPromise = null;
|
|
683
|
-
}
|
|
684
|
-
})();
|
|
685
|
-
}
|
|
686
|
-
return this.rebuildVectorIndexPromise;
|
|
687
|
-
}
|
|
688
|
-
|
|
689
|
-
vectorStats(): MemoryVectorStats {
|
|
690
|
-
return this.vectorIndex?.stats() ?? {
|
|
691
|
-
backend: 'sqlite-vec',
|
|
692
|
-
enabled: false,
|
|
693
|
-
available: false,
|
|
694
|
-
path: '',
|
|
695
|
-
dimensions: 0,
|
|
696
|
-
indexedRecords: 0,
|
|
697
|
-
embeddingProviderId: HASHED_MEMORY_EMBEDDING_PROVIDER.id,
|
|
698
|
-
embeddingProviderLabel: HASHED_MEMORY_EMBEDDING_PROVIDER.label,
|
|
699
|
-
error: 'memory vector index disabled',
|
|
700
|
-
};
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
async doctor(): Promise<MemoryDoctorReport> {
|
|
704
|
-
return {
|
|
705
|
-
vector: this.vectorStats(),
|
|
706
|
-
embeddings: await this.embeddingRegistry.doctor(),
|
|
707
|
-
checkedAt: Date.now(),
|
|
708
|
-
};
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
async save(): Promise<boolean> {
|
|
712
|
-
return this.sqlite.save();
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
close(): void {
|
|
716
|
-
this.sqlite.close();
|
|
717
|
-
this.vectorIndex?.close();
|
|
718
|
-
this.ready = false;
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
// ── Private helpers ──────────────────────────────────────────────────────────
|
|
722
|
-
|
|
723
|
-
private persist(): void {
|
|
724
|
-
void this.save().catch((err) => {
|
|
725
|
-
logger.debug('MemoryStore: autosave failed', { error: summarizeError(err) });
|
|
726
|
-
});
|
|
727
|
-
}
|
|
728
|
-
}
|