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/dist/core/ambient.js
CHANGED
|
@@ -1,16 +1,29 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
* landscape, computed in O(N) from the current corpus.
|
|
4
|
-
*
|
|
5
|
-
* Inspired by the biological ambient neural state: a continuous background
|
|
6
|
-
* representation that tells the agent "where it is" in knowledge-space
|
|
7
|
-
* without retrieving specific memories.
|
|
8
|
-
*/
|
|
9
|
-
import { evalNow } from './ablation.js';
|
|
1
|
+
/** Ambient state vector: a compact O(N) summary of the corpus telling the agent "where it is" in knowledge-space without retrieving specific memories. */
|
|
2
|
+
import { evalNow, strengthAblation } from './ablation.js';
|
|
10
3
|
import { Layer } from './memory.js';
|
|
11
4
|
import { calculateStrength } from './memory.js';
|
|
12
5
|
import { DAY_MS } from '../util/time.js';
|
|
13
6
|
const STATE_DECIMALS = 3;
|
|
7
|
+
// Cut points renderAmbientSummary uses to turn the state vector into words.
|
|
8
|
+
const SUMMARY_THRESHOLD = {
|
|
9
|
+
freshHigh: 0.5,
|
|
10
|
+
freshLow: 0.1,
|
|
11
|
+
skewHigh: 0.3,
|
|
12
|
+
skewLow: -0.3,
|
|
13
|
+
consolidatedHigh: 0.4,
|
|
14
|
+
consolidatedLow: 0.1,
|
|
15
|
+
extractionHigh: 0.5,
|
|
16
|
+
conflictShown: 0.1,
|
|
17
|
+
dagDepthShown: 2,
|
|
18
|
+
strengthLow: 0.3,
|
|
19
|
+
strengthHigh: 0.7,
|
|
20
|
+
entropyHigh: 0.8,
|
|
21
|
+
entropyLow: 0.3,
|
|
22
|
+
};
|
|
23
|
+
/** A memory is fresh when created within this window. */
|
|
24
|
+
export const AMBIENT_FRESH_WINDOW_MS = 7 * DAY_MS;
|
|
25
|
+
/** A memory counts as high schema fit strictly above this. */
|
|
26
|
+
export const HIGH_SCHEMA_FIT_ABOVE = 0.7;
|
|
14
27
|
/** The tallies of two disjoint row sets taken together. */
|
|
15
28
|
export function addAmbientTallies(a, b) {
|
|
16
29
|
const tagCounts = new Map(a.tagCounts);
|
|
@@ -38,7 +51,7 @@ export function isErrorTagged(tags) {
|
|
|
38
51
|
/** Tallies over loaded entries; superseded rows count toward the total only, as they always have here. */
|
|
39
52
|
export function tallyAmbientEntries(entries, now) {
|
|
40
53
|
const currentTime = now ?? evalNow(); // honors HIPPO_FAKE_NOW (eval-only)
|
|
41
|
-
const
|
|
54
|
+
const freshAfter = currentTime.getTime() - AMBIENT_FRESH_WINDOW_MS;
|
|
42
55
|
const t = {
|
|
43
56
|
total: entries.length, strengthSum: 0, fresh: 0, negative: 0, highSchemaFit: 0, errors: 0,
|
|
44
57
|
semantic: 0, episodic: 0, conflicts: 0, extracted: 0, maxDagLevel: 0, tagCounts: new Map(),
|
|
@@ -48,14 +61,14 @@ export function tallyAmbientEntries(entries, now) {
|
|
|
48
61
|
continue;
|
|
49
62
|
for (const tag of entry.tags)
|
|
50
63
|
t.tagCounts.set(tag, (t.tagCounts.get(tag) ?? 0) + 1);
|
|
51
|
-
t.strengthSum += calculateStrength(entry, currentTime);
|
|
52
|
-
if (new Date(entry.created).getTime() >
|
|
64
|
+
t.strengthSum += calculateStrength(entry, currentTime, { ablation: strengthAblation() });
|
|
65
|
+
if (new Date(entry.created).getTime() > freshAfter)
|
|
53
66
|
t.fresh++;
|
|
54
67
|
if (entry.emotional_valence === 'negative' || entry.emotional_valence === 'critical')
|
|
55
68
|
t.negative++;
|
|
56
69
|
if (isErrorTagged(entry.tags))
|
|
57
70
|
t.errors++;
|
|
58
|
-
if (entry.schema_fit >
|
|
71
|
+
if (entry.schema_fit > HIGH_SCHEMA_FIT_ABOVE)
|
|
59
72
|
t.highSchemaFit++;
|
|
60
73
|
if (entry.layer === Layer.Semantic)
|
|
61
74
|
t.semantic++;
|
|
@@ -123,33 +136,34 @@ function shannonEntropy(counts, total) {
|
|
|
123
136
|
export function renderAmbientSummary(state) {
|
|
124
137
|
if (state.totalMemories === 0)
|
|
125
138
|
return 'Memory state: empty store, no memories yet.';
|
|
139
|
+
const T = SUMMARY_THRESHOLD;
|
|
126
140
|
const parts = [];
|
|
127
141
|
parts.push(`${state.totalMemories} memories`);
|
|
128
|
-
if (state.recencyFreshness >
|
|
142
|
+
if (state.recencyFreshness > T.freshHigh)
|
|
129
143
|
parts.push('mostly fresh (<7d)');
|
|
130
|
-
else if (state.recencyFreshness <
|
|
144
|
+
else if (state.recencyFreshness < T.freshLow)
|
|
131
145
|
parts.push('mostly aged');
|
|
132
|
-
if (state.emotionalSkew >
|
|
146
|
+
if (state.emotionalSkew > T.skewHigh)
|
|
133
147
|
parts.push('error-focused');
|
|
134
|
-
else if (state.emotionalSkew <
|
|
148
|
+
else if (state.emotionalSkew < T.skewLow)
|
|
135
149
|
parts.push('steady operation');
|
|
136
|
-
if (state.consolidationRatio >
|
|
150
|
+
if (state.consolidationRatio > T.consolidatedHigh)
|
|
137
151
|
parts.push('well-consolidated');
|
|
138
|
-
else if (state.consolidationRatio <
|
|
152
|
+
else if (state.consolidationRatio < T.consolidatedLow)
|
|
139
153
|
parts.push('mostly episodic');
|
|
140
|
-
if (state.extractionCoverage >
|
|
154
|
+
if (state.extractionCoverage > T.extractionHigh)
|
|
141
155
|
parts.push('high extraction coverage');
|
|
142
|
-
if (state.conflictIntensity >
|
|
156
|
+
if (state.conflictIntensity > T.conflictShown)
|
|
143
157
|
parts.push(`${(state.conflictIntensity * 100).toFixed(0)}% conflict rate`);
|
|
144
|
-
if (state.dagDepth >=
|
|
158
|
+
if (state.dagDepth >= T.dagDepthShown)
|
|
145
159
|
parts.push(`DAG depth ${state.dagDepth}`);
|
|
146
|
-
if (state.avgStrength <
|
|
160
|
+
if (state.avgStrength < T.strengthLow)
|
|
147
161
|
parts.push('low avg strength (aging corpus)');
|
|
148
|
-
else if (state.avgStrength >
|
|
162
|
+
else if (state.avgStrength > T.strengthHigh)
|
|
149
163
|
parts.push('high avg strength');
|
|
150
|
-
if (state.tagEntropy >
|
|
164
|
+
if (state.tagEntropy > T.entropyHigh)
|
|
151
165
|
parts.push('diverse topics');
|
|
152
|
-
else if (state.tagEntropy <
|
|
166
|
+
else if (state.tagEntropy < T.entropyLow)
|
|
153
167
|
parts.push('narrow focus');
|
|
154
168
|
return `Memory state: ${parts.join(', ')}.`;
|
|
155
169
|
}
|
|
@@ -24,4 +24,20 @@ export declare class ConflictError extends ApiError {
|
|
|
24
24
|
readonly status = 409;
|
|
25
25
|
constructor(message: string);
|
|
26
26
|
}
|
|
27
|
+
/** Thrown by the write-path guard (checkRejectionGuard, via upsertEntryRow) when a write would introduce a tombstoned value; carries what the
|
|
28
|
+
* transaction-owner catch blocks (writeEntry, api.supersede) need to write the post-rollback `reject_refusal` audit row via `auditRejectionRefusal`. */
|
|
29
|
+
export declare class RejectedValueError extends BadRequestError {
|
|
30
|
+
readonly digest: string;
|
|
31
|
+
readonly tenantId: string;
|
|
32
|
+
readonly entryId: string;
|
|
33
|
+
readonly reason: string | null;
|
|
34
|
+
readonly rejectedAt: string;
|
|
35
|
+
constructor(opts: {
|
|
36
|
+
digest: string;
|
|
37
|
+
tenantId: string;
|
|
38
|
+
entryId: string;
|
|
39
|
+
reason: string | null;
|
|
40
|
+
rejectedAt: string;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
27
43
|
//# sourceMappingURL=api-errors.d.ts.map
|
package/dist/core/api-errors.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** Errors whose HTTP status is part of the API contract; the server maps by class, so message text can change freely. */
|
|
2
|
+
import { DIGEST_DISPLAY_CHARS } from '../util/token-text.js';
|
|
2
3
|
/** Base class: an error the caller caused, carrying the status the HTTP layer answers with. */
|
|
3
4
|
export class ApiError extends Error {
|
|
4
5
|
}
|
|
@@ -34,4 +35,23 @@ export class ConflictError extends ApiError {
|
|
|
34
35
|
this.name = 'ConflictError';
|
|
35
36
|
}
|
|
36
37
|
}
|
|
38
|
+
/** Thrown by the write-path guard (checkRejectionGuard, via upsertEntryRow) when a write would introduce a tombstoned value; carries what the
|
|
39
|
+
* transaction-owner catch blocks (writeEntry, api.supersede) need to write the post-rollback `reject_refusal` audit row via `auditRejectionRefusal`. */
|
|
40
|
+
export class RejectedValueError extends BadRequestError {
|
|
41
|
+
digest;
|
|
42
|
+
tenantId;
|
|
43
|
+
entryId;
|
|
44
|
+
reason;
|
|
45
|
+
rejectedAt;
|
|
46
|
+
constructor(opts) {
|
|
47
|
+
super(`Memory value refused: matches a rejected value (digest ${opts.digest.slice(0, DIGEST_DISPLAY_CHARS)}..., ` +
|
|
48
|
+
`reason: ${opts.reason ?? 'none given'}). Run "hippo unreject" to allow it again.`);
|
|
49
|
+
this.name = 'RejectedValueError';
|
|
50
|
+
this.digest = opts.digest;
|
|
51
|
+
this.tenantId = opts.tenantId;
|
|
52
|
+
this.entryId = opts.entryId;
|
|
53
|
+
this.reason = opts.reason;
|
|
54
|
+
this.rejectedAt = opts.rejectedAt;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
37
57
|
//# sourceMappingURL=api-errors.js.map
|
|
@@ -51,12 +51,14 @@ export declare function isStringValue<T>(value: T): value is T & string;
|
|
|
51
51
|
export declare function isObjectLike<T>(value: T): value is T & object;
|
|
52
52
|
/** The hook runtimes a `--runtime` flag names; absent means Claude Code. */
|
|
53
53
|
export type HookRuntime = 'claude-code' | 'copilot';
|
|
54
|
-
/** Reads a Claude Code PreCompact payload, or a Copilot one after stdin.ts mapped
|
|
54
|
+
/** Reads a Claude Code PreCompact payload, or a Copilot one after stdin.ts mapped
|
|
55
|
+
* it to the same snake_case keys; only an empty stdin counts as a manual run. */
|
|
55
56
|
export declare function readClaudeCodePreCompact(stdinText: string | undefined, timedOut: boolean, runtime?: HookRuntime): CaptureReceipt;
|
|
56
57
|
/** Reads VS Code's per-reply Stop payload. Pass the raw stdin: stdin.ts would give a Copilot CLI agentStop the same snake_case keys. */
|
|
57
58
|
export declare function readVscodeStop(stdinText: string | undefined, timedOut: boolean): CaptureReceipt;
|
|
58
59
|
/** Reads a Claude Code PostCompact payload; it must name a session, but needs no transcript_path. */
|
|
59
60
|
export declare function readClaudeCodePostCompact(stdinText: string | undefined, timedOut: boolean): CaptureReceipt<PostCompactInput>;
|
|
60
|
-
/** Reads a Claude Code SessionEnd payload, or a Copilot one after stdin.ts mapped
|
|
61
|
+
/** Reads a Claude Code SessionEnd payload, or a Copilot one after stdin.ts mapped
|
|
62
|
+
* it to the same snake_case keys; only an empty stdin counts as a manual run. */
|
|
61
63
|
export declare function readSessionEnd(stdinText: string | undefined, timedOut: boolean, runtime?: HookRuntime): CaptureReceipt;
|
|
62
64
|
//# sourceMappingURL=capture-contract.d.ts.map
|
|
@@ -8,7 +8,8 @@ export function isStringValue(value) {
|
|
|
8
8
|
export function isObjectLike(value) {
|
|
9
9
|
return value !== null && value instanceof Object;
|
|
10
10
|
}
|
|
11
|
-
/** Reads a Claude Code PreCompact payload, or a Copilot one after stdin.ts mapped
|
|
11
|
+
/** Reads a Claude Code PreCompact payload, or a Copilot one after stdin.ts mapped
|
|
12
|
+
* it to the same snake_case keys; only an empty stdin counts as a manual run. */
|
|
12
13
|
export function readClaudeCodePreCompact(stdinText, timedOut, runtime = 'claude-code') {
|
|
13
14
|
const empty = !stdinText || stdinText.trim() === '';
|
|
14
15
|
if (timedOut && empty) {
|
|
@@ -112,7 +113,8 @@ export function readClaudeCodePostCompact(stdinText, timedOut) {
|
|
|
112
113
|
},
|
|
113
114
|
};
|
|
114
115
|
}
|
|
115
|
-
/** Reads a Claude Code SessionEnd payload, or a Copilot one after stdin.ts mapped
|
|
116
|
+
/** Reads a Claude Code SessionEnd payload, or a Copilot one after stdin.ts mapped
|
|
117
|
+
* it to the same snake_case keys; only an empty stdin counts as a manual run. */
|
|
116
118
|
export function readSessionEnd(stdinText, timedOut, runtime = 'claude-code') {
|
|
117
119
|
const empty = !stdinText || stdinText.trim() === '';
|
|
118
120
|
if (timedOut && empty) {
|
package/dist/core/card.d.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
export type CardStatus = 'backlog' | 'ready' | 'running' | 'blocked' | 'review' | 'done' | 'shelved';
|
|
3
3
|
/** Narrows a raw string, such as a CLI flag value, to a CardStatus. */
|
|
4
4
|
export declare function isCardStatus(v: string): v is CardStatus;
|
|
5
|
-
/** A card row; leaseUntil and heartbeatAt are null unless the card is running, and
|
|
5
|
+
/** A card row; leaseUntil and heartbeatAt are null unless the card is running, and
|
|
6
|
+
* a card claimed under 1.40.0 runs with both null until a heartbeat sets them. */
|
|
6
7
|
export interface Card {
|
|
7
8
|
id: string;
|
|
8
9
|
title: string;
|
|
@@ -44,4 +45,6 @@ export type CardTransitions = {
|
|
|
44
45
|
export declare const CARD_TRANSITIONS: CardTransitions;
|
|
45
46
|
/** How long a claim or a heartbeat keeps a running card's lease before reclaimExpiredCards may return it to ready. */
|
|
46
47
|
export declare const CARD_LEASE_MS: number;
|
|
48
|
+
/** Throws on any move CARD_TRANSITIONS does not allow, before a status write touches the row. */
|
|
49
|
+
export declare function assertCardTransition(from: readonly CardStatus[], to: CardStatus): void;
|
|
47
50
|
//# sourceMappingURL=card.d.ts.map
|
package/dist/core/card.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Work-queue card types: a claimable unit of work, N candidates claim one row, first wins.
|
|
2
|
+
import { HOUR_MS } from '../util/time.js';
|
|
1
3
|
const CARD_STATUSES = ['backlog', 'ready', 'running', 'blocked', 'review', 'done', 'shelved'];
|
|
2
4
|
/** Narrows a raw string, such as a CLI flag value, to a CardStatus. */
|
|
3
5
|
export function isCardStatus(v) {
|
|
@@ -15,5 +17,13 @@ export const CARD_TRANSITIONS = {
|
|
|
15
17
|
};
|
|
16
18
|
// SHORTCUT: one fixed lease for every claim; add a per-claim lease when the W3 dispatcher heartbeats on a timer.
|
|
17
19
|
/** How long a claim or a heartbeat keeps a running card's lease before reclaimExpiredCards may return it to ready. */
|
|
18
|
-
export const CARD_LEASE_MS = 4 *
|
|
20
|
+
export const CARD_LEASE_MS = 4 * HOUR_MS;
|
|
21
|
+
/** Throws on any move CARD_TRANSITIONS does not allow, before a status write touches the row. */
|
|
22
|
+
export function assertCardTransition(from, to) {
|
|
23
|
+
for (const status of from) {
|
|
24
|
+
if (!CARD_TRANSITIONS[status].includes(to)) {
|
|
25
|
+
throw new Error(`illegal card transition: ${status} -> ${to}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
19
29
|
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** PostCompact has 10 s in all (PreCompact 30 s), so a locked store must be given up on early. */
|
|
2
|
+
export declare const COMPACTION_DB_WAIT_MS = 2000;
|
|
3
|
+
/** Long enough that a live hook has finished with its own record. */
|
|
4
|
+
export declare const REPLAY_AFTER_MS: number;
|
|
5
|
+
/** Claude Code deletes transcripts after 30 days, so an older gap can never be filled. */
|
|
6
|
+
export declare const TRANSCRIPT_FILL_WINDOW_MS: number;
|
|
7
|
+
//# sourceMappingURL=compaction-timing.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Waits and windows shared by the compaction record's SQL (src/store) and the hooks and CLI that schedule it.
|
|
2
|
+
import { DAY_MS, MINUTE_MS } from '../util/time.js';
|
|
3
|
+
/** PostCompact has 10 s in all (PreCompact 30 s), so a locked store must be given up on early. */
|
|
4
|
+
export const COMPACTION_DB_WAIT_MS = 2000;
|
|
5
|
+
/** Long enough that a live hook has finished with its own record. */
|
|
6
|
+
export const REPLAY_AFTER_MS = 10 * MINUTE_MS;
|
|
7
|
+
/** Claude Code deletes transcripts after 30 days, so an older gap can never be filled. */
|
|
8
|
+
export const TRANSCRIPT_FILL_WINDOW_MS = 30 * DAY_MS;
|
|
9
|
+
//# sourceMappingURL=compaction-timing.js.map
|
package/dist/core/compare.d.ts
CHANGED
|
@@ -1,21 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
* multihop.ts, rerankers/*). Every comparator here takes a structural param
|
|
7
|
-
* type instead of an imported one, on purpose — a type-only import back to
|
|
8
|
-
* search.ts would still create the search.ts <-> physics.ts ESM import
|
|
9
|
-
* cycle this module exists to avoid.
|
|
10
|
-
*
|
|
11
|
-
* Mirrors the deliberate-determinism comment style already established in
|
|
12
|
-
* graph-stream.ts:88, :165-168, :233-236 — a sort with a documented,
|
|
13
|
-
* reproducible tiebreak instead of leaving ties to array/scan order.
|
|
14
|
-
*/
|
|
15
|
-
/** Minimal shape needed to break a tie deterministically across fresh
|
|
16
|
-
* ingests of the same content into different stores. The metadata keys are
|
|
17
|
-
* optional so existing `{ content, id }` callers (tests, benchmarks) still fit;
|
|
18
|
-
* a full MemoryEntry satisfies it structurally and gets the metadata order. */
|
|
1
|
+
/** Deterministic tie-break comparators for recall ranking. A true LEAF module: it imports from no sort-site module (search, physics, api, cli, goals,
|
|
2
|
+
* graph-recall, multihop, rerankers), taking structural param types instead, because even a type-only import back would recreate the search <-> physics ESM
|
|
3
|
+
* cycle this module exists to avoid. */
|
|
4
|
+
/** Minimal shape for a deterministic tie-break across fresh ingests into different stores;
|
|
5
|
+
* the metadata keys are optional so `{ content, id }` callers still fit. */
|
|
19
6
|
export interface EntryIdentity {
|
|
20
7
|
content: string;
|
|
21
8
|
id: string;
|
|
@@ -23,30 +10,8 @@ export interface EntryIdentity {
|
|
|
23
10
|
tags?: readonly string[];
|
|
24
11
|
source?: string;
|
|
25
12
|
}
|
|
26
|
-
/**
|
|
27
|
-
* content
|
|
28
|
-
* -> source asc -> id asc (all string compares are UTF-16 code-unit order).
|
|
29
|
-
*
|
|
30
|
-
* `content` is the cross-ingest-stable key: identical text ingested into two
|
|
31
|
-
* independently-created stores (different directory name, different insert
|
|
32
|
-
* order of everything else on disk) sorts identically. The metadata keys make
|
|
33
|
-
* byte-identical twins order by what they carry instead of by `id`
|
|
34
|
-
* (`crypto.randomUUID()`), which is per-instance random and would make the
|
|
35
|
-
* dedupe survivor arbitrary. `id` stays the terminal key so the order is
|
|
36
|
-
* total within one store.
|
|
37
|
-
*
|
|
38
|
-
* Layer rank puts semantic first: semantic rows are consolidation output, so
|
|
39
|
-
* keeping that copy preserves the promotion instead of demoting the memory.
|
|
40
|
-
* Unknown or missing layers rank last and then compare as raw strings.
|
|
41
|
-
* Tags prefer the copy with more distinct labels (fewer labels are lost on
|
|
42
|
-
* dedupe); source is an arbitrary but stable key.
|
|
43
|
-
*
|
|
44
|
-
* Plain `<`/`>`, NOT `localeCompare`: `localeCompare` is locale- and
|
|
45
|
-
* ICU-version-dependent (a determinism leak in its own right) and needlessly
|
|
46
|
-
* slow for a tiebreak that only needs a total order. The metadata keys are
|
|
47
|
-
* only computed on a content tie, which is rare, so the per-compare Set/sort
|
|
48
|
-
* cost never lands on the hot path.
|
|
49
|
-
*/
|
|
13
|
+
/** Order: content, layer rank (semantic first, keeping the promotion), tag count desc, sorted tags, source, id; plain `<`/`>`, never `localeCompare`.
|
|
14
|
+
* `content` is the cross-ingest-stable key; `id` is random per instance, so it is only the terminal key. Metadata keys are computed only on a content tie. */
|
|
50
15
|
export declare function compareEntryIdentity(a: EntryIdentity, b: EntryIdentity): number;
|
|
51
16
|
/** Minimal shape for score-primary sort sites (SearchResult and friends
|
|
52
17
|
* that carry `{ score, entry: { content, id } }`). */
|
|
@@ -54,34 +19,13 @@ export interface ScoredEntryLike {
|
|
|
54
19
|
score: number;
|
|
55
20
|
entry: EntryIdentity;
|
|
56
21
|
}
|
|
57
|
-
/**
|
|
58
|
-
* score
|
|
59
|
-
* every score-primary recall sort site (search.ts, shared.ts, goals.ts,
|
|
60
|
-
* api.ts, cli.ts, graph-recall.ts, multihop.ts, rerankers/cross-encoder.ts).
|
|
61
|
-
* Sites delegate wholesale to this (via a thin arrow where the element
|
|
62
|
-
* shape's score field is named something other than `score`, e.g.
|
|
63
|
-
* `rerankScore`) rather than reimplementing `b.score - a.score` locally, so
|
|
64
|
-
* the tiebreak can't silently drift between call sites.
|
|
65
|
-
*/
|
|
22
|
+
/** score descending, then `compareEntryIdentity`: the shared ordering for every score-primary recall sort site, which delegate here (via an arrow when the
|
|
23
|
+
* score field is not named `score`) so the tiebreak cannot drift between call sites. */
|
|
66
24
|
export declare function compareScoredResults(a: ScoredEntryLike, b: ScoredEntryLike): number;
|
|
67
25
|
/** Larger first, NaN after every number, 0 for equal scores. Not a subtraction: two infinities, or any NaN, subtract to NaN, which a sort reads as a tie. */
|
|
68
26
|
export declare function compareScoresDesc(a: number, b: number): number;
|
|
69
|
-
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* `ScoredPhysicsResult` (physics.ts) carries `{ memoryId, baseScore,
|
|
73
|
-
* clusterAmplification, finalScore }` -- NO `entry`/`content` in scope at
|
|
74
|
-
* that layer, so `compareEntryIdentity` cannot apply directly. With only the
|
|
75
|
-
* default memoryId key this is PER-INSTANCE-ONLY determinism; callers that need
|
|
76
|
-
* CROSS-INGEST stability supply `tieKeyOf` mapping the result to its memory
|
|
77
|
-
* CONTENT, because the baseScore tie order selects the cluster_top_k
|
|
78
|
-
* amplification set, which MUTATES scores before the content-aware merge sort.
|
|
79
|
-
*
|
|
80
|
-
* A factory (not a fixed-field comparator) because physics.ts re-sorts the
|
|
81
|
-
* same result array by two different score fields in sequence (`baseScore`
|
|
82
|
-
* for top-K selection, then `finalScore` after cluster amplification) — one
|
|
83
|
-
* shared tiebreak rule, parameterised by which field is primary this pass.
|
|
84
|
-
*/
|
|
27
|
+
/** Score-desc then tie-key comparator for the physics layer (no `entry`/`content` in scope): the default memoryId key is per-instance determinism only.
|
|
28
|
+
* Cross-ingest stability needs `tieKeyOf` (content), since the baseScore tie order picks the cluster_top_k set. A factory, as two fields sort in turn. */
|
|
85
29
|
export declare function comparePhysicsResultsBy<T extends {
|
|
86
30
|
memoryId: string;
|
|
87
31
|
}>(scoreOf: (r: T) => number, tieKeyOf?: (r: T) => string): (a: T, b: T) => number;
|
package/dist/core/compare.js
CHANGED
|
@@ -1,41 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
* multihop.ts, rerankers/*). Every comparator here takes a structural param
|
|
7
|
-
* type instead of an imported one, on purpose — a type-only import back to
|
|
8
|
-
* search.ts would still create the search.ts <-> physics.ts ESM import
|
|
9
|
-
* cycle this module exists to avoid.
|
|
10
|
-
*
|
|
11
|
-
* Mirrors the deliberate-determinism comment style already established in
|
|
12
|
-
* graph-stream.ts:88, :165-168, :233-236 — a sort with a documented,
|
|
13
|
-
* reproducible tiebreak instead of leaving ties to array/scan order.
|
|
14
|
-
*/
|
|
15
|
-
/**
|
|
16
|
-
* content asc -> layer rank asc -> distinct tag count desc -> sorted tags asc
|
|
17
|
-
* -> source asc -> id asc (all string compares are UTF-16 code-unit order).
|
|
18
|
-
*
|
|
19
|
-
* `content` is the cross-ingest-stable key: identical text ingested into two
|
|
20
|
-
* independently-created stores (different directory name, different insert
|
|
21
|
-
* order of everything else on disk) sorts identically. The metadata keys make
|
|
22
|
-
* byte-identical twins order by what they carry instead of by `id`
|
|
23
|
-
* (`crypto.randomUUID()`), which is per-instance random and would make the
|
|
24
|
-
* dedupe survivor arbitrary. `id` stays the terminal key so the order is
|
|
25
|
-
* total within one store.
|
|
26
|
-
*
|
|
27
|
-
* Layer rank puts semantic first: semantic rows are consolidation output, so
|
|
28
|
-
* keeping that copy preserves the promotion instead of demoting the memory.
|
|
29
|
-
* Unknown or missing layers rank last and then compare as raw strings.
|
|
30
|
-
* Tags prefer the copy with more distinct labels (fewer labels are lost on
|
|
31
|
-
* dedupe); source is an arbitrary but stable key.
|
|
32
|
-
*
|
|
33
|
-
* Plain `<`/`>`, NOT `localeCompare`: `localeCompare` is locale- and
|
|
34
|
-
* ICU-version-dependent (a determinism leak in its own right) and needlessly
|
|
35
|
-
* slow for a tiebreak that only needs a total order. The metadata keys are
|
|
36
|
-
* only computed on a content tie, which is rare, so the per-compare Set/sort
|
|
37
|
-
* cost never lands on the hot path.
|
|
38
|
-
*/
|
|
1
|
+
/** Deterministic tie-break comparators for recall ranking. A true LEAF module: it imports from no sort-site module (search, physics, api, cli, goals,
|
|
2
|
+
* graph-recall, multihop, rerankers), taking structural param types instead, because even a type-only import back would recreate the search <-> physics ESM
|
|
3
|
+
* cycle this module exists to avoid. */
|
|
4
|
+
/** Order: content, layer rank (semantic first, keeping the promotion), tag count desc, sorted tags, source, id; plain `<`/`>`, never `localeCompare`.
|
|
5
|
+
* `content` is the cross-ingest-stable key; `id` is random per instance, so it is only the terminal key. Metadata keys are computed only on a content tie. */
|
|
39
6
|
export function compareEntryIdentity(a, b) {
|
|
40
7
|
return (compareStrings(a.content, b.content) ||
|
|
41
8
|
layerRank(a.layer) - layerRank(b.layer) ||
|
|
@@ -69,15 +36,8 @@ function compareTags(a, b) {
|
|
|
69
36
|
}
|
|
70
37
|
return 0;
|
|
71
38
|
}
|
|
72
|
-
/**
|
|
73
|
-
* score
|
|
74
|
-
* every score-primary recall sort site (search.ts, shared.ts, goals.ts,
|
|
75
|
-
* api.ts, cli.ts, graph-recall.ts, multihop.ts, rerankers/cross-encoder.ts).
|
|
76
|
-
* Sites delegate wholesale to this (via a thin arrow where the element
|
|
77
|
-
* shape's score field is named something other than `score`, e.g.
|
|
78
|
-
* `rerankScore`) rather than reimplementing `b.score - a.score` locally, so
|
|
79
|
-
* the tiebreak can't silently drift between call sites.
|
|
80
|
-
*/
|
|
39
|
+
/** score descending, then `compareEntryIdentity`: the shared ordering for every score-primary recall sort site, which delegate here (via an arrow when the
|
|
40
|
+
* score field is not named `score`) so the tiebreak cannot drift between call sites. */
|
|
81
41
|
export function compareScoredResults(a, b) {
|
|
82
42
|
return compareScoresDesc(a.score, b.score) || compareEntryIdentity(a.entry, b.entry);
|
|
83
43
|
}
|
|
@@ -89,22 +49,8 @@ export function compareScoresDesc(a, b) {
|
|
|
89
49
|
return 1;
|
|
90
50
|
return Number(Number.isNaN(a)) - Number(Number.isNaN(b));
|
|
91
51
|
}
|
|
92
|
-
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
* `ScoredPhysicsResult` (physics.ts) carries `{ memoryId, baseScore,
|
|
96
|
-
* clusterAmplification, finalScore }` -- NO `entry`/`content` in scope at
|
|
97
|
-
* that layer, so `compareEntryIdentity` cannot apply directly. With only the
|
|
98
|
-
* default memoryId key this is PER-INSTANCE-ONLY determinism; callers that need
|
|
99
|
-
* CROSS-INGEST stability supply `tieKeyOf` mapping the result to its memory
|
|
100
|
-
* CONTENT, because the baseScore tie order selects the cluster_top_k
|
|
101
|
-
* amplification set, which MUTATES scores before the content-aware merge sort.
|
|
102
|
-
*
|
|
103
|
-
* A factory (not a fixed-field comparator) because physics.ts re-sorts the
|
|
104
|
-
* same result array by two different score fields in sequence (`baseScore`
|
|
105
|
-
* for top-K selection, then `finalScore` after cluster amplification) — one
|
|
106
|
-
* shared tiebreak rule, parameterised by which field is primary this pass.
|
|
107
|
-
*/
|
|
52
|
+
/** Score-desc then tie-key comparator for the physics layer (no `entry`/`content` in scope): the default memoryId key is per-instance determinism only.
|
|
53
|
+
* Cross-ingest stability needs `tieKeyOf` (content), since the baseScore tie order picks the cluster_top_k set. A factory, as two fields sort in turn. */
|
|
108
54
|
export function comparePhysicsResultsBy(scoreOf, tieKeyOf) {
|
|
109
55
|
return (a, b) => {
|
|
110
56
|
const d = compareScoresDesc(scoreOf(a), scoreOf(b));
|
package/dist/core/config.d.ts
CHANGED
|
@@ -19,10 +19,8 @@ export interface HippoConfig {
|
|
|
19
19
|
enabled: boolean | 'auto';
|
|
20
20
|
model: string;
|
|
21
21
|
hybridWeight: number;
|
|
22
|
-
/** Embedding backend
|
|
23
|
-
*
|
|
24
|
-
* API key in env (OPENAI_API_KEY / VOYAGE_API_KEY / COHERE_API_KEY).
|
|
25
|
-
* See src/store/embeddings/provider.ts. */
|
|
22
|
+
/** Embedding backend: 'local' (default) = zero-dependency transformers.js; 'openai' | 'voyage' | 'cohere' = opt-in API embedder needing the provider's
|
|
23
|
+
* API key in env (OPENAI_API_KEY / VOYAGE_API_KEY / COHERE_API_KEY). See src/embeddings/provider.ts. */
|
|
26
24
|
provider?: 'local' | 'openai' | 'voyage' | 'cohere';
|
|
27
25
|
/** Optional API base-URL override (self-host / proxy). HTTPS only (localhost
|
|
28
26
|
* may use http). Ignored by the local provider. */
|
|
@@ -57,18 +55,15 @@ export interface HippoConfig {
|
|
|
57
55
|
autoTraceCapture: boolean;
|
|
58
56
|
/** Only promote sessions whose session_complete event is within N days. */
|
|
59
57
|
autoTraceWindowDays: number;
|
|
60
|
-
/** Mid-session pinned-rule re-injection
|
|
61
|
-
* hook. When enabled, pinned memories are re-injected each turn within the
|
|
62
|
-
* given token budget. */
|
|
58
|
+
/** Mid-session pinned-rule re-injection through the UserPromptSubmit hook: pinned memories are re-injected each turn within the token budget. */
|
|
63
59
|
pinnedInject: {
|
|
64
60
|
enabled: boolean;
|
|
65
61
|
budget: number;
|
|
66
62
|
/** Skip a block identical to the one already injected this session
|
|
67
63
|
* Default true. Needs a session id from the hook payload. */
|
|
68
64
|
skipUnchanged: boolean;
|
|
69
|
-
/** Resend an unchanged block after this many consecutive skips, so long
|
|
70
|
-
*
|
|
71
|
-
* never resends an unchanged block. */
|
|
65
|
+
/** Resend an unchanged block after this many consecutive skips, so long sessions still see pinned rules near the latest turn (default 10; 0 never
|
|
66
|
+
* resends). */
|
|
72
67
|
refreshTurns: number;
|
|
73
68
|
/** Gate the hook's backfill on the prompt's own content instead of the five
|
|
74
69
|
* newest memories. Default true: the same overlap for fewer tokens. */
|
|
@@ -84,13 +79,8 @@ export interface HippoConfig {
|
|
|
84
79
|
/** FTS candidate pool size per store before gating. Default 100. */
|
|
85
80
|
promptRecallCandidates: number;
|
|
86
81
|
};
|
|
87
|
-
/** Memory scope isolation
|
|
88
|
-
*
|
|
89
|
-
* hippo_context) excludes memories owned by OTHER projects; explicit
|
|
90
|
-
* recall is unaffected. Set false to disable the ORIGIN PARTITION only -
|
|
91
|
-
* the secret veto is unconditional for ambient surfaces and no config or
|
|
92
|
-
* flag re-includes secret-flagged rows (explicit recall still returns
|
|
93
|
-
* them). */
|
|
82
|
+
/** Memory scope isolation (default true): ambient context (`hippo context`, the hook, /v1/context, MCP hippo_context) excludes OTHER projects' memories;
|
|
83
|
+
* explicit recall is unaffected. False disables the ORIGIN PARTITION only: the secret veto is unconditional, and no flag re-includes secret-flagged rows. */
|
|
94
84
|
contextProjectIsolation: boolean;
|
|
95
85
|
extraction: {
|
|
96
86
|
enabled: boolean | 'auto';
|
|
@@ -114,13 +104,8 @@ export interface HippoConfig {
|
|
|
114
104
|
memoryValue: {
|
|
115
105
|
enabled: boolean;
|
|
116
106
|
};
|
|
117
|
-
/** Dormant memories (src/store/dormant.ts):
|
|
118
|
-
*
|
|
119
|
-
* dormant store instead of deleting it. A dormant memory leaves recall and
|
|
120
|
-
* context like a deleted one, but `hippo dormant restore <id>` brings it
|
|
121
|
-
* back and `hippo dormant forget <id>` deletes it for good. A faded memory
|
|
122
|
-
* the secret detector flags is always deleted, never kept dormant.
|
|
123
|
-
* `{"enabled": false}` restores the old delete-on-fade behaviour. */
|
|
107
|
+
/** Dormant memories (src/store/dormant.ts), on by default: the sleep decay pass moves a memory that faded below the threshold there instead of deleting it
|
|
108
|
+
* (`hippo dormant restore|forget <id>`); a faded memory the secret detector flags is always deleted. `{"enabled": false}` restores delete-on-fade. */
|
|
124
109
|
dormant: {
|
|
125
110
|
enabled: boolean;
|
|
126
111
|
/** Days a dormant memory is kept before sleep deletes it for good.
|
|
@@ -155,6 +140,7 @@ export interface HippoConfig {
|
|
|
155
140
|
* and a context read must name the caller's project. Default false. Read it through isSharedStore. */
|
|
156
141
|
sharedStore: boolean;
|
|
157
142
|
}
|
|
143
|
+
export declare const DEFAULT_CONFIG: HippoConfig;
|
|
158
144
|
export declare function loadConfig(hippoRoot: string): HippoConfig;
|
|
159
145
|
/** True when the store's config.json sets `"sharedStore": true`. Once true, a root stays true for this process,
|
|
160
146
|
* so a broken edit while a server runs cannot turn it off. Reads only this key, so loadConfig's warnings stay loadConfig's. */
|
package/dist/core/config.js
CHANGED
|
@@ -6,9 +6,9 @@ import * as path from 'path';
|
|
|
6
6
|
import { DEFAULT_PHYSICS_CONFIG, mergePhysicsConfig } from './physics-config.js';
|
|
7
7
|
import { DEFAULT_HALF_LIFE_DAYS } from './memory.js';
|
|
8
8
|
import { DEFAULT_LOCAL_BUMP, DEFAULT_RECALL_BUDGET } from './search-types.js';
|
|
9
|
-
import { errorMessage, log } from '../util/log.js';
|
|
9
|
+
import { errorCode, errorMessage, log } from '../util/log.js';
|
|
10
10
|
import { isJsonObject } from '../util/json.js';
|
|
11
|
-
const DEFAULT_CONFIG = {
|
|
11
|
+
export const DEFAULT_CONFIG = {
|
|
12
12
|
defaultHalfLifeDays: DEFAULT_HALF_LIFE_DAYS,
|
|
13
13
|
defaultBudget: DEFAULT_RECALL_BUDGET,
|
|
14
14
|
defaultContextBudget: 3000,
|
|
@@ -158,8 +158,7 @@ function memoryValueOverride(raw) {
|
|
|
158
158
|
return memoryValueRaw !== undefined && isJsonObject(memoryValueRaw) ? memoryValueRaw : {};
|
|
159
159
|
}
|
|
160
160
|
function dormantSettings(raw) {
|
|
161
|
-
// Same rule as memoryValue above: a malformed value never silently
|
|
162
|
-
// changes what sleep does. Anything but a real object / boolean / number
|
|
161
|
+
// Same rule as memoryValue above: a malformed value never silently changes what sleep does; anything but a real object / boolean / number
|
|
163
162
|
// warns and falls back to the default, which keeps faded memories.
|
|
164
163
|
const dormantRaw = raw.dormant;
|
|
165
164
|
if (dormantRaw !== undefined && !isJsonObject(dormantRaw)) {
|
|
@@ -244,7 +243,12 @@ function fileStamp(file) {
|
|
|
244
243
|
return stat === undefined ? null : `${stat.mtimeMs}:${stat.size}`;
|
|
245
244
|
}
|
|
246
245
|
catch (err) {
|
|
247
|
-
|
|
246
|
+
const code = errorCode(err);
|
|
247
|
+
const message = `config: ${file} could not be reached, read as missing: ${errorMessage(err)}`;
|
|
248
|
+
if (code === 'EACCES' || code === 'EPERM')
|
|
249
|
+
log.warnThenDebug(`config-unreachable:${file}:${code}`, message, { path: file, code });
|
|
250
|
+
else
|
|
251
|
+
log.debug(message);
|
|
248
252
|
return null;
|
|
249
253
|
}
|
|
250
254
|
}
|
|
@@ -274,22 +278,22 @@ function configOverDefaults(raw) {
|
|
|
274
278
|
decayBasis: validBasis ? basis : DEFAULT_CONFIG.decayBasis,
|
|
275
279
|
autoLearnOnSleep: raw.autoLearnOnSleep ?? DEFAULT_CONFIG.autoLearnOnSleep,
|
|
276
280
|
autoShareOnSleep: raw.autoShareOnSleep ?? DEFAULT_CONFIG.autoShareOnSleep,
|
|
277
|
-
autoSleep: { ...DEFAULT_CONFIG.autoSleep, ...
|
|
278
|
-
embeddings: { ...DEFAULT_CONFIG.embeddings, ...
|
|
279
|
-
global: { ...DEFAULT_CONFIG.global, ...
|
|
281
|
+
autoSleep: { ...DEFAULT_CONFIG.autoSleep, ...raw.autoSleep },
|
|
282
|
+
embeddings: { ...DEFAULT_CONFIG.embeddings, ...raw.embeddings },
|
|
283
|
+
global: { ...DEFAULT_CONFIG.global, ...raw.global },
|
|
280
284
|
gitLearnPatterns: raw.gitLearnPatterns ?? DEFAULT_CONFIG.gitLearnPatterns,
|
|
281
285
|
physics: mergePhysicsConfig(raw.physics),
|
|
282
|
-
mmr: { ...DEFAULT_CONFIG.mmr, ...
|
|
283
|
-
search: { ...DEFAULT_CONFIG.search, ...
|
|
284
|
-
replay: { ...DEFAULT_CONFIG.replay, ...
|
|
286
|
+
mmr: { ...DEFAULT_CONFIG.mmr, ...raw.mmr },
|
|
287
|
+
search: { ...DEFAULT_CONFIG.search, ...raw.search },
|
|
288
|
+
replay: { ...DEFAULT_CONFIG.replay, ...raw.replay },
|
|
285
289
|
autoTraceCapture: raw.autoTraceCapture ?? DEFAULT_CONFIG.autoTraceCapture,
|
|
286
290
|
autoTraceWindowDays: raw.autoTraceWindowDays ?? DEFAULT_CONFIG.autoTraceWindowDays,
|
|
287
|
-
pinnedInject: { ...DEFAULT_CONFIG.pinnedInject, ...
|
|
291
|
+
pinnedInject: { ...DEFAULT_CONFIG.pinnedInject, ...raw.pinnedInject },
|
|
288
292
|
contextProjectIsolation: raw.contextProjectIsolation ?? DEFAULT_CONFIG.contextProjectIsolation,
|
|
289
|
-
extraction: { ...DEFAULT_CONFIG.extraction, ...
|
|
290
|
-
multihop: { ...DEFAULT_CONFIG.multihop, ...
|
|
291
|
-
salience: { ...DEFAULT_CONFIG.salience, ...
|
|
292
|
-
ambient: { ...DEFAULT_CONFIG.ambient, ...
|
|
293
|
+
extraction: { ...DEFAULT_CONFIG.extraction, ...raw.extraction },
|
|
294
|
+
multihop: { ...DEFAULT_CONFIG.multihop, ...raw.multihop },
|
|
295
|
+
salience: { ...DEFAULT_CONFIG.salience, ...raw.salience },
|
|
296
|
+
ambient: { ...DEFAULT_CONFIG.ambient, ...raw.ambient },
|
|
293
297
|
memoryValue: {
|
|
294
298
|
...DEFAULT_CONFIG.memoryValue,
|
|
295
299
|
...memoryValue,
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Cosine over any indexable vectors (a Float32 view scores as its number[] copy); 0 for empty, mismatched or zero-norm input. */
|
|
2
|
+
export function cosineOf(a, b) {
|
|
3
|
+
if (a.length === 0 || b.length === 0 || a.length !== b.length)
|
|
4
|
+
return 0;
|
|
5
|
+
let dot = 0;
|
|
6
|
+
let normA = 0;
|
|
7
|
+
let normB = 0;
|
|
8
|
+
for (let i = 0; i < a.length; i++) {
|
|
9
|
+
dot += a[i] * b[i];
|
|
10
|
+
normA += a[i] * a[i];
|
|
11
|
+
normB += b[i] * b[i];
|
|
12
|
+
}
|
|
13
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
14
|
+
if (denom < 1e-10)
|
|
15
|
+
return 0;
|
|
16
|
+
// Clamp to [-1, 1] to handle floating point drift
|
|
17
|
+
return Math.min(1, Math.max(-1, dot / denom));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=cosine.js.map
|