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
package/README.md
CHANGED
|
@@ -137,7 +137,7 @@ hippo init
|
|
|
137
137
|
# Scheduled machine-level daily runner (6:15am) via crontab
|
|
138
138
|
```
|
|
139
139
|
|
|
140
|
-
To leave parts out: `--no-hooks` skips the instruction files and hooks, `--no-schedule` the daily run, and `--no-learn` the git history and agent memory import. `HIPPO_SKIP_AUTO_INTEGRATIONS=1` skips the same files and hooks that `--no-hooks` does.
|
|
140
|
+
To leave parts out: `--no-hooks` skips the instruction files and hooks, `--no-schedule` the daily run, and `--no-learn` the git history and agent memory import. `HIPPO_SKIP_AUTO_INTEGRATIONS=1` skips the same files and hooks that `--no-hooks` does, and `HIPPO_SKIP_SCHEDULE=1` skips the daily run as `--no-schedule` does.
|
|
141
141
|
|
|
142
142
|
### Agent memories
|
|
143
143
|
|
|
@@ -784,7 +784,7 @@ hippo watch "npm run build"
|
|
|
784
784
|
| `hippo dashboard` | Open web dashboard at localhost:3333 (memory health by project, and the card board); open the printed URL, which carries a per-start access token |
|
|
785
785
|
| `hippo dashboard --port <n>` | Use custom port |
|
|
786
786
|
| `hippo mcp` | Start MCP server (stdio transport) |
|
|
787
|
-
| `hippo serve` | Start the HTTP API server for this store on `127.0.0.1:6789` (`--port <n>` or `HIPPO_PORT`; `--host <host>`, which off loopback needs `HIPPO_REQUIRE_AUTH=1`) |
|
|
787
|
+
| `hippo serve` | Start the HTTP API server for this store on `127.0.0.1:6789` (`--port <n>` or `HIPPO_PORT`; `--host <host>`, which off loopback needs `HIPPO_REQUIRE_AUTH=1`). Every request needs an API key (`hippo auth create`, then `Authorization: Bearer <key>`; the hippo CLI reads `HIPPO_API_KEY`). `HIPPO_ALLOW_KEYLESS_LOCAL=1` lets requests from this machine in without one, as host admin; `HIPPO_REQUIRE_AUTH=1` wins over it |
|
|
788
788
|
| `hippo serve --tls-cert <file> --tls-key <file>` | Serve HTTPS with that PEM certificate and key (or set `HIPPO_TLS_CERT` and `HIPPO_TLS_KEY`). Without them a network bind still starts, and warns once that API keys and memory text travel in cleartext unless a TLS-terminating proxy sits in front |
|
|
789
789
|
|
|
790
790
|
On `heartbeat`, `block`, `review` and `complete`, a given `--run` is checked against the card's live run and the command is refused, unchanged, if the two do not match.
|
|
@@ -3,7 +3,6 @@ import { type MemoryEntry } from '../core/memory.js';
|
|
|
3
3
|
import { type Tally } from './report.js';
|
|
4
4
|
import type { AgentMemoryTool } from '../core/agent-memory-tools.js';
|
|
5
5
|
import type { Container } from './types.js';
|
|
6
|
-
export declare const SYNC_ACTOR = "agent-memories";
|
|
7
6
|
export interface StoreSession {
|
|
8
7
|
readonly db: DatabaseSyncLike;
|
|
9
8
|
readonly hippoRoot: string;
|
|
@@ -36,14 +35,4 @@ export interface ContainerOutcome {
|
|
|
36
35
|
}
|
|
37
36
|
/** Throws SQLITE_BUSY when another writer holds the store past its busy timeout; nothing is written then. */
|
|
38
37
|
export declare function syncContainer(s: StoreSession, work: ContainerWork): ContainerOutcome;
|
|
39
|
-
export type SetAsideWhy = 'note-gone' | 'note-changed' | 'handover' | 'project-merge' | 'project-repair';
|
|
40
|
-
export type SetAsideResult = {
|
|
41
|
-
readonly kind: 'untagged';
|
|
42
|
-
readonly entry: MemoryEntry;
|
|
43
|
-
} | {
|
|
44
|
-
readonly kind: 'dormant';
|
|
45
|
-
readonly id: string;
|
|
46
|
-
};
|
|
47
|
-
/** Design 6's set-aside on the caller's transaction: a pinned row only loses the tag, any other goes dormant, restorable. */
|
|
48
|
-
export declare function setAsideRow(db: DatabaseSyncLike, tag: string, row: MemoryEntry, why: SetAsideWhy): SetAsideResult;
|
|
49
38
|
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -1,41 +1,26 @@
|
|
|
1
1
|
// One container's sync in one transaction on the caller's handle: lookup, plan, then every write (plan designs 6 to 8).
|
|
2
2
|
import { appendAuditEvent } from '../store/audit.js';
|
|
3
3
|
import { withTrialScope, withWriteScope } from '../db/index.js';
|
|
4
|
-
import { deleteDormantRow, dormantSnapshotsBySourcePrefix,
|
|
5
|
-
import { gatedWrite } from '../
|
|
4
|
+
import { deleteDormantRow, dormantSnapshotsBySourcePrefix, readDormantSnapshot, replaceDormantEntry } from '../store/dormant.js';
|
|
5
|
+
import { gatedWrite } from '../store/gated-write.js';
|
|
6
|
+
import { strengthAblation } from '../core/ablation.js';
|
|
6
7
|
import { Layer, calculateStrength, createMemory } from '../core/memory.js';
|
|
7
8
|
import { findRejectedValue, rejectionDigest } from '../store/rejection.js';
|
|
8
9
|
import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
9
10
|
import { stampOriginProject } from '../store/entry-row.js';
|
|
10
|
-
import {
|
|
11
|
+
import { renameEntrySourceAndOriginAt, renameEntrySourceAt, setEntryTagsInTx, supersedeEntryAt } from '../store/entry-writes.js';
|
|
12
|
+
import { SYNC_ACTOR, setAsideRow } from '../store/set-aside.js';
|
|
11
13
|
import { entryIdTakenAt, selectLiveEntriesBySourcePrefix } from '../store/entry-reads.js';
|
|
12
14
|
import { markSummaryDirtyInTx } from '../store/summary-dirty.js';
|
|
13
15
|
import { itemHash } from './keys.js';
|
|
14
16
|
import { planContainer } from './plan.js';
|
|
15
17
|
import { emptyTally } from './report.js';
|
|
16
18
|
import { MIN_ITEM_CHARS, itemSource, splitSource, storedText } from './source.js';
|
|
17
|
-
export const SYNC_ACTOR = 'agent-memories';
|
|
18
19
|
/** Throws SQLITE_BUSY when another writer holds the store past its busy timeout; nothing is written then. */
|
|
19
20
|
export function syncContainer(s, work) {
|
|
20
21
|
const run = () => new ContainerRun(s, work).run();
|
|
21
22
|
return s.dryRun ? withTrialScope(s.db, 'sync_container', run) : withWriteScope(s.db, 'sync_container', run);
|
|
22
23
|
}
|
|
23
|
-
/** Design 6's set-aside on the caller's transaction: a pinned row only loses the tag, any other goes dormant, restorable. */
|
|
24
|
-
export function setAsideRow(db, tag, row, why) {
|
|
25
|
-
const untagged = { ...row, tags: row.tags.filter((t) => t !== tag) };
|
|
26
|
-
const audit = (metadata) => appendAuditEvent(db, { tenantId: row.tenantId, actor: SYNC_ACTOR, op: 'agent_memory_set_aside', targetId: row.id, metadata });
|
|
27
|
-
if (row.pinned) {
|
|
28
|
-
setEntryTagsInTx(db, untagged);
|
|
29
|
-
audit({ why, untagged: true });
|
|
30
|
-
return { kind: 'untagged', entry: untagged };
|
|
31
|
-
}
|
|
32
|
-
const now = new Date();
|
|
33
|
-
// Sleep's dormant move skips kept rows, so the steps are written out here without its filter.
|
|
34
|
-
insertDormantRow(db, { entry: untagged, strength: calculateStrength(row, now), reason: 'source-deleted', dormantAt: now.toISOString() });
|
|
35
|
-
deleteEntryRowInTx(db, row, SYNC_ACTOR);
|
|
36
|
-
audit({ why });
|
|
37
|
-
return { kind: 'dormant', id: row.id };
|
|
38
|
-
}
|
|
39
24
|
class ContainerRun {
|
|
40
25
|
s;
|
|
41
26
|
w;
|
|
@@ -223,7 +208,7 @@ class ContainerRun {
|
|
|
223
208
|
tags: [...tags, this.tag],
|
|
224
209
|
last_retrieved: now.toISOString(),
|
|
225
210
|
};
|
|
226
|
-
if (!this.gated(stampOriginProject(this.s.hippoRoot, { ...revived, strength: calculateStrength(revived, now) })))
|
|
211
|
+
if (!this.gated(stampOriginProject(this.s.hippoRoot, { ...revived, strength: calculateStrength(revived, now, { ablation: strengthAblation() }) })))
|
|
227
212
|
return;
|
|
228
213
|
deleteDormantRow(this.s.db, this.s.tenantId, dormantId);
|
|
229
214
|
appendAuditEvent(this.s.db, {
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { type ProjectIdentity } from '../core/project-identity.js';
|
|
2
2
|
import type { Adapter, AdapterContext, Listing } from './types.js';
|
|
3
|
-
/** Claude Code's rule: a linked worktree shares its main checkout's folder, or the git folder's when that sits outside
|
|
3
|
+
/** Claude Code's rule: a linked worktree shares its main checkout's folder, or the git folder's when that sits outside
|
|
4
|
+
* a checkout (a bare repository, or --separate-git-dir); any other checkout, a submodule included, keeps its own. */
|
|
4
5
|
export declare function claudeCheckoutRoot(top: string, gitDir: string, common: string): string;
|
|
5
6
|
/** Claude Code's folder name for a path: non-alphanumerics made '-', and a name over 200 characters cut to 200 plus a base-36 hash of the whole path. */
|
|
6
7
|
export declare function claudeFolderName(root: string): string;
|
|
7
8
|
export declare const claudeCodeAdapter: Adapter;
|
|
8
9
|
/** A session's own notes folder and nothing else, with no git call, so post-compact can read it inside the hook's time limit. */
|
|
9
10
|
export declare function claudeTranscriptListing(ctx: AdapterContext, transcriptPath: string): Listing;
|
|
10
|
-
/** The project a session folder's notes belong to: the one Claude named the folder
|
|
11
|
+
/** The project a session folder's notes belong to: the one Claude named the folder
|
|
12
|
+
* for, the session's start folder, else cwd or a parent; null when none matches. */
|
|
11
13
|
export declare function transcriptNotesProject(transcriptPath: string, cwd: string | null, machine: Pick<AdapterContext, 'platform' | 'env'>): ProjectIdentity | null;
|
|
12
14
|
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -4,7 +4,7 @@ import path from 'node:path';
|
|
|
4
4
|
import { resolveProjectIdentity } from '../core/project-identity.js';
|
|
5
5
|
import { realpathOrResolve } from '../util/real-path.js';
|
|
6
6
|
import { isStringValue } from '../core/capture-contract.js';
|
|
7
|
-
import { claudeConfigDir } from '../
|
|
7
|
+
import { claudeConfigDir } from '../util/agent-homes.js';
|
|
8
8
|
import { expandHome, frontmatterField, itemTime, readTextFile, splitFrontmatter } from './files.js';
|
|
9
9
|
import { markdownNotes, readFolderStore, uniqueFolders } from './folder-store.js';
|
|
10
10
|
import { gitLayout } from './git.js';
|
|
@@ -21,7 +21,8 @@ function claudeMemoryFolderNames(projectRoot, platform) {
|
|
|
21
21
|
roots.push(claudeCheckoutRoot(layout.top, layout.gitDir, layout.common));
|
|
22
22
|
return new Set(roots.map((root) => (platform === 'win32' ? claudeFolderName(root).toLowerCase() : claudeFolderName(root))));
|
|
23
23
|
}
|
|
24
|
-
/** Claude Code's rule: a linked worktree shares its main checkout's folder, or the git folder's when that sits outside
|
|
24
|
+
/** Claude Code's rule: a linked worktree shares its main checkout's folder, or the git folder's when that sits outside
|
|
25
|
+
* a checkout (a bare repository, or --separate-git-dir); any other checkout, a submodule included, keeps its own. */
|
|
25
26
|
export function claudeCheckoutRoot(top, gitDir, common) {
|
|
26
27
|
if (gitDir === common)
|
|
27
28
|
return top;
|
|
@@ -55,7 +56,8 @@ export function claudeTranscriptListing(ctx, transcriptPath) {
|
|
|
55
56
|
const folder = path.join(path.dirname(transcriptPath), 'memory');
|
|
56
57
|
return { tool: 'claude-code', home: config, containers: readFolders([folder], 'project', ctx.platform), warnings: [] };
|
|
57
58
|
}
|
|
58
|
-
/** The project a session folder's notes belong to: the one Claude named the folder
|
|
59
|
+
/** The project a session folder's notes belong to: the one Claude named the folder
|
|
60
|
+
* for, the session's start folder, else cwd or a parent; null when none matches. */
|
|
59
61
|
export function transcriptNotesProject(transcriptPath, cwd, machine) {
|
|
60
62
|
const fold = (name) => (machine.platform === 'win32' ? name.toLowerCase() : name);
|
|
61
63
|
const folder = fold(path.basename(path.dirname(transcriptPath)));
|
|
@@ -79,9 +81,16 @@ export function transcriptNotesProject(transcriptPath, cwd, machine) {
|
|
|
79
81
|
const START_SCAN_BYTES = 64 * 1024;
|
|
80
82
|
/** The cwd on the transcript's first line that has one: the folder Claude named the session folder for, which a folder name alone cannot give back. */
|
|
81
83
|
function transcriptStartCwd(transcriptPath) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
let fd;
|
|
85
|
+
try {
|
|
86
|
+
fd = fs.openSync(transcriptPath, 'r');
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
// A transcript that is not there names no start folder; any other failure is the caller's to see.
|
|
90
|
+
if (err instanceof Error && 'code' in err && (err.code === 'ENOENT' || err.code === 'ENOTDIR'))
|
|
91
|
+
return null;
|
|
92
|
+
throw err;
|
|
93
|
+
}
|
|
85
94
|
try {
|
|
86
95
|
const buf = Buffer.alloc(START_SCAN_BYTES);
|
|
87
96
|
const lines = buf.subarray(0, fs.readSync(fd, buf, 0, buf.length, 0)).toString('utf8').split('\n');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Codex CLI's memory_summary.md, the one memory file Codex puts in its prompt, read as a single text-keyed file.
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import { codexHomeDir } from '../
|
|
4
|
+
import { codexHomeDir } from '../util/agent-homes.js';
|
|
5
5
|
import { readTextFile } from './files.js';
|
|
6
6
|
import { textItemKeys } from './keys.js';
|
|
7
7
|
import { splitMarkdownItems } from './markdown.js';
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import type { Adapter
|
|
2
|
-
/** VS Code's user-data resolution: portable install first, then the app-data override, then the platform default. */
|
|
3
|
-
export declare function vscodeDataFolders(ctx: Pick<AdapterContext, 'env' | 'home' | 'platform'>): string[];
|
|
1
|
+
import type { Adapter } from './types.js';
|
|
4
2
|
export declare const copilotAdapter: Adapter;
|
|
5
3
|
//# sourceMappingURL=copilot.d.ts.map
|
|
@@ -5,24 +5,8 @@ import { readTextFile } from './files.js';
|
|
|
5
5
|
import { readFolderStore } from './folder-store.js';
|
|
6
6
|
import { gitLayout } from './git.js';
|
|
7
7
|
import { errorMessage } from '../util/log.js';
|
|
8
|
-
|
|
8
|
+
import { vscodeDataFolders } from '../util/agent-homes.js';
|
|
9
9
|
const MEMORY_TOOL = ['github.copilot-chat', 'memory-tool', 'memories'];
|
|
10
|
-
/** VS Code's user-data resolution: portable install first, then the app-data override, then the platform default. */
|
|
11
|
-
export function vscodeDataFolders(ctx) {
|
|
12
|
-
const { env, home, platform } = ctx;
|
|
13
|
-
if (env.VSCODE_PORTABLE)
|
|
14
|
-
return [path.join(env.VSCODE_PORTABLE, 'user-data')];
|
|
15
|
-
let appData;
|
|
16
|
-
if (env.VSCODE_APPDATA)
|
|
17
|
-
appData = env.VSCODE_APPDATA;
|
|
18
|
-
else if (platform === 'win32')
|
|
19
|
-
appData = env.APPDATA || path.join(home, 'AppData', 'Roaming');
|
|
20
|
-
else if (platform === 'darwin')
|
|
21
|
-
appData = path.join(home, 'Library', 'Application Support');
|
|
22
|
-
else
|
|
23
|
-
appData = env.XDG_CONFIG_HOME || path.join(home, '.config');
|
|
24
|
-
return PRODUCTS.map((product) => path.join(appData, product));
|
|
25
|
-
}
|
|
26
10
|
/** A `file:` URI as a local path; null for any other scheme or a URI with a host part. */
|
|
27
11
|
function fileUriToPath(uri, platform) {
|
|
28
12
|
if (!uri.startsWith('file://'))
|
|
@@ -7,23 +7,34 @@ const MAX_DEPTH = 8;
|
|
|
7
7
|
/** A file's text, or why it was skipped: empty, too big, holds a NUL byte (not text), or unreadable. */
|
|
8
8
|
export function readTextFile(file) {
|
|
9
9
|
try {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const buf = fs.readFileSync(file);
|
|
19
|
-
if (buf.includes(0))
|
|
20
|
-
return { ok: false, reason: `${file}: not text` };
|
|
21
|
-
return { ok: true, text: buf.toString('utf8'), mtimeMs: stat.mtimeMs };
|
|
10
|
+
// O_NONBLOCK opens a FIFO at once, for the file check to turn away; Windows has no such flag and the OR adds nothing.
|
|
11
|
+
const fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK);
|
|
12
|
+
try {
|
|
13
|
+
return readOpenTextFile(file, fd);
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
fs.closeSync(fd);
|
|
17
|
+
}
|
|
22
18
|
}
|
|
23
19
|
catch (err) {
|
|
24
20
|
return { ok: false, reason: `${file}: ${errorMessage(err)}` };
|
|
25
21
|
}
|
|
26
22
|
}
|
|
23
|
+
/** The checks and the read on one descriptor, so the file measured is the file read. */
|
|
24
|
+
function readOpenTextFile(file, fd) {
|
|
25
|
+
const stat = fs.fstatSync(fd);
|
|
26
|
+
if (!stat.isFile())
|
|
27
|
+
return { ok: false, reason: `${file}: not a file` };
|
|
28
|
+
// A tool rewriting a file truncates it first; read as holding no notes, every row would be set aside.
|
|
29
|
+
if (stat.size === 0)
|
|
30
|
+
return { ok: false, reason: `${file}: empty` };
|
|
31
|
+
if (stat.size > MAX_ITEM_BYTES)
|
|
32
|
+
return { ok: false, reason: `${file}: over ${MAX_ITEM_BYTES} bytes` };
|
|
33
|
+
const buf = fs.readFileSync(fd);
|
|
34
|
+
if (buf.includes(0))
|
|
35
|
+
return { ok: false, reason: `${file}: not text` };
|
|
36
|
+
return { ok: true, text: buf.toString('utf8'), mtimeMs: stat.mtimeMs };
|
|
37
|
+
}
|
|
27
38
|
/** Files in a folder as '/'-separated relative paths, sorted; dot entries skipped, symlinked folders not followed. */
|
|
28
39
|
export function listFiles(dir, opts) {
|
|
29
40
|
if (!fs.existsSync(dir))
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Splits one markdown memory file into items (a top-level bullet or a paragraph), each tagged with its heading. Pure.
|
|
3
|
-
*/
|
|
1
|
+
/** Splits one markdown memory file into items (a top-level bullet or a paragraph), each tagged with its heading. Pure. */
|
|
4
2
|
export interface MarkdownItem {
|
|
5
3
|
readonly heading: string;
|
|
6
4
|
readonly headingSlug: string;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Splits one markdown memory file into items (a top-level bullet or a paragraph), each tagged with its heading. Pure.
|
|
3
|
-
*/
|
|
1
|
+
/** Splits one markdown memory file into items (a top-level bullet or a paragraph), each tagged with its heading. Pure. */
|
|
4
2
|
const HEADING = /^#{1,6}\s+/;
|
|
5
3
|
// Column 0 only: an indented marker is a sub-bullet and stays inside its item.
|
|
6
4
|
const BULLET = /^(?:[-*+]|\d+[.)]) /;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProjectTagReads } from '../store/project-tags.js';
|
|
2
|
+
export interface ProjectFold {
|
|
3
|
+
readonly from: string;
|
|
4
|
+
readonly into: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function foldEdges(store: Pick<ProjectTagReads, 'auditEvents'>): ProjectFold[];
|
|
7
|
+
export declare function foldedInto(edges: readonly ProjectFold[], names: readonly string[]): string[];
|
|
8
|
+
/** Names folded, directly or through others, into one of `names`; the sync moves imports still filed under them. */
|
|
9
|
+
export declare function namesFoldedInto(store: Pick<ProjectTagReads, 'auditEvents'>, names: readonly string[]): string[];
|
|
10
|
+
//# sourceMappingURL=project-folds.d.ts.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Project names folded into others, read from the audit trail: the sync files imports under the surviving name, and `hippo projects` repair agrees.
|
|
2
|
+
import { isObjectLike, isStringValue } from '../core/capture-contract.js';
|
|
3
|
+
function foldOf(value) {
|
|
4
|
+
if (!isObjectLike(value) || Array.isArray(value))
|
|
5
|
+
return [];
|
|
6
|
+
const { from, into } = value;
|
|
7
|
+
return isStringValue(from) && isStringValue(into) ? [{ from, into }] : [];
|
|
8
|
+
}
|
|
9
|
+
export function foldEdges(store) {
|
|
10
|
+
return [
|
|
11
|
+
...store.auditEvents('project_merge').flatMap((e) => foldOf(e.metadata)),
|
|
12
|
+
...store.auditEvents('project_repair')
|
|
13
|
+
.flatMap((e) => (Array.isArray(e.metadata.folds) ? e.metadata.folds.flatMap(foldOf) : [])),
|
|
14
|
+
];
|
|
15
|
+
}
|
|
16
|
+
export function foldedInto(edges, names) {
|
|
17
|
+
const seen = new Set(names);
|
|
18
|
+
let grew = true;
|
|
19
|
+
while (grew) {
|
|
20
|
+
grew = false;
|
|
21
|
+
for (const { from, into } of edges) {
|
|
22
|
+
if (!seen.has(into) || seen.has(from))
|
|
23
|
+
continue;
|
|
24
|
+
seen.add(from);
|
|
25
|
+
grew = true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return [...seen].filter((n) => !names.includes(n));
|
|
29
|
+
}
|
|
30
|
+
/** Names folded, directly or through others, into one of `names`; the sync moves imports still filed under them. */
|
|
31
|
+
export function namesFoldedInto(store, names) {
|
|
32
|
+
return foldedInto(foldEdges(store), names);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=project-folds.js.map
|
|
@@ -47,7 +47,8 @@ export function totalTally(report) {
|
|
|
47
47
|
const plural = (n, one, many) => `${n} ${n === 1 ? one : many}`;
|
|
48
48
|
const TALLY_WORDS = {
|
|
49
49
|
imported: 'new', replaced: 'replaced', restored: 'brought back', setAside: 'set aside', untagged: 'pinned and kept',
|
|
50
|
-
unchanged: 'unchanged', adopted: 'taken over from the old Claude import', renamed: 'moved to the project id', collapsed: 'duplicates folded',
|
|
50
|
+
unchanged: 'unchanged', adopted: 'taken over from the old Claude import', renamed: 'moved to the project id', collapsed: 'duplicates folded',
|
|
51
|
+
retagged: 'retagged',
|
|
51
52
|
handedOver: 'handed over from the global store', duplicate: 'already stored', secret: 'skipped for a secret', short: 'too short',
|
|
52
53
|
rejected: 'skipped as rejected', unread: 'files skipped', unreadable: 'unreadable folders', busy: 'busy folders',
|
|
53
54
|
};
|
|
@@ -24,9 +24,11 @@ export declare function importForStore(hippoRoot: string, opts: SyncOptions): Im
|
|
|
24
24
|
export declare function importProjectMemories(hippoRoot: string, opts: SyncOptions): ImportReport;
|
|
25
25
|
/** Every tool's user-level memory into the global store, created on demand, with no origin. */
|
|
26
26
|
export declare function importUserMemories(invokingRoot: string, opts: SyncOptions): ImportReport;
|
|
27
|
-
/** Session end in a folder with no store of its own: the session's project into the
|
|
27
|
+
/** Session end in a folder with no store of its own: the session's project into the
|
|
28
|
+
* global store with its origin, the session folder's notes, then the user pass. */
|
|
28
29
|
export declare function importAtSessionEnd(cwd: string, transcriptPath: string | undefined, opts: SyncOptions): ImportReport;
|
|
29
|
-
/** The session folder's notes under the project Claude filed them for, never cwd's: a session begun at
|
|
30
|
+
/** The session folder's notes under the project Claude filed them for, never cwd's: a session begun at
|
|
31
|
+
* home keeps its home notes user-global wherever it ends. No git call, so post-compact can run it. */
|
|
30
32
|
export declare function importSessionFolder(hippoRoot: string, transcriptPath: string, cwd: string | null, opts: SyncOptions): ImportReport;
|
|
31
33
|
/** The variable when set (empty or `none` is off); else the tools both the invoking and the target store's config allow. */
|
|
32
34
|
export declare function allowedTools(env: Machine['env'], invoking: string, target: string, warnings: string[]): Set<ToolId>;
|
|
@@ -6,16 +6,18 @@ import path from 'node:path';
|
|
|
6
6
|
import { errorMessage } from '../util/log.js';
|
|
7
7
|
import { loadConfig } from '../core/config.js';
|
|
8
8
|
import { closeHippoDb, isSqliteBusy, openHippoDb, outsideRequestStores, withWriteScope } from '../db/index.js';
|
|
9
|
-
import { namesFoldedInto } from '
|
|
10
|
-
import {
|
|
9
|
+
import { namesFoldedInto } from './project-folds.js';
|
|
10
|
+
import { projectTagReads } from '../store/project-tags.js';
|
|
11
|
+
import { isGlobalStoreRoot, isInitialized, projectNames, resolveGlobalRootDir, resolveProjectIdentity, } from '../core/project-identity.js';
|
|
11
12
|
import { duplicateKey, heldTextKeys } from '../util/same-text.js';
|
|
12
13
|
import { removeEntryMirrors } from '../store/mirrors.js';
|
|
13
|
-
import { initStore
|
|
14
|
+
import { initStore } from '../store/open.js';
|
|
14
15
|
import { writeEntryMirrors } from '../store/entry-writes.js';
|
|
15
16
|
import { selectLiveEntriesBySourcePrefix, selectRowsOutsideSourcePrefixAt } from '../store/entry-reads.js';
|
|
16
17
|
import { updateStats } from '../store/index-and-stats.js';
|
|
17
18
|
import { resolveTenantId } from '../store/tenant.js';
|
|
18
|
-
import { setAsideRow
|
|
19
|
+
import { setAsideRow } from '../store/set-aside.js';
|
|
20
|
+
import { syncContainer } from './apply.js';
|
|
19
21
|
import { claudeCodeAdapter, claudeTranscriptListing, transcriptNotesProject } from './claude-code.js';
|
|
20
22
|
import { codexAdapter } from './codex.js';
|
|
21
23
|
import { copilotAdapter } from './copilot.js';
|
|
@@ -44,29 +46,34 @@ export function importForStore(hippoRoot, opts) {
|
|
|
44
46
|
export function importProjectMemories(hippoRoot, opts) {
|
|
45
47
|
const ctx = context(opts.machine, { projectRoot: path.dirname(hippoRoot) });
|
|
46
48
|
return runPass({
|
|
47
|
-
scope: 'project', target: hippoRoot, invoking: hippoRoot, list: (a) => a.list(ctx, 'project'), legacy: true, originProject: undefined,
|
|
49
|
+
scope: 'project', target: hippoRoot, invoking: hippoRoot, list: (a) => a.list(ctx, 'project'), legacy: true, originProject: undefined,
|
|
50
|
+
legacyOrigins: [], handover: true,
|
|
48
51
|
}, opts);
|
|
49
52
|
}
|
|
50
53
|
/** Every tool's user-level memory into the global store, created on demand, with no origin. */
|
|
51
54
|
export function importUserMemories(invokingRoot, opts) {
|
|
52
55
|
const ctx = context(opts.machine, {});
|
|
53
56
|
return runPass({
|
|
54
|
-
scope: 'user', target: resolveGlobalRootDir(), invoking: invokingRoot, list: (a) => a.list(ctx, 'user'), legacy: false, originProject: '',
|
|
57
|
+
scope: 'user', target: resolveGlobalRootDir(), invoking: invokingRoot, list: (a) => a.list(ctx, 'user'), legacy: false, originProject: '',
|
|
58
|
+
legacyOrigins: [], handover: false,
|
|
55
59
|
}, opts);
|
|
56
60
|
}
|
|
57
|
-
/** Session end in a folder with no store of its own: the session's project into the
|
|
61
|
+
/** Session end in a folder with no store of its own: the session's project into the
|
|
62
|
+
* global store with its origin, the session folder's notes, then the user pass. */
|
|
58
63
|
export function importAtSessionEnd(cwd, transcriptPath, opts) {
|
|
59
64
|
const globalRoot = resolveGlobalRootDir();
|
|
60
65
|
const ctx = context(opts.machine, { projectRoot: cwd });
|
|
61
66
|
const report = runPass({
|
|
62
|
-
scope: 'project', target: globalRoot, invoking: globalRoot, list: (a) => a.list(ctx, 'project'), legacy: false,
|
|
67
|
+
scope: 'project', target: globalRoot, invoking: globalRoot, list: (a) => a.list(ctx, 'project'), legacy: false,
|
|
68
|
+
...projectOrigins(resolveProjectIdentity(cwd)), handover: false,
|
|
63
69
|
}, opts);
|
|
64
70
|
if (transcriptPath !== undefined)
|
|
65
71
|
mergeReports(report, importSessionFolder(globalRoot, transcriptPath, cwd, opts));
|
|
66
72
|
mergeReports(report, importUserMemories(globalRoot, opts));
|
|
67
73
|
return report;
|
|
68
74
|
}
|
|
69
|
-
/** The session folder's notes under the project Claude filed them for, never cwd's: a session begun at
|
|
75
|
+
/** The session folder's notes under the project Claude filed them for, never cwd's: a session begun at
|
|
76
|
+
* home keeps its home notes user-global wherever it ends. No git call, so post-compact can run it. */
|
|
70
77
|
export function importSessionFolder(hippoRoot, transcriptPath, cwd, opts) {
|
|
71
78
|
const project = transcriptNotesProject(transcriptPath, cwd, opts.machine);
|
|
72
79
|
if (project === null)
|
|
@@ -225,7 +232,7 @@ function syncStore(pass, listings, store, opts, report) {
|
|
|
225
232
|
/** The legacy names plus every name a merge or repair folded into the project; the audit read runs once per pass. */
|
|
226
233
|
function earlierNames(db, tenantId, id, legacyOrigins) {
|
|
227
234
|
const names = [id, ...legacyOrigins];
|
|
228
|
-
return [...legacyOrigins, ...namesFoldedInto(db, tenantId, names)].filter((n) => n !== '' && n !== id);
|
|
235
|
+
return [...legacyOrigins, ...namesFoldedInto(projectTagReads(db, tenantId), names)].filter((n) => n !== '' && n !== id);
|
|
229
236
|
}
|
|
230
237
|
function containerWork(tool, container, options) {
|
|
231
238
|
const { platform, legacy, origin, earlier } = options;
|
|
@@ -311,7 +318,7 @@ function handOver(synced, projectRoot, opts, report) {
|
|
|
311
318
|
// A folder with no git and no marker wrote as '' before its store existed, and as its own name after.
|
|
312
319
|
// Names folded into this project's in the global store were its rows too.
|
|
313
320
|
const names = projectNames(resolveProjectIdentity(projectRoot));
|
|
314
|
-
const origins = [...new Set([...names, ...namesFoldedInto(db, tenantId, names), ''])];
|
|
321
|
+
const origins = [...new Set([...names, ...namesFoldedInto(projectTagReads(db, tenantId), names), ''])];
|
|
315
322
|
for (const work of synced)
|
|
316
323
|
handOverContainer(db, globalRoot, tenantId, work, { origins, platform: opts.machine.platform, report });
|
|
317
324
|
}
|
package/dist/api/assemble.d.ts
CHANGED
|
@@ -9,19 +9,10 @@ export interface AssembleOpts {
|
|
|
9
9
|
/** Substitute parent summaries for older raws when ≥2 share a level-2
|
|
10
10
|
* ancestor. Default true. */
|
|
11
11
|
summarizeOlder?: boolean;
|
|
12
|
-
/**
|
|
13
|
-
*
|
|
14
|
-
* `recall`: when set, exact match required (so an authorised caller can
|
|
15
|
-
* assemble a `slack:private:CSEC` session by passing scope explicitly).
|
|
16
|
-
* When undefined, default-deny applies to ANY `<source>:private:*` and
|
|
17
|
-
* `unknown:legacy` rows.
|
|
18
|
-
*/
|
|
12
|
+
/** Exact scope match when set, so an authorised caller can assemble a private session.
|
|
13
|
+
* When undefined, default-deny applies to every `<source>:private:*` and `unknown:legacy` row. */
|
|
19
14
|
scope?: string;
|
|
20
|
-
/**
|
|
21
|
-
* Hard row cap on the SELECT that loads session raws. Default 5000 to
|
|
22
|
-
* protect against degenerate sessions. When the cap is hit, `truncated`
|
|
23
|
-
* is set on the result so the caller knows to widen.
|
|
24
|
-
*/
|
|
15
|
+
/** Hard row cap on the SELECT that loads session raws (default 5000); `truncated` is set when it is hit. */
|
|
25
16
|
rowCap?: number;
|
|
26
17
|
cost?: AssembleCost;
|
|
27
18
|
project?: CallerProject;
|
|
@@ -51,42 +42,14 @@ export interface AssembleResult {
|
|
|
51
42
|
sessionId: string;
|
|
52
43
|
items: AssembledContextItem[];
|
|
53
44
|
tokens: number;
|
|
54
|
-
/**
|
|
55
|
-
* Tenant + scope-filtered raw row count for the session, uncapped by `rowCap`, so
|
|
56
|
-
* "session has N msgs" stays accurate when items[] is the windowed view.
|
|
57
|
-
*/
|
|
45
|
+
/** Tenant + scope-filtered raw row count, uncapped by `rowCap`, so "session has N msgs" stays accurate for a windowed items[]. */
|
|
58
46
|
totalRaw: number;
|
|
59
47
|
summarized: number;
|
|
60
48
|
evicted: number;
|
|
61
|
-
/**
|
|
62
|
-
* True when `rowCap` truncated the loaded window. The cap keeps the NEWEST
|
|
63
|
-
* rows, so the items[] array represents the freshest tail of the session;
|
|
64
|
-
* older rows beyond the cap are silently absent. Use `totalRaw - items.length
|
|
65
|
-
* - summarized + ...` to estimate how much you didn't see, or widen `rowCap`.
|
|
66
|
-
*/
|
|
49
|
+
/** True when `rowCap` truncated the window; the cap keeps the NEWEST rows, so older rows beyond it are absent. */
|
|
67
50
|
truncated: boolean;
|
|
68
51
|
}
|
|
69
|
-
/**
|
|
70
|
-
*
|
|
71
|
-
* lossless-claw context-engine pattern to Hippo's score-ranked memory store.
|
|
72
|
-
*
|
|
73
|
-
* Algorithm:
|
|
74
|
-
* 1. Load all kind='raw' rows for the session, tenant + scope filtered.
|
|
75
|
-
* 2. Split: newest `freshTailCount` are protected (fresh tail).
|
|
76
|
-
* 3. For older rows, when ≥2 share a level-2 parent, substitute the
|
|
77
|
-
* summary; everything else passes through as raw.
|
|
78
|
-
* 4. Hippo-additive eviction: when over-budget, drop the lowest-strength
|
|
79
|
-
* non-fresh-tail item first. Fresh-tail rows are never evicted.
|
|
80
|
-
*
|
|
81
|
-
* Strength-weighted eviction is the differentiator from lossless-claw,
|
|
82
|
-
* which evicts oldest-first. A high-strength older row (high retrieval
|
|
83
|
-
* count, slow decay) survives; a low-strength recent row (newer but
|
|
84
|
-
* unimportant) goes first.
|
|
85
|
-
*
|
|
86
|
-
* Returns `items: []` cleanly when:
|
|
87
|
-
* - sessionId is empty
|
|
88
|
-
* - no raws exist for the session
|
|
89
|
-
* - all rows fail the scope/tenant filter
|
|
90
|
-
*/
|
|
52
|
+
/** Chronological context window for a session; over budget, evicts the lowest-strength non-fresh-tail item first (fresh tail is never evicted).
|
|
53
|
+
* Returns `items: []` for an empty sessionId, no raws, or when every row fails the scope/tenant filter. */
|
|
91
54
|
export declare function assemble(ctx: Context, sessionId: string, opts?: AssembleOpts): Promise<AssembleResult>;
|
|
92
55
|
//# sourceMappingURL=assemble.d.ts.map
|
package/dist/api/assemble.js
CHANGED
|
@@ -1,33 +1,13 @@
|
|
|
1
1
|
// Session context assembly under a token budget.
|
|
2
2
|
import { requireGroup, storeFor } from '../store/index.js';
|
|
3
3
|
import { estimateTokens } from '../util/token-text.js';
|
|
4
|
-
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../
|
|
4
|
+
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../core/recall-scope.js';
|
|
5
5
|
import { classifyOriginProject, projectNames } from '../core/project-identity.js';
|
|
6
6
|
const DEFAULT_FRESH_TAIL_COUNT = 10;
|
|
7
7
|
const DEFAULT_ROW_CAP = 5000;
|
|
8
8
|
export const DEFAULT_ASSEMBLE_BUDGET = 4000;
|
|
9
|
-
/**
|
|
10
|
-
*
|
|
11
|
-
* lossless-claw context-engine pattern to Hippo's score-ranked memory store.
|
|
12
|
-
*
|
|
13
|
-
* Algorithm:
|
|
14
|
-
* 1. Load all kind='raw' rows for the session, tenant + scope filtered.
|
|
15
|
-
* 2. Split: newest `freshTailCount` are protected (fresh tail).
|
|
16
|
-
* 3. For older rows, when ≥2 share a level-2 parent, substitute the
|
|
17
|
-
* summary; everything else passes through as raw.
|
|
18
|
-
* 4. Hippo-additive eviction: when over-budget, drop the lowest-strength
|
|
19
|
-
* non-fresh-tail item first. Fresh-tail rows are never evicted.
|
|
20
|
-
*
|
|
21
|
-
* Strength-weighted eviction is the differentiator from lossless-claw,
|
|
22
|
-
* which evicts oldest-first. A high-strength older row (high retrieval
|
|
23
|
-
* count, slow decay) survives; a low-strength recent row (newer but
|
|
24
|
-
* unimportant) goes first.
|
|
25
|
-
*
|
|
26
|
-
* Returns `items: []` cleanly when:
|
|
27
|
-
* - sessionId is empty
|
|
28
|
-
* - no raws exist for the session
|
|
29
|
-
* - all rows fail the scope/tenant filter
|
|
30
|
-
*/
|
|
9
|
+
/** Chronological context window for a session; over budget, evicts the lowest-strength non-fresh-tail item first (fresh tail is never evicted).
|
|
10
|
+
* Returns `items: []` for an empty sessionId, no raws, or when every row fails the scope/tenant filter. */
|
|
31
11
|
export async function assemble(ctx, sessionId, opts = {}) {
|
|
32
12
|
assertScopeRequestAllowed(ctx.actor, opts.scope);
|
|
33
13
|
const budget = opts.budget ?? DEFAULT_ASSEMBLE_BUDGET;
|
package/dist/api/audit.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type AuditEvent, type AuditOp } from '../store/audit.js';
|
|
2
|
+
import { type AuditIssue, type AuditResult } from '../core/memory-audit.js';
|
|
3
|
+
import { type QualityRepairResult } from '../store/quality-repair.js';
|
|
2
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
3
5
|
import type { Context } from './types.js';
|
|
4
6
|
export interface AuditListOpts {
|
|
@@ -11,4 +13,34 @@ export interface AuditListOpts {
|
|
|
11
13
|
}
|
|
12
14
|
/** Read audit events scoped to `ctx.tenantId` on the store the request runs on. Read-only, no audit emit. */
|
|
13
15
|
export declare function auditList(ctx: Context, opts: AuditListOpts): Promise<AuditEvent[]>;
|
|
16
|
+
/** The pass that removes audit errors; it leads the reason on each forget row. */
|
|
17
|
+
export type AuditPass = 'audit --fix' | 'sleep-audit';
|
|
18
|
+
/** Delete the memories an audit marked as errors, each with its own forget row, and answer the ids that went: a pinned or raw row stays. */
|
|
19
|
+
export declare function removeAuditErrors(ctx: Context, pass: AuditPass, issues: readonly AuditIssue[]): string[];
|
|
20
|
+
/** The caller's memories run through the quality audit; a memory that backs an object is never marked for removal. */
|
|
21
|
+
export declare function auditMemoryQuality(ctx: Context): AuditResult;
|
|
22
|
+
/** Audit repair for the caller's tenant: a preview, or with `apply` the moves of certain defects to dormant storage behind a backup. */
|
|
23
|
+
export declare function repairMemoryQuality(ctx: Context, apply: boolean): QualityRepairResult;
|
|
24
|
+
/** The repair sleep and the daily runner apply once per store after an upgrade; null when it already ran there. */
|
|
25
|
+
export declare function repairMemoryQualityOnce(ctx: Context): QualityRepairResult | null;
|
|
26
|
+
export interface PruneAuditOpts {
|
|
27
|
+
/** Cutoff in days. Rows with `ts < (now - N days)` are deleted. */
|
|
28
|
+
olderThanDays: number;
|
|
29
|
+
/** When true, count matching rows but do NOT delete. Default false. */
|
|
30
|
+
dryRun?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface PruneAuditResult {
|
|
33
|
+
/** ISO timestamp of the cutoff. Rows with ts strictly less than this were deleted. */
|
|
34
|
+
cutoff: string;
|
|
35
|
+
/** Number of audit_log rows deleted (or that would be deleted, if dryRun). */
|
|
36
|
+
count: number;
|
|
37
|
+
/** Echo back whether this was a dry run. */
|
|
38
|
+
dryRun: boolean;
|
|
39
|
+
}
|
|
40
|
+
/** Cutoff ISO timestamp for N days ago; exported so tests can pin "now" without mocking Date. */
|
|
41
|
+
export declare function computeCutoff(days: number, now?: Date): string;
|
|
42
|
+
/** Delete the caller's tenant's audit_log rows older than `olderThanDays`, then record an `audit_prune` row as `ctx.actor`; opt-in, since
|
|
43
|
+
* retention floors (HIPAA, SOX, GDPR) apply. The row is written after the DELETE, so a call never prunes its own record.
|
|
44
|
+
* Throws on non-positive days or an empty tenant. */
|
|
45
|
+
export declare function pruneAuditLog(ctx: Context, opts: PruneAuditOpts): PruneAuditResult;
|
|
14
46
|
//# sourceMappingURL=audit.d.ts.map
|