hippo-memory 1.68.0 → 1.70.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 -3
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.d.ts +3 -1
- package/dist/agent-memories/copilot.js +5 -4
- package/dist/agent-memories/files.js +3 -2
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +1 -1
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +1 -1
- package/dist/agent-memories/sync.js +24 -33
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +2 -2
- package/dist/api/assemble.js +42 -32
- package/dist/api/audit.d.ts +4 -7
- package/dist/api/audit.js +6 -20
- package/dist/api/auth.d.ts +5 -18
- package/dist/api/auth.js +44 -194
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
- package/dist/{availability.js → api/availability.js} +12 -29
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +14 -4
- package/dist/api/context-select.js +50 -60
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +113 -85
- package/dist/api/dormant.d.ts +3 -3
- package/dist/api/dormant.js +38 -107
- package/dist/api/drill-down.d.ts +2 -2
- package/dist/api/drill-down.js +37 -65
- package/dist/api/forget.d.ts +4 -13
- package/dist/api/forget.js +13 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/index.d.ts +26 -0
- package/dist/api/index.js +29 -0
- package/dist/api/instruction-detect.js +74 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +20 -0
- package/dist/api/ledger-db.js +79 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +36 -0
- package/dist/api/outcome.d.ts +9 -46
- package/dist/api/outcome.js +15 -57
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/promote.d.ts +7 -18
- package/dist/api/promote.js +30 -152
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
- package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +112 -0
- package/dist/{recall-history.js → api/recall-history.js} +30 -25
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +41 -16
- package/dist/api/recall.d.ts +1 -1
- package/dist/api/recall.js +39 -37
- package/dist/api/remember.d.ts +12 -13
- package/dist/api/remember.js +38 -27
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -7
- package/dist/api/sleep-run.js +63 -75
- package/dist/api/sleep.d.ts +1 -1
- package/dist/api/tokens.d.ts +2 -2
- package/dist/api/tokens.js +9 -21
- package/dist/api/types.d.ts +2 -2
- package/dist/api/types.js +1 -1
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +1 -1
- package/dist/capture/command.js +54 -41
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +4 -1
- package/dist/capture/compact.js +59 -22
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
- package/dist/capture/copilot-transcript.d.ts +3 -0
- package/dist/capture/copilot-transcript.js +9 -2
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
- package/dist/{session-digest.js → capture/session-digest.js} +17 -23
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.d.ts +13 -0
- package/dist/capture/session-worker.js +196 -0
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.js +68 -74
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
- package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +77 -72
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +18 -20
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +59 -181
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +25 -23
- package/dist/{client.d.ts → cli/client.d.ts} +1 -1
- package/dist/{client.js → cli/client.js} +1 -1
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +39 -0
- package/dist/cli/context.d.ts +2 -13
- package/dist/cli/context.js +41 -71
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +109 -99
- package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
- package/dist/cli/curate.d.ts +9 -9
- package/dist/cli/curate.js +177 -149
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +46 -34
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +108 -218
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +43 -31
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +35 -19
- package/dist/cli/flag-values.d.ts +25 -0
- package/dist/cli/flag-values.js +103 -0
- package/dist/cli/flags.d.ts +303 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +39 -34
- package/dist/cli/hook-runtime.d.ts +49 -0
- package/dist/cli/hook-runtime.js +155 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +151 -118
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +110 -0
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +9 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +31 -27
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +65 -0
- package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
- package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +77 -280
- package/dist/cli/print.d.ts +18 -0
- package/dist/cli/print.js +85 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -49
- package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +101 -150
- package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
- package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
- package/dist/cli/remember.d.ts +1 -3
- package/dist/cli/remember.js +124 -103
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
- package/dist/{scheduler.js → cli/scheduler.js} +13 -7
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +34 -4
- package/dist/cli/session-hooks.d.ts +4 -4
- package/dist/cli/session-hooks.js +265 -191
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +111 -45
- package/dist/cli/shared.d.ts +5 -95
- package/dist/cli/shared.js +18 -369
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +31 -55
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +2 -8
- package/dist/cli/sleep.js +20 -76
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +39 -41
- package/dist/{stdin.js → cli/stdin.js} +6 -6
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +68 -42
- package/dist/cli/usage.js +8 -3
- package/dist/cli.d.ts +289 -5
- package/dist/cli.js +184 -117
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +1 -1
- package/dist/connectors/github/backfill.js +29 -66
- package/dist/connectors/github/cli-impl.js +59 -74
- package/dist/connectors/github/deletion.d.ts +5 -6
- package/dist/connectors/github/deletion.js +18 -52
- package/dist/connectors/github/dlq.d.ts +7 -61
- package/dist/connectors/github/dlq.js +19 -119
- package/dist/connectors/github/ingest.d.ts +2 -31
- package/dist/connectors/github/ingest.js +20 -82
- package/dist/connectors/github/octokit-client.d.ts +1 -1
- package/dist/connectors/github/octokit-client.js +2 -1
- package/dist/connectors/github/tenant-routing.d.ts +2 -2
- package/dist/connectors/github/tenant-routing.js +10 -36
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/types.d.ts +1 -1
- package/dist/connectors/github/types.js +15 -18
- package/dist/connectors/github/webhook.d.ts +3 -2
- package/dist/connectors/github/webhook.js +84 -87
- package/dist/connectors/slack/backfill.d.ts +1 -1
- package/dist/connectors/slack/backfill.js +5 -29
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -48
- package/dist/connectors/slack/dlq.d.ts +7 -49
- package/dist/connectors/slack/dlq.js +25 -118
- package/dist/connectors/slack/ingest.d.ts +5 -18
- package/dist/connectors/slack/ingest.js +27 -90
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.js +13 -14
- package/dist/connectors/slack/transform.d.ts +1 -1
- package/dist/connectors/slack/types.d.ts +1 -1
- package/dist/connectors/slack/types.js +3 -12
- package/dist/connectors/slack/web-client.js +2 -2
- package/dist/connectors/slack/webhook.d.ts +3 -2
- package/dist/connectors/slack/webhook.js +75 -82
- package/dist/connectors/slack/workspaces.d.ts +4 -17
- package/dist/connectors/slack/workspaces.js +4 -34
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +4 -4
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
- package/dist/{dag.js → consolidate/dag.js} +60 -81
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +28 -22
- package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
- package/dist/consolidate/flush-units.d.ts +2 -2
- package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
- package/dist/consolidate/half-life-migration.js +106 -0
- package/dist/consolidate/llm-passes.js +8 -8
- package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
- package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
- package/dist/consolidate/merge.js +57 -54
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
- package/dist/consolidate/physics-pass.js +46 -46
- package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
- package/dist/{replay.js → consolidate/replay.js} +2 -2
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +1 -1
- package/dist/consolidate/sleep.js +64 -134
- package/dist/{trace.js → consolidate/trace.js} +4 -6
- package/dist/consolidate/traces.js +34 -29
- package/dist/{ablation.js → core/ablation.js} +1 -1
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.js → core/ambient.js} +12 -10
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/core/capture-contract.js +149 -0
- package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
- package/dist/{compare.js → core/compare.js} +10 -3
- package/dist/{config.d.ts → core/config.d.ts} +6 -6
- package/dist/{config.js → core/config.js} +99 -72
- package/dist/core/handoff.js +87 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
- package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
- package/dist/{memory.js → core/memory.js} +117 -82
- package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
- package/dist/{physics.js → core/physics.js} +2 -1
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
- package/dist/{project-identity.js → core/project-identity.js} +5 -17
- package/dist/{project-remote.js → core/project-remote.js} +4 -4
- package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
- package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
- package/dist/{salience.js → core/salience.js} +35 -20
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
- package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +18 -1
- package/dist/db/busy.js +74 -9
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +25 -30
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -35
- package/dist/db/migrations/v16.js +29 -26
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v20.js +4 -2
- package/dist/db/migrations/v22.js +39 -36
- package/dist/db/migrations/v24.js +27 -22
- package/dist/db/migrations/v29.js +37 -32
- package/dist/db/migrations/v31.js +36 -31
- package/dist/db/migrations/v35.js +1 -1
- package/dist/db/migrations/v39.js +1 -1
- package/dist/db/migrations/v40.js +15 -14
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +1 -1
- package/dist/db/migrations/v45.js +1 -1
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +1 -1
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +9 -1
- package/dist/db/open.js +21 -4
- package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
- package/dist/{physics-state.js → db/physics-state.js} +9 -16
- package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
- package/dist/{vector-store.js → db/vector-store.js} +76 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +105 -136
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +3 -3
- package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
- package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
- package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
- package/dist/{eval.js → eval/eval.js} +29 -22
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
- package/dist/{judgment.js → eval/judgment.js} +4 -9
- package/dist/extensions/openclaw-plugin/index.js +1 -2
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
- package/dist/{graph-extract.js → graph/extract.js} +37 -52
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
- package/dist/{graph-recall.js → graph/recall.js} +55 -36
- package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
- package/dist/{graph-stream.js → graph/stream.js} +9 -7
- package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
- package/dist/{graph-view.js → graph/view.js} +127 -167
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +14 -15
- package/dist/hooks/copilot.d.ts +48 -13
- package/dist/hooks/copilot.js +124 -39
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +3 -1
- package/dist/hooks/json-hooks.js +40 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +7 -5
- package/dist/hooks/shared.js +19 -8
- package/dist/importers/core.d.ts +2 -6
- package/dist/importers/core.js +41 -39
- package/dist/importers/markdown-parse.d.ts +1 -10
- package/dist/importers/markdown-parse.js +2 -19
- package/dist/importers/markdown.js +2 -1
- package/dist/importers/sources.js +50 -46
- package/dist/importers/vault.js +71 -92
- package/dist/index.d.ts +22 -22
- package/dist/index.js +21 -21
- package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
- package/dist/{autolearn.js → learn/autolearn.js} +13 -11
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +125 -0
- package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
- package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
- package/dist/{invalidation.js → learn/invalidation.js} +83 -99
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +37 -60
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.d.ts +2 -2
- package/dist/mcp/memory-tools.js +12 -31
- package/dist/mcp/protocol.d.ts +6 -10
- package/dist/mcp/protocol.js +8 -14
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +68 -50
- package/dist/mcp/request.js +65 -63
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/session-state.d.ts +1 -2
- package/dist/mcp/session-state.js +2 -2
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.js +69 -31
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +2 -2
- package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
- package/dist/objects/customer-notes.js +112 -0
- package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
- package/dist/objects/decisions.js +101 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
- package/dist/objects/incidents.js +130 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
- package/dist/objects/policies.js +189 -0
- package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
- package/dist/objects/processes.js +146 -0
- package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
- package/dist/objects/project-briefs.js +255 -0
- package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
- package/dist/objects/skills.js +156 -0
- package/dist/postinstall.js +4 -2
- package/dist/predictions/planning-fallacy.d.ts +4 -76
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +27 -47
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +15 -23
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +30 -49
- package/dist/rerankers/llm.d.ts +2 -4
- package/dist/rerankers/llm.js +33 -50
- package/dist/rerankers/outage-warning.d.ts +7 -0
- package/dist/rerankers/outage-warning.js +31 -0
- package/dist/rerankers/remote.d.ts +3 -0
- package/dist/rerankers/remote.js +23 -0
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -1
- package/dist/search/boosts.js +34 -13
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +4 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +7 -5
- package/dist/{path-context.js → search/path-context.js} +3 -1
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +15 -15
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +3 -3
- package/dist/search/vector.js +17 -11
- package/dist/server/auth.d.ts +1 -1
- package/dist/server/auth.js +26 -18
- package/dist/server/boot.d.ts +24 -0
- package/dist/server/boot.js +465 -0
- package/dist/server/client-ip.d.ts +5 -1
- package/dist/server/client-ip.js +18 -6
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/key-check-bounds.d.ts +8 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.js +1 -1
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +34 -24
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +10 -4
- package/dist/server/request.js +63 -12
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +209 -0
- package/dist/server/routes/admin.js +13 -8
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +32 -97
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +42 -105
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +42 -95
- package/dist/server/routes/memories.js +21 -20
- package/dist/server/routes/object-routes.d.ts +40 -0
- package/dist/server/routes/object-routes.js +80 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +40 -124
- package/dist/server/routes/predictions.js +29 -45
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +38 -118
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +38 -110
- package/dist/server/routes/recall.js +14 -12
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +37 -125
- package/dist/{server-detect.js → server/server-detect.js} +3 -2
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +70 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +27 -8
- package/dist/server/validation.d.ts +3 -4
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +41 -50
- package/dist/server.js +26 -560
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
- package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
- package/dist/{scope.js → sharing/scope.js} +1 -1
- package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
- package/dist/{shared.js → sharing/shared.js} +100 -77
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +10 -10
- package/dist/store/audit-event.d.ts +12 -6
- package/dist/store/audit-event.js +6 -5
- package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
- package/dist/{audit.js → store/audit.js} +91 -6
- package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
- package/dist/{auth.js → store/auth.js} +100 -92
- package/dist/store/candidates.d.ts +23 -12
- package/dist/store/candidates.js +87 -35
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
- package/dist/{card-detail.js → store/card-detail.js} +1 -1
- package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
- package/dist/{store-cards.js → store/cards.js} +85 -146
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +22 -5
- package/dist/store/conflicts.js +160 -109
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +92 -0
- package/dist/store/delete-and-batch.d.ts +20 -24
- package/dist/store/delete-and-batch.js +64 -40
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +51 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
- package/dist/{dormant.js → store/dormant.js} +151 -6
- package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
- package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
- package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
- package/dist/store/entry-reads.d.ts +46 -7
- package/dist/store/entry-reads.js +120 -21
- package/dist/store/entry-row.d.ts +8 -2
- package/dist/store/entry-row.js +28 -8
- package/dist/store/entry-writes.d.ts +33 -4
- package/dist/store/entry-writes.js +108 -26
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
- package/dist/{goals.js → store/goals.js} +45 -94
- package/dist/store/graph-queue.d.ts +29 -0
- package/dist/store/graph-queue.js +101 -0
- package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
- package/dist/{graph/read.js → store/graph-reads.js} +63 -115
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
- package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
- package/dist/store/graph-view-rows.d.ts +12 -0
- package/dist/store/graph-view-rows.js +67 -0
- package/dist/store/graph-writes.d.ts +58 -0
- package/dist/store/graph-writes.js +256 -0
- package/dist/store/half-life.d.ts +34 -0
- package/dist/store/half-life.js +77 -0
- package/dist/store/handoffs.d.ts +6 -3
- package/dist/store/handoffs.js +70 -31
- package/dist/store/index-and-stats.d.ts +8 -1
- package/dist/store/index-and-stats.js +51 -48
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +1 -1
- package/dist/store/markdown.js +4 -3
- package/dist/store/mirrors.d.ts +5 -7
- package/dist/store/mirrors.js +39 -25
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +8 -4
- package/dist/store/open.js +34 -23
- package/dist/store/planning-fallacy-evidence.d.ts +42 -0
- package/dist/store/planning-fallacy-evidence.js +81 -0
- package/dist/store/port.d.ts +646 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
- package/dist/{predictions/store.js → store/predictions.js} +52 -67
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
- package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
- package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
- package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +162 -0
- package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
- package/dist/{rejection.js → store/rejection.js} +3 -2
- package/dist/store/rows.d.ts +2 -3
- package/dist/store/rows.js +18 -11
- package/dist/store/search-rows.d.ts +15 -4
- package/dist/store/search-rows.js +43 -36
- package/dist/store/sessions.d.ts +18 -2
- package/dist/store/sessions.js +83 -46
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/sqlite/entry-writes-group.js +170 -0
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +59 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +28 -0
- package/dist/store/sqlite/executor.js +286 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +38 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +218 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +314 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +26 -0
- package/dist/store/sqlite/store.js +295 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +124 -0
- package/dist/store/sqlite/worker-ops.js +82 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +76 -0
- package/dist/store/summaries.d.ts +2 -11
- package/dist/store/summaries.js +17 -44
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/store/tenant-lookup.d.ts +1 -1
- package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
- package/dist/{tenant.js → store/tenant.js} +1 -1
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
- package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +26 -0
- package/dist/store/vector-writes.d.ts +10 -3
- package/dist/store/vector-writes.js +35 -5
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
- package/dist/{working-memory.js → store/working-memory.js} +39 -41
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +13 -33
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +67 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +46 -0
- package/dist/util/atomic-write.d.ts +3 -0
- package/dist/util/atomic-write.js +107 -0
- package/dist/util/crash-handlers.d.ts +5 -0
- package/dist/util/crash-handlers.js +30 -0
- package/dist/{env.d.ts → util/env.d.ts} +17 -2
- package/dist/{env.js → util/env.js} +22 -2
- package/dist/util/home-path.js +67 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
- package/dist/{http-retry.js → util/http-retry.js} +38 -7
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +5 -2
- package/dist/{log.js → util/log.js} +12 -3
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +27 -0
- package/dist/util/request-scope.js +47 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +18 -0
- package/dist/util/token-text.js +23 -0
- package/dist/{version.d.ts → util/version.d.ts} +1 -1
- package/dist/{version.js → util/version.js} +1 -1
- package/extensions/openclaw-plugin/index.ts +1 -5
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/capture-contract.js +0 -49
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.js +0 -326
- package/dist/extract.js +0 -133
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/policies.js +0 -434
- package/dist/processes.js +0 -371
- package/dist/project-briefs.js +0 -523
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/skills.js +0 -367
- package/dist/store-port.d.ts +0 -191
- package/dist/store-port.js +0 -166
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
- /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
- /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
- /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
- /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
- /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
- /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
- /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
- /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{card.d.ts → core/card.d.ts} +0 -0
- /package/dist/{card.js → core/card.js} +0 -0
- /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
- /package/dist/{physics-config.js → core/physics-config.js} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
- /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
- /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
- /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
- /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
- /package/dist/{rrf.js → search/rrf.js} +0 -0
- /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
- /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
- /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
- /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
- /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
- /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
- /package/dist/{yaml.js → store/yaml.js} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
- /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
// One record per Claude Code compaction, and what turns its summary into kept memories.
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as path from 'path';
|
|
4
|
-
import { ConflictError } from '
|
|
5
|
-
import {
|
|
4
|
+
import { ConflictError } from '../core/api-errors.js';
|
|
5
|
+
import { isStringValue } from '../core/capture-contract.js';
|
|
6
6
|
import { COMPACTION_ITEM_MAX_CHARS, compactSummaryBody, parseCompactionItems, selectItemRows } from './compaction-items.js';
|
|
7
7
|
import { importSpool, spool } from './compaction-spool.js';
|
|
8
|
-
import { isSharedStore, loadConfig } from '
|
|
9
|
-
import { closeHippoDb, isSqliteBusy, openHippoDb } from '
|
|
10
|
-
import { gatedWrite } from '
|
|
11
|
-
import { COMPACTION_MEMORY_TAG, COMPACTION_SOURCE_PREFIX, Layer, createMemory, generateId } from '
|
|
12
|
-
import { fallbackOrigin, isGlobalStoreRoot,
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import { strengthenRetrievedOn, writeEntryMirrors } from '
|
|
16
|
-
import { isRecallBoostAblated } from '
|
|
17
|
-
import { updateStats } from '
|
|
18
|
-
import { resolveTenantId } from '
|
|
19
|
-
import { errorMessage, log as logger } from '
|
|
20
|
-
import { readTranscriptTail, truncateCodePointSafe } from '
|
|
8
|
+
import { isSharedStore, loadConfig } from '../core/config.js';
|
|
9
|
+
import { closeHippoDb, isSqliteBusy, openHippoDb, withWriteScopeOr } from '../db/index.js';
|
|
10
|
+
import { gatedWrite } from '../trust/gated-write.js';
|
|
11
|
+
import { COMPACTION_MEMORY_TAG, COMPACTION_SOURCE_PREFIX, Layer, createMemory, generateId } from '../core/memory.js';
|
|
12
|
+
import { fallbackOrigin, isGlobalStoreRoot, projectId, projectNames, resolveProjectIdentity } from '../core/project-identity.js';
|
|
13
|
+
import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
|
|
14
|
+
import { closeStartedWithoutSummary, compactionProgress, compactionRowsByRequest, heldMemoryRows, insertStartedCompaction, insertSummarisedCompaction, latestCompactionRows, latestStartedRows, markCompactionDone, markCompactionSummarised, markSnapshotSavedRow, nextCompactionStart, openTranscriptRows, stalledSummarisedRows, } from '../store/compactions.js';
|
|
15
|
+
import { strengthenRetrievedOn, writeEntryMirrors } from '../store/entry-writes.js';
|
|
16
|
+
import { isRecallBoostAblated } from '../core/ablation.js';
|
|
17
|
+
import { updateStats } from '../store/index-and-stats.js';
|
|
18
|
+
import { resolveTenantId } from '../store/tenant.js';
|
|
19
|
+
import { errorMessage, log as logger } from '../util/log.js';
|
|
20
|
+
import { readTranscriptTail, truncateCodePointSafe } from '../util/transcript-tail.js';
|
|
21
21
|
/** PostCompact has 10 s in all (PreCompact 30 s), so a locked store must be given up on early. */
|
|
22
22
|
export const COMPACTION_DB_WAIT_MS = 2000;
|
|
23
23
|
/** Tested verbatim: Claude Code hands PreCompact stdout to the summariser as instructions. */
|
|
@@ -81,25 +81,18 @@ function toRecord(row) {
|
|
|
81
81
|
status: row.status,
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
|
-
const COLUMNS = 'tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, snapshot_saved, started_at, summarised_at, summary, items_json, items_written, status';
|
|
85
|
-
function selectRecords(db, where, ...params) {
|
|
86
|
-
// SAFETY: the SELECT names exactly COLUMNS, matching CompactionRow's field set.
|
|
87
|
-
const rows = db.prepare(`SELECT ${COLUMNS} FROM compactions WHERE ${where}`).all(...params);
|
|
88
|
-
return rows.map(toRecord);
|
|
89
|
-
}
|
|
90
84
|
export function startCompaction(db, tenantId, start, at = new Date()) {
|
|
91
85
|
const id = generateId('cmp');
|
|
92
|
-
db
|
|
93
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(tenantId, id, start.sessionId, start.originProject, start.trigger, start.cwd, start.transcriptPath, at.toISOString());
|
|
86
|
+
insertStartedCompaction(db, tenantId, { id, ...start, startedAt: at.toISOString() });
|
|
94
87
|
return id;
|
|
95
88
|
}
|
|
96
89
|
/** A session's newest record, or null. */
|
|
97
90
|
export function latestCompaction(db, tenantId, sessionId) {
|
|
98
|
-
return
|
|
91
|
+
return latestCompactionRows(db, tenantId, sessionId).map(toRecord)[0] ?? null;
|
|
99
92
|
}
|
|
100
93
|
/** The record a caller's request made, whatever state it reached, so a retry neither writes its items twice nor starts a second record; another session's id is a ConflictError. */
|
|
101
94
|
export function compactionByRequest(db, tenantId, requestId, sessionId) {
|
|
102
|
-
const record =
|
|
95
|
+
const record = compactionRowsByRequest(db, tenantId, requestId).map(toRecord)[0] ?? null;
|
|
103
96
|
// Sessions are owner-bound, so this also keeps one owner from reading or finishing another's record.
|
|
104
97
|
if (record !== null && record.sessionId !== sessionId)
|
|
105
98
|
throw new ConflictError('request id belongs to another session');
|
|
@@ -107,15 +100,11 @@ export function compactionByRequest(db, tenantId, requestId, sessionId) {
|
|
|
107
100
|
}
|
|
108
101
|
/** Pre-compact's record for the compaction that is ending: the session's newest `started` one within REPLAY_AFTER_MS before `at`, so an older one is left for the transcript fill. */
|
|
109
102
|
function latestStarted(db, tenantId, sessionId, at) {
|
|
110
|
-
return
|
|
103
|
+
return latestStartedRows(db, tenantId, sessionId, at.toISOString(), new Date(at.getTime() - REPLAY_AFTER_MS).toISOString()).map(toRecord)[0] ?? null;
|
|
111
104
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const stamp = requestId === undefined ? [] : [requestId];
|
|
116
|
-
const result = db.prepare(`UPDATE compactions SET summary = ?, items_json = ?, summarised_at = ?, status = 'summarised'${stamp.length === 0 ? '' : ', request_id = ?'}
|
|
117
|
-
WHERE tenant_id = ? AND id = ? AND status = 'started'`).run(text.summary, JSON.stringify(text.items), summarisedAt, ...stamp, tenantId, id);
|
|
118
|
-
return (result.changes ?? 0) > 0;
|
|
105
|
+
function markSummarised(db, tenantId, id, options) {
|
|
106
|
+
const { text, summarisedAt, requestId } = options;
|
|
107
|
+
return markCompactionSummarised(db, tenantId, id, { summary: text.summary, itemsJson: JSON.stringify(text.items), summarisedAt, requestId });
|
|
119
108
|
}
|
|
120
109
|
/** Best effort, never throws: a compaction must not fail because its record could not be written. */
|
|
121
110
|
export function recordCompactionStart(hippoRoot, start, log) {
|
|
@@ -135,7 +124,7 @@ export function recordCompactionStart(hippoRoot, start, log) {
|
|
|
135
124
|
}
|
|
136
125
|
/** On the caller's handle and tenant, so a server marks the record under the caller's tenant with its own wait. */
|
|
137
126
|
export function markSnapshotSaved(db, tenantId, recordId) {
|
|
138
|
-
db
|
|
127
|
+
markSnapshotSavedRow(db, tenantId, recordId);
|
|
139
128
|
}
|
|
140
129
|
export function recordSnapshotSaved(hippoRoot, tenantId, recordId, log) {
|
|
141
130
|
let db;
|
|
@@ -152,21 +141,18 @@ export function recordSnapshotSaved(hippoRoot, tenantId, recordId, log) {
|
|
|
152
141
|
}
|
|
153
142
|
}
|
|
154
143
|
/** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One statement each. */
|
|
155
|
-
export function recordSummary(db, hippoRoot, tenantId,
|
|
144
|
+
export function recordSummary(db, hippoRoot, tenantId, options) {
|
|
145
|
+
const { meta, text, at, caller = {} } = options;
|
|
156
146
|
const now = new Date().toISOString();
|
|
157
147
|
const itemsJson = JSON.stringify(text.items);
|
|
158
148
|
const { requestId } = caller;
|
|
159
149
|
const started = latestStarted(db, tenantId, meta.sessionId, at);
|
|
160
|
-
if (started && markSummarised(db, tenantId, started.id, text, now, requestId)) {
|
|
150
|
+
if (started && markSummarised(db, tenantId, started.id, { text, summarisedAt: now, requestId })) {
|
|
161
151
|
return { ...started, summary: text.summary, items: text.items, summarisedAt: now, status: 'summarised' };
|
|
162
152
|
}
|
|
163
153
|
const originProject = caller.originProject ?? compactionOrigin(hippoRoot, meta.cwd);
|
|
164
154
|
const id = generateId('cmp');
|
|
165
|
-
|
|
166
|
-
const stamp = requestId === undefined ? [] : [requestId];
|
|
167
|
-
const [col, mark] = stamp.length === 0 ? ['', ''] : [', request_id', ', ?'];
|
|
168
|
-
db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, started_at, summarised_at, summary, items_json, status${col})
|
|
169
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'summarised'${mark})`).run(tenantId, id, meta.sessionId, originProject, meta.trigger, meta.cwd, meta.transcriptPath, at.toISOString(), now, text.summary, itemsJson, ...stamp);
|
|
155
|
+
insertSummarisedCompaction(db, tenantId, { ...meta, originProject, startedAt: at.toISOString() }, { id, summary: text.summary, itemsJson, summarisedAt: now, requestId });
|
|
170
156
|
return {
|
|
171
157
|
id, tenantId, sessionId: meta.sessionId, originProject, trigger: meta.trigger, cwd: meta.cwd, transcriptPath: meta.transcriptPath,
|
|
172
158
|
snapshotSaved: false, startedAt: at.toISOString(), summarisedAt: now, summary: text.summary, items: text.items, itemsWritten: 0, status: 'summarised',
|
|
@@ -195,11 +181,7 @@ function restates(item, held) {
|
|
|
195
181
|
}
|
|
196
182
|
/** Live rows of one tenant and origin that default recall shows: a compaction often restates what an earlier one, or the user, already saved. */
|
|
197
183
|
function heldRows(db, tenantId, origins) {
|
|
198
|
-
|
|
199
|
-
// SAFETY: the SELECT names the id, source_session_id and content columns.
|
|
200
|
-
const rows = db.prepare(`SELECT id, source_session_id, content FROM memories WHERE tenant_id = ? AND ${originInSql(origins)} AND superseded_by IS NULL AND kind != 'raw'
|
|
201
|
-
AND ${deny.sql}`).all(tenantId, ...origins, ...deny.params);
|
|
202
|
-
return rows.map((r) => ({ id: r.id, sessionId: r.source_session_id, words: words(r.content) }));
|
|
184
|
+
return heldMemoryRows(db, tenantId, origins).map((r) => ({ id: r.id, sessionId: r.source_session_id, words: words(r.content) }));
|
|
203
185
|
}
|
|
204
186
|
function compactionEntry(text, ctx, origin, baseHalfLifeDays) {
|
|
205
187
|
return {
|
|
@@ -277,56 +259,31 @@ export function saveItems(db, hippoRoot, ctx, log) {
|
|
|
277
259
|
if (capped > 0)
|
|
278
260
|
log(`capped: ${capped} more kept in the record only`);
|
|
279
261
|
const baseHalfLifeDays = loadConfig(hippoRoot).defaultHalfLifeDays;
|
|
280
|
-
let
|
|
281
|
-
db
|
|
282
|
-
try {
|
|
262
|
+
let finishedItems = 0;
|
|
263
|
+
const writes = withWriteScopeOr(db, 'save_items', (rollback) => {
|
|
283
264
|
if (ctx.recordId !== null) {
|
|
284
265
|
// A replayer that read the record before another finished it must not write its items again.
|
|
285
|
-
const current = db.
|
|
286
|
-
.get(ctx.tenantId, ctx.recordId);
|
|
266
|
+
const current = compactionProgress(db, ctx.tenantId, ctx.recordId);
|
|
287
267
|
if (current?.status !== 'summarised') {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
return current?.items_written ?? 0;
|
|
268
|
+
finishedItems = current?.items_written ?? 0;
|
|
269
|
+
return rollback(null);
|
|
291
270
|
}
|
|
292
271
|
}
|
|
293
|
-
|
|
272
|
+
const written = writeItemRows(db, hippoRoot, ctx, rows, baseHalfLifeDays);
|
|
294
273
|
// Said again by another session is the same signal as being recalled; the same session carrying it forward is not.
|
|
295
|
-
strengthenRetrievedOn(db,
|
|
274
|
+
strengthenRetrievedOn(db, written.restated, { tenantId: ctx.tenantId, recallBoostAblated: isRecallBoostAblated() });
|
|
296
275
|
if (ctx.recordId !== null) {
|
|
297
|
-
db
|
|
276
|
+
markCompactionDone(db, ctx.tenantId, ctx.recordId, written.written.length);
|
|
298
277
|
}
|
|
299
|
-
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
}
|
|
305
|
-
catch { /* already rolled back; keep the original error */ }
|
|
306
|
-
throw err;
|
|
278
|
+
return written;
|
|
279
|
+
});
|
|
280
|
+
if (writes === null) {
|
|
281
|
+
log(`${ctx.recordId} was already finished by another process`);
|
|
282
|
+
return finishedItems;
|
|
307
283
|
}
|
|
308
284
|
finishItemWrites(hippoRoot, writes, log);
|
|
309
285
|
return writes.written.length;
|
|
310
286
|
}
|
|
311
|
-
/** null when the text is not a PostCompact payload naming a session. */
|
|
312
|
-
export function parsePostCompactPayload(stdinText) {
|
|
313
|
-
let raw;
|
|
314
|
-
try {
|
|
315
|
-
raw = JSON.parse((stdinText ?? '').trim());
|
|
316
|
-
}
|
|
317
|
-
catch {
|
|
318
|
-
return null; // non-JSON stdin is not a PostCompact payload; the caller skips it
|
|
319
|
-
}
|
|
320
|
-
if (!isObjectLike(raw) || !('session_id' in raw) || !isStringValue(raw.session_id) || raw.session_id === '')
|
|
321
|
-
return null;
|
|
322
|
-
return {
|
|
323
|
-
sessionId: raw.session_id,
|
|
324
|
-
trigger: 'trigger' in raw && isStringValue(raw.trigger) ? raw.trigger : null,
|
|
325
|
-
cwd: 'cwd' in raw && isStringValue(raw.cwd) ? raw.cwd : null,
|
|
326
|
-
transcriptPath: 'transcript_path' in raw && isStringValue(raw.transcript_path) ? raw.transcript_path : null,
|
|
327
|
-
compactSummary: 'compact_summary' in raw && isStringValue(raw.compact_summary) ? raw.compact_summary : null,
|
|
328
|
-
};
|
|
329
|
-
}
|
|
330
287
|
/** The PostCompact work: record the summary, then write its items. Each step is independent; a busy store spools or defers. Never throws. */
|
|
331
288
|
export function saveCompaction(hippoRoot, payload, log) {
|
|
332
289
|
const result = { written: null, deferred: false, snapshotSaved: false };
|
|
@@ -344,7 +301,7 @@ export function saveCompaction(hippoRoot, payload, log) {
|
|
|
344
301
|
const tenantId = resolveTenantId({});
|
|
345
302
|
let record = null;
|
|
346
303
|
try {
|
|
347
|
-
record = recordSummary(db, hippoRoot, tenantId, payload, text, at);
|
|
304
|
+
record = recordSummary(db, hippoRoot, tenantId, { meta: payload, text, at });
|
|
348
305
|
result.snapshotSaved = record.snapshotSaved;
|
|
349
306
|
}
|
|
350
307
|
catch (err) {
|
|
@@ -437,19 +394,16 @@ function transcriptSummary(transcriptPath, afterMs, beforeMs) {
|
|
|
437
394
|
return null;
|
|
438
395
|
}
|
|
439
396
|
function closeWithoutSummary(db, tenantId, id, log) {
|
|
440
|
-
|
|
441
|
-
if ((result.changes ?? 0) > 0)
|
|
397
|
+
if (closeStartedWithoutSummary(db, tenantId, id) > 0)
|
|
442
398
|
log(`${id} closed as no-summary: its transcript holds no summary for it`);
|
|
443
399
|
}
|
|
444
400
|
function nextStartedAt(db, record) {
|
|
445
|
-
|
|
446
|
-
.get(record.tenantId, record.sessionId, record.startedAt);
|
|
447
|
-
return row?.at ?? null;
|
|
401
|
+
return nextCompactionStart(db, record.tenantId, record.sessionId, record.startedAt);
|
|
448
402
|
}
|
|
449
403
|
/** Records a spooled summary, then writes its items. */
|
|
450
404
|
function spoolImporter(db, hippoRoot, log) {
|
|
451
405
|
return (spooled, recorded) => {
|
|
452
|
-
const record = recordSummary(db, hippoRoot, spooled.tenantId, spooled.payload, spooled.text, spooled.at);
|
|
406
|
+
const record = recordSummary(db, hippoRoot, spooled.tenantId, { meta: spooled.payload, text: spooled.text, at: spooled.at });
|
|
453
407
|
// The record holds the items now, so the file is done even if the write below fails.
|
|
454
408
|
recorded();
|
|
455
409
|
saveItems(db, hippoRoot, { tenantId: spooled.tenantId, recordId: record.id, sessionId: record.sessionId, originProject: record.originProject, cwd: record.cwd, items: record.items }, log);
|
|
@@ -460,7 +414,7 @@ export function replayCompactions(db, hippoRoot, log, deadline = Number.POSITIVE
|
|
|
460
414
|
const tenantId = resolveTenantId({});
|
|
461
415
|
const now = Date.now();
|
|
462
416
|
let finished = 0;
|
|
463
|
-
const stalled =
|
|
417
|
+
const stalled = stalledSummarisedRows(db, tenantId, new Date(now - REPLAY_AFTER_MS).toISOString()).map(toRecord);
|
|
464
418
|
for (const record of stalled) {
|
|
465
419
|
if (Date.now() > deadline)
|
|
466
420
|
break;
|
|
@@ -478,7 +432,7 @@ export function replayCompactions(db, hippoRoot, log, deadline = Number.POSITIVE
|
|
|
478
432
|
catch (err) {
|
|
479
433
|
log(`spool import failed: ${errorMessage(err)}`);
|
|
480
434
|
}
|
|
481
|
-
const open =
|
|
435
|
+
const open = openTranscriptRows(db, tenantId, new Date(now - REPLAY_AFTER_MS).toISOString(), new Date(now - TRANSCRIPT_FILL_WINDOW_MS).toISOString()).map(toRecord);
|
|
482
436
|
for (const record of open) {
|
|
483
437
|
if (Date.now() > deadline)
|
|
484
438
|
break;
|
|
@@ -495,7 +449,7 @@ export function replayCompactions(db, hippoRoot, log, deadline = Number.POSITIVE
|
|
|
495
449
|
const { found: listed, ...text } = readCompactionText(found);
|
|
496
450
|
if (!listed)
|
|
497
451
|
log(`no memories section in the transcript summary for ${record.id}`);
|
|
498
|
-
if (!markSummarised(db, tenantId, record.id, text, new Date().toISOString())) {
|
|
452
|
+
if (!markSummarised(db, tenantId, record.id, { text, summarisedAt: new Date().toISOString() })) {
|
|
499
453
|
log(`${record.id} was filled by another process`);
|
|
500
454
|
continue;
|
|
501
455
|
}
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
import { randomBytes } from 'crypto';
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
|
-
import { isObjectLike, isStringValue } from '
|
|
6
|
-
import { isSqliteBusy } from '
|
|
7
|
-
import { errorMessage } from '
|
|
5
|
+
import { isObjectLike, isStringValue } from '../core/capture-contract.js';
|
|
6
|
+
import { isSqliteBusy } from '../db/busy.js';
|
|
7
|
+
import { errorMessage } from '../util/log.js';
|
|
8
|
+
const STAMP_DIGITS = 13;
|
|
8
9
|
export const SPOOL_DIR = 'compactions-spool';
|
|
9
10
|
/** Starts the log line of a step that broke with an unexpected error, so the session-start banner counts it; a set-aside file is counted by its `.bad` name instead. */
|
|
10
11
|
export const SPOOL_PROBLEM = 'spool problem: ';
|
|
@@ -31,7 +32,7 @@ let fsx = fs;
|
|
|
31
32
|
export function __setSpoolFs(next) {
|
|
32
33
|
fsx = next ?? fs;
|
|
33
34
|
}
|
|
34
|
-
const stamp = (ms) => String(Math.trunc(ms)).padStart(
|
|
35
|
+
const stamp = (ms) => String(Math.trunc(ms)).padStart(STAMP_DIGITS, '0');
|
|
35
36
|
const isTime = (value) => typeof value === 'number' && Number.isFinite(value);
|
|
36
37
|
const idle = new Int32Array(new SharedArrayBuffer(4));
|
|
37
38
|
function errCode(cause) {
|
|
@@ -244,7 +245,7 @@ function recoverStaleClaims(dir, names, log) {
|
|
|
244
245
|
putBackOne = true;
|
|
245
246
|
}
|
|
246
247
|
}
|
|
247
|
-
else if (moveBad(dir, file, claim.stem, claim.attempt, 'interrupted', log)) {
|
|
248
|
+
else if (moveBad(dir, file, { stem: claim.stem, attempt: claim.attempt, cause: 'interrupted', log })) {
|
|
248
249
|
log(`spool file ${claim.name} was claimed by a replayer that never finished ${MAX_ATTEMPTS} times, set aside as .bad`);
|
|
249
250
|
}
|
|
250
251
|
}
|
|
@@ -258,7 +259,8 @@ function putBack(dir, claim, stem, attempt, log) {
|
|
|
258
259
|
}
|
|
259
260
|
}
|
|
260
261
|
/** Writes `<stem>.<cause>.bad` through a random temp file, so the rename replaces any torn `.bad` a crash left. */
|
|
261
|
-
function writeBad(dir,
|
|
262
|
+
function writeBad(dir, options) {
|
|
263
|
+
const { stem, cause, text, log, what } = options;
|
|
262
264
|
const tmp = path.join(dir, `${stem}.${cause}.bad.${randomBytes(4).toString('hex')}.tmp`);
|
|
263
265
|
const written = settle(() => fsx.writeFileSync(tmp, text, { encoding: 'utf8', flag: 'wx' }), log, what);
|
|
264
266
|
const moved = written === 'done' ? settle(() => fsx.renameSync(tmp, path.join(dir, `${stem}.${cause}.bad`)), log, what) : written;
|
|
@@ -267,12 +269,13 @@ function writeBad(dir, stem, cause, text, log, what) {
|
|
|
267
269
|
return moved === 'done';
|
|
268
270
|
}
|
|
269
271
|
/** Sets a claim aside as `.bad` before the claim goes, so a crash between leaves a whole copy; a busy write puts the claim back. */
|
|
270
|
-
function moveBad(dir, claim,
|
|
272
|
+
function moveBad(dir, claim, options) {
|
|
273
|
+
const { stem, attempt, cause, log, raw } = options;
|
|
271
274
|
const what = `spool file ${path.basename(claim)} not set aside`;
|
|
272
275
|
let text = raw ?? '';
|
|
273
276
|
if (raw === undefined && settle(() => { text = fsx.readFileSync(claim, 'utf8'); }, log, what) !== 'done')
|
|
274
277
|
return false;
|
|
275
|
-
if (!writeBad(dir, stem, cause, text, log, what)) {
|
|
278
|
+
if (!writeBad(dir, { stem, cause, text, log, what })) {
|
|
276
279
|
putBack(dir, claim, stem, attempt, log);
|
|
277
280
|
return false;
|
|
278
281
|
}
|
|
@@ -306,7 +309,7 @@ function promoteTmp(dir, names, tenantId, log) {
|
|
|
306
309
|
promoted = true;
|
|
307
310
|
}
|
|
308
311
|
}
|
|
309
|
-
else if (writeBad(dir, m[1], 'unreadable', text, log, what)) {
|
|
312
|
+
else if (writeBad(dir, { stem: m[1], cause: 'unreadable', text, log, what })) {
|
|
310
313
|
settle(() => fsx.unlinkSync(file), log, what);
|
|
311
314
|
log(`spool file ${name} was never finished, set aside as .bad`);
|
|
312
315
|
}
|
|
@@ -320,7 +323,8 @@ function removeClaim(claim, name, log) {
|
|
|
320
323
|
log(`spool file ${name} saved; its claim could not be removed (${removed.code}); it will be imported again`);
|
|
321
324
|
}
|
|
322
325
|
/** After an importer throw: a busy store stops the run with the count unchanged, any other error counts one try toward .bad. */
|
|
323
|
-
function importFailed(dir, claim, entry,
|
|
326
|
+
function importFailed(dir, claim, entry, options) {
|
|
327
|
+
const { text, recorded, cause, log } = options;
|
|
324
328
|
const { name } = entry;
|
|
325
329
|
const busy = isSqliteBusy(cause);
|
|
326
330
|
if (recorded) {
|
|
@@ -338,7 +342,7 @@ function importFailed(dir, claim, entry, text, recorded, cause, log) {
|
|
|
338
342
|
putBack(dir, claim, entry.stem, next, log);
|
|
339
343
|
log(`spool file ${name} failed to import (try ${next} of ${MAX_ATTEMPTS}): ${errorMessage(cause)}`);
|
|
340
344
|
}
|
|
341
|
-
else if (moveBad(dir, claim, entry.stem, entry.attempt, 'failed', log, text)) {
|
|
345
|
+
else if (moveBad(dir, claim, { stem: entry.stem, attempt: entry.attempt, cause: 'failed', log, raw: text })) {
|
|
342
346
|
log(`spool file ${name} set aside as .bad after ${MAX_ATTEMPTS} tries: ${errorMessage(cause)}`);
|
|
343
347
|
}
|
|
344
348
|
return 'skipped';
|
|
@@ -362,7 +366,7 @@ function importFile(dir, entry, tenantId, log, importOne) {
|
|
|
362
366
|
return 'skipped';
|
|
363
367
|
const spooled = parseSpooled(text, tenantId);
|
|
364
368
|
if (spooled === null) {
|
|
365
|
-
if (moveBad(dir, claim, entry.stem, entry.attempt, 'unreadable', log, text))
|
|
369
|
+
if (moveBad(dir, claim, { stem: entry.stem, attempt: entry.attempt, cause: 'unreadable', log, raw: text }))
|
|
366
370
|
log(`spool file ${name} is not readable, set aside as .bad`);
|
|
367
371
|
return 'skipped';
|
|
368
372
|
}
|
|
@@ -379,7 +383,7 @@ function importFile(dir, entry, tenantId, log, importOne) {
|
|
|
379
383
|
return 'imported';
|
|
380
384
|
}
|
|
381
385
|
catch (err) {
|
|
382
|
-
return importFailed(dir, claim, entry, text, recorded, err, log);
|
|
386
|
+
return importFailed(dir, claim, entry, { text, recorded, cause: err, log });
|
|
383
387
|
}
|
|
384
388
|
}
|
|
385
389
|
function mtimeOf(file) {
|
|
@@ -8,8 +8,11 @@ export interface CopilotTurn {
|
|
|
8
8
|
role: 'user' | 'assistant';
|
|
9
9
|
text: string;
|
|
10
10
|
}
|
|
11
|
+
export declare const SESSION_ID_RE: RegExp;
|
|
11
12
|
/** The Copilot CLI log for a session, `<copilotHome>/session-state/<id>/events.jsonl`; null for an unsafe id or a missing file. */
|
|
12
13
|
export declare function copilotTranscriptFor(sessionId: string): string | null;
|
|
14
|
+
/** True for VS Code's own chat log, `<workspaceStorage>/<id>/github.copilot-chat/transcripts/<session id>.jsonl`, in either slash and any case. */
|
|
15
|
+
export declare function isVscodeTranscript(file: string | null): boolean;
|
|
13
16
|
/** The turn one Copilot event-log line carries: the text of a human user.message or of an assistant.message; null for any other line, a sub-agent's included. */
|
|
14
17
|
export declare function copilotTurn(line: CopilotEventLine): CopilotTurn | null;
|
|
15
18
|
//# sourceMappingURL=copilot-transcript.d.ts.map
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import { copilotHomeDir } from '../hooks/shared.js';
|
|
6
|
-
import { isObjectLike, isStringValue } from '../capture-contract.js';
|
|
6
|
+
import { isObjectLike, isStringValue } from '../core/capture-contract.js';
|
|
7
7
|
// A session id becomes a folder name, so anything beyond word characters and hyphens could climb out of session-state.
|
|
8
|
-
const SESSION_ID_RE = /^[\w-]+$/;
|
|
8
|
+
export const SESSION_ID_RE = /^[\w-]+$/;
|
|
9
9
|
// user.message sources that mark text hippo did not get from the human: a hidden skill injection or another agent's prompt.
|
|
10
10
|
const INJECTED_SOURCE_PREFIXES = ['skill-', 'agent-'];
|
|
11
11
|
/** The Copilot CLI log for a session, `<copilotHome>/session-state/<id>/events.jsonl`; null for an unsafe id or a missing file. */
|
|
@@ -15,6 +15,13 @@ export function copilotTranscriptFor(sessionId) {
|
|
|
15
15
|
const file = path.join(copilotHomeDir(), 'session-state', sessionId, 'events.jsonl');
|
|
16
16
|
return fs.existsSync(file) ? file : null;
|
|
17
17
|
}
|
|
18
|
+
/** True for VS Code's own chat log, `<workspaceStorage>/<id>/github.copilot-chat/transcripts/<session id>.jsonl`, in either slash and any case. */
|
|
19
|
+
export function isVscodeTranscript(file) {
|
|
20
|
+
if (!file)
|
|
21
|
+
return false;
|
|
22
|
+
const parts = file.toLowerCase().split(/[\\/]/);
|
|
23
|
+
return parts.length >= 3 && parts[parts.length - 2] === 'transcripts' && parts[parts.length - 3] === 'github.copilot-chat';
|
|
24
|
+
}
|
|
18
25
|
function isSubagentLine(line, data) {
|
|
19
26
|
if (isStringValue(line.agentId) && line.agentId !== '')
|
|
20
27
|
return true;
|
package/dist/capture/extract.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { duplicateKey } from '../same-text.js';
|
|
2
|
-
import { assessAutomaticMemory } from '../memory-quality.js';
|
|
1
|
+
import { duplicateKey } from '../util/same-text.js';
|
|
2
|
+
import { assessAutomaticMemory } from '../core/memory-quality.js';
|
|
3
3
|
const DECISION_PATTERNS = [
|
|
4
4
|
/\b(?:we(?:'ve| have)?|i(?:'ve| have)?|let's)\s+decid(?:ed|e)\b/i,
|
|
5
5
|
/\b(?:let's|we(?:'ll| will| should)?)\s+(?:go with|do|use|try|build|implement|switch to)\b/i,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Context } from '../api/types.js';
|
|
2
|
-
import type
|
|
3
|
-
import
|
|
2
|
+
import { type CaptureErrorOutcome, type RoutineRule } from '../store/failure-log.js';
|
|
3
|
+
import type { CallerProject } from '../api/prompt-hook.js';
|
|
4
4
|
type FailureSkip = Exclude<CaptureErrorOutcome, 'stored' | 'duplicate'>;
|
|
5
5
|
/** failureReport's reading of the payload, read on the caller's machine, plus the id its retries carry. */
|
|
6
6
|
export interface CallerFailureRequest {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// PostToolUseFailure for a caller on another machine: the lesson and its log row carry the caller's owner and project, and a retried request id gets the first answer.
|
|
2
|
-
import { BadRequestError } from '../api-errors.js';
|
|
3
|
-
import { storeLesson } from '
|
|
4
|
-
import { recordFailure, requestOutcome, settleFailureOutcome } from '../failure-log.js';
|
|
5
|
-
import { errorMessage, log } from '../log.js';
|
|
6
|
-
import { scrubForSharing } from '
|
|
7
|
-
import { truncateCodePointSafe } from '../transcript-tail.js';
|
|
2
|
+
import { BadRequestError } from '../core/api-errors.js';
|
|
3
|
+
import { storeLesson } from './capture-error.js';
|
|
4
|
+
import { recordFailure, requestOutcome, settleFailureOutcome } from '../store/failure-log.js';
|
|
5
|
+
import { errorMessage, log } from '../util/log.js';
|
|
6
|
+
import { scrubForSharing } from './share-scrub.js';
|
|
7
|
+
import { truncateCodePointSafe } from '../util/transcript-tail.js';
|
|
8
8
|
import { assertRequestId, bindCaller, withCallerDb } from './caller-session.js';
|
|
9
9
|
import { FAILURE_TEXT_MAX_CHARS, failureHash } from './failure-reading.js';
|
|
10
10
|
const SKIPS = { 'skipped-interrupt': true, 'skipped-routine': true, 'skipped-invalid': true };
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
3
|
-
export type CaptureErrorOutcome = 'stored' | 'duplicate' | 'skipped-interrupt' | 'skipped-routine' | 'skipped-invalid';
|
|
4
|
-
/** Which routine check skipped a failure; the log keeps it so declines can be told apart from empty searches. */
|
|
5
|
-
export type RoutineRule = 'declined' | 'os-permission' | 'no-match' | 'search-tool' | 'quiet-exit';
|
|
1
|
+
import { type JsonValue } from '../util/json.js';
|
|
2
|
+
import type { CaptureErrorOutcome, RoutineRule } from '../store/failure-log.js';
|
|
6
3
|
/** What {@link lessonFromFailure} read from a payload; `detail` is the finer failure-log key (untruncated, command head). */
|
|
7
4
|
export type FailureReading = {
|
|
8
5
|
text: string;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// What a PostToolUseFailure payload says, read with no store, so a hook with no store sends the same reading the local log keeps.
|
|
2
|
-
import { redactSecretsStrict } from '../secret-detect.js';
|
|
3
|
-
import { scrubForSharing } from '
|
|
4
|
-
import { blockHash } from '../token-
|
|
5
|
-
import { truncateCodePointSafe } from '../transcript-tail.js';
|
|
2
|
+
import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
3
|
+
import { scrubForSharing } from './share-scrub.js';
|
|
4
|
+
import { blockHash } from '../util/token-text.js';
|
|
5
|
+
import { truncateCodePointSafe } from '../util/transcript-tail.js';
|
|
6
|
+
import { isJsonObjectLiteral } from '../util/json.js';
|
|
7
|
+
const COMMAND_HEAD_WORDS = 2;
|
|
6
8
|
/** The longest lesson text a reading gives, so a check of a sent one imports it instead of copying it. */
|
|
7
9
|
export const FAILURE_TEXT_MAX_CHARS = 200;
|
|
8
10
|
/** The user, a permission prompt or a hook said no: routine, not a lesson. */
|
|
@@ -20,12 +22,9 @@ const SHELL_TOOLS = new Set(['Bash', 'bash', 'powershell', 'run_in_terminal']);
|
|
|
20
22
|
function isString(v) {
|
|
21
23
|
return v !== undefined && v !== null && v.constructor === String;
|
|
22
24
|
}
|
|
23
|
-
function isObject(v) {
|
|
24
|
-
return v !== undefined && v !== null && !Array.isArray(v) && v.constructor === Object;
|
|
25
|
-
}
|
|
26
25
|
/** A non-blank string field of the payload, or null. */
|
|
27
26
|
export function payloadString(payload, key) {
|
|
28
|
-
if (!
|
|
27
|
+
if (!isJsonObjectLiteral(payload))
|
|
29
28
|
return null;
|
|
30
29
|
const value = payload[key];
|
|
31
30
|
return isString(value) && value.trim() !== '' ? value : null;
|
|
@@ -40,9 +39,9 @@ export function failureHash(text) {
|
|
|
40
39
|
}
|
|
41
40
|
/** The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub` runs before the cap, as a mask can be longer than what it hides. Pure. */
|
|
42
41
|
export function lessonFromFailure(payload, scrub = (text) => text) {
|
|
43
|
-
if (!
|
|
42
|
+
if (!isJsonObjectLiteral(payload))
|
|
44
43
|
return { skip: 'skipped-invalid', text: null, detail: null };
|
|
45
|
-
// SAFETY:
|
|
44
|
+
// SAFETY: isJsonObjectLiteral narrowed payload to a plain JSON object; the fields read are all optional.
|
|
46
45
|
const p = payload;
|
|
47
46
|
if (p.is_interrupt === true)
|
|
48
47
|
return { skip: 'skipped-interrupt', text: null, detail: null };
|
|
@@ -51,8 +50,8 @@ export function lessonFromFailure(payload, scrub = (text) => text) {
|
|
|
51
50
|
const tool = isString(p.tool_name) ? p.tool_name : 'tool';
|
|
52
51
|
const error = redactSecretsStrict(p.error.replace(/\s+/g, ' ').trim());
|
|
53
52
|
const text = truncateCodePointSafe(scrub(`${tool}: ${error}`), FAILURE_TEXT_MAX_CHARS);
|
|
54
|
-
const command =
|
|
55
|
-
const head = command.trim().split(/\s+/).slice(0,
|
|
53
|
+
const command = isJsonObjectLiteral(p.tool_input) && isString(p.tool_input['command']) ? p.tool_input['command'].replace(LEADING_CD, '') : '';
|
|
54
|
+
const head = command.trim().split(/\s+/).slice(0, COMMAND_HEAD_WORDS).join(' ');
|
|
56
55
|
const detail = `${tool}${head ? ` ${head}` : ''}: ${error}`;
|
|
57
56
|
const routine = (rule) => ({ skip: 'skipped-routine', rule, text, detail });
|
|
58
57
|
if (DECLINED.test(error))
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { HandoffEvidence } from '
|
|
1
|
+
import type { HandoffEvidence } from '../core/handoff.js';
|
|
2
2
|
export declare function collectHandoffEvidence(cwd: string, testStatus: HandoffEvidence['testStatus'], options?: {
|
|
3
3
|
timeoutMs?: number;
|
|
4
4
|
}): HandoffEvidence;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// A handoff's git evidence, read with no store, so a hook with no store can send it with the session's end.
|
|
2
2
|
import { execFileSync } from 'child_process';
|
|
3
|
+
const DEFAULT_TIMEOUT_MS = 2000;
|
|
3
4
|
// Best-effort git state; a missing git, non-repo cwd, or a call past timeoutMs (each call, default 2 s)
|
|
4
5
|
// yields null fields rather than throw, so a hook with a hard deadline can cap a slow repo.
|
|
5
6
|
export function collectHandoffEvidence(cwd, testStatus, options = {}) {
|
|
6
|
-
const timeoutMs = options.timeoutMs ??
|
|
7
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
7
8
|
let gitRef = null;
|
|
8
9
|
try {
|
|
9
10
|
gitRef = execFileSync('git', ['rev-parse', 'HEAD'], {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Context } from '../api/types.js';
|
|
2
|
-
import type { CallerProject } from '../prompt-hook.js';
|
|
2
|
+
import type { CallerProject } from '../api/prompt-hook.js';
|
|
3
3
|
import { type WorkingState } from './working-state.js';
|
|
4
4
|
export interface CallerPreCompactRequest {
|
|
5
5
|
readonly sessionId: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { markSnapshotSaved, PRE_COMPACT_INSTRUCTION, startCompaction } from '
|
|
2
|
-
import { errorMessage, log } from '../log.js';
|
|
1
|
+
import { markSnapshotSaved, PRE_COMPACT_INSTRUCTION, startCompaction } from './compaction-record.js';
|
|
2
|
+
import { errorMessage, log } from '../util/log.js';
|
|
3
3
|
import { loadActiveTaskSnapshot, saveActiveTaskSnapshot } from '../store/sessions.js';
|
|
4
4
|
import { assertTrigger, bindCaller, callerInHoldout, checkedWorkingState, withCallerDb } from './caller-session.js';
|
|
5
5
|
import { mergeWorkingState } from './working-state.js';
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { type SessionTurn } from './
|
|
2
|
-
import { type MemoryEntry } from './memory.js';
|
|
3
|
-
export declare const SESSION_DIGEST_TAG = "session-digest";
|
|
1
|
+
import { type SessionTurn } from './transcript.js';
|
|
4
2
|
/** Five-word runs are stock phrases; six in a row is a copied clause. */
|
|
5
3
|
export declare const ECHO_WINDOW = 6;
|
|
6
4
|
/** Five sentences of about 150 chars leave room for the Changed line inside the total cap. */
|
|
@@ -54,8 +52,6 @@ export interface DigestDraft {
|
|
|
54
52
|
}
|
|
55
53
|
/** The digest text, or null when nothing survives the filters. Sentences print in reply order. */
|
|
56
54
|
export declare function buildSessionDigest(sources: DigestSources): DigestDraft | null;
|
|
57
|
-
/** Facts extracted from a digest and DAG summaries over one inherit its tag, but they are not the digest itself. */
|
|
58
|
-
export declare function isSessionDigestRow(entry: Pick<MemoryEntry, 'source' | 'tags' | 'extracted_from'>): boolean;
|
|
59
55
|
/** Same session, same row: a second worker for one session updates the digest instead of adding one. */
|
|
60
56
|
export declare function sessionDigestId(tenantId: string, key: string): string;
|
|
61
57
|
export interface SessionDigestOptions {
|