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/store/auth.d.ts
CHANGED
|
@@ -75,7 +75,8 @@ export interface ApiKeyRecord {
|
|
|
75
75
|
/** The api_keys row for `keyId` with its scope grants; null when no row matches. */
|
|
76
76
|
export declare function readApiKeyRecord(db: DatabaseSyncLike, keyId: string): ApiKeyRecord | null;
|
|
77
77
|
export declare function validateApiKey(db: DatabaseSyncLike, plaintext: string): ValidateResult;
|
|
78
|
-
/** LRU of the tokens that matched a stored key hash, so a repeat skips scrypt. Holds
|
|
78
|
+
/** LRU of the tokens that matched a stored key hash, so a repeat skips scrypt. Holds
|
|
79
|
+
* a SHA-256 of the token, never the token, and nothing about the key's state. */
|
|
79
80
|
export declare class VerifiedKeyCache {
|
|
80
81
|
private readonly capacity;
|
|
81
82
|
private readonly proven;
|
|
@@ -86,7 +87,8 @@ export declare class VerifiedKeyCache {
|
|
|
86
87
|
}
|
|
87
88
|
/** A caller's limit on scrypt work, called once per derivation: it may throw to refuse `derive` or hold it in a queue. */
|
|
88
89
|
type DerivationBound = (keyId: string, derive: () => Promise<Buffer>) => Promise<Buffer>;
|
|
89
|
-
/** Verify a bearer API key against `store`, null when invalid. The key's row is read on every
|
|
90
|
+
/** Verify a bearer API key against `store`, null when invalid. The key's row is read on every
|
|
91
|
+
* call, so a revoke, expiry, role or scope change by any process applies on the next one. */
|
|
90
92
|
export declare function verifyApiKeyCached(plaintext: string, store: HippoStore, bound?: DerivationBound): Promise<VerifiedApiKey | null>;
|
|
91
93
|
export declare function revokeApiKey(db: DatabaseSyncLike, keyId: string, at?: string): void;
|
|
92
94
|
/** Grant `keyId` read access to one restricted `scope`. Idempotent. */
|
|
@@ -99,10 +101,8 @@ export interface ApiKeyListItem {
|
|
|
99
101
|
label: string | null;
|
|
100
102
|
createdAt: string;
|
|
101
103
|
revokedAt: string | null;
|
|
102
|
-
/**
|
|
103
|
-
*
|
|
104
|
-
* Fail-safe-to-member cast: any non-'admin' value reads as 'member'.
|
|
105
|
-
*/
|
|
104
|
+
/** Authorization role from the `role` column (schema migration v26).
|
|
105
|
+
* Fail-safe cast: any non-'admin' value reads as 'member'. */
|
|
106
106
|
role: 'admin' | 'member';
|
|
107
107
|
/** Restricted scopes this key may read. */
|
|
108
108
|
scopes: string[];
|
package/dist/store/auth.js
CHANGED
|
@@ -54,9 +54,8 @@ export function mintApiKey() {
|
|
|
54
54
|
return { keyId, plaintext, keyHash: hashKey(plaintext) };
|
|
55
55
|
}
|
|
56
56
|
export function insertApiKey(db, key) {
|
|
57
|
-
//
|
|
58
|
-
// so
|
|
59
|
-
// An older binary ignores expires_at and would honour an expired key, so the store shuts it out before the first one exists.
|
|
57
|
+
// Migration v26 (role column) has already run; an older binary ignores expires_at and would honour an expired key,
|
|
58
|
+
// so the store shuts it out before the first one exists.
|
|
60
59
|
if (key.expiresAt !== null)
|
|
61
60
|
raiseMinBinary(db, EXPIRING_KEYS_MIN_BINARY);
|
|
62
61
|
db.prepare(`INSERT INTO api_keys (key_id, key_hash, tenant_id, label, created_at, role, owner_subject, expires_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(key.keyId, key.keyHash, key.tenantId, key.label, key.createdAt, key.role, key.ownerSubject, key.expiresAt);
|
|
@@ -71,9 +70,8 @@ export function createApiKey(db, opts) {
|
|
|
71
70
|
}
|
|
72
71
|
/** The api_keys row for `keyId` with its scope grants; null when no row matches. */
|
|
73
72
|
export function readApiKeyRecord(db, keyId) {
|
|
74
|
-
// SAFETY: row comes from the SELECT above, which projects exactly
|
|
75
|
-
//
|
|
76
|
-
// row matches key_id.
|
|
73
|
+
// SAFETY: row comes from the SELECT above, which projects exactly key_hash, tenant_id, revoked_at, role, expires_at, owner_subject;
|
|
74
|
+
// `.get` returns undefined when no row matches key_id.
|
|
77
75
|
const row = db
|
|
78
76
|
.prepare(`SELECT key_hash, tenant_id, revoked_at, role, expires_at, owner_subject FROM api_keys WHERE key_id = ?`)
|
|
79
77
|
.get(keyId);
|
|
@@ -84,7 +82,8 @@ export function readApiKeyRecord(db, keyId) {
|
|
|
84
82
|
expiresAt: row.expires_at, ownerSubject: row.owner_subject,
|
|
85
83
|
};
|
|
86
84
|
}
|
|
87
|
-
/** When a key stops working, in epoch ms: Infinity for null, and already past for a missing
|
|
85
|
+
/** When a key stops working, in epoch ms: Infinity for null, and already past for a missing
|
|
86
|
+
* field (a store that predates expiry) or a stamp that does not parse, so both fail closed. */
|
|
88
87
|
function keyExpiryMs(expiresAt) {
|
|
89
88
|
if (expiresAt === null)
|
|
90
89
|
return Infinity;
|
|
@@ -130,7 +129,8 @@ const VERIFIED_KEY_CACHE_CAP = 1_000;
|
|
|
130
129
|
function secretDigest(plaintext) {
|
|
131
130
|
return createHash('sha256').update(plaintext).digest();
|
|
132
131
|
}
|
|
133
|
-
/** LRU of the tokens that matched a stored key hash, so a repeat skips scrypt. Holds
|
|
132
|
+
/** LRU of the tokens that matched a stored key hash, so a repeat skips scrypt. Holds
|
|
133
|
+
* a SHA-256 of the token, never the token, and nothing about the key's state. */
|
|
134
134
|
export class VerifiedKeyCache {
|
|
135
135
|
capacity;
|
|
136
136
|
// Keyed on the stored hash, so a rotated or re-minted key never meets an old entry; Map order makes the first key the least recent.
|
|
@@ -192,7 +192,8 @@ async function secretMatches(keyId, plaintext, keyHash, bound) {
|
|
|
192
192
|
void check.then(forget, forget);
|
|
193
193
|
return check;
|
|
194
194
|
}
|
|
195
|
-
/** Verify a bearer API key against `store`, null when invalid. The key's row is read on every
|
|
195
|
+
/** Verify a bearer API key against `store`, null when invalid. The key's row is read on every
|
|
196
|
+
* call, so a revoke, expiry, role or scope change by any process applies on the next one. */
|
|
196
197
|
export async function verifyApiKeyCached(plaintext, store, bound) {
|
|
197
198
|
const keyId = mintedKeyId(plaintext);
|
|
198
199
|
if (keyId === null)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type MemoryEntry } from '../core/memory.js';
|
|
1
|
+
import { type MemoryEntry, type ConfidenceLevel, Layer } from '../core/memory.js';
|
|
2
2
|
import { type SqlFragment } from './recall-scope.js';
|
|
3
3
|
export interface AmbientRecallRequest {
|
|
4
4
|
terms: string[];
|
|
@@ -32,8 +32,8 @@ export declare function loadContextCandidates(hippoRoot: string, tenantId: strin
|
|
|
32
32
|
export type HeldText = Pick<MemoryEntry, 'content' | 'source' | 'origin_project'>;
|
|
33
33
|
/** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
|
|
34
34
|
export declare const EVERY_SCOPE: SqlFragment;
|
|
35
|
-
/**
|
|
36
|
-
*
|
|
35
|
+
/** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from spacing holds its every word.
|
|
36
|
+
* With `project`, only rows carrying one of those names plus user-global rows, as loadContextCandidates' filter. No `tenantId` reads every tenant. */
|
|
37
37
|
export declare function loadTextsHoldingWords(hippoRoot: string, tenantId: string | undefined, words: readonly string[], project?: readonly string[], admit?: SqlFragment): HeldText[];
|
|
38
38
|
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before it. */
|
|
39
39
|
export declare function loadNewestEntries(hippoRoot: string, tenantId: string, limit: number): MemoryEntry[];
|
|
@@ -61,4 +61,21 @@ export interface StrengthTallies {
|
|
|
61
61
|
}
|
|
62
62
|
/** calculateStrength over every row of a tenant in one aggregate pass, no row loaded. */
|
|
63
63
|
export declare function loadStrengthTallies(hippoRoot: string, tenantId: string, now: Date, atRiskBelow: number): StrengthTallies;
|
|
64
|
+
/** What `hippo status` prints about the whole store: every tenant and superseded rows too. */
|
|
65
|
+
export interface StatusCounts {
|
|
66
|
+
total: number;
|
|
67
|
+
byLayer: Record<Layer, number>;
|
|
68
|
+
byConfidence: Record<ConfidenceLevel, number>;
|
|
69
|
+
pinned: number;
|
|
70
|
+
/** Rows whose strength is under the caller's line; unlike StrengthTallies, pinned rows count. */
|
|
71
|
+
atRisk: number;
|
|
72
|
+
agedOut: number;
|
|
73
|
+
avgStrength: number;
|
|
74
|
+
/** Open conflicts of every tenant, the rows listMemoryConflicts returns when given no tenant. */
|
|
75
|
+
openConflicts: number;
|
|
76
|
+
/** Rows that have a stored vector. */
|
|
77
|
+
embedded: number;
|
|
78
|
+
}
|
|
79
|
+
/** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is built. */
|
|
80
|
+
export declare function loadStatusCounts(hippoRoot: string, now: Date, atRiskBelow: number): StatusCounts;
|
|
64
81
|
//# sourceMappingURL=candidates.d.ts.map
|
package/dist/store/candidates.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { FALLBACK_HALF_LIFE_DAYS, Layer, calculateStrength, facetsOf, schemaFitFrom } from '../core/memory.js';
|
|
2
|
+
import { strengthSql } from './rule-sql.js';
|
|
3
|
+
import { withReadSnapshot } from '../db/index.js';
|
|
3
4
|
import { scopeAdmitSql } from './recall-scope.js';
|
|
4
5
|
import { MEMORY_SELECT_COLUMNS, rowToEntry, parseJsonArray } from './rows.js';
|
|
5
|
-
import { openStore } from './open.js';
|
|
6
|
+
import { onHandle, openStore } from './open.js';
|
|
6
7
|
import { originInSql } from '../core/project-identity.js';
|
|
7
8
|
import { pickRarestFtsQuery, loadRecallSearchEntriesFromDb } from './search-rows.js';
|
|
8
9
|
const AMBIENT_SCOPED = 'superseded_by IS NULL AND tenant_id = ?';
|
|
9
|
-
/** idx_memories_pinned (
|
|
10
|
+
/** idx_memories_pinned (migration v51) serves it. */
|
|
10
11
|
const AMBIENT_PINNED_WHERE = `pinned = 1 AND ${AMBIENT_SCOPED} ORDER BY created ASC, id ASC`;
|
|
11
|
-
/** idx_memories_created_drift (
|
|
12
|
+
/** idx_memories_created_drift (migration v51) serves it. */
|
|
12
13
|
const AMBIENT_DRIFT_SQL = `SELECT 1 FROM memories WHERE ${AMBIENT_SCOPED} AND (length(created) <> 24 OR created NOT LIKE '%Z') LIMIT 1`;
|
|
13
14
|
function inOrigins(e, origins) {
|
|
14
15
|
const origin = e.origin_project ?? null;
|
|
@@ -47,8 +48,7 @@ export function loadAmbientCandidates(hippoRoot, tenantId, recentNeeded, admit,
|
|
|
47
48
|
// A SQL LIMIT takes an integer; the Array.slice this replaced truncated one,
|
|
48
49
|
// and include_recent is any non-negative finite number at the HTTP edge.
|
|
49
50
|
const needed = Math.trunc(recentNeeded);
|
|
50
|
-
|
|
51
|
-
try {
|
|
51
|
+
return onHandle(hippoRoot, (db) => {
|
|
52
52
|
// SAFETY: every `where` below starts from MEMORY_SELECT_COLUMNS' table.
|
|
53
53
|
const run = (where, params) => db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE ${where}`).all(...params).map(rowToEntry);
|
|
54
54
|
const byId = new Map();
|
|
@@ -74,10 +74,7 @@ export function loadAmbientCandidates(hippoRoot, tenantId, recentNeeded, admit,
|
|
|
74
74
|
? loadRecallSearchEntriesFromDb(db, ftsQuery, { limit: recall.limit, tenantId, includeSuperseded: false, ownScope: recall.ownScope })
|
|
75
75
|
: [];
|
|
76
76
|
return { entries, recall: recallEntries };
|
|
77
|
-
}
|
|
78
|
-
finally {
|
|
79
|
-
closeHippoDb(db);
|
|
80
|
-
}
|
|
77
|
+
}, openStore);
|
|
81
78
|
}
|
|
82
79
|
// calculateStrength's decay exponent with its reward factor, pins first: the strongest rows, without scoring each one in JS.
|
|
83
80
|
const DECAY_RANK_SQL = `pinned DESC,
|
|
@@ -102,32 +99,27 @@ export function loadContextCandidates(hippoRoot, tenantId, filter) {
|
|
|
102
99
|
where.push(`(origin_project = '' OR ${originInSql(filter.project)})`);
|
|
103
100
|
params.push(...filter.project);
|
|
104
101
|
}
|
|
105
|
-
|
|
106
|
-
try {
|
|
102
|
+
return onHandle(hippoRoot, (db) => {
|
|
107
103
|
// SAFETY: the outer SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set; the rank sort carries ids only.
|
|
108
104
|
const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (
|
|
109
105
|
SELECT id FROM memories WHERE ${where.join(' AND ')} ORDER BY ${DECAY_RANK_SQL} LIMIT ?
|
|
110
106
|
) ORDER BY created ASC, id ASC`).all(...params, filter.now.toISOString(), Math.max(0, Math.trunc(filter.cap)));
|
|
111
107
|
return rows.map(rowToEntry);
|
|
112
|
-
}
|
|
113
|
-
finally {
|
|
114
|
-
closeHippoDb(db);
|
|
115
|
-
}
|
|
108
|
+
}, openStore);
|
|
116
109
|
}
|
|
117
110
|
// No owner: for session capture, a personal or connector-private row must never stop a team copy being written.
|
|
118
111
|
const TEAM_VISIBLE = scopeAdmitSql('');
|
|
119
112
|
/** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
|
|
120
113
|
export const EVERY_SCOPE = Object.freeze({ sql: '1', params: [] });
|
|
121
|
-
/**
|
|
122
|
-
*
|
|
114
|
+
/** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from spacing holds its every word.
|
|
115
|
+
* With `project`, only rows carrying one of those names plus user-global rows, as loadContextCandidates' filter. No `tenantId` reads every tenant. */
|
|
123
116
|
export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit = TEAM_VISIBLE) {
|
|
124
117
|
const unique = [...new Set(words)];
|
|
125
118
|
const out = [];
|
|
126
119
|
const tenantWhere = tenantId === undefined ? '1' : 'tenant_id = ?';
|
|
127
120
|
const tenantParams = tenantId === undefined ? [] : [tenantId];
|
|
128
121
|
const originWhere = project === undefined ? '' : ` AND (origin_project = '' OR ${originInSql(project)})`;
|
|
129
|
-
|
|
130
|
-
try {
|
|
122
|
+
return onHandle(hippoRoot, (db) => {
|
|
131
123
|
// Chunked so one statement stays far under SQLite's bound-parameter limit.
|
|
132
124
|
for (let i = 0; i < unique.length; i += 200) {
|
|
133
125
|
const chunk = unique.slice(i, i + 200);
|
|
@@ -137,22 +129,15 @@ export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit
|
|
|
137
129
|
out.push({ content: row.content, source: row.source ?? 'cli', origin_project: row.origin_project });
|
|
138
130
|
}
|
|
139
131
|
return out;
|
|
140
|
-
}
|
|
141
|
-
finally {
|
|
142
|
-
closeHippoDb(db);
|
|
143
|
-
}
|
|
132
|
+
}, openStore);
|
|
144
133
|
}
|
|
145
134
|
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before it. */
|
|
146
135
|
export function loadNewestEntries(hippoRoot, tenantId, limit) {
|
|
147
|
-
|
|
148
|
-
try {
|
|
136
|
+
return onHandle(hippoRoot, (db) => {
|
|
149
137
|
// SAFETY: the SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
150
138
|
const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE tenant_id = ? ORDER BY created DESC, id DESC LIMIT ?`).all(tenantId, limit);
|
|
151
139
|
return rows.reverse().map(rowToEntry);
|
|
152
|
-
}
|
|
153
|
-
finally {
|
|
154
|
-
closeHippoDb(db);
|
|
155
|
-
}
|
|
140
|
+
}, openStore);
|
|
156
141
|
}
|
|
157
142
|
function* contentsOf(rows) {
|
|
158
143
|
for (const row of rows)
|
|
@@ -160,8 +145,7 @@ function* contentsOf(rows) {
|
|
|
160
145
|
}
|
|
161
146
|
/** computeSchemaFit against every row of a tenant: tag counts come from one aggregate and texts stream one column, so no row is loaded. */
|
|
162
147
|
export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
|
|
163
|
-
|
|
164
|
-
try {
|
|
148
|
+
return onHandle(hippoRoot, (db) => {
|
|
165
149
|
// One read transaction, so the row count and the texts come from the same snapshot.
|
|
166
150
|
return withReadSnapshot(db, () => {
|
|
167
151
|
// SAFETY: rows' shape matches the two columns named in the SELECT.
|
|
@@ -178,23 +162,16 @@ export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
|
|
|
178
162
|
const texts = db.prepare('SELECT content FROM memories WHERE tenant_id = ?').iterate(tenantId);
|
|
179
163
|
return schemaFitFrom(content, tags, { rows, tagCounts, contents: contentsOf(texts) });
|
|
180
164
|
});
|
|
181
|
-
}
|
|
182
|
-
finally {
|
|
183
|
-
closeHippoDb(db);
|
|
184
|
-
}
|
|
165
|
+
}, openStore);
|
|
185
166
|
}
|
|
186
167
|
/** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is absent. */
|
|
187
168
|
export function tallySources(hippoRoot, tenantId) {
|
|
188
|
-
|
|
189
|
-
try {
|
|
169
|
+
return onHandle(hippoRoot, (db) => {
|
|
190
170
|
const where = tenantId !== undefined ? 'WHERE tenant_id = ?' : '';
|
|
191
171
|
// SAFETY: rows' shape matches the four aliased columns in the SELECT below.
|
|
192
172
|
return db.prepare(`SELECT COALESCE(source, 'cli') AS source, COUNT(*) AS count, MAX(created) AS latest, MIN(created || char(31) || id) AS first
|
|
193
173
|
FROM memories ${where} GROUP BY COALESCE(source, 'cli')`).all(...(tenantId !== undefined ? [tenantId] : []));
|
|
194
|
-
}
|
|
195
|
-
finally {
|
|
196
|
-
closeHippoDb(db);
|
|
197
|
-
}
|
|
174
|
+
}, openStore);
|
|
198
175
|
}
|
|
199
176
|
// A malformed or non-array JSON list reads as empty, as parseJsonArray does, instead of failing json_each.
|
|
200
177
|
export const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_type(${column}) = 'array' THEN ${column} ELSE '[]' END)`;
|
|
@@ -202,8 +179,7 @@ export const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_t
|
|
|
202
179
|
export function loadStrengthTallies(hippoRoot, tenantId, now, atRiskBelow) {
|
|
203
180
|
// An unparseable date scores NULL in SQL and 0 in calculateStrength.
|
|
204
181
|
const strength = `COALESCE(${strengthSql(now)}, 0)`;
|
|
205
|
-
|
|
206
|
-
try {
|
|
182
|
+
return onHandle(hippoRoot, (db) => {
|
|
207
183
|
// SAFETY: one aggregate row whose columns are the aliases named below.
|
|
208
184
|
const row = db.prepare(`SELECT
|
|
209
185
|
COUNT(*) AS total,
|
|
@@ -219,9 +195,62 @@ export function loadStrengthTallies(hippoRoot, tenantId, now, atRiskBelow) {
|
|
|
219
195
|
strengthSum: Number(row.strengthSum),
|
|
220
196
|
atRisk: Number(row.atRisk),
|
|
221
197
|
};
|
|
198
|
+
}, openStore);
|
|
199
|
+
}
|
|
200
|
+
// What calculateStrength and facetsOf read, plus the layer: no text and no JSON column.
|
|
201
|
+
const STATUS_ROW_COLUMNS = [
|
|
202
|
+
'layer', 'confidence', 'pinned', 'created', 'last_retrieved', 'half_life_days', 'retrieval_count',
|
|
203
|
+
'emotional_valence', 'outcome_positive', 'outcome_negative',
|
|
204
|
+
];
|
|
205
|
+
// Scored in JavaScript, not with strengthSql: SQLite reads fewer date shapes than Date does, so its counts would differ.
|
|
206
|
+
function tallyStatusRows(rows, now, atRiskBelow) {
|
|
207
|
+
const byLayer = { [Layer.Buffer]: 0, [Layer.Episodic]: 0, [Layer.Semantic]: 0, [Layer.Trace]: 0 };
|
|
208
|
+
const byConfidence = { verified: 0, observed: 0, inferred: 0, stale: 0 };
|
|
209
|
+
const sums = { total: 0, strength: 0, pinned: 0, atRisk: 0, agedOut: 0 };
|
|
210
|
+
for (const row of rows) {
|
|
211
|
+
// rowToEntry's defaults for these columns, so a row scores as its loaded entry would.
|
|
212
|
+
const entry = {
|
|
213
|
+
pinned: Boolean(row.pinned),
|
|
214
|
+
confidence: row.confidence ?? 'observed',
|
|
215
|
+
created: row.created,
|
|
216
|
+
last_retrieved: row.last_retrieved,
|
|
217
|
+
half_life_days: Number(row.half_life_days ?? FALLBACK_HALF_LIFE_DAYS),
|
|
218
|
+
retrieval_count: Number(row.retrieval_count ?? 0),
|
|
219
|
+
emotional_valence: row.emotional_valence ?? 'neutral',
|
|
220
|
+
outcome_positive: Number(row.outcome_positive ?? 0),
|
|
221
|
+
outcome_negative: Number(row.outcome_negative ?? 0),
|
|
222
|
+
};
|
|
223
|
+
const strength = calculateStrength(entry, now);
|
|
224
|
+
const facets = facetsOf(entry, now);
|
|
225
|
+
sums.total++;
|
|
226
|
+
sums.strength += strength;
|
|
227
|
+
byLayer[row.layer] = (byLayer[row.layer] ?? 0) + 1;
|
|
228
|
+
byConfidence[facets.tier] = (byConfidence[facets.tier] ?? 0) + 1;
|
|
229
|
+
if (entry.pinned)
|
|
230
|
+
sums.pinned++;
|
|
231
|
+
if (strength < atRiskBelow)
|
|
232
|
+
sums.atRisk++;
|
|
233
|
+
if (facets.agedOut)
|
|
234
|
+
sums.agedOut++;
|
|
222
235
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
236
|
+
const { total, pinned, atRisk, agedOut } = sums;
|
|
237
|
+
return { total, byLayer, byConfidence, pinned, atRisk, agedOut, avgStrength: total > 0 ? sums.strength / total : 0 };
|
|
238
|
+
}
|
|
239
|
+
/** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is built. */
|
|
240
|
+
export function loadStatusCounts(hippoRoot, now, atRiskBelow) {
|
|
241
|
+
return onHandle(hippoRoot, (db) => {
|
|
242
|
+
// One read transaction, so the row tallies and the two counts describe the same store.
|
|
243
|
+
return withReadSnapshot(db, () => {
|
|
244
|
+
// loadAllEntries' order, so the strengths add up in the order they did and the average rounds the same.
|
|
245
|
+
// SAFETY: the SELECT names exactly StatusRow's columns, and the store writes `layer` only from the Layer enum.
|
|
246
|
+
const rows = db.prepare(`SELECT ${STATUS_ROW_COLUMNS.join(', ')} FROM memories ORDER BY created ASC, id ASC`).iterate();
|
|
247
|
+
const tallies = tallyStatusRows(rows, now, atRiskBelow);
|
|
248
|
+
// SAFETY: one row whose columns are the two aliases named below.
|
|
249
|
+
const counts = db.prepare(`SELECT
|
|
250
|
+
(SELECT COUNT(*) FROM memory_conflicts WHERE status = 'open') AS openConflicts,
|
|
251
|
+
(SELECT COUNT(*) FROM memory_vectors WHERE memory_id IN (SELECT id FROM memories)) AS embedded`).get();
|
|
252
|
+
return { ...tallies, openConflicts: Number(counts.openConflicts), embedded: Number(counts.embedded) };
|
|
253
|
+
});
|
|
254
|
+
}, openStore);
|
|
226
255
|
}
|
|
227
256
|
//# sourceMappingURL=candidates.js.map
|
|
@@ -9,6 +9,7 @@ export interface CardDetail {
|
|
|
9
9
|
comments: CardComment[];
|
|
10
10
|
handoff: SessionHandoff | null;
|
|
11
11
|
}
|
|
12
|
-
/** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card);
|
|
12
|
+
/** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card);
|
|
13
|
+
* five separate reads, so a write landing between them can show a mixed view, as `card show` always could. */
|
|
13
14
|
export declare function loadCardDetail(hippoRoot: string, tenantId: string, id: string): CardDetail | null;
|
|
14
15
|
//# sourceMappingURL=card-detail.d.ts.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { loadCard, loadCardComments, loadCardDeps, loadCardRuns, loadLatestHandoffForCard } from './cards.js';
|
|
2
|
-
/** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card);
|
|
2
|
+
/** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card);
|
|
3
|
+
* five separate reads, so a write landing between them can show a mixed view, as `card show` always could. */
|
|
3
4
|
export function loadCardDetail(hippoRoot, tenantId, id) {
|
|
4
5
|
const card = loadCard(hippoRoot, tenantId, id);
|
|
5
6
|
if (!card)
|
package/dist/store/cards.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
1
|
import { SessionHandoff, HandoffOutcome } from '../core/handoff.js';
|
|
3
2
|
import { Card, CardStatus, CardRun, CardComment } from '../core/card.js';
|
|
4
3
|
export interface TransitionCardOptions {
|
|
@@ -10,8 +9,8 @@ export interface TransitionCardOptions {
|
|
|
10
9
|
params?: unknown[];
|
|
11
10
|
};
|
|
12
11
|
}
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
/** Creates a card; status is ready with no deps or once every dependsOn id is done, else backlog.
|
|
13
|
+
* An unknown dependsOn id throws and commits nothing. A repeated dependsOn id is recorded once. */
|
|
15
14
|
export declare function createCard(hippoRoot: string, tenantId: string, input: {
|
|
16
15
|
title: string;
|
|
17
16
|
repo?: string;
|
|
@@ -36,22 +35,28 @@ export declare function loadCardRuns(hippoRoot: string, tenantId: string, id: st
|
|
|
36
35
|
export declare function loadCardComments(hippoRoot: string, tenantId: string, id: string): CardComment[];
|
|
37
36
|
/** Read side of the card <-> handoff round trip: the newest handoff filed against this card. */
|
|
38
37
|
export declare function loadLatestHandoffForCard(hippoRoot: string, tenantId: string, cardId: string): SessionHandoff | null;
|
|
39
|
-
/** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown card id;
|
|
38
|
+
/** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown card id;
|
|
39
|
+
* returns null for a card not ready/blocked or already claimed. Sets a CARD_LEASE_MS lease and returns the new run's id as runId. */
|
|
40
40
|
export declare function claimCard(hippoRoot: string, tenantId: string, id: string, runtime: string, sessionId?: string): (Card & {
|
|
41
41
|
runId: number;
|
|
42
42
|
}) | null;
|
|
43
|
-
/** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws on an
|
|
43
|
+
/** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws on an
|
|
44
|
+
* unknown card id or a run id that is not a positive integer; returns null unless the card is running and runId is its live run. */
|
|
44
45
|
export declare function heartbeatCard(hippoRoot: string, tenantId: string, id: string, runId: number): Card | null;
|
|
45
|
-
/** Requires the card be running; closes the live run as blocked and files reason as a comment. Throws on an unknown
|
|
46
|
+
/** Requires the card be running; closes the live run as blocked and files reason as a comment. Throws on an unknown
|
|
47
|
+
* card id; returns null for a card not running. When runId is given, returns null unless it is the card's live run. */
|
|
46
48
|
export declare function blockCard(hippoRoot: string, tenantId: string, id: string, reason: string, runId?: number): Card | null;
|
|
47
|
-
/** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When runId is
|
|
49
|
+
/** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When runId is
|
|
50
|
+
* given, returns null unless it is the card's live run. Throws on an unknown card id; returns null for a card not running. */
|
|
48
51
|
export declare function reviewCard(hippoRoot: string, tenantId: string, id: string, runId?: number): Card | null;
|
|
49
|
-
/**
|
|
52
|
+
/** Closes the live run of a card in review: 'success' moves it to done and promotes children whose parents are all done; 'failure'/'partial' shelves it.
|
|
53
|
+
* Throws on an unknown card id; returns null for a card not in review, or when `runId` is given and is not the card's live run. */
|
|
50
54
|
export declare function completeCard(hippoRoot: string, tenantId: string, id: string, outcome: HandoffOutcome, runId?: number): {
|
|
51
55
|
card: Card;
|
|
52
56
|
promotedChildren: string[];
|
|
53
57
|
} | null;
|
|
54
|
-
/** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes its live
|
|
58
|
+
/** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes its live
|
|
59
|
+
* run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card ids in id order. */
|
|
55
60
|
export declare function reclaimExpiredCards(hippoRoot: string, tenantId: string): string[];
|
|
56
61
|
/** Appends a comment to cardId in any card status; throws if cardId is not a card of this tenant. */
|
|
57
62
|
export declare function addCardComment(hippoRoot: string, tenantId: string, cardId: string, author: string, body: string): CardComment;
|