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
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const SESSION_DIGEST_TAG = 'session-digest';
|
|
2
|
+
/** Facts extracted from a digest and DAG summaries over one inherit its tag, but they are not the digest itself. */
|
|
3
|
+
export function isSessionDigestRow(entry) {
|
|
4
|
+
return entry.source === SESSION_DIGEST_TAG && entry.tags.includes(SESSION_DIGEST_TAG) && !entry.extracted_from;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=session-digest-row.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MemoryEntry } from '
|
|
1
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
2
2
|
import { type ActionBody } from './dashboard-params.js';
|
|
3
3
|
/** What an action hands the router: a status, a JSON body, and whether the store changed. */
|
|
4
4
|
export interface ActionResult {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// The four dashboard writes, each a thin call into an existing store or api function; the router owns HTTP and the cache.
|
|
2
|
-
import * as api from '
|
|
3
|
-
import { NotFoundError } from '
|
|
4
|
-
import { listTouchableConflicts, resolveConflict } from '
|
|
5
|
-
import { readEntry } from '
|
|
6
|
-
import { writeEntry } from '
|
|
2
|
+
import * as api from '../api/index.js';
|
|
3
|
+
import { NotFoundError } from '../core/api-errors.js';
|
|
4
|
+
import { listTouchableConflicts, resolveConflict } from '../store/conflicts.js';
|
|
5
|
+
import { readEntry } from '../store/entry-reads.js';
|
|
6
|
+
import { writeEntry } from '../store/entry-writes.js';
|
|
7
7
|
import { ParamError, parseMemoryId } from './dashboard-params.js';
|
|
8
8
|
import { isLiveMemory } from './dashboard-snapshot.js';
|
|
9
9
|
const ACTOR = 'dashboard';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type MemoryEntry } from '
|
|
1
|
+
import { type MemoryEntry } from '../core/memory.js';
|
|
2
2
|
import { type Snapshot } from './dashboard-snapshot.js';
|
|
3
3
|
import type { MemoryQuery } from './dashboard-params.js';
|
|
4
4
|
import type { MemoryDetail, MemoryPage, Overview, ProjectDetail, SearchResult } from './dashboard-types.js';
|
|
@@ -10,6 +10,11 @@ export declare function buildProjectDetail(snap: Snapshot, key: string): Project
|
|
|
10
10
|
export declare function buildMemoryPage(snap: Snapshot, key: string, query: MemoryQuery): MemoryPage | null;
|
|
11
11
|
/** Substring search over content and tags across every project; it reads the snapshot and never touches recall. */
|
|
12
12
|
export declare function buildSearch(snap: Snapshot, text: string): SearchResult;
|
|
13
|
+
export interface MemoryDetailOptions {
|
|
14
|
+
readonly snapshotId: number;
|
|
15
|
+
readonly nowMs: number;
|
|
16
|
+
readonly embedded: boolean;
|
|
17
|
+
}
|
|
13
18
|
/** Full detail read fresh from the store, never from the snapshot, so the drawer is current inside the coalescing window. */
|
|
14
|
-
export declare function buildMemoryDetail(hippoRoot: string, tenantId: string, entry: MemoryEntry,
|
|
19
|
+
export declare function buildMemoryDetail(hippoRoot: string, tenantId: string, entry: MemoryEntry, options: MemoryDetailOptions): MemoryDetail;
|
|
15
20
|
//# sourceMappingURL=dashboard-queries.d.ts.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// Read models over a snapshot: overview, project, memory page, search, and the fresh single-memory detail.
|
|
2
|
-
import { calculateStrength } from '
|
|
3
|
-
import {
|
|
4
|
-
import { readEntry } from './store/entry-reads.js';
|
|
2
|
+
import { calculateStrength } from '../core/memory.js';
|
|
3
|
+
import { loadOpenConflictsOf } from '../store/conflicts.js';
|
|
5
4
|
import { BANDS, DAY_MS, LAYERS, isLiveMemory, memoryFacts, projectIdentity, } from './dashboard-snapshot.js';
|
|
6
5
|
const SERIES_DAYS = 90;
|
|
7
6
|
/** The server words each delta for this range; the client re-slices the series for 7d and 90d. */
|
|
@@ -297,12 +296,8 @@ export function buildSearch(snap, text) {
|
|
|
297
296
|
}
|
|
298
297
|
function openConflictsOf(hippoRoot, tenantId, entry, nowMs) {
|
|
299
298
|
const out = [];
|
|
300
|
-
for (const c of
|
|
301
|
-
if (
|
|
302
|
-
continue;
|
|
303
|
-
const otherId = c.memory_a_id === entry.id ? c.memory_b_id : c.memory_a_id;
|
|
304
|
-
const other = readEntry(hippoRoot, otherId, tenantId);
|
|
305
|
-
if (!other || !isLiveMemory(other))
|
|
299
|
+
for (const { conflict: c, other } of loadOpenConflictsOf(hippoRoot, tenantId, entry.id)) {
|
|
300
|
+
if (!isLiveMemory(other))
|
|
306
301
|
continue;
|
|
307
302
|
out.push({
|
|
308
303
|
id: c.id,
|
|
@@ -319,7 +314,8 @@ function openConflictsOf(hippoRoot, tenantId, entry, nowMs) {
|
|
|
319
314
|
return out;
|
|
320
315
|
}
|
|
321
316
|
/** Full detail read fresh from the store, never from the snapshot, so the drawer is current inside the coalescing window. */
|
|
322
|
-
export function buildMemoryDetail(hippoRoot, tenantId, entry,
|
|
317
|
+
export function buildMemoryDetail(hippoRoot, tenantId, entry, options) {
|
|
318
|
+
const { snapshotId, nowMs, embedded } = options;
|
|
323
319
|
const f = memoryFacts(entry, nowMs);
|
|
324
320
|
const project = projectIdentity(entry.origin_project);
|
|
325
321
|
return {
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import { Layer as MemoryLayer, type MemoryEntry } from '
|
|
2
|
-
import type
|
|
1
|
+
import { Layer as MemoryLayer, type ConfidenceInputs, type MemoryEntry, type StrengthInputs } from '../core/memory.js';
|
|
2
|
+
import { type DashboardRow, type ExcludedCounts } from '../store/dashboard-reads.js';
|
|
3
|
+
import type { MemoryConflict } from '../store/rows.js';
|
|
3
4
|
import type { Band, ChipCounts, Layer, Overview, ProjectKind, ProjectSummary, ScatterGrid, ScatterPoints } from './dashboard-types.js';
|
|
4
|
-
|
|
5
|
+
import { DAY_MS } from '../util/time.js';
|
|
6
|
+
export { DAY_MS };
|
|
5
7
|
export declare const LAYERS: readonly Layer[];
|
|
6
8
|
export declare const BANDS: readonly Band[];
|
|
7
|
-
/** An outside commit rebuilds the snapshot at most this often. */
|
|
8
|
-
export declare const COALESCE_MS = 10000;
|
|
9
|
-
/** Projected strengths track the clock, so the snapshot is rebuilt at least this often. */
|
|
10
|
-
export declare const TTL_MS: number;
|
|
11
9
|
/** The one predicate for "shown on the dashboard": not superseded, not archived, not quarantined. */
|
|
12
10
|
export declare function isLiveMemory(entry: Pick<MemoryEntry, 'superseded_by' | 'kind' | 'scope'>): boolean;
|
|
13
11
|
/** Wire key, display name and kind of a project. */
|
|
@@ -34,7 +32,7 @@ export interface MemoryFacts {
|
|
|
34
32
|
wrong: boolean;
|
|
35
33
|
}
|
|
36
34
|
/** Strength now and at +7d and +30d, band, age and the confidence split for one entry at `nowMs`. */
|
|
37
|
-
export declare function memoryFacts(entry: MemoryEntry, nowMs: number): MemoryFacts;
|
|
35
|
+
export declare function memoryFacts(entry: StrengthInputs & ConfidenceInputs & Pick<MemoryEntry, 'layer'>, nowMs: number): MemoryFacts;
|
|
38
36
|
/** One live memory as the snapshot holds it: numbers and short strings only, never the full entry. */
|
|
39
37
|
export interface Fact {
|
|
40
38
|
id: string;
|
|
@@ -116,7 +114,9 @@ export interface SnapshotInput {
|
|
|
116
114
|
id: number;
|
|
117
115
|
tenantId: string;
|
|
118
116
|
nowMs: number;
|
|
119
|
-
entries: readonly
|
|
117
|
+
entries: readonly DashboardRow[];
|
|
118
|
+
/** Rows counted out before `entries` was read; any entry here that is not live adds to them. */
|
|
119
|
+
excluded?: ExcludedCounts;
|
|
120
120
|
openConflicts: readonly Pick<MemoryConflict, 'memory_a_id' | 'memory_b_id'>[];
|
|
121
121
|
embeddedIds: ReadonlySet<string> | null;
|
|
122
122
|
}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
// The dashboard's read model: one in-memory snapshot of a tenant's live memories, grouped by origin project.
|
|
2
2
|
// Pure build functions plus one cache; the queries over it live in dashboard-queries.ts.
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
import { storedVectorIds } from './vector-store.js';
|
|
10
|
-
export const DAY_MS = 86_400_000;
|
|
3
|
+
import { calculateStrength, facetsOf, netWrong, Layer as MemoryLayer } from '../core/memory.js';
|
|
4
|
+
import { isQuarantineScope } from '../trust/quarantine.js';
|
|
5
|
+
import { listMemoryConflicts } from '../store/conflicts.js';
|
|
6
|
+
import { DashboardConnection, loadDashboardRows } from '../store/dashboard-reads.js';
|
|
7
|
+
import { DAY_MS } from '../util/time.js';
|
|
8
|
+
export { DAY_MS };
|
|
11
9
|
export const LAYERS = ['buffer', 'episodic', 'semantic', 'trace'];
|
|
12
10
|
// Wire order of `Band`, and the order the mockup sorts bands in.
|
|
13
11
|
export const BANDS = ['pinned', 'strong', 'fading', 'atRisk'];
|
|
@@ -18,9 +16,9 @@ const BAND_AT_RISK = 3;
|
|
|
18
16
|
const CONFIDENCE_ORDER = ['verified', 'observed', 'inferred', 'stale'];
|
|
19
17
|
const HEAD_CHARS = 240;
|
|
20
18
|
/** An outside commit rebuilds the snapshot at most this often. */
|
|
21
|
-
|
|
19
|
+
const COALESCE_MS = 10_000;
|
|
22
20
|
/** Projected strengths track the clock, so the snapshot is rebuilt at least this often. */
|
|
23
|
-
|
|
21
|
+
const TTL_MS = 5 * 60_000;
|
|
24
22
|
/** The one predicate for "shown on the dashboard": not superseded, not archived, not quarantined. */
|
|
25
23
|
export function isLiveMemory(entry) {
|
|
26
24
|
return !entry.superseded_by && (entry.kind === 'raw' || entry.kind === 'distilled') && !isQuarantineScope(entry.scope);
|
|
@@ -52,7 +50,7 @@ export function memoryFacts(entry, nowMs) {
|
|
|
52
50
|
const strength = calculateStrength(entry, now);
|
|
53
51
|
const strength7d = calculateStrength(entry, new Date(nowMs + 7 * DAY_MS));
|
|
54
52
|
const strength30d = calculateStrength(entry, new Date(nowMs + 30 * DAY_MS));
|
|
55
|
-
const facets =
|
|
53
|
+
const facets = facetsOf(entry, now);
|
|
56
54
|
const band = entry.pinned ? BAND_PINNED : strength30d < 0.2 ? BAND_AT_RISK : strength >= 0.5 ? BAND_STRONG : BAND_FADING;
|
|
57
55
|
return {
|
|
58
56
|
strength,
|
|
@@ -144,30 +142,42 @@ function toFact(entry, f, project, embedded, createdMs) {
|
|
|
144
142
|
createdMs,
|
|
145
143
|
};
|
|
146
144
|
}
|
|
145
|
+
function tallyExcluded(entry, excluded) {
|
|
146
|
+
if (isQuarantineScope(entry.scope))
|
|
147
|
+
excluded.quarantined++;
|
|
148
|
+
else if (entry.superseded_by || entry.kind === 'superseded')
|
|
149
|
+
excluded.superseded++;
|
|
150
|
+
else if (entry.kind === 'archived')
|
|
151
|
+
excluded.archived++;
|
|
152
|
+
}
|
|
153
|
+
function draftIndexFor(identity, projectIndex, drafts) {
|
|
154
|
+
let p = projectIndex.get(identity.key);
|
|
155
|
+
if (p === undefined) {
|
|
156
|
+
p = drafts.length;
|
|
157
|
+
projectIndex.set(identity.key, p);
|
|
158
|
+
drafts.push(newDraft(identity));
|
|
159
|
+
}
|
|
160
|
+
return p;
|
|
161
|
+
}
|
|
162
|
+
function finishProject(d) {
|
|
163
|
+
d.summary.atRisk = d.summary.bands.atRisk;
|
|
164
|
+
d.summary.share = d.summary.live > 0 ? d.summary.atRisk / d.summary.live : 0;
|
|
165
|
+
d.summary.lastRetrievedDays = d.summary.live > 0 ? round1(d.lastDays) : null;
|
|
166
|
+
return { summary: d.summary, members: Int32Array.from(d.members), firstCreatedMs: d.firstCreatedMs };
|
|
167
|
+
}
|
|
147
168
|
/** Builds the snapshot from already-loaded rows; it touches no store, so tests can feed it directly. */
|
|
148
169
|
export function buildSnapshot(input) {
|
|
149
170
|
const { entries, embeddedIds, nowMs } = input;
|
|
150
|
-
const excluded = { superseded: 0, archived: 0, quarantined: 0 };
|
|
171
|
+
const excluded = { superseded: 0, archived: 0, quarantined: 0, ...input.excluded };
|
|
151
172
|
const facts = [];
|
|
152
173
|
const projectIndex = new Map();
|
|
153
174
|
const drafts = [];
|
|
154
175
|
for (const entry of entries) {
|
|
155
176
|
if (!isLiveMemory(entry)) {
|
|
156
|
-
|
|
157
|
-
excluded.quarantined++;
|
|
158
|
-
else if (entry.superseded_by || entry.kind === 'superseded')
|
|
159
|
-
excluded.superseded++;
|
|
160
|
-
else if (entry.kind === 'archived')
|
|
161
|
-
excluded.archived++;
|
|
177
|
+
tallyExcluded(entry, excluded);
|
|
162
178
|
continue;
|
|
163
179
|
}
|
|
164
|
-
const
|
|
165
|
-
let p = projectIndex.get(identity.key);
|
|
166
|
-
if (p === undefined) {
|
|
167
|
-
p = drafts.length;
|
|
168
|
-
projectIndex.set(identity.key, p);
|
|
169
|
-
drafts.push(newDraft(identity));
|
|
170
|
-
}
|
|
180
|
+
const p = draftIndexFor(projectIdentity(entry.origin_project), projectIndex, drafts);
|
|
171
181
|
const f = memoryFacts(entry, nowMs);
|
|
172
182
|
const embedded = embeddedIds !== null && embeddedIds.has(entry.id);
|
|
173
183
|
const parsedCreated = Date.parse(entry.created);
|
|
@@ -187,12 +197,7 @@ export function buildSnapshot(input) {
|
|
|
187
197
|
facts.push(toFact(entry, f, p, embedded, Number.isFinite(parsedCreated) ? parsedCreated : nowMs));
|
|
188
198
|
}
|
|
189
199
|
const openConflicts = countOpenConflicts(facts, drafts.map((d) => d.summary), input.openConflicts);
|
|
190
|
-
const projects = drafts.map(
|
|
191
|
-
d.summary.atRisk = d.summary.bands.atRisk;
|
|
192
|
-
d.summary.share = d.summary.live > 0 ? d.summary.atRisk / d.summary.live : 0;
|
|
193
|
-
d.summary.lastRetrievedDays = d.summary.live > 0 ? round1(d.lastDays) : null;
|
|
194
|
-
return { summary: d.summary, members: Int32Array.from(d.members), firstCreatedMs: d.firstCreatedMs };
|
|
195
|
-
});
|
|
200
|
+
const projects = drafts.map(finishProject);
|
|
196
201
|
const embeddedTotal = projects.reduce((sum, p) => sum + p.summary.embedded, 0);
|
|
197
202
|
return {
|
|
198
203
|
id: input.id,
|
|
@@ -227,82 +232,74 @@ function countOpenConflicts(facts, summaries, conflicts) {
|
|
|
227
232
|
}
|
|
228
233
|
return total;
|
|
229
234
|
}
|
|
235
|
+
function cacheStillServes(hit, want, wallMs) {
|
|
236
|
+
const age = wallMs - hit.builtAtMs;
|
|
237
|
+
return hit.snapshot.tenantId === want.tenantId
|
|
238
|
+
&& (hit.dataVersion !== null || want.dataVersion === null)
|
|
239
|
+
&& age < TTL_MS
|
|
240
|
+
&& (hit.dataVersion === want.dataVersion || age < COALESCE_MS);
|
|
241
|
+
}
|
|
230
242
|
// Keeps ids rising between two services created in the same millisecond of one process.
|
|
231
243
|
let highestIssuedId = 0;
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
244
|
+
class SnapshotCacheService {
|
|
245
|
+
hippoRoot;
|
|
246
|
+
now;
|
|
247
|
+
cacheClock;
|
|
248
|
+
connection;
|
|
249
|
+
cached = null;
|
|
236
250
|
// Wall clock, not `now`, so ids keep rising across server restarts and a client holding an old tab never sees a lower one.
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
251
|
+
lastId = Math.max(Date.now(), highestIssuedId);
|
|
252
|
+
lastEmbeddedIds;
|
|
253
|
+
constructor(hippoRoot, now, cacheClock) {
|
|
254
|
+
this.hippoRoot = hippoRoot;
|
|
255
|
+
this.now = now;
|
|
256
|
+
this.cacheClock = cacheClock;
|
|
257
|
+
this.connection = new DashboardConnection(hippoRoot);
|
|
258
|
+
}
|
|
259
|
+
build(tenantId, dv, nowMs) {
|
|
260
|
+
const rows = dv === null ? null : loadDashboardRows(this.hippoRoot, tenantId);
|
|
261
|
+
const openConflicts = dv === null ? [] : listMemoryConflicts(this.hippoRoot, 'open', tenantId);
|
|
262
|
+
this.lastId += 1;
|
|
263
|
+
highestIssuedId = Math.max(highestIssuedId, this.lastId);
|
|
264
|
+
// After loadDashboardRows, whose writable open has run any pending migration and legacy embeddings.json import.
|
|
265
|
+
this.lastEmbeddedIds = this.connection.embeddedIds();
|
|
266
|
+
return buildSnapshot({ id: this.lastId, tenantId, nowMs, entries: rows?.live ?? [], excluded: rows?.excluded, openConflicts, embeddedIds: this.lastEmbeddedIds });
|
|
267
|
+
}
|
|
268
|
+
get(tenantId, fresh = false) {
|
|
269
|
+
const nowMs = this.now();
|
|
270
|
+
// A frozen eval clock (HIPPO_FAKE_NOW) would never age the cache, so reuse is timed on its own clock.
|
|
271
|
+
const wallMs = this.cacheClock();
|
|
272
|
+
// Read before the build, so a commit that lands during it shows on the next read.
|
|
273
|
+
const dv = this.connection.dataVersion();
|
|
274
|
+
const hit = this.cached;
|
|
275
|
+
if (hit !== null && !fresh) {
|
|
276
|
+
if (cacheStillServes(hit, { tenantId, dataVersion: dv }, wallMs))
|
|
277
|
+
return hit.snapshot;
|
|
244
278
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
return
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
const wallMs = cacheClock();
|
|
271
|
-
// Read before the build, so a commit that lands during it shows on the next read.
|
|
272
|
-
const dv = dataVersion();
|
|
273
|
-
const hit = cached;
|
|
274
|
-
if (hit !== null && !fresh) {
|
|
275
|
-
const age = wallMs - hit.builtAtMs;
|
|
276
|
-
const reusable = hit.snapshot.tenantId === tenantId
|
|
277
|
-
&& (hit.dataVersion !== null || dv === null)
|
|
278
|
-
&& age < TTL_MS
|
|
279
|
-
&& (hit.dataVersion === dv || age < COALESCE_MS);
|
|
280
|
-
if (reusable)
|
|
281
|
-
return hit.snapshot;
|
|
282
|
-
}
|
|
283
|
-
const snapshot = build(tenantId, dv, nowMs);
|
|
284
|
-
cached = { snapshot, dataVersion: dv, builtAtMs: wallMs };
|
|
285
|
-
return snapshot;
|
|
286
|
-
},
|
|
287
|
-
invalidate() {
|
|
288
|
-
cached = null;
|
|
289
|
-
},
|
|
290
|
-
currentId() {
|
|
291
|
-
return lastId;
|
|
292
|
-
},
|
|
293
|
-
embeddedIds() {
|
|
294
|
-
if (lastEmbeddedIds !== undefined)
|
|
295
|
-
return lastEmbeddedIds;
|
|
296
|
-
dataVersion();
|
|
297
|
-
return readEmbeddedIds();
|
|
298
|
-
},
|
|
299
|
-
close() {
|
|
300
|
-
if (db !== null)
|
|
301
|
-
closeHippoDb(db);
|
|
302
|
-
db = null;
|
|
303
|
-
cached = null;
|
|
304
|
-
lastEmbeddedIds = undefined;
|
|
305
|
-
},
|
|
306
|
-
};
|
|
279
|
+
const snapshot = this.build(tenantId, dv, nowMs);
|
|
280
|
+
this.cached = { snapshot, dataVersion: dv, builtAtMs: wallMs };
|
|
281
|
+
return snapshot;
|
|
282
|
+
}
|
|
283
|
+
invalidate() {
|
|
284
|
+
this.cached = null;
|
|
285
|
+
}
|
|
286
|
+
currentId() {
|
|
287
|
+
return this.lastId;
|
|
288
|
+
}
|
|
289
|
+
embeddedIds() {
|
|
290
|
+
if (this.lastEmbeddedIds !== undefined)
|
|
291
|
+
return this.lastEmbeddedIds;
|
|
292
|
+
this.connection.dataVersion();
|
|
293
|
+
return this.connection.embeddedIds();
|
|
294
|
+
}
|
|
295
|
+
close() {
|
|
296
|
+
this.connection.close();
|
|
297
|
+
this.cached = null;
|
|
298
|
+
this.lastEmbeddedIds = undefined;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the snapshot cache; `now` dates the strength projections, `cacheClock` ages the cache. */
|
|
302
|
+
export function createSnapshotService(hippoRoot, now, cacheClock = Date.now) {
|
|
303
|
+
return new SnapshotCacheService(hippoRoot, now, cacheClock);
|
|
307
304
|
}
|
|
308
305
|
//# sourceMappingURL=dashboard-snapshot.js.map
|
|
@@ -2,18 +2,19 @@
|
|
|
2
2
|
import * as http from 'http';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import * as fs from 'fs';
|
|
5
|
-
import { randomBytes, timingSafeEqual } from 'crypto';
|
|
6
|
-
import { evalNow } from '
|
|
7
|
-
import { readEntry } from '
|
|
8
|
-
import { listCards } from '
|
|
9
|
-
import { resolveTenantId } from '
|
|
10
|
-
import { loadCardDetail } from '
|
|
11
|
-
import { closeAfterReply, isCrossSite, LOOPBACK_HOST_HEADER } from '
|
|
12
|
-
import { log } from '
|
|
5
|
+
import { createHash, randomBytes, randomUUID, timingSafeEqual } from 'crypto';
|
|
6
|
+
import { evalNow } from '../core/ablation.js';
|
|
7
|
+
import { readEntry } from '../store/entry-reads.js';
|
|
8
|
+
import { listCards } from '../store/cards.js';
|
|
9
|
+
import { resolveTenantId } from '../store/tenant.js';
|
|
10
|
+
import { loadCardDetail } from '../store/card-detail.js';
|
|
11
|
+
import { bodyDeadlineMs, BodyTimeoutError, closeAfterReply, isCrossSite, LOOPBACK_HOST_HEADER } from '../util/http-util.js';
|
|
12
|
+
import { errorMessage, log } from '../util/log.js';
|
|
13
13
|
import { createSnapshotService, isLiveMemory } from './dashboard-snapshot.js';
|
|
14
14
|
import { buildMemoryDetail, buildMemoryPage, buildOverview, buildProjectDetail, buildSearch, } from './dashboard-queries.js';
|
|
15
15
|
import { forgetMemory, markWrong, pinMemory, resolveOpenConflict, } from './dashboard-actions.js';
|
|
16
16
|
import { ParamError, parseActionBody, parseConflictId, parseMemoryId, parseMemoryQuery, parseSearchText, } from './dashboard-params.js';
|
|
17
|
+
import { runWithRequestId } from '../util/request-scope.js';
|
|
17
18
|
const MIME_TYPES = {
|
|
18
19
|
'.html': 'text/html; charset=utf-8',
|
|
19
20
|
'.js': 'application/javascript; charset=utf-8',
|
|
@@ -72,6 +73,10 @@ function readActionBody(req) {
|
|
|
72
73
|
const chunks = [];
|
|
73
74
|
let size = 0;
|
|
74
75
|
let aborted = false;
|
|
76
|
+
const deadlineMs = bodyDeadlineMs();
|
|
77
|
+
const timer = setTimeout(() => reject(new BodyTimeoutError(`request body not received within ${deadlineMs} ms`)), deadlineMs);
|
|
78
|
+
// Unref: a request that already failed another way must not hold the process open for the rest of the deadline.
|
|
79
|
+
timer.unref();
|
|
75
80
|
req.on('data', (chunk) => {
|
|
76
81
|
size += chunk.length;
|
|
77
82
|
if (size <= BODY_MAX_BYTES)
|
|
@@ -83,6 +88,7 @@ function readActionBody(req) {
|
|
|
83
88
|
});
|
|
84
89
|
req.on('error', reject);
|
|
85
90
|
req.on('end', () => {
|
|
91
|
+
clearTimeout(timer);
|
|
86
92
|
if (size > BODY_MAX_BYTES)
|
|
87
93
|
return reject(new ParamError(`Body must be at most ${BODY_MAX_BYTES} bytes`));
|
|
88
94
|
try {
|
|
@@ -123,7 +129,7 @@ function handleRead(ctx, segments) {
|
|
|
123
129
|
return sendOrNotFound(res, null);
|
|
124
130
|
const snapshotId = snapshots.get(tenantId, fresh).id;
|
|
125
131
|
const embedded = snapshots.embeddedIds()?.has(entry.id) ?? false;
|
|
126
|
-
return sendOrNotFound(res, buildMemoryDetail(hippoRoot, tenantId, entry, snapshotId, ctx.now(), embedded));
|
|
132
|
+
return sendOrNotFound(res, buildMemoryDetail(hippoRoot, tenantId, entry, { snapshotId, nowMs: ctx.now(), embedded }));
|
|
127
133
|
}
|
|
128
134
|
if (head === 'search' && segments.length === 2) {
|
|
129
135
|
return sendOrNotFound(res, buildSearch(snapshots.get(tenantId, fresh), parseSearchText(url.searchParams)));
|
|
@@ -175,7 +181,7 @@ async function handlePost(ctx, segments) {
|
|
|
175
181
|
if (result.entry) {
|
|
176
182
|
// The write is committed, so a rebuild failure must not turn it into a 500: the next read rebuilds.
|
|
177
183
|
const embedded = snapshots.embeddedIds()?.has(result.entry.id) ?? false;
|
|
178
|
-
const detail = buildMemoryDetail(hippoRoot, tenantId, result.entry, snapshots.currentId(), ctx.now(), embedded);
|
|
184
|
+
const detail = buildMemoryDetail(hippoRoot, tenantId, result.entry, { snapshotId: snapshots.currentId(), nowMs: ctx.now(), embedded });
|
|
179
185
|
jsonResponse(res, detail, result.status);
|
|
180
186
|
}
|
|
181
187
|
else {
|
|
@@ -183,21 +189,43 @@ async function handlePost(ctx, segments) {
|
|
|
183
189
|
}
|
|
184
190
|
return true;
|
|
185
191
|
}
|
|
192
|
+
// One style block, not style attributes, so the policy below can name its hash and allow no other inline style.
|
|
193
|
+
const NOT_BUILT_CSS = "body{font-family:Georgia,'Palatino Linotype',serif;max-width:640px;margin:60px auto;padding:24px;line-height:1.6;background:#f4efe6;color:#3a3228}" +
|
|
194
|
+
'h1{color:#c45c3c}' +
|
|
195
|
+
'pre{background:#faf7f2;padding:16px;border:1px solid #c4b9a8;border-radius:3px;font-family:Consolas,monospace}';
|
|
196
|
+
// Memory text is written by other tools and people, so every reply tells the browser to load code only from this server and never to frame, sniff or name the page elsewhere.
|
|
197
|
+
const SECURITY_HEADERS = {
|
|
198
|
+
'Content-Security-Policy': [
|
|
199
|
+
"default-src 'none'",
|
|
200
|
+
"script-src 'self'",
|
|
201
|
+
`style-src 'self' 'sha256-${createHash('sha256').update(NOT_BUILT_CSS).digest('base64')}'`,
|
|
202
|
+
"img-src 'self' data:",
|
|
203
|
+
"font-src 'self'",
|
|
204
|
+
"connect-src 'self'",
|
|
205
|
+
"base-uri 'none'",
|
|
206
|
+
"form-action 'none'",
|
|
207
|
+
"frame-ancestors 'none'",
|
|
208
|
+
].join('; '),
|
|
209
|
+
'X-Content-Type-Options': 'nosniff',
|
|
210
|
+
'Referrer-Policy': 'no-referrer',
|
|
211
|
+
'X-Frame-Options': 'DENY',
|
|
212
|
+
};
|
|
186
213
|
function notBuilt(res) {
|
|
187
214
|
res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
188
215
|
res.end(`<!doctype html>
|
|
189
|
-
<html lang="en"><head><title>Hippo Dashboard</title><meta charset="utf-8"></head>
|
|
190
|
-
<body
|
|
191
|
-
<h1
|
|
216
|
+
<html lang="en"><head><title>Hippo Dashboard</title><meta charset="utf-8"><style>${NOT_BUILT_CSS}</style></head>
|
|
217
|
+
<body>
|
|
218
|
+
<h1>Hippo Dashboard</h1>
|
|
192
219
|
<p>The React UI bundle is not built yet. Run:</p>
|
|
193
|
-
<pre
|
|
220
|
+
<pre>cd ui && npm install && npm run build</pre>
|
|
194
221
|
<p>Then refresh this page. The dashboard server will serve <code>dist-ui/index.html</code> automatically once present.</p>
|
|
195
222
|
</body></html>`);
|
|
196
223
|
}
|
|
197
224
|
function serveSpa(res, distUiDir, pathname) {
|
|
198
225
|
const safePath = path.normalize(pathname).replace(/^(\.\.[/\\])+/, '');
|
|
199
226
|
const filePath = path.join(distUiDir, safePath);
|
|
200
|
-
|
|
227
|
+
// The separator matters: a bare prefix also admits a sibling folder whose name starts with this one.
|
|
228
|
+
if (filePath !== distUiDir && !filePath.startsWith(distUiDir + path.sep))
|
|
201
229
|
return forbidden(res);
|
|
202
230
|
if (fs.existsSync(filePath) && fs.statSync(filePath).isFile() && serveStaticFile(res, filePath))
|
|
203
231
|
return;
|
|
@@ -221,6 +249,78 @@ function cookieValue(header, name) {
|
|
|
221
249
|
}
|
|
222
250
|
return undefined;
|
|
223
251
|
}
|
|
252
|
+
/** Where a page load that carried the token goes next, without it; null for an API call or a write, which is answered in place. */
|
|
253
|
+
function tokenFreeLocation(req, url) {
|
|
254
|
+
if ((req.method !== 'GET' && req.method !== 'HEAD') || url.pathname.startsWith('/api/'))
|
|
255
|
+
return null;
|
|
256
|
+
const query = new URLSearchParams(url.searchParams);
|
|
257
|
+
query.delete('token');
|
|
258
|
+
const rest = query.toString();
|
|
259
|
+
// One leading slash only: `//host` would send the browser to another site.
|
|
260
|
+
return `${url.pathname.replace(/^\/+/, '/')}${rest ? `?${rest}` : ''}`;
|
|
261
|
+
}
|
|
262
|
+
/** Moves the browser off the URL that carries the token, so the token stays out of history, bookmarks and copied links; false when the request is answered in place. */
|
|
263
|
+
function leaveTokenUrl(req, res, url) {
|
|
264
|
+
const location = tokenFreeLocation(req, url);
|
|
265
|
+
if (location === null)
|
|
266
|
+
return false;
|
|
267
|
+
if (req.headers['sec-fetch-site'] !== 'cross-site') {
|
|
268
|
+
res.writeHead(303, { Location: location });
|
|
269
|
+
res.end();
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
// A browser withholds a SameSite=Strict cookie from a redirect another site started; a refresh from this page is same-site.
|
|
273
|
+
const target = location.replace(/&/g, '&').replace(/"/g, '"');
|
|
274
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
275
|
+
res.end(`<!doctype html>\n<html lang="en"><head><meta charset="utf-8"><meta http-equiv="refresh" content="0;url=${target}"><title>Hippo Dashboard</title></head><body></body></html>`);
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
278
|
+
/** True when the request may proceed; false when this already answered it (redirect off the token URL, or 401). */
|
|
279
|
+
function admitDashboardRequest(req, res, url, access) {
|
|
280
|
+
const { token, port } = access;
|
|
281
|
+
// Cookies ignore the port, so the name carries it: two dashboards on one host keep separate tokens.
|
|
282
|
+
const cookieName = `hippo_dashboard_${req.socket.localPort ?? port}`;
|
|
283
|
+
if (sameToken(url.searchParams.get('token') ?? undefined, token)) {
|
|
284
|
+
res.setHeader('Set-Cookie', `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`);
|
|
285
|
+
if (leaveTokenUrl(req, res, url))
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
else if (!sameToken(cookieValue(req.headers.cookie, cookieName), token)) {
|
|
289
|
+
res.writeHead(401, { 'Content-Type': 'text/plain' });
|
|
290
|
+
res.end('Unauthorized: open the dashboard with the URL `hippo dashboard` printed; it carries the access token.');
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
function answerDashboardFailure(req, res, err) {
|
|
296
|
+
const clientFault = err instanceof ParamError || err instanceof URIError || err instanceof BodyTimeoutError;
|
|
297
|
+
// A cut-short response is logged even for a client fault; a bare 400 is not.
|
|
298
|
+
if (res.headersSent || !clientFault) {
|
|
299
|
+
log.error('dashboard request failed', { error: errorMessage(err), path: req.url });
|
|
300
|
+
}
|
|
301
|
+
if (res.headersSent) {
|
|
302
|
+
res.end();
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (err instanceof BodyDrainExceeded || err instanceof BodyTimeoutError) {
|
|
306
|
+
// No `Connection: close` header: Node then destroys the socket as soon as the reply is written.
|
|
307
|
+
res.writeHead(err instanceof BodyTimeoutError ? 408 : 400, { 'Content-Type': 'application/json; charset=utf-8' });
|
|
308
|
+
res.end(JSON.stringify({ error: err.message }), () => closeAfterReply(req));
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (err instanceof ParamError)
|
|
312
|
+
return jsonResponse(res, { error: err.message }, 400);
|
|
313
|
+
if (err instanceof URIError)
|
|
314
|
+
return jsonResponse(res, { error: 'Malformed URL path' }, 400);
|
|
315
|
+
jsonResponse(res, { error: 'Internal error' }, 500);
|
|
316
|
+
}
|
|
317
|
+
function printDashboardBanner(boundPort, token, distUiDir) {
|
|
318
|
+
// The banner is the `hippo dashboard` command's printed result, so it stays on stdout.
|
|
319
|
+
console.log(`Hippo Dashboard running at http://localhost:${boundPort}/?token=${token}`);
|
|
320
|
+
if (distUiDir !== null)
|
|
321
|
+
console.log(`Serving React UI from ${distUiDir}`);
|
|
322
|
+
console.log('Press Ctrl+C to stop.');
|
|
323
|
+
}
|
|
224
324
|
/** Serves the dashboard on 127.0.0.1 behind a per-start `token` (tests pass one), since loopback alone lets any local process read every memory; `opts` sets the projection and cache clocks. */
|
|
225
325
|
export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).toString('base64url'), opts) {
|
|
226
326
|
const distUiDir = path.resolve(import.meta.dirname, '..', 'dist-ui');
|
|
@@ -232,16 +332,8 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
|
|
|
232
332
|
if (host !== undefined && !LOOPBACK_HOST_HEADER.test(host))
|
|
233
333
|
return forbidden(res);
|
|
234
334
|
const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
|
|
235
|
-
|
|
236
|
-
const cookieName = `hippo_dashboard_${req.socket.localPort ?? port}`;
|
|
237
|
-
if (sameToken(url.searchParams.get('token') ?? undefined, token)) {
|
|
238
|
-
res.setHeader('Set-Cookie', `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`);
|
|
239
|
-
}
|
|
240
|
-
else if (!sameToken(cookieValue(req.headers.cookie, cookieName), token)) {
|
|
241
|
-
res.writeHead(401, { 'Content-Type': 'text/plain' });
|
|
242
|
-
res.end('Unauthorized: open the dashboard with the URL `hippo dashboard` printed; it carries the access token.');
|
|
335
|
+
if (!admitDashboardRequest(req, res, url, { token, port }))
|
|
243
336
|
return;
|
|
244
|
-
}
|
|
245
337
|
if (url.pathname.startsWith('/api/')) {
|
|
246
338
|
// A malformed % sequence throws URIError here; the caller answers 400.
|
|
247
339
|
const segments = url.pathname.split('/').filter((s) => s !== '').map((s) => decodeURIComponent(s));
|
|
@@ -257,39 +349,18 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
|
|
|
257
349
|
return serveSpa(res, distUiDir, url.pathname);
|
|
258
350
|
notBuilt(res);
|
|
259
351
|
};
|
|
260
|
-
const
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
if (res.headersSent) {
|
|
268
|
-
res.end();
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
if (err instanceof BodyDrainExceeded) {
|
|
272
|
-
// No `Connection: close` header: Node then destroys the socket as soon as the reply is written.
|
|
273
|
-
res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });
|
|
274
|
-
res.end(JSON.stringify({ error: err.message }), () => closeAfterReply(req));
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
if (err instanceof ParamError)
|
|
278
|
-
return jsonResponse(res, { error: err.message }, 400);
|
|
279
|
-
if (err instanceof URIError)
|
|
280
|
-
return jsonResponse(res, { error: 'Malformed URL path' }, 400);
|
|
281
|
-
jsonResponse(res, { error: 'Internal error' }, 500);
|
|
282
|
-
});
|
|
283
|
-
});
|
|
352
|
+
const onRequest = (req, res) => {
|
|
353
|
+
for (const [name, value] of Object.entries(SECURITY_HEADERS))
|
|
354
|
+
res.setHeader(name, value);
|
|
355
|
+
handleRequest(req, res).catch((err) => answerDashboardFailure(req, res, err));
|
|
356
|
+
};
|
|
357
|
+
// One id per request, so the lines it logs can be told apart from a concurrent request's.
|
|
358
|
+
const server = http.createServer((req, res) => runWithRequestId(randomUUID(), () => onRequest(req, res)));
|
|
284
359
|
server.on('close', () => snapshots.close());
|
|
285
360
|
server.listen(port, '127.0.0.1', () => {
|
|
286
361
|
// SAFETY: listen() was given a TCP port, so address() is AddressInfo, never a pipe name.
|
|
287
362
|
const boundPort = server.address().port;
|
|
288
|
-
|
|
289
|
-
console.log(`Hippo Dashboard running at http://localhost:${boundPort}/?token=${token}`);
|
|
290
|
-
if (hasDistUi)
|
|
291
|
-
console.log(`Serving React UI from ${distUiDir}`);
|
|
292
|
-
console.log('Press Ctrl+C to stop.');
|
|
363
|
+
printDashboardBanner(boundPort, token, hasDistUi ? distUiDir : null);
|
|
293
364
|
});
|
|
294
365
|
return server;
|
|
295
366
|
}
|