hippo-memory 1.59.0 → 1.61.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 +1 -1
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/gemini.js +1 -1
- package/dist/agent-memories/legacy.js +1 -1
- package/dist/agent-memories/source.js +1 -1
- package/dist/agent-memories/sync.js +8 -3
- package/dist/ambient-store.d.ts +14 -0
- package/dist/ambient-store.js +90 -0
- package/dist/ambient.d.ts +23 -0
- package/dist/ambient.js +72 -50
- package/dist/api/assemble.d.ts +93 -0
- package/dist/api/assemble.js +152 -0
- package/dist/api/audit.d.ts +17 -0
- package/dist/api/audit.js +23 -0
- package/dist/api/auth.d.ts +79 -0
- package/dist/api/auth.js +178 -0
- package/dist/api/context-types.d.ts +105 -0
- package/dist/api/context-types.js +3 -0
- package/dist/api/context.d.ts +31 -0
- package/dist/api/context.js +705 -0
- package/dist/api/dormant.d.ts +30 -0
- package/dist/api/dormant.js +140 -0
- package/dist/api/drill-down.d.ts +84 -0
- package/dist/api/drill-down.js +123 -0
- package/dist/api/forget.d.ts +57 -0
- package/dist/api/forget.js +87 -0
- package/dist/api/goals.d.ts +18 -0
- package/dist/api/goals.js +33 -0
- package/dist/api/learn.d.ts +31 -0
- package/dist/api/learn.js +88 -0
- package/dist/api/outcome.d.ts +61 -0
- package/dist/api/outcome.js +66 -0
- package/dist/api/promote.d.ts +54 -0
- package/dist/api/promote.js +203 -0
- package/dist/api/quarantine.d.ts +24 -0
- package/dist/api/quarantine.js +121 -0
- package/dist/api/recall-types.d.ts +390 -0
- package/dist/api/recall-types.js +3 -0
- package/dist/api/recall.d.ts +36 -0
- package/dist/api/recall.js +634 -0
- package/dist/api/remember.d.ts +35 -0
- package/dist/api/remember.js +43 -0
- package/dist/api/sleep.d.ts +136 -0
- package/dist/api/sleep.js +271 -0
- package/dist/api/tokens.d.ts +26 -0
- package/dist/api/tokens.js +60 -0
- package/dist/api/types.d.ts +56 -0
- package/dist/api/types.js +38 -0
- package/dist/api.d.ts +20 -1260
- package/dist/api.js +25 -2711
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +7 -3
- package/dist/auth.d.ts +45 -4
- package/dist/auth.js +125 -48
- package/dist/autolearn.js +7 -4
- package/dist/capture/command.d.ts +33 -0
- package/dist/capture/command.js +264 -0
- package/dist/capture/compact.d.ts +44 -0
- package/dist/capture/compact.js +354 -0
- package/dist/capture/extract.d.ts +21 -0
- package/dist/capture/extract.js +464 -0
- package/dist/capture/transcript.d.ts +40 -0
- package/dist/capture/transcript.js +193 -0
- package/dist/capture-error.js +2 -1
- package/dist/churn-git.js +4 -2
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.js +159 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.js +171 -0
- package/dist/cli/briefs.d.ts +4 -0
- package/dist/cli/briefs.js +435 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +333 -0
- package/dist/cli/context.d.ts +15 -0
- package/dist/cli/context.js +366 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +445 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +555 -0
- package/dist/cli/dag.d.ts +5 -0
- package/dist/cli/dag.js +177 -0
- package/dist/cli/decisions.d.ts +4 -0
- package/dist/cli/decisions.js +528 -0
- package/dist/cli/eval.d.ts +5 -0
- package/dist/cli/eval.js +213 -0
- package/dist/cli/explain.d.ts +4 -0
- package/dist/cli/explain.js +150 -0
- package/dist/cli/goals.d.ts +2 -0
- package/dist/cli/goals.js +196 -0
- package/dist/cli/hook-blocks.d.ts +18 -0
- package/dist/cli/hook-blocks.js +233 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +305 -0
- package/dist/cli/maintenance.d.ts +4 -0
- package/dist/cli/maintenance.js +179 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +556 -0
- package/dist/cli/projects.js +1 -1
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +597 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +442 -0
- package/dist/cli/serve.d.ts +5 -0
- package/dist/cli/serve.js +40 -0
- package/dist/cli/session-hooks.d.ts +29 -0
- package/dist/cli/session-hooks.js +637 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +376 -0
- package/dist/cli/shared.d.ts +15 -19
- package/dist/cli/shared.js +50 -341
- package/dist/cli/slack.d.ts +2 -0
- package/dist/cli/slack.js +171 -0
- package/dist/cli/status.d.ts +18 -0
- package/dist/cli/status.js +400 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +438 -0
- package/dist/cli/usage.d.ts +85 -0
- package/dist/cli/usage.js +741 -0
- package/dist/cli.d.ts +319 -13
- package/dist/cli.js +436 -8580
- package/dist/client.js +15 -8
- package/dist/compaction-record.js +12 -9
- package/dist/config.js +12 -11
- package/dist/connectors/github/backfill.js +94 -87
- package/dist/connectors/github/cli-impl.js +5 -3
- package/dist/connectors/github/dlq.js +67 -54
- package/dist/connectors/github/ingest.js +34 -35
- package/dist/connectors/github/tenant-routing.js +3 -2
- package/dist/connectors/github/webhook.js +135 -216
- package/dist/connectors/slack/dlq.js +49 -61
- package/dist/connectors/slack/ingest.js +55 -48
- package/dist/connectors/slack/tenant-routing.js +4 -3
- package/dist/connectors/slack/webhook.js +72 -74
- package/dist/consolidate/conflicts.d.ts +10 -0
- package/dist/consolidate/conflicts.js +178 -0
- package/dist/consolidate/decay.d.ts +12 -0
- package/dist/consolidate/decay.js +145 -0
- package/dist/consolidate/llm-passes.d.ts +3 -0
- package/dist/consolidate/llm-passes.js +141 -0
- package/dist/consolidate/merge.d.ts +7 -0
- package/dist/consolidate/merge.js +251 -0
- package/dist/consolidate/physics-pass.d.ts +3 -0
- package/dist/consolidate/physics-pass.js +60 -0
- package/dist/consolidate/run.d.ts +69 -0
- package/dist/consolidate/run.js +76 -0
- package/dist/consolidate/sleep.d.ts +18 -0
- package/dist/consolidate/sleep.js +209 -0
- package/dist/consolidate/traces.d.ts +4 -0
- package/dist/consolidate/traces.js +178 -0
- package/dist/context-auto.js +7 -11
- package/dist/context-render.d.ts +1 -1
- package/dist/context-render.js +1 -1
- package/dist/customer-notes.d.ts +3 -0
- package/dist/customer-notes.js +6 -4
- package/dist/dag.js +13 -12
- package/dist/dashboard-actions.d.ts +20 -0
- package/dist/dashboard-actions.js +88 -0
- package/dist/dashboard-params.d.ts +45 -0
- package/dist/dashboard-params.js +127 -0
- package/dist/dashboard-queries.d.ts +15 -0
- package/dist/dashboard-queries.js +355 -0
- package/dist/dashboard-snapshot.d.ts +138 -0
- package/dist/dashboard-snapshot.js +308 -0
- package/dist/dashboard-types.d.ts +163 -0
- package/dist/dashboard-types.js +3 -0
- package/dist/dashboard.d.ts +6 -7
- package/dist/dashboard.js +231 -203
- package/dist/db/busy.d.ts +5 -0
- package/dist/db/busy.js +24 -0
- package/dist/db/continuity.d.ts +5 -0
- package/dist/db/continuity.js +145 -0
- package/dist/db/meta.d.ts +8 -0
- package/dist/db/meta.js +35 -0
- package/dist/db/migrate.d.ts +9 -0
- package/dist/db/migrate.js +138 -0
- package/dist/db/migrations/index.d.ts +5 -0
- package/dist/db/migrations/index.js +109 -0
- package/dist/db/migrations/types.d.ts +14 -0
- package/dist/db/migrations/types.js +2 -0
- package/dist/db/migrations/v01.d.ts +3 -0
- package/dist/db/migrations/v01.js +38 -0
- package/dist/db/migrations/v02.d.ts +3 -0
- package/dist/db/migrations/v02.js +21 -0
- package/dist/db/migrations/v03.d.ts +3 -0
- package/dist/db/migrations/v03.js +22 -0
- package/dist/db/migrations/v04.d.ts +3 -0
- package/dist/db/migrations/v04.js +28 -0
- package/dist/db/migrations/v05.d.ts +3 -0
- package/dist/db/migrations/v05.js +21 -0
- package/dist/db/migrations/v06.d.ts +3 -0
- package/dist/db/migrations/v06.js +25 -0
- package/dist/db/migrations/v07.d.ts +3 -0
- package/dist/db/migrations/v07.js +13 -0
- package/dist/db/migrations/v08.d.ts +3 -0
- package/dist/db/migrations/v08.js +8 -0
- package/dist/db/migrations/v09.d.ts +3 -0
- package/dist/db/migrations/v09.js +13 -0
- package/dist/db/migrations/v10.d.ts +3 -0
- package/dist/db/migrations/v10.js +17 -0
- package/dist/db/migrations/v11.d.ts +3 -0
- package/dist/db/migrations/v11.js +15 -0
- package/dist/db/migrations/v12.d.ts +3 -0
- package/dist/db/migrations/v12.js +11 -0
- package/dist/db/migrations/v13.d.ts +3 -0
- package/dist/db/migrations/v13.js +15 -0
- package/dist/db/migrations/v14.d.ts +3 -0
- package/dist/db/migrations/v14.js +66 -0
- package/dist/db/migrations/v15.d.ts +3 -0
- package/dist/db/migrations/v15.js +42 -0
- package/dist/db/migrations/v16.d.ts +3 -0
- package/dist/db/migrations/v16.js +61 -0
- package/dist/db/migrations/v17.d.ts +3 -0
- package/dist/db/migrations/v17.js +46 -0
- package/dist/db/migrations/v18.d.ts +3 -0
- package/dist/db/migrations/v18.js +60 -0
- package/dist/db/migrations/v19.d.ts +3 -0
- package/dist/db/migrations/v19.js +28 -0
- package/dist/db/migrations/v20.d.ts +3 -0
- package/dist/db/migrations/v20.js +42 -0
- package/dist/db/migrations/v21.d.ts +3 -0
- package/dist/db/migrations/v21.js +16 -0
- package/dist/db/migrations/v22.d.ts +3 -0
- package/dist/db/migrations/v22.js +82 -0
- package/dist/db/migrations/v23.d.ts +3 -0
- package/dist/db/migrations/v23.js +48 -0
- package/dist/db/migrations/v24.d.ts +3 -0
- package/dist/db/migrations/v24.js +72 -0
- package/dist/db/migrations/v25.d.ts +3 -0
- package/dist/db/migrations/v25.js +46 -0
- package/dist/db/migrations/v26.d.ts +3 -0
- package/dist/db/migrations/v26.js +23 -0
- package/dist/db/migrations/v27.d.ts +3 -0
- package/dist/db/migrations/v27.js +57 -0
- package/dist/db/migrations/v28.d.ts +3 -0
- package/dist/db/migrations/v28.js +38 -0
- package/dist/db/migrations/v29.d.ts +3 -0
- package/dist/db/migrations/v29.js +78 -0
- package/dist/db/migrations/v30.d.ts +3 -0
- package/dist/db/migrations/v30.js +92 -0
- package/dist/db/migrations/v31.d.ts +3 -0
- package/dist/db/migrations/v31.js +74 -0
- package/dist/db/migrations/v32.d.ts +3 -0
- package/dist/db/migrations/v32.js +102 -0
- package/dist/db/migrations/v33.d.ts +3 -0
- package/dist/db/migrations/v33.js +104 -0
- package/dist/db/migrations/v34.d.ts +3 -0
- package/dist/db/migrations/v34.js +93 -0
- package/dist/db/migrations/v35.d.ts +3 -0
- package/dist/db/migrations/v35.js +98 -0
- package/dist/db/migrations/v36.d.ts +3 -0
- package/dist/db/migrations/v36.js +98 -0
- package/dist/db/migrations/v37.d.ts +3 -0
- package/dist/db/migrations/v37.js +219 -0
- package/dist/db/migrations/v38.d.ts +3 -0
- package/dist/db/migrations/v38.js +277 -0
- package/dist/db/migrations/v39.d.ts +3 -0
- package/dist/db/migrations/v39.js +59 -0
- package/dist/db/migrations/v40.d.ts +3 -0
- package/dist/db/migrations/v40.js +74 -0
- package/dist/db/migrations/v41.d.ts +3 -0
- package/dist/db/migrations/v41.js +43 -0
- package/dist/db/migrations/v42.d.ts +3 -0
- package/dist/db/migrations/v42.js +41 -0
- package/dist/db/migrations/v43.d.ts +3 -0
- package/dist/db/migrations/v43.js +67 -0
- package/dist/db/migrations/v44.d.ts +3 -0
- package/dist/db/migrations/v44.js +28 -0
- package/dist/db/migrations/v45.d.ts +3 -0
- package/dist/db/migrations/v45.js +30 -0
- package/dist/db/migrations/v46.d.ts +3 -0
- package/dist/db/migrations/v46.js +25 -0
- package/dist/db/migrations/v47.d.ts +3 -0
- package/dist/db/migrations/v47.js +17 -0
- package/dist/db/migrations/v48.d.ts +3 -0
- package/dist/db/migrations/v48.js +10 -0
- package/dist/db/migrations/v49.d.ts +3 -0
- package/dist/db/migrations/v49.js +31 -0
- package/dist/db/migrations/v50.d.ts +3 -0
- package/dist/db/migrations/v50.js +67 -0
- package/dist/db/migrations/v51.d.ts +3 -0
- package/dist/db/migrations/v51.js +14 -0
- package/dist/db/migrations/v52.d.ts +3 -0
- package/dist/db/migrations/v52.js +7 -0
- package/dist/db/open.d.ts +23 -0
- package/dist/db/open.js +146 -0
- package/dist/db/sqlite.d.ts +21 -0
- package/dist/db/sqlite.js +8 -0
- package/dist/db/tables.d.ts +7 -0
- package/dist/db/tables.js +38 -0
- package/dist/db.d.ts +6 -46
- package/dist/db.js +5 -3036
- package/dist/decisions.d.ts +4 -1
- package/dist/decisions.js +9 -7
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +5 -1
- package/dist/doctor.js +4 -3
- package/dist/dormant.js +1 -0
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +7 -5
- package/dist/embeddings.d.ts +9 -52
- package/dist/embeddings.js +47 -298
- package/dist/env.d.ts +75 -0
- package/dist/env.js +119 -0
- package/dist/eval-suite.js +1 -1
- package/dist/eval.js +2 -2
- package/dist/extract.js +5 -4
- package/dist/gated-write.js +3 -1
- package/dist/goals.d.ts +3 -1
- package/dist/goals.js +18 -0
- package/dist/graph/read.d.ts +73 -0
- package/dist/graph/read.js +325 -0
- package/dist/graph/rows.d.ts +45 -0
- package/dist/graph/rows.js +51 -0
- package/dist/graph/types.d.ts +83 -0
- package/dist/graph/types.js +11 -0
- package/dist/graph/write.d.ts +93 -0
- package/dist/{graph.js → graph/write.js} +8 -391
- package/dist/graph-extract.js +2 -1
- package/dist/graph-recall.d.ts +1 -1
- package/dist/graph-recall.js +2 -2
- package/dist/graph-stream.js +1 -1
- package/dist/graph-view.d.ts +1 -1
- package/dist/graph-view.js +1 -1
- package/dist/half-life-migration.d.ts +1 -1
- package/dist/half-life-migration.js +2 -1
- package/dist/handoff.js +3 -0
- package/dist/hooks/codex-session.d.ts +8 -0
- package/dist/hooks/codex-session.js +76 -0
- package/dist/hooks/codex-wrapper.d.ts +55 -0
- package/dist/hooks/codex-wrapper.js +288 -0
- package/dist/hooks/json-hooks.d.ts +63 -0
- package/dist/hooks/json-hooks.js +356 -0
- package/dist/hooks/opencode.d.ts +50 -0
- package/dist/hooks/opencode.js +202 -0
- package/dist/hooks/shared.d.ts +54 -0
- package/dist/hooks/shared.js +77 -0
- package/dist/http-retry.d.ts +2 -0
- package/dist/http-retry.js +4 -3
- package/dist/http-util.d.ts +3 -0
- package/dist/http-util.js +10 -0
- package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
- package/dist/importers/core.js +141 -0
- package/dist/importers/markdown-parse.d.ts +41 -0
- package/dist/importers/markdown-parse.js +132 -0
- package/dist/importers/markdown.d.ts +3 -0
- package/dist/importers/markdown.js +92 -0
- package/dist/importers/sources.d.ts +7 -0
- package/dist/importers/sources.js +229 -0
- package/dist/importers/vault.d.ts +11 -0
- package/dist/importers/vault.js +352 -0
- package/dist/incidents.d.ts +3 -0
- package/dist/incidents.js +8 -5
- package/dist/index.d.ts +25 -6
- package/dist/index.js +23 -6
- package/dist/invalidation.js +2 -1
- package/dist/judgment.js +7 -3
- package/dist/keyset.d.ts +13 -0
- package/dist/keyset.js +8 -0
- package/dist/local-embedding.d.ts +13 -0
- package/dist/local-embedding.js +165 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +19 -1
- package/dist/mcp/admin-tools.d.ts +8 -0
- package/dist/mcp/admin-tools.js +116 -0
- package/dist/mcp/format.d.ts +27 -0
- package/dist/mcp/format.js +135 -0
- package/dist/mcp/memory-tools.d.ts +5 -0
- package/dist/mcp/memory-tools.js +83 -0
- package/dist/mcp/protocol.d.ts +83 -0
- package/dist/mcp/protocol.js +55 -0
- package/dist/mcp/recall-tools.d.ts +6 -0
- package/dist/mcp/recall-tools.js +320 -0
- package/dist/mcp/request.d.ts +10 -0
- package/dist/mcp/request.js +163 -0
- package/dist/mcp/server.d.ts +4 -70
- package/dist/mcp/server.js +8 -1172
- package/dist/mcp/session-state.d.ts +11 -0
- package/dist/mcp/session-state.js +28 -0
- package/dist/mcp/stdio.d.ts +8 -0
- package/dist/mcp/stdio.js +79 -0
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.js +247 -0
- package/dist/memory.d.ts +8 -3
- package/dist/memory.js +27 -1
- package/dist/multihop.d.ts +1 -1
- package/dist/multihop.js +2 -1
- package/dist/owner-validation.js +2 -1
- package/dist/physics-state.js +10 -7
- package/dist/policies.d.ts +3 -0
- package/dist/policies.js +8 -6
- package/dist/postinstall.js +3 -2
- package/dist/predictions/planning-fallacy.d.ts +100 -0
- package/dist/predictions/planning-fallacy.js +190 -0
- package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
- package/dist/predictions/store.js +434 -0
- package/dist/processes.d.ts +3 -0
- package/dist/processes.js +8 -5
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +7 -5
- package/dist/project-identity.d.ts +1 -1
- package/dist/project-identity.js +12 -6
- package/dist/project-merge.js +3 -1
- package/dist/quarantine.d.ts +2 -1
- package/dist/quarantine.js +8 -5
- package/dist/raw-archive-mirror-cleanup.js +2 -1
- package/dist/raw-archive.js +1 -1
- package/dist/recall-history.js +3 -2
- package/dist/recall-pipeline.d.ts +2 -2
- package/dist/recall-pipeline.js +16 -8
- package/dist/recall-scope.js +1 -1
- package/dist/recall-trace.d.ts +3 -3
- package/dist/recall-trace.js +10 -14
- package/dist/refine-llm.js +20 -11
- package/dist/reject-flow.js +6 -1
- package/dist/rerankers/clef.d.ts +2 -2
- package/dist/rerankers/clef.js +72 -30
- package/dist/rerankers/cross-encoder.js +6 -4
- package/dist/rerankers/jev.d.ts +4 -2
- package/dist/rerankers/jev.js +24 -19
- package/dist/rerankers/llm.d.ts +4 -2
- package/dist/rerankers/llm.js +61 -41
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/salience.js +1 -1
- package/dist/same-text.d.ts +2 -0
- package/dist/same-text.js +4 -0
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.js +26 -3
- package/dist/scope.js +4 -3
- package/dist/search/as-of.d.ts +10 -0
- package/dist/search/as-of.js +22 -0
- package/dist/search/bm25-search.d.ts +14 -0
- package/dist/search/bm25-search.js +43 -0
- package/dist/search/bm25.d.ts +15 -0
- package/dist/search/bm25.js +54 -0
- package/dist/search/boosts.d.ts +54 -0
- package/dist/search/boosts.js +94 -0
- package/dist/search/breakdown.d.ts +7 -0
- package/dist/search/breakdown.js +20 -0
- package/dist/search/explain.d.ts +25 -0
- package/dist/search/explain.js +31 -0
- package/dist/search/finalize.d.ts +8 -0
- package/dist/search/finalize.js +52 -0
- package/dist/search/fusion.d.ts +27 -0
- package/dist/search/fusion.js +42 -0
- package/dist/search/hybrid-score.d.ts +20 -0
- package/dist/search/hybrid-score.js +73 -0
- package/dist/search/hybrid.d.ts +46 -0
- package/dist/search/hybrid.js +64 -0
- package/dist/search/physics-search.d.ts +29 -0
- package/dist/search/physics-search.js +162 -0
- package/dist/search/rerank.d.ts +10 -0
- package/dist/search/rerank.js +72 -0
- package/dist/search/temporal.d.ts +15 -0
- package/dist/search/temporal.js +45 -0
- package/dist/search/types.d.ts +91 -0
- package/dist/search/types.js +2 -0
- package/dist/search/vector.d.ts +30 -0
- package/dist/search/vector.js +71 -0
- package/dist/secret-detect.d.ts +2 -0
- package/dist/secret-detect.js +3 -1
- package/dist/server/auth.d.ts +52 -0
- package/dist/server/auth.js +221 -0
- package/dist/server/client-ip.d.ts +25 -0
- package/dist/server/client-ip.js +92 -0
- package/dist/server/cursor.d.ts +23 -0
- package/dist/server/cursor.js +58 -0
- package/dist/server/lifecycle.d.ts +7 -0
- package/dist/server/lifecycle.js +29 -0
- package/dist/server/mcp-http.d.ts +5 -0
- package/dist/server/mcp-http.js +199 -0
- package/dist/server/request.d.ts +33 -0
- package/dist/server/request.js +103 -0
- package/dist/server/routes/admin.d.ts +9 -0
- package/dist/server/routes/admin.js +158 -0
- package/dist/server/routes/customer-notes.d.ts +7 -0
- package/dist/server/routes/customer-notes.js +112 -0
- package/dist/server/routes/decisions.d.ts +7 -0
- package/dist/server/routes/decisions.js +133 -0
- package/dist/server/routes/incidents.d.ts +7 -0
- package/dist/server/routes/incidents.js +126 -0
- package/dist/server/routes/memories.d.ts +10 -0
- package/dist/server/routes/memories.js +179 -0
- package/dist/server/routes/policies.d.ts +8 -0
- package/dist/server/routes/policies.js +151 -0
- package/dist/server/routes/predictions.d.ts +7 -0
- package/dist/server/routes/predictions.js +164 -0
- package/dist/server/routes/processes.d.ts +7 -0
- package/dist/server/routes/processes.js +161 -0
- package/dist/server/routes/project-briefs.d.ts +8 -0
- package/dist/server/routes/project-briefs.js +136 -0
- package/dist/server/routes/recall.d.ts +8 -0
- package/dist/server/routes/recall.js +340 -0
- package/dist/server/routes/skills.d.ts +8 -0
- package/dist/server/routes/skills.js +150 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/types.js +2 -0
- package/dist/server/validation.d.ts +14 -0
- package/dist/server/validation.js +91 -0
- package/dist/server.d.ts +7 -61
- package/dist/server.js +92 -2368
- package/dist/session-digest.d.ts +1 -1
- package/dist/session-digest.js +9 -2
- package/dist/shared.d.ts +3 -1
- package/dist/shared.js +46 -40
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +7 -5
- package/dist/stdin.js +3 -2
- package/dist/store/audit-event.d.ts +19 -0
- package/dist/store/audit-event.js +33 -0
- package/dist/store/candidates.d.ts +42 -0
- package/dist/store/candidates.js +152 -0
- package/dist/store/conflicts.d.ts +44 -0
- package/dist/store/conflicts.js +444 -0
- package/dist/store/delete-and-batch.d.ts +63 -0
- package/dist/store/delete-and-batch.js +310 -0
- package/dist/store/entry-reads.d.ts +92 -0
- package/dist/store/entry-reads.js +255 -0
- package/dist/store/entry-row.d.ts +67 -0
- package/dist/store/entry-row.js +208 -0
- package/dist/store/entry-writes.d.ts +46 -0
- package/dist/store/entry-writes.js +148 -0
- package/dist/store/handoffs.d.ts +26 -0
- package/dist/store/handoffs.js +184 -0
- package/dist/store/index-and-stats.d.ts +52 -0
- package/dist/store/index-and-stats.js +214 -0
- package/dist/store/markdown.d.ts +10 -0
- package/dist/store/markdown.js +108 -0
- package/dist/store/mirrors.d.ts +49 -0
- package/dist/store/mirrors.js +312 -0
- package/dist/store/open.d.ts +15 -0
- package/dist/store/open.js +223 -0
- package/dist/store/rows.d.ts +178 -0
- package/dist/store/rows.js +158 -0
- package/dist/store/search-rows.d.ts +86 -0
- package/dist/store/search-rows.js +254 -0
- package/dist/store/sessions.d.ts +83 -0
- package/dist/store/sessions.js +272 -0
- package/dist/store/summaries.d.ts +94 -0
- package/dist/store/summaries.js +377 -0
- package/dist/store/tenant-lookup.d.ts +12 -0
- package/dist/store/tenant-lookup.js +16 -0
- package/dist/store-cards.js +2 -1
- package/dist/summary-dirty.d.ts +4 -0
- package/dist/summary-dirty.js +32 -0
- package/dist/support-bundle.js +4 -3
- package/dist/tenant.js +2 -2
- package/dist/token-ledger.js +1 -0
- package/dist/tokenize.d.ts +2 -0
- package/dist/tokenize.js +16 -0
- package/dist/transcript-tail.d.ts +7 -0
- package/dist/transcript-tail.js +48 -0
- package/dist/vector-store.d.ts +27 -0
- package/dist/vector-store.js +210 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/dist/working-memory.js +1 -1
- package/dist/yaml.js +36 -11
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist-ui/assets/index-DPN7cP19.js +33 -0
- package/dist-ui/assets/index-dFloKRVr.css +1 -0
- package/dist-ui/index.html +3 -25
- 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 -1
- package/dist/capture.d.ts +0 -155
- package/dist/capture.js +0 -1293
- package/dist/consolidate.d.ts +0 -58
- package/dist/consolidate.js +0 -1123
- package/dist/graph.d.ts +0 -245
- package/dist/hooks.d.ts +0 -208
- package/dist/hooks.js +0 -1073
- package/dist/importers.js +0 -897
- package/dist/predictions.js +0 -620
- package/dist/search.d.ts +0 -320
- package/dist/search.js +0 -968
- package/dist/store.d.ts +0 -744
- package/dist/store.js +0 -3372
- package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
- package/dist-ui/assets/index-BhT8RvO6.js +0 -61
- package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
- package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
|
@@ -93,35 +93,9 @@ export function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
93
93
|
}
|
|
94
94
|
// Signature verification (current secret, not previous).
|
|
95
95
|
if (!opts.force) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
status: 'sig_missing',
|
|
100
|
-
memoryId: null,
|
|
101
|
-
retryCount: row.retryCount,
|
|
102
|
-
reason: 'row has no signature/timestamp (legacy, or redacted before storing); pass --force to replay',
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
if (opts.signingSecret) {
|
|
106
|
-
const ok = verifySlackSignature({
|
|
107
|
-
rawBody: row.rawPayload,
|
|
108
|
-
signature: row.signature,
|
|
109
|
-
timestamp: row.slackTimestamp,
|
|
110
|
-
signingSecret: opts.signingSecret,
|
|
111
|
-
now: opts.now,
|
|
112
|
-
// Replays happen long after the fact — give them a wider skew unless overridden.
|
|
113
|
-
skewSeconds: opts.skewSeconds ?? 60 * 60 * 24 * 365,
|
|
114
|
-
});
|
|
115
|
-
if (!ok) {
|
|
116
|
-
return {
|
|
117
|
-
ok: false,
|
|
118
|
-
status: 'sig_fail',
|
|
119
|
-
memoryId: null,
|
|
120
|
-
retryCount: row.retryCount,
|
|
121
|
-
reason: 'signature did not verify against current SLACK_SIGNING_SECRET; pass --force to replay anyway',
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
}
|
|
96
|
+
const sigFailure = checkReplaySignature(row, opts);
|
|
97
|
+
if (sigFailure)
|
|
98
|
+
return sigFailure;
|
|
125
99
|
}
|
|
126
100
|
// Parse + dispatch.
|
|
127
101
|
let parsed;
|
|
@@ -129,24 +103,10 @@ export function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
129
103
|
parsed = JSON.parse(row.rawPayload);
|
|
130
104
|
}
|
|
131
105
|
catch (e) {
|
|
132
|
-
|
|
133
|
-
return {
|
|
134
|
-
ok: false,
|
|
135
|
-
status: 'parse_error',
|
|
136
|
-
memoryId: null,
|
|
137
|
-
retryCount: row.retryCount + 1,
|
|
138
|
-
reason: `still unparseable: ${e instanceof Error ? e.message : String(e)}`,
|
|
139
|
-
};
|
|
106
|
+
return failAndBump(ctx.hippoRoot, row, 'parse_error', `still unparseable: ${e instanceof Error ? e.message : String(e)}`);
|
|
140
107
|
}
|
|
141
108
|
if (!isSlackEventEnvelope(parsed)) {
|
|
142
|
-
|
|
143
|
-
return {
|
|
144
|
-
ok: false,
|
|
145
|
-
status: 'unhandled',
|
|
146
|
-
memoryId: null,
|
|
147
|
-
retryCount: row.retryCount + 1,
|
|
148
|
-
reason: 'not an event_callback envelope',
|
|
149
|
-
};
|
|
109
|
+
return failAndBump(ctx.hippoRoot, row, 'unhandled', 'not an event_callback envelope');
|
|
150
110
|
}
|
|
151
111
|
// Resolve tenant against current state. If still unroutable, bail.
|
|
152
112
|
const db2 = openHippoDb(ctx.hippoRoot);
|
|
@@ -158,31 +118,59 @@ export function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
158
118
|
closeHippoDb(db2);
|
|
159
119
|
}
|
|
160
120
|
if (!tenant) {
|
|
161
|
-
|
|
162
|
-
return {
|
|
163
|
-
ok: false,
|
|
164
|
-
status: 'unroutable',
|
|
165
|
-
memoryId: null,
|
|
166
|
-
retryCount: row.retryCount + 1,
|
|
167
|
-
reason: `team_id ${parsed.team_id} still unroutable`,
|
|
168
|
-
};
|
|
121
|
+
return failAndBump(ctx.hippoRoot, row, 'unroutable', `team_id ${parsed.team_id} still unroutable`);
|
|
169
122
|
}
|
|
170
123
|
const replayCtx = {
|
|
171
124
|
hippoRoot: ctx.hippoRoot,
|
|
172
125
|
tenantId: tenant,
|
|
173
126
|
actor: adminActor('connector:slack:replay'),
|
|
174
127
|
};
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
128
|
+
return dispatchReplay(replayCtx, row, parsed);
|
|
129
|
+
}
|
|
130
|
+
/** The failure result when the row cannot pass the signature gate, else null; never bumps the count. */
|
|
131
|
+
function checkReplaySignature(row, opts) {
|
|
132
|
+
if (!row.signature || !row.slackTimestamp) {
|
|
178
133
|
return {
|
|
179
134
|
ok: false,
|
|
180
|
-
status: '
|
|
135
|
+
status: 'sig_missing',
|
|
181
136
|
memoryId: null,
|
|
182
|
-
retryCount: row.retryCount
|
|
183
|
-
reason:
|
|
137
|
+
retryCount: row.retryCount,
|
|
138
|
+
reason: 'row has no signature/timestamp (legacy, or redacted before storing); pass --force to replay',
|
|
184
139
|
};
|
|
185
140
|
}
|
|
141
|
+
if (opts.signingSecret) {
|
|
142
|
+
const ok = verifySlackSignature({
|
|
143
|
+
rawBody: row.rawPayload,
|
|
144
|
+
signature: row.signature,
|
|
145
|
+
timestamp: row.slackTimestamp,
|
|
146
|
+
signingSecret: opts.signingSecret,
|
|
147
|
+
now: opts.now,
|
|
148
|
+
// Replays happen long after the fact — give them a wider skew unless overridden.
|
|
149
|
+
skewSeconds: opts.skewSeconds ?? 60 * 60 * 24 * 365,
|
|
150
|
+
});
|
|
151
|
+
if (!ok) {
|
|
152
|
+
return {
|
|
153
|
+
ok: false,
|
|
154
|
+
status: 'sig_fail',
|
|
155
|
+
memoryId: null,
|
|
156
|
+
retryCount: row.retryCount,
|
|
157
|
+
reason: 'signature did not verify against current SLACK_SIGNING_SECRET; pass --force to replay anyway',
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
function failAndBump(hippoRoot, row, status, reason) {
|
|
164
|
+
bumpRetryCount(hippoRoot, row.id);
|
|
165
|
+
return { ok: false, status, memoryId: null, retryCount: row.retryCount + 1, reason };
|
|
166
|
+
}
|
|
167
|
+
function dispatchReplay(replayCtx, row, parsed) {
|
|
168
|
+
const { hippoRoot } = replayCtx;
|
|
169
|
+
const id = row.id;
|
|
170
|
+
const inner = parsed.event;
|
|
171
|
+
if (!isSlackMessageEvent(inner)) {
|
|
172
|
+
return failAndBump(hippoRoot, row, 'unhandled', `unhandled inner event type`);
|
|
173
|
+
}
|
|
186
174
|
if (inner.subtype === 'message_deleted' && inner.deleted_ts) {
|
|
187
175
|
const r = handleMessageDeleted(replayCtx, {
|
|
188
176
|
teamId: parsed.team_id,
|
|
@@ -190,7 +178,7 @@ export function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
190
178
|
deletedTs: inner.deleted_ts,
|
|
191
179
|
eventId: parsed.event_id,
|
|
192
180
|
});
|
|
193
|
-
markRetried(
|
|
181
|
+
markRetried(hippoRoot, id);
|
|
194
182
|
return { ok: true, status: r.status, memoryId: r.memoryId, retryCount: row.retryCount + 1 };
|
|
195
183
|
}
|
|
196
184
|
const result = ingestMessage(replayCtx, {
|
|
@@ -204,7 +192,7 @@ export function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
204
192
|
message: inner,
|
|
205
193
|
eventId: parsed.event_id,
|
|
206
194
|
});
|
|
207
|
-
markRetried(
|
|
195
|
+
markRetried(hippoRoot, id);
|
|
208
196
|
return { ok: true, status: result.status, memoryId: result.memoryId, retryCount: row.retryCount + 1 };
|
|
209
197
|
}
|
|
210
198
|
function markRetried(hippoRoot, id) {
|
|
@@ -54,57 +54,64 @@ export function ingestMessage(ctx, input) {
|
|
|
54
54
|
// together. Slack's 1-minute retry window can no longer produce a duplicate
|
|
55
55
|
// via the crash-between-handles race.
|
|
56
56
|
try {
|
|
57
|
-
|
|
58
|
-
// provided by server.ts:1039 which constructs it with the connector subject.
|
|
59
|
-
// Under the new object-shaped Context.actor, an OR-fallback would evaluate
|
|
60
|
-
// an object as truthy and skip the fallback anyway (logic bug if ctx were
|
|
61
|
-
// ever missing); explicit reliance on the caller is safer.
|
|
62
|
-
const result = remember(ctx, {
|
|
63
|
-
...opts,
|
|
64
|
-
untrusted: true,
|
|
65
|
-
afterWrite: (innerDb, memoryId) => {
|
|
66
|
-
const inserted = innerDb
|
|
67
|
-
.prepare(`INSERT OR IGNORE INTO slack_event_log (event_id, ingested_at, memory_id) VALUES (?, ?, ?)`)
|
|
68
|
-
.run(input.eventId, new Date().toISOString(), memoryId);
|
|
69
|
-
if ((Number(inserted.changes ?? 0)) === 0) {
|
|
70
|
-
// Two-worker race: another writer reserved this event_id between
|
|
71
|
-
// the pre-check and the write. Throw to roll back the SAVEPOINT
|
|
72
|
-
// in writeEntry — the memory row gets discarded, idempotency
|
|
73
|
-
// holds, exactly one memory exists for this event_id.
|
|
74
|
-
throw new DuplicateEventError(input.eventId);
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
return { status: 'ingested', memoryId: result.id };
|
|
57
|
+
return rememberWithEventLog(ctx, input.eventId, opts);
|
|
79
58
|
}
|
|
80
59
|
catch (e) {
|
|
81
|
-
if (e instanceof DuplicateEventError)
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
try {
|
|
86
|
-
const cachedId = lookupMemoryByEvent(db3, input.eventId);
|
|
87
|
-
return { status: 'skipped_duplicate', memoryId: cachedId };
|
|
88
|
-
}
|
|
89
|
-
finally {
|
|
90
|
-
closeHippoDb(db3);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
if (e instanceof RejectedValueError) {
|
|
94
|
-
// AT1 (plan §3 containment): a tombstone hit is a PERMANENT skip, not
|
|
95
|
-
// a transient failure — never DLQ-retry it (retrying would just hit
|
|
96
|
-
// the same refusal forever). Mark the event seen exactly like the
|
|
97
|
-
// empty-body branch above so a Slack retry acks as done, not error.
|
|
98
|
-
const db4 = openHippoDb(ctx.hippoRoot);
|
|
99
|
-
try {
|
|
100
|
-
markEventSeen(db4, input.eventId, null);
|
|
101
|
-
}
|
|
102
|
-
finally {
|
|
103
|
-
closeHippoDb(db4);
|
|
104
|
-
}
|
|
105
|
-
return { status: 'skipped', memoryId: null };
|
|
106
|
-
}
|
|
60
|
+
if (e instanceof DuplicateEventError)
|
|
61
|
+
return lostRaceResult(ctx, input.eventId);
|
|
62
|
+
if (e instanceof RejectedValueError)
|
|
63
|
+
return rejectedValueResult(ctx, input.eventId);
|
|
107
64
|
throw e;
|
|
108
65
|
}
|
|
109
66
|
}
|
|
67
|
+
function rememberWithEventLog(ctx, eventId, opts) {
|
|
68
|
+
// v1.12.0: drop the legacy `|| 'connector:slack'` fallback — ctx is always
|
|
69
|
+
// provided by server.ts:1039 which constructs it with the connector subject.
|
|
70
|
+
// Under the new object-shaped Context.actor, an OR-fallback would evaluate
|
|
71
|
+
// an object as truthy and skip the fallback anyway (logic bug if ctx were
|
|
72
|
+
// ever missing); explicit reliance on the caller is safer.
|
|
73
|
+
const result = remember(ctx, {
|
|
74
|
+
...opts,
|
|
75
|
+
untrusted: true,
|
|
76
|
+
afterWrite: (innerDb, memoryId) => {
|
|
77
|
+
const inserted = innerDb
|
|
78
|
+
.prepare(`INSERT OR IGNORE INTO slack_event_log (event_id, ingested_at, memory_id) VALUES (?, ?, ?)`)
|
|
79
|
+
.run(eventId, new Date().toISOString(), memoryId);
|
|
80
|
+
if ((Number(inserted.changes ?? 0)) === 0) {
|
|
81
|
+
// Two-worker race: another writer reserved this event_id between
|
|
82
|
+
// the pre-check and the write. Throw to roll back the SAVEPOINT
|
|
83
|
+
// in writeEntry — the memory row gets discarded, idempotency
|
|
84
|
+
// holds, exactly one memory exists for this event_id.
|
|
85
|
+
throw new DuplicateEventError(eventId);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
return { status: 'ingested', memoryId: result.id };
|
|
90
|
+
}
|
|
91
|
+
function lostRaceResult(ctx, eventId) {
|
|
92
|
+
// The other worker's memory row is already committed. Return its id
|
|
93
|
+
// so the caller behaves identically to the fast-path 'duplicate' branch.
|
|
94
|
+
const db3 = openHippoDb(ctx.hippoRoot);
|
|
95
|
+
try {
|
|
96
|
+
const cachedId = lookupMemoryByEvent(db3, eventId);
|
|
97
|
+
return { status: 'skipped_duplicate', memoryId: cachedId };
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
closeHippoDb(db3);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function rejectedValueResult(ctx, eventId) {
|
|
104
|
+
// AT1 (plan §3 containment): a tombstone hit is a PERMANENT skip, not
|
|
105
|
+
// a transient failure — never DLQ-retry it (retrying would just hit
|
|
106
|
+
// the same refusal forever). Mark the event seen exactly like the
|
|
107
|
+
// empty-body branch above so a Slack retry acks as done, not error.
|
|
108
|
+
const db4 = openHippoDb(ctx.hippoRoot);
|
|
109
|
+
try {
|
|
110
|
+
markEventSeen(db4, eventId, null);
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
closeHippoDb(db4);
|
|
114
|
+
}
|
|
115
|
+
return { status: 'skipped', memoryId: null };
|
|
116
|
+
}
|
|
110
117
|
//# sourceMappingURL=ingest.js.map
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { envSlackAllowUnknownTeamFallback, envTenant } from '../../env.js';
|
|
1
2
|
/**
|
|
2
3
|
* Look up the tenant_id for a Slack team_id.
|
|
3
4
|
*
|
|
@@ -31,10 +32,10 @@ export function resolveTenantForTeam(db, teamId) {
|
|
|
31
32
|
.get().c;
|
|
32
33
|
if (Number(total) === 0) {
|
|
33
34
|
// Single-workspace install: env fallback is safe.
|
|
34
|
-
return
|
|
35
|
+
return envTenant();
|
|
35
36
|
}
|
|
36
|
-
if (
|
|
37
|
-
return
|
|
37
|
+
if (envSlackAllowUnknownTeamFallback()) {
|
|
38
|
+
return envTenant();
|
|
38
39
|
}
|
|
39
40
|
return null; // fail closed
|
|
40
41
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { envSlackSigningSecret, envSlackSigningSecretPrevious } from '../../env.js';
|
|
1
2
|
import { verifySlackSignature } from './signature.js';
|
|
2
3
|
import { isSlackEventEnvelope, isSlackMessageEvent } from './types.js';
|
|
3
4
|
import { ingestMessage } from './ingest.js';
|
|
@@ -6,7 +7,6 @@ import { writeToDlq } from './dlq.js';
|
|
|
6
7
|
import { resolveTenantForTeam } from './tenant-routing.js';
|
|
7
8
|
import { resolveTenantId } from '../../tenant.js';
|
|
8
9
|
import { openHippoDb, closeHippoDb } from '../../db.js';
|
|
9
|
-
import { adminActor } from '../../api.js';
|
|
10
10
|
import { HttpError, JSON_HEADERS, isHeaderString, isJsonObjectRecord, readBody, sendJson, } from '../../http-util.js';
|
|
11
11
|
/**
|
|
12
12
|
* Slack Events API webhook. Auth is signature-based (HMAC over the raw
|
|
@@ -29,13 +29,13 @@ import { HttpError, JSON_HEADERS, isHeaderString, isJsonObjectRecord, readBody,
|
|
|
29
29
|
*/
|
|
30
30
|
export async function handleSlackEventsWebhook({ req, res, opts }) {
|
|
31
31
|
const rawBody = await readBody(req);
|
|
32
|
-
const secret =
|
|
32
|
+
const secret = envSlackSigningSecret();
|
|
33
33
|
if (!secret) {
|
|
34
34
|
res.writeHead(404, JSON_HEADERS);
|
|
35
35
|
res.end(JSON.stringify({ error: 'not found' }));
|
|
36
36
|
return;
|
|
37
37
|
}
|
|
38
|
-
const previousSecret =
|
|
38
|
+
const previousSecret = envSlackSigningSecretPrevious();
|
|
39
39
|
const sig = req.headers['x-slack-signature'];
|
|
40
40
|
const tsHdr = req.headers['x-slack-request-timestamp'];
|
|
41
41
|
const sigStr = isHeaderString(sig) ? sig : null;
|
|
@@ -51,6 +51,28 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
|
|
|
51
51
|
})) {
|
|
52
52
|
throw new HttpError(401, 'invalid Slack signature');
|
|
53
53
|
}
|
|
54
|
+
routeSignedSlackPayload({ hippoRoot: opts.hippoRoot, res, rawBody, signature: sigStr, slackTimestamp: tsStr });
|
|
55
|
+
}
|
|
56
|
+
function parkInDlq(d, park) {
|
|
57
|
+
const db = openHippoDb(d.hippoRoot);
|
|
58
|
+
try {
|
|
59
|
+
writeToDlq(db, {
|
|
60
|
+
tenantId: park.tenantId,
|
|
61
|
+
teamId: park.teamId,
|
|
62
|
+
rawPayload: d.rawBody,
|
|
63
|
+
error: park.error,
|
|
64
|
+
bucket: park.bucket,
|
|
65
|
+
signature: d.signature,
|
|
66
|
+
slackTimestamp: d.slackTimestamp,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
closeHippoDb(db);
|
|
71
|
+
}
|
|
72
|
+
sendJson(d.res, 200, { ok: true, status: 'dlq' });
|
|
73
|
+
}
|
|
74
|
+
function routeSignedSlackPayload(d) {
|
|
75
|
+
const { rawBody, res } = d;
|
|
54
76
|
// Cheap regex extracts team_id from a (possibly malformed) raw body so the
|
|
55
77
|
// DLQ row carries it for triage even when JSON.parse fails.
|
|
56
78
|
const teamIdFromRaw = (() => {
|
|
@@ -62,25 +84,7 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
|
|
|
62
84
|
body = JSON.parse(rawBody);
|
|
63
85
|
}
|
|
64
86
|
catch {
|
|
65
|
-
|
|
66
|
-
// team_id; a null or unknown team writes tenantId=null, which lands as '__unroutable__'.
|
|
67
|
-
const db = openHippoDb(opts.hippoRoot);
|
|
68
|
-
try {
|
|
69
|
-
const parseFailTenant = teamIdFromRaw !== null ? resolveTenantForTeam(db, teamIdFromRaw) : null;
|
|
70
|
-
writeToDlq(db, {
|
|
71
|
-
tenantId: parseFailTenant, // null → '__unroutable__' sentinel
|
|
72
|
-
teamId: teamIdFromRaw,
|
|
73
|
-
rawPayload: rawBody,
|
|
74
|
-
error: 'invalid JSON',
|
|
75
|
-
bucket: 'parse_error',
|
|
76
|
-
signature: sigStr,
|
|
77
|
-
slackTimestamp: tsStr,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
finally {
|
|
81
|
-
closeHippoDb(db);
|
|
82
|
-
}
|
|
83
|
-
sendJson(res, 200, { ok: true, status: 'dlq' });
|
|
87
|
+
parkUnparseable(d, teamIdFromRaw);
|
|
84
88
|
return;
|
|
85
89
|
}
|
|
86
90
|
if (isJsonObjectRecord(body)) {
|
|
@@ -98,7 +102,7 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
|
|
|
98
102
|
// 200 so Slack stops retrying; do NOT call ingest.
|
|
99
103
|
let resolvedTenant = null;
|
|
100
104
|
if (body !== undefined && isSlackEventEnvelope(body)) {
|
|
101
|
-
const db = openHippoDb(
|
|
105
|
+
const db = openHippoDb(d.hippoRoot);
|
|
102
106
|
try {
|
|
103
107
|
resolvedTenant = resolveTenantForTeam(db, body.team_id);
|
|
104
108
|
}
|
|
@@ -106,22 +110,12 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
|
|
|
106
110
|
closeHippoDb(db);
|
|
107
111
|
}
|
|
108
112
|
if (resolvedTenant === null) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
error: `unroutable team_id: ${body.team_id}`,
|
|
116
|
-
bucket: 'unroutable',
|
|
117
|
-
signature: sigStr,
|
|
118
|
-
slackTimestamp: tsStr,
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
finally {
|
|
122
|
-
closeHippoDb(db2);
|
|
123
|
-
}
|
|
124
|
-
sendJson(res, 200, { ok: true, status: 'dlq' });
|
|
113
|
+
parkInDlq(d, {
|
|
114
|
+
tenantId: null, // unroutable - stored as '__unroutable__'
|
|
115
|
+
teamId: body.team_id,
|
|
116
|
+
error: `unroutable team_id: ${body.team_id}`,
|
|
117
|
+
bucket: 'unroutable',
|
|
118
|
+
});
|
|
125
119
|
return;
|
|
126
120
|
}
|
|
127
121
|
}
|
|
@@ -130,29 +124,44 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
|
|
|
130
124
|
resolvedTenant = resolveTenantId({});
|
|
131
125
|
}
|
|
132
126
|
const ctx = {
|
|
133
|
-
hippoRoot:
|
|
127
|
+
hippoRoot: d.hippoRoot,
|
|
134
128
|
tenantId: resolvedTenant,
|
|
135
|
-
actor:
|
|
129
|
+
actor: { subject: 'connector:slack', role: 'admin' },
|
|
136
130
|
};
|
|
137
131
|
if (body === undefined || !isSlackEventEnvelope(body)) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
error: 'not an event_callback envelope',
|
|
145
|
-
bucket: 'parse_error',
|
|
146
|
-
signature: sigStr,
|
|
147
|
-
slackTimestamp: tsStr,
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
finally {
|
|
151
|
-
closeHippoDb(db);
|
|
152
|
-
}
|
|
153
|
-
sendJson(res, 200, { ok: true, status: 'dlq' });
|
|
132
|
+
parkInDlq(d, {
|
|
133
|
+
tenantId: ctx.tenantId,
|
|
134
|
+
teamId: teamIdFromRaw,
|
|
135
|
+
error: 'not an event_callback envelope',
|
|
136
|
+
bucket: 'parse_error',
|
|
137
|
+
});
|
|
154
138
|
return;
|
|
155
139
|
}
|
|
140
|
+
dispatchSlackEvent(d, ctx, body);
|
|
141
|
+
}
|
|
142
|
+
function parkUnparseable(d, teamIdFromRaw) {
|
|
143
|
+
// Attribute the parse failure to the originating workspace via the regex-extracted
|
|
144
|
+
// team_id; a null or unknown team writes tenantId=null, which lands as '__unroutable__'.
|
|
145
|
+
const db = openHippoDb(d.hippoRoot);
|
|
146
|
+
try {
|
|
147
|
+
const parseFailTenant = teamIdFromRaw !== null ? resolveTenantForTeam(db, teamIdFromRaw) : null;
|
|
148
|
+
writeToDlq(db, {
|
|
149
|
+
tenantId: parseFailTenant, // null → '__unroutable__' sentinel
|
|
150
|
+
teamId: teamIdFromRaw,
|
|
151
|
+
rawPayload: d.rawBody,
|
|
152
|
+
error: 'invalid JSON',
|
|
153
|
+
bucket: 'parse_error',
|
|
154
|
+
signature: d.signature,
|
|
155
|
+
slackTimestamp: d.slackTimestamp,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
closeHippoDb(db);
|
|
160
|
+
}
|
|
161
|
+
sendJson(d.res, 200, { ok: true, status: 'dlq' });
|
|
162
|
+
}
|
|
163
|
+
function dispatchSlackEvent(d, ctx, body) {
|
|
164
|
+
const { res } = d;
|
|
156
165
|
const inner = body.event;
|
|
157
166
|
if (isSlackMessageEvent(inner)) {
|
|
158
167
|
if (inner.subtype === 'message_deleted' && inner.deleted_ts) {
|
|
@@ -182,22 +191,11 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
|
|
|
182
191
|
sendJson(res, 200, { ok: true, status: r.status, memoryId: r.memoryId });
|
|
183
192
|
return;
|
|
184
193
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
error: `unhandled event type: ${inner.type ?? 'unknown'}`,
|
|
192
|
-
bucket: 'parse_error',
|
|
193
|
-
signature: sigStr,
|
|
194
|
-
slackTimestamp: tsStr,
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
finally {
|
|
198
|
-
closeHippoDb(db);
|
|
199
|
-
}
|
|
200
|
-
sendJson(res, 200, { ok: true, status: 'dlq' });
|
|
201
|
-
return;
|
|
194
|
+
parkInDlq(d, {
|
|
195
|
+
tenantId: ctx.tenantId,
|
|
196
|
+
teamId: body.team_id,
|
|
197
|
+
error: `unhandled event type: ${inner.type ?? 'unknown'}`,
|
|
198
|
+
bucket: 'parse_error',
|
|
199
|
+
});
|
|
202
200
|
}
|
|
203
201
|
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { MemoryEntry, type DecayOptions } from '../memory.js';
|
|
2
|
+
/** Pairs of live non-semantic memories that contradict each other, in survivor order. */
|
|
3
|
+
export declare function detectConflicts(entries: MemoryEntry[], now: Date, decayOpts?: DecayOptions, rescuedIds?: Set<string>): Array<{
|
|
4
|
+
memory_a_id: string;
|
|
5
|
+
memory_b_id: string;
|
|
6
|
+
reason: string;
|
|
7
|
+
score: number;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function jaccardSets(a: Set<string>, b: Set<string>): number;
|
|
10
|
+
//# sourceMappingURL=conflicts.d.ts.map
|