hippo-memory 1.70.0 → 1.72.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 +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +49 -40
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +3 -2
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +24 -44
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +4 -3
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +24 -53
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +16 -19
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +24 -60
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +11 -63
- package/dist/store/summaries.js +37 -148
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +35 -6
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- package/extensions/openclaw-plugin/index.ts +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
|
@@ -4,7 +4,7 @@ import * as os from 'os';
|
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import { BadRequestError } from './api-errors.js';
|
|
6
6
|
import { isSharedStore, loadConfig } from './config.js';
|
|
7
|
-
import { MAX_ID_LEN } from '../util/
|
|
7
|
+
import { MAX_ID_LEN } from '../util/limits.js';
|
|
8
8
|
import { errorMessage, log } from '../util/log.js';
|
|
9
9
|
import { originRemoteId, projectFileId } from './project-remote.js';
|
|
10
10
|
import { realpathOrResolve } from '../util/real-path.js';
|
|
@@ -23,7 +23,8 @@ function remoteRuleOn() {
|
|
|
23
23
|
remoteSwitch = { globalRoot, on: loadConfig(globalRoot).projectIdentity.remote };
|
|
24
24
|
return remoteSwitch.on;
|
|
25
25
|
}
|
|
26
|
-
/** The id a root names itself by plus every rung that resolves; only the root's own
|
|
26
|
+
/** The id a root names itself by plus every rung that resolves; only the root's own
|
|
27
|
+
* `.git` is read, so a store nested in another checkout keeps its folder name. */
|
|
27
28
|
function namesAt(root, legacyName) {
|
|
28
29
|
const fileId = projectFileId(root);
|
|
29
30
|
const remoteId = originRemoteId(root);
|
|
@@ -48,9 +49,8 @@ function isUnder(child, parent) {
|
|
|
48
49
|
}
|
|
49
50
|
return false;
|
|
50
51
|
}
|
|
51
|
-
/** A `.hippo` marker must be a DIRECTORY (a store)
|
|
52
|
-
* `.
|
|
53
|
-
* because worktrees legitimately use a `.git` FILE. */
|
|
52
|
+
/** A `.hippo` marker must be a DIRECTORY (a store), so a stray file named `.hippo` cannot make its parent a project;
|
|
53
|
+
* `.git` stays existsSync because worktrees use a `.git` FILE. */
|
|
54
54
|
function isDirectoryAt(p) {
|
|
55
55
|
try {
|
|
56
56
|
return fs.statSync(p).isDirectory();
|
|
@@ -60,10 +60,7 @@ function isDirectoryAt(p) {
|
|
|
60
60
|
return false;
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Resolve the project identity for a working directory.
|
|
65
|
-
* Defaults to process.cwd(). Results are cached per resolved input path.
|
|
66
|
-
*/
|
|
63
|
+
/** Resolves the project identity for a working directory (default process.cwd()); results are cached per resolved input path. */
|
|
67
64
|
export function resolveProjectIdentity(cwd, opts) {
|
|
68
65
|
const startInput = path.resolve(cwd ?? process.cwd());
|
|
69
66
|
const cacheable = !opts?.homeDir && !opts?.stopDir;
|
|
@@ -96,7 +93,8 @@ export function resolveProjectIdentity(cwd, opts) {
|
|
|
96
93
|
identityCache.set(startInput, identity);
|
|
97
94
|
return identity;
|
|
98
95
|
}
|
|
99
|
-
/** The repo name a linked worktree shares with its main checkout (`repo.git` or
|
|
96
|
+
/** The repo name a linked worktree shares with its main checkout (`repo.git` or
|
|
97
|
+
* `repo/.bare` for a bare repo), so one repo is one project; null for any other checkout. */
|
|
100
98
|
function linkedWorktreeRepoName(gitRoot, home) {
|
|
101
99
|
const marker = path.join(gitRoot, '.git');
|
|
102
100
|
if (!fs.existsSync(marker) || isDirectoryAt(marker))
|
|
@@ -156,6 +154,15 @@ export function findHippoStoreDir(cwd, opts) {
|
|
|
156
154
|
const { hippoRoot } = walkProjectMarkers(start, home, stops);
|
|
157
155
|
return hippoRoot === null ? null : path.join(hippoRoot, '.hippo');
|
|
158
156
|
}
|
|
157
|
+
/** Nearest ancestor store like git; the strict join is the fallback so `hippo init` still creates `<cwd>/.hippo`. */
|
|
158
|
+
export function getHippoRoot(cwd = process.cwd(), opts) {
|
|
159
|
+
return findHippoStoreDir(cwd, opts) ?? path.join(realpathOrResolve(cwd), '.hippo');
|
|
160
|
+
}
|
|
161
|
+
export function isInitialized(hippoRoot) {
|
|
162
|
+
// autoInstallHooks / setupDailySchedule can create a bare .hippo with no hippo.db; counting
|
|
163
|
+
// that as initialized makes `hippo init` skip initStore, so only hippo.db counts.
|
|
164
|
+
return fs.existsSync(path.join(hippoRoot, 'hippo.db'));
|
|
165
|
+
}
|
|
159
166
|
function isBareName(project) {
|
|
160
167
|
return typeof project === 'string';
|
|
161
168
|
}
|
|
@@ -172,7 +179,8 @@ export function projectNames(project) {
|
|
|
172
179
|
// Each project name is matched against every candidate row, so the caller's list stays short.
|
|
173
180
|
export const MAX_PROJECT_ALIASES = 10;
|
|
174
181
|
export const MCP_PROJECT_SCOPED_HEADER = 'X-Hippo-Project-Scoped';
|
|
175
|
-
/** Refuses a caller's project that is blank (it would stamp user-global), past the caps, or unlike the resolver's ids: rows match
|
|
182
|
+
/** Refuses a caller's project that is blank (it would stamp user-global), past the caps, or unlike the resolver's ids: rows match
|
|
183
|
+
* verbatim, so a rewrite would split a project. Inner spaces pass, since a checkout with no remote is named by its folder. */
|
|
176
184
|
export function assertCallerProject(project) {
|
|
177
185
|
const { name, aliases = [] } = project;
|
|
178
186
|
if (name.trim() === '')
|
|
@@ -190,14 +198,8 @@ export function assertCallerProject(project) {
|
|
|
190
198
|
export function originInSql(names, column = 'origin_project') {
|
|
191
199
|
return names.length === 0 ? '0' : `${column} IN (${names.map(() => '?').join(', ')})`;
|
|
192
200
|
}
|
|
193
|
-
/**
|
|
194
|
-
*
|
|
195
|
-
* active project. An empty current id means the session is not in a project
|
|
196
|
-
* (home dir or markerless cwd) - everything is in scope there, matching
|
|
197
|
-
* pre-isolation behavior. NULL/undefined origin means no known project (a legacy
|
|
198
|
-
* row, or a shared-store write that named none) and is treated as cross-project
|
|
199
|
-
* (deny by default) - the safe direction for a security partition.
|
|
200
|
-
*/
|
|
201
|
+
/** Classifies a memory's origin_project against the active project. An empty current id (home or markerless cwd) puts everything in scope;
|
|
202
|
+
* NULL/undefined origin (legacy row, or a shared-store write naming none) counts as cross-project: deny by default for a security partition. */
|
|
201
203
|
export function classifyOriginProject(origin, current) {
|
|
202
204
|
if (projectId(current) === '')
|
|
203
205
|
return 'project';
|
|
@@ -207,12 +209,8 @@ export function classifyOriginProject(origin, current) {
|
|
|
207
209
|
return 'user-global';
|
|
208
210
|
return projectNames(current).includes(origin) ? 'project' : 'cross-project';
|
|
209
211
|
}
|
|
210
|
-
/**
|
|
211
|
-
*
|
|
212
|
-
* $HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo. Lives here (leaf module) so
|
|
213
|
-
* db.ts migrations can use it without importing shared.ts (store.ts cycle);
|
|
214
|
-
* shared.getGlobalRoot delegates to this.
|
|
215
|
-
*/
|
|
212
|
+
/** The global Hippo store directory ($HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo); getGlobalRoot (sharing/global-store.ts) returns it.
|
|
213
|
+
* Leaf module so store migrations can use it without importing sharing/ (store cycle). */
|
|
216
214
|
export function resolveGlobalRootDir() {
|
|
217
215
|
const hippoHome = envHippoHome();
|
|
218
216
|
if (hippoHome)
|
|
@@ -222,23 +220,13 @@ export function resolveGlobalRootDir() {
|
|
|
222
220
|
return path.join(xdgData, 'hippo');
|
|
223
221
|
return path.join(os.homedir(), '.hippo');
|
|
224
222
|
}
|
|
225
|
-
/**
|
|
226
|
-
*
|
|
227
|
-
* global store whose parent chain happens to contain `.git`/`.hippo`
|
|
228
|
-
* (git-managed HIPPO_HOME, dotfiles setups) still backfills as user-global
|
|
229
|
-
* ('') instead of being stamped with the surrounding repo's name - which
|
|
230
|
-
* would hide the user's entire global corpus from every project.
|
|
231
|
-
*/
|
|
223
|
+
/** True when `p` IS the global store root, so a global store whose parent chain contains `.git`/`.hippo` (git-managed HIPPO_HOME) still backfills as
|
|
224
|
+
* user-global ('') instead of being stamped with the surrounding repo's name, which would hide the global corpus from every project. */
|
|
232
225
|
export function isGlobalStoreRoot(p) {
|
|
233
226
|
return samePath(realpathOrResolve(path.resolve(p)), realpathOrResolve(resolveGlobalRootDir()));
|
|
234
227
|
}
|
|
235
|
-
/**
|
|
236
|
-
*
|
|
237
|
-
* v39 migration's evidence rules: `shared:<project>:<ts>` and
|
|
238
|
-
* `promoted:<localRoot>` identify the owning project; the user home dir's
|
|
239
|
-
* basename maps to '' (user-global). Returns null when the source carries no
|
|
240
|
-
* origin evidence. Pure string logic - recorded paths may no longer exist.
|
|
241
|
-
*/
|
|
228
|
+
/** Parses a memory's origin from its provenance `source`: `shared:<project>:<ts>` and `promoted:<localRoot>` name the owning project; the home dir basename
|
|
229
|
+
* maps to '' (user-global). Returns null without origin evidence. Pure string logic, since recorded paths may no longer exist. */
|
|
242
230
|
export function originFromSource(source, homeName) {
|
|
243
231
|
if (!source)
|
|
244
232
|
return null;
|
|
@@ -7,9 +7,10 @@ import { errorMessage, log } from '../util/log.js';
|
|
|
7
7
|
export function gitConfigPath(gitRoot) {
|
|
8
8
|
const marker = path.join(gitRoot, '.git');
|
|
9
9
|
try {
|
|
10
|
-
|
|
10
|
+
const pointer = gitFilePointer(marker);
|
|
11
|
+
if (pointer === null)
|
|
11
12
|
return path.join(marker, 'config');
|
|
12
|
-
const gitDir = /^gitdir:\s*(.+)$/m.exec(
|
|
13
|
+
const gitDir = /^gitdir:\s*(.+)$/m.exec(pointer)?.[1]?.trim();
|
|
13
14
|
if (!gitDir)
|
|
14
15
|
return null;
|
|
15
16
|
const linkDir = path.resolve(gitRoot, gitDir);
|
|
@@ -23,6 +24,16 @@ export function gitConfigPath(gitRoot) {
|
|
|
23
24
|
return null;
|
|
24
25
|
}
|
|
25
26
|
}
|
|
27
|
+
/** The text of a `.git` file, or null when `.git` is a folder; one descriptor answers both, so the path cannot change in between. */
|
|
28
|
+
function gitFilePointer(marker) {
|
|
29
|
+
const fd = fs.openSync(marker, 'r');
|
|
30
|
+
try {
|
|
31
|
+
return fs.fstatSync(fd).isDirectory() ? null : fs.readFileSync(fd, 'utf8');
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
fs.closeSync(fd);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
26
37
|
/** One config value with git's quoting: `"` toggles quoting, backslash escapes, and an unquoted `#` or `;` starts a comment. */
|
|
27
38
|
function configValue(raw) {
|
|
28
39
|
let out = '';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** The refusal a delete of a raw row gets; a plain Error subclass, so it joins no HTTP status family. */
|
|
2
|
+
export class RawAppendOnlyError extends Error {
|
|
3
|
+
constructor(cause) {
|
|
4
|
+
super('raw is append-only', { cause });
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=raw-append-only.js.map
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/** Recall-side scope predicates, in a leaf module so search-both.ts can apply the same default-deny rule to searchBothHybrid's candidate loads without an
|
|
2
|
+
* import cycle. src/api/index.ts imports these and re-exports them for back-compat (`api.isPrivateScope`, tests importing `passesScopeFilterForRecall`). */
|
|
3
|
+
import { ForbiddenError } from './api-errors.js';
|
|
4
|
+
/** Literal scopes excluded from recall by default-deny when the caller passes no `scope`; read by the SQL clause in `loadSearchRows` and by
|
|
5
|
+
* `passesScopeFilterForRecall`. Invariant: never empty, or quarantine scopes would pass both paths silently (the module-load assertion below pins this). */
|
|
6
|
+
export declare const RECALL_DEFAULT_DENY_SCOPES: readonly ["unknown:legacy"];
|
|
7
|
+
/** @internal Runtime guard against blanking a load-bearing literal array; `as const` arrays widen via `readonly T[]` at the call site, so the empty case
|
|
8
|
+
* is reachable and testable. */
|
|
9
|
+
export declare function assertNonEmpty<T>(arr: readonly T[], name: string): void;
|
|
10
|
+
/** Source-agnostic private-scope detector: private means `<lowercase-source>:private:<rest>` (`slack:private:Cabc`; not `slack:public:x`, null, '',
|
|
11
|
+
* 'private:foo'). The single source of truth for api.recall, the MCP server, the CLI and search-both.ts, so connector work cannot drift. */
|
|
12
|
+
export declare const PRIVATE_SCOPE_RE: RegExp;
|
|
13
|
+
/** True when `scope` matches the `<source>:private:*` shape. */
|
|
14
|
+
export declare function isPrivateScope(scope: string | null | undefined): boolean;
|
|
15
|
+
export declare const PERSONAL_SCOPE_PREFIX = "personal:private:";
|
|
16
|
+
export declare const PERSONAL_OWNER_MAX: number;
|
|
17
|
+
/** True for a `personal:private:<owner>` scope, any case, so a case variant is never mistaken for a team scope. */
|
|
18
|
+
export declare function isPersonalScope(scope: string | null | undefined): boolean;
|
|
19
|
+
/** The caller's own personal scope, or null when it has no owner that can hold one. */
|
|
20
|
+
export declare function personalScopeOf(actor: {
|
|
21
|
+
owner?: string;
|
|
22
|
+
} | undefined): string | null;
|
|
23
|
+
/** Refuses a client-sent `personal:` scope: only the server stamps one, from the caller's owner. */
|
|
24
|
+
export declare function assertClientScope(scope: string | null | undefined): void;
|
|
25
|
+
/** True when `actor` may change or delete a row in `scope`: any non-personal scope, or its own personal one. */
|
|
26
|
+
export declare function canTouchScope(actor: {
|
|
27
|
+
owner?: string;
|
|
28
|
+
}, scope: string | null): boolean;
|
|
29
|
+
/** canTouchScope for a caller known by its own personal scope, as a store method receives it. */
|
|
30
|
+
export declare function ownScopeTouches(ownScope: string | null, scope: string | null): boolean;
|
|
31
|
+
/** JS half of the recall default-deny rule (SQL half: `loadSearchRows`). A non-empty `requested` needs an exact match;
|
|
32
|
+
* otherwise `<source>:private:*` and `RECALL_DEFAULT_DENY_SCOPES` buckets are denied, while null, public scopes and the caller's `ownScope` pass. */
|
|
33
|
+
export declare function passesScopeFilterForRecall(scope: string | null, requested: string | undefined, ownScope?: string | null): boolean;
|
|
34
|
+
/** CLI `--scope` variant: an explicit `--scope X` UNLOCKS scope X on top of the default-admitted set rather than narrowing to X (api.recall keeps 'exact').
|
|
35
|
+
* Includes private/quarantine scopes (owner access); a named personal scope never unlocks: the CLI has no caller identity. */
|
|
36
|
+
export declare function passesCliRecallScopeFilter(scope: string | null, requested: string | undefined): boolean;
|
|
37
|
+
/** Thrown when a caller requests a scope its role may not read; the HTTP layer maps it to 403. */
|
|
38
|
+
export declare class ScopeForbiddenError extends ForbiddenError {
|
|
39
|
+
readonly scope: string;
|
|
40
|
+
constructor(scope: string);
|
|
41
|
+
}
|
|
42
|
+
/** True for scopes default-deny hides (`<source>:private:*` and the quarantine buckets); naming one explicitly unlocks it, so naming one needs
|
|
43
|
+
* authorization. */
|
|
44
|
+
export declare function isRestrictedScope(scope: string | null | undefined): boolean;
|
|
45
|
+
/** The identity a scope check runs against: a role, any scope grants, and the person who owns the key. */
|
|
46
|
+
export interface ScopeActor {
|
|
47
|
+
role: 'admin' | 'member';
|
|
48
|
+
scopes?: readonly string[];
|
|
49
|
+
owner?: string;
|
|
50
|
+
}
|
|
51
|
+
/** Personal rows answer to their owner alone: role, key grants and resolver scopes never
|
|
52
|
+
* open one. Else admin reads all; a member needs an exact grant on a restricted scope. */
|
|
53
|
+
export declare function canReadScope(actor: ScopeActor, scope: string): boolean;
|
|
54
|
+
/** Authorize an explicitly requested scope before any read honours it (member scope grants). */
|
|
55
|
+
export declare function assertScopeRequestAllowed(actor: ScopeActor, requested: string | undefined): void;
|
|
56
|
+
/** Scope a derived row keeps from one source: the restricted scope itself, else null. */
|
|
57
|
+
export declare function derivationScope(scope: string | null | undefined): string | null;
|
|
58
|
+
/** The one derivation scope shared by every source, or `{ ok: false }` when
|
|
59
|
+
* two disagree, so the caller skips the derived row instead of under-scoping it. */
|
|
60
|
+
export declare function commonDerivationScope(scopes: readonly (string | null | undefined)[]): {
|
|
61
|
+
ok: true;
|
|
62
|
+
scope: string | null;
|
|
63
|
+
} | {
|
|
64
|
+
ok: false;
|
|
65
|
+
};
|
|
66
|
+
/** Map-partition key for consolidate/dag/dedup producers: tenant + derivation scope + origin project,
|
|
67
|
+
* so a derived row never blends two restricted scopes, a mixed pair, or two projects. */
|
|
68
|
+
export declare function derivationPartitionKey(tenantId: string, scope: string | null | undefined, origin: string | null | undefined): string;
|
|
69
|
+
//# sourceMappingURL=recall-scope.d.ts.map
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/** Recall-side scope predicates, in a leaf module so search-both.ts can apply the same default-deny rule to searchBothHybrid's candidate loads without an
|
|
2
|
+
* import cycle. src/api/index.ts imports these and re-exports them for back-compat (`api.isPrivateScope`, tests importing `passesScopeFilterForRecall`). */
|
|
3
|
+
import { BadRequestError, ForbiddenError } from './api-errors.js';
|
|
4
|
+
import { MAX_ID_LEN } from '../util/limits.js';
|
|
5
|
+
/** Literal scopes excluded from recall by default-deny when the caller passes no `scope`; read by the SQL clause in `loadSearchRows` and by
|
|
6
|
+
* `passesScopeFilterForRecall`. Invariant: never empty, or quarantine scopes would pass both paths silently (the module-load assertion below pins this). */
|
|
7
|
+
export const RECALL_DEFAULT_DENY_SCOPES = ['unknown:legacy'];
|
|
8
|
+
/** @internal Runtime guard against blanking a load-bearing literal array; `as const` arrays widen via `readonly T[]` at the call site, so the empty case
|
|
9
|
+
* is reachable and testable. */
|
|
10
|
+
export function assertNonEmpty(arr, name) {
|
|
11
|
+
if (arr.length === 0) {
|
|
12
|
+
throw new Error(`${name} cannot be empty — would silently allow quarantine scopes`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
assertNonEmpty(RECALL_DEFAULT_DENY_SCOPES, 'RECALL_DEFAULT_DENY_SCOPES');
|
|
16
|
+
/** Source-agnostic private-scope detector: private means `<lowercase-source>:private:<rest>` (`slack:private:Cabc`; not `slack:public:x`, null, '',
|
|
17
|
+
* 'private:foo'). The single source of truth for api.recall, the MCP server, the CLI and search-both.ts, so connector work cannot drift. */
|
|
18
|
+
export const PRIVATE_SCOPE_RE = /^[a-z][a-z0-9_-]*:private:/;
|
|
19
|
+
function isScopeString(value) {
|
|
20
|
+
return typeof value === 'string';
|
|
21
|
+
}
|
|
22
|
+
/** True when `scope` matches the `<source>:private:*` shape. */
|
|
23
|
+
export function isPrivateScope(scope) {
|
|
24
|
+
if (!isScopeString(scope))
|
|
25
|
+
return false;
|
|
26
|
+
return PRIVATE_SCOPE_RE.test(scope);
|
|
27
|
+
}
|
|
28
|
+
export const PERSONAL_SCOPE_PREFIX = 'personal:private:';
|
|
29
|
+
// The scope must fit the 256-character scope caps, so the owner gets what the prefix leaves.
|
|
30
|
+
export const PERSONAL_OWNER_MAX = MAX_ID_LEN - PERSONAL_SCOPE_PREFIX.length;
|
|
31
|
+
/** True for a `personal:private:<owner>` scope, any case, so a case variant is never mistaken for a team scope. */
|
|
32
|
+
export function isPersonalScope(scope) {
|
|
33
|
+
if (!isScopeString(scope))
|
|
34
|
+
return false;
|
|
35
|
+
return /^personal:private:/i.test(scope);
|
|
36
|
+
}
|
|
37
|
+
/** The caller's own personal scope, or null when it has no owner that can hold one. */
|
|
38
|
+
export function personalScopeOf(actor) {
|
|
39
|
+
const owner = actor?.owner;
|
|
40
|
+
if (!owner || owner.length > PERSONAL_OWNER_MAX || /\p{Cc}/u.test(owner))
|
|
41
|
+
return null;
|
|
42
|
+
return `${PERSONAL_SCOPE_PREFIX}${owner}`;
|
|
43
|
+
}
|
|
44
|
+
/** Refuses a client-sent `personal:` scope: only the server stamps one, from the caller's owner. */
|
|
45
|
+
export function assertClientScope(scope) {
|
|
46
|
+
if (isScopeString(scope) && /^personal:/i.test(scope)) {
|
|
47
|
+
throw new BadRequestError(`scope ${scope} is reserved: the server sets personal scopes itself`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** True when `actor` may change or delete a row in `scope`: any non-personal scope, or its own personal one. */
|
|
51
|
+
export function canTouchScope(actor, scope) {
|
|
52
|
+
return ownScopeTouches(personalScopeOf(actor), scope);
|
|
53
|
+
}
|
|
54
|
+
/** canTouchScope for a caller known by its own personal scope, as a store method receives it. */
|
|
55
|
+
export function ownScopeTouches(ownScope, scope) {
|
|
56
|
+
return !isPersonalScope(scope) || scope === ownScope;
|
|
57
|
+
}
|
|
58
|
+
/** JS half of the recall default-deny rule (SQL half: `loadSearchRows`). A non-empty `requested` needs an exact match;
|
|
59
|
+
* otherwise `<source>:private:*` and `RECALL_DEFAULT_DENY_SCOPES` buckets are denied, while null, public scopes and the caller's `ownScope` pass. */
|
|
60
|
+
export function passesScopeFilterForRecall(scope, requested, ownScope) {
|
|
61
|
+
if (requested !== undefined && requested !== '') {
|
|
62
|
+
return scope === requested;
|
|
63
|
+
}
|
|
64
|
+
return !isRestrictedScope(scope) || (ownScope != null && scope === ownScope);
|
|
65
|
+
}
|
|
66
|
+
/** CLI `--scope` variant: an explicit `--scope X` UNLOCKS scope X on top of the default-admitted set rather than narrowing to X (api.recall keeps 'exact').
|
|
67
|
+
* Includes private/quarantine scopes (owner access); a named personal scope never unlocks: the CLI has no caller identity. */
|
|
68
|
+
export function passesCliRecallScopeFilter(scope, requested) {
|
|
69
|
+
if (requested !== undefined && requested !== '' && !isPersonalScope(requested) && scope === requested) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return passesScopeFilterForRecall(scope, undefined);
|
|
73
|
+
}
|
|
74
|
+
/** Thrown when a caller requests a scope its role may not read; the HTTP layer maps it to 403. */
|
|
75
|
+
export class ScopeForbiddenError extends ForbiddenError {
|
|
76
|
+
scope;
|
|
77
|
+
constructor(scope) {
|
|
78
|
+
super(`scope ${scope} requires admin role`);
|
|
79
|
+
this.name = 'ScopeForbiddenError';
|
|
80
|
+
this.scope = scope;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** True for scopes default-deny hides (`<source>:private:*` and the quarantine buckets); naming one explicitly unlocks it, so naming one needs
|
|
84
|
+
* authorization. */
|
|
85
|
+
export function isRestrictedScope(scope) {
|
|
86
|
+
if (!isScopeString(scope))
|
|
87
|
+
return false;
|
|
88
|
+
// SAFETY: RECALL_DEFAULT_DENY_SCOPES is a readonly tuple of string literals; widening the array lets .includes() take any scope.
|
|
89
|
+
// `:private:` anywhere, any case, matches the SQL default-deny in src/store/search-rows.ts so JS never admits what SQL hides.
|
|
90
|
+
return isPrivateScope(scope) || /:private:/i.test(scope) || RECALL_DEFAULT_DENY_SCOPES.includes(scope);
|
|
91
|
+
}
|
|
92
|
+
/** Personal rows answer to their owner alone: role, key grants and resolver scopes never
|
|
93
|
+
* open one. Else admin reads all; a member needs an exact grant on a restricted scope. */
|
|
94
|
+
export function canReadScope(actor, scope) {
|
|
95
|
+
if (isPersonalScope(scope))
|
|
96
|
+
return scope === personalScopeOf(actor);
|
|
97
|
+
if (actor.role === 'admin')
|
|
98
|
+
return true;
|
|
99
|
+
if (!isRestrictedScope(scope))
|
|
100
|
+
return true;
|
|
101
|
+
return (actor.scopes ?? []).includes(scope);
|
|
102
|
+
}
|
|
103
|
+
/** Authorize an explicitly requested scope before any read honours it (member scope grants). */
|
|
104
|
+
export function assertScopeRequestAllowed(actor, requested) {
|
|
105
|
+
if (requested === undefined || requested === '')
|
|
106
|
+
return;
|
|
107
|
+
if (canReadScope(actor, requested))
|
|
108
|
+
return;
|
|
109
|
+
throw new ScopeForbiddenError(requested);
|
|
110
|
+
}
|
|
111
|
+
/** Scope a derived row keeps from one source: the restricted scope itself, else null. */
|
|
112
|
+
export function derivationScope(scope) {
|
|
113
|
+
return isRestrictedScope(scope) ? (scope ?? null) : null;
|
|
114
|
+
}
|
|
115
|
+
/** The one derivation scope shared by every source, or `{ ok: false }` when
|
|
116
|
+
* two disagree, so the caller skips the derived row instead of under-scoping it. */
|
|
117
|
+
export function commonDerivationScope(scopes) {
|
|
118
|
+
let common = null;
|
|
119
|
+
let seen = false;
|
|
120
|
+
for (const raw of scopes) {
|
|
121
|
+
const scope = derivationScope(raw);
|
|
122
|
+
if (!seen) {
|
|
123
|
+
common = scope;
|
|
124
|
+
seen = true;
|
|
125
|
+
}
|
|
126
|
+
else if (scope !== common) {
|
|
127
|
+
return { ok: false };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return { ok: true, scope: common };
|
|
131
|
+
}
|
|
132
|
+
/** Map-partition key for consolidate/dag/dedup producers: tenant + derivation scope + origin project,
|
|
133
|
+
* so a derived row never blends two restricted scopes, a mixed pair, or two projects. */
|
|
134
|
+
export function derivationPartitionKey(tenantId, scope, origin) {
|
|
135
|
+
const project = origin === undefined ? '\u0002' : origin ?? '\u0001'; // unstamped, unknown and named never share a bucket
|
|
136
|
+
return `${tenantId}\u0000${derivationScope(scope) ?? ''}\u0000${project}`;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=recall-scope.js.map
|
package/dist/core/salience.d.ts
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Salience gate — decides at memory creation time whether content is worth
|
|
3
|
-
* storing at full strength, should start weakened, or should be skipped.
|
|
4
|
-
*
|
|
5
|
-
* Inspired by the biological salience network (anterior insula + dACC):
|
|
6
|
-
* not everything that enters working memory deserves long-term storage.
|
|
7
|
-
*/
|
|
1
|
+
/** Salience gate: decides at memory creation whether content is stored at full strength, starts weakened, or is skipped. */
|
|
8
2
|
import type { MemoryEntry } from './memory.js';
|
|
9
3
|
export type SalienceDecision = 'store' | 'skip' | 'start_weak';
|
|
10
4
|
export interface SalienceResult {
|
package/dist/core/salience.js
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Salience gate — decides at memory creation time whether content is worth
|
|
3
|
-
* storing at full strength, should start weakened, or should be skipped.
|
|
4
|
-
*
|
|
5
|
-
* Inspired by the biological salience network (anterior insula + dACC):
|
|
6
|
-
* not everything that enters working memory deserves long-term storage.
|
|
7
|
-
*/
|
|
1
|
+
/** Salience gate: decides at memory creation whether content is stored at full strength, starts weakened, or is skipped. */
|
|
8
2
|
import { textOverlap } from '../util/tokenize.js';
|
|
9
3
|
import { duplicateKey, heldTextKeys } from '../util/same-text.js';
|
|
10
4
|
// Each store or skip reason carries a score; a novel memory adds bonuses for structure and length.
|
|
@@ -1,6 +1,7 @@
|
|
|
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
2
|
import * as api from '../api/index.js';
|
|
3
3
|
import { NotFoundError } from '../core/api-errors.js';
|
|
4
|
+
import { RawAppendOnlyError } from '../core/raw-append-only.js';
|
|
4
5
|
import { listTouchableConflicts, resolveConflict } from '../store/conflicts.js';
|
|
5
6
|
import { readEntry } from '../store/entry-reads.js';
|
|
6
7
|
import { writeEntry } from '../store/entry-writes.js';
|
|
@@ -52,8 +53,7 @@ export function forgetMemory(hippoRoot, tenantId, rawId) {
|
|
|
52
53
|
catch (err) {
|
|
53
54
|
if (err instanceof NotFoundError)
|
|
54
55
|
return notFound();
|
|
55
|
-
|
|
56
|
-
if (err instanceof Error && /append-only/i.test(err.message)) {
|
|
56
|
+
if (err instanceof RawAppendOnlyError) {
|
|
57
57
|
const error = `Cannot forget ${id}: it is a raw, append-only memory. Archive it instead: hippo forget ${id} --archive --reason "<why>"`;
|
|
58
58
|
return { status: 409, body: { error }, changed: false };
|
|
59
59
|
}
|
|
@@ -133,6 +133,7 @@ export interface SnapshotService {
|
|
|
133
133
|
embeddedIds(): ReadonlySet<string> | null;
|
|
134
134
|
close(): void;
|
|
135
135
|
}
|
|
136
|
-
/** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the
|
|
136
|
+
/** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the
|
|
137
|
+
* snapshot cache; `now` dates the strength projections, `cacheClock` ages the cache. */
|
|
137
138
|
export declare function createSnapshotService(hippoRoot: string, now: () => number, cacheClock?: () => number): SnapshotService;
|
|
138
139
|
//# sourceMappingURL=dashboard-snapshot.d.ts.map
|
|
@@ -263,7 +263,15 @@ class SnapshotCacheService {
|
|
|
263
263
|
highestIssuedId = Math.max(highestIssuedId, this.lastId);
|
|
264
264
|
// After loadDashboardRows, whose writable open has run any pending migration and legacy embeddings.json import.
|
|
265
265
|
this.lastEmbeddedIds = this.connection.embeddedIds();
|
|
266
|
-
return buildSnapshot({
|
|
266
|
+
return buildSnapshot({
|
|
267
|
+
id: this.lastId,
|
|
268
|
+
tenantId,
|
|
269
|
+
nowMs,
|
|
270
|
+
entries: rows?.live ?? [],
|
|
271
|
+
excluded: rows?.excluded,
|
|
272
|
+
openConflicts,
|
|
273
|
+
embeddedIds: this.lastEmbeddedIds
|
|
274
|
+
});
|
|
267
275
|
}
|
|
268
276
|
get(tenantId, fresh = false) {
|
|
269
277
|
const nowMs = this.now();
|
|
@@ -298,7 +306,8 @@ class SnapshotCacheService {
|
|
|
298
306
|
this.lastEmbeddedIds = undefined;
|
|
299
307
|
}
|
|
300
308
|
}
|
|
301
|
-
/** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the
|
|
309
|
+
/** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the
|
|
310
|
+
* snapshot cache; `now` dates the strength projections, `cacheClock` ages the cache. */
|
|
302
311
|
export function createSnapshotService(hippoRoot, now, cacheClock = Date.now) {
|
|
303
312
|
return new SnapshotCacheService(hippoRoot, now, cacheClock);
|
|
304
313
|
}
|
|
@@ -17,7 +17,8 @@ export interface ProjectSummary {
|
|
|
17
17
|
bands: Record<Band, number>;
|
|
18
18
|
layers: Record<Layer, number>;
|
|
19
19
|
}
|
|
20
|
-
/** One KPI card; `series` is 91 daily cumulative points, oldest first (point 0 is the base at the window start,
|
|
20
|
+
/** One KPI card; `series` is 91 daily cumulative points, oldest first (point 0 is the base at the window start,
|
|
21
|
+
* point 90 is now) so `last - first` over any range plus one points is exact; null when hippo recorded no history. */
|
|
21
22
|
export interface Kpi {
|
|
22
23
|
id: 'total' | 'projects' | 'atRiskShare' | 'openConflicts' | 'embeddingCoverage';
|
|
23
24
|
label: string;
|
|
@@ -9,12 +9,16 @@ import { listCards } from '../store/cards.js';
|
|
|
9
9
|
import { resolveTenantId } from '../store/tenant.js';
|
|
10
10
|
import { loadCardDetail } from '../store/card-detail.js';
|
|
11
11
|
import { bodyDeadlineMs, BodyTimeoutError, closeAfterReply, isCrossSite, LOOPBACK_HOST_HEADER } from '../util/http-util.js';
|
|
12
|
-
import { errorMessage, log } from '../util/log.js';
|
|
12
|
+
import { errorFields, 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
17
|
import { runWithRequestId } from '../util/request-scope.js';
|
|
18
|
+
import { installSignalHandlers } from '../util/crash-handlers.js';
|
|
19
|
+
import { DEFAULT_SHUTDOWN_DRAIN_MS, drainAndClose, setKeepAliveTimeouts, shutdownBoundMs } from '../server/lifecycle.js';
|
|
20
|
+
import { printError } from '../cli/output.js';
|
|
21
|
+
import { PACKAGE_ROOT } from '../core/package-root.js';
|
|
18
22
|
const MIME_TYPES = {
|
|
19
23
|
'.html': 'text/html; charset=utf-8',
|
|
20
24
|
'.js': 'application/javascript; charset=utf-8',
|
|
@@ -296,7 +300,7 @@ function answerDashboardFailure(req, res, err) {
|
|
|
296
300
|
const clientFault = err instanceof ParamError || err instanceof URIError || err instanceof BodyTimeoutError;
|
|
297
301
|
// A cut-short response is logged even for a client fault; a bare 400 is not.
|
|
298
302
|
if (res.headersSent || !clientFault) {
|
|
299
|
-
log.error('dashboard request failed', { error: errorMessage(err), path: req.url });
|
|
303
|
+
log.error('dashboard request failed', { ...errorFields(err), error: errorMessage(err), path: req.url });
|
|
300
304
|
}
|
|
301
305
|
if (res.headersSent) {
|
|
302
306
|
res.end();
|
|
@@ -321,9 +325,51 @@ function printDashboardBanner(boundPort, token, distUiDir) {
|
|
|
321
325
|
console.log(`Serving React UI from ${distUiDir}`);
|
|
322
326
|
console.log('Press Ctrl+C to stop.');
|
|
323
327
|
}
|
|
328
|
+
/** A port that will not open is the user's to fix, so it gets one plain line and a failure exit code, not an uncaught error's stack. */
|
|
329
|
+
function reportListenFailure(port, err) {
|
|
330
|
+
const inUse = 'code' in err && err.code === 'EADDRINUSE';
|
|
331
|
+
printError(inUse
|
|
332
|
+
? `hippo dashboard: port ${port} is already in use. Stop the program that holds it, or choose another port with --port <number>.`
|
|
333
|
+
: `hippo dashboard: could not listen on port ${port}: ${err.message}. Choose another port with --port <number>.`);
|
|
334
|
+
process.exitCode = 1;
|
|
335
|
+
}
|
|
336
|
+
/** Ctrl+C or a stop signal: stop listening, give open requests the API server's drain, and leave within its shutdown bound. */
|
|
337
|
+
function stopOnSignal(server) {
|
|
338
|
+
const inflight = new Set();
|
|
339
|
+
server.on('request', (_req, res) => {
|
|
340
|
+
inflight.add(res);
|
|
341
|
+
res.once('close', () => inflight.delete(res));
|
|
342
|
+
});
|
|
343
|
+
installSignalHandlers('dashboard', {
|
|
344
|
+
run: () => drainAndClose(server, inflight, DEFAULT_SHUTDOWN_DRAIN_MS),
|
|
345
|
+
boundMs: shutdownBoundMs(DEFAULT_SHUTDOWN_DRAIN_MS),
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
/** Gives the listener the API server's socket deadlines and one close of the store's connection; with `handleSignals`, a signal stops it too. */
|
|
349
|
+
function superviseListener(server, snapshots, port, handleSignals) {
|
|
350
|
+
setKeepAliveTimeouts(server);
|
|
351
|
+
let storeClosed = false;
|
|
352
|
+
const closeStore = () => {
|
|
353
|
+
if (storeClosed)
|
|
354
|
+
return;
|
|
355
|
+
storeClosed = true;
|
|
356
|
+
snapshots.close();
|
|
357
|
+
};
|
|
358
|
+
server.on('close', closeStore);
|
|
359
|
+
server.on('error', (err) => {
|
|
360
|
+
// Once it listens, an 'error' is a failed accept: logged, as the API server does, and the dashboard keeps serving.
|
|
361
|
+
if (server.listening)
|
|
362
|
+
return log.error(`dashboard: listener error: ${err.message}`, errorFields(err));
|
|
363
|
+
reportListenFailure(port, err);
|
|
364
|
+
// A failed listen emits no 'close', so the store closes here.
|
|
365
|
+
closeStore();
|
|
366
|
+
});
|
|
367
|
+
if (handleSignals)
|
|
368
|
+
stopOnSignal(server);
|
|
369
|
+
}
|
|
324
370
|
/** 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. */
|
|
325
371
|
export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).toString('base64url'), opts) {
|
|
326
|
-
const distUiDir = path.
|
|
372
|
+
const distUiDir = path.join(PACKAGE_ROOT, 'dist-ui');
|
|
327
373
|
const hasDistUi = fs.existsSync(path.join(distUiDir, 'index.html'));
|
|
328
374
|
const now = opts?.now ?? (() => evalNow().getTime());
|
|
329
375
|
const snapshots = createSnapshotService(hippoRoot, now, opts?.cacheClock);
|
|
@@ -356,7 +402,7 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
|
|
|
356
402
|
};
|
|
357
403
|
// One id per request, so the lines it logs can be told apart from a concurrent request's.
|
|
358
404
|
const server = http.createServer((req, res) => runWithRequestId(randomUUID(), () => onRequest(req, res)));
|
|
359
|
-
server
|
|
405
|
+
superviseListener(server, snapshots, port, opts?.handleSignals === true);
|
|
360
406
|
server.listen(port, '127.0.0.1', () => {
|
|
361
407
|
// SAFETY: listen() was given a TCP port, so address() is AddressInfo, never a pipe name.
|
|
362
408
|
const boundPort = server.address().port;
|
package/dist/db/busy.d.ts
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import type { DatabaseSyncLike } from './sqlite.js';
|
|
2
|
-
export declare function isSqliteBusy(
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export declare class StoreBusyError extends Error {
|
|
6
|
-
constructor(message?: string, options?: ErrorOptions);
|
|
7
|
-
}
|
|
8
|
-
/** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
|
|
9
|
-
export declare function isStoreBusy<E>(error: E): boolean;
|
|
2
|
+
export declare function isSqliteBusy(cause: unknown): boolean;
|
|
3
|
+
/** The lock wait of an open that names none: its busy_timeout and every explicit wait below. */
|
|
4
|
+
export declare const DEFAULT_BUSY_WAIT_MS = 5000;
|
|
10
5
|
export declare function execWithBusyRetry(db: DatabaseSyncLike, sql: string, timeoutMs?: number): void;
|
|
11
6
|
/** Waits for the lock past busy_timeout when given; ignored inside a caller's transaction, which already holds it. */
|
|
12
7
|
export interface WriteScopeOptions {
|