hippo-memory 1.44.0 → 1.46.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 +68 -24
- package/bin/hippo.js +3 -1
- package/dist/ablation.d.ts +10 -1
- package/dist/ablation.js +17 -1
- package/dist/api.d.ts +81 -22
- package/dist/api.js +258 -49
- package/dist/audit.d.ts +2 -2
- package/dist/audit.js +9 -0
- package/dist/autolearn.d.ts +1 -1
- package/dist/autolearn.js +2 -1
- package/dist/capture-error.d.ts +20 -0
- package/dist/capture-error.js +82 -0
- package/dist/capture.d.ts +25 -8
- package/dist/capture.js +100 -5
- package/dist/cli.d.ts +9 -1
- package/dist/cli.js +531 -119
- package/dist/client.d.ts +4 -21
- package/dist/client.js +3 -112
- package/dist/config.d.ts +20 -0
- package/dist/config.js +37 -1
- package/dist/consolidate.d.ts +9 -0
- package/dist/consolidate.js +133 -46
- package/dist/dag.d.ts +1 -0
- package/dist/dag.js +10 -5
- package/dist/dashboard.js +7 -3
- package/dist/db.js +69 -24
- package/dist/dedupe.d.ts +1 -0
- package/dist/dedupe.js +4 -7
- package/dist/doctor.d.ts +34 -0
- package/dist/doctor.js +174 -0
- package/dist/dormant.d.ts +91 -0
- package/dist/dormant.js +121 -0
- package/dist/embedding-provider.js +2 -1
- package/dist/embeddings.js +81 -8
- package/dist/eval-stats.d.ts +123 -0
- package/dist/eval-stats.js +187 -0
- package/dist/extract.d.ts +2 -0
- package/dist/extract.js +9 -4
- package/dist/half-life-migration.d.ts +55 -0
- package/dist/half-life-migration.js +111 -0
- package/dist/hooks.d.ts +4 -0
- package/dist/hooks.js +47 -0
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.js +90 -48
- package/dist/memory.d.ts +18 -1
- package/dist/memory.js +33 -5
- package/dist/physics-config.js +5 -1
- package/dist/recall-scope.d.ts +24 -0
- package/dist/recall-scope.js +41 -0
- package/dist/refine-llm.js +3 -2
- package/dist/reject-flow.d.ts +3 -3
- package/dist/reject-flow.js +10 -3
- package/dist/rerankers/jev.js +3 -2
- package/dist/rerankers/llm.js +3 -2
- package/dist/search.d.ts +4 -4
- package/dist/search.js +26 -21
- package/dist/server.d.ts +5 -0
- package/dist/server.js +49 -29
- package/dist/shared.js +1 -1
- package/dist/store.d.ts +29 -11
- package/dist/store.js +197 -70
- package/dist/token-ledger.d.ts +119 -0
- package/dist/token-ledger.js +181 -0
- package/dist/version.d.ts +4 -6
- package/dist/version.js +4 -7
- 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 +7 -3
- package/dist/ablation.d.ts.map +0 -1
- package/dist/ablation.js.map +0 -1
- package/dist/ambient.d.ts.map +0 -1
- package/dist/ambient.js.map +0 -1
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js.map +0 -1
- package/dist/audit-prune.d.ts.map +0 -1
- package/dist/audit-prune.js.map +0 -1
- package/dist/audit.d.ts.map +0 -1
- package/dist/audit.js.map +0 -1
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js.map +0 -1
- package/dist/autolearn.d.ts.map +0 -1
- package/dist/autolearn.js.map +0 -1
- package/dist/availability.d.ts.map +0 -1
- package/dist/availability.js.map +0 -1
- package/dist/benchmarks/e1.3/incident-recall-eval.js +0 -78
- package/dist/benchmarks/e1.3/incident-recall-eval.js.map +0 -1
- package/dist/benchmarks/e1.3/slack-1000-event-smoke.js +0 -103
- package/dist/benchmarks/e1.3/slack-1000-event-smoke.js.map +0 -1
- package/dist/capture.d.ts.map +0 -1
- package/dist/capture.js.map +0 -1
- package/dist/card-detail.d.ts.map +0 -1
- package/dist/card-detail.js.map +0 -1
- package/dist/card.d.ts.map +0 -1
- package/dist/card.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/compare.d.ts.map +0 -1
- package/dist/compare.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/connectors/github/backfill.d.ts.map +0 -1
- package/dist/connectors/github/backfill.js.map +0 -1
- package/dist/connectors/github/cli-impl.d.ts.map +0 -1
- package/dist/connectors/github/cli-impl.js.map +0 -1
- package/dist/connectors/github/deletion.d.ts.map +0 -1
- package/dist/connectors/github/deletion.js.map +0 -1
- package/dist/connectors/github/dlq.d.ts.map +0 -1
- package/dist/connectors/github/dlq.js.map +0 -1
- package/dist/connectors/github/idempotency.d.ts.map +0 -1
- package/dist/connectors/github/idempotency.js.map +0 -1
- package/dist/connectors/github/ingest.d.ts.map +0 -1
- package/dist/connectors/github/ingest.js.map +0 -1
- package/dist/connectors/github/octokit-client.d.ts.map +0 -1
- package/dist/connectors/github/octokit-client.js.map +0 -1
- package/dist/connectors/github/ratelimit.d.ts.map +0 -1
- package/dist/connectors/github/ratelimit.js.map +0 -1
- package/dist/connectors/github/scope.d.ts.map +0 -1
- package/dist/connectors/github/scope.js.map +0 -1
- package/dist/connectors/github/signature.d.ts.map +0 -1
- package/dist/connectors/github/signature.js.map +0 -1
- package/dist/connectors/github/tenant-routing.d.ts.map +0 -1
- package/dist/connectors/github/tenant-routing.js.map +0 -1
- package/dist/connectors/github/transform.d.ts.map +0 -1
- package/dist/connectors/github/transform.js.map +0 -1
- package/dist/connectors/github/types.d.ts.map +0 -1
- package/dist/connectors/github/types.js.map +0 -1
- package/dist/connectors/slack/backfill.d.ts.map +0 -1
- package/dist/connectors/slack/backfill.js.map +0 -1
- package/dist/connectors/slack/deletion.d.ts.map +0 -1
- package/dist/connectors/slack/deletion.js.map +0 -1
- package/dist/connectors/slack/dlq.d.ts.map +0 -1
- package/dist/connectors/slack/dlq.js.map +0 -1
- package/dist/connectors/slack/idempotency.d.ts.map +0 -1
- package/dist/connectors/slack/idempotency.js.map +0 -1
- package/dist/connectors/slack/ingest.d.ts.map +0 -1
- package/dist/connectors/slack/ingest.js.map +0 -1
- package/dist/connectors/slack/ratelimit.d.ts.map +0 -1
- package/dist/connectors/slack/ratelimit.js.map +0 -1
- package/dist/connectors/slack/scope.d.ts.map +0 -1
- package/dist/connectors/slack/scope.js.map +0 -1
- package/dist/connectors/slack/signature.d.ts.map +0 -1
- package/dist/connectors/slack/signature.js.map +0 -1
- package/dist/connectors/slack/tenant-routing.d.ts.map +0 -1
- package/dist/connectors/slack/tenant-routing.js.map +0 -1
- package/dist/connectors/slack/transform.d.ts.map +0 -1
- package/dist/connectors/slack/transform.js.map +0 -1
- package/dist/connectors/slack/types.d.ts.map +0 -1
- package/dist/connectors/slack/types.js.map +0 -1
- package/dist/connectors/slack/web-client.d.ts.map +0 -1
- package/dist/connectors/slack/web-client.js.map +0 -1
- package/dist/connectors/slack/workspaces.d.ts.map +0 -1
- package/dist/connectors/slack/workspaces.js.map +0 -1
- package/dist/consolidate.d.ts.map +0 -1
- package/dist/consolidate.js.map +0 -1
- package/dist/correction-latency.d.ts.map +0 -1
- package/dist/correction-latency.js.map +0 -1
- package/dist/customer-notes.d.ts.map +0 -1
- package/dist/customer-notes.js.map +0 -1
- package/dist/dag.d.ts.map +0 -1
- package/dist/dag.js.map +0 -1
- package/dist/dashboard.d.ts.map +0 -1
- package/dist/dashboard.js.map +0 -1
- package/dist/db.d.ts.map +0 -1
- package/dist/db.js.map +0 -1
- package/dist/decisions.d.ts.map +0 -1
- package/dist/decisions.js.map +0 -1
- package/dist/dedupe.d.ts.map +0 -1
- package/dist/dedupe.js.map +0 -1
- package/dist/embedding-provider.d.ts.map +0 -1
- package/dist/embedding-provider.js.map +0 -1
- package/dist/embeddings.d.ts.map +0 -1
- package/dist/embeddings.js.map +0 -1
- package/dist/eval-suite.d.ts.map +0 -1
- package/dist/eval-suite.js.map +0 -1
- package/dist/eval.d.ts.map +0 -1
- package/dist/eval.js.map +0 -1
- package/dist/extensions/openclaw-plugin/index.js.map +0 -1
- package/dist/extract.d.ts.map +0 -1
- package/dist/extract.js.map +0 -1
- package/dist/forward-claim-detector.d.ts.map +0 -1
- package/dist/forward-claim-detector.js.map +0 -1
- package/dist/goals.d.ts.map +0 -1
- package/dist/goals.js.map +0 -1
- package/dist/graph-extract.d.ts.map +0 -1
- package/dist/graph-extract.js.map +0 -1
- package/dist/graph-recall.d.ts.map +0 -1
- package/dist/graph-recall.js.map +0 -1
- package/dist/graph-stream.d.ts.map +0 -1
- package/dist/graph-stream.js.map +0 -1
- package/dist/graph-view.d.ts.map +0 -1
- package/dist/graph-view.js.map +0 -1
- package/dist/graph.d.ts.map +0 -1
- package/dist/graph.js.map +0 -1
- package/dist/handoff.d.ts.map +0 -1
- package/dist/handoff.js.map +0 -1
- package/dist/hooks.d.ts.map +0 -1
- package/dist/hooks.js.map +0 -1
- package/dist/importers.d.ts.map +0 -1
- package/dist/importers.js.map +0 -1
- package/dist/incidents.d.ts.map +0 -1
- package/dist/incidents.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/invalidation.d.ts.map +0 -1
- package/dist/invalidation.js.map +0 -1
- package/dist/mcp/framing.d.ts.map +0 -1
- package/dist/mcp/framing.js.map +0 -1
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js.map +0 -1
- package/dist/memory-value-weights.d.ts.map +0 -1
- package/dist/memory-value-weights.js.map +0 -1
- package/dist/memory-value.d.ts.map +0 -1
- package/dist/memory-value.js.map +0 -1
- package/dist/memory.d.ts.map +0 -1
- package/dist/memory.js.map +0 -1
- package/dist/multihop.d.ts.map +0 -1
- package/dist/multihop.js.map +0 -1
- package/dist/owner-validation.d.ts.map +0 -1
- package/dist/owner-validation.js.map +0 -1
- package/dist/path-context.d.ts.map +0 -1
- package/dist/path-context.js.map +0 -1
- package/dist/physics-config.d.ts.map +0 -1
- package/dist/physics-config.js.map +0 -1
- package/dist/physics-state.d.ts.map +0 -1
- package/dist/physics-state.js.map +0 -1
- package/dist/physics.d.ts.map +0 -1
- package/dist/physics.js.map +0 -1
- package/dist/policies.d.ts.map +0 -1
- package/dist/policies.js.map +0 -1
- package/dist/postinstall.d.ts.map +0 -1
- package/dist/postinstall.js.map +0 -1
- package/dist/predictions.d.ts.map +0 -1
- package/dist/predictions.js.map +0 -1
- package/dist/processes.d.ts.map +0 -1
- package/dist/processes.js.map +0 -1
- package/dist/project-briefs.d.ts.map +0 -1
- package/dist/project-briefs.js.map +0 -1
- package/dist/project-identity.d.ts.map +0 -1
- package/dist/project-identity.js.map +0 -1
- package/dist/provenance-coverage.d.ts.map +0 -1
- package/dist/provenance-coverage.js.map +0 -1
- package/dist/rate-limit.d.ts.map +0 -1
- package/dist/rate-limit.js.map +0 -1
- package/dist/raw-archive-mirror-cleanup.d.ts.map +0 -1
- package/dist/raw-archive-mirror-cleanup.js.map +0 -1
- package/dist/raw-archive.d.ts.map +0 -1
- package/dist/raw-archive.js.map +0 -1
- package/dist/recall-history.d.ts.map +0 -1
- package/dist/recall-history.js.map +0 -1
- package/dist/recall-scope.d.ts.map +0 -1
- package/dist/recall-scope.js.map +0 -1
- package/dist/recall-trace.d.ts.map +0 -1
- package/dist/recall-trace.js.map +0 -1
- package/dist/refine-llm.d.ts.map +0 -1
- package/dist/refine-llm.js.map +0 -1
- package/dist/reject-flow.d.ts.map +0 -1
- package/dist/reject-flow.js.map +0 -1
- package/dist/rejection.d.ts.map +0 -1
- package/dist/rejection.js.map +0 -1
- package/dist/replay.d.ts.map +0 -1
- package/dist/replay.js.map +0 -1
- package/dist/rerankers/cross-encoder.d.ts.map +0 -1
- package/dist/rerankers/cross-encoder.js.map +0 -1
- package/dist/rerankers/index.d.ts.map +0 -1
- package/dist/rerankers/index.js.map +0 -1
- package/dist/rerankers/jev.d.ts.map +0 -1
- package/dist/rerankers/jev.js.map +0 -1
- package/dist/rerankers/llm.d.ts.map +0 -1
- package/dist/rerankers/llm.js.map +0 -1
- package/dist/rerankers/types.d.ts.map +0 -1
- package/dist/rerankers/types.js.map +0 -1
- package/dist/rrf.d.ts.map +0 -1
- package/dist/rrf.js.map +0 -1
- package/dist/salience.d.ts.map +0 -1
- package/dist/salience.js.map +0 -1
- package/dist/scheduler.d.ts.map +0 -1
- package/dist/scheduler.js.map +0 -1
- package/dist/scope.d.ts.map +0 -1
- package/dist/scope.js.map +0 -1
- package/dist/search.d.ts.map +0 -1
- package/dist/search.js.map +0 -1
- package/dist/secret-detect.d.ts.map +0 -1
- package/dist/secret-detect.js.map +0 -1
- package/dist/server-detect.d.ts.map +0 -1
- package/dist/server-detect.js.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/shared.d.ts.map +0 -1
- package/dist/shared.js.map +0 -1
- package/dist/skills.d.ts.map +0 -1
- package/dist/skills.js.map +0 -1
- package/dist/sleep-redact.d.ts +0 -58
- package/dist/sleep-redact.d.ts.map +0 -1
- package/dist/sleep-redact.js +0 -80
- package/dist/sleep-redact.js.map +0 -1
- package/dist/src/ablation.js +0 -138
- package/dist/src/ablation.js.map +0 -1
- package/dist/src/ambient.js +0 -148
- package/dist/src/ambient.js.map +0 -1
- package/dist/src/api.js +0 -2109
- package/dist/src/api.js.map +0 -1
- package/dist/src/audit-prune.js +0 -109
- package/dist/src/audit-prune.js.map +0 -1
- package/dist/src/audit.js +0 -213
- package/dist/src/audit.js.map +0 -1
- package/dist/src/auth.js +0 -97
- package/dist/src/auth.js.map +0 -1
- package/dist/src/autolearn.js +0 -174
- package/dist/src/autolearn.js.map +0 -1
- package/dist/src/availability.js +0 -94
- package/dist/src/availability.js.map +0 -1
- package/dist/src/capture.js +0 -1346
- package/dist/src/capture.js.map +0 -1
- package/dist/src/card-detail.js +0 -15
- package/dist/src/card-detail.js.map +0 -1
- package/dist/src/card.js +0 -19
- package/dist/src/card.js.map +0 -1
- package/dist/src/cli.js +0 -9387
- package/dist/src/cli.js.map +0 -1
- package/dist/src/client.js +0 -237
- package/dist/src/client.js.map +0 -1
- package/dist/src/compare.js +0 -122
- package/dist/src/compare.js.map +0 -1
- package/dist/src/config.js +0 -135
- package/dist/src/config.js.map +0 -1
- package/dist/src/connectors/github/backfill.js +0 -281
- package/dist/src/connectors/github/backfill.js.map +0 -1
- package/dist/src/connectors/github/cli-impl.js +0 -234
- package/dist/src/connectors/github/cli-impl.js.map +0 -1
- package/dist/src/connectors/github/deletion.js +0 -85
- package/dist/src/connectors/github/deletion.js.map +0 -1
- package/dist/src/connectors/github/dlq.js +0 -190
- package/dist/src/connectors/github/dlq.js.map +0 -1
- package/dist/src/connectors/github/idempotency.js +0 -27
- package/dist/src/connectors/github/idempotency.js.map +0 -1
- package/dist/src/connectors/github/ingest.js +0 -156
- package/dist/src/connectors/github/ingest.js.map +0 -1
- package/dist/src/connectors/github/octokit-client.js +0 -70
- package/dist/src/connectors/github/octokit-client.js.map +0 -1
- package/dist/src/connectors/github/ratelimit.js +0 -31
- package/dist/src/connectors/github/ratelimit.js.map +0 -1
- package/dist/src/connectors/github/scope.js +0 -13
- package/dist/src/connectors/github/scope.js.map +0 -1
- package/dist/src/connectors/github/signature.js +0 -81
- package/dist/src/connectors/github/signature.js.map +0 -1
- package/dist/src/connectors/github/tenant-routing.js +0 -69
- package/dist/src/connectors/github/tenant-routing.js.map +0 -1
- package/dist/src/connectors/github/transform.js +0 -103
- package/dist/src/connectors/github/transform.js.map +0 -1
- package/dist/src/connectors/github/types.js +0 -100
- package/dist/src/connectors/github/types.js.map +0 -1
- package/dist/src/connectors/slack/backfill.js +0 -78
- package/dist/src/connectors/slack/backfill.js.map +0 -1
- package/dist/src/connectors/slack/deletion.js +0 -59
- package/dist/src/connectors/slack/deletion.js.map +0 -1
- package/dist/src/connectors/slack/dlq.js +0 -224
- package/dist/src/connectors/slack/dlq.js.map +0 -1
- package/dist/src/connectors/slack/idempotency.js +0 -31
- package/dist/src/connectors/slack/idempotency.js.map +0 -1
- package/dist/src/connectors/slack/ingest.js +0 -109
- package/dist/src/connectors/slack/ingest.js.map +0 -1
- package/dist/src/connectors/slack/ratelimit.js +0 -18
- package/dist/src/connectors/slack/ratelimit.js.map +0 -1
- package/dist/src/connectors/slack/scope.js +0 -13
- package/dist/src/connectors/slack/scope.js.map +0 -1
- package/dist/src/connectors/slack/signature.js +0 -27
- package/dist/src/connectors/slack/signature.js.map +0 -1
- package/dist/src/connectors/slack/tenant-routing.js +0 -41
- package/dist/src/connectors/slack/tenant-routing.js.map +0 -1
- package/dist/src/connectors/slack/transform.js +0 -47
- package/dist/src/connectors/slack/transform.js.map +0 -1
- package/dist/src/connectors/slack/types.js +0 -35
- package/dist/src/connectors/slack/types.js.map +0 -1
- package/dist/src/connectors/slack/web-client.js +0 -43
- package/dist/src/connectors/slack/web-client.js.map +0 -1
- package/dist/src/connectors/slack/workspaces.js +0 -62
- package/dist/src/connectors/slack/workspaces.js.map +0 -1
- package/dist/src/consolidate.js +0 -978
- package/dist/src/consolidate.js.map +0 -1
- package/dist/src/correction-latency.js +0 -74
- package/dist/src/correction-latency.js.map +0 -1
- package/dist/src/customer-notes.js +0 -325
- package/dist/src/customer-notes.js.map +0 -1
- package/dist/src/dag.js +0 -352
- package/dist/src/dag.js.map +0 -1
- package/dist/src/dashboard.js +0 -258
- package/dist/src/dashboard.js.map +0 -1
- package/dist/src/db.js +0 -2731
- package/dist/src/db.js.map +0 -1
- package/dist/src/decisions.js +0 -304
- package/dist/src/decisions.js.map +0 -1
- package/dist/src/dedupe.js +0 -141
- package/dist/src/dedupe.js.map +0 -1
- package/dist/src/embedding-provider.js +0 -314
- package/dist/src/embedding-provider.js.map +0 -1
- package/dist/src/embeddings.js +0 -543
- package/dist/src/embeddings.js.map +0 -1
- package/dist/src/eval-suite.js +0 -294
- package/dist/src/eval-suite.js.map +0 -1
- package/dist/src/eval.js +0 -187
- package/dist/src/eval.js.map +0 -1
- package/dist/src/extract.js +0 -117
- package/dist/src/extract.js.map +0 -1
- package/dist/src/forward-claim-detector.js +0 -117
- package/dist/src/forward-claim-detector.js.map +0 -1
- package/dist/src/goals.js +0 -399
- package/dist/src/goals.js.map +0 -1
- package/dist/src/graph-extract.js +0 -314
- package/dist/src/graph-extract.js.map +0 -1
- package/dist/src/graph-recall.js +0 -277
- package/dist/src/graph-recall.js.map +0 -1
- package/dist/src/graph-stream.js +0 -176
- package/dist/src/graph-stream.js.map +0 -1
- package/dist/src/graph-view.js +0 -310
- package/dist/src/graph-view.js.map +0 -1
- package/dist/src/graph.js +0 -762
- package/dist/src/graph.js.map +0 -1
- package/dist/src/handoff.js +0 -65
- package/dist/src/handoff.js.map +0 -1
- package/dist/src/hooks.js +0 -926
- package/dist/src/hooks.js.map +0 -1
- package/dist/src/importers.js +0 -881
- package/dist/src/importers.js.map +0 -1
- package/dist/src/incidents.js +0 -336
- package/dist/src/incidents.js.map +0 -1
- package/dist/src/index.js +0 -32
- package/dist/src/index.js.map +0 -1
- package/dist/src/invalidation.js +0 -129
- package/dist/src/invalidation.js.map +0 -1
- package/dist/src/mcp/framing.js +0 -45
- package/dist/src/mcp/framing.js.map +0 -1
- package/dist/src/mcp/server.js +0 -1298
- package/dist/src/mcp/server.js.map +0 -1
- package/dist/src/memory-value-weights.js +0 -31
- package/dist/src/memory-value-weights.js.map +0 -1
- package/dist/src/memory-value.js +0 -261
- package/dist/src/memory-value.js.map +0 -1
- package/dist/src/memory.js +0 -425
- package/dist/src/memory.js.map +0 -1
- package/dist/src/multihop.js +0 -35
- package/dist/src/multihop.js.map +0 -1
- package/dist/src/owner-validation.js +0 -56
- package/dist/src/owner-validation.js.map +0 -1
- package/dist/src/path-context.js +0 -48
- package/dist/src/path-context.js.map +0 -1
- package/dist/src/physics-config.js +0 -26
- package/dist/src/physics-config.js.map +0 -1
- package/dist/src/physics-state.js +0 -172
- package/dist/src/physics-state.js.map +0 -1
- package/dist/src/physics.js +0 -378
- package/dist/src/physics.js.map +0 -1
- package/dist/src/policies.js +0 -414
- package/dist/src/policies.js.map +0 -1
- package/dist/src/postinstall.js +0 -101
- package/dist/src/postinstall.js.map +0 -1
- package/dist/src/predictions.js +0 -629
- package/dist/src/predictions.js.map +0 -1
- package/dist/src/processes.js +0 -349
- package/dist/src/processes.js.map +0 -1
- package/dist/src/project-briefs.js +0 -492
- package/dist/src/project-briefs.js.map +0 -1
- package/dist/src/project-identity.js +0 -200
- package/dist/src/project-identity.js.map +0 -1
- package/dist/src/provenance-coverage.js +0 -23
- package/dist/src/provenance-coverage.js.map +0 -1
- package/dist/src/rate-limit.js +0 -60
- package/dist/src/rate-limit.js.map +0 -1
- package/dist/src/raw-archive-mirror-cleanup.js +0 -55
- package/dist/src/raw-archive-mirror-cleanup.js.map +0 -1
- package/dist/src/raw-archive.js +0 -91
- package/dist/src/raw-archive.js.map +0 -1
- package/dist/src/recall-history.js +0 -235
- package/dist/src/recall-history.js.map +0 -1
- package/dist/src/recall-scope.js +0 -89
- package/dist/src/recall-scope.js.map +0 -1
- package/dist/src/recall-trace.js +0 -186
- package/dist/src/recall-trace.js.map +0 -1
- package/dist/src/refine-llm.js +0 -156
- package/dist/src/refine-llm.js.map +0 -1
- package/dist/src/reject-flow.js +0 -209
- package/dist/src/reject-flow.js.map +0 -1
- package/dist/src/rejection.js +0 -160
- package/dist/src/rejection.js.map +0 -1
- package/dist/src/replay.js +0 -122
- package/dist/src/replay.js.map +0 -1
- package/dist/src/rerankers/cross-encoder.js +0 -137
- package/dist/src/rerankers/cross-encoder.js.map +0 -1
- package/dist/src/rerankers/index.js +0 -20
- package/dist/src/rerankers/index.js.map +0 -1
- package/dist/src/rerankers/jev.js +0 -119
- package/dist/src/rerankers/jev.js.map +0 -1
- package/dist/src/rerankers/llm.js +0 -80
- package/dist/src/rerankers/llm.js.map +0 -1
- package/dist/src/rerankers/types.js +0 -2
- package/dist/src/rerankers/types.js.map +0 -1
- package/dist/src/rrf.js +0 -61
- package/dist/src/rrf.js.map +0 -1
- package/dist/src/salience.js +0 -74
- package/dist/src/salience.js.map +0 -1
- package/dist/src/scheduler.js +0 -77
- package/dist/src/scheduler.js.map +0 -1
- package/dist/src/scope.js +0 -35
- package/dist/src/scope.js.map +0 -1
- package/dist/src/search.js +0 -1003
- package/dist/src/search.js.map +0 -1
- package/dist/src/secret-detect.js +0 -95
- package/dist/src/secret-detect.js.map +0 -1
- package/dist/src/server-detect.js +0 -231
- package/dist/src/server-detect.js.map +0 -1
- package/dist/src/server.js +0 -3255
- package/dist/src/server.js.map +0 -1
- package/dist/src/shared.js +0 -502
- package/dist/src/shared.js.map +0 -1
- package/dist/src/skills.js +0 -346
- package/dist/src/skills.js.map +0 -1
- package/dist/src/sleep-redact.js +0 -80
- package/dist/src/sleep-redact.js.map +0 -1
- package/dist/src/sso.js +0 -22
- package/dist/src/sso.js.map +0 -1
- package/dist/src/stdin.js +0 -41
- package/dist/src/stdin.js.map +0 -1
- package/dist/src/store.js +0 -3749
- package/dist/src/store.js.map +0 -1
- package/dist/src/tenant.js +0 -17
- package/dist/src/tenant.js.map +0 -1
- package/dist/src/trace.js +0 -72
- package/dist/src/trace.js.map +0 -1
- package/dist/src/version.js +0 -40
- package/dist/src/version.js.map +0 -1
- package/dist/src/working-memory.js +0 -157
- package/dist/src/working-memory.js.map +0 -1
- package/dist/src/yaml.js +0 -107
- package/dist/src/yaml.js.map +0 -1
- package/dist/sso.d.ts +0 -13
- package/dist/sso.d.ts.map +0 -1
- package/dist/sso.js +0 -22
- package/dist/sso.js.map +0 -1
- package/dist/stdin.d.ts.map +0 -1
- package/dist/stdin.js.map +0 -1
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js.map +0 -1
- package/dist/tenant.d.ts.map +0 -1
- package/dist/tenant.js.map +0 -1
- package/dist/trace.d.ts.map +0 -1
- package/dist/trace.js.map +0 -1
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js.map +0 -1
- package/dist/working-memory.d.ts.map +0 -1
- package/dist/working-memory.js.map +0 -1
- package/dist/yaml.d.ts.map +0 -1
- package/dist/yaml.js.map +0 -1
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolve the tenant_id for a GitHub webhook envelope.
|
|
3
|
-
*
|
|
4
|
-
* Returns:
|
|
5
|
-
* - mapped tenant_id when `github_installations` has a row for `installationId`
|
|
6
|
-
* (App-mode multi-tenant — primary path)
|
|
7
|
-
* - mapped tenant_id when `installation` is absent, `repository.full_name`
|
|
8
|
-
* matches a `github_repositories` row (PAT-mode multi-tenant)
|
|
9
|
-
* - the deployment's HIPPO_TENANT fallback (or 'default') when BOTH routing
|
|
10
|
-
* tables are empty (single-tenant deployment — env fallback is safe)
|
|
11
|
-
* - null when:
|
|
12
|
-
* - `installationId` is present but unknown AND `github_installations`
|
|
13
|
-
* is non-empty (multi-tenant install with foreign installation)
|
|
14
|
-
* - `installationId` is missing AND either routing table is non-empty
|
|
15
|
-
* AND no `repository.full_name` match (PAT-mode webhook from a foreign
|
|
16
|
-
* account — codex P0 #4 regression target)
|
|
17
|
-
*
|
|
18
|
-
* Escape hatch: `GITHUB_ALLOW_UNKNOWN_INSTALLATION_FALLBACK=1` restores the
|
|
19
|
-
* env fallback for emergency rollback only. Mirrors the Slack equivalent
|
|
20
|
-
* (`SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK`).
|
|
21
|
-
*
|
|
22
|
-
* The fail-closed contract lives here so every caller (route handler, CLI
|
|
23
|
-
* replay, future MCP) gets identical protection.
|
|
24
|
-
*/
|
|
25
|
-
export function resolveTenantForGitHub(db, args) {
|
|
26
|
-
const envFallback = () => process.env.HIPPO_TENANT?.trim() || 'default';
|
|
27
|
-
const escapeHatch = process.env.GITHUB_ALLOW_UNKNOWN_INSTALLATION_FALLBACK === '1';
|
|
28
|
-
// SAFETY: the row comes from the SELECT above, which projects exactly one
|
|
29
|
-
// column, `c`, as a COUNT(*).
|
|
30
|
-
const instCount = db
|
|
31
|
-
.prepare(`SELECT COUNT(*) AS c FROM github_installations`)
|
|
32
|
-
.get().c;
|
|
33
|
-
// SAFETY: the row comes from the SELECT above, which projects exactly one
|
|
34
|
-
// column, `c`, as a COUNT(*).
|
|
35
|
-
const repoCount = db
|
|
36
|
-
.prepare(`SELECT COUNT(*) AS c FROM github_repositories`)
|
|
37
|
-
.get().c;
|
|
38
|
-
if (args.installationId) {
|
|
39
|
-
// SAFETY: the row comes from the SELECT above, which projects exactly
|
|
40
|
-
// the tenant_id column of github_installations.
|
|
41
|
-
const row = db
|
|
42
|
-
.prepare(`SELECT tenant_id FROM github_installations WHERE installation_id = ?`)
|
|
43
|
-
.get(args.installationId);
|
|
44
|
-
if (row?.tenant_id)
|
|
45
|
-
return row.tenant_id;
|
|
46
|
-
if (Number(instCount) === 0) {
|
|
47
|
-
// Single-tenant install (table empty); env fallback is safe.
|
|
48
|
-
return envFallback();
|
|
49
|
-
}
|
|
50
|
-
// Multi-tenant install with unknown installation_id — fail closed.
|
|
51
|
-
return escapeHatch ? envFallback() : null;
|
|
52
|
-
}
|
|
53
|
-
// No installation.id (PAT-mode webhook).
|
|
54
|
-
if (Number(instCount) === 0 && Number(repoCount) === 0) {
|
|
55
|
-
// Single-tenant deployment with no routing tables populated.
|
|
56
|
-
return envFallback();
|
|
57
|
-
}
|
|
58
|
-
if (args.repoFullName) {
|
|
59
|
-
// SAFETY: the row comes from the SELECT above, which projects exactly
|
|
60
|
-
// the tenant_id column of github_repositories.
|
|
61
|
-
const row = db
|
|
62
|
-
.prepare(`SELECT tenant_id FROM github_repositories WHERE repo_full_name = ? ORDER BY added_at, tenant_id LIMIT 1`)
|
|
63
|
-
.get(args.repoFullName);
|
|
64
|
-
if (row?.tenant_id)
|
|
65
|
-
return row.tenant_id;
|
|
66
|
-
}
|
|
67
|
-
return escapeHatch ? envFallback() : null;
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=tenant-routing.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-routing.js","sourceRoot":"","sources":["../../../../src/connectors/github/tenant-routing.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAoB,EACpB,IAAiB;IAEjB,MAAM,WAAW,GAAG,GAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAChF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,0CAA0C,KAAK,GAAG,CAAC;IAEnF,0EAA0E;IAC1E,8BAA8B;IAC9B,MAAM,SAAS,GAAI,EAAE;SAClB,OAAO,CAAC,gDAAgD,CAAC;SACzD,GAAG,EAA6B,CAAC,CAAC,CAAC;IACtC,0EAA0E;IAC1E,8BAA8B;IAC9B,MAAM,SAAS,GAAI,EAAE;SAClB,OAAO,CAAC,+CAA+C,CAAC;SACxD,GAAG,EAA6B,CAAC,CAAC,CAAC;IAEtC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,sEAAsE;QACtE,gDAAgD;QAChD,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,sEAAsE,CAAC;aAC/E,GAAG,CAAC,IAAI,CAAC,cAAc,CAAuC,CAAC;QAClE,IAAI,GAAG,EAAE,SAAS;YAAE,OAAO,GAAG,CAAC,SAAS,CAAC;QACzC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,6DAA6D;YAC7D,OAAO,WAAW,EAAE,CAAC;QACvB,CAAC;QACD,mEAAmE;QACnE,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IAED,yCAAyC;IACzC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,6DAA6D;QAC7D,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,sEAAsE;QACtE,+CAA+C;QAC/C,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CACN,yGAAyG,CAC1G;aACA,GAAG,CAAC,IAAI,CAAC,YAAY,CAAuC,CAAC;QAChE,IAAI,GAAG,EAAE,SAAS;YAAE,OAAO,GAAG,CAAC,SAAS,CAAC;IAC3C,CAAC;IACD,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC"}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { scopeFromRepository } from './scope.js';
|
|
2
|
-
/**
|
|
3
|
-
* Convert GitHub webhook events into RememberOpts for api.remember(). Each
|
|
4
|
-
* function returns null when the event has no usable body so the webhook
|
|
5
|
-
* caller can mark the delivery seen for idempotency and skip the insert.
|
|
6
|
-
*
|
|
7
|
-
* Contract (mirrors src/connectors/slack/transform.ts):
|
|
8
|
-
* - kind is the literal 'raw' (E1.x connector boundary, see src/importers.ts).
|
|
9
|
-
* - artifact_ref formats are stable; deletion paths look up by these strings.
|
|
10
|
-
* - issue: github://<owner/repo>/issue/<number>
|
|
11
|
-
* - issue_comment: github://<owner/repo>/issue/<number>/comment/<id>
|
|
12
|
-
* - pull_request: github://<owner/repo>/pull/<number>
|
|
13
|
-
* - pr_review_comment: github://<owner/repo>/pull/<number>/review_comment/<id>
|
|
14
|
-
* - owner is `user:github:<login>`. Required by the v0.40.0 provenance gate.
|
|
15
|
-
* - scope is derived from repository.private via scopeFromRepository (default
|
|
16
|
-
* private when undetermined).
|
|
17
|
-
*/
|
|
18
|
-
const UNKNOWN_REPO = 'unknown/unknown';
|
|
19
|
-
export function issueEventToRememberOpts(evt) {
|
|
20
|
-
const body = evt.issue.body?.trim();
|
|
21
|
-
const title = evt.issue.title?.trim();
|
|
22
|
-
const text = [title, body].filter(Boolean).join('\n\n');
|
|
23
|
-
if (!text)
|
|
24
|
-
return null;
|
|
25
|
-
const repoFull = evt.repository?.full_name ?? UNKNOWN_REPO;
|
|
26
|
-
const login = evt.issue.user.login;
|
|
27
|
-
return {
|
|
28
|
-
content: text,
|
|
29
|
-
kind: 'raw',
|
|
30
|
-
scope: scopeFromRepository(evt.repository),
|
|
31
|
-
artifactRef: `github://${repoFull}/issue/${evt.issue.number}`,
|
|
32
|
-
owner: `user:github:${login}`,
|
|
33
|
-
tags: [
|
|
34
|
-
'source:github',
|
|
35
|
-
`repo:${repoFull}`,
|
|
36
|
-
`event:issues.${evt.action}`,
|
|
37
|
-
`user:github:${login}`,
|
|
38
|
-
],
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
export function issueCommentEventToRememberOpts(evt) {
|
|
42
|
-
const text = evt.comment.body?.trim();
|
|
43
|
-
if (!text)
|
|
44
|
-
return null;
|
|
45
|
-
const repoFull = evt.repository?.full_name ?? UNKNOWN_REPO;
|
|
46
|
-
const login = evt.comment.user.login;
|
|
47
|
-
return {
|
|
48
|
-
content: text,
|
|
49
|
-
kind: 'raw',
|
|
50
|
-
scope: scopeFromRepository(evt.repository),
|
|
51
|
-
artifactRef: `github://${repoFull}/issue/${evt.issue.number}/comment/${evt.comment.id}`,
|
|
52
|
-
owner: `user:github:${login}`,
|
|
53
|
-
tags: [
|
|
54
|
-
'source:github',
|
|
55
|
-
`repo:${repoFull}`,
|
|
56
|
-
`event:issue_comment.${evt.action}`,
|
|
57
|
-
`user:github:${login}`,
|
|
58
|
-
],
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
export function pullRequestEventToRememberOpts(evt) {
|
|
62
|
-
const body = evt.pull_request.body?.trim();
|
|
63
|
-
const title = evt.pull_request.title?.trim();
|
|
64
|
-
const text = [title, body].filter(Boolean).join('\n\n');
|
|
65
|
-
if (!text)
|
|
66
|
-
return null;
|
|
67
|
-
const repoFull = evt.repository?.full_name ?? UNKNOWN_REPO;
|
|
68
|
-
const login = evt.pull_request.user.login;
|
|
69
|
-
return {
|
|
70
|
-
content: text,
|
|
71
|
-
kind: 'raw',
|
|
72
|
-
scope: scopeFromRepository(evt.repository),
|
|
73
|
-
artifactRef: `github://${repoFull}/pull/${evt.pull_request.number}`,
|
|
74
|
-
owner: `user:github:${login}`,
|
|
75
|
-
tags: [
|
|
76
|
-
'source:github',
|
|
77
|
-
`repo:${repoFull}`,
|
|
78
|
-
`event:pull_request.${evt.action}`,
|
|
79
|
-
`user:github:${login}`,
|
|
80
|
-
],
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
export function prReviewCommentEventToRememberOpts(evt) {
|
|
84
|
-
const text = evt.comment.body?.trim();
|
|
85
|
-
if (!text)
|
|
86
|
-
return null;
|
|
87
|
-
const repoFull = evt.repository?.full_name ?? UNKNOWN_REPO;
|
|
88
|
-
const login = evt.comment.user.login;
|
|
89
|
-
return {
|
|
90
|
-
content: text,
|
|
91
|
-
kind: 'raw',
|
|
92
|
-
scope: scopeFromRepository(evt.repository),
|
|
93
|
-
artifactRef: `github://${repoFull}/pull/${evt.pull_request.number}/review_comment/${evt.comment.id}`,
|
|
94
|
-
owner: `user:github:${login}`,
|
|
95
|
-
tags: [
|
|
96
|
-
'source:github',
|
|
97
|
-
`repo:${repoFull}`,
|
|
98
|
-
`event:pull_request_review_comment.${evt.action}`,
|
|
99
|
-
`user:github:${login}`,
|
|
100
|
-
],
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
//# sourceMappingURL=transform.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../src/connectors/github/transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GitHub webhook event shapes used by the ingestion connector.
|
|
3
|
-
* Spec: https://docs.github.com/en/webhooks/webhook-events-and-payloads
|
|
4
|
-
*
|
|
5
|
-
* V1 cares about four event types: issues, issue_comment, pull_request,
|
|
6
|
-
* pull_request_review_comment. Each guard is gated on the X-GitHub-Event
|
|
7
|
-
* header value so a malicious or misrouted payload cannot satisfy a guard
|
|
8
|
-
* for the wrong event type.
|
|
9
|
-
*/
|
|
10
|
-
function isJsonObject(x) {
|
|
11
|
-
return x !== null && typeof x === 'object';
|
|
12
|
-
}
|
|
13
|
-
function isJsonString(x) {
|
|
14
|
-
return typeof x === 'string';
|
|
15
|
-
}
|
|
16
|
-
function isJsonNumber(x) {
|
|
17
|
-
return typeof x === 'number';
|
|
18
|
-
}
|
|
19
|
-
function isGitHubSender(x) {
|
|
20
|
-
if (!isJsonObject(x))
|
|
21
|
-
return false;
|
|
22
|
-
return isJsonString(x.login) && isJsonNumber(x.id);
|
|
23
|
-
}
|
|
24
|
-
export function isGitHubWebhookEnvelope(x) {
|
|
25
|
-
if (!isJsonObject(x))
|
|
26
|
-
return false;
|
|
27
|
-
// Duck-type: an envelope must at least carry an action OR a repository field.
|
|
28
|
-
return isJsonString(x.action) || isJsonObject(x.repository);
|
|
29
|
-
}
|
|
30
|
-
export function isGitHubIssueEvent(x, evtHeader) {
|
|
31
|
-
if (evtHeader !== 'issues')
|
|
32
|
-
return false;
|
|
33
|
-
if (!isJsonObject(x))
|
|
34
|
-
return false;
|
|
35
|
-
if (!isJsonString(x.action))
|
|
36
|
-
return false;
|
|
37
|
-
const issue = x.issue;
|
|
38
|
-
if (!isJsonObject(issue))
|
|
39
|
-
return false;
|
|
40
|
-
if (!isJsonNumber(issue.number))
|
|
41
|
-
return false;
|
|
42
|
-
if (!isGitHubSender(issue.user))
|
|
43
|
-
return false;
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
export function isGitHubIssueCommentEvent(x, evtHeader) {
|
|
47
|
-
if (evtHeader !== 'issue_comment')
|
|
48
|
-
return false;
|
|
49
|
-
if (!isJsonObject(x))
|
|
50
|
-
return false;
|
|
51
|
-
if (!isJsonString(x.action))
|
|
52
|
-
return false;
|
|
53
|
-
const issue = x.issue;
|
|
54
|
-
if (!isJsonObject(issue) || !isJsonNumber(issue.number))
|
|
55
|
-
return false;
|
|
56
|
-
const comment = x.comment;
|
|
57
|
-
if (!isJsonObject(comment))
|
|
58
|
-
return false;
|
|
59
|
-
if (!isJsonNumber(comment.id))
|
|
60
|
-
return false;
|
|
61
|
-
if (!isGitHubSender(comment.user))
|
|
62
|
-
return false;
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
export function isGitHubPullRequestEvent(x, evtHeader) {
|
|
66
|
-
if (evtHeader !== 'pull_request')
|
|
67
|
-
return false;
|
|
68
|
-
if (!isJsonObject(x))
|
|
69
|
-
return false;
|
|
70
|
-
if (!isJsonString(x.action))
|
|
71
|
-
return false;
|
|
72
|
-
const pr = x.pull_request;
|
|
73
|
-
if (!isJsonObject(pr))
|
|
74
|
-
return false;
|
|
75
|
-
if (!isJsonNumber(pr.number))
|
|
76
|
-
return false;
|
|
77
|
-
if (!isGitHubSender(pr.user))
|
|
78
|
-
return false;
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
export function isGitHubPullRequestReviewCommentEvent(x, evtHeader) {
|
|
82
|
-
if (evtHeader !== 'pull_request_review_comment')
|
|
83
|
-
return false;
|
|
84
|
-
if (!isJsonObject(x))
|
|
85
|
-
return false;
|
|
86
|
-
if (!isJsonString(x.action))
|
|
87
|
-
return false;
|
|
88
|
-
const pr = x.pull_request;
|
|
89
|
-
if (!isJsonObject(pr) || !isJsonNumber(pr.number))
|
|
90
|
-
return false;
|
|
91
|
-
const comment = x.comment;
|
|
92
|
-
if (!isJsonObject(comment))
|
|
93
|
-
return false;
|
|
94
|
-
if (!isJsonNumber(comment.id))
|
|
95
|
-
return false;
|
|
96
|
-
if (!isGitHubSender(comment.user))
|
|
97
|
-
return false;
|
|
98
|
-
return true;
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/connectors/github/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { openHippoDb, closeHippoDb } from '../../db.js';
|
|
2
|
-
import { ingestMessage } from './ingest.js';
|
|
3
|
-
function readCursor(root, tenantId, channelId) {
|
|
4
|
-
const db = openHippoDb(root);
|
|
5
|
-
try {
|
|
6
|
-
// SAFETY: row shape matches the single `latest_ts` column named in the
|
|
7
|
-
// SELECT above; sqlite returns undefined when no row matches.
|
|
8
|
-
const row = db
|
|
9
|
-
.prepare(`SELECT latest_ts FROM slack_cursors WHERE tenant_id=? AND channel_id=?`)
|
|
10
|
-
.get(tenantId, channelId);
|
|
11
|
-
return row?.latest_ts ?? null;
|
|
12
|
-
}
|
|
13
|
-
finally {
|
|
14
|
-
closeHippoDb(db);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
function writeCursor(root, tenantId, channelId, latestTs) {
|
|
18
|
-
const db = openHippoDb(root);
|
|
19
|
-
try {
|
|
20
|
-
db.prepare(`INSERT INTO slack_cursors (tenant_id, channel_id, latest_ts, updated_at) VALUES (?,?,?,?)
|
|
21
|
-
ON CONFLICT(tenant_id, channel_id) DO UPDATE SET latest_ts = excluded.latest_ts, updated_at = excluded.updated_at`).run(tenantId, channelId, latestTs, new Date().toISOString());
|
|
22
|
-
}
|
|
23
|
-
finally {
|
|
24
|
-
closeHippoDb(db);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Page through `conversations.history` via the injected fetcher and ingest each
|
|
29
|
-
* message. The cursor is persisted to `slack_cursors` after every page so a
|
|
30
|
-
* crash mid-backfill resumes near where it left off.
|
|
31
|
-
*
|
|
32
|
-
* Each ingested message uses a synthesized eventId of the form
|
|
33
|
-
* `backfill:${teamId}:${channelId}:${ts}`. Reruns dedupe via the
|
|
34
|
-
* `slack_event_log` PK so calling `backfillChannel` twice is safe.
|
|
35
|
-
*/
|
|
36
|
-
export async function backfillChannel(ctx, opts) {
|
|
37
|
-
// Resume bound from previous run; passed as `oldest` (numeric ts) on the
|
|
38
|
-
// first page only. `cursor` starts null — Slack mints the next-page token
|
|
39
|
-
// and we feed it back. Mixing the two would feed a numeric ts as an opaque
|
|
40
|
-
// cursor and break against the live API on rerun.
|
|
41
|
-
const resumeFrom = readCursor(ctx.hippoRoot, ctx.tenantId, opts.channel.id);
|
|
42
|
-
let cursor = null;
|
|
43
|
-
let ingested = 0;
|
|
44
|
-
let pages = 0;
|
|
45
|
-
let latestTs = resumeFrom;
|
|
46
|
-
while (true) {
|
|
47
|
-
const page = await opts.fetcher({
|
|
48
|
-
channelId: opts.channel.id,
|
|
49
|
-
cursor,
|
|
50
|
-
oldest: pages === 0 && resumeFrom ? resumeFrom : undefined,
|
|
51
|
-
});
|
|
52
|
-
pages++;
|
|
53
|
-
for (const msg of page.messages) {
|
|
54
|
-
const r = ingestMessage(ctx, {
|
|
55
|
-
teamId: opts.teamId,
|
|
56
|
-
channel: opts.channel,
|
|
57
|
-
message: msg,
|
|
58
|
-
eventId: `backfill:${opts.teamId}:${opts.channel.id}:${msg.ts}`,
|
|
59
|
-
});
|
|
60
|
-
if (r.status === 'ingested')
|
|
61
|
-
ingested++;
|
|
62
|
-
if (!latestTs || msg.ts > latestTs)
|
|
63
|
-
latestTs = msg.ts;
|
|
64
|
-
if (opts.maxMessages && ingested >= opts.maxMessages) {
|
|
65
|
-
if (latestTs)
|
|
66
|
-
writeCursor(ctx.hippoRoot, ctx.tenantId, opts.channel.id, latestTs);
|
|
67
|
-
return { ingested, pages };
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
if (latestTs)
|
|
71
|
-
writeCursor(ctx.hippoRoot, ctx.tenantId, opts.channel.id, latestTs);
|
|
72
|
-
if (!page.next_cursor)
|
|
73
|
-
break;
|
|
74
|
-
cursor = page.next_cursor;
|
|
75
|
-
}
|
|
76
|
-
return { ingested, pages };
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=backfill.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../../../src/connectors/slack/backfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { archiveRaw } from '../../api.js';
|
|
2
|
-
import { openHippoDb, closeHippoDb } from '../../db.js';
|
|
3
|
-
import { markEventSeen, hasSeenEvent } from './idempotency.js';
|
|
4
|
-
/**
|
|
5
|
-
* Handle Slack `message_deleted`. v0.39 commit 3 closes the prior race where
|
|
6
|
-
* the archive committed but `markEventSeen` ran on a second db handle — a
|
|
7
|
-
* crash between them left the deletion event un-acked, and the next retry
|
|
8
|
-
* hit a now-archived row and returned `not_found` instead of `duplicate`.
|
|
9
|
-
*
|
|
10
|
-
* Fix: pass `afterArchive` to `archiveRaw`, which runs inside the same
|
|
11
|
-
* SAVEPOINT as the archive itself. The slack_event_log row commits with the
|
|
12
|
-
* archive or not at all.
|
|
13
|
-
*/
|
|
14
|
-
export function handleMessageDeleted(ctx, input) {
|
|
15
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
16
|
-
let memoryId = null;
|
|
17
|
-
try {
|
|
18
|
-
if (hasSeenEvent(db, input.eventId)) {
|
|
19
|
-
return { status: 'duplicate', memoryId: null };
|
|
20
|
-
}
|
|
21
|
-
const ref = `slack://${input.teamId}/${input.channelId}/${input.deletedTs}`;
|
|
22
|
-
// Tenant scope is load-bearing: without `tenant_id = ?` a deletion event
|
|
23
|
-
// from tenant A could archive tenant B's raw row sharing the same
|
|
24
|
-
// artifact_ref. The `kind = 'raw'` filter prevents accidentally targeting
|
|
25
|
-
// distilled rows.
|
|
26
|
-
// SAFETY: row comes from the SELECT above, which projects only the
|
|
27
|
-
// `id` column; `.get` returns undefined when no row matches.
|
|
28
|
-
const row = db
|
|
29
|
-
.prepare(`SELECT id FROM memories WHERE artifact_ref = ? AND tenant_id = ? AND kind = 'raw'`)
|
|
30
|
-
.get(ref, ctx.tenantId);
|
|
31
|
-
memoryId = row?.id ?? null;
|
|
32
|
-
}
|
|
33
|
-
finally {
|
|
34
|
-
closeHippoDb(db);
|
|
35
|
-
}
|
|
36
|
-
if (!memoryId) {
|
|
37
|
-
// No row to archive — still mark the deletion event seen so a retry returns
|
|
38
|
-
// 'duplicate'. There is nothing to roll back here, so the second-handle
|
|
39
|
-
// pattern is fine for this branch.
|
|
40
|
-
const db2 = openHippoDb(ctx.hippoRoot);
|
|
41
|
-
try {
|
|
42
|
-
markEventSeen(db2, input.eventId, null);
|
|
43
|
-
}
|
|
44
|
-
finally {
|
|
45
|
-
closeHippoDb(db2);
|
|
46
|
-
}
|
|
47
|
-
return { status: 'not_found', memoryId: null };
|
|
48
|
-
}
|
|
49
|
-
// Archive + event-log mark commit together via afterArchive. The hook
|
|
50
|
-
// receives the same db handle the archive is using, so the INSERT lives
|
|
51
|
-
// inside the SAVEPOINT.
|
|
52
|
-
archiveRaw(ctx, memoryId, `source_deleted:slack:${input.teamId}:${input.channelId}:${input.deletedTs}`, {
|
|
53
|
-
afterArchive: (sameDb, archivedId) => {
|
|
54
|
-
markEventSeen(sameDb, input.eventId, archivedId);
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
return { status: 'archived', memoryId };
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=deletion.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deletion.js","sourceRoot":"","sources":["../../../../src/connectors/slack/deletion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAgB/D;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY,EAAE,KAAoB;IACrE,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,IAAI,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACjD,CAAC;QACD,MAAM,GAAG,GAAG,WAAW,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAC5E,yEAAyE;QACzE,kEAAkE;QAClE,0EAA0E;QAC1E,kBAAkB;QAClB,mEAAmE;QACnE,6DAA6D;QAC7D,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,mFAAmF,CAAC;aAC5F,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAgC,CAAC;QACzD,QAAQ,GAAG,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC;IAC7B,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,4EAA4E;QAC5E,wEAAwE;QACxE,mCAAmC;QACnC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC;YAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAAC,CAAC;gBACxC,CAAC;YAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IACD,sEAAsE;IACtE,wEAAwE;IACxE,wBAAwB;IACxB,UAAU,CACR,GAAG,EACH,QAAQ,EACR,wBAAwB,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,EAAE,EAC5E;QACE,YAAY,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;YACnC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACnD,CAAC;KACF,CACF,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
import { adminActor } from '../../api.js';
|
|
2
|
-
import { openHippoDb, closeHippoDb } from '../../db.js';
|
|
3
|
-
import { ingestMessage } from './ingest.js';
|
|
4
|
-
import { resolveTenantForTeam } from './tenant-routing.js';
|
|
5
|
-
import { verifySlackSignature } from './signature.js';
|
|
6
|
-
import { isSlackEventEnvelope, isSlackMessageEvent } from './types.js';
|
|
7
|
-
import { handleMessageDeleted } from './deletion.js';
|
|
8
|
-
export function writeToDlq(db, opts) {
|
|
9
|
-
const result = db
|
|
10
|
-
.prepare(`INSERT INTO slack_dlq
|
|
11
|
-
(tenant_id, team_id, raw_payload, error, received_at, bucket, signature, slack_timestamp)
|
|
12
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
13
|
-
.run(opts.tenantId ?? '__unroutable__', opts.teamId ?? null, opts.rawPayload, opts.error, new Date().toISOString(), opts.bucket ?? 'parse_error', opts.signature ?? null, opts.slackTimestamp ?? null);
|
|
14
|
-
return Number(result.lastInsertRowid);
|
|
15
|
-
}
|
|
16
|
-
export function listDlq(db, opts) {
|
|
17
|
-
// SAFETY: row shape matches the columns named in the SELECT below.
|
|
18
|
-
const rows = db
|
|
19
|
-
.prepare(`SELECT id, tenant_id, team_id, raw_payload, error, received_at, retried_at,
|
|
20
|
-
bucket, retry_count, signature, slack_timestamp
|
|
21
|
-
FROM slack_dlq
|
|
22
|
-
WHERE tenant_id = ?
|
|
23
|
-
ORDER BY received_at ASC
|
|
24
|
-
LIMIT ?`)
|
|
25
|
-
.all(opts.tenantId, opts.limit ?? 100);
|
|
26
|
-
return rows.map(rowToItem);
|
|
27
|
-
}
|
|
28
|
-
export function getDlqEntry(db, id) {
|
|
29
|
-
// SAFETY: row shape matches the columns named in the SELECT below.
|
|
30
|
-
const row = db
|
|
31
|
-
.prepare(`SELECT id, tenant_id, team_id, raw_payload, error, received_at, retried_at,
|
|
32
|
-
bucket, retry_count, signature, slack_timestamp
|
|
33
|
-
FROM slack_dlq
|
|
34
|
-
WHERE id = ?`)
|
|
35
|
-
.get(id);
|
|
36
|
-
if (!row)
|
|
37
|
-
return null;
|
|
38
|
-
return rowToItem(row);
|
|
39
|
-
}
|
|
40
|
-
function rowToItem(r) {
|
|
41
|
-
return {
|
|
42
|
-
id: Number(r.id),
|
|
43
|
-
tenantId: String(r.tenant_id),
|
|
44
|
-
teamId: r.team_id == null ? null : String(r.team_id),
|
|
45
|
-
rawPayload: String(r.raw_payload),
|
|
46
|
-
error: String(r.error),
|
|
47
|
-
receivedAt: String(r.received_at),
|
|
48
|
-
retriedAt: r.retried_at == null ? null : String(r.retried_at),
|
|
49
|
-
bucket: r.bucket == null ? 'parse_error' : String(r.bucket),
|
|
50
|
-
retryCount: Number(r.retry_count ?? 0),
|
|
51
|
-
signature: r.signature == null ? null : String(r.signature),
|
|
52
|
-
slackTimestamp: r.slack_timestamp == null ? null : String(r.slack_timestamp),
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
export function markDlqRetried(db, id) {
|
|
56
|
-
db.prepare(`UPDATE slack_dlq SET retried_at = ?, retry_count = retry_count + 1 WHERE id = ?`)
|
|
57
|
-
.run(new Date().toISOString(), id);
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Replay a DLQ row through the normal ingest path. Used by `hippo slack dlq
|
|
61
|
-
* replay <id> [--force]`.
|
|
62
|
-
*
|
|
63
|
-
* Behavior:
|
|
64
|
-
* 1. SELECT the row.
|
|
65
|
-
* 2. If signature + slack_timestamp are present and `signingSecret` is set,
|
|
66
|
-
* re-verify with the CURRENT secret (not previous). Failure → bail unless
|
|
67
|
-
* --force. Legacy rows from before v19 may have NULL signature; those
|
|
68
|
-
* require --force to replay safely.
|
|
69
|
-
* 3. Re-parse the raw_payload and dispatch to ingestMessage / handleMessageDeleted.
|
|
70
|
-
* 4. On success: mark retried_at, increment retry_count.
|
|
71
|
-
* 5. On failure: increment retry_count only, leave the row.
|
|
72
|
-
*
|
|
73
|
-
* The replay always uses the routing the deployment has NOW (current
|
|
74
|
-
* slack_workspaces table + env), not whatever was in effect when the original
|
|
75
|
-
* envelope was DLQed. That is intentional: the DLQ exists to be drained after
|
|
76
|
-
* the operator fixed the routing.
|
|
77
|
-
*/
|
|
78
|
-
export function replayDlqEntry(ctx, id, opts = {}) {
|
|
79
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
80
|
-
let row;
|
|
81
|
-
try {
|
|
82
|
-
row = getDlqEntry(db, id);
|
|
83
|
-
}
|
|
84
|
-
finally {
|
|
85
|
-
closeHippoDb(db);
|
|
86
|
-
}
|
|
87
|
-
if (!row) {
|
|
88
|
-
return { ok: false, status: 'not_found', memoryId: null, retryCount: 0, reason: `dlq id ${id} not found` };
|
|
89
|
-
}
|
|
90
|
-
// Signature verification (current secret, not previous).
|
|
91
|
-
if (!opts.force) {
|
|
92
|
-
if (!row.signature || !row.slackTimestamp) {
|
|
93
|
-
return {
|
|
94
|
-
ok: false,
|
|
95
|
-
status: 'sig_missing',
|
|
96
|
-
memoryId: null,
|
|
97
|
-
retryCount: row.retryCount,
|
|
98
|
-
reason: 'legacy row without signature/timestamp; pass --force to replay',
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
if (opts.signingSecret) {
|
|
102
|
-
const ok = verifySlackSignature({
|
|
103
|
-
rawBody: row.rawPayload,
|
|
104
|
-
signature: row.signature,
|
|
105
|
-
timestamp: row.slackTimestamp,
|
|
106
|
-
signingSecret: opts.signingSecret,
|
|
107
|
-
now: opts.now,
|
|
108
|
-
// Replays happen long after the fact — give them a wider skew unless overridden.
|
|
109
|
-
skewSeconds: opts.skewSeconds ?? 60 * 60 * 24 * 365,
|
|
110
|
-
});
|
|
111
|
-
if (!ok) {
|
|
112
|
-
return {
|
|
113
|
-
ok: false,
|
|
114
|
-
status: 'sig_fail',
|
|
115
|
-
memoryId: null,
|
|
116
|
-
retryCount: row.retryCount,
|
|
117
|
-
reason: 'signature did not verify against current SLACK_SIGNING_SECRET; pass --force to replay anyway',
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
// Parse + dispatch.
|
|
123
|
-
let parsed;
|
|
124
|
-
try {
|
|
125
|
-
parsed = JSON.parse(row.rawPayload);
|
|
126
|
-
}
|
|
127
|
-
catch (e) {
|
|
128
|
-
bumpRetryCount(ctx.hippoRoot, id);
|
|
129
|
-
return {
|
|
130
|
-
ok: false,
|
|
131
|
-
status: 'parse_error',
|
|
132
|
-
memoryId: null,
|
|
133
|
-
retryCount: row.retryCount + 1,
|
|
134
|
-
reason: `still unparseable: ${e instanceof Error ? e.message : String(e)}`,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
if (!isSlackEventEnvelope(parsed)) {
|
|
138
|
-
bumpRetryCount(ctx.hippoRoot, id);
|
|
139
|
-
return {
|
|
140
|
-
ok: false,
|
|
141
|
-
status: 'unhandled',
|
|
142
|
-
memoryId: null,
|
|
143
|
-
retryCount: row.retryCount + 1,
|
|
144
|
-
reason: 'not an event_callback envelope',
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
// Resolve tenant against current state. If still unroutable, bail.
|
|
148
|
-
const db2 = openHippoDb(ctx.hippoRoot);
|
|
149
|
-
let tenant;
|
|
150
|
-
try {
|
|
151
|
-
tenant = resolveTenantForTeam(db2, parsed.team_id);
|
|
152
|
-
}
|
|
153
|
-
finally {
|
|
154
|
-
closeHippoDb(db2);
|
|
155
|
-
}
|
|
156
|
-
if (!tenant) {
|
|
157
|
-
bumpRetryCount(ctx.hippoRoot, id);
|
|
158
|
-
return {
|
|
159
|
-
ok: false,
|
|
160
|
-
status: 'unroutable',
|
|
161
|
-
memoryId: null,
|
|
162
|
-
retryCount: row.retryCount + 1,
|
|
163
|
-
reason: `team_id ${parsed.team_id} still unroutable`,
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
const replayCtx = {
|
|
167
|
-
hippoRoot: ctx.hippoRoot,
|
|
168
|
-
tenantId: tenant,
|
|
169
|
-
actor: adminActor('connector:slack:replay'),
|
|
170
|
-
};
|
|
171
|
-
const inner = parsed.event;
|
|
172
|
-
if (!isSlackMessageEvent(inner)) {
|
|
173
|
-
bumpRetryCount(ctx.hippoRoot, id);
|
|
174
|
-
return {
|
|
175
|
-
ok: false,
|
|
176
|
-
status: 'unhandled',
|
|
177
|
-
memoryId: null,
|
|
178
|
-
retryCount: row.retryCount + 1,
|
|
179
|
-
reason: `unhandled inner event type`,
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
if (inner.subtype === 'message_deleted' && inner.deleted_ts) {
|
|
183
|
-
const r = handleMessageDeleted(replayCtx, {
|
|
184
|
-
teamId: parsed.team_id,
|
|
185
|
-
channelId: inner.channel,
|
|
186
|
-
deletedTs: inner.deleted_ts,
|
|
187
|
-
eventId: parsed.event_id,
|
|
188
|
-
});
|
|
189
|
-
markRetried(ctx.hippoRoot, id);
|
|
190
|
-
return { ok: true, status: r.status, memoryId: r.memoryId, retryCount: row.retryCount + 1 };
|
|
191
|
-
}
|
|
192
|
-
const result = ingestMessage(replayCtx, {
|
|
193
|
-
teamId: parsed.team_id,
|
|
194
|
-
channel: {
|
|
195
|
-
id: inner.channel,
|
|
196
|
-
is_private: inner.channel_type !== 'channel',
|
|
197
|
-
is_im: inner.channel_type === 'im',
|
|
198
|
-
is_mpim: inner.channel_type === 'mpim',
|
|
199
|
-
},
|
|
200
|
-
message: inner,
|
|
201
|
-
eventId: parsed.event_id,
|
|
202
|
-
});
|
|
203
|
-
markRetried(ctx.hippoRoot, id);
|
|
204
|
-
return { ok: true, status: result.status, memoryId: result.memoryId, retryCount: row.retryCount + 1 };
|
|
205
|
-
}
|
|
206
|
-
function markRetried(hippoRoot, id) {
|
|
207
|
-
const db = openHippoDb(hippoRoot);
|
|
208
|
-
try {
|
|
209
|
-
markDlqRetried(db, id);
|
|
210
|
-
}
|
|
211
|
-
finally {
|
|
212
|
-
closeHippoDb(db);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
function bumpRetryCount(hippoRoot, id) {
|
|
216
|
-
const db = openHippoDb(hippoRoot);
|
|
217
|
-
try {
|
|
218
|
-
db.prepare(`UPDATE slack_dlq SET retry_count = retry_count + 1 WHERE id = ?`).run(id);
|
|
219
|
-
}
|
|
220
|
-
finally {
|
|
221
|
-
closeHippoDb(db);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
//# sourceMappingURL=dlq.js.map
|