hippo-memory 1.68.0 → 1.70.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 +6 -3
- 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 +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.d.ts +3 -1
- package/dist/agent-memories/copilot.js +5 -4
- package/dist/agent-memories/files.js +3 -2
- 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/report.d.ts +1 -1
- package/dist/agent-memories/report.js +1 -1
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +1 -1
- package/dist/agent-memories/sync.js +24 -33
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +2 -2
- package/dist/api/assemble.js +42 -32
- package/dist/api/audit.d.ts +4 -7
- package/dist/api/audit.js +6 -20
- package/dist/api/auth.d.ts +5 -18
- package/dist/api/auth.js +44 -194
- 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} +2 -2
- package/dist/{availability.js → api/availability.js} +12 -29
- 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 +14 -4
- package/dist/api/context-select.js +50 -60
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +113 -85
- package/dist/api/dormant.d.ts +3 -3
- package/dist/api/dormant.js +38 -107
- package/dist/api/drill-down.d.ts +2 -2
- package/dist/api/drill-down.js +37 -65
- package/dist/api/forget.d.ts +4 -13
- package/dist/api/forget.js +13 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/index.d.ts +26 -0
- package/dist/api/index.js +29 -0
- package/dist/api/instruction-detect.js +74 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +20 -0
- package/dist/api/ledger-db.js +79 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +36 -0
- package/dist/api/outcome.d.ts +9 -46
- package/dist/api/outcome.js +15 -57
- 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/promote.d.ts +7 -18
- package/dist/api/promote.js +30 -152
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
- package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +112 -0
- package/dist/{recall-history.js → api/recall-history.js} +30 -25
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
- 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 +41 -16
- package/dist/api/recall.d.ts +1 -1
- package/dist/api/recall.js +39 -37
- package/dist/api/remember.d.ts +12 -13
- package/dist/api/remember.js +38 -27
- 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 -7
- package/dist/api/sleep-run.js +63 -75
- package/dist/api/sleep.d.ts +1 -1
- package/dist/api/tokens.d.ts +2 -2
- package/dist/api/tokens.js +9 -21
- package/dist/api/types.d.ts +2 -2
- package/dist/api/types.js +1 -1
- 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 +1 -1
- package/dist/capture/command.js +54 -41
- 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 +4 -1
- package/dist/capture/compact.js +59 -22
- 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} +48 -94
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
- package/dist/capture/copilot-transcript.d.ts +3 -0
- package/dist/capture/copilot-transcript.js +9 -2
- 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} +1 -5
- package/dist/{session-digest.js → capture/session-digest.js} +17 -23
- 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.d.ts +13 -0
- package/dist/capture/session-worker.js +196 -0
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.js +68 -74
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
- package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +77 -72
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +18 -20
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +59 -181
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +25 -23
- package/dist/{client.d.ts → cli/client.d.ts} +1 -1
- package/dist/{client.js → cli/client.js} +1 -1
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +39 -0
- package/dist/cli/context.d.ts +2 -13
- package/dist/cli/context.js +41 -71
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +109 -99
- package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
- package/dist/cli/curate.d.ts +9 -9
- package/dist/cli/curate.js +177 -149
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +46 -34
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +108 -218
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +43 -31
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +35 -19
- package/dist/cli/flag-values.d.ts +25 -0
- package/dist/cli/flag-values.js +103 -0
- package/dist/cli/flags.d.ts +303 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +39 -34
- package/dist/cli/hook-runtime.d.ts +49 -0
- package/dist/cli/hook-runtime.js +155 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +151 -118
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +110 -0
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +9 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +31 -27
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +65 -0
- package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
- package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +77 -280
- package/dist/cli/print.d.ts +18 -0
- package/dist/cli/print.js +85 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -49
- package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +101 -150
- package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
- package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
- package/dist/cli/remember.d.ts +1 -3
- package/dist/cli/remember.js +124 -103
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
- package/dist/{scheduler.js → cli/scheduler.js} +13 -7
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +34 -4
- package/dist/cli/session-hooks.d.ts +4 -4
- package/dist/cli/session-hooks.js +265 -191
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +111 -45
- package/dist/cli/shared.d.ts +5 -95
- package/dist/cli/shared.js +18 -369
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +31 -55
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +2 -8
- package/dist/cli/sleep.js +20 -76
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +39 -41
- package/dist/{stdin.js → cli/stdin.js} +6 -6
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +68 -42
- package/dist/cli/usage.js +8 -3
- package/dist/cli.d.ts +289 -5
- package/dist/cli.js +184 -117
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +1 -1
- package/dist/connectors/github/backfill.js +29 -66
- package/dist/connectors/github/cli-impl.js +59 -74
- package/dist/connectors/github/deletion.d.ts +5 -6
- package/dist/connectors/github/deletion.js +18 -52
- package/dist/connectors/github/dlq.d.ts +7 -61
- package/dist/connectors/github/dlq.js +19 -119
- package/dist/connectors/github/ingest.d.ts +2 -31
- package/dist/connectors/github/ingest.js +20 -82
- package/dist/connectors/github/octokit-client.d.ts +1 -1
- package/dist/connectors/github/octokit-client.js +2 -1
- package/dist/connectors/github/tenant-routing.d.ts +2 -2
- package/dist/connectors/github/tenant-routing.js +10 -36
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/types.d.ts +1 -1
- package/dist/connectors/github/types.js +15 -18
- package/dist/connectors/github/webhook.d.ts +3 -2
- package/dist/connectors/github/webhook.js +84 -87
- package/dist/connectors/slack/backfill.d.ts +1 -1
- package/dist/connectors/slack/backfill.js +5 -29
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -48
- package/dist/connectors/slack/dlq.d.ts +7 -49
- package/dist/connectors/slack/dlq.js +25 -118
- package/dist/connectors/slack/ingest.d.ts +5 -18
- package/dist/connectors/slack/ingest.js +27 -90
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.js +13 -14
- package/dist/connectors/slack/transform.d.ts +1 -1
- package/dist/connectors/slack/types.d.ts +1 -1
- package/dist/connectors/slack/types.js +3 -12
- package/dist/connectors/slack/web-client.js +2 -2
- package/dist/connectors/slack/webhook.d.ts +3 -2
- package/dist/connectors/slack/webhook.js +75 -82
- package/dist/connectors/slack/workspaces.d.ts +4 -17
- package/dist/connectors/slack/workspaces.js +4 -34
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +4 -4
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
- package/dist/{dag.js → consolidate/dag.js} +60 -81
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +28 -22
- package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
- package/dist/consolidate/flush-units.d.ts +2 -2
- package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
- package/dist/consolidate/half-life-migration.js +106 -0
- package/dist/consolidate/llm-passes.js +8 -8
- package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
- package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
- package/dist/consolidate/merge.js +57 -54
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
- package/dist/consolidate/physics-pass.js +46 -46
- package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
- package/dist/{replay.js → consolidate/replay.js} +2 -2
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +1 -1
- package/dist/consolidate/sleep.js +64 -134
- package/dist/{trace.js → consolidate/trace.js} +4 -6
- package/dist/consolidate/traces.js +34 -29
- package/dist/{ablation.js → core/ablation.js} +1 -1
- 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.js → core/ambient.js} +12 -10
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/core/capture-contract.js +149 -0
- package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
- package/dist/{compare.js → core/compare.js} +10 -3
- package/dist/{config.d.ts → core/config.d.ts} +6 -6
- package/dist/{config.js → core/config.js} +99 -72
- package/dist/core/handoff.js +87 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
- package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
- package/dist/{memory.js → core/memory.js} +117 -82
- package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
- package/dist/{physics.js → core/physics.js} +2 -1
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
- package/dist/{project-identity.js → core/project-identity.js} +5 -17
- package/dist/{project-remote.js → core/project-remote.js} +4 -4
- package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
- package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
- package/dist/{salience.js → core/salience.js} +35 -20
- 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} +5 -5
- 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} +9 -9
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
- package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +18 -1
- package/dist/db/busy.js +74 -9
- package/dist/db/connect.d.ts +10 -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 +25 -30
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -35
- package/dist/db/migrations/v16.js +29 -26
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v20.js +4 -2
- package/dist/db/migrations/v22.js +39 -36
- package/dist/db/migrations/v24.js +27 -22
- package/dist/db/migrations/v29.js +37 -32
- package/dist/db/migrations/v31.js +36 -31
- package/dist/db/migrations/v35.js +1 -1
- package/dist/db/migrations/v39.js +1 -1
- package/dist/db/migrations/v40.js +15 -14
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +1 -1
- package/dist/db/migrations/v45.js +1 -1
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +1 -1
- 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/v52.js +1 -1
- package/dist/db/open.d.ts +9 -1
- package/dist/db/open.js +21 -4
- package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
- package/dist/{physics-state.js → db/physics-state.js} +9 -16
- package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
- 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} +4 -2
- package/dist/{vector-store.js → db/vector-store.js} +76 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +105 -136
- 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 +3 -3
- package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
- package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
- package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
- package/dist/{eval.js → eval/eval.js} +29 -22
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
- package/dist/{judgment.js → eval/judgment.js} +4 -9
- package/dist/extensions/openclaw-plugin/index.js +1 -2
- 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} +6 -6
- package/dist/{graph-extract.js → graph/extract.js} +37 -52
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
- package/dist/{graph-recall.js → graph/recall.js} +55 -36
- package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
- package/dist/{graph-stream.js → graph/stream.js} +9 -7
- package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
- package/dist/{graph-view.js → graph/view.js} +127 -167
- 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 +14 -15
- package/dist/hooks/copilot.d.ts +48 -13
- package/dist/hooks/copilot.js +124 -39
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +3 -1
- package/dist/hooks/json-hooks.js +40 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +7 -5
- package/dist/hooks/shared.js +19 -8
- package/dist/importers/core.d.ts +2 -6
- package/dist/importers/core.js +41 -39
- package/dist/importers/markdown-parse.d.ts +1 -10
- package/dist/importers/markdown-parse.js +2 -19
- package/dist/importers/markdown.js +2 -1
- package/dist/importers/sources.js +50 -46
- package/dist/importers/vault.js +71 -92
- package/dist/index.d.ts +22 -22
- package/dist/index.js +21 -21
- package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
- package/dist/{autolearn.js → learn/autolearn.js} +13 -11
- 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 +125 -0
- package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
- package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
- package/dist/{invalidation.js → learn/invalidation.js} +83 -99
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +37 -60
- 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.d.ts +2 -2
- package/dist/mcp/memory-tools.js +12 -31
- package/dist/mcp/protocol.d.ts +6 -10
- package/dist/mcp/protocol.js +8 -14
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +68 -50
- package/dist/mcp/request.js +65 -63
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/session-state.d.ts +1 -2
- package/dist/mcp/session-state.js +2 -2
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.js +69 -31
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +2 -2
- package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
- package/dist/objects/customer-notes.js +112 -0
- package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
- package/dist/objects/decisions.js +101 -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/{incidents.d.ts → objects/incidents.d.ts} +17 -44
- package/dist/objects/incidents.js +130 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
- package/dist/objects/policies.js +189 -0
- package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
- package/dist/objects/processes.js +146 -0
- package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
- package/dist/objects/project-briefs.js +255 -0
- package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
- package/dist/objects/skills.js +156 -0
- package/dist/postinstall.js +4 -2
- package/dist/predictions/planning-fallacy.d.ts +4 -76
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +27 -47
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +15 -23
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +30 -49
- package/dist/rerankers/llm.d.ts +2 -4
- package/dist/rerankers/llm.js +33 -50
- package/dist/rerankers/outage-warning.d.ts +7 -0
- package/dist/rerankers/outage-warning.js +31 -0
- package/dist/rerankers/remote.d.ts +3 -0
- package/dist/rerankers/remote.js +23 -0
- package/dist/rerankers/types.d.ts +1 -1
- 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 -1
- package/dist/search/boosts.js +34 -13
- 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/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +4 -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} +7 -5
- package/dist/{path-context.js → search/path-context.js} +3 -1
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +15 -15
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +3 -3
- package/dist/search/vector.js +17 -11
- package/dist/server/auth.d.ts +1 -1
- package/dist/server/auth.js +26 -18
- package/dist/server/boot.d.ts +24 -0
- package/dist/server/boot.js +465 -0
- package/dist/server/client-ip.d.ts +5 -1
- package/dist/server/client-ip.js +18 -6
- 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/key-check-bounds.d.ts +8 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.js +1 -1
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +34 -24
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +10 -4
- package/dist/server/request.js +63 -12
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +209 -0
- package/dist/server/routes/admin.js +13 -8
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +32 -97
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +42 -105
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +42 -95
- package/dist/server/routes/memories.js +21 -20
- package/dist/server/routes/object-routes.d.ts +40 -0
- package/dist/server/routes/object-routes.js +80 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +40 -124
- package/dist/server/routes/predictions.js +29 -45
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +38 -118
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +38 -110
- package/dist/server/routes/recall.js +14 -12
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +37 -125
- package/dist/{server-detect.js → server/server-detect.js} +3 -2
- 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 +70 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +27 -8
- package/dist/server/validation.d.ts +3 -4
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +41 -50
- package/dist/server.js +26 -560
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
- package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
- package/dist/{scope.js → sharing/scope.js} +1 -1
- package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
- package/dist/{shared.js → sharing/shared.js} +100 -77
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +10 -10
- package/dist/store/audit-event.d.ts +12 -6
- package/dist/store/audit-event.js +6 -5
- package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
- package/dist/{audit.js → store/audit.js} +91 -6
- package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
- package/dist/{auth.js → store/auth.js} +100 -92
- package/dist/store/candidates.d.ts +23 -12
- package/dist/store/candidates.js +87 -35
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
- package/dist/{card-detail.js → store/card-detail.js} +1 -1
- package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
- package/dist/{store-cards.js → store/cards.js} +85 -146
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +22 -5
- package/dist/store/conflicts.js +160 -109
- 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 +92 -0
- package/dist/store/delete-and-batch.d.ts +20 -24
- package/dist/store/delete-and-batch.js +64 -40
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
- 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 +51 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
- package/dist/{dormant.js → store/dormant.js} +151 -6
- package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
- package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
- package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
- package/dist/store/entry-reads.d.ts +46 -7
- package/dist/store/entry-reads.js +120 -21
- package/dist/store/entry-row.d.ts +8 -2
- package/dist/store/entry-row.js +28 -8
- package/dist/store/entry-writes.d.ts +33 -4
- package/dist/store/entry-writes.js +108 -26
- 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/{goals.d.ts → store/goals.d.ts} +6 -46
- package/dist/{goals.js → store/goals.js} +45 -94
- package/dist/store/graph-queue.d.ts +29 -0
- package/dist/store/graph-queue.js +101 -0
- package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
- package/dist/{graph/read.js → store/graph-reads.js} +63 -115
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
- package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
- package/dist/store/graph-view-rows.d.ts +12 -0
- package/dist/store/graph-view-rows.js +67 -0
- package/dist/store/graph-writes.d.ts +58 -0
- package/dist/store/graph-writes.js +256 -0
- package/dist/store/half-life.d.ts +34 -0
- package/dist/store/half-life.js +77 -0
- package/dist/store/handoffs.d.ts +6 -3
- package/dist/store/handoffs.js +70 -31
- package/dist/store/index-and-stats.d.ts +8 -1
- package/dist/store/index-and-stats.js +51 -48
- 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 +1 -1
- package/dist/store/markdown.js +4 -3
- package/dist/store/mirrors.d.ts +5 -7
- package/dist/store/mirrors.js +39 -25
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +8 -4
- package/dist/store/open.js +34 -23
- package/dist/store/planning-fallacy-evidence.d.ts +42 -0
- package/dist/store/planning-fallacy-evidence.js +81 -0
- package/dist/store/port.d.ts +646 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
- package/dist/{predictions/store.js → store/predictions.js} +52 -67
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
- package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
- package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
- package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +162 -0
- package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
- package/dist/{rejection.js → store/rejection.js} +3 -2
- package/dist/store/rows.d.ts +2 -3
- package/dist/store/rows.js +18 -11
- package/dist/store/search-rows.d.ts +15 -4
- package/dist/store/search-rows.js +43 -36
- package/dist/store/sessions.d.ts +18 -2
- package/dist/store/sessions.js +83 -46
- 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/sqlite/entry-writes-group.js +170 -0
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +59 -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 +28 -0
- package/dist/store/sqlite/executor.js +286 -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 +38 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +218 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +314 -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 +26 -0
- package/dist/store/sqlite/store.js +295 -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 +124 -0
- package/dist/store/sqlite/worker-ops.js +82 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +76 -0
- package/dist/store/summaries.d.ts +2 -11
- package/dist/store/summaries.js +17 -44
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/store/tenant-lookup.d.ts +1 -1
- package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
- package/dist/{tenant.js → store/tenant.js} +1 -1
- 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} +2 -9
- package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
- 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 +26 -0
- package/dist/store/vector-writes.d.ts +10 -3
- package/dist/store/vector-writes.js +35 -5
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
- package/dist/{working-memory.js → store/working-memory.js} +39 -41
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +13 -33
- 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 +67 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +46 -0
- package/dist/util/atomic-write.d.ts +3 -0
- package/dist/util/atomic-write.js +107 -0
- package/dist/util/crash-handlers.d.ts +5 -0
- package/dist/util/crash-handlers.js +30 -0
- package/dist/{env.d.ts → util/env.d.ts} +17 -2
- package/dist/{env.js → util/env.js} +22 -2
- package/dist/util/home-path.js +67 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
- package/dist/{http-retry.js → util/http-retry.js} +38 -7
- 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} +5 -2
- package/dist/{log.js → util/log.js} +12 -3
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +27 -0
- package/dist/util/request-scope.js +47 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
- 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 +18 -0
- package/dist/util/token-text.js +23 -0
- package/dist/{version.d.ts → util/version.d.ts} +1 -1
- package/dist/{version.js → util/version.js} +1 -1
- package/extensions/openclaw-plugin/index.ts +1 -5
- 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/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/capture-contract.js +0 -49
- 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/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.js +0 -326
- package/dist/extract.js +0 -133
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- 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/policies.js +0 -434
- package/dist/processes.js +0 -371
- package/dist/project-briefs.js +0 -523
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/skills.js +0 -367
- package/dist/store-port.d.ts +0 -191
- package/dist/store-port.js +0 -166
- /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/{recall-history.d.ts → api/recall-history.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/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
- /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
- /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
- /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
- /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
- /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
- /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +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/{trace.d.ts → consolidate/trace.d.ts} +0 -0
- /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
- /package/dist/{ambient.d.ts → core/ambient.d.ts} +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/{card.d.ts → core/card.d.ts} +0 -0
- /package/dist/{card.js → core/card.js} +0 -0
- /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
- /package/dist/{physics-config.js → core/physics-config.js} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{salience.d.ts → core/salience.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.d.ts → dashboard/dashboard-types.d.ts} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
- /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
- /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
- /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
- /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
- /package/dist/{rrf.js → search/rrf.js} +0 -0
- /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
- /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
- /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
- /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
- /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
- /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
- /package/dist/{yaml.js → store/yaml.js} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{home-path.d.ts → util/home-path.d.ts} +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/{secret-detect.d.ts → util/secret-detect.d.ts} +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/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
- /package/dist/{transcript-tail.js → util/transcript-tail.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
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type HippoStore } from '../store/index.js';
|
|
2
|
+
import type { ConnectorDeadLetter } from '../store/port.js';
|
|
3
|
+
declare const DEFAULT_BUCKET = "parse_error";
|
|
4
|
+
/** What a caller hands over to park one payload, whatever the connector. */
|
|
5
|
+
export interface ParkOpts<Bucket extends string> {
|
|
6
|
+
/** null when no tenant was resolved for the payload. */
|
|
7
|
+
tenantId: string | null;
|
|
8
|
+
rawPayload: string;
|
|
9
|
+
error: string;
|
|
10
|
+
bucket?: Bucket;
|
|
11
|
+
signature?: string | null;
|
|
12
|
+
}
|
|
13
|
+
/** The columns every connector's table has, as stored. */
|
|
14
|
+
export interface ParkedRow<Bucket extends string> {
|
|
15
|
+
tenantId: string;
|
|
16
|
+
rawPayload: string;
|
|
17
|
+
error: string;
|
|
18
|
+
bucket: Bucket | typeof DEFAULT_BUCKET;
|
|
19
|
+
signature: string | null;
|
|
20
|
+
}
|
|
21
|
+
/** What one connector supplies: the tag that names its table to the store, and its list. `Own` is the columns only its table has. */
|
|
22
|
+
export interface ConnectorDlq<Own, Bucket extends string, Item> {
|
|
23
|
+
readonly letter: (row: ParkedRow<Bucket> & Own) => ConnectorDeadLetter;
|
|
24
|
+
readonly list: (hippoRoot: string, tenantId: string, limit: number) => Item[];
|
|
25
|
+
}
|
|
26
|
+
/** Parks on `store`, else on hippo.db under `hippoRoot`. */
|
|
27
|
+
export declare function parkInDlq<Own, Bucket extends string>(dlq: ConnectorDlq<Own, Bucket, unknown>, hippoRoot: string, opts: ParkOpts<Bucket> & NoInfer<Own>, store?: HippoStore): Promise<number>;
|
|
28
|
+
export declare function listDlq<Item>(dlq: ConnectorDlq<never, never, Item>, hippoRoot: string, opts: {
|
|
29
|
+
tenantId: string;
|
|
30
|
+
limit?: number;
|
|
31
|
+
}): Item[];
|
|
32
|
+
/** Every outcome a replay reports; a connector that re-ingests inline reports the ingest outcome itself. */
|
|
33
|
+
export type ReplayStatus = 'not_found' | 'sig_missing' | 'sig_fail' | 'parse_error' | 'unhandled' | 'unroutable' | 'replayed' | 'ingested' | 'duplicate' | 'skipped' | 'skipped_duplicate' | 'archived';
|
|
34
|
+
export interface ReplayResult {
|
|
35
|
+
ok: boolean;
|
|
36
|
+
status: ReplayStatus;
|
|
37
|
+
memoryId: string | null;
|
|
38
|
+
retryCount: number;
|
|
39
|
+
reason?: string;
|
|
40
|
+
}
|
|
41
|
+
/** A replay that did not go through; `retryCount` is the row's count after any bump the caller made. */
|
|
42
|
+
export declare function replayFailed(status: ReplayStatus, retryCount: number, reason: string): ReplayResult;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=dlq.d.ts.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// The dead-letter queue every webhook connector parks into: one redaction, one unroutable sentinel, one set of defaults, one replay result.
|
|
2
|
+
import { DLQ_REDACTED_NOTE, redactPayload } from '../util/secret-detect.js';
|
|
3
|
+
import { requireGroup, storeFor } from '../store/index.js';
|
|
4
|
+
/** The tenant stored on a row no tenant was resolved for; the column is NOT NULL. */
|
|
5
|
+
const UNROUTABLE_TENANT = '__unroutable__';
|
|
6
|
+
const DEFAULT_BUCKET = 'parse_error';
|
|
7
|
+
const DEFAULT_LIST_LIMIT = 100;
|
|
8
|
+
/** Parks on `store`, else on hippo.db under `hippoRoot`. */
|
|
9
|
+
export async function parkInDlq(dlq, hippoRoot, opts, store) {
|
|
10
|
+
const rawPayload = redactPayload(opts.rawPayload);
|
|
11
|
+
// A redacted body can never match its signature, so the row keeps none and replay needs --force.
|
|
12
|
+
const redacted = rawPayload !== opts.rawPayload;
|
|
13
|
+
const letter = dlq.letter({
|
|
14
|
+
...opts,
|
|
15
|
+
tenantId: opts.tenantId ?? UNROUTABLE_TENANT,
|
|
16
|
+
rawPayload,
|
|
17
|
+
error: redacted ? `${opts.error}; ${DLQ_REDACTED_NOTE}` : opts.error,
|
|
18
|
+
bucket: opts.bucket ?? DEFAULT_BUCKET,
|
|
19
|
+
signature: redacted ? null : opts.signature ?? null,
|
|
20
|
+
});
|
|
21
|
+
return requireGroup(storeFor({ hippoRoot, store }), 'connectorEvents').parkDeadLetter(letter);
|
|
22
|
+
}
|
|
23
|
+
export function listDlq(dlq, hippoRoot, opts) {
|
|
24
|
+
return dlq.list(hippoRoot, opts.tenantId, opts.limit ?? DEFAULT_LIST_LIMIT);
|
|
25
|
+
}
|
|
26
|
+
/** A replay that did not go through; `retryCount` is the row's count after any bump the caller made. */
|
|
27
|
+
export function replayFailed(status, retryCount, reason) {
|
|
28
|
+
return { ok: false, status, memoryId: null, retryCount, reason };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=dlq.js.map
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* through to private. Callers who know the repo is public can re-tag
|
|
24
24
|
* downstream; the fail-safe default protects private orgs.
|
|
25
25
|
*/
|
|
26
|
-
import type { Context } from '../../api.js';
|
|
26
|
+
import type { Context } from '../../api/index.js';
|
|
27
27
|
import type { GitHubFetcher } from './octokit-client.js';
|
|
28
28
|
export interface BackfillOpts {
|
|
29
29
|
/** e.g. 'acme/repo'. */
|
|
@@ -23,40 +23,10 @@
|
|
|
23
23
|
* through to private. Callers who know the repo is public can re-tag
|
|
24
24
|
* downstream; the fail-safe default protects private orgs.
|
|
25
25
|
*/
|
|
26
|
-
import {
|
|
26
|
+
import { readCursors, writeHwm } from '../../store/connectors/github.js';
|
|
27
27
|
import { ingestEvent } from './ingest.js';
|
|
28
|
+
import { isJsonObject } from '../../util/json.js';
|
|
28
29
|
const API = 'https://api.github.com';
|
|
29
|
-
function readCursor(root, tenantId, repo) {
|
|
30
|
-
const db = openHippoDb(root);
|
|
31
|
-
try {
|
|
32
|
-
// SAFETY: row's shape matches the three HWM columns named in the SELECT
|
|
33
|
-
// above; `better-sqlite3`'s `.get()` return type is untyped by the driver.
|
|
34
|
-
const row = db
|
|
35
|
-
.prepare(`SELECT issues_hwm, issue_comments_hwm, pr_review_comments_hwm
|
|
36
|
-
FROM github_cursors WHERE tenant_id = ? AND repo_full_name = ?`)
|
|
37
|
-
.get(tenantId, repo);
|
|
38
|
-
return {
|
|
39
|
-
issues: row?.issues_hwm ?? null,
|
|
40
|
-
issueComments: row?.issue_comments_hwm ?? null,
|
|
41
|
-
prReviewComments: row?.pr_review_comments_hwm ?? null,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
finally {
|
|
45
|
-
closeHippoDb(db);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
function writeOneHwm(root, tenantId, repo, column, value) {
|
|
49
|
-
const db = openHippoDb(root);
|
|
50
|
-
try {
|
|
51
|
-
db.prepare(`INSERT INTO github_cursors (tenant_id, repo_full_name, ${column}, updated_at)
|
|
52
|
-
VALUES (?, ?, ?, ?)
|
|
53
|
-
ON CONFLICT(tenant_id, repo_full_name)
|
|
54
|
-
DO UPDATE SET ${column} = excluded.${column}, updated_at = excluded.updated_at`).run(tenantId, repo, value, new Date().toISOString());
|
|
55
|
-
}
|
|
56
|
-
finally {
|
|
57
|
-
closeHippoDb(db);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
30
|
/**
|
|
61
31
|
* Build a synthetic `repository` object from the known repo full name.
|
|
62
32
|
* REST list endpoints often omit the full repository object on each item;
|
|
@@ -86,14 +56,11 @@ function parseTrailingNumber(url) {
|
|
|
86
56
|
const n = Number(m[1]);
|
|
87
57
|
return Number.isFinite(n) ? n : null;
|
|
88
58
|
}
|
|
89
|
-
function isPlainObject(x) {
|
|
90
|
-
return x !== undefined && x !== null && typeof x === 'object' && !Array.isArray(x);
|
|
91
|
-
}
|
|
92
59
|
function isGitHubUser(x) {
|
|
93
|
-
return
|
|
60
|
+
return isJsonObject(x) && typeof x.login === 'string' && typeof x.id === 'number';
|
|
94
61
|
}
|
|
95
62
|
function isIssuesItem(x) {
|
|
96
|
-
if (!
|
|
63
|
+
if (!isJsonObject(x))
|
|
97
64
|
return false;
|
|
98
65
|
if (typeof x.number !== 'number')
|
|
99
66
|
return false;
|
|
@@ -102,47 +69,27 @@ function isIssuesItem(x) {
|
|
|
102
69
|
return isGitHubUser(x.user);
|
|
103
70
|
}
|
|
104
71
|
function isCommentItem(x) {
|
|
105
|
-
if (!
|
|
72
|
+
if (!isJsonObject(x))
|
|
106
73
|
return false;
|
|
107
74
|
if (typeof x.id !== 'number')
|
|
108
75
|
return false;
|
|
109
76
|
return isGitHubUser(x.user);
|
|
110
77
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
* any other fetch error so the caller leaves the HWM unchanged.
|
|
114
|
-
*
|
|
115
|
-
* - Tracks max(updated_at) across ALL fetched items, including ones
|
|
116
|
-
* `toIngestEvent` rejects (e.g., PRs returned via `/issues`). Otherwise
|
|
117
|
-
* a page of pure PRs would never advance the HWM and the next run would
|
|
118
|
-
* re-fetch the same window forever.
|
|
119
|
-
* - Returns `drained: boolean` — true only when the stream actually ran
|
|
120
|
-
* to next=null. Callers MUST NOT advance the HWM when drained=false,
|
|
121
|
-
* or a capped run would persist a partial HWM and skip the unfetched tail.
|
|
122
|
-
*/
|
|
123
|
-
async function drainStream(ctx, url0, toIngestEvent, fetcher, token, sleep, maxItems) {
|
|
78
|
+
async function drainStream(ctx, url0, options) {
|
|
79
|
+
const { toIngestEvent, maxItems } = options;
|
|
124
80
|
let url = url0;
|
|
125
81
|
let ingested = 0;
|
|
126
82
|
let pages = 0;
|
|
127
83
|
let maxUpdatedAt = null;
|
|
128
84
|
while (url) {
|
|
129
|
-
|
|
130
|
-
let page;
|
|
131
|
-
while (true) {
|
|
132
|
-
page = await fetcher({ url, token });
|
|
133
|
-
if (page.rateLimit.reason !== 'none') {
|
|
134
|
-
await sleep(page.rateLimit.sleepSeconds * 1000);
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
85
|
+
const page = await fetchPagePastRateLimit(options, url);
|
|
139
86
|
pages++;
|
|
140
87
|
for (const item of page.items) {
|
|
141
88
|
// Track updated_at on EVERY item, before the toIngestEvent filter, so PR-only pages don't loop forever.
|
|
142
89
|
// SAFETY: updated_at is GitHub's ISO-timestamp field on every item
|
|
143
90
|
// shape this stream returns; a non-string value would only fail the
|
|
144
91
|
// string comparisons below, matching pre-migration passthrough.
|
|
145
|
-
const updatedAt =
|
|
92
|
+
const updatedAt = isJsonObject(item)
|
|
146
93
|
? (item.updated_at ?? null)
|
|
147
94
|
: null;
|
|
148
95
|
if (updatedAt && (!maxUpdatedAt || updatedAt > maxUpdatedAt)) {
|
|
@@ -151,7 +98,7 @@ async function drainStream(ctx, url0, toIngestEvent, fetcher, token, sleep, maxI
|
|
|
151
98
|
const evt = toIngestEvent(item);
|
|
152
99
|
if (!evt)
|
|
153
100
|
continue;
|
|
154
|
-
const r = ingestEvent(ctx, {
|
|
101
|
+
const r = await ingestEvent(ctx, {
|
|
155
102
|
event: evt,
|
|
156
103
|
rawBody: JSON.stringify(item),
|
|
157
104
|
deliveryId: `backfill:${ctx.tenantId}:${updatedAt ?? ''}`,
|
|
@@ -167,6 +114,16 @@ async function drainStream(ctx, url0, toIngestEvent, fetcher, token, sleep, maxI
|
|
|
167
114
|
}
|
|
168
115
|
return { ingested, pages, maxUpdatedAt, drained: true };
|
|
169
116
|
}
|
|
117
|
+
async function fetchPagePastRateLimit(options, url) {
|
|
118
|
+
const { fetcher, token, sleep } = options;
|
|
119
|
+
// Fetch with rate-limit retry loop.
|
|
120
|
+
while (true) {
|
|
121
|
+
const page = await fetcher({ url, token });
|
|
122
|
+
if (page.rateLimit.reason === 'none')
|
|
123
|
+
return page;
|
|
124
|
+
await sleep(page.rateLimit.sleepSeconds * 1000);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
170
127
|
function issueItemToEvent(item, repository) {
|
|
171
128
|
if (!isIssuesItem(item))
|
|
172
129
|
return null;
|
|
@@ -234,16 +191,22 @@ function prReviewCommentItemToEvent(item, repository) {
|
|
|
234
191
|
}
|
|
235
192
|
/** Drains one stream, then persists its HWM only when the stream ran to the end. */
|
|
236
193
|
async function backfillStream(ctx, opts, sleep, stream) {
|
|
237
|
-
const res = await drainStream(ctx, stream.url,
|
|
194
|
+
const res = await drainStream(ctx, stream.url, {
|
|
195
|
+
toIngestEvent: stream.toIngestEvent,
|
|
196
|
+
fetcher: opts.fetcher,
|
|
197
|
+
token: opts.token,
|
|
198
|
+
sleep,
|
|
199
|
+
maxItems: opts.maxPerStream,
|
|
200
|
+
});
|
|
238
201
|
// A capped run (--max) must leave the HWM at its previous value so the next run re-fetches the unprocessed tail.
|
|
239
202
|
if (res.drained && res.maxUpdatedAt) {
|
|
240
|
-
|
|
203
|
+
writeHwm(ctx.hippoRoot, ctx.tenantId, opts.repoFullName, stream.column, res.maxUpdatedAt);
|
|
241
204
|
}
|
|
242
205
|
return { ingested: res.ingested, pages: res.pages };
|
|
243
206
|
}
|
|
244
207
|
export async function backfillRepo(ctx, opts) {
|
|
245
208
|
const sleep = opts.sleepMs ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
246
|
-
const cursors =
|
|
209
|
+
const cursors = readCursors(ctx.hippoRoot, ctx.tenantId, opts.repoFullName);
|
|
247
210
|
const repository = syntheticRepository(opts.repoFullName);
|
|
248
211
|
const result = {
|
|
249
212
|
ingested: { issues: 0, issueComments: 0, prReviewComments: 0 },
|
|
@@ -9,13 +9,14 @@
|
|
|
9
9
|
* - hippo github dlq list
|
|
10
10
|
* - hippo github dlq replay <id> [--force]
|
|
11
11
|
*/
|
|
12
|
-
import { envGithubToken, envGithubWebhookSecret, envGithubWebhookSecretPrevious } from '../../env.js';
|
|
13
|
-
import { adminActor } from '../../api.js';
|
|
14
|
-
import {
|
|
15
|
-
import { resolveTenantId } from '../../tenant.js';
|
|
12
|
+
import { envGithubToken, envGithubWebhookSecret, envGithubWebhookSecretPrevious } from '../../util/env.js';
|
|
13
|
+
import { adminActor } from '../../api/index.js';
|
|
14
|
+
import { seedCursors } from '../../store/connectors/github.js';
|
|
15
|
+
import { resolveTenantId } from '../../store/tenant.js';
|
|
16
16
|
import { backfillRepo } from './backfill.js';
|
|
17
17
|
import { realGitHubFetcher } from './octokit-client.js';
|
|
18
|
-
import { listDlq
|
|
18
|
+
import { listDlq } from '../dlq.js';
|
|
19
|
+
import { githubDlq, replayDlqEntry } from './dlq.js';
|
|
19
20
|
import { ingestEvent } from './ingest.js';
|
|
20
21
|
import { handleCommentDeleted } from './deletion.js';
|
|
21
22
|
import { computeDeletionKey } from './signature.js';
|
|
@@ -61,6 +62,16 @@ export function printGithubBackfillUsage() {
|
|
|
61
62
|
console.log(' --max Cap items per stream (optional, integer)');
|
|
62
63
|
console.log(' Requires GITHUB_TOKEN env var with repo read scope.');
|
|
63
64
|
}
|
|
65
|
+
/** `--max` as a whole positive count; undefined (no cap) when absent or not one. */
|
|
66
|
+
function maxPerStreamFlag(maxRaw) {
|
|
67
|
+
if (isFlagString(maxRaw) || isFlagValueNumberLike(maxRaw)) {
|
|
68
|
+
const parsed = Number(maxRaw);
|
|
69
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
70
|
+
return Math.floor(parsed);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
64
75
|
/**
|
|
65
76
|
* `hippo github backfill`. The fetcher is injectable so tests can drive the
|
|
66
77
|
* code path without hitting the network. Defaults to `realGitHubFetcher`.
|
|
@@ -76,14 +87,7 @@ export async function cmdGithubBackfill(hippoRoot, flags, fetcher = realGitHubFe
|
|
|
76
87
|
console.error('GITHUB_TOKEN is not set. Backfill requires a personal access token with repo read scope.');
|
|
77
88
|
process.exit(2);
|
|
78
89
|
}
|
|
79
|
-
const
|
|
80
|
-
let maxPerStream;
|
|
81
|
-
if (isFlagString(maxRaw) || isFlagValueNumberLike(maxRaw)) {
|
|
82
|
-
const parsed = Number(maxRaw);
|
|
83
|
-
if (Number.isFinite(parsed) && parsed > 0) {
|
|
84
|
-
maxPerStream = Math.floor(parsed);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
90
|
+
const maxPerStream = maxPerStreamFlag(flags['max']);
|
|
87
91
|
const sinceFlag = flags['since'];
|
|
88
92
|
const sinceIso = isFlagString(sinceFlag) ? sinceFlag : undefined;
|
|
89
93
|
const tenantId = resolveTenantId({});
|
|
@@ -91,21 +95,8 @@ export async function cmdGithubBackfill(hippoRoot, flags, fetcher = realGitHubFe
|
|
|
91
95
|
// COALESCE preserves any existing HWM (subsequent runs ignore --since for
|
|
92
96
|
// streams that already drained at least once — same idempotency story as
|
|
93
97
|
// Slack's slack_cursors).
|
|
94
|
-
if (sinceIso)
|
|
95
|
-
|
|
96
|
-
try {
|
|
97
|
-
db.prepare(`INSERT INTO github_cursors (tenant_id, repo_full_name, issues_hwm, issue_comments_hwm, pr_review_comments_hwm, updated_at)
|
|
98
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
99
|
-
ON CONFLICT(tenant_id, repo_full_name) DO UPDATE SET
|
|
100
|
-
issues_hwm = COALESCE(github_cursors.issues_hwm, excluded.issues_hwm),
|
|
101
|
-
issue_comments_hwm = COALESCE(github_cursors.issue_comments_hwm, excluded.issue_comments_hwm),
|
|
102
|
-
pr_review_comments_hwm = COALESCE(github_cursors.pr_review_comments_hwm, excluded.pr_review_comments_hwm),
|
|
103
|
-
updated_at = excluded.updated_at`).run(tenantId, repo, sinceIso, sinceIso, sinceIso, new Date().toISOString());
|
|
104
|
-
}
|
|
105
|
-
finally {
|
|
106
|
-
closeHippoDb(db);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
98
|
+
if (sinceIso)
|
|
99
|
+
seedCursors(hippoRoot, tenantId, repo, sinceIso);
|
|
109
100
|
const ctx = {
|
|
110
101
|
hippoRoot,
|
|
111
102
|
tenantId,
|
|
@@ -129,22 +120,48 @@ export async function cmdGithubBackfill(hippoRoot, flags, fetcher = realGitHubFe
|
|
|
129
120
|
}
|
|
130
121
|
}
|
|
131
122
|
export function cmdGithubDlqList(hippoRoot, _flags) {
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if (items.length === 0) {
|
|
137
|
-
console.log('no entries');
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
for (const it of items) {
|
|
141
|
-
console.log(`${it.id}\t${it.bucket}\t${it.tenantId}\t${it.eventName ?? '-'}\t${it.receivedAt}\t${it.error}`);
|
|
142
|
-
}
|
|
123
|
+
const items = listDlq(githubDlq, hippoRoot, { tenantId: resolveTenantId({}) });
|
|
124
|
+
if (items.length === 0) {
|
|
125
|
+
console.log('no entries');
|
|
126
|
+
return;
|
|
143
127
|
}
|
|
144
|
-
|
|
145
|
-
|
|
128
|
+
for (const it of items) {
|
|
129
|
+
console.log(`${it.id}\t${it.bucket}\t${it.tenantId}\t${it.eventName ?? '-'}\t${it.receivedAt}\t${it.error}`);
|
|
146
130
|
}
|
|
147
131
|
}
|
|
132
|
+
const reingestParkedDelivery = async (innerCtx, args) => {
|
|
133
|
+
const parsed = JSON.parse(args.rawPayload);
|
|
134
|
+
const event = parsedToIngestEvent(parsed, args.eventName);
|
|
135
|
+
if (!event) {
|
|
136
|
+
return { memoryId: null };
|
|
137
|
+
}
|
|
138
|
+
// A replayed comment `.deleted` row must route to the deletion handler, NOT to ingestEvent,
|
|
139
|
+
// which would write the deleted comment as a NEW raw memory instead of archiving the matching ones.
|
|
140
|
+
if ((event.eventName === 'issue_comment' || event.eventName === 'pull_request_review_comment') &&
|
|
141
|
+
event.payload.action === 'deleted') {
|
|
142
|
+
const repo = event.payload.repository?.full_name ?? '';
|
|
143
|
+
const artifactRef = event.eventName === 'issue_comment'
|
|
144
|
+
? `github://${repo}/issue/${event.payload.issue.number}/comment/${event.payload.comment.id}`
|
|
145
|
+
: `github://${repo}/pull/${event.payload.pull_request.number}/review_comment/${event.payload.comment.id}`;
|
|
146
|
+
const idempotencyKey = computeDeletionKey(artifactRef, event.payload.comment.updated_at ?? null);
|
|
147
|
+
const r = await handleCommentDeleted(innerCtx, {
|
|
148
|
+
artifactRef,
|
|
149
|
+
idempotencyKey,
|
|
150
|
+
deliveryId: args.deliveryId,
|
|
151
|
+
eventName: event.eventName,
|
|
152
|
+
});
|
|
153
|
+
// archivedCount maps to memoryId only loosely — return null since the
|
|
154
|
+
// archive operation can affect multiple rows. The replay-result audit
|
|
155
|
+
// trail is in github_dlq.retry_count + retried_at.
|
|
156
|
+
return { memoryId: r.archivedCount > 0 ? 'archived' : null };
|
|
157
|
+
}
|
|
158
|
+
const r = await ingestEvent(innerCtx, {
|
|
159
|
+
event,
|
|
160
|
+
rawBody: args.rawPayload,
|
|
161
|
+
deliveryId: args.deliveryId,
|
|
162
|
+
});
|
|
163
|
+
return { memoryId: r.memoryId };
|
|
164
|
+
};
|
|
148
165
|
export async function cmdGithubDlqReplay(hippoRoot, args, flags) {
|
|
149
166
|
const idArg = args[0];
|
|
150
167
|
if (!idArg) {
|
|
@@ -167,39 +184,7 @@ export async function cmdGithubDlqReplay(hippoRoot, args, flags) {
|
|
|
167
184
|
force,
|
|
168
185
|
webhookSecret: envGithubWebhookSecret(),
|
|
169
186
|
previousSecret: envGithubWebhookSecretPrevious(),
|
|
170
|
-
ingestHook:
|
|
171
|
-
const parsed = JSON.parse(args.rawPayload);
|
|
172
|
-
const event = parsedToIngestEvent(parsed, args.eventName);
|
|
173
|
-
if (!event) {
|
|
174
|
-
return { memoryId: null };
|
|
175
|
-
}
|
|
176
|
-
// A replayed comment `.deleted` row must route to the deletion handler, NOT to ingestEvent,
|
|
177
|
-
// which would write the deleted comment as a NEW raw memory instead of archiving the matching ones.
|
|
178
|
-
if ((event.eventName === 'issue_comment' || event.eventName === 'pull_request_review_comment') &&
|
|
179
|
-
event.payload.action === 'deleted') {
|
|
180
|
-
const repo = event.payload.repository?.full_name ?? '';
|
|
181
|
-
const artifactRef = event.eventName === 'issue_comment'
|
|
182
|
-
? `github://${repo}/issue/${event.payload.issue.number}/comment/${event.payload.comment.id}`
|
|
183
|
-
: `github://${repo}/pull/${event.payload.pull_request.number}/review_comment/${event.payload.comment.id}`;
|
|
184
|
-
const idempotencyKey = computeDeletionKey(artifactRef, event.payload.comment.updated_at ?? null);
|
|
185
|
-
const r = handleCommentDeleted(innerCtx, {
|
|
186
|
-
artifactRef,
|
|
187
|
-
idempotencyKey,
|
|
188
|
-
deliveryId: args.deliveryId,
|
|
189
|
-
eventName: event.eventName,
|
|
190
|
-
});
|
|
191
|
-
// archivedCount maps to memoryId only loosely — return null since the
|
|
192
|
-
// archive operation can affect multiple rows. The replay-result audit
|
|
193
|
-
// trail is in github_dlq.retry_count + retried_at.
|
|
194
|
-
return { memoryId: r.archivedCount > 0 ? 'archived' : null };
|
|
195
|
-
}
|
|
196
|
-
const r = ingestEvent(innerCtx, {
|
|
197
|
-
event,
|
|
198
|
-
rawBody: args.rawPayload,
|
|
199
|
-
deliveryId: args.deliveryId,
|
|
200
|
-
});
|
|
201
|
-
return { memoryId: r.memoryId };
|
|
202
|
-
},
|
|
187
|
+
ingestHook: reingestParkedDelivery,
|
|
203
188
|
});
|
|
204
189
|
if (!result.ok) {
|
|
205
190
|
console.error(`replay failed: status=${result.status} retry_count=${result.retryCount}${result.reason ? ` reason=${result.reason}` : ''}`);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Context } from '../../api.js';
|
|
1
|
+
import { type Context } from '../../api/index.js';
|
|
2
2
|
export interface DeletionInput {
|
|
3
3
|
/** artifact_ref of the comment, e.g.,
|
|
4
4
|
* 'github://acme/repo/issue/42/comment/123' or
|
|
@@ -23,14 +23,13 @@ export interface DeletionResult {
|
|
|
23
23
|
* GitHub edits keep the same artifact_ref, so multiple active raw rows can
|
|
24
24
|
* match a single deletion event. Archive ALL of them.
|
|
25
25
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* survivors. archiveRawMemory's own inner SAVEPOINT nests safely inside it.
|
|
26
|
+
* The store runs ALL archives + the idempotency mark as one write: a per-row
|
|
27
|
+
* failure rolls back the whole batch, idempotency included, so a retry
|
|
28
|
+
* re-attempts cleanly instead of leaving searchable survivors.
|
|
30
29
|
*
|
|
31
30
|
* Tenant scope and kind='raw' filtering are load-bearing: without them a
|
|
32
31
|
* deletion event from tenant A could archive tenant B's row sharing the same
|
|
33
32
|
* artifact_ref, or accidentally target a distilled row.
|
|
34
33
|
*/
|
|
35
|
-
export declare function handleCommentDeleted(ctx: Context, input: DeletionInput): DeletionResult
|
|
34
|
+
export declare function handleCommentDeleted(ctx: Context, input: DeletionInput): Promise<DeletionResult>;
|
|
36
35
|
//# sourceMappingURL=deletion.d.ts.map
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { archiveRawMemory } from '../../raw-archive.js';
|
|
3
|
-
import { hasSeenKey, markKeySeen } from './idempotency.js';
|
|
1
|
+
import { requireGroup, storeFor } from '../../store/index.js';
|
|
4
2
|
/**
|
|
5
3
|
* Handle GitHub `issue_comment.deleted` and `pull_request_review_comment.deleted`.
|
|
6
4
|
*
|
|
@@ -8,59 +6,27 @@ import { hasSeenKey, markKeySeen } from './idempotency.js';
|
|
|
8
6
|
* GitHub edits keep the same artifact_ref, so multiple active raw rows can
|
|
9
7
|
* match a single deletion event. Archive ALL of them.
|
|
10
8
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* survivors. archiveRawMemory's own inner SAVEPOINT nests safely inside it.
|
|
9
|
+
* The store runs ALL archives + the idempotency mark as one write: a per-row
|
|
10
|
+
* failure rolls back the whole batch, idempotency included, so a retry
|
|
11
|
+
* re-attempts cleanly instead of leaving searchable survivors.
|
|
15
12
|
*
|
|
16
13
|
* Tenant scope and kind='raw' filtering are load-bearing: without them a
|
|
17
14
|
* deletion event from tenant A could archive tenant B's row sharing the same
|
|
18
15
|
* artifact_ref, or accidentally target a distilled row.
|
|
19
16
|
*/
|
|
20
|
-
export function handleCommentDeleted(ctx, input) {
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// Independent INSERT, no rollback needed.
|
|
35
|
-
markKeySeen(db, {
|
|
36
|
-
idempotencyKey: input.idempotencyKey,
|
|
37
|
-
deliveryId: input.deliveryId,
|
|
38
|
-
eventName: input.eventName,
|
|
39
|
-
memoryId: null,
|
|
40
|
-
});
|
|
41
|
-
return { status: 'archive_skipped_not_found', archivedCount: 0 };
|
|
42
|
-
}
|
|
43
|
-
// Outer write scope wrapping all archives + the idempotency mark. Any throw
|
|
44
|
-
// rolls back the whole batch so retry sees neither archive nor mark — and
|
|
45
|
-
// re-attempts the full set.
|
|
46
|
-
withWriteScope(db, 'github_delete_all', () => {
|
|
47
|
-
for (const id of memoryIds) {
|
|
48
|
-
archiveRawMemory(db, id, {
|
|
49
|
-
reason: `source_deleted:github:${input.eventName}:${input.deliveryId}`,
|
|
50
|
-
who: ctx.actor.subject,
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
markKeySeen(db, {
|
|
54
|
-
idempotencyKey: input.idempotencyKey,
|
|
55
|
-
deliveryId: input.deliveryId,
|
|
56
|
-
eventName: input.eventName,
|
|
57
|
-
memoryId: memoryIds[0],
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
return { status: 'archived', archivedCount: memoryIds.length };
|
|
61
|
-
}
|
|
62
|
-
finally {
|
|
63
|
-
closeHippoDb(db);
|
|
64
|
-
}
|
|
17
|
+
export async function handleCommentDeleted(ctx, input) {
|
|
18
|
+
const { artifactRef, idempotencyKey, deliveryId, eventName } = input;
|
|
19
|
+
const done = await requireGroup(storeFor(ctx), 'connectorEvents').archiveDeletedArtifact({
|
|
20
|
+
tenantId: ctx.tenantId,
|
|
21
|
+
actor: ctx.actor.subject,
|
|
22
|
+
artifactRef,
|
|
23
|
+
reason: `source_deleted:github:${eventName}:${deliveryId}`,
|
|
24
|
+
event: { connector: 'github', idempotencyKey, deliveryId, eventName },
|
|
25
|
+
});
|
|
26
|
+
if (done.duplicate)
|
|
27
|
+
return { status: 'duplicate', archivedCount: 0 };
|
|
28
|
+
if (done.archived === 0)
|
|
29
|
+
return { status: 'archive_skipped_not_found', archivedCount: 0 };
|
|
30
|
+
return { status: 'archived', archivedCount: done.archived };
|
|
65
31
|
}
|
|
66
32
|
//# sourceMappingURL=deletion.js.map
|
|
@@ -1,56 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*
|
|
9
|
-
* Buckets:
|
|
10
|
-
* - parse_error — raw_payload was not valid JSON
|
|
11
|
-
* - unroutable — no tenant resolved for installation_id / repo_full_name
|
|
12
|
-
* - signature_failed — HMAC did not verify against the active webhook secret
|
|
13
|
-
* - unhandled — parsed but no handler matched the event
|
|
14
|
-
*/
|
|
15
|
-
export type DlqBucket = 'parse_error' | 'unroutable' | 'signature_failed' | 'unhandled';
|
|
16
|
-
export interface DlqItem {
|
|
17
|
-
id: number;
|
|
18
|
-
tenantId: string;
|
|
19
|
-
rawPayload: string;
|
|
20
|
-
error: string;
|
|
21
|
-
eventName: string | null;
|
|
22
|
-
deliveryId: string | null;
|
|
23
|
-
signature: string | null;
|
|
24
|
-
installationId: string | null;
|
|
25
|
-
repoFullName: string | null;
|
|
26
|
-
retryCount: number;
|
|
27
|
-
receivedAt: string;
|
|
28
|
-
retriedAt: string | null;
|
|
29
|
-
bucket: DlqBucket | string;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* `tenantId: null` means the connector could not resolve a tenant for the
|
|
33
|
-
* envelope (unroutable installation/repo). Stored as the sentinel
|
|
34
|
-
* `'__unroutable__'` so the NOT NULL column is honored — same convention as
|
|
35
|
-
* Slack DLQ.
|
|
36
|
-
*/
|
|
37
|
-
export interface WriteDlqOpts {
|
|
38
|
-
tenantId: string | null;
|
|
39
|
-
rawPayload: string;
|
|
40
|
-
error: string;
|
|
41
|
-
bucket?: DlqBucket;
|
|
42
|
-
eventName?: string | null;
|
|
43
|
-
deliveryId?: string | null;
|
|
44
|
-
signature?: string | null;
|
|
45
|
-
installationId?: string | null;
|
|
46
|
-
repoFullName?: string | null;
|
|
47
|
-
}
|
|
48
|
-
export declare function writeToDlq(db: DatabaseSyncLike, opts: WriteDlqOpts): number;
|
|
49
|
-
export declare function listDlq(db: DatabaseSyncLike, opts: {
|
|
50
|
-
tenantId: string;
|
|
51
|
-
limit?: number;
|
|
52
|
-
}): DlqItem[];
|
|
53
|
-
export declare function getDlqEntry(db: DatabaseSyncLike, id: number): DlqItem | null;
|
|
1
|
+
import type { Context } from '../../api/index.js';
|
|
2
|
+
import { type DlqBucket, type DlqItem, type GithubDlqWrite } from '../../store/connectors/github.js';
|
|
3
|
+
import { type ConnectorDlq, type ReplayResult } from '../dlq.js';
|
|
4
|
+
export type { DlqBucket, DlqItem };
|
|
5
|
+
type GithubOwnColumns = Pick<GithubDlqWrite, 'eventName' | 'deliveryId' | 'installationId' | 'repoFullName'>;
|
|
6
|
+
/** GitHub's dead-letter table; the event, delivery, installation and repo columns let an operator triage a row without re-reading the payload. */
|
|
7
|
+
export declare const githubDlq: ConnectorDlq<GithubOwnColumns, DlqBucket, DlqItem>;
|
|
54
8
|
export interface ReplayDlqOpts {
|
|
55
9
|
/** Current webhook secret. If omitted, signature check is skipped (force-only path). */
|
|
56
10
|
webhookSecret?: string;
|
|
@@ -64,14 +18,6 @@ export interface ReplayDlqOpts {
|
|
|
64
18
|
/** When true, skip signature verification (used for legacy entries after secret rotation). */
|
|
65
19
|
force?: boolean;
|
|
66
20
|
}
|
|
67
|
-
export type ReplayStatus = 'replayed' | 'parse_error' | 'sig_fail' | 'sig_missing' | 'unhandled' | 'not_found';
|
|
68
|
-
export interface ReplayResult {
|
|
69
|
-
ok: boolean;
|
|
70
|
-
status: ReplayStatus;
|
|
71
|
-
memoryId: string | null;
|
|
72
|
-
retryCount: number;
|
|
73
|
-
reason?: string;
|
|
74
|
-
}
|
|
75
21
|
/**
|
|
76
22
|
* Hook the webhook route injects to actually re-ingest a row. Decoupling
|
|
77
23
|
* the dispatch keeps this module free of every event-type handler — the
|