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
|
@@ -1,32 +1,18 @@
|
|
|
1
|
-
/** Minimal inline frontmatter split
|
|
2
|
-
*
|
|
3
|
-
* block removed. When no well-formed block is present, `fm` is empty and
|
|
4
|
-
* `body` is the original content. */
|
|
1
|
+
/** Minimal inline frontmatter split (no YAML dep) on a leading `---\n...\n---\n` block; returns the key-value map plus the body,
|
|
2
|
+
* or an empty `fm` and the original content when no well-formed block is present. */
|
|
5
3
|
interface FrontmatterParseResult {
|
|
6
4
|
fm: Record<string, string>;
|
|
7
5
|
body: string;
|
|
8
6
|
}
|
|
9
7
|
export declare function splitMarkdownFrontmatter(raw: string): FrontmatterParseResult;
|
|
10
|
-
/** Pull a frontmatter field that may be a YAML flow list (`[a, b]`), a
|
|
11
|
-
*
|
|
12
|
-
* and surrounding brackets are stripped; empty entries dropped. */
|
|
8
|
+
/** Pull a frontmatter field that may be a YAML flow list (`[a, b]`), a comma-separated scalar, or one token into a string[];
|
|
9
|
+
* quotes and brackets are stripped and empty entries dropped. */
|
|
13
10
|
export declare function frontmatterList(value: string | undefined): string[];
|
|
14
|
-
/** Parse `[[wikilinks]]` from body text
|
|
15
|
-
*
|
|
16
|
-
* target strings (trimmed). Embeds (`![[…]]`) are intentionally matched too —
|
|
17
|
-
* the leading `!` is not part of the `[[…]]` capture, so an embed contributes
|
|
18
|
-
* its target as a candidate, which is the desired no-crash baseline behaviour. */
|
|
11
|
+
/** Parse `[[wikilinks]]` from body text: `[[target]]` and `[[target|alias]]` both yield `target`; de-duplicated, order-preserving.
|
|
12
|
+
* Embeds (`![[...]]`) match too, because the leading `!` is outside the capture and a candidate target is harmless. */
|
|
19
13
|
export declare function parseWikilinks(body: string): string[];
|
|
20
|
-
/** Recursively collect files
|
|
21
|
-
*
|
|
22
|
-
* Symlinks are not followed. Skips dot-directories (the default `.hippo` store,
|
|
23
|
-
* `.git`, `.obsidian`, `.trash`) AND the canonicalized Hippo store path during
|
|
24
|
-
* the walk, so re-importing a vault that CONTAINS the store never ingests its own
|
|
25
|
-
* markdown mirror files (codex R5 P1: `hippo import --vault .` after `hippo
|
|
26
|
-
* init` in the vault would otherwise self-import its mirror rows and grow on
|
|
27
|
-
* every run). The root-IS-the-store case is handled one level up in
|
|
28
|
-
* importVault (a no-op early return), NOT here: returning [] for it would feed
|
|
29
|
-
* the deletion-sync an empty scan that mass-archives every live row (codex R8). */
|
|
14
|
+
/** Recursively collect files matching `match` (`*.md` default) under `root` as forward-slash relative paths; symlinks are not followed.
|
|
15
|
+
* Skips dot-directories and the Hippo store path so a vault containing the store never imports its own mirror files; importVault handles root-IS-the-store. */
|
|
30
16
|
export declare function collectMarkdownFiles(root: string, hippoRoot: string, match?: RegExp): string[];
|
|
31
17
|
export {};
|
|
32
18
|
//# sourceMappingURL=markdown-parse.d.ts.map
|
|
@@ -16,9 +16,7 @@ export function splitMarkdownFrontmatter(raw) {
|
|
|
16
16
|
continue;
|
|
17
17
|
let val = kv[2].trim();
|
|
18
18
|
if (val === '') {
|
|
19
|
-
// YAML block-style list
|
|
20
|
-
// (common in Obsidian/Dendron frontmatter). Collect them into a
|
|
21
|
-
// comma-joined value so frontmatterList parses them (codex P2).
|
|
19
|
+
// YAML block-style list (`key:` then indented `- item` lines, common in Obsidian/Dendron): collect into a comma-joined value for frontmatterList.
|
|
22
20
|
const items = [];
|
|
23
21
|
let j = i + 1;
|
|
24
22
|
let item;
|
|
@@ -35,9 +33,8 @@ export function splitMarkdownFrontmatter(raw) {
|
|
|
35
33
|
}
|
|
36
34
|
return { fm, body };
|
|
37
35
|
}
|
|
38
|
-
/** Pull a frontmatter field that may be a YAML flow list (`[a, b]`), a
|
|
39
|
-
*
|
|
40
|
-
* and surrounding brackets are stripped; empty entries dropped. */
|
|
36
|
+
/** Pull a frontmatter field that may be a YAML flow list (`[a, b]`), a comma-separated scalar, or one token into a string[];
|
|
37
|
+
* quotes and brackets are stripped and empty entries dropped. */
|
|
41
38
|
export function frontmatterList(value) {
|
|
42
39
|
if (!value)
|
|
43
40
|
return [];
|
|
@@ -49,11 +46,8 @@ export function frontmatterList(value) {
|
|
|
49
46
|
.map((s) => s.trim().replace(/^['"]|['"]$/g, '').trim())
|
|
50
47
|
.filter(Boolean);
|
|
51
48
|
}
|
|
52
|
-
/** Parse `[[wikilinks]]` from body text
|
|
53
|
-
*
|
|
54
|
-
* target strings (trimmed). Embeds (`![[…]]`) are intentionally matched too —
|
|
55
|
-
* the leading `!` is not part of the `[[…]]` capture, so an embed contributes
|
|
56
|
-
* its target as a candidate, which is the desired no-crash baseline behaviour. */
|
|
49
|
+
/** Parse `[[wikilinks]]` from body text: `[[target]]` and `[[target|alias]]` both yield `target`; de-duplicated, order-preserving.
|
|
50
|
+
* Embeds (`![[...]]`) match too, because the leading `!` is outside the capture and a candidate target is harmless. */
|
|
57
51
|
export function parseWikilinks(body) {
|
|
58
52
|
const out = [];
|
|
59
53
|
const seen = new Set();
|
|
@@ -71,22 +65,11 @@ export function parseWikilinks(body) {
|
|
|
71
65
|
}
|
|
72
66
|
return out;
|
|
73
67
|
}
|
|
74
|
-
/** Recursively collect files
|
|
75
|
-
*
|
|
76
|
-
* Symlinks are not followed. Skips dot-directories (the default `.hippo` store,
|
|
77
|
-
* `.git`, `.obsidian`, `.trash`) AND the canonicalized Hippo store path during
|
|
78
|
-
* the walk, so re-importing a vault that CONTAINS the store never ingests its own
|
|
79
|
-
* markdown mirror files (codex R5 P1: `hippo import --vault .` after `hippo
|
|
80
|
-
* init` in the vault would otherwise self-import its mirror rows and grow on
|
|
81
|
-
* every run). The root-IS-the-store case is handled one level up in
|
|
82
|
-
* importVault (a no-op early return), NOT here: returning [] for it would feed
|
|
83
|
-
* the deletion-sync an empty scan that mass-archives every live row (codex R8). */
|
|
68
|
+
/** Recursively collect files matching `match` (`*.md` default) under `root` as forward-slash relative paths; symlinks are not followed.
|
|
69
|
+
* Skips dot-directories and the Hippo store path so a vault containing the store never imports its own mirror files; importVault handles root-IS-the-store. */
|
|
84
70
|
export function collectMarkdownFiles(root, hippoRoot, match = /\.md$/i) {
|
|
85
71
|
const out = [];
|
|
86
|
-
// Canonicalize (realpath) so a non-dot HIPPO_HOME store nested in the vault is
|
|
87
|
-
// skipped even when hippoRoot is an aliased path (junction / Windows case
|
|
88
|
-
// variant); path.resolve would miss it and self-import the store's mirror
|
|
89
|
-
// files (codex R9 follow-up: same gap as the importVault guard, sibling site).
|
|
72
|
+
// Canonicalize (realpath) so a non-dot HIPPO_HOME store nested in the vault is skipped even via a junction or Windows case alias.
|
|
90
73
|
const resolvedHippoRoot = realpathOrResolve(hippoRoot);
|
|
91
74
|
const walk = (dir) => {
|
|
92
75
|
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import { importEntries } from './core.js';
|
|
3
3
|
const SLUG_MAX_CHARS = 50;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
/**
|
|
8
|
-
* Slugify a heading for use as a tag.
|
|
9
|
-
* "Data Pipeline & Cache" -> "data-pipeline-cache"
|
|
10
|
-
*/
|
|
4
|
+
/** Slugify a heading for use as a tag.
|
|
5
|
+
* "Data Pipeline & Cache" -> "data-pipeline-cache" */
|
|
11
6
|
function slugify(heading) {
|
|
12
7
|
return heading
|
|
13
8
|
.toLowerCase()
|
|
@@ -17,11 +12,7 @@ function slugify(heading) {
|
|
|
17
12
|
.replace(/-+/g, '-')
|
|
18
13
|
.slice(0, SLUG_MAX_CHARS);
|
|
19
14
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Parse structured markdown into {content, sectionSlug} pairs.
|
|
22
|
-
* Each heading starts a new section. Bullet points / numbered items under
|
|
23
|
-
* the heading become individual memories tagged with the section slug.
|
|
24
|
-
*/
|
|
15
|
+
/** Parse structured markdown into {content, sectionSlug} pairs: each heading starts a section whose bullets or numbered items become memories. */
|
|
25
16
|
function parseStructuredMarkdown(raw) {
|
|
26
17
|
const results = [];
|
|
27
18
|
const lines = raw.split('\n');
|
|
@@ -2,6 +2,7 @@ import * as fs from 'fs';
|
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { importEntries } from './core.js';
|
|
4
4
|
import { splitMarkdownFrontmatter, collectMarkdownFiles } from './markdown-parse.js';
|
|
5
|
+
import { errorMessage, log } from '../util/log.js';
|
|
5
6
|
import { isJsonString, isJsonObject } from '../util/json.js';
|
|
6
7
|
/** Coerce one imported record (string, `{content|text: ...}` object, or
|
|
7
8
|
* anything else) into the plain-text memory chunk it represents. */
|
|
@@ -13,14 +14,7 @@ function extractMemoryText(candidate) {
|
|
|
13
14
|
}
|
|
14
15
|
return '';
|
|
15
16
|
}
|
|
16
|
-
/**
|
|
17
|
-
* Parse ChatGPT memory export file.
|
|
18
|
-
* Supports:
|
|
19
|
-
* - JSON array of strings: ["memory 1", "memory 2"]
|
|
20
|
-
* - JSON array of objects: [{"content": "...", "created": "..."}]
|
|
21
|
-
* - ChatGPT export format: {"memories": [{"content": "...", "created_at": "..."}]}
|
|
22
|
-
* - Plain text: one memory per line
|
|
23
|
-
*/
|
|
17
|
+
/** Parse a ChatGPT memory export: a JSON array of strings or `{content, created}` objects, `{"memories": [...]}`, or plain text with one memory per line. */
|
|
24
18
|
function parseChatGPTFile(filePath) {
|
|
25
19
|
const raw = fs.readFileSync(filePath, 'utf8').trim();
|
|
26
20
|
// Try JSON first
|
|
@@ -36,8 +30,8 @@ function parseChatGPTFile(filePath) {
|
|
|
36
30
|
return parsed.map(extractMemoryText).filter(Boolean);
|
|
37
31
|
}
|
|
38
32
|
}
|
|
39
|
-
catch {
|
|
40
|
-
|
|
33
|
+
catch (err) {
|
|
34
|
+
log.warn(`import: ${filePath} is not valid JSON (${errorMessage(err)}); reading it as plain text`);
|
|
41
35
|
}
|
|
42
36
|
}
|
|
43
37
|
// Plain text: one memory per line
|
|
@@ -47,14 +41,9 @@ export function importChatGPT(filePath, options) {
|
|
|
47
41
|
const chunks = parseChatGPTFile(filePath);
|
|
48
42
|
return importEntries(chunks, 'import:chatgpt', ['imported', 'chatgpt'], options);
|
|
49
43
|
}
|
|
50
|
-
// ---------------------------------------------------------------------------
|
|
51
|
-
// Claude importer
|
|
52
|
-
// ---------------------------------------------------------------------------
|
|
53
44
|
const HIPPO_START = '<!-- hippo:start -->';
|
|
54
45
|
const HIPPO_END = '<!-- hippo:end -->';
|
|
55
|
-
/**
|
|
56
|
-
* Strip the hippo hook block from markdown content.
|
|
57
|
-
*/
|
|
46
|
+
/** Strip the hippo hook block from markdown content. */
|
|
58
47
|
function stripHippoBlock(content) {
|
|
59
48
|
const startIdx = content.indexOf(HIPPO_START);
|
|
60
49
|
const endIdx = content.indexOf(HIPPO_END);
|
|
@@ -62,9 +51,7 @@ function stripHippoBlock(content) {
|
|
|
62
51
|
return content;
|
|
63
52
|
return content.slice(0, startIdx) + content.slice(endIdx + HIPPO_END.length);
|
|
64
53
|
}
|
|
65
|
-
/**
|
|
66
|
-
* Split markdown into meaningful chunks (headings + bullet points).
|
|
67
|
-
*/
|
|
54
|
+
/** Split markdown into meaningful chunks (headings + bullet points). */
|
|
68
55
|
function splitMarkdown(content) {
|
|
69
56
|
const chunks = [];
|
|
70
57
|
const lines = content.split('\n');
|
|
@@ -119,9 +106,7 @@ function appendLine(chunks, open, line) {
|
|
|
119
106
|
// Regular line: append to current
|
|
120
107
|
return current ? current + ' ' + trimmed : trimmed;
|
|
121
108
|
}
|
|
122
|
-
/**
|
|
123
|
-
* Parse CLAUDE.md or Claude memory.json.
|
|
124
|
-
*/
|
|
109
|
+
/** Parse CLAUDE.md or Claude memory.json. */
|
|
125
110
|
function parseClaudeFile(filePath) {
|
|
126
111
|
const raw = fs.readFileSync(filePath, 'utf8');
|
|
127
112
|
// JSON memory file
|
|
@@ -132,8 +117,8 @@ function parseClaudeFile(filePath) {
|
|
|
132
117
|
return parsed.map(extractMemoryText).filter(Boolean);
|
|
133
118
|
}
|
|
134
119
|
}
|
|
135
|
-
catch {
|
|
136
|
-
|
|
120
|
+
catch (err) {
|
|
121
|
+
log.warn(`import: ${filePath} is not valid JSON (${errorMessage(err)}); reading it as markdown`);
|
|
137
122
|
}
|
|
138
123
|
}
|
|
139
124
|
// Markdown file: strip hippo block and split
|
|
@@ -144,13 +129,8 @@ export function importClaude(filePath, options) {
|
|
|
144
129
|
const chunks = parseClaudeFile(filePath);
|
|
145
130
|
return importEntries(chunks, 'import:claude', ['imported', 'claude'], options);
|
|
146
131
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
// ---------------------------------------------------------------------------
|
|
150
|
-
/**
|
|
151
|
-
* Split cursor rules file into chunks.
|
|
152
|
-
* Priority: numbered items, then bullet points, then double newlines.
|
|
153
|
-
*/
|
|
132
|
+
/** Split cursor rules file into chunks.
|
|
133
|
+
* Priority: numbered items, then bullet points, then double newlines. */
|
|
154
134
|
function parseCursorFile(content) {
|
|
155
135
|
const chunks = [];
|
|
156
136
|
const lines = content.split('\n');
|
|
@@ -206,14 +186,7 @@ export function importCursor(sourcePath, options) {
|
|
|
206
186
|
});
|
|
207
187
|
return importEntries(chunks, 'import:cursor', ['imported', 'cursor'], options);
|
|
208
188
|
}
|
|
209
|
-
|
|
210
|
-
// Generic file importer
|
|
211
|
-
// ---------------------------------------------------------------------------
|
|
212
|
-
/**
|
|
213
|
-
* Split a generic file into chunks.
|
|
214
|
-
* Markdown: split on headings and bullet points.
|
|
215
|
-
* Plain text: split on double newlines or one-per-line.
|
|
216
|
-
*/
|
|
189
|
+
/** Split a generic file into chunks: markdown on headings and bullets, plain text on double newlines or one per line. */
|
|
217
190
|
function parseGenericFile(filePath) {
|
|
218
191
|
const raw = fs.readFileSync(filePath, 'utf8');
|
|
219
192
|
const isMarkdown = filePath.endsWith('.md') || filePath.endsWith('.mdx');
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
import { type ImportResult, type ImportOptions } from './core.js';
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* NOT re-entrant: idempotency rests on the in-memory `existing` Map loaded once
|
|
6
|
-
* at the top. Two concurrent importVault runs over the same vault could both see
|
|
7
|
-
* a note as absent and double-insert (the connector pattern relies on a single
|
|
8
|
-
* sequential writer; same caveat applies here).
|
|
9
|
-
*/
|
|
2
|
+
/** Import a markdown vault FOLDER as `kind='raw'` memories.
|
|
3
|
+
* NOT re-entrant: idempotency rests on the in-memory `existing` Map loaded once, so two concurrent runs over one vault can double-insert. */
|
|
10
4
|
export declare function importVault(folderPath: string, options: ImportOptions): ImportResult;
|
|
11
5
|
//# sourceMappingURL=vault.d.ts.map
|
package/dist/importers/vault.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
1
2
|
import * as fs from 'fs';
|
|
2
3
|
import * as path from 'path';
|
|
3
4
|
import { createHash } from 'node:crypto';
|
|
4
5
|
import { createMemory } from '../core/memory.js';
|
|
5
6
|
import { loadVaultRawRows } from '../store/entry-reads.js';
|
|
6
7
|
import { remember, archiveRaw, isPrivateScope } from '../api/index.js';
|
|
7
|
-
import { assertClientScope } from '../
|
|
8
|
-
import { RejectedValueError } from '../
|
|
8
|
+
import { assertClientScope } from '../core/recall-scope.js';
|
|
9
|
+
import { RejectedValueError } from '../core/api-errors.js';
|
|
9
10
|
import { rejectionGuardRefuses } from '../store/rejected-values.js';
|
|
10
11
|
import { withRequestStoresSync } from '../db/request-stores.js';
|
|
11
12
|
import { loadConfig } from '../core/config.js';
|
|
@@ -15,33 +16,17 @@ import { splitMarkdownFrontmatter, frontmatterList, parseWikilinks, collectMarkd
|
|
|
15
16
|
import { realpathOrResolve } from '../util/real-path.js';
|
|
16
17
|
import { isJsonString } from '../util/json.js';
|
|
17
18
|
import { escapeLike } from '../util/escape.js';
|
|
18
|
-
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* NOT re-entrant: idempotency rests on the in-memory `existing` Map loaded once
|
|
22
|
-
* at the top. Two concurrent importVault runs over the same vault could both see
|
|
23
|
-
* a note as absent and double-insert (the connector pattern relies on a single
|
|
24
|
-
* sequential writer; same caveat applies here).
|
|
25
|
-
*/
|
|
19
|
+
/** Import a markdown vault FOLDER as `kind='raw'` memories.
|
|
20
|
+
* NOT re-entrant: idempotency rests on the in-memory `existing` Map loaded once, so two concurrent runs over one vault can double-insert. */
|
|
26
21
|
export function importVault(folderPath, options) {
|
|
27
22
|
const hippoRoot = options.hippoRoot;
|
|
28
23
|
const identity = vaultIdentityOrThrow(options);
|
|
29
24
|
if (options.global) {
|
|
30
|
-
// The raw-archive path is tenant-local
|
|
31
|
-
// in the wrong store. Reject for SDK callers too (the CLI also rejects
|
|
32
|
-
// --global) rather than silently writing local (codex P2).
|
|
25
|
+
// The raw-archive path is tenant-local, so global mode would put raw vault rows in the wrong store; reject for SDK callers too, not only the CLI.
|
|
33
26
|
throw new Error('importVault does not support global mode (raw rows are tenant-local).');
|
|
34
27
|
}
|
|
35
|
-
// Self-store no-op guard
|
|
36
|
-
// and
|
|
37
|
-
// inside it), there are no real vault notes - only the store's own markdown
|
|
38
|
-
// mirror files. Letting collectMarkdownFiles return [] for this case is NOT
|
|
39
|
-
// safe: an empty scan is indistinguishable from "every note was deleted", so
|
|
40
|
-
// deletion-sync would archive every live vault:<name>:* row, and raw-archive
|
|
41
|
-
// content redaction makes that loss IRREVERSIBLE. The only safe reading of
|
|
42
|
-
// "import the store into itself" is "do nothing". Canonicalize both paths
|
|
43
|
-
// (realpath: dereference junctions/symlinks + normalize Windows case) so an
|
|
44
|
-
// aliased path to the store is still caught (codex R9 P2).
|
|
28
|
+
// Self-store no-op guard: MUST run before the existing-rows load and the deletion-sync. If the vault IS (or sits inside) the store, an empty scan looks like
|
|
29
|
+
// "every note deleted" and deletion-sync would irreversibly archive every live row, so do nothing. Canonicalize both paths (realpath) to catch aliased paths.
|
|
45
30
|
const resolvedStore = realpathOrResolve(hippoRoot);
|
|
46
31
|
const resolvedFolder = realpathOrResolve(folderPath);
|
|
47
32
|
if (resolvedFolder === resolvedStore || resolvedFolder.startsWith(resolvedStore + path.sep)) {
|
|
@@ -51,7 +36,7 @@ export function importVault(folderPath, options) {
|
|
|
51
36
|
}
|
|
52
37
|
function syncVaultFolder(folderPath, options, { vaultName, scope }) {
|
|
53
38
|
const hippoRoot = options.hippoRoot;
|
|
54
|
-
const tenantId = options.tenantId ??
|
|
39
|
+
const tenantId = options.tenantId ?? DEFAULT_TENANT_ID;
|
|
55
40
|
const extraTags = options.extraTags ?? [];
|
|
56
41
|
const dryRun = options.dryRun ?? false;
|
|
57
42
|
const ctx = {
|
|
@@ -78,10 +63,8 @@ function syncVaultFolder(folderPath, options, { vaultName, scope }) {
|
|
|
78
63
|
withRequestStoresSync(importNotes);
|
|
79
64
|
else
|
|
80
65
|
importNotes();
|
|
81
|
-
// Deletion-sync:
|
|
82
|
-
//
|
|
83
|
-
// archiveRaw (own handle); no outer SAVEPOINT (no cross-file idempotency row
|
|
84
|
-
// to commit atomically, unlike github's multi-row case).
|
|
66
|
+
// Deletion-sync: an artifactRef in the Map but not seen this run vanished from the source, so archive its raw row.
|
|
67
|
+
// Per-file archiveRaw, no outer SAVEPOINT: there is no cross-file idempotency row to commit atomically.
|
|
85
68
|
for (const [artifactRef, rows] of existing) {
|
|
86
69
|
if (seen.has(artifactRef))
|
|
87
70
|
continue;
|
|
@@ -95,35 +78,24 @@ function syncVaultFolder(folderPath, options, { vaultName, scope }) {
|
|
|
95
78
|
return { total, imported, skipped, rejected, archived, redacted, entries };
|
|
96
79
|
}
|
|
97
80
|
function vaultIdentityOrThrow(options) {
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
// sharing a basename (e.g. work/notes and personal/notes) collided on the same
|
|
101
|
-
// `vault:<name>:*` prefix - importing the second loaded the first's rows and the
|
|
102
|
-
// deletion-sync archived them (codex R10 P2). Require a deliberate name instead
|
|
103
|
-
// of inferring a path-unstable one.
|
|
81
|
+
// The vault NAME keys the destructive deletion-sync, so it must be explicit: defaulting to the folder basename made two vaults
|
|
82
|
+
// sharing a basename collide on the same `vault:<name>:*` prefix and the sync archived the first one's rows.
|
|
104
83
|
const vaultName = options.name?.trim();
|
|
105
84
|
if (!vaultName) {
|
|
106
|
-
throw new Error('importVault requires an explicit vault name (options.name): it is the identity key for source-deletion sync and must not be inferred from the folder
|
|
85
|
+
throw new Error('importVault requires an explicit vault name (options.name): it is the identity key for source-deletion sync and must not be inferred from the folder ' +
|
|
86
|
+
'basename.');
|
|
107
87
|
}
|
|
108
88
|
if (vaultName.includes(':')) {
|
|
109
|
-
// ':'
|
|
110
|
-
// containing it lets a different vault's prefix scan over-match and archive
|
|
111
|
-
// its rows (codex P2). Reject rather than silently corrupt the keys.
|
|
89
|
+
// ':' delimits the artifactRef (vault:<name>:<relpath>); a name containing it lets another vault's prefix scan over-match and archive its rows.
|
|
112
90
|
throw new Error(`vault name must not contain ':' (artifactRef delimiter): ${vaultName}`);
|
|
113
91
|
}
|
|
114
92
|
const scope = options.scope ?? null;
|
|
115
|
-
// Privacy
|
|
116
|
-
//
|
|
117
|
-
// scope.ts). A bare `private` (or `private:<x>`) first segment is NOT recognized
|
|
118
|
-
// as private, so notes a user believes are private would still be returned to
|
|
119
|
-
// no-scope recall callers. Reject the alias and point at the source-prefixed form
|
|
120
|
-
// rather than silently storing public-visible "private" notes. Use recall's own
|
|
121
|
-
// isPrivateScope as the single source of truth: reject a scope that names a
|
|
122
|
-
// `private` segment yet is NOT a valid `<source>:private:*` (catches `private`,
|
|
123
|
-
// `private:x`, and `vault:private` with a missing trailing segment).
|
|
93
|
+
// Privacy guard: recall only default-denies scopes shaped `<source>:private:*` (isPrivateScope in src/core/recall-scope.ts), so a bare `private`
|
|
94
|
+
// alias would be returned to no-scope callers. Reject any scope naming a `private` segment that is not a valid `<source>:private:*`.
|
|
124
95
|
assertClientScope(scope);
|
|
125
96
|
if (scope !== null && scope.split(':').includes('private') && !isPrivateScope(scope)) {
|
|
126
|
-
throw new Error(`vault scope '${scope}' is not recognized as private by recall (only '<source>:private:*' scopes are default-denied).
|
|
97
|
+
throw new Error(`vault scope '${scope}' is not recognized as private by recall (only '<source>:private:*' scopes are default-denied). ` +
|
|
98
|
+
`Use a source-prefixed scope such as 'vault:private:${vaultName}'.`);
|
|
127
99
|
}
|
|
128
100
|
return { vaultName, scope };
|
|
129
101
|
}
|
|
@@ -153,27 +125,17 @@ function importVaultNote(run, relpath) {
|
|
|
153
125
|
tally.total++;
|
|
154
126
|
const artifactRef = `vault:${run.vaultName}:${relpath}`;
|
|
155
127
|
run.seen.add(artifactRef);
|
|
156
|
-
//
|
|
157
|
-
// Date/random in the content path) so idempotency survives frontmatter
|
|
158
|
-
// edits identically to body edits.
|
|
128
|
+
// The content hash covers the RAW file bytes (deterministic, no Date/random) so frontmatter edits are idempotent like body edits.
|
|
159
129
|
const rawFileContent = readVaultNote(run, relpath);
|
|
160
130
|
if (rawFileContent === null)
|
|
161
131
|
return;
|
|
162
132
|
const hash = createHash('sha256').update(rawFileContent).digest('hex');
|
|
163
133
|
const hashTag = `content-hash:${hash}`;
|
|
164
|
-
// Load every live raw row for this ref (>1 only after a concurrent double-
|
|
165
|
-
// insert). The idempotency decision happens below, AFTER the full tag set is
|
|
166
|
-
// built, so it can compare the complete envelope rather than a subset.
|
|
134
|
+
// Load every live raw row for this ref (>1 only after a concurrent double-insert); decide idempotency below, once the full tag set is built.
|
|
167
135
|
const priors = run.existing.get(artifactRef) ?? [];
|
|
168
136
|
const { fm, body } = splitMarkdownFrontmatter(rawFileContent);
|
|
169
|
-
// Empty
|
|
170
|
-
//
|
|
171
|
-
// content-deletion: archive any prior row(s) - the old body must not stay live
|
|
172
|
-
// and searchable after the source no longer holds it (codex R12 P2) - then
|
|
173
|
-
// skip the write. Archiving here is safe precisely because we then skip
|
|
174
|
-
// remember() entirely: there is no archive-then-throw-on-empty-body hazard
|
|
175
|
-
// (the original reason this branch did not archive). The note stays in `seen`
|
|
176
|
-
// so deletion-sync does not double-process it.
|
|
137
|
+
// Empty or frontmatter-only note: nothing storable, and the content was deleted at source, so archive prior rows (the old body must not stay searchable)
|
|
138
|
+
// and skip the write. Safe because remember() is skipped, so there is no archive-then-throw hazard; the note stays in `seen` so deletion-sync skips it.
|
|
177
139
|
if (body.trim().length < 3) {
|
|
178
140
|
archivePriors(run, priors, `emptied:${artifactRef}`);
|
|
179
141
|
tally.skipped++;
|
|
@@ -189,15 +151,10 @@ function importVaultNote(run, relpath) {
|
|
|
189
151
|
}
|
|
190
152
|
function writeChangedNote(run, artifactRef, priors, body, tags) {
|
|
191
153
|
const { ctx, tally } = run;
|
|
192
|
-
// Changed file
|
|
193
|
-
//
|
|
194
|
-
// supersede (would yield kind='distilled'). archiveRaw commits + closes its
|
|
195
|
-
// handle before remember() runs, so there is no double-live row; a crash
|
|
196
|
-
// between them self-heals (file re-imported as fresh raw next run).
|
|
154
|
+
// Changed file: archive EVERY old raw row for this ref (>1 only after a concurrent double-insert), then append the new one; NEVER supersede.
|
|
155
|
+
// archiveRaw commits before remember() runs, so no double-live row; a crash between them self-heals on the next import.
|
|
197
156
|
archivePriors(run, priors, `changed:${artifactRef}`);
|
|
198
|
-
// remember() owns the
|
|
199
|
-
// tags via createMemory purely for the ImportResult, then reconcile its id to
|
|
200
|
-
// remember()'s real row id so entries[] reflects the row that landed.
|
|
157
|
+
// remember() owns the write; the `echo` from createMemory only fills the ImportResult, with its id reconciled to the row that landed.
|
|
201
158
|
const content = vetSecrets(body, tags, true).content;
|
|
202
159
|
const echo = createMemory(content, {
|
|
203
160
|
kind: 'raw',
|
|
@@ -236,10 +193,7 @@ function archivePriors(run, priors, reason) {
|
|
|
236
193
|
}
|
|
237
194
|
}
|
|
238
195
|
function vaultNoteTags(run, hashTag, fm, body) {
|
|
239
|
-
// Build the FULL tag envelope
|
|
240
|
-
// decision. De-duplicate (createMemory stores tags verbatim, so a collision
|
|
241
|
-
// between, e.g., a frontmatter tag and an extraTag would otherwise produce a
|
|
242
|
-
// duplicate). Order-preserving.
|
|
196
|
+
// Build the FULL tag envelope before the idempotency decision, de-duplicated and order-preserving (createMemory stores tags verbatim).
|
|
243
197
|
const frontmatterTags = [
|
|
244
198
|
...frontmatterList(fm['tags']),
|
|
245
199
|
...frontmatterList(fm['aliases']).map((a) => `alias:${a}`),
|
|
@@ -255,14 +209,8 @@ function vaultNoteTags(run, hashTag, fm, body) {
|
|
|
255
209
|
]));
|
|
256
210
|
}
|
|
257
211
|
function vaultEnvelopeUnchanged(priors, tags, scope) {
|
|
258
|
-
// Unchanged iff EVERY live raw row carries the EXACT same tag set AND scope
|
|
259
|
-
//
|
|
260
|
-
// means every envelope change registers: content (via the content-hash tag),
|
|
261
|
-
// frontmatter, wikilinks, an ADDED extra tag, or a REMOVED one - the earlier
|
|
262
|
-
// piecemeal checks missed scope (R10 P2) then tag removal (R11 P2). Set
|
|
263
|
-
// equality is order-independent and both sides are deduped. (`length > 0`
|
|
264
|
-
// guard: a never-seen file must import, not skip; archiving ALL priors on a
|
|
265
|
-
// mismatch also clears any concurrent-double-insert duplicates.)
|
|
212
|
+
// Unchanged iff EVERY live raw row carries the EXACT same tag set AND scope; comparing the complete envelope (not hash plus a subset) catches
|
|
213
|
+
// scope, added and removed tags. `length > 0` guards a never-seen file; archiving all priors on a mismatch also clears concurrent double-inserts.
|
|
266
214
|
const wantTags = new Set(tags);
|
|
267
215
|
return (priors.length > 0 &&
|
|
268
216
|
priors.every((p) => {
|
|
@@ -297,9 +245,7 @@ function storeVaultNote(run, echo, content, tags, artifactRef) {
|
|
|
297
245
|
throw err;
|
|
298
246
|
}
|
|
299
247
|
}
|
|
300
|
-
/**
|
|
301
|
-
* store's own `parseJsonArray` is not exported; this matches its contract
|
|
302
|
-
* (returns [] on null/garbage). */
|
|
248
|
+
/** Tolerant JSON-array parse for the loader's `tags_json` column (the store's `parseJsonArray` is not exported); returns [] on null or garbage. */
|
|
303
249
|
function parseJsonArrayLoose(value) {
|
|
304
250
|
if (!value)
|
|
305
251
|
return [];
|
package/dist/index.d.ts
CHANGED
|
@@ -32,10 +32,15 @@ export { consolidate } from './consolidate/sleep.js';
|
|
|
32
32
|
export { ConsolidationResult } from './consolidate/run.js';
|
|
33
33
|
export { sleep, type SleepOpts, type SleepResult } from './api/sleep.js';
|
|
34
34
|
export { strengthBucket } from './consolidate/dedupe.js';
|
|
35
|
-
export { isEmbeddingAvailable, getEmbedding } from './
|
|
36
|
-
export { cosineSimilarity
|
|
35
|
+
export { isEmbeddingAvailable, getEmbedding } from './embeddings/local.js';
|
|
36
|
+
export { cosineSimilarity } from './store/embeddings/index.js';
|
|
37
|
+
export { embedMemory, embedAll } from './search/embed-memories.js';
|
|
38
|
+
export { loadEmbeddingIndex, saveEmbeddingIndex } from './store/vector-index.js';
|
|
37
39
|
export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './learn/autolearn.js';
|
|
38
|
-
export { getGlobalRoot, initGlobal, promoteToGlobal
|
|
40
|
+
export { getGlobalRoot, initGlobal, promoteToGlobal } from './sharing/global-store.js';
|
|
41
|
+
export { searchBoth, searchBothHybrid, HybridSearchOptions } from './sharing/search-both.js';
|
|
42
|
+
export { syncGlobalToLocal } from './sharing/global-sync.js';
|
|
43
|
+
export { transferScore, shareMemory, listPeers, autoShare } from './sharing/share.js';
|
|
39
44
|
export { wmPush, wmRead, wmClear, wmFlush, WorkingMemoryItem, WM_MAX_ENTRIES, } from './store/working-memory.js';
|
|
40
45
|
export { importChatGPT, importClaude, importCursor, importGenericFile, } from './importers/sources.js';
|
|
41
46
|
export { importMarkdown } from './importers/markdown.js';
|
package/dist/index.js
CHANGED
|
@@ -36,12 +36,17 @@ export { sleep } from './api/sleep.js';
|
|
|
36
36
|
// Announced public in CHANGELOG 1.26.3 but never re-exported; the rest of dedupe.js stays internal.
|
|
37
37
|
export { strengthBucket } from './consolidate/dedupe.js';
|
|
38
38
|
// Feature 1: Embedding search
|
|
39
|
-
export { isEmbeddingAvailable, getEmbedding } from './
|
|
40
|
-
export { cosineSimilarity
|
|
39
|
+
export { isEmbeddingAvailable, getEmbedding } from './embeddings/local.js';
|
|
40
|
+
export { cosineSimilarity } from './store/embeddings/index.js';
|
|
41
|
+
export { embedMemory, embedAll } from './search/embed-memories.js';
|
|
42
|
+
export { loadEmbeddingIndex, saveEmbeddingIndex } from './store/vector-index.js';
|
|
41
43
|
// Feature 2: Auto-learn from errors
|
|
42
44
|
export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './learn/autolearn.js';
|
|
43
45
|
// Feature 3: Cross-agent shared memory
|
|
44
|
-
export { getGlobalRoot, initGlobal, promoteToGlobal
|
|
46
|
+
export { getGlobalRoot, initGlobal, promoteToGlobal } from './sharing/global-store.js';
|
|
47
|
+
export { searchBoth, searchBothHybrid } from './sharing/search-both.js';
|
|
48
|
+
export { syncGlobalToLocal } from './sharing/global-sync.js';
|
|
49
|
+
export { transferScore, shareMemory, listPeers, autoShare } from './sharing/share.js';
|
|
45
50
|
// Feature 5: Working memory
|
|
46
51
|
export { wmPush, wmRead, wmClear, wmFlush, WM_MAX_ENTRIES, } from './store/working-memory.js';
|
|
47
52
|
// Feature 4: Memory importers
|
|
@@ -1,56 +1,37 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Agents learn from failures without explicit hippo remember calls.
|
|
4
|
-
*/
|
|
1
|
+
/** Auto-learn from errors and git history.
|
|
2
|
+
* Agents learn from failures without explicit hippo remember calls. */
|
|
5
3
|
import { MemoryEntry } from '../core/memory.js';
|
|
6
|
-
/** A memory of a failed command, "Command '<cmd>' failed: <truncated stderr>";
|
|
4
|
+
/** A memory of a failed command, "Command '<cmd>' failed: <truncated stderr>"; `hippo watch` stores its text and tags through remember. */
|
|
7
5
|
export declare function captureError(exitCode: number, stderr: string, command: string, tenantId?: string): MemoryEntry;
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
10
|
-
* Looks for fix:, revert:, bug:, error:, hotfix: commit messages.
|
|
11
|
-
*/
|
|
6
|
+
/** Parse git log output for actionable lessons.
|
|
7
|
+
* Looks for fix:, revert:, bug:, error:, hotfix: commit messages. */
|
|
12
8
|
export declare function extractLessons(gitLog: string, customPatterns?: string[]): string[];
|
|
13
|
-
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* `extractLessons` is a published API surface (exported from src/index.ts)
|
|
17
|
-
* and does one job: parse a git log into candidate lesson strings. Adding a
|
|
18
|
-
* quality check inside it would break that contract and silently change
|
|
19
|
-
* what external callers get back. So parsing and admission are separate
|
|
20
|
-
* steps: this function is the write-path gate, called by each caller that
|
|
21
|
-
* actually stores a lesson, not by the parser itself.
|
|
22
|
-
*
|
|
23
|
-
* Order is preserved in both output arrays; both hold lessons with secret shapes redacted.
|
|
24
|
-
*/
|
|
9
|
+
/** Split parsed lessons into ones worth storing and low-information ones; kept out of `extractLessons` so that published parser's output cannot change.
|
|
10
|
+
* Order is preserved in both arrays, and both hold lessons with secret shapes redacted. */
|
|
25
11
|
export declare function partitionLessons(lessons: string[]): {
|
|
26
12
|
kept: string[];
|
|
27
13
|
dropped: string[];
|
|
28
14
|
};
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
* Returns true if overlap > threshold (default 0.7).
|
|
32
|
-
*
|
|
33
|
-
* `tenantId` is opt-in. Only takes effect when the first argument is a
|
|
34
|
-
* root string (string-overload path). When the first argument is a
|
|
35
|
-
* pre-loaded MemoryEntry[], the caller has already scoped — tenantId is
|
|
36
|
-
* ignored on that path.
|
|
37
|
-
*/
|
|
15
|
+
/** Check if a substantially similar memory already exists: true if overlap > threshold (default 0.7).
|
|
16
|
+
* `tenantId` applies only on the root-string overload; a pre-loaded MemoryEntry[] is already scoped, so it is ignored there. */
|
|
38
17
|
export declare function deduplicateLesson(hippoRootOrEntries: string | MemoryEntry[], lesson: string, threshold?: number, tenantId?: string): boolean;
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
18
|
+
/** A transfer command that has not exited in this long is hung on a prompt or a dead remote. */
|
|
19
|
+
export declare const RUN_WATCHED_DEADLINE_MS: number;
|
|
20
|
+
/** The command passed its deadline and was killed. */
|
|
21
|
+
export declare class RunWatchedTimeoutError extends Error {
|
|
22
|
+
readonly deadlineMs: number;
|
|
23
|
+
readonly stderr: string;
|
|
24
|
+
constructor(deadlineMs: number, stderr: string);
|
|
25
|
+
}
|
|
26
|
+
/** Run a command in a shell, streaming stderr live; never pass text the caller did not write.
|
|
27
|
+
* Returns: { exitCode, stderr } with only the last 64 KiB of stderr; rejects with RunWatchedTimeoutError past `deadlineMs`. */
|
|
28
|
+
export declare function runWatched(command: string, deadlineMs?: number): Promise<{
|
|
44
29
|
exitCode: number;
|
|
45
30
|
stderr: string;
|
|
46
31
|
}>;
|
|
47
|
-
/**
|
|
48
|
-
* Check whether a directory is a git work tree.
|
|
49
|
-
*/
|
|
32
|
+
/** Check whether a directory is a git work tree. */
|
|
50
33
|
export declare function isGitRepo(cwd: string): boolean;
|
|
51
|
-
/**
|
|
52
|
-
*
|
|
53
|
-
* days: how many days of history to include.
|
|
54
|
-
*/
|
|
34
|
+
/** Fetch recent git log lines (subject lines only).
|
|
35
|
+
* days: how many days of history to include. */
|
|
55
36
|
export declare function fetchGitLog(cwd: string, days: number): string;
|
|
56
37
|
//# sourceMappingURL=autolearn.d.ts.map
|