hippo-memory 1.70.0 → 1.71.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 +1 -1
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +14 -5
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +10 -5
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +2 -22
- package/dist/api/audit.d.ts +5 -1
- package/dist/api/audit.js +9 -1
- package/dist/api/auth.d.ts +13 -22
- package/dist/api/auth.js +34 -24
- package/dist/api/auto-sleep.js +2 -2
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +2 -15
- package/dist/api/context-select.js +3 -4
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +21 -38
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +7 -26
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +5 -26
- package/dist/api/forget.d.ts +5 -24
- package/dist/api/forget.js +5 -28
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/instruction-detect.js +16 -5
- package/dist/api/ledger-db.d.ts +2 -1
- package/dist/api/ledger-db.js +5 -3
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +11 -19
- package/dist/api/prompt-hook.d.ts +4 -4
- package/dist/api/prompt-hook.js +10 -9
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.js +14 -6
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +16 -9
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +59 -60
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +18 -1
- package/dist/api/remember.js +13 -1
- package/dist/api/sleep-run.d.ts +1 -3
- package/dist/api/sleep-run.js +17 -21
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +3 -10
- package/dist/api/types.d.ts +6 -29
- package/dist/api/types.js +4 -22
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +6 -22
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +16 -25
- package/dist/capture/compaction-record.js +101 -69
- package/dist/capture/compaction-spool.d.ts +1 -1
- package/dist/capture/compaction-spool.js +1 -1
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +13 -7
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +4 -18
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +6 -39
- package/dist/cli/audit-prune.js +6 -39
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +33 -34
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +57 -39
- package/dist/cli/briefs.d.ts +4 -4
- package/dist/cli/briefs.js +18 -22
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +31 -32
- package/dist/cli/client.d.ts +7 -27
- package/dist/cli/client.js +24 -43
- package/dist/cli/compact-resume-payload.js +3 -2
- package/dist/cli/context.d.ts +1 -2
- package/dist/cli/context.js +12 -8
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +62 -64
- package/dist/cli/correction-latency.d.ts +2 -14
- package/dist/cli/correction-latency.js +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +68 -92
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +33 -27
- package/dist/cli/decisions.d.ts +4 -4
- package/dist/cli/decisions.js +33 -47
- package/dist/cli/eval.js +15 -13
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +6 -4
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +27 -10
- package/dist/cli/flags.d.ts +1 -0
- package/dist/cli/flags.js +1 -1
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/hook-runtime.d.ts +9 -27
- package/dist/cli/hook-runtime.js +15 -31
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +6 -12
- package/dist/cli/install-steps.js +3 -12
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +3 -0
- package/dist/cli/maintenance.d.ts +4 -4
- package/dist/cli/maintenance.js +14 -19
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +4 -4
- package/dist/cli/playbooks.js +23 -28
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +1 -4
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +1 -3
- package/dist/cli/provenance-coverage.d.ts +2 -6
- package/dist/cli/provenance-coverage.js +2 -6
- package/dist/cli/quality-repair-once.js +2 -2
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +55 -131
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +9 -36
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +122 -180
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +12 -18
- package/dist/cli/serve.js +21 -12
- package/dist/cli/session-hooks.d.ts +10 -18
- package/dist/cli/session-hooks.js +112 -113
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +19 -21
- package/dist/cli/shared.d.ts +9 -23
- package/dist/cli/shared.js +9 -32
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +15 -16
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +55 -98
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +66 -89
- package/dist/cli/usage.js +11 -5
- package/dist/cli.d.ts +66 -448
- package/dist/cli.js +87 -263
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +14 -49
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +12 -29
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +4 -10
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +2 -16
- package/dist/connectors/github/webhook.js +6 -22
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +2 -19
- package/dist/connectors/slack/ingest.d.ts +2 -3
- package/dist/connectors/slack/ingest.js +2 -3
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +2 -19
- package/dist/connectors/slack/webhook.js +5 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +6 -14
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +14 -75
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +6 -52
- package/dist/consolidate/dedupe.js +13 -71
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +4 -21
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +16 -104
- package/dist/consolidate/merge.js +10 -31
- package/dist/consolidate/merged-row.js +2 -1
- package/dist/consolidate/physics-pass.js +1 -3
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +14 -52
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +5 -17
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +6 -22
- package/dist/core/ablation.d.ts +4 -91
- package/dist/core/ablation.js +4 -91
- package/dist/core/ambient.d.ts +1 -8
- package/dist/core/ambient.js +1 -8
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +8 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +13 -14
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +41 -164
- package/dist/core/memory.js +51 -221
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +59 -122
- package/dist/core/project-identity.d.ts +17 -58
- package/dist/core/project-identity.js +17 -38
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +1 -1
- package/dist/db/busy.js +17 -8
- package/dist/db/connect.d.ts +1 -0
- package/dist/db/connect.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/open.d.ts +2 -0
- package/dist/db/open.js +17 -1
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +25 -36
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +8 -1
- package/dist/doctor.js +74 -19
- package/dist/entry/session-text.js +2 -1
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +74 -34
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +7 -34
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +19 -11
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +7 -33
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +14 -76
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +11 -39
- package/dist/hooks/codex-wrapper.js +2 -2
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +18 -57
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +9 -76
- package/dist/hooks/shared.d.ts +8 -17
- package/dist/hooks/shared.js +29 -20
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +9 -27
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +7 -35
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +25 -81
- package/dist/index.d.ts +6 -2
- package/dist/index.js +6 -2
- package/dist/learn/autolearn.d.ts +14 -41
- package/dist/learn/autolearn.js +14 -41
- package/dist/learn/extract.js +2 -4
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +14 -66
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +9 -26
- package/dist/mcp/admin-tools.js +3 -5
- package/dist/mcp/memory-tools.js +4 -9
- package/dist/mcp/protocol.d.ts +8 -26
- package/dist/mcp/protocol.js +3 -6
- package/dist/mcp/recall-tools.js +3 -3
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +10 -26
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +48 -12
- package/dist/mcp/tools.js +5 -3
- package/dist/objects/customer-notes.d.ts +7 -42
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +12 -50
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/incidents.d.ts +7 -38
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/policies.d.ts +11 -89
- package/dist/objects/policies.js +11 -98
- package/dist/objects/processes.d.ts +7 -52
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +11 -55
- package/dist/objects/project-briefs.js +14 -75
- package/dist/objects/skills.d.ts +7 -42
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +6 -19
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +3 -31
- package/dist/rerankers/cross-encoder.js +4 -6
- package/dist/rerankers/jev.js +9 -6
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +2 -1
- package/dist/rerankers/outage-warning.js +2 -1
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +2 -2
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid.d.ts +2 -0
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.js +11 -8
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +7 -0
- package/dist/search/vector.js +35 -5
- package/dist/server/auth.d.ts +9 -28
- package/dist/server/auth.js +32 -25
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +63 -96
- package/dist/server/client-ip.d.ts +3 -19
- package/dist/server/client-ip.js +5 -28
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +10 -44
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +9 -17
- package/dist/server/route-table.js +42 -49
- package/dist/server/routes/admin.js +22 -28
- package/dist/server/routes/customer-notes.js +7 -12
- package/dist/server/routes/decisions.js +10 -17
- package/dist/server/routes/incidents.js +12 -20
- package/dist/server/routes/memories.js +12 -32
- package/dist/server/routes/object-routes.d.ts +0 -5
- package/dist/server/routes/object-routes.js +7 -15
- package/dist/server/routes/policies.js +10 -18
- package/dist/server/routes/predictions.js +13 -25
- package/dist/server/routes/processes.js +16 -26
- package/dist/server/routes/project-briefs.js +9 -16
- package/dist/server/routes/recall.js +10 -35
- package/dist/server/routes/skills.js +8 -18
- package/dist/server/server-detect.d.ts +9 -53
- package/dist/server/server-detect.js +24 -90
- package/dist/server/sleep-offload.js +4 -1
- package/dist/server/types.d.ts +12 -10
- package/dist/server/validation.d.ts +3 -1
- package/dist/server/validation.js +10 -23
- package/dist/server.d.ts +2 -2
- package/dist/server.js +3 -2
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/sharing/project-merge.d.ts +4 -5
- package/dist/sharing/project-merge.js +9 -7
- package/dist/sharing/scope.d.ts +4 -11
- package/dist/sharing/scope.js +4 -11
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/store/ambient.js +4 -9
- package/dist/store/audit-event.d.ts +4 -12
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -5
- package/dist/store/audit.js +4 -12
- package/dist/store/auth.d.ts +6 -6
- package/dist/store/auth.js +10 -9
- package/dist/store/candidates.d.ts +20 -3
- package/dist/store/candidates.js +77 -48
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +71 -150
- package/dist/store/connectors/github.d.ts +10 -10
- package/dist/store/connectors/github.js +10 -10
- package/dist/store/dashboard-reads.js +4 -8
- package/dist/store/delete-and-batch.d.ts +11 -31
- package/dist/store/delete-and-batch.js +48 -64
- package/dist/store/delivery-recorder.d.ts +8 -4
- package/dist/store/delivery-recorder.js +25 -15
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +7 -29
- package/dist/store/dormant.js +15 -56
- package/dist/store/embeddings/index.d.ts +11 -80
- package/dist/store/embeddings/index.js +71 -207
- package/dist/store/embeddings/local.js +15 -32
- package/dist/store/embeddings/provider.d.ts +16 -53
- package/dist/store/embeddings/provider.js +41 -69
- package/dist/store/entry-reads.d.ts +21 -57
- package/dist/store/entry-reads.js +65 -126
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +10 -16
- package/dist/store/entry-writes.js +17 -35
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +21 -160
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +20 -58
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -31
- package/dist/store/graph-writes.js +13 -37
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +5 -11
- package/dist/store/handoffs.js +16 -34
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +34 -82
- package/dist/store/markdown.d.ts +2 -6
- package/dist/store/markdown.js +21 -20
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +14 -23
- package/dist/store/open.js +6 -13
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +82 -79
- package/dist/store/predictions.d.ts +11 -51
- package/dist/store/predictions.js +38 -119
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-scope.d.ts +19 -79
- package/dist/store/recall-scope.js +21 -82
- package/dist/store/recall-trace.d.ts +10 -77
- package/dist/store/recall-trace.js +19 -95
- package/dist/store/rejected-values.js +7 -19
- package/dist/store/rejection.d.ts +12 -58
- package/dist/store/rejection.js +13 -65
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +14 -50
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +17 -73
- package/dist/store/sqlite/connector-events-group.js +2 -2
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- package/dist/store/sqlite/error-codec.js +4 -2
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +2 -1
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.js +4 -2
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +2 -3
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +10 -62
- package/dist/store/summaries.js +34 -146
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -43
- package/dist/store/token-ledger.js +19 -50
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/store/yaml.d.ts +1 -5
- package/dist/store/yaml.js +2 -6
- package/dist/support-bundle.js +7 -5
- package/dist/trust/reject-flow.js +1 -3
- package/dist/util/anthropic-messages.js +14 -2
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/env.d.ts +13 -6
- package/dist/util/env.js +14 -7
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/http-retry.d.ts +3 -1
- package/dist/util/http-retry.js +26 -5
- package/dist/util/log.d.ts +3 -2
- package/dist/util/log.js +25 -9
- package/dist/util/request-scope.d.ts +2 -1
- package/dist/util/request-scope.js +2 -1
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +13 -39
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/extensions/openclaw-plugin/index.ts +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
package/dist/core/memory.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
* Based on the strength formula from PLAN.md.
|
|
4
|
-
*/
|
|
5
|
-
import { envLossAversionRatio } from '../util/env.js';
|
|
1
|
+
/** Core data model for Hippo memory entries, based on the strength formula from PLAN.md. */
|
|
2
|
+
import { DEFAULT_TENANT_ID, envLossAversionRatio } from '../util/env.js';
|
|
6
3
|
import { BadRequestError } from './api-errors.js';
|
|
7
4
|
import { randomUUID } from 'crypto';
|
|
8
5
|
import { isDecayAblated, isOutcomeSlowAblated, isRecallBoostAblated, evalNow, } from './ablation.js';
|
|
9
6
|
import { AGENT_MEMORY_TOOLS, toolSourcePrefix } from './agent-memory-tools.js';
|
|
7
|
+
import { isJsonString } from '../util/json.js';
|
|
10
8
|
import { DAY_MS } from '../util/time.js';
|
|
11
9
|
import { ID_SUFFIX_CHARS } from '../util/token-text.js';
|
|
12
10
|
export const DEFAULT_SCHEMA_FIT = 0.5;
|
|
@@ -20,56 +18,17 @@ export var Layer;
|
|
|
20
18
|
})(Layer || (Layer = {}));
|
|
21
19
|
/** Tag on a memory whose named file/symbol/script changed after it was stored. */
|
|
22
20
|
export const CHURN_STALE_TAG = 'churn-stale';
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
// (env var, default 1.0; see getLossAversionRatio + applyLossAversionRatio).
|
|
26
|
-
const EMOTIONAL_MULTIPLIERS = {
|
|
21
|
+
// Losses weigh ~2x gains (Lovallo-Kahneman), so negative is 2.0; HIPPO_LOSS_AVERSION_RATIO scales it per process.
|
|
22
|
+
export const EMOTIONAL_MULTIPLIERS = {
|
|
27
23
|
neutral: 1.0,
|
|
28
24
|
positive: 1.0,
|
|
29
25
|
negative: 2.0, // error-tagged
|
|
30
26
|
critical: 2.0,
|
|
31
27
|
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
*
|
|
35
|
-
* `calculateStrength` is called per-entry inside hot recall loops
|
|
36
|
-
* (api.ts/consolidate.ts/search.ts), so a per-call `process.env` lookup
|
|
37
|
-
* would multiply N entries by M recalls of lookup cost. Lazy module-cache
|
|
38
|
-
* reads the env ONCE on first call and memoizes for the process lifetime.
|
|
39
|
-
* Test isolation via `_resetLossAversionRatioCacheForTests()` below.
|
|
40
|
-
*/
|
|
41
|
-
/**
|
|
42
|
-
* Minimum acceptable ratio. Below this, the negative multiplier
|
|
43
|
-
* (2.0 * ratio) becomes small enough that calculateStrength * decay can fall
|
|
44
|
-
* below `DECAY_THRESHOLD = 0.05` in `src/consolidate.ts:146`, which would
|
|
45
|
-
* permanently delete non-pinned error-tagged memories on the next sleep
|
|
46
|
-
* cycle. 0.5 is chosen as the floor because (a) it recovers the pre-calibration
|
|
47
|
-
* effective multiplier (2.0 * 0.5 = 1.0 + the negative premium, i.e. 1.5x
|
|
48
|
-
* the pre-calibration default), and (b) below this the user is asking for LESS
|
|
49
|
-
* loss aversion than has ever shipped — that's outside the supported
|
|
50
|
-
* tuning range.
|
|
51
|
-
*/
|
|
28
|
+
// A lower ratio can drop an error-tagged memory under sleep's DECAY_THRESHOLD (src/consolidate/decay.ts),
|
|
29
|
+
// so values below it fall back to 1.0.
|
|
52
30
|
const LOSS_AVERSION_RATIO_MIN = 0.5;
|
|
53
|
-
|
|
54
|
-
* Validation policy:
|
|
55
|
-
* - Valid: finite numbers >= 0.5.
|
|
56
|
-
* - Invalid (silent fallback to 1.0): empty string, non-numeric,
|
|
57
|
-
* numbers below 0.5 (including 0 and negatives), NaN, +/-Infinity.
|
|
58
|
-
* Silent because opt-in env vars should not crash production recall
|
|
59
|
-
* on a typo.
|
|
60
|
-
*
|
|
61
|
-
* Why the 0.5 floor and not 0:
|
|
62
|
-
* - Rejecting only `0` leaves the same silent data-loss surface for any ratio
|
|
63
|
-
* below ~0.025 (and worse for aged memories, where even ratio=0.25
|
|
64
|
-
* can produce strength < DECAY_THRESHOLD = 0.05 in consolidate.ts).
|
|
65
|
-
* Floor at the pre-calibration equivalent (0.5) so the env var's tuning
|
|
66
|
-
* range never crosses into the deletion regime.
|
|
67
|
-
* - Users wanting LESS loss aversion than the pre-calibration 1.5 multiplier
|
|
68
|
-
* should reconsider the design intent (the calibration was
|
|
69
|
-
* toward MORE loss aversion, not less). If a future use case
|
|
70
|
-
* genuinely needs ratio < 0.5, the right path is a separate
|
|
71
|
-
* `HIPPO_NEGATIVE_MULTIPLIER` env override.
|
|
72
|
-
*/
|
|
31
|
+
// Read once: calculateStrength runs per entry inside hot loops (src/api, src/consolidate, src/search).
|
|
73
32
|
let _lossAversionRatioCache;
|
|
74
33
|
function getLossAversionRatio() {
|
|
75
34
|
if (_lossAversionRatioCache !== undefined)
|
|
@@ -80,8 +39,6 @@ function getLossAversionRatio() {
|
|
|
80
39
|
return 1.0;
|
|
81
40
|
}
|
|
82
41
|
const parsed = Number(raw);
|
|
83
|
-
// Finite + >= 0.5 floor. Anything below 0.5 silently falls back to 1.0
|
|
84
|
-
// to avoid the consolidation-deletion vector (see JSDoc above).
|
|
85
42
|
if (!Number.isFinite(parsed) || parsed < LOSS_AVERSION_RATIO_MIN) {
|
|
86
43
|
_lossAversionRatioCache = 1.0;
|
|
87
44
|
return 1.0;
|
|
@@ -89,39 +46,17 @@ function getLossAversionRatio() {
|
|
|
89
46
|
_lossAversionRatioCache = parsed;
|
|
90
47
|
return parsed;
|
|
91
48
|
}
|
|
92
|
-
/**
|
|
93
|
-
* Test-only helper. Tests that mutate `process.env.HIPPO_LOSS_AVERSION_RATIO`
|
|
94
|
-
* MUST call this in BOTH `beforeEach` AND `afterEach`:
|
|
95
|
-
* - beforeEach: clear any stale cache from a previous test before setting
|
|
96
|
-
* the env var for this test.
|
|
97
|
-
* - afterEach: clear the cache so the next test (which may not set the env
|
|
98
|
-
* var) reads the clean default instead of this test's value.
|
|
99
|
-
* See `tests/emotional-multipliers.test.ts` for the pattern.
|
|
100
|
-
*/
|
|
49
|
+
/** Test-only: a test that sets HIPPO_LOSS_AVERSION_RATIO calls this in beforeEach and afterEach (tests/emotional-multipliers.test.ts). */
|
|
101
50
|
export function _resetLossAversionRatioCacheForTests() {
|
|
102
51
|
_lossAversionRatioCache = undefined;
|
|
103
52
|
}
|
|
104
|
-
/**
|
|
105
|
-
|
|
106
|
-
* Other valences (positive, critical, neutral) pass through unchanged.
|
|
107
|
-
* `critical` is deliberately NOT scaled, so the calibration only touches the
|
|
108
|
-
* specific empirical claim (TFAS 2x losses-vs-gains).
|
|
109
|
-
*/
|
|
110
|
-
function applyLossAversionRatio(valence, baseMultiplier) {
|
|
53
|
+
/** Scales only the `negative` multiplier; `critical` stays unscaled so the knob moves just the losses-vs-gains claim. */
|
|
54
|
+
export function applyLossAversionRatio(valence, baseMultiplier) {
|
|
111
55
|
if (valence !== 'negative')
|
|
112
56
|
return baseMultiplier;
|
|
113
57
|
return baseMultiplier * getLossAversionRatio();
|
|
114
58
|
}
|
|
115
|
-
/**
|
|
116
|
-
* Compute the reward factor from cumulative outcome counts.
|
|
117
|
-
*
|
|
118
|
-
* reward_ratio = (positive - negative) / (positive + negative + 1)
|
|
119
|
-
* reward_factor = 1 + 0.5 * reward_ratio
|
|
120
|
-
*
|
|
121
|
-
* Range: (0.5, 1.5). Neutral (no outcomes) returns 1.0.
|
|
122
|
-
* Modulates effective half-life: memories with consistent positive outcomes
|
|
123
|
-
* decay slower; consistent negative outcomes decay faster.
|
|
124
|
-
*/
|
|
59
|
+
/** 1 + REWARD_SLOPE * (pos - neg) / (pos + neg + 1), in (0.5, 1.5), 1.0 with no outcomes; it scales the effective half-life. */
|
|
125
60
|
export function calculateRewardFactor(entry) {
|
|
126
61
|
// EVAL-ONLY ablation (see ablation.ts): the slow outcome channel.
|
|
127
62
|
if (isOutcomeSlowAblated())
|
|
@@ -134,65 +69,41 @@ export function calculateRewardFactor(entry) {
|
|
|
134
69
|
return 1 + REWARD_SLOPE * ratio;
|
|
135
70
|
}
|
|
136
71
|
/** Bad marks alone never push a memory under sleep's 0.05 retire line; supersede is the hard correction. */
|
|
137
|
-
const MAX_WRONG_HALVINGS = 3;
|
|
138
|
-
// Shared by calculateStrength and strengthSql so the two cannot drift.
|
|
139
|
-
const DECAY_BASE = 0.5;
|
|
140
|
-
const REWARD_SLOPE = 0.5;
|
|
141
|
-
const RETRIEVAL_BOOST_SLOPE = 0.1;
|
|
142
|
-
|
|
143
|
-
const UNIX_EPOCH_JULIAN_DAY = 2440587.5;
|
|
144
|
-
/**
|
|
145
|
-
* Net wrongness: bad outcome marks past good ones, never below zero.
|
|
146
|
-
* Strength halves per unit (capped at 3) and recall stops strengthening
|
|
147
|
-
* the memory, so a correction outranks pinning, error tags and heavy recall.
|
|
148
|
-
*/
|
|
72
|
+
export const MAX_WRONG_HALVINGS = 3;
|
|
73
|
+
// Shared by calculateStrength and strengthSql (src/store/rule-sql.ts) so the two cannot drift.
|
|
74
|
+
export const DECAY_BASE = 0.5;
|
|
75
|
+
export const REWARD_SLOPE = 0.5;
|
|
76
|
+
export const RETRIEVAL_BOOST_SLOPE = 0.1;
|
|
77
|
+
/** Bad outcome marks past good ones, floored at zero; each halves strength and stops recall strengthening, so a correction outranks pinning. */
|
|
149
78
|
export function netWrong(entry) {
|
|
150
79
|
if (isOutcomeSlowAblated() || isDecayAblated())
|
|
151
80
|
return 0;
|
|
152
81
|
return Math.max(0, (entry.outcome_negative ?? 0) - (entry.outcome_positive ?? 0));
|
|
153
82
|
}
|
|
154
|
-
/**
|
|
155
|
-
*
|
|
156
|
-
* strength(t) = base_strength * decay * retrieval_boost * emotional_multiplier
|
|
157
|
-
*
|
|
158
|
-
* Decay basis modes:
|
|
159
|
-
* - clock: classic wall-clock decay (daysSince / halfLife)
|
|
160
|
-
* - session: decay by sleep cycles instead of days (sessionsSince / halfLife)
|
|
161
|
-
* - adaptive: wall-clock decay with half-life scaled by session frequency
|
|
162
|
-
*
|
|
163
|
-
* Pinned memories skip time decay; being marked wrong still fades them (netWrong).
|
|
164
|
-
*/
|
|
83
|
+
/** Strength at `now` = decay * retrieval boost * emotional multiplier, clamped to [0, 1]; the basis modes are on DecayOptions.
|
|
84
|
+
* Pinned memories skip time decay, but being marked wrong still fades them (netWrong). */
|
|
165
85
|
export function calculateStrength(entry,
|
|
166
|
-
// evalNow()
|
|
167
|
-
// simulated-time protocols; see ablation.ts). Explicit `now` always wins.
|
|
86
|
+
// evalNow() is the real clock unless HIPPO_FAKE_NOW is set (eval-only); an explicit `now` wins.
|
|
168
87
|
now = evalNow(), options = {}) {
|
|
169
88
|
// Being marked wrong outranks every shield: pinning, error tags, heavy recall.
|
|
170
89
|
const wrongPenalty = Math.pow(DECAY_BASE, Math.min(netWrong(entry), MAX_WRONG_HALVINGS));
|
|
171
90
|
if (entry.pinned)
|
|
172
91
|
return wrongPenalty;
|
|
173
|
-
// EVAL-ONLY ablation (see ablation.ts): anchor decay at
|
|
174
|
-
// unflagged runs cannot leak strengthening into an ablated arm. Prior-run half_life increments are
|
|
175
|
-
// NOT reconstructed - see the ablation.ts caveat (fresh stores per arm).
|
|
92
|
+
// EVAL-ONLY ablation (see ablation.ts): anchor decay at creation so clock resets from earlier unflagged runs cannot leak in.
|
|
176
93
|
const lastRetrieved = new Date(isRecallBoostAblated() ? entry.created : entry.last_retrieved);
|
|
177
94
|
const daysSince = (now.getTime() - lastRetrieved.getTime()) / DAY_MS;
|
|
178
|
-
// Reward-proportional half-life modulation
|
|
179
95
|
const rewardFactor = calculateRewardFactor(entry);
|
|
180
96
|
const effectiveHalfLife = entry.half_life_days * rewardFactor;
|
|
181
97
|
// Guard: zero half-life causes 0/0 = NaN in the exponent
|
|
182
98
|
if (effectiveHalfLife <= 0)
|
|
183
99
|
return 0.0;
|
|
184
100
|
const decayExponent = decayExponentFor(options, daysSince, effectiveHalfLife);
|
|
185
|
-
// EVAL-ONLY ablation (see ablation.ts): decay
|
|
186
|
-
// clamp below then caps retrievalBoost at baseline - see ablation.ts
|
|
187
|
-
// formula note.
|
|
101
|
+
// EVAL-ONLY ablation (see ablation.ts): decay := 1, so the [0,1] clamp below caps the boost at baseline.
|
|
188
102
|
const decay = isDecayAblated() ? 1.0 : Math.pow(DECAY_BASE, decayExponent);
|
|
189
103
|
const retrievalBoost = retrievalBoostFor(entry);
|
|
190
|
-
// Emotional multiplier. HIPPO_LOSS_AVERSION_RATIO scales the negative one ONLY; the lazy
|
|
191
|
-
// module cache makes this one lookup + one multiply, not a per-call process.env read.
|
|
192
104
|
const baseMultiplier = EMOTIONAL_MULTIPLIERS[entry.emotional_valence] ?? 1.0;
|
|
193
105
|
const emotionalMultiplier = applyLossAversionRatio(entry.emotional_valence, baseMultiplier);
|
|
194
106
|
const raw = decay * retrievalBoost * emotionalMultiplier;
|
|
195
|
-
// Clamp to [0, 1] with NaN guard
|
|
196
107
|
const clamped = Math.min(1.0, Math.max(0.0, raw));
|
|
197
108
|
return Number.isFinite(clamped) ? clamped * wrongPenalty : 0.0;
|
|
198
109
|
}
|
|
@@ -200,8 +111,7 @@ function decayExponentFor(options, daysSince, halfLifeDays) {
|
|
|
200
111
|
let effectiveHalfLife = halfLifeDays;
|
|
201
112
|
const basis = options.decayBasis ?? 'clock';
|
|
202
113
|
if (basis === 'session') {
|
|
203
|
-
//
|
|
204
|
-
// Estimate sessions since last retrieval from wall-clock time and avg interval.
|
|
114
|
+
// Each sleep cycle counts as one "day"; sessions since last retrieval are estimated from wall time and the average interval.
|
|
205
115
|
const avgInterval = options.avgSessionIntervalDays ?? 1;
|
|
206
116
|
const sessionsSince = avgInterval > 0 ? Math.max(0, daysSince / avgInterval) : daysSince;
|
|
207
117
|
return sessionsSince / effectiveHalfLife;
|
|
@@ -214,44 +124,14 @@ function decayExponentFor(options, daysSince, halfLifeDays) {
|
|
|
214
124
|
}
|
|
215
125
|
return daysSince / effectiveHalfLife;
|
|
216
126
|
}
|
|
217
|
-
// clock: classic wall-clock decay
|
|
218
127
|
return daysSince / effectiveHalfLife;
|
|
219
128
|
}
|
|
220
|
-
//
|
|
221
|
-
// the READ side too, so counts written before the flag cannot leak strengthening into an ablated arm.
|
|
129
|
+
// EVAL-ONLY ablation (see ablation.ts) neutralizes the read side too, so counts written before the flag cannot leak in.
|
|
222
130
|
function retrievalBoostFor(entry) {
|
|
223
131
|
return isRecallBoostAblated() || netWrong(entry) > 0
|
|
224
132
|
? 1.0
|
|
225
133
|
: 1 + RETRIEVAL_BOOST_SLOPE * Math.log2(entry.retrieval_count + 1);
|
|
226
134
|
}
|
|
227
|
-
/** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in step.
|
|
228
|
-
* An unparseable date scores NULL here and 0 in JS, so sums agree. */
|
|
229
|
-
export function strengthSql(now) {
|
|
230
|
-
const num = (n) => (Number.isInteger(n) ? n.toFixed(1) : String(n));
|
|
231
|
-
const pos = 'COALESCE(outcome_positive, 0)';
|
|
232
|
-
const neg = 'COALESCE(outcome_negative, 0)';
|
|
233
|
-
const wrong = isOutcomeSlowAblated() || isDecayAblated() ? '0' : `MAX(0, ${neg} - ${pos})`;
|
|
234
|
-
const reward = isOutcomeSlowAblated()
|
|
235
|
-
? '1.0'
|
|
236
|
-
: `(CASE WHEN ${pos} = 0 AND ${neg} = 0 THEN 1.0 ELSE 1.0 + ${REWARD_SLOPE} * (${pos} - ${neg}) / (${pos} + ${neg} + 1.0) END)`;
|
|
237
|
-
const halfLife = `(COALESCE(half_life_days, ${SQL_DEFAULT_HALF_LIFE_DAYS}) * ${reward})`;
|
|
238
|
-
const anchor = isRecallBoostAblated() ? 'created' : 'last_retrieved';
|
|
239
|
-
const nowJulian = num(now.getTime() / DAY_MS + UNIX_EPOCH_JULIAN_DAY);
|
|
240
|
-
const decay = isDecayAblated() ? '1.0' : `pow(${DECAY_BASE}, (${nowJulian} - julianday(${anchor})) / ${halfLife})`;
|
|
241
|
-
const boost = isRecallBoostAblated()
|
|
242
|
-
? '1.0'
|
|
243
|
-
: `(CASE WHEN ${wrong} > 0 THEN 1.0 ELSE 1.0 + ${RETRIEVAL_BOOST_SLOPE} * log2(COALESCE(retrieval_count, 0) + 1) END)`;
|
|
244
|
-
const valences = /* SAFETY: a Record keyed by EmotionalValence */ Object.keys(EMOTIONAL_MULTIPLIERS);
|
|
245
|
-
const emotion = `(CASE COALESCE(emotional_valence, 'neutral') ${valences
|
|
246
|
-
.map((v) => `WHEN '${v}' THEN ${num(applyLossAversionRatio(v, EMOTIONAL_MULTIPLIERS[v]))}`)
|
|
247
|
-
.join(' ')} ELSE 1.0 END)`;
|
|
248
|
-
const penalty = `pow(${DECAY_BASE}, MIN(${wrong}, ${MAX_WRONG_HALVINGS}))`;
|
|
249
|
-
return `(CASE WHEN pinned THEN ${penalty} WHEN ${halfLife} <= 0 THEN 0.0
|
|
250
|
-
ELSE MIN(1.0, MAX(0.0, ${decay} * ${boost} * ${emotion})) * ${penalty} END)`;
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Derive half-life based on signals, as per PLAN.md table.
|
|
254
|
-
*/
|
|
255
135
|
const HIGH_SCHEMA_FIT = 0.7;
|
|
256
136
|
const HIGH_FIT_HALF_LIFE_FACTOR = 1.5;
|
|
257
137
|
const LOW_SCHEMA_FIT = 0.3;
|
|
@@ -261,35 +141,25 @@ const TAG_FIT_WEIGHT = 0.6;
|
|
|
261
141
|
const CONTENT_FIT_WEIGHT = 0.4;
|
|
262
142
|
const CONTENT_TOKEN_SHARE_MIN = 0.2;
|
|
263
143
|
const CONTENT_ENOUGH_FRACTION = 0.1;
|
|
144
|
+
// An error is worth remembering longer than a neutral note (PLAN.md half-life table).
|
|
145
|
+
const ERROR_TAG_HALF_LIFE_FACTOR = 2;
|
|
146
|
+
// Each retrieval lengthens the half-life by this many days (PLAN.md).
|
|
147
|
+
const RETRIEVAL_HALF_LIFE_GAIN_DAYS = 2;
|
|
148
|
+
/** The base half-life scaled by the PLAN.md signals: an error tag, and high or low schema fit. */
|
|
264
149
|
export function deriveHalfLife(base, entry) {
|
|
265
150
|
let hl = base;
|
|
266
|
-
// Error-tagged: 2x half-life
|
|
267
151
|
if (entry.tags?.includes('error')) {
|
|
268
|
-
hl *=
|
|
152
|
+
hl *= ERROR_TAG_HALF_LIFE_FACTOR;
|
|
269
153
|
}
|
|
270
|
-
// High schema fit: consolidates faster (1.5x)
|
|
271
154
|
if (entry.schema_fit !== undefined && entry.schema_fit > HIGH_SCHEMA_FIT) {
|
|
272
155
|
hl *= HIGH_FIT_HALF_LIFE_FACTOR;
|
|
273
156
|
}
|
|
274
|
-
// Low schema fit: decay faster (0.5x)
|
|
275
157
|
if (entry.schema_fit !== undefined && entry.schema_fit < LOW_SCHEMA_FIT) {
|
|
276
158
|
hl *= LOW_FIT_HALF_LIFE_FACTOR;
|
|
277
159
|
}
|
|
278
160
|
return hl;
|
|
279
161
|
}
|
|
280
|
-
/**
|
|
281
|
-
* Apply outcome feedback to a memory entry.
|
|
282
|
-
*
|
|
283
|
-
* Increments outcome_positive or outcome_negative counters.
|
|
284
|
-
* The reward factor in calculateStrength() uses these counts to
|
|
285
|
-
* continuously modulate the effective half-life:
|
|
286
|
-
* reward_ratio = (pos - neg) / (pos + neg + 1)
|
|
287
|
-
* reward_factor = 1 + 0.5 * reward_ratio // range (0.5, 1.5)
|
|
288
|
-
* effective_hl = half_life_days * reward_factor
|
|
289
|
-
*
|
|
290
|
-
* No fixed half-life delta. Decay rate adjusts proportionally to
|
|
291
|
-
* cumulative reward signal, inspired by R-STDP in spiking networks.
|
|
292
|
-
*/
|
|
162
|
+
/** Counts the outcome; calculateStrength turns the counts into a reward factor on the half-life, so there is no fixed delta here. */
|
|
293
163
|
export function applyOutcome(entry, good) {
|
|
294
164
|
const updated = {
|
|
295
165
|
...entry,
|
|
@@ -307,17 +177,17 @@ export function entryAfterOutcome(entry, good) {
|
|
|
307
177
|
return updated;
|
|
308
178
|
return { ...updated, tags: updated.tags.filter((t) => t !== CHURN_STALE_TAG) };
|
|
309
179
|
}
|
|
310
|
-
/**
|
|
311
|
-
* Generate a random memory ID using crypto.randomUUID().
|
|
312
|
-
*/
|
|
180
|
+
/** A new id: `prefix_` plus the first ID_SUFFIX_CHARS hex characters of a random UUID. */
|
|
313
181
|
export function generateId(prefix = 'mem') {
|
|
314
182
|
return `${prefix}_${randomUUID().replace(/-/g, '').slice(0, ID_SUFFIX_CHARS)}`;
|
|
315
183
|
}
|
|
184
|
+
// Days without a retrieval before trust lapses; pinned and verified rows are exempt by policy.
|
|
185
|
+
const AGED_OUT_AFTER_DAYS = 30;
|
|
316
186
|
function isAgedOut(entry, now) {
|
|
317
187
|
if (entry.pinned || entry.confidence === 'verified')
|
|
318
188
|
return false;
|
|
319
189
|
const lastRetrieved = new Date(entry.last_retrieved);
|
|
320
|
-
return (now.getTime() - lastRetrieved.getTime()) / DAY_MS >
|
|
190
|
+
return (now.getTime() - lastRetrieved.getTime()) / DAY_MS > AGED_OUT_AFTER_DAYS;
|
|
321
191
|
}
|
|
322
192
|
export function confidenceFacets(entry, now = evalNow()) {
|
|
323
193
|
return facetsOf(entry, now);
|
|
@@ -325,8 +195,7 @@ export function confidenceFacets(entry, now = evalNow()) {
|
|
|
325
195
|
export function facetsOf(entry, now) {
|
|
326
196
|
return { tier: entry.confidence, agedOut: isAgedOut(entry, now) };
|
|
327
197
|
}
|
|
328
|
-
//
|
|
329
|
-
// used to read 'stale', so warning on it separately keeps the same set.
|
|
198
|
+
// An aged-out row warns on its own, since its stored tier alone would hide it.
|
|
330
199
|
export function confidenceLabel(entry, now = evalNow()) {
|
|
331
200
|
const { tier, agedOut } = confidenceFacets(entry, now);
|
|
332
201
|
return {
|
|
@@ -334,29 +203,16 @@ export function confidenceLabel(entry, now = evalNow()) {
|
|
|
334
203
|
warn: agedOut || tier === 'stale' || tier === 'inferred',
|
|
335
204
|
};
|
|
336
205
|
}
|
|
337
|
-
/**
|
|
338
|
-
* Resolve the effective confidence for a memory entry.
|
|
339
|
-
* If the entry has not been retrieved in 30+ days and is not 'verified',
|
|
340
|
-
* returns 'stale'. Otherwise returns the stored confidence value.
|
|
341
|
-
*/
|
|
206
|
+
/** The stored confidence, or 'stale' once the entry is aged out (not retrieved for AGED_OUT_AFTER_DAYS; pinned and verified exempt). */
|
|
342
207
|
export function resolveConfidence(entry, now = evalNow()) {
|
|
343
208
|
return isAgedOut(entry, now) ? 'stale' : entry.confidence;
|
|
344
209
|
}
|
|
345
|
-
/**
|
|
346
|
-
*
|
|
347
|
-
* write-time multipliers. 365 because 7 days lost the current fact far more
|
|
348
|
-
* often, and 730 days or no decay did no better. `hippo sleep` moves memories still
|
|
349
|
-
* on an older base (src/consolidate/half-life-migration.ts).
|
|
350
|
-
*/
|
|
210
|
+
/** Base half-life in days before deriveHalfLife's multipliers: 365 because 7 lost the current fact far more often and 730 did no better.
|
|
211
|
+
* `hippo sleep` moves memories still on an older base (src/consolidate/half-life-migration.ts). */
|
|
351
212
|
export const DEFAULT_HALF_LIFE_DAYS = 365;
|
|
352
213
|
export const COMPACTION_MEMORY_TAG = 'compaction-memory';
|
|
353
214
|
export const COMPACTION_SOURCE_PREFIX = 'compaction:';
|
|
354
215
|
export const KEEP_PAIRS = AGENT_MEMORY_TOOLS.map((t) => ({ tag: t.tag, sourcePrefix: toolSourcePrefix(t.id) }));
|
|
355
|
-
const sqlText = (s) => `'${s.replace(/'/g, "''")}'`;
|
|
356
|
-
// json_each matches the tag as a whole element; substr, not LIKE, keeps the prefix case-sensitive like startsWith.
|
|
357
|
-
const keepPairSql = (p) => `(COALESCE(superseded_by, '') = '' AND EXISTS (SELECT 1 FROM json_each(CASE WHEN json_valid(tags_json) THEN tags_json ELSE '[]' END) WHERE value = ${sqlText(p.tag)}) AND substr(source, 1, ${p.sourcePrefix.length}) = ${sqlText(p.sourcePrefix)})`;
|
|
358
|
-
// Pinned and kept rows stay (a superseded row is not kept: its successor carries the tag and source); raw rows leave only through archiveRawMemory. The SQL twin guards the DELETE itself.
|
|
359
|
-
export const AUTO_DELETABLE_SQL = `pinned = 0 AND kind != 'raw'${KEEP_PAIRS.map((p) => ` AND NOT ${keepPairSql(p)}`).join('')}`;
|
|
360
216
|
export function isKeptForGood(entry) {
|
|
361
217
|
return !entry.superseded_by && KEEP_PAIRS.some((p) => entry.tags.includes(p.tag) && entry.source.startsWith(p.sourcePrefix));
|
|
362
218
|
}
|
|
@@ -403,9 +259,8 @@ export function createMemory(content, options = {}) {
|
|
|
403
259
|
scope: options.scope ?? null,
|
|
404
260
|
owner: options.owner ?? null,
|
|
405
261
|
artifact_ref: options.artifact_ref ?? null,
|
|
406
|
-
tenantId: options.tenantId ??
|
|
262
|
+
tenantId: options.tenantId ?? DEFAULT_TENANT_ID,
|
|
407
263
|
};
|
|
408
|
-
// Recalculate strength with the emotional multiplier applied
|
|
409
264
|
entry.strength = calculateStrength(entry);
|
|
410
265
|
return entry;
|
|
411
266
|
}
|
|
@@ -433,21 +288,13 @@ export function createSuccessor(old, content, opts) {
|
|
|
433
288
|
baseHalfLifeDays: opts.baseHalfLifeDays,
|
|
434
289
|
});
|
|
435
290
|
// A legacy null origin has nothing to carry, so the store stamps it from its own location.
|
|
436
|
-
if (
|
|
291
|
+
if (isJsonString(old.origin_project)) {
|
|
437
292
|
next.origin_project = old.origin_project;
|
|
438
293
|
}
|
|
439
294
|
return next;
|
|
440
295
|
}
|
|
441
|
-
/**
|
|
442
|
-
*
|
|
443
|
-
* Returns 0..1 where:
|
|
444
|
-
* >0.7 = high fit (consistent with existing knowledge, consolidates faster)
|
|
445
|
-
* 0.3-0.7 = moderate fit
|
|
446
|
-
* <0.3 = novel (doesn't match existing patterns, decays faster if unused)
|
|
447
|
-
*
|
|
448
|
-
* Uses tag overlap (always available) weighted by how common each tag is.
|
|
449
|
-
* Rare shared tags signal stronger schema fit than common ones.
|
|
450
|
-
*/
|
|
296
|
+
/** How well new content fits existing knowledge, 0..1: above 0.7 consolidates faster, below 0.3 is novel and decays faster if unused.
|
|
297
|
+
* Tags shared with existing memories count by rarity (a rare shared tag fits more), plus content-token overlap. */
|
|
451
298
|
export function computeSchemaFit(content, tags, existingEntries) {
|
|
452
299
|
const tagCounts = new Map();
|
|
453
300
|
for (const entry of existingEntries) {
|
|
@@ -464,10 +311,10 @@ function significantTokens(text) {
|
|
|
464
311
|
export function schemaFitFrom(content, tags, source) {
|
|
465
312
|
const N = source.rows;
|
|
466
313
|
if (N === 0)
|
|
467
|
-
return
|
|
314
|
+
return DEFAULT_SCHEMA_FIT;
|
|
468
315
|
const tagFreq = source.tagCounts;
|
|
469
316
|
if (tags.length === 0 && tagFreq.size === 0)
|
|
470
|
-
return
|
|
317
|
+
return DEFAULT_SCHEMA_FIT;
|
|
471
318
|
// Tag overlap, weighted so a shared rare tag counts for more than a shared common one.
|
|
472
319
|
let weightedOverlap = 0;
|
|
473
320
|
let totalWeight = 0;
|
|
@@ -509,26 +356,8 @@ function inferValence(tags) {
|
|
|
509
356
|
return 'positive';
|
|
510
357
|
return 'neutral';
|
|
511
358
|
}
|
|
512
|
-
/**
|
|
513
|
-
*
|
|
514
|
-
* Returns the mutated copies (caller must persist to disk).
|
|
515
|
-
*
|
|
516
|
-
* EVAL-ONLY ablation (see ablation.ts): with HIPPO_ABLATE_RECALL_BOOST set,
|
|
517
|
-
* this returns the entries UNMUTATED - neutralizing all three strengthening
|
|
518
|
-
* sub-effects (clock reset, retrieval_count, half-life increment) at the
|
|
519
|
-
* single shared write site. The entries (not an empty array) must be
|
|
520
|
-
* returned because callers derive `last_retrieval_ids` from the return
|
|
521
|
-
* value, and a later `hippo outcome --good/--bad` targets those ids - an
|
|
522
|
-
* empty return would silently co-ablate the outcome channel in the
|
|
523
|
-
* strengthen-off arm. PERSISTENCE is gated separately at
|
|
524
|
-
* each persisting caller (CLI recall, api context, MCP recall/context,
|
|
525
|
-
* consolidation replay): writeEntry on identical rows still refreshes
|
|
526
|
-
* updated_at, rewrites mirrors, and marks DAG parents dirty,
|
|
527
|
-
* so those write loops skip under the flag.
|
|
528
|
-
* The default `now` honors HIPPO_FAKE_NOW (simulated-time protocols).
|
|
529
|
-
*/
|
|
530
|
-
// Confidence is deliberately absent below: it is an epistemic tier, not a
|
|
531
|
-
// recency signal, and a stored 'stale' is always a deliberate mark.
|
|
359
|
+
/** Returns copies with the retrieval count, clock and half-life updated; the caller persists them.
|
|
360
|
+
* Under HIPPO_ABLATE_RECALL_BOOST (eval-only) the entries come back unchanged, not empty, since callers derive last_retrieval_ids from them. */
|
|
532
361
|
export function markRetrieved(entries, now = evalNow()) {
|
|
533
362
|
if (isRecallBoostAblated())
|
|
534
363
|
return entries;
|
|
@@ -536,12 +365,13 @@ export function markRetrieved(entries, now = evalNow()) {
|
|
|
536
365
|
if (e.superseded_by)
|
|
537
366
|
return e;
|
|
538
367
|
const wrong = netWrong(e) > 0;
|
|
368
|
+
// Confidence stays untouched: it is an epistemic tier, not a recency signal.
|
|
539
369
|
const updated = {
|
|
540
370
|
...e,
|
|
541
371
|
retrieval_count: e.retrieval_count + 1,
|
|
372
|
+
// A wrong memory keeps both, since last_retrieved is the decay anchor.
|
|
542
373
|
last_retrieved: wrong ? e.last_retrieved : now.toISOString(),
|
|
543
|
-
|
|
544
|
-
half_life_days: wrong ? e.half_life_days : e.half_life_days + 2,
|
|
374
|
+
half_life_days: wrong ? e.half_life_days : e.half_life_days + RETRIEVAL_HALF_LIFE_GAIN_DAYS,
|
|
545
375
|
};
|
|
546
376
|
updated.strength = calculateStrength(updated, now);
|
|
547
377
|
return updated;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
/** The package folder: it holds package.json, bin/ and dist-ui/. The same two steps up from src/core and from dist/core. */
|
|
4
|
+
export const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
5
|
+
//# sourceMappingURL=package-root.js.map
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Physics engine configuration for Hippo memory-as-physics.
|
|
3
|
-
* All constants are tunable; defaults calibrated for ~500 memory corpus.
|
|
4
|
-
*/
|
|
1
|
+
/** Physics engine configuration for Hippo memory-as-physics. All constants are tunable; defaults calibrated for ~500 memory corpus. */
|
|
5
2
|
export interface PhysicsConfig {
|
|
6
3
|
/** Use physics scoring when embeddings available. 'auto' = yes if embeddings exist. */
|
|
7
4
|
enabled: boolean | 'auto';
|
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Physics engine configuration for Hippo memory-as-physics.
|
|
3
|
-
* All constants are tunable; defaults calibrated for ~500 memory corpus.
|
|
4
|
-
*/
|
|
1
|
+
/** Physics engine configuration for Hippo memory-as-physics. All constants are tunable; defaults calibrated for ~500 memory corpus. */
|
|
5
2
|
export const DEFAULT_PHYSICS_CONFIG = {
|
|
6
|
-
// Off by default: the paired ablation (benchmarks/physics-ablation/) found
|
|
7
|
-
//
|
|
8
|
-
// (MRR 0.68 vs 0.84, R@5 74% vs 84%). Opt in with physics.enabled 'auto'
|
|
9
|
-
// or true.
|
|
3
|
+
// Off by default: the paired ablation (benchmarks/physics-ablation/) found physics worse than classic hybrid on every metric, CI excluding zero
|
|
4
|
+
// (MRR 0.68 vs 0.84, R@5 74% vs 84%). Opt in with physics.enabled 'auto' or true.
|
|
10
5
|
enabled: false,
|
|
11
6
|
G_query: 2.0,
|
|
12
7
|
G_memory: 0.01,
|
package/dist/core/physics.d.ts
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Pure math module: forces, Velocity Verlet integration, physics-based scoring,
|
|
5
|
-
* and cluster amplification. No I/O — all state is passed in and returned.
|
|
6
|
-
*
|
|
7
|
-
* Memories are particles on the unit hypersphere in embedding space (384-dim).
|
|
8
|
-
* Forces act on them: query gravity (retrieval), inter-memory attraction,
|
|
9
|
-
* conflict repulsion, and drag (consolidation). Nearby high-scoring memories
|
|
10
|
-
* amplify each other via constructive interference.
|
|
11
|
-
*/
|
|
1
|
+
/** Memory-as-Physics engine: pure math (forces, Velocity Verlet integration, physics-based scoring, cluster amplification), no I/O.
|
|
2
|
+
* Memories are particles on the unit hypersphere in embedding space (384-dim); query gravity, attraction, conflict repulsion and drag act on them,
|
|
3
|
+
* and nearby high-scoring memories amplify each other. */
|
|
12
4
|
import { type EmotionalValence } from './memory.js';
|
|
13
5
|
import type { PhysicsConfig } from './physics-config.js';
|
|
14
6
|
export interface PhysicsParticle {
|
|
@@ -51,42 +43,16 @@ export declare function vecClampMagnitude(v: number[], maxMag: number): number[]
|
|
|
51
43
|
export declare function computeMass(strength: number, retrievalCount: number): number;
|
|
52
44
|
export declare function computeCharge(valence: EmotionalValence): number;
|
|
53
45
|
export declare function computeTemperature(ageDays: number, temperatureDecay: number): number;
|
|
54
|
-
/**
|
|
55
|
-
* Query gravity (retrieval-time, virtual — does not update position).
|
|
56
|
-
* Returns scalar force magnitude for ranking.
|
|
57
|
-
*
|
|
58
|
-
* F_query(i) = G_Q * mass(i) * max(0, cosine(pos_i, query))^2
|
|
59
|
-
*/
|
|
46
|
+
/** Query gravity (retrieval-time, virtual: does not move the particle): scalar ranking magnitude F = G_Q * mass * max(0, cosine(pos, query))^2. */
|
|
60
47
|
export declare function queryGravityMagnitude(particle: PhysicsParticle, queryEmbedding: number[], G_query: number): number;
|
|
61
|
-
/**
|
|
62
|
-
* Momentum bonus: how aligned is the particle's velocity with the query direction?
|
|
63
|
-
* Returns a value in [0, 1].
|
|
64
|
-
*/
|
|
48
|
+
/** Momentum bonus in [0, 1]: how aligned the particle's velocity is with the query direction. */
|
|
65
49
|
export declare function velocityAlignmentBonus(particle: PhysicsParticle, queryEmbedding: number[]): number;
|
|
66
|
-
/**
|
|
67
|
-
*
|
|
68
|
-
|
|
69
|
-
*
|
|
70
|
-
* F_attract(i,j) = G_M * m_i * m_j * max(0, cosine(i,j))^3 * direction(j→i in embedding space)
|
|
71
|
-
*
|
|
72
|
-
* Direction is computed as the component of (pos_j - pos_i) that lies tangent to the
|
|
73
|
-
* unit sphere at pos_i (since we normalize positions back to the sphere after integration).
|
|
74
|
-
*/
|
|
75
|
-
export declare function attractionForce(pi: PhysicsParticle, pj: PhysicsParticle, G_memory: number): number[];
|
|
76
|
-
/**
|
|
77
|
-
* Conflict repulsion force vector (consolidation-time).
|
|
78
|
-
* Repulsive force pushing i away from j.
|
|
79
|
-
*
|
|
80
|
-
* F_repel(i,j) = K_R * m_i * m_j / max(0.01, cosine_distance(i,j))^2
|
|
81
|
-
* where cosine_distance = 1 - cosine_similarity
|
|
82
|
-
*/
|
|
50
|
+
/** Attraction force on particle i from j (consolidation-time): G_M m_i m_j max(0, cosine)^3, directed along (pos_j - pos_i) projected tangent to the unit
|
|
51
|
+
* sphere at pos_i (positions are re-normalized to the sphere after integration). Adds into `out` (a fresh zero vector by default) using `diff` as scratch. */
|
|
52
|
+
export declare function attractionForce(pi: PhysicsParticle, pj: PhysicsParticle, G_memory: number, out?: number[], diff?: number[]): number[];
|
|
53
|
+
/** Conflict repulsion on i away from j (consolidation-time): K_R * m_i * m_j / max(0.01, cosine_distance)^2, where cosine_distance = 1 - cosine_similarity. */
|
|
83
54
|
export declare function repulsionForce(pi: PhysicsParticle, pj: PhysicsParticle, K_repulsion: number): number[];
|
|
84
|
-
/**
|
|
85
|
-
* Drag force vector (consolidation-time).
|
|
86
|
-
* F_drag(i) = -drag * velocity(i) / max(1, effective_half_life(i))
|
|
87
|
-
*
|
|
88
|
-
* effectiveHalfLife should be passed in from the memory's current half_life_days.
|
|
89
|
-
*/
|
|
55
|
+
/** Drag force (consolidation-time): -drag * velocity / max(1, effectiveHalfLife), with effectiveHalfLife from the memory's current half_life_days. */
|
|
90
56
|
export declare function dragForce(particle: PhysicsParticle, drag: number, effectiveHalfLife: number): number[];
|
|
91
57
|
export interface ForceContext {
|
|
92
58
|
/** Map of memory ID -> list of conflicting memory IDs */
|
|
@@ -95,26 +61,14 @@ export interface ForceContext {
|
|
|
95
61
|
halfLives: Map<string, number>;
|
|
96
62
|
config: PhysicsConfig;
|
|
97
63
|
}
|
|
98
|
-
/**
|
|
99
|
-
* Run the full physics simulation for one sleep cycle.
|
|
100
|
-
* Mutates particles in place. Returns simulation statistics.
|
|
101
|
-
*/
|
|
64
|
+
/** Full physics simulation for one sleep cycle; mutates particles in place and returns simulation statistics. */
|
|
102
65
|
export declare function simulate(particles: PhysicsParticle[], ctx: ForceContext): SimulationStats;
|
|
103
66
|
export declare function computeSystemEnergy(particles: PhysicsParticle[], G_memory: number): SystemEnergy;
|
|
104
|
-
/**
|
|
105
|
-
* Score all particles against a query embedding using physics-based ranking.
|
|
106
|
-
* Does NOT modify particle positions (virtual force computation).
|
|
107
|
-
*/
|
|
67
|
+
/** Scores all particles against a query embedding; virtual force computation, so it does NOT modify particle positions. */
|
|
108
68
|
export declare function physicsScore(particles: PhysicsParticle[], queryEmbedding: number[], config: PhysicsConfig,
|
|
109
|
-
/** Cross-ingest-stable tie key per memoryId (typically the memory
|
|
110
|
-
*
|
|
111
|
-
* it ties fall to memoryId -- per-instance only, which lets the
|
|
112
|
-
* cluster_top_k amplification set vary across fresh ingests. */
|
|
69
|
+
/** Cross-ingest-stable tie key per memoryId (typically the memory content, from a caller with entries in scope); without it ties fall to memoryId,
|
|
70
|
+
* which is per-instance only and lets the cluster_top_k amplification set vary across fresh ingests. */
|
|
113
71
|
tieKeyOf?: (memoryId: string) => string): ScoredPhysicsResult[];
|
|
114
|
-
/**
|
|
115
|
-
* Nudge a particle's position toward (good outcome) or away from (bad outcome)
|
|
116
|
-
* the query embedding. Respects temperature: new memories respond more.
|
|
117
|
-
* Mutates particle in place.
|
|
118
|
-
*/
|
|
72
|
+
/** Nudges a particle toward (good outcome) or away from (bad outcome) the query embedding; new memories respond more (temperature). Mutates in place. */
|
|
119
73
|
export declare function applyOutcomeFeedback(particle: PhysicsParticle, queryEmbedding: number[], good: boolean, feedbackAlpha: number): void;
|
|
120
74
|
//# sourceMappingURL=physics.d.ts.map
|