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,281 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Paginated backfill of three GitHub REST streams with per-stream
|
|
3
|
-
* high-water marks (HWMs):
|
|
4
|
-
* - /repos/{repo}/issues -> issues_hwm
|
|
5
|
-
* - /repos/{repo}/issues/comments -> issue_comments_hwm
|
|
6
|
-
* - /repos/{repo}/pulls/comments -> pr_review_comments_hwm
|
|
7
|
-
*
|
|
8
|
-
* Crash safety (codex P1 #3): each stream's HWM is persisted ONLY after
|
|
9
|
-
* the stream fully drains. If stream 2 throws mid-flight, stream 1's HWM
|
|
10
|
-
* is committed and stream 2's stays NULL (or its prior value). Rerun
|
|
11
|
-
* picks up from stream 1's saved HWM and re-fetches stream 2 from its
|
|
12
|
-
* last committed point.
|
|
13
|
-
*
|
|
14
|
-
* Codex P1 #2: the /issues endpoint returns BOTH issues and PRs (a PR is
|
|
15
|
-
* an issue with a `pull_request` field). We skip PRs here so they don't
|
|
16
|
-
* get ingested under the issues schema. PRs are handled via webhook in
|
|
17
|
-
* V1 (no /pulls backfill stream — review comments cover the discussion
|
|
18
|
-
* surface).
|
|
19
|
-
*
|
|
20
|
-
* Privacy (V1 limitation): the REST list endpoints don't reliably set
|
|
21
|
-
* `repository.private`, and resolving it requires an extra API call per
|
|
22
|
-
* repo. Backfill leaves the field undefined so scopeFromRepository falls
|
|
23
|
-
* through to private. Callers who know the repo is public can re-tag
|
|
24
|
-
* downstream; the fail-safe default protects private orgs.
|
|
25
|
-
*/
|
|
26
|
-
import { openHippoDb, closeHippoDb } from '../../db.js';
|
|
27
|
-
import { ingestEvent } from './ingest.js';
|
|
28
|
-
const API = 'https://api.github.com';
|
|
29
|
-
function readCursor(root, tenantId, repo) {
|
|
30
|
-
const db = openHippoDb(root);
|
|
31
|
-
try {
|
|
32
|
-
// SAFETY: row's shape matches the three HWM columns named in the SELECT
|
|
33
|
-
// above; `better-sqlite3`'s `.get()` return type is untyped by the driver.
|
|
34
|
-
const row = db
|
|
35
|
-
.prepare(`SELECT issues_hwm, issue_comments_hwm, pr_review_comments_hwm
|
|
36
|
-
FROM github_cursors WHERE tenant_id = ? AND repo_full_name = ?`)
|
|
37
|
-
.get(tenantId, repo);
|
|
38
|
-
return {
|
|
39
|
-
issues: row?.issues_hwm ?? null,
|
|
40
|
-
issueComments: row?.issue_comments_hwm ?? null,
|
|
41
|
-
prReviewComments: row?.pr_review_comments_hwm ?? null,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
finally {
|
|
45
|
-
closeHippoDb(db);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
function writeOneHwm(root, tenantId, repo, column, value) {
|
|
49
|
-
const db = openHippoDb(root);
|
|
50
|
-
try {
|
|
51
|
-
db.prepare(`INSERT INTO github_cursors (tenant_id, repo_full_name, ${column}, updated_at)
|
|
52
|
-
VALUES (?, ?, ?, ?)
|
|
53
|
-
ON CONFLICT(tenant_id, repo_full_name)
|
|
54
|
-
DO UPDATE SET ${column} = excluded.${column}, updated_at = excluded.updated_at`).run(tenantId, repo, value, new Date().toISOString());
|
|
55
|
-
}
|
|
56
|
-
finally {
|
|
57
|
-
closeHippoDb(db);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Build a synthetic `repository` object from the known repo full name.
|
|
62
|
-
* REST list endpoints often omit the full repository object on each item;
|
|
63
|
-
* we already know the repo since the caller passed it. `private` left
|
|
64
|
-
* undefined so scopeFromRepository falls through to private.
|
|
65
|
-
*/
|
|
66
|
-
function syntheticRepository(repoFullName) {
|
|
67
|
-
const [owner, name] = repoFullName.split('/');
|
|
68
|
-
return {
|
|
69
|
-
full_name: repoFullName,
|
|
70
|
-
name: name ?? repoFullName,
|
|
71
|
-
owner: { login: owner ?? repoFullName },
|
|
72
|
-
// private intentionally omitted — fail-safe to private scope.
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Parse the trailing issue/PR number from a REST API URL.
|
|
77
|
-
* e.g. https://api.github.com/repos/o/r/issues/42 -> 42
|
|
78
|
-
* https://api.github.com/repos/o/r/pulls/7 -> 7
|
|
79
|
-
*/
|
|
80
|
-
function parseTrailingNumber(url) {
|
|
81
|
-
if (!url)
|
|
82
|
-
return null;
|
|
83
|
-
const m = url.match(/\/(\d+)(?:\?.*)?$/);
|
|
84
|
-
if (!m)
|
|
85
|
-
return null;
|
|
86
|
-
const n = Number(m[1]);
|
|
87
|
-
return Number.isFinite(n) ? n : null;
|
|
88
|
-
}
|
|
89
|
-
function isPlainObject(x) {
|
|
90
|
-
return x !== undefined && x !== null && typeof x === 'object' && !Array.isArray(x);
|
|
91
|
-
}
|
|
92
|
-
function isGitHubUser(x) {
|
|
93
|
-
return isPlainObject(x) && typeof x.login === 'string' && typeof x.id === 'number';
|
|
94
|
-
}
|
|
95
|
-
function isIssuesItem(x) {
|
|
96
|
-
if (!isPlainObject(x))
|
|
97
|
-
return false;
|
|
98
|
-
if (typeof x.number !== 'number')
|
|
99
|
-
return false;
|
|
100
|
-
if (typeof x.title !== 'string')
|
|
101
|
-
return false;
|
|
102
|
-
return isGitHubUser(x.user);
|
|
103
|
-
}
|
|
104
|
-
function isCommentItem(x) {
|
|
105
|
-
if (!isPlainObject(x))
|
|
106
|
-
return false;
|
|
107
|
-
if (typeof x.id !== 'number')
|
|
108
|
-
return false;
|
|
109
|
-
return isGitHubUser(x.user);
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Drain one stream end-to-end. Pauses and retries on rate-limit. Throws on
|
|
113
|
-
* any other fetch error so the caller leaves the HWM unchanged (round 1
|
|
114
|
-
* codex P1 #3 crash safety).
|
|
115
|
-
*
|
|
116
|
-
* v1.3.1 (round 2 codex P1s + claude P1):
|
|
117
|
-
* - Tracks max(updated_at) across ALL fetched items, including ones
|
|
118
|
-
* `toIngestEvent` rejects (e.g., PRs returned via `/issues`). Otherwise
|
|
119
|
-
* a page of pure PRs would never advance the HWM and the next run would
|
|
120
|
-
* re-fetch the same window forever.
|
|
121
|
-
* - Returns `drained: boolean` — true only when the stream actually ran
|
|
122
|
-
* to next=null. Callers MUST NOT advance the HWM when drained=false.
|
|
123
|
-
* Was a bug in v1.3.0: hitting maxPerStream cap returned the partial
|
|
124
|
-
* maxUpdatedAt and the caller persisted it, skipping the unfetched tail.
|
|
125
|
-
*/
|
|
126
|
-
async function drainStream(ctx, url0, toIngestEvent, fetcher, token, sleep, maxItems) {
|
|
127
|
-
let url = url0;
|
|
128
|
-
let ingested = 0;
|
|
129
|
-
let pages = 0;
|
|
130
|
-
let maxUpdatedAt = null;
|
|
131
|
-
while (url) {
|
|
132
|
-
// Fetch with rate-limit retry loop.
|
|
133
|
-
let page;
|
|
134
|
-
while (true) {
|
|
135
|
-
page = await fetcher({ url, token });
|
|
136
|
-
if (page.rateLimit.reason !== 'none') {
|
|
137
|
-
await sleep(page.rateLimit.sleepSeconds * 1000);
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
142
|
-
pages++;
|
|
143
|
-
for (const item of page.items) {
|
|
144
|
-
// v1.3.1: track updated_at on EVERY item, before the toIngestEvent
|
|
145
|
-
// filter. Skipped PRs from /issues still contribute to the HWM so
|
|
146
|
-
// PR-only pages don't loop forever.
|
|
147
|
-
// SAFETY: updated_at is GitHub's ISO-timestamp field on every item
|
|
148
|
-
// shape this stream returns; a non-string value would only fail the
|
|
149
|
-
// string comparisons below, matching pre-migration passthrough.
|
|
150
|
-
const updatedAt = isPlainObject(item)
|
|
151
|
-
? (item.updated_at ?? null)
|
|
152
|
-
: null;
|
|
153
|
-
if (updatedAt && (!maxUpdatedAt || updatedAt > maxUpdatedAt)) {
|
|
154
|
-
maxUpdatedAt = updatedAt;
|
|
155
|
-
}
|
|
156
|
-
const evt = toIngestEvent(item);
|
|
157
|
-
if (!evt)
|
|
158
|
-
continue;
|
|
159
|
-
const r = ingestEvent(ctx, {
|
|
160
|
-
event: evt,
|
|
161
|
-
rawBody: JSON.stringify(item),
|
|
162
|
-
deliveryId: `backfill:${ctx.tenantId}:${updatedAt ?? ''}`,
|
|
163
|
-
});
|
|
164
|
-
if (r.status === 'ingested' || r.status === 'skipped')
|
|
165
|
-
ingested++;
|
|
166
|
-
if (maxItems && ingested >= maxItems) {
|
|
167
|
-
// Capped mid-stream: caller MUST NOT advance the HWM (drained=false).
|
|
168
|
-
return { ingested, pages, maxUpdatedAt, drained: false };
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
url = page.next;
|
|
172
|
-
}
|
|
173
|
-
return { ingested, pages, maxUpdatedAt, drained: true };
|
|
174
|
-
}
|
|
175
|
-
export async function backfillRepo(ctx, opts) {
|
|
176
|
-
const sleep = opts.sleepMs ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
177
|
-
const cursors = readCursor(ctx.hippoRoot, ctx.tenantId, opts.repoFullName);
|
|
178
|
-
const repository = syntheticRepository(opts.repoFullName);
|
|
179
|
-
const result = {
|
|
180
|
-
ingested: { issues: 0, issueComments: 0, prReviewComments: 0 },
|
|
181
|
-
pages: { issues: 0, issueComments: 0, prReviewComments: 0 },
|
|
182
|
-
};
|
|
183
|
-
// ---------- Stream 1: issues (skip PRs) ----------
|
|
184
|
-
const issuesUrl = `${API}/repos/${opts.repoFullName}/issues?state=all&per_page=100` +
|
|
185
|
-
(cursors.issues ? `&since=${encodeURIComponent(cursors.issues)}` : '');
|
|
186
|
-
const issuesRes = await drainStream(ctx, issuesUrl, (item) => {
|
|
187
|
-
if (!isIssuesItem(item))
|
|
188
|
-
return null;
|
|
189
|
-
// Codex P1 #2: /issues returns PRs too — skip them.
|
|
190
|
-
if (item.pull_request)
|
|
191
|
-
return null;
|
|
192
|
-
const payload = {
|
|
193
|
-
action: 'opened',
|
|
194
|
-
repository,
|
|
195
|
-
issue: {
|
|
196
|
-
number: item.number,
|
|
197
|
-
title: item.title,
|
|
198
|
-
body: item.body ?? null,
|
|
199
|
-
user: { login: item.user.login, id: item.user.id },
|
|
200
|
-
updated_at: item.updated_at,
|
|
201
|
-
},
|
|
202
|
-
};
|
|
203
|
-
return { eventName: 'issues', payload };
|
|
204
|
-
}, opts.fetcher, opts.token, sleep, opts.maxPerStream);
|
|
205
|
-
result.ingested.issues = issuesRes.ingested;
|
|
206
|
-
result.pages.issues = issuesRes.pages;
|
|
207
|
-
// v1.3.1: only advance HWM when the stream actually drained. A capped run
|
|
208
|
-
// (--max) must leave the HWM at its previous value so the next invocation
|
|
209
|
-
// re-fetches the unprocessed tail.
|
|
210
|
-
if (issuesRes.drained && issuesRes.maxUpdatedAt) {
|
|
211
|
-
writeOneHwm(ctx.hippoRoot, ctx.tenantId, opts.repoFullName, 'issues_hwm', issuesRes.maxUpdatedAt);
|
|
212
|
-
}
|
|
213
|
-
// ---------- Stream 2: repo-level issue comments ----------
|
|
214
|
-
const commentsUrl = `${API}/repos/${opts.repoFullName}/issues/comments?per_page=100` +
|
|
215
|
-
(cursors.issueComments
|
|
216
|
-
? `&since=${encodeURIComponent(cursors.issueComments)}`
|
|
217
|
-
: '');
|
|
218
|
-
const commentsRes = await drainStream(ctx, commentsUrl, (item) => {
|
|
219
|
-
if (!isCommentItem(item))
|
|
220
|
-
return null;
|
|
221
|
-
// SAFETY: this closure only runs against the /issues/comments stream,
|
|
222
|
-
// so every item isCommentItem validates here is genuinely an
|
|
223
|
-
// IssueCommentItem; a missing issue_url is handled defensively below.
|
|
224
|
-
const c = item;
|
|
225
|
-
const issueNumber = parseTrailingNumber(c.issue_url);
|
|
226
|
-
if (issueNumber === null)
|
|
227
|
-
return null;
|
|
228
|
-
const payload = {
|
|
229
|
-
action: 'created',
|
|
230
|
-
repository,
|
|
231
|
-
issue: { number: issueNumber },
|
|
232
|
-
comment: {
|
|
233
|
-
id: c.id,
|
|
234
|
-
body: c.body ?? null,
|
|
235
|
-
user: { login: c.user.login, id: c.user.id },
|
|
236
|
-
updated_at: c.updated_at,
|
|
237
|
-
},
|
|
238
|
-
};
|
|
239
|
-
return { eventName: 'issue_comment', payload };
|
|
240
|
-
}, opts.fetcher, opts.token, sleep, opts.maxPerStream);
|
|
241
|
-
result.ingested.issueComments = commentsRes.ingested;
|
|
242
|
-
result.pages.issueComments = commentsRes.pages;
|
|
243
|
-
if (commentsRes.drained && commentsRes.maxUpdatedAt) {
|
|
244
|
-
writeOneHwm(ctx.hippoRoot, ctx.tenantId, opts.repoFullName, 'issue_comments_hwm', commentsRes.maxUpdatedAt);
|
|
245
|
-
}
|
|
246
|
-
// ---------- Stream 3: repo-level PR review comments ----------
|
|
247
|
-
const prCommentsUrl = `${API}/repos/${opts.repoFullName}/pulls/comments?per_page=100` +
|
|
248
|
-
(cursors.prReviewComments
|
|
249
|
-
? `&since=${encodeURIComponent(cursors.prReviewComments)}`
|
|
250
|
-
: '');
|
|
251
|
-
const prCommentsRes = await drainStream(ctx, prCommentsUrl, (item) => {
|
|
252
|
-
if (!isCommentItem(item))
|
|
253
|
-
return null;
|
|
254
|
-
// SAFETY: this closure only runs against the /pulls/comments stream,
|
|
255
|
-
// so every item isCommentItem validates here is genuinely a
|
|
256
|
-
// PrReviewCommentItem; a missing pull_request_url is handled below.
|
|
257
|
-
const c = item;
|
|
258
|
-
const prNumber = parseTrailingNumber(c.pull_request_url);
|
|
259
|
-
if (prNumber === null)
|
|
260
|
-
return null;
|
|
261
|
-
const payload = {
|
|
262
|
-
action: 'created',
|
|
263
|
-
repository,
|
|
264
|
-
pull_request: { number: prNumber },
|
|
265
|
-
comment: {
|
|
266
|
-
id: c.id,
|
|
267
|
-
body: c.body ?? null,
|
|
268
|
-
user: { login: c.user.login, id: c.user.id },
|
|
269
|
-
updated_at: c.updated_at,
|
|
270
|
-
},
|
|
271
|
-
};
|
|
272
|
-
return { eventName: 'pull_request_review_comment', payload };
|
|
273
|
-
}, opts.fetcher, opts.token, sleep, opts.maxPerStream);
|
|
274
|
-
result.ingested.prReviewComments = prCommentsRes.ingested;
|
|
275
|
-
result.pages.prReviewComments = prCommentsRes.pages;
|
|
276
|
-
if (prCommentsRes.drained && prCommentsRes.maxUpdatedAt) {
|
|
277
|
-
writeOneHwm(ctx.hippoRoot, ctx.tenantId, opts.repoFullName, 'pr_review_comments_hwm', prCommentsRes.maxUpdatedAt);
|
|
278
|
-
}
|
|
279
|
-
return result;
|
|
280
|
-
}
|
|
281
|
-
//# sourceMappingURL=backfill.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../../../src/connectors/github/backfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Implementation of `hippo github` CLI subcommands. Extracted from the main
|
|
3
|
-
* cli.ts so unit tests can import these functions directly without triggering
|
|
4
|
-
* the cli.ts main() side effects. The cli.ts dispatcher re-exports the
|
|
5
|
-
* top-level cmdGithub.
|
|
6
|
-
*
|
|
7
|
-
* Subcommands mirror the Slack connector shape (cli.ts §Slack subcommands):
|
|
8
|
-
* - hippo github backfill --repo <owner/name> [--since ISO] [--max <N>]
|
|
9
|
-
* - hippo github dlq list
|
|
10
|
-
* - hippo github dlq replay <id> [--force]
|
|
11
|
-
*/
|
|
12
|
-
import { adminActor } from '../../api.js';
|
|
13
|
-
import { openHippoDb, closeHippoDb } from '../../db.js';
|
|
14
|
-
import { resolveTenantId } from '../../tenant.js';
|
|
15
|
-
import { backfillRepo } from './backfill.js';
|
|
16
|
-
import { realGitHubFetcher } from './octokit-client.js';
|
|
17
|
-
import { listDlq, replayDlqEntry } from './dlq.js';
|
|
18
|
-
import { ingestEvent } from './ingest.js';
|
|
19
|
-
import { handleCommentDeleted } from './deletion.js';
|
|
20
|
-
import { computeDeletionKey } from './signature.js';
|
|
21
|
-
import { isGitHubIssueEvent, isGitHubIssueCommentEvent, isGitHubPullRequestEvent, isGitHubPullRequestReviewCommentEvent, } from './types.js';
|
|
22
|
-
function isFlagString(value) {
|
|
23
|
-
return typeof value === 'string';
|
|
24
|
-
}
|
|
25
|
-
// FlagValue never includes `number` (see its declaration above), so a
|
|
26
|
-
// `value is number` predicate directly on FlagValue would not type-check —
|
|
27
|
-
// the generic wrapper narrows a value of any type T instead.
|
|
28
|
-
function isNumberLike(value) {
|
|
29
|
-
return typeof value === 'number';
|
|
30
|
-
}
|
|
31
|
-
function isFlagValueNumberLike(value) {
|
|
32
|
-
return isNumberLike(value);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Map a parsed envelope + eventName header to an IngestEvent discriminated
|
|
36
|
-
* union. Returns null for unknown event types or shapes that don't pass the
|
|
37
|
-
* type guards.
|
|
38
|
-
*/
|
|
39
|
-
function parsedToIngestEvent(parsed, eventName) {
|
|
40
|
-
if (eventName === 'issues' && isGitHubIssueEvent(parsed, eventName)) {
|
|
41
|
-
return { eventName: 'issues', payload: parsed };
|
|
42
|
-
}
|
|
43
|
-
if (eventName === 'issue_comment' && isGitHubIssueCommentEvent(parsed, eventName)) {
|
|
44
|
-
return { eventName: 'issue_comment', payload: parsed };
|
|
45
|
-
}
|
|
46
|
-
if (eventName === 'pull_request' && isGitHubPullRequestEvent(parsed, eventName)) {
|
|
47
|
-
return { eventName: 'pull_request', payload: parsed };
|
|
48
|
-
}
|
|
49
|
-
if (eventName === 'pull_request_review_comment' &&
|
|
50
|
-
isGitHubPullRequestReviewCommentEvent(parsed, eventName)) {
|
|
51
|
-
return { eventName: 'pull_request_review_comment', payload: parsed };
|
|
52
|
-
}
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
export function printGithubBackfillUsage() {
|
|
56
|
-
console.log('hippo github backfill --repo <owner/name> [--since ISO] [--max <N>]');
|
|
57
|
-
console.log(' --repo GitHub repository in owner/name format (required, e.g. acme/widgets)');
|
|
58
|
-
console.log(' --since Initial high-water-mark for first run (optional, ISO 8601)');
|
|
59
|
-
console.log(' --max Cap items per stream (optional, integer)');
|
|
60
|
-
console.log(' Requires GITHUB_TOKEN env var with repo read scope.');
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* `hippo github backfill`. The fetcher is injectable so tests can drive the
|
|
64
|
-
* code path without hitting the network. Defaults to `realGitHubFetcher`.
|
|
65
|
-
*/
|
|
66
|
-
export async function cmdGithubBackfill(hippoRoot, flags, fetcher = realGitHubFetcher) {
|
|
67
|
-
if (flags['help']) {
|
|
68
|
-
printGithubBackfillUsage();
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const repo = flags['repo'];
|
|
72
|
-
if (!isFlagString(repo) || !repo.includes('/')) {
|
|
73
|
-
printGithubBackfillUsage();
|
|
74
|
-
process.exit(2);
|
|
75
|
-
}
|
|
76
|
-
const token = process.env.GITHUB_TOKEN;
|
|
77
|
-
if (!token) {
|
|
78
|
-
console.error('GITHUB_TOKEN is not set. Backfill requires a personal access token with repo read scope.');
|
|
79
|
-
process.exit(2);
|
|
80
|
-
}
|
|
81
|
-
const maxRaw = flags['max'];
|
|
82
|
-
let maxPerStream;
|
|
83
|
-
if (isFlagString(maxRaw) || isFlagValueNumberLike(maxRaw)) {
|
|
84
|
-
const parsed = Number(maxRaw);
|
|
85
|
-
if (Number.isFinite(parsed) && parsed > 0) {
|
|
86
|
-
maxPerStream = Math.floor(parsed);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
const sinceFlag = flags['since'];
|
|
90
|
-
const sinceIso = isFlagString(sinceFlag) ? sinceFlag : undefined;
|
|
91
|
-
const tenantId = resolveTenantId({});
|
|
92
|
-
// Seed the github_cursors row so all 3 streams use --since on a fresh run.
|
|
93
|
-
// COALESCE preserves any existing HWM (subsequent runs ignore --since for
|
|
94
|
-
// streams that already drained at least once — same idempotency story as
|
|
95
|
-
// Slack's slack_cursors).
|
|
96
|
-
if (sinceIso) {
|
|
97
|
-
const db = openHippoDb(hippoRoot);
|
|
98
|
-
try {
|
|
99
|
-
db.prepare(`INSERT INTO github_cursors (tenant_id, repo_full_name, issues_hwm, issue_comments_hwm, pr_review_comments_hwm, updated_at)
|
|
100
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
101
|
-
ON CONFLICT(tenant_id, repo_full_name) DO UPDATE SET
|
|
102
|
-
issues_hwm = COALESCE(github_cursors.issues_hwm, excluded.issues_hwm),
|
|
103
|
-
issue_comments_hwm = COALESCE(github_cursors.issue_comments_hwm, excluded.issue_comments_hwm),
|
|
104
|
-
pr_review_comments_hwm = COALESCE(github_cursors.pr_review_comments_hwm, excluded.pr_review_comments_hwm),
|
|
105
|
-
updated_at = excluded.updated_at`).run(tenantId, repo, sinceIso, sinceIso, sinceIso, new Date().toISOString());
|
|
106
|
-
}
|
|
107
|
-
finally {
|
|
108
|
-
closeHippoDb(db);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
const ctx = {
|
|
112
|
-
hippoRoot,
|
|
113
|
-
tenantId,
|
|
114
|
-
actor: adminActor('cli:github-backfill'),
|
|
115
|
-
};
|
|
116
|
-
try {
|
|
117
|
-
const result = await backfillRepo(ctx, {
|
|
118
|
-
repoFullName: repo,
|
|
119
|
-
fetcher,
|
|
120
|
-
token,
|
|
121
|
-
maxPerStream,
|
|
122
|
-
});
|
|
123
|
-
console.log(JSON.stringify(result, null, 2));
|
|
124
|
-
}
|
|
125
|
-
catch (e) {
|
|
126
|
-
// SAFETY: this is a best-effort error message only; property access on
|
|
127
|
-
// any JS value is safe (undefined if absent), preserving the existing
|
|
128
|
-
// lenient formatting even when something non-Error was thrown.
|
|
129
|
-
console.error('backfill failed:', e.message);
|
|
130
|
-
process.exit(3);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
export function cmdGithubDlqList(hippoRoot, _flags) {
|
|
134
|
-
const db = openHippoDb(hippoRoot);
|
|
135
|
-
try {
|
|
136
|
-
const tenantId = resolveTenantId({});
|
|
137
|
-
const items = listDlq(db, { tenantId });
|
|
138
|
-
if (items.length === 0) {
|
|
139
|
-
console.log('no entries');
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
for (const it of items) {
|
|
143
|
-
console.log(`${it.id}\t${it.bucket}\t${it.tenantId}\t${it.eventName ?? '-'}\t${it.receivedAt}\t${it.error}`);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
finally {
|
|
147
|
-
closeHippoDb(db);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
export async function cmdGithubDlqReplay(hippoRoot, args, flags) {
|
|
151
|
-
const idArg = args[0];
|
|
152
|
-
if (!idArg) {
|
|
153
|
-
console.error('Usage: hippo github dlq replay <id> [--force]');
|
|
154
|
-
process.exit(1);
|
|
155
|
-
}
|
|
156
|
-
const id = Number(idArg);
|
|
157
|
-
if (!Number.isFinite(id) || !Number.isInteger(id) || id < 1) {
|
|
158
|
-
console.error(`replay: invalid id ${idArg}`);
|
|
159
|
-
process.exit(1);
|
|
160
|
-
}
|
|
161
|
-
const force = flags['force'] === true;
|
|
162
|
-
const ctx = {
|
|
163
|
-
hippoRoot,
|
|
164
|
-
tenantId: resolveTenantId({}),
|
|
165
|
-
actor: adminActor('cli:github-dlq-replay'),
|
|
166
|
-
};
|
|
167
|
-
// v1.3.1 hotfix (codex P1): without an ingestHook the v1.3.0 CLI was a
|
|
168
|
-
// dry-run that printed "replay ok" while only bumping retry_count. Wire the
|
|
169
|
-
// real hook so `replay` actually re-runs the ingest path.
|
|
170
|
-
const result = await replayDlqEntry(ctx, id, {
|
|
171
|
-
force,
|
|
172
|
-
webhookSecret: process.env.GITHUB_WEBHOOK_SECRET,
|
|
173
|
-
previousSecret: process.env.GITHUB_WEBHOOK_SECRET_PREVIOUS,
|
|
174
|
-
ingestHook: async (innerCtx, args) => {
|
|
175
|
-
const parsed = JSON.parse(args.rawPayload);
|
|
176
|
-
const event = parsedToIngestEvent(parsed, args.eventName);
|
|
177
|
-
if (!event) {
|
|
178
|
-
return { memoryId: null };
|
|
179
|
-
}
|
|
180
|
-
// v1.3.2 (codex round 3 P1): a replayed `issue_comment.deleted` or
|
|
181
|
-
// `pull_request_review_comment.deleted` row must route to the deletion
|
|
182
|
-
// handler, NOT to ingestEvent. The v1.3.1 hook unconditionally called
|
|
183
|
-
// ingestEvent and would have written the deleted comment as a NEW raw
|
|
184
|
-
// memory instead of archiving the matching ones.
|
|
185
|
-
if ((event.eventName === 'issue_comment' || event.eventName === 'pull_request_review_comment') &&
|
|
186
|
-
event.payload.action === 'deleted') {
|
|
187
|
-
const repo = event.payload.repository?.full_name ?? '';
|
|
188
|
-
const artifactRef = event.eventName === 'issue_comment'
|
|
189
|
-
? `github://${repo}/issue/${event.payload.issue.number}/comment/${event.payload.comment.id}`
|
|
190
|
-
: `github://${repo}/pull/${event.payload.pull_request.number}/review_comment/${event.payload.comment.id}`;
|
|
191
|
-
const idempotencyKey = computeDeletionKey(artifactRef, event.payload.comment.updated_at ?? null);
|
|
192
|
-
const r = handleCommentDeleted(innerCtx, {
|
|
193
|
-
artifactRef,
|
|
194
|
-
idempotencyKey,
|
|
195
|
-
deliveryId: args.deliveryId,
|
|
196
|
-
eventName: event.eventName,
|
|
197
|
-
});
|
|
198
|
-
// archivedCount maps to memoryId only loosely — return null since the
|
|
199
|
-
// archive operation can affect multiple rows. The replay-result audit
|
|
200
|
-
// trail is in github_dlq.retry_count + retried_at.
|
|
201
|
-
return { memoryId: r.archivedCount > 0 ? 'archived' : null };
|
|
202
|
-
}
|
|
203
|
-
const r = ingestEvent(innerCtx, {
|
|
204
|
-
event,
|
|
205
|
-
rawBody: args.rawPayload,
|
|
206
|
-
deliveryId: args.deliveryId,
|
|
207
|
-
});
|
|
208
|
-
return { memoryId: r.memoryId };
|
|
209
|
-
},
|
|
210
|
-
});
|
|
211
|
-
if (!result.ok) {
|
|
212
|
-
console.error(`replay failed: status=${result.status} retry_count=${result.retryCount}${result.reason ? ` reason=${result.reason}` : ''}`);
|
|
213
|
-
process.exit(1);
|
|
214
|
-
}
|
|
215
|
-
console.log(`replay ok: status=${result.status} memory_id=${result.memoryId ?? '(none)'} retry_count=${result.retryCount}`);
|
|
216
|
-
}
|
|
217
|
-
export async function cmdGithub(hippoRoot, args, flags) {
|
|
218
|
-
const sub = args[0];
|
|
219
|
-
if (sub === 'backfill') {
|
|
220
|
-
await cmdGithubBackfill(hippoRoot, flags);
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
if (sub === 'dlq' && args[1] === 'list') {
|
|
224
|
-
cmdGithubDlqList(hippoRoot, flags);
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
if (sub === 'dlq' && args[1] === 'replay') {
|
|
228
|
-
await cmdGithubDlqReplay(hippoRoot, args.slice(2), flags);
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
console.error('Usage: hippo github <backfill|dlq list|dlq replay <id> [--force]> [...]');
|
|
232
|
-
process.exit(1);
|
|
233
|
-
}
|
|
234
|
-
//# sourceMappingURL=cli-impl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-impl.js","sourceRoot":"","sources":["../../../../src/connectors/github/cli-impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { openHippoDb, closeHippoDb } from '../../db.js';
|
|
2
|
-
import { archiveRawMemory } from '../../raw-archive.js';
|
|
3
|
-
import { hasSeenKey, markKeySeen } from './idempotency.js';
|
|
4
|
-
/**
|
|
5
|
-
* Handle GitHub `issue_comment.deleted` and `pull_request_review_comment.deleted`.
|
|
6
|
-
*
|
|
7
|
-
* Codex round 1 P0 #5: filter by tenant_id + kind='raw'. Multi-row archive:
|
|
8
|
-
* GitHub edits keep the same artifact_ref, so multiple active raw rows can
|
|
9
|
-
* match a single deletion event. Archive ALL of them.
|
|
10
|
-
*
|
|
11
|
-
* Claude round 2 P0 #2 (v1.3.1 hotfix): the v1.3.0 implementation called
|
|
12
|
-
* archiveRaw N times in a loop, each opening its own DB handle and SAVEPOINT.
|
|
13
|
-
* The first archive's afterArchive committed the idempotency mark. If archive
|
|
14
|
-
* 2..N threw, idempotency was already committed and retry returned 'duplicate'
|
|
15
|
-
* with archivedCount=0 — survivors stayed searchable, leaking private bodies.
|
|
16
|
-
*
|
|
17
|
-
* v1.3.1 fix: ONE shared DB handle wrapping ALL archives + the idempotency
|
|
18
|
-
* mark in a single outer SAVEPOINT. Any per-row failure rolls back the entire
|
|
19
|
-
* batch (including idempotency), so retry re-attempts cleanly. archiveRawMemory
|
|
20
|
-
* (the lower-level function from raw-archive.js) runs its own inner SAVEPOINT
|
|
21
|
-
* which nests safely inside the outer one.
|
|
22
|
-
*
|
|
23
|
-
* Tenant scope and kind='raw' filtering are load-bearing: without them a
|
|
24
|
-
* deletion event from tenant A could archive tenant B's row sharing the same
|
|
25
|
-
* artifact_ref, or accidentally target a distilled row.
|
|
26
|
-
*/
|
|
27
|
-
export function handleCommentDeleted(ctx, input) {
|
|
28
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
29
|
-
try {
|
|
30
|
-
if (hasSeenKey(db, input.idempotencyKey)) {
|
|
31
|
-
return { status: 'duplicate', archivedCount: 0 };
|
|
32
|
-
}
|
|
33
|
-
// SAFETY: rows come from the SELECT above, which projects only the
|
|
34
|
-
// `id` column, so each row is exactly `{ id: string }`.
|
|
35
|
-
const rows = db
|
|
36
|
-
.prepare(`SELECT id FROM memories WHERE artifact_ref = ? AND tenant_id = ? AND kind = 'raw'`)
|
|
37
|
-
.all(input.artifactRef, ctx.tenantId);
|
|
38
|
-
const memoryIds = rows.map((r) => r.id);
|
|
39
|
-
if (memoryIds.length === 0) {
|
|
40
|
-
// Nothing to archive — still mark idempotency so a retry returns 'duplicate'.
|
|
41
|
-
// Independent INSERT, no rollback needed.
|
|
42
|
-
markKeySeen(db, {
|
|
43
|
-
idempotencyKey: input.idempotencyKey,
|
|
44
|
-
deliveryId: input.deliveryId,
|
|
45
|
-
eventName: input.eventName,
|
|
46
|
-
memoryId: null,
|
|
47
|
-
});
|
|
48
|
-
return { status: 'archive_skipped_not_found', archivedCount: 0 };
|
|
49
|
-
}
|
|
50
|
-
// Outer SAVEPOINT wrapping all archives + the idempotency mark. Any throw
|
|
51
|
-
// rolls back the whole batch so retry sees neither archive nor mark — and
|
|
52
|
-
// re-attempts the full set.
|
|
53
|
-
db.exec('SAVEPOINT github_delete_all');
|
|
54
|
-
try {
|
|
55
|
-
for (const id of memoryIds) {
|
|
56
|
-
archiveRawMemory(db, id, {
|
|
57
|
-
reason: `source_deleted:github:${input.eventName}:${input.deliveryId}`,
|
|
58
|
-
who: ctx.actor.subject,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
markKeySeen(db, {
|
|
62
|
-
idempotencyKey: input.idempotencyKey,
|
|
63
|
-
deliveryId: input.deliveryId,
|
|
64
|
-
eventName: input.eventName,
|
|
65
|
-
memoryId: memoryIds[0],
|
|
66
|
-
});
|
|
67
|
-
db.exec('RELEASE SAVEPOINT github_delete_all');
|
|
68
|
-
}
|
|
69
|
-
catch (e) {
|
|
70
|
-
try {
|
|
71
|
-
db.exec('ROLLBACK TO SAVEPOINT github_delete_all');
|
|
72
|
-
db.exec('RELEASE SAVEPOINT github_delete_all');
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
// Best effort. Surface the original error.
|
|
76
|
-
}
|
|
77
|
-
throw e;
|
|
78
|
-
}
|
|
79
|
-
return { status: 'archived', archivedCount: memoryIds.length };
|
|
80
|
-
}
|
|
81
|
-
finally {
|
|
82
|
-
closeHippoDb(db);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=deletion.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deletion.js","sourceRoot":"","sources":["../../../../src/connectors/github/deletion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAsB3D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY,EAAE,KAAoB;IACrE,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;QACnD,CAAC;QAED,mEAAmE;QACnE,wDAAwD;QACxD,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN,mFAAmF,CACpF;aACA,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,CAA0B,CAAC;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAExC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,8EAA8E;YAC9E,0CAA0C;YAC1C,WAAW,CAAC,EAAE,EAAE;gBACd,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YACH,OAAO,EAAE,MAAM,EAAE,2BAA2B,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;QACnE,CAAC;QAED,0EAA0E;QAC1E,0EAA0E;QAC1E,4BAA4B;QAC5B,EAAE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC3B,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE;oBACvB,MAAM,EAAE,yBAAyB,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE;oBACtE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;YACL,CAAC;YACD,WAAW,CAAC,EAAE,EAAE;gBACd,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAE;aACxB,CAAC,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,EAAE,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;gBACnD,EAAE,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACjD,CAAC;YAAC,MAAM,CAAC;gBACP,2CAA2C;YAC7C,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;IACjE,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|