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
|
@@ -8,7 +8,9 @@ import { isSqliteBusy } from '../db/busy.js';
|
|
|
8
8
|
import { errorMessage } from '../util/log.js';
|
|
9
9
|
const STAMP_DIGITS = 13;
|
|
10
10
|
export const SPOOL_DIR = 'compactions-spool';
|
|
11
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* Starts the log line of a step that broke with an unexpected error, so the session-start banner counts it; a set-aside
|
|
13
|
+
* file is counted
|
|
12
14
|
* by its `.bad` name instead. */
|
|
13
15
|
export const SPOOL_PROBLEM = 'spool problem: ';
|
|
14
16
|
const LOCK = 'replay.lock';
|
|
@@ -29,18 +31,16 @@ const BAD = /^([\w-]+)\.(?:\w+\.)?bad$/;
|
|
|
29
31
|
const BAD_TMP = /^[\w-]+\.\w+\.bad\.[0-9a-f]{8}\.tmp$/;
|
|
30
32
|
const NEW_STEM = /^(\d{13})-[0-9a-f]{8}$/;
|
|
31
33
|
const LEGACY_STEM_TIME = /-(\d+)$/;
|
|
32
|
-
let fsx = fs;
|
|
33
|
-
/** Test-only seam, so a test can make one fs call fail; null restores the real fs. */
|
|
34
|
-
export function _setSpoolFsForTests(next) {
|
|
35
|
-
fsx = next ?? fs;
|
|
36
|
-
}
|
|
37
34
|
const stamp = (ms) => String(Math.trunc(ms)).padStart(STAMP_DIGITS, '0');
|
|
38
35
|
const isTime = (value) => typeof value === 'number' && Number.isFinite(value);
|
|
39
36
|
const idle = new Int32Array(new SharedArrayBuffer(4));
|
|
40
37
|
function errCode(cause) {
|
|
41
38
|
return cause instanceof Error && 'code' in cause && isStringValue(cause.code) ? cause.code : '';
|
|
42
39
|
}
|
|
43
|
-
/**
|
|
40
|
+
/**
|
|
41
|
+
* Runs one fs step, retrying a busy code briefly; '' when it ran, else the busy code it kept hitting. Any other error
|
|
42
|
+
* throws.
|
|
43
|
+
*/
|
|
44
44
|
function retryBusy(step) {
|
|
45
45
|
for (let retry = 0;; retry++) {
|
|
46
46
|
try {
|
|
@@ -57,7 +57,10 @@ function retryBusy(step) {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Runs one fs step: ENOENT means gone, a busy code is retried briefly, and any other error is logged and counted busy,
|
|
62
|
+
* so a replay never throws.
|
|
63
|
+
*/
|
|
61
64
|
function settleCode(step, log, what) {
|
|
62
65
|
try {
|
|
63
66
|
const code = retryBusy(step);
|
|
@@ -99,7 +102,7 @@ function claimOf(name) {
|
|
|
99
102
|
function spoolFile(hippoRoot) {
|
|
100
103
|
return path.join(hippoRoot, SPOOL_DIR, `${stamp(Date.now())}-${randomBytes(4).toString('hex')}.a0.json`);
|
|
101
104
|
}
|
|
102
|
-
export function spool(hippoRoot, tenantId, payload, text, at) {
|
|
105
|
+
export function spool(hippoRoot, tenantId, payload, text, at, fsx = fs) {
|
|
103
106
|
const file = spoolFile(hippoRoot);
|
|
104
107
|
fsx.mkdirSync(path.dirname(file), { recursive: true });
|
|
105
108
|
const body = {
|
|
@@ -126,8 +129,13 @@ export function parseSpooled(text, fallbackTenantId) {
|
|
|
126
129
|
catch {
|
|
127
130
|
return null; // a half-written spool file holds no compaction; the caller treats null as unreadable
|
|
128
131
|
}
|
|
129
|
-
if (!isObjectLike(raw) ||
|
|
132
|
+
if (!isObjectLike(raw) ||
|
|
133
|
+
!('sessionId' in raw) ||
|
|
134
|
+
!isStringValue(raw.sessionId) ||
|
|
135
|
+
!('summary' in raw) ||
|
|
136
|
+
!isStringValue(raw.summary)) {
|
|
130
137
|
return null;
|
|
138
|
+
}
|
|
131
139
|
if (!('at' in raw) || !isStringValue(raw.at) || Number.isNaN(Date.parse(raw.at)))
|
|
132
140
|
return null;
|
|
133
141
|
const items = 'items' in raw && Array.isArray(raw.items) ? raw.items.filter(isStringValue) : [];
|
|
@@ -160,7 +168,7 @@ function parseLock(text) {
|
|
|
160
168
|
return { pid, at: raw.at, token };
|
|
161
169
|
}
|
|
162
170
|
/** The lock's body; its mtime stands in for the time when the body does not parse. */
|
|
163
|
-
function readLock(lock, log) {
|
|
171
|
+
function readLock(fsx, lock, log) {
|
|
164
172
|
let text = '';
|
|
165
173
|
const read = settle(() => { text = fsx.readFileSync(lock, 'utf8'); }, log, 'spool lock not read');
|
|
166
174
|
if (read !== 'done')
|
|
@@ -172,7 +180,7 @@ function readLock(lock, log) {
|
|
|
172
180
|
const stat = settle(() => { mtime = fsx.statSync(lock).mtimeMs; }, log, 'spool lock not read');
|
|
173
181
|
return stat === 'done' ? { pid: null, at: mtime, token: null } : stat;
|
|
174
182
|
}
|
|
175
|
-
function createLock(lock, body, log) {
|
|
183
|
+
function createLock(fsx, lock, body, log) {
|
|
176
184
|
try {
|
|
177
185
|
fsx.writeFileSync(lock, body, { encoding: 'utf8', flag: 'wx' });
|
|
178
186
|
return 'taken';
|
|
@@ -187,19 +195,22 @@ function createLock(lock, body, log) {
|
|
|
187
195
|
return 'skip';
|
|
188
196
|
}
|
|
189
197
|
}
|
|
190
|
-
/**
|
|
191
|
-
|
|
198
|
+
/**
|
|
199
|
+
* This run's token and take time once it holds `replay.lock`, else null: another replayer holds it, or it could not be
|
|
200
|
+
* made.
|
|
201
|
+
*/
|
|
202
|
+
function takeLock(fsx, dir, log) {
|
|
192
203
|
const lock = path.join(dir, LOCK);
|
|
193
204
|
const token = randomBytes(8).toString('hex');
|
|
194
205
|
const at = Date.now();
|
|
195
206
|
const body = JSON.stringify({ pid: process.pid, at, token });
|
|
196
207
|
for (let tries = 0; tries < 2; tries++) {
|
|
197
|
-
const made = createLock(lock, body, log);
|
|
208
|
+
const made = createLock(fsx, lock, body, log);
|
|
198
209
|
if (made === 'taken')
|
|
199
210
|
return { token, at };
|
|
200
211
|
if (made === 'skip')
|
|
201
212
|
break;
|
|
202
|
-
const held = readLock(lock, log);
|
|
213
|
+
const held = readLock(fsx, lock, log);
|
|
203
214
|
if (held === 'gone')
|
|
204
215
|
continue;
|
|
205
216
|
if (held === 'busy')
|
|
@@ -216,24 +227,29 @@ function takeLock(dir, log) {
|
|
|
216
227
|
return null;
|
|
217
228
|
}
|
|
218
229
|
/** False, after saying so, once `replay.lock` no longer holds this run's token or cannot be read. */
|
|
219
|
-
function ownsLock(dir, token, log) {
|
|
220
|
-
const held = readLock(path.join(dir, LOCK), log);
|
|
230
|
+
function ownsLock(fsx, dir, token, log) {
|
|
231
|
+
const held = readLock(fsx, path.join(dir, LOCK), log);
|
|
221
232
|
if (held !== 'gone' && held !== 'busy' && held.token === token)
|
|
222
233
|
return true;
|
|
223
234
|
log(held === 'busy' ? 'spool lock could not be read, stopping' : 'spool left to another replayer (lock taken over)');
|
|
224
235
|
return false;
|
|
225
236
|
}
|
|
226
|
-
/**
|
|
227
|
-
|
|
237
|
+
/**
|
|
238
|
+
* Removes `replay.lock` only while it holds this run's token, so a run never deletes a successor's lock. Never throws.
|
|
239
|
+
*/
|
|
240
|
+
function releaseLock(fsx, dir, mine, log) {
|
|
228
241
|
const lock = path.join(dir, LOCK);
|
|
229
|
-
const held = readLock(lock, log);
|
|
242
|
+
const held = readLock(fsx, lock, log);
|
|
230
243
|
// A takeover needs a lock over STALE_MS old, so a busy read of one this run took more recently is still this run's.
|
|
231
244
|
const ours = held === 'busy' ? Date.now() - mine.at < STALE_MS : held !== 'gone' && held.token === mine.token;
|
|
232
245
|
if (ours)
|
|
233
246
|
settle(() => fsx.unlinkSync(lock), log, 'spool lock not released');
|
|
234
247
|
}
|
|
235
|
-
/**
|
|
236
|
-
|
|
248
|
+
/**
|
|
249
|
+
* Claim time sits in the claim's name, so a claim over STALE_MS away from now belongs to a replayer that never
|
|
250
|
+
* finished. True when one was put back.
|
|
251
|
+
*/
|
|
252
|
+
function recoverStaleClaims(fsx, dir, names, log) {
|
|
237
253
|
const now = Date.now();
|
|
238
254
|
// A claim whose unlink stayed busy after its `.bad` landed is a spare copy, not a second failure.
|
|
239
255
|
const setAside = new Set(names.flatMap((name) => BAD.exec(name)?.[1] ?? []));
|
|
@@ -252,25 +268,27 @@ function recoverStaleClaims(dir, names, log) {
|
|
|
252
268
|
}
|
|
253
269
|
else if (next < MAX_ATTEMPTS) {
|
|
254
270
|
if (settle(() => fsx.renameSync(file, path.join(dir, `${claim.stem}.a${next}.json`)), log, what) === 'done') {
|
|
255
|
-
log(`spool file ${claim.name} was claimed by a replayer that never finished, put back (try ${next} of
|
|
271
|
+
log(`spool file ${claim.name} was claimed by a replayer that never finished, put back (try ${next} of ` +
|
|
272
|
+
`${MAX_ATTEMPTS})`);
|
|
256
273
|
putBackOne = true;
|
|
257
274
|
}
|
|
258
275
|
}
|
|
259
|
-
else if (moveBad(dir, file, { stem: claim.stem, attempt: claim.attempt, cause: 'interrupted', log })) {
|
|
260
|
-
log(`spool file ${claim.name} was claimed by a replayer that never finished ${MAX_ATTEMPTS} times, set aside as
|
|
276
|
+
else if (moveBad(fsx, dir, file, { stem: claim.stem, attempt: claim.attempt, cause: 'interrupted', log })) {
|
|
277
|
+
log(`spool file ${claim.name} was claimed by a replayer that never finished ${MAX_ATTEMPTS} times, set aside as ` +
|
|
278
|
+
`.bad`);
|
|
261
279
|
}
|
|
262
280
|
}
|
|
263
281
|
return putBackOne;
|
|
264
282
|
}
|
|
265
283
|
/** Returns a claim to the waiting files as `<stem>.a<attempt>.json`; one that stays busy is left for stale recovery. */
|
|
266
|
-
function putBack(dir, claim, stem, attempt, log) {
|
|
284
|
+
function putBack(fsx, dir, claim, stem, attempt, log) {
|
|
267
285
|
const name = path.basename(claim);
|
|
268
286
|
if (settle(() => fsx.renameSync(claim, path.join(dir, `${stem}.a${attempt}.json`)), log, `spool file ${name} not put back`) === 'busy') {
|
|
269
287
|
log(`spool file ${name} could not be put back; it returns ${STALE_MS / MINUTE_MS} minutes after its claim`);
|
|
270
288
|
}
|
|
271
289
|
}
|
|
272
290
|
/** Writes `<stem>.<cause>.bad` through a random temp file, so the rename replaces any torn `.bad` a crash left. */
|
|
273
|
-
function writeBad(dir, options) {
|
|
291
|
+
function writeBad(fsx, dir, options) {
|
|
274
292
|
const { stem, cause, text, log, what } = options;
|
|
275
293
|
const tmp = path.join(dir, `${stem}.${cause}.bad.${randomBytes(4).toString('hex')}.tmp`);
|
|
276
294
|
const written = settle(() => fsx.writeFileSync(tmp, text, { encoding: 'utf8', flag: 'wx' }), log, what);
|
|
@@ -279,22 +297,32 @@ function writeBad(dir, options) {
|
|
|
279
297
|
settle(() => fsx.unlinkSync(tmp), log, what);
|
|
280
298
|
return moved === 'done';
|
|
281
299
|
}
|
|
282
|
-
/**
|
|
283
|
-
|
|
300
|
+
/**
|
|
301
|
+
* Sets a claim aside as `.bad` before the claim goes, so a crash between leaves a whole copy; a busy write puts the
|
|
302
|
+
* claim back.
|
|
303
|
+
*/
|
|
304
|
+
function moveBad(fsx, dir, claim, options) {
|
|
284
305
|
const { stem, attempt, cause, log, raw } = options;
|
|
285
306
|
const what = `spool file ${path.basename(claim)} not set aside`;
|
|
286
307
|
let text = raw ?? '';
|
|
287
|
-
if (raw === undefined &&
|
|
308
|
+
if (raw === undefined &&
|
|
309
|
+
settle(() => {
|
|
310
|
+
text = fsx.readFileSync(claim, 'utf8');
|
|
311
|
+
}, log, what) !== 'done') {
|
|
288
312
|
return false;
|
|
289
|
-
|
|
290
|
-
|
|
313
|
+
}
|
|
314
|
+
if (!writeBad(fsx, dir, { stem, cause, text, log, what })) {
|
|
315
|
+
putBack(fsx, dir, claim, stem, attempt, log);
|
|
291
316
|
return false;
|
|
292
317
|
}
|
|
293
318
|
settle(() => fsx.unlinkSync(claim), log, what);
|
|
294
319
|
return true;
|
|
295
320
|
}
|
|
296
|
-
/**
|
|
297
|
-
|
|
321
|
+
/**
|
|
322
|
+
* A tmp over STALE_MS old belongs to a spool that never renamed it: a whole one joins the waiting files, a torn one is
|
|
323
|
+
* set aside. True when one joined.
|
|
324
|
+
*/
|
|
325
|
+
function promoteTmp(fsx, dir, names, tenantId, log) {
|
|
298
326
|
const now = Date.now();
|
|
299
327
|
let promoted = false;
|
|
300
328
|
for (const name of names) {
|
|
@@ -305,8 +333,12 @@ function promoteTmp(dir, names, tenantId, log) {
|
|
|
305
333
|
const what = `spool file ${name} not promoted`;
|
|
306
334
|
let mtime = 0;
|
|
307
335
|
let text = '';
|
|
308
|
-
if (settle(() => {
|
|
336
|
+
if (settle(() => {
|
|
337
|
+
mtime = fsx.statSync(file).mtimeMs;
|
|
338
|
+
}, log, what) !== 'done' ||
|
|
339
|
+
Math.abs(now - mtime) <= STALE_MS) {
|
|
309
340
|
continue;
|
|
341
|
+
}
|
|
310
342
|
if (m === null) {
|
|
311
343
|
// A `.bad` write cut off before its rename: its source goes only after that rename lands, so this copy is spare.
|
|
312
344
|
settle(() => fsx.unlinkSync(file), log, `spool file ${name} not removed`);
|
|
@@ -320,7 +352,7 @@ function promoteTmp(dir, names, tenantId, log) {
|
|
|
320
352
|
promoted = true;
|
|
321
353
|
}
|
|
322
354
|
}
|
|
323
|
-
else if (writeBad(dir, { stem: m[1], cause: 'unreadable', text, log, what })) {
|
|
355
|
+
else if (writeBad(fsx, dir, { stem: m[1], cause: 'unreadable', text, log, what })) {
|
|
324
356
|
settle(() => fsx.unlinkSync(file), log, what);
|
|
325
357
|
log(`spool file ${name} was never finished, set aside as .bad`);
|
|
326
358
|
}
|
|
@@ -328,13 +360,17 @@ function promoteTmp(dir, names, tenantId, log) {
|
|
|
328
360
|
return promoted;
|
|
329
361
|
}
|
|
330
362
|
/** Removes a claim once the store holds its summary; a claim left behind is imported again, so the log says so. */
|
|
331
|
-
function removeClaim(claim, name, log) {
|
|
363
|
+
function removeClaim(fsx, claim, name, log) {
|
|
332
364
|
const removed = settleCode(() => fsx.unlinkSync(claim), log, `spool file ${name} claim not removed`);
|
|
333
|
-
if (removed.settled === 'busy')
|
|
365
|
+
if (removed.settled === 'busy') {
|
|
334
366
|
log(`spool file ${name} saved; its claim could not be removed (${removed.code}); it will be imported again`);
|
|
367
|
+
}
|
|
335
368
|
}
|
|
336
|
-
/**
|
|
337
|
-
|
|
369
|
+
/**
|
|
370
|
+
* After an importer throw: a busy store stops the run with the count unchanged, any other error counts one try toward
|
|
371
|
+
* .bad.
|
|
372
|
+
*/
|
|
373
|
+
function importFailed(fsx, dir, claim, entry, options) {
|
|
338
374
|
const { text, recorded, cause, log } = options;
|
|
339
375
|
const { name } = entry;
|
|
340
376
|
const busy = isSqliteBusy(cause);
|
|
@@ -346,22 +382,22 @@ function importFailed(dir, claim, entry, options) {
|
|
|
346
382
|
return busy ? 'stop' : 'skipped';
|
|
347
383
|
}
|
|
348
384
|
if (busy) {
|
|
349
|
-
putBack(dir, claim, entry.stem, entry.attempt, log);
|
|
385
|
+
putBack(fsx, dir, claim, entry.stem, entry.attempt, log);
|
|
350
386
|
log(`spool file ${name} waits for the next run: the store is busy`);
|
|
351
387
|
return 'stop';
|
|
352
388
|
}
|
|
353
389
|
const next = entry.attempt + 1;
|
|
354
390
|
if (next < MAX_ATTEMPTS) {
|
|
355
|
-
putBack(dir, claim, entry.stem, next, log);
|
|
391
|
+
putBack(fsx, dir, claim, entry.stem, next, log);
|
|
356
392
|
log(`spool file ${name} failed to import (try ${next} of ${MAX_ATTEMPTS}): ${errorMessage(cause)}`);
|
|
357
393
|
}
|
|
358
|
-
else if (moveBad(dir, claim, { stem: entry.stem, attempt: entry.attempt, cause: 'failed', log, raw: text })) {
|
|
394
|
+
else if (moveBad(fsx, dir, claim, { stem: entry.stem, attempt: entry.attempt, cause: 'failed', log, raw: text })) {
|
|
359
395
|
log(`spool file ${name} set aside as .bad after ${MAX_ATTEMPTS} tries: ${errorMessage(cause)}`);
|
|
360
396
|
}
|
|
361
397
|
return 'skipped';
|
|
362
398
|
}
|
|
363
399
|
/** Claims, reads and imports one waiting file; `stop` ends the run because the store is busy. */
|
|
364
|
-
function importFile(dir, entry, tenantId, log, importOne) {
|
|
400
|
+
function importFile(fsx, dir, entry, tenantId, log, importOne) {
|
|
365
401
|
const { name } = entry;
|
|
366
402
|
const claim = path.join(dir, `${entry.stem}.a${entry.attempt}.claim-${stamp(Date.now())}`);
|
|
367
403
|
const taken = settleCode(() => fsx.renameSync(path.join(dir, name), claim), log, `spool file ${name} not claimed`);
|
|
@@ -374,12 +410,12 @@ function importFile(dir, entry, tenantId, log, importOne) {
|
|
|
374
410
|
if (read === 'gone')
|
|
375
411
|
log(`spool file ${name} vanished`);
|
|
376
412
|
if (read === 'busy')
|
|
377
|
-
putBack(dir, claim, entry.stem, entry.attempt, log);
|
|
413
|
+
putBack(fsx, dir, claim, entry.stem, entry.attempt, log);
|
|
378
414
|
if (read !== 'done')
|
|
379
415
|
return 'skipped';
|
|
380
416
|
const spooled = parseSpooled(text, tenantId);
|
|
381
417
|
if (spooled === null) {
|
|
382
|
-
if (moveBad(dir, claim, { stem: entry.stem, attempt: entry.attempt, cause: 'unreadable', log, raw: text })) {
|
|
418
|
+
if (moveBad(fsx, dir, claim, { stem: entry.stem, attempt: entry.attempt, cause: 'unreadable', log, raw: text })) {
|
|
383
419
|
log(`spool file ${name} is not readable, set aside as .bad`);
|
|
384
420
|
}
|
|
385
421
|
return 'skipped';
|
|
@@ -389,7 +425,7 @@ function importFile(dir, entry, tenantId, log, importOne) {
|
|
|
389
425
|
if (recorded)
|
|
390
426
|
return;
|
|
391
427
|
recorded = true;
|
|
392
|
-
removeClaim(claim, name, log);
|
|
428
|
+
removeClaim(fsx, claim, name, log);
|
|
393
429
|
};
|
|
394
430
|
try {
|
|
395
431
|
importOne(spooled, markRecorded);
|
|
@@ -397,10 +433,10 @@ function importFile(dir, entry, tenantId, log, importOne) {
|
|
|
397
433
|
return 'imported';
|
|
398
434
|
}
|
|
399
435
|
catch (err) {
|
|
400
|
-
return importFailed(dir, claim, entry, { text, recorded, cause: err, log });
|
|
436
|
+
return importFailed(fsx, dir, claim, entry, { text, recorded, cause: err, log });
|
|
401
437
|
}
|
|
402
438
|
}
|
|
403
|
-
function mtimeOf(file) {
|
|
439
|
+
function mtimeOf(fsx, file) {
|
|
404
440
|
try {
|
|
405
441
|
return fsx.statSync(file).mtimeMs;
|
|
406
442
|
}
|
|
@@ -412,8 +448,11 @@ function mtimeOf(file) {
|
|
|
412
448
|
throw err;
|
|
413
449
|
}
|
|
414
450
|
}
|
|
415
|
-
/**
|
|
416
|
-
|
|
451
|
+
/**
|
|
452
|
+
* What doctor reports, read only: files a replay should have taken by now, claims and tmp files a dead process left,
|
|
453
|
+
* and `.bad` files.
|
|
454
|
+
*/
|
|
455
|
+
export function spoolCounts(hippoRoot, now, waitingAfterMs, fsx = fs) {
|
|
417
456
|
const counts = { waiting: 0, stale: 0, bad: 0 };
|
|
418
457
|
const dir = path.join(hippoRoot, SPOOL_DIR);
|
|
419
458
|
if (!fsx.existsSync(dir))
|
|
@@ -426,38 +465,41 @@ export function spoolCounts(hippoRoot, now, waitingAfterMs) {
|
|
|
426
465
|
if (name.endsWith('.bad'))
|
|
427
466
|
counts.bad++;
|
|
428
467
|
else if (waiting !== null) {
|
|
429
|
-
const spooled = NEW_STEM.test(waiting[1]) ? created(waiting[1]) : mtimeOf(file);
|
|
468
|
+
const spooled = NEW_STEM.test(waiting[1]) ? created(waiting[1]) : mtimeOf(fsx, file);
|
|
430
469
|
if (spooled !== null && at - spooled > waitingAfterMs)
|
|
431
470
|
counts.waiting++;
|
|
432
471
|
}
|
|
433
472
|
else if (claim !== null || TMP.test(name)) {
|
|
434
|
-
const since = claim?.claimedAt ?? mtimeOf(file);
|
|
473
|
+
const since = claim?.claimedAt ?? mtimeOf(fsx, file);
|
|
435
474
|
if (since !== null && Math.abs(at - since) > STALE_MS)
|
|
436
475
|
counts.stale++;
|
|
437
476
|
}
|
|
438
477
|
}
|
|
439
478
|
return counts;
|
|
440
479
|
}
|
|
441
|
-
/**
|
|
442
|
-
|
|
480
|
+
/**
|
|
481
|
+
* One replayer at a time holds `replay.lock`, so only one process claims a file even where Windows lets two renames of
|
|
482
|
+
* it both land.
|
|
483
|
+
*/
|
|
484
|
+
export function importSpool(hippoRoot, tenantId, log, deadline, importOne, fsx = fs) {
|
|
443
485
|
const dir = path.join(hippoRoot, SPOOL_DIR);
|
|
444
486
|
if (!fsx.existsSync(dir))
|
|
445
487
|
return 0;
|
|
446
|
-
const mine = takeLock(dir, log);
|
|
488
|
+
const mine = takeLock(fsx, dir, log);
|
|
447
489
|
if (mine === null)
|
|
448
490
|
return 0;
|
|
449
491
|
try {
|
|
450
|
-
if (!ownsLock(dir, mine.token, log))
|
|
492
|
+
if (!ownsLock(fsx, dir, mine.token, log))
|
|
451
493
|
return 0;
|
|
452
494
|
const names = fsx.readdirSync(dir);
|
|
453
|
-
const promoted = promoteTmp(dir, names, tenantId, log);
|
|
454
|
-
const recovered = recoverStaleClaims(dir, names, log);
|
|
495
|
+
const promoted = promoteTmp(fsx, dir, names, tenantId, log);
|
|
496
|
+
const recovered = recoverStaleClaims(fsx, dir, names, log);
|
|
455
497
|
let finished = 0;
|
|
456
498
|
// Only promotion and recovery add waiting names, so the folder is listed again only after one of them did.
|
|
457
499
|
for (const entry of waitingFiles(promoted || recovered ? fsx.readdirSync(dir) : names)) {
|
|
458
|
-
if (Date.now() > deadline || !ownsLock(dir, mine.token, log))
|
|
500
|
+
if (Date.now() > deadline || !ownsLock(fsx, dir, mine.token, log))
|
|
459
501
|
break;
|
|
460
|
-
const outcome = importFile(dir, entry, tenantId, log, importOne);
|
|
502
|
+
const outcome = importFile(fsx, dir, entry, tenantId, log, importOne);
|
|
461
503
|
if (outcome === 'imported')
|
|
462
504
|
finished++;
|
|
463
505
|
if (outcome === 'stop')
|
|
@@ -466,7 +508,7 @@ export function importSpool(hippoRoot, tenantId, log, deadline, importOne) {
|
|
|
466
508
|
return finished;
|
|
467
509
|
}
|
|
468
510
|
finally {
|
|
469
|
-
releaseLock(dir, mine, log);
|
|
511
|
+
releaseLock(fsx, dir, mine, log);
|
|
470
512
|
}
|
|
471
513
|
}
|
|
472
514
|
//# sourceMappingURL=compaction-spool.js.map
|
|
@@ -9,11 +9,19 @@ export interface CopilotTurn {
|
|
|
9
9
|
text: string;
|
|
10
10
|
}
|
|
11
11
|
export declare const SESSION_ID_RE: RegExp;
|
|
12
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* The Copilot CLI log for a session, `<copilotHome>/session-state/<id>/events.jsonl`; null for an unsafe id or a
|
|
14
|
+
* missing file.
|
|
15
|
+
*/
|
|
13
16
|
export declare function copilotTranscriptFor(sessionId: string): string | null;
|
|
14
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* True for VS Code's own chat log, `<workspaceStorage>/<id>/github.copilot-chat/transcripts/<session id>.jsonl`, in
|
|
19
|
+
* either slash and any case.
|
|
20
|
+
*/
|
|
15
21
|
export declare function isVscodeTranscript(file: string | null): boolean;
|
|
16
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* The turn one Copilot event-log line carries: the text of a human user.message or of an assistant.message; null for
|
|
24
|
+
* any other line, a
|
|
17
25
|
* sub-agent's included. */
|
|
18
26
|
export declare function copilotTurn(line: CopilotEventLine): CopilotTurn | null;
|
|
19
27
|
//# sourceMappingURL=copilot-transcript.d.ts.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// The Copilot event log: one `{type, data, id, timestamp, parentId}` object per line, written by the Copilot CLI and VS
|
|
1
|
+
// The Copilot event log: one `{type, data, id, timestamp, parentId}` object per line, written by the Copilot CLI and VS
|
|
2
|
+
// Code Local alike.
|
|
2
3
|
// Matched line by line, since the tail readers start mid-file and never see the session.start line.
|
|
3
4
|
import * as fs from 'fs';
|
|
4
5
|
import * as path from 'path';
|
|
@@ -6,21 +7,28 @@ import { copilotHomeDir } from '../hooks/shared.js';
|
|
|
6
7
|
import { isObjectLike, isStringValue } from '../core/capture-contract.js';
|
|
7
8
|
// A session id becomes a folder name, so anything beyond word characters and hyphens could climb out of session-state.
|
|
8
9
|
export const SESSION_ID_RE = /^[\w-]+$/;
|
|
9
|
-
// user.message sources that mark text hippo did not get from the human: a hidden skill injection or another agent's
|
|
10
|
+
// user.message sources that mark text hippo did not get from the human: a hidden skill injection or another agent's
|
|
11
|
+
// prompt.
|
|
10
12
|
const INJECTED_SOURCE_PREFIXES = ['skill-', 'agent-'];
|
|
11
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* The Copilot CLI log for a session, `<copilotHome>/session-state/<id>/events.jsonl`; null for an unsafe id or a
|
|
15
|
+
* missing file.
|
|
16
|
+
*/
|
|
12
17
|
export function copilotTranscriptFor(sessionId) {
|
|
13
18
|
if (!SESSION_ID_RE.test(sessionId))
|
|
14
19
|
return null;
|
|
15
20
|
const file = path.join(copilotHomeDir(), 'session-state', sessionId, 'events.jsonl');
|
|
16
21
|
return fs.existsSync(file) ? file : null;
|
|
17
22
|
}
|
|
18
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* True for VS Code's own chat log, `<workspaceStorage>/<id>/github.copilot-chat/transcripts/<session id>.jsonl`, in
|
|
25
|
+
* either slash and any case.
|
|
26
|
+
*/
|
|
19
27
|
export function isVscodeTranscript(file) {
|
|
20
28
|
if (!file)
|
|
21
29
|
return false;
|
|
22
30
|
const parts = file.toLowerCase().split(/[\\/]/);
|
|
23
|
-
return parts.length >= 3 && parts[parts.length - 2] === 'transcripts' && parts[parts.length - 3] === 'github.copilot-chat';
|
|
31
|
+
return (parts.length >= 3 && parts[parts.length - 2] === 'transcripts' && parts[parts.length - 3] === 'github.copilot-chat');
|
|
24
32
|
}
|
|
25
33
|
function isSubagentLine(line, data) {
|
|
26
34
|
if (isStringValue(line.agentId) && line.agentId !== '')
|
|
@@ -33,7 +41,9 @@ function isInjectedUserMessage(data) {
|
|
|
33
41
|
const source = data.source;
|
|
34
42
|
return isStringValue(source) && INJECTED_SOURCE_PREFIXES.some((prefix) => source.startsWith(prefix));
|
|
35
43
|
}
|
|
36
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* The turn one Copilot event-log line carries: the text of a human user.message or of an assistant.message; null for
|
|
46
|
+
* any other line, a
|
|
37
47
|
* sub-agent's included. */
|
|
38
48
|
export function copilotTurn(line) {
|
|
39
49
|
const role = line.type === 'user.message' ? 'user' : line.type === 'assistant.message' ? 'assistant' : null;
|
package/dist/capture/extract.js
CHANGED
|
@@ -31,7 +31,8 @@ const BULLET = /^(?:[-*]|\d+\.)\s+(?:\[[ xX]\]\s+)?(.+)/;
|
|
|
31
31
|
const LABEL = /^(?:decision|rule|error|bug|gotcha|important|critical|remember|plan):/i;
|
|
32
32
|
const SENTENCE_END = /[.!?]["')\]]*$/;
|
|
33
33
|
const SPEC_HEADING_PATTERNS = [
|
|
34
|
-
|
|
34
|
+
new RegExp(String.raw `^#+\s*(?:features?|requirements?|specs?|specifications?|plan|design|architecture|interface|api|todo|` +
|
|
35
|
+
String.raw `tasks?|implementation|notes?)(?:\s|:|$)`, 'i'),
|
|
35
36
|
/^(?:features?|requirements?|specs?|specifications?|plan|design|tasks?|implementation)(?:\s*:|$)/i,
|
|
36
37
|
];
|
|
37
38
|
// A list item may open a fence on its own line: "- ```".
|
|
@@ -43,7 +44,9 @@ const NO_BREAK = /(`+)[^`\n]+\1|\b(?:[Ee]\.g|[Ii]\.e|[Vv]s|[Cc]f)\.|\betc\.(?=\s
|
|
|
43
44
|
function proseOnly(text) {
|
|
44
45
|
let fence = null;
|
|
45
46
|
let afterProse = false;
|
|
46
|
-
return text
|
|
47
|
+
return text
|
|
48
|
+
.split('\n')
|
|
49
|
+
.map((line) => {
|
|
47
50
|
const trimmed = line.trimStart();
|
|
48
51
|
if (fence !== null) {
|
|
49
52
|
const close = trimmed.match(FENCE_CLOSE);
|
|
@@ -58,16 +61,21 @@ function proseOnly(text) {
|
|
|
58
61
|
afterProse = false;
|
|
59
62
|
return '';
|
|
60
63
|
}
|
|
61
|
-
// Quotes, table rows and indented code are not the speaker's
|
|
64
|
+
// Quotes, table rows and indented code are not the speaker's
|
|
65
|
+
// own; indented code cannot interrupt a paragraph or list item.
|
|
62
66
|
const dropped = /^\s*[>|]/.test(line) || (!afterProse && /^(?: {4}|\t)(?!\s*(?:[-*]|\d+\.)\s)/.test(line));
|
|
63
67
|
afterProse = !dropped && trimmed !== '' && !/^#{1,6}(?:\s|$)/.test(trimmed);
|
|
64
68
|
return dropped ? '' : line;
|
|
65
|
-
})
|
|
69
|
+
})
|
|
70
|
+
.join('\n');
|
|
66
71
|
}
|
|
67
72
|
function masked(text) {
|
|
68
73
|
return text.replace(NO_BREAK, span => 'x'.repeat(span.length));
|
|
69
74
|
}
|
|
70
|
-
/**
|
|
75
|
+
/**
|
|
76
|
+
* A lowercase line continues the line above only when that line
|
|
77
|
+
* has not ended its sentence; "e.g." at a line end has not.
|
|
78
|
+
*/
|
|
71
79
|
function continues(line, previous) {
|
|
72
80
|
if (previous === undefined || !/^[a-z]/.test(line) || LABEL.test(line))
|
|
73
81
|
return false;
|
|
@@ -110,8 +118,10 @@ function extractFromPatterns(sentence, patterns, category) {
|
|
|
110
118
|
if (!keyed)
|
|
111
119
|
return null;
|
|
112
120
|
const content = sentence
|
|
113
|
-
.replace(
|
|
114
|
-
.
|
|
121
|
+
.replace(new RegExp(String.raw `^(?:decision|plan|rule|important|critical|remember|error|bug|gotcha|watch out|careful|warning|` +
|
|
122
|
+
String.raw `caveat|trap|don't forget|easy to miss):\s*`, 'i'), '')
|
|
123
|
+
.replace(/[.!?\s]+$/, '')
|
|
124
|
+
.trim();
|
|
115
125
|
return content.length <= MAX_CHARS ? { content, category, tags: [category, 'captured'] } : null;
|
|
116
126
|
}
|
|
117
127
|
function extractSpecSections(text) {
|
|
@@ -162,7 +172,9 @@ function extractOne(text) {
|
|
|
162
172
|
* The first `userTexts` texts are a person's own words; on a repeat their copy wins, so it keeps `fromUser`. */
|
|
163
173
|
export function extractFromTexts(texts, userTexts = 0) {
|
|
164
174
|
const seen = new Set();
|
|
165
|
-
return texts
|
|
175
|
+
return texts
|
|
176
|
+
.flatMap((text, i) => extractOne(text).map((item) => (i < userTexts ? { ...item, fromUser: true } : item)))
|
|
177
|
+
.filter((item) => {
|
|
166
178
|
const key = duplicateKey(item.content);
|
|
167
179
|
if (seen.has(key) || !assessAutomaticMemory(item.content).accepted)
|
|
168
180
|
return false;
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
// PostToolUseFailure for a caller on another machine: the lesson and its log row carry the caller's owner and
|
|
2
|
-
// request id gets the first answer.
|
|
1
|
+
// PostToolUseFailure for a caller on another machine: the lesson and its log row carry the caller's owner and
|
|
2
|
+
// project, and a retried request id gets the first answer.
|
|
3
3
|
import { BadRequestError } from '../core/api-errors.js';
|
|
4
4
|
import { storeLesson } from './capture-error.js';
|
|
5
5
|
import { recordFailureAt, requestOutcomeAt, settleFailureOutcomeAt } from '../store/failure-log-at.js';
|
|
6
|
-
import { errorMessage, log } from '../util/log.js';
|
|
6
|
+
import { errorMessage, log, errorFields } from '../util/log.js';
|
|
7
7
|
import { scrubForSharing } from './share-scrub.js';
|
|
8
8
|
import { truncateCodePointSafe } from '../util/transcript-tail.js';
|
|
9
9
|
import { assertRequestId, bindCaller } from './caller-session.js';
|
|
10
10
|
import { FAILURE_TEXT_MAX_CHARS, failureHash } from './failure-reading.js';
|
|
11
|
-
const SKIPS = {
|
|
11
|
+
const SKIPS = {
|
|
12
|
+
'skipped-interrupt': true,
|
|
13
|
+
'skipped-routine': true,
|
|
14
|
+
'skipped-invalid': true,
|
|
15
|
+
};
|
|
12
16
|
const ROUTINE_RULES = {
|
|
13
17
|
declined: true,
|
|
14
18
|
'os-permission': true,
|
|
@@ -16,26 +20,32 @@ const ROUTINE_RULES = {
|
|
|
16
20
|
'search-tool': true,
|
|
17
21
|
'quiet-exit': true,
|
|
18
22
|
};
|
|
19
|
-
/** The shapes lessonFromFailure gives: text for a lesson or a routine skip, none for an interrupt or an unreadable
|
|
23
|
+
/** The shapes lessonFromFailure gives: text for a lesson or a routine skip, none for an interrupt or an unreadable
|
|
24
|
+
* payload, a rule only on a routine skip. */
|
|
20
25
|
function checkedFailure(req) {
|
|
21
26
|
assertRequestId(req.requestId);
|
|
22
|
-
if (req.detailHash !== null && !/^[0-9a-f]{16}$/.test(req.detailHash))
|
|
27
|
+
if (req.detailHash !== null && !/^[0-9a-f]{16}$/.test(req.detailHash)) {
|
|
23
28
|
throw new BadRequestError('detail hash: 16 lowercase hex characters or null');
|
|
29
|
+
}
|
|
24
30
|
const { skip, text, rule } = req;
|
|
25
|
-
if (skip !== null && !Object.hasOwn(SKIPS, skip))
|
|
31
|
+
if (skip !== null && !Object.hasOwn(SKIPS, skip)) {
|
|
26
32
|
throw new BadRequestError('skip: skipped-interrupt, skipped-routine, skipped-invalid or null');
|
|
33
|
+
}
|
|
27
34
|
if ((skip === 'skipped-routine') !== (rule !== null) || (rule !== null && !Object.hasOwn(ROUTINE_RULES, rule))) {
|
|
28
35
|
throw new BadRequestError('rule: a routine rule on skipped-routine, else null');
|
|
29
36
|
}
|
|
30
37
|
if (text === null || text.trim() === '') {
|
|
31
|
-
if (skip === null || skip === 'skipped-routine')
|
|
38
|
+
if (skip === null || skip === 'skipped-routine') {
|
|
32
39
|
throw new BadRequestError('text: required for a lesson or a routine skip');
|
|
40
|
+
}
|
|
33
41
|
return { skip, text: null };
|
|
34
42
|
}
|
|
35
|
-
if (skip === 'skipped-interrupt' || skip === 'skipped-invalid')
|
|
43
|
+
if (skip === 'skipped-interrupt' || skip === 'skipped-invalid') {
|
|
36
44
|
throw new BadRequestError('text: null for an interrupt or an unreadable failure');
|
|
37
|
-
|
|
45
|
+
}
|
|
46
|
+
if (text.length > FAILURE_TEXT_MAX_CHARS) {
|
|
38
47
|
throw new BadRequestError(`text: at most ${FAILURE_TEXT_MAX_CHARS} characters`);
|
|
48
|
+
}
|
|
39
49
|
// Scrubbed again, as the caller's scrub is not trusted, and cut after it, as a mask can be longer than what it hides.
|
|
40
50
|
return { skip, text: truncateCodePointSafe(scrubForSharing(text), FAILURE_TEXT_MAX_CHARS) };
|
|
41
51
|
}
|
|
@@ -43,7 +53,8 @@ export function captureFailureForCaller(ctx, req) {
|
|
|
43
53
|
const failure = checkedFailure(req);
|
|
44
54
|
const key = bindCaller(ctx, req.sessionId, req.project);
|
|
45
55
|
const earlier = requestOutcomeAt(ctx.hippoRoot, ctx.tenantId, req.requestId, req.sessionId);
|
|
46
|
-
// A retry after a lost reply gets the first answer and writes
|
|
56
|
+
// A retry after a lost reply gets the first answer and writes
|
|
57
|
+
// nothing; one whose store failed tries the store again.
|
|
47
58
|
if (earlier !== null && earlier !== 'store-failed')
|
|
48
59
|
return { outcome: earlier };
|
|
49
60
|
let logged = 'store-failed';
|
|
@@ -73,7 +84,7 @@ function logOutcome(ctx, req, key, outcome, retried) {
|
|
|
73
84
|
});
|
|
74
85
|
}
|
|
75
86
|
catch (err) {
|
|
76
|
-
log.warn(`capture-error: failure not logged: ${errorMessage(err)}
|
|
87
|
+
log.warn(`capture-error: failure not logged: ${errorMessage(err)}`, errorFields(err));
|
|
77
88
|
}
|
|
78
89
|
}
|
|
79
90
|
//# sourceMappingURL=failure-caller.js.map
|