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/api/recall.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// Read path: recall (sync) and retrieve (async, adds the vector arm).
|
|
2
2
|
import { envRequireSessionScopedFreshTail } from '../util/env.js';
|
|
3
3
|
import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../store/rows.js';
|
|
4
|
-
import {
|
|
5
|
-
import { loadRecallSearchEntries, recallScopeFilter } from '../store/search-rows.js';
|
|
4
|
+
import { recallScopeFilter } from '../store/search-rows.js';
|
|
6
5
|
import { estimateTokens } from '../util/token-text.js';
|
|
7
6
|
import { formatHandoffEvidenceLine } from '../core/handoff.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
7
|
+
import { boostByGoals } from '../search/goal-boost.js';
|
|
8
|
+
import { storeFor } from '../store/index.js';
|
|
9
|
+
import { sqliteSyncStore } from '../store/sqlite/store.js';
|
|
10
10
|
import { hybridSearch } from '../search/hybrid.js';
|
|
11
11
|
import { physicsSearch } from '../search/physics-search.js';
|
|
12
12
|
import { churnStaleFactor } from '../search/boosts.js';
|
|
@@ -15,56 +15,26 @@ import { dropHeldCopies, duplicateKey, storedTextKeys } from '../util/same-text.
|
|
|
15
15
|
import { isSharedStore, loadConfig } from '../core/config.js';
|
|
16
16
|
import { classifyOriginProject, projectNames } from '../core/project-identity.js';
|
|
17
17
|
import { decidePlanningFallacy, detectPlanningClaim } from '../predictions/planning-fallacy.js';
|
|
18
|
-
import { planningFallacyEvidenceAt } from '../store/planning-fallacy-evidence.js';
|
|
19
18
|
import { detectAnchoring, hashQueryText, biasHintEnabled } from './recall-history.js';
|
|
20
19
|
import { detectAvailabilityBias } from './availability.js';
|
|
21
20
|
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../store/recall-scope.js';
|
|
22
21
|
import { ownerOrSubject, RecallContractError } from './types.js';
|
|
23
22
|
import { anchoringRows, availabilityRows, callerOf, recallAuditMetadata, recallAuditRow, strengthenOf } from './recall-record.js';
|
|
24
23
|
import { retrieveWithCliCore } from './recall-core.js';
|
|
24
|
+
import { recallLead, recordShownRecall } from './recall-finish.js';
|
|
25
25
|
const DEFAULT_RECALL_LIMIT = 10;
|
|
26
|
-
/**
|
|
27
|
-
*
|
|
28
|
-
* `api.recall`, `cmdRecall`, and the MCP `hippo_recall` handler so all three
|
|
29
|
-
* pipelines produce the same shape without duplicating field-construction
|
|
30
|
-
* logic. Pass-through identity today; kept as a helper so future field
|
|
31
|
-
* additions land at one site.
|
|
32
|
-
*/
|
|
33
|
-
export function buildSuppressionSummary(counts) {
|
|
34
|
-
return {
|
|
35
|
-
totalCandidates: counts.totalCandidates,
|
|
36
|
-
droppedPreRank: counts.droppedPreRank,
|
|
37
|
-
droppedByBudget: counts.droppedByBudget,
|
|
38
|
-
summarySubstitutionsAdded: counts.summarySubstitutionsAdded,
|
|
39
|
-
freshTailAdded: counts.freshTailAdded,
|
|
40
|
-
suppressedByInterference: counts.suppressedByInterference,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Domain-level recall on hippo.db only, never `ctx.store`, since it is synchronous: under another store its first open throws
|
|
45
|
-
* `SqliteBlockedError`. Loads BM25-ranked candidates from SQLite scoped to
|
|
46
|
-
* `ctx.tenantId` and keeps that order whatever `mode` says; `retrieve` is the
|
|
47
|
-
* mode-aware, strengthening variant the HTTP route uses.
|
|
48
|
-
*
|
|
49
|
-
* **api.recall does NOT mutate `index.last_retrieval_ids`** (contract
|
|
50
|
-
* lock). The CLI `cmdRecall` (cli.ts) writes `last_retrieval_ids` because the
|
|
51
|
-
* CLI is interactive (user is about to run `hippo outcome --good`). SDK callers
|
|
52
|
-
* are programmatic: they either pass explicit ids to `api.outcome` or call
|
|
53
|
-
* `api.getContext` first for the context-then-outcome workflow (getContext
|
|
54
|
-
* DOES write `last_retrieval_ids`). Adding the side-effect here would change
|
|
55
|
-
* `api.recall` from a pure read into a read+write, breaking SDK callers who
|
|
56
|
-
* batch recall calls in a row. Locked by
|
|
57
|
-
* `tests/api-recall-no-side-effects.test.ts`.
|
|
58
|
-
*/
|
|
26
|
+
/** Reads hippo.db directly, never `ctx.store`, because it is synchronous (another store would throw `SqliteBlockedError`).
|
|
27
|
+
* It never writes `last_retrieval_ids` (contract lock: tests/api-recall-no-side-effects.test.ts). */
|
|
59
28
|
export function recall(ctx, opts) {
|
|
60
29
|
// A member key may not unlock a private or quarantined scope by naming it.
|
|
61
30
|
assertScopeRequestAllowed(ctx.actor, opts.scope);
|
|
62
31
|
const windowSize = recallWindowSize(opts);
|
|
63
32
|
const own = personalScopeOf(ctx.actor) ?? undefined;
|
|
64
|
-
const
|
|
33
|
+
const store = sqliteSyncStore(ctx.hippoRoot);
|
|
34
|
+
const all = store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, windowSize, own));
|
|
65
35
|
const plan = planRecall(ctx, opts, all, own);
|
|
66
|
-
const { result, writes } = composeRecall(ctx, opts, { windowSize, all, plan, reads: readRecallSync(ctx, opts, plan) });
|
|
67
|
-
|
|
36
|
+
const { result, writes } = composeRecall(ctx, opts, { windowSize, all, plan, reads: readRecallSync(store, ctx, opts, plan) });
|
|
37
|
+
store.finishRecall({ ...writes, audit: [...(opts.leadingAudit ?? []), ...writes.audit] });
|
|
68
38
|
return result;
|
|
69
39
|
}
|
|
70
40
|
function recallOrigin(opts) {
|
|
@@ -73,7 +43,8 @@ function recallOrigin(opts) {
|
|
|
73
43
|
function inCallerProject(entry, opts) {
|
|
74
44
|
return !opts.project || classifyOriginProject(entry.origin_project, opts.project) !== 'cross-project';
|
|
75
45
|
}
|
|
76
|
-
/** The one recall entry: ranks with the ranker `opts` names, then writes the recall
|
|
46
|
+
/** The one recall entry: ranks with the ranker `opts` names, then writes the recall, and records it in full for a surface that sets `recordAs`.
|
|
47
|
+
* Only the CLI core ranker writes last_retrieval_ids (contract lock). */
|
|
77
48
|
export async function retrieve(ctx, opts) {
|
|
78
49
|
assertScopeRequestAllowed(ctx.actor, opts.scope);
|
|
79
50
|
if (opts.cliCore)
|
|
@@ -84,20 +55,48 @@ export async function retrieve(ctx, opts) {
|
|
|
84
55
|
if (opts.showRanked)
|
|
85
56
|
return retrieveFromStore(ctx, opts, windowSize, opts.showRanked, own);
|
|
86
57
|
const store = storeFor(ctx);
|
|
58
|
+
const how = opts.recordAs;
|
|
59
|
+
if (!how)
|
|
60
|
+
return retrieveBand(ctx, store, opts, windowSize, own);
|
|
61
|
+
const result = await retrieveBand(ctx, store, { ...opts, ...recallLead(ctx, how, opts.query, opts.sessionId) }, windowSize, own);
|
|
62
|
+
await recordShownRecall(ctx, store, how, shownBand(opts, result));
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
/** What the band ranker hands to the record: the rows it returns, and the continuity block the reply carries beside them. */
|
|
66
|
+
function shownBand(opts, result) {
|
|
67
|
+
return {
|
|
68
|
+
query: opts.query,
|
|
69
|
+
sessionId: opts.sessionId,
|
|
70
|
+
topId: result.results[0]?.id ?? null,
|
|
71
|
+
anchoredOn: result.anchoringHint?.memoryId,
|
|
72
|
+
items: result.results.length,
|
|
73
|
+
tokens: result.tokens + (result.continuityTokens ?? 0),
|
|
74
|
+
ledgerSessionId: opts.sessionId ?? null,
|
|
75
|
+
written: true, // a failed audit write throws out of the band ranker, so this point is never reached without the rows
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** The default ranker: the SQL BM25 band, reordered by hybrid or physics search when `mode` asks. */
|
|
79
|
+
async function retrieveBand(ctx, store, opts, windowSize, own) {
|
|
87
80
|
let candidates = await store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, windowSize, own));
|
|
88
81
|
if (opts.mode === 'hybrid' || opts.mode === 'physics') {
|
|
89
82
|
const searchOpts = { budget: Infinity, hippoRoot: ctx.hippoRoot, scope: opts.scope ?? null, vectorCandidates: recallVectorSpec(ctx, opts, own), store };
|
|
90
|
-
const ranked = opts
|
|
91
|
-
? await physicsSearch(opts.query, candidates, { ...searchOpts, physicsConfig: loadConfig(ctx.hippoRoot).physics })
|
|
92
|
-
: await hybridSearch(opts.query, candidates, searchOpts);
|
|
83
|
+
const ranked = await rankPool(ctx, opts, candidates, searchOpts);
|
|
93
84
|
const rankedIds = new Set(ranked.map((r) => r.entry.id));
|
|
94
85
|
candidates = [...ranked.map((r) => r.entry), ...candidates.filter((e) => !rankedIds.has(e.id))];
|
|
95
86
|
}
|
|
96
87
|
const plan = planRecall(ctx, opts, candidates, own);
|
|
97
88
|
const { result, writes } = composeRecall(ctx, opts, { windowSize, all: candidates, plan, reads: await readRecall(store, ctx, opts, plan) });
|
|
98
|
-
await store.finishRecall({
|
|
89
|
+
await store.finishRecall({
|
|
90
|
+
...writes, audit: [...(opts.leadingAudit ?? []), ...writes.audit], strengthen: strengthenOf(ctx, result.results.map((r) => r.id))
|
|
91
|
+
});
|
|
99
92
|
return result;
|
|
100
93
|
}
|
|
94
|
+
/** The ranked pool: physics when `mode` says so, hybrid otherwise; each caller supplies its own search options. */
|
|
95
|
+
function rankPool(ctx, opts, pool, searchOpts) {
|
|
96
|
+
return opts.mode === 'physics'
|
|
97
|
+
? physicsSearch(opts.query, pool, { ...searchOpts, physicsConfig: loadConfig(ctx.hippoRoot).physics })
|
|
98
|
+
: hybridSearch(opts.query, pool, searchOpts);
|
|
99
|
+
}
|
|
101
100
|
/** The recall load's arguments: exact scope, current rows only, the caller's project and personal scope. */
|
|
102
101
|
function recallSearchArgs(ctx, opts, limit, own) {
|
|
103
102
|
return {
|
|
@@ -129,9 +128,7 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
|
|
|
129
128
|
const pool = loaded.filter((e) => passesScopeFilterForRecall(e.scope ?? null, opts.scope, own));
|
|
130
129
|
// No scope option: the scope boost follows HIPPO_SCOPE and the skill env, as MCP recall always ranked.
|
|
131
130
|
const searchOpts = { budget: Infinity, hippoRoot: ctx.hippoRoot, vectorCandidates: recallVectorSpec(ctx, opts, own), store };
|
|
132
|
-
let ranked = opts
|
|
133
|
-
? await physicsSearch(opts.query, pool, { ...searchOpts, physicsConfig: loadConfig(ctx.hippoRoot).physics })
|
|
134
|
-
: await hybridSearch(opts.query, pool, searchOpts);
|
|
131
|
+
let ranked = await rankPool(ctx, opts, pool, searchOpts);
|
|
135
132
|
// One goal read serves both boosts; the ranked list's log rows come first, so its scores win the log's first-write.
|
|
136
133
|
const goals = opts.sessionId && !opts.goalTag ? await store.activeGoals({ sessionId: opts.sessionId, tenantId: ctx.tenantId }) : null;
|
|
137
134
|
let rankedLog = [];
|
|
@@ -143,7 +140,9 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
|
|
|
143
140
|
const window = ranked.slice(0, windowSize).map((r) => r.entry);
|
|
144
141
|
const bandOpts = { ...opts, suppressRecallTrace: true };
|
|
145
142
|
const plan = planRecall(ctx, bandOpts, window, own);
|
|
146
|
-
const { result, writes } = composeRecall(ctx, bandOpts, {
|
|
143
|
+
const { result, writes } = composeRecall(ctx, bandOpts, {
|
|
144
|
+
windowSize, all: window, plan, reads: await readRecall(store, ctx, bandOpts, plan, goals), auditBand: false
|
|
145
|
+
});
|
|
147
146
|
// Rows the vector arm added count as candidates too.
|
|
148
147
|
const inPool = new Set(pool.map((e) => e.id));
|
|
149
148
|
const candidates = [...pool, ...ranked.map((r) => r.entry).filter((e) => !inPool.has(e.id))];
|
|
@@ -199,16 +198,16 @@ function planRecall(ctx, opts, all, own) {
|
|
|
199
198
|
claim: detectPlanningClaim(opts.query),
|
|
200
199
|
};
|
|
201
200
|
}
|
|
202
|
-
/** The plan's reads on
|
|
203
|
-
function readRecallSync(ctx, opts, plan) {
|
|
204
|
-
const {
|
|
201
|
+
/** The plan's reads on the synchronous store, for the recall that cannot await the port. */
|
|
202
|
+
function readRecallSync(store, ctx, opts, plan) {
|
|
203
|
+
const { tenantId } = ctx;
|
|
205
204
|
const freshCount = opts.freshTailCount ?? 0;
|
|
206
205
|
return {
|
|
207
|
-
goals: plan.goalBoost ?
|
|
208
|
-
parents: plan.overflow.size > 0 ?
|
|
209
|
-
freshRaws: freshCount > 0 ?
|
|
210
|
-
continuity: opts.includeContinuity ?
|
|
211
|
-
planning: plan.claim ?
|
|
206
|
+
goals: plan.goalBoost ? store.activeGoals({ sessionId: plan.goalBoost.sessionId, tenantId }) : null,
|
|
207
|
+
parents: plan.overflow.size > 0 ? store.entriesByIds([...plan.overflow.keys()], tenantId) : [],
|
|
208
|
+
freshRaws: freshCount > 0 ? store.freshRawEntries(freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts) ?? null) : [],
|
|
209
|
+
continuity: opts.includeContinuity ? store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuityKey(ctx, opts)) : undefined,
|
|
210
|
+
planning: plan.claim ? store.planningFallacyEvidence(tenantId, plan.claim.classQueryTokens) : null,
|
|
212
211
|
};
|
|
213
212
|
}
|
|
214
213
|
/** The plan's reads through the store; `goals` already read by the caller skips that read. */
|
|
@@ -246,14 +245,14 @@ function composeRecall(ctx, opts, options) {
|
|
|
246
245
|
continuity,
|
|
247
246
|
continuityTokens: continuity ? continuityTokensOf(continuity) : undefined,
|
|
248
247
|
windowSize,
|
|
249
|
-
suppressionSummary:
|
|
248
|
+
suppressionSummary: {
|
|
250
249
|
totalCandidates: all.length,
|
|
251
250
|
droppedPreRank: window.droppedPreRank + bands.heldDropped,
|
|
252
251
|
droppedByBudget: window.droppedByBudget,
|
|
253
252
|
summarySubstitutionsAdded: bands.summarySubstitutions,
|
|
254
253
|
freshTailAdded: bands.freshTailAdded,
|
|
255
254
|
suppressedByInterference,
|
|
256
|
-
}
|
|
255
|
+
},
|
|
257
256
|
};
|
|
258
257
|
// The hint and the no-class-match / tiebreak watching variant are mutually exclusive; both go out as optional fields.
|
|
259
258
|
if (planning?.output.hint)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import type { Context } from './types.js';
|
|
3
|
+
/** Marks a merged memory a model has rewritten, so a later pass skips it. */
|
|
4
|
+
export declare const REFINED_TAG = "llm-refined";
|
|
5
|
+
/** Store a model's rewrite of a merged memory: the new text replaces the old one, and the row gains the refined tag once. */
|
|
6
|
+
export declare function storeRefinement(ctx: Context, entry: MemoryEntry, refined: string): void;
|
|
7
|
+
//# sourceMappingURL=refine.d.ts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// The write half of `hippo refine`: the model call stays with the caller, the rewritten row is stored here.
|
|
2
|
+
import { writeEntry } from '../store/entry-writes.js';
|
|
3
|
+
/** Marks a merged memory a model has rewritten, so a later pass skips it. */
|
|
4
|
+
export const REFINED_TAG = 'llm-refined';
|
|
5
|
+
/** Store a model's rewrite of a merged memory: the new text replaces the old one, and the row gains the refined tag once. */
|
|
6
|
+
export function storeRefinement(ctx, entry, refined) {
|
|
7
|
+
const tags = entry.tags.includes(REFINED_TAG) ? entry.tags : [...entry.tags, REFINED_TAG];
|
|
8
|
+
writeEntry(ctx.hippoRoot, { ...entry, content: refined, tags }, { actor: ctx.actor.subject });
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=refine.js.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { ConfidenceLevel, Layer, MemoryEntry, MemoryKind } from '../core/memory.js';
|
|
2
|
+
import type { HippoDbContext } from './types.js';
|
|
3
|
+
/** One write by a caller in this process, every field already parsed and checked by it. */
|
|
4
|
+
export interface LocalRememberInput {
|
|
5
|
+
readonly content: string;
|
|
6
|
+
/** Every tag the row stores; the salience gate reads these. */
|
|
7
|
+
readonly tags: readonly string[];
|
|
8
|
+
/** The tags schema fit is scored on, for a caller that added path and scope tags of its own to `tags`; without it, `tags`. */
|
|
9
|
+
readonly fitTags?: readonly string[];
|
|
10
|
+
readonly kind?: MemoryKind;
|
|
11
|
+
readonly scope?: string;
|
|
12
|
+
readonly owner?: string;
|
|
13
|
+
readonly artifactRef?: string;
|
|
14
|
+
readonly layer?: Layer;
|
|
15
|
+
readonly pinned?: boolean;
|
|
16
|
+
readonly confidence?: ConfidenceLevel;
|
|
17
|
+
readonly source?: string;
|
|
18
|
+
/** Store it whatever the salience gate would say, as `hippo remember --force` asks and `hippo watch` always does. */
|
|
19
|
+
readonly force?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** The gate's start-weak verdict as the stored row carries it. */
|
|
22
|
+
export interface StartedWeak {
|
|
23
|
+
readonly reason: string;
|
|
24
|
+
readonly strength: number;
|
|
25
|
+
}
|
|
26
|
+
/** `stored` carries the row as the store holds it after the write; `skipped` is the gate dropping the write, with nothing stored or counted. */
|
|
27
|
+
export type LocalRememberOutcome = {
|
|
28
|
+
readonly status: 'stored';
|
|
29
|
+
readonly entry: MemoryEntry;
|
|
30
|
+
readonly startedWeak?: StartedWeak;
|
|
31
|
+
} | {
|
|
32
|
+
readonly status: 'skipped';
|
|
33
|
+
readonly reason: string;
|
|
34
|
+
readonly score: number;
|
|
35
|
+
};
|
|
36
|
+
/** One local write on hippo.db: gate, write, read-back, counter, then the embedding, started and never awaited. A refused value throws as `remember` does. */
|
|
37
|
+
export declare function rememberLocally(ctx: HippoDbContext, input: LocalRememberInput): LocalRememberOutcome;
|
|
38
|
+
/** What a caller asks of fact extraction. The key comes from the caller, which read it from its own environment. */
|
|
39
|
+
export interface FactExtractionRequest {
|
|
40
|
+
/** The caller asked for extraction (`--extract`); the store's config can turn it on without that. */
|
|
41
|
+
readonly requested: boolean;
|
|
42
|
+
readonly apiKey?: string;
|
|
43
|
+
readonly fetcher?: typeof fetch;
|
|
44
|
+
}
|
|
45
|
+
/** `off`: nobody asked. `no_key`: asked, with no key to call the model. `ran`: the facts the model gave and each reason it gave fewer. */
|
|
46
|
+
export type FactExtraction = {
|
|
47
|
+
readonly status: 'off';
|
|
48
|
+
} | {
|
|
49
|
+
readonly status: 'no_key';
|
|
50
|
+
} | {
|
|
51
|
+
readonly status: 'ran';
|
|
52
|
+
readonly facts: number;
|
|
53
|
+
readonly failures: readonly string[];
|
|
54
|
+
};
|
|
55
|
+
/** Extracts facts from a row just stored and stores them beside it. Best-effort: a failure is named in the result, never thrown. */
|
|
56
|
+
export declare function extractRememberedFacts(ctx: HippoDbContext, entry: MemoryEntry, request: FactExtractionRequest): Promise<FactExtraction>;
|
|
57
|
+
//# sourceMappingURL=remember-local.d.ts.map
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// The local remember pipeline for a caller in this process (`hippo remember`, `hippo watch`): schema fit, the salience gate, the
|
|
2
|
+
// write, the read-back, the `remembered` counter and the embedding kick-off, in that order. Fact extraction is a second step,
|
|
3
|
+
// which the caller runs after it has reported the write. Nothing here prints; the caller reports from what comes back.
|
|
4
|
+
import { loadConfig } from '../core/config.js';
|
|
5
|
+
import { computeSalience } from '../core/salience.js';
|
|
6
|
+
import { loadNewestEntries, schemaFitInStore } from '../store/candidates.js';
|
|
7
|
+
import { embedMemory } from '../store/embeddings/index.js';
|
|
8
|
+
import { loadAllEntries, readEntry } from '../store/entry-reads.js';
|
|
9
|
+
import { updateStats } from '../store/index-and-stats.js';
|
|
10
|
+
import { errorMessage } from '../util/log.js';
|
|
11
|
+
import { remember } from './remember.js';
|
|
12
|
+
const WEAK_HALF_LIFE_FACTOR = 0.5;
|
|
13
|
+
/** The gate's verdict on one write, or null where it does not judge: the store has it off, or the write is pinned or forced. */
|
|
14
|
+
function salienceVerdict(ctx, input) {
|
|
15
|
+
const { salience } = loadConfig(ctx.hippoRoot);
|
|
16
|
+
if (!salience.enabled || input.pinned || input.force)
|
|
17
|
+
return null;
|
|
18
|
+
// computeSalience compares against the last `recentWindow` rows only; below 1 its slice takes every row, so that case still loads them all.
|
|
19
|
+
const window = Math.trunc(salience.recentWindow);
|
|
20
|
+
const recent = Number.isSafeInteger(window) && window >= 1
|
|
21
|
+
? loadNewestEntries(ctx.hippoRoot, ctx.tenantId, window)
|
|
22
|
+
: loadAllEntries(ctx.hippoRoot, ctx.tenantId);
|
|
23
|
+
return computeSalience(input.content, [...input.tags], recent, {
|
|
24
|
+
recentWindow: salience.recentWindow,
|
|
25
|
+
overlapThreshold: salience.overlapThreshold,
|
|
26
|
+
minContentLength: salience.minContentLength,
|
|
27
|
+
maxRepeatErrors: salience.maxRepeatErrors,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/** The row `remember` just wrote, as the store holds it: the report, the embedding and the extraction all work on that. */
|
|
31
|
+
function storedEntry(ctx, id) {
|
|
32
|
+
const entry = readEntry(ctx.hippoRoot, id, ctx.tenantId);
|
|
33
|
+
if (!entry)
|
|
34
|
+
throw new Error(`memory ${id} was written but cannot be read back`);
|
|
35
|
+
return entry;
|
|
36
|
+
}
|
|
37
|
+
/** One local write on hippo.db: gate, write, read-back, counter, then the embedding, started and never awaited. A refused value throws as `remember` does. */
|
|
38
|
+
export function rememberLocally(ctx, input) {
|
|
39
|
+
const schemaFit = schemaFitInStore(ctx.hippoRoot, ctx.tenantId, input.content, input.fitTags ?? input.tags);
|
|
40
|
+
const verdict = salienceVerdict(ctx, input);
|
|
41
|
+
if (verdict?.decision === 'skip')
|
|
42
|
+
return { status: 'skipped', reason: verdict.reason, score: verdict.score };
|
|
43
|
+
const startedWeak = verdict?.decision === 'start_weak' ? { reason: verdict.reason, strength: verdict.score } : undefined;
|
|
44
|
+
const { id } = remember(ctx, {
|
|
45
|
+
content: input.content,
|
|
46
|
+
kind: input.kind,
|
|
47
|
+
scope: input.scope,
|
|
48
|
+
owner: input.owner,
|
|
49
|
+
artifactRef: input.artifactRef,
|
|
50
|
+
tags: [...input.tags],
|
|
51
|
+
local: {
|
|
52
|
+
layer: input.layer,
|
|
53
|
+
pinned: input.pinned,
|
|
54
|
+
source: input.source,
|
|
55
|
+
confidence: input.confidence,
|
|
56
|
+
schemaFit,
|
|
57
|
+
weaken: startedWeak && { strength: startedWeak.strength, halfLifeFactor: WEAK_HALF_LIFE_FACTOR },
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
const entry = storedEntry(ctx, id);
|
|
61
|
+
updateStats(ctx.hippoRoot, { remembered: 1 });
|
|
62
|
+
// Best-effort and slow (a model load or a network call), so the caller is not held for it.
|
|
63
|
+
void embedMemory(ctx.hippoRoot, entry);
|
|
64
|
+
return startedWeak ? { status: 'stored', entry, startedWeak } : { status: 'stored', entry };
|
|
65
|
+
}
|
|
66
|
+
/** Extracts facts from a row just stored and stores them beside it. Best-effort: a failure is named in the result, never thrown. */
|
|
67
|
+
export async function extractRememberedFacts(ctx, entry, request) {
|
|
68
|
+
const { extraction } = loadConfig(ctx.hippoRoot);
|
|
69
|
+
if (!request.requested && extraction.enabled !== true)
|
|
70
|
+
return { status: 'off' };
|
|
71
|
+
const { apiKey, fetcher } = request;
|
|
72
|
+
if (!apiKey)
|
|
73
|
+
return { status: 'no_key' };
|
|
74
|
+
const failures = [];
|
|
75
|
+
let facts = 0;
|
|
76
|
+
try {
|
|
77
|
+
// Loaded on demand, so a write that extracts nothing does not pay for the module.
|
|
78
|
+
const { extractFacts, storeExtractedFacts } = await import('../learn/extract.js');
|
|
79
|
+
const found = await extractFacts(entry.content, { apiKey, model: extraction.model, fetcher, onError: (msg) => { failures.push(msg); } });
|
|
80
|
+
if (found.length > 0) {
|
|
81
|
+
storeExtractedFacts(ctx.hippoRoot, entry, found);
|
|
82
|
+
facts = found.length;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (cause) {
|
|
86
|
+
failures.push(errorMessage(cause));
|
|
87
|
+
}
|
|
88
|
+
return { status: 'ran', facts, failures };
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=remember-local.js.map
|
package/dist/api/remember.d.ts
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import type { ConnectorEvent } from '../store/port.js';
|
|
2
|
-
import { type MemoryKind } from '../core/memory.js';
|
|
2
|
+
import { type ConfidenceLevel, type Layer, type MemoryKind, type TraceOutcome } from '../core/memory.js';
|
|
3
3
|
import type { Context, StoreReply } from './types.js';
|
|
4
|
+
/** Row fields the caller's own process decides, as the CLI does from its flags and its salience gate. */
|
|
5
|
+
export interface RememberLocal {
|
|
6
|
+
layer?: Layer;
|
|
7
|
+
pinned?: boolean;
|
|
8
|
+
confidence?: ConfidenceLevel;
|
|
9
|
+
source?: string;
|
|
10
|
+
schemaFit?: number;
|
|
11
|
+
traceOutcome?: TraceOutcome;
|
|
12
|
+
sourceSessionId?: string | null;
|
|
13
|
+
/** A salience gate's start-weak verdict: the row starts at `strength`, and its half-life is multiplied by `halfLifeFactor`, never below one day. */
|
|
14
|
+
weaken?: {
|
|
15
|
+
readonly strength: number;
|
|
16
|
+
readonly halfLifeFactor: number;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
4
19
|
export interface RememberOpts {
|
|
5
20
|
content: string;
|
|
6
21
|
kind?: MemoryKind;
|
|
@@ -19,6 +34,8 @@ export interface RememberOpts {
|
|
|
19
34
|
};
|
|
20
35
|
/** Store it in the caller's own personal scope, readable by its owner alone in every project; needs an owner on the actor and no `scope`. */
|
|
21
36
|
personal?: boolean;
|
|
37
|
+
/** Never set from a request body: a route or tool that copied it would let a client pin a row or pick its layer and source. */
|
|
38
|
+
local?: RememberLocal;
|
|
22
39
|
}
|
|
23
40
|
export interface RememberResult {
|
|
24
41
|
id: string;
|
package/dist/api/remember.js
CHANGED
|
@@ -31,7 +31,15 @@ function prepareRemember(ctx, opts) {
|
|
|
31
31
|
const requestedScope = rememberScope(ctx, opts);
|
|
32
32
|
const vetted = vetSecrets(opts.content, opts.tags ?? [], opts.untrusted === true);
|
|
33
33
|
const detection = opts.untrusted ? detectInstruction(vetted.content) : { flagged: false, reason: null };
|
|
34
|
-
const
|
|
34
|
+
const local = opts.local ?? {};
|
|
35
|
+
const created = createMemory(vetted.content, {
|
|
36
|
+
layer: local.layer,
|
|
37
|
+
pinned: local.pinned,
|
|
38
|
+
confidence: local.confidence,
|
|
39
|
+
source: local.source,
|
|
40
|
+
schema_fit: local.schemaFit,
|
|
41
|
+
trace_outcome: local.traceOutcome,
|
|
42
|
+
source_session_id: local.sourceSessionId,
|
|
35
43
|
kind: opts.kind ?? 'distilled',
|
|
36
44
|
scope: detection.flagged ? quarantineScopeFor(requestedScope) : requestedScope,
|
|
37
45
|
owner: opts.owner ?? null,
|
|
@@ -40,11 +48,15 @@ function prepareRemember(ctx, opts) {
|
|
|
40
48
|
tenantId: ctx.tenantId,
|
|
41
49
|
baseHalfLifeDays: loadConfig(ctx.hippoRoot).defaultHalfLifeDays,
|
|
42
50
|
});
|
|
51
|
+
const entry = local.weaken ? weakened(created, local.weaken) : created;
|
|
43
52
|
// Aliases only widen what a reader matches; a row has one origin. A personal row's '' follows its owner into every project.
|
|
44
53
|
const origin = opts.personal ? '' : opts.project?.name;
|
|
45
54
|
const stamped = origin !== undefined ? { ...entry, origin_project: origin } : entry;
|
|
46
55
|
return { entry: stamped, requestedScope, detection, warnings: vetted.warnings };
|
|
47
56
|
}
|
|
57
|
+
function weakened(entry, weaken) {
|
|
58
|
+
return { ...entry, strength: weaken.strength, half_life_days: Math.max(1, entry.half_life_days * weaken.halfLifeFactor) };
|
|
59
|
+
}
|
|
48
60
|
function rememberResult(ctx, prepared, written) {
|
|
49
61
|
const { entry, detection, warnings } = prepared;
|
|
50
62
|
const result = { id: entry.id, kind: entry.kind, tenantId: ctx.tenantId };
|
package/dist/api/sleep-run.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { loadAllEntries } from '../store/entry-reads.js';
|
|
2
|
-
import { deleteEntry } from '../store/delete-and-batch.js';
|
|
3
2
|
import { auditMemories } from '../store/audit.js';
|
|
4
|
-
import { autoShare } from '../sharing/
|
|
3
|
+
import { autoShare } from '../sharing/share.js';
|
|
5
4
|
import { consolidate } from '../consolidate/sleep.js';
|
|
6
5
|
import { loadConfig } from '../core/config.js';
|
|
7
6
|
import { deduplicateStore } from '../consolidate/dedupe.js';
|
|
@@ -17,7 +16,6 @@ export interface SleepPhases {
|
|
|
17
16
|
auditMemories: typeof auditMemories;
|
|
18
17
|
autoShare: typeof autoShare;
|
|
19
18
|
loadAllEntries: typeof loadAllEntries;
|
|
20
|
-
deleteEntry: typeof deleteEntry;
|
|
21
19
|
computeAmbientState: typeof computeAmbientState;
|
|
22
20
|
loadConfig: typeof loadConfig;
|
|
23
21
|
loadPendingExtractionTenants: typeof loadPendingExtractionTenants;
|
package/dist/api/sleep-run.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// The sleep pipeline behind `sleep`, with its phase dependencies injectable; kept out of the package root.
|
|
2
2
|
import { loadAllEntries } from '../store/entry-reads.js';
|
|
3
|
-
import {
|
|
3
|
+
import { memoriesBackingObjects } from '../store/delete-and-batch.js';
|
|
4
4
|
import { reportAuditWriteFailure, auditMemories } from '../store/audit.js';
|
|
5
5
|
import { sqliteSyncStore } from '../store/sqlite/store.js';
|
|
6
|
-
import { autoShare } from '../sharing/
|
|
6
|
+
import { autoShare } from '../sharing/share.js';
|
|
7
7
|
import { consolidate } from '../consolidate/sleep.js';
|
|
8
8
|
import { failedUnitOf } from '../store/delete-and-batch.js';
|
|
9
9
|
import { loadConfig } from '../core/config.js';
|
|
@@ -11,6 +11,7 @@ import { deduplicateStore } from '../consolidate/dedupe.js';
|
|
|
11
11
|
import { computeAmbientState } from '../core/ambient.js';
|
|
12
12
|
import { loadPendingExtractionTenants, markPendingProcessedUpTo } from '../store/graph-queue.js';
|
|
13
13
|
import { extractGraphChunked } from '../graph/extract.js';
|
|
14
|
+
import { removeAuditErrors } from './audit.js';
|
|
14
15
|
import { errorMessage } from '../util/log.js';
|
|
15
16
|
const DEFAULT_SLEEP_PHASES = {
|
|
16
17
|
consolidate,
|
|
@@ -18,7 +19,6 @@ const DEFAULT_SLEEP_PHASES = {
|
|
|
18
19
|
auditMemories,
|
|
19
20
|
autoShare,
|
|
20
21
|
loadAllEntries,
|
|
21
|
-
deleteEntry,
|
|
22
22
|
computeAmbientState,
|
|
23
23
|
loadConfig,
|
|
24
24
|
loadPendingExtractionTenants,
|
|
@@ -28,18 +28,15 @@ const DEFAULT_SLEEP_PHASES = {
|
|
|
28
28
|
export async function runSleep(ctx, opts, overrides = {}) {
|
|
29
29
|
const dryRun = Boolean(opts.dryRun);
|
|
30
30
|
const phases = { ...DEFAULT_SLEEP_PHASES, ...overrides };
|
|
31
|
-
// Phase counters for the consolidate audit emit (in finally).
|
|
32
|
-
// Accumulated as each phase completes so partial-failure paths still report
|
|
33
|
-
// accurate "what got done before the failure" data.
|
|
31
|
+
// Phase counters for the consolidate audit emit (in finally), accumulated per phase so a partial failure still reports what got done.
|
|
34
32
|
const counts = { consolidation: 0, dedup: 0, auditDeleted: 0, ambient: 0 };
|
|
35
33
|
let phaseError = null;
|
|
36
34
|
try {
|
|
37
35
|
return await runSleepPhases(ctx, opts, phases, counts);
|
|
38
36
|
}
|
|
39
37
|
catch (err) {
|
|
40
|
-
// SAFETY: phaseError is read via phaseError.message / (phaseError !==
|
|
41
|
-
//
|
|
42
|
-
// the existing lenient (err as Error) pattern used throughout this catch chain.
|
|
38
|
+
// SAFETY: phaseError is only read via phaseError.message / (phaseError !== null) below, safe even if a non-Error was thrown;
|
|
39
|
+
// this mirrors the lenient (err as Error) pattern used through this catch chain.
|
|
43
40
|
phaseError = err;
|
|
44
41
|
throw err;
|
|
45
42
|
}
|
|
@@ -60,14 +57,15 @@ async function runSleepPhases(ctx, opts, phases, counts) {
|
|
|
60
57
|
if (dedupResult.removed > 0)
|
|
61
58
|
result.deduped = dedupSummary(dedupResult);
|
|
62
59
|
// Phase 3: Quality audit (remove junk, report warnings; a dry run skips rows earlier phases would remove).
|
|
63
|
-
|
|
60
|
+
const audited = runQualityAudit(ctx, phases, { dryRun, consolidateResult, dedupResult, result });
|
|
61
|
+
counts.auditDeleted = audited.removed;
|
|
64
62
|
if (dryRun)
|
|
65
63
|
return result;
|
|
66
64
|
// Phase 4: Auto-share high-transfer-score memories to global.
|
|
67
65
|
if (!opts.noShare)
|
|
68
66
|
shareOnSleep(ctx, phases, result);
|
|
69
67
|
// Phase 5: Post-sleep ambient state summary.
|
|
70
|
-
counts.ambient = summarizeAmbient(ctx, phases, result);
|
|
68
|
+
counts.ambient = summarizeAmbient(ctx, phases, result, audited.remaining);
|
|
71
69
|
await drainGraphQueue(ctx, phases, snapshot, result);
|
|
72
70
|
return result;
|
|
73
71
|
}
|
|
@@ -115,28 +113,26 @@ function dedupSummary(dedupResult) {
|
|
|
115
113
|
crossDups,
|
|
116
114
|
};
|
|
117
115
|
}
|
|
116
|
+
/** `removed` counts audit errors deleted (or that would be under dryRun); `remaining` is what the audit read, less the rows it deleted. */
|
|
118
117
|
function runQualityAudit(ctx, phases, options) {
|
|
119
118
|
const { dryRun, consolidateResult, dedupResult, result } = options;
|
|
120
119
|
const planned = new Set(dryRun ? [...(consolidateResult.removedIds ?? []), ...dedupResult.pairs.map((p) => p.removed)] : []);
|
|
121
120
|
const allEntries = phases.loadAllEntries(ctx.hippoRoot).filter((e) => !planned.has(e.id));
|
|
122
121
|
const auditOut = phases.auditMemories(allEntries, memoriesBackingObjects(ctx.hippoRoot));
|
|
123
122
|
if (auditOut.issues.length === 0)
|
|
124
|
-
return 0;
|
|
123
|
+
return { removed: 0, remaining: allEntries };
|
|
125
124
|
const errors = auditOut.issues.filter((i) => i.severity === 'error');
|
|
126
125
|
const warnings = auditOut.issues.filter((i) => i.severity === 'warning');
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (dryRun || phases.deleteEntry(ctx.hippoRoot, issue.memoryId, { actor: ctx.actor.subject, reason, automatic: true }))
|
|
131
|
-
removed++;
|
|
132
|
-
}
|
|
126
|
+
const gone = dryRun ? errors.map((issue) => issue.memoryId) : removeAuditErrors(ctx, 'sleep-audit', errors);
|
|
127
|
+
const removed = gone.length;
|
|
128
|
+
const deleted = new Set(gone);
|
|
133
129
|
if (removed > 0 || warnings.length > 0) {
|
|
134
130
|
result.audit = {
|
|
135
131
|
errorsRemoved: removed,
|
|
136
132
|
warningCount: warnings.length,
|
|
137
133
|
};
|
|
138
134
|
}
|
|
139
|
-
return removed;
|
|
135
|
+
return { removed, remaining: allEntries.filter((e) => !deleted.has(e.id)) };
|
|
140
136
|
}
|
|
141
137
|
function shareOnSleep(ctx, phases, result) {
|
|
142
138
|
const sleepConfig = phases.loadConfig(ctx.hippoRoot);
|
|
@@ -156,11 +152,11 @@ function shareOnSleep(ctx, phases, result) {
|
|
|
156
152
|
}
|
|
157
153
|
}
|
|
158
154
|
/** Returns the ambient total the audit row reports: 0 when ambient is off or no current row is left. */
|
|
159
|
-
function summarizeAmbient(ctx, phases, result) {
|
|
155
|
+
function summarizeAmbient(ctx, phases, result, loaded) {
|
|
160
156
|
const postSleepConfig = phases.loadConfig(ctx.hippoRoot);
|
|
161
157
|
if (!postSleepConfig.ambient.enabled)
|
|
162
158
|
return 0;
|
|
163
|
-
const postSleepEntries =
|
|
159
|
+
const postSleepEntries = loaded.filter((e) => !e.superseded_by);
|
|
164
160
|
if (postSleepEntries.length === 0)
|
|
165
161
|
return 0;
|
|
166
162
|
result.ambient = phases.computeAmbientState(postSleepEntries);
|
package/dist/api/sleep.d.ts
CHANGED
|
@@ -4,23 +4,17 @@ import type { Context } from './types.js';
|
|
|
4
4
|
export interface SleepOpts {
|
|
5
5
|
/** Report what a sleep would change without applying it; sharing, the ambient summary and the graph refresh are skipped. */
|
|
6
6
|
dryRun?: boolean;
|
|
7
|
-
/** Skip copying high-scoring memories to the global store under `HIPPO_HOME`. Default
|
|
7
|
+
/** Skip copying high-scoring memories to the global store under `HIPPO_HOME`. Default
|
|
8
|
+
* false, so every tenant's memories are eligible; multi-tenant callers pass `true`. */
|
|
8
9
|
noShare?: boolean;
|
|
9
10
|
}
|
|
10
11
|
export interface SleepResult {
|
|
11
12
|
active: number;
|
|
12
13
|
removed: number;
|
|
13
|
-
/**
|
|
14
|
-
*
|
|
15
|
-
* deleting (config `dormant.enabled`). Absent when 0. Per-invocation
|
|
16
|
-
* activity counter, same class as `removed`.
|
|
17
|
-
*/
|
|
14
|
+
/** Faded memories the decay pass moved to the dormant store instead of deleting (config `dormant.enabled`); absent when 0. Per-invocation counter, like
|
|
15
|
+
* `removed`. */
|
|
18
16
|
dormant?: number;
|
|
19
|
-
/**
|
|
20
|
-
* Dormant memories deleted for good this sleep because they outlived
|
|
21
|
-
* `dormant.retentionDays`. Absent when 0. Same per-invocation class as
|
|
22
|
-
* `removed`.
|
|
23
|
-
*/
|
|
17
|
+
/** Dormant memories deleted for good this sleep for outliving `dormant.retentionDays`; absent when 0. Per-invocation counter, like `removed`. */
|
|
24
18
|
dormantExpired?: number;
|
|
25
19
|
mergedEpisodic: number;
|
|
26
20
|
newSemantic: number;
|
|
@@ -36,26 +30,13 @@ export interface SleepResult {
|
|
|
36
30
|
warningCount: number;
|
|
37
31
|
};
|
|
38
32
|
shared?: number;
|
|
39
|
-
/**
|
|
40
|
-
* Count of memories the auto-share secret veto withheld this sleep
|
|
41
|
-
* — rows that passed every other admission gate (transfer score,
|
|
42
|
-
* not-already-global) and were blocked solely by `detectSecret`. Absent
|
|
43
|
-
* when 0 or when auto-share did not run.
|
|
44
|
-
*/
|
|
33
|
+
/** Memories the auto-share secret veto withheld: rows that passed every other gate but `detectSecret`; absent when 0 or auto-share did not run. */
|
|
45
34
|
secretSkipped?: number;
|
|
46
|
-
/**
|
|
47
|
-
* Count of auto-share candidates the GLOBAL store's rejection
|
|
48
|
-
* tombstone refused this sleep; copy paths must not let one rejected
|
|
49
|
-
* candidate abort the batch. Absent when 0 or when auto-share did not run.
|
|
50
|
-
*/
|
|
35
|
+
/** Auto-share candidates the GLOBAL store's rejection tombstone refused (one must not abort the batch); absent when 0 or auto-share did not run. */
|
|
51
36
|
rejectedSkipped?: number;
|
|
52
37
|
ambient?: AmbientState | null;
|
|
53
|
-
/**
|
|
54
|
-
*
|
|
55
|
-
* this sleep. Absent when no tenant was dirty, and under dryRun (the graph
|
|
56
|
-
* phase runs only on a real sleep). Cross-tenant aggregate, one reason
|
|
57
|
-
* /v1/sleep stays loopback-only.
|
|
58
|
-
*/
|
|
38
|
+
/** Graph re-extraction totals across tenants rebuilt this sleep; absent when none was dirty or under dryRun.
|
|
39
|
+
* Cross-tenant aggregate: one reason /v1/sleep stays loopback-only. */
|
|
59
40
|
graph?: {
|
|
60
41
|
tenants: number;
|
|
61
42
|
entities: number;
|