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
|
@@ -1,89 +1,72 @@
|
|
|
1
1
|
import { scopeFromRepository } from './scope.js';
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
2
|
+
/**
|
|
3
|
+
* Convert GitHub webhook events into RememberOpts; each returns null when the event has no usable body so the caller
|
|
4
|
+
* marks it seen and skips the insert.
|
|
5
|
+
* artifact_ref formats (github://<owner/repo>/issue|pull/<n>[/comment|review_comment/<id>]) are stable because deletion
|
|
6
|
+
* looks rows up by them.
|
|
7
|
+
*/
|
|
4
8
|
const UNKNOWN_REPO = 'unknown/unknown';
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
const title = evt.issue.title?.trim();
|
|
8
|
-
const text = [title, body].filter(Boolean).join('\n\n');
|
|
9
|
-
if (!text)
|
|
10
|
-
return null;
|
|
11
|
-
const repoFull = evt.repository?.full_name ?? UNKNOWN_REPO;
|
|
12
|
-
const login = evt.issue.user.login;
|
|
9
|
+
function rememberOpts(repository, { content, refPath, event, login }) {
|
|
10
|
+
const repoFull = repository?.full_name ?? UNKNOWN_REPO;
|
|
13
11
|
return {
|
|
14
|
-
content
|
|
12
|
+
content,
|
|
15
13
|
kind: 'raw',
|
|
16
|
-
scope: scopeFromRepository(
|
|
17
|
-
artifactRef: `github://${repoFull}
|
|
14
|
+
scope: scopeFromRepository(repository),
|
|
15
|
+
artifactRef: `github://${repoFull}/${refPath}`,
|
|
18
16
|
owner: `user:github:${login}`,
|
|
19
17
|
tags: [
|
|
20
18
|
'source:github',
|
|
21
19
|
`repo:${repoFull}`,
|
|
22
|
-
`event
|
|
20
|
+
`event:${event}`,
|
|
23
21
|
`user:github:${login}`,
|
|
24
22
|
],
|
|
25
23
|
};
|
|
26
24
|
}
|
|
25
|
+
function titleAndBody(item) {
|
|
26
|
+
return [item.title?.trim(), item.body?.trim()].filter(Boolean).join('\n\n');
|
|
27
|
+
}
|
|
28
|
+
export function issueEventToRememberOpts(evt) {
|
|
29
|
+
const content = titleAndBody(evt.issue);
|
|
30
|
+
if (!content)
|
|
31
|
+
return null;
|
|
32
|
+
return rememberOpts(evt.repository, {
|
|
33
|
+
content,
|
|
34
|
+
refPath: `issue/${evt.issue.number}`,
|
|
35
|
+
event: `issues.${evt.action}`,
|
|
36
|
+
login: evt.issue.user.login,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
27
39
|
export function issueCommentEventToRememberOpts(evt) {
|
|
28
|
-
const
|
|
29
|
-
if (!
|
|
40
|
+
const content = evt.comment.body?.trim();
|
|
41
|
+
if (!content)
|
|
30
42
|
return null;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
artifactRef: `github://${repoFull}/issue/${evt.issue.number}/comment/${evt.comment.id}`,
|
|
38
|
-
owner: `user:github:${login}`,
|
|
39
|
-
tags: [
|
|
40
|
-
'source:github',
|
|
41
|
-
`repo:${repoFull}`,
|
|
42
|
-
`event:issue_comment.${evt.action}`,
|
|
43
|
-
`user:github:${login}`,
|
|
44
|
-
],
|
|
45
|
-
};
|
|
43
|
+
return rememberOpts(evt.repository, {
|
|
44
|
+
content,
|
|
45
|
+
refPath: `issue/${evt.issue.number}/comment/${evt.comment.id}`,
|
|
46
|
+
event: `issue_comment.${evt.action}`,
|
|
47
|
+
login: evt.comment.user.login,
|
|
48
|
+
});
|
|
46
49
|
}
|
|
47
50
|
export function pullRequestEventToRememberOpts(evt) {
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
const text = [title, body].filter(Boolean).join('\n\n');
|
|
51
|
-
if (!text)
|
|
51
|
+
const content = titleAndBody(evt.pull_request);
|
|
52
|
+
if (!content)
|
|
52
53
|
return null;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
artifactRef: `github://${repoFull}/pull/${evt.pull_request.number}`,
|
|
60
|
-
owner: `user:github:${login}`,
|
|
61
|
-
tags: [
|
|
62
|
-
'source:github',
|
|
63
|
-
`repo:${repoFull}`,
|
|
64
|
-
`event:pull_request.${evt.action}`,
|
|
65
|
-
`user:github:${login}`,
|
|
66
|
-
],
|
|
67
|
-
};
|
|
54
|
+
return rememberOpts(evt.repository, {
|
|
55
|
+
content,
|
|
56
|
+
refPath: `pull/${evt.pull_request.number}`,
|
|
57
|
+
event: `pull_request.${evt.action}`,
|
|
58
|
+
login: evt.pull_request.user.login,
|
|
59
|
+
});
|
|
68
60
|
}
|
|
69
61
|
export function prReviewCommentEventToRememberOpts(evt) {
|
|
70
|
-
const
|
|
71
|
-
if (!
|
|
62
|
+
const content = evt.comment.body?.trim();
|
|
63
|
+
if (!content)
|
|
72
64
|
return null;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
artifactRef: `github://${repoFull}/pull/${evt.pull_request.number}/review_comment/${evt.comment.id}`,
|
|
80
|
-
owner: `user:github:${login}`,
|
|
81
|
-
tags: [
|
|
82
|
-
'source:github',
|
|
83
|
-
`repo:${repoFull}`,
|
|
84
|
-
`event:pull_request_review_comment.${evt.action}`,
|
|
85
|
-
`user:github:${login}`,
|
|
86
|
-
],
|
|
87
|
-
};
|
|
65
|
+
return rememberOpts(evt.repository, {
|
|
66
|
+
content,
|
|
67
|
+
refPath: `pull/${evt.pull_request.number}/review_comment/${evt.comment.id}`,
|
|
68
|
+
event: `pull_request_review_comment.${evt.action}`,
|
|
69
|
+
login: evt.comment.user.login,
|
|
70
|
+
});
|
|
88
71
|
}
|
|
89
72
|
//# sourceMappingURL=transform.js.map
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
1
|
+
/**
|
|
2
|
+
* GitHub webhook event shapes for the ingestion connector
|
|
3
|
+
* (https://docs.github.com/en/webhooks/webhook-events-and-payloads).
|
|
4
|
+
* Each guard is gated on the X-GitHub-Event header so a misrouted payload cannot satisfy a guard for the wrong event
|
|
5
|
+
* type.
|
|
6
|
+
*/
|
|
3
7
|
import { type JsonValue } from '../../util/json.js';
|
|
4
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* `private` MUST stay optional: scope.ts maps `private: undefined` to private, and a strict boolean would reject the
|
|
10
|
+
* payload before scope can fail closed.
|
|
11
|
+
*/
|
|
5
12
|
export interface GitHubRepository {
|
|
6
13
|
full_name: string;
|
|
7
14
|
private?: boolean;
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
1
|
+
/**
|
|
2
|
+
* GitHub webhook event shapes for the ingestion connector
|
|
3
|
+
* (https://docs.github.com/en/webhooks/webhook-events-and-payloads).
|
|
4
|
+
* Each guard is gated on the X-GitHub-Event header so a misrouted payload cannot satisfy a guard for the wrong event
|
|
5
|
+
* type.
|
|
6
|
+
*/
|
|
3
7
|
import { isJsonString, isJsonNumber } from '../../util/json.js';
|
|
4
8
|
function isObjectOrArray(x) {
|
|
5
9
|
return x !== null && typeof x === 'object';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ConnectorStore } from '../store.js';
|
|
2
2
|
import { type WebhookRequest } from '../../util/http-util.js';
|
|
3
|
-
/** GitHub webhook receiver: HMAC SHA-256 over the raw body, event type from the X-GitHub-Event header, tenant by
|
|
4
|
-
* ACKs 200 on signed envelopes (DLQ too); 401 only on a bad signature;
|
|
5
|
-
* 404
|
|
6
|
-
export declare function handleGitHubEventsWebhook(request: WebhookRequest, store
|
|
3
|
+
/** GitHub webhook receiver: HMAC SHA-256 over the raw body, event type from the X-GitHub-Event header, tenant by
|
|
4
|
+
* installation.id then repository.full_name. ACKs 200 on signed envelopes (DLQ too); 401 only on a bad signature;
|
|
5
|
+
* 409 on a replayed delivery id; 404 if GITHUB_WEBHOOK_SECRET is unset. No Bearer: route auth is webhook-signature. */
|
|
6
|
+
export declare function handleGitHubEventsWebhook(request: WebhookRequest, store: ConnectorStore): Promise<void>;
|
|
7
7
|
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { envGitHubWebhookSecret, envGitHubWebhookSecretPrevious } from '../../util/env.js';
|
|
2
2
|
import { DAY_MS } from '../../util/time.js';
|
|
3
|
-
import { verifyGitHubSignature } from './signature.js';
|
|
3
|
+
import { isWellFormedGitHubSignature, verifyGitHubSignature } from './signature.js';
|
|
4
4
|
import { isGitHubWebhookEnvelope, isGitHubIssueEvent, isGitHubIssueCommentEvent, isGitHubPullRequestEvent, isGitHubPullRequestReviewCommentEvent, } from './types.js';
|
|
5
5
|
import { ingestEvent as ingestGitHubEvent } from './ingest.js';
|
|
6
6
|
import { handleCommentDeleted as handleGitHubCommentDeleted } from './deletion.js';
|
|
@@ -10,9 +10,18 @@ import { resolveTenantForGitHub } from './tenant-routing.js';
|
|
|
10
10
|
import { computeDeletionKey as computeGitHubDeletionKey } from './signature.js';
|
|
11
11
|
import { resolveTenantId } from '../../store/tenant.js';
|
|
12
12
|
import { HttpError, JSON_HEADERS, isHeaderString, closeIfBodyUnread, readWebhookBody, sendJson, } from '../../util/http-util.js';
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
/** Reads the raw body and refuses it unless the signature matches the current or the previous secret. */
|
|
14
|
+
async function readSignedBody(request, secret, sigStr) {
|
|
15
|
+
const rawBody = await readWebhookBody(request);
|
|
16
|
+
const previousSecret = envGitHubWebhookSecretPrevious();
|
|
17
|
+
if (!verifyGitHubSignature({ rawBody, signature: sigStr, webhookSecret: secret, previousSecret })) {
|
|
18
|
+
throw new HttpError(401, 'invalid GitHub signature');
|
|
19
|
+
}
|
|
20
|
+
return rawBody;
|
|
21
|
+
}
|
|
22
|
+
/** GitHub webhook receiver: HMAC SHA-256 over the raw body, event type from the X-GitHub-Event header, tenant by
|
|
23
|
+
* installation.id then repository.full_name. ACKs 200 on signed envelopes (DLQ too); 401 only on a bad signature;
|
|
24
|
+
* 409 on a replayed delivery id; 404 if GITHUB_WEBHOOK_SECRET is unset. No Bearer: route auth is webhook-signature. */
|
|
16
25
|
export async function handleGitHubEventsWebhook(request, store) {
|
|
17
26
|
const { req, res, opts } = request;
|
|
18
27
|
// Secret and signature header before the body, so a caller with neither cannot make the server buffer one.
|
|
@@ -23,33 +32,33 @@ export async function handleGitHubEventsWebhook(request, store) {
|
|
|
23
32
|
res.end(JSON.stringify({ error: 'not found' }));
|
|
24
33
|
return;
|
|
25
34
|
}
|
|
26
|
-
const previousSecret = envGitHubWebhookSecretPrevious();
|
|
27
35
|
const sigHdr = req.headers['x-hub-signature-256'];
|
|
28
36
|
const eventHdr = req.headers['x-github-event'];
|
|
29
37
|
const deliveryHdr = req.headers['x-github-delivery'];
|
|
30
38
|
const sigStr = isHeaderString(sigHdr) ? sigHdr : null;
|
|
31
39
|
const eventName = isHeaderString(eventHdr) ? eventHdr : null;
|
|
32
40
|
const deliveryId = isHeaderString(deliveryHdr) ? deliveryHdr : null;
|
|
33
|
-
if (sigStr === null) {
|
|
41
|
+
if (sigStr === null || !isWellFormedGitHubSignature(sigStr)) {
|
|
34
42
|
closeIfBodyUnread(request);
|
|
35
43
|
throw new HttpError(401, 'invalid GitHub signature');
|
|
36
44
|
}
|
|
37
|
-
const rawBody = await
|
|
38
|
-
if (!verifyGitHubSignature({
|
|
39
|
-
rawBody,
|
|
40
|
-
signature: sigStr,
|
|
41
|
-
webhookSecret: secret,
|
|
42
|
-
previousSecret,
|
|
43
|
-
})) {
|
|
44
|
-
throw new HttpError(401, 'invalid GitHub signature');
|
|
45
|
-
}
|
|
45
|
+
const rawBody = await readSignedBody(request, secret, sigStr);
|
|
46
46
|
// Signature OK from here on. Everything else is ACK-200; bad envelopes go
|
|
47
47
|
// to the DLQ and a human can replay later.
|
|
48
48
|
const replayKey = deliveryId === null ? null : `${opts.hippoRoot}\n${deliveryId}`;
|
|
49
|
-
if (replayKey !== null && !claimDelivery(replayKey, Date.now()))
|
|
49
|
+
if (replayKey !== null && !claimDelivery(replayKey, Date.now())) {
|
|
50
50
|
throw new HttpError(409, 'duplicate X-GitHub-Delivery');
|
|
51
|
+
}
|
|
51
52
|
try {
|
|
52
|
-
await routeSignedDelivery({
|
|
53
|
+
await routeSignedDelivery({
|
|
54
|
+
hippoRoot: opts.hippoRoot,
|
|
55
|
+
store,
|
|
56
|
+
res,
|
|
57
|
+
rawBody,
|
|
58
|
+
eventName,
|
|
59
|
+
deliveryId,
|
|
60
|
+
signature: sigStr,
|
|
61
|
+
});
|
|
53
62
|
}
|
|
54
63
|
catch (err) {
|
|
55
64
|
// A delivery that failed left nothing stored, so GitHub's redelivery of the same id must get through.
|
|
@@ -61,10 +70,11 @@ export async function handleGitHubEventsWebhook(request, store) {
|
|
|
61
70
|
// GitHub signs no timestamp, so a captured delivery verifies forever; this window is what refuses its replay.
|
|
62
71
|
const DELIVERY_REPLAY_TTL_MS = DAY_MS;
|
|
63
72
|
const DELIVERY_REPLAY_MAX_IDS = 10_000;
|
|
64
|
-
// A fast path only: the durable dedupe is the connector event log's content-derived idempotency key (ingest.ts, and the
|
|
65
|
-
// so a replay after a restart or an eviction is a stored 'duplicate' with no new rows.
|
|
73
|
+
// A fast path only: the durable dedupe is the connector event log's content-derived idempotency key (ingest.ts, and the
|
|
74
|
+
// deletion key below), so a replay after a restart or an eviction is a stored 'duplicate' with no new rows.
|
|
66
75
|
const seenDeliveries = new Map();
|
|
67
|
-
/** Claims a delivery id for the window; false when it was claimed within the window already. The oldest claim goes
|
|
76
|
+
/** Claims a delivery id for the window; false when it was claimed within the window already. The oldest claim goes
|
|
77
|
+
* first at the cap. */
|
|
68
78
|
function claimDelivery(key, now) {
|
|
69
79
|
const seenAt = seenDeliveries.get(key);
|
|
70
80
|
if (seenAt !== undefined && now - seenAt < DELIVERY_REPLAY_TTL_MS)
|
|
@@ -96,7 +106,7 @@ async function parkAndAck(d, park) {
|
|
|
96
106
|
installationId: park.installationId,
|
|
97
107
|
repoFullName: park.repoFullName,
|
|
98
108
|
};
|
|
99
|
-
await parkInDlq(githubDlq, d.
|
|
109
|
+
await parkInDlq(githubDlq, d.store, row);
|
|
100
110
|
sendJson(d.res, 200, { ok: true, status: 'dlq' });
|
|
101
111
|
}
|
|
102
112
|
async function routeSignedDelivery(d) {
|
|
@@ -109,7 +119,7 @@ async function routeSignedDelivery(d) {
|
|
|
109
119
|
};
|
|
110
120
|
// Tenant resolution. Fail closed on multi-tenant installs with unknown
|
|
111
121
|
// routing - same policy as Slack.
|
|
112
|
-
const resolvedTenant = await resolveTenantForGitHub(d.
|
|
122
|
+
const resolvedTenant = await resolveTenantForGitHub(d.store, routing);
|
|
113
123
|
if (resolvedTenant === null) {
|
|
114
124
|
await parkAndAck(d, {
|
|
115
125
|
...routing,
|
|
@@ -186,7 +196,8 @@ async function dispatchGitHubEvent(d, ctx, body, deliveryId, routing) {
|
|
|
186
196
|
if (action === null)
|
|
187
197
|
return false;
|
|
188
198
|
if (action.kind === 'manual-review') {
|
|
189
|
-
// issues.deleted (admin-initiated) is logged, not archived: archiving
|
|
199
|
+
// issues.deleted (admin-initiated) is logged, not archived: archiving
|
|
200
|
+
// could lose the memory if the issue moves between accounts.
|
|
190
201
|
await parkAndAck(d, {
|
|
191
202
|
...routing,
|
|
192
203
|
tenantId: ctx.tenantId,
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type RememberOpts } from '../api/index.js';
|
|
2
|
+
import type { ConnectorContext } from './store.js';
|
|
2
3
|
import type { ConnectorEvent } from '../store/port.js';
|
|
3
4
|
export type IngestStatus = 'ingested' | 'duplicate' | 'skipped' | 'skipped_duplicate';
|
|
4
5
|
export interface IngestResult {
|
|
5
6
|
status: IngestStatus;
|
|
6
7
|
memoryId: string | null;
|
|
7
8
|
}
|
|
8
|
-
/** Stores `opts` once per event key; null `opts` (an empty body) and a tombstoned value are logged with no memory,
|
|
9
|
-
|
|
9
|
+
/** Stores `opts` once per event key; null `opts` (an empty body) and a tombstoned value are logged with no memory,
|
|
10
|
+
* so a redelivery acks instead of retrying. */
|
|
11
|
+
export declare function rememberWithEventLog(ctx: ConnectorContext, event: ConnectorEvent, opts: RememberOpts | null): Promise<IngestResult>;
|
|
10
12
|
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// The write half every connector's ingest shares, after its own pre-check of the event log.
|
|
2
2
|
import { remember } from '../api/index.js';
|
|
3
|
-
import { requireGroup } from '../store/index.js';
|
|
4
|
-
import { storeFor } from '../store/sqlite/store.js';
|
|
5
3
|
import { RejectedValueError } from '../core/api-errors.js';
|
|
6
|
-
/** Stores `opts` once per event key; null `opts` (an empty body) and a tombstoned value are logged with no memory,
|
|
4
|
+
/** Stores `opts` once per event key; null `opts` (an empty body) and a tombstoned value are logged with no memory,
|
|
5
|
+
* so a redelivery acks instead of retrying. */
|
|
7
6
|
export async function rememberWithEventLog(ctx, event, opts) {
|
|
8
7
|
if (!opts)
|
|
9
8
|
return markSkipped(ctx, event);
|
|
@@ -23,7 +22,7 @@ export async function rememberWithEventLog(ctx, event, opts) {
|
|
|
23
22
|
}
|
|
24
23
|
}
|
|
25
24
|
async function markSkipped(ctx, event) {
|
|
26
|
-
await
|
|
25
|
+
await ctx.store.connectorEvents.markEventSeen(event);
|
|
27
26
|
return { status: 'skipped', memoryId: null };
|
|
28
27
|
}
|
|
29
28
|
//# sourceMappingURL=ingest.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ConnectorContext } from '../store.js';
|
|
2
2
|
import type { SlackMessageEvent } from './types.js';
|
|
3
3
|
import type { ChannelMeta } from './scope.js';
|
|
4
4
|
export interface SlackHistoryPage {
|
|
@@ -9,8 +9,8 @@ export type SlackHistoryFetcher = (args: {
|
|
|
9
9
|
channelId: string;
|
|
10
10
|
/** Slack's opaque pagination token. Null on first page of a backfill run. */
|
|
11
11
|
cursor: string | null;
|
|
12
|
-
/** Incremental-resume bound: skip messages with ts <= oldest,
|
|
13
|
-
*
|
|
12
|
+
/** Incremental-resume bound: skip messages with ts <= oldest, from `slack_cursors.latest_ts` on the first page only.
|
|
13
|
+
* Kept apart from `cursor`: Slack treats `cursor` as an opaque token, so latest_ts there fails live. */
|
|
14
14
|
oldest?: string;
|
|
15
15
|
}) => Promise<SlackHistoryPage>;
|
|
16
16
|
export interface BackfillOpts {
|
|
@@ -20,9 +20,9 @@ export interface BackfillOpts {
|
|
|
20
20
|
/** Stop after this many messages. Default: unlimited. */
|
|
21
21
|
maxMessages?: number;
|
|
22
22
|
}
|
|
23
|
-
/** Page through `conversations.history` and ingest each message, persisting the cursor to `slack_cursors`
|
|
23
|
+
/** Page through `conversations.history` and ingest each message, persisting the cursor to `slack_cursors` per page.
|
|
24
24
|
* The synthesized eventId `backfill:${teamId}:${channelId}:${ts}` makes reruns dedupe via the `slack_event_log` PK. */
|
|
25
|
-
export declare function backfillChannel(ctx:
|
|
25
|
+
export declare function backfillChannel(ctx: ConnectorContext, opts: BackfillOpts): Promise<{
|
|
26
26
|
ingested: number;
|
|
27
27
|
pages: number;
|
|
28
28
|
}>;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { saveSlackCursor, slackCursor } from '../../store/connectors/slack.js';
|
|
2
2
|
import { ingestMessage } from './ingest.js';
|
|
3
|
-
/** Page through `conversations.history` and ingest each message, persisting the cursor to `slack_cursors`
|
|
3
|
+
/** Page through `conversations.history` and ingest each message, persisting the cursor to `slack_cursors` per page.
|
|
4
4
|
* The synthesized eventId `backfill:${teamId}:${channelId}:${ts}` makes reruns dedupe via the `slack_event_log` PK. */
|
|
5
5
|
export async function backfillChannel(ctx, opts) {
|
|
6
|
-
// `oldest` (numeric ts) is the resume bound for the first page only; `cursor` starts null and Slack mints the
|
|
7
|
-
// Mixing the two would feed a numeric ts as an opaque cursor and break on rerun.
|
|
6
|
+
// `oldest` (numeric ts) is the resume bound for the first page only; `cursor` starts null and Slack mints the
|
|
7
|
+
// next-page token. Mixing the two would feed a numeric ts as an opaque cursor and break on rerun.
|
|
8
8
|
const resumeFrom = slackCursor(ctx.hippoRoot, ctx.tenantId, opts.channel.id);
|
|
9
9
|
let cursor = null;
|
|
10
10
|
let ingested = 0;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ConnectorContext } from '../store.js';
|
|
2
2
|
export interface DeletionInput {
|
|
3
3
|
teamId: string;
|
|
4
4
|
channelId: string;
|
|
@@ -10,7 +10,7 @@ export interface DeletionResult {
|
|
|
10
10
|
status: DeletionStatus;
|
|
11
11
|
memoryId: string | null;
|
|
12
12
|
}
|
|
13
|
-
/** Handles Slack `message_deleted`. The store logs the event in the archive's own transaction, so a crash cannot leave
|
|
14
|
-
*
|
|
15
|
-
export declare function handleMessageDeleted(ctx:
|
|
13
|
+
/** Handles Slack `message_deleted`. The store logs the event in the archive's own transaction, so a crash cannot leave
|
|
14
|
+
* a retry answering `not_found` where `duplicate` is due. */
|
|
15
|
+
export declare function handleMessageDeleted(ctx: ConnectorContext, input: DeletionInput): Promise<DeletionResult>;
|
|
16
16
|
//# sourceMappingURL=deletion.d.ts.map
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { archiveRaw } from '../../api/index.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
/** Handles Slack `message_deleted`. The store logs the event in the archive's own transaction, so a crash cannot leave a retry
|
|
5
|
-
* answering `not_found` where `duplicate` is due. */
|
|
2
|
+
/** Handles Slack `message_deleted`. The store logs the event in the archive's own transaction, so a crash cannot leave
|
|
3
|
+
* a retry answering `not_found` where `duplicate` is due. */
|
|
6
4
|
export async function handleMessageDeleted(ctx, input) {
|
|
7
|
-
const events =
|
|
5
|
+
const events = ctx.store.connectorEvents;
|
|
8
6
|
const event = { connector: 'slack', eventId: input.eventId };
|
|
9
7
|
// The tenant in the lookup is load-bearing: without it a deletion event from
|
|
10
8
|
// tenant A could archive tenant B's raw row sharing the same artifact_ref.
|
|
@@ -21,7 +19,9 @@ export async function handleMessageDeleted(ctx, input) {
|
|
|
21
19
|
await events.markEventSeen(event);
|
|
22
20
|
return { status: 'not_found', memoryId: null };
|
|
23
21
|
}
|
|
24
|
-
await archiveRaw(ctx, memoryId, `source_deleted:slack:${input.teamId}:${input.channelId}:${input.deletedTs}`, {
|
|
22
|
+
await archiveRaw(ctx, memoryId, `source_deleted:slack:${input.teamId}:${input.channelId}:${input.deletedTs}`, {
|
|
23
|
+
event,
|
|
24
|
+
});
|
|
25
25
|
return { status: 'archived', memoryId };
|
|
26
26
|
}
|
|
27
27
|
//# sourceMappingURL=deletion.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ConnectorContext } from '../store.js';
|
|
2
2
|
import { type DlqBucket, type DlqItem, type SlackDlqInsert } from '../../store/connectors/slack.js';
|
|
3
3
|
import { type ConnectorDlq, type ReplayResult } from '../dlq.js';
|
|
4
4
|
export type { DlqBucket, DlqItem };
|
|
@@ -14,7 +14,7 @@ export interface ReplayDlqOpts {
|
|
|
14
14
|
/** Skew window override for tests. */
|
|
15
15
|
skewSeconds?: number;
|
|
16
16
|
}
|
|
17
|
-
/** Replay a DLQ row via the normal ingest path (`hippo slack dlq replay <id> [--force]`), re-verifying the signature
|
|
18
|
-
*
|
|
19
|
-
export declare function replayDlqEntry(ctx: Pick<
|
|
17
|
+
/** Replay a DLQ row via the normal ingest path (`hippo slack dlq replay <id> [--force]`), re-verifying the signature
|
|
18
|
+
* with the CURRENT secret unless forced. A NULL signature needs --force; replays use today's routing. */
|
|
19
|
+
export declare function replayDlqEntry(ctx: Pick<ConnectorContext, 'hippoRoot' | 'store'>, id: number, opts?: ReplayDlqOpts): Promise<ReplayResult>;
|
|
20
20
|
//# sourceMappingURL=dlq.d.ts.map
|
|
@@ -14,15 +14,15 @@ export const slackDlq = {
|
|
|
14
14
|
entry: slackDlqEntry,
|
|
15
15
|
bump: markSlackDlqRetried,
|
|
16
16
|
};
|
|
17
|
-
/** Replay a DLQ row via the normal ingest path (`hippo slack dlq replay <id> [--force]`), re-verifying the signature
|
|
18
|
-
*
|
|
17
|
+
/** Replay a DLQ row via the normal ingest path (`hippo slack dlq replay <id> [--force]`), re-verifying the signature
|
|
18
|
+
* with the CURRENT secret unless forced. A NULL signature needs --force; replays use today's routing. */
|
|
19
19
|
export async function replayDlqEntry(ctx, id, opts = {}) {
|
|
20
20
|
return replayParked({
|
|
21
21
|
dlq: slackDlq,
|
|
22
22
|
refuseSignature: (row) => refuseSignature(row, opts),
|
|
23
23
|
isEnvelope: isSlackEventEnvelope,
|
|
24
24
|
notEnvelope: 'not an event_callback envelope',
|
|
25
|
-
reingest: (_row, envelope) => reingest(ctx
|
|
25
|
+
reingest: (_row, envelope) => reingest(ctx, envelope),
|
|
26
26
|
}, ctx.hippoRoot, id, opts.force === true);
|
|
27
27
|
}
|
|
28
28
|
/** A missing signature or timestamp refuses even without a secret; a mismatch needs the current secret to show. */
|
|
@@ -51,14 +51,14 @@ function refuseSignature(row, opts) {
|
|
|
51
51
|
reason: 'signature did not verify against current SLACK_SIGNING_SECRET; pass --force to replay anyway',
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
-
async function reingest(hippoRoot, envelope) {
|
|
55
|
-
const tenantId = await resolveTenantForSlackTeam(
|
|
54
|
+
async function reingest({ hippoRoot, store }, envelope) {
|
|
55
|
+
const tenantId = await resolveTenantForSlackTeam(store, envelope.team_id);
|
|
56
56
|
if (!tenantId)
|
|
57
57
|
return { ok: false, status: 'unroutable', reason: `team_id ${envelope.team_id} still unroutable` };
|
|
58
58
|
const inner = envelope.event;
|
|
59
59
|
if (!isSlackMessageEvent(inner))
|
|
60
60
|
return { ok: false, status: 'unhandled', reason: 'unhandled inner event type' };
|
|
61
|
-
const replayCtx = { hippoRoot, tenantId, actor: adminActor('connector:slack:replay') };
|
|
61
|
+
const replayCtx = { hippoRoot, tenantId, actor: adminActor('connector:slack:replay'), store };
|
|
62
62
|
if (inner.subtype === 'message_deleted' && inner.deleted_ts) {
|
|
63
63
|
const r = await handleMessageDeleted(replayCtx, {
|
|
64
64
|
teamId: envelope.team_id,
|
|
@@ -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 { ChannelMeta } from './scope.js';
|
|
4
4
|
import type { SlackMessageEvent } from './types.js';
|
|
@@ -9,7 +9,9 @@ export interface IngestInput {
|
|
|
9
9
|
/** Slack event_id for the envelope (or for backfill, a synthesized stable id). */
|
|
10
10
|
eventId: string;
|
|
11
11
|
}
|
|
12
|
-
/** Ingests a Slack message as a kind='raw' memory once per event id (Slack redelivers within a minute); the pre-check
|
|
13
|
-
*
|
|
14
|
-
|
|
12
|
+
/** Ingests a Slack message as a kind='raw' memory once per event id (Slack redelivers within a minute); the pre-check
|
|
13
|
+
* is only the fast path,
|
|
14
|
+
* the store logs the event in the memory's own transaction, which holds when two workers race. An empty body is
|
|
15
|
+
* logged with no memory. */
|
|
16
|
+
export declare function ingestMessage(ctx: ConnectorContext, input: IngestInput): Promise<IngestResult>;
|
|
15
17
|
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { requireGroup } from '../../store/index.js';
|
|
2
|
-
import { storeFor } from '../../store/sqlite/store.js';
|
|
3
1
|
import { rememberWithEventLog } from '../ingest.js';
|
|
4
2
|
import { messageToRememberOpts } from './transform.js';
|
|
5
|
-
/** Ingests a Slack message as a kind='raw' memory once per event id (Slack redelivers within a minute); the pre-check
|
|
6
|
-
*
|
|
3
|
+
/** Ingests a Slack message as a kind='raw' memory once per event id (Slack redelivers within a minute); the pre-check
|
|
4
|
+
* is only the fast path,
|
|
5
|
+
* the store logs the event in the memory's own transaction, which holds when two workers race. An empty body is
|
|
6
|
+
* logged with no memory. */
|
|
7
7
|
export async function ingestMessage(ctx, input) {
|
|
8
|
-
const events =
|
|
8
|
+
const events = ctx.store.connectorEvents;
|
|
9
9
|
const event = { connector: 'slack', eventId: input.eventId };
|
|
10
10
|
// Idempotency check: if already seen, return the cached memory_id without
|
|
11
11
|
// re-running the transform or hitting api.remember.
|
|
@@ -3,7 +3,10 @@ export interface VerifyOpts {
|
|
|
3
3
|
timestamp: string;
|
|
4
4
|
signature: string;
|
|
5
5
|
signingSecret: string;
|
|
6
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* Previous signing secret during rotation (SLACK_SIGNING_SECRET_PREVIOUS); the verifier tries `signingSecret` first,
|
|
8
|
+
* then this.
|
|
9
|
+
*/
|
|
7
10
|
previousSecret?: string;
|
|
8
11
|
/** Current unix seconds. Injectable for tests. */
|
|
9
12
|
now?: number;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
/** Look up the tenant_id for a Slack team_id; the HIPPO_TENANT fallback applies only when slack_workspaces is empty
|
|
3
|
-
*
|
|
4
|
-
|
|
1
|
+
import type { StoreWith } from '../../store/index.js';
|
|
2
|
+
/** Look up the tenant_id for a Slack team_id; the HIPPO_TENANT fallback applies only when slack_workspaces is empty
|
|
3
|
+
* (single-workspace install).
|
|
4
|
+
* An unknown team on a multi-workspace install returns null (fail closed); SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK=1 is
|
|
5
|
+
* the emergency escape. */
|
|
6
|
+
export declare function resolveTenantForSlackTeam(store: StoreWith<'connectorEvents'>, teamId: string): Promise<string | null>;
|
|
5
7
|
//# sourceMappingURL=tenant-routing.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { envSlackAllowUnknownTeamFallback, envTenant } from '../../util/env.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
export async function resolveTenantForSlackTeam(
|
|
7
|
-
return tenantForRoute(await
|
|
2
|
+
/** Look up the tenant_id for a Slack team_id; the HIPPO_TENANT fallback applies only when slack_workspaces is empty
|
|
3
|
+
* (single-workspace install).
|
|
4
|
+
* An unknown team on a multi-workspace install returns null (fail closed); SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK=1 is
|
|
5
|
+
* the emergency escape. */
|
|
6
|
+
export async function resolveTenantForSlackTeam(store, teamId) {
|
|
7
|
+
return tenantForRoute(await store.connectorEvents.slackTeamRoute(teamId));
|
|
8
8
|
}
|
|
9
9
|
function tenantForRoute(route) {
|
|
10
10
|
if (route.tenantId !== null)
|
|
@@ -6,7 +6,11 @@ export interface TransformInput {
|
|
|
6
6
|
channel: ChannelMeta;
|
|
7
7
|
message: SlackMessageEvent;
|
|
8
8
|
}
|
|
9
|
-
/**
|
|
10
|
-
*
|
|
9
|
+
/**
|
|
10
|
+
* Convert a SlackMessageEvent into RememberOpts; returns null when the message has no usable body so the caller marks
|
|
11
|
+
* it seen and skips it.
|
|
12
|
+
* artifact_ref MUST be `slack://${teamId}/${channelId}/${ts}` (deletion looks it up); owner is never null: `user:<id>`,
|
|
13
|
+
* `bot:<bot_id>`, else `bot:unknown`.
|
|
14
|
+
*/
|
|
11
15
|
export declare function messageToRememberOpts(input: TransformInput): RememberOpts | null;
|
|
12
16
|
//# sourceMappingURL=transform.d.ts.map
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { scopeFromChannel } from './scope.js';
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
2
|
+
/**
|
|
3
|
+
* Convert a SlackMessageEvent into RememberOpts; returns null when the message has no usable body so the caller marks
|
|
4
|
+
* it seen and skips it.
|
|
5
|
+
* artifact_ref MUST be `slack://${teamId}/${channelId}/${ts}` (deletion looks it up); owner is never null: `user:<id>`,
|
|
6
|
+
* `bot:<bot_id>`, else `bot:unknown`.
|
|
7
|
+
*/
|
|
4
8
|
export function messageToRememberOpts(input) {
|
|
5
9
|
const text = input.message.text?.trim();
|
|
6
10
|
if (!text)
|
|
@@ -15,7 +15,9 @@ export interface SlackMessageEvent {
|
|
|
15
15
|
text?: string;
|
|
16
16
|
ts: string;
|
|
17
17
|
thread_ts?: string;
|
|
18
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* The `bot_message` subtype carries `bot_id` instead of `user`; transform.ts derives `owner: bot:<bot_id>` from it.
|
|
20
|
+
*/
|
|
19
21
|
bot_id?: string;
|
|
20
22
|
/** Present on subtype='message_deleted'. */
|
|
21
23
|
deleted_ts?: string;
|