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
|
@@ -8,30 +8,37 @@ import { resolveJsonHookPaths } from '../hooks/json-hooks.js';
|
|
|
8
8
|
import { isInitialized } from '../store/open.js';
|
|
9
9
|
import { loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, closeTaskSnapshotsForSession, listSessionEvents, } from '../store/sessions.js';
|
|
10
10
|
import { writeSessionEndHandoff } from '../store/handoffs.js';
|
|
11
|
-
import { readSessionScan, recordSessionDigest } from '../session-digest.js';
|
|
12
|
-
import { openHippoDb, closeHippoDb } from '../db.js';
|
|
13
|
-
import { captureToolFailure } from '../capture-error.js';
|
|
14
|
-
import {
|
|
11
|
+
import { readSessionScan, recordSessionDigest } from '../capture/session-digest.js';
|
|
12
|
+
import { openHippoDb, closeHippoDb } from '../db/index.js';
|
|
13
|
+
import { captureToolFailure } from '../capture/capture-error.js';
|
|
14
|
+
import { readApiCalls, recordRereads, } from '../store/token-ledger.js';
|
|
15
|
+
import { estimateTokens } from '../util/token-text.js';
|
|
15
16
|
import { currentMachine, importSessionFolder } from '../agent-memories/sync.js';
|
|
16
17
|
import { summaryLine } from '../agent-memories/report.js';
|
|
17
|
-
import { resolveProjectIdentity } from '../project-identity.js';
|
|
18
|
-
import { getGlobalRoot } from '../shared.js';
|
|
18
|
+
import { resolveProjectIdentity } from '../core/project-identity.js';
|
|
19
|
+
import { getGlobalRoot } from '../sharing/shared.js';
|
|
19
20
|
import { cmdCapture } from '../capture/command.js';
|
|
20
21
|
import { cmdPreCompact, cmdPostCompact } from '../capture/compact.js';
|
|
21
22
|
import { transcriptWorkingState } from '../capture/working-state.js';
|
|
22
|
-
import { collectHandoffEvidence } from '../handoff-evidence.js';
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
23
|
+
import { collectHandoffEvidence } from '../capture/handoff-evidence.js';
|
|
24
|
+
import { copilotTranscriptFor, SESSION_ID_RE } from '../capture/copilot-transcript.js';
|
|
25
|
+
import { loadTurnPosition, runSessionWorker, saveTurnPosition, turnsAfter } from '../capture/session-worker.js';
|
|
26
|
+
import { isStringValue, readSessionEnd, readVscodeStop } from '../core/capture-contract.js';
|
|
27
|
+
import { loadConfig } from '../core/config.js';
|
|
28
|
+
import { autoSleepDue } from '../api/auto-sleep.js';
|
|
29
|
+
import { truncateCodePointSafe } from '../util/transcript-tail.js';
|
|
30
|
+
import { COMPACTION_DB_WAIT_MS } from '../capture/compaction-record.js';
|
|
31
|
+
import { COMPACT_RESUME_EVENT_CONTENT_CAP, COMPACT_RESUME_MAX_AGE_MS, compactResumeText } from '../api/context-render.js';
|
|
32
|
+
import { normaliseHookPayload, readHookStdin, readStdinBounded } from './stdin.js';
|
|
33
|
+
import { resolveTenantId } from '../store/tenant.js';
|
|
34
|
+
import { errorMessage, log } from '../util/log.js';
|
|
35
|
+
import { bookLedgerTurn } from '../api/ledger-db.js';
|
|
36
|
+
import { flushDeliveryRecorder } from '../api/prompt-hook.js';
|
|
32
37
|
import { printError } from './output.js';
|
|
33
38
|
import { cmdLastSleep } from './last-sleep.js';
|
|
34
|
-
import {
|
|
39
|
+
import { readCompactResumePayload } from './compact-resume-payload.js';
|
|
40
|
+
import { boolFlag, flagIsTrue, stringFlag } from './flag-values.js';
|
|
41
|
+
import { logSessionEndImport, appendSessionEndCloseLog, resetHookInjection, hookStoreRoot, hookRuntime, payloadCwdRoot, runHookWithStores, inPilotHoldout, startDeliveryRecorder } from './hook-runtime.js';
|
|
35
42
|
/**
|
|
36
43
|
* SessionStart(compact) injector. Prints the active task snapshot + recent
|
|
37
44
|
* session trail so working state that would otherwise be lost to
|
|
@@ -45,61 +52,35 @@ import { logSessionEndImport, appendSessionEndCloseLog, resetHookInjection, hook
|
|
|
45
52
|
* hook must not pollute session startup.
|
|
46
53
|
*/
|
|
47
54
|
function cmdCompactResume(hippoRoot, stdinText, stdinTimedOut) {
|
|
55
|
+
let rec = null;
|
|
48
56
|
try {
|
|
49
57
|
// Gate on the non-exiting isInitialized check first: the store reads below call initStore, which would
|
|
50
58
|
// silently create a store in a project that never ran `hippo init`, and this hook fires globally.
|
|
51
59
|
if (!isInitialized(hippoRoot)) {
|
|
52
60
|
process.exit(0);
|
|
53
61
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const nonEmptyStdin = !!stdinText && stdinText.trim() !== '';
|
|
60
|
-
// Without a payload session_id the cross-restore guard below can
|
|
61
|
-
// never fire, so a timed-out empty read must not reach the print path.
|
|
62
|
-
let suppressOutput = stdinTimedOut && !nonEmptyStdin;
|
|
63
|
-
let payloadSessionId = null;
|
|
64
|
-
if (nonEmptyStdin) {
|
|
65
|
-
let payload = null;
|
|
66
|
-
try {
|
|
67
|
-
payload = JSON.parse(stdinText.trim());
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
// Malformed JSON is handled as a null payload by the fail-closed check below.
|
|
71
|
-
payload = null;
|
|
72
|
-
}
|
|
73
|
-
if (!payload || typeof payload !== 'object') {
|
|
74
|
-
// Fail closed on malformed non-empty stdin; only a TTY/no-stdin manual run, which never reaches here, prints.
|
|
75
|
-
suppressOutput = true;
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
// Fail closed on structurally incomplete payloads too ({}, [], source missing/non-string): real
|
|
79
|
-
// SessionStart payloads always carry source, so a parsed one must say 'compact' to print.
|
|
80
|
-
// A sub-agent's payload carries its parent's session id, so the mismatch guard would pass and restore the parent's snapshot into it.
|
|
81
|
-
if (payload.source !== 'compact' || isSubagentPayload(stdinText)) {
|
|
82
|
-
suppressOutput = true;
|
|
83
|
-
}
|
|
84
|
-
if (typeof payload.session_id === 'string') {
|
|
85
|
-
payloadSessionId = payload.session_id;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
62
|
+
const payloadState = readCompactResumePayload(stdinText, stdinTimedOut);
|
|
63
|
+
let suppressOutput = payloadState.suppressOutput;
|
|
64
|
+
const payloadSessionId = payloadState.payloadSessionId;
|
|
65
|
+
if (payloadState.boundary)
|
|
66
|
+
rec = startDeliveryRecorder(hippoRoot, stdinText, 'claude-code', 'compact-resume');
|
|
89
67
|
// A compaction follows a prompt or SessionStart that booked the arm, so this only reads it.
|
|
90
68
|
if (!suppressOutput && payloadSessionId !== null && inPilotHoldout(hippoRoot, resolveTenantId({}), payloadSessionId, false)) {
|
|
91
69
|
suppressOutput = true;
|
|
70
|
+
rec?.disabled();
|
|
92
71
|
}
|
|
93
72
|
if (!suppressOutput)
|
|
94
|
-
restoreCompactSnapshot(hippoRoot, payloadSessionId);
|
|
73
|
+
restoreCompactSnapshot(hippoRoot, payloadSessionId, rec);
|
|
95
74
|
}
|
|
96
75
|
catch (err) {
|
|
97
76
|
// Empty stdout on any store error, never a crashed SessionStart; the reason goes to stderr, which the model never sees.
|
|
98
|
-
log.warn(`hippo compact-resume: skipped: ${
|
|
77
|
+
log.warn(`hippo compact-resume: skipped: ${errorMessage(err)}`);
|
|
99
78
|
}
|
|
79
|
+
// A no-op when the token ledger's handle already wrote the row; exit would drop it otherwise.
|
|
80
|
+
flushDeliveryRecorder(rec);
|
|
100
81
|
process.exit(0);
|
|
101
82
|
}
|
|
102
|
-
function restoreCompactSnapshot(hippoRoot, payloadSessionId) {
|
|
83
|
+
function restoreCompactSnapshot(hippoRoot, payloadSessionId, rec) {
|
|
103
84
|
const tenantId = resolveTenantId({});
|
|
104
85
|
const snapshot = loadFreshActiveTaskSnapshot(hippoRoot, tenantId, { maxAgeMs: COMPACT_RESUME_MAX_AGE_MS });
|
|
105
86
|
// Concurrent sessions must not cross-restore. Only suppress when BOTH ids are present and differ;
|
|
@@ -121,14 +102,18 @@ function restoreCompactSnapshot(hippoRoot, payloadSessionId) {
|
|
|
121
102
|
}
|
|
122
103
|
}
|
|
123
104
|
catch (err) {
|
|
124
|
-
log.warn(`hippo compact-resume: trail skipped: ${
|
|
105
|
+
log.warn(`hippo compact-resume: trail skipped: ${errorMessage(err)}`);
|
|
125
106
|
}
|
|
126
107
|
// Printed in one write so the ledger books exactly the text the model is handed.
|
|
127
108
|
const text = compactResumeText(snapshot, events);
|
|
128
109
|
console.log(text);
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
110
|
+
rec?.delivered({ state: 'sent', emittedText: `${text}\n` });
|
|
111
|
+
bookLedgerTurn(hippoRoot, {
|
|
112
|
+
uses: [{
|
|
113
|
+
tenantId, sessionId: payloadSessionId, surface: 'compact_resume', event: 'inject', items: 1, tokens: estimateTokens(text),
|
|
114
|
+
}],
|
|
115
|
+
delivery: (write) => flushDeliveryRecorder(rec, write),
|
|
116
|
+
});
|
|
132
117
|
}
|
|
133
118
|
/**
|
|
134
119
|
* SessionEnd entry point. Claude Code / OpenCode fire this on /exit while
|
|
@@ -143,47 +128,31 @@ function restoreCompactSnapshot(hippoRoot, payloadSessionId) {
|
|
|
143
128
|
*/
|
|
144
129
|
export async function cmdSessionEnd(hippoRoot, flags) {
|
|
145
130
|
const runtime = hookRuntime(flags);
|
|
131
|
+
const turn = flagIsTrue(flags, 'turn');
|
|
146
132
|
// Copilot's hook command carries no path, since one quoted into it would need escaping for each shell; the log goes where the hook table used to point.
|
|
147
|
-
const logFile =
|
|
133
|
+
const logFile = stringFlag(flags, 'log-file') ?? (runtime === 'copilot' ? resolveJsonHookPaths('copilot').logFile : null);
|
|
148
134
|
// Bounded read: extracts transcript_path + session_id for the detached worker's argv.
|
|
149
|
-
|
|
150
|
-
|
|
135
|
+
const raw = await readStdinBounded();
|
|
136
|
+
// Read before normalising: the Copilot CLI's agentStop shares this hook line, and camelCase keys would pass as VS Code's.
|
|
137
|
+
const stop = turn ? vscodeStopInput(raw) : null;
|
|
138
|
+
if (turn && !stop)
|
|
139
|
+
return;
|
|
140
|
+
const stdinText = normaliseHookPayload(raw.text);
|
|
151
141
|
// Before the spawn, since the worker finds its store from the folder it inherits.
|
|
152
142
|
const root = payloadCwdRoot(hippoRoot, stdinText, runtime);
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
const payload = JSON.parse(stdinText);
|
|
156
|
-
if (typeof payload.session_id === 'string') {
|
|
157
|
-
sessionId = payload.session_id;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
// No stdin, not JSON, or read failure: the snapshot close below will no-op.
|
|
163
|
-
}
|
|
143
|
+
const input = stop ?? sessionEndInput(stdinText, raw.timedOut, runtime);
|
|
144
|
+
const sessionId = input?.sessionId ?? null;
|
|
164
145
|
// Resolved here because only this process saw the payload; the worker captures just the path it is handed.
|
|
165
146
|
// Always a hook, so never scan: an empty stdin here is not a manual run. The Copilot CLI's sessionEnd names no transcript, so its log is found by id.
|
|
166
|
-
const
|
|
147
|
+
const named = input?.transcriptPath ?? null;
|
|
148
|
+
const transcriptPath = (named !== null && fs.existsSync(named) ? named : null)
|
|
167
149
|
?? (runtime === 'copilot' && sessionId ? copilotTranscriptFor(sessionId) : null);
|
|
168
|
-
const workerArgs = [process.argv[1], '__session-end-worker'];
|
|
169
|
-
if (logFile)
|
|
170
|
-
workerArgs.push('--log-file', logFile);
|
|
171
|
-
if (transcriptPath)
|
|
172
|
-
workerArgs.push('--transcript', transcriptPath);
|
|
173
|
-
if (sessionId)
|
|
174
|
-
workerArgs.push('--session-id', sessionId);
|
|
175
150
|
try {
|
|
176
|
-
|
|
177
|
-
detached: true,
|
|
178
|
-
stdio: 'ignore',
|
|
179
|
-
windowsHide: true,
|
|
180
|
-
});
|
|
181
|
-
// An async spawn failure arrives as an 'error' event, which with no listener is an uncaught exception.
|
|
182
|
-
child.on('error', (err) => log.warn(`hippo session-end: the worker did not start: ${errorMessage(err)}`));
|
|
183
|
-
child.unref();
|
|
151
|
+
spawnSessionEndWorker(sessionEndWorkerArgs(logFile, transcriptPath, sessionId, turn));
|
|
184
152
|
}
|
|
185
|
-
catch {
|
|
186
|
-
|
|
153
|
+
catch (err) {
|
|
154
|
+
log.debug(`session-end: the worker did not spawn, running inline: ${errorMessage(err)}`);
|
|
155
|
+
// Inline is the last resort, handed what the child's argv would have carried.
|
|
187
156
|
if (logFile)
|
|
188
157
|
flags['log-file'] = logFile;
|
|
189
158
|
if (transcriptPath)
|
|
@@ -194,12 +163,51 @@ export async function cmdSessionEnd(hippoRoot, flags) {
|
|
|
194
163
|
return;
|
|
195
164
|
}
|
|
196
165
|
}
|
|
166
|
+
/** What the session-end payload named; null for one hippo refuses or one that never arrived, and the worker then runs with neither value. */
|
|
167
|
+
function sessionEndInput(stdinText, timedOut, runtime) {
|
|
168
|
+
const receipt = readSessionEnd(stdinText, timedOut, runtime);
|
|
169
|
+
if (receipt.status === 'received')
|
|
170
|
+
return receipt.input;
|
|
171
|
+
log.debug(`session-end: ${receipt.reason}`);
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
function sessionEndWorkerArgs(logFile, transcriptPath, sessionId, turn) {
|
|
175
|
+
const workerArgs = [process.argv[1], '__session-end-worker'];
|
|
176
|
+
if (logFile)
|
|
177
|
+
workerArgs.push('--log-file', logFile);
|
|
178
|
+
if (transcriptPath)
|
|
179
|
+
workerArgs.push('--transcript', transcriptPath);
|
|
180
|
+
if (sessionId)
|
|
181
|
+
workerArgs.push('--session-id', sessionId);
|
|
182
|
+
if (turn)
|
|
183
|
+
workerArgs.push('--turn');
|
|
184
|
+
return workerArgs;
|
|
185
|
+
}
|
|
186
|
+
function spawnSessionEndWorker(workerArgs) {
|
|
187
|
+
const child = spawn(process.execPath, workerArgs, {
|
|
188
|
+
detached: true,
|
|
189
|
+
stdio: 'ignore',
|
|
190
|
+
windowsHide: true,
|
|
191
|
+
});
|
|
192
|
+
// An async spawn failure arrives as an 'error' event, which with no listener is an uncaught exception.
|
|
193
|
+
child.on('error', (err) => log.warn(`hippo session-end: the worker did not start: ${errorMessage(err)}`));
|
|
194
|
+
child.unref();
|
|
195
|
+
}
|
|
196
|
+
/** The input of a VS Code Stop payload with a session id that can name the lock file; null makes turn mode a silent no-op. */
|
|
197
|
+
function vscodeStopInput(raw) {
|
|
198
|
+
const receipt = readVscodeStop(raw.text, raw.timedOut);
|
|
199
|
+
return receipt.status === 'received' && receipt.input.sessionId !== null && SESSION_ID_RE.test(receipt.input.sessionId) ? receipt.input : null;
|
|
200
|
+
}
|
|
197
201
|
export async function cmdSessionEndWorker(hippoRoot, flags) {
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
202
|
+
const sessionId = flags['session-id'];
|
|
203
|
+
await runSessionWorker(isStringValue(sessionId) ? sessionId : null, flagIsTrue(flags, 'turn') ? 'turn' : 'full', (mode) => sessionEndWork(hippoRoot, flags, mode));
|
|
204
|
+
}
|
|
205
|
+
async function sessionEndWork(hippoRoot, flags, mode) {
|
|
206
|
+
const transcriptPath = stringFlag(flags, 'transcript');
|
|
207
|
+
const closeLogFile = stringFlag(flags, 'log-file') ?? null;
|
|
208
|
+
const closeSessionId = stringFlag(flags, 'session-id') ?? null;
|
|
201
209
|
const rereadLog = await bookSessionRereads(hippoRoot, transcriptPath, closeSessionId)
|
|
202
|
-
.catch((err) => [`re-read count failed: ${
|
|
210
|
+
.catch((err) => [`re-read count failed: ${errorMessage(err)}`]);
|
|
203
211
|
// Sleep starts the log file afresh, so the lines go in after it; on exit too, in case sleep exits the process.
|
|
204
212
|
const flushRereadLog = () => { for (const line of rereadLog.splice(0))
|
|
205
213
|
appendSessionEndCloseLog(closeLogFile, line); };
|
|
@@ -211,11 +219,18 @@ export async function cmdSessionEndWorker(hippoRoot, flags) {
|
|
|
211
219
|
flushRereadLog();
|
|
212
220
|
return;
|
|
213
221
|
}
|
|
214
|
-
|
|
222
|
+
if (mode === 'turn' && closeSessionId)
|
|
223
|
+
await sleepIfDue(hippoRoot, flags, closeLogFile, transcriptPath, closeSessionId);
|
|
224
|
+
else
|
|
225
|
+
await sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath);
|
|
215
226
|
flushRereadLog();
|
|
216
227
|
const digestLog = (message) => appendSessionEndCloseLog(closeLogFile, message);
|
|
217
228
|
const scan = transcriptPath ? readSessionScan(transcriptPath, digestLog) : null;
|
|
218
|
-
captureEndedSession(hippoRoot, store, flags, transcriptPath,
|
|
229
|
+
const capture = (turns) => captureEndedSession(hippoRoot, store, flags, transcriptPath, turns);
|
|
230
|
+
if (mode === 'turn')
|
|
231
|
+
captureNewTurns(transcriptPath, closeSessionId, scan, capture, digestLog);
|
|
232
|
+
else
|
|
233
|
+
capture(scan?.turns);
|
|
219
234
|
recordSessionDigest(hippoRoot, scan, {
|
|
220
235
|
key: closeSessionId || path.basename(transcriptPath ?? '', '.jsonl'),
|
|
221
236
|
tenantId: resolveTenantId({}),
|
|
@@ -225,7 +240,15 @@ export async function cmdSessionEndWorker(hippoRoot, flags) {
|
|
|
225
240
|
// session-end may never fire (crash, kill -9) the freshness bound in loadFreshActiveTaskSnapshot is the backstop.
|
|
226
241
|
// The handoff is written first, while the snapshot writeSessionEndHandoff reads is still active.
|
|
227
242
|
if (closeSessionId)
|
|
228
|
-
writeEndHandoff(store, closeSessionId, transcriptPath, closeLogFile);
|
|
243
|
+
writeEndHandoff(store, closeSessionId, transcriptPath, closeLogFile, mode === 'turn');
|
|
244
|
+
if (mode === 'turn') {
|
|
245
|
+
// The chat goes on after a reply, so its snapshot stays for the next compaction to restore.
|
|
246
|
+
appendSessionEndCloseLog(closeLogFile, 'skip snapshot close: turn mode');
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
closeEndedSessionSnapshot(store, closeSessionId, closeLogFile);
|
|
250
|
+
}
|
|
251
|
+
function closeEndedSessionSnapshot(store, closeSessionId, closeLogFile) {
|
|
229
252
|
try {
|
|
230
253
|
if (closeSessionId) {
|
|
231
254
|
const closed = closeTaskSnapshotsForSession(store, resolveTenantId({}), closeSessionId);
|
|
@@ -236,7 +259,7 @@ export async function cmdSessionEndWorker(hippoRoot, flags) {
|
|
|
236
259
|
}
|
|
237
260
|
}
|
|
238
261
|
catch (err) {
|
|
239
|
-
appendSessionEndCloseLog(closeLogFile, `snapshot close failed: ${err
|
|
262
|
+
appendSessionEndCloseLog(closeLogFile, `snapshot close failed: ${errorMessage(err)}`);
|
|
240
263
|
}
|
|
241
264
|
}
|
|
242
265
|
async function sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath) {
|
|
@@ -245,9 +268,9 @@ async function sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath)
|
|
|
245
268
|
try {
|
|
246
269
|
await (await import('./sleep.js')).cmdSleep(hippoRoot, flags);
|
|
247
270
|
}
|
|
248
|
-
catch {
|
|
249
|
-
//
|
|
250
|
-
|
|
271
|
+
catch (err) {
|
|
272
|
+
// cmdSleep writes its failure line only when it has a log file, and capture runs regardless.
|
|
273
|
+
log.debug(`session-end: sleep failed: ${errorMessage(err)}`);
|
|
251
274
|
}
|
|
252
275
|
}
|
|
253
276
|
else {
|
|
@@ -255,32 +278,67 @@ async function sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath)
|
|
|
255
278
|
logSessionEndImport(closeLogFile, transcriptPath);
|
|
256
279
|
}
|
|
257
280
|
}
|
|
258
|
-
|
|
281
|
+
/** A close after every reply sleeps only at the MCP server's auto-sleep threshold; each line starts the log afresh, as a sleep does. */
|
|
282
|
+
async function sleepIfDue(hippoRoot, flags, closeLogFile, transcriptPath, sessionId) {
|
|
283
|
+
if (!isInitialized(hippoRoot))
|
|
284
|
+
return sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath);
|
|
285
|
+
const prefix = `turn close, session ${sessionId}`;
|
|
286
|
+
try {
|
|
287
|
+
const { enabled, count, threshold, due } = autoSleepDue(hippoRoot, resolveTenantId({}), loadConfig(hippoRoot).autoSleep);
|
|
288
|
+
if (!due) {
|
|
289
|
+
const why = enabled ? `${count} new memories, threshold ${threshold}` : 'auto-sleep is off';
|
|
290
|
+
appendSessionEndCloseLog(closeLogFile, `${prefix}: skip sleep, ${why}`, { startFresh: true });
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
await sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath);
|
|
294
|
+
appendSessionEndCloseLog(closeLogFile, `${prefix}: ran sleep at ${count} new memories (threshold ${threshold})`);
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
appendSessionEndCloseLog(closeLogFile, `${prefix}: sleep check failed: ${errorMessage(err)}`, { startFresh: true });
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/** Captures only the turns after this session's cursor, then moves the cursor, so each reply is extracted once. */
|
|
301
|
+
function captureNewTurns(transcriptPath, sessionId, scan, capture, log) {
|
|
302
|
+
if (!transcriptPath || !sessionId || !scan) {
|
|
303
|
+
log('skip capture: no readable transcript for this session');
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const fresh = turnsAfter(scan.turns, loadTurnPosition(sessionId, transcriptPath));
|
|
307
|
+
if (fresh.length === 0) {
|
|
308
|
+
log('skip capture: no new turns since the last reply');
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (capture(fresh))
|
|
312
|
+
saveTurnPosition(sessionId, transcriptPath, scan.turns, log);
|
|
313
|
+
}
|
|
314
|
+
/** True when capture ran to the end, so a turn close may move its cursor past these turns. */
|
|
315
|
+
function captureEndedSession(hippoRoot, store, flags, transcriptPath, turns) {
|
|
259
316
|
try {
|
|
260
|
-
const logFile =
|
|
317
|
+
const logFile = stringFlag(flags, 'log-file');
|
|
261
318
|
// With no stdin of its own, capture would read this as a manual run and scan every project.
|
|
262
319
|
if (!transcriptPath) {
|
|
263
320
|
appendSessionEndCloseLog(logFile ?? null, 'skip capture: no transcript for this session');
|
|
321
|
+
return false;
|
|
264
322
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
}
|
|
323
|
+
cmdCapture(store, {
|
|
324
|
+
source: 'last-session',
|
|
325
|
+
transcriptPath,
|
|
326
|
+
logFile,
|
|
327
|
+
dryRun: false,
|
|
328
|
+
global: false,
|
|
329
|
+
tenantId: resolveTenantId({}),
|
|
330
|
+
// In the global store, rows would otherwise read as user-global and show up in every project.
|
|
331
|
+
originProject: store === hippoRoot ? undefined : resolveProjectIdentity(process.cwd()),
|
|
332
|
+
sessionTurns: turns,
|
|
333
|
+
});
|
|
334
|
+
return true;
|
|
278
335
|
}
|
|
279
|
-
catch {
|
|
280
|
-
|
|
336
|
+
catch (err) {
|
|
337
|
+
log.debug(`session-end: capture failed: ${errorMessage(err)}`);
|
|
338
|
+
return false;
|
|
281
339
|
}
|
|
282
340
|
}
|
|
283
|
-
function writeEndHandoff(store, closeSessionId, transcriptPath, closeLogFile) {
|
|
341
|
+
function writeEndHandoff(store, closeSessionId, transcriptPath, closeLogFile, inPlace = false) {
|
|
284
342
|
try {
|
|
285
343
|
const tenantId = resolveTenantId({});
|
|
286
344
|
const ownSnapshot = loadActiveTaskSnapshot(store, tenantId)?.session_id === closeSessionId;
|
|
@@ -293,13 +351,13 @@ function writeEndHandoff(store, closeSessionId, transcriptPath, closeLogFile) {
|
|
|
293
351
|
}
|
|
294
352
|
else {
|
|
295
353
|
const evidence = collectHandoffEvidence(process.cwd(), 'unknown');
|
|
296
|
-
const handoff = writeSessionEndHandoff(store, tenantId, closeSessionId, evidence, derived);
|
|
354
|
+
const handoff = writeSessionEndHandoff(store, tenantId, closeSessionId, evidence, derived, undefined, { inPlace });
|
|
297
355
|
appendSessionEndCloseLog(closeLogFile, handoff ? `wrote handoff for session ${closeSessionId}` : `skip: kept the existing handoff for session ${closeSessionId}`);
|
|
298
356
|
}
|
|
299
357
|
}
|
|
300
358
|
catch (err) {
|
|
301
359
|
// SAFETY: catch clauses bind unknown, but Node/V8 always throws an Error here.
|
|
302
|
-
appendSessionEndCloseLog(closeLogFile, `handoff write failed: ${err
|
|
360
|
+
appendSessionEndCloseLog(closeLogFile, `handoff write failed: ${errorMessage(err)}`);
|
|
303
361
|
}
|
|
304
362
|
}
|
|
305
363
|
/** Books the ending session's re-reads in each store its ledger rows can land in (project and global); returns the log lines. */
|
|
@@ -311,7 +369,7 @@ async function bookSessionRereads(hippoRoot, transcriptPath, sessionId) {
|
|
|
311
369
|
read = await readApiCalls(transcriptPath);
|
|
312
370
|
}
|
|
313
371
|
catch (err) {
|
|
314
|
-
return [`skip re-read count: cannot read the transcript: ${
|
|
372
|
+
return [`skip re-read count: cannot read the transcript: ${errorMessage(err)}`];
|
|
315
373
|
}
|
|
316
374
|
const roots = new Set([hippoRoot, getGlobalRoot()].filter((root) => isInitialized(root)).map((root) => path.resolve(root)));
|
|
317
375
|
const lines = [];
|
|
@@ -327,7 +385,7 @@ async function bookSessionRereads(hippoRoot, transcriptPath, sessionId) {
|
|
|
327
385
|
}
|
|
328
386
|
}
|
|
329
387
|
catch (err) {
|
|
330
|
-
lines.push(`re-read count failed: ${
|
|
388
|
+
lines.push(`re-read count failed: ${errorMessage(err)}`);
|
|
331
389
|
}
|
|
332
390
|
}
|
|
333
391
|
const skipped = read.malformed > 0 ? `, ${read.malformed} unparsable transcript lines skipped` : '';
|
|
@@ -374,8 +432,8 @@ export function cmdCodexRun(hippoRoot, args) {
|
|
|
374
432
|
try {
|
|
375
433
|
cmdLastSleep(hippoRoot, { path: metadata.logFile }, 'terminal');
|
|
376
434
|
}
|
|
377
|
-
catch {
|
|
378
|
-
|
|
435
|
+
catch (err) {
|
|
436
|
+
log.debug(`codex run: the last sleep summary was not shown: ${errorMessage(err)}`);
|
|
379
437
|
}
|
|
380
438
|
const child = spawnRealCodex(metadata.realCodexPath, args, process.cwd());
|
|
381
439
|
child.on('error', (err) => {
|
|
@@ -383,85 +441,93 @@ export function cmdCodexRun(hippoRoot, args) {
|
|
|
383
441
|
process.exit(1);
|
|
384
442
|
});
|
|
385
443
|
child.on('exit', async (code, signal) => {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
444
|
+
await launchCodexSessionEndWorker(hippoRoot, historyPath, startOffsetBytes, startedAtMs, metadata.logFile);
|
|
445
|
+
exitLikeChild(code, signal);
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
async function launchCodexSessionEndWorker(hippoRoot, historyPath, startOffsetBytes, startedAtMs, logFile) {
|
|
449
|
+
const workerArgs = [
|
|
450
|
+
process.argv[1],
|
|
451
|
+
'__codex-session-end-worker',
|
|
452
|
+
'--codex-home',
|
|
453
|
+
path.dirname(historyPath),
|
|
454
|
+
'--history-path',
|
|
455
|
+
historyPath,
|
|
456
|
+
'--start-offset',
|
|
457
|
+
String(startOffsetBytes),
|
|
458
|
+
'--started-at',
|
|
459
|
+
String(startedAtMs),
|
|
460
|
+
'--log-file',
|
|
461
|
+
logFile,
|
|
462
|
+
];
|
|
463
|
+
try {
|
|
464
|
+
const worker = spawn(process.execPath, workerArgs, {
|
|
465
|
+
detached: true,
|
|
466
|
+
stdio: 'ignore',
|
|
467
|
+
windowsHide: true,
|
|
468
|
+
});
|
|
469
|
+
worker.unref();
|
|
470
|
+
}
|
|
471
|
+
catch (err) {
|
|
472
|
+
log.debug(`codex run: the session-end worker did not spawn, running inline: ${errorMessage(err)}`);
|
|
473
|
+
// Awaited so the sleep write can't be killed by the exit calls below.
|
|
400
474
|
try {
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
475
|
+
await cmdCodexSessionEndWorker(hippoRoot, {
|
|
476
|
+
'codex-home': path.dirname(historyPath),
|
|
477
|
+
'history-path': historyPath,
|
|
478
|
+
'start-offset': String(startOffsetBytes),
|
|
479
|
+
'started-at': String(startedAtMs),
|
|
480
|
+
'log-file': logFile,
|
|
405
481
|
});
|
|
406
|
-
worker.unref();
|
|
407
482
|
}
|
|
408
|
-
catch {
|
|
409
|
-
|
|
410
|
-
// Awaited so the sleep write can't be killed by the exit calls below.
|
|
411
|
-
try {
|
|
412
|
-
await cmdCodexSessionEndWorker(hippoRoot, {
|
|
413
|
-
'codex-home': path.dirname(historyPath),
|
|
414
|
-
'history-path': historyPath,
|
|
415
|
-
'start-offset': String(startOffsetBytes),
|
|
416
|
-
'started-at': String(startedAtMs),
|
|
417
|
-
'log-file': metadata.logFile,
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
catch {
|
|
421
|
-
// cmdCodexSessionEndWorker already fail-softs internally; this is belt-and-braces.
|
|
422
|
-
}
|
|
483
|
+
catch (inlineErr) {
|
|
484
|
+
log.debug(`codex run: the inline session-end failed: ${errorMessage(inlineErr)}`);
|
|
423
485
|
}
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
process.exit(1);
|
|
431
|
-
}
|
|
432
|
-
return;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
function exitLikeChild(code, signal) {
|
|
489
|
+
if (signal) {
|
|
490
|
+
try {
|
|
491
|
+
process.kill(process.pid, signal);
|
|
433
492
|
}
|
|
434
|
-
|
|
435
|
-
|
|
493
|
+
catch {
|
|
494
|
+
// Cannot re-raise the child's signal on this platform; a non-zero exit still reports the failure.
|
|
495
|
+
process.exit(1);
|
|
496
|
+
}
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
process.exit(code ?? 0);
|
|
436
500
|
}
|
|
437
501
|
export async function cmdCodexSessionEndWorker(hippoRoot, flags) {
|
|
438
|
-
const logFile =
|
|
502
|
+
const logFile = stringFlag(flags, 'log-file');
|
|
439
503
|
// Like the other hooks: project store, else global; a folder with neither must not get one made.
|
|
440
504
|
const store = hookStoreRoot(hippoRoot);
|
|
441
505
|
if (!isInitialized(store)) {
|
|
442
506
|
appendSessionEndCloseLog(logFile ?? null, 'skip: no hippo store for this folder or globally', { startFresh: true });
|
|
443
507
|
return;
|
|
444
508
|
}
|
|
509
|
+
await sleepCodexProjectStore(hippoRoot, logFile);
|
|
510
|
+
captureCodexTranscript(hippoRoot, store, flags, logFile);
|
|
511
|
+
}
|
|
512
|
+
async function sleepCodexProjectStore(hippoRoot, logFile) {
|
|
445
513
|
// Sleeping the global store from here would learn this folder's git commits into it; it has its own daily sleep.
|
|
446
514
|
if (isInitialized(hippoRoot)) {
|
|
447
515
|
try {
|
|
448
516
|
await (await import('./sleep.js')).cmdSleep(hippoRoot, logFile ? { 'log-file': logFile } : {});
|
|
449
517
|
}
|
|
450
|
-
catch {
|
|
451
|
-
|
|
518
|
+
catch (err) {
|
|
519
|
+
log.debug(`codex session-end: sleep failed: ${errorMessage(err)}`);
|
|
452
520
|
}
|
|
453
521
|
}
|
|
454
522
|
else {
|
|
455
523
|
appendSessionEndCloseLog(logFile ?? null, 'skip sleep: this folder has no store of its own', { startFresh: true });
|
|
456
524
|
logSessionEndImport(logFile ?? null, undefined);
|
|
457
525
|
}
|
|
526
|
+
}
|
|
527
|
+
function captureCodexTranscript(hippoRoot, store, flags, logFile) {
|
|
458
528
|
try {
|
|
459
|
-
const codexHome =
|
|
460
|
-
|
|
461
|
-
: resolveCodexWrapperPaths().codexHome;
|
|
462
|
-
const historyPath = typeof flags['history-path'] === 'string'
|
|
463
|
-
? flags['history-path']
|
|
464
|
-
: path.join(codexHome, 'history.jsonl');
|
|
529
|
+
const codexHome = stringFlag(flags, 'codex-home') ?? resolveCodexWrapperPaths().codexHome;
|
|
530
|
+
const historyPath = stringFlag(flags, 'history-path') ?? path.join(codexHome, 'history.jsonl');
|
|
465
531
|
const startOffsetBytes = parseInt(String(flags['start-offset'] ?? '0'), 10) || 0;
|
|
466
532
|
const startedAtMs = parseInt(String(flags['started-at'] ?? Date.now()), 10) || Date.now();
|
|
467
533
|
const transcriptPath = resolveCodexSessionTranscript({
|
|
@@ -490,14 +556,14 @@ export async function cmdCodexSessionEndWorker(hippoRoot, flags) {
|
|
|
490
556
|
try {
|
|
491
557
|
cmdCapture(store, captureOpts);
|
|
492
558
|
}
|
|
493
|
-
catch {
|
|
494
|
-
|
|
559
|
+
catch (err) {
|
|
560
|
+
log.debug(`codex session-end: capture failed: ${errorMessage(err)}`);
|
|
495
561
|
}
|
|
496
562
|
// The Codex wrapper passes no session id, so the rollout file names the session.
|
|
497
563
|
recordSessionDigest(hippoRoot, scan, { key: path.basename(transcriptPath, '.jsonl'), tenantId: resolveTenantId({}), log: digestLog });
|
|
498
564
|
}
|
|
499
|
-
catch {
|
|
500
|
-
|
|
565
|
+
catch (err) {
|
|
566
|
+
log.debug(`codex session-end: transcript scan or digest failed: ${errorMessage(err)}`);
|
|
501
567
|
}
|
|
502
568
|
}
|
|
503
569
|
export async function handlePreCompact({ hippoRoot, flags }) {
|
|
@@ -506,22 +572,29 @@ export async function handlePreCompact({ hippoRoot, flags }) {
|
|
|
506
572
|
const runtime = hookRuntime(flags);
|
|
507
573
|
const root = payloadCwdRoot(hippoRoot, stdinText, runtime);
|
|
508
574
|
await runHookWithStores(async () => {
|
|
575
|
+
// Started before any store wait, so two fires of one hook carry timestamps close enough to match as duplicates.
|
|
576
|
+
const rec = startDeliveryRecorder(hookStoreRoot(root), stdinText, runtime, 'pre-compact');
|
|
509
577
|
resetHookInjection(root, stdinText, null);
|
|
510
578
|
await cmdPreCompact(hookStoreRoot(root), {
|
|
511
579
|
stdinText,
|
|
512
580
|
stdinTimedOut,
|
|
513
|
-
logFile:
|
|
581
|
+
logFile: stringFlag(flags, 'log-file'),
|
|
514
582
|
runtime,
|
|
583
|
+
onBoundary: (printed) => {
|
|
584
|
+
rec?.delivered(printed === null ? { state: 'empty' } : { state: 'sent', emittedText: printed });
|
|
585
|
+
flushDeliveryRecorder(rec);
|
|
586
|
+
},
|
|
515
587
|
});
|
|
516
588
|
});
|
|
517
589
|
}
|
|
518
590
|
export async function handlePostCompact({ hippoRoot, flags }) {
|
|
519
591
|
// PostCompact hook: saves the compaction summary and its memories, then prints one plain line, because Claude Code shows this hook's stdout as-is. Always exits 0.
|
|
520
|
-
const { text } = await readHookStdin();
|
|
592
|
+
const { text, timedOut } = await readHookStdin();
|
|
521
593
|
const logFlag = flags['log-file'];
|
|
522
594
|
const store = hookStoreRoot(hippoRoot);
|
|
523
595
|
const line = await runHookWithStores(() => cmdPostCompact(store, {
|
|
524
596
|
stdinText: text,
|
|
597
|
+
stdinTimedOut: timedOut,
|
|
525
598
|
logFile: logFlag === true || logFlag === false || Array.isArray(logFlag) ? undefined : logFlag,
|
|
526
599
|
// Passed in, since capture.ts importing the sync would close an import cycle.
|
|
527
600
|
afterSave: (transcriptPath, cwd, log) => {
|
|
@@ -549,8 +622,9 @@ export async function handleCaptureError({ hippoRoot, flags }) {
|
|
|
549
622
|
await runHookWithStores(() => captureToolFailure(root, resolveTenantId({}), failure));
|
|
550
623
|
}
|
|
551
624
|
}
|
|
552
|
-
catch {
|
|
553
|
-
// A malformed payload or store error must never fail the agent's tool call.
|
|
625
|
+
catch (err) {
|
|
626
|
+
// A malformed payload or store error must never fail the agent's tool call, so it is reported and dropped.
|
|
627
|
+
log.warn(`failure capture skipped: ${errorMessage(err)}`);
|
|
554
628
|
}
|
|
555
629
|
}
|
|
556
630
|
export async function handleCompactResume({ hippoRoot }) {
|
|
@@ -594,9 +668,9 @@ export async function handleCapture({ hippoRoot, flags }) {
|
|
|
594
668
|
transcriptPath,
|
|
595
669
|
stdinText: bounded.text,
|
|
596
670
|
stdinTimedOut: bounded.timedOut,
|
|
597
|
-
logFile:
|
|
598
|
-
dryRun:
|
|
599
|
-
global:
|
|
671
|
+
logFile: stringFlag(flags, 'log-file'),
|
|
672
|
+
dryRun: boolFlag(flags, 'dry-run'),
|
|
673
|
+
global: boolFlag(flags, 'global'),
|
|
600
674
|
tenantId: resolveTenantId({}),
|
|
601
675
|
});
|
|
602
676
|
}
|