hippo-memory 1.68.0 → 1.70.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 -3
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.d.ts +3 -1
- package/dist/agent-memories/copilot.js +5 -4
- package/dist/agent-memories/files.js +3 -2
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +1 -1
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +1 -1
- package/dist/agent-memories/sync.js +24 -33
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +2 -2
- package/dist/api/assemble.js +42 -32
- package/dist/api/audit.d.ts +4 -7
- package/dist/api/audit.js +6 -20
- package/dist/api/auth.d.ts +5 -18
- package/dist/api/auth.js +44 -194
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
- package/dist/{availability.js → api/availability.js} +12 -29
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +14 -4
- package/dist/api/context-select.js +50 -60
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +113 -85
- package/dist/api/dormant.d.ts +3 -3
- package/dist/api/dormant.js +38 -107
- package/dist/api/drill-down.d.ts +2 -2
- package/dist/api/drill-down.js +37 -65
- package/dist/api/forget.d.ts +4 -13
- package/dist/api/forget.js +13 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/index.d.ts +26 -0
- package/dist/api/index.js +29 -0
- package/dist/api/instruction-detect.js +74 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +20 -0
- package/dist/api/ledger-db.js +79 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +36 -0
- package/dist/api/outcome.d.ts +9 -46
- package/dist/api/outcome.js +15 -57
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/promote.d.ts +7 -18
- package/dist/api/promote.js +30 -152
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
- package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +112 -0
- package/dist/{recall-history.js → api/recall-history.js} +30 -25
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +41 -16
- package/dist/api/recall.d.ts +1 -1
- package/dist/api/recall.js +39 -37
- package/dist/api/remember.d.ts +12 -13
- package/dist/api/remember.js +38 -27
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -7
- package/dist/api/sleep-run.js +63 -75
- package/dist/api/sleep.d.ts +1 -1
- package/dist/api/tokens.d.ts +2 -2
- package/dist/api/tokens.js +9 -21
- package/dist/api/types.d.ts +2 -2
- package/dist/api/types.js +1 -1
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +1 -1
- package/dist/capture/command.js +54 -41
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +4 -1
- package/dist/capture/compact.js +59 -22
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
- package/dist/capture/copilot-transcript.d.ts +3 -0
- package/dist/capture/copilot-transcript.js +9 -2
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
- package/dist/{session-digest.js → capture/session-digest.js} +17 -23
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.d.ts +13 -0
- package/dist/capture/session-worker.js +196 -0
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.js +68 -74
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
- package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +77 -72
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +18 -20
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +59 -181
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +25 -23
- package/dist/{client.d.ts → cli/client.d.ts} +1 -1
- package/dist/{client.js → cli/client.js} +1 -1
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +39 -0
- package/dist/cli/context.d.ts +2 -13
- package/dist/cli/context.js +41 -71
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +109 -99
- package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
- package/dist/cli/curate.d.ts +9 -9
- package/dist/cli/curate.js +177 -149
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +46 -34
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +108 -218
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +43 -31
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +35 -19
- package/dist/cli/flag-values.d.ts +25 -0
- package/dist/cli/flag-values.js +103 -0
- package/dist/cli/flags.d.ts +303 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +39 -34
- package/dist/cli/hook-runtime.d.ts +49 -0
- package/dist/cli/hook-runtime.js +155 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +151 -118
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +110 -0
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +9 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +31 -27
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +65 -0
- package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
- package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +77 -280
- package/dist/cli/print.d.ts +18 -0
- package/dist/cli/print.js +85 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -49
- package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +101 -150
- package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
- package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
- package/dist/cli/remember.d.ts +1 -3
- package/dist/cli/remember.js +124 -103
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
- package/dist/{scheduler.js → cli/scheduler.js} +13 -7
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +34 -4
- package/dist/cli/session-hooks.d.ts +4 -4
- package/dist/cli/session-hooks.js +265 -191
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +111 -45
- package/dist/cli/shared.d.ts +5 -95
- package/dist/cli/shared.js +18 -369
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +31 -55
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +2 -8
- package/dist/cli/sleep.js +20 -76
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +39 -41
- package/dist/{stdin.js → cli/stdin.js} +6 -6
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +68 -42
- package/dist/cli/usage.js +8 -3
- package/dist/cli.d.ts +289 -5
- package/dist/cli.js +184 -117
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +1 -1
- package/dist/connectors/github/backfill.js +29 -66
- package/dist/connectors/github/cli-impl.js +59 -74
- package/dist/connectors/github/deletion.d.ts +5 -6
- package/dist/connectors/github/deletion.js +18 -52
- package/dist/connectors/github/dlq.d.ts +7 -61
- package/dist/connectors/github/dlq.js +19 -119
- package/dist/connectors/github/ingest.d.ts +2 -31
- package/dist/connectors/github/ingest.js +20 -82
- package/dist/connectors/github/octokit-client.d.ts +1 -1
- package/dist/connectors/github/octokit-client.js +2 -1
- package/dist/connectors/github/tenant-routing.d.ts +2 -2
- package/dist/connectors/github/tenant-routing.js +10 -36
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/types.d.ts +1 -1
- package/dist/connectors/github/types.js +15 -18
- package/dist/connectors/github/webhook.d.ts +3 -2
- package/dist/connectors/github/webhook.js +84 -87
- package/dist/connectors/slack/backfill.d.ts +1 -1
- package/dist/connectors/slack/backfill.js +5 -29
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -48
- package/dist/connectors/slack/dlq.d.ts +7 -49
- package/dist/connectors/slack/dlq.js +25 -118
- package/dist/connectors/slack/ingest.d.ts +5 -18
- package/dist/connectors/slack/ingest.js +27 -90
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.js +13 -14
- package/dist/connectors/slack/transform.d.ts +1 -1
- package/dist/connectors/slack/types.d.ts +1 -1
- package/dist/connectors/slack/types.js +3 -12
- package/dist/connectors/slack/web-client.js +2 -2
- package/dist/connectors/slack/webhook.d.ts +3 -2
- package/dist/connectors/slack/webhook.js +75 -82
- package/dist/connectors/slack/workspaces.d.ts +4 -17
- package/dist/connectors/slack/workspaces.js +4 -34
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +4 -4
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
- package/dist/{dag.js → consolidate/dag.js} +60 -81
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +28 -22
- package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
- package/dist/consolidate/flush-units.d.ts +2 -2
- package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
- package/dist/consolidate/half-life-migration.js +106 -0
- package/dist/consolidate/llm-passes.js +8 -8
- package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
- package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
- package/dist/consolidate/merge.js +57 -54
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
- package/dist/consolidate/physics-pass.js +46 -46
- package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
- package/dist/{replay.js → consolidate/replay.js} +2 -2
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +1 -1
- package/dist/consolidate/sleep.js +64 -134
- package/dist/{trace.js → consolidate/trace.js} +4 -6
- package/dist/consolidate/traces.js +34 -29
- package/dist/{ablation.js → core/ablation.js} +1 -1
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.js → core/ambient.js} +12 -10
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/core/capture-contract.js +149 -0
- package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
- package/dist/{compare.js → core/compare.js} +10 -3
- package/dist/{config.d.ts → core/config.d.ts} +6 -6
- package/dist/{config.js → core/config.js} +99 -72
- package/dist/core/handoff.js +87 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
- package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
- package/dist/{memory.js → core/memory.js} +117 -82
- package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
- package/dist/{physics.js → core/physics.js} +2 -1
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
- package/dist/{project-identity.js → core/project-identity.js} +5 -17
- package/dist/{project-remote.js → core/project-remote.js} +4 -4
- package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
- package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
- package/dist/{salience.js → core/salience.js} +35 -20
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
- package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +18 -1
- package/dist/db/busy.js +74 -9
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +25 -30
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -35
- package/dist/db/migrations/v16.js +29 -26
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v20.js +4 -2
- package/dist/db/migrations/v22.js +39 -36
- package/dist/db/migrations/v24.js +27 -22
- package/dist/db/migrations/v29.js +37 -32
- package/dist/db/migrations/v31.js +36 -31
- package/dist/db/migrations/v35.js +1 -1
- package/dist/db/migrations/v39.js +1 -1
- package/dist/db/migrations/v40.js +15 -14
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +1 -1
- package/dist/db/migrations/v45.js +1 -1
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +1 -1
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +9 -1
- package/dist/db/open.js +21 -4
- package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
- package/dist/{physics-state.js → db/physics-state.js} +9 -16
- package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
- package/dist/{vector-store.js → db/vector-store.js} +76 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +105 -136
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +3 -3
- package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
- package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
- package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
- package/dist/{eval.js → eval/eval.js} +29 -22
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
- package/dist/{judgment.js → eval/judgment.js} +4 -9
- package/dist/extensions/openclaw-plugin/index.js +1 -2
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
- package/dist/{graph-extract.js → graph/extract.js} +37 -52
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
- package/dist/{graph-recall.js → graph/recall.js} +55 -36
- package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
- package/dist/{graph-stream.js → graph/stream.js} +9 -7
- package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
- package/dist/{graph-view.js → graph/view.js} +127 -167
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +14 -15
- package/dist/hooks/copilot.d.ts +48 -13
- package/dist/hooks/copilot.js +124 -39
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +3 -1
- package/dist/hooks/json-hooks.js +40 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +7 -5
- package/dist/hooks/shared.js +19 -8
- package/dist/importers/core.d.ts +2 -6
- package/dist/importers/core.js +41 -39
- package/dist/importers/markdown-parse.d.ts +1 -10
- package/dist/importers/markdown-parse.js +2 -19
- package/dist/importers/markdown.js +2 -1
- package/dist/importers/sources.js +50 -46
- package/dist/importers/vault.js +71 -92
- package/dist/index.d.ts +22 -22
- package/dist/index.js +21 -21
- package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
- package/dist/{autolearn.js → learn/autolearn.js} +13 -11
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +125 -0
- package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
- package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
- package/dist/{invalidation.js → learn/invalidation.js} +83 -99
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +37 -60
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.d.ts +2 -2
- package/dist/mcp/memory-tools.js +12 -31
- package/dist/mcp/protocol.d.ts +6 -10
- package/dist/mcp/protocol.js +8 -14
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +68 -50
- package/dist/mcp/request.js +65 -63
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/session-state.d.ts +1 -2
- package/dist/mcp/session-state.js +2 -2
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.js +69 -31
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +2 -2
- package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
- package/dist/objects/customer-notes.js +112 -0
- package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
- package/dist/objects/decisions.js +101 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
- package/dist/objects/incidents.js +130 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
- package/dist/objects/policies.js +189 -0
- package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
- package/dist/objects/processes.js +146 -0
- package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
- package/dist/objects/project-briefs.js +255 -0
- package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
- package/dist/objects/skills.js +156 -0
- package/dist/postinstall.js +4 -2
- package/dist/predictions/planning-fallacy.d.ts +4 -76
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +27 -47
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +15 -23
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +30 -49
- package/dist/rerankers/llm.d.ts +2 -4
- package/dist/rerankers/llm.js +33 -50
- package/dist/rerankers/outage-warning.d.ts +7 -0
- package/dist/rerankers/outage-warning.js +31 -0
- package/dist/rerankers/remote.d.ts +3 -0
- package/dist/rerankers/remote.js +23 -0
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -1
- package/dist/search/boosts.js +34 -13
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +4 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +7 -5
- package/dist/{path-context.js → search/path-context.js} +3 -1
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +15 -15
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +3 -3
- package/dist/search/vector.js +17 -11
- package/dist/server/auth.d.ts +1 -1
- package/dist/server/auth.js +26 -18
- package/dist/server/boot.d.ts +24 -0
- package/dist/server/boot.js +465 -0
- package/dist/server/client-ip.d.ts +5 -1
- package/dist/server/client-ip.js +18 -6
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/key-check-bounds.d.ts +8 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.js +1 -1
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +34 -24
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +10 -4
- package/dist/server/request.js +63 -12
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +209 -0
- package/dist/server/routes/admin.js +13 -8
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +32 -97
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +42 -105
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +42 -95
- package/dist/server/routes/memories.js +21 -20
- package/dist/server/routes/object-routes.d.ts +40 -0
- package/dist/server/routes/object-routes.js +80 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +40 -124
- package/dist/server/routes/predictions.js +29 -45
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +38 -118
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +38 -110
- package/dist/server/routes/recall.js +14 -12
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +37 -125
- package/dist/{server-detect.js → server/server-detect.js} +3 -2
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +70 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +27 -8
- package/dist/server/validation.d.ts +3 -4
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +41 -50
- package/dist/server.js +26 -560
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
- package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
- package/dist/{scope.js → sharing/scope.js} +1 -1
- package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
- package/dist/{shared.js → sharing/shared.js} +100 -77
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +10 -10
- package/dist/store/audit-event.d.ts +12 -6
- package/dist/store/audit-event.js +6 -5
- package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
- package/dist/{audit.js → store/audit.js} +91 -6
- package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
- package/dist/{auth.js → store/auth.js} +100 -92
- package/dist/store/candidates.d.ts +23 -12
- package/dist/store/candidates.js +87 -35
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
- package/dist/{card-detail.js → store/card-detail.js} +1 -1
- package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
- package/dist/{store-cards.js → store/cards.js} +85 -146
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +22 -5
- package/dist/store/conflicts.js +160 -109
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +92 -0
- package/dist/store/delete-and-batch.d.ts +20 -24
- package/dist/store/delete-and-batch.js +64 -40
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +51 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
- package/dist/{dormant.js → store/dormant.js} +151 -6
- package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
- package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
- package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
- package/dist/store/entry-reads.d.ts +46 -7
- package/dist/store/entry-reads.js +120 -21
- package/dist/store/entry-row.d.ts +8 -2
- package/dist/store/entry-row.js +28 -8
- package/dist/store/entry-writes.d.ts +33 -4
- package/dist/store/entry-writes.js +108 -26
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
- package/dist/{goals.js → store/goals.js} +45 -94
- package/dist/store/graph-queue.d.ts +29 -0
- package/dist/store/graph-queue.js +101 -0
- package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
- package/dist/{graph/read.js → store/graph-reads.js} +63 -115
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
- package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
- package/dist/store/graph-view-rows.d.ts +12 -0
- package/dist/store/graph-view-rows.js +67 -0
- package/dist/store/graph-writes.d.ts +58 -0
- package/dist/store/graph-writes.js +256 -0
- package/dist/store/half-life.d.ts +34 -0
- package/dist/store/half-life.js +77 -0
- package/dist/store/handoffs.d.ts +6 -3
- package/dist/store/handoffs.js +70 -31
- package/dist/store/index-and-stats.d.ts +8 -1
- package/dist/store/index-and-stats.js +51 -48
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +1 -1
- package/dist/store/markdown.js +4 -3
- package/dist/store/mirrors.d.ts +5 -7
- package/dist/store/mirrors.js +39 -25
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +8 -4
- package/dist/store/open.js +34 -23
- package/dist/store/planning-fallacy-evidence.d.ts +42 -0
- package/dist/store/planning-fallacy-evidence.js +81 -0
- package/dist/store/port.d.ts +646 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
- package/dist/{predictions/store.js → store/predictions.js} +52 -67
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
- package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
- package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
- package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +162 -0
- package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
- package/dist/{rejection.js → store/rejection.js} +3 -2
- package/dist/store/rows.d.ts +2 -3
- package/dist/store/rows.js +18 -11
- package/dist/store/search-rows.d.ts +15 -4
- package/dist/store/search-rows.js +43 -36
- package/dist/store/sessions.d.ts +18 -2
- package/dist/store/sessions.js +83 -46
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/sqlite/entry-writes-group.js +170 -0
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +59 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +28 -0
- package/dist/store/sqlite/executor.js +286 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +38 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +218 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +314 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +26 -0
- package/dist/store/sqlite/store.js +295 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +124 -0
- package/dist/store/sqlite/worker-ops.js +82 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +76 -0
- package/dist/store/summaries.d.ts +2 -11
- package/dist/store/summaries.js +17 -44
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/store/tenant-lookup.d.ts +1 -1
- package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
- package/dist/{tenant.js → store/tenant.js} +1 -1
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
- package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +26 -0
- package/dist/store/vector-writes.d.ts +10 -3
- package/dist/store/vector-writes.js +35 -5
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
- package/dist/{working-memory.js → store/working-memory.js} +39 -41
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +13 -33
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +67 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +46 -0
- package/dist/util/atomic-write.d.ts +3 -0
- package/dist/util/atomic-write.js +107 -0
- package/dist/util/crash-handlers.d.ts +5 -0
- package/dist/util/crash-handlers.js +30 -0
- package/dist/{env.d.ts → util/env.d.ts} +17 -2
- package/dist/{env.js → util/env.js} +22 -2
- package/dist/util/home-path.js +67 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
- package/dist/{http-retry.js → util/http-retry.js} +38 -7
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +5 -2
- package/dist/{log.js → util/log.js} +12 -3
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +27 -0
- package/dist/util/request-scope.js +47 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +18 -0
- package/dist/util/token-text.js +23 -0
- package/dist/{version.d.ts → util/version.d.ts} +1 -1
- package/dist/{version.js → util/version.js} +1 -1
- package/extensions/openclaw-plugin/index.ts +1 -5
- 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 +2 -2
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/capture-contract.js +0 -49
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.js +0 -326
- package/dist/extract.js +0 -133
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/policies.js +0 -434
- package/dist/processes.js +0 -371
- package/dist/project-briefs.js +0 -523
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/skills.js +0 -367
- package/dist/store-port.d.ts +0 -191
- package/dist/store-port.js +0 -166
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
- /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
- /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
- /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
- /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
- /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
- /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
- /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
- /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{card.d.ts → core/card.d.ts} +0 -0
- /package/dist/{card.js → core/card.js} +0 -0
- /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
- /package/dist/{physics-config.js → core/physics-config.js} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
- /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
- /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
- /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
- /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
- /package/dist/{rrf.js → search/rrf.js} +0 -0
- /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
- /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
- /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
- /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
- /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
- /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
- /package/dist/{yaml.js → store/yaml.js} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
- /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
|
-
import { canAutoDelete } from '
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { canAutoDelete } from '../core/memory.js';
|
|
3
|
+
import { closeHippoDb, openHippoDb, withWriteScope } from '../db/index.js';
|
|
4
|
+
import { log } from '../util/log.js';
|
|
5
|
+
import { keysetAfter } from '../util/keyset.js';
|
|
6
|
+
import { warnDamagedColumn } from '../util/stored-json.js';
|
|
7
|
+
import { automaticDefect, hasNoSpecificity, isFragment, isReleaseCommitNoise, substantiveWordCount, } from '../core/memory-quality.js';
|
|
6
8
|
export function auditMemory(entry, backsObject = false) {
|
|
7
9
|
const issue = classifyMemory(entry);
|
|
8
10
|
// Error means "auto-remove"; a pinned, raw, kept-for-good or object-backing row is never auto-removed, so it can only warn.
|
|
@@ -136,6 +138,16 @@ export function auditQueryFields(query) {
|
|
|
136
138
|
export function appendAuditEvent(db, opts) {
|
|
137
139
|
db.prepare(`INSERT INTO audit_log (ts, tenant_id, actor, op, target_id, metadata_json) VALUES (?, ?, ?, ?, ?, ?)`).run(new Date().toISOString(), opts.tenantId, opts.actor, opts.op, opts.targetId ?? null, JSON.stringify(opts.metadata ?? {}, bigintSafeReplacer));
|
|
138
140
|
}
|
|
141
|
+
/** One audit row in the store under `hippoRoot`, as its own write. */
|
|
142
|
+
export function recordAuditEvent(hippoRoot, event) {
|
|
143
|
+
const db = openHippoDb(hippoRoot);
|
|
144
|
+
try {
|
|
145
|
+
appendAuditEvent(db, event);
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
closeHippoDb(db);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
139
151
|
let auditWriteFailures = 0;
|
|
140
152
|
/** For callers that keep a mutation when its audit row fails: the failure is logged and counted, never silent. */
|
|
141
153
|
export function reportAuditWriteFailure(op, reason, targetId) {
|
|
@@ -146,6 +158,10 @@ export function reportAuditWriteFailure(op, reason, targetId) {
|
|
|
146
158
|
export function auditWriteFailureCount() {
|
|
147
159
|
return auditWriteFailures;
|
|
148
160
|
}
|
|
161
|
+
/** Adds the failures a store worker counted on its own thread, so the process reports one number. */
|
|
162
|
+
export function addAuditWriteFailures(count) {
|
|
163
|
+
auditWriteFailures += count;
|
|
164
|
+
}
|
|
149
165
|
export function queryAuditEvents(db, opts) {
|
|
150
166
|
const where = ['tenant_id = ?'];
|
|
151
167
|
const params = [opts.tenantId];
|
|
@@ -191,6 +207,37 @@ export function listAuditEventsAfter(db, opts) {
|
|
|
191
207
|
.all(...params, limit);
|
|
192
208
|
return rows.map(rowToAuditEvent);
|
|
193
209
|
}
|
|
210
|
+
/** How many of a tenant's audit rows are older than `cutoff`. */
|
|
211
|
+
function countAuditBefore(db, tenantId, cutoff) {
|
|
212
|
+
// SAFETY: row comes from `SELECT COUNT(*) AS c`; COUNT(*) always yields exactly one row with a
|
|
213
|
+
// numeric `c` column (number or bigint depending on the node:sqlite driver's integer handling).
|
|
214
|
+
const row = db
|
|
215
|
+
.prepare(`SELECT COUNT(*) AS c FROM audit_log WHERE tenant_id = ? AND ts < ?`)
|
|
216
|
+
.get(tenantId, cutoff);
|
|
217
|
+
return Number(row.c);
|
|
218
|
+
}
|
|
219
|
+
/** Deletes a tenant's audit rows older than `cutoff`; returns how many went. */
|
|
220
|
+
function deleteAuditBefore(db, tenantId, cutoff) {
|
|
221
|
+
const result = db
|
|
222
|
+
.prepare(`DELETE FROM audit_log WHERE tenant_id = ? AND ts < ?`)
|
|
223
|
+
.run(tenantId, cutoff);
|
|
224
|
+
return Number(result.changes ?? 0);
|
|
225
|
+
}
|
|
226
|
+
/** Latest time each target got a good outcome, from the audit rows, read on a handle of its own; unlike queryAuditEvents it has no row cap. */
|
|
227
|
+
export function confirmedOutcomeTimes(hippoRoot, tenantId) {
|
|
228
|
+
const db = openHippoDb(hippoRoot);
|
|
229
|
+
try {
|
|
230
|
+
// SAFETY: the SELECT list is exactly target_id and ts; no other shape reaches this cast.
|
|
231
|
+
const rows = db.prepare(`SELECT target_id, MAX(ts) AS ts FROM audit_log
|
|
232
|
+
WHERE tenant_id = ? AND op = 'outcome' AND target_id IS NOT NULL
|
|
233
|
+
AND json_extract(metadata_json, '$.good') = 1
|
|
234
|
+
GROUP BY target_id`).all(tenantId);
|
|
235
|
+
return new Map(rows.map((r) => [r.target_id, r.ts]));
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
closeHippoDb(db);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
194
241
|
const AUDIT_COLUMNS = 'id, ts, tenant_id, actor, op, target_id, metadata_json';
|
|
195
242
|
function rowToAuditEvent(r) {
|
|
196
243
|
return {
|
|
@@ -202,10 +249,10 @@ function rowToAuditEvent(r) {
|
|
|
202
249
|
// typed AuditOp at the INSERT call site, so every stored value is a valid AuditOp.
|
|
203
250
|
op: r.op,
|
|
204
251
|
targetId: r.target_id,
|
|
205
|
-
metadata: safeJsonParse(r.metadata_json),
|
|
252
|
+
metadata: safeJsonParse(r.metadata_json, r.id),
|
|
206
253
|
};
|
|
207
254
|
}
|
|
208
|
-
function safeJsonParse(raw) {
|
|
255
|
+
function safeJsonParse(raw, id) {
|
|
209
256
|
try {
|
|
210
257
|
const v = JSON.parse(raw);
|
|
211
258
|
// SAFETY: JSON.parse only ever returns a plain object, array, string, number,
|
|
@@ -216,7 +263,45 @@ function safeJsonParse(raw) {
|
|
|
216
263
|
}
|
|
217
264
|
catch {
|
|
218
265
|
// Malformed metadata reads as empty so the audit row itself stays listable.
|
|
266
|
+
warnDamagedColumn({ table: 'audit_log', id, column: 'metadata_json' }, 'not valid JSON');
|
|
219
267
|
return {};
|
|
220
268
|
}
|
|
221
269
|
}
|
|
270
|
+
/** Appends each event as its own write on one handle, so a row that fails drops only itself. Returns the rows that failed, for the caller to report. */
|
|
271
|
+
export function recordAuditEventsRowByRow(hippoRoot, events) {
|
|
272
|
+
const db = openHippoDb(hippoRoot);
|
|
273
|
+
try {
|
|
274
|
+
const failed = [];
|
|
275
|
+
for (const event of events) {
|
|
276
|
+
try {
|
|
277
|
+
appendAuditEvent(db, event);
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
failed.push({ event, error });
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return failed;
|
|
284
|
+
}
|
|
285
|
+
finally {
|
|
286
|
+
closeHippoDb(db);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/** Deletes a tenant's audit rows older than the cutoff and records the prune in the same write scope, so neither lands alone; returns the row count. */
|
|
290
|
+
export function pruneAuditRows(hippoRoot, prune) {
|
|
291
|
+
const { tenantId, cutoff, actor, olderThanDays } = prune;
|
|
292
|
+
const db = openHippoDb(hippoRoot);
|
|
293
|
+
try {
|
|
294
|
+
if (prune.dryRun)
|
|
295
|
+
return countAuditBefore(db, tenantId, cutoff);
|
|
296
|
+
return withWriteScope(db, 'audit_prune', () => {
|
|
297
|
+
const count = deleteAuditBefore(db, tenantId, cutoff);
|
|
298
|
+
// Written after the delete with ts = now, so the cutoff just applied cannot take it.
|
|
299
|
+
appendAuditEvent(db, { tenantId, actor, op: 'audit_prune', metadata: { cutoff, count, dryRun: false, olderThanDays } });
|
|
300
|
+
return count;
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
closeHippoDb(db);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
222
307
|
//# sourceMappingURL=audit.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { type KeysetPosition } from '
|
|
3
|
-
import type { HippoStore } from './
|
|
1
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
|
+
import { type KeysetPosition } from '../util/keyset.js';
|
|
3
|
+
import type { HippoStore } from './index.js';
|
|
4
4
|
/** Every minted API key starts with this, so the server can route a bearer token by shape. */
|
|
5
5
|
export declare const API_KEY_PREFIX = "hk_";
|
|
6
6
|
/** Counts since process start, so a flood of bad tokens shows as scrypt work, not just as 401s. */
|
|
@@ -74,44 +74,25 @@ export interface ApiKeyRecord {
|
|
|
74
74
|
}
|
|
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
|
-
/** A key that passed every check, with the time it stops working so a cache entry never outlives it. */
|
|
78
|
-
export interface CheckedApiKey {
|
|
79
|
-
key: VerifiedApiKey;
|
|
80
|
-
expiresAtMs: number;
|
|
81
|
-
keyHash: string;
|
|
82
|
-
}
|
|
83
77
|
export declare function validateApiKey(db: DatabaseSyncLike, plaintext: string): ValidateResult;
|
|
84
|
-
/**
|
|
85
|
-
export declare const VERIFIED_KEY_TTL_MS = 60000;
|
|
86
|
-
/** LRU of verified keys with an absolute TTL. Holds a SHA-256 of the token, never the token. */
|
|
78
|
+
/** LRU of the tokens that matched a stored key hash, so a repeat skips scrypt. Holds a SHA-256 of the token, never the token, and nothing about the key's state. */
|
|
87
79
|
export declare class VerifiedKeyCache {
|
|
88
80
|
private readonly capacity;
|
|
89
|
-
private readonly
|
|
90
|
-
|
|
91
|
-
private deletes;
|
|
92
|
-
constructor(capacity: number, ttlMs: number);
|
|
81
|
+
private readonly proven;
|
|
82
|
+
constructor(capacity: number);
|
|
93
83
|
get size(): number;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
/** The entry this exact token was verified into, fresh or lapsed. */
|
|
97
|
-
private match;
|
|
98
|
-
get(hippoRoot: string, keyId: string, plaintext: string, now: number): VerifiedApiKey | undefined;
|
|
99
|
-
/** The key hash this exact token was last verified against, kept past the TTL so a re-check can skip scrypt. */
|
|
100
|
-
verifiedHash(hippoRoot: string, keyId: string, plaintext: string): string | undefined;
|
|
101
|
-
set(hippoRoot: string, keyId: string, plaintext: string, found: CheckedApiKey, now: number): void;
|
|
102
|
-
delete(keyId: string): void;
|
|
84
|
+
has(keyHash: string, plaintext: string): boolean;
|
|
85
|
+
add(keyHash: string, plaintext: string): void;
|
|
103
86
|
}
|
|
104
|
-
/**
|
|
105
|
-
|
|
87
|
+
/** A caller's limit on scrypt work, called once per derivation: it may throw to refuse `derive` or hold it in a queue. */
|
|
88
|
+
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 call, so a revoke, expiry, role or scope change by any process applies on the next one. */
|
|
90
|
+
export declare function verifyApiKeyCached(plaintext: string, store: HippoStore, bound?: DerivationBound): Promise<VerifiedApiKey | null>;
|
|
106
91
|
export declare function revokeApiKey(db: DatabaseSyncLike, keyId: string, at?: string): void;
|
|
107
|
-
/** A store other than hippo.db revokes without this process's cache, so its caller drops the key here once the revoke commits. */
|
|
108
|
-
export declare function forgetVerifiedKey(keyId: string): void;
|
|
109
92
|
/** Grant `keyId` read access to one restricted `scope`. Idempotent. */
|
|
110
93
|
export declare function grantScope(db: DatabaseSyncLike, keyId: string, scope: string): void;
|
|
111
94
|
/** Revoke `keyId`'s grant on `scope`. Not an error when no such grant exists. */
|
|
112
95
|
export declare function ungrantScope(db: DatabaseSyncLike, keyId: string, scope: string): void;
|
|
113
|
-
/** Every restricted scope `keyId` may read. */
|
|
114
|
-
export declare function listScopeGrants(db: DatabaseSyncLike, keyId: string): string[];
|
|
115
96
|
export interface ApiKeyListItem {
|
|
116
97
|
keyId: string;
|
|
117
98
|
tenantId: string;
|
|
@@ -150,7 +131,9 @@ export interface ApiKeyListRow {
|
|
|
150
131
|
}
|
|
151
132
|
/** Keys newest first, with their row ids, filtered and limited in SQL. */
|
|
152
133
|
export declare function listApiKeyRows(db: DatabaseSyncLike, opts: ListApiKeysOpts): ApiKeyListRow[];
|
|
153
|
-
|
|
134
|
+
/** Keys of every tenant under `hippoRoot` unless `opts.tenantId` names one. */
|
|
135
|
+
export declare function listApiKeys(hippoRoot: string, opts: ListApiKeysOpts): ApiKeyListItem[];
|
|
154
136
|
/** Ids of the unrevoked, unexpired keys `ownerSubject` minted in `tenantId`, oldest first. */
|
|
155
137
|
export declare function listLiveOwnedKeyIds(db: DatabaseSyncLike, tenantId: string, ownerSubject: string, now: number): string[];
|
|
138
|
+
export {};
|
|
156
139
|
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { createHash, randomBytes, scryptSync, timingSafeEqual } from 'node:crypto';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { createHash, randomBytes, scrypt, scryptSync, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { closeHippoDb, openHippoDb } from '../db/index.js';
|
|
4
|
+
import { raiseMinBinary } from '../db/meta.js';
|
|
5
|
+
import { keysetAfter } from '../util/keyset.js';
|
|
6
|
+
import { EXPIRING_KEYS_MIN_BINARY } from '../util/version.js';
|
|
5
7
|
/** Every minted API key starts with this, so the server can route a bearer token by shape. */
|
|
6
8
|
export const API_KEY_PREFIX = 'hk_';
|
|
7
9
|
const ID_LEN = 24; // base32 chars after prefix
|
|
@@ -26,16 +28,26 @@ const verifyStats = { storeLookups: 0, scryptRuns: 0 };
|
|
|
26
28
|
export function apiKeyVerifyStats() {
|
|
27
29
|
return { ...verifyStats };
|
|
28
30
|
}
|
|
29
|
-
|
|
31
|
+
/** Null when `stored` has another shape. */
|
|
32
|
+
function storedScrypt(stored) {
|
|
30
33
|
const parts = stored.split('$');
|
|
31
34
|
if (parts.length !== 3 || parts[0] !== 'scrypt')
|
|
32
|
-
return
|
|
33
|
-
const salt = Buffer.from(parts[1], 'hex');
|
|
35
|
+
return null;
|
|
34
36
|
const expected = Buffer.from(parts[2], 'hex');
|
|
37
|
+
return {
|
|
38
|
+
salt: Buffer.from(parts[1], 'hex'),
|
|
39
|
+
keylen: expected.length,
|
|
40
|
+
matches: (derived) => expected.length === derived.length && timingSafeEqual(expected, derived),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function verifyKey(plaintext, stored) {
|
|
44
|
+
const parsed = storedScrypt(stored);
|
|
45
|
+
if (!parsed)
|
|
46
|
+
return false;
|
|
35
47
|
verifyStats.scryptRuns++;
|
|
36
|
-
|
|
37
|
-
return expected.length === actual.length && timingSafeEqual(expected, actual);
|
|
48
|
+
return parsed.matches(scryptSync(plaintext, parsed.salt, parsed.keylen));
|
|
38
49
|
}
|
|
50
|
+
const scryptOffLoop = promisify(scrypt);
|
|
39
51
|
export function mintApiKey() {
|
|
40
52
|
const keyId = `${API_KEY_PREFIX}${randBase32(ID_LEN)}`;
|
|
41
53
|
const plaintext = `${keyId}.${randBase32(SECRET_LEN)}`;
|
|
@@ -85,138 +97,127 @@ function keyExpiryMs(expiresAt) {
|
|
|
85
97
|
function mintedKeyId(plaintext) {
|
|
86
98
|
return MINTED_KEY_PATTERN.test(plaintext) ? plaintext.slice(0, API_KEY_PREFIX.length + ID_LEN) : null;
|
|
87
99
|
}
|
|
88
|
-
/**
|
|
89
|
-
function
|
|
100
|
+
/** True for a record that is present, unrevoked and unexpired, before any secret check. */
|
|
101
|
+
function isUsable(record, now) {
|
|
90
102
|
// Ids are 120 random bits and not secret, so padding the miss path with scrypt hid nothing and let junk tokens burn CPU.
|
|
91
103
|
if (!record)
|
|
92
|
-
return
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
104
|
+
return false;
|
|
105
|
+
return !record.revokedAt && now < keyExpiryMs(record.expiresAt);
|
|
106
|
+
}
|
|
107
|
+
/** The verified key a usable record whose secret matched carries. */
|
|
108
|
+
function verifiedKeyOf(keyId, record) {
|
|
96
109
|
// Fail-safe to least privilege: any role value but 'admin' reads as 'member'.
|
|
97
110
|
const role = record.role === 'admin' ? 'admin' : 'member';
|
|
98
111
|
const key = { tenantId: record.tenantId, keyId, role, scopes: [...record.scopes] };
|
|
99
112
|
// Only a real name counts as an owner; anything else leaves the key keyed on its own id.
|
|
100
113
|
if (record.ownerSubject)
|
|
101
114
|
key.ownerSubject = record.ownerSubject;
|
|
102
|
-
return
|
|
115
|
+
return key;
|
|
103
116
|
}
|
|
104
117
|
/** One full check against the store: shape, row, revocation, expiry, then scrypt. Null for any failure. */
|
|
105
118
|
function lookupApiKey(db, plaintext, now) {
|
|
106
119
|
const keyId = mintedKeyId(plaintext);
|
|
107
|
-
|
|
120
|
+
if (keyId === null)
|
|
121
|
+
return null;
|
|
122
|
+
const record = readApiKeyRecord(db, keyId);
|
|
123
|
+
return isUsable(record, now) && verifyKey(plaintext, record.keyHash) ? verifiedKeyOf(keyId, record) : null;
|
|
108
124
|
}
|
|
109
125
|
export function validateApiKey(db, plaintext) {
|
|
110
126
|
const found = lookupApiKey(db, plaintext, Date.now());
|
|
111
|
-
return found ? { valid: true, ...found
|
|
127
|
+
return found ? { valid: true, ...found } : { valid: false };
|
|
112
128
|
}
|
|
113
|
-
/** How long a verified key is trusted without a store read; also the ceiling on a revoke made by another process. */
|
|
114
|
-
export const VERIFIED_KEY_TTL_MS = 60_000;
|
|
115
129
|
const VERIFIED_KEY_CACHE_CAP = 1_000;
|
|
116
130
|
function secretDigest(plaintext) {
|
|
117
131
|
return createHash('sha256').update(plaintext).digest();
|
|
118
132
|
}
|
|
119
|
-
/** LRU of
|
|
133
|
+
/** LRU of the tokens that matched a stored key hash, so a repeat skips scrypt. Holds a SHA-256 of the token, never the token, and nothing about the key's state. */
|
|
120
134
|
export class VerifiedKeyCache {
|
|
121
135
|
capacity;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
deletes = 0;
|
|
126
|
-
constructor(capacity, ttlMs) {
|
|
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.
|
|
137
|
+
proven = new Map();
|
|
138
|
+
constructor(capacity) {
|
|
127
139
|
this.capacity = capacity;
|
|
128
|
-
this.ttlMs = ttlMs;
|
|
129
140
|
}
|
|
130
141
|
get size() {
|
|
131
|
-
return this.
|
|
142
|
+
return this.proven.size;
|
|
132
143
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
return this.deletes;
|
|
136
|
-
}
|
|
137
|
-
/** The entry this exact token was verified into, fresh or lapsed. */
|
|
138
|
-
match(hippoRoot, keyId, plaintext) {
|
|
139
|
-
const entry = this.entries.get(keyId);
|
|
140
|
-
if (!entry || entry.hippoRoot !== hippoRoot)
|
|
141
|
-
return undefined;
|
|
144
|
+
has(keyHash, plaintext) {
|
|
145
|
+
const digest = this.proven.get(keyHash);
|
|
142
146
|
// A wrong secret misses but leaves the entry, so a flood of bad guesses cannot evict a good key.
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
return undefined;
|
|
149
|
-
this.entries.delete(keyId);
|
|
150
|
-
this.entries.set(keyId, entry);
|
|
151
|
-
return { ...entry.key, scopes: [...entry.key.scopes] };
|
|
147
|
+
if (!digest || !timingSafeEqual(digest, secretDigest(plaintext)))
|
|
148
|
+
return false;
|
|
149
|
+
this.proven.delete(keyHash);
|
|
150
|
+
this.proven.set(keyHash, digest);
|
|
151
|
+
return true;
|
|
152
152
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
set(hippoRoot, keyId, plaintext, found, now) {
|
|
158
|
-
this.entries.delete(keyId);
|
|
159
|
-
if (this.entries.size >= this.capacity) {
|
|
160
|
-
const oldest = this.entries.keys().next();
|
|
153
|
+
add(keyHash, plaintext) {
|
|
154
|
+
this.proven.delete(keyHash);
|
|
155
|
+
if (this.proven.size >= this.capacity) {
|
|
156
|
+
const oldest = this.proven.keys().next();
|
|
161
157
|
if (!oldest.done)
|
|
162
|
-
this.
|
|
158
|
+
this.proven.delete(oldest.value);
|
|
163
159
|
}
|
|
164
|
-
|
|
165
|
-
// A key that expires inside the TTL leaves the cache at its expiry, so the cache never extends its life.
|
|
166
|
-
const expiresAt = Math.min(now + this.ttlMs, found.expiresAtMs);
|
|
167
|
-
this.entries.set(keyId, { hippoRoot, digest: secretDigest(plaintext), key: frozen, keyHash: found.keyHash, expiresAt });
|
|
168
|
-
}
|
|
169
|
-
delete(keyId) {
|
|
170
|
-
this.deletes++;
|
|
171
|
-
this.entries.delete(keyId);
|
|
160
|
+
this.proven.set(keyHash, secretDigest(plaintext));
|
|
172
161
|
}
|
|
173
162
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
163
|
+
const verifiedKeys = new VerifiedKeyCache(VERIFIED_KEY_CACHE_CAP);
|
|
164
|
+
// By stored hash and token, so a burst of requests with one unproved key derives once and is charged once.
|
|
165
|
+
const checksInFlight = new Map();
|
|
166
|
+
/** Whether `plaintext` is the secret `keyHash` was minted from: a proved token skips scrypt, any other derives on the thread pool. */
|
|
167
|
+
async function secretMatches(keyId, plaintext, keyHash, bound) {
|
|
168
|
+
if (verifiedKeys.has(keyHash, plaintext))
|
|
169
|
+
return true;
|
|
170
|
+
const parsed = storedScrypt(keyHash);
|
|
171
|
+
if (!parsed)
|
|
172
|
+
return false;
|
|
173
|
+
const id = `${keyHash}\u0000${plaintext}`;
|
|
174
|
+
const running = checksInFlight.get(id);
|
|
175
|
+
if (running)
|
|
176
|
+
return running;
|
|
177
|
+
const derive = () => {
|
|
178
|
+
verifyStats.scryptRuns++;
|
|
179
|
+
return scryptOffLoop(plaintext, parsed.salt, parsed.keylen);
|
|
180
|
+
};
|
|
181
|
+
const check = (bound ? bound(keyId, derive) : derive()).then((derived) => {
|
|
182
|
+
const matched = parsed.matches(derived);
|
|
183
|
+
// Only successes are kept: keeping misses would let junk tokens fill the cache and evict real keys.
|
|
184
|
+
if (matched)
|
|
185
|
+
verifiedKeys.add(keyHash, plaintext);
|
|
186
|
+
return matched;
|
|
187
|
+
});
|
|
188
|
+
checksInFlight.set(id, check);
|
|
189
|
+
const forget = () => {
|
|
190
|
+
checksInFlight.delete(id);
|
|
191
|
+
};
|
|
192
|
+
void check.then(forget, forget);
|
|
193
|
+
return check;
|
|
194
|
+
}
|
|
195
|
+
/** Verify a bearer API key against `store`, null when invalid. The key's row is read on every call, so a revoke, expiry, role or scope change by any process applies on the next one. */
|
|
196
|
+
export async function verifyApiKeyCached(plaintext, store, bound) {
|
|
178
197
|
const keyId = mintedKeyId(plaintext);
|
|
179
198
|
if (keyId === null)
|
|
180
199
|
return null;
|
|
181
|
-
const hit = verifiedKeys.get(hippoRoot, keyId, plaintext, Date.now());
|
|
182
|
-
if (hit)
|
|
183
|
-
return hit;
|
|
184
|
-
const provenHash = verifiedKeys.verifiedHash(hippoRoot, keyId, plaintext);
|
|
185
200
|
verifyStats.storeLookups++;
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
beforeScrypt?.();
|
|
191
|
-
return verifyKey(plaintext, hash);
|
|
192
|
-
});
|
|
193
|
-
// Only successes are cached: caching misses would let junk tokens fill the cache and evict real keys.
|
|
194
|
-
if (found && verifiedKeys.epoch === epoch)
|
|
195
|
-
verifiedKeys.set(hippoRoot, keyId, plaintext, found, Date.now());
|
|
196
|
-
return found?.key ?? null;
|
|
201
|
+
const record = await store.findApiKey(keyId);
|
|
202
|
+
if (!isUsable(record, Date.now()))
|
|
203
|
+
return null;
|
|
204
|
+
return (await secretMatches(keyId, plaintext, record.keyHash, bound)) ? verifiedKeyOf(keyId, record) : null;
|
|
197
205
|
}
|
|
198
206
|
export function revokeApiKey(db, keyId, at = new Date().toISOString()) {
|
|
199
207
|
db.prepare(`UPDATE api_keys SET revoked_at = ? WHERE key_id = ? AND revoked_at IS NULL`)
|
|
200
208
|
.run(at, keyId);
|
|
201
|
-
verifiedKeys.delete(keyId);
|
|
202
|
-
}
|
|
203
|
-
/** A store other than hippo.db revokes without this process's cache, so its caller drops the key here once the revoke commits. */
|
|
204
|
-
export function forgetVerifiedKey(keyId) {
|
|
205
|
-
verifiedKeys.delete(keyId);
|
|
206
209
|
}
|
|
207
210
|
/** Grant `keyId` read access to one restricted `scope`. Idempotent. */
|
|
208
211
|
export function grantScope(db, keyId, scope) {
|
|
209
212
|
db.prepare(`INSERT INTO api_key_scope_grants (key_id, scope, granted_at) VALUES (?, ?, ?)
|
|
210
213
|
ON CONFLICT(key_id, scope) DO NOTHING`).run(keyId, scope, new Date().toISOString());
|
|
211
|
-
verifiedKeys.delete(keyId);
|
|
212
214
|
}
|
|
213
215
|
/** Revoke `keyId`'s grant on `scope`. Not an error when no such grant exists. */
|
|
214
216
|
export function ungrantScope(db, keyId, scope) {
|
|
215
217
|
db.prepare(`DELETE FROM api_key_scope_grants WHERE key_id = ? AND scope = ?`).run(keyId, scope);
|
|
216
|
-
verifiedKeys.delete(keyId);
|
|
217
218
|
}
|
|
218
219
|
/** Every restricted scope `keyId` may read. */
|
|
219
|
-
|
|
220
|
+
function listScopeGrants(db, keyId) {
|
|
220
221
|
// SAFETY: rows' shape matches the single `scope` column named in the SELECT above.
|
|
221
222
|
const rows = db
|
|
222
223
|
.prepare(`SELECT scope FROM api_key_scope_grants WHERE key_id = ? ORDER BY scope`)
|
|
@@ -263,8 +264,15 @@ export function listApiKeyRows(db, opts) {
|
|
|
263
264
|
},
|
|
264
265
|
}));
|
|
265
266
|
}
|
|
266
|
-
|
|
267
|
-
|
|
267
|
+
/** Keys of every tenant under `hippoRoot` unless `opts.tenantId` names one. */
|
|
268
|
+
export function listApiKeys(hippoRoot, opts) {
|
|
269
|
+
const db = openHippoDb(hippoRoot);
|
|
270
|
+
try {
|
|
271
|
+
return listApiKeyRows(db, opts).map(r => r.key);
|
|
272
|
+
}
|
|
273
|
+
finally {
|
|
274
|
+
closeHippoDb(db);
|
|
275
|
+
}
|
|
268
276
|
}
|
|
269
277
|
/** Ids of the unrevoked, unexpired keys `ownerSubject` minted in `tenantId`, oldest first. */
|
|
270
278
|
export function listLiveOwnedKeyIds(db, tenantId, ownerSubject, now) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { type SqlFragment } from '
|
|
1
|
+
import { type MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import { type SqlFragment } from './recall-scope.js';
|
|
3
3
|
export interface AmbientRecallRequest {
|
|
4
4
|
terms: string[];
|
|
5
5
|
limit: number;
|
|
@@ -9,10 +9,6 @@ export interface AmbientLoadResult {
|
|
|
9
9
|
entries: MemoryEntry[];
|
|
10
10
|
recall?: MemoryEntry[];
|
|
11
11
|
}
|
|
12
|
-
/** Exported so the plan test runs the exact SQL; idx_memories_pinned (db.ts v51) serves it. */
|
|
13
|
-
export declare const AMBIENT_PINNED_WHERE = "pinned = 1 AND superseded_by IS NULL AND tenant_id = ? ORDER BY created ASC, id ASC";
|
|
14
|
-
/** Exported so the plan test runs the exact SQL; idx_memories_created_drift (db.ts v51) serves it. */
|
|
15
|
-
export declare const AMBIENT_DRIFT_SQL = "SELECT 1 FROM memories WHERE superseded_by IS NULL AND tenant_id = ? AND (length(created) <> 24 OR created NOT LIKE '%Z') LIMIT 1";
|
|
16
12
|
/** The origins a caller's recent rows may carry: its project names, and user-global ('') rows when `userGlobal`. */
|
|
17
13
|
export interface RecentOrigins {
|
|
18
14
|
readonly names: readonly string[];
|
|
@@ -33,14 +29,16 @@ export interface ContextCandidateFilter {
|
|
|
33
29
|
}
|
|
34
30
|
/** Live tenant rows passing `filter`, at most `filter.cap`, in loadAllEntries' order; below the cap, every such row. */
|
|
35
31
|
export declare function loadContextCandidates(hippoRoot: string, tenantId: string, filter: ContextCandidateFilter): MemoryEntry[];
|
|
36
|
-
/** A row's strength inputs and tags, without its text or the JSON lists a full row parses. */
|
|
37
|
-
export type StrengthRow = StrengthInputs & Pick<MemoryEntry, 'tags'>;
|
|
38
|
-
/** Every tenant row as a StrengthRow, for whole-store health numbers; defaults match rowToEntry's. */
|
|
39
|
-
export declare function loadStrengthRows(hippoRoot: string, tenantId: string): StrengthRow[];
|
|
40
32
|
export type HeldText = Pick<MemoryEntry, 'content' | 'source' | 'origin_project'>;
|
|
33
|
+
/** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
|
|
34
|
+
export declare const EVERY_SCOPE: SqlFragment;
|
|
41
35
|
/** Text, source and origin of tenant rows holding any of `words` that `admit` passes, by default the team-visible ones; a row equal to a text apart from spacing holds its every word.
|
|
42
|
-
* With `project`, only rows carrying one of those names and user-global rows, as loadContextCandidates' filter. */
|
|
43
|
-
export declare function loadTextsHoldingWords(hippoRoot: string, tenantId: string, words: readonly string[], project?: readonly string[], admit?: SqlFragment): HeldText[];
|
|
36
|
+
* With `project`, only rows carrying one of those names and user-global rows, as loadContextCandidates' filter. No `tenantId` reads every tenant. */
|
|
37
|
+
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 it. */
|
|
39
|
+
export declare function loadNewestEntries(hippoRoot: string, tenantId: string, limit: number): MemoryEntry[];
|
|
40
|
+
/** computeSchemaFit against every row of a tenant: tag counts come from one aggregate and texts stream one column, so no row is loaded. */
|
|
41
|
+
export declare function schemaFitInStore(hippoRoot: string, tenantId: string, content: string, tags: readonly string[]): number;
|
|
44
42
|
export interface SourceTally {
|
|
45
43
|
source: string;
|
|
46
44
|
count: number;
|
|
@@ -50,4 +48,17 @@ export interface SourceTally {
|
|
|
50
48
|
}
|
|
51
49
|
/** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is absent. */
|
|
52
50
|
export declare function tallySources(hippoRoot: string, tenantId?: string): SourceTally[];
|
|
51
|
+
export declare const jsonList: (column: string) => string;
|
|
52
|
+
/** Whole-tenant health numbers: every row counts, superseded and archived ones too. */
|
|
53
|
+
export interface StrengthTallies {
|
|
54
|
+
total: number;
|
|
55
|
+
pinned: number;
|
|
56
|
+
/** Rows tagged exactly `error`. */
|
|
57
|
+
errors: number;
|
|
58
|
+
strengthSum: number;
|
|
59
|
+
/** Unpinned rows whose strength is under `atRiskBelow`. */
|
|
60
|
+
atRisk: number;
|
|
61
|
+
}
|
|
62
|
+
/** calculateStrength over every row of a tenant in one aggregate pass, no row loaded. */
|
|
63
|
+
export declare function loadStrengthTallies(hippoRoot: string, tenantId: string, now: Date, atRiskBelow: number): StrengthTallies;
|
|
53
64
|
//# sourceMappingURL=candidates.d.ts.map
|