hippo-memory 1.69.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 +5 -2
- 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.js +3 -2
- 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 +5 -5
- package/dist/api/context-select.js +37 -45
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +48 -61
- 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 +2 -11
- package/dist/api/forget.js +13 -46
- 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 +5 -42
- package/dist/api/outcome.js +15 -80
- 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 +4 -15
- package/dist/api/promote.js +29 -106
- 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 +10 -12
- package/dist/api/remember.js +29 -45
- 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 +40 -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.js +1 -1
- 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.js +6 -4
- 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 +190 -184
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +41 -21
- 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 +4 -2
- 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 -83
- 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 -49
- 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 -91
- 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} +13 -2
- package/dist/{capture-contract.js → core/capture-contract.js} +64 -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} +17 -5
- package/dist/{memory.js → core/memory.js} +110 -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.js → core/prompt-recall.js} +1 -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 +1 -8
- package/dist/hooks/copilot.js +14 -15
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +1 -1
- package/dist/hooks/json-hooks.js +31 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +0 -4
- package/dist/hooks/shared.js +1 -5
- 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.js +7 -27
- 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 +62 -60
- 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 +12 -14
- 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} +1 -1
- 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 +39 -61
- package/dist/server.js +24 -568
- 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 +11 -5
- package/dist/store/audit-event.js +5 -4
- 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 +1 -1
- package/dist/store/handoffs.js +39 -30
- 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 +6 -4
- package/dist/store/open.js +24 -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} +3 -1
- package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
- package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
- 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 +41 -28
- package/dist/store/sessions.d.ts +13 -2
- package/dist/store/sessions.js +79 -45
- 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/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- 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} +15 -2
- package/dist/{env.js → util/env.js} +20 -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/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/entry-writes-group.d.ts +0 -9
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- /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/{prompt-recall.d.ts → core/prompt-recall.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
package/dist/api/assemble.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// Session context assembly under a token budget.
|
|
2
|
-
import {
|
|
3
|
-
import { estimateTokens } from '../token-
|
|
4
|
-
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../recall-scope.js';
|
|
5
|
-
import { classifyOriginProject, projectNames } from '../project-identity.js';
|
|
2
|
+
import { requireGroup, storeFor } from '../store/index.js';
|
|
3
|
+
import { estimateTokens } from '../util/token-text.js';
|
|
4
|
+
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../store/recall-scope.js';
|
|
5
|
+
import { classifyOriginProject, projectNames } from '../core/project-identity.js';
|
|
6
|
+
const DEFAULT_FRESH_TAIL_COUNT = 10;
|
|
7
|
+
const DEFAULT_ROW_CAP = 5000;
|
|
6
8
|
export const DEFAULT_ASSEMBLE_BUDGET = 4000;
|
|
7
9
|
/**
|
|
8
10
|
* Build a chronologically-ordered context window for a session. Adapts the
|
|
@@ -26,30 +28,16 @@ export const DEFAULT_ASSEMBLE_BUDGET = 4000;
|
|
|
26
28
|
* - no raws exist for the session
|
|
27
29
|
* - all rows fail the scope/tenant filter
|
|
28
30
|
*/
|
|
29
|
-
export function assemble(ctx, sessionId, opts = {}) {
|
|
31
|
+
export async function assemble(ctx, sessionId, opts = {}) {
|
|
30
32
|
assertScopeRequestAllowed(ctx.actor, opts.scope);
|
|
31
33
|
const budget = opts.budget ?? DEFAULT_ASSEMBLE_BUDGET;
|
|
32
|
-
const freshTailCount = opts.freshTailCount ??
|
|
34
|
+
const freshTailCount = opts.freshTailCount ?? DEFAULT_FRESH_TAIL_COUNT;
|
|
33
35
|
const summarizeOlder = opts.summarizeOlder ?? true;
|
|
34
|
-
const rowCap = opts.rowCap ?? 5000;
|
|
35
36
|
const own = personalScopeOf(ctx.actor) ?? undefined;
|
|
36
37
|
if (!sessionId) {
|
|
37
38
|
return { sessionId, items: [], tokens: 0, totalRaw: 0, summarized: 0, evicted: 0, truncated: false };
|
|
38
39
|
}
|
|
39
|
-
const
|
|
40
|
-
const rows = loadSessionRawMemories(ctx.hippoRoot, sessionId, ctx.tenantId, rowCap, origins);
|
|
41
|
-
const truncated = rows.length === rowCap;
|
|
42
|
-
// `scoped.length` under-counts a capped session, so totalRaw falls back to a COUNT below.
|
|
43
|
-
const scoped = rows.filter((r) => passesScopeFilterForRecall(r.scope ?? null, opts.scope, own));
|
|
44
|
-
let totalRaw;
|
|
45
|
-
if (truncated) {
|
|
46
|
-
// The COUNT applies the same default-deny scope rule in SQL, so a no-scope
|
|
47
|
-
// caller cannot infer private rows by comparing totalRaw to items.length.
|
|
48
|
-
totalRaw = countSessionRawMemories(ctx.hippoRoot, sessionId, ctx.tenantId, opts.scope, own, origins);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
totalRaw = scoped.length;
|
|
52
|
-
}
|
|
40
|
+
const { scoped, totalRaw, truncated } = await loadScopedRaws(ctx, sessionId, opts, own);
|
|
53
41
|
if (scoped.length === 0) {
|
|
54
42
|
return { sessionId, items: [], tokens: 0, totalRaw, summarized: 0, evicted: 0, truncated };
|
|
55
43
|
}
|
|
@@ -59,17 +47,11 @@ export function assemble(ctx, sessionId, opts = {}) {
|
|
|
59
47
|
const tailRows = scoped.slice(tailStartIdx);
|
|
60
48
|
// Substitute parent summaries for older rows that share one.
|
|
61
49
|
const { olderItems, summarized } = summarizeOlder && olderRows.length > 0
|
|
62
|
-
? substituteSummaries(ctx, olderRows, opts.scope, own, opts.project)
|
|
50
|
+
? await substituteSummaries(ctx, olderRows, opts.scope, own, opts.project)
|
|
63
51
|
: { olderItems: olderRows.map(rawItem), summarized: 0 };
|
|
64
|
-
const tailItems = tailRows.map(
|
|
65
|
-
id: r.id,
|
|
66
|
-
content: r.content,
|
|
67
|
-
createdAt: r.created,
|
|
68
|
-
isFreshTail: true,
|
|
69
|
-
strength: r.strength,
|
|
70
|
-
}));
|
|
52
|
+
const tailItems = tailRows.map(freshTailItem);
|
|
71
53
|
// Byte compare is chronological for the fixed-form UTC ISO timestamps
|
|
72
|
-
// (invariant documented in src/memory.ts above MemoryEntry).
|
|
54
|
+
// (invariant documented in src/core/memory.ts above MemoryEntry).
|
|
73
55
|
const cmpIso = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
74
56
|
olderItems.sort((a, b) => cmpIso(a.createdAt, b.createdAt));
|
|
75
57
|
tailItems.sort((a, b) => cmpIso(a.createdAt, b.createdAt));
|
|
@@ -78,6 +60,25 @@ export function assemble(ctx, sessionId, opts = {}) {
|
|
|
78
60
|
const { items, tokens, evicted } = evictToBudget([...olderItems, ...tailItems], itemCost, room);
|
|
79
61
|
return { sessionId, items, tokens, totalRaw, summarized, evicted, truncated };
|
|
80
62
|
}
|
|
63
|
+
async function loadScopedRaws(ctx, sessionId, opts, own) {
|
|
64
|
+
const rowCap = opts.rowCap ?? DEFAULT_ROW_CAP;
|
|
65
|
+
const origins = opts.project ? projectNames(opts.project) : undefined;
|
|
66
|
+
const dag = requireGroup(storeFor(ctx), 'dagReads');
|
|
67
|
+
const rows = await dag.sessionRawEntries({ tenantId: ctx.tenantId, sessionId, cap: rowCap, origins });
|
|
68
|
+
const truncated = rows.length === rowCap;
|
|
69
|
+
// `scoped.length` under-counts a capped session, so totalRaw falls back to a COUNT below.
|
|
70
|
+
const scoped = rows.filter((r) => passesScopeFilterForRecall(r.scope ?? null, opts.scope, own));
|
|
71
|
+
let totalRaw;
|
|
72
|
+
if (truncated) {
|
|
73
|
+
// The COUNT applies the same default-deny scope rule in SQL, so a no-scope
|
|
74
|
+
// caller cannot infer private rows by comparing totalRaw to items.length.
|
|
75
|
+
totalRaw = await dag.sessionRawCount({ tenantId: ctx.tenantId, sessionId, scope: opts.scope, ownScope: own, origins });
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
totalRaw = scoped.length;
|
|
79
|
+
}
|
|
80
|
+
return { scoped, totalRaw, truncated };
|
|
81
|
+
}
|
|
81
82
|
function rawItem(r) {
|
|
82
83
|
return {
|
|
83
84
|
id: r.id,
|
|
@@ -86,7 +87,16 @@ function rawItem(r) {
|
|
|
86
87
|
strength: r.strength,
|
|
87
88
|
};
|
|
88
89
|
}
|
|
89
|
-
function
|
|
90
|
+
function freshTailItem(r) {
|
|
91
|
+
return {
|
|
92
|
+
id: r.id,
|
|
93
|
+
content: r.content,
|
|
94
|
+
createdAt: r.created,
|
|
95
|
+
isFreshTail: true,
|
|
96
|
+
strength: r.strength,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async function substituteSummaries(ctx, olderRows, scope, own, project) {
|
|
90
100
|
const olderItems = [];
|
|
91
101
|
let summarized = 0;
|
|
92
102
|
const olderByParent = new Map();
|
|
@@ -99,7 +109,7 @@ function substituteSummaries(ctx, olderRows, scope, own, project) {
|
|
|
99
109
|
}
|
|
100
110
|
const eligibleParentIds = Array.from(olderByParent.keys()).filter((pid) => (olderByParent.get(pid)?.length ?? 0) >= 2);
|
|
101
111
|
const parents = eligibleParentIds.length > 0
|
|
102
|
-
?
|
|
112
|
+
? (await storeFor(ctx).entriesByIds(eligibleParentIds, ctx.tenantId))
|
|
103
113
|
.filter((p) => (p.dag_level ?? 0) === 2 && !p.superseded_by)
|
|
104
114
|
.filter((p) => passesScopeFilterForRecall(p.scope ?? null, scope, own))
|
|
105
115
|
.filter((p) => !project || classifyOriginProject(p.origin_project, project) !== 'cross-project')
|
package/dist/api/audit.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { KeysetPosition } from '../keyset.js';
|
|
1
|
+
import type { AuditEvent, AuditOp } from '../store/audit.js';
|
|
2
|
+
import type { KeysetPosition } from '../util/keyset.js';
|
|
3
3
|
import type { Context } from './types.js';
|
|
4
4
|
export interface AuditListOpts {
|
|
5
5
|
op?: AuditOp;
|
|
@@ -9,9 +9,6 @@ export interface AuditListOpts {
|
|
|
9
9
|
/** Resume after this row: the (ts, id) position the previous page ended on. */
|
|
10
10
|
after?: KeysetPosition;
|
|
11
11
|
}
|
|
12
|
-
/**
|
|
13
|
-
|
|
14
|
-
* cmdAuditList, which does not record a 'recall'-style read event).
|
|
15
|
-
*/
|
|
16
|
-
export declare function auditList(ctx: Context, opts: AuditListOpts): AuditEvent[];
|
|
12
|
+
/** Read audit events scoped to `ctx.tenantId` on the store the request runs on. Read-only, no audit emit. */
|
|
13
|
+
export declare function auditList(ctx: Context, opts: AuditListOpts): Promise<AuditEvent[]>;
|
|
17
14
|
//# sourceMappingURL=audit.d.ts.map
|
package/dist/api/audit.js
CHANGED
|
@@ -1,23 +1,9 @@
|
|
|
1
1
|
// Audit log queries.
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
export function auditList(ctx, opts) {
|
|
9
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
10
|
-
try {
|
|
11
|
-
return queryAuditEvents(db, {
|
|
12
|
-
tenantId: ctx.tenantId,
|
|
13
|
-
op: opts.op,
|
|
14
|
-
since: opts.since,
|
|
15
|
-
limit: opts.limit,
|
|
16
|
-
after: opts.after,
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
finally {
|
|
20
|
-
closeHippoDb(db);
|
|
21
|
-
}
|
|
2
|
+
import { requireGroup, storeFor } from '../store/index.js';
|
|
3
|
+
/** Read audit events scoped to `ctx.tenantId` on the store the request runs on. Read-only, no audit emit. */
|
|
4
|
+
export async function auditList(ctx, opts) {
|
|
5
|
+
return requireGroup(storeFor(ctx), 'auditLog').listAuditEvents({
|
|
6
|
+
tenantId: ctx.tenantId, op: opts.op, since: opts.since, limit: opts.limit, after: opts.after,
|
|
7
|
+
});
|
|
22
8
|
}
|
|
23
9
|
//# sourceMappingURL=audit.js.map
|
package/dist/api/auth.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import type { KeysetPosition } from '../keyset.js';
|
|
1
|
+
import { type ApiKeyListRow } from '../store/auth.js';
|
|
2
|
+
import type { KeysetPosition } from '../util/keyset.js';
|
|
3
3
|
import type { Context, StoreReply } from './types.js';
|
|
4
4
|
export interface AuthCreateOpts {
|
|
5
5
|
label?: string;
|
|
@@ -41,27 +41,14 @@ export interface AuthCreateSelfResult extends AuthCreateResult {
|
|
|
41
41
|
/** ISO time the key stops working. */
|
|
42
42
|
expiresAt: string;
|
|
43
43
|
}
|
|
44
|
-
/** Mint a member key for the caller an auth resolver vouched for, whatever its role; the binary floor, the cap's revokes, the mint and its audit rows commit or fail together.
|
|
45
|
-
* With `ctx.store`, its keyWrites group runs that transaction; hippo.db is opened only when there is no store. */
|
|
44
|
+
/** Mint a member key for the caller an auth resolver vouched for, whatever its role; the binary floor, the cap's revokes, the mint and its audit rows commit or fail together. */
|
|
46
45
|
export declare function authCreateSelf<C extends Context>(ctx: C, opts: AuthCreateSelfOpts): StoreReply<C, AuthCreateSelfResult>;
|
|
47
|
-
/**
|
|
48
|
-
* List API keys visible to the calling tenant.
|
|
49
|
-
*
|
|
50
|
-
* Divergence from `cmdAuthList` in src/cli.ts: the CLI today returns ALL keys
|
|
51
|
-
* regardless of tenant (single-tenant deployments). The API surface is tenant-
|
|
52
|
-
* scoped because future multi-tenant deployments will share a hippoRoot, and
|
|
53
|
-
* tenant A must not see tenant B's keys. Read-only, so no audit emit.
|
|
54
|
-
*/
|
|
55
|
-
export declare function authList<C extends Context>(ctx: C, opts: {
|
|
56
|
-
active: boolean;
|
|
57
|
-
}): StoreReply<C, ApiKeyListItem[]>;
|
|
58
46
|
type KeyListOpts = {
|
|
59
47
|
active: boolean;
|
|
60
48
|
limit?: number;
|
|
61
49
|
after?: KeysetPosition;
|
|
62
50
|
};
|
|
63
|
-
/** One page of the caller's tenant's keys, newest first, with the row ids a next-page cursor is built from.
|
|
64
|
-
* With `ctx.store`, its keyWrites group reads them; hippo.db is opened only when there is no store. */
|
|
51
|
+
/** One page of the caller's tenant's keys, newest first, with the row ids a next-page cursor is built from. */
|
|
65
52
|
export declare function authListRows<C extends Context>(ctx: C, opts: KeyListOpts): StoreReply<C, ApiKeyListRow[]>;
|
|
66
53
|
export interface AuthRevokeResult {
|
|
67
54
|
ok: true;
|
|
@@ -69,7 +56,7 @@ export interface AuthRevokeResult {
|
|
|
69
56
|
}
|
|
70
57
|
export type AuthRevokeReply<C extends Context> = StoreReply<C, AuthRevokeResult>;
|
|
71
58
|
/** Revoke a key in the caller's tenant: a member API key may revoke only itself, a resolver member only the keys it minted.
|
|
72
|
-
*
|
|
59
|
+
* The revoke and its auth_revoke row commit together on either store, so a failed audit write leaves the key live. */
|
|
73
60
|
export declare function authRevoke<C extends Context>(ctx: C, keyId: string): AuthRevokeReply<C>;
|
|
74
61
|
/**
|
|
75
62
|
* The tenant that owns `keyId`, or undefined for an unknown key. Host admin only: it reads across tenants,
|
package/dist/api/auth.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
// API key management: create, list, revoke, and grant or ungrant restricted scopes.
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { DAY_MS } from '../
|
|
7
|
-
import {
|
|
8
|
-
import { requireGroup } from '../store-port.js';
|
|
9
|
-
import { createAuditOf, createKeyAt, createSelfKeyAt } from '../store/key-writes.js';
|
|
10
|
-
import { selectApiKeyOwner } from '../store/tenant-lookup.js';
|
|
2
|
+
import { ForbiddenError, NotFoundError } from '../core/api-errors.js';
|
|
3
|
+
import { mintApiKey, } from '../store/auth.js';
|
|
4
|
+
import { changeScopeGrant } from '../store/sqlite/local.js';
|
|
5
|
+
import { sqliteSyncStore } from '../store/sqlite/store.js';
|
|
6
|
+
import { DAY_MS } from '../util/time.js';
|
|
7
|
+
import { andThen, notPorted, onStore } from './on-store.js';
|
|
11
8
|
const API_KEY_SUBJECT = 'api_key:';
|
|
12
9
|
/** The key id an API-key actor's subject names, or null for any other actor. */
|
|
13
10
|
function keyIdOfSubject(subject) {
|
|
@@ -25,10 +22,12 @@ function keyIdOfSubject(subject) {
|
|
|
25
22
|
* outranks its minter: a resolver admin is tenant-only, so it mints members.
|
|
26
23
|
*/
|
|
27
24
|
export function authCreate(ctx, opts) {
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
// The key and its auth_create row commit together on either store, so a failed audit write leaves no key.
|
|
26
|
+
return onStore(ctx, (port) => {
|
|
27
|
+
const keyWrites = port.keyWrites ?? notPorted(port, 'keyWrites');
|
|
28
|
+
const { plaintext, mint } = adminKeyMint(ctx, opts);
|
|
29
|
+
return andThen(keyWrites.createApiKey(mint), () => createResult(mint, plaintext));
|
|
30
|
+
});
|
|
32
31
|
}
|
|
33
32
|
/** A key row in the caller's tenant, made here so only its hash ever reaches a store. */
|
|
34
33
|
function newKey(ctx, fields) {
|
|
@@ -51,35 +50,6 @@ function adminKeyMint(ctx, opts) {
|
|
|
51
50
|
function createResult({ key }, plaintext) {
|
|
52
51
|
return { keyId: key.keyId, plaintext, tenantId: key.tenantId, role: key.role };
|
|
53
52
|
}
|
|
54
|
-
async function createThroughStore(ctx, store, opts) {
|
|
55
|
-
const keyWrites = requireGroup(store, 'keyWrites');
|
|
56
|
-
const { plaintext, mint } = adminKeyMint(ctx, opts);
|
|
57
|
-
await keyWrites.createApiKey(mint);
|
|
58
|
-
return createResult(mint, plaintext);
|
|
59
|
-
}
|
|
60
|
-
function createOnHippoDb(ctx, opts) {
|
|
61
|
-
const { plaintext, mint } = adminKeyMint(ctx, opts);
|
|
62
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
63
|
-
try {
|
|
64
|
-
// A resolver admin's keys are found again only through their audit rows, so the key and its row commit together.
|
|
65
|
-
if (ctx.actor.viaAuthResolver) {
|
|
66
|
-
createKeyAt(db, mint);
|
|
67
|
-
return createResult(mint, plaintext);
|
|
68
|
-
}
|
|
69
|
-
insertApiKey(db, mint.key);
|
|
70
|
-
try {
|
|
71
|
-
appendAuditEvent(db, createAuditOf(mint));
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
// Audit must not crash a successful mint.
|
|
75
|
-
reportAuditWriteFailure('auth_create', String(error), mint.key.keyId);
|
|
76
|
-
}
|
|
77
|
-
return createResult(mint, plaintext);
|
|
78
|
-
}
|
|
79
|
-
finally {
|
|
80
|
-
closeHippoDb(db);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
53
|
const MAX_TTL_DAYS = 3650;
|
|
84
54
|
/** A RangeError, not a 4xx, since the operator's config sets these; the ttl ceiling keeps toISOString in range and a departed user's key short-lived. */
|
|
85
55
|
function assertSelfMintOpts({ ttlDays, perSubject }) {
|
|
@@ -90,12 +60,13 @@ function assertSelfMintOpts({ ttlDays, perSubject }) {
|
|
|
90
60
|
throw new RangeError(`authCreateSelf: perSubject must be a whole number of at least 1, got ${String(perSubject)}`);
|
|
91
61
|
}
|
|
92
62
|
}
|
|
93
|
-
/** Mint a member key for the caller an auth resolver vouched for, whatever its role; the binary floor, the cap's revokes, the mint and its audit rows commit or fail together.
|
|
94
|
-
* With `ctx.store`, its keyWrites group runs that transaction; hippo.db is opened only when there is no store. */
|
|
63
|
+
/** Mint a member key for the caller an auth resolver vouched for, whatever its role; the binary floor, the cap's revokes, the mint and its audit rows commit or fail together. */
|
|
95
64
|
export function authCreateSelf(ctx, opts) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
65
|
+
return onStore(ctx, (port) => {
|
|
66
|
+
const keyWrites = port.keyWrites ?? notPorted(port, 'keyWrites');
|
|
67
|
+
const { plaintext, mint } = selfKeyMint(ctx, opts);
|
|
68
|
+
return andThen(keyWrites.createSelfApiKey(mint), () => selfResult(mint, plaintext));
|
|
69
|
+
});
|
|
99
70
|
}
|
|
100
71
|
function selfKeyMint(ctx, opts) {
|
|
101
72
|
if (!ctx.actor.viaAuthResolver) {
|
|
@@ -113,64 +84,17 @@ function selfKeyMint(ctx, opts) {
|
|
|
113
84
|
function selfResult({ key }, plaintext) {
|
|
114
85
|
return { keyId: key.keyId, plaintext, tenantId: key.tenantId, role: 'member', expiresAt: key.expiresAt };
|
|
115
86
|
}
|
|
116
|
-
/**
|
|
117
|
-
async function createSelfThroughStore(ctx, store, opts) {
|
|
118
|
-
const keyWrites = requireGroup(store, 'keyWrites');
|
|
119
|
-
const { plaintext, mint } = selfKeyMint(ctx, opts);
|
|
120
|
-
for (const keyId of await keyWrites.createSelfApiKey(mint))
|
|
121
|
-
forgetVerifiedKey(keyId);
|
|
122
|
-
return selfResult(mint, plaintext);
|
|
123
|
-
}
|
|
124
|
-
function createSelfOnHippoDb(ctx, opts) {
|
|
125
|
-
const { plaintext, mint } = selfKeyMint(ctx, opts);
|
|
126
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
127
|
-
try {
|
|
128
|
-
createSelfKeyAt(db, mint);
|
|
129
|
-
return selfResult(mint, plaintext);
|
|
130
|
-
}
|
|
131
|
-
finally {
|
|
132
|
-
closeHippoDb(db);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* List API keys visible to the calling tenant.
|
|
137
|
-
*
|
|
138
|
-
* Divergence from `cmdAuthList` in src/cli.ts: the CLI today returns ALL keys
|
|
139
|
-
* regardless of tenant (single-tenant deployments). The API surface is tenant-
|
|
140
|
-
* scoped because future multi-tenant deployments will share a hippoRoot, and
|
|
141
|
-
* tenant A must not see tenant B's keys. Read-only, so no audit emit.
|
|
142
|
-
*/
|
|
143
|
-
export function authList(ctx, opts) {
|
|
144
|
-
const keysOf = (rows) => rows.map((r) => r.key);
|
|
145
|
-
const rows = listRows(ctx, opts);
|
|
146
|
-
// SAFETY: the promise comes back exactly when ctx has a store, as StoreReply says.
|
|
147
|
-
return (rows instanceof Promise ? rows.then(keysOf) : keysOf(rows));
|
|
148
|
-
}
|
|
149
|
-
/** One page of the caller's tenant's keys, newest first, with the row ids a next-page cursor is built from.
|
|
150
|
-
* With `ctx.store`, its keyWrites group reads them; hippo.db is opened only when there is no store. */
|
|
87
|
+
/** One page of the caller's tenant's keys, newest first, with the row ids a next-page cursor is built from. */
|
|
151
88
|
export function authListRows(ctx, opts) {
|
|
152
|
-
|
|
153
|
-
return listRows(ctx, opts);
|
|
89
|
+
return onStore(ctx, (port) => listRows(ctx, port, opts));
|
|
154
90
|
}
|
|
155
|
-
function listRows(ctx, opts) {
|
|
156
|
-
|
|
157
|
-
}
|
|
158
|
-
async function listThroughStore(ctx, store, opts) {
|
|
159
|
-
const keyWrites = requireGroup(store, 'keyWrites');
|
|
91
|
+
function listRows(ctx, port, opts) {
|
|
92
|
+
const keyWrites = port.keyWrites ?? notPorted(port, 'keyWrites');
|
|
160
93
|
const keyId = memberKeyIdOf(ctx.actor);
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
166
|
-
try {
|
|
167
|
-
const keyId = memberKeyIdOf(ctx.actor);
|
|
168
|
-
const filter = memberListFilter(ctx.actor, keyId === null ? undefined : selectApiKeyOwner(db, keyId)?.ownerSubject);
|
|
169
|
-
return filter === null ? [] : listApiKeyRows(db, { ...opts, tenantId: ctx.tenantId, ...filter });
|
|
170
|
-
}
|
|
171
|
-
finally {
|
|
172
|
-
closeHippoDb(db);
|
|
173
|
-
}
|
|
94
|
+
return andThen(keyId === null ? undefined : port.findApiKey(keyId), (record) => {
|
|
95
|
+
const filter = memberListFilter(ctx.actor, record?.ownerSubject);
|
|
96
|
+
return filter === null ? [] : keyWrites.listApiKeys({ ...opts, tenantId: ctx.tenantId, ...filter });
|
|
97
|
+
});
|
|
174
98
|
}
|
|
175
99
|
/** The key id of a member API key caller, whose owner decides what it lists; null for any other caller. */
|
|
176
100
|
function memberKeyIdOf(actor) {
|
|
@@ -202,12 +126,17 @@ function assertMayRevoke(ctx, keyId, row) {
|
|
|
202
126
|
}
|
|
203
127
|
}
|
|
204
128
|
/** Revoke a key in the caller's tenant: a member API key may revoke only itself, a resolver member only the keys it minted.
|
|
205
|
-
*
|
|
129
|
+
* The revoke and its auth_revoke row commit together on either store, so a failed audit write leaves the key live. */
|
|
206
130
|
export function authRevoke(ctx, keyId) {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
131
|
+
return onStore(ctx, (port) => {
|
|
132
|
+
const keyAudit = port.keyAudit ?? notPorted(port, 'keyAudit');
|
|
133
|
+
assertMemberKeyRevokesSelf(ctx, keyId);
|
|
134
|
+
return andThen(port.findApiKey(keyId), (record) => {
|
|
135
|
+
assertMayRevoke(ctx, keyId, keyOwnerOf(record));
|
|
136
|
+
const revoke = { tenantId: ctx.tenantId, keyId, actor: ctx.actor.subject, at: new Date().toISOString() };
|
|
137
|
+
return andThen(keyAudit.revokeApiKey(revoke), (revokedAt) => ({ ok: true, revokedAt }));
|
|
138
|
+
});
|
|
139
|
+
});
|
|
211
140
|
}
|
|
212
141
|
function assertMemberKeyRevokesSelf(ctx, keyId) {
|
|
213
142
|
if (ctx.actor.role !== 'admin' && !ctx.actor.viaAuthResolver && keyIdOfSubject(ctx.actor.subject) !== keyId) {
|
|
@@ -217,52 +146,6 @@ function assertMemberKeyRevokesSelf(ctx, keyId) {
|
|
|
217
146
|
function keyOwnerOf(record) {
|
|
218
147
|
return record ? { tenantId: record.tenantId, revokedAt: record.revokedAt, role: record.role, ownerSubject: record.ownerSubject ?? null } : undefined;
|
|
219
148
|
}
|
|
220
|
-
/** The store keeps no handle on this process's verified-key cache, so the key leaves it here once the revoke commits. */
|
|
221
|
-
async function revokeThroughStore(ctx, store, keyId) {
|
|
222
|
-
const keyAudit = requireGroup(store, 'keyAudit');
|
|
223
|
-
assertMemberKeyRevokesSelf(ctx, keyId);
|
|
224
|
-
assertMayRevoke(ctx, keyId, keyOwnerOf(await store.findApiKey(keyId)));
|
|
225
|
-
const revokedAt = await keyAudit.revokeApiKey({ tenantId: ctx.tenantId, keyId, actor: ctx.actor.subject, at: new Date().toISOString() });
|
|
226
|
-
forgetVerifiedKey(keyId);
|
|
227
|
-
return { ok: true, revokedAt };
|
|
228
|
-
}
|
|
229
|
-
/** The auth_revoke row carries the KEY ROW's tenant, as cmdAuthRevoke does, and is skipped for an already-revoked key. */
|
|
230
|
-
function revokeOnHippoDb(ctx, keyId) {
|
|
231
|
-
assertMemberKeyRevokesSelf(ctx, keyId);
|
|
232
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
233
|
-
try {
|
|
234
|
-
const row = selectApiKeyOwner(db, keyId);
|
|
235
|
-
assertMayRevoke(ctx, keyId, row);
|
|
236
|
-
let revokedAt;
|
|
237
|
-
let alreadyRevoked = false;
|
|
238
|
-
if (row.revokedAt) {
|
|
239
|
-
alreadyRevoked = true;
|
|
240
|
-
revokedAt = row.revokedAt;
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
revokeApiKey(db, keyId);
|
|
244
|
-
revokedAt = selectApiKeyOwner(db, keyId)?.revokedAt ?? new Date().toISOString();
|
|
245
|
-
}
|
|
246
|
-
if (!alreadyRevoked) {
|
|
247
|
-
try {
|
|
248
|
-
appendAuditEvent(db, {
|
|
249
|
-
tenantId: row.tenantId, // KEY's tenant, not ctx.tenantId.
|
|
250
|
-
actor: ctx.actor.subject,
|
|
251
|
-
op: 'auth_revoke',
|
|
252
|
-
targetId: keyId,
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
catch (error) {
|
|
256
|
-
// Audit must not crash a successful revoke.
|
|
257
|
-
reportAuditWriteFailure('auth_revoke', String(error), keyId);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
return { ok: true, revokedAt };
|
|
261
|
-
}
|
|
262
|
-
finally {
|
|
263
|
-
closeHippoDb(db);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
149
|
/**
|
|
267
150
|
* The tenant that owns `keyId`, or undefined for an unknown key. Host admin only: it reads across tenants,
|
|
268
151
|
* so the local CLI can run revoke and grant in the key's own tenant.
|
|
@@ -271,56 +154,23 @@ export function authKeyTenant(ctx, keyId) {
|
|
|
271
154
|
if (!ctx.actor.hostAdmin) {
|
|
272
155
|
throw new ForbiddenError('Only the host admin can look up a key across tenants');
|
|
273
156
|
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
return selectApiKeyOwner(db, keyId)?.tenantId;
|
|
277
|
-
}
|
|
278
|
-
finally {
|
|
279
|
-
closeHippoDb(db);
|
|
280
|
-
}
|
|
157
|
+
// Synchronous for the CLI, so it reads hippo.db whatever store ctx names.
|
|
158
|
+
return sqliteSyncStore(ctx.hippoRoot).findApiKey(keyId)?.tenantId;
|
|
281
159
|
}
|
|
282
160
|
/** Grant `keyId` read access to one restricted `scope`. Admin only. */
|
|
283
161
|
export function authGrant(ctx, keyId, scope) {
|
|
284
|
-
return
|
|
162
|
+
return changeGrant(ctx, keyId, scope, 'auth_grant');
|
|
285
163
|
}
|
|
286
164
|
/** Revoke `keyId`'s grant on `scope`. Same authorization and lookup rules as authGrant. */
|
|
287
165
|
export function authUngrant(ctx, keyId, scope) {
|
|
288
|
-
return
|
|
166
|
+
return changeGrant(ctx, keyId, scope, 'auth_ungrant');
|
|
289
167
|
}
|
|
290
|
-
|
|
168
|
+
/** hippo.db only: both callers are synchronous published functions, so no store's Promise can answer them. */
|
|
169
|
+
function changeGrant(ctx, keyId, scope, op) {
|
|
291
170
|
if (ctx.actor.role !== 'admin') {
|
|
292
171
|
throw new ForbiddenError('Only an admin key can change scope grants');
|
|
293
172
|
}
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
const row = selectApiKeyOwner(db, keyId);
|
|
297
|
-
if (!row || row.tenantId !== ctx.tenantId) {
|
|
298
|
-
throw new NotFoundError(`Unknown key_id: ${keyId}`);
|
|
299
|
-
}
|
|
300
|
-
if (op === 'auth_grant' && row.revokedAt) {
|
|
301
|
-
throw new ConflictError(`${keyId} is revoked; a grant on it would never apply`);
|
|
302
|
-
}
|
|
303
|
-
if (op === 'auth_grant' && /^personal:/i.test(scope)) {
|
|
304
|
-
throw new BadRequestError(`${scope} is a personal scope: only its owner reads it, and no grant can change that`);
|
|
305
|
-
}
|
|
306
|
-
if (!isRestrictedScope(scope)) {
|
|
307
|
-
throw new BadRequestError(`${scope} is not a restricted scope; it is already readable by default`);
|
|
308
|
-
}
|
|
309
|
-
if (op === 'auth_grant')
|
|
310
|
-
grantScope(db, keyId, scope);
|
|
311
|
-
else
|
|
312
|
-
ungrantScope(db, keyId, scope);
|
|
313
|
-
try {
|
|
314
|
-
appendAuditEvent(db, { tenantId: ctx.tenantId, actor: ctx.actor.subject, op, targetId: keyId, metadata: { scope } });
|
|
315
|
-
}
|
|
316
|
-
catch (err) {
|
|
317
|
-
// Audit must not undo a grant change that already committed; surface it instead.
|
|
318
|
-
reportAuditWriteFailure(op, String(err), keyId);
|
|
319
|
-
}
|
|
320
|
-
return { ok: true };
|
|
321
|
-
}
|
|
322
|
-
finally {
|
|
323
|
-
closeHippoDb(db);
|
|
324
|
-
}
|
|
173
|
+
changeScopeGrant(ctx.hippoRoot, { tenantId: ctx.tenantId, keyId, scope, op, actor: ctx.actor.subject });
|
|
174
|
+
return { ok: true };
|
|
325
175
|
}
|
|
326
176
|
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HippoConfig } from '../core/config.js';
|
|
2
|
+
export declare const autoSleepInFlight: Set<string>;
|
|
3
|
+
export interface AutoSleepDue {
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
count: number;
|
|
6
|
+
threshold: number;
|
|
7
|
+
due: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** Counts only when enabled: the count opens the store. */
|
|
10
|
+
export declare function autoSleepDue(hippoRoot: string, tenantId: string, config: HippoConfig['autoSleep']): AutoSleepDue;
|
|
11
|
+
/** One run per store at a time; `allowed` is the caller's own gate. Consolidation is host-wide, so only the host tenant may start it. */
|
|
12
|
+
export declare function startAutoSleepIfDue(hippoRoot: string, tenantId: string, config: HippoConfig['autoSleep'], allowed: boolean): void;
|
|
13
|
+
//# sourceMappingURL=auto-sleep.d.ts.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// When a write starts a background sleep; the MCP remember tool and the session-close hook share it.
|
|
2
|
+
import { errorMessage, log } from '../util/log.js';
|
|
3
|
+
import { countCreatedSinceLastSleep } from '../store/index-and-stats.js';
|
|
4
|
+
import { consolidate } from '../consolidate/sleep.js';
|
|
5
|
+
import { outsideRequestStores, runWithRequestStores, scopedBusyWait } from '../db/index.js';
|
|
6
|
+
import { resolveTenantId } from '../store/tenant.js';
|
|
7
|
+
export const autoSleepInFlight = new Set();
|
|
8
|
+
/** Counts only when enabled: the count opens the store. */
|
|
9
|
+
export function autoSleepDue(hippoRoot, tenantId, config) {
|
|
10
|
+
const { enabled, threshold } = config;
|
|
11
|
+
const count = enabled ? countCreatedSinceLastSleep(hippoRoot, tenantId) : 0;
|
|
12
|
+
return { enabled, count, threshold, due: enabled && count >= threshold };
|
|
13
|
+
}
|
|
14
|
+
/** One run per store at a time; `allowed` is the caller's own gate. Consolidation is host-wide, so only the host tenant may start it. */
|
|
15
|
+
export function startAutoSleepIfDue(hippoRoot, tenantId, config, allowed) {
|
|
16
|
+
if (!allowed ||
|
|
17
|
+
!config.enabled ||
|
|
18
|
+
tenantId !== resolveTenantId({}) ||
|
|
19
|
+
autoSleepInFlight.has(hippoRoot) ||
|
|
20
|
+
!autoSleepDue(hippoRoot, tenantId, config).due)
|
|
21
|
+
return;
|
|
22
|
+
autoSleepInFlight.add(hippoRoot);
|
|
23
|
+
// Fire-and-forget (never block the response); an unhandled rejection would kill the server, so log it.
|
|
24
|
+
// Its own scope: the call's closes a handle the sleep still holds across its pauses, but the caller's lock wait carries over.
|
|
25
|
+
const busyWaitMs = scopedBusyWait();
|
|
26
|
+
outsideRequestStores(() => runWithRequestStores(() => consolidate(hippoRoot), { busyWaitMs }))
|
|
27
|
+
.catch((err) => {
|
|
28
|
+
log.error(`auto-sleep consolidate failed (tenant ${tenantId}): ${errorMessage(err)}`);
|
|
29
|
+
})
|
|
30
|
+
.finally(() => autoSleepInFlight.delete(hippoRoot));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=auto-sleep.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** A minimal age reference: a memory id plus its ISO-8601 creation timestamp
|
|
2
|
-
* (MemoryEntry.created, canonical ISO per the src/memory.ts invariant). */
|
|
2
|
+
* (MemoryEntry.created, canonical ISO per the src/core/memory.ts invariant). */
|
|
3
3
|
export interface AgeRef {
|
|
4
4
|
id: string;
|
|
5
5
|
created: string;
|
|
@@ -41,7 +41,7 @@ export interface DetectAvailabilityBiasOpts {
|
|
|
41
41
|
/** Minimum older-passed-over count required to fire. Default 3. */
|
|
42
42
|
minOlderPassedOver?: number;
|
|
43
43
|
}
|
|
44
|
-
export declare const DEFAULT_RECENCY_WINDOW_MS
|
|
44
|
+
export declare const DEFAULT_RECENCY_WINDOW_MS = 86400000;
|
|
45
45
|
export declare const DEFAULT_RECENT_FRACTION_THRESHOLD = 0.7;
|
|
46
46
|
export declare const DEFAULT_MIN_RETURNED = 3;
|
|
47
47
|
export declare const DEFAULT_MIN_POOL = 10;
|