hippo-memory 1.72.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -5
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/auth/audit.js +58 -0
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
- package/dist/api/{auth.js → auth/auth.js} +66 -54
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +14 -4
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +31 -34
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +120 -63
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +23 -17
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/memories/memories.js +52 -0
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/memories/outcome.js +28 -0
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/memories/promote.js +76 -0
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
- package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
- package/dist/api/{remember.js → memories/remember.js} +50 -32
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -3
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -5
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +35 -20
- package/dist/api/prompt-hook.js +66 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +116 -72
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +36 -8
- package/dist/api/session-end.js +71 -25
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +27 -12
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +34 -15
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +18 -9
- package/dist/capture/compaction-spool.js +105 -63
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +58 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +33 -33
- package/dist/cli/auth.js +23 -31
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -5
- package/dist/cli/client.js +53 -23
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +43 -18
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +5 -4
- package/dist/cli/curate.js +55 -77
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +30 -30
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +34 -10
- package/dist/cli/hook-runtime.js +41 -16
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +35 -20
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +5 -5
- package/dist/cli/object-verbs.js +13 -16
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +17 -22
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +17 -7
- package/dist/cli/remember.js +51 -55
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +28 -18
- package/dist/cli/session-hooks.d.ts +2 -6
- package/dist/cli/session-hooks.js +140 -112
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +56 -34
- package/dist/cli/shared.d.ts +4 -2
- package/dist/cli/shared.js +26 -11
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +16 -8
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +97 -82
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +1 -1
- package/dist/cli/verb-row.d.ts +2 -0
- package/dist/cli/verbs/health.js +2 -0
- package/dist/cli/verbs/memory.js +47 -53
- package/dist/cli/verbs/objects.js +16 -7
- package/dist/cli/verbs/sessions.js +4 -2
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +14 -18
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -7
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -4
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -5
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -5
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +36 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -3
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -5
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -4
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -5
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +24 -10
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +45 -39
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +28 -17
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +37 -14
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +47 -37
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +42 -39
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +27 -30
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +38 -29
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +22 -17
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +87 -30
- package/dist/core/memory.js +82 -33
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +39 -11
- package/dist/core/physics.js +71 -21
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +35 -18
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +18 -7
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +5 -7
- package/dist/dashboard/dashboard.js +22 -8
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +8 -2
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +40 -20
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -0
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -8
- package/dist/db/physics-state.js +17 -50
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +20 -5
- package/dist/db/request-stores.js +15 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +35 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +7 -1
- package/dist/doctor.js +128 -46
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +11 -7
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +32 -27
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +50 -0
- package/dist/entry/store-kit.js +27 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +17 -7
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +72 -33
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +11 -10
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +3 -3
- package/dist/importers/vault.js +61 -45
- package/dist/index.d.ts +33 -7
- package/dist/index.js +26 -8
- package/dist/learn/autolearn.d.ts +21 -6
- package/dist/learn/autolearn.js +57 -26
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +17 -10
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -6
- package/dist/learn/invalidation.js +62 -28
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +21 -20
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +61 -77
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +59 -23
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +19 -9
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +12 -4
- package/dist/search/embed-memories.js +96 -58
- package/dist/search/engine.d.ts +11 -0
- package/dist/search/engine.js +14 -0
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +14 -8
- package/dist/server/auth.d.ts +19 -15
- package/dist/server/auth.js +68 -38
- package/dist/server/boot.d.ts +4 -1
- package/dist/server/boot.js +115 -67
- package/dist/server/client-ip.d.ts +17 -5
- package/dist/server/client-ip.js +56 -21
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +550 -97
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -17
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +40 -18
- package/dist/server/tls.d.ts +10 -2
- package/dist/server/tls.js +25 -5
- package/dist/server/types.d.ts +41 -24
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +17 -49
- package/dist/server.js +33 -40
- package/dist/sharing/global-store.d.ts +6 -12
- package/dist/sharing/global-store.js +8 -48
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +17 -7
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +28 -14
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +40 -18
- package/dist/store/ambient.js +10 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +90 -41
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +97 -63
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +101 -37
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +16 -5
- package/dist/store/conflicts.js +104 -48
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +58 -6
- package/dist/store/connectors/event-log.d.ts +122 -0
- package/dist/store/connectors/event-log.js +25 -0
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +30 -48
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +31 -47
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -10
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +70 -28
- package/dist/store/delivery-recorder.d.ts +10 -7
- package/dist/store/delivery-recorder.js +70 -37
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +26 -10
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +45 -19
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +72 -21
- package/dist/store/entry-reads.js +215 -69
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +26 -14
- package/dist/store/entry-writes.d.ts +28 -13
- package/dist/store/entry-writes.js +61 -22
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +11 -12
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +29 -19
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +15 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +13 -7
- package/dist/store/handoffs.js +44 -22
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +4 -2
- package/dist/store/index.js +2 -1
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +96 -19
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +6 -3
- package/dist/store/open.js +20 -10
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +261 -219
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +128 -64
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +46 -20
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +20 -13
- package/dist/store/rule-sql.d.ts +7 -3
- package/dist/store/rule-sql.js +26 -13
- package/dist/store/search-rows.d.ts +16 -11
- package/dist/store/search-rows.js +54 -32
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +12 -5
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +8 -0
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +15 -0
- package/dist/store/sqlite/last-recall-group.js +62 -0
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +61 -0
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +97 -38
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -18
- package/dist/store/sqlite/store.js +95 -33
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +25 -11
- package/dist/store/summaries.js +84 -27
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +8 -4
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +28 -11
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +7 -2
- package/dist/util/anthropic-messages.js +18 -7
- package/dist/util/atomic-write.d.ts +8 -3
- package/dist/util/atomic-write.js +36 -21
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +26 -5
- package/dist/util/env.js +87 -25
- package/dist/util/format.d.ts +2 -0
- package/dist/util/format.js +4 -0
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +16 -4
- package/dist/util/request-scope.js +19 -6
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +11 -0
- package/dist/util/spawn-argv.js +66 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +4 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/audit.js +0 -56
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -7
- package/dist/api/learn.js +0 -124
- package/dist/api/memories.d.ts +0 -23
- package/dist/api/memories.js +0 -46
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/outcome.js +0 -21
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/promote.js +0 -65
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -120
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -10
- package/dist/cli/lenient-id.d.ts +0 -2
- package/dist/cli/lenient-id.js +0 -13
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -21
- package/dist/store/sqlite/local.js +0 -39
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Sleep's tombstone checks run on one handle for the whole pass, owned here so no stage holds a raw one.
|
|
2
2
|
import { closeHippoDb, openHippoDb } from '../db/index.js';
|
|
3
|
-
import { appendAuditEvent } from './audit.js';
|
|
3
|
+
import { appendAuditEvent, reportAuditWriteFailure } from './audit.js';
|
|
4
4
|
import { findRejectedValue } from './rejection.js';
|
|
5
|
+
import { errorMessage } from '../util/log.js';
|
|
5
6
|
// Lazy so a sleep that checks nothing never opens the store; make it IMMEDIATELY before the try whose
|
|
6
7
|
// finally closes it, so a throw in any phase cannot leak the handle.
|
|
7
8
|
export function lazyTombstoneChecks(hippoRoot, dryRun) {
|
|
@@ -22,6 +23,14 @@ export function lazyTombstoneChecks(hippoRoot, dryRun) {
|
|
|
22
23
|
if (db)
|
|
23
24
|
appendAuditEvent(db, event);
|
|
24
25
|
},
|
|
26
|
+
auditOrCount(event) {
|
|
27
|
+
try {
|
|
28
|
+
this.audit(event);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
reportAuditWriteFailure(event.op, errorMessage(error), event.targetId);
|
|
32
|
+
}
|
|
33
|
+
},
|
|
25
34
|
close() {
|
|
26
35
|
if (handle)
|
|
27
36
|
closeHippoDb(handle);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// The token-use and failure reports, each read on one handle of its own.
|
|
2
|
-
// A file apart from token-ledger-rows.ts: src/store/token-ledger.ts imports that one, so a summary there would be an
|
|
2
|
+
// A file apart from token-ledger-rows.ts: src/store/token-ledger.ts imports that one, so a summary there would be an
|
|
3
|
+
// import cycle.
|
|
3
4
|
import { onHandle } from './open.js';
|
|
4
5
|
import { summarizeTokenUse } from './token-ledger.js';
|
|
5
6
|
import { summarizeFailures } from './failure-log.js';
|
|
@@ -15,7 +15,8 @@ export declare function replacesIndex(state: EmbeddingIndexState, model: string)
|
|
|
15
15
|
export declare function storedIndexState(hippoRoot: string): EmbeddingIndexState;
|
|
16
16
|
/** Records `identity` as what built the index under `hippoRoot`. */
|
|
17
17
|
export declare function saveIndexIdentity(hippoRoot: string, identity: string): void;
|
|
18
|
-
/** Every stored vector keyed by memory id; `{}` when none. Search reads only the rows it ranks via
|
|
18
|
+
/** Every stored vector keyed by memory id; `{}` when none. Search reads only the rows it ranks via
|
|
19
|
+
* `loadStoredVectors`. */
|
|
19
20
|
export declare function loadEmbeddingIndex(hippoRoot: string): Record<string, number[]>;
|
|
20
21
|
export interface StoredVectorSummary {
|
|
21
22
|
readonly ids: Set<string>;
|
|
@@ -29,17 +30,19 @@ export declare function loadStoredVectors(hippoRoot: string, ids: readonly strin
|
|
|
29
30
|
export declare function loadStoredVectorViews(hippoRoot: string, ids: readonly string[]): Map<string, Float32Array>;
|
|
30
31
|
/** Replace every stored vector with `index`; `model` defaults to the stored index identity. */
|
|
31
32
|
export declare function saveEmbeddingIndex(hippoRoot: string, index: Record<string, number[]>, model?: string): void;
|
|
32
|
-
/** Inserts or replaces `rows` under `model`, each row its own commit so a failure keeps the rows before it; returns how
|
|
33
|
+
/** Inserts or replaces `rows` under `model`, each row its own commit so a failure keeps the rows before it; returns how
|
|
34
|
+
* many it wrote. */
|
|
33
35
|
export declare function saveStoredVectors(hippoRoot: string, rows: Iterable<readonly [string, readonly number[]]>, model: string): number;
|
|
34
|
-
/** Drops the vectors of deleted memories under `hippoRoot`, then returns the ids
|
|
35
|
-
export declare function
|
|
36
|
+
/** Drops the vectors of deleted memories under `hippoRoot`, then returns the ids with no vector, oldest first. */
|
|
37
|
+
export declare function pruneStoredVectorsListPending(hippoRoot: string): string[];
|
|
36
38
|
export declare function entriesWithoutVectorAt(db: DatabaseSyncLike, query: VectorBackfillQuery): MemoryEntry[];
|
|
37
39
|
export declare function writeVectorsAt(db: DatabaseSyncLike, write: VectorWrite): VectorWriteResult;
|
|
38
40
|
/** Every particle stored under `hippoRoot`. */
|
|
39
41
|
export declare function loadStoredParticles(hippoRoot: string): PhysicsParticle[];
|
|
40
42
|
/** Writes `particles` over their stored state under `hippoRoot`, as one batch. */
|
|
41
43
|
export declare function saveStoredParticles(hippoRoot: string, particles: PhysicsParticle[]): void;
|
|
42
|
-
/** Replaces every particle under `hippoRoot` with a fresh one per memory in `ids` that has an embedding; returns how
|
|
44
|
+
/** Replaces every particle under `hippoRoot` with a fresh one per memory in `ids` that has an embedding; returns how
|
|
45
|
+
* many. Rows are read a page at a time. */
|
|
43
46
|
export declare function resetStoredParticles(hippoRoot: string, ids: readonly string[], embeddingIndex: Record<string, number[]>): number;
|
|
44
47
|
/** Stores a first particle for `entry`, placed at `vector`; a memory that has one keeps it. */
|
|
45
48
|
export declare function seedStoredParticle(hippoRoot: string, entry: MemoryEntry, vector: number[]): void;
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
// Owns hippo.db's stored vectors, the identity of the model that built them, and the particle rows: every read and
|
|
1
|
+
// Owns hippo.db's stored vectors, the identity of the model that built them, and the particle rows: every read and
|
|
2
|
+
// write of the three.
|
|
2
3
|
import { getMeta, setMeta, withWriteScope } from '../db/index.js';
|
|
3
4
|
import { onHandle } from './open.js';
|
|
4
5
|
import { DEFAULT_EMBEDDING_MODEL } from '../embeddings/local.js';
|
|
5
|
-
import {
|
|
6
|
+
import { loadPhysicsState, resetAllPhysicsState, savePhysicsState } from '../db/physics-state.js';
|
|
7
|
+
import { initializeParticle } from '../core/physics.js';
|
|
8
|
+
import { float32ToBuffer } from '../util/vector-codec.js';
|
|
6
9
|
import { EMBEDDING_MODEL_META_KEY, deleteOrphanVectors, hasStoredVectors, loadVectors, loadVectorViews, replaceAllVectors, storedVectorDims, storedVectorIds, upsertVectors, } from '../db/vector-store.js';
|
|
7
10
|
import { selectEntriesByIds } from './entry-reads.js';
|
|
8
11
|
import { chunked } from '../util/chunked.js';
|
|
9
12
|
import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
|
|
13
|
+
import { placeholders } from '../util/sql.js';
|
|
10
14
|
const MAX_BACKFILL_PAGE = 500;
|
|
11
15
|
/** The model the index was built by: the stored identity, else the default model when vectors exist. */
|
|
12
16
|
export function indexedModel(state) {
|
|
@@ -35,7 +39,8 @@ export function saveIndexIdentity(hippoRoot, identity) {
|
|
|
35
39
|
setMeta(db, EMBEDDING_MODEL_META_KEY, identity);
|
|
36
40
|
});
|
|
37
41
|
}
|
|
38
|
-
/** Every stored vector keyed by memory id; `{}` when none. Search reads only the rows it ranks via
|
|
42
|
+
/** Every stored vector keyed by memory id; `{}` when none. Search reads only the rows it ranks via
|
|
43
|
+
* `loadStoredVectors`. */
|
|
39
44
|
export function loadEmbeddingIndex(hippoRoot) {
|
|
40
45
|
return onHandle(hippoRoot, (db) => {
|
|
41
46
|
return Object.fromEntries(loadVectors(db));
|
|
@@ -69,17 +74,24 @@ export function saveEmbeddingIndex(hippoRoot, index, model) {
|
|
|
69
74
|
replaceAllVectors(db, index, model ?? getMeta(db, EMBEDDING_MODEL_META_KEY, ''));
|
|
70
75
|
});
|
|
71
76
|
}
|
|
72
|
-
/** Inserts or replaces `rows` under `model`, each row its own commit so a failure keeps the rows before it; returns how
|
|
77
|
+
/** Inserts or replaces `rows` under `model`, each row its own commit so a failure keeps the rows before it; returns how
|
|
78
|
+
* many it wrote. */
|
|
73
79
|
export function saveStoredVectors(hippoRoot, rows, model) {
|
|
74
80
|
return onHandle(hippoRoot, (db) => {
|
|
75
81
|
return upsertVectors(db, rows, model);
|
|
76
82
|
});
|
|
77
83
|
}
|
|
78
|
-
/** Drops the vectors of deleted memories under `hippoRoot`, then returns the ids
|
|
79
|
-
export function
|
|
84
|
+
/** Drops the vectors of deleted memories under `hippoRoot`, then returns the ids with no vector, oldest first. */
|
|
85
|
+
export function pruneStoredVectorsListPending(hippoRoot) {
|
|
80
86
|
return onHandle(hippoRoot, (db) => {
|
|
81
87
|
deleteOrphanVectors(db);
|
|
82
|
-
|
|
88
|
+
// SAFETY: the SELECT names exactly the one column read.
|
|
89
|
+
const rows = db
|
|
90
|
+
.prepare(`SELECT id FROM memories
|
|
91
|
+
WHERE NOT EXISTS (SELECT 1 FROM memory_vectors v WHERE v.memory_id = memories.id)
|
|
92
|
+
ORDER BY created ASC, id ASC`)
|
|
93
|
+
.all();
|
|
94
|
+
return rows.map((r) => r.id);
|
|
83
95
|
});
|
|
84
96
|
}
|
|
85
97
|
export function entriesWithoutVectorAt(db, query) {
|
|
@@ -98,21 +110,25 @@ function ownedIds(db, ids, tenantId) {
|
|
|
98
110
|
const owned = new Set();
|
|
99
111
|
for (const chunk of chunked([...new Set(ids)])) {
|
|
100
112
|
// SAFETY: the SELECT names one column, id.
|
|
101
|
-
const rows = db
|
|
113
|
+
const rows = db
|
|
114
|
+
.prepare(`SELECT id FROM memories WHERE +tenant_id = ? AND id IN (${placeholders(chunk.length)})`)
|
|
115
|
+
.all(tenantId, ...chunk);
|
|
102
116
|
for (const row of rows)
|
|
103
117
|
owned.add(row.id);
|
|
104
118
|
}
|
|
105
119
|
return owned;
|
|
106
120
|
}
|
|
107
|
-
// savePhysicsState opens its own transaction and overwrites, so the first particle for a memory is inserted here
|
|
121
|
+
// savePhysicsState opens its own transaction and overwrites, so the first particle for a memory is inserted here
|
|
122
|
+
// instead.
|
|
108
123
|
function insertNewParticles(db, rows) {
|
|
109
124
|
const stmt = db.prepare(`
|
|
110
125
|
INSERT INTO memory_physics (memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation)
|
|
111
126
|
VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT(memory_id) DO NOTHING
|
|
112
127
|
`);
|
|
113
128
|
for (const { memoryId, particle: p } of rows) {
|
|
114
|
-
if (p)
|
|
129
|
+
if (p) {
|
|
115
130
|
stmt.run(memoryId, float32ToBuffer(p.position), float32ToBuffer(p.velocity), p.mass, p.charge, p.temperature, p.lastSimulation);
|
|
131
|
+
}
|
|
116
132
|
}
|
|
117
133
|
}
|
|
118
134
|
export function writeVectorsAt(db, write) {
|
|
@@ -155,7 +171,8 @@ function* entriesInPages(db, ids) {
|
|
|
155
171
|
}
|
|
156
172
|
}
|
|
157
173
|
}
|
|
158
|
-
/** Replaces every particle under `hippoRoot` with a fresh one per memory in `ids` that has an embedding; returns how
|
|
174
|
+
/** Replaces every particle under `hippoRoot` with a fresh one per memory in `ids` that has an embedding; returns how
|
|
175
|
+
* many. Rows are read a page at a time. */
|
|
159
176
|
export function resetStoredParticles(hippoRoot, ids, embeddingIndex) {
|
|
160
177
|
return onHandle(hippoRoot, (db) => {
|
|
161
178
|
return resetAllPhysicsState(db, entriesInPages(db, ids), embeddingIndex);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
/** Working Memory: bounded buffer for current-state notes, separate from long-term memory; scoped, importance-ranked,
|
|
1
|
+
/** Working Memory: bounded buffer for current-state notes, separate from long-term memory; scoped, importance-ranked,
|
|
2
|
+
* evicted past WM_MAX_ENTRIES per scope. */
|
|
2
3
|
import type { JsonValue } from '../util/json.js';
|
|
3
4
|
export declare const WM_MAX_ENTRIES = 20;
|
|
4
5
|
export type JsonObject = {
|
|
@@ -15,8 +16,8 @@ export interface WorkingMemoryItem {
|
|
|
15
16
|
createdAt: string;
|
|
16
17
|
updatedAt: string;
|
|
17
18
|
}
|
|
18
|
-
/** Push a new entry into working memory; past WM_MAX_ENTRIES the scope's lowest-importance entry is evicted (ties:
|
|
19
|
-
* row ID. */
|
|
19
|
+
/** Push a new entry into working memory; past WM_MAX_ENTRIES the scope's lowest-importance entry is evicted (ties:
|
|
20
|
+
* oldest created_at). Returns the new row ID. */
|
|
20
21
|
export declare function wmPush(hippoRoot: string, opts: {
|
|
21
22
|
scope: string;
|
|
22
23
|
content: string;
|
|
@@ -39,7 +40,8 @@ export declare function wmClear(hippoRoot: string, opts?: {
|
|
|
39
40
|
sessionId?: string;
|
|
40
41
|
tenantId?: string;
|
|
41
42
|
}): number;
|
|
42
|
-
/** Flush working memory after session end: same as wmClear, but marks the session-boundary discard of ephemeral state.
|
|
43
|
+
/** Flush working memory after session end: same as wmClear, but marks the session-boundary discard of ephemeral state.
|
|
44
|
+
* Returns the count flushed. */
|
|
43
45
|
export declare function wmFlush(hippoRoot: string, opts?: {
|
|
44
46
|
scope?: string;
|
|
45
47
|
sessionId?: string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
/** Working Memory: bounded buffer for current-state notes, separate from long-term memory; scoped, importance-ranked,
|
|
1
|
+
/** Working Memory: bounded buffer for current-state notes, separate from long-term memory; scoped, importance-ranked,
|
|
2
|
+
* evicted past WM_MAX_ENTRIES per scope. */
|
|
2
3
|
import { withWriteScope } from '../db/index.js';
|
|
3
4
|
import { onHandle, openStore } from './open.js';
|
|
4
5
|
import { warnDamagedColumn } from '../util/stored-json.js';
|
|
@@ -7,8 +8,8 @@ export const WM_MAX_ENTRIES = 20;
|
|
|
7
8
|
function rowToItem(row) {
|
|
8
9
|
let metadata = {};
|
|
9
10
|
try {
|
|
10
|
-
// SAFETY: metadata_json is always written by wmPush via JSON.stringify(opts.metadata ?? {}), so a successful parse
|
|
11
|
-
// malformed content falls through to the catch below.
|
|
11
|
+
// SAFETY: metadata_json is always written by wmPush via JSON.stringify(opts.metadata ?? {}), so a successful parse
|
|
12
|
+
// yields a plain JSON object; malformed content falls through to the catch below.
|
|
12
13
|
metadata = JSON.parse(row.metadata_json);
|
|
13
14
|
}
|
|
14
15
|
catch {
|
|
@@ -27,18 +28,21 @@ function rowToItem(row) {
|
|
|
27
28
|
updatedAt: row.updated_at,
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
|
-
/** Push a new entry into working memory; past WM_MAX_ENTRIES the scope's lowest-importance entry is evicted (ties:
|
|
31
|
-
* row ID. */
|
|
31
|
+
/** Push a new entry into working memory; past WM_MAX_ENTRIES the scope's lowest-importance entry is evicted (ties:
|
|
32
|
+
* oldest created_at). Returns the new row ID. */
|
|
32
33
|
export function wmPush(hippoRoot, opts) {
|
|
33
34
|
return onHandle(hippoRoot, (db) => {
|
|
34
35
|
const now = new Date().toISOString();
|
|
35
36
|
const importance = opts.importance ?? 0;
|
|
36
37
|
const tenantId = opts.tenantId ?? resolveTenantId({});
|
|
37
38
|
return withWriteScope(db, 'wm_push', () => {
|
|
38
|
-
const result = db
|
|
39
|
-
|
|
39
|
+
const result = db
|
|
40
|
+
.prepare(`
|
|
41
|
+
INSERT INTO working_memory(scope, session_id, task_id, importance, content, metadata_json, created_at,
|
|
42
|
+
updated_at, tenant_id)
|
|
40
43
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
41
|
-
`)
|
|
44
|
+
`)
|
|
45
|
+
.run(opts.scope, opts.sessionId ?? null, opts.taskId ?? null, importance, opts.content, JSON.stringify(opts.metadata ?? {}), now, now, tenantId);
|
|
42
46
|
const id = Number(result.lastInsertRowid ?? 0);
|
|
43
47
|
evictOverCapacity(db, opts.scope, tenantId);
|
|
44
48
|
return id;
|
|
@@ -111,7 +115,8 @@ export function wmClear(hippoRoot, opts) {
|
|
|
111
115
|
return Number(result.changes ?? 0);
|
|
112
116
|
}, openStore);
|
|
113
117
|
}
|
|
114
|
-
/** Flush working memory after session end: same as wmClear, but marks the session-boundary discard of ephemeral state.
|
|
118
|
+
/** Flush working memory after session end: same as wmClear, but marks the session-boundary discard of ephemeral state.
|
|
119
|
+
* Returns the count flushed. */
|
|
115
120
|
export function wmFlush(hippoRoot, opts) {
|
|
116
121
|
return wmClear(hippoRoot, opts);
|
|
117
122
|
}
|
package/dist/support-bundle.js
CHANGED
|
@@ -18,7 +18,8 @@ import { errorMessage } from './util/log.js';
|
|
|
18
18
|
const TAIL_MAX_BYTES = 256 * 1024;
|
|
19
19
|
export const TAIL_MAX_LINES = 200;
|
|
20
20
|
const TAIL_MAX_LINE_CHARS = 2000;
|
|
21
|
-
// Greedy on purpose: complete key blocks are redacted first, so any END left is an orphan and what precedes it may be
|
|
21
|
+
// Greedy on purpose: complete key blocks are redacted first, so any END left is an orphan and what precedes it may be
|
|
22
|
+
// key body.
|
|
22
23
|
const ORPHAN_KEY_END_RE = /^[\s\S]*-----END [A-Z ]*PRIVATE KEY-----/;
|
|
23
24
|
// The other env vars hippo reads outside the HIPPO_ prefix (src/embeddings/provider.ts, connectors/*).
|
|
24
25
|
const OTHER_ENV_NAMES = [
|
|
@@ -202,7 +203,8 @@ const HOME_SPELLINGS = [
|
|
|
202
203
|
fileUrlPath,
|
|
203
204
|
(p) => p.replace(/[^A-Za-z0-9]/g, '-'),
|
|
204
205
|
];
|
|
205
|
-
// Git Bash, Cygwin and WSL mount a drive at /c, /cygdrive/c and /mnt/c; a Claude Code folder name writes each / and :
|
|
206
|
+
// Git Bash, Cygwin and WSL mount a drive at /c, /cygdrive/c and /mnt/c; a Claude Code folder name writes each / and :
|
|
207
|
+
// as -.
|
|
206
208
|
function mountedDrive(letter) {
|
|
207
209
|
return `(?:${letter}[:-]|(?:[-/](?:cygdrive|mnt))?[-/]${letter})`;
|
|
208
210
|
}
|
|
@@ -211,7 +213,8 @@ function spellingPattern(spelling, deep) {
|
|
|
211
213
|
if (process.platform !== 'win32')
|
|
212
214
|
return spelling.length >= 3 ? escapeRegex(spelling) : null;
|
|
213
215
|
// Each tool that mounts a drive writes it its own way, so a home two or more folders below its drive (\Users\<name>)
|
|
214
|
-
// matches after any prefix, with \, / or JSON's \\ between folders. A drive written a known way goes into the swap
|
|
216
|
+
// matches after any prefix, with \, / or JSON's \\ between folders. A drive written a known way goes into the swap
|
|
217
|
+
// with it.
|
|
215
218
|
const drive = /^([A-Za-z])[:-]/.exec(spelling);
|
|
216
219
|
const below = drive === null ? spelling : spelling.slice(2);
|
|
217
220
|
const body = below.split(/[\\/]+/).map(escapeRegex).join('[\\\\/]+');
|
|
@@ -222,7 +225,8 @@ function spellingPattern(spelling, deep) {
|
|
|
222
225
|
}
|
|
223
226
|
if (deep)
|
|
224
227
|
return `${mountedDrive(drive[1])}?${body}`;
|
|
225
|
-
// One folder (C:\x, D:\home) is a name any path may hold, so it swaps only after its drive and as a whole name; a
|
|
228
|
+
// One folder (C:\x, D:\home) is a name any path may hold, so it swaps only after its drive and as a whole name; a
|
|
229
|
+
// drive
|
|
226
230
|
// root swaps nothing.
|
|
227
231
|
return /[^\\/-]/.test(below) ? `(?<![\\p{L}\\p{N}_])${mountedDrive(drive[1])}${body}` : null;
|
|
228
232
|
}
|
|
@@ -301,7 +305,8 @@ export function buildSupportBundle(opts) {
|
|
|
301
305
|
env: listSetEnvNames(),
|
|
302
306
|
logs: buildLogsSection(opts),
|
|
303
307
|
};
|
|
304
|
-
// Store paths found from the working folder arrive resolved; the global root arrives as HIPPO_HOME was typed, and log
|
|
308
|
+
// Store paths found from the working folder arrive resolved; the global root arrives as HIPPO_HOME was typed, and log
|
|
309
|
+
// lines
|
|
305
310
|
// often quote the temp folder, which usually sits under the home.
|
|
306
311
|
const redacted = redactStrings(bundle, buildHomePattern(opts.home, [getGlobalRoot(), os.tmpdir()]));
|
|
307
312
|
// SAFETY: the value built above is always a JsonObject; redactStrings preserves object shape.
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
/** Quarantine tier (CD5, AT3): pending/approved/rejected record for a memory `remember` flagged as untrusted. */
|
|
2
|
-
export { quarantineScopeFor } from '../store/quarantine.js';
|
|
3
|
-
export declare function isQuarantineScope(scope: string | null | undefined): boolean;
|
|
2
|
+
export { isQuarantineScope, quarantineScopeFor } from '../store/quarantine.js';
|
|
4
3
|
//# sourceMappingURL=quarantine.d.ts.map
|
package/dist/trust/quarantine.js
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
/** Quarantine tier (CD5, AT3): pending/approved/rejected record for a memory `remember` flagged as untrusted. */
|
|
2
|
-
import { QUARANTINE_SCOPE_PREFIX } from '../store/quarantine.js';
|
|
3
2
|
// The scope a held memory is stored under is the table's own rule, so the store module owns it.
|
|
4
|
-
export { quarantineScopeFor } from '../store/quarantine.js';
|
|
5
|
-
export function isQuarantineScope(scope) {
|
|
6
|
-
return scope != null && scope.startsWith(QUARANTINE_SCOPE_PREFIX);
|
|
7
|
-
}
|
|
3
|
+
export { isQuarantineScope, quarantineScopeFor } from '../store/quarantine.js';
|
|
8
4
|
//# sourceMappingURL=quarantine.js.map
|
|
@@ -9,14 +9,23 @@ export interface RejectFlowOpts {
|
|
|
9
9
|
memoryId?: string;
|
|
10
10
|
/** Pre-emptive form: reject a value not currently stored (or already gone). */
|
|
11
11
|
value?: string;
|
|
12
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* The caller's own personal scope: the only personal rows the sweep may remove. Unset (the CLI) skips every personal
|
|
14
|
+
* row.
|
|
15
|
+
*/
|
|
13
16
|
ownScope?: string;
|
|
14
17
|
}
|
|
15
18
|
export type RejectFlowResult = AppliedRejection;
|
|
16
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* `hippo reject` and `api.reject`: refuses a bad request, then tombstones the value and removes every row in reach that
|
|
21
|
+
* holds it.
|
|
22
|
+
*/
|
|
17
23
|
export declare function rejectValue(opts: RejectFlowOpts): RejectFlowResult;
|
|
18
24
|
export type UnrejectOutcome = LiftedRejection;
|
|
19
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* `hippo unreject` and `api.unreject`: lifts the one tombstone a digest or prefix names. The only way to allow a
|
|
27
|
+
* rejected value again.
|
|
28
|
+
*/
|
|
20
29
|
export declare function unrejectValue(hippoRoot: string, tenantId: string, digestOrPrefix: string, actor: string): UnrejectOutcome;
|
|
21
30
|
/** `hippo rejections` / `api.listRejections` — list tombstones for a tenant. */
|
|
22
31
|
export declare function listRejectionsForTenant(hippoRoot: string, tenantId: string): RejectedValueRow[];
|
|
@@ -18,7 +18,8 @@ function assertRejectOpts(opts) {
|
|
|
18
18
|
throw new Error('reject accepts either a memory id or --value, not both.');
|
|
19
19
|
}
|
|
20
20
|
if (opts.value !== undefined && normalizeValueForRejection(opts.value).length === 0) {
|
|
21
|
-
// Direct api callers can pass strings the CLI flag parser would refuse; an empty-normalized tombstone would refuse
|
|
21
|
+
// Direct api callers can pass strings the CLI flag parser would refuse; an empty-normalized tombstone would refuse
|
|
22
|
+
// nothing and pollute the listing.
|
|
22
23
|
throw new Error('reject --value requires non-empty content.');
|
|
23
24
|
}
|
|
24
25
|
}
|
|
@@ -29,15 +30,19 @@ function contentToReject(opts, row) {
|
|
|
29
30
|
throw new Error(`memory not found: ${opts.memoryId}`);
|
|
30
31
|
}
|
|
31
32
|
// A tombstone is tenant-wide, so one made from personal text would show its reason to everyone.
|
|
32
|
-
if (isPersonalScope(row.scope))
|
|
33
|
+
if (isPersonalScope(row.scope)) {
|
|
33
34
|
throw new BadRequestError("Personal memories can't be rejected. Use forget to remove it.");
|
|
35
|
+
}
|
|
34
36
|
return row.content;
|
|
35
37
|
}
|
|
36
38
|
/** Every row but another person's personal one, which is outside the caller's recall and so outside its reject. */
|
|
37
39
|
function inReach(opts, scope) {
|
|
38
40
|
return !isPersonalScope(scope) || scope === opts.ownScope;
|
|
39
41
|
}
|
|
40
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* `hippo reject` and `api.reject`: refuses a bad request, then tombstones the value and removes every row in reach that
|
|
44
|
+
* holds it.
|
|
45
|
+
*/
|
|
41
46
|
export function rejectValue(opts) {
|
|
42
47
|
assertRejectOpts(opts);
|
|
43
48
|
return applyRejection(opts.hippoRoot, {
|
|
@@ -50,7 +55,10 @@ export function rejectValue(opts) {
|
|
|
50
55
|
successorOf: mergedSuccessor,
|
|
51
56
|
});
|
|
52
57
|
}
|
|
53
|
-
/**
|
|
58
|
+
/**
|
|
59
|
+
* `hippo unreject` and `api.unreject`: lifts the one tombstone a digest or prefix names. The only way to allow a
|
|
60
|
+
* rejected value again.
|
|
61
|
+
*/
|
|
54
62
|
export function unrejectValue(hippoRoot, tenantId, digestOrPrefix, actor) {
|
|
55
63
|
// A blank prefix would match every digest and list the whole tombstone set as ambiguous.
|
|
56
64
|
if (digestOrPrefix.trim().length === 0) {
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* The one Anthropic Messages client: sends one user prompt and returns the reply text or a typed failure the caller
|
|
3
|
+
* reacts to.
|
|
4
|
+
*/
|
|
2
5
|
export interface AnthropicMessageRequest {
|
|
3
6
|
apiKey: string;
|
|
4
7
|
model?: string;
|
|
@@ -17,6 +20,8 @@ export type AnthropicMessageFailure = {
|
|
|
17
20
|
} | {
|
|
18
21
|
kind: 'unreadable';
|
|
19
22
|
message: string;
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'empty';
|
|
20
25
|
};
|
|
21
26
|
export type AnthropicMessageResult = {
|
|
22
27
|
ok: true;
|
|
@@ -27,7 +32,7 @@ export type AnthropicMessageResult = {
|
|
|
27
32
|
};
|
|
28
33
|
/** True for a failure the next call would repeat, so a caller looping over items should stop rather than retry. */
|
|
29
34
|
export declare function isPermanentFailure(failure: AnthropicMessageFailure): boolean;
|
|
30
|
-
/** The reply's first text block, trimmed
|
|
35
|
+
/** The reply's first text block, trimmed; a reply with no text is a failure of kind 'empty'. Never throws. */
|
|
31
36
|
export declare function sendAnthropicMessage(req: AnthropicMessageRequest): Promise<AnthropicMessageResult>;
|
|
32
37
|
/** The text extraction and DAG summaries hand to their `onError` callback. */
|
|
33
38
|
export declare function describeMessageFailure(failure: AnthropicMessageFailure): string;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* The one Anthropic Messages client: sends one user prompt and returns the reply text or a typed failure the caller
|
|
3
|
+
* reacts to.
|
|
4
|
+
*/
|
|
2
5
|
import { fetchWithRetry, llmTimeoutMs, llmTotalMs } from './http-retry.js';
|
|
3
|
-
import { errorMessage } from './log.js';
|
|
6
|
+
import { errorFields, errorMessage, log } from './log.js';
|
|
4
7
|
import { readCappedJson, readCappedText } from './capped-json.js';
|
|
5
8
|
import { isJsonObject, isJsonString } from './json.js';
|
|
6
9
|
import { redactSecretsStrict } from './secret-detect.js';
|
|
@@ -24,14 +27,19 @@ function firstText(reply) {
|
|
|
24
27
|
export function isPermanentFailure(failure) {
|
|
25
28
|
return failure.kind === 'http' && PERMANENT_STATUSES.has(failure.status);
|
|
26
29
|
}
|
|
27
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* The start of a failed reply's body, on one line with any key-shaped text masked; empty when the body cannot be read.
|
|
32
|
+
*/
|
|
28
33
|
async function errorSnippet(res) {
|
|
29
34
|
// The status is the failure reported; a body that cannot be read only costs its snippet.
|
|
30
|
-
const body = await readCappedText(res, ERROR_SNIPPET_CHARS * UTF8_MAX_BYTES_PER_CHAR).catch(() =>
|
|
35
|
+
const body = await readCappedText(res, ERROR_SNIPPET_CHARS * UTF8_MAX_BYTES_PER_CHAR).catch((err) => {
|
|
36
|
+
log.warn(`anthropic: could not read the error body of a ${res.status} reply`, errorFields(err));
|
|
37
|
+
return '';
|
|
38
|
+
});
|
|
31
39
|
// Masked before the cut, so a key that straddles the cut is never left half shown.
|
|
32
40
|
return redactSecretsStrict(body.replace(/\s+/g, ' ').trim()).slice(0, ERROR_SNIPPET_CHARS);
|
|
33
41
|
}
|
|
34
|
-
/** The reply's first text block, trimmed
|
|
42
|
+
/** The reply's first text block, trimmed; a reply with no text is a failure of kind 'empty'. Never throws. */
|
|
35
43
|
export async function sendAnthropicMessage(req) {
|
|
36
44
|
let res;
|
|
37
45
|
try {
|
|
@@ -56,9 +64,11 @@ export async function sendAnthropicMessage(req) {
|
|
|
56
64
|
return { ok: false, failure: { kind: 'http', status: res.status, detail: await errorSnippet(res) } };
|
|
57
65
|
try {
|
|
58
66
|
const data = await readCappedJson(res, MAX_REPLY_BYTES);
|
|
59
|
-
if (!isJsonObject(data))
|
|
67
|
+
if (!isJsonObject(data)) {
|
|
60
68
|
return { ok: false, failure: { kind: 'unreadable', message: 'the reply is not a JSON object' } };
|
|
61
|
-
|
|
69
|
+
}
|
|
70
|
+
const text = firstText(data);
|
|
71
|
+
return text === '' ? { ok: false, failure: { kind: 'empty' } } : { ok: true, text };
|
|
62
72
|
}
|
|
63
73
|
catch (err) {
|
|
64
74
|
return { ok: false, failure: { kind: 'unreadable', message: errorMessage(err) } };
|
|
@@ -70,6 +80,7 @@ export function describeMessageFailure(failure) {
|
|
|
70
80
|
case 'request': return `request failed: ${failure.message}`;
|
|
71
81
|
case 'http': return failure.detail ? `HTTP ${failure.status}: ${failure.detail}` : `HTTP ${failure.status}`;
|
|
72
82
|
case 'unreadable': return `unparseable response: ${failure.message}`;
|
|
83
|
+
case 'empty': return 'the reply held no text';
|
|
73
84
|
}
|
|
74
85
|
}
|
|
75
86
|
//# sourceMappingURL=anthropic-messages.js.map
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
/** Replaces `file` through a flushed temp file and a rename, so a reader, or a crash at any point, finds the old
|
|
2
|
-
*
|
|
3
|
-
|
|
1
|
+
/** Replaces `file` through a flushed temp file and a rename, so a reader, or a crash at any point, finds the old
|
|
2
|
+
* content or the new, whole.
|
|
3
|
+
* A file with other hard links, or a rename the platform refuses (logged), is written in place: a crash mid-write can
|
|
4
|
+
* leave it truncated.
|
|
5
|
+
* `durable: false` skips the fsyncs for derived files that can be rebuilt; a reader still never sees a torn file. */
|
|
6
|
+
export declare function writeFileAtomic(file: string, text: string, opts?: {
|
|
7
|
+
readonly durable?: boolean;
|
|
8
|
+
}): void;
|
|
4
9
|
//# sourceMappingURL=atomic-write.d.ts.map
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
// One way to replace a file a user or another program depends on: write a temp file beside it, then rename over it.
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as path from 'path';
|
|
4
|
-
import { errorMessage, log } from './log.js';
|
|
4
|
+
import { errorMessage, log, errorFields } from './log.js';
|
|
5
5
|
const RENAME_RETRY_MS = 1000;
|
|
6
6
|
const WINDOWS_RENAME_REFUSALS = ['EPERM', 'EACCES', 'EBUSY'];
|
|
7
|
-
// A rename can be refused where an in-place write still works (a bind-mounted file, a read-only folder), so these fall
|
|
7
|
+
// A rename can be refused where an in-place write still works (a bind-mounted file, a read-only folder), so these fall
|
|
8
|
+
// back to one.
|
|
8
9
|
const REPLACE_REFUSALS = ['EBUSY', 'EXDEV', 'EACCES', 'EPERM'];
|
|
9
10
|
// Matches the usual SYMLOOP_MAX, so a link cycle ends in an error instead of a hang.
|
|
10
11
|
const MAX_LINK_HOPS = 40;
|
|
11
12
|
function errnoCode(err) {
|
|
12
13
|
return 'code' in err ? String(err.code) : '';
|
|
13
14
|
}
|
|
14
|
-
/** Windows refuses a rename onto a file another program has open, usually for a moment, so a refusal is retried
|
|
15
|
+
/** Windows refuses a rename onto a file another program has open, usually for a moment, so a refusal is retried
|
|
16
|
+
* before it is reported. */
|
|
15
17
|
function renameOnto(tmp, target) {
|
|
16
18
|
const deadline = Date.now() + RENAME_RETRY_MS;
|
|
17
19
|
const idle = new Int32Array(new SharedArrayBuffer(4));
|
|
@@ -29,7 +31,8 @@ function renameOnto(tmp, target) {
|
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
|
-
/** Where a write to `file` lands: through any symlink, a
|
|
34
|
+
/** Where a write to `file` lands: through any symlink, a
|
|
35
|
+
* dangling one included, so a dotfile manager's link survives. */
|
|
33
36
|
function writeTarget(file) {
|
|
34
37
|
let target = file;
|
|
35
38
|
for (let hop = 0; hop < MAX_LINK_HOPS && fs.lstatSync(target, { throwIfNoEntry: false })?.isSymbolicLink(); hop++) {
|
|
@@ -43,29 +46,33 @@ function keepAccess(tmp, old) {
|
|
|
43
46
|
if (process.getuid?.() === 0)
|
|
44
47
|
fs.chownSync(tmp, old.uid, old.gid);
|
|
45
48
|
}
|
|
46
|
-
/** Cleanup must not hide the failure that made it necessary, so a cleanup error is logged and the first error stays
|
|
49
|
+
/** Cleanup must not hide the failure that made it necessary, so a cleanup error is logged and the first error stays
|
|
50
|
+
* the one thrown. */
|
|
47
51
|
function removeTemp(tmp) {
|
|
48
52
|
try {
|
|
49
53
|
fs.rmSync(tmp, { force: true });
|
|
50
54
|
}
|
|
51
55
|
catch (err) {
|
|
52
|
-
log.warn(`could not remove the temporary file ${tmp}: ${errorMessage(err)}
|
|
56
|
+
log.warn(`could not remove the temporary file ${tmp}: ${errorMessage(err)}`, errorFields(err));
|
|
53
57
|
}
|
|
54
58
|
}
|
|
55
|
-
/** Flushed before the rename, or a crash soon after could
|
|
56
|
-
|
|
59
|
+
/** Flushed before the rename, or a crash soon after could
|
|
60
|
+
* leave the file's name on bytes that never reached the disk. */
|
|
61
|
+
function writeFlushed(tmp, text, old, durable) {
|
|
57
62
|
const fd = fs.openSync(tmp, 'w', (old?.mode ?? 0o666) & 0o777);
|
|
58
63
|
try {
|
|
59
64
|
fs.writeFileSync(fd, text, 'utf8');
|
|
60
65
|
if (old)
|
|
61
66
|
keepAccess(tmp, old);
|
|
62
|
-
|
|
67
|
+
if (durable)
|
|
68
|
+
fs.fsyncSync(fd);
|
|
63
69
|
}
|
|
64
70
|
finally {
|
|
65
71
|
fs.closeSync(fd);
|
|
66
72
|
}
|
|
67
73
|
}
|
|
68
|
-
/** Stores the rename itself. Windows cannot flush a folder handle, and a failure here costs durability, not content,
|
|
74
|
+
/** Stores the rename itself. Windows cannot flush a folder handle, and a failure here costs durability, not content,
|
|
75
|
+
* so it only warns. */
|
|
69
76
|
function flushFolder(dir) {
|
|
70
77
|
if (process.platform === 'win32')
|
|
71
78
|
return;
|
|
@@ -79,22 +86,24 @@ function flushFolder(dir) {
|
|
|
79
86
|
}
|
|
80
87
|
}
|
|
81
88
|
catch (err) {
|
|
82
|
-
log.warn(`could not flush the folder ${dir} to disk after replacing a file in it: ${errorMessage(err)}
|
|
89
|
+
log.warn(`could not flush the folder ${dir} to disk after replacing a file in it: ${errorMessage(err)}`, errorFields(err));
|
|
83
90
|
}
|
|
84
91
|
}
|
|
85
|
-
function replaceViaTemp(target, text, old) {
|
|
92
|
+
function replaceViaTemp(target, text, old, durable) {
|
|
86
93
|
const tmp = `${target}.${process.pid}.tmp`;
|
|
87
94
|
try {
|
|
88
|
-
writeFlushed(tmp, text, old);
|
|
95
|
+
writeFlushed(tmp, text, old, durable);
|
|
89
96
|
renameOnto(tmp, target);
|
|
90
97
|
}
|
|
91
98
|
catch (err) {
|
|
92
99
|
removeTemp(tmp);
|
|
93
100
|
throw err;
|
|
94
101
|
}
|
|
95
|
-
|
|
102
|
+
if (durable)
|
|
103
|
+
flushFolder(path.dirname(target));
|
|
96
104
|
}
|
|
97
|
-
/** The pre-rename write: it truncates first, so it is only the fallback, but it needs just a writable file and keeps
|
|
105
|
+
/** The pre-rename write: it truncates first, so it is only the fallback, but it needs just a writable file and keeps
|
|
106
|
+
* hard links together. */
|
|
98
107
|
function writeInPlace(target, text) {
|
|
99
108
|
try {
|
|
100
109
|
fs.writeFileSync(target, text, 'utf8');
|
|
@@ -108,16 +117,21 @@ function writeInPlace(target, text) {
|
|
|
108
117
|
throw new Error(`${target} ${reason}`, { cause: err });
|
|
109
118
|
}
|
|
110
119
|
}
|
|
111
|
-
/** Replaces `file` through a flushed temp file and a rename, so a reader, or a crash at any point, finds the old
|
|
112
|
-
*
|
|
113
|
-
|
|
120
|
+
/** Replaces `file` through a flushed temp file and a rename, so a reader, or a crash at any point, finds the old
|
|
121
|
+
* content or the new, whole.
|
|
122
|
+
* A file with other hard links, or a rename the platform refuses (logged), is written in place: a crash mid-write can
|
|
123
|
+
* leave it truncated.
|
|
124
|
+
* `durable: false` skips the fsyncs for derived files that can be rebuilt; a reader still never sees a torn file. */
|
|
125
|
+
export function writeFileAtomic(file, text, opts = {}) {
|
|
126
|
+
const durable = opts.durable !== false;
|
|
114
127
|
const target = writeTarget(file);
|
|
115
128
|
const old = fs.statSync(target, { throwIfNoEntry: false });
|
|
116
129
|
if (old === undefined) {
|
|
117
130
|
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
118
131
|
}
|
|
119
132
|
else {
|
|
120
|
-
// A rename replaces a read-only file that the in-place write
|
|
133
|
+
// A rename replaces a read-only file that the in-place write
|
|
134
|
+
// refused, and Windows would retry that refusal for a second.
|
|
121
135
|
fs.accessSync(target, fs.constants.W_OK);
|
|
122
136
|
}
|
|
123
137
|
if (old !== undefined && old.nlink > 1) {
|
|
@@ -126,12 +140,13 @@ export function writeFileAtomic(file, text) {
|
|
|
126
140
|
return;
|
|
127
141
|
}
|
|
128
142
|
try {
|
|
129
|
-
replaceViaTemp(target, text, old);
|
|
143
|
+
replaceViaTemp(target, text, old, durable);
|
|
130
144
|
}
|
|
131
145
|
catch (err) {
|
|
132
146
|
if (!(err instanceof Error) || !REPLACE_REFUSALS.includes(errnoCode(err)))
|
|
133
147
|
throw err;
|
|
134
|
-
log.warn(`${target} could not be replaced by a rename (${errnoCode(err)}), so it is
|
|
148
|
+
log.warn(`${target} could not be replaced by a rename (${errnoCode(err)}), so it is ` +
|
|
149
|
+
`written in place: not atomic, a crash mid-write can leave it truncated`, errorFields(err));
|
|
135
150
|
writeInPlace(target, text);
|
|
136
151
|
}
|
|
137
152
|
}
|