hippo-memory 1.72.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/README.md +6 -4
- 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 -5
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/auth/audit.js +58 -0
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
- package/dist/api/{auth.js → auth/auth.js} +66 -54
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
- 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 +14 -4
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +31 -34
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +120 -63
- 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} +23 -17
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/memories/memories.js +52 -0
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/memories/outcome.js +28 -0
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/memories/promote.js +76 -0
- 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} +17 -9
- package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
- package/dist/api/{remember.js → memories/remember.js} +50 -32
- 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 -7
- 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 -3
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -5
- 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 +35 -20
- package/dist/api/prompt-hook.js +66 -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} +185 -101
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +116 -72
- 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 -68
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +36 -8
- package/dist/api/session-end.js +71 -25
- 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} +54 -45
- 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 +27 -12
- 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 +34 -15
- 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 +18 -9
- package/dist/capture/compaction-spool.js +105 -63
- 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 +58 -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 +33 -33
- package/dist/cli/auth.js +23 -31
- 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 -5
- package/dist/cli/client.js +53 -23
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +43 -18
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +5 -4
- package/dist/cli/curate.js +55 -77
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +30 -30
- 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 +34 -10
- package/dist/cli/hook-runtime.js +41 -16
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +35 -20
- 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 +5 -5
- package/dist/cli/object-verbs.js +13 -16
- 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 +17 -22
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +17 -7
- package/dist/cli/remember.js +51 -55
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +28 -18
- package/dist/cli/session-hooks.d.ts +2 -6
- package/dist/cli/session-hooks.js +140 -112
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +56 -34
- package/dist/cli/shared.d.ts +4 -2
- package/dist/cli/shared.js +26 -11
- 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 +16 -8
- 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 +4 -4
- package/dist/cli/transfer.js +97 -82
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +1 -1
- package/dist/cli/verb-row.d.ts +2 -0
- package/dist/cli/verbs/health.js +2 -0
- package/dist/cli/verbs/memory.js +47 -53
- package/dist/cli/verbs/objects.js +16 -7
- package/dist/cli/verbs/sessions.js +4 -2
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +14 -18
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -7
- 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 -4
- 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 -5
- 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 -5
- 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 +36 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -3
- 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 -5
- 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 -4
- 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 -5
- 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 +24 -10
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +45 -39
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +28 -17
- 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 +37 -14
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +47 -37
- 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 +42 -39
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +27 -30
- 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 +38 -29
- 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 +22 -17
- 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 +87 -30
- package/dist/core/memory.js +82 -33
- 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 +39 -11
- package/dist/core/physics.js +71 -21
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +35 -18
- 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.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +18 -7
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +5 -7
- package/dist/dashboard/dashboard.js +22 -8
- 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 -2
- package/dist/db/connect.js +8 -2
- 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 +40 -20
- 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/v11.js +1 -0
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -0
- 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 -8
- package/dist/db/physics-state.js +17 -50
- 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 +20 -5
- package/dist/db/request-stores.js +15 -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 +35 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +7 -1
- package/dist/doctor.js +128 -46
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +11 -7
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +32 -27
- 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 +50 -0
- package/dist/entry/store-kit.js +27 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- 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 +17 -7
- 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 +72 -33
- 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 +11 -10
- 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 +3 -3
- package/dist/importers/vault.js +61 -45
- package/dist/index.d.ts +33 -7
- package/dist/index.js +26 -8
- package/dist/learn/autolearn.d.ts +21 -6
- package/dist/learn/autolearn.js +57 -26
- 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 +17 -10
- 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 -6
- package/dist/learn/invalidation.js +62 -28
- 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 +21 -20
- 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 +61 -77
- 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 +59 -23
- 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 +19 -9
- 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 +12 -4
- package/dist/search/embed-memories.js +96 -58
- package/dist/search/engine.d.ts +11 -0
- package/dist/search/engine.js +14 -0
- 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 +14 -8
- package/dist/server/auth.d.ts +19 -15
- package/dist/server/auth.js +68 -38
- package/dist/server/boot.d.ts +4 -1
- package/dist/server/boot.js +115 -67
- package/dist/server/client-ip.d.ts +17 -5
- package/dist/server/client-ip.js +56 -21
- 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 +550 -97
- 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 -17
- 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 +40 -18
- package/dist/server/tls.d.ts +10 -2
- package/dist/server/tls.js +25 -5
- package/dist/server/types.d.ts +41 -24
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +17 -49
- package/dist/server.js +33 -40
- package/dist/sharing/global-store.d.ts +6 -12
- package/dist/sharing/global-store.js +8 -48
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +17 -7
- 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 +28 -14
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +40 -18
- package/dist/store/ambient.js +10 -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 +90 -41
- 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 +97 -63
- 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 +101 -37
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +16 -5
- package/dist/store/conflicts.js +104 -48
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +58 -6
- package/dist/store/connectors/event-log.d.ts +122 -0
- package/dist/store/connectors/event-log.js +25 -0
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +30 -48
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +31 -47
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -10
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +70 -28
- package/dist/store/delivery-recorder.d.ts +10 -7
- package/dist/store/delivery-recorder.js +70 -37
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +26 -10
- 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 +45 -19
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +72 -21
- package/dist/store/entry-reads.js +215 -69
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +26 -14
- package/dist/store/entry-writes.d.ts +28 -13
- package/dist/store/entry-writes.js +61 -22
- 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 +11 -12
- 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 +29 -19
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +15 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +13 -7
- package/dist/store/handoffs.js +44 -22
- 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 +4 -2
- package/dist/store/index.js +2 -1
- 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 +96 -19
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +6 -3
- package/dist/store/open.js +20 -10
- 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 +261 -219
- 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 +128 -64
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +46 -20
- 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 +20 -13
- package/dist/store/rule-sql.d.ts +7 -3
- package/dist/store/rule-sql.js +26 -13
- package/dist/store/search-rows.d.ts +16 -11
- package/dist/store/search-rows.js +54 -32
- 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 +12 -5
- 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 +9 -6
- 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 +8 -0
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +15 -0
- package/dist/store/sqlite/last-recall-group.js +62 -0
- 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.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +61 -0
- 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 +97 -38
- 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 -18
- package/dist/store/sqlite/store.js +95 -33
- 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 +25 -11
- package/dist/store/summaries.js +84 -27
- 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 +8 -4
- 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 +28 -11
- 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 +7 -2
- package/dist/util/anthropic-messages.js +18 -7
- package/dist/util/atomic-write.d.ts +8 -3
- package/dist/util/atomic-write.js +36 -21
- 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 +26 -5
- package/dist/util/env.js +87 -25
- package/dist/util/format.d.ts +2 -0
- package/dist/util/format.js +4 -0
- 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 +16 -4
- package/dist/util/request-scope.js +19 -6
- 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 +11 -0
- package/dist/util/spawn-argv.js +66 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- 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/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- 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 +4 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/audit.js +0 -56
- 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 -7
- package/dist/api/learn.js +0 -124
- package/dist/api/memories.d.ts +0 -23
- package/dist/api/memories.js +0 -46
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/outcome.js +0 -21
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/promote.js +0 -65
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -120
- 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 -10
- package/dist/cli/lenient-id.d.ts +0 -2
- package/dist/cli/lenient-id.js +0 -13
- 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 -21
- package/dist/store/sqlite/local.js +0 -39
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { envGitHubWebhookSecret, envGitHubWebhookSecretPrevious } from '../../util/env.js';
|
|
2
|
-
import {
|
|
2
|
+
import { DAY_MS } from '../../util/time.js';
|
|
3
|
+
import { isWellFormedGitHubSignature, verifyGitHubSignature } from './signature.js';
|
|
3
4
|
import { isGitHubWebhookEnvelope, isGitHubIssueEvent, isGitHubIssueCommentEvent, isGitHubPullRequestEvent, isGitHubPullRequestReviewCommentEvent, } from './types.js';
|
|
4
5
|
import { ingestEvent as ingestGitHubEvent } from './ingest.js';
|
|
5
6
|
import { handleCommentDeleted as handleGitHubCommentDeleted } from './deletion.js';
|
|
@@ -9,9 +10,18 @@ import { resolveTenantForGitHub } from './tenant-routing.js';
|
|
|
9
10
|
import { computeDeletionKey as computeGitHubDeletionKey } from './signature.js';
|
|
10
11
|
import { resolveTenantId } from '../../store/tenant.js';
|
|
11
12
|
import { HttpError, JSON_HEADERS, isHeaderString, closeIfBodyUnread, readWebhookBody, sendJson, } from '../../util/http-util.js';
|
|
12
|
-
/**
|
|
13
|
-
|
|
14
|
-
|
|
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. */
|
|
15
25
|
export async function handleGitHubEventsWebhook(request, store) {
|
|
16
26
|
const { req, res, opts } = request;
|
|
17
27
|
// Secret and signature header before the body, so a caller with neither cannot make the server buffer one.
|
|
@@ -22,33 +32,33 @@ export async function handleGitHubEventsWebhook(request, store) {
|
|
|
22
32
|
res.end(JSON.stringify({ error: 'not found' }));
|
|
23
33
|
return;
|
|
24
34
|
}
|
|
25
|
-
const previousSecret = envGitHubWebhookSecretPrevious();
|
|
26
35
|
const sigHdr = req.headers['x-hub-signature-256'];
|
|
27
36
|
const eventHdr = req.headers['x-github-event'];
|
|
28
37
|
const deliveryHdr = req.headers['x-github-delivery'];
|
|
29
38
|
const sigStr = isHeaderString(sigHdr) ? sigHdr : null;
|
|
30
39
|
const eventName = isHeaderString(eventHdr) ? eventHdr : null;
|
|
31
40
|
const deliveryId = isHeaderString(deliveryHdr) ? deliveryHdr : null;
|
|
32
|
-
if (sigStr === null) {
|
|
41
|
+
if (sigStr === null || !isWellFormedGitHubSignature(sigStr)) {
|
|
33
42
|
closeIfBodyUnread(request);
|
|
34
43
|
throw new HttpError(401, 'invalid GitHub signature');
|
|
35
44
|
}
|
|
36
|
-
const rawBody = await
|
|
37
|
-
if (!verifyGitHubSignature({
|
|
38
|
-
rawBody,
|
|
39
|
-
signature: sigStr,
|
|
40
|
-
webhookSecret: secret,
|
|
41
|
-
previousSecret,
|
|
42
|
-
})) {
|
|
43
|
-
throw new HttpError(401, 'invalid GitHub signature');
|
|
44
|
-
}
|
|
45
|
+
const rawBody = await readSignedBody(request, secret, sigStr);
|
|
45
46
|
// Signature OK from here on. Everything else is ACK-200; bad envelopes go
|
|
46
47
|
// to the DLQ and a human can replay later.
|
|
47
48
|
const replayKey = deliveryId === null ? null : `${opts.hippoRoot}\n${deliveryId}`;
|
|
48
|
-
if (replayKey !== null && !claimDelivery(replayKey, Date.now()))
|
|
49
|
+
if (replayKey !== null && !claimDelivery(replayKey, Date.now())) {
|
|
49
50
|
throw new HttpError(409, 'duplicate X-GitHub-Delivery');
|
|
51
|
+
}
|
|
50
52
|
try {
|
|
51
|
-
await routeSignedDelivery({
|
|
53
|
+
await routeSignedDelivery({
|
|
54
|
+
hippoRoot: opts.hippoRoot,
|
|
55
|
+
store,
|
|
56
|
+
res,
|
|
57
|
+
rawBody,
|
|
58
|
+
eventName,
|
|
59
|
+
deliveryId,
|
|
60
|
+
signature: sigStr,
|
|
61
|
+
});
|
|
52
62
|
}
|
|
53
63
|
catch (err) {
|
|
54
64
|
// A delivery that failed left nothing stored, so GitHub's redelivery of the same id must get through.
|
|
@@ -58,11 +68,13 @@ export async function handleGitHubEventsWebhook(request, store) {
|
|
|
58
68
|
}
|
|
59
69
|
}
|
|
60
70
|
// GitHub signs no timestamp, so a captured delivery verifies forever; this window is what refuses its replay.
|
|
61
|
-
const DELIVERY_REPLAY_TTL_MS =
|
|
71
|
+
const DELIVERY_REPLAY_TTL_MS = DAY_MS;
|
|
62
72
|
const DELIVERY_REPLAY_MAX_IDS = 10_000;
|
|
63
|
-
//
|
|
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.
|
|
64
75
|
const seenDeliveries = new Map();
|
|
65
|
-
/** 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. */
|
|
66
78
|
function claimDelivery(key, now) {
|
|
67
79
|
const seenAt = seenDeliveries.get(key);
|
|
68
80
|
if (seenAt !== undefined && now - seenAt < DELIVERY_REPLAY_TTL_MS)
|
|
@@ -94,7 +106,7 @@ async function parkAndAck(d, park) {
|
|
|
94
106
|
installationId: park.installationId,
|
|
95
107
|
repoFullName: park.repoFullName,
|
|
96
108
|
};
|
|
97
|
-
await parkInDlq(githubDlq, d.
|
|
109
|
+
await parkInDlq(githubDlq, d.store, row);
|
|
98
110
|
sendJson(d.res, 200, { ok: true, status: 'dlq' });
|
|
99
111
|
}
|
|
100
112
|
async function routeSignedDelivery(d) {
|
|
@@ -107,7 +119,7 @@ async function routeSignedDelivery(d) {
|
|
|
107
119
|
};
|
|
108
120
|
// Tenant resolution. Fail closed on multi-tenant installs with unknown
|
|
109
121
|
// routing - same policy as Slack.
|
|
110
|
-
const resolvedTenant = await resolveTenantForGitHub(d.
|
|
122
|
+
const resolvedTenant = await resolveTenantForGitHub(d.store, routing);
|
|
111
123
|
if (resolvedTenant === null) {
|
|
112
124
|
await parkAndAck(d, {
|
|
113
125
|
...routing,
|
|
@@ -184,7 +196,8 @@ async function dispatchGitHubEvent(d, ctx, body, deliveryId, routing) {
|
|
|
184
196
|
if (action === null)
|
|
185
197
|
return false;
|
|
186
198
|
if (action.kind === 'manual-review') {
|
|
187
|
-
// 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.
|
|
188
201
|
await parkAndAck(d, {
|
|
189
202
|
...routing,
|
|
190
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,8 +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, storeFor } from '../store/index.js';
|
|
4
3
|
import { RejectedValueError } from '../core/api-errors.js';
|
|
5
|
-
/** 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. */
|
|
6
6
|
export async function rememberWithEventLog(ctx, event, opts) {
|
|
7
7
|
if (!opts)
|
|
8
8
|
return markSkipped(ctx, event);
|
|
@@ -22,7 +22,7 @@ export async function rememberWithEventLog(ctx, event, opts) {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
async function markSkipped(ctx, event) {
|
|
25
|
-
await
|
|
25
|
+
await ctx.store.connectorEvents.markEventSeen(event);
|
|
26
26
|
return { status: 'skipped', memoryId: null };
|
|
27
27
|
}
|
|
28
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,9 +1,8 @@
|
|
|
1
1
|
import { archiveRaw } from '../../api/index.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* 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. */
|
|
5
4
|
export async function handleMessageDeleted(ctx, input) {
|
|
6
|
-
const events =
|
|
5
|
+
const events = ctx.store.connectorEvents;
|
|
7
6
|
const event = { connector: 'slack', eventId: input.eventId };
|
|
8
7
|
// The tenant in the lookup is load-bearing: without it a deletion event from
|
|
9
8
|
// tenant A could archive tenant B's raw row sharing the same artifact_ref.
|
|
@@ -20,7 +19,9 @@ export async function handleMessageDeleted(ctx, input) {
|
|
|
20
19
|
await events.markEventSeen(event);
|
|
21
20
|
return { status: 'not_found', memoryId: null };
|
|
22
21
|
}
|
|
23
|
-
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
|
+
});
|
|
24
25
|
return { status: 'archived', memoryId };
|
|
25
26
|
}
|
|
26
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,10 +1,11 @@
|
|
|
1
|
-
import { requireGroup, storeFor } from '../../store/index.js';
|
|
2
1
|
import { rememberWithEventLog } from '../ingest.js';
|
|
3
2
|
import { messageToRememberOpts } from './transform.js';
|
|
4
|
-
/** Ingests a Slack message as a kind='raw' memory once per event id (Slack redelivers within a minute); the pre-check
|
|
5
|
-
*
|
|
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. */
|
|
6
7
|
export async function ingestMessage(ctx, input) {
|
|
7
|
-
const events =
|
|
8
|
+
const events = ctx.store.connectorEvents;
|
|
8
9
|
const event = { connector: 'slack', eventId: input.eventId };
|
|
9
10
|
// Idempotency check: if already seen, return the cached memory_id without
|
|
10
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,9 +1,10 @@
|
|
|
1
1
|
import { envSlackAllowUnknownTeamFallback, envTenant } from '../../util/env.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
|
|
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));
|
|
7
8
|
}
|
|
8
9
|
function tenantForRoute(route) {
|
|
9
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;
|
|
@@ -5,12 +5,16 @@ import { isJsonObject, isJsonString } from '../../util/json.js';
|
|
|
5
5
|
/** Build a SlackHistoryFetcher that pages `conversations.history` over HTTP via `fetchWithRetry` (429 and 5xx handled).
|
|
6
6
|
* Slack omits `channel` from history messages, so the request channel id is stamped onto each one for ingest. */
|
|
7
7
|
const SLACK_TIMEOUT_MS = 30_000;
|
|
8
|
-
// A page is at most 200 messages, each up to 40,000 characters at 4 bytes, carried once as text and once as rich-text
|
|
8
|
+
// A page is at most 200 messages, each up to 40,000 characters at 4 bytes, carried once as text and once as rich-text
|
|
9
|
+
// blocks.
|
|
9
10
|
const SLACK_MAX_REPLY_BYTES = 64 * 1024 * 1024;
|
|
10
11
|
function isSlackMessage(m) {
|
|
11
12
|
return isJsonObject(m) && m.type === 'message' && isJsonString(m.ts);
|
|
12
13
|
}
|
|
13
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* The reply as a JSON object. The error names the status and the path only, since the query string carries channel ids
|
|
16
|
+
* and cursors.
|
|
17
|
+
*/
|
|
14
18
|
async function readHistoryReply(r, url) {
|
|
15
19
|
const where = `slack: HTTP ${r.status} on ${url.pathname}`;
|
|
16
20
|
let body;
|
|
@@ -22,8 +26,9 @@ async function readHistoryReply(r, url) {
|
|
|
22
26
|
}
|
|
23
27
|
if (!isJsonObject(body))
|
|
24
28
|
throw new Error(`${where}: the reply is not a JSON object`);
|
|
25
|
-
if (body.messages !== undefined && !Array.isArray(body.messages))
|
|
29
|
+
if (body.messages !== undefined && !Array.isArray(body.messages)) {
|
|
26
30
|
throw new Error(`${where}: \`messages\` is not an array`);
|
|
31
|
+
}
|
|
27
32
|
return body;
|
|
28
33
|
}
|
|
29
34
|
export function slackHistoryFetcher(token, fetchImpl) {
|
|
@@ -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
|
-
/** Slack Events API webhook: HMAC over the raw body with SLACK_SIGNING_SECRET, no Bearer (its route row declares
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
export declare function handleSlackEventsWebhook(request: WebhookRequest, store
|
|
3
|
+
/** Slack Events API webhook: HMAC over the raw body with SLACK_SIGNING_SECRET, no Bearer (its route row declares
|
|
4
|
+
* webhook-signature); malformed payloads go to slack_dlq, ACK 200. 404 (not 503) when the secret is unset, so a probe
|
|
5
|
+
* cannot tell a gated-off route from a missing one. */
|
|
6
|
+
export declare function handleSlackEventsWebhook(request: WebhookRequest, store: ConnectorStore): Promise<void>;
|
|
7
7
|
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -7,11 +7,11 @@ import { parkInDlq } from '../dlq.js';
|
|
|
7
7
|
import { slackDlq } from './dlq.js';
|
|
8
8
|
import { resolveTenantForSlackTeam } from './tenant-routing.js';
|
|
9
9
|
import { resolveTenantId } from '../../store/tenant.js';
|
|
10
|
-
import { HttpError, JSON_HEADERS, isHeaderString, closeIfBodyUnread, readWebhookBody, sendJson } from '../../util/http-util.js';
|
|
10
|
+
import { HttpError, JSON_HEADERS, isHeaderString, closeIfBodyUnread, readWebhookBody, sendJson, } from '../../util/http-util.js';
|
|
11
11
|
import { isJsonObject } from '../../util/json.js';
|
|
12
|
-
/** Slack Events API webhook: HMAC over the raw body with SLACK_SIGNING_SECRET, no Bearer (its route row declares
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
/** Slack Events API webhook: HMAC over the raw body with SLACK_SIGNING_SECRET, no Bearer (its route row declares
|
|
13
|
+
* webhook-signature); malformed payloads go to slack_dlq, ACK 200. 404 (not 503) when the secret is unset, so a probe
|
|
14
|
+
* cannot tell a gated-off route from a missing one. */
|
|
15
15
|
export async function handleSlackEventsWebhook(request, store) {
|
|
16
16
|
const { req, res, opts } = request;
|
|
17
17
|
// Secret and headers before the body, so a caller with neither cannot make the server buffer one.
|
|
@@ -41,7 +41,14 @@ export async function handleSlackEventsWebhook(request, store) {
|
|
|
41
41
|
})) {
|
|
42
42
|
throw new HttpError(401, 'invalid Slack signature');
|
|
43
43
|
}
|
|
44
|
-
await routeSignedSlackPayload({
|
|
44
|
+
await routeSignedSlackPayload({
|
|
45
|
+
hippoRoot: opts.hippoRoot,
|
|
46
|
+
store,
|
|
47
|
+
res,
|
|
48
|
+
rawBody,
|
|
49
|
+
signature: sigStr,
|
|
50
|
+
slackTimestamp: tsStr,
|
|
51
|
+
});
|
|
45
52
|
}
|
|
46
53
|
async function parkAndAck(d, park) {
|
|
47
54
|
const row = {
|
|
@@ -53,7 +60,7 @@ async function parkAndAck(d, park) {
|
|
|
53
60
|
signature: d.signature,
|
|
54
61
|
slackTimestamp: d.slackTimestamp,
|
|
55
62
|
};
|
|
56
|
-
await parkInDlq(slackDlq, d.
|
|
63
|
+
await parkInDlq(slackDlq, d.store, row);
|
|
57
64
|
sendJson(d.res, 200, { ok: true, status: 'dlq' });
|
|
58
65
|
}
|
|
59
66
|
function teamIdInRawBody(rawBody) {
|
|
@@ -88,11 +95,11 @@ async function routeSignedSlackPayload(d) {
|
|
|
88
95
|
}
|
|
89
96
|
if (answerUrlVerification(res, body))
|
|
90
97
|
return;
|
|
91
|
-
// Fail closed: resolveTenantForSlackTeam returns null for an unknown team on a non-empty slack_workspaces; park it in
|
|
92
|
-
// and still ACKs 200 so Slack stops retrying; never call ingest.
|
|
98
|
+
// Fail closed: resolveTenantForSlackTeam returns null for an unknown team on a non-empty slack_workspaces; park it in
|
|
99
|
+
// slack_dlq (bucket='unroutable') and still ACKs 200 so Slack stops retrying; never call ingest.
|
|
93
100
|
let resolvedTenant = null;
|
|
94
101
|
if (body !== undefined && isSlackEventEnvelope(body)) {
|
|
95
|
-
resolvedTenant = await resolveTenantForSlackTeam(d.
|
|
102
|
+
resolvedTenant = await resolveTenantForSlackTeam(d.store, body.team_id);
|
|
96
103
|
if (resolvedTenant === null) {
|
|
97
104
|
await parkAndAck(d, {
|
|
98
105
|
tenantId: null, // unroutable - stored as '__unroutable__'
|
|
@@ -127,7 +134,7 @@ async function routeSignedSlackPayload(d) {
|
|
|
127
134
|
async function parkUnparseable(d, teamIdFromRaw) {
|
|
128
135
|
// Attribute the parse failure to the originating workspace via the regex-extracted
|
|
129
136
|
// team_id; a null or unknown team writes tenantId=null, which lands as '__unroutable__'.
|
|
130
|
-
const parseFailTenant = teamIdFromRaw !== null ? await resolveTenantForSlackTeam(d.
|
|
137
|
+
const parseFailTenant = teamIdFromRaw !== null ? await resolveTenantForSlackTeam(d.store, teamIdFromRaw) : null;
|
|
131
138
|
await parkAndAck(d, {
|
|
132
139
|
tenantId: parseFailTenant, // null → '__unroutable__' sentinel
|
|
133
140
|
teamId: teamIdFromRaw,
|
|
@@ -151,7 +158,8 @@ async function dispatchSlackEvent(d, ctx, body) {
|
|
|
151
158
|
}
|
|
152
159
|
const r = await ingestMessage(ctx, {
|
|
153
160
|
teamId: body.team_id,
|
|
154
|
-
// Channel privacy is not on the inner event, so channel_type is the proxy: 'group'|'im'|'mpim' private, 'channel'
|
|
161
|
+
// Channel privacy is not on the inner event, so channel_type is the proxy: 'group'|'im'|'mpim' private, 'channel'
|
|
162
|
+
// public, unknown private.
|
|
155
163
|
channel: {
|
|
156
164
|
id: inner.channel,
|
|
157
165
|
is_private: inner.channel_type !== 'channel',
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
1
|
+
/**
|
|
2
|
+
* Slack workspace registration helpers: the `slack_workspaces` table maps `team_id` to `tenant_id` (empty =
|
|
3
|
+
* single-tenant, non-empty = fail-closed routing).
|
|
4
|
+
* `add` is an upsert that overwrites an existing team_id's tenant on purpose, so moving a workspace needs no
|
|
5
|
+
* delete+add.
|
|
6
|
+
*/
|
|
3
7
|
import { type SlackWorkspace } from '../../store/connectors/slack.js';
|
|
4
8
|
export type { SlackWorkspace };
|
|
5
|
-
export { listSlackWorkspaces as listWorkspaces, removeSlackWorkspace as removeWorkspace } from '../../store/connectors/slack.js';
|
|
9
|
+
export { listSlackWorkspaces as listWorkspaces, removeSlackWorkspace as removeWorkspace, } from '../../store/connectors/slack.js';
|
|
6
10
|
export interface AddWorkspaceOpts {
|
|
7
11
|
teamId: string;
|
|
8
12
|
tenantId: string;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
1
|
+
/**
|
|
2
|
+
* Slack workspace registration helpers: the `slack_workspaces` table maps `team_id` to `tenant_id` (empty =
|
|
3
|
+
* single-tenant, non-empty = fail-closed routing).
|
|
4
|
+
* `add` is an upsert that overwrites an existing team_id's tenant on purpose, so moving a workspace needs no
|
|
5
|
+
* delete+add.
|
|
6
|
+
*/
|
|
3
7
|
import { upsertSlackWorkspace } from '../../store/connectors/slack.js';
|
|
4
|
-
export { listSlackWorkspaces as listWorkspaces, removeSlackWorkspace as removeWorkspace } from '../../store/connectors/slack.js';
|
|
8
|
+
export { listSlackWorkspaces as listWorkspaces, removeSlackWorkspace as removeWorkspace, } from '../../store/connectors/slack.js';
|
|
5
9
|
/** Register or re-register a Slack team → tenant mapping. Upserts on
|
|
6
10
|
* team_id conflict (operators move workspaces between tenants). */
|
|
7
11
|
export function addWorkspace(hippoRoot, opts) {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ContextWith } from '../api/index.js';
|
|
2
|
+
import type { StoreWith } from '../store/index.js';
|
|
3
|
+
/** The groups a connector delivery writes through; the webhook gate proves all three before any delivery runs. */
|
|
4
|
+
type ConnectorGroup = 'entryWrites' | 'connectorWrites' | 'connectorEvents';
|
|
5
|
+
export type ConnectorStore = StoreWith<ConnectorGroup>;
|
|
6
|
+
export type ConnectorContext = ContextWith<ConnectorGroup>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=store.d.ts.map
|