hippo-memory 2.0.0 → 2.1.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/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +32 -19
- package/dist/api/prompt-hook.js +65 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +28 -7
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +33 -14
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +45 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +23 -23
- package/dist/cli/auth.js +19 -27
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +4 -4
- package/dist/cli/object-verbs.js +10 -13
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +14 -6
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -5
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -6
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -6
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -6
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -5
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -6
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +24 -14
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +21 -16
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +84 -27
- package/dist/core/memory.js +73 -29
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -3
- package/dist/db/connect.js +8 -3
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +26 -13
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -4
- package/dist/db/physics-state.js +13 -20
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +19 -5
- package/dist/db/request-stores.js +14 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +19 -6
- package/dist/entry/store-kit.js +6 -4
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +16 -6
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +69 -34
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +8 -7
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +16 -9
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -7
- package/dist/learn/invalidation.js +56 -27
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +18 -14
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +57 -74
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +52 -21
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +9 -6
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +547 -93
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -19
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +75 -36
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +93 -60
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +8 -10
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +3 -1
- package/dist/store/index.js +1 -0
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +215 -229
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +9 -4
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.js +2 -1
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +84 -33
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -11
- package/dist/store/sqlite/store.js +84 -11
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +19 -12
- package/dist/store/summaries.js +36 -21
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +6 -3
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +24 -10
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +16 -4
- package/dist/util/env.js +78 -25
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +11 -3
- package/dist/util/request-scope.js +13 -4
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +3 -1
- package/dist/util/spawn-argv.js +13 -4
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -11
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -4
- package/dist/store/sqlite/local.js +0 -8
package/dist/cli.js
CHANGED
|
@@ -12,17 +12,18 @@ import { printGitHubBackfillUsage } from './cli/github.js';
|
|
|
12
12
|
import { printError } from './cli/output.js';
|
|
13
13
|
import { errorFields, errorMessage, isLevelEnabled, log } from './util/log.js';
|
|
14
14
|
import { STORE_BUSY_MESSAGE } from './store/port.js';
|
|
15
|
-
import { isStoreBusy } from './
|
|
15
|
+
import { isStoreBusy } from './api/busy.js';
|
|
16
16
|
import { flagIsTrue, isBooleanFlag, isStringFlag } from './cli/flag-values.js';
|
|
17
|
-
import { USAGE_HEADER, USAGE_EXAMPLES, printAuditPruneUsage, printSlackBackfillUsage, printSlackWorkspacesUsage } from './cli/usage.js';
|
|
17
|
+
import { USAGE_HEADER, USAGE_EXAMPLES, printAuditPruneUsage, printSlackBackfillUsage, printSlackWorkspacesUsage, } from './cli/usage.js';
|
|
18
18
|
import { flagKind, isKnownFlag, undeclaredFlags } from './cli/flags.js';
|
|
19
19
|
import { COMMANDS } from './cli/verbs.js';
|
|
20
|
-
import { CliExit } from './cli/exit.js';
|
|
21
|
-
// Helpers
|
|
20
|
+
import { CliExit, fail } from './cli/exit.js';
|
|
22
21
|
// A command that does not honour --dry-run would ignore it and run for real.
|
|
23
22
|
function dryRunRefusal(command, spec, args, flags) {
|
|
24
23
|
const only = spec?.dryRun;
|
|
25
|
-
const honoured = only === undefined
|
|
24
|
+
const honoured = only === undefined
|
|
25
|
+
? spec?.flags.switches?.includes('dry-run')
|
|
26
|
+
: only !== false && only.honoured(args, flags);
|
|
26
27
|
if (honoured)
|
|
27
28
|
return null;
|
|
28
29
|
const where = only ? ` outside \`hippo ${command} ${only.form}\`` : '';
|
|
@@ -59,7 +60,6 @@ function setSeparatedFlag(flags, key, next, kind) {
|
|
|
59
60
|
return 2;
|
|
60
61
|
}
|
|
61
62
|
if (!next || next.startsWith('--') || kind === 'switch') {
|
|
62
|
-
// Boolean flag
|
|
63
63
|
flags[key] = true;
|
|
64
64
|
return 1;
|
|
65
65
|
}
|
|
@@ -122,7 +122,7 @@ function maybeRepairCodexWrapper(currentCommand, flags) {
|
|
|
122
122
|
repairCodexWrapperIfInstalled();
|
|
123
123
|
}
|
|
124
124
|
catch (err) {
|
|
125
|
-
log.debug(`codex wrapper not repaired: ${errorMessage(err)}
|
|
125
|
+
log.debug(`codex wrapper not repaired: ${errorMessage(err)}`, errorFields(err));
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
const ROWS = Object.values(COMMANDS);
|
|
@@ -154,7 +154,6 @@ function printHelp(command, args) {
|
|
|
154
154
|
else
|
|
155
155
|
console.log(verbUsage(command) ?? usageText());
|
|
156
156
|
}
|
|
157
|
-
// Entry point
|
|
158
157
|
function printVersion() {
|
|
159
158
|
const __filename_local = fileURLToPath(import.meta.url);
|
|
160
159
|
const __dirname_local = path.dirname(__filename_local);
|
|
@@ -168,8 +167,7 @@ function printVersion() {
|
|
|
168
167
|
* reject it once here so every command, thin-client relays included, sees only a non-empty string. */
|
|
169
168
|
function rejectEmptyScope(flags) {
|
|
170
169
|
if ('scope' in flags && (!isStringFlag(flags['scope']) || !flags['scope'].trim())) {
|
|
171
|
-
|
|
172
|
-
throw new CliExit(1);
|
|
170
|
+
fail('--scope requires a non-empty value (e.g. --scope slack:private:C1).');
|
|
173
171
|
}
|
|
174
172
|
}
|
|
175
173
|
// parseArgs stores a value-less flag as boolean true, and NaN then survives every
|
|
@@ -179,8 +177,7 @@ function rejectNonNumericFlags(flags, declared) {
|
|
|
179
177
|
if (flagKind(declared, key) !== 'number')
|
|
180
178
|
continue;
|
|
181
179
|
if (!isStringFlag(raw) || !raw.trim() || !Number.isFinite(Number(raw))) {
|
|
182
|
-
|
|
183
|
-
throw new CliExit(1);
|
|
180
|
+
fail(`--${key} requires a numeric value.`);
|
|
184
181
|
}
|
|
185
182
|
}
|
|
186
183
|
}
|
|
@@ -189,8 +186,7 @@ function rejectNonNumericFlags(flags, declared) {
|
|
|
189
186
|
function rejectValuedSwitches(flags, declared) {
|
|
190
187
|
for (const [key, raw] of Object.entries(flags)) {
|
|
191
188
|
if (flagKind(declared, key) === 'switch' && !isBooleanFlag(raw)) {
|
|
192
|
-
|
|
193
|
-
throw new CliExit(1);
|
|
189
|
+
fail(`--${key} takes no value`);
|
|
194
190
|
}
|
|
195
191
|
}
|
|
196
192
|
}
|
|
@@ -207,8 +203,9 @@ function checkUnknownFlags(command, flags, spec) {
|
|
|
207
203
|
}
|
|
208
204
|
// main() refuses --dry-run by name on a verb without one, so that flag is not also called ignored.
|
|
209
205
|
const ignored = declared ? undeclaredFlags(declared, Object.keys(flags)).filter((key) => key !== 'dry-run') : unknown;
|
|
210
|
-
if (ignored.length > 0)
|
|
206
|
+
if (ignored.length > 0) {
|
|
211
207
|
printError(`hippo: ignoring unknown flag ${flagNames(ignored)}. A later release will reject it.`);
|
|
208
|
+
}
|
|
212
209
|
}
|
|
213
210
|
async function main(command, args, flags, hippoRoot) {
|
|
214
211
|
if (command === '--version' || command === '-v' || flags['version'])
|
|
@@ -239,7 +236,7 @@ async function main(command, args, flags, hippoRoot) {
|
|
|
239
236
|
throw new CliExit(1);
|
|
240
237
|
}
|
|
241
238
|
const run = () => spec.run({ hippoRoot, tenantId: resolveTenantId({}), args, flags });
|
|
242
|
-
await (spec.scoped ? (await import('./
|
|
239
|
+
await (spec.scoped ? (await import('./cli/api-context.js')).cliRequest(run) : run());
|
|
243
240
|
}
|
|
244
241
|
export async function runCli(argv = process.argv) {
|
|
245
242
|
const { command, args, flags } = parseArgs(argv);
|
package/dist/connectors/dlq.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { StoreWith } from '../store/index.js';
|
|
2
2
|
import type { ConnectorDeadLetter } from '../store/port.js';
|
|
3
3
|
import type { JsonValue } from '../util/json.js';
|
|
4
4
|
declare const DEFAULT_BUCKET = "parse_error";
|
|
@@ -19,8 +19,8 @@ export interface ParkedRow<Bucket extends string> {
|
|
|
19
19
|
bucket: Bucket | typeof DEFAULT_BUCKET;
|
|
20
20
|
signature: string | null;
|
|
21
21
|
}
|
|
22
|
-
/** What one connector supplies: the tag that names its table to the store, its list, its one-row read and its retry
|
|
23
|
-
* `Own` is the columns only its table has. */
|
|
22
|
+
/** What one connector supplies: the tag that names its table to the store, its list, its one-row read and its retry
|
|
23
|
+
* bump. `Own` is the columns only its table has. */
|
|
24
24
|
export interface ConnectorDlq<Own, Bucket extends string, Item> {
|
|
25
25
|
readonly letter: (row: ParkedRow<Bucket> & Own) => ConnectorDeadLetter;
|
|
26
26
|
readonly list: (hippoRoot: string, tenantId: string, limit: number) => Item[];
|
|
@@ -28,8 +28,7 @@ export interface ConnectorDlq<Own, Bucket extends string, Item> {
|
|
|
28
28
|
/** Adds one to `retry_count` and stamps `retried_at`. */
|
|
29
29
|
readonly bump: (hippoRoot: string, id: number) => void;
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
export declare function parkInDlq<Own, Bucket extends string>(dlq: ConnectorDlq<Own, Bucket, unknown>, hippoRoot: string, opts: ParkOpts<Bucket> & NoInfer<Own>, store?: HippoStore): Promise<number>;
|
|
31
|
+
export declare function parkInDlq<Own, Bucket extends string>(dlq: ConnectorDlq<Own, Bucket, unknown>, store: StoreWith<'connectorEvents'>, opts: ParkOpts<Bucket> & NoInfer<Own>): Promise<number>;
|
|
33
32
|
export declare function listDlq<Item>(dlq: ConnectorDlq<never, never, Item>, hippoRoot: string, opts: {
|
|
34
33
|
tenantId: string;
|
|
35
34
|
limit?: number;
|
|
@@ -74,7 +73,8 @@ export interface ReplaySteps<Item, Envelope extends JsonValue> {
|
|
|
74
73
|
readonly notEnvelope: string;
|
|
75
74
|
readonly reingest: (row: Item, envelope: Envelope) => Promise<Reingest>;
|
|
76
75
|
}
|
|
77
|
-
/** Re-runs a parked row under today's secret and routing; every
|
|
76
|
+
/** Re-runs a parked row under today's secret and routing; every
|
|
77
|
+
* attempt past the read is counted once, except a missing signature. */
|
|
78
78
|
export declare function replayParked<Item extends ParkedEntry, Envelope extends JsonValue>(steps: ReplaySteps<Item, Envelope>, hippoRoot: string, id: number, force: boolean): Promise<ReplayResult>;
|
|
79
79
|
export {};
|
|
80
80
|
//# sourceMappingURL=dlq.d.ts.map
|
package/dist/connectors/dlq.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
// The dead-letter queue every webhook connector parks into: one redaction, one unroutable sentinel, one set of
|
|
1
|
+
// The dead-letter queue every webhook connector parks into: one redaction, one unroutable sentinel, one set of
|
|
2
|
+
// defaults, one replay result.
|
|
2
3
|
import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
|
|
3
4
|
import { DLQ_REDACTED_NOTE, redactPayload } from '../util/secret-detect.js';
|
|
4
|
-
import { requireGroup } from '../store/index.js';
|
|
5
|
-
import { storeFor } from '../store/sqlite/store.js';
|
|
6
5
|
import { errorMessage } from '../util/log.js';
|
|
7
6
|
/** The tenant stored on a row no tenant was resolved for; the column is NOT NULL. */
|
|
8
7
|
const UNROUTABLE_TENANT = '__unroutable__';
|
|
9
8
|
const DEFAULT_BUCKET = 'parse_error';
|
|
10
|
-
|
|
11
|
-
export async function parkInDlq(dlq, hippoRoot, opts, store) {
|
|
9
|
+
export async function parkInDlq(dlq, store, opts) {
|
|
12
10
|
const rawPayload = redactPayload(opts.rawPayload);
|
|
13
11
|
// A redacted body can never match its signature, so the row keeps none and replay needs --force.
|
|
14
12
|
const redacted = rawPayload !== opts.rawPayload;
|
|
@@ -20,7 +18,7 @@ export async function parkInDlq(dlq, hippoRoot, opts, store) {
|
|
|
20
18
|
bucket: opts.bucket ?? DEFAULT_BUCKET,
|
|
21
19
|
signature: redacted ? null : opts.signature ?? null,
|
|
22
20
|
});
|
|
23
|
-
return
|
|
21
|
+
return store.connectorEvents.parkDeadLetter(letter);
|
|
24
22
|
}
|
|
25
23
|
export function listDlq(dlq, hippoRoot, opts) {
|
|
26
24
|
return dlq.list(hippoRoot, opts.tenantId, opts.limit ?? DEFAULT_LIST_LIMIT);
|
|
@@ -34,7 +32,8 @@ function failAndBump(dlq, hippoRoot, row, status, reason) {
|
|
|
34
32
|
dlq.bump(hippoRoot, row.id);
|
|
35
33
|
return replayFailed(status, row.retryCount + 1, reason);
|
|
36
34
|
}
|
|
37
|
-
/** Re-runs a parked row under today's secret and routing; every
|
|
35
|
+
/** Re-runs a parked row under today's secret and routing; every
|
|
36
|
+
* attempt past the read is counted once, except a missing signature. */
|
|
38
37
|
export async function replayParked(steps, hippoRoot, id, force) {
|
|
39
38
|
const row = steps.dlq.entry(hippoRoot, id);
|
|
40
39
|
if (!row)
|
|
@@ -57,7 +56,12 @@ export async function replayParked(steps, hippoRoot, id, force) {
|
|
|
57
56
|
if (!outcome.ok)
|
|
58
57
|
return failAndBump(steps.dlq, hippoRoot, row, outcome.status, outcome.reason);
|
|
59
58
|
steps.dlq.bump(hippoRoot, row.id);
|
|
60
|
-
const result = {
|
|
59
|
+
const result = {
|
|
60
|
+
ok: true,
|
|
61
|
+
status: outcome.status,
|
|
62
|
+
memoryId: outcome.memoryId,
|
|
63
|
+
retryCount: row.retryCount + 1,
|
|
64
|
+
};
|
|
61
65
|
if (outcome.reason !== undefined)
|
|
62
66
|
result.reason = outcome.reason;
|
|
63
67
|
return result;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/** Paginated backfill of the GitHub issues, issue-comments and PR-review-comments streams, each with its own
|
|
2
|
-
* An HWM is
|
|
1
|
+
/** Paginated backfill of the GitHub issues, issue-comments and PR-review-comments streams, each with its own HWM.
|
|
2
|
+
* An HWM (high-water mark) is saved only after its stream fully drains, so a crash in stream 2 keeps stream 1.
|
|
3
3
|
* `repository.private` is left undefined (REST lists omit it), so scopeFromRepository falls through to private. */
|
|
4
|
-
import type {
|
|
4
|
+
import type { ConnectorContext } from '../store.js';
|
|
5
5
|
import type { GitHubFetcher } from './octokit-client.js';
|
|
6
6
|
export interface BackfillOpts {
|
|
7
7
|
/** e.g. 'acme/repo'. */
|
|
@@ -24,5 +24,5 @@ export interface BackfillResult {
|
|
|
24
24
|
ingested: BackfillStreamCounts;
|
|
25
25
|
pages: BackfillStreamCounts;
|
|
26
26
|
}
|
|
27
|
-
export declare function backfillRepo(ctx:
|
|
27
|
+
export declare function backfillRepo(ctx: ConnectorContext, opts: BackfillOpts): Promise<BackfillResult>;
|
|
28
28
|
//# sourceMappingURL=backfill.d.ts.map
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
/** Paginated backfill of the GitHub issues, issue-comments and PR-review-comments streams, each with its own
|
|
2
|
-
* An HWM is
|
|
1
|
+
/** Paginated backfill of the GitHub issues, issue-comments and PR-review-comments streams, each with its own HWM.
|
|
2
|
+
* An HWM (high-water mark) is saved only after its stream fully drains, so a crash in stream 2 keeps stream 1.
|
|
3
3
|
* `repository.private` is left undefined (REST lists omit it), so scopeFromRepository falls through to private. */
|
|
4
4
|
import { readCursors, seedCursors, writeHwm } from '../../store/connectors/github.js';
|
|
5
5
|
import { ingestEvent } from './ingest.js';
|
|
6
6
|
import { isJsonObject } from '../../util/json.js';
|
|
7
|
+
import { MINUTE_MS } from '../../util/time.js';
|
|
7
8
|
const API = 'https://api.github.com';
|
|
8
9
|
/** Build a synthetic `repository` from the known repo full name, because REST list items often omit it.
|
|
9
10
|
* `private` stays undefined so scopeFromRepository falls through to private. */
|
|
@@ -82,9 +83,10 @@ async function drainStream(ctx, url0, options) {
|
|
|
82
83
|
}
|
|
83
84
|
return { ingested, pages, maxUpdatedAt, drained: true };
|
|
84
85
|
}
|
|
85
|
-
// A reset hours away must fail the run for a later rerun; sleeping
|
|
86
|
+
// A reset hours away must fail the run for a later rerun; sleeping
|
|
87
|
+
// through it would hold the process for the whole window.
|
|
86
88
|
const MAX_RATE_LIMIT_ATTEMPTS = 5;
|
|
87
|
-
const MAX_RATE_LIMIT_WAIT_MS = 10 *
|
|
89
|
+
const MAX_RATE_LIMIT_WAIT_MS = 10 * MINUTE_MS;
|
|
88
90
|
async function fetchPagePastRateLimit(options, url) {
|
|
89
91
|
const { fetcher, token, sleep } = options;
|
|
90
92
|
let waitedMs = 0;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ConnectorContext } from '../store.js';
|
|
2
2
|
export interface DeletionInput {
|
|
3
3
|
/** artifact_ref of the comment, e.g. 'github://acme/repo/issue/42/comment/123'
|
|
4
4
|
* or 'github://acme/repo/pull/7/review_comment/456'. */
|
|
@@ -15,7 +15,9 @@ export interface DeletionResult {
|
|
|
15
15
|
status: DeletionStatus;
|
|
16
16
|
archivedCount: number;
|
|
17
17
|
}
|
|
18
|
-
/** Handle `issue_comment.deleted` and `pull_request_review_comment.deleted`:
|
|
19
|
-
*
|
|
20
|
-
|
|
18
|
+
/** Handle `issue_comment.deleted` and `pull_request_review_comment.deleted`:
|
|
19
|
+
* archive ALL active raw rows for the artifact_ref in one write. Tenant and
|
|
20
|
+
* kind='raw' filtering are load-bearing: without them a deletion could
|
|
21
|
+
* archive another tenant's row or a distilled row. */
|
|
22
|
+
export declare function handleCommentDeleted(ctx: ConnectorContext, input: DeletionInput): Promise<DeletionResult>;
|
|
21
23
|
//# sourceMappingURL=deletion.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*
|
|
1
|
+
/** Handle `issue_comment.deleted` and `pull_request_review_comment.deleted`:
|
|
2
|
+
* archive ALL active raw rows for the artifact_ref in one write. Tenant and
|
|
3
|
+
* kind='raw' filtering are load-bearing: without them a deletion could
|
|
4
|
+
* archive another tenant's row or a distilled row. */
|
|
5
5
|
export async function handleCommentDeleted(ctx, input) {
|
|
6
6
|
const { artifactRef, idempotencyKey, deliveryId, eventName } = input;
|
|
7
|
-
const done = await
|
|
7
|
+
const done = await ctx.store.connectorEvents.archiveDeletedArtifact({
|
|
8
8
|
tenantId: ctx.tenantId,
|
|
9
9
|
actor: ctx.actor.subject,
|
|
10
10
|
artifactRef,
|
|
@@ -1,21 +1,23 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ConnectorContext } from '../store.js';
|
|
2
2
|
import { type DlqBucket, type DlqItem, type GitHubDlqInsert } from '../../store/connectors/github.js';
|
|
3
3
|
import { type ConnectorDlq, type ReplayResult } from '../dlq.js';
|
|
4
4
|
export type { DlqBucket, DlqItem };
|
|
5
5
|
type GitHubOwnColumns = Pick<GitHubDlqInsert, 'eventName' | 'deliveryId' | 'installationId' | 'repoFullName'>;
|
|
6
|
-
/** GitHub's dead-letter table; the event, delivery, installation and repo columns let an operator triage a row
|
|
6
|
+
/** GitHub's dead-letter table; the event, delivery, installation and repo columns let an operator triage a row
|
|
7
|
+
* without re-reading the payload. */
|
|
7
8
|
export declare const githubDlq: ConnectorDlq<GitHubOwnColumns, DlqBucket, DlqItem>;
|
|
8
9
|
export interface ReplayDlqOpts {
|
|
9
10
|
/** Current webhook secret. If omitted, signature check is skipped (force-only path). */
|
|
10
11
|
webhookSecret?: string;
|
|
11
|
-
/** Previous webhook secret during rotation, passed to verifyGitHubSignature.previousSecret so old-secret DLQ rows
|
|
12
|
+
/** Previous webhook secret during rotation, passed to verifyGitHubSignature.previousSecret so old-secret DLQ rows
|
|
13
|
+
* need no --force. */
|
|
12
14
|
previousSecret?: string;
|
|
13
15
|
/** When true, skip signature verification (used for legacy entries after secret rotation). */
|
|
14
16
|
force?: boolean;
|
|
15
17
|
}
|
|
16
18
|
/** Hook the webhook route injects to re-ingest a row, which keeps this module free of every event-type handler.
|
|
17
19
|
* No `idempotencyKey` field: ingest re-derives it from the parsed event, and a passed-in key could be stale. */
|
|
18
|
-
export type IngestHook = (ctx:
|
|
20
|
+
export type IngestHook = (ctx: ConnectorContext, args: {
|
|
19
21
|
rawPayload: string;
|
|
20
22
|
eventName: string;
|
|
21
23
|
deliveryId: string;
|
|
@@ -23,8 +25,8 @@ export type IngestHook = (ctx: Context, args: {
|
|
|
23
25
|
memoryId: string | null;
|
|
24
26
|
}>;
|
|
25
27
|
/** Replay a DLQ row through the normal ingest path; a failed signature, parse or envelope check bumps retry_count.
|
|
26
|
-
*
|
|
27
|
-
export declare function replayDlqEntry(ctx:
|
|
28
|
+
* No `ingestHook` (dry-run): bumps retry_count, returns `replayed` with memoryId=null. Replays use today's routing. */
|
|
29
|
+
export declare function replayDlqEntry(ctx: ConnectorContext, id: number, opts?: ReplayDlqOpts & {
|
|
28
30
|
ingestHook?: IngestHook;
|
|
29
31
|
}): Promise<ReplayResult>;
|
|
30
32
|
//# sourceMappingURL=dlq.d.ts.map
|
|
@@ -2,7 +2,8 @@ import { githubDlqEntry, markGitHubDlqRetried, listGitHubDlq, } from '../../stor
|
|
|
2
2
|
import { replayParked } from '../dlq.js';
|
|
3
3
|
import { verifyGitHubSignature } from './signature.js';
|
|
4
4
|
import { isGitHubWebhookEnvelope } from './types.js';
|
|
5
|
-
/** GitHub's dead-letter table; the event, delivery, installation and repo columns let an operator triage a row
|
|
5
|
+
/** GitHub's dead-letter table; the event, delivery, installation and repo columns let an operator triage a row
|
|
6
|
+
* without re-reading the payload. */
|
|
6
7
|
export const githubDlq = {
|
|
7
8
|
letter: (row) => ({ connector: 'github', ...row }),
|
|
8
9
|
list: listGitHubDlq,
|
|
@@ -10,7 +11,7 @@ export const githubDlq = {
|
|
|
10
11
|
bump: markGitHubDlqRetried,
|
|
11
12
|
};
|
|
12
13
|
/** Replay a DLQ row through the normal ingest path; a failed signature, parse or envelope check bumps retry_count.
|
|
13
|
-
*
|
|
14
|
+
* No `ingestHook` (dry-run): bumps retry_count, returns `replayed` with memoryId=null. Replays use today's routing. */
|
|
14
15
|
export async function replayDlqEntry(ctx, id, opts = {}) {
|
|
15
16
|
const { webhookSecret, previousSecret, ingestHook } = opts;
|
|
16
17
|
return replayParked({
|
|
@@ -20,8 +21,9 @@ export async function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
20
21
|
isEnvelope: isGitHubWebhookEnvelope,
|
|
21
22
|
notEnvelope: 'not a GitHub webhook envelope',
|
|
22
23
|
reingest: async (row) => {
|
|
23
|
-
if (!ingestHook)
|
|
24
|
+
if (!ingestHook) {
|
|
24
25
|
return { ok: true, status: 'replayed', memoryId: null, reason: 'dry-run: no ingest hook supplied' };
|
|
26
|
+
}
|
|
25
27
|
// The hook owns routing, idempotency and the memory write, and re-derives the key from the parsed event.
|
|
26
28
|
const { memoryId } = await ingestHook(ctx, {
|
|
27
29
|
rawPayload: row.rawPayload,
|
|
@@ -34,10 +36,14 @@ export async function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
34
36
|
}
|
|
35
37
|
function refuseSignature(row, webhookSecret, previousSecret) {
|
|
36
38
|
if (!row.signature) {
|
|
37
|
-
return {
|
|
39
|
+
return {
|
|
40
|
+
status: 'sig_missing',
|
|
41
|
+
reason: 'row has no signature (legacy, or redacted before storing); pass --force to replay',
|
|
42
|
+
};
|
|
38
43
|
}
|
|
39
|
-
if (verifyGitHubSignature({ rawBody: row.rawPayload, signature: row.signature, webhookSecret, previousSecret }))
|
|
44
|
+
if (verifyGitHubSignature({ rawBody: row.rawPayload, signature: row.signature, webhookSecret, previousSecret })) {
|
|
40
45
|
return null;
|
|
46
|
+
}
|
|
41
47
|
return {
|
|
42
48
|
status: 'sig_fail',
|
|
43
49
|
reason: 'signature did not verify against current GITHUB_WEBHOOK_SECRET; pass --force to replay anyway',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ConnectorContext } from '../store.js';
|
|
2
2
|
import { type IngestResult } from '../ingest.js';
|
|
3
3
|
import type { GitHubIssueEvent, GitHubIssueCommentEvent, GitHubPullRequestEvent, GitHubPullRequestReviewCommentEvent } from './types.js';
|
|
4
4
|
/** Discriminated union of the four event shapes V1 ingests; eventName MUST equal the X-GitHub-Event header,
|
|
@@ -24,5 +24,5 @@ export interface IngestInput {
|
|
|
24
24
|
/** X-GitHub-Delivery header value, audit metadata only. */
|
|
25
25
|
deliveryId: string;
|
|
26
26
|
}
|
|
27
|
-
export declare function ingestEvent(ctx:
|
|
27
|
+
export declare function ingestEvent(ctx: ConnectorContext, input: IngestInput): Promise<IngestResult>;
|
|
28
28
|
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -1,8 +1,6 @@
|
|
|
1
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
|
|
3
|
-
// the store logs the key in the memory's own transaction, which is what holds when two workers race.
|
|
4
|
-
import { requireGroup } from '../../store/index.js';
|
|
5
|
-
import { storeFor } from '../../store/sqlite/store.js';
|
|
2
|
+
// X-GitHub-Delivery header, so a replay cannot get past it by rotating the delivery id. The pre-check is only the fast
|
|
3
|
+
// path: the store logs the key in the memory's own transaction, which is what holds when two workers race.
|
|
6
4
|
import { rememberWithEventLog } from '../ingest.js';
|
|
7
5
|
import { computeIdempotencyKey } from './signature.js';
|
|
8
6
|
import { issueEventToRememberOpts, issueCommentEventToRememberOpts, pullRequestEventToRememberOpts, prReviewCommentEventToRememberOpts, } from './transform.js';
|
|
@@ -46,9 +44,14 @@ function eventUpdatedAt(event) {
|
|
|
46
44
|
}
|
|
47
45
|
}
|
|
48
46
|
export async function ingestEvent(ctx, input) {
|
|
49
|
-
const events =
|
|
47
|
+
const events = ctx.store.connectorEvents;
|
|
50
48
|
const idempotencyKey = computeIdempotencyKey(eventArtifactRef(input.event), eventUpdatedAt(input.event));
|
|
51
|
-
const event = {
|
|
49
|
+
const event = {
|
|
50
|
+
connector: 'github',
|
|
51
|
+
idempotencyKey,
|
|
52
|
+
deliveryId: input.deliveryId,
|
|
53
|
+
eventName: input.event.eventName,
|
|
54
|
+
};
|
|
52
55
|
// Fast path: pre-check. Avoids running the transform / opening a write tx
|
|
53
56
|
// for the common already-seen case (GitHub auto-retries with the same body).
|
|
54
57
|
const seen = await events.eventRecord(event);
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/** Octokit-shaped HTTP fetcher for the GitHub backfill; tests inject a fake `GitHubFetcher`.
|
|
2
|
-
*
|
|
2
|
+
* Any non-200 that is not a recognised rate-limit pause MUST throw `GitHubFetchError`, since an empty page would be a
|
|
3
|
+
* silent empty backfill.
|
|
4
|
+
*/
|
|
3
5
|
import { type RateLimitInfo } from './ratelimit.js';
|
|
4
6
|
import type { JsonValue } from '../../util/json.js';
|
|
5
7
|
export declare class GitHubFetchError extends Error {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/** Octokit-shaped HTTP fetcher for the GitHub backfill; tests inject a fake `GitHubFetcher`.
|
|
2
|
-
*
|
|
2
|
+
* Any non-200 that is not a recognised rate-limit pause MUST throw `GitHubFetchError`, since an empty page would be a
|
|
3
|
+
* silent empty backfill.
|
|
4
|
+
*/
|
|
3
5
|
import { parseRateLimit } from './ratelimit.js';
|
|
4
6
|
import { fetchWithRetry } from '../../util/http-retry.js';
|
|
5
7
|
import { readCappedJson, readCappedText } from '../../util/capped-json.js';
|
|
@@ -36,7 +38,10 @@ const ERROR_BODY_SNIPPET_CHARS = 256;
|
|
|
36
38
|
const UTF8_MAX_BYTES_PER_CHAR = 4;
|
|
37
39
|
// 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
40
|
const GITHUB_MAX_REPLY_BYTES = 32 * 1024 * 1024;
|
|
39
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* 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
|
|
43
|
+
* reaches ingest as items.
|
|
44
|
+
*/
|
|
40
45
|
async function readItems(res, url) {
|
|
41
46
|
// The path only: a `next` link comes from the server, so its query string is not ours to print.
|
|
42
47
|
const path = new URL(url).pathname;
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* GitHub rate-limit header parser: 403 with `X-RateLimit-Remaining: 0` is primary, 429 with `Retry-After` is secondary.
|
|
2
3
|
* Backfill must pause and resume rather than error. */
|
|
3
4
|
export interface RateLimitInfo {
|
|
4
5
|
readonly sleepSeconds: number;
|
|
5
6
|
readonly reason: 'primary' | 'secondary' | 'none';
|
|
6
7
|
}
|
|
7
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Parse the rate-limit signal from a GitHub response; `headers` are lower-cased and `now` (epoch seconds) is for
|
|
10
|
+
* deterministic tests.
|
|
11
|
+
*/
|
|
8
12
|
export declare function parseRateLimit(headers: Record<string, string | undefined>, status: number, now?: number): RateLimitInfo;
|
|
9
13
|
//# sourceMappingURL=ratelimit.d.ts.map
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* GitHub rate-limit header parser: 403 with `X-RateLimit-Remaining: 0` is primary, 429 with `Retry-After` is secondary.
|
|
2
3
|
* Backfill must pause and resume rather than error. */
|
|
3
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Parse the rate-limit signal from a GitHub response; `headers` are lower-cased and `now` (epoch seconds) is for
|
|
6
|
+
* deterministic tests.
|
|
7
|
+
*/
|
|
4
8
|
export function parseRateLimit(headers, status, now) {
|
|
5
9
|
const _now = now ?? Math.floor(Date.now() / 1000);
|
|
6
10
|
if (status === 429) {
|
|
@@ -6,11 +6,22 @@ export interface VerifyOpts {
|
|
|
6
6
|
/** Previous secret for rotation parity with Slack. Optional. */
|
|
7
7
|
previousSecret?: string;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* True for a header that could be a GitHub signature; anything else is refused before the body is read, since no secret
|
|
11
|
+
* can make it match.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isWellFormedGitHubSignature(signature: string): boolean;
|
|
9
14
|
export declare function verifyGitHubSignature(opts: VerifyOpts): boolean;
|
|
10
|
-
/**
|
|
11
|
-
*
|
|
15
|
+
/**
|
|
16
|
+
* Source-aware idempotency key: artifact_ref plus the source-side updated_at, so a webhook and a REST backfill of the
|
|
17
|
+
* SAME event dedupe.
|
|
18
|
+
* An edit gets a new key (a new revision); both inputs come from the parsed event, not the unsigned delivery header, so
|
|
19
|
+
* replays cannot bypass dedupe.
|
|
20
|
+
*/
|
|
12
21
|
export declare function computeIdempotencyKey(artifactRef: string, updatedAt: string | null | undefined): string;
|
|
13
22
|
/** Deletion idempotency key: sha256('deleted:' + artifactRef + ':' + updatedAt).
|
|
14
|
-
*
|
|
23
|
+
* A separate namespace so an ingest's event-log row cannot make a deletion return 'duplicate'; retries of the same
|
|
24
|
+
* deletion still dedupe.
|
|
25
|
+
*/
|
|
15
26
|
export declare function computeDeletionKey(artifactRef: string, updatedAt: string | null | undefined): string;
|
|
16
27
|
//# sourceMappingURL=signature.d.ts.map
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { createHmac, createHash, timingSafeEqual } from 'crypto';
|
|
2
|
+
const SIGNATURE_HEADER_RE = /^sha256=[0-9a-f]{64}$/;
|
|
3
|
+
/**
|
|
4
|
+
* True for a header that could be a GitHub signature; anything else is refused before the body is read, since no secret
|
|
5
|
+
* can make it match.
|
|
6
|
+
*/
|
|
7
|
+
export function isWellFormedGitHubSignature(signature) {
|
|
8
|
+
return SIGNATURE_HEADER_RE.test(signature);
|
|
9
|
+
}
|
|
2
10
|
function verifyOne(rawBody, signature, secret) {
|
|
3
11
|
if (!signature.startsWith('sha256='))
|
|
4
12
|
return false;
|
|
@@ -16,13 +24,19 @@ export function verifyGitHubSignature(opts) {
|
|
|
16
24
|
return true;
|
|
17
25
|
return false;
|
|
18
26
|
}
|
|
19
|
-
/**
|
|
20
|
-
*
|
|
27
|
+
/**
|
|
28
|
+
* Source-aware idempotency key: artifact_ref plus the source-side updated_at, so a webhook and a REST backfill of the
|
|
29
|
+
* SAME event dedupe.
|
|
30
|
+
* An edit gets a new key (a new revision); both inputs come from the parsed event, not the unsigned delivery header, so
|
|
31
|
+
* replays cannot bypass dedupe.
|
|
32
|
+
*/
|
|
21
33
|
export function computeIdempotencyKey(artifactRef, updatedAt) {
|
|
22
34
|
return createHash('sha256').update(`${artifactRef}:${updatedAt ?? ''}`).digest('hex');
|
|
23
35
|
}
|
|
24
36
|
/** Deletion idempotency key: sha256('deleted:' + artifactRef + ':' + updatedAt).
|
|
25
|
-
*
|
|
37
|
+
* A separate namespace so an ingest's event-log row cannot make a deletion return 'duplicate'; retries of the same
|
|
38
|
+
* deletion still dedupe.
|
|
39
|
+
*/
|
|
26
40
|
export function computeDeletionKey(artifactRef, updatedAt) {
|
|
27
41
|
return createHash('sha256').update(`deleted:${artifactRef}:${updatedAt ?? ''}`).digest('hex');
|
|
28
42
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { StoreWith } from '../../store/index.js';
|
|
2
2
|
export interface ResolveArgs {
|
|
3
3
|
/** String form of `installation.id`. `null`/`undefined` means "no installation field" (PAT-mode webhook). */
|
|
4
4
|
installationId?: string | null;
|
|
5
5
|
/** `repository.full_name` from the webhook envelope, used for PAT-mode multi-tenant routing. */
|
|
6
6
|
repoFullName?: string | null;
|
|
7
7
|
}
|
|
8
|
-
/** Resolve a GitHub envelope's tenant_id by installation id, then
|
|
9
|
-
*
|
|
10
|
-
|
|
8
|
+
/** Resolve a GitHub envelope's tenant_id by installation id, then
|
|
9
|
+
* repository.full_name; the HIPPO_TENANT fallback applies only if both tables are
|
|
10
|
+
* empty. An unknown installation or repo on a multi-tenant deployment returns
|
|
11
|
+
* null (fail closed); GITHUB_ALLOW_UNKNOWN_INSTALLATION_FALLBACK=1 escapes. */
|
|
12
|
+
export declare function resolveTenantForGitHub(store: StoreWith<'connectorEvents'>, args: ResolveArgs): Promise<string | null>;
|
|
11
13
|
//# sourceMappingURL=tenant-routing.d.ts.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { envGitHubAllowUnknownInstallationFallback, envTenant } from '../../util/env.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
export async function resolveTenantForGitHub(
|
|
2
|
+
/** Resolve a GitHub envelope's tenant_id by installation id, then
|
|
3
|
+
* repository.full_name; the HIPPO_TENANT fallback applies only if both tables are
|
|
4
|
+
* empty. An unknown installation or repo on a multi-tenant deployment returns
|
|
5
|
+
* null (fail closed); GITHUB_ALLOW_UNKNOWN_INSTALLATION_FALLBACK=1 escapes. */
|
|
6
|
+
export async function resolveTenantForGitHub(store, args) {
|
|
7
7
|
const envFallback = () => envTenant();
|
|
8
8
|
const escapeHatch = envGitHubAllowUnknownInstallationFallback();
|
|
9
|
-
const routing = await
|
|
9
|
+
const routing = await store.connectorEvents.githubRouting(args);
|
|
10
10
|
if (routing.tenant)
|
|
11
11
|
return routing.tenant;
|
|
12
12
|
if (args.installationId) {
|