hippo-memory 1.69.0 → 1.71.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 +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -1,107 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { bumpGitHubDlqRetryCount, githubDlqEntry, listGitHubDlq, } from '../../store/connectors/github.js';
|
|
2
|
+
import { replayFailed } from '../dlq.js';
|
|
2
3
|
import { verifyGitHubSignature } from './signature.js';
|
|
3
4
|
import { isGitHubWebhookEnvelope } from './types.js';
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
installation_id, repo_full_name, received_at, bucket)
|
|
12
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
13
|
-
.run(opts.tenantId ?? '__unroutable__', rawPayload, redacted ? `${opts.error}; ${DLQ_REDACTED_NOTE}` : opts.error, opts.eventName ?? null, opts.deliveryId ?? null, redacted ? null : opts.signature ?? null, opts.installationId ?? null, opts.repoFullName ?? null, new Date().toISOString(), opts.bucket ?? 'parse_error');
|
|
14
|
-
return Number(result.lastInsertRowid);
|
|
15
|
-
}
|
|
16
|
-
const SELECT_COLUMNS = `id, tenant_id, raw_payload, error, event_name, delivery_id,
|
|
17
|
-
signature, installation_id, repo_full_name, retry_count,
|
|
18
|
-
received_at, retried_at, bucket`;
|
|
19
|
-
export function listDlq(db, opts) {
|
|
20
|
-
// SAFETY: rows come from the SELECT above (SELECT_COLUMNS), which projects
|
|
21
|
-
// exactly DlqRawRow's fields, in the same order github_dlq defines them.
|
|
22
|
-
const rows = db
|
|
23
|
-
.prepare(`SELECT ${SELECT_COLUMNS}
|
|
24
|
-
FROM github_dlq
|
|
25
|
-
WHERE tenant_id = ?
|
|
26
|
-
ORDER BY received_at ASC
|
|
27
|
-
LIMIT ?`)
|
|
28
|
-
.all(opts.tenantId, opts.limit ?? 100);
|
|
29
|
-
return rows.map(rowToItem);
|
|
30
|
-
}
|
|
31
|
-
export function getDlqEntry(db, id) {
|
|
32
|
-
// SAFETY: the row comes from the SELECT above (SELECT_COLUMNS), which
|
|
33
|
-
// projects exactly DlqRawRow's fields, in the same order github_dlq defines them.
|
|
34
|
-
const row = db
|
|
35
|
-
.prepare(`SELECT ${SELECT_COLUMNS}
|
|
36
|
-
FROM github_dlq
|
|
37
|
-
WHERE id = ?`)
|
|
38
|
-
.get(id);
|
|
39
|
-
if (!row)
|
|
40
|
-
return null;
|
|
41
|
-
return rowToItem(row);
|
|
42
|
-
}
|
|
43
|
-
function rowToItem(r) {
|
|
44
|
-
return {
|
|
45
|
-
id: Number(r.id),
|
|
46
|
-
tenantId: String(r.tenant_id),
|
|
47
|
-
rawPayload: String(r.raw_payload),
|
|
48
|
-
error: String(r.error),
|
|
49
|
-
eventName: r.event_name == null ? null : String(r.event_name),
|
|
50
|
-
deliveryId: r.delivery_id == null ? null : String(r.delivery_id),
|
|
51
|
-
signature: r.signature == null ? null : String(r.signature),
|
|
52
|
-
installationId: r.installation_id == null ? null : String(r.installation_id),
|
|
53
|
-
repoFullName: r.repo_full_name == null ? null : String(r.repo_full_name),
|
|
54
|
-
retryCount: Number(r.retry_count ?? 0),
|
|
55
|
-
receivedAt: String(r.received_at),
|
|
56
|
-
retriedAt: r.retried_at == null ? null : String(r.retried_at),
|
|
57
|
-
bucket: r.bucket == null ? 'parse_error' : String(r.bucket),
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function bumpRetryCount(hippoRoot, id) {
|
|
61
|
-
const db = openHippoDb(hippoRoot);
|
|
62
|
-
try {
|
|
63
|
-
db.prepare(`UPDATE github_dlq
|
|
64
|
-
SET retry_count = retry_count + 1,
|
|
65
|
-
retried_at = ?
|
|
66
|
-
WHERE id = ?`).run(new Date().toISOString(), id);
|
|
67
|
-
}
|
|
68
|
-
finally {
|
|
69
|
-
closeHippoDb(db);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Replay a DLQ row through the normal ingest path. Behavior:
|
|
74
|
-
* 1. Fetch row by id. Not found → `not_found`.
|
|
75
|
-
* 2. If !force and webhookSecret provided, verify signature with the
|
|
76
|
-
* current secret. Fail → bump retry_count, `sig_fail`.
|
|
77
|
-
* Missing signature on the row → `sig_missing` (no bump; --force required).
|
|
78
|
-
* 3. JSON.parse the raw payload. Fail → bump, `parse_error`.
|
|
79
|
-
* 4. Type-guard the envelope. Fail → bump, `unhandled`.
|
|
80
|
-
* 5. If an `ingestHook` is supplied, call it and return its memoryId.
|
|
81
|
-
* If not (dry-run path), bump retry_count and return status `replayed`
|
|
82
|
-
* with memoryId=null. The webhook route wires the real hook.
|
|
83
|
-
*
|
|
84
|
-
* Mirrors Slack's "always use current routing" policy: replays use the
|
|
85
|
-
* deployment state NOW, not at the time of original DLQing.
|
|
86
|
-
*/
|
|
5
|
+
/** GitHub's dead-letter table; the event, delivery, installation and repo columns let an operator triage a row without re-reading the payload. */
|
|
6
|
+
export const githubDlq = {
|
|
7
|
+
letter: (row) => ({ connector: 'github', ...row }),
|
|
8
|
+
list: listGitHubDlq,
|
|
9
|
+
};
|
|
10
|
+
/** Replay a DLQ row through the normal ingest path; a failed signature, parse or envelope check bumps retry_count.
|
|
11
|
+
* Without an `ingestHook` (dry-run) it bumps retry_count and returns `replayed` with memoryId=null; replays use today's routing, not the original's. */
|
|
87
12
|
export async function replayDlqEntry(ctx, id, opts = {}) {
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
row = getDlqEntry(db, id);
|
|
92
|
-
}
|
|
93
|
-
finally {
|
|
94
|
-
closeHippoDb(db);
|
|
95
|
-
}
|
|
96
|
-
if (!row) {
|
|
97
|
-
return {
|
|
98
|
-
ok: false,
|
|
99
|
-
status: 'not_found',
|
|
100
|
-
memoryId: null,
|
|
101
|
-
retryCount: 0,
|
|
102
|
-
reason: `dlq id ${id} not found`,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
13
|
+
const row = githubDlqEntry(ctx.hippoRoot, id);
|
|
14
|
+
if (!row)
|
|
15
|
+
return replayFailed('not_found', 0, `dlq id ${id} not found`);
|
|
105
16
|
// Signature verification (current secret, not the one in effect when DLQed).
|
|
106
17
|
if (!opts.force && opts.webhookSecret) {
|
|
107
18
|
const sigFailure = checkReplaySignature(ctx.hippoRoot, id, row, opts.webhookSecret, opts.previousSecret);
|
|
@@ -113,7 +24,7 @@ export async function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
113
24
|
return envelopeFailure;
|
|
114
25
|
// Without an ingest hook this is a dry-run validation. Bump and report.
|
|
115
26
|
if (!opts.ingestHook) {
|
|
116
|
-
|
|
27
|
+
bumpGitHubDlqRetryCount(ctx.hippoRoot, id);
|
|
117
28
|
return {
|
|
118
29
|
ok: true,
|
|
119
30
|
status: 'replayed',
|
|
@@ -122,9 +33,7 @@ export async function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
122
33
|
reason: 'dry-run: no ingest hook supplied',
|
|
123
34
|
};
|
|
124
35
|
}
|
|
125
|
-
// Real replay path
|
|
126
|
-
// idempotency, and writing the memory. The DLQ module only validates the
|
|
127
|
-
// surface and bumps the retry counter.
|
|
36
|
+
// Real replay path: the route's IngestHook owns routing, idempotency and the memory write; this module only validates and bumps the retry counter.
|
|
128
37
|
// No idempotencyKey arg: the hook re-derives it from the parsed event (artifact_ref + updated_at).
|
|
129
38
|
const eventName = row.eventName ?? '';
|
|
130
39
|
const deliveryId = row.deliveryId ?? '';
|
|
@@ -133,7 +42,7 @@ export async function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
133
42
|
eventName,
|
|
134
43
|
deliveryId,
|
|
135
44
|
});
|
|
136
|
-
|
|
45
|
+
bumpGitHubDlqRetryCount(ctx.hippoRoot, id);
|
|
137
46
|
return {
|
|
138
47
|
ok: true,
|
|
139
48
|
status: 'replayed',
|
|
@@ -144,13 +53,7 @@ export async function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
144
53
|
/** The failure result when the row cannot pass the signature gate, else null. */
|
|
145
54
|
function checkReplaySignature(hippoRoot, id, row, webhookSecret, previousSecret) {
|
|
146
55
|
if (!row.signature) {
|
|
147
|
-
return
|
|
148
|
-
ok: false,
|
|
149
|
-
status: 'sig_missing',
|
|
150
|
-
memoryId: null,
|
|
151
|
-
retryCount: row.retryCount,
|
|
152
|
-
reason: 'row has no signature (legacy, or redacted before storing); pass --force to replay',
|
|
153
|
-
};
|
|
56
|
+
return replayFailed('sig_missing', row.retryCount, 'row has no signature (legacy, or redacted before storing); pass --force to replay');
|
|
154
57
|
}
|
|
155
58
|
const sigOk = verifyGitHubSignature({
|
|
156
59
|
rawBody: row.rawPayload,
|
|
@@ -159,14 +62,8 @@ function checkReplaySignature(hippoRoot, id, row, webhookSecret, previousSecret)
|
|
|
159
62
|
previousSecret,
|
|
160
63
|
});
|
|
161
64
|
if (!sigOk) {
|
|
162
|
-
|
|
163
|
-
return
|
|
164
|
-
ok: false,
|
|
165
|
-
status: 'sig_fail',
|
|
166
|
-
memoryId: null,
|
|
167
|
-
retryCount: row.retryCount + 1,
|
|
168
|
-
reason: 'signature did not verify against current GITHUB_WEBHOOK_SECRET; pass --force to replay anyway',
|
|
169
|
-
};
|
|
65
|
+
bumpGitHubDlqRetryCount(hippoRoot, id);
|
|
66
|
+
return replayFailed('sig_fail', row.retryCount + 1, 'signature did not verify against current GITHUB_WEBHOOK_SECRET; pass --force to replay anyway');
|
|
170
67
|
}
|
|
171
68
|
return null;
|
|
172
69
|
}
|
|
@@ -177,28 +74,14 @@ function checkReplayEnvelope(hippoRoot, id, row) {
|
|
|
177
74
|
parsed = JSON.parse(row.rawPayload);
|
|
178
75
|
}
|
|
179
76
|
catch (e) {
|
|
180
|
-
|
|
181
|
-
// SAFETY:
|
|
182
|
-
// any JS value is safe (undefined if absent), preserving the existing
|
|
183
|
-
// lenient formatting even when something non-Error was thrown.
|
|
77
|
+
bumpGitHubDlqRetryCount(hippoRoot, id);
|
|
78
|
+
// SAFETY: best-effort error message only; property access on any JS value is safe, even for a non-Error throw.
|
|
184
79
|
const message = e.message;
|
|
185
|
-
return {
|
|
186
|
-
ok: false,
|
|
187
|
-
status: 'parse_error',
|
|
188
|
-
memoryId: null,
|
|
189
|
-
retryCount: row.retryCount + 1,
|
|
190
|
-
reason: `still unparseable: ${message}`,
|
|
191
|
-
};
|
|
80
|
+
return replayFailed('parse_error', row.retryCount + 1, `still unparseable: ${message}`);
|
|
192
81
|
}
|
|
193
82
|
if (!isGitHubWebhookEnvelope(parsed)) {
|
|
194
|
-
|
|
195
|
-
return
|
|
196
|
-
ok: false,
|
|
197
|
-
status: 'unhandled',
|
|
198
|
-
memoryId: null,
|
|
199
|
-
retryCount: row.retryCount + 1,
|
|
200
|
-
reason: 'not a GitHub webhook envelope',
|
|
201
|
-
};
|
|
83
|
+
bumpGitHubDlqRetryCount(hippoRoot, id);
|
|
84
|
+
return replayFailed('unhandled', row.retryCount + 1, 'not a GitHub webhook envelope');
|
|
202
85
|
}
|
|
203
86
|
return null;
|
|
204
87
|
}
|
|
@@ -1,37 +1,12 @@
|
|
|
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), 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:
|
|
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 `__testInjectBeforeLog` hook below lets tests pre-populate github_event_log
|
|
19
|
-
* inside the SAVEPOINT to exercise the changes=0 -> rollback path, not just the fast path.
|
|
20
|
-
*/
|
|
21
|
-
import { type Context } from '../../api.js';
|
|
22
|
-
import { type DatabaseSyncLike } from '../../db.js';
|
|
1
|
+
import { type Context } from '../../api/index.js';
|
|
23
2
|
import type { GitHubIssueEvent, GitHubIssueCommentEvent, GitHubPullRequestEvent, GitHubPullRequestReviewCommentEvent } from './types.js';
|
|
24
3
|
export type IngestStatus = 'ingested' | 'duplicate' | 'skipped' | 'skipped_duplicate';
|
|
25
4
|
export interface IngestResult {
|
|
26
5
|
status: IngestStatus;
|
|
27
6
|
memoryId: string | null;
|
|
28
7
|
}
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
* field MUST equal the X-GitHub-Event header value; computeIdempotencyKey
|
|
32
|
-
* folds it into the dedupe key so the same body posted under two different
|
|
33
|
-
* X-GitHub-Event headers produces two distinct keys (test 7).
|
|
34
|
-
*/
|
|
8
|
+
/** Discriminated union of the four event shapes V1 ingests; eventName MUST equal the X-GitHub-Event header,
|
|
9
|
+
* since computeIdempotencyKey folds it into the dedupe key. */
|
|
35
10
|
export type IngestEvent = {
|
|
36
11
|
eventName: 'issues';
|
|
37
12
|
payload: GitHubIssueEvent;
|
|
@@ -52,14 +27,6 @@ export interface IngestInput {
|
|
|
52
27
|
rawBody: string;
|
|
53
28
|
/** X-GitHub-Delivery header value, audit metadata only. */
|
|
54
29
|
deliveryId: string;
|
|
55
|
-
/**
|
|
56
|
-
* Test-only hook fired inside the SAVEPOINT, AFTER the memory row is
|
|
57
|
-
* inserted but BEFORE the github_event_log INSERT OR IGNORE. Tests pass
|
|
58
|
-
* a function that pre-inserts the github_event_log row using the
|
|
59
|
-
* provided db handle to simulate a concurrent worker winning the race.
|
|
60
|
-
* Production callers leave this undefined.
|
|
61
|
-
*/
|
|
62
|
-
__testInjectBeforeLog?: (db: DatabaseSyncLike, idempotencyKey: string) => void;
|
|
63
30
|
}
|
|
64
|
-
export declare function ingestEvent(ctx: Context, input: IngestInput): IngestResult
|
|
31
|
+
export declare function ingestEvent(ctx: Context, input: IngestInput): Promise<IngestResult>;
|
|
65
32
|
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -1,27 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* idempotency by rotating the delivery UUID.
|
|
8
|
-
*
|
|
9
|
-
* Race semantics:
|
|
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 `__testInjectBeforeLog` hook below lets tests pre-populate github_event_log
|
|
19
|
-
* inside the SAVEPOINT to exercise the changes=0 -> rollback path, not just the fast path.
|
|
20
|
-
*/
|
|
21
|
-
import { remember } from '../../api.js';
|
|
22
|
-
import { openHippoDb, closeHippoDb } from '../../db.js';
|
|
23
|
-
import { RejectedValueError } from '../../rejection.js';
|
|
24
|
-
import { hasSeenKey, lookupMemoryByKey, DuplicateIdempotencyError } from './idempotency.js';
|
|
1
|
+
// GitHub event ingest, once per idempotency key. The key comes from the event's own content, never from the unsigned
|
|
2
|
+
// X-GitHub-Delivery header, so a replay cannot get past it by rotating the delivery id. The pre-check is only the fast path:
|
|
3
|
+
// the store logs the key in the memory's own transaction, which is what holds when two workers race.
|
|
4
|
+
import { remember } from '../../api/index.js';
|
|
5
|
+
import { requireGroup, storeFor } from '../../store/index.js';
|
|
6
|
+
import { RejectedValueError } from '../../store/rejection.js';
|
|
25
7
|
import { computeIdempotencyKey } from './signature.js';
|
|
26
8
|
import { issueEventToRememberOpts, issueCommentEventToRememberOpts, pullRequestEventToRememberOpts, prReviewCommentEventToRememberOpts, } from './transform.js';
|
|
27
9
|
function transformEvent(event) {
|
|
@@ -36,12 +18,8 @@ function transformEvent(event) {
|
|
|
36
18
|
return prReviewCommentEventToRememberOpts(event.payload);
|
|
37
19
|
}
|
|
38
20
|
}
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
* Backfill and webhook both produce IngestEvent objects describing the same
|
|
42
|
-
* source revision, so deriving the key from these fields collapses both paths
|
|
43
|
-
* onto the same dedupe row. Mirrors the artifactRef strings in transform.ts.
|
|
44
|
-
*/
|
|
21
|
+
/** Extract the source-normalized identifier the idempotency key needs, so backfill and webhook deliveries of the same
|
|
22
|
+
* source revision collapse onto one dedupe row. Mirrors the artifactRef strings in transform.ts. */
|
|
45
23
|
function eventArtifactRef(event) {
|
|
46
24
|
const repo = event.payload.repository?.full_name ?? 'unknown/unknown';
|
|
47
25
|
switch (event.eventName) {
|
|
@@ -67,87 +45,40 @@ function eventUpdatedAt(event) {
|
|
|
67
45
|
return event.payload.comment.updated_at ?? null;
|
|
68
46
|
}
|
|
69
47
|
}
|
|
70
|
-
|
|
71
|
-
|
|
48
|
+
export async function ingestEvent(ctx, input) {
|
|
49
|
+
const events = requireGroup(storeFor(ctx), 'connectorEvents');
|
|
72
50
|
const idempotencyKey = computeIdempotencyKey(eventArtifactRef(input.event), eventUpdatedAt(input.event));
|
|
51
|
+
const event = { connector: 'github', idempotencyKey, deliveryId: input.deliveryId, eventName: input.event.eventName };
|
|
73
52
|
// Fast path: pre-check. Avoids running the transform / opening a write tx
|
|
74
53
|
// for the common already-seen case (GitHub auto-retries with the same body).
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return { status: 'duplicate', memoryId: lookupMemoryByKey(db, idempotencyKey) };
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
finally {
|
|
82
|
-
closeHippoDb(db);
|
|
83
|
-
}
|
|
54
|
+
const seen = await events.eventRecord(event);
|
|
55
|
+
if (seen.seen)
|
|
56
|
+
return { status: 'duplicate', memoryId: seen.memoryId };
|
|
84
57
|
const opts = transformEvent(input.event);
|
|
85
58
|
if (!opts) {
|
|
86
|
-
// Empty body: no memory to write, but mark seen so a retry of the
|
|
87
|
-
|
|
88
|
-
// re-run the transform on every retry).
|
|
89
|
-
markKeySeenWithoutMemory(ctx.hippoRoot, idempotencyKey, input);
|
|
59
|
+
// Empty body: no memory to write, but mark seen so a retry returns 'duplicate' instead of re-running the transform.
|
|
60
|
+
await events.markEventSeen(event);
|
|
90
61
|
return { status: 'skipped', memoryId: null };
|
|
91
62
|
}
|
|
92
|
-
// Atomic write via afterWrite. Inside writeEntry's SAVEPOINT:
|
|
93
|
-
// 1. memories row INSERT lands.
|
|
94
|
-
// 2. (test-only) __testInjectBeforeLog can race-inject a colliding key.
|
|
95
|
-
// 3. INSERT OR IGNORE on github_event_log; if a concurrent worker (or
|
|
96
|
-
// the test injection) beat us, changes=0 -> throw -> SAVEPOINT rolls
|
|
97
|
-
// back our memory row. Other worker's commit stands.
|
|
98
63
|
try {
|
|
99
|
-
return rememberWithEventLog(ctx,
|
|
64
|
+
return await rememberWithEventLog(ctx, event, opts);
|
|
100
65
|
}
|
|
101
66
|
catch (e) {
|
|
102
|
-
if (e instanceof DuplicateIdempotencyError) {
|
|
103
|
-
// Other worker's row is committed. Return its memory_id so callers
|
|
104
|
-
// behave identically to the fast-path 'duplicate' branch.
|
|
105
|
-
const db3 = openHippoDb(ctx.hippoRoot);
|
|
106
|
-
try {
|
|
107
|
-
return { status: 'skipped_duplicate', memoryId: lookupMemoryByKey(db3, idempotencyKey) };
|
|
108
|
-
}
|
|
109
|
-
finally {
|
|
110
|
-
closeHippoDb(db3);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
67
|
if (e instanceof RejectedValueError) {
|
|
114
68
|
// A tombstone hit is a PERMANENT skip, never DLQ-retried: mark the key seen like the empty-body
|
|
115
69
|
// branch above so a GitHub retry of the same delivery acks as done, not error.
|
|
116
|
-
|
|
70
|
+
await events.markEventSeen(event);
|
|
117
71
|
return { status: 'skipped', memoryId: null };
|
|
118
72
|
}
|
|
119
73
|
throw e;
|
|
120
74
|
}
|
|
121
75
|
}
|
|
122
|
-
function
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
finally {
|
|
130
|
-
closeHippoDb(db);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
function rememberWithEventLog(ctx, input, idempotencyKey, opts) {
|
|
134
|
-
// No `|| 'connector:github'` fallback (see rememberWithEventLog in slack/ingest.ts for rationale).
|
|
135
|
-
const result = remember({ ...ctx, store: undefined }, // the event log row commits with the memory on hippo.db's own handle, never through a store
|
|
136
|
-
{
|
|
137
|
-
...opts,
|
|
138
|
-
untrusted: true,
|
|
139
|
-
afterWrite: (innerDb, memoryId) => {
|
|
140
|
-
if (input.__testInjectBeforeLog) {
|
|
141
|
-
input.__testInjectBeforeLog(innerDb, idempotencyKey);
|
|
142
|
-
}
|
|
143
|
-
const inserted = innerDb
|
|
144
|
-
.prepare(INSERT_EVENT_LOG_SQL)
|
|
145
|
-
.run(idempotencyKey, input.deliveryId, input.event.eventName, new Date().toISOString(), memoryId);
|
|
146
|
-
if (Number(inserted.changes ?? 0) === 0) {
|
|
147
|
-
throw new DuplicateIdempotencyError(idempotencyKey);
|
|
148
|
-
}
|
|
149
|
-
},
|
|
150
|
-
});
|
|
76
|
+
async function rememberWithEventLog(ctx, event, opts) {
|
|
77
|
+
// No `|| 'connector:github'` fallback: the caller always builds ctx with the connector subject (same as slack/ingest.ts).
|
|
78
|
+
const result = await remember(ctx, { ...opts, untrusted: true, event });
|
|
79
|
+
// Another worker logged this key between the pre-check and the write: its memory stands and ours was not stored.
|
|
80
|
+
if (result.duplicate)
|
|
81
|
+
return { status: 'skipped_duplicate', memoryId: result.duplicate.memoryId };
|
|
151
82
|
return { status: 'ingested', memoryId: result.id };
|
|
152
83
|
}
|
|
153
84
|
//# sourceMappingURL=ingest.js.map
|
|
@@ -1,19 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Production uses `realGitHubFetcher` against `https://api.github.com`.
|
|
5
|
-
* Tests inject a fake `GitHubFetcher` so they never hit the network.
|
|
6
|
-
*
|
|
7
|
-
* Any non-200 response that is NOT a recognized rate-limit pause MUST throw
|
|
8
|
-
* `GitHubFetchError`: an empty page would be an empty backfill with no operator signal.
|
|
9
|
-
*/
|
|
1
|
+
/** Octokit-shaped HTTP fetcher for the GitHub backfill; tests inject a fake `GitHubFetcher`.
|
|
2
|
+
* Any non-200 that is not a recognised rate-limit pause MUST throw `GitHubFetchError`, since an empty page would be a silent empty backfill. */
|
|
10
3
|
import { type RateLimitInfo } from './ratelimit.js';
|
|
11
|
-
import type { JsonValue } from '../../json.js';
|
|
4
|
+
import type { JsonValue } from '../../util/json.js';
|
|
12
5
|
export declare class GitHubFetchError extends Error {
|
|
13
6
|
readonly status: number;
|
|
14
7
|
readonly bodyExcerpt: string;
|
|
15
8
|
readonly url: string;
|
|
16
|
-
constructor(status: number, bodyExcerpt: string, url: string);
|
|
9
|
+
constructor(status: number, bodyExcerpt: string, url: string, options?: ErrorOptions);
|
|
17
10
|
}
|
|
18
11
|
export interface GitHubBackfillPage {
|
|
19
12
|
readonly items: ReadonlyArray<JsonValue>;
|
|
@@ -24,12 +17,7 @@ export type GitHubFetcher = (args: {
|
|
|
24
17
|
url: string;
|
|
25
18
|
token: string;
|
|
26
19
|
}) => Promise<GitHubBackfillPage>;
|
|
27
|
-
/**
|
|
28
|
-
* Parse the rel="next" URL from an RFC 5988 `Link` header.
|
|
29
|
-
*
|
|
30
|
-
* Header format: `<url1>; rel="next", <url2>; rel="last"`.
|
|
31
|
-
* Returns the URL whose rel parameter is exactly `"next"`, or null.
|
|
32
|
-
*/
|
|
20
|
+
/** Parse the rel="next" URL from an RFC 5988 `Link` header, or null. */
|
|
33
21
|
export declare function parseNextLink(linkHeader: string): string | null;
|
|
34
22
|
export declare const realGitHubFetcher: GitHubFetcher;
|
|
35
23
|
//# sourceMappingURL=octokit-client.d.ts.map
|
|
@@ -1,32 +1,22 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Production uses `realGitHubFetcher` against `https://api.github.com`.
|
|
5
|
-
* Tests inject a fake `GitHubFetcher` so they never hit the network.
|
|
6
|
-
*
|
|
7
|
-
* Any non-200 response that is NOT a recognized rate-limit pause MUST throw
|
|
8
|
-
* `GitHubFetchError`: an empty page would be an empty backfill with no operator signal.
|
|
9
|
-
*/
|
|
1
|
+
/** Octokit-shaped HTTP fetcher for the GitHub backfill; tests inject a fake `GitHubFetcher`.
|
|
2
|
+
* Any non-200 that is not a recognised rate-limit pause MUST throw `GitHubFetchError`, since an empty page would be a silent empty backfill. */
|
|
10
3
|
import { parseRateLimit } from './ratelimit.js';
|
|
11
|
-
import { fetchWithRetry } from '../../http-retry.js';
|
|
4
|
+
import { fetchWithRetry } from '../../util/http-retry.js';
|
|
5
|
+
import { readCappedJson, readCappedText } from '../../util/capped-json.js';
|
|
6
|
+
import { errorMessage } from '../../util/log.js';
|
|
12
7
|
export class GitHubFetchError extends Error {
|
|
13
8
|
status;
|
|
14
9
|
bodyExcerpt;
|
|
15
10
|
url;
|
|
16
|
-
constructor(status, bodyExcerpt, url) {
|
|
17
|
-
super(`GitHub ${status} on ${url}: ${bodyExcerpt}
|
|
11
|
+
constructor(status, bodyExcerpt, url, options) {
|
|
12
|
+
super(`GitHub ${status} on ${url}: ${bodyExcerpt}`, options);
|
|
18
13
|
this.status = status;
|
|
19
14
|
this.bodyExcerpt = bodyExcerpt;
|
|
20
15
|
this.url = url;
|
|
21
16
|
this.name = 'GitHubFetchError';
|
|
22
17
|
}
|
|
23
18
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Parse the rel="next" URL from an RFC 5988 `Link` header.
|
|
26
|
-
*
|
|
27
|
-
* Header format: `<url1>; rel="next", <url2>; rel="last"`.
|
|
28
|
-
* Returns the URL whose rel parameter is exactly `"next"`, or null.
|
|
29
|
-
*/
|
|
19
|
+
/** Parse the rel="next" URL from an RFC 5988 `Link` header, or null. */
|
|
30
20
|
export function parseNextLink(linkHeader) {
|
|
31
21
|
if (!linkHeader)
|
|
32
22
|
return null;
|
|
@@ -43,6 +33,24 @@ function headersToRecord(h) {
|
|
|
43
33
|
}
|
|
44
34
|
const GITHUB_TIMEOUT_MS = 30_000;
|
|
45
35
|
const ERROR_BODY_SNIPPET_CHARS = 256;
|
|
36
|
+
const UTF8_MAX_BYTES_PER_CHAR = 4;
|
|
37
|
+
// A page is at most 100 items (per_page=100), each with a body of up to 65,536 characters at 4 bytes, plus its fields.
|
|
38
|
+
const GITHUB_MAX_REPLY_BYTES = 32 * 1024 * 1024;
|
|
39
|
+
/** The items of a 200 list reply. A body that is not JSON, is over the cap or is not an array throws, so it never reaches ingest as items. */
|
|
40
|
+
async function readItems(res, url) {
|
|
41
|
+
// The path only: a `next` link comes from the server, so its query string is not ours to print.
|
|
42
|
+
const path = new URL(url).pathname;
|
|
43
|
+
let body;
|
|
44
|
+
try {
|
|
45
|
+
body = await readCappedJson(res, GITHUB_MAX_REPLY_BYTES);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
throw new GitHubFetchError(res.status, errorMessage(err), path, { cause: err });
|
|
49
|
+
}
|
|
50
|
+
if (!Array.isArray(body))
|
|
51
|
+
throw new GitHubFetchError(res.status, 'the reply is not a JSON array', path);
|
|
52
|
+
return body;
|
|
53
|
+
}
|
|
46
54
|
export const realGitHubFetcher = async ({ url, token }) => {
|
|
47
55
|
const res = await fetchWithRetry(url, {
|
|
48
56
|
headers: {
|
|
@@ -55,15 +63,11 @@ export const realGitHubFetcher = async ({ url, token }) => {
|
|
|
55
63
|
const rateLimit = parseRateLimit(headers, res.status);
|
|
56
64
|
// Don't silently turn 401/403/404/500 into empty pages.
|
|
57
65
|
if (res.status !== 200 && rateLimit.reason === 'none') {
|
|
58
|
-
|
|
66
|
+
// The status is the error reported; a body that cannot be read only costs its snippet.
|
|
67
|
+
const body = await readCappedText(res, ERROR_BODY_SNIPPET_CHARS * UTF8_MAX_BYTES_PER_CHAR).catch(() => '');
|
|
59
68
|
throw new GitHubFetchError(res.status, body.slice(0, ERROR_BODY_SNIPPET_CHARS), url);
|
|
60
69
|
}
|
|
61
|
-
|
|
62
|
-
// only endpoints this backfill fetcher targets) return a JSON array body
|
|
63
|
-
// on 200; per-item shape is intentionally left as `unknown` here since
|
|
64
|
-
// GitHubBackfillPage.items is opaque to this seam (callers parse the
|
|
65
|
-
// shape they expect downstream).
|
|
66
|
-
const items = res.status === 200 ? (await res.json()) : [];
|
|
70
|
+
const items = res.status === 200 ? await readItems(res, url) : [];
|
|
67
71
|
const link = res.headers.get('link') ?? '';
|
|
68
72
|
const next = parseNextLink(link);
|
|
69
73
|
return { items, next, rateLimit };
|
|
@@ -1,20 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
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
|
-
*/
|
|
1
|
+
/** GitHub rate-limit header parser: 403 with `X-RateLimit-Remaining: 0` is primary, 429 with `Retry-After` is secondary.
|
|
2
|
+
* Backfill must pause and resume rather than error. */
|
|
8
3
|
export interface RateLimitInfo {
|
|
9
4
|
readonly sleepSeconds: number;
|
|
10
5
|
readonly reason: 'primary' | 'secondary' | 'none';
|
|
11
6
|
}
|
|
12
|
-
/**
|
|
13
|
-
* Parse rate-limit signal from a GitHub HTTP response.
|
|
14
|
-
*
|
|
15
|
-
* @param headers Lower-cased HTTP response headers.
|
|
16
|
-
* @param status HTTP status code.
|
|
17
|
-
* @param now Optional current epoch seconds (for deterministic tests).
|
|
18
|
-
*/
|
|
7
|
+
/** Parse the rate-limit signal from a GitHub response; `headers` are lower-cased and `now` (epoch seconds) is for deterministic tests. */
|
|
19
8
|
export declare function parseRateLimit(headers: Record<string, string | undefined>, status: number, now?: number): RateLimitInfo;
|
|
20
9
|
//# sourceMappingURL=ratelimit.d.ts.map
|
|
@@ -1,17 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
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
|
-
*/
|
|
1
|
+
/** GitHub rate-limit header parser: 403 with `X-RateLimit-Remaining: 0` is primary, 429 with `Retry-After` is secondary.
|
|
2
|
+
* Backfill must pause and resume rather than error. */
|
|
3
|
+
/** Parse the rate-limit signal from a GitHub response; `headers` are lower-cased and `now` (epoch seconds) is for deterministic tests. */
|
|
15
4
|
export function parseRateLimit(headers, status, now) {
|
|
16
5
|
const _now = now ?? Math.floor(Date.now() / 1000);
|
|
17
6
|
if (status === 429) {
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import type { GitHubRepository } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* nothing) << cost of leaking private into public (data exposure).
|
|
6
|
-
*/
|
|
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). */
|
|
7
5
|
export declare function scopeFromRepository(repo: GitHubRepository | undefined): string;
|
|
8
6
|
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* nothing) << cost of leaking private into public (data exposure).
|
|
5
|
-
*/
|
|
1
|
+
/** Map a GitHub repository to a hippo scope string. Default-private when
|
|
2
|
+
* privacy is undetermined: cost of leaking public into private (recall returns
|
|
3
|
+
* nothing) << cost of leaking private into public (data exposure). */
|
|
6
4
|
export function scopeFromRepository(repo) {
|
|
7
5
|
if (!repo)
|
|
8
6
|
return 'github:private:unknown';
|