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
|
@@ -9,25 +9,9 @@ import { resolveTenantForSlackTeam } from './tenant-routing.js';
|
|
|
9
9
|
import { resolveTenantId } from '../../store/tenant.js';
|
|
10
10
|
import { HttpError, JSON_HEADERS, isHeaderString, closeIfBodyUnread, readWebhookBody, sendJson } from '../../util/http-util.js';
|
|
11
11
|
import { isJsonObject } from '../../util/json.js';
|
|
12
|
-
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* this route is in PUBLIC_ROUTES. The route is responsible for:
|
|
16
|
-
* 1. Echoing the one-time url_verification challenge.
|
|
17
|
-
* 2. Verifying the HMAC on every other inbound payload.
|
|
18
|
-
* 3. Resolving body.team_id → tenantId via slack_workspaces, falling
|
|
19
|
-
* back to HIPPO_TENANT then 'default'.
|
|
20
|
-
* 4. Dispatching event_callback envelopes to ingestMessage /
|
|
21
|
-
* handleMessageDeleted.
|
|
22
|
-
* 5. Parking malformed or unhandled payloads in slack_dlq and STILL
|
|
23
|
-
* ACKing 200 - Slack retries forever otherwise.
|
|
24
|
-
*
|
|
25
|
-
* When SLACK_SIGNING_SECRET is unset we return 404, not
|
|
26
|
-
* 503, so an external probe cannot distinguish "route gated off by config"
|
|
27
|
-
* from "route does not exist on this build".
|
|
28
|
-
*
|
|
29
|
-
* Bearer auth is skipped on purpose: server.ts checks isPublicRoute before calling this.
|
|
30
|
-
*/
|
|
12
|
+
/** Slack Events API webhook: HMAC over the raw body with SLACK_SIGNING_SECRET, no Bearer (its route row declares webhook-signature);
|
|
13
|
+
* malformed payloads go to slack_dlq, ACK 200.
|
|
14
|
+
* 404 (not 503) when the secret is unset, so a probe cannot tell a gated-off route from a missing one. */
|
|
31
15
|
export async function handleSlackEventsWebhook(request, store) {
|
|
32
16
|
const { req, res, opts } = request;
|
|
33
17
|
// Secret and headers before the body, so a caller with neither cannot make the server buffer one.
|
|
@@ -104,10 +88,8 @@ async function routeSignedSlackPayload(d) {
|
|
|
104
88
|
}
|
|
105
89
|
if (answerUrlVerification(res, body))
|
|
106
90
|
return;
|
|
107
|
-
//
|
|
108
|
-
// and
|
|
109
|
-
// park the envelope in slack_dlq with bucket='unroutable'. Mandatory ACK
|
|
110
|
-
// 200 so Slack stops retrying; do NOT call ingest.
|
|
91
|
+
// Fail closed: resolveTenantForSlackTeam returns null for an unknown team on a non-empty slack_workspaces; park it in slack_dlq (bucket='unroutable')
|
|
92
|
+
// and still ACKs 200 so Slack stops retrying; never call ingest.
|
|
111
93
|
let resolvedTenant = null;
|
|
112
94
|
if (body !== undefined && isSlackEventEnvelope(body)) {
|
|
113
95
|
resolvedTenant = await resolveTenantForSlackTeam(d.hippoRoot, body.team_id, d.store);
|
|
@@ -169,9 +151,7 @@ async function dispatchSlackEvent(d, ctx, body) {
|
|
|
169
151
|
}
|
|
170
152
|
const r = await ingestMessage(ctx, {
|
|
171
153
|
teamId: body.team_id,
|
|
172
|
-
//
|
|
173
|
-
// proxy. 'group'|'im'|'mpim' → private. 'channel' → public. Unknown
|
|
174
|
-
// → private (fail closed).
|
|
154
|
+
// Channel privacy is not on the inner event, so channel_type is the proxy: 'group'|'im'|'mpim' private, 'channel' public, unknown private.
|
|
175
155
|
channel: {
|
|
176
156
|
id: inner.channel,
|
|
177
157
|
is_private: inner.channel_type !== 'channel',
|
|
@@ -1,23 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* The `slack_workspaces` table maps Slack `team_id` → hippo `tenant_id`.
|
|
5
|
-
* Empty table = single-tenant install (HIPPO_TENANT fallback).
|
|
6
|
-
* Non-empty = multi-workspace install (fail-closed routing via
|
|
7
|
-
* `resolveTenantForTeam`).
|
|
8
|
-
*
|
|
9
|
-
* These helpers give the CLI (`hippo slack workspaces add|list|remove`) a
|
|
10
|
-
* surface, so operators with multiple workspaces need no direct SQL.
|
|
11
|
-
*
|
|
12
|
-
* Design choices:
|
|
13
|
-
* - `add` is an upsert (ON CONFLICT UPDATE). Re-registering an
|
|
14
|
-
* existing team_id with a different tenant_id intentionally
|
|
15
|
-
* overwrites — operators move workspaces between tenants and the
|
|
16
|
-
* CLI shouldn't require a delete+add dance.
|
|
17
|
-
* - `list` sorts by team_id for stable output.
|
|
18
|
-
* - `remove` returns a boolean for the CLI to distinguish "removed"
|
|
19
|
-
* from "not found" without an extra SELECT.
|
|
20
|
-
*/
|
|
1
|
+
/** Slack workspace registration helpers: the `slack_workspaces` table maps `team_id` to `tenant_id` (empty = single-tenant, non-empty = fail-closed routing).
|
|
2
|
+
* `add` is an upsert that overwrites an existing team_id's tenant on purpose, so moving a workspace needs no delete+add. */
|
|
21
3
|
import { type SlackWorkspace } from '../../store/connectors/slack.js';
|
|
22
4
|
export type { SlackWorkspace };
|
|
23
5
|
export { listSlackWorkspaces as listWorkspaces, removeSlackWorkspace as removeWorkspace } from '../../store/connectors/slack.js';
|
|
@@ -25,9 +7,7 @@ export interface AddWorkspaceOpts {
|
|
|
25
7
|
teamId: string;
|
|
26
8
|
tenantId: string;
|
|
27
9
|
}
|
|
28
|
-
/**
|
|
29
|
-
*
|
|
30
|
-
* team_id conflict (operators move workspaces between tenants).
|
|
31
|
-
*/
|
|
10
|
+
/** Register or re-register a Slack team → tenant mapping. Upserts on
|
|
11
|
+
* team_id conflict (operators move workspaces between tenants). */
|
|
32
12
|
export declare function addWorkspace(hippoRoot: string, opts: AddWorkspaceOpts): SlackWorkspace;
|
|
33
13
|
//# sourceMappingURL=workspaces.d.ts.map
|
|
@@ -1,29 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* The `slack_workspaces` table maps Slack `team_id` → hippo `tenant_id`.
|
|
5
|
-
* Empty table = single-tenant install (HIPPO_TENANT fallback).
|
|
6
|
-
* Non-empty = multi-workspace install (fail-closed routing via
|
|
7
|
-
* `resolveTenantForTeam`).
|
|
8
|
-
*
|
|
9
|
-
* These helpers give the CLI (`hippo slack workspaces add|list|remove`) a
|
|
10
|
-
* surface, so operators with multiple workspaces need no direct SQL.
|
|
11
|
-
*
|
|
12
|
-
* Design choices:
|
|
13
|
-
* - `add` is an upsert (ON CONFLICT UPDATE). Re-registering an
|
|
14
|
-
* existing team_id with a different tenant_id intentionally
|
|
15
|
-
* overwrites — operators move workspaces between tenants and the
|
|
16
|
-
* CLI shouldn't require a delete+add dance.
|
|
17
|
-
* - `list` sorts by team_id for stable output.
|
|
18
|
-
* - `remove` returns a boolean for the CLI to distinguish "removed"
|
|
19
|
-
* from "not found" without an extra SELECT.
|
|
20
|
-
*/
|
|
1
|
+
/** Slack workspace registration helpers: the `slack_workspaces` table maps `team_id` to `tenant_id` (empty = single-tenant, non-empty = fail-closed routing).
|
|
2
|
+
* `add` is an upsert that overwrites an existing team_id's tenant on purpose, so moving a workspace needs no delete+add. */
|
|
21
3
|
import { upsertSlackWorkspace } from '../../store/connectors/slack.js';
|
|
22
4
|
export { listSlackWorkspaces as listWorkspaces, removeSlackWorkspace as removeWorkspace } from '../../store/connectors/slack.js';
|
|
23
|
-
/**
|
|
24
|
-
*
|
|
25
|
-
* team_id conflict (operators move workspaces between tenants).
|
|
26
|
-
*/
|
|
5
|
+
/** Register or re-register a Slack team → tenant mapping. Upserts on
|
|
6
|
+
* team_id conflict (operators move workspaces between tenants). */
|
|
27
7
|
export function addWorkspace(hippoRoot, opts) {
|
|
28
8
|
return upsertSlackWorkspace(hippoRoot, opts.teamId, opts.tenantId);
|
|
29
9
|
}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import { Layer, calculateStrength } from '../core/memory.js';
|
|
2
2
|
import { jaccardMinShared, overlapPartners } from './overlap-index.js';
|
|
3
3
|
import { isQuarantineScope } from '../trust/quarantine.js';
|
|
4
|
-
import { isPersonalScope } from '../
|
|
4
|
+
import { isPersonalScope } from '../core/recall-scope.js';
|
|
5
5
|
import { DECAY_THRESHOLD } from './decay.js';
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// conflicts before the polarity heuristics run.
|
|
9
|
-
// Jaccard threshold on stopword-filtered tokens. Only applied after a polarity
|
|
10
|
-
// signal has already been detected (explicit pair or inferred negation), so
|
|
11
|
-
// this just filters out drive-by topic similarity, not semantic drift.
|
|
6
|
+
// Gate contradictions on content overlap, not shared tags (`feedback`/`policy` are too coarse). The Jaccard threshold on stopword-filtered tokens
|
|
7
|
+
// only applies after a polarity signal, so it filters drive-by topic similarity, not semantic drift.
|
|
12
8
|
const CONFLICT_OVERLAP_THRESHOLD = 0.5;
|
|
13
9
|
// Minimum distinctive shared tokens before we trust an overlap score. Filters
|
|
14
10
|
// out cases where two memories share only common English + a project name.
|
|
@@ -41,9 +37,8 @@ rescuedIds = new Set()) {
|
|
|
41
37
|
const partnersOf = overlapPartners(profiles.map((p) => p.distinct), jaccardMinShared(CONFLICT_OVERLAP_THRESHOLD, CONFLICT_MIN_RARE_SHARED));
|
|
42
38
|
for (let i = 0; i < survivors.length; i++) {
|
|
43
39
|
for (const j of partnersOf(i)) {
|
|
44
|
-
// Traces are variants of each other, not contradictions
|
|
45
|
-
//
|
|
46
|
-
// exists for stated-rule disagreement, not strategy diversity.
|
|
40
|
+
// Traces are variants of each other, not contradictions: two strategies for the same task can both be valid,
|
|
41
|
+
// and conflict detection is for stated-rule disagreement, not strategy diversity.
|
|
47
42
|
if (survivors[i].layer === Layer.Trace && survivors[j].layer === Layer.Trace)
|
|
48
43
|
continue;
|
|
49
44
|
if (survivors[i].superseded_by || survivors[j].superseded_by)
|
|
@@ -77,8 +72,7 @@ function recalledTogether(a, b) {
|
|
|
77
72
|
}
|
|
78
73
|
function conflictProfile(text) {
|
|
79
74
|
const opening = openingWindow(text);
|
|
80
|
-
// Polarity is measured only in the first POLARITY_WINDOW_WORDS, so a stray
|
|
81
|
-
// negation deep in a prose memory doesn't flip the intent.
|
|
75
|
+
// Polarity is measured only in the first POLARITY_WINDOW_WORDS, so a stray negation deep in a prose memory doesn't flip the intent.
|
|
82
76
|
// Pad with spaces so space-delimited patterns match words at the start/end.
|
|
83
77
|
return { distinct: distinctiveTokens(text), polarity: inferConflictPolarity(opening), window: ' ' + opening.toLowerCase() + ' ' };
|
|
84
78
|
}
|
|
@@ -128,9 +122,7 @@ function openingWindow(text) {
|
|
|
128
122
|
}
|
|
129
123
|
// Takes opening windows only, so " on " and " off " as prepositions deep in long prose don't read as enabled/disabled.
|
|
130
124
|
function classifyConflictType(a, b, aPolarity, bPolarity) {
|
|
131
|
-
//
|
|
132
|
-
// match "on/off". Pair only `enabled` ↔ `disabled` and explicit on/off in
|
|
133
|
-
// imperative context.
|
|
125
|
+
// Whole-word boundaries so " on " alone doesn't match "on/off"; pair only `enabled` <-> `disabled` and explicit on/off in imperative context.
|
|
134
126
|
const enabledDisabled = (containsAny(a, [' enabled ', ' enable ']) && containsAny(b, [' disabled ', ' disable ']))
|
|
135
127
|
|| (containsAny(b, [' enabled ', ' enable ']) && containsAny(a, [' disabled ', ' disable ']));
|
|
136
128
|
if (enabledDisabled)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface DagSummaryOptions {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
model?: string;
|
|
4
|
+
fetcher?: typeof fetch;
|
|
5
|
+
onError?: (msg: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function generateDagSummary(label: string, factContents: string[], opts: DagSummaryOptions): Promise<string | null>;
|
|
8
|
+
//# sourceMappingURL=dag-summary.d.ts.map
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// The one LLM call behind every DAG summary, kept apart from the graph writes so its request bytes are tested on their own.
|
|
2
|
+
import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
3
|
+
import { describeMessageFailure, sendAnthropicMessage } from '../util/anthropic-messages.js';
|
|
4
|
+
import { certainDefect } from '../core/memory-quality.js';
|
|
5
|
+
const DAG_SUMMARY_PROMPT = `You are summarizing a cluster of facts about a specific topic/entity for a memory system.
|
|
6
|
+
|
|
7
|
+
Topic: {label}
|
|
8
|
+
Facts:
|
|
9
|
+
{facts}
|
|
10
|
+
|
|
11
|
+
` +
|
|
12
|
+
'Write a single concise paragraph (2-4 sentences) that captures all the key information from these facts. ' +
|
|
13
|
+
'This summary will be used to quickly determine if this cluster is relevant to a future query, ' +
|
|
14
|
+
'so include specific names, dates, numbers, and key details. Output ONLY the summary paragraph, no preamble.';
|
|
15
|
+
// Output budget for one summary paragraph, and the shortest reply kept as a summary.
|
|
16
|
+
const SUMMARY_MAX_TOKENS = 400;
|
|
17
|
+
const SUMMARY_MIN_CHARS = 20;
|
|
18
|
+
export async function generateDagSummary(label, factContents, opts) {
|
|
19
|
+
const factsBlock = factContents.map((f, i) => `${i + 1}. ${redactSecretsStrict(f)}`).join('\n');
|
|
20
|
+
const prompt = DAG_SUMMARY_PROMPT
|
|
21
|
+
.replace('{label}', redactSecretsStrict(label))
|
|
22
|
+
.replace('{facts}', factsBlock);
|
|
23
|
+
const reply = await sendAnthropicMessage({
|
|
24
|
+
apiKey: opts.apiKey,
|
|
25
|
+
model: opts.model,
|
|
26
|
+
maxTokens: SUMMARY_MAX_TOKENS,
|
|
27
|
+
prompt,
|
|
28
|
+
fetcher: opts.fetcher,
|
|
29
|
+
});
|
|
30
|
+
if (!reply.ok) {
|
|
31
|
+
opts.onError?.(describeMessageFailure(reply.failure));
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const defect = certainDefect(reply.text);
|
|
35
|
+
if (defect !== null) {
|
|
36
|
+
opts.onError?.(`summary quality refused: ${defect}`);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return reply.text.length >= SUMMARY_MIN_CHARS ? reply.text : null;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=dag-summary.js.map
|
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
import { type MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import { type DagSummaryOptions } from './dag-summary.js';
|
|
2
3
|
export interface FactCluster {
|
|
3
4
|
label: string;
|
|
4
5
|
members: MemoryEntry[];
|
|
5
6
|
entityTags: string[];
|
|
6
7
|
}
|
|
7
8
|
export declare function clusterFacts(facts: MemoryEntry[]): FactCluster[];
|
|
8
|
-
export interface DagSummaryOptions {
|
|
9
|
-
apiKey: string;
|
|
10
|
-
model?: string;
|
|
11
|
-
fetcher?: typeof fetch;
|
|
12
|
-
onError?: (msg: string) => void;
|
|
13
|
-
}
|
|
14
|
-
export declare function generateDagSummary(label: string, factContents: string[], opts: DagSummaryOptions): Promise<string | null>;
|
|
15
9
|
export interface DagBuildResult {
|
|
16
10
|
candidateClusters: number;
|
|
17
11
|
summariesCreated: number;
|
|
@@ -29,19 +23,8 @@ export interface DagRebuildResult {
|
|
|
29
23
|
failed: number;
|
|
30
24
|
capped: boolean;
|
|
31
25
|
}
|
|
32
|
-
/**
|
|
33
|
-
*
|
|
34
|
-
* Thin orchestrator; the heavy lifting lives in store.ts (load + apply)
|
|
35
|
-
* and dag.ts:generateDagSummary (LLM call).
|
|
36
|
-
*
|
|
37
|
-
* Per-summary try/catch: one throwing rebuild does NOT abort the rest of the queue.
|
|
38
|
-
*
|
|
39
|
-
* Race-loser handling: applyRebuildResult's UPDATE WHERE includes
|
|
40
|
-
* AND summary_dirty=1, so concurrent sleep's second writer returns
|
|
41
|
-
* changed=false. Silent skip (neither rebuilt++ nor refused++ nor failed++).
|
|
42
|
-
*
|
|
43
|
-
* A tombstone hit counts as `refused`, not `rebuilt`; dirty clears either way.
|
|
44
|
-
*/
|
|
26
|
+
/** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest.
|
|
27
|
+
* A concurrent sleep's second writer gets changed=false (UPDATE requires summary_dirty=1) and is skipped silently; a tombstone hit counts as `refused`. */
|
|
45
28
|
export declare function rebuildDirtySummaries(hippoRoot: string, opts: DagSummaryOptions & {
|
|
46
29
|
cap?: number;
|
|
47
30
|
}): Promise<DagRebuildResult>;
|
|
@@ -54,13 +37,7 @@ export interface EntityProfilesBuildResult {
|
|
|
54
37
|
* `failed`: a tombstone hit is a deliberate refusal, not an error. */
|
|
55
38
|
rejected: number;
|
|
56
39
|
}
|
|
57
|
-
/**
|
|
58
|
-
*
|
|
59
|
-
* shared entity tags. Threshold 2+ L2s per entity. Mirrors buildDag L1->L2
|
|
60
|
-
* pattern, one level up.
|
|
61
|
-
*
|
|
62
|
-
* Born-dirty cancellation: each L2 link write marks the new L3 dirty, so clear it
|
|
63
|
-
* or the same sleep cycle's rebuild re-rebuilds the freshly built L3.
|
|
64
|
-
*/
|
|
40
|
+
/** Build L3 entity profiles by clustering L2 summaries sharing entity tags (2+ L2s per entity).
|
|
41
|
+
* Each L2 link write marks the new L3 dirty, so clear it or the same cycle re-rebuilds it. */
|
|
65
42
|
export declare function buildEntityProfiles(hippoRoot: string, l2Summaries: MemoryEntry[], opts: DagSummaryOptions): Promise<EntityProfilesBuildResult>;
|
|
66
43
|
//# sourceMappingURL=dag.d.ts.map
|
package/dist/consolidate/dag.js
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { createMemory, Layer } from '../core/memory.js';
|
|
2
2
|
import { writeEntry, writeEntriesTogether } from '../store/entry-writes.js';
|
|
3
3
|
import { loadAllDirtySummaries, loadChildrenOfSummary, applyRebuildResult, clearSummaryDirtyAfterBuild, } from '../store/summaries.js';
|
|
4
|
-
import { RejectedValueError } from '../
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { derivationScope, derivationPartitionKey } from '../
|
|
4
|
+
import { RejectedValueError } from '../core/api-errors.js';
|
|
5
|
+
import { generateDagSummary } from './dag-summary.js';
|
|
6
|
+
import { overlapPartners } from './overlap-index.js';
|
|
7
|
+
import { derivationScope, derivationPartitionKey } from '../core/recall-scope.js';
|
|
8
8
|
import { loadConfig } from '../core/config.js';
|
|
9
|
-
import { neverAutoShareTags } from '../sharing/
|
|
10
|
-
import { errorMessage, log } from '../util/log.js';
|
|
11
|
-
import { certainDefect } from '../core/memory-quality.js';
|
|
9
|
+
import { neverAutoShareTags } from '../sharing/share.js';
|
|
10
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
12
11
|
const SUMMARY_FALLBACK_CHARS = 40;
|
|
13
12
|
const DEFAULT_REBUILD_CAP = 20;
|
|
13
|
+
// Facts join a cluster when their tag sets overlap at least this much.
|
|
14
|
+
const CLUSTER_JACCARD_MIN = 0.5;
|
|
14
15
|
export function clusterFacts(facts) {
|
|
15
16
|
if (facts.length === 0)
|
|
16
17
|
return [];
|
|
17
18
|
const entityTags = facts.map((f) => f.tags.filter((t) => t.startsWith('speaker:') || t.startsWith('topic:')));
|
|
19
|
+
const tagSets = entityTags.map((tags) => new Set(tags));
|
|
20
|
+
// Every tag indexed, not a prefix: a repeated tag counts twice in `shared`, so the prefix-filter bound would not hold.
|
|
21
|
+
const partnersOf = overlapPartners(tagSets, () => 1);
|
|
18
22
|
const assigned = new Set();
|
|
19
23
|
const clusters = [];
|
|
20
24
|
for (let i = 0; i < facts.length; i++) {
|
|
@@ -22,19 +26,18 @@ export function clusterFacts(facts) {
|
|
|
22
26
|
continue;
|
|
23
27
|
const cluster = [i];
|
|
24
28
|
assigned.add(i);
|
|
25
|
-
for (
|
|
29
|
+
for (const j of partnersOf(i)) {
|
|
26
30
|
if (assigned.has(j))
|
|
27
31
|
continue;
|
|
28
|
-
const shared = entityTags[i].filter((t) =>
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
if (jaccard >= 0.5) {
|
|
32
|
+
const shared = entityTags[i].filter((t) => tagSets[j].has(t)).length;
|
|
33
|
+
const inBoth = [...tagSets[i]].filter((t) => tagSets[j].has(t)).length;
|
|
34
|
+
if (shared / (tagSets[i].size + tagSets[j].size - inBoth) >= CLUSTER_JACCARD_MIN) {
|
|
32
35
|
cluster.push(j);
|
|
33
36
|
assigned.add(j);
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
39
|
const members = cluster.map((idx) => facts[idx]);
|
|
37
|
-
const sharedTags = entityTags[cluster[0]].filter((t) => cluster.every((idx) =>
|
|
40
|
+
const sharedTags = entityTags[cluster[0]].filter((t) => cluster.every((idx) => tagSets[idx].has(t)));
|
|
38
41
|
const label = sharedTags
|
|
39
42
|
.map((t) => t.split(':')[1])
|
|
40
43
|
.join(': ') || members[0].content.slice(0, SUMMARY_FALLBACK_CHARS);
|
|
@@ -42,41 +45,7 @@ export function clusterFacts(facts) {
|
|
|
42
45
|
}
|
|
43
46
|
return clusters;
|
|
44
47
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
Topic: {label}
|
|
48
|
-
Facts:
|
|
49
|
-
{facts}
|
|
50
|
-
|
|
51
|
-
Write a single concise paragraph (2-4 sentences) that captures all the key information from these facts. This summary will be used to quickly determine if this cluster is relevant to a future query, so include specific names, dates, numbers, and key details. Output ONLY the summary paragraph, no preamble.`;
|
|
52
|
-
// Output budget for one summary paragraph, and the shortest reply kept as a summary.
|
|
53
|
-
const SUMMARY_MAX_TOKENS = 400;
|
|
54
|
-
const SUMMARY_MIN_CHARS = 20;
|
|
55
|
-
export async function generateDagSummary(label, factContents, opts) {
|
|
56
|
-
const factsBlock = factContents.map((f, i) => `${i + 1}. ${redactSecretsStrict(f)}`).join('\n');
|
|
57
|
-
const prompt = DAG_SUMMARY_PROMPT
|
|
58
|
-
.replace('{label}', redactSecretsStrict(label))
|
|
59
|
-
.replace('{facts}', factsBlock);
|
|
60
|
-
const reply = await sendAnthropicMessage({
|
|
61
|
-
apiKey: opts.apiKey,
|
|
62
|
-
model: opts.model,
|
|
63
|
-
maxTokens: SUMMARY_MAX_TOKENS,
|
|
64
|
-
prompt,
|
|
65
|
-
fetcher: opts.fetcher,
|
|
66
|
-
});
|
|
67
|
-
if (!reply.ok) {
|
|
68
|
-
opts.onError?.(describeMessageFailure(reply.failure));
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
const defect = certainDefect(reply.text);
|
|
72
|
-
if (defect !== null) {
|
|
73
|
-
opts.onError?.(`summary quality refused: ${defect}`);
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
return reply.text.length >= SUMMARY_MIN_CHARS ? reply.text : null;
|
|
77
|
-
}
|
|
78
|
-
// Partition BEFORE clustering so one LLM summary never mixes facts from different tenants.
|
|
79
|
-
// Map keeps insertion order, so a single-tenant store iterates in its original order.
|
|
48
|
+
// Partition before clustering so one LLM summary never mixes tenants; Map keeps insertion order, so a single-tenant store iterates as before.
|
|
80
49
|
// buildEntityProfiles partitions its L2s with this same key.
|
|
81
50
|
function partitionFactsByTenant(unparented) {
|
|
82
51
|
const unparentedByTenant = new Map();
|
|
@@ -93,10 +62,7 @@ function partitionFactsByTenant(unparented) {
|
|
|
93
62
|
/** The L2 summary entry for one cluster, landing in the facts' own tenant and scope. */
|
|
94
63
|
function createClusterSummaryEntry(summary, cluster, home) {
|
|
95
64
|
const memberCreatedAts = cluster.members.map((m) => m.created).sort();
|
|
96
|
-
// Every member
|
|
97
|
-
// tenant partition above), so the summary lands in the same tenant
|
|
98
|
-
// as the facts it summarizes instead of always 'default'
|
|
99
|
-
// (memory.ts:535 defaults tenantId when the option is omitted).
|
|
65
|
+
// Every cluster member shares home.tenantId (tenant partition above), so the summary lands in the facts' tenant, not 'default'.
|
|
100
66
|
const summaryEntry = createMemory(summary, {
|
|
101
67
|
layer: Layer.Semantic,
|
|
102
68
|
tags: [...cluster.entityTags, ...neverAutoShareTags(cluster.members), 'dag-summary'],
|
|
@@ -204,9 +170,8 @@ function clearZeroChildSummary(hippoRoot, summary, result) {
|
|
|
204
170
|
});
|
|
205
171
|
if (changed)
|
|
206
172
|
result.zeroChildSkipped++;
|
|
207
|
-
// changed=false
|
|
208
|
-
//
|
|
209
|
-
// tombstone when bumpRebuildCount is true (store/summaries.ts).
|
|
173
|
+
// changed=false means race lost or row vanished: skip silently. `refused` is always false here, as applyRebuildResult
|
|
174
|
+
// checks the tombstone only when bumpRebuildCount is true.
|
|
210
175
|
}
|
|
211
176
|
// Derive label from summary's existing entity tags (mirrors clusterFacts)
|
|
212
177
|
function summaryLabel(summary) {
|
|
@@ -215,22 +180,12 @@ function summaryLabel(summary) {
|
|
|
215
180
|
? entityTags.map((t) => t.split(':')[1]).join(': ')
|
|
216
181
|
: summary.content.slice(0, SUMMARY_FALLBACK_CHARS);
|
|
217
182
|
}
|
|
218
|
-
/**
|
|
219
|
-
*
|
|
220
|
-
* Thin orchestrator; the heavy lifting lives in store.ts (load + apply)
|
|
221
|
-
* and dag.ts:generateDagSummary (LLM call).
|
|
222
|
-
*
|
|
223
|
-
* Per-summary try/catch: one throwing rebuild does NOT abort the rest of the queue.
|
|
224
|
-
*
|
|
225
|
-
* Race-loser handling: applyRebuildResult's UPDATE WHERE includes
|
|
226
|
-
* AND summary_dirty=1, so concurrent sleep's second writer returns
|
|
227
|
-
* changed=false. Silent skip (neither rebuilt++ nor refused++ nor failed++).
|
|
228
|
-
*
|
|
229
|
-
* A tombstone hit counts as `refused`, not `rebuilt`; dirty clears either way.
|
|
230
|
-
*/
|
|
183
|
+
/** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest.
|
|
184
|
+
* A concurrent sleep's second writer gets changed=false (UPDATE requires summary_dirty=1) and is skipped silently; a tombstone hit counts as `refused`. */
|
|
231
185
|
export async function rebuildDirtySummaries(hippoRoot, opts) {
|
|
232
186
|
const cap = opts.cap ?? DEFAULT_REBUILD_CAP;
|
|
233
|
-
|
|
187
|
+
// One past the cap tells whether more were waiting without reading the rest.
|
|
188
|
+
const dirty = loadAllDirtySummaries(hippoRoot, cap + 1);
|
|
234
189
|
const capped = dirty.length > cap;
|
|
235
190
|
const queue = dirty.slice(0, cap);
|
|
236
191
|
const result = {
|
|
@@ -242,12 +197,8 @@ export async function rebuildDirtySummaries(hippoRoot, opts) {
|
|
|
242
197
|
capped,
|
|
243
198
|
};
|
|
244
199
|
for (const [index, summary] of queue.entries()) {
|
|
245
|
-
// Yield the macrotask queue every 25 summaries
|
|
246
|
-
//
|
|
247
|
-
// microtask when the response is cached/mocked), so a large batch would
|
|
248
|
-
// otherwise starve timers and IPC for the whole rebuild: server
|
|
249
|
-
// keep-alive pings in production, Vitest's birpc heartbeat in tests
|
|
250
|
-
// (hardcoded 60s upstream, vitest-dev/vitest#8164).
|
|
200
|
+
// Yield the macrotask queue every 25 summaries: each iteration is synchronous SQLite, so a batch of up to 1000
|
|
201
|
+
// would starve timers and IPC (server keep-alives, Vitest's birpc heartbeat).
|
|
251
202
|
if (index > 0 && index % 25 === 0) {
|
|
252
203
|
await new Promise((resolve) => setImmediate(resolve));
|
|
253
204
|
}
|
|
@@ -258,7 +209,7 @@ export async function rebuildDirtySummaries(hippoRoot, opts) {
|
|
|
258
209
|
// One throw doesn't abort the queue; log enough to triage an exotic
|
|
259
210
|
// failure (SQLite I/O, prepare), since audit() already catches its own.
|
|
260
211
|
result.failed++;
|
|
261
|
-
log.error(`rebuildDirtySummaries: summary ${summary.id} (tenant ${summary.tenantId}) failed: ${errorMessage(err)}
|
|
212
|
+
log.error(`rebuildDirtySummaries: summary ${summary.id} (tenant ${summary.tenantId}) failed: ${errorMessage(err)}`, errorFields(err));
|
|
262
213
|
}
|
|
263
214
|
}
|
|
264
215
|
return result;
|
|
@@ -309,14 +260,8 @@ async function profileCluster(hippoRoot, cluster, home, opts, result) {
|
|
|
309
260
|
// The distinct source tags the audit row.
|
|
310
261
|
clearSummaryDirtyAfterBuild(hippoRoot, profileEntry.id, home.tenantId, 'buildEntityProfiles', 'buildEntityProfiles-clean');
|
|
311
262
|
}
|
|
312
|
-
/**
|
|
313
|
-
*
|
|
314
|
-
* shared entity tags. Threshold 2+ L2s per entity. Mirrors buildDag L1->L2
|
|
315
|
-
* pattern, one level up.
|
|
316
|
-
*
|
|
317
|
-
* Born-dirty cancellation: each L2 link write marks the new L3 dirty, so clear it
|
|
318
|
-
* or the same sleep cycle's rebuild re-rebuilds the freshly built L3.
|
|
319
|
-
*/
|
|
263
|
+
/** Build L3 entity profiles by clustering L2 summaries sharing entity tags (2+ L2s per entity).
|
|
264
|
+
* Each L2 link write marks the new L3 dirty, so clear it or the same cycle re-rebuilds it. */
|
|
320
265
|
export async function buildEntityProfiles(hippoRoot, l2Summaries, opts) {
|
|
321
266
|
const result = {
|
|
322
267
|
candidateClusters: 0,
|
|
@@ -4,13 +4,8 @@ import { rescueSet, rankNonPinnedByTenant, validateWeights } from './memory-valu
|
|
|
4
4
|
import { MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256 } from './memory-value-weights.js';
|
|
5
5
|
const STRENGTH_DECIMALS = 4;
|
|
6
6
|
export const DECAY_THRESHOLD = 0.05;
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// a DELETE, and with it this whole cycle's batch and every later sleep,
|
|
10
|
-
// so it stays where it is (stored strength refreshed) but sits out the
|
|
11
|
-
// rest of this cycle the way a deleted row would. Anything else goes
|
|
12
|
-
// dormant when config.dormant is on, and is deleted otherwise.
|
|
13
|
-
// Only called for rows `retirable` allows (never pinned, raw, kept for good or backing a first-class object).
|
|
7
|
+
// Leaving active memory: a raw receipt stays (the append-only trigger aborts DELETE for the whole batch; stored strength refreshed) but sits out this cycle;
|
|
8
|
+
// others go dormant when config.dormant is on, else are deleted. Only called for rows `retirable` allows.
|
|
14
9
|
function retireFaded(run, entry, strength) {
|
|
15
10
|
const { result } = run;
|
|
16
11
|
const why = `(strength ${strength.toFixed(STRENGTH_DECIMALS)} < ${DECAY_THRESHOLD})`;
|
|
@@ -36,11 +31,8 @@ function keepSurvivor(run, entry, strength) {
|
|
|
36
31
|
run.result.decayed++;
|
|
37
32
|
return updated;
|
|
38
33
|
}
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
// -------------------------------------------------------------------------
|
|
42
|
-
// Memory-value flag OFF runs the single-phase loop below. Flag ON classifies every entry with ZERO commits,
|
|
43
|
-
// runs rescueSet per tenant, then commits; rescued entries stay full survivors for this cycle's later passes.
|
|
34
|
+
// 1. Decay pass. Memory-value flag OFF runs the single-phase loop below; ON classifies every entry with zero commits, runs rescueSet per tenant, then commits.
|
|
35
|
+
// Rescued entries stay full survivors for this cycle's later passes.
|
|
44
36
|
export function decayPass(run) {
|
|
45
37
|
if (run.config.memoryValue.enabled)
|
|
46
38
|
return decayWithMemoryValue(run);
|
|
@@ -93,10 +85,7 @@ function decayWithMemoryValue(run) {
|
|
|
93
85
|
let rescuedIds = new Set();
|
|
94
86
|
let rankById = new Map();
|
|
95
87
|
const { strengthById, condemnedIds } = classifyByStrength(run);
|
|
96
|
-
//
|
|
97
|
-
// Runs under --dry-run too (only the pendingDeletes flush and the audit write in
|
|
98
|
-
// logRun stay !dryRun-gated), so the preview matches what a
|
|
99
|
-
// real run would decide.
|
|
88
|
+
// Phase 2a: rescue decision (pure compute); runs under --dry-run too (only the pendingDeletes flush and the logRun audit write are !dryRun-gated).
|
|
100
89
|
// Fail-loud must not depend on condemnation traffic: validate the frozen weights even when nothing is condemned.
|
|
101
90
|
validateWeights();
|
|
102
91
|
if (condemnedIds.size > 0) {
|
|
@@ -112,9 +101,8 @@ function decayWithMemoryValue(run) {
|
|
|
112
101
|
const strength = strengthById.get(entry.id);
|
|
113
102
|
if (run.retirable(entry) && strength < DECAY_THRESHOLD) {
|
|
114
103
|
if (rescuedIds.has(entry.id)) {
|
|
115
|
-
// Rescued: standard survivor stored-strength refresh.
|
|
116
|
-
//
|
|
117
|
-
// cached computation, so resolveConfidence derives it on read.
|
|
104
|
+
// Rescued: standard survivor stored-strength refresh. Confidence is left alone: it is an epistemic tier, not a cached
|
|
105
|
+
// computation, so resolveConfidence derives it on read.
|
|
118
106
|
rescuedEntries.push(keepSurvivor(run, entry, strength));
|
|
119
107
|
reportRescue(result, entry, strength, rankById.get(entry.id));
|
|
120
108
|
}
|
|
@@ -1,25 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
* removes the rest.
|
|
5
|
-
*
|
|
6
|
-
* Extracted from cli.ts in Episode A (v1.11.3) so `api.sleep` can dedupe
|
|
7
|
-
* during the consolidation pipeline without violating the cli -> api
|
|
8
|
-
* dependency direction. `cmdDedup` in cli.ts continues to import and use
|
|
9
|
-
* this function unchanged.
|
|
10
|
-
*
|
|
11
|
-
* Survivor selection is a total order as of v1.26.3
|
|
12
|
-
* (docs/plans/2026-07-16-dedupe-survivor-determinism.md): strength bucket
|
|
13
|
-
* desc -> retrieval_count desc -> compareEntryIdentity (content asc ->
|
|
14
|
-
* layer rank -> tags -> source -> id asc; the metadata keys arrived in
|
|
15
|
-
* v1.38.1, docs/plans/2026-09-04-dedupe-survivor-metadata.md). Previously
|
|
16
|
-
* the strength/retrieval-count comparator could tie exactly with no terminal
|
|
17
|
-
* key, so the survivor fell to load order (arrival-order-dependent); see
|
|
18
|
-
* `strengthBucket` below for the bucket encoding. As of the tenant-partition
|
|
19
|
-
* fix (docs/plans/2026-08-15-dedupe-tenant-partition.md) the order is scoped
|
|
20
|
-
* WITHIN each tenant group; cross-tenant pairs are never compared. Raw and
|
|
21
|
-
* superseded rows are not candidates at all (v1.38.1).
|
|
22
|
-
*/
|
|
1
|
+
/** Store-level dedup: same text apart from spacing, keeping the stronger copy; split out so `api.sleep` can dedupe without cli -> api imports.
|
|
2
|
+
* Survivor order is total and tenant-scoped: strength bucket, retrieval_count, then compareEntryIdentity; raw and superseded rows are not candidates. */
|
|
3
|
+
import { type MemoryEntry } from '../core/memory.js';
|
|
23
4
|
export interface DedupPair {
|
|
24
5
|
kept: string;
|
|
25
6
|
keptContent: string;
|
|
@@ -36,40 +17,20 @@ export interface DedupResult {
|
|
|
36
17
|
removed: number;
|
|
37
18
|
pairs: DedupPair[];
|
|
38
19
|
}
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* Encodes the historical 0.01 epsilon transitively: two strengths compare
|
|
43
|
-
* equal here iff they round to the same multiple of `STRENGTH_TIE_EPSILON`,
|
|
44
|
-
* which (unlike a raw `Math.abs(a - b) > epsilon` check) is a genuine
|
|
45
|
-
* equivalence relation — no more "A ties B, B ties C, but A beats C"
|
|
46
|
-
* (see the file-level history note above).
|
|
47
|
-
*
|
|
48
|
-
* Non-finite input (`NaN`, `+/-Infinity`) maps to bucket `0` rather than
|
|
49
|
-
* propagating: a NaN bucket would make the sort comparator return NaN,
|
|
50
|
-
* silently reintroducing the non-total-order class this fix exists to kill.
|
|
51
|
-
* (`null`/`undefined` already default to strength `0` via `?? 0`, same as
|
|
52
|
-
* before this change.)
|
|
53
|
-
*
|
|
54
|
-
* Bucket-edge nuance: two strengths straddling a bucket edge (e.g. 0.0049 vs
|
|
55
|
-
* 0.0051) now compare as different, where the old raw-epsilon check called
|
|
56
|
-
* them tied. The flip always favors the not-weaker entry, and the OLD
|
|
57
|
-
* behavior at such pairs was itself order/engine-dependent (the defect this
|
|
58
|
-
* fix exists to kill) — so there is no stable prior behavior being broken.
|
|
59
|
-
*/
|
|
20
|
+
/** Quantize strength to an integer bucket so ties are a true equivalence relation (equal iff same multiple of `STRENGTH_TIE_EPSILON`).
|
|
21
|
+
* Non-finite input maps to 0: a NaN bucket would make the comparator return NaN and break the total order. */
|
|
60
22
|
export declare function strengthBucket(strength: number | null | undefined): number;
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
*
|
|
68
|
-
* Keeps the one with higher strength (or more retrievals if tied). `threshold` is accepted for old callers and ignored.
|
|
69
|
-
*/
|
|
23
|
+
/** Every row of the store, read once by a caller that also needs them, with the ids of rows backing an object. */
|
|
24
|
+
export interface LoadedStore {
|
|
25
|
+
readonly entries: readonly MemoryEntry[];
|
|
26
|
+
readonly backing: ReadonlySet<string>;
|
|
27
|
+
}
|
|
28
|
+
/** Remove the weaker copy of same-text (apart from spacing) memories within one tenant; cross-tenant pairs are never duplicates (isolation boundary).
|
|
29
|
+
* Higher strength wins, then more retrievals; `threshold` is accepted for old callers and ignored. */
|
|
70
30
|
export declare function deduplicateStore(hippoRoot: string, options?: {
|
|
71
31
|
threshold?: number;
|
|
72
32
|
dryRun?: boolean;
|
|
73
33
|
actor?: string;
|
|
34
|
+
loaded?: LoadedStore;
|
|
74
35
|
}): DedupResult;
|
|
75
36
|
//# sourceMappingURL=dedupe.d.ts.map
|