hippo-memory 2.0.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/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 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- 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 +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- 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} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- 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} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- 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 -8
- 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 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- 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 +32 -19
- package/dist/api/prompt-hook.js +65 -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} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- 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 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- 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} +51 -43
- 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 +28 -7
- 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 +33 -14
- 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 +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- 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 +45 -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 +23 -23
- package/dist/cli/auth.js +19 -27
- 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 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- 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 +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- 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 +4 -4
- package/dist/cli/object-verbs.js +10 -13
- 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 +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- 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 +14 -6
- 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 +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- 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 -5
- 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 -6
- 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 -6
- 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 +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- 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 -6
- 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 -5
- 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 -6
- 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 +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- 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 +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- 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 +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- 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 +24 -14
- 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 +21 -16
- 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 +84 -27
- package/dist/core/memory.js +73 -29
- 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 +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- 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.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- 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 -3
- package/dist/db/connect.js +8 -3
- 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 +26 -13
- 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/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- 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 -4
- package/dist/db/physics-state.js +13 -20
- 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 +19 -5
- package/dist/db/request-stores.js +14 -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 +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- 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 +19 -6
- package/dist/entry/store-kit.js +6 -4
- 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 +16 -6
- 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 +69 -34
- 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 +8 -7
- 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 +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- 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 +16 -9
- 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 -7
- package/dist/learn/invalidation.js +56 -27
- 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 +18 -14
- 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 +57 -74
- 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 +52 -21
- 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 +9 -6
- 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 +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- 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 +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- 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 +547 -93
- 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 -19
- 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 +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- 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 +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -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 +75 -36
- 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 +93 -60
- 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 +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- 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 +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- 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 +8 -10
- 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 +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- 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 +3 -1
- package/dist/store/index.js +1 -0
- 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 +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- 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 +215 -229
- 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 +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- 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 +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- 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 +9 -4
- 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 +6 -3
- 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 +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- 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.js +2 -1
- 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 +84 -33
- 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 -11
- package/dist/store/sqlite/store.js +84 -11
- 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 +19 -12
- package/dist/store/summaries.js +36 -21
- 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 +6 -3
- 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 +24 -10
- 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 +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- 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 +16 -4
- package/dist/util/env.js +78 -25
- 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 +11 -3
- package/dist/util/request-scope.js +13 -4
- 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 +3 -1
- package/dist/util/spawn-argv.js +13 -4
- 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/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 +2 -1
- package/scripts/postinstall.cjs +3 -1
- 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 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- 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 -11
- 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 -4
- package/dist/store/sqlite/local.js +0 -8
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// PostCompact for a caller on another machine: the items it parsed become rows under its owner and project, and a
|
|
1
|
+
// PostCompact for a caller on another machine: the items it parsed become rows under its owner and project, and a
|
|
2
|
+
// retried request id writes nothing twice.
|
|
2
3
|
import { BadRequestError } from '../core/api-errors.js';
|
|
3
4
|
import { COMPACTION_ITEM_MAX_CHARS } from '../util/compaction-items.js';
|
|
4
5
|
import { saveCallerItems } from '../store/compaction-caller.js';
|
|
@@ -17,8 +18,13 @@ export function saveCompactionItemsForCaller(ctx, req) {
|
|
|
17
18
|
if (callerInHoldout(ctx, req.sessionId))
|
|
18
19
|
return { written: 0 };
|
|
19
20
|
const written = saveCallerItems(ctx.hippoRoot, ctx.tenantId, {
|
|
20
|
-
sessionId: req.sessionId,
|
|
21
|
-
|
|
21
|
+
sessionId: req.sessionId,
|
|
22
|
+
trigger: req.trigger,
|
|
23
|
+
requestId: req.requestId,
|
|
24
|
+
project: req.project.name,
|
|
25
|
+
items: scrubCompactionItems(req.items),
|
|
26
|
+
owner: key.owner,
|
|
27
|
+
origins: key.project,
|
|
22
28
|
}, (message) => log.info(`post-compact: ${message}`));
|
|
23
29
|
return { written };
|
|
24
30
|
}
|
|
@@ -9,8 +9,8 @@ interface ScrubbedSummary {
|
|
|
9
9
|
}
|
|
10
10
|
/** What the record keeps of a compact_summary: the scrubbed body, and every parsed item scrubbed. */
|
|
11
11
|
export declare function readCompactionText(compactSummary: string): ScrubbedSummary;
|
|
12
|
-
/** A caller's items scrubbed as readCompactionText scrubs a summary's, since another machine's scrub is not trusted;
|
|
13
|
-
* mask can run longer than what it hides. */
|
|
12
|
+
/** A caller's items scrubbed as readCompactionText scrubs a summary's, since another machine's scrub is not trusted;
|
|
13
|
+
* cut after it, as a mask can run longer than what it hides. */
|
|
14
14
|
export declare function scrubCompactionItems(items: readonly string[]): string[];
|
|
15
15
|
export interface PostCompactPayload {
|
|
16
16
|
sessionId: string;
|
|
@@ -20,7 +20,8 @@ export interface PostCompactPayload {
|
|
|
20
20
|
/** null when Claude Code sent none; the transcript fills the record later. */
|
|
21
21
|
compactSummary: string | null;
|
|
22
22
|
}
|
|
23
|
-
/** The PostCompact work: record the summary, then write its items. Each step is independent; a busy store spools or
|
|
23
|
+
/** The PostCompact work: record the summary, then write its items. Each step is independent; a busy store spools or
|
|
24
|
+
* defers. Never throws. */
|
|
24
25
|
export declare function saveCompaction(hippoRoot: string, payload: PostCompactPayload, log: Log): CompactionSaveResult;
|
|
25
26
|
/** The one line PostCompact prints, or null when nothing was saved. */
|
|
26
27
|
export declare function postCompactLine(result: CompactionSaveResult): string | null;
|
|
@@ -6,13 +6,14 @@ import { importSpool, spool } from './compaction-spool.js';
|
|
|
6
6
|
import { replayStoredCompactions, saveCompactionAt, } from '../store/compactions-record.js';
|
|
7
7
|
import { resolveTenantId } from '../store/tenant.js';
|
|
8
8
|
import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
|
|
9
|
-
import { errorMessage, reportCompactionFailure } from '../util/log.js';
|
|
9
|
+
import { errorFields, errorMessage, reportCompactionFailure } from '../util/log.js';
|
|
10
10
|
import { readTranscriptTail, truncateCodePointSafe } from '../util/transcript-tail.js';
|
|
11
11
|
/** Tested verbatim: Claude Code hands PreCompact stdout to the summariser as instructions. */
|
|
12
|
-
export const PRE_COMPACT_INSTRUCTION = "In your summary, add a last section titled 'Memories for hippo'. List, one per line starting with '- ',
|
|
13
|
-
"reason) and correction the user gave in this session that
|
|
14
|
-
"
|
|
15
|
-
"
|
|
12
|
+
export const PRE_COMPACT_INSTRUCTION = "In your summary, add a last section titled 'Memories for hippo'. List, one per line starting with '- ', " +
|
|
13
|
+
"each lesson learned, decision made (with its reason) and correction the user gave in this session that " +
|
|
14
|
+
"should outlive it. Write each as a standalone sentence that names its subject. Leave out anything an " +
|
|
15
|
+
"earlier summary already listed under 'Memories for hippo', and anything this session already saved with " +
|
|
16
|
+
"`hippo remember`. Write '- none' if nothing new remains.";
|
|
16
17
|
const SUMMARY_MAX_CHARS = 256 * 1024;
|
|
17
18
|
const TRANSCRIPT_TAIL_CAPS = [1 << 20, 8 << 20, 64 << 20];
|
|
18
19
|
function scrub(text) {
|
|
@@ -22,10 +23,14 @@ function scrub(text) {
|
|
|
22
23
|
export function readCompactionText(compactSummary) {
|
|
23
24
|
const body = compactSummaryBody(compactSummary);
|
|
24
25
|
const parsed = parseCompactionItems(body);
|
|
25
|
-
return {
|
|
26
|
+
return {
|
|
27
|
+
summary: truncateCodePointSafe(scrub(body), SUMMARY_MAX_CHARS),
|
|
28
|
+
items: parsed.items.map(scrub),
|
|
29
|
+
found: parsed.found,
|
|
30
|
+
};
|
|
26
31
|
}
|
|
27
|
-
/** A caller's items scrubbed as readCompactionText scrubs a summary's, since another machine's scrub is not trusted;
|
|
28
|
-
* mask can run longer than what it hides. */
|
|
32
|
+
/** A caller's items scrubbed as readCompactionText scrubs a summary's, since another machine's scrub is not trusted;
|
|
33
|
+
* cut after it, as a mask can run longer than what it hides. */
|
|
29
34
|
export function scrubCompactionItems(items) {
|
|
30
35
|
return items.map((item) => truncateCodePointSafe(scrub(item), COMPACTION_ITEM_MAX_CHARS));
|
|
31
36
|
}
|
|
@@ -36,10 +41,11 @@ function spoolSummary(hippoRoot, payload, text, at, reason, result, log) {
|
|
|
36
41
|
log(`store busy, summary spooled: ${reason}`);
|
|
37
42
|
}
|
|
38
43
|
catch (spoolErr) {
|
|
39
|
-
reportCompactionFailure(log, 'spool', errorMessage(spoolErr));
|
|
44
|
+
reportCompactionFailure(log, 'spool', errorMessage(spoolErr), errorFields(spoolErr));
|
|
40
45
|
}
|
|
41
46
|
}
|
|
42
|
-
/** The PostCompact work: record the summary, then write its items. Each step is independent; a busy store spools or
|
|
47
|
+
/** The PostCompact work: record the summary, then write its items. Each step is independent; a busy store spools or
|
|
48
|
+
* defers. Never throws. */
|
|
43
49
|
export function saveCompaction(hippoRoot, payload, log) {
|
|
44
50
|
if (payload.compactSummary === null) {
|
|
45
51
|
log('skip: payload has no compact_summary');
|
|
@@ -63,7 +69,8 @@ export function postCompactLine(result) {
|
|
|
63
69
|
if (result.written === 0)
|
|
64
70
|
return "Hippo kept this compaction's summary; it listed no new memories.";
|
|
65
71
|
const noun = result.written === 1 ? 'memory' : 'memories';
|
|
66
|
-
|
|
72
|
+
const restored = result.snapshotSaved ? ' and restored your task snapshot' : '';
|
|
73
|
+
return `Hippo saved ${result.written} ${noun} from this compaction${restored}.`;
|
|
67
74
|
}
|
|
68
75
|
function lineText(line) {
|
|
69
76
|
const content = line.message?.content;
|
|
@@ -73,7 +80,8 @@ function lineText(line) {
|
|
|
73
80
|
return '';
|
|
74
81
|
return content.map((block) => (isStringValue(block.text) ? block.text : '')).join('\n');
|
|
75
82
|
}
|
|
76
|
-
/** The summary Claude Code wrote into a transcript between two moments; null when it is not (yet) there or the window
|
|
83
|
+
/** The summary Claude Code wrote into a transcript between two moments; null when it is not (yet) there or the window
|
|
84
|
+
* cannot reach back that far. */
|
|
77
85
|
function transcriptSummary(transcriptPath, afterMs, beforeMs) {
|
|
78
86
|
const size = fs.statSync(transcriptPath).size;
|
|
79
87
|
for (const cap of TRANSCRIPT_TAIL_CAPS) {
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { CompactionText, Log } from '../store/compactions-record.js';
|
|
2
2
|
import type { PostCompactPayload } from './compaction-record.js';
|
|
3
3
|
export declare const SPOOL_DIR = "compactions-spool";
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Starts the log line of a step that broke with an unexpected error, so the session-start banner counts it; a set-aside
|
|
6
|
+
* file is counted
|
|
5
7
|
* by its `.bad` name instead. */
|
|
6
8
|
export declare const SPOOL_PROBLEM = "spool problem: ";
|
|
7
9
|
/** Only the fs calls the spool makes, so a test can stand in for one of them. */
|
|
@@ -28,7 +30,10 @@ export interface SpooledCompaction {
|
|
|
28
30
|
text: CompactionText;
|
|
29
31
|
at: Date;
|
|
30
32
|
}
|
|
31
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Records one spooled compaction; it calls `recorded` once the store holds the summary, so the file is done even if a
|
|
35
|
+
* later step throws.
|
|
36
|
+
*/
|
|
32
37
|
export type SpoolImporter = (spooled: SpooledCompaction, recorded: () => void) => void;
|
|
33
38
|
export declare function spool(hippoRoot: string, tenantId: string, payload: PostCompactPayload, text: CompactionText, at: Date, fsx?: SpoolFs): void;
|
|
34
39
|
/** null when the text is not a spooled compaction. */
|
|
@@ -38,8 +43,14 @@ export interface SpoolCounts {
|
|
|
38
43
|
stale: number;
|
|
39
44
|
bad: number;
|
|
40
45
|
}
|
|
41
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* What doctor reports, read only: files a replay should have taken by now, claims and tmp files a dead process left,
|
|
48
|
+
* and `.bad` files.
|
|
49
|
+
*/
|
|
42
50
|
export declare function spoolCounts(hippoRoot: string, now: Date, waitingAfterMs: number, fsx?: SpoolFs): SpoolCounts;
|
|
43
|
-
/**
|
|
51
|
+
/**
|
|
52
|
+
* One replayer at a time holds `replay.lock`, so only one process claims a file even where Windows lets two renames of
|
|
53
|
+
* it both land.
|
|
54
|
+
*/
|
|
44
55
|
export declare function importSpool(hippoRoot: string, tenantId: string, log: Log, deadline: number, importOne: SpoolImporter, fsx?: SpoolFs): number;
|
|
45
56
|
//# sourceMappingURL=compaction-spool.d.ts.map
|
|
@@ -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';
|
|
@@ -35,7 +37,10 @@ const idle = new Int32Array(new SharedArrayBuffer(4));
|
|
|
35
37
|
function errCode(cause) {
|
|
36
38
|
return cause instanceof Error && 'code' in cause && isStringValue(cause.code) ? cause.code : '';
|
|
37
39
|
}
|
|
38
|
-
/**
|
|
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
|
+
*/
|
|
39
44
|
function retryBusy(step) {
|
|
40
45
|
for (let retry = 0;; retry++) {
|
|
41
46
|
try {
|
|
@@ -52,7 +57,10 @@ function retryBusy(step) {
|
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
59
|
}
|
|
55
|
-
/**
|
|
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
|
+
*/
|
|
56
64
|
function settleCode(step, log, what) {
|
|
57
65
|
try {
|
|
58
66
|
const code = retryBusy(step);
|
|
@@ -121,8 +129,13 @@ export function parseSpooled(text, fallbackTenantId) {
|
|
|
121
129
|
catch {
|
|
122
130
|
return null; // a half-written spool file holds no compaction; the caller treats null as unreadable
|
|
123
131
|
}
|
|
124
|
-
if (!isObjectLike(raw) ||
|
|
132
|
+
if (!isObjectLike(raw) ||
|
|
133
|
+
!('sessionId' in raw) ||
|
|
134
|
+
!isStringValue(raw.sessionId) ||
|
|
135
|
+
!('summary' in raw) ||
|
|
136
|
+
!isStringValue(raw.summary)) {
|
|
125
137
|
return null;
|
|
138
|
+
}
|
|
126
139
|
if (!('at' in raw) || !isStringValue(raw.at) || Number.isNaN(Date.parse(raw.at)))
|
|
127
140
|
return null;
|
|
128
141
|
const items = 'items' in raw && Array.isArray(raw.items) ? raw.items.filter(isStringValue) : [];
|
|
@@ -182,7 +195,10 @@ function createLock(fsx, lock, body, log) {
|
|
|
182
195
|
return 'skip';
|
|
183
196
|
}
|
|
184
197
|
}
|
|
185
|
-
/**
|
|
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
|
+
*/
|
|
186
202
|
function takeLock(fsx, dir, log) {
|
|
187
203
|
const lock = path.join(dir, LOCK);
|
|
188
204
|
const token = randomBytes(8).toString('hex');
|
|
@@ -218,7 +234,9 @@ function ownsLock(fsx, dir, token, log) {
|
|
|
218
234
|
log(held === 'busy' ? 'spool lock could not be read, stopping' : 'spool left to another replayer (lock taken over)');
|
|
219
235
|
return false;
|
|
220
236
|
}
|
|
221
|
-
/**
|
|
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
|
+
*/
|
|
222
240
|
function releaseLock(fsx, dir, mine, log) {
|
|
223
241
|
const lock = path.join(dir, LOCK);
|
|
224
242
|
const held = readLock(fsx, lock, log);
|
|
@@ -227,7 +245,10 @@ function releaseLock(fsx, dir, mine, log) {
|
|
|
227
245
|
if (ours)
|
|
228
246
|
settle(() => fsx.unlinkSync(lock), log, 'spool lock not released');
|
|
229
247
|
}
|
|
230
|
-
/**
|
|
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
|
+
*/
|
|
231
252
|
function recoverStaleClaims(fsx, dir, names, log) {
|
|
232
253
|
const now = Date.now();
|
|
233
254
|
// A claim whose unlink stayed busy after its `.bad` landed is a spare copy, not a second failure.
|
|
@@ -247,12 +268,14 @@ function recoverStaleClaims(fsx, dir, names, log) {
|
|
|
247
268
|
}
|
|
248
269
|
else if (next < MAX_ATTEMPTS) {
|
|
249
270
|
if (settle(() => fsx.renameSync(file, path.join(dir, `${claim.stem}.a${next}.json`)), log, what) === 'done') {
|
|
250
|
-
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})`);
|
|
251
273
|
putBackOne = true;
|
|
252
274
|
}
|
|
253
275
|
}
|
|
254
276
|
else if (moveBad(fsx, dir, file, { stem: claim.stem, attempt: claim.attempt, cause: 'interrupted', log })) {
|
|
255
|
-
log(`spool file ${claim.name} was claimed by a replayer that never finished ${MAX_ATTEMPTS} times, set aside as
|
|
277
|
+
log(`spool file ${claim.name} was claimed by a replayer that never finished ${MAX_ATTEMPTS} times, set aside as ` +
|
|
278
|
+
`.bad`);
|
|
256
279
|
}
|
|
257
280
|
}
|
|
258
281
|
return putBackOne;
|
|
@@ -274,13 +297,20 @@ function writeBad(fsx, dir, options) {
|
|
|
274
297
|
settle(() => fsx.unlinkSync(tmp), log, what);
|
|
275
298
|
return moved === 'done';
|
|
276
299
|
}
|
|
277
|
-
/**
|
|
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
|
+
*/
|
|
278
304
|
function moveBad(fsx, dir, claim, options) {
|
|
279
305
|
const { stem, attempt, cause, log, raw } = options;
|
|
280
306
|
const what = `spool file ${path.basename(claim)} not set aside`;
|
|
281
307
|
let text = raw ?? '';
|
|
282
|
-
if (raw === undefined &&
|
|
308
|
+
if (raw === undefined &&
|
|
309
|
+
settle(() => {
|
|
310
|
+
text = fsx.readFileSync(claim, 'utf8');
|
|
311
|
+
}, log, what) !== 'done') {
|
|
283
312
|
return false;
|
|
313
|
+
}
|
|
284
314
|
if (!writeBad(fsx, dir, { stem, cause, text, log, what })) {
|
|
285
315
|
putBack(fsx, dir, claim, stem, attempt, log);
|
|
286
316
|
return false;
|
|
@@ -288,7 +318,10 @@ function moveBad(fsx, dir, claim, options) {
|
|
|
288
318
|
settle(() => fsx.unlinkSync(claim), log, what);
|
|
289
319
|
return true;
|
|
290
320
|
}
|
|
291
|
-
/**
|
|
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
|
+
*/
|
|
292
325
|
function promoteTmp(fsx, dir, names, tenantId, log) {
|
|
293
326
|
const now = Date.now();
|
|
294
327
|
let promoted = false;
|
|
@@ -300,8 +333,12 @@ function promoteTmp(fsx, dir, names, tenantId, log) {
|
|
|
300
333
|
const what = `spool file ${name} not promoted`;
|
|
301
334
|
let mtime = 0;
|
|
302
335
|
let text = '';
|
|
303
|
-
if (settle(() => {
|
|
336
|
+
if (settle(() => {
|
|
337
|
+
mtime = fsx.statSync(file).mtimeMs;
|
|
338
|
+
}, log, what) !== 'done' ||
|
|
339
|
+
Math.abs(now - mtime) <= STALE_MS) {
|
|
304
340
|
continue;
|
|
341
|
+
}
|
|
305
342
|
if (m === null) {
|
|
306
343
|
// A `.bad` write cut off before its rename: its source goes only after that rename lands, so this copy is spare.
|
|
307
344
|
settle(() => fsx.unlinkSync(file), log, `spool file ${name} not removed`);
|
|
@@ -325,10 +362,14 @@ function promoteTmp(fsx, dir, names, tenantId, log) {
|
|
|
325
362
|
/** Removes a claim once the store holds its summary; a claim left behind is imported again, so the log says so. */
|
|
326
363
|
function removeClaim(fsx, claim, name, log) {
|
|
327
364
|
const removed = settleCode(() => fsx.unlinkSync(claim), log, `spool file ${name} claim not removed`);
|
|
328
|
-
if (removed.settled === 'busy')
|
|
365
|
+
if (removed.settled === 'busy') {
|
|
329
366
|
log(`spool file ${name} saved; its claim could not be removed (${removed.code}); it will be imported again`);
|
|
367
|
+
}
|
|
330
368
|
}
|
|
331
|
-
/**
|
|
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
|
+
*/
|
|
332
373
|
function importFailed(fsx, dir, claim, entry, options) {
|
|
333
374
|
const { text, recorded, cause, log } = options;
|
|
334
375
|
const { name } = entry;
|
|
@@ -407,7 +448,10 @@ function mtimeOf(fsx, file) {
|
|
|
407
448
|
throw err;
|
|
408
449
|
}
|
|
409
450
|
}
|
|
410
|
-
/**
|
|
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
|
+
*/
|
|
411
455
|
export function spoolCounts(hippoRoot, now, waitingAfterMs, fsx = fs) {
|
|
412
456
|
const counts = { waiting: 0, stale: 0, bad: 0 };
|
|
413
457
|
const dir = path.join(hippoRoot, SPOOL_DIR);
|
|
@@ -433,7 +477,10 @@ export function spoolCounts(hippoRoot, now, waitingAfterMs, fsx = fs) {
|
|
|
433
477
|
}
|
|
434
478
|
return counts;
|
|
435
479
|
}
|
|
436
|
-
/**
|
|
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
|
+
*/
|
|
437
484
|
export function importSpool(hippoRoot, tenantId, log, deadline, importOne, fsx = fs) {
|
|
438
485
|
const dir = path.join(hippoRoot, SPOOL_DIR);
|
|
439
486
|
if (!fsx.existsSync(dir))
|
|
@@ -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
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { type JsonValue } from '../util/json.js';
|
|
2
2
|
import type { CaptureErrorOutcome, RoutineRule } from '../store/failure-log.js';
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* What {@link lessonFromFailure} read from a payload; `detail`
|
|
5
|
+
* is the finer failure-log key (untruncated, command head).
|
|
6
|
+
*/
|
|
4
7
|
export type FailureReading = {
|
|
5
8
|
text: string;
|
|
6
9
|
detail: string;
|
|
@@ -22,10 +25,14 @@ export declare function payloadString(payload: JsonValue, key: 'session_id' | 't
|
|
|
22
25
|
export declare function failureSignature(text: string): string;
|
|
23
26
|
/** The hash the failure log stores for a lesson text or a detail; one function so every writer counts repeats alike. */
|
|
24
27
|
export declare function failureHash(text: string): string;
|
|
25
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub`
|
|
30
|
+
* runs before the
|
|
26
31
|
* cap, as a mask can be longer than what it hides. Pure. */
|
|
27
32
|
export declare function lessonFromFailure(payload: JsonValue, scrub?: (text: string) => string): FailureReading;
|
|
28
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* A failure as it may leave the machine: the capped lesson text and the detail's hash, never the untruncated detail.
|
|
35
|
+
*/
|
|
29
36
|
export interface FailureReport {
|
|
30
37
|
/** The payload's tool name; null when it named none. */
|
|
31
38
|
tool: string | null;
|