hippo-memory 1.72.0 → 2.1.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 +6 -4
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -5
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/auth/audit.js +58 -0
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
- package/dist/api/{auth.js → auth/auth.js} +66 -54
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +14 -4
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +31 -34
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +120 -63
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +23 -17
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/memories/memories.js +52 -0
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/memories/outcome.js +28 -0
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/memories/promote.js +76 -0
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
- package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
- package/dist/api/{remember.js → memories/remember.js} +50 -32
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -3
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -5
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +35 -20
- package/dist/api/prompt-hook.js +66 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +116 -72
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +36 -8
- package/dist/api/session-end.js +71 -25
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +27 -12
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +34 -15
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +18 -9
- package/dist/capture/compaction-spool.js +105 -63
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +58 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +33 -33
- package/dist/cli/auth.js +23 -31
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -5
- package/dist/cli/client.js +53 -23
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +43 -18
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +5 -4
- package/dist/cli/curate.js +55 -77
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +30 -30
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +34 -10
- package/dist/cli/hook-runtime.js +41 -16
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +35 -20
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +5 -5
- package/dist/cli/object-verbs.js +13 -16
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +17 -22
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +17 -7
- package/dist/cli/remember.js +51 -55
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +28 -18
- package/dist/cli/session-hooks.d.ts +2 -6
- package/dist/cli/session-hooks.js +140 -112
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +56 -34
- package/dist/cli/shared.d.ts +4 -2
- package/dist/cli/shared.js +26 -11
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +16 -8
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +97 -82
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +1 -1
- package/dist/cli/verb-row.d.ts +2 -0
- package/dist/cli/verbs/health.js +2 -0
- package/dist/cli/verbs/memory.js +47 -53
- package/dist/cli/verbs/objects.js +16 -7
- package/dist/cli/verbs/sessions.js +4 -2
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +14 -18
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -7
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -4
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -5
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -5
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +36 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -3
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -5
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -4
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -5
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +24 -10
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +45 -39
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +28 -17
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +37 -14
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +47 -37
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +42 -39
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +27 -30
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +38 -29
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +22 -17
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +87 -30
- package/dist/core/memory.js +82 -33
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +39 -11
- package/dist/core/physics.js +71 -21
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +35 -18
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +18 -7
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +5 -7
- package/dist/dashboard/dashboard.js +22 -8
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +8 -2
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +40 -20
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -0
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -8
- package/dist/db/physics-state.js +17 -50
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +20 -5
- package/dist/db/request-stores.js +15 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +35 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +7 -1
- package/dist/doctor.js +128 -46
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +11 -7
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +32 -27
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +50 -0
- package/dist/entry/store-kit.js +27 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +17 -7
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +72 -33
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +11 -10
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +3 -3
- package/dist/importers/vault.js +61 -45
- package/dist/index.d.ts +33 -7
- package/dist/index.js +26 -8
- package/dist/learn/autolearn.d.ts +21 -6
- package/dist/learn/autolearn.js +57 -26
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +17 -10
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -6
- package/dist/learn/invalidation.js +62 -28
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +21 -20
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +61 -77
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +59 -23
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +19 -9
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +12 -4
- package/dist/search/embed-memories.js +96 -58
- package/dist/search/engine.d.ts +11 -0
- package/dist/search/engine.js +14 -0
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +14 -8
- package/dist/server/auth.d.ts +19 -15
- package/dist/server/auth.js +68 -38
- package/dist/server/boot.d.ts +4 -1
- package/dist/server/boot.js +115 -67
- package/dist/server/client-ip.d.ts +17 -5
- package/dist/server/client-ip.js +56 -21
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +550 -97
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -17
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +40 -18
- package/dist/server/tls.d.ts +10 -2
- package/dist/server/tls.js +25 -5
- package/dist/server/types.d.ts +41 -24
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +17 -49
- package/dist/server.js +33 -40
- package/dist/sharing/global-store.d.ts +6 -12
- package/dist/sharing/global-store.js +8 -48
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +17 -7
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +28 -14
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +40 -18
- package/dist/store/ambient.js +10 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +90 -41
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +97 -63
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +101 -37
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +16 -5
- package/dist/store/conflicts.js +104 -48
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +58 -6
- package/dist/store/connectors/event-log.d.ts +122 -0
- package/dist/store/connectors/event-log.js +25 -0
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +30 -48
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +31 -47
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -10
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +70 -28
- package/dist/store/delivery-recorder.d.ts +10 -7
- package/dist/store/delivery-recorder.js +70 -37
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +26 -10
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +45 -19
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +72 -21
- package/dist/store/entry-reads.js +215 -69
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +26 -14
- package/dist/store/entry-writes.d.ts +28 -13
- package/dist/store/entry-writes.js +61 -22
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +11 -12
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +29 -19
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +15 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +13 -7
- package/dist/store/handoffs.js +44 -22
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +4 -2
- package/dist/store/index.js +2 -1
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +96 -19
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +6 -3
- package/dist/store/open.js +20 -10
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +261 -219
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +128 -64
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +46 -20
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +20 -13
- package/dist/store/rule-sql.d.ts +7 -3
- package/dist/store/rule-sql.js +26 -13
- package/dist/store/search-rows.d.ts +16 -11
- package/dist/store/search-rows.js +54 -32
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +12 -5
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +8 -0
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +15 -0
- package/dist/store/sqlite/last-recall-group.js +62 -0
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +61 -0
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +97 -38
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -18
- package/dist/store/sqlite/store.js +95 -33
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +25 -11
- package/dist/store/summaries.js +84 -27
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +8 -4
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +28 -11
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +7 -2
- package/dist/util/anthropic-messages.js +18 -7
- package/dist/util/atomic-write.d.ts +8 -3
- package/dist/util/atomic-write.js +36 -21
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +26 -5
- package/dist/util/env.js +87 -25
- package/dist/util/format.d.ts +2 -0
- package/dist/util/format.js +4 -0
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +16 -4
- package/dist/util/request-scope.js +19 -6
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +11 -0
- package/dist/util/spawn-argv.js +66 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -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 +4 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/audit.js +0 -56
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -7
- package/dist/api/learn.js +0 -124
- package/dist/api/memories.d.ts +0 -23
- package/dist/api/memories.js +0 -46
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/outcome.js +0 -21
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/promote.js +0 -65
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -120
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -10
- package/dist/cli/lenient-id.d.ts +0 -2
- package/dist/cli/lenient-id.js +0 -13
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -21
- package/dist/store/sqlite/local.js +0 -39
package/dist/store/auth.js
CHANGED
|
@@ -10,6 +10,16 @@ export const API_KEY_PREFIX = 'hk_';
|
|
|
10
10
|
const ID_LEN = 24; // base32 chars after prefix
|
|
11
11
|
const SECRET_LEN = 32; // base32 chars after dot
|
|
12
12
|
const SCRYPT_KEYLEN = 32;
|
|
13
|
+
// Node's defaults, written out so a hash states the cost it was made with.
|
|
14
|
+
const SCRYPT_N = 16384;
|
|
15
|
+
const SCRYPT_R = 8;
|
|
16
|
+
const SCRYPT_P = 1;
|
|
17
|
+
const SCRYPT_MAXMEM = 64 * 1024 * 1024;
|
|
18
|
+
// A stored row must not be able to make verify hang or exhaust memory.
|
|
19
|
+
const SCRYPT_MAX_N = 2 ** 20;
|
|
20
|
+
const SCRYPT_MAX_R = 32;
|
|
21
|
+
const SCRYPT_MAX_P = 16;
|
|
22
|
+
const DEFAULT_SCRYPT = { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P, maxmem: SCRYPT_MAXMEM };
|
|
13
23
|
const BASE32 = 'abcdefghijklmnopqrstuvwxyz234567';
|
|
14
24
|
const MINTED_KEY_PATTERN = new RegExp(`^${API_KEY_PREFIX}[a-z2-7]{${ID_LEN}}\\.[a-z2-7]{${SECRET_LEN}}$`);
|
|
15
25
|
function randBase32(n) {
|
|
@@ -20,24 +30,41 @@ function randBase32(n) {
|
|
|
20
30
|
return out;
|
|
21
31
|
}
|
|
22
32
|
function hashKey(plaintext) {
|
|
23
|
-
// Format:
|
|
33
|
+
// Format: scrypt2$<N>$<r>$<p>$<saltHex>$<hashHex>
|
|
24
34
|
const salt = randomBytes(16);
|
|
25
|
-
const hash = scryptSync(plaintext, salt, SCRYPT_KEYLEN);
|
|
26
|
-
return `
|
|
35
|
+
const hash = scryptSync(plaintext, salt, SCRYPT_KEYLEN, DEFAULT_SCRYPT);
|
|
36
|
+
return `scrypt2$${SCRYPT_N}$${SCRYPT_R}$${SCRYPT_P}$${salt.toString('hex')}$${hash.toString('hex')}`;
|
|
27
37
|
}
|
|
28
38
|
const verifyStats = { storeLookups: 0, scryptRuns: 0 };
|
|
29
39
|
export function apiKeyVerifyStats() {
|
|
30
40
|
return { ...verifyStats };
|
|
31
41
|
}
|
|
32
|
-
|
|
42
|
+
function validCost(n, r, p) {
|
|
43
|
+
const powerOfTwo = Number.isInteger(n) && n >= 2 && (n & (n - 1)) === 0;
|
|
44
|
+
return powerOfTwo && n <= SCRYPT_MAX_N && Number.isInteger(r) && r >= 1 && r <= SCRYPT_MAX_R
|
|
45
|
+
&& Number.isInteger(p) && p >= 1 && p <= SCRYPT_MAX_P && 128 * n * r <= SCRYPT_MAXMEM;
|
|
46
|
+
}
|
|
47
|
+
/** Null when `stored` has another shape or asks for more work than a verify may do. */
|
|
33
48
|
function storedScrypt(stored) {
|
|
34
49
|
const parts = stored.split('$');
|
|
35
|
-
|
|
50
|
+
let params = DEFAULT_SCRYPT;
|
|
51
|
+
if (parts.length !== 3 && parts.length !== 6)
|
|
52
|
+
return null;
|
|
53
|
+
const hashHex = parts[parts.length - 1];
|
|
54
|
+
const saltHex = parts[parts.length - 2];
|
|
55
|
+
if (parts.length === 3 && parts[0] !== 'scrypt')
|
|
36
56
|
return null;
|
|
37
|
-
|
|
57
|
+
if (parts.length === 6) {
|
|
58
|
+
const [n, r, p] = [Number(parts[1]), Number(parts[2]), Number(parts[3])];
|
|
59
|
+
if (parts[0] !== 'scrypt2' || !validCost(n, r, p))
|
|
60
|
+
return null;
|
|
61
|
+
params = { N: n, r, p, maxmem: SCRYPT_MAXMEM };
|
|
62
|
+
}
|
|
63
|
+
const expected = Buffer.from(hashHex, 'hex');
|
|
38
64
|
return {
|
|
39
|
-
salt: Buffer.from(
|
|
65
|
+
salt: Buffer.from(saltHex, 'hex'),
|
|
40
66
|
keylen: expected.length,
|
|
67
|
+
params,
|
|
41
68
|
matches: (derived) => expected.length === derived.length && timingSafeEqual(expected, derived),
|
|
42
69
|
};
|
|
43
70
|
}
|
|
@@ -46,7 +73,7 @@ function verifyKey(plaintext, stored) {
|
|
|
46
73
|
if (!parsed)
|
|
47
74
|
return false;
|
|
48
75
|
verifyStats.scryptRuns++;
|
|
49
|
-
return parsed.matches(scryptSync(plaintext, parsed.salt, parsed.keylen));
|
|
76
|
+
return parsed.matches(scryptSync(plaintext, parsed.salt, parsed.keylen, parsed.params));
|
|
50
77
|
}
|
|
51
78
|
const scryptOffLoop = promisify(scrypt);
|
|
52
79
|
/** Days a key lives when its mint names no expiry, so a key nobody remembers stops working by itself. */
|
|
@@ -61,28 +88,40 @@ export function insertApiKey(db, key) {
|
|
|
61
88
|
// so the store shuts it out before the first one exists.
|
|
62
89
|
if (key.expiresAt !== null)
|
|
63
90
|
raiseMinBinary(db, EXPIRING_KEYS_MIN_BINARY);
|
|
64
|
-
db.prepare(`INSERT INTO api_keys (key_id, key_hash, tenant_id, label, created_at, role, owner_subject, expires_at) VALUES
|
|
91
|
+
db.prepare(`INSERT INTO api_keys (key_id, key_hash, tenant_id, label, created_at, role, owner_subject, expires_at) VALUES ` +
|
|
92
|
+
`(?, ?, ?, ?, ?, ?, ?, ?)`).run(key.keyId, key.keyHash, key.tenantId, key.label, key.createdAt, key.role, key.ownerSubject, key.expiresAt);
|
|
65
93
|
}
|
|
66
94
|
export function createApiKey(db, opts) {
|
|
67
95
|
const { keyId, plaintext, keyHash } = mintApiKey();
|
|
68
96
|
insertApiKey(db, {
|
|
69
|
-
keyId,
|
|
70
|
-
|
|
97
|
+
keyId,
|
|
98
|
+
keyHash,
|
|
99
|
+
tenantId: opts.tenantId,
|
|
100
|
+
label: opts.label ?? null,
|
|
101
|
+
role: opts.role ?? 'member',
|
|
102
|
+
createdAt: new Date().toISOString(),
|
|
103
|
+
ownerSubject: opts.ownerSubject ?? null,
|
|
104
|
+
expiresAt: opts.expiresAt ?? new Date(Date.now() + DEFAULT_KEY_TTL_DAYS * DAY_MS).toISOString(),
|
|
71
105
|
});
|
|
72
106
|
return { keyId, plaintext };
|
|
73
107
|
}
|
|
74
108
|
/** The api_keys row for `keyId` with its scope grants; null when no row matches. */
|
|
75
109
|
export function readApiKeyRecord(db, keyId) {
|
|
76
|
-
// SAFETY: row comes from the SELECT above, which projects exactly key_hash, tenant_id, revoked_at, role, expires_at,
|
|
77
|
-
// `.get` returns undefined when no row matches key_id.
|
|
110
|
+
// SAFETY: row comes from the SELECT above, which projects exactly key_hash, tenant_id, revoked_at, role, expires_at,
|
|
111
|
+
// owner_subject; `.get` returns undefined when no row matches key_id.
|
|
78
112
|
const row = db
|
|
79
113
|
.prepare(`SELECT key_hash, tenant_id, revoked_at, role, expires_at, owner_subject FROM api_keys WHERE key_id = ?`)
|
|
80
114
|
.get(keyId);
|
|
81
115
|
if (!row)
|
|
82
116
|
return null;
|
|
83
117
|
return {
|
|
84
|
-
keyHash: row.key_hash,
|
|
85
|
-
|
|
118
|
+
keyHash: row.key_hash,
|
|
119
|
+
tenantId: row.tenant_id,
|
|
120
|
+
revokedAt: row.revoked_at,
|
|
121
|
+
role: row.role,
|
|
122
|
+
scopes: listScopeGrants(db, keyId),
|
|
123
|
+
expiresAt: row.expires_at,
|
|
124
|
+
ownerSubject: row.owner_subject,
|
|
86
125
|
};
|
|
87
126
|
}
|
|
88
127
|
/** When a key stops working, in epoch ms: Infinity for null, and already past for a missing
|
|
@@ -101,7 +140,8 @@ function mintedKeyId(plaintext) {
|
|
|
101
140
|
}
|
|
102
141
|
/** True for a record that is present, unrevoked and unexpired, before any secret check. */
|
|
103
142
|
function isUsable(record, now) {
|
|
104
|
-
// Ids are 120 random bits and not secret, so padding the miss path with scrypt hid nothing and let junk tokens burn
|
|
143
|
+
// Ids are 120 random bits and not secret, so padding the miss path with scrypt hid nothing and let junk tokens burn
|
|
144
|
+
// CPU.
|
|
105
145
|
if (!record)
|
|
106
146
|
return false;
|
|
107
147
|
return !record.revokedAt && now < keyExpiryMs(record.expiresAt);
|
|
@@ -136,7 +176,8 @@ function secretDigest(plaintext) {
|
|
|
136
176
|
* a SHA-256 of the token, never the token, and nothing about the key's state. */
|
|
137
177
|
export class VerifiedKeyCache {
|
|
138
178
|
capacity;
|
|
139
|
-
// Keyed on the stored hash, so a rotated or re-minted key never meets an old entry; Map order makes the first key the
|
|
179
|
+
// Keyed on the stored hash, so a rotated or re-minted key never meets an old entry; Map order makes the first key the
|
|
180
|
+
// least recent.
|
|
140
181
|
proven = new Map();
|
|
141
182
|
constructor(capacity) {
|
|
142
183
|
this.capacity = capacity;
|
|
@@ -166,7 +207,8 @@ export class VerifiedKeyCache {
|
|
|
166
207
|
const verifiedKeys = new VerifiedKeyCache(VERIFIED_KEY_CACHE_CAP);
|
|
167
208
|
// By stored hash and token, so a burst of requests with one unproved key derives once and is charged once.
|
|
168
209
|
const checksInFlight = new Map();
|
|
169
|
-
/** Whether `plaintext` is the secret `keyHash` was minted from: a proved token skips scrypt, any other derives on the
|
|
210
|
+
/** Whether `plaintext` is the secret `keyHash` was minted from: a proved token skips scrypt, any other derives on the
|
|
211
|
+
* thread pool. */
|
|
170
212
|
async function secretMatches(keyId, plaintext, keyHash, bound) {
|
|
171
213
|
if (verifiedKeys.has(keyHash, plaintext))
|
|
172
214
|
return true;
|
|
@@ -179,7 +221,7 @@ async function secretMatches(keyId, plaintext, keyHash, bound) {
|
|
|
179
221
|
return running;
|
|
180
222
|
const derive = () => {
|
|
181
223
|
verifyStats.scryptRuns++;
|
|
182
|
-
return scryptOffLoop(plaintext, parsed.salt, parsed.keylen);
|
|
224
|
+
return scryptOffLoop(plaintext, parsed.salt, parsed.keylen, parsed.params);
|
|
183
225
|
};
|
|
184
226
|
const check = (bound ? bound(keyId, derive) : derive()).then((derived) => {
|
|
185
227
|
const matched = parsed.matches(derived);
|
|
@@ -283,7 +325,8 @@ export function listApiKeys(hippoRoot, opts) {
|
|
|
283
325
|
export function listLiveOwnedKeyIds(db, tenantId, ownerSubject, now) {
|
|
284
326
|
// SAFETY: the SELECT names exactly these two columns.
|
|
285
327
|
const rows = db
|
|
286
|
-
.prepare(`SELECT key_id, expires_at FROM api_keys WHERE tenant_id = ? AND owner_subject = ? AND revoked_at IS NULL
|
|
328
|
+
.prepare(`SELECT key_id, expires_at FROM api_keys WHERE tenant_id = ? AND owner_subject = ? AND revoked_at IS NULL ` +
|
|
329
|
+
`ORDER BY id`)
|
|
287
330
|
.all(tenantId, ownerSubject);
|
|
288
331
|
// Expiry is filtered here, not in SQL, so it follows the same Date.parse rule the key check uses.
|
|
289
332
|
return rows.filter((r) => now < keyExpiryMs(r.expires_at)).map((r) => r.key_id);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const STORE_BUSY_MESSAGE = "store busy (another hippo process holds the write lock); retry shortly";
|
|
2
|
+
/** A store behind the port throws this when its lock wait runs
|
|
3
|
+
* out, so the server answers 503 as it does for a busy hippo.db. */
|
|
4
|
+
export declare class StoreBusyError extends Error {
|
|
5
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
6
|
+
}
|
|
7
|
+
/** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
|
|
8
|
+
export declare function isStoreBusy<E>(error: E): boolean;
|
|
9
|
+
//# sourceMappingURL=busy.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// The busy half of the store port, apart from port.ts so that file stays under the size gate.
|
|
2
|
+
import { isSqliteBusy } from '../db/busy.js';
|
|
3
|
+
export const STORE_BUSY_MESSAGE = 'store busy (another hippo process holds the write lock); retry shortly';
|
|
4
|
+
/** A store behind the port throws this when its lock wait runs
|
|
5
|
+
* out, so the server answers 503 as it does for a busy hippo.db. */
|
|
6
|
+
export class StoreBusyError extends Error {
|
|
7
|
+
constructor(message = STORE_BUSY_MESSAGE, options) {
|
|
8
|
+
super(message, options);
|
|
9
|
+
this.name = 'StoreBusyError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
|
|
13
|
+
export function isStoreBusy(error) {
|
|
14
|
+
return error instanceof StoreBusyError || isSqliteBusy(error);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=busy.js.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type MemoryEntry, type ConfidenceLevel, Layer } from '../core/memory.js';
|
|
2
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
3
|
import { type SqlFragment } from './rule-sql.js';
|
|
3
4
|
export interface AmbientRecallRequest {
|
|
4
5
|
terms: string[];
|
|
@@ -32,10 +33,12 @@ export declare function loadContextCandidates(hippoRoot: string, tenantId: strin
|
|
|
32
33
|
export type HeldText = Pick<MemoryEntry, 'content' | 'source' | 'origin_project'>;
|
|
33
34
|
/** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
|
|
34
35
|
export declare const EVERY_SCOPE: SqlFragment;
|
|
35
|
-
/** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from
|
|
36
|
-
* With `project`, only rows carrying one of those names plus user-global rows, as
|
|
36
|
+
/** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from
|
|
37
|
+
* spacing holds its every word. With `project`, only rows carrying one of those names plus user-global rows, as
|
|
38
|
+
* loadContextCandidates' filter. No `tenantId` reads every tenant. */
|
|
37
39
|
export declare function loadTextsHoldingWords(hippoRoot: string, tenantId: string | undefined, words: readonly string[], project?: readonly string[], admit?: SqlFragment): HeldText[];
|
|
38
|
-
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before
|
|
40
|
+
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before
|
|
41
|
+
* it. */
|
|
39
42
|
export declare function loadNewestEntries(hippoRoot: string, tenantId: string, limit: number): MemoryEntry[];
|
|
40
43
|
/** computeSchemaFit against a tenant's newest SCHEMA_FIT_WINDOW_ROWS rows: tag counts come from one aggregate
|
|
41
44
|
* and texts stream one column, so no row is loaded. */
|
|
@@ -47,7 +50,8 @@ export interface SourceTally {
|
|
|
47
50
|
/** `created`, a unit separator, then `id` of the source's first row in loadAllEntries' order. */
|
|
48
51
|
first: string;
|
|
49
52
|
}
|
|
50
|
-
/** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is
|
|
53
|
+
/** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is
|
|
54
|
+
* absent. */
|
|
51
55
|
export declare function tallySources(hippoRoot: string, tenantId?: string): SourceTally[];
|
|
52
56
|
export declare const jsonList: (column: string) => string;
|
|
53
57
|
/** Whole-tenant health numbers: every row counts, superseded and archived ones too. */
|
|
@@ -62,6 +66,8 @@ export interface StrengthTallies {
|
|
|
62
66
|
}
|
|
63
67
|
/** calculateStrength over every row of a tenant in one aggregate pass, no row loaded. */
|
|
64
68
|
export declare function loadStrengthTallies(hippoRoot: string, tenantId: string, now: Date, atRiskBelow: number): StrengthTallies;
|
|
69
|
+
/** loadStrengthTallies on a handle the caller holds, so it can share a snapshot with other reads. */
|
|
70
|
+
export declare function strengthTalliesAt(db: DatabaseSyncLike, tenantId: string, now: Date, atRiskBelow: number): StrengthTallies;
|
|
65
71
|
/** What `hippo status` prints about the whole store: every tenant and superseded rows too. */
|
|
66
72
|
export interface StatusCounts {
|
|
67
73
|
total: number;
|
|
@@ -77,6 +83,7 @@ export interface StatusCounts {
|
|
|
77
83
|
/** Rows that have a stored vector. */
|
|
78
84
|
embedded: number;
|
|
79
85
|
}
|
|
80
|
-
/** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is
|
|
86
|
+
/** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is
|
|
87
|
+
* built. */
|
|
81
88
|
export declare function loadStatusCounts(hippoRoot: string, now: Date, atRiskBelow: number): StatusCounts;
|
|
82
89
|
//# sourceMappingURL=candidates.d.ts.map
|
package/dist/store/candidates.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { FALLBACK_HALF_LIFE_DAYS, Layer, calculateStrength, facetsOf, schemaFitFrom } from '../core/memory.js';
|
|
1
|
+
import { FALLBACK_HALF_LIFE_DAYS, Layer, calculateStrength, facetsOf, schemaFitFrom, } from '../core/memory.js';
|
|
2
2
|
import { strengthSql } from './rule-sql.js';
|
|
3
3
|
import { withReadSnapshot } from '../db/index.js';
|
|
4
|
-
import { scopeAdmitSql } from './rule-sql.js';
|
|
4
|
+
import { rewardFactorSql, scopeAdmitSql } from './rule-sql.js';
|
|
5
5
|
import { MEMORY_SELECT_COLUMNS, rowToEntry, parseJsonArray } from './rows.js';
|
|
6
6
|
import { onHandle, openStore } from './open.js';
|
|
7
7
|
import { originInSql } from '../core/project-identity.js';
|
|
@@ -24,9 +24,14 @@ function loadRecentRows(run, drifted, tenantId, options) {
|
|
|
24
24
|
const { needed, admit, origins } = options;
|
|
25
25
|
const keep = origins ? (e) => admit(e) && inOrigins(e, origins) : admit;
|
|
26
26
|
const window = Math.max(needed * 4, 32);
|
|
27
|
-
const originSql = origins &&
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
const originSql = origins &&
|
|
28
|
+
(origins.userGlobal ? `(origin_project = '' OR ${originInSql(origins.names)})` : originInSql(origins.names));
|
|
29
|
+
const own = {
|
|
30
|
+
where: originSql ? `${AMBIENT_SCOPED} AND ${originSql}` : AMBIENT_SCOPED,
|
|
31
|
+
params: [tenantId, ...(origins?.names ?? [])],
|
|
32
|
+
};
|
|
33
|
+
// Text order is chronological only for standard UTC ISO (memory.ts), so a drifted store is read whole and re-sorted
|
|
34
|
+
// downstream.
|
|
30
35
|
if (drifted)
|
|
31
36
|
return run(`${own.where} ${NEWEST}`, [...own.params]).filter(keep);
|
|
32
37
|
let read = run(`${AMBIENT_SCOPED} ${NEWEST} LIMIT ?`, [tenantId, window]);
|
|
@@ -41,12 +46,19 @@ function loadRecentRows(run, drifted, tenantId, options) {
|
|
|
41
46
|
}
|
|
42
47
|
return [...kept, ...keptPastWindow(run, own, read, needed - kept.length, keep)];
|
|
43
48
|
}
|
|
44
|
-
// A window of refused rows can hide older ones, so read on in keyset pages, each four times the last, until enough are
|
|
49
|
+
// A window of refused rows can hide older ones, so read on in keyset pages, each four times the last, until enough are
|
|
50
|
+
// kept.
|
|
45
51
|
function keptPastWindow(run, own, read, wanted, keep) {
|
|
46
52
|
const out = [];
|
|
47
53
|
let last = read[read.length - 1];
|
|
48
54
|
for (let size = read.length * 4; out.length < wanted; size *= 4) {
|
|
49
|
-
const page = run(`${own.where} AND created <= ? AND (created < ? OR id < ?) ${NEWEST} LIMIT ?`, [
|
|
55
|
+
const page = run(`${own.where} AND created <= ? AND (created < ? OR id < ?) ${NEWEST} LIMIT ?`, [
|
|
56
|
+
...own.params,
|
|
57
|
+
last.created,
|
|
58
|
+
last.created,
|
|
59
|
+
last.id,
|
|
60
|
+
size,
|
|
61
|
+
]);
|
|
50
62
|
out.push(...page.filter(keep));
|
|
51
63
|
if (page.length < size)
|
|
52
64
|
break;
|
|
@@ -83,16 +95,21 @@ export function loadAmbientCandidates(hippoRoot, tenantId, recentNeeded, admit,
|
|
|
83
95
|
return { entries };
|
|
84
96
|
const ftsQuery = pickRarestFtsQuery(db, recall.terms);
|
|
85
97
|
const recallEntries = ftsQuery
|
|
86
|
-
? loadRecallSearchEntriesFromDb(db, ftsQuery, {
|
|
98
|
+
? loadRecallSearchEntriesFromDb(db, ftsQuery, {
|
|
99
|
+
limit: recall.limit,
|
|
100
|
+
tenantId,
|
|
101
|
+
includeSuperseded: false,
|
|
102
|
+
ownScope: recall.ownScope,
|
|
103
|
+
})
|
|
87
104
|
: [];
|
|
88
105
|
return { entries, recall: recallEntries };
|
|
89
106
|
}, openStore);
|
|
90
107
|
}
|
|
91
|
-
// calculateStrength's decay exponent with its reward factor, pins first: the strongest rows, without scoring each one
|
|
92
|
-
|
|
108
|
+
// calculateStrength's decay exponent with its reward factor, pins first: the strongest rows, without scoring each one
|
|
109
|
+
// in JS. A function, not a constant, so the outcome-slow ablation is read per query as strengthSql reads it.
|
|
110
|
+
const decayRankSql = () => `pinned DESC,
|
|
93
111
|
CASE WHEN half_life_days > 0 THEN (julianday(?) - julianday(last_retrieved))
|
|
94
|
-
/ (half_life_days * (
|
|
95
|
-
/ (COALESCE(outcome_positive, 0) + COALESCE(outcome_negative, 0) + 1.0))) END ASC NULLS LAST,
|
|
112
|
+
/ (half_life_days * ${rewardFactorSql()}) END ASC NULLS LAST,
|
|
96
113
|
id ASC`;
|
|
97
114
|
/** Live tenant rows passing `filter`, at most `filter.cap`, in loadAllEntries' order; below the cap, every such row. */
|
|
98
115
|
export function loadContextCandidates(hippoRoot, tenantId, filter) {
|
|
@@ -111,11 +128,23 @@ export function loadContextCandidates(hippoRoot, tenantId, filter) {
|
|
|
111
128
|
where.push(`(origin_project = '' OR ${originInSql(filter.project)})`);
|
|
112
129
|
params.push(...filter.project);
|
|
113
130
|
}
|
|
131
|
+
const cap = Math.max(0, Math.trunc(filter.cap));
|
|
132
|
+
const whereSql = where.join(' AND ');
|
|
114
133
|
return onHandle(hippoRoot, (db) => {
|
|
115
|
-
// SAFETY: the
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
134
|
+
// SAFETY: the count row has the one column named.
|
|
135
|
+
const matched = db.prepare(`SELECT COUNT(*) AS n FROM memories WHERE ${whereSql}`).get(...params).n;
|
|
136
|
+
// Under the cap every match is returned, so the per-row decay math and the sort are skipped.
|
|
137
|
+
// SHORTCUT: past the cap the rank still scans the tenant; a stored decay rank column needs a schema migration,
|
|
138
|
+
// held until one is approved.
|
|
139
|
+
const ranked = matched > cap;
|
|
140
|
+
const sql = ranked
|
|
141
|
+
? `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (
|
|
142
|
+
SELECT id FROM memories WHERE ${whereSql} ORDER BY ${decayRankSql()} LIMIT ?
|
|
143
|
+
) ORDER BY created ASC, id ASC`
|
|
144
|
+
: `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE ${whereSql} ORDER BY created ASC, id ASC`;
|
|
145
|
+
// SAFETY: both SELECTs name exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set; the rank sort carries
|
|
146
|
+
// ids only.
|
|
147
|
+
const rows = db.prepare(sql).all(...params, ...(ranked ? [filter.now.toISOString(), cap] : []));
|
|
119
148
|
return rows.map(rowToEntry);
|
|
120
149
|
}, openStore);
|
|
121
150
|
}
|
|
@@ -123,8 +152,9 @@ export function loadContextCandidates(hippoRoot, tenantId, filter) {
|
|
|
123
152
|
const TEAM_VISIBLE = scopeAdmitSql('');
|
|
124
153
|
/** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
|
|
125
154
|
export const EVERY_SCOPE = Object.freeze({ sql: '1', params: [] });
|
|
126
|
-
/** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from
|
|
127
|
-
* With `project`, only rows carrying one of those names plus user-global rows, as
|
|
155
|
+
/** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from
|
|
156
|
+
* spacing holds its every word. With `project`, only rows carrying one of those names plus user-global rows, as
|
|
157
|
+
* loadContextCandidates' filter. No `tenantId` reads every tenant. */
|
|
128
158
|
export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit = TEAM_VISIBLE) {
|
|
129
159
|
const unique = [...new Set(words)];
|
|
130
160
|
const out = [];
|
|
@@ -136,15 +166,21 @@ export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit
|
|
|
136
166
|
for (let i = 0; i < unique.length; i += 200) {
|
|
137
167
|
const chunk = unique.slice(i, i + 200);
|
|
138
168
|
// SAFETY: rows' shape matches the three columns named in the SELECT below.
|
|
139
|
-
const rows = db
|
|
140
|
-
|
|
141
|
-
|
|
169
|
+
const rows = db
|
|
170
|
+
.prepare(`SELECT content, source, origin_project FROM memories WHERE ${tenantWhere}${originWhere} AND ` +
|
|
171
|
+
`${admit.sql} AND (${chunk
|
|
172
|
+
.map(() => 'instr(content, ?) ' + '> 0')
|
|
173
|
+
.join(' OR ')})`)
|
|
174
|
+
.all(...tenantParams, ...(project ?? []), ...admit.params, ...chunk);
|
|
175
|
+
for (const row of rows) {
|
|
142
176
|
out.push({ content: row.content, source: row.source ?? 'cli', origin_project: row.origin_project });
|
|
177
|
+
}
|
|
143
178
|
}
|
|
144
179
|
return out;
|
|
145
180
|
}, openStore);
|
|
146
181
|
}
|
|
147
|
-
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before
|
|
182
|
+
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before
|
|
183
|
+
* it. */
|
|
148
184
|
export function loadNewestEntries(hippoRoot, tenantId, limit) {
|
|
149
185
|
return onHandle(hippoRoot, (db) => {
|
|
150
186
|
// SAFETY: the SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
@@ -166,7 +202,9 @@ export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
|
|
|
166
202
|
// One read transaction, so the row count and the texts come from the same snapshot.
|
|
167
203
|
return withReadSnapshot(db, () => {
|
|
168
204
|
// SAFETY: rows' shape matches the two columns named in the SELECT.
|
|
169
|
-
const groups = db
|
|
205
|
+
const groups = db
|
|
206
|
+
.prepare(`SELECT tags_json, COUNT(*) AS n FROM (${newest}) GROUP BY tags_json`)
|
|
207
|
+
.all(tenantId, SCHEMA_FIT_WINDOW_ROWS);
|
|
170
208
|
let rows = 0;
|
|
171
209
|
const tagCounts = new Map();
|
|
172
210
|
for (const group of groups) {
|
|
@@ -177,51 +215,61 @@ export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
|
|
|
177
215
|
// SHORTCUT: only the newest SCHEMA_FIT_WINDOW_ROWS rows count, so older tags drop out;
|
|
178
216
|
// a stored per-tenant tag and token tally is the upgrade.
|
|
179
217
|
// SAFETY: the SELECT names exactly the one column read.
|
|
180
|
-
const texts = db
|
|
218
|
+
const texts = db
|
|
219
|
+
.prepare(`SELECT content FROM (${newest})`)
|
|
181
220
|
.iterate(tenantId, SCHEMA_FIT_WINDOW_ROWS);
|
|
182
221
|
return schemaFitFrom(content, tags, { rows, tagCounts, contents: contentsOf(texts) });
|
|
183
222
|
});
|
|
184
223
|
}, openStore);
|
|
185
224
|
}
|
|
186
|
-
/** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is
|
|
225
|
+
/** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is
|
|
226
|
+
* absent. */
|
|
187
227
|
export function tallySources(hippoRoot, tenantId) {
|
|
188
228
|
return onHandle(hippoRoot, (db) => {
|
|
189
229
|
const where = tenantId !== undefined ? 'WHERE tenant_id = ?' : '';
|
|
190
230
|
// SAFETY: rows' shape matches the four aliased columns in the SELECT below.
|
|
191
|
-
return db
|
|
192
|
-
|
|
231
|
+
return db
|
|
232
|
+
.prepare(`SELECT COALESCE(source, 'cli') AS source, COUNT(*) AS count, MAX(created) AS latest, MIN(created || ` +
|
|
233
|
+
`char(31) || id) AS first
|
|
234
|
+
FROM memories ${where} GROUP BY COALESCE(source, 'cli')`)
|
|
235
|
+
.all(...(tenantId !== undefined ? [tenantId] : []));
|
|
193
236
|
}, openStore);
|
|
194
237
|
}
|
|
195
238
|
// A malformed or non-array JSON list reads as empty, as parseJsonArray does, instead of failing json_each.
|
|
196
239
|
export const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_type(${column}) = 'array' THEN ${column} ELSE '[]' END)`;
|
|
197
240
|
/** calculateStrength over every row of a tenant in one aggregate pass, no row loaded. */
|
|
198
241
|
export function loadStrengthTallies(hippoRoot, tenantId, now, atRiskBelow) {
|
|
242
|
+
return onHandle(hippoRoot, (db) => strengthTalliesAt(db, tenantId, now, atRiskBelow), openStore);
|
|
243
|
+
}
|
|
244
|
+
/** loadStrengthTallies on a handle the caller holds, so it can share a snapshot with other reads. */
|
|
245
|
+
export function strengthTalliesAt(db, tenantId, now, atRiskBelow) {
|
|
199
246
|
// An unparseable date scores NULL in SQL and 0 in calculateStrength.
|
|
200
247
|
const strength = `COALESCE(${strengthSql(now)}, 0)`;
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
248
|
+
// SAFETY: one aggregate row whose columns are the aliases named below.
|
|
249
|
+
const row = db
|
|
250
|
+
.prepare(`SELECT
|
|
204
251
|
COUNT(*) AS total,
|
|
205
252
|
COALESCE(SUM(pinned != 0), 0) AS pinned,
|
|
206
253
|
COALESCE(SUM(EXISTS (SELECT 1 FROM json_each(${jsonList('tags_json')}) WHERE value = 'error')), 0) AS errors,
|
|
207
254
|
COALESCE(SUM(${strength}), 0) AS strengthSum,
|
|
208
255
|
COALESCE(SUM(COALESCE(pinned, 0) = 0 AND ${strength} < ?), 0) AS atRisk
|
|
209
|
-
FROM memories WHERE tenant_id = ?`)
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
256
|
+
FROM memories WHERE tenant_id = ?`)
|
|
257
|
+
.get(atRiskBelow, tenantId);
|
|
258
|
+
return {
|
|
259
|
+
total: Number(row.total),
|
|
260
|
+
pinned: Number(row.pinned),
|
|
261
|
+
errors: Number(row.errors),
|
|
262
|
+
strengthSum: Number(row.strengthSum),
|
|
263
|
+
atRisk: Number(row.atRisk),
|
|
264
|
+
};
|
|
218
265
|
}
|
|
219
266
|
// What calculateStrength and facetsOf read, plus the layer: no text and no JSON column.
|
|
220
267
|
const STATUS_ROW_COLUMNS = [
|
|
221
268
|
'layer', 'confidence', 'pinned', 'created', 'last_retrieved', 'half_life_days', 'retrieval_count',
|
|
222
269
|
'emotional_valence', 'outcome_positive', 'outcome_negative',
|
|
223
270
|
];
|
|
224
|
-
// Scored in JavaScript, not with strengthSql: SQLite reads fewer date shapes than Date does, so its counts would
|
|
271
|
+
// Scored in JavaScript, not with strengthSql: SQLite reads fewer date shapes than Date does, so its counts would
|
|
272
|
+
// differ.
|
|
225
273
|
function tallyStatusRows(rows, now, atRiskBelow) {
|
|
226
274
|
const byLayer = { [Layer.Buffer]: 0, [Layer.Episodic]: 0, [Layer.Semantic]: 0, [Layer.Trace]: 0 };
|
|
227
275
|
const byConfidence = { verified: 0, observed: 0, inferred: 0, stale: 0 };
|
|
@@ -255,7 +303,8 @@ function tallyStatusRows(rows, now, atRiskBelow) {
|
|
|
255
303
|
const { total, pinned, atRisk, agedOut } = sums;
|
|
256
304
|
return { total, byLayer, byConfidence, pinned, atRisk, agedOut, avgStrength: total > 0 ? sums.strength / total : 0 };
|
|
257
305
|
}
|
|
258
|
-
/** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is
|
|
306
|
+
/** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is
|
|
307
|
+
* built. */
|
|
259
308
|
export function loadStatusCounts(hippoRoot, now, atRiskBelow) {
|
|
260
309
|
return onHandle(hippoRoot, (db) => {
|
|
261
310
|
// One read transaction, so the row tallies and the two counts describe the same store.
|
|
@@ -12,6 +12,7 @@ export interface CaptureWriteOpts {
|
|
|
12
12
|
/** Called with each captured entry after its write, so the caller can embed it; the store never picks a provider. */
|
|
13
13
|
readonly onCaptured?: (entry: MemoryEntry) => void;
|
|
14
14
|
}
|
|
15
|
-
/** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside
|
|
15
|
+
/** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside
|
|
16
|
+
* the batch is skipped. */
|
|
16
17
|
export declare function writeCapturedItems(hippoRoot: string, items: readonly CaptureItem[], keys: Set<string>, opts: CaptureWriteOpts): CapturedOutcome[];
|
|
17
18
|
//# sourceMappingURL=capture-write.d.ts.map
|
|
@@ -5,7 +5,8 @@ import { stampOriginProject } from './entry-row.js';
|
|
|
5
5
|
import { gatedWrite } from './gated-write.js';
|
|
6
6
|
import { updateStatsOn } from './index-and-stats.js';
|
|
7
7
|
import { openStore } from './open.js';
|
|
8
|
-
/** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside
|
|
8
|
+
/** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside
|
|
9
|
+
* the batch is skipped. */
|
|
9
10
|
export function writeCapturedItems(hippoRoot, items, keys, opts) {
|
|
10
11
|
const db = openStore(hippoRoot);
|
|
11
12
|
try {
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { Card, CardComment, CardRun } from '../core/card.js';
|
|
2
2
|
import type { SessionHandoff } from '../core/handoff.js';
|
|
3
|
-
import {
|
|
3
|
+
import { loadCardDepsAt } from './cards.js';
|
|
4
4
|
/** A card plus everything `hippo card show` prints about it. */
|
|
5
5
|
export interface CardDetail {
|
|
6
6
|
card: Card;
|
|
7
|
-
deps: ReturnType<typeof
|
|
7
|
+
deps: ReturnType<typeof loadCardDepsAt>;
|
|
8
8
|
runs: CardRun[];
|
|
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)
|
|
13
|
-
*
|
|
12
|
+
/** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card), the five
|
|
13
|
+
* reads on one snapshot. */
|
|
14
14
|
export declare function loadCardDetail(hippoRoot: string, tenantId: string, id: string): CardDetail | null;
|
|
15
15
|
//# sourceMappingURL=card-detail.d.ts.map
|
|
@@ -1,16 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { withReadSnapshot } from '../db/index.js';
|
|
2
|
+
import { loadCardCommentsAt, loadCardDepsAt, loadCardRow, loadCardRunsAt, loadLatestHandoffForCardAt, } from './cards.js';
|
|
3
|
+
import { onHandle, openStore } from './open.js';
|
|
4
|
+
import { assertTenantId } from './tenant.js';
|
|
5
|
+
/** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card), the five
|
|
6
|
+
* reads on one snapshot. */
|
|
4
7
|
export function loadCardDetail(hippoRoot, tenantId, id) {
|
|
5
|
-
|
|
8
|
+
assertTenantId('loadCardDetail', tenantId);
|
|
9
|
+
return onHandle(hippoRoot, (db) => withReadSnapshot(db, () => cardDetailAt(db, tenantId, id)), openStore);
|
|
10
|
+
}
|
|
11
|
+
function cardDetailAt(db, tenantId, id) {
|
|
12
|
+
const card = loadCardRow(db, tenantId, id);
|
|
6
13
|
if (!card)
|
|
7
14
|
return null;
|
|
8
15
|
return {
|
|
9
16
|
card,
|
|
10
|
-
deps:
|
|
11
|
-
runs:
|
|
12
|
-
comments:
|
|
13
|
-
handoff:
|
|
17
|
+
deps: loadCardDepsAt(db, tenantId, id),
|
|
18
|
+
runs: loadCardRunsAt(db, tenantId, id),
|
|
19
|
+
comments: loadCardCommentsAt(db, tenantId, id),
|
|
20
|
+
handoff: loadLatestHandoffForCardAt(db, tenantId, id),
|
|
14
21
|
};
|
|
15
22
|
}
|
|
16
23
|
//# sourceMappingURL=card-detail.js.map
|