hippo-memory 1.44.0 → 1.45.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 +12 -10
- package/bin/hippo.js +3 -1
- package/dist/api.d.ts +21 -21
- package/dist/api.js +69 -42
- package/dist/audit.d.ts +1 -1
- package/dist/audit.js +9 -0
- package/dist/autolearn.d.ts +1 -1
- package/dist/autolearn.js +2 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +151 -72
- package/dist/client.d.ts +4 -21
- package/dist/client.js +3 -112
- package/dist/config.js +2 -1
- package/dist/consolidate.d.ts +3 -0
- package/dist/consolidate.js +44 -42
- package/dist/dag.d.ts +1 -0
- package/dist/dag.js +10 -5
- package/dist/dashboard.js +7 -3
- package/dist/db.js +12 -23
- package/dist/dedupe.d.ts +1 -0
- package/dist/dedupe.js +4 -7
- package/dist/embedding-provider.js +2 -1
- package/dist/embeddings.js +81 -8
- package/dist/extract.d.ts +2 -0
- package/dist/extract.js +9 -4
- package/dist/mcp/server.js +21 -36
- package/dist/memory.d.ts +3 -0
- package/dist/memory.js +7 -1
- package/dist/refine-llm.js +3 -2
- package/dist/rerankers/jev.js +3 -2
- package/dist/rerankers/llm.js +3 -2
- package/dist/search.js +3 -3
- package/dist/server.d.ts +5 -0
- package/dist/server.js +39 -29
- package/dist/shared.js +1 -1
- package/dist/store.d.ts +18 -11
- package/dist/store.js +144 -63
- 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 +6 -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,190 +0,0 @@
|
|
|
1
|
-
import { openHippoDb, closeHippoDb } from '../../db.js';
|
|
2
|
-
import { verifyGitHubSignature } from './signature.js';
|
|
3
|
-
import { isGitHubWebhookEnvelope } from './types.js';
|
|
4
|
-
export function writeToDlq(db, opts) {
|
|
5
|
-
const result = db
|
|
6
|
-
.prepare(`INSERT INTO github_dlq
|
|
7
|
-
(tenant_id, raw_payload, error, event_name, delivery_id, signature,
|
|
8
|
-
installation_id, repo_full_name, received_at, bucket)
|
|
9
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
10
|
-
.run(opts.tenantId ?? '__unroutable__', opts.rawPayload, opts.error, opts.eventName ?? null, opts.deliveryId ?? null, opts.signature ?? null, opts.installationId ?? null, opts.repoFullName ?? null, new Date().toISOString(), opts.bucket ?? 'parse_error');
|
|
11
|
-
return Number(result.lastInsertRowid);
|
|
12
|
-
}
|
|
13
|
-
const SELECT_COLUMNS = `id, tenant_id, raw_payload, error, event_name, delivery_id,
|
|
14
|
-
signature, installation_id, repo_full_name, retry_count,
|
|
15
|
-
received_at, retried_at, bucket`;
|
|
16
|
-
export function listDlq(db, opts) {
|
|
17
|
-
// SAFETY: rows come from the SELECT above (SELECT_COLUMNS), which projects
|
|
18
|
-
// exactly DlqRawRow's fields, in the same order github_dlq defines them.
|
|
19
|
-
const rows = db
|
|
20
|
-
.prepare(`SELECT ${SELECT_COLUMNS}
|
|
21
|
-
FROM github_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: the row comes from the SELECT above (SELECT_COLUMNS), which
|
|
30
|
-
// projects exactly DlqRawRow's fields, in the same order github_dlq defines them.
|
|
31
|
-
const row = db
|
|
32
|
-
.prepare(`SELECT ${SELECT_COLUMNS}
|
|
33
|
-
FROM github_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
|
-
rawPayload: String(r.raw_payload),
|
|
45
|
-
error: String(r.error),
|
|
46
|
-
eventName: r.event_name == null ? null : String(r.event_name),
|
|
47
|
-
deliveryId: r.delivery_id == null ? null : String(r.delivery_id),
|
|
48
|
-
signature: r.signature == null ? null : String(r.signature),
|
|
49
|
-
installationId: r.installation_id == null ? null : String(r.installation_id),
|
|
50
|
-
repoFullName: r.repo_full_name == null ? null : String(r.repo_full_name),
|
|
51
|
-
retryCount: Number(r.retry_count ?? 0),
|
|
52
|
-
receivedAt: String(r.received_at),
|
|
53
|
-
retriedAt: r.retried_at == null ? null : String(r.retried_at),
|
|
54
|
-
bucket: r.bucket == null ? 'parse_error' : String(r.bucket),
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
function bumpRetryCount(hippoRoot, id) {
|
|
58
|
-
const db = openHippoDb(hippoRoot);
|
|
59
|
-
try {
|
|
60
|
-
db.prepare(`UPDATE github_dlq
|
|
61
|
-
SET retry_count = retry_count + 1,
|
|
62
|
-
retried_at = ?
|
|
63
|
-
WHERE id = ?`).run(new Date().toISOString(), id);
|
|
64
|
-
}
|
|
65
|
-
finally {
|
|
66
|
-
closeHippoDb(db);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Replay a DLQ row through the normal ingest path. Behavior:
|
|
71
|
-
* 1. Fetch row by id. Not found → `not_found`.
|
|
72
|
-
* 2. If !force and webhookSecret provided, verify signature with the
|
|
73
|
-
* current secret. Fail → bump retry_count, `sig_fail`.
|
|
74
|
-
* Missing signature on the row → `sig_missing` (no bump; --force required).
|
|
75
|
-
* 3. JSON.parse the raw payload. Fail → bump, `parse_error`.
|
|
76
|
-
* 4. Type-guard the envelope. Fail → bump, `unhandled`.
|
|
77
|
-
* 5. If an `ingestHook` is supplied, call it and return its memoryId.
|
|
78
|
-
* If not (dry-run path), bump retry_count and return status `replayed`
|
|
79
|
-
* with memoryId=null. The webhook route wires the real hook in Task 14.
|
|
80
|
-
*
|
|
81
|
-
* Mirrors Slack's "always use current routing" policy: replays use the
|
|
82
|
-
* deployment state NOW, not at the time of original DLQing.
|
|
83
|
-
*/
|
|
84
|
-
export async function replayDlqEntry(ctx, id, opts = {}) {
|
|
85
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
86
|
-
let row;
|
|
87
|
-
try {
|
|
88
|
-
row = getDlqEntry(db, id);
|
|
89
|
-
}
|
|
90
|
-
finally {
|
|
91
|
-
closeHippoDb(db);
|
|
92
|
-
}
|
|
93
|
-
if (!row) {
|
|
94
|
-
return {
|
|
95
|
-
ok: false,
|
|
96
|
-
status: 'not_found',
|
|
97
|
-
memoryId: null,
|
|
98
|
-
retryCount: 0,
|
|
99
|
-
reason: `dlq id ${id} not found`,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
// Signature verification (current secret, not the one in effect when DLQed).
|
|
103
|
-
if (!opts.force && opts.webhookSecret) {
|
|
104
|
-
if (!row.signature) {
|
|
105
|
-
return {
|
|
106
|
-
ok: false,
|
|
107
|
-
status: 'sig_missing',
|
|
108
|
-
memoryId: null,
|
|
109
|
-
retryCount: row.retryCount,
|
|
110
|
-
reason: 'legacy row without signature; pass --force to replay',
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
const sigOk = verifyGitHubSignature({
|
|
114
|
-
rawBody: row.rawPayload,
|
|
115
|
-
signature: row.signature,
|
|
116
|
-
webhookSecret: opts.webhookSecret,
|
|
117
|
-
previousSecret: opts.previousSecret,
|
|
118
|
-
});
|
|
119
|
-
if (!sigOk) {
|
|
120
|
-
bumpRetryCount(ctx.hippoRoot, id);
|
|
121
|
-
return {
|
|
122
|
-
ok: false,
|
|
123
|
-
status: 'sig_fail',
|
|
124
|
-
memoryId: null,
|
|
125
|
-
retryCount: row.retryCount + 1,
|
|
126
|
-
reason: 'signature did not verify against current GITHUB_WEBHOOK_SECRET; pass --force to replay anyway',
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// Parse + envelope guard.
|
|
131
|
-
let parsed;
|
|
132
|
-
try {
|
|
133
|
-
parsed = JSON.parse(row.rawPayload);
|
|
134
|
-
}
|
|
135
|
-
catch (e) {
|
|
136
|
-
bumpRetryCount(ctx.hippoRoot, id);
|
|
137
|
-
// SAFETY: this is a best-effort error message only; property access on
|
|
138
|
-
// any JS value is safe (undefined if absent), preserving the existing
|
|
139
|
-
// lenient formatting even when something non-Error was thrown.
|
|
140
|
-
const message = e.message;
|
|
141
|
-
return {
|
|
142
|
-
ok: false,
|
|
143
|
-
status: 'parse_error',
|
|
144
|
-
memoryId: null,
|
|
145
|
-
retryCount: row.retryCount + 1,
|
|
146
|
-
reason: `still unparseable: ${message}`,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
if (!isGitHubWebhookEnvelope(parsed)) {
|
|
150
|
-
bumpRetryCount(ctx.hippoRoot, id);
|
|
151
|
-
return {
|
|
152
|
-
ok: false,
|
|
153
|
-
status: 'unhandled',
|
|
154
|
-
memoryId: null,
|
|
155
|
-
retryCount: row.retryCount + 1,
|
|
156
|
-
reason: 'not a GitHub webhook envelope',
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
// Without an ingest hook this is a dry-run validation. Bump and report.
|
|
160
|
-
if (!opts.ingestHook) {
|
|
161
|
-
bumpRetryCount(ctx.hippoRoot, id);
|
|
162
|
-
return {
|
|
163
|
-
ok: true,
|
|
164
|
-
status: 'replayed',
|
|
165
|
-
memoryId: null,
|
|
166
|
-
retryCount: row.retryCount + 1,
|
|
167
|
-
reason: 'dry-run: no ingest hook supplied',
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
// Real replay path. The route's IngestHook is responsible for routing,
|
|
171
|
-
// idempotency, and writing the memory. The DLQ module only validates the
|
|
172
|
-
// surface and bumps the retry counter.
|
|
173
|
-
// v1.3.2: dropped the stale idempotencyKey arg — the hook re-derives it
|
|
174
|
-
// from the parsed event (artifact_ref + updated_at) since v1.3.1.
|
|
175
|
-
const eventName = row.eventName ?? '';
|
|
176
|
-
const deliveryId = row.deliveryId ?? '';
|
|
177
|
-
const { memoryId } = await opts.ingestHook(ctx, {
|
|
178
|
-
rawPayload: row.rawPayload,
|
|
179
|
-
eventName,
|
|
180
|
-
deliveryId,
|
|
181
|
-
});
|
|
182
|
-
bumpRetryCount(ctx.hippoRoot, id);
|
|
183
|
-
return {
|
|
184
|
-
ok: true,
|
|
185
|
-
status: 'replayed',
|
|
186
|
-
memoryId,
|
|
187
|
-
retryCount: row.retryCount + 1,
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
//# sourceMappingURL=dlq.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dlq.js","sourceRoot":"","sources":["../../../../src/connectors/github/dlq.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Thrown by ingest's afterWrite hook when a concurrent worker has already
|
|
3
|
-
* inserted github_event_log for the same idempotency_key. Roll back the
|
|
4
|
-
* SAVEPOINT so exactly one memory row exists per key.
|
|
5
|
-
*/
|
|
6
|
-
export class DuplicateIdempotencyError extends Error {
|
|
7
|
-
idempotencyKey;
|
|
8
|
-
constructor(idempotencyKey) {
|
|
9
|
-
super(`duplicate github idempotency_key: ${idempotencyKey}`);
|
|
10
|
-
this.name = 'DuplicateIdempotencyError';
|
|
11
|
-
this.idempotencyKey = idempotencyKey;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
export function hasSeenKey(db, idempotencyKey) {
|
|
15
|
-
const row = db.prepare(`SELECT 1 FROM github_event_log WHERE idempotency_key = ?`).get(idempotencyKey);
|
|
16
|
-
return !!row;
|
|
17
|
-
}
|
|
18
|
-
export function markKeySeen(db, args) {
|
|
19
|
-
db.prepare(`INSERT OR IGNORE INTO github_event_log (idempotency_key, delivery_id, event_name, ingested_at, memory_id) VALUES (?, ?, ?, ?, ?)`).run(args.idempotencyKey, args.deliveryId, args.eventName, new Date().toISOString(), args.memoryId);
|
|
20
|
-
}
|
|
21
|
-
export function lookupMemoryByKey(db, idempotencyKey) {
|
|
22
|
-
// SAFETY: the row comes from the SELECT above, which projects exactly the
|
|
23
|
-
// memory_id column of github_event_log.
|
|
24
|
-
const row = db.prepare(`SELECT memory_id FROM github_event_log WHERE idempotency_key = ?`).get(idempotencyKey);
|
|
25
|
-
return row?.memory_id ?? null;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=idempotency.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../../../src/connectors/github/idempotency.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,cAAc,CAAS;IAChC,YAAY,cAAsB;QAChC,KAAK,CAAC,qCAAqC,cAAc,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;CACF;AAED,MAAM,UAAU,UAAU,CAAC,EAAoB,EAAE,cAAsB;IACrE,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACvG,OAAO,CAAC,CAAC,GAAG,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,EAAoB,EACpB,IAAgG;IAEhG,EAAE,CAAC,OAAO,CACR,kIAAkI,CACnI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAoB,EAAE,cAAsB;IAC5E,0EAA0E;IAC1E,wCAAwC;IACxC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC,GAAG,CAAC,cAAc,CAEhG,CAAC;IACd,OAAO,GAAG,EAAE,SAAS,IAAI,IAAI,CAAC;AAChC,CAAC"}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GitHub event ingest with afterWrite race-safe idempotency.
|
|
3
|
-
*
|
|
4
|
-
* Mirrors src/connectors/slack/ingest.ts. The dedupe key is sha256(eventName +
|
|
5
|
-
* ':' + rawBody) (codex P0 #3) — derived from the signed body, not from the
|
|
6
|
-
* unsigned X-GitHub-Delivery header, so a replay attacker cannot bypass
|
|
7
|
-
* idempotency by rotating the delivery UUID.
|
|
8
|
-
*
|
|
9
|
-
* Race semantics (codex P1 #6):
|
|
10
|
-
* - Fast path: hasSeenKey pre-check returns 'duplicate' for the common case.
|
|
11
|
-
* - Slow path: hasSeenKey passes (no row yet). Two workers may race into
|
|
12
|
-
* remember() concurrently. Inside the writeEntry SAVEPOINT, INSERT OR
|
|
13
|
-
* IGNORE on github_event_log either inserts (changes=1, commit) or
|
|
14
|
-
* collides (changes=0, throw DuplicateIdempotencyError -> SAVEPOINT
|
|
15
|
-
* rolls back this worker's memory row). Exactly one memory exists per
|
|
16
|
-
* idempotency_key.
|
|
17
|
-
*
|
|
18
|
-
* The Slack precedent's race test was insufficient — it tested the fast path,
|
|
19
|
-
* not the SAVEPOINT collision. The `__testInjectBeforeLog` hook below lets
|
|
20
|
-
* tests pre-populate github_event_log inside the SAVEPOINT to actually
|
|
21
|
-
* exercise the changes=0 -> rollback path.
|
|
22
|
-
*/
|
|
23
|
-
import { remember } from '../../api.js';
|
|
24
|
-
import { openHippoDb, closeHippoDb } from '../../db.js';
|
|
25
|
-
import { RejectedValueError } from '../../rejection.js';
|
|
26
|
-
import { hasSeenKey, lookupMemoryByKey, DuplicateIdempotencyError } from './idempotency.js';
|
|
27
|
-
import { computeIdempotencyKey } from './signature.js';
|
|
28
|
-
import { issueEventToRememberOpts, issueCommentEventToRememberOpts, pullRequestEventToRememberOpts, prReviewCommentEventToRememberOpts, } from './transform.js';
|
|
29
|
-
function transformEvent(event) {
|
|
30
|
-
switch (event.eventName) {
|
|
31
|
-
case 'issues':
|
|
32
|
-
return issueEventToRememberOpts(event.payload);
|
|
33
|
-
case 'issue_comment':
|
|
34
|
-
return issueCommentEventToRememberOpts(event.payload);
|
|
35
|
-
case 'pull_request':
|
|
36
|
-
return pullRequestEventToRememberOpts(event.payload);
|
|
37
|
-
case 'pull_request_review_comment':
|
|
38
|
-
return prReviewCommentEventToRememberOpts(event.payload);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* v1.3.1: extract the source-normalized identifier the idempotency key needs.
|
|
43
|
-
* Backfill and webhook both produce IngestEvent objects describing the same
|
|
44
|
-
* source revision, so deriving the key from these fields collapses both paths
|
|
45
|
-
* onto the same dedupe row. Mirrors the artifactRef strings in transform.ts.
|
|
46
|
-
*/
|
|
47
|
-
function eventArtifactRef(event) {
|
|
48
|
-
const repo = event.payload.repository?.full_name ?? 'unknown/unknown';
|
|
49
|
-
switch (event.eventName) {
|
|
50
|
-
case 'issues':
|
|
51
|
-
return `github://${repo}/issue/${event.payload.issue.number}`;
|
|
52
|
-
case 'issue_comment':
|
|
53
|
-
return `github://${repo}/issue/${event.payload.issue.number}/comment/${event.payload.comment.id}`;
|
|
54
|
-
case 'pull_request':
|
|
55
|
-
return `github://${repo}/pull/${event.payload.pull_request.number}`;
|
|
56
|
-
case 'pull_request_review_comment':
|
|
57
|
-
return `github://${repo}/pull/${event.payload.pull_request.number}/review_comment/${event.payload.comment.id}`;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function eventUpdatedAt(event) {
|
|
61
|
-
switch (event.eventName) {
|
|
62
|
-
case 'issues':
|
|
63
|
-
return event.payload.issue.updated_at ?? null;
|
|
64
|
-
case 'issue_comment':
|
|
65
|
-
return event.payload.comment.updated_at ?? null;
|
|
66
|
-
case 'pull_request':
|
|
67
|
-
return event.payload.pull_request.updated_at ?? null;
|
|
68
|
-
case 'pull_request_review_comment':
|
|
69
|
-
return event.payload.comment.updated_at ?? null;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
export function ingestEvent(ctx, input) {
|
|
73
|
-
const idempotencyKey = computeIdempotencyKey(eventArtifactRef(input.event), eventUpdatedAt(input.event));
|
|
74
|
-
// Fast path: pre-check. Avoids running the transform / opening a write tx
|
|
75
|
-
// for the common already-seen case (GitHub auto-retries with the same body).
|
|
76
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
77
|
-
try {
|
|
78
|
-
if (hasSeenKey(db, idempotencyKey)) {
|
|
79
|
-
return { status: 'duplicate', memoryId: lookupMemoryByKey(db, idempotencyKey) };
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
finally {
|
|
83
|
-
closeHippoDb(db);
|
|
84
|
-
}
|
|
85
|
-
const opts = transformEvent(input.event);
|
|
86
|
-
if (!opts) {
|
|
87
|
-
// Empty body: no memory to write, but mark seen so a retry of the same
|
|
88
|
-
// empty event returns 'duplicate' (not 'skipped' again — that would
|
|
89
|
-
// re-run the transform on every retry).
|
|
90
|
-
const db2 = openHippoDb(ctx.hippoRoot);
|
|
91
|
-
try {
|
|
92
|
-
db2
|
|
93
|
-
.prepare(`INSERT OR IGNORE INTO github_event_log (idempotency_key, delivery_id, event_name, ingested_at, memory_id) VALUES (?, ?, ?, ?, ?)`)
|
|
94
|
-
.run(idempotencyKey, input.deliveryId, input.event.eventName, new Date().toISOString(), null);
|
|
95
|
-
}
|
|
96
|
-
finally {
|
|
97
|
-
closeHippoDb(db2);
|
|
98
|
-
}
|
|
99
|
-
return { status: 'skipped', memoryId: null };
|
|
100
|
-
}
|
|
101
|
-
// Atomic write via afterWrite. Inside writeEntry's SAVEPOINT:
|
|
102
|
-
// 1. memories row INSERT lands.
|
|
103
|
-
// 2. (test-only) __testInjectBeforeLog can race-inject a colliding key.
|
|
104
|
-
// 3. INSERT OR IGNORE on github_event_log; if a concurrent worker (or
|
|
105
|
-
// the test injection) beat us, changes=0 -> throw -> SAVEPOINT rolls
|
|
106
|
-
// back our memory row. Other worker's commit stands.
|
|
107
|
-
try {
|
|
108
|
-
// v1.12.0: drop the legacy `|| 'connector:github'` fallback (see slack/ingest.ts:73 for rationale).
|
|
109
|
-
const result = remember(ctx, {
|
|
110
|
-
...opts,
|
|
111
|
-
afterWrite: (innerDb, memoryId) => {
|
|
112
|
-
if (input.__testInjectBeforeLog) {
|
|
113
|
-
input.__testInjectBeforeLog(innerDb, idempotencyKey);
|
|
114
|
-
}
|
|
115
|
-
const inserted = innerDb
|
|
116
|
-
.prepare(`INSERT OR IGNORE INTO github_event_log (idempotency_key, delivery_id, event_name, ingested_at, memory_id) VALUES (?, ?, ?, ?, ?)`)
|
|
117
|
-
.run(idempotencyKey, input.deliveryId, input.event.eventName, new Date().toISOString(), memoryId);
|
|
118
|
-
if (Number(inserted.changes ?? 0) === 0) {
|
|
119
|
-
throw new DuplicateIdempotencyError(idempotencyKey);
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
});
|
|
123
|
-
return { status: 'ingested', memoryId: result.id };
|
|
124
|
-
}
|
|
125
|
-
catch (e) {
|
|
126
|
-
if (e instanceof DuplicateIdempotencyError) {
|
|
127
|
-
// Other worker's row is committed. Return its memory_id so callers
|
|
128
|
-
// behave identically to the fast-path 'duplicate' branch.
|
|
129
|
-
const db3 = openHippoDb(ctx.hippoRoot);
|
|
130
|
-
try {
|
|
131
|
-
return { status: 'skipped_duplicate', memoryId: lookupMemoryByKey(db3, idempotencyKey) };
|
|
132
|
-
}
|
|
133
|
-
finally {
|
|
134
|
-
closeHippoDb(db3);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
if (e instanceof RejectedValueError) {
|
|
138
|
-
// AT1 (plan §3 containment): a tombstone hit is a PERMANENT skip, not
|
|
139
|
-
// a transient failure — never DLQ-retry it. Mark the idempotency key
|
|
140
|
-
// seen exactly like the empty-body branch above so a GitHub retry of
|
|
141
|
-
// the same delivery acks as done, not error.
|
|
142
|
-
const db4 = openHippoDb(ctx.hippoRoot);
|
|
143
|
-
try {
|
|
144
|
-
db4
|
|
145
|
-
.prepare(`INSERT OR IGNORE INTO github_event_log (idempotency_key, delivery_id, event_name, ingested_at, memory_id) VALUES (?, ?, ?, ?, ?)`)
|
|
146
|
-
.run(idempotencyKey, input.deliveryId, input.event.eventName, new Date().toISOString(), null);
|
|
147
|
-
}
|
|
148
|
-
finally {
|
|
149
|
-
closeHippoDb(db4);
|
|
150
|
-
}
|
|
151
|
-
return { status: 'skipped', memoryId: null };
|
|
152
|
-
}
|
|
153
|
-
throw e;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=ingest.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../../../src/connectors/github/ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Octokit-shaped HTTP fetcher for the GitHub connector backfill.
|
|
3
|
-
*
|
|
4
|
-
* Production uses `realGitHubFetcher` against `https://api.github.com`.
|
|
5
|
-
* Tests inject a fake `GitHubFetcher` so they never hit the network.
|
|
6
|
-
*
|
|
7
|
-
* Codex P1 #4 mandate: any non-200 response that is NOT a recognized
|
|
8
|
-
* rate-limit pause MUST throw `GitHubFetchError`. Silently turning
|
|
9
|
-
* 401/403/404/500 into empty pages produced empty backfills with no
|
|
10
|
-
* operator signal, so this code path is now load-bearing.
|
|
11
|
-
*/
|
|
12
|
-
import { parseRateLimit } from './ratelimit.js';
|
|
13
|
-
export class GitHubFetchError extends Error {
|
|
14
|
-
status;
|
|
15
|
-
bodyExcerpt;
|
|
16
|
-
url;
|
|
17
|
-
constructor(status, bodyExcerpt, url) {
|
|
18
|
-
super(`GitHub ${status} on ${url}: ${bodyExcerpt}`);
|
|
19
|
-
this.status = status;
|
|
20
|
-
this.bodyExcerpt = bodyExcerpt;
|
|
21
|
-
this.url = url;
|
|
22
|
-
this.name = 'GitHubFetchError';
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Parse the rel="next" URL from an RFC 5988 `Link` header.
|
|
27
|
-
*
|
|
28
|
-
* Header format: `<url1>; rel="next", <url2>; rel="last"`.
|
|
29
|
-
* Returns the URL whose rel parameter is exactly `"next"`, or null.
|
|
30
|
-
*/
|
|
31
|
-
export function parseNextLink(linkHeader) {
|
|
32
|
-
if (!linkHeader)
|
|
33
|
-
return null;
|
|
34
|
-
const re = /<([^>]+)>\s*;\s*rel="next"/;
|
|
35
|
-
const m = linkHeader.match(re);
|
|
36
|
-
return m ? m[1] : null;
|
|
37
|
-
}
|
|
38
|
-
function headersToRecord(h) {
|
|
39
|
-
const entries = [];
|
|
40
|
-
h.forEach((v, k) => {
|
|
41
|
-
entries.push([k.toLowerCase(), v]);
|
|
42
|
-
});
|
|
43
|
-
return Object.fromEntries(entries);
|
|
44
|
-
}
|
|
45
|
-
export const realGitHubFetcher = async ({ url, token }) => {
|
|
46
|
-
const res = await fetch(url, {
|
|
47
|
-
headers: {
|
|
48
|
-
Authorization: `Bearer ${token}`,
|
|
49
|
-
Accept: 'application/vnd.github+json',
|
|
50
|
-
'X-GitHub-Api-Version': '2022-11-28',
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
const headers = headersToRecord(res.headers);
|
|
54
|
-
const rateLimit = parseRateLimit(headers, res.status);
|
|
55
|
-
// Codex P1 #4: don't silently turn 401/403/404/500 into empty pages.
|
|
56
|
-
if (res.status !== 200 && rateLimit.reason === 'none') {
|
|
57
|
-
const body = await res.text().catch(() => '');
|
|
58
|
-
throw new GitHubFetchError(res.status, body.slice(0, 256), url);
|
|
59
|
-
}
|
|
60
|
-
// SAFETY: GitHub's list/paginated endpoints (issues, comments, etc. — the
|
|
61
|
-
// only endpoints this backfill fetcher targets) return a JSON array body
|
|
62
|
-
// on 200; per-item shape is intentionally left as `unknown` here since
|
|
63
|
-
// GitHubBackfillPage.items is opaque to this seam (callers parse the
|
|
64
|
-
// shape they expect downstream).
|
|
65
|
-
const items = res.status === 200 ? (await res.json()) : [];
|
|
66
|
-
const link = res.headers.get('link') ?? '';
|
|
67
|
-
const next = parseNextLink(link);
|
|
68
|
-
return { items, next, rateLimit };
|
|
69
|
-
};
|
|
70
|
-
//# sourceMappingURL=octokit-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"octokit-client.js","sourceRoot":"","sources":["../../../../src/connectors/github/octokit-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,cAAc,EAAsB,MAAM,gBAAgB,CAAC;AAEpE,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAE9B;IACA;IACA;IAHX,YACW,MAAc,EACd,WAAmB,EACnB,GAAW;QAEpB,KAAK,CAAC,UAAU,MAAM,OAAO,GAAG,KAAK,WAAW,EAAE,CAAC,CAAC;QAJ3C,WAAM,GAAN,MAAM,CAAQ;QACd,gBAAW,GAAX,WAAW,CAAQ;QACnB,QAAG,GAAH,GAAG,CAAQ;QAGpB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAaD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,EAAE,GAAG,4BAA4B,CAAC;IACxC,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzB,CAAC;AAED,SAAS,eAAe,CAAC,CAAU;IACjC,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAkB,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;IACvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,MAAM,EAAE,6BAA6B;YACrC,sBAAsB,EAAE,YAAY;SACrC;KACF,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAEtD,qEAAqE;IACrE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAClE,CAAC;IAED,0EAA0E;IAC1E,yEAAyE;IACzE,uEAAuE;IACvE,qEAAqE;IACrE,iCAAiC;IACjC,MAAM,KAAK,GACT,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACpC,CAAC,CAAC"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GitHub rate-limit header parser.
|
|
3
|
-
*
|
|
4
|
-
* GitHub returns 403 for primary rate-limit (with `X-RateLimit-Remaining: 0`
|
|
5
|
-
* and `X-RateLimit-Reset: <epoch>`) and 429 + `Retry-After: <seconds>` for
|
|
6
|
-
* secondary rate-limit. Backfill must pause and resume rather than error.
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Parse rate-limit signal from a GitHub HTTP response.
|
|
10
|
-
*
|
|
11
|
-
* @param headers Lower-cased HTTP response headers.
|
|
12
|
-
* @param status HTTP status code.
|
|
13
|
-
* @param now Optional current epoch seconds (for deterministic tests).
|
|
14
|
-
*/
|
|
15
|
-
export function parseRateLimit(headers, status, now) {
|
|
16
|
-
const _now = now ?? Math.floor(Date.now() / 1000);
|
|
17
|
-
if (status === 429) {
|
|
18
|
-
const retry = Number(headers['retry-after'] ?? '60');
|
|
19
|
-
return {
|
|
20
|
-
sleepSeconds: Number.isFinite(retry) && retry >= 0 ? retry : 60,
|
|
21
|
-
reason: 'secondary',
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
if (status === 403 && Number(headers['x-ratelimit-remaining'] ?? '1') === 0) {
|
|
25
|
-
const reset = Number(headers['x-ratelimit-reset'] ?? '0');
|
|
26
|
-
const diff = reset - _now;
|
|
27
|
-
return { sleepSeconds: Math.max(diff, 1), reason: 'primary' };
|
|
28
|
-
}
|
|
29
|
-
return { sleepSeconds: 0, reason: 'none' };
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=ratelimit.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ratelimit.js","sourceRoot":"","sources":["../../../../src/connectors/github/ratelimit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,OAA2C,EAC3C,MAAc,EACd,GAAY;IAEZ,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAElD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,CAAC;QACrD,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAC/D,MAAM,EAAE,WAAW;SACpB,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,GAAG,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;QAC1B,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAChE,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Map a GitHub repository to a hippo scope string. Default-private when
|
|
3
|
-
* privacy is undetermined: cost of leaking public into private (recall returns
|
|
4
|
-
* nothing) << cost of leaking private into public (data exposure).
|
|
5
|
-
*/
|
|
6
|
-
export function scopeFromRepository(repo) {
|
|
7
|
-
if (!repo)
|
|
8
|
-
return 'github:private:unknown';
|
|
9
|
-
if (repo.private === false)
|
|
10
|
-
return `github:public:${repo.full_name}`;
|
|
11
|
-
return `github:private:${repo.full_name}`;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=scope.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../../src/connectors/github/scope.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAkC;IACpE,IAAI,CAAC,IAAI;QAAE,OAAO,wBAAwB,CAAC;IAC3C,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,iBAAiB,IAAI,CAAC,SAAS,EAAE,CAAC;IACrE,OAAO,kBAAkB,IAAI,CAAC,SAAS,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { createHmac, createHash, timingSafeEqual } from 'crypto';
|
|
2
|
-
function verifyOne(rawBody, signature, secret) {
|
|
3
|
-
if (!signature.startsWith('sha256='))
|
|
4
|
-
return false;
|
|
5
|
-
const expected = `sha256=${createHmac('sha256', secret).update(rawBody).digest('hex')}`;
|
|
6
|
-
const a = Buffer.from(signature, 'utf8');
|
|
7
|
-
const b = Buffer.from(expected, 'utf8');
|
|
8
|
-
if (a.length !== b.length)
|
|
9
|
-
return false;
|
|
10
|
-
return timingSafeEqual(a, b);
|
|
11
|
-
}
|
|
12
|
-
export function verifyGitHubSignature(opts) {
|
|
13
|
-
if (verifyOne(opts.rawBody, opts.signature, opts.webhookSecret))
|
|
14
|
-
return true;
|
|
15
|
-
if (opts.previousSecret && verifyOne(opts.rawBody, opts.signature, opts.previousSecret))
|
|
16
|
-
return true;
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Source-aware idempotency key. v1.3.1 hotfix (codex round 1 P0 #3 + claude
|
|
21
|
-
* round 2 P0 #3).
|
|
22
|
-
*
|
|
23
|
-
* Round 1 design: sha256(eventName + ':' + rawBody) so an attacker rotating
|
|
24
|
-
* X-GitHub-Delivery cannot bypass dedupe.
|
|
25
|
-
*
|
|
26
|
-
* Round 2 found that key produced different hashes for the SAME source event
|
|
27
|
-
* delivered via webhook vs via REST backfill, because backfill rawBody is the
|
|
28
|
-
* REST list-item shape while webhook rawBody is the envelope. Result:
|
|
29
|
-
* backfill + later webhook of the same issue created two `kind='raw'` rows
|
|
30
|
-
* with the same artifact_ref. Combined with the deletion bug, deletion could
|
|
31
|
-
* not archive both.
|
|
32
|
-
*
|
|
33
|
-
* v1.3.1 fix: key from the SOURCE-NORMALIZED identifier — artifact_ref plus
|
|
34
|
-
* the source-side updated_at timestamp. Same artifact + same revision = same
|
|
35
|
-
* key, regardless of which path delivered it. Different revisions of the same
|
|
36
|
-
* issue (an edit) get different keys, which is correct: each edit IS a new
|
|
37
|
-
* memory revision.
|
|
38
|
-
*
|
|
39
|
-
* Both inputs are upstream-derived from the parsed event, not from the
|
|
40
|
-
* unsigned delivery header — replay attacks still cannot bypass dedupe.
|
|
41
|
-
*
|
|
42
|
-
* Inputs:
|
|
43
|
-
* - artifactRef: e.g. 'github://acme/repo/issue/42' or
|
|
44
|
-
* 'github://acme/repo/issue/42/comment/123'.
|
|
45
|
-
* - updatedAt: source-side ISO timestamp (issue.updated_at,
|
|
46
|
-
* comment.updated_at, pull_request.updated_at). Empty string when the
|
|
47
|
-
* payload omits it (rare; older REST shapes).
|
|
48
|
-
*
|
|
49
|
-
* Migration note for v1.3.0 → v1.3.1: existing github_event_log rows from
|
|
50
|
-
* v1.3.0 used the round-1 key shape and will not collide with v1.3.1 keys.
|
|
51
|
-
* The first webhook delivery after upgrading creates a new log row with the
|
|
52
|
-
* new key. This is acceptable for a hotfix (no production users on v1.3.0)
|
|
53
|
-
* and correct semantics going forward.
|
|
54
|
-
*/
|
|
55
|
-
export function computeIdempotencyKey(artifactRef, updatedAt) {
|
|
56
|
-
return createHash('sha256').update(`${artifactRef}:${updatedAt ?? ''}`).digest('hex');
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* v1.3.2: deletion-specific idempotency key. Distinct namespace from
|
|
60
|
-
* computeIdempotencyKey so an ingest's row in github_event_log doesn't make
|
|
61
|
-
* a deletion event return 'duplicate' before it gets a chance to archive.
|
|
62
|
-
*
|
|
63
|
-
* The codex round 3 P0 fix on server.ts was to call computeIdempotencyKey
|
|
64
|
-
* with the right (artifactRef, updatedAt) shape for deletions. That made
|
|
65
|
-
* the deletion key MATCH the ingest key — which collapsed to a "deletion
|
|
66
|
-
* always returns duplicate" bug because both shared github_event_log.
|
|
67
|
-
*
|
|
68
|
-
* v1.3.2 splits the namespace: deletion key = sha256('deleted:' +
|
|
69
|
-
* artifactRef + ':' + updatedAt). Two retries of the SAME deletion event
|
|
70
|
-
* still dedupe (same artifact + same updatedAt + same prefix → same key).
|
|
71
|
-
* Ingest of the same artifact + same updatedAt produces a DIFFERENT key,
|
|
72
|
-
* so a deletion event does not get short-circuited by the ingest's prior
|
|
73
|
-
* log row.
|
|
74
|
-
*
|
|
75
|
-
* Kept as a separate exported function so the namespace prefix is explicit
|
|
76
|
-
* at every call site (server.ts deletion branches, deletion.ts, DLQ replay).
|
|
77
|
-
*/
|
|
78
|
-
export function computeDeletionKey(artifactRef, updatedAt) {
|
|
79
|
-
return createHash('sha256').update(`deleted:${artifactRef}:${updatedAt ?? ''}`).digest('hex');
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=signature.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signature.js","sourceRoot":"","sources":["../../../../src/connectors/github/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAWjE,SAAS,SAAS,CAAC,OAAe,EAAE,SAAiB,EAAE,MAAc;IACnE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,QAAQ,GAAG,UAAU,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACxF,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAgB;IACpD,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,IAAI,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACrG,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB,EAAE,SAAoC;IAC7F,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,WAAW,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxF,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,SAAoC;IAC1F,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,WAAW,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChG,CAAC"}
|