hippo-memory 1.69.0 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -1,96 +1,23 @@
|
|
|
1
|
-
import { adminActor } from '../../api.js';
|
|
2
|
-
import {
|
|
1
|
+
import { adminActor } from '../../api/index.js';
|
|
2
|
+
import { bumpSlackDlqRetryCount, listSlackDlq, markSlackDlqRetried, slackDlqEntry, } from '../../store/connectors/slack.js';
|
|
3
|
+
import { replayFailed } from '../dlq.js';
|
|
3
4
|
import { ingestMessage } from './ingest.js';
|
|
4
|
-
import {
|
|
5
|
+
import { resolveTenantForSlackTeam } from './tenant-routing.js';
|
|
5
6
|
import { verifySlackSignature } from './signature.js';
|
|
6
7
|
import { isSlackEventEnvelope, isSlackMessageEvent } from './types.js';
|
|
7
8
|
import { handleMessageDeleted } from './deletion.js';
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return Number(result.lastInsertRowid);
|
|
19
|
-
}
|
|
20
|
-
export function listDlq(db, opts) {
|
|
21
|
-
// SAFETY: row shape matches the columns named in the SELECT below.
|
|
22
|
-
const rows = db
|
|
23
|
-
.prepare(`SELECT id, tenant_id, team_id, raw_payload, error, received_at, retried_at,
|
|
24
|
-
bucket, retry_count, signature, slack_timestamp
|
|
25
|
-
FROM slack_dlq
|
|
26
|
-
WHERE tenant_id = ?
|
|
27
|
-
ORDER BY received_at ASC
|
|
28
|
-
LIMIT ?`)
|
|
29
|
-
.all(opts.tenantId, opts.limit ?? 100);
|
|
30
|
-
return rows.map(rowToItem);
|
|
31
|
-
}
|
|
32
|
-
export function getDlqEntry(db, id) {
|
|
33
|
-
// SAFETY: row shape matches the columns named in the SELECT below.
|
|
34
|
-
const row = db
|
|
35
|
-
.prepare(`SELECT id, tenant_id, team_id, raw_payload, error, received_at, retried_at,
|
|
36
|
-
bucket, retry_count, signature, slack_timestamp
|
|
37
|
-
FROM slack_dlq
|
|
38
|
-
WHERE id = ?`)
|
|
39
|
-
.get(id);
|
|
9
|
+
import { errorMessage } from '../../util/log.js';
|
|
10
|
+
/** Slack's dead-letter table; `teamId` and `slackTimestamp` are the columns only it has. */
|
|
11
|
+
export const slackDlq = {
|
|
12
|
+
letter: (row) => ({ connector: 'slack', ...row }),
|
|
13
|
+
list: listSlackDlq,
|
|
14
|
+
};
|
|
15
|
+
/** Replay a DLQ row via the normal ingest path (`hippo slack dlq replay <id> [--force]`), re-verifying the signature with the CURRENT secret unless forced.
|
|
16
|
+
* Rows with a NULL signature need --force; replays use today's routing, because the DLQ exists to be drained after the operator fixed routing. */
|
|
17
|
+
export async function replayDlqEntry(ctx, id, opts = {}) {
|
|
18
|
+
const row = slackDlqEntry(ctx.hippoRoot, id);
|
|
40
19
|
if (!row)
|
|
41
|
-
return
|
|
42
|
-
return rowToItem(row);
|
|
43
|
-
}
|
|
44
|
-
function rowToItem(r) {
|
|
45
|
-
return {
|
|
46
|
-
id: Number(r.id),
|
|
47
|
-
tenantId: String(r.tenant_id),
|
|
48
|
-
teamId: r.team_id == null ? null : String(r.team_id),
|
|
49
|
-
rawPayload: String(r.raw_payload),
|
|
50
|
-
error: String(r.error),
|
|
51
|
-
receivedAt: String(r.received_at),
|
|
52
|
-
retriedAt: r.retried_at == null ? null : String(r.retried_at),
|
|
53
|
-
bucket: r.bucket == null ? 'parse_error' : String(r.bucket),
|
|
54
|
-
retryCount: Number(r.retry_count ?? 0),
|
|
55
|
-
signature: r.signature == null ? null : String(r.signature),
|
|
56
|
-
slackTimestamp: r.slack_timestamp == null ? null : String(r.slack_timestamp),
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
export function markDlqRetried(db, id) {
|
|
60
|
-
db.prepare(`UPDATE slack_dlq SET retried_at = ?, retry_count = retry_count + 1 WHERE id = ?`)
|
|
61
|
-
.run(new Date().toISOString(), id);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Replay a DLQ row through the normal ingest path. Used by `hippo slack dlq
|
|
65
|
-
* replay <id> [--force]`.
|
|
66
|
-
*
|
|
67
|
-
* Behavior:
|
|
68
|
-
* 1. SELECT the row.
|
|
69
|
-
* 2. If signature + slack_timestamp are present and `signingSecret` is set,
|
|
70
|
-
* re-verify with the CURRENT secret (not previous). Failure → bail unless
|
|
71
|
-
* --force. Legacy rows from before v19 may have NULL signature; those
|
|
72
|
-
* require --force to replay safely.
|
|
73
|
-
* 3. Re-parse the raw_payload and dispatch to ingestMessage / handleMessageDeleted.
|
|
74
|
-
* 4. On success: mark retried_at, increment retry_count.
|
|
75
|
-
* 5. On failure: increment retry_count only, leave the row.
|
|
76
|
-
*
|
|
77
|
-
* The replay always uses the routing the deployment has NOW (current
|
|
78
|
-
* slack_workspaces table + env), not whatever was in effect when the original
|
|
79
|
-
* envelope was DLQed. That is intentional: the DLQ exists to be drained after
|
|
80
|
-
* the operator fixed the routing.
|
|
81
|
-
*/
|
|
82
|
-
export function replayDlqEntry(ctx, id, opts = {}) {
|
|
83
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
84
|
-
let row;
|
|
85
|
-
try {
|
|
86
|
-
row = getDlqEntry(db, id);
|
|
87
|
-
}
|
|
88
|
-
finally {
|
|
89
|
-
closeHippoDb(db);
|
|
90
|
-
}
|
|
91
|
-
if (!row) {
|
|
92
|
-
return { ok: false, status: 'not_found', memoryId: null, retryCount: 0, reason: `dlq id ${id} not found` };
|
|
93
|
-
}
|
|
20
|
+
return replayFailed('not_found', 0, `dlq id ${id} not found`);
|
|
94
21
|
// Signature verification (current secret, not previous).
|
|
95
22
|
if (!opts.force) {
|
|
96
23
|
const sigFailure = checkReplaySignature(row, opts);
|
|
@@ -103,20 +30,13 @@ export function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
103
30
|
parsed = JSON.parse(row.rawPayload);
|
|
104
31
|
}
|
|
105
32
|
catch (e) {
|
|
106
|
-
return failAndBump(ctx.hippoRoot, row, 'parse_error', `still unparseable: ${
|
|
33
|
+
return failAndBump(ctx.hippoRoot, row, 'parse_error', `still unparseable: ${errorMessage(e)}`);
|
|
107
34
|
}
|
|
108
35
|
if (!isSlackEventEnvelope(parsed)) {
|
|
109
36
|
return failAndBump(ctx.hippoRoot, row, 'unhandled', 'not an event_callback envelope');
|
|
110
37
|
}
|
|
111
38
|
// Resolve tenant against current state. If still unroutable, bail.
|
|
112
|
-
const
|
|
113
|
-
let tenant;
|
|
114
|
-
try {
|
|
115
|
-
tenant = resolveTenantForTeam(db2, parsed.team_id);
|
|
116
|
-
}
|
|
117
|
-
finally {
|
|
118
|
-
closeHippoDb(db2);
|
|
119
|
-
}
|
|
39
|
+
const tenant = await resolveTenantForSlackTeam(ctx.hippoRoot, parsed.team_id);
|
|
120
40
|
if (!tenant) {
|
|
121
41
|
return failAndBump(ctx.hippoRoot, row, 'unroutable', `team_id ${parsed.team_id} still unroutable`);
|
|
122
42
|
}
|
|
@@ -130,13 +50,7 @@ export function replayDlqEntry(ctx, id, opts = {}) {
|
|
|
130
50
|
/** The failure result when the row cannot pass the signature gate, else null; never bumps the count. */
|
|
131
51
|
function checkReplaySignature(row, opts) {
|
|
132
52
|
if (!row.signature || !row.slackTimestamp) {
|
|
133
|
-
return
|
|
134
|
-
ok: false,
|
|
135
|
-
status: 'sig_missing',
|
|
136
|
-
memoryId: null,
|
|
137
|
-
retryCount: row.retryCount,
|
|
138
|
-
reason: 'row has no signature/timestamp (legacy, or redacted before storing); pass --force to replay',
|
|
139
|
-
};
|
|
53
|
+
return replayFailed('sig_missing', row.retryCount, 'row has no signature/timestamp (legacy, or redacted before storing); pass --force to replay');
|
|
140
54
|
}
|
|
141
55
|
if (opts.signingSecret) {
|
|
142
56
|
const ok = verifySlackSignature({
|
|
@@ -149,22 +63,16 @@ function checkReplaySignature(row, opts) {
|
|
|
149
63
|
skewSeconds: opts.skewSeconds ?? 60 * 60 * 24 * 365,
|
|
150
64
|
});
|
|
151
65
|
if (!ok) {
|
|
152
|
-
return
|
|
153
|
-
ok: false,
|
|
154
|
-
status: 'sig_fail',
|
|
155
|
-
memoryId: null,
|
|
156
|
-
retryCount: row.retryCount,
|
|
157
|
-
reason: 'signature did not verify against current SLACK_SIGNING_SECRET; pass --force to replay anyway',
|
|
158
|
-
};
|
|
66
|
+
return replayFailed('sig_fail', row.retryCount, 'signature did not verify against current SLACK_SIGNING_SECRET; pass --force to replay anyway');
|
|
159
67
|
}
|
|
160
68
|
}
|
|
161
69
|
return null;
|
|
162
70
|
}
|
|
163
71
|
function failAndBump(hippoRoot, row, status, reason) {
|
|
164
|
-
|
|
165
|
-
return
|
|
72
|
+
bumpSlackDlqRetryCount(hippoRoot, row.id);
|
|
73
|
+
return replayFailed(status, row.retryCount + 1, reason);
|
|
166
74
|
}
|
|
167
|
-
function dispatchReplay(replayCtx, row, parsed) {
|
|
75
|
+
async function dispatchReplay(replayCtx, row, parsed) {
|
|
168
76
|
const { hippoRoot } = replayCtx;
|
|
169
77
|
const id = row.id;
|
|
170
78
|
const inner = parsed.event;
|
|
@@ -172,16 +80,16 @@ function dispatchReplay(replayCtx, row, parsed) {
|
|
|
172
80
|
return failAndBump(hippoRoot, row, 'unhandled', `unhandled inner event type`);
|
|
173
81
|
}
|
|
174
82
|
if (inner.subtype === 'message_deleted' && inner.deleted_ts) {
|
|
175
|
-
const r = handleMessageDeleted(replayCtx, {
|
|
83
|
+
const r = await handleMessageDeleted(replayCtx, {
|
|
176
84
|
teamId: parsed.team_id,
|
|
177
85
|
channelId: inner.channel,
|
|
178
86
|
deletedTs: inner.deleted_ts,
|
|
179
87
|
eventId: parsed.event_id,
|
|
180
88
|
});
|
|
181
|
-
|
|
89
|
+
markSlackDlqRetried(hippoRoot, id);
|
|
182
90
|
return { ok: true, status: r.status, memoryId: r.memoryId, retryCount: row.retryCount + 1 };
|
|
183
91
|
}
|
|
184
|
-
const result = ingestMessage(replayCtx, {
|
|
92
|
+
const result = await ingestMessage(replayCtx, {
|
|
185
93
|
teamId: parsed.team_id,
|
|
186
94
|
channel: {
|
|
187
95
|
id: inner.channel,
|
|
@@ -192,25 +100,7 @@ function dispatchReplay(replayCtx, row, parsed) {
|
|
|
192
100
|
message: inner,
|
|
193
101
|
eventId: parsed.event_id,
|
|
194
102
|
});
|
|
195
|
-
|
|
103
|
+
markSlackDlqRetried(hippoRoot, id);
|
|
196
104
|
return { ok: true, status: result.status, memoryId: result.memoryId, retryCount: row.retryCount + 1 };
|
|
197
105
|
}
|
|
198
|
-
function markRetried(hippoRoot, id) {
|
|
199
|
-
const db = openHippoDb(hippoRoot);
|
|
200
|
-
try {
|
|
201
|
-
markDlqRetried(db, id);
|
|
202
|
-
}
|
|
203
|
-
finally {
|
|
204
|
-
closeHippoDb(db);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
function bumpRetryCount(hippoRoot, id) {
|
|
208
|
-
const db = openHippoDb(hippoRoot);
|
|
209
|
-
try {
|
|
210
|
-
db.prepare(`UPDATE slack_dlq SET retry_count = retry_count + 1 WHERE id = ?`).run(id);
|
|
211
|
-
}
|
|
212
|
-
finally {
|
|
213
|
-
closeHippoDb(db);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
106
|
//# sourceMappingURL=dlq.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Context } from '../../api.js';
|
|
1
|
+
import { type Context } from '../../api/index.js';
|
|
2
2
|
import type { ChannelMeta } from './scope.js';
|
|
3
3
|
import type { SlackMessageEvent } from './types.js';
|
|
4
4
|
export interface IngestInput {
|
|
@@ -13,21 +13,7 @@ export interface IngestResult {
|
|
|
13
13
|
status: IngestStatus;
|
|
14
14
|
memoryId: string | null;
|
|
15
15
|
}
|
|
16
|
-
/**
|
|
17
|
-
*
|
|
18
|
-
|
|
19
|
-
* - Idempotency-checked via slack_event_log (Slack retries within 1 minute).
|
|
20
|
-
* - The memory write and the slack_event_log mark commit atomically through
|
|
21
|
-
* `api.remember`'s `afterWrite` hook — a crash between the two cannot
|
|
22
|
-
* produce a duplicate on the next retry.
|
|
23
|
-
* - The afterWrite hook uses an explicit `INSERT OR IGNORE` + changes-check:
|
|
24
|
-
* if a concurrent worker beat us to slack_event_log between the pre-check
|
|
25
|
-
* and the SAVEPOINT, we throw `DuplicateEventError` to roll back the memory
|
|
26
|
-
* write. The pre-check `hasSeenEvent` stays as a fast path for the common
|
|
27
|
-
* already-seen case, but the afterWrite throw is what makes idempotency
|
|
28
|
-
* correct under two-worker concurrency.
|
|
29
|
-
* - Empty-body messages return 'skipped' but still mark seen so a replay
|
|
30
|
-
* returns 'duplicate' rather than re-running the transform.
|
|
31
|
-
*/
|
|
32
|
-
export declare function ingestMessage(ctx: Context, input: IngestInput): IngestResult;
|
|
16
|
+
/** Ingests a Slack message as a kind='raw' memory once per event id (Slack redelivers within a minute); the pre-check is only the fast path,
|
|
17
|
+
* the store logs the event in the memory's own transaction, which holds when two workers race. An empty body is logged with no memory. */
|
|
18
|
+
export declare function ingestMessage(ctx: Context, input: IngestInput): Promise<IngestResult>;
|
|
33
19
|
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -1,109 +1,44 @@
|
|
|
1
|
-
import { remember } from '../../api.js';
|
|
2
|
-
import {
|
|
3
|
-
import { RejectedValueError } from '../../rejection.js';
|
|
4
|
-
import { hasSeenEvent, markEventSeen, lookupMemoryByEvent, DuplicateEventError, } from './idempotency.js';
|
|
1
|
+
import { remember } from '../../api/index.js';
|
|
2
|
+
import { requireGroup, storeFor } from '../../store/index.js';
|
|
3
|
+
import { RejectedValueError } from '../../store/rejection.js';
|
|
5
4
|
import { messageToRememberOpts } from './transform.js';
|
|
6
|
-
/**
|
|
7
|
-
*
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* `api.remember`'s `afterWrite` hook — a crash between the two cannot
|
|
12
|
-
* produce a duplicate on the next retry.
|
|
13
|
-
* - The afterWrite hook uses an explicit `INSERT OR IGNORE` + changes-check:
|
|
14
|
-
* if a concurrent worker beat us to slack_event_log between the pre-check
|
|
15
|
-
* and the SAVEPOINT, we throw `DuplicateEventError` to roll back the memory
|
|
16
|
-
* write. The pre-check `hasSeenEvent` stays as a fast path for the common
|
|
17
|
-
* already-seen case, but the afterWrite throw is what makes idempotency
|
|
18
|
-
* correct under two-worker concurrency.
|
|
19
|
-
* - Empty-body messages return 'skipped' but still mark seen so a replay
|
|
20
|
-
* returns 'duplicate' rather than re-running the transform.
|
|
21
|
-
*/
|
|
22
|
-
export function ingestMessage(ctx, input) {
|
|
5
|
+
/** Ingests a Slack message as a kind='raw' memory once per event id (Slack redelivers within a minute); the pre-check is only the fast path,
|
|
6
|
+
* the store logs the event in the memory's own transaction, which holds when two workers race. An empty body is logged with no memory. */
|
|
7
|
+
export async function ingestMessage(ctx, input) {
|
|
8
|
+
const events = requireGroup(storeFor(ctx), 'connectorEvents');
|
|
9
|
+
const event = { connector: 'slack', eventId: input.eventId };
|
|
23
10
|
// Idempotency check: if already seen, return the cached memory_id without
|
|
24
11
|
// re-running the transform or hitting api.remember.
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const cachedId = lookupMemoryByEvent(db, input.eventId);
|
|
31
|
-
return { status: cachedId === null ? 'skipped' : 'duplicate', memoryId: cachedId };
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
finally {
|
|
35
|
-
closeHippoDb(db);
|
|
12
|
+
const seen = await events.eventRecord(event);
|
|
13
|
+
if (seen.seen) {
|
|
14
|
+
// Empty-body events are marked seen with memory_id=NULL, so their replay returns the same 'skipped'
|
|
15
|
+
// they first returned; a non-NULL memory_id means a memory was ingested, so 'duplicate'.
|
|
16
|
+
return { status: seen.memoryId === null ? 'skipped' : 'duplicate', memoryId: seen.memoryId };
|
|
36
17
|
}
|
|
37
18
|
const opts = messageToRememberOpts(input);
|
|
38
19
|
if (!opts) {
|
|
39
|
-
|
|
40
|
-
try {
|
|
41
|
-
markEventSeen(db2, input.eventId, null);
|
|
42
|
-
}
|
|
43
|
-
finally {
|
|
44
|
-
closeHippoDb(db2);
|
|
45
|
-
}
|
|
20
|
+
await events.markEventSeen(event);
|
|
46
21
|
return { status: 'skipped', memoryId: null };
|
|
47
22
|
}
|
|
48
|
-
// Atomic write: the afterWrite callback runs inside writeEntry's SAVEPOINT,
|
|
49
|
-
// so the memory row and the slack_event_log row commit (or roll back)
|
|
50
|
-
// together. Slack's 1-minute retry window can no longer produce a duplicate
|
|
51
|
-
// via the crash-between-handles race.
|
|
52
23
|
try {
|
|
53
|
-
return rememberWithEventLog(ctx,
|
|
24
|
+
return await rememberWithEventLog(ctx, event, opts);
|
|
54
25
|
}
|
|
55
26
|
catch (e) {
|
|
56
|
-
if (e instanceof
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
27
|
+
if (!(e instanceof RejectedValueError))
|
|
28
|
+
throw e;
|
|
29
|
+
// A tombstone hit is a PERMANENT skip: a DLQ retry would hit the same refusal forever, so mark the
|
|
30
|
+
// event seen like the empty-body branch above and let a Slack retry ack as done, not error.
|
|
31
|
+
await events.markEventSeen(event);
|
|
32
|
+
return { status: 'skipped', memoryId: null };
|
|
61
33
|
}
|
|
62
34
|
}
|
|
63
|
-
function rememberWithEventLog(ctx,
|
|
35
|
+
async function rememberWithEventLog(ctx, event, opts) {
|
|
64
36
|
// No `|| 'connector:slack'` fallback: the caller always builds ctx with the connector subject, and with
|
|
65
37
|
// an object-shaped Context.actor an OR-fallback would never fire anyway.
|
|
66
|
-
const result = remember({ ...
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
afterWrite: (innerDb, memoryId) => {
|
|
71
|
-
const inserted = innerDb
|
|
72
|
-
.prepare(`INSERT OR IGNORE INTO slack_event_log (event_id, ingested_at, memory_id) VALUES (?, ?, ?)`)
|
|
73
|
-
.run(eventId, new Date().toISOString(), memoryId);
|
|
74
|
-
if ((Number(inserted.changes ?? 0)) === 0) {
|
|
75
|
-
// Two-worker race: another writer reserved this event_id between
|
|
76
|
-
// the pre-check and the write. Throw to roll back the SAVEPOINT
|
|
77
|
-
// in writeEntry — the memory row gets discarded, idempotency
|
|
78
|
-
// holds, exactly one memory exists for this event_id.
|
|
79
|
-
throw new DuplicateEventError(eventId);
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
});
|
|
38
|
+
const result = await remember(ctx, { ...opts, untrusted: true, event });
|
|
39
|
+
// Another worker logged this event between the pre-check and the write: its memory stands and ours was not stored.
|
|
40
|
+
if (result.duplicate)
|
|
41
|
+
return { status: 'skipped_duplicate', memoryId: result.duplicate.memoryId };
|
|
83
42
|
return { status: 'ingested', memoryId: result.id };
|
|
84
43
|
}
|
|
85
|
-
function lostRaceResult(ctx, eventId) {
|
|
86
|
-
// The other worker's memory row is already committed. Return its id
|
|
87
|
-
// so the caller behaves identically to the fast-path 'duplicate' branch.
|
|
88
|
-
const db3 = openHippoDb(ctx.hippoRoot);
|
|
89
|
-
try {
|
|
90
|
-
const cachedId = lookupMemoryByEvent(db3, eventId);
|
|
91
|
-
return { status: 'skipped_duplicate', memoryId: cachedId };
|
|
92
|
-
}
|
|
93
|
-
finally {
|
|
94
|
-
closeHippoDb(db3);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
function rejectedValueResult(ctx, eventId) {
|
|
98
|
-
// A tombstone hit is a PERMANENT skip: a DLQ retry would hit the same refusal forever, so mark the
|
|
99
|
-
// event seen like the empty-body branch above and let a Slack retry ack as done, not error.
|
|
100
|
-
const db4 = openHippoDb(ctx.hippoRoot);
|
|
101
|
-
try {
|
|
102
|
-
markEventSeen(db4, eventId, null);
|
|
103
|
-
}
|
|
104
|
-
finally {
|
|
105
|
-
closeHippoDb(db4);
|
|
106
|
-
}
|
|
107
|
-
return { status: 'skipped', memoryId: null };
|
|
108
|
-
}
|
|
109
44
|
//# sourceMappingURL=ingest.js.map
|
|
@@ -4,13 +4,7 @@ export interface ChannelMeta {
|
|
|
4
4
|
is_im?: boolean;
|
|
5
5
|
is_mpim?: boolean;
|
|
6
6
|
}
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* Default to private when privacy is undetermined. The cost of leaking a
|
|
11
|
-
* public channel into private scope (recall returns nothing) is far smaller
|
|
12
|
-
* than the cost of leaking a private channel into public scope (data exposed
|
|
13
|
-
* to a tenant that should not see it).
|
|
14
|
-
*/
|
|
7
|
+
/** Map a Slack channel into a hippo scope string, defaulting to private when privacy is undetermined:
|
|
8
|
+
* a public channel leaking into private scope returns nothing, but the reverse exposes data. */
|
|
15
9
|
export declare function scopeFromChannel(ch: ChannelMeta): string;
|
|
16
10
|
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Default to private when privacy is undetermined. The cost of leaking a
|
|
5
|
-
* public channel into private scope (recall returns nothing) is far smaller
|
|
6
|
-
* than the cost of leaking a private channel into public scope (data exposed
|
|
7
|
-
* to a tenant that should not see it).
|
|
8
|
-
*/
|
|
1
|
+
/** Map a Slack channel into a hippo scope string, defaulting to private when privacy is undetermined:
|
|
2
|
+
* a public channel leaking into private scope returns nothing, but the reverse exposes data. */
|
|
9
3
|
export function scopeFromChannel(ch) {
|
|
10
4
|
const isPublic = ch.is_private === false && !ch.is_im && !ch.is_mpim;
|
|
11
5
|
return isPublic ? `slack:public:${ch.id}` : `slack:private:${ch.id}`;
|
|
@@ -3,12 +3,7 @@ export interface VerifyOpts {
|
|
|
3
3
|
timestamp: string;
|
|
4
4
|
signature: string;
|
|
5
5
|
signingSecret: string;
|
|
6
|
-
/**
|
|
7
|
-
* Previous signing secret during a rotation. Deploy with
|
|
8
|
-
* both `SLACK_SIGNING_SECRET` (new) and `SLACK_SIGNING_SECRET_PREVIOUS` (old)
|
|
9
|
-
* set, verify both work, drop previous after rollover. The verifier tries
|
|
10
|
-
* `signingSecret` first, then `previousSecret` if that fails.
|
|
11
|
-
*/
|
|
6
|
+
/** Previous signing secret during rotation (SLACK_SIGNING_SECRET_PREVIOUS); the verifier tries `signingSecret` first, then this. */
|
|
12
7
|
previousSecret?: string;
|
|
13
8
|
/** Current unix seconds. Injectable for tests. */
|
|
14
9
|
now?: number;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHmac, timingSafeEqual } from 'crypto';
|
|
2
|
+
const DEFAULT_SKEW_SECONDS = 5 * 60;
|
|
2
3
|
function verifyOne(rawBody, signature, timestamp, secret) {
|
|
3
4
|
if (!signature.startsWith('v0='))
|
|
4
5
|
return false;
|
|
@@ -12,7 +13,7 @@ function verifyOne(rawBody, signature, timestamp, secret) {
|
|
|
12
13
|
export function verifySlackSignature(opts) {
|
|
13
14
|
const { rawBody, timestamp, signature, signingSecret, previousSecret } = opts;
|
|
14
15
|
const now = opts.now ?? Math.floor(Date.now() / 1000);
|
|
15
|
-
const skew = opts.skewSeconds ??
|
|
16
|
+
const skew = opts.skewSeconds ?? DEFAULT_SKEW_SECONDS;
|
|
16
17
|
const ts = Number(timestamp);
|
|
17
18
|
if (!Number.isFinite(ts))
|
|
18
19
|
return false;
|
|
@@ -1,19 +1,5 @@
|
|
|
1
|
-
import type
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
* Returns:
|
|
6
|
-
* - mapped tenant_id when slack_workspaces has a row for `teamId`
|
|
7
|
-
* - the deployment's HIPPO_TENANT fallback (or 'default') when slack_workspaces
|
|
8
|
-
* is empty (single-workspace install — env fallback is safe)
|
|
9
|
-
* - null when slack_workspaces is non-empty AND `teamId` is unknown
|
|
10
|
-
* (multi-workspace install — fail closed; an unknown team is not the
|
|
11
|
-
* deployment's tenant). Escape hatch: SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK=1
|
|
12
|
-
* restores the env fallback for emergency rollback only.
|
|
13
|
-
*
|
|
14
|
-
* The fail-closed contract lives here so every caller (route handler, CLI
|
|
15
|
-
* replay, future MCP) gets the same protection against routing a foreign
|
|
16
|
-
* workspace's events into the deployment tenant.
|
|
17
|
-
*/
|
|
18
|
-
export declare function resolveTenantForTeam(db: DatabaseSyncLike, teamId: string): string | null;
|
|
1
|
+
import { type HippoStore } 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 (single-workspace install).
|
|
3
|
+
* An unknown team on a multi-workspace install returns null (fail closed); SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK=1 is the emergency escape. */
|
|
4
|
+
export declare function resolveTenantForSlackTeam(hippoRoot: string, teamId: string, store?: HippoStore): Promise<string | null>;
|
|
19
5
|
//# sourceMappingURL=tenant-routing.d.ts.map
|
|
@@ -1,34 +1,14 @@
|
|
|
1
|
-
import { envSlackAllowUnknownTeamFallback, envTenant } from '../../env.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
* restores the env fallback for emergency rollback only.
|
|
13
|
-
*
|
|
14
|
-
* The fail-closed contract lives here so every caller (route handler, CLI
|
|
15
|
-
* replay, future MCP) gets the same protection against routing a foreign
|
|
16
|
-
* workspace's events into the deployment tenant.
|
|
17
|
-
*/
|
|
18
|
-
export function resolveTenantForTeam(db, teamId) {
|
|
19
|
-
// SAFETY: query selects only `tenant_id`, so a returned row has that shape;
|
|
20
|
-
// .get() returns undefined when no row matches.
|
|
21
|
-
const row = db
|
|
22
|
-
.prepare(`SELECT tenant_id FROM slack_workspaces WHERE team_id = ?`)
|
|
23
|
-
.get(teamId);
|
|
24
|
-
if (row?.tenant_id)
|
|
25
|
-
return row.tenant_id;
|
|
26
|
-
// SAFETY: `COUNT(*) AS c` always returns exactly one row shaped { c }; sqlite
|
|
27
|
-
// may return the count as number or bigint depending on driver.
|
|
28
|
-
const total = db
|
|
29
|
-
.prepare(`SELECT COUNT(*) AS c FROM slack_workspaces`)
|
|
30
|
-
.get().c;
|
|
31
|
-
if (Number(total) === 0) {
|
|
1
|
+
import { envSlackAllowUnknownTeamFallback, envTenant } from '../../util/env.js';
|
|
2
|
+
import { requireGroup, storeFor } from '../../store/index.js';
|
|
3
|
+
/** Look up the tenant_id for a Slack team_id; the HIPPO_TENANT fallback applies only when slack_workspaces is empty (single-workspace install).
|
|
4
|
+
* An unknown team on a multi-workspace install returns null (fail closed); SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK=1 is the emergency escape. */
|
|
5
|
+
export async function resolveTenantForSlackTeam(hippoRoot, teamId, store) {
|
|
6
|
+
return tenantForRoute(await requireGroup(storeFor({ hippoRoot, store }), 'connectorEvents').slackTeamRoute(teamId));
|
|
7
|
+
}
|
|
8
|
+
function tenantForRoute(route) {
|
|
9
|
+
if (route.tenantId !== null)
|
|
10
|
+
return route.tenantId;
|
|
11
|
+
if (route.workspaceCount === 0) {
|
|
32
12
|
// Single-workspace install: env fallback is safe.
|
|
33
13
|
return envTenant();
|
|
34
14
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RememberOpts } from '../../api.js';
|
|
1
|
+
import type { RememberOpts } from '../../api/index.js';
|
|
2
2
|
import { type ChannelMeta } from './scope.js';
|
|
3
3
|
import type { SlackMessageEvent } from './types.js';
|
|
4
4
|
export interface TransformInput {
|
|
@@ -6,23 +6,7 @@ export interface TransformInput {
|
|
|
6
6
|
channel: ChannelMeta;
|
|
7
7
|
message: SlackMessageEvent;
|
|
8
8
|
}
|
|
9
|
-
/**
|
|
10
|
-
*
|
|
11
|
-
* null when the message has no usable body (e.g. system events, bot reactions
|
|
12
|
-
* without text). Caller treats null as "skip but mark idempotency seen".
|
|
13
|
-
*
|
|
14
|
-
* Contract:
|
|
15
|
-
* - kind is the literal 'raw' (connector boundary, see src/importers.ts).
|
|
16
|
-
* - artifact_ref format MUST be exactly `slack://${teamId}/${channelId}/${ts}`;
|
|
17
|
-
* the deletion path looks up by this string.
|
|
18
|
-
* - owner is non-null whenever a row is written. Required by the
|
|
19
|
-
* provenance gate (`hippo provenance --strict`).
|
|
20
|
-
* - `user:<slack_user_id>` when the event carries a `user`.
|
|
21
|
-
* - `bot:<bot_id>` for the `bot_message` subtype (or any userless+text event
|
|
22
|
-
* that supplies bot_id).
|
|
23
|
-
* - `bot:unknown` only as a last-resort sentinel so the gate never sees null.
|
|
24
|
-
* Skipping userless messages instead would silently drop bot ingestion
|
|
25
|
-
* via the "skipped but seen" path in ingest.ts.
|
|
26
|
-
*/
|
|
9
|
+
/** Convert a SlackMessageEvent into RememberOpts; returns null when the message has no usable body so the caller marks it seen and skips it.
|
|
10
|
+
* artifact_ref MUST be `slack://${teamId}/${channelId}/${ts}` (deletion looks it up); owner is never null: `user:<id>`, `bot:<bot_id>`, else `bot:unknown`. */
|
|
27
11
|
export declare function messageToRememberOpts(input: TransformInput): RememberOpts | null;
|
|
28
12
|
//# sourceMappingURL=transform.d.ts.map
|
|
@@ -1,22 +1,6 @@
|
|
|
1
1
|
import { scopeFromChannel } from './scope.js';
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
* null when the message has no usable body (e.g. system events, bot reactions
|
|
5
|
-
* without text). Caller treats null as "skip but mark idempotency seen".
|
|
6
|
-
*
|
|
7
|
-
* Contract:
|
|
8
|
-
* - kind is the literal 'raw' (connector boundary, see src/importers.ts).
|
|
9
|
-
* - artifact_ref format MUST be exactly `slack://${teamId}/${channelId}/${ts}`;
|
|
10
|
-
* the deletion path looks up by this string.
|
|
11
|
-
* - owner is non-null whenever a row is written. Required by the
|
|
12
|
-
* provenance gate (`hippo provenance --strict`).
|
|
13
|
-
* - `user:<slack_user_id>` when the event carries a `user`.
|
|
14
|
-
* - `bot:<bot_id>` for the `bot_message` subtype (or any userless+text event
|
|
15
|
-
* that supplies bot_id).
|
|
16
|
-
* - `bot:unknown` only as a last-resort sentinel so the gate never sees null.
|
|
17
|
-
* Skipping userless messages instead would silently drop bot ingestion
|
|
18
|
-
* via the "skipped but seen" path in ingest.ts.
|
|
19
|
-
*/
|
|
2
|
+
/** Convert a SlackMessageEvent into RememberOpts; returns null when the message has no usable body so the caller marks it seen and skips it.
|
|
3
|
+
* artifact_ref MUST be `slack://${teamId}/${channelId}/${ts}` (deletion looks it up); owner is never null: `user:<id>`, `bot:<bot_id>`, else `bot:unknown`. */
|
|
20
4
|
export function messageToRememberOpts(input) {
|
|
21
5
|
const text = input.message.text?.trim();
|
|
22
6
|
if (!text)
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
import { type JsonValue } from '../../json.js';
|
|
1
|
+
/** Slack Events API envelope shapes used by the ingestion connector.
|
|
2
|
+
* Spec: https://api.slack.com/events-api */
|
|
3
|
+
import { type JsonValue } from '../../util/json.js';
|
|
6
4
|
export interface SlackUrlVerification {
|
|
7
5
|
type: 'url_verification';
|
|
8
6
|
challenge: string;
|
|
@@ -17,11 +15,7 @@ export interface SlackMessageEvent {
|
|
|
17
15
|
text?: string;
|
|
18
16
|
ts: string;
|
|
19
17
|
thread_ts?: string;
|
|
20
|
-
/**
|
|
21
|
-
* Slack `bot_message` subtype carries `bot_id` instead of `user`. The
|
|
22
|
-
* provenance gate requires a non-null `owner`, so transform.ts
|
|
23
|
-
* derives `owner: bot:<bot_id>` when `user` is absent.
|
|
24
|
-
*/
|
|
18
|
+
/** The `bot_message` subtype carries `bot_id` instead of `user`; transform.ts derives `owner: bot:<bot_id>` from it. */
|
|
25
19
|
bot_id?: string;
|
|
26
20
|
/** Present on subtype='message_deleted'. */
|
|
27
21
|
deleted_ts?: string;
|
|
@@ -1,19 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
import { isJsonString } from '../../json.js';
|
|
6
|
-
function isJsonNumber(value) {
|
|
7
|
-
return typeof value === 'number';
|
|
8
|
-
}
|
|
9
|
-
function isJsonRecord(value) {
|
|
10
|
-
return (value !== null &&
|
|
11
|
-
value !== undefined &&
|
|
12
|
-
!Array.isArray(value) &&
|
|
13
|
-
typeof value === 'object');
|
|
14
|
-
}
|
|
1
|
+
/** Slack Events API envelope shapes used by the ingestion connector.
|
|
2
|
+
* Spec: https://api.slack.com/events-api */
|
|
3
|
+
import { isJsonString, isJsonObject, isJsonNumber } from '../../util/json.js';
|
|
15
4
|
export function isSlackEventEnvelope(x) {
|
|
16
|
-
if (!
|
|
5
|
+
if (!isJsonObject(x))
|
|
17
6
|
return false;
|
|
18
7
|
const o = x;
|
|
19
8
|
if (o.type !== 'event_callback')
|
|
@@ -22,7 +11,7 @@ export function isSlackEventEnvelope(x) {
|
|
|
22
11
|
return false;
|
|
23
12
|
}
|
|
24
13
|
const event = o.event;
|
|
25
|
-
return
|
|
14
|
+
return isJsonObject(event) && isJsonString(event.type);
|
|
26
15
|
}
|
|
27
16
|
export function isSlackMessageEvent(x) {
|
|
28
17
|
if (x === null || typeof x !== 'object' || Array.isArray(x))
|