hippo-memory 1.70.0 → 1.72.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 +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- 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 +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- 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 +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- 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/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +49 -40
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- 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 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- 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 +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- 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 +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +3 -2
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +24 -44
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +4 -3
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +24 -53
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +16 -19
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- 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 +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +24 -60
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +11 -63
- package/dist/store/summaries.js +37 -148
- package/dist/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 +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +35 -6
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- package/extensions/openclaw-plugin/index.ts +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
package/dist/util/http-util.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { ApiError } from '../core/api-errors.js';
|
|
2
|
-
import { SqliteBlockedError } from './sqlite-blocked.js';
|
|
3
1
|
import { envBodyTimeoutMs } from './env.js';
|
|
4
2
|
// Leaf module shared by server.ts and the connector webhook receivers; it must not import either.
|
|
5
3
|
// node:http header values are `string | string[] | undefined` (never a bare
|
|
@@ -15,8 +13,6 @@ function sizeLabel(bytes) {
|
|
|
15
13
|
}
|
|
16
14
|
// How long a refused upload is still read and discarded after its reply, so a client that never stops cannot hold the socket.
|
|
17
15
|
const REFUSED_UPLOAD_LINGER_MS = 2000;
|
|
18
|
-
// Cap for id-shaped request fields (ids, tenant, session, scope, class): far above real values, small enough to bound logs and indexes.
|
|
19
|
-
export const MAX_ID_LEN = 256;
|
|
20
16
|
export const JSON_HEADERS = { 'content-type': 'application/json' };
|
|
21
17
|
export class HttpError extends Error {
|
|
22
18
|
status;
|
|
@@ -43,22 +39,6 @@ export class BodyTimeoutError extends Error {
|
|
|
43
39
|
export const INTERNAL_ERROR_MESSAGE = 'internal server error';
|
|
44
40
|
/** The reply when a request under another store reaches code that still opens hippo.db. */
|
|
45
41
|
export const STORE_NOT_PORTED_MESSAGE = 'store_not_ported';
|
|
46
|
-
/** Maps by class so rewording a message never moves a status; an untyped error is a 500 whose text stays in the server log. */
|
|
47
|
-
export function mapApiError(err) {
|
|
48
|
-
// An add-on can build an HttpError from any number, and writeHead throws on one outside 100-999.
|
|
49
|
-
if (err instanceof HttpError && !(Number.isInteger(err.status) && err.status >= 100 && err.status <= 999)) {
|
|
50
|
-
return { status: 500, message: INTERNAL_ERROR_MESSAGE };
|
|
51
|
-
}
|
|
52
|
-
if (err instanceof HttpError || err instanceof ApiError)
|
|
53
|
-
return { status: err.status, message: err.message };
|
|
54
|
-
if (err instanceof BodyTooLargeError)
|
|
55
|
-
return { status: 413, message: err.message };
|
|
56
|
-
if (err instanceof BodyTimeoutError)
|
|
57
|
-
return { status: 408, message: err.message };
|
|
58
|
-
if (err instanceof SqliteBlockedError)
|
|
59
|
-
return { status: 501, message: STORE_NOT_PORTED_MESSAGE };
|
|
60
|
-
return { status: 500, message: INTERNAL_ERROR_MESSAGE };
|
|
61
|
-
}
|
|
62
42
|
/** Serialises before the head goes out, so a body that is not JSON still reaches the caller's error reply. */
|
|
63
43
|
export function sendJson(res, status, body) {
|
|
64
44
|
const text = JSON.stringify(body);
|
|
@@ -121,7 +101,16 @@ export function isCrossSite(req) {
|
|
|
121
101
|
if (site !== undefined && site !== 'same-origin' && site !== 'none')
|
|
122
102
|
return true;
|
|
123
103
|
const origin = req.headers.origin;
|
|
124
|
-
return origin !== undefined && origin !==
|
|
104
|
+
return origin !== undefined && originHost(origin) !== req.headers.host;
|
|
105
|
+
}
|
|
106
|
+
// Scheme is ignored so an https page behind a TLS-terminating proxy still matches its own Host.
|
|
107
|
+
function originHost(origin) {
|
|
108
|
+
try {
|
|
109
|
+
return new URL(origin).host;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
125
114
|
}
|
|
126
115
|
// A webhook route takes no key, so anyone holding a signature header could otherwise keep a socket open with a body that never ends.
|
|
127
116
|
const WEBHOOK_BODY_DEADLINE_MS = 10_000;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const MAX_ID_LEN = 256;
|
|
2
|
+
export declare const DEFAULT_LIST_LIMIT = 100;
|
|
3
|
+
export declare const MAX_LIST_LIMIT = 1000;
|
|
4
|
+
/** The one list-limit rule: absent means the default; a positive integer up to the ceiling passes.
|
|
5
|
+
* Anything else returns undefined, so each surface words its own error. */
|
|
6
|
+
export declare function resolveListLimit(requested: number | undefined, defaultLimit?: number, maxLimit?: number): number | undefined;
|
|
7
|
+
//# sourceMappingURL=limits.d.ts.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Cap for id-shaped request fields (ids, tenant, session, scope, class): far above real values, small enough to bound logs and indexes.
|
|
2
|
+
export const MAX_ID_LEN = 256;
|
|
3
|
+
// Page size every list surface (CLI, HTTP, store) falls back to when the caller names none.
|
|
4
|
+
export const DEFAULT_LIST_LIMIT = 100;
|
|
5
|
+
// Ceiling for a caller-named list page; SQLite `LIMIT ?` and one response's size bound it, and every list surface shares it.
|
|
6
|
+
export const MAX_LIST_LIMIT = 1000;
|
|
7
|
+
/** The one list-limit rule: absent means the default; a positive integer up to the ceiling passes.
|
|
8
|
+
* Anything else returns undefined, so each surface words its own error. */
|
|
9
|
+
export function resolveListLimit(requested, defaultLimit = DEFAULT_LIST_LIMIT, maxLimit = Infinity) {
|
|
10
|
+
if (requested === undefined)
|
|
11
|
+
return defaultLimit;
|
|
12
|
+
return Number.isInteger(requested) && requested > 0 && requested <= maxLimit ? requested : undefined;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=limits.js.map
|
package/dist/util/log.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
/** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info,
|
|
1
|
+
/** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info,
|
|
2
|
+
* debug); unset or unknown means warn. `HIPPO_LOG_FORMAT=json` writes JSON lines. */
|
|
2
3
|
export type LogLevel = 'error' | 'warn' | 'info' | 'debug';
|
|
3
4
|
/** Extra key=value pairs appended to the line. `ts` and, inside a request, `requestId` are added to every line written. */
|
|
4
5
|
export interface LogFields {
|
|
@@ -13,7 +14,7 @@ export declare function isLevelEnabled(level: LogLevel): boolean;
|
|
|
13
14
|
export declare function formatLogLine(level: LogLevel, message: string, fields?: LogFields): string;
|
|
14
15
|
/** One JSON object per line for a log collector; JSON escaping keeps a multi-line value on the one line. */
|
|
15
16
|
export declare function formatLogJson(level: LogLevel, message: string, fields?: LogFields): string;
|
|
16
|
-
/** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. */
|
|
17
|
+
/** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. Past the key cap an unseen key logs at debug. */
|
|
17
18
|
declare function once(key: string, level: LogLevel, message: string, fields?: LogFields): void;
|
|
18
19
|
/** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
|
|
19
20
|
declare function warnThenDebug(key: string, message: string, fields?: LogFields): void;
|
|
@@ -29,6 +30,10 @@ export declare const log: {
|
|
|
29
30
|
};
|
|
30
31
|
/** Message for a caught value of unknown shape. `cause` names the sanctioned unknown-input case (error-cause enrichment). */
|
|
31
32
|
export declare function errorMessage(cause: unknown): string;
|
|
33
|
+
/** One post-compact failure, told once to the hook's output (`say`) and once to the structured log. */
|
|
34
|
+
export declare function reportCompactionFailure(say: (message: string) => void, step: string, reason: string): void;
|
|
35
|
+
/** The string `code` of a caught value (an errno name such as EACCES), or '' when it has none. */
|
|
36
|
+
export declare function errorCode(cause: unknown): string;
|
|
32
37
|
/** Test hook: forget which once-keys have fired. */
|
|
33
38
|
export declare function resetLogOnce(): void;
|
|
34
39
|
export {};
|
package/dist/util/log.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
/** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info,
|
|
1
|
+
/** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info,
|
|
2
|
+
* debug); unset or unknown means warn. `HIPPO_LOG_FORMAT=json` writes JSON lines. */
|
|
2
3
|
import { envLogJson, envLogLevel } from './env.js';
|
|
3
4
|
import { currentRequestId } from './request-scope.js';
|
|
4
5
|
const RANK = { error: 0, warn: 1, info: 2, debug: 3 };
|
|
@@ -36,19 +37,33 @@ function write(level, message, fields) {
|
|
|
36
37
|
const format = envLogJson() ? formatLogJson : formatLogLine;
|
|
37
38
|
process.stderr.write(`${format(level, message, stamped)}\n`);
|
|
38
39
|
}
|
|
40
|
+
// Some keys follow the data (one per damaged row and column), so the set of them stops growing here.
|
|
41
|
+
const ONCE_KEY_CAP = 1_000;
|
|
39
42
|
const onceKeys = new Set();
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
let onceCapReported = false;
|
|
44
|
+
/** 'new' records the key and 'seen' is a repeat. 'uncounted' is an unseen key once the set is full: it is not recorded, and the first one says so at warn. */
|
|
45
|
+
function sightOnceKey(key) {
|
|
42
46
|
if (onceKeys.has(key))
|
|
43
|
-
return;
|
|
44
|
-
onceKeys.
|
|
45
|
-
|
|
47
|
+
return 'seen';
|
|
48
|
+
if (onceKeys.size < ONCE_KEY_CAP) {
|
|
49
|
+
onceKeys.add(key);
|
|
50
|
+
return 'new';
|
|
51
|
+
}
|
|
52
|
+
if (!onceCapReported) {
|
|
53
|
+
onceCapReported = true;
|
|
54
|
+
write('warn', `log: ${ONCE_KEY_CAP} once-only warnings were written; further new ones in this process log at debug`);
|
|
55
|
+
}
|
|
56
|
+
return 'uncounted';
|
|
57
|
+
}
|
|
58
|
+
/** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. Past the key cap an unseen key logs at debug. */
|
|
59
|
+
function once(key, level, message, fields) {
|
|
60
|
+
const sighting = sightOnceKey(key);
|
|
61
|
+
if (sighting !== 'seen')
|
|
62
|
+
write(sighting === 'new' ? level : 'debug', message, fields);
|
|
46
63
|
}
|
|
47
64
|
/** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
|
|
48
65
|
function warnThenDebug(key, message, fields) {
|
|
49
|
-
|
|
50
|
-
onceKeys.add(key);
|
|
51
|
-
write(level, message, fields);
|
|
66
|
+
write(sightOnceKey(key) === 'new' ? 'warn' : 'debug', message, fields);
|
|
52
67
|
}
|
|
53
68
|
/** The class name and stack of a thrown value, as log fields; a non-Error throw has no stack. */
|
|
54
69
|
export function errorFields(err) {
|
|
@@ -68,8 +83,18 @@ export const log = {
|
|
|
68
83
|
export function errorMessage(cause) {
|
|
69
84
|
return cause instanceof Error ? cause.message : String(cause);
|
|
70
85
|
}
|
|
86
|
+
/** One post-compact failure, told once to the hook's output (`say`) and once to the structured log. */
|
|
87
|
+
export function reportCompactionFailure(say, step, reason) {
|
|
88
|
+
say(`${step} failed: ${reason}`);
|
|
89
|
+
log.error(`post-compact: ${step} failed: ${reason}`);
|
|
90
|
+
}
|
|
91
|
+
/** The string `code` of a caught value (an errno name such as EACCES), or '' when it has none. */
|
|
92
|
+
export function errorCode(cause) {
|
|
93
|
+
return cause instanceof Error && 'code' in cause ? String(cause.code) : '';
|
|
94
|
+
}
|
|
71
95
|
/** Test hook: forget which once-keys have fired. */
|
|
72
96
|
export function resetLogOnce() {
|
|
73
97
|
onceKeys.clear();
|
|
98
|
+
onceCapReported = false;
|
|
74
99
|
}
|
|
75
100
|
//# sourceMappingURL=log.js.map
|
|
@@ -6,6 +6,8 @@ export interface RequestScope {
|
|
|
6
6
|
/** Set for a served request that must be answered by a given time. */
|
|
7
7
|
readonly deadline?: RequestDeadline | undefined;
|
|
8
8
|
}
|
|
9
|
+
/** How long a request may run: 120 s, or HIPPO_REQUEST_DEADLINE_MS, where 0 turns the deadline off. */
|
|
10
|
+
export declare function requestDeadlineMs(): number;
|
|
9
11
|
/** When a request must be answered, and the store calls it still waits on: the store ends each of those soon after `at`, with the outcome only it knows. */
|
|
10
12
|
export declare class RequestDeadline {
|
|
11
13
|
#private;
|
|
@@ -14,7 +16,7 @@ export declare class RequestDeadline {
|
|
|
14
16
|
constructor(at: number);
|
|
15
17
|
/** Counts `call` as one the request waits on until it settles. */
|
|
16
18
|
track<T>(call: Promise<T>): Promise<T>;
|
|
17
|
-
/** Runs `fn` now, or once the last store call the request waits on has settled. */
|
|
19
|
+
/** Runs `fn` now, or once the last store call the request waits on has settled; every function registered meanwhile runs, in order. */
|
|
18
20
|
onceIdle(fn: () => void): void;
|
|
19
21
|
}
|
|
20
22
|
export declare const requestScopes: AsyncLocalStorage<RequestScope>;
|
|
@@ -22,6 +24,7 @@ export declare const requestScopes: AsyncLocalStorage<RequestScope>;
|
|
|
22
24
|
export declare function currentRequestId(): string | undefined;
|
|
23
25
|
/** The deadline of the request this code runs for, if it has one. */
|
|
24
26
|
export declare function currentDeadline(): RequestDeadline | undefined;
|
|
25
|
-
/** Runs `fn` with `requestId` on every log line it writes, including the ones from
|
|
27
|
+
/** Runs `fn` with `requestId` on every log line it writes, including the ones from
|
|
28
|
+
* timers and promises it starts. `deadline` reaches every store call made inside. */
|
|
26
29
|
export declare function runWithRequestId<T>(requestId: string, fn: () => T, deadline?: RequestDeadline): T;
|
|
27
30
|
//# sourceMappingURL=request-scope.d.ts.map
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
// The one ambient scope of a request. A leaf module, so the logger can read the request id without importing the store layer.
|
|
2
2
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
|
+
import { envRequestDeadlineMs } from './env.js';
|
|
4
|
+
const DEFAULT_REQUEST_DEADLINE_MS = 120_000;
|
|
5
|
+
/** How long a request may run: 120 s, or HIPPO_REQUEST_DEADLINE_MS, where 0 turns the deadline off. */
|
|
6
|
+
export function requestDeadlineMs() {
|
|
7
|
+
return envRequestDeadlineMs() ?? DEFAULT_REQUEST_DEADLINE_MS;
|
|
8
|
+
}
|
|
3
9
|
/** When a request must be answered, and the store calls it still waits on: the store ends each of those soon after `at`, with the outcome only it knows. */
|
|
4
10
|
export class RequestDeadline {
|
|
5
11
|
/** Epoch milliseconds. */
|
|
6
12
|
at;
|
|
7
13
|
#storeCalls = 0;
|
|
8
|
-
#whenIdle;
|
|
14
|
+
#whenIdle = [];
|
|
9
15
|
constructor(at) {
|
|
10
16
|
this.at = at;
|
|
11
17
|
}
|
|
@@ -16,19 +22,18 @@ export class RequestDeadline {
|
|
|
16
22
|
this.#storeCalls -= 1;
|
|
17
23
|
if (this.#storeCalls > 0)
|
|
18
24
|
return;
|
|
19
|
-
const idle
|
|
20
|
-
|
|
21
|
-
idle?.();
|
|
25
|
+
for (const idle of this.#whenIdle.splice(0))
|
|
26
|
+
idle();
|
|
22
27
|
};
|
|
23
28
|
call.then(done, done);
|
|
24
29
|
return call;
|
|
25
30
|
}
|
|
26
|
-
/** Runs `fn` now, or once the last store call the request waits on has settled. */
|
|
31
|
+
/** Runs `fn` now, or once the last store call the request waits on has settled; every function registered meanwhile runs, in order. */
|
|
27
32
|
onceIdle(fn) {
|
|
28
33
|
if (this.#storeCalls === 0)
|
|
29
34
|
fn();
|
|
30
35
|
else
|
|
31
|
-
this.#whenIdle
|
|
36
|
+
this.#whenIdle.push(fn);
|
|
32
37
|
}
|
|
33
38
|
}
|
|
34
39
|
export const requestScopes = new AsyncLocalStorage();
|
|
@@ -40,7 +45,8 @@ export function currentRequestId() {
|
|
|
40
45
|
export function currentDeadline() {
|
|
41
46
|
return requestScopes.getStore()?.deadline;
|
|
42
47
|
}
|
|
43
|
-
/** Runs `fn` with `requestId` on every log line it writes, including the ones from
|
|
48
|
+
/** Runs `fn` with `requestId` on every log line it writes, including the ones from
|
|
49
|
+
* timers and promises it starts. `deadline` reaches every store call made inside. */
|
|
44
50
|
export function runWithRequestId(requestId, fn, deadline) {
|
|
45
51
|
return requestScopes.run({ requestId, deadline }, fn);
|
|
46
52
|
}
|
|
@@ -1,22 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Conservative, provider-bounded patterns only - a bare `sk-` in prose must
|
|
5
|
-
* NOT flag. Detection gates two surfaces:
|
|
6
|
-
* - producer: shareMemory/autoShare never promote flagged rows to the
|
|
7
|
-
* global store;
|
|
8
|
-
* - consumer: ambient context (getContext) never injects a flagged row
|
|
9
|
-
* outside its owning project, and never anywhere when the row has no
|
|
10
|
-
* project origin. Explicit recall is unaffected - recalling a secret is
|
|
11
|
-
* a deliberate act.
|
|
12
|
-
*
|
|
13
|
-
* This is deliberately a thin slice of lifecycle compliance
|
|
14
|
-
* (no PII detection). Write-time scrubbing covers only text no person
|
|
15
|
-
* typed into hippo; see `vetSecrets`.
|
|
16
|
-
*
|
|
17
|
-
* Leaf module: keep free of imports from store/api/shared so all of them
|
|
18
|
-
* can import it without cycles.
|
|
19
|
-
*/
|
|
1
|
+
/** Secret detection for memory content: conservative provider-bounded patterns (a bare `sk-` in prose must not flag). Flagged rows are never shared to
|
|
2
|
+
* the global store or injected as ambient context outside their project; explicit recall is unaffected. Leaf module: no imports from store/api/shared. */
|
|
20
3
|
/** Result of scanning one memory. `reason` names the tag or pattern that fired. */
|
|
21
4
|
export interface SecretDetection {
|
|
22
5
|
flagged: boolean;
|
|
@@ -24,21 +7,13 @@ export interface SecretDetection {
|
|
|
24
7
|
}
|
|
25
8
|
/** Tags that flag a memory as secret, lower case; detectSecret folds a tag's case before the lookup. */
|
|
26
9
|
export declare const SECRET_TAGS: ReadonlySet<string>;
|
|
27
|
-
/**
|
|
28
|
-
* Scan a memory's tags + content for secret material.
|
|
29
|
-
* Pure and deterministic; no filesystem or store access.
|
|
30
|
-
*/
|
|
10
|
+
/** Scan a memory's tags + content for secret material; pure and deterministic, no filesystem or store access. */
|
|
31
11
|
export declare function detectSecret(entry: {
|
|
32
12
|
content: string;
|
|
33
13
|
tags: string[];
|
|
34
14
|
}): SecretDetection;
|
|
35
|
-
/**
|
|
36
|
-
*
|
|
37
|
-
* Reuses the same `SECRET_PATTERNS` / co-occurrence guard as `detectSecret`
|
|
38
|
-
* (which only flags whole-entry content) so callers that must persist raw
|
|
39
|
-
* text that never passes through the normal capture content gate (e.g. the
|
|
40
|
-
* pre-compact snapshot fields) can scrub it in place instead.
|
|
41
|
-
*/
|
|
15
|
+
/** Replace secret-shaped substrings in free text with a redaction marker, using the same `SECRET_PATTERNS` and co-occurrence guard as `detectSecret`;
|
|
16
|
+
* for callers persisting text that skips the capture content gate (e.g. pre-compact snapshot fields). */
|
|
42
17
|
export declare function redactSecrets(text: string): string;
|
|
43
18
|
/** Memories never hold a raw email address (AGENTS.md); phone numbers are left alone, as their patterns misfire on ids. */
|
|
44
19
|
export declare function maskEmails(text: string): string;
|
|
@@ -1,22 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Conservative, provider-bounded patterns only - a bare `sk-` in prose must
|
|
5
|
-
* NOT flag. Detection gates two surfaces:
|
|
6
|
-
* - producer: shareMemory/autoShare never promote flagged rows to the
|
|
7
|
-
* global store;
|
|
8
|
-
* - consumer: ambient context (getContext) never injects a flagged row
|
|
9
|
-
* outside its owning project, and never anywhere when the row has no
|
|
10
|
-
* project origin. Explicit recall is unaffected - recalling a secret is
|
|
11
|
-
* a deliberate act.
|
|
12
|
-
*
|
|
13
|
-
* This is deliberately a thin slice of lifecycle compliance
|
|
14
|
-
* (no PII detection). Write-time scrubbing covers only text no person
|
|
15
|
-
* typed into hippo; see `vetSecrets`.
|
|
16
|
-
*
|
|
17
|
-
* Leaf module: keep free of imports from store/api/shared so all of them
|
|
18
|
-
* can import it without cycles.
|
|
19
|
-
*/
|
|
1
|
+
/** Secret detection for memory content: conservative provider-bounded patterns (a bare `sk-` in prose must not flag). Flagged rows are never shared to
|
|
2
|
+
* the global store or injected as ambient context outside their project; explicit recall is unaffected. Leaf module: no imports from store/api/shared. */
|
|
20
3
|
/** Tags that flag a memory as secret, lower case; detectSecret folds a tag's case before the lookup. */
|
|
21
4
|
export const SECRET_TAGS = new Set([
|
|
22
5
|
'secret', 'api-key', 'apikey', 'credential', 'credentials',
|
|
@@ -26,7 +9,8 @@ const SECRET_PATTERNS = [
|
|
|
26
9
|
{ name: 'aws-access-key', re: /\bAKIA[0-9A-Z]{16}\b/ },
|
|
27
10
|
{ name: 'github-token', re: /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36}\b/ },
|
|
28
11
|
{ name: 'github-fine-grained-pat', re: /\bgithub_pat_[A-Za-z0-9_]{22,}\b/ },
|
|
29
|
-
// A token may end in a hyphen, where `\b` holds only before a word character: a class
|
|
12
|
+
// A token may end in a hyphen, where `\b` holds only before a word character: a class
|
|
13
|
+
// that holds `-` runs to its end, and a fixed length may also close on a hyphen.
|
|
30
14
|
{ name: 'slack-token', re: /\bxox[baprs]-[A-Za-z0-9-]{10,}/ },
|
|
31
15
|
{ name: 'stripe-key', re: /\b[sr]k_(?:live|test)_[A-Za-z0-9]{16,}\b/ },
|
|
32
16
|
{ name: 'google-api-key', re: /\bAIza[0-9A-Za-z_-]{35}(?:\b|(?<=-))/ },
|
|
@@ -38,16 +22,18 @@ const SECRET_PATTERNS = [
|
|
|
38
22
|
{ name: 'google-oauth-token', re: /\bya29\.[\w-]{20,}/ },
|
|
39
23
|
{ name: 'slack-webhook', re: /\bhooks\.slack\.com\/(?:services|workflows|triggers)\/[A-Za-z0-9+/]{43,56}/ },
|
|
40
24
|
{ name: 'private-key-block', re: /-----BEGIN [A-Z ]*PRIVATE KEY-----/ },
|
|
41
|
-
// sk-... (OpenAI/Anthropic
|
|
42
|
-
//
|
|
43
|
-
// like "the sk- prefix identifies API keys" without an actual long token
|
|
44
|
-
// does not flag, but a stored key ("prod API key sk_live_...")
|
|
45
|
-
// does.
|
|
25
|
+
// sk-... (OpenAI/Anthropic) and sk_<vendor>_... shapes; both need a key-ish noun in the content (co-occurrence guard), so prose
|
|
26
|
+
// like "the sk- prefix identifies API keys" does not flag but "prod API key sk_live_..." does.
|
|
46
27
|
{ name: 'sk-style-key', re: /\bsk-[A-Za-z0-9_-]{20,}/ },
|
|
47
28
|
{ name: 'sk-underscore-key', re: /\bsk_[A-Za-z0-9]+_[A-Za-z0-9_]{6,}\b/ },
|
|
48
|
-
//
|
|
49
|
-
// Secret names end in the keyword (dbPassword
|
|
50
|
-
{
|
|
29
|
+
// Value needs 12+ token-safe chars and a digit, or `token = estimateTokens(...)` and user:password@ templates would hide code lessons from ambient context.
|
|
30
|
+
// Secret names end in the keyword (dbPassword), so the match opens there, no prefix scan; pwd and pass need a _ (OLDPWD, bypass are not secrets).
|
|
31
|
+
{
|
|
32
|
+
name: 'secret-assignment',
|
|
33
|
+
re: new RegExp(String.raw `(?:(?:api[_-]?key|access[_-]?key|private[_-]?key|secret|token|passw(?:or)?d|(?<=_)(?:pwd|pass))` +
|
|
34
|
+
String.raw `(?:[_-]?(?:key(?:[_-]?base)?|value|secret))?['"]?\s*(?::=?|=>?)\s*['"]?|(?<=--)password(?:=|\s+))` +
|
|
35
|
+
String.raw `(?=[A-Za-z0-9_\-+/]*\d)[A-Za-z0-9_\-+/=]{12,}`, 'i'),
|
|
36
|
+
},
|
|
51
37
|
{ name: 'url-password', re: /(?<=[A-Za-z0-9]:\/\/)[^\s/:@?#]*:(?=[^\s/@?#]*\d)[^\s/@?#]+(?=@)/ },
|
|
52
38
|
];
|
|
53
39
|
const KEYISH_CONTEXT_RE = /key|token|secret|credential|bearer|auth|password/i;
|
|
@@ -59,10 +45,7 @@ const STRICT_ONLY_PATTERNS = [
|
|
|
59
45
|
/(?<![A-Za-z0-9_-])eyJ[A-Za-z0-9_-]{8,}\.eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]*/g,
|
|
60
46
|
/(?<=[A-Za-z0-9]:\/\/)[^\s/:@?#]*:[^\s/@?#]+(?=@)/g,
|
|
61
47
|
];
|
|
62
|
-
/**
|
|
63
|
-
* Scan a memory's tags + content for secret material.
|
|
64
|
-
* Pure and deterministic; no filesystem or store access.
|
|
65
|
-
*/
|
|
48
|
+
/** Scan a memory's tags + content for secret material; pure and deterministic, no filesystem or store access. */
|
|
66
49
|
export function detectSecret(entry) {
|
|
67
50
|
for (const tag of entry.tags) {
|
|
68
51
|
if (SECRET_TAGS.has(tag.toLowerCase())) {
|
|
@@ -78,17 +61,13 @@ export function detectSecret(entry) {
|
|
|
78
61
|
}
|
|
79
62
|
return { flagged: false, reason: null };
|
|
80
63
|
}
|
|
81
|
-
/**
|
|
82
|
-
*
|
|
83
|
-
* Reuses the same `SECRET_PATTERNS` / co-occurrence guard as `detectSecret`
|
|
84
|
-
* (which only flags whole-entry content) so callers that must persist raw
|
|
85
|
-
* text that never passes through the normal capture content gate (e.g. the
|
|
86
|
-
* pre-compact snapshot fields) can scrub it in place instead.
|
|
87
|
-
*/
|
|
64
|
+
/** Replace secret-shaped substrings in free text with a redaction marker, using the same `SECRET_PATTERNS` and co-occurrence guard as `detectSecret`;
|
|
65
|
+
* for callers persisting text that skips the capture content gate (e.g. pre-compact snapshot fields). */
|
|
88
66
|
export function redactSecrets(text) {
|
|
89
67
|
return redactText(text, false);
|
|
90
68
|
}
|
|
91
|
-
/** Only a run's first character starts a match, so a long run is scanned once; a
|
|
69
|
+
/** Only a run's first character starts a match, so a long run is scanned once; a
|
|
70
|
+
* domain's first label opens on a letter, so logo@2x.png and react@18.2.0 stay. */
|
|
92
71
|
const EMAIL = /(?<![A-Za-z0-9._%+-])[A-Za-z0-9._%+-]{1,64}@[A-Za-z][A-Za-z0-9-]*(?:\.[A-Za-z0-9-]+)*\.[A-Za-z]{2,}\b/g;
|
|
93
72
|
/** Memories never hold a raw email address (AGENTS.md); phone numbers are left alone, as their patterns misfire on ids. */
|
|
94
73
|
export function maskEmails(text) {
|
|
@@ -13,4 +13,6 @@ export declare class OtherStoreFolderError extends SqliteBlockedError {
|
|
|
13
13
|
readonly markerPath: string;
|
|
14
14
|
constructor(storeKind: string, markerPath: string);
|
|
15
15
|
}
|
|
16
|
+
/** First line of a best-effort catch around a hippo.db open: an unported path must fail closed, not fall back silently. */
|
|
17
|
+
export declare function rethrowIfSqliteBlocked<E>(err: E): void;
|
|
16
18
|
//# sourceMappingURL=sqlite-blocked.d.ts.map
|
|
@@ -26,4 +26,9 @@ export class OtherStoreFolderError extends SqliteBlockedError {
|
|
|
26
26
|
this.name = 'OtherStoreFolderError';
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
+
/** First line of a best-effort catch around a hippo.db open: an unported path must fail closed, not fall back silently. */
|
|
30
|
+
export function rethrowIfSqliteBlocked(err) {
|
|
31
|
+
if (err instanceof SqliteBlockedError)
|
|
32
|
+
throw err;
|
|
33
|
+
}
|
|
29
34
|
//# sourceMappingURL=sqlite-blocked.js.map
|
|
@@ -4,6 +4,6 @@ export interface StoredJsonSite {
|
|
|
4
4
|
id: string | number;
|
|
5
5
|
column: string;
|
|
6
6
|
}
|
|
7
|
-
/** Warns the first time this row's column is found damaged, then
|
|
7
|
+
/** Warns the first time this row's column is found damaged (the logger caps how many), then at debug, so a row read on every recall cannot flood stderr. */
|
|
8
8
|
export declare function warnDamagedColumn(site: StoredJsonSite, problem: 'not valid JSON' | 'wrong shape'): void;
|
|
9
9
|
//# sourceMappingURL=stored-json.d.ts.map
|
package/dist/util/stored-json.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// One log line for a stored JSON column that will not read, so a reader that degrades to an empty value still leaves a trace.
|
|
2
2
|
import { log } from './log.js';
|
|
3
|
-
/** Warns the first time this row's column is found damaged, then
|
|
3
|
+
/** Warns the first time this row's column is found damaged (the logger caps how many), then at debug, so a row read on every recall cannot flood stderr. */
|
|
4
4
|
export function warnDamagedColumn(site, problem) {
|
|
5
5
|
const { table, id, column } = site;
|
|
6
6
|
log.warnThenDebug(`damaged-column:${table}:${id}:${column}`, `store: ${table}.${column} is ${problem}; read as empty`, { table, id, column });
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import { errorMessage, log } from './log.js';
|
|
3
|
+
/** Mirrors every stdout and stderr chunk to `logFile` until the returned restore runs; an append failure warns once and never stops the real write. */
|
|
4
|
+
export function teeStdStreams(logFile) {
|
|
5
|
+
const origStdoutWrite = process.stdout.write.bind(process.stdout);
|
|
6
|
+
const origStderrWrite = process.stderr.write.bind(process.stderr);
|
|
7
|
+
let warned = false;
|
|
8
|
+
const tee = (chunk) => {
|
|
9
|
+
try {
|
|
10
|
+
fs.appendFileSync(logFile, chunk instanceof Uint8Array ? Buffer.from(chunk).toString('utf8') : chunk, 'utf8');
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
if (warned)
|
|
14
|
+
return;
|
|
15
|
+
warned = true;
|
|
16
|
+
log.warn(`log file ${logFile} is no longer writable; output continues without it: ${errorMessage(err)}`);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const wrapWrite = (origWrite) => {
|
|
20
|
+
const wrapped = (...args) => {
|
|
21
|
+
tee(args[0]);
|
|
22
|
+
// SAFETY: forwarding the exact arguments the real overloaded `write` received is safe; `StreamWriteArgs` is the union of both overloads' parameter lists.
|
|
23
|
+
return origWrite(...args);
|
|
24
|
+
};
|
|
25
|
+
// SAFETY: `wrapped` matches both real `write` overload shapes; TS cannot verify one implementation covers an overloaded type.
|
|
26
|
+
return wrapped;
|
|
27
|
+
};
|
|
28
|
+
process.stdout.write = wrapWrite(origStdoutWrite);
|
|
29
|
+
process.stderr.write = wrapWrite(origStderrWrite);
|
|
30
|
+
return () => {
|
|
31
|
+
process.stdout.write = origStdoutWrite;
|
|
32
|
+
process.stderr.write = origStderrWrite;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=stream-tee.js.map
|
package/dist/util/time.d.ts
CHANGED
package/dist/util/time.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
// Durations in the base layer, so no layer imports a higher one for a constant.
|
|
2
2
|
export const DAY_MS = 86_400_000;
|
|
3
|
+
export const MINUTE_MS = 60_000;
|
|
4
|
+
export const HOUR_MS = 3_600_000;
|
|
5
|
+
/** One 365-day year in seconds. */
|
|
6
|
+
export const YEAR_S = 31_536_000;
|
|
3
7
|
//# sourceMappingURL=time.js.map
|
|
@@ -8,10 +8,7 @@ export declare const DIGEST_DISPLAY_CHARS = 12;
|
|
|
8
8
|
export declare const DATE_PREFIX_CHARS = 10;
|
|
9
9
|
/** Characters of memory content shown as a one-line preview. */
|
|
10
10
|
export declare const CONTENT_PREVIEW_CHARS = 80;
|
|
11
|
-
/**
|
|
12
|
-
* Rough token estimate: characters / 4. The single estimate behind every
|
|
13
|
-
* token budget and ledger count in hippo.
|
|
14
|
-
*/
|
|
11
|
+
/** Rough token estimate: characters / 4, the single estimate behind every token budget and ledger count. */
|
|
15
12
|
export declare function estimateTokens(text: string): number;
|
|
16
13
|
/** Stable 16-hex-char hash of a rendered block, for change detection. */
|
|
17
14
|
export declare function blockHash(text: string): string;
|
package/dist/util/token-text.js
CHANGED
|
@@ -9,10 +9,7 @@ export const DIGEST_DISPLAY_CHARS = 12;
|
|
|
9
9
|
export const DATE_PREFIX_CHARS = 10;
|
|
10
10
|
/** Characters of memory content shown as a one-line preview. */
|
|
11
11
|
export const CONTENT_PREVIEW_CHARS = 80;
|
|
12
|
-
/**
|
|
13
|
-
* Rough token estimate: characters / 4. The single estimate behind every
|
|
14
|
-
* token budget and ledger count in hippo.
|
|
15
|
-
*/
|
|
12
|
+
/** Rough token estimate: characters / 4, the single estimate behind every token budget and ledger count. */
|
|
16
13
|
export function estimateTokens(text) {
|
|
17
14
|
return Math.ceil(text.length / 4);
|
|
18
15
|
}
|
|
@@ -4,4 +4,6 @@ export declare const PRE_COMPACT_TAIL_BYTES: number;
|
|
|
4
4
|
export declare function truncateCodePointSafe(text: string, maxChars: number): string;
|
|
5
5
|
/** The last `capBytes` of a JSONL transcript, read at an offset and starting on a whole line so every line parses. */
|
|
6
6
|
export declare function readTranscriptTail(transcriptPath: string, capBytes?: number): string;
|
|
7
|
+
/** {@link readTranscriptTail} for a transcript the caller opened and sized, so the size and the bytes come from one file. */
|
|
8
|
+
export declare function readOpenTranscriptTail(fd: number, size: number, capBytes: number): string;
|
|
7
9
|
//# sourceMappingURL=transcript-tail.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Transcript reads shared by capture
|
|
1
|
+
// Transcript reads shared by src/capture/ and compaction-record.ts; a leaf so neither has to import the other.
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
/** Never read the whole transcript: PreCompact fires exactly when it's largest. */
|
|
4
4
|
export const PRE_COMPACT_TAIL_BYTES = 256 * 1024;
|
|
@@ -16,33 +16,34 @@ export function truncateCodePointSafe(text, maxChars) {
|
|
|
16
16
|
}
|
|
17
17
|
/** The last `capBytes` of a JSONL transcript, read at an offset and starting on a whole line so every line parses. */
|
|
18
18
|
export function readTranscriptTail(transcriptPath, capBytes = PRE_COMPACT_TAIL_BYTES) {
|
|
19
|
-
const size = fs.statSync(transcriptPath).size;
|
|
20
|
-
const start = Math.max(0, size - capBytes);
|
|
21
|
-
const length = size - start;
|
|
22
|
-
if (length <= 0)
|
|
23
|
-
return '';
|
|
24
19
|
const fd = fs.openSync(transcriptPath, 'r');
|
|
25
20
|
try {
|
|
26
|
-
|
|
27
|
-
let onLineBoundary = start === 0;
|
|
28
|
-
if (!onLineBoundary) {
|
|
29
|
-
const prevByte = Buffer.alloc(1);
|
|
30
|
-
fs.readSync(fd, prevByte, 0, 1, start - 1);
|
|
31
|
-
onLineBoundary = prevByte[0] === 0x0a; // '\n'
|
|
32
|
-
}
|
|
33
|
-
const buf = Buffer.alloc(length);
|
|
34
|
-
fs.readSync(fd, buf, 0, length, start);
|
|
35
|
-
let text = buf.toString('utf8');
|
|
36
|
-
if (!onLineBoundary) {
|
|
37
|
-
// Landed mid-line — drop the partial first line so every remaining
|
|
38
|
-
// line parses as complete JSON.
|
|
39
|
-
const nl = text.indexOf('\n');
|
|
40
|
-
text = nl === -1 ? '' : text.slice(nl + 1);
|
|
41
|
-
}
|
|
42
|
-
return text;
|
|
21
|
+
return readOpenTranscriptTail(fd, fs.fstatSync(fd).size, capBytes);
|
|
43
22
|
}
|
|
44
23
|
finally {
|
|
45
24
|
fs.closeSync(fd);
|
|
46
25
|
}
|
|
47
26
|
}
|
|
27
|
+
/** {@link readTranscriptTail} for a transcript the caller opened and sized, so the size and the bytes come from one file. */
|
|
28
|
+
export function readOpenTranscriptTail(fd, size, capBytes) {
|
|
29
|
+
const start = Math.max(0, size - capBytes);
|
|
30
|
+
const length = size - start;
|
|
31
|
+
if (length <= 0)
|
|
32
|
+
return '';
|
|
33
|
+
// A seek that lands just after '\n' already starts a whole line and must keep it.
|
|
34
|
+
let onLineBoundary = start === 0;
|
|
35
|
+
if (!onLineBoundary) {
|
|
36
|
+
const prevByte = Buffer.alloc(1);
|
|
37
|
+
fs.readSync(fd, prevByte, 0, 1, start - 1);
|
|
38
|
+
onLineBoundary = prevByte[0] === 0x0a; // '\n'
|
|
39
|
+
}
|
|
40
|
+
const buf = Buffer.alloc(length);
|
|
41
|
+
fs.readSync(fd, buf, 0, length, start);
|
|
42
|
+
const text = buf.toString('utf8');
|
|
43
|
+
if (onLineBoundary)
|
|
44
|
+
return text;
|
|
45
|
+
// A read that lands mid-line drops the partial first line, so every line left parses as complete JSON.
|
|
46
|
+
const nl = text.indexOf('\n');
|
|
47
|
+
return nl === -1 ? '' : text.slice(nl + 1);
|
|
48
|
+
}
|
|
48
49
|
//# sourceMappingURL=transcript-tail.js.map
|
package/dist/util/version.d.ts
CHANGED
|
@@ -1,23 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
* hand. scripts/check-manifest-versions.mjs gates publish on all seven sites.
|
|
7
|
-
*
|
|
8
|
-
* Used by:
|
|
9
|
-
* - src/db/migrate.ts rollback-safety guard (refuses to open a DB stamped with
|
|
10
|
-
* min_compatible_binary newer than this).
|
|
11
|
-
* - src/server.ts HTTP /health.
|
|
12
|
-
* - src/mcp/server.ts MCP serverInfo.
|
|
13
|
-
*
|
|
14
|
-
* Why not read package.json at runtime: the npm-published bundle ships
|
|
15
|
-
* compiled `dist/` files that may not have package.json on a relative path
|
|
16
|
-
* an ESM `import` can resolve cleanly, and a hardcoded constant survives
|
|
17
|
-
* any packager that drops .json files.
|
|
18
|
-
*/
|
|
19
|
-
export declare const PACKAGE_VERSION = "1.70.0";
|
|
20
|
-
/** The floor a store takes on its first expiring key: the first release with schema v53, set by hand in that release; scripts/check-expiring-keys-floor.mjs gates it. */
|
|
1
|
+
/** Single source of truth for the package version, written by scripts/sync-version.mjs; never edit by hand. Read by the db rollback guard, /health, MCP.
|
|
2
|
+
* A constant, not a runtime package.json read: the published bundle may lack package.json on a path ESM can resolve. */
|
|
3
|
+
export declare const PACKAGE_VERSION = "1.72.0";
|
|
4
|
+
/** The floor a store takes on its first expiring key: the first release with schema
|
|
5
|
+
* v53, set by hand in that release; scripts/check-expiring-keys-floor.mjs gates it. */
|
|
21
6
|
export declare const EXPIRING_KEYS_MIN_BINARY = "1.64.0";
|
|
22
7
|
/** The floor a store takes on its first session bind or owner snapshot: first release with v54; set by hand in that release. */
|
|
23
8
|
export declare const TASK_OWNER_MIN_BINARY = "1.64.0";
|