hippo-memory 1.72.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -5
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/auth/audit.js +58 -0
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
- package/dist/api/{auth.js → auth/auth.js} +66 -54
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +14 -4
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +31 -34
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +120 -63
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +23 -17
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/memories/memories.js +52 -0
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/memories/outcome.js +28 -0
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/memories/promote.js +76 -0
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
- package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
- package/dist/api/{remember.js → memories/remember.js} +50 -32
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -3
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -5
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +35 -20
- package/dist/api/prompt-hook.js +66 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +116 -72
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +36 -8
- package/dist/api/session-end.js +71 -25
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +27 -12
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +34 -15
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +18 -9
- package/dist/capture/compaction-spool.js +105 -63
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +58 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +33 -33
- package/dist/cli/auth.js +23 -31
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -5
- package/dist/cli/client.js +53 -23
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +43 -18
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +5 -4
- package/dist/cli/curate.js +55 -77
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +30 -30
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +34 -10
- package/dist/cli/hook-runtime.js +41 -16
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +35 -20
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +5 -5
- package/dist/cli/object-verbs.js +13 -16
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +17 -22
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +17 -7
- package/dist/cli/remember.js +51 -55
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +28 -18
- package/dist/cli/session-hooks.d.ts +2 -6
- package/dist/cli/session-hooks.js +140 -112
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +56 -34
- package/dist/cli/shared.d.ts +4 -2
- package/dist/cli/shared.js +26 -11
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +16 -8
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +97 -82
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +1 -1
- package/dist/cli/verb-row.d.ts +2 -0
- package/dist/cli/verbs/health.js +2 -0
- package/dist/cli/verbs/memory.js +47 -53
- package/dist/cli/verbs/objects.js +16 -7
- package/dist/cli/verbs/sessions.js +4 -2
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +14 -18
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -7
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -4
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -5
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -5
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +36 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -3
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -5
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -4
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -5
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +24 -10
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +45 -39
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +28 -17
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +37 -14
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +47 -37
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +42 -39
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +27 -30
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +38 -29
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +22 -17
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +87 -30
- package/dist/core/memory.js +82 -33
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +39 -11
- package/dist/core/physics.js +71 -21
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +35 -18
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +18 -7
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +5 -7
- package/dist/dashboard/dashboard.js +22 -8
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +8 -2
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +40 -20
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -0
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -8
- package/dist/db/physics-state.js +17 -50
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +20 -5
- package/dist/db/request-stores.js +15 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +35 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +7 -1
- package/dist/doctor.js +128 -46
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +11 -7
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +32 -27
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +50 -0
- package/dist/entry/store-kit.js +27 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +17 -7
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +72 -33
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +11 -10
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +3 -3
- package/dist/importers/vault.js +61 -45
- package/dist/index.d.ts +33 -7
- package/dist/index.js +26 -8
- package/dist/learn/autolearn.d.ts +21 -6
- package/dist/learn/autolearn.js +57 -26
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +17 -10
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -6
- package/dist/learn/invalidation.js +62 -28
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +21 -20
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +61 -77
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +59 -23
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +19 -9
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +12 -4
- package/dist/search/embed-memories.js +96 -58
- package/dist/search/engine.d.ts +11 -0
- package/dist/search/engine.js +14 -0
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +14 -8
- package/dist/server/auth.d.ts +19 -15
- package/dist/server/auth.js +68 -38
- package/dist/server/boot.d.ts +4 -1
- package/dist/server/boot.js +115 -67
- package/dist/server/client-ip.d.ts +17 -5
- package/dist/server/client-ip.js +56 -21
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +550 -97
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -17
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +40 -18
- package/dist/server/tls.d.ts +10 -2
- package/dist/server/tls.js +25 -5
- package/dist/server/types.d.ts +41 -24
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +17 -49
- package/dist/server.js +33 -40
- package/dist/sharing/global-store.d.ts +6 -12
- package/dist/sharing/global-store.js +8 -48
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +17 -7
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +28 -14
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +40 -18
- package/dist/store/ambient.js +10 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +90 -41
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +97 -63
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +101 -37
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +16 -5
- package/dist/store/conflicts.js +104 -48
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +58 -6
- package/dist/store/connectors/event-log.d.ts +122 -0
- package/dist/store/connectors/event-log.js +25 -0
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +30 -48
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +31 -47
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -10
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +70 -28
- package/dist/store/delivery-recorder.d.ts +10 -7
- package/dist/store/delivery-recorder.js +70 -37
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +26 -10
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +45 -19
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +72 -21
- package/dist/store/entry-reads.js +215 -69
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +26 -14
- package/dist/store/entry-writes.d.ts +28 -13
- package/dist/store/entry-writes.js +61 -22
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +11 -12
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +29 -19
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +15 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +13 -7
- package/dist/store/handoffs.js +44 -22
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +4 -2
- package/dist/store/index.js +2 -1
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +96 -19
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +6 -3
- package/dist/store/open.js +20 -10
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +261 -219
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +128 -64
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +46 -20
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +20 -13
- package/dist/store/rule-sql.d.ts +7 -3
- package/dist/store/rule-sql.js +26 -13
- package/dist/store/search-rows.d.ts +16 -11
- package/dist/store/search-rows.js +54 -32
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +12 -5
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +8 -0
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +15 -0
- package/dist/store/sqlite/last-recall-group.js +62 -0
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +61 -0
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +97 -38
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -18
- package/dist/store/sqlite/store.js +95 -33
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +25 -11
- package/dist/store/summaries.js +84 -27
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +8 -4
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +28 -11
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +7 -2
- package/dist/util/anthropic-messages.js +18 -7
- package/dist/util/atomic-write.d.ts +8 -3
- package/dist/util/atomic-write.js +36 -21
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +26 -5
- package/dist/util/env.js +87 -25
- package/dist/util/format.d.ts +2 -0
- package/dist/util/format.js +4 -0
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +16 -4
- package/dist/util/request-scope.js +19 -6
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +11 -0
- package/dist/util/spawn-argv.js +66 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +4 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/audit.js +0 -56
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -7
- package/dist/api/learn.js +0 -124
- package/dist/api/memories.d.ts +0 -23
- package/dist/api/memories.js +0 -46
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/outcome.js +0 -21
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/promote.js +0 -65
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -120
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -10
- package/dist/cli/lenient-id.d.ts +0 -2
- package/dist/cli/lenient-id.js +0 -13
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -21
- package/dist/store/sqlite/local.js +0 -39
|
@@ -1,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;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// What a PostToolUseFailure payload says, read with no store, so a
|
|
1
|
+
// What a PostToolUseFailure payload says, read with no store, so a
|
|
2
|
+
// hook with no store sends the same reading the local log keeps.
|
|
2
3
|
import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
3
4
|
import { scrubForSharing } from './share-scrub.js';
|
|
4
5
|
import { blockHash } from '../util/token-text.js';
|
|
@@ -8,7 +9,8 @@ const COMMAND_HEAD_WORDS = 2;
|
|
|
8
9
|
/** The longest lesson text a reading gives, so a check of a sent one imports it instead of copying it. */
|
|
9
10
|
export const FAILURE_TEXT_MAX_CHARS = 200;
|
|
10
11
|
/** The user, a permission prompt or a hook said no: routine, not a lesson. */
|
|
11
|
-
const DECLINED =
|
|
12
|
+
const DECLINED = new RegExp(String.raw `user (?:doesn't|does not) want|denied by (?:the )?user|user (?:rejected|declined|denied)|` +
|
|
13
|
+
String.raw `permission to use|was blocked by (?:a )?hook`, 'i');
|
|
12
14
|
/** The OS or a remote host refused access (EACCES, SSH publickey): routine too, but nobody declined anything. */
|
|
13
15
|
const OS_PERMISSION = /permission denied/i;
|
|
14
16
|
/** Leading `cd` or `pushd` steps say where a command ran, not what it ran. */
|
|
@@ -16,8 +18,18 @@ const LEADING_CD = /^\s*(?:(?:cd|pushd)\b[^;&|]*(?:&&|\|\||;)\s*)+/;
|
|
|
16
18
|
const NO_MATCH = /\bno (?:matches|files|results) found\b/i;
|
|
17
19
|
/** Shell commands whose exit code 1 means "nothing found" or "differs", not an error. */
|
|
18
20
|
const QUIET_EXIT_1 = /^\s*(?:grep|rg|egrep|fgrep|find|test|\[|diff|cmp|git diff|git grep)\b/;
|
|
19
|
-
// Claude Code's tool names, then the Copilot CLI's and VS Code's; tests/copilot-failure-reading.test.ts cites where
|
|
20
|
-
|
|
21
|
+
// Claude Code's tool names, then the Copilot CLI's and VS Code's; tests/copilot-failure-reading.test.ts cites where
|
|
22
|
+
// each comes from.
|
|
23
|
+
const SEARCH_TOOLS = new Set([
|
|
24
|
+
'Grep',
|
|
25
|
+
'Glob',
|
|
26
|
+
'grep',
|
|
27
|
+
'glob',
|
|
28
|
+
'rg',
|
|
29
|
+
'grep_search',
|
|
30
|
+
'file_search',
|
|
31
|
+
'semantic_search',
|
|
32
|
+
]);
|
|
21
33
|
const SHELL_TOOLS = new Set(['Bash', 'bash', 'powershell', 'run_in_terminal']);
|
|
22
34
|
/** A non-blank string field of the payload, or null. */
|
|
23
35
|
export function payloadString(payload, key) {
|
|
@@ -34,7 +46,9 @@ export function failureSignature(text) {
|
|
|
34
46
|
export function failureHash(text) {
|
|
35
47
|
return blockHash(failureSignature(text));
|
|
36
48
|
}
|
|
37
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub`
|
|
51
|
+
* runs before the
|
|
38
52
|
* cap, as a mask can be longer than what it hides. Pure. */
|
|
39
53
|
export function lessonFromFailure(payload, scrub = (text) => text) {
|
|
40
54
|
if (!isJsonObjectLiteral(payload))
|
|
@@ -43,12 +57,15 @@ export function lessonFromFailure(payload, scrub = (text) => text) {
|
|
|
43
57
|
const p = payload;
|
|
44
58
|
if (p.is_interrupt === true)
|
|
45
59
|
return { skip: 'skipped-interrupt', text: null, detail: null };
|
|
46
|
-
if (!isJsonString(p.error) || p.error.trim().length < 12)
|
|
60
|
+
if (!isJsonString(p.error) || p.error.trim().length < 12) {
|
|
47
61
|
return { skip: 'skipped-invalid', text: null, detail: null };
|
|
62
|
+
}
|
|
48
63
|
const tool = isJsonString(p.tool_name) ? p.tool_name : 'tool';
|
|
49
64
|
const error = redactSecretsStrict(p.error.replace(/\s+/g, ' ').trim());
|
|
50
65
|
const text = truncateCodePointSafe(scrub(`${tool}: ${error}`), FAILURE_TEXT_MAX_CHARS);
|
|
51
|
-
const command = isJsonObjectLiteral(p.tool_input) && isJsonString(p.tool_input['command'])
|
|
66
|
+
const command = isJsonObjectLiteral(p.tool_input) && isJsonString(p.tool_input['command'])
|
|
67
|
+
? p.tool_input['command'].replace(LEADING_CD, '')
|
|
68
|
+
: '';
|
|
52
69
|
const head = command.trim().split(/\s+/).slice(0, COMMAND_HEAD_WORDS).join(' ');
|
|
53
70
|
const detail = `${tool}${head ? ` ${head}` : ''}: ${error}`;
|
|
54
71
|
const routine = (rule) => ({ skip: 'skipped-routine', rule, text, detail });
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PRE_COMPACT_INSTRUCTION } from './compaction-record.js';
|
|
2
2
|
import { markSnapshotSavedAt, startCompactionAt } from '../store/compaction-caller.js';
|
|
3
|
-
import { errorMessage, log } from '../util/log.js';
|
|
3
|
+
import { errorMessage, log, errorFields } from '../util/log.js';
|
|
4
4
|
import { loadActiveTaskSnapshot, saveActiveTaskSnapshot } from '../store/sessions.js';
|
|
5
5
|
import { assertTrigger, bindCaller, callerInHoldout, checkedWorkingState } from './caller-session.js';
|
|
6
6
|
import { mergeWorkingState } from './working-state.js';
|
|
@@ -10,7 +10,7 @@ function logged(what, fn) {
|
|
|
10
10
|
return fn();
|
|
11
11
|
}
|
|
12
12
|
catch (err) {
|
|
13
|
-
log.warn(`pre-compact: ${what}: ${errorMessage(err)}
|
|
13
|
+
log.warn(`pre-compact: ${what}: ${errorMessage(err)}`, errorFields(err));
|
|
14
14
|
return null;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -20,7 +20,13 @@ export function preCompactForCaller(ctx, req) {
|
|
|
20
20
|
const key = bindCaller(ctx, req.sessionId, req.project);
|
|
21
21
|
if (callerInHoldout(ctx, req.sessionId))
|
|
22
22
|
return { stdout: '' };
|
|
23
|
-
const start = {
|
|
23
|
+
const start = {
|
|
24
|
+
sessionId: req.sessionId,
|
|
25
|
+
originProject: req.project.name,
|
|
26
|
+
trigger: req.trigger,
|
|
27
|
+
cwd: null,
|
|
28
|
+
transcriptPath: null,
|
|
29
|
+
};
|
|
24
30
|
const recordId = logged('compaction record not started', () => startCompactionAt(ctx.hippoRoot, ctx.tenantId, start));
|
|
25
31
|
if (state !== null && saveOwnerSnapshot(ctx, req.sessionId, key, state) && recordId !== null) {
|
|
26
32
|
// Marked under ctx.tenantId, which the environment's tenant may not be.
|
|
@@ -35,6 +41,7 @@ function saveOwnerSnapshot(ctx, sessionId, key, state) {
|
|
|
35
41
|
if (merged === null)
|
|
36
42
|
return false;
|
|
37
43
|
const snapshot = { ...merged, source: 'pre-compact', session_id: sessionId };
|
|
38
|
-
|
|
44
|
+
const saved = logged('snapshot not saved', () => saveActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId, snapshot, key));
|
|
45
|
+
return saved !== null;
|
|
39
46
|
}
|
|
40
47
|
//# sourceMappingURL=pre-compact-caller.js.map
|
|
@@ -24,16 +24,27 @@ export interface SessionScan {
|
|
|
24
24
|
/** Edits that landed, in call order. */
|
|
25
25
|
edits: DigestEdit[];
|
|
26
26
|
}
|
|
27
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* One pass over a Claude Code or Codex transcript: the turns capture reads, the closing message, and the edits that
|
|
29
|
+
* landed.
|
|
30
|
+
*/
|
|
28
31
|
export declare function scanSessionTranscript(jsonl: string): SessionScan;
|
|
29
32
|
export declare function readSessionTranscript(transcriptPath: string, log: (message: string) => void): string;
|
|
30
33
|
/** The transcript, read once and scanned, or null with the reason logged. */
|
|
31
34
|
export declare function readSessionScan(transcriptPath: string, log: (message: string) => void): SessionScan | null;
|
|
32
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Test-only seam, the scheduler's pattern: lets a test prove a network path never reaches the probe. Null restores it.
|
|
37
|
+
*/
|
|
33
38
|
export declare function _setDigestExistsProbeForTests(probe: ((p: string) => boolean) | null): void;
|
|
34
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* The store root is realpath'd; transcript paths are not, and a deleted file has no realpath of its own. Null for a
|
|
41
|
+
* network path.
|
|
42
|
+
*/
|
|
35
43
|
export declare function realFsPath(p: string): string | null;
|
|
36
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Repo-relative with forward slashes, '' for the root itself, null outside the repo or when the path cannot be
|
|
46
|
+
* resolved.
|
|
47
|
+
*/
|
|
37
48
|
export declare function repoRelative(p: string, repoRoot: string): string | null;
|
|
38
49
|
/** Sentences of the reply; code spans and "e.g." are held out of the split so their dots never end a sentence. */
|
|
39
50
|
export declare function digestSentences(text: string): string[];
|
|
@@ -50,20 +50,26 @@ function editTarget(block) {
|
|
|
50
50
|
const input = block.input;
|
|
51
51
|
if (!isObjectLike(input))
|
|
52
52
|
return null;
|
|
53
|
-
if (block.name === 'NotebookEdit')
|
|
53
|
+
if (block.name === 'NotebookEdit') {
|
|
54
54
|
return 'notebook_path' in input && isStringValue(input.notebook_path) ? input.notebook_path : null;
|
|
55
|
+
}
|
|
55
56
|
return 'file_path' in input && isStringValue(input.file_path) ? input.file_path : null;
|
|
56
57
|
}
|
|
57
58
|
function readClaudeAssistant(record, state) {
|
|
58
59
|
const blocks = messageItems(record);
|
|
59
60
|
for (const block of blocks) {
|
|
60
|
-
if (block.type !== 'tool_use' ||
|
|
61
|
+
if (block.type !== 'tool_use' ||
|
|
62
|
+
!isStringValue(block.name) ||
|
|
63
|
+
!CLAUDE_EDIT_TOOLS.has(block.name) ||
|
|
64
|
+
!isStringValue(block.id)) {
|
|
61
65
|
continue;
|
|
66
|
+
}
|
|
62
67
|
const target = editTarget(block);
|
|
63
68
|
if (target)
|
|
64
69
|
state.pending.push({ callId: block.id, filePath: target, base: state.cwd });
|
|
65
70
|
}
|
|
66
|
-
// Sidechain edits changed files, but a sub-agent's reply is not this session's closing message, nor is Claude Code's
|
|
71
|
+
// Sidechain edits changed files, but a sub-agent's reply is not this session's closing message, nor is Claude Code's
|
|
72
|
+
// own notice.
|
|
67
73
|
if (record.isMeta === true || record.isSidechain === true || isSynthetic(record))
|
|
68
74
|
return;
|
|
69
75
|
for (let i = blocks.length - 1; i >= 0; i--) {
|
|
@@ -80,8 +86,9 @@ function isSynthetic(record) {
|
|
|
80
86
|
}
|
|
81
87
|
function readClaudeResults(record, state) {
|
|
82
88
|
for (const block of messageItems(record)) {
|
|
83
|
-
if (block.type === 'tool_result' && isStringValue(block.tool_use_id) && block.is_error !== true)
|
|
89
|
+
if (block.type === 'tool_result' && isStringValue(block.tool_use_id) && block.is_error !== true) {
|
|
84
90
|
state.landed.add(block.tool_use_id);
|
|
91
|
+
}
|
|
85
92
|
}
|
|
86
93
|
}
|
|
87
94
|
function readCodexMessage(item, state) {
|
|
@@ -166,8 +173,9 @@ function readCodexItem(item, state) {
|
|
|
166
173
|
readCodexMessage(item, state);
|
|
167
174
|
return;
|
|
168
175
|
case 'custom_tool_call':
|
|
169
|
-
if (item.name === 'apply_patch' && isStringValue(item.call_id) && isStringValue(item.input))
|
|
176
|
+
if (item.name === 'apply_patch' && isStringValue(item.call_id) && isStringValue(item.input)) {
|
|
170
177
|
addPatch(state, item.call_id, item.input, state.cwd);
|
|
178
|
+
}
|
|
171
179
|
return;
|
|
172
180
|
case 'function_call':
|
|
173
181
|
readCodexFunctionCall(item, state);
|
|
@@ -182,8 +190,9 @@ function readCodexItem(item, state) {
|
|
|
182
190
|
}
|
|
183
191
|
case 'function_call_output':
|
|
184
192
|
case 'custom_tool_call_output':
|
|
185
|
-
if (isStringValue(item.call_id) && outputText(item.output).includes(PATCH_SUCCESS_LINE))
|
|
193
|
+
if (isStringValue(item.call_id) && outputText(item.output).includes(PATCH_SUCCESS_LINE)) {
|
|
186
194
|
state.landed.add(item.call_id);
|
|
195
|
+
}
|
|
187
196
|
return;
|
|
188
197
|
}
|
|
189
198
|
}
|
|
@@ -207,11 +216,17 @@ function visitRecord(record, state) {
|
|
|
207
216
|
if (record.type === 'response_item') {
|
|
208
217
|
readCodexItem(payload, state);
|
|
209
218
|
}
|
|
210
|
-
else if (record.type === 'event_msg' &&
|
|
219
|
+
else if (record.type === 'event_msg' &&
|
|
220
|
+
payload.type === 'patch_apply_end' &&
|
|
221
|
+
payload.success === true &&
|
|
222
|
+
isStringValue(payload.call_id)) {
|
|
211
223
|
state.landed.add(payload.call_id);
|
|
212
224
|
}
|
|
213
225
|
}
|
|
214
|
-
/**
|
|
226
|
+
/**
|
|
227
|
+
* One pass over a Claude Code or Codex transcript: the turns capture reads, the closing message, and the edits that
|
|
228
|
+
* landed.
|
|
229
|
+
*/
|
|
215
230
|
export function scanSessionTranscript(jsonl) {
|
|
216
231
|
const state = {
|
|
217
232
|
cwd: null, firstCwd: null, pending: [], landed: new Set(), claudeFinal: '', codexFinal: '', codexUnphased: '',
|
|
@@ -251,7 +266,9 @@ export function readSessionScan(transcriptPath, log) {
|
|
|
251
266
|
}
|
|
252
267
|
}
|
|
253
268
|
let existsProbe = fs.existsSync;
|
|
254
|
-
/**
|
|
269
|
+
/**
|
|
270
|
+
* Test-only seam, the scheduler's pattern: lets a test prove a network path never reaches the probe. Null restores it.
|
|
271
|
+
*/
|
|
255
272
|
export function _setDigestExistsProbeForTests(probe) {
|
|
256
273
|
existsProbe = probe ?? fs.existsSync;
|
|
257
274
|
}
|
|
@@ -259,7 +276,10 @@ export function _setDigestExistsProbeForTests(probe) {
|
|
|
259
276
|
function isNetworkPath(p) {
|
|
260
277
|
return /^[\\/]{2}(?:(?![?.][\\/])|[?.][\\/]UNC[\\/])/i.test(p);
|
|
261
278
|
}
|
|
262
|
-
/**
|
|
279
|
+
/**
|
|
280
|
+
* The store root is realpath'd; transcript paths are not, and a deleted file has no realpath of its own. Null for a
|
|
281
|
+
* network path.
|
|
282
|
+
*/
|
|
263
283
|
export function realFsPath(p) {
|
|
264
284
|
if (isNetworkPath(p))
|
|
265
285
|
return null;
|
|
@@ -277,7 +297,10 @@ export function realFsPath(p) {
|
|
|
277
297
|
}
|
|
278
298
|
return path.join(fs.realpathSync.native(head), ...rest);
|
|
279
299
|
}
|
|
280
|
-
/**
|
|
300
|
+
/**
|
|
301
|
+
* Repo-relative with forward slashes, '' for the root itself, null outside the repo or when the path cannot be
|
|
302
|
+
* resolved.
|
|
303
|
+
*/
|
|
281
304
|
export function repoRelative(p, repoRoot) {
|
|
282
305
|
let rel;
|
|
283
306
|
try {
|
|
@@ -441,7 +464,10 @@ export function buildSessionDigest(sources) {
|
|
|
441
464
|
export function sessionDigestId(tenantId, key) {
|
|
442
465
|
return `mem_${createHash('sha256').update(`${SESSION_DIGEST_TAG}\n${tenantId}\n${key}`).digest('hex').slice(0, 12)}`;
|
|
443
466
|
}
|
|
444
|
-
/**
|
|
467
|
+
/**
|
|
468
|
+
* What hippo could have injected into the session: any live digest (prompt recall reaches old ones) and the ambient
|
|
469
|
+
* handoff, never this session's own.
|
|
470
|
+
*/
|
|
445
471
|
function injectedTexts(hippoRoot, opts) {
|
|
446
472
|
const digests = loadLiveContentsBySourceAndTag(hippoRoot, opts.tenantId, SESSION_DIGEST_TAG, SESSION_DIGEST_TAG, opts.key);
|
|
447
473
|
const handoff = loadLatestHandoff(hippoRoot, opts.tenantId, undefined, {
|
|
@@ -484,7 +510,7 @@ export function writeSessionDigest(hippoRoot, scan, opts) {
|
|
|
484
510
|
tags: [SESSION_DIGEST_TAG],
|
|
485
511
|
source: SESSION_DIGEST_TAG,
|
|
486
512
|
confidence: 'observed',
|
|
487
|
-
|
|
513
|
+
sourceSessionId: opts.key,
|
|
488
514
|
tenantId: opts.tenantId,
|
|
489
515
|
baseHalfLifeDays: loadConfig(hippoRoot).defaultHalfLifeDays,
|
|
490
516
|
}),
|
|
@@ -16,6 +16,9 @@ export interface CallerSessionEndResult {
|
|
|
16
16
|
readonly handoffWritten: boolean;
|
|
17
17
|
readonly snapshotsClosed: number;
|
|
18
18
|
}
|
|
19
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* Call on a session's final end only, since it closes the snapshot. A failed close throws so the sender retries, and
|
|
21
|
+
* the retry writes no second handoff.
|
|
22
|
+
*/
|
|
20
23
|
export declare function sessionEndHandoffForCaller(ctx: Context, req: CallerSessionEndRequest): CallerSessionEndResult;
|
|
21
24
|
//# sourceMappingURL=session-end-caller.d.ts.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// SessionEnd for a caller on another machine: the owner's handoff, then the owner's snapshot for the session closed,
|
|
1
|
+
// SessionEnd for a caller on another machine: the owner's handoff, then the owner's snapshot for the session closed,
|
|
2
|
+
// both under its tenant and project.
|
|
2
3
|
import { BadRequestError } from '../core/api-errors.js';
|
|
3
4
|
import { writeSessionEndHandoff } from '../store/handoffs.js';
|
|
4
5
|
import { closeTaskSnapshotsForSession } from '../store/sessions.js';
|
|
@@ -10,21 +11,32 @@ function checkedEvidence(evidence) {
|
|
|
10
11
|
return null;
|
|
11
12
|
const { gitRef = null, dirtyTree = null, testStatus = null } = evidence;
|
|
12
13
|
// `git rev-parse HEAD` gives 40 hex, or 64 in a SHA-256 repository.
|
|
13
|
-
if (gitRef !== null && !/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(gitRef))
|
|
14
|
-
throw new BadRequestError('evidence gitRef: 40 or 64 lowercase hex characters or ' +
|
|
15
|
-
|
|
16
|
-
if (dirtyTree !== null && dirtyTree !== true && dirtyTree !== false)
|
|
14
|
+
if (gitRef !== null && !/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(gitRef)) {
|
|
15
|
+
throw new BadRequestError('evidence gitRef: 40 or 64 lowercase hex characters or ' + 'null');
|
|
16
|
+
}
|
|
17
|
+
if (dirtyTree !== null && dirtyTree !== true && dirtyTree !== false) {
|
|
17
18
|
throw new BadRequestError('evidence dirtyTree: true, false or null');
|
|
18
|
-
|
|
19
|
+
}
|
|
20
|
+
if (testStatus !== null && !TEST_STATUSES.has(testStatus)) {
|
|
19
21
|
throw new BadRequestError('evidence testStatus: pass, fail, unknown or null');
|
|
22
|
+
}
|
|
20
23
|
return { gitRef, dirtyTree, testStatus };
|
|
21
24
|
}
|
|
22
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Call on a session's final end only, since it closes the snapshot. A failed close throws so the sender retries, and
|
|
27
|
+
* the retry writes no second handoff.
|
|
28
|
+
*/
|
|
23
29
|
export function sessionEndHandoffForCaller(ctx, req) {
|
|
24
30
|
const state = checkedWorkingState(req.workingState);
|
|
25
31
|
const evidence = checkedEvidence(req.evidence);
|
|
26
32
|
const key = bindCaller(ctx, req.sessionId, req.project);
|
|
27
|
-
const handoff = writeSessionEndHandoff(ctx.hippoRoot,
|
|
33
|
+
const handoff = writeSessionEndHandoff(ctx.hippoRoot, {
|
|
34
|
+
tenantId: ctx.tenantId,
|
|
35
|
+
sessionId: req.sessionId,
|
|
36
|
+
evidence,
|
|
37
|
+
derived: state,
|
|
38
|
+
key,
|
|
39
|
+
});
|
|
28
40
|
const snapshotsClosed = closeTaskSnapshotsForSession(ctx.hippoRoot, ctx.tenantId, req.sessionId, 'session-ended', key);
|
|
29
41
|
return { handoffWritten: handoff !== null, snapshotsClosed };
|
|
30
42
|
}
|
|
@@ -8,7 +8,11 @@ export interface SessionCaptureRequest {
|
|
|
8
8
|
readonly texts: readonly string[];
|
|
9
9
|
}
|
|
10
10
|
export type SessionCaptureResult = Readonly<CaptureTally>;
|
|
11
|
-
/**
|
|
12
|
-
*
|
|
11
|
+
/**
|
|
12
|
+
* Captures the session's statements into `ctx`'s tenant under the caller's project, skipping each text a row the caller
|
|
13
|
+
* can see already holds.
|
|
14
|
+
* Synchronous from the dedup read to the last write, so no other write lands between them. No console output and no
|
|
15
|
+
* process.exit.
|
|
16
|
+
*/
|
|
13
17
|
export declare function captureSessionTexts(ctx: Context, req: SessionCaptureRequest): SessionCaptureResult;
|
|
14
18
|
//# sourceMappingURL=session-texts.d.ts.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// `hippo capture --last-session` for a caller whose transcript was read on another machine: its project names the rows,
|
|
1
|
+
// `hippo capture --last-session` for a caller whose transcript was read on another machine: its project names the rows,
|
|
2
|
+
// never the store's folder.
|
|
2
3
|
import { BadRequestError } from '../core/api-errors.js';
|
|
3
4
|
import { assertCallerIds } from '../api/prompt-hook.js';
|
|
4
5
|
import { assertCallerProject, projectNames } from '../core/project-identity.js';
|
|
@@ -15,18 +16,24 @@ function assertSessionCapture(req) {
|
|
|
15
16
|
assertCallerIds(req.sessionId, req.project);
|
|
16
17
|
if (req.sessionId.trim() === '')
|
|
17
18
|
throw new BadRequestError('session id: required');
|
|
18
|
-
// A '' project would read every project's rows as its own and write user-global rows; a rewritten one would split a
|
|
19
|
+
// A '' project would read every project's rows as its own and write user-global rows; a rewritten one would split a
|
|
20
|
+
// project.
|
|
19
21
|
assertCallerProject(req.project);
|
|
20
22
|
if (req.texts.length > MAX_TEXTS)
|
|
21
23
|
throw new BadRequestError(`texts: at most ${MAX_TEXTS}`);
|
|
22
24
|
const sizes = req.texts.map((t) => Buffer.byteLength(t, 'utf8'));
|
|
23
25
|
if (sizes.some((n) => n > MAX_TEXT_BYTES))
|
|
24
26
|
throw new BadRequestError(`each text: at most ${MAX_TEXT_BYTES} bytes`);
|
|
25
|
-
if (sizes.reduce((a, b) => a + b, 0) > MAX_TOTAL_BYTES)
|
|
27
|
+
if (sizes.reduce((a, b) => a + b, 0) > MAX_TOTAL_BYTES) {
|
|
26
28
|
throw new BadRequestError(`texts: at most ${MAX_TOTAL_BYTES} bytes in all`);
|
|
29
|
+
}
|
|
27
30
|
}
|
|
28
|
-
/**
|
|
29
|
-
*
|
|
31
|
+
/**
|
|
32
|
+
* Captures the session's statements into `ctx`'s tenant under the caller's project, skipping each text a row the caller
|
|
33
|
+
* can see already holds.
|
|
34
|
+
* Synchronous from the dedup read to the last write, so no other write lands between them. No console output and no
|
|
35
|
+
* process.exit.
|
|
36
|
+
*/
|
|
30
37
|
export function captureSessionTexts(ctx, req) {
|
|
31
38
|
assertSessionCapture(req);
|
|
32
39
|
const extracted = extractFromTexts(req.texts.map(scrubForSharing));
|
|
@@ -34,9 +41,17 @@ export function captureSessionTexts(ctx, req) {
|
|
|
34
41
|
const items = extracted.slice(-MAX_ITEMS);
|
|
35
42
|
if (items.length === 0)
|
|
36
43
|
return { captured: 0, skipped: 0, rejected: 0 };
|
|
37
|
-
// The project filter is classifyOriginProject's in SQL: the caller's rows and user-global rows block a copy, other
|
|
44
|
+
// The project filter is classifyOriginProject's in SQL: the caller's rows and user-global rows block a copy, other
|
|
45
|
+
// projects' rows do not.
|
|
38
46
|
const held = loadTextsHoldingWords(ctx.hippoRoot, ctx.tenantId, items.map((i) => longestWord(i.content)), projectNames(req.project));
|
|
39
|
-
const tally = captureExtractedItems(ctx.hippoRoot, {
|
|
47
|
+
const tally = captureExtractedItems(ctx.hippoRoot, {
|
|
48
|
+
dryRun: false,
|
|
49
|
+
tenantId: ctx.tenantId,
|
|
50
|
+
originProject: req.project,
|
|
51
|
+
sessionId: req.sessionId,
|
|
52
|
+
actor: ctx.actor.subject,
|
|
53
|
+
lean: true,
|
|
54
|
+
}, items, storedTextKeys(held));
|
|
40
55
|
return { ...tally, skipped: tally.skipped + extracted.length - items.length };
|
|
41
56
|
}
|
|
42
57
|
//# sourceMappingURL=session-texts.js.map
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import type { SessionTurn } from './transcript.js';
|
|
2
2
|
/** A turn close runs after each reply; a full close runs once, when the session ends. */
|
|
3
3
|
export type WorkerMode = 'turn' | 'full';
|
|
4
|
-
/** Runs `work` unless a live worker holds this session, which then runs the request after its own so the last reply is
|
|
4
|
+
/** Runs `work` unless a live worker holds this session, which then runs the request after its own so the last reply is
|
|
5
|
+
* never dropped. */
|
|
5
6
|
export declare function runSessionWorker(sessionId: string | null, mode: WorkerMode, work: (mode: WorkerMode) => Promise<void>): Promise<void>;
|
|
6
7
|
/** The cursor position after `turns`: how many there were and a hash of the last. */
|
|
7
8
|
export declare function turnPosition(turns: readonly SessionTurn[]): string;
|
|
8
9
|
/** The turns after `position`; all of them when it is null or its last turn is no longer in view. */
|
|
9
10
|
export declare function turnsAfter(turns: readonly SessionTurn[], position: string | null): readonly SessionTurn[];
|
|
10
|
-
/** The saved position for this session's transcript; null when none was saved, it names another file, or it is
|
|
11
|
+
/** The saved position for this session's transcript; null when none was saved, it names another file, or it is
|
|
12
|
+
* unreadable. */
|
|
11
13
|
export declare function loadTurnPosition(sessionId: string, transcriptPath: string): string | null;
|
|
12
14
|
export declare function saveTurnPosition(sessionId: string, transcriptPath: string, turns: readonly SessionTurn[], log: (message: string) => void): void;
|
|
13
15
|
//# sourceMappingURL=session-worker.d.ts.map
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import { homeDir } from '../util/agent-homes.js';
|
|
6
|
-
import { errorMessage, log as logger } from '../util/log.js';
|
|
6
|
+
import { errorCode, errorMessage, log as logger, errorFields } from '../util/log.js';
|
|
7
7
|
import { isObjectLike, isStringValue } from '../core/capture-contract.js';
|
|
8
8
|
import { SESSION_ID_RE } from './copilot-transcript.js';
|
|
9
9
|
import { blockHash } from '../util/token-text.js';
|
|
10
|
+
import { MINUTE_MS } from '../util/time.js';
|
|
10
11
|
/** Null for a missing id or one that could climb out of the sessions folder. */
|
|
11
12
|
function sessionStateFiles(sessionId) {
|
|
12
13
|
if (sessionId === null || !SESSION_ID_RE.test(sessionId))
|
|
@@ -24,8 +25,10 @@ function pidAlive(pid) {
|
|
|
24
25
|
return err instanceof Error && 'code' in err && err.code === 'EPERM';
|
|
25
26
|
}
|
|
26
27
|
}
|
|
27
|
-
/** Windows reuses pids, so past this a lock is stale whatever process it names; a worker rarely waits more than minutes
|
|
28
|
-
|
|
28
|
+
/** Windows reuses pids, so past this a lock is stale whatever process it names; a worker rarely waits more than minutes
|
|
29
|
+
* on a busy store. */
|
|
30
|
+
const STALE_LOCK_MS = 15 * MINUTE_MS;
|
|
31
|
+
const heldHere = new Set();
|
|
29
32
|
/** A dead holder frees its session at once, and any holder at STALE_LOCK_MS. */
|
|
30
33
|
function holderAlive(lock) {
|
|
31
34
|
let text;
|
|
@@ -45,13 +48,16 @@ function holderAlive(lock) {
|
|
|
45
48
|
if (!held)
|
|
46
49
|
return true;
|
|
47
50
|
const pid = Number(held[1]);
|
|
48
|
-
|
|
51
|
+
// Our own pid is live only while this process holds the lock; a leftover from a dead run that reused the pid is not.
|
|
52
|
+
return pid === process.pid ? heldHere.has(lock) : pidAlive(pid);
|
|
49
53
|
}
|
|
50
|
-
// SHORTCUT: two takers racing one stale-lock cleanup can both run, as every worker did before the lock; an atomic
|
|
54
|
+
// SHORTCUT: two takers racing one stale-lock cleanup can both run, as every worker did before the lock; an atomic
|
|
55
|
+
// link-based take if that shows up.
|
|
51
56
|
function takeSessionLock(lock) {
|
|
52
57
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
53
58
|
try {
|
|
54
59
|
fs.writeFileSync(lock, `${process.pid}:${Date.now()}`, { flag: 'wx' });
|
|
60
|
+
heldHere.add(lock);
|
|
55
61
|
return 'taken';
|
|
56
62
|
}
|
|
57
63
|
catch (err) {
|
|
@@ -69,19 +75,36 @@ function takeSessionLock(lock) {
|
|
|
69
75
|
}
|
|
70
76
|
return 'held';
|
|
71
77
|
}
|
|
78
|
+
const warnedLocks = new Set();
|
|
79
|
+
// The lock is best-effort, so the work still runs; the line says why it ran without one.
|
|
80
|
+
function warnUnusableLockOnce(lock) {
|
|
81
|
+
if (warnedLocks.has(lock))
|
|
82
|
+
return;
|
|
83
|
+
warnedLocks.add(lock);
|
|
84
|
+
logger.warn(`session worker: lock ${lock} cannot be created or cleared, so the work runs without it`);
|
|
85
|
+
}
|
|
72
86
|
function releaseSessionLock(lock) {
|
|
87
|
+
heldHere.delete(lock);
|
|
73
88
|
try {
|
|
74
89
|
fs.rmSync(lock, { force: true });
|
|
75
90
|
}
|
|
76
91
|
catch (err) {
|
|
77
92
|
// A lock left behind names this pid, which is dead once the worker exits, so the next taker clears it.
|
|
78
|
-
logger.debug(`session lock not removed: ${errorMessage(err)}
|
|
93
|
+
logger.debug(`session lock not removed: ${errorMessage(err)}`, errorFields(err));
|
|
79
94
|
}
|
|
80
95
|
}
|
|
81
|
-
/** False when the
|
|
96
|
+
/** False when the request could not be queued; the caller then refuses the run, since an unlocked worker could race a
|
|
97
|
+
* live one. */
|
|
82
98
|
function queueRun(files, mode) {
|
|
83
99
|
try {
|
|
84
100
|
fs.mkdirSync(path.dirname(files.queued), { recursive: true });
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
logger.warn(`session worker: cannot create ${path.dirname(files.queued)}, ` +
|
|
104
|
+
`so the ${mode} close is not run: ${errorMessage(err)}`, errorFields(err));
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
85
108
|
// A full close outranks a turn close: it overwrites a queued turn, and a turn never replaces a queued full close.
|
|
86
109
|
if (mode === 'full')
|
|
87
110
|
fs.writeFileSync(files.queued, 'full');
|
|
@@ -90,7 +113,10 @@ function queueRun(files, mode) {
|
|
|
90
113
|
return true;
|
|
91
114
|
}
|
|
92
115
|
catch (err) {
|
|
93
|
-
|
|
116
|
+
if (errorCode(err) === 'EEXIST')
|
|
117
|
+
return true;
|
|
118
|
+
logger.warn(`session worker: cannot queue the ${mode} close in ${files.queued}, so it is not run: ${errorMessage(err)}`, errorFields(err));
|
|
119
|
+
return false;
|
|
94
120
|
}
|
|
95
121
|
}
|
|
96
122
|
/** Takes the queued request by renaming it, so one queued while this reads it lands in a fresh file. */
|
|
@@ -99,8 +125,11 @@ function takeQueued(queued) {
|
|
|
99
125
|
try {
|
|
100
126
|
fs.renameSync(queued, taken);
|
|
101
127
|
}
|
|
102
|
-
catch {
|
|
103
|
-
//
|
|
128
|
+
catch (err) {
|
|
129
|
+
// ENOENT means nothing is queued; any other refusal leaves the request queued for the next round, but is told.
|
|
130
|
+
if (errorCode(err) !== 'ENOENT') {
|
|
131
|
+
logger.warn(`session worker: cannot take the queued request ${queued}: ${errorMessage(err)}`, errorFields(err));
|
|
132
|
+
}
|
|
104
133
|
return null;
|
|
105
134
|
}
|
|
106
135
|
try {
|
|
@@ -110,14 +139,19 @@ function takeQueued(queued) {
|
|
|
110
139
|
fs.rmSync(taken, { force: true });
|
|
111
140
|
}
|
|
112
141
|
}
|
|
113
|
-
/** Runs `work` unless a live worker holds this session, which then runs the request after its own so the last reply is
|
|
142
|
+
/** Runs `work` unless a live worker holds this session, which then runs the request after its own so the last reply is
|
|
143
|
+
* never dropped. */
|
|
114
144
|
export async function runSessionWorker(sessionId, mode, work) {
|
|
115
145
|
const files = sessionStateFiles(sessionId);
|
|
116
|
-
if (files === null
|
|
146
|
+
if (files === null)
|
|
117
147
|
return work(mode);
|
|
148
|
+
if (!queueRun(files, mode))
|
|
149
|
+
return;
|
|
118
150
|
for (let take = takeSessionLock(files.lock); take !== 'held'; take = takeSessionLock(files.lock)) {
|
|
119
|
-
if (take === 'unusable')
|
|
151
|
+
if (take === 'unusable') {
|
|
152
|
+
warnUnusableLockOnce(files.lock);
|
|
120
153
|
return work(mode);
|
|
154
|
+
}
|
|
121
155
|
let ran = false;
|
|
122
156
|
try {
|
|
123
157
|
for (let next = takeQueued(files.queued); next !== null; next = takeQueued(files.queued)) {
|
|
@@ -150,14 +184,16 @@ export function turnsAfter(turns, position) {
|
|
|
150
184
|
return turns;
|
|
151
185
|
if (count <= turns.length && turnKey(turns[count - 1]) === key)
|
|
152
186
|
return turns.slice(count);
|
|
153
|
-
// A transcript too big to read whole is read from its tail, so the count shifts; the last turn's text still marks the
|
|
187
|
+
// A transcript too big to read whole is read from its tail, so the count shifts; the last turn's text still marks the
|
|
188
|
+
// place.
|
|
154
189
|
for (let i = turns.length - 1; i >= 0; i--) {
|
|
155
190
|
if (turnKey(turns[i]) === key)
|
|
156
191
|
return turns.slice(i + 1);
|
|
157
192
|
}
|
|
158
193
|
return turns;
|
|
159
194
|
}
|
|
160
|
-
/** The saved position for this session's transcript; null when none was saved, it names another file, or it is
|
|
195
|
+
/** The saved position for this session's transcript; null when none was saved, it names another file, or it is
|
|
196
|
+
* unreadable. */
|
|
161
197
|
export function loadTurnPosition(sessionId, transcriptPath) {
|
|
162
198
|
const file = sessionStateFiles(sessionId)?.cursor;
|
|
163
199
|
if (!file || !fs.existsSync(file))
|
|
@@ -179,7 +215,11 @@ export function saveTurnPosition(sessionId, transcriptPath, turns, log) {
|
|
|
179
215
|
if (!file)
|
|
180
216
|
return;
|
|
181
217
|
const cursor = {
|
|
182
|
-
runtime: 'vscode',
|
|
218
|
+
runtime: 'vscode',
|
|
219
|
+
sessionId,
|
|
220
|
+
source: transcriptPath,
|
|
221
|
+
position: turnPosition(turns),
|
|
222
|
+
updatedAt: new Date().toISOString(),
|
|
183
223
|
};
|
|
184
224
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
185
225
|
try {
|
|
@@ -188,7 +228,8 @@ export function saveTurnPosition(sessionId, transcriptPath, turns, log) {
|
|
|
188
228
|
fs.renameSync(tmp, file);
|
|
189
229
|
}
|
|
190
230
|
catch (err) {
|
|
191
|
-
// Windows refuses the rename (EPERM) while another process has the cursor open; the next reply re-reads these
|
|
231
|
+
// Windows refuses the rename (EPERM) while another process has the cursor open; the next reply re-reads these
|
|
232
|
+
// turns, which the dedupe keys absorb.
|
|
192
233
|
log(`cursor not saved: ${errorMessage(err)}`);
|
|
193
234
|
}
|
|
194
235
|
}
|