hippo-memory 1.70.0 → 1.72.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 +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +49 -40
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +3 -2
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +24 -44
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +4 -3
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +24 -53
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +16 -19
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +24 -60
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +11 -63
- package/dist/store/summaries.js +37 -148
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +35 -6
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- package/extensions/openclaw-plugin/index.ts +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
package/dist/capture/command.js
CHANGED
|
@@ -2,29 +2,20 @@ import * as fs from 'fs';
|
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { createMemory, Layer } from '../core/memory.js';
|
|
4
4
|
import { duplicateKey, longestWord, storedTextKeys } from '../util/same-text.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { writeEntryMirrors } from '../store/entry-writes.js';
|
|
5
|
+
import { writeCapturedItems } from '../store/capture-write.js';
|
|
6
|
+
import { embedMemory } from '../search/embed-memories.js';
|
|
8
7
|
import { EVERY_SCOPE, loadTextsHoldingWords } from '../store/candidates.js';
|
|
9
|
-
import {
|
|
10
|
-
import { gatedWrite } from '../trust/gated-write.js';
|
|
11
|
-
import { getGlobalRoot, initGlobal } from '../sharing/shared.js';
|
|
12
|
-
import { embedMemory } from '../store/embeddings/index.js';
|
|
8
|
+
import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
|
|
13
9
|
import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
|
|
14
|
-
import {
|
|
15
|
-
import { openHippoDb, closeHippoDb } from '../db/index.js';
|
|
10
|
+
import { withRejectionProbe } from '../store/rejection-probe.js';
|
|
16
11
|
import { loadConfig } from '../core/config.js';
|
|
17
|
-
import { classifyOriginProject, projectId } from '../core/project-identity.js';
|
|
18
|
-
import { isStringValue } from '../core/capture-contract.js';
|
|
12
|
+
import { classifyOriginProject, projectId, isInitialized } from '../core/project-identity.js';
|
|
19
13
|
import { errorMessage, log } from '../util/log.js';
|
|
14
|
+
import { teeStdStreams } from '../util/stream-tee.js';
|
|
20
15
|
import { extractFromTexts } from './extract.js';
|
|
21
16
|
import { collectSessionTurns, sessionTail, resolveLastSessionTranscript } from './transcript.js';
|
|
22
17
|
export function cmdCapture(hippoRoot, options) {
|
|
23
|
-
// Tee
|
|
24
|
-
// SessionEnd hook so output (otherwise swallowed by TUI teardown) surfaces
|
|
25
|
-
// on the next session start via `hippo last-sleep`. Runs second in the
|
|
26
|
-
// SessionEnd sequence after `hippo sleep`, so we APPEND rather than
|
|
27
|
-
// truncate — sleep already wrote its own header + body to this file.
|
|
18
|
+
// Tee to a log file for the SessionEnd hook; APPEND, because `hippo sleep` runs first in that sequence and already wrote its header and body.
|
|
28
19
|
const restoreStdio = options.logFile ? beginLogTee(options.logFile) : null;
|
|
29
20
|
try {
|
|
30
21
|
cmdCaptureCore(hippoRoot, options);
|
|
@@ -41,39 +32,11 @@ export function cmdCapture(hippoRoot, options) {
|
|
|
41
32
|
restoreStdio();
|
|
42
33
|
}
|
|
43
34
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Append-mode tee: writes a banner line then mirrors every stdout/stderr
|
|
46
|
-
* chunk to `logFile` until the returned restore function is called.
|
|
47
|
-
* Failures to write the log are non-fatal; the real streams still get
|
|
48
|
-
* the data.
|
|
49
|
-
*/
|
|
35
|
+
/** Append-mode tee: mirror every stdout/stderr chunk to `logFile` until the returned restore function is called. */
|
|
50
36
|
function beginLogTee(logFile) {
|
|
51
37
|
if (!writeLogBanner(logFile))
|
|
52
38
|
return () => { };
|
|
53
|
-
|
|
54
|
-
const origStderrWrite = process.stderr.write.bind(process.stderr);
|
|
55
|
-
const tee = (chunk) => appendToLog(logFile, chunk);
|
|
56
|
-
const wrapWrite = (origWrite) => {
|
|
57
|
-
const wrapped = (...args) => {
|
|
58
|
-
tee(args[0]);
|
|
59
|
-
// SAFETY: forwarding the exact arguments Node's real overloaded
|
|
60
|
-
// `write` received is safe regardless of which overload the call
|
|
61
|
-
// site used — Node dispatches on the actual argument shapes at
|
|
62
|
-
// runtime, and `StreamWriteArgs` is the union of both overloads'
|
|
63
|
-
// parameter lists.
|
|
64
|
-
return origWrite(...args);
|
|
65
|
-
};
|
|
66
|
-
// SAFETY: `wrapped` matches both real `write` overload shapes it's
|
|
67
|
-
// assigned to; TS can't verify a single implementation covers an
|
|
68
|
-
// overloaded type, but this one forwards to the real stream method.
|
|
69
|
-
return wrapped;
|
|
70
|
-
};
|
|
71
|
-
process.stdout.write = wrapWrite(origStdoutWrite);
|
|
72
|
-
process.stderr.write = wrapWrite(origStderrWrite);
|
|
73
|
-
return () => {
|
|
74
|
-
process.stdout.write = origStdoutWrite;
|
|
75
|
-
process.stderr.write = origStderrWrite;
|
|
76
|
-
};
|
|
39
|
+
return teeStdStreams(logFile);
|
|
77
40
|
}
|
|
78
41
|
/** Creates the log's folder and appends the banner line; false, after a warning, when the log cannot be written. */
|
|
79
42
|
function writeLogBanner(logFile) {
|
|
@@ -87,15 +50,6 @@ function writeLogBanner(logFile) {
|
|
|
87
50
|
}
|
|
88
51
|
return true;
|
|
89
52
|
}
|
|
90
|
-
function appendToLog(logFile, chunk) {
|
|
91
|
-
try {
|
|
92
|
-
const buf = isStringValue(chunk) ? chunk : Buffer.from(chunk).toString('utf8');
|
|
93
|
-
fs.appendFileSync(logFile, buf, 'utf8');
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
// log failures are non-fatal
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
53
|
// Console lines here are the `hippo capture` command's printed result, so they stay off the logger.
|
|
100
54
|
function cmdCaptureCore(hippoRoot, options) {
|
|
101
55
|
const useGlobal = options.global;
|
|
@@ -109,15 +63,16 @@ function cmdCaptureCore(hippoRoot, options) {
|
|
|
109
63
|
process.exit(1);
|
|
110
64
|
}
|
|
111
65
|
}
|
|
112
|
-
const
|
|
113
|
-
if (
|
|
66
|
+
const read = readCaptureTexts(options);
|
|
67
|
+
if (read === null)
|
|
114
68
|
return;
|
|
69
|
+
const { texts, userTexts } = read;
|
|
115
70
|
if (texts.every((text) => text.trim().length === 0)) {
|
|
116
71
|
console.log('No text to capture from.');
|
|
117
72
|
return;
|
|
118
73
|
}
|
|
119
74
|
// Scrub once here, as the snapshot fields are: every source can carry a pasted token (AGENTS.md: no secrets in memories).
|
|
120
|
-
const extracted = extractFromTexts(texts.map((text) => maskEmails(redactSecretsStrict(text))));
|
|
75
|
+
const extracted = extractFromTexts(texts.map((text) => maskEmails(redactSecretsStrict(text))), userTexts);
|
|
121
76
|
if (extracted.length === 0) {
|
|
122
77
|
console.log('No actionable items found in the input.');
|
|
123
78
|
return;
|
|
@@ -131,8 +86,7 @@ function cmdCaptureCore(hippoRoot, options) {
|
|
|
131
86
|
};
|
|
132
87
|
printCaptureTally(options, captureExtractedItems(targetRoot, writeOpts, extracted, keys));
|
|
133
88
|
}
|
|
134
|
-
// Dedup only against rows this capture's reader sees: another tenant's rows,
|
|
135
|
-
// project's, are hidden from it, so they must not stop its own copy.
|
|
89
|
+
// Dedup only against rows this capture's reader sees: another tenant's or project's rows are hidden, so they must not stop its own copy.
|
|
136
90
|
// Only a row holding an item's longest word can hold that item, so the store returns those rows and no others.
|
|
137
91
|
function storedKeysInView(targetRoot, options, extracted) {
|
|
138
92
|
const stored = loadTextsHoldingWords(targetRoot, options.global ? undefined : options.tenantId, extracted.map((item) => longestWord(item.content)), undefined, EVERY_SCOPE);
|
|
@@ -148,12 +102,13 @@ function printCaptureTally(options, { captured, skipped, rejected }) {
|
|
|
148
102
|
(rejected > 0 ? `, ${rejected} rejected` : '') +
|
|
149
103
|
')');
|
|
150
104
|
}
|
|
151
|
-
/** The raw texts for the chosen source, one per session turn; null after printing why a last-session capture has nothing.
|
|
105
|
+
/** The raw texts for the chosen source, one per session turn, the person's turns first; null after printing why a last-session capture has nothing.
|
|
106
|
+
* Only a session says who spoke, so a piped or file capture counts no user texts. */
|
|
152
107
|
function readCaptureTexts(options) {
|
|
153
108
|
switch (options.source) {
|
|
154
109
|
case 'stdin': {
|
|
155
110
|
try {
|
|
156
|
-
return [fs.readFileSync(0, 'utf8')];
|
|
111
|
+
return { texts: [fs.readFileSync(0, 'utf8')], userTexts: 0 };
|
|
157
112
|
}
|
|
158
113
|
catch {
|
|
159
114
|
console.error('No input on stdin. Pipe text in or use --file <path>.');
|
|
@@ -169,7 +124,7 @@ function readCaptureTexts(options) {
|
|
|
169
124
|
console.error(`File not found: ${options.filePath}`);
|
|
170
125
|
process.exit(1);
|
|
171
126
|
}
|
|
172
|
-
return [fs.readFileSync(options.filePath, 'utf8')];
|
|
127
|
+
return { texts: [fs.readFileSync(options.filePath, 'utf8')], userTexts: 0 };
|
|
173
128
|
}
|
|
174
129
|
case 'last-session': {
|
|
175
130
|
let turns = options.sessionTurns;
|
|
@@ -186,85 +141,55 @@ function readCaptureTexts(options) {
|
|
|
186
141
|
console.log('Transcript had no user/assistant messages to summarise.');
|
|
187
142
|
return null;
|
|
188
143
|
}
|
|
189
|
-
return [...users, ...assistants];
|
|
144
|
+
return { texts: [...users, ...assistants], userTexts: users.length };
|
|
190
145
|
}
|
|
191
146
|
}
|
|
192
147
|
}
|
|
193
148
|
export function captureExtractedItems(targetRoot, options, extracted, keys) {
|
|
194
149
|
const tally = { captured: 0, skipped: 0, rejected: 0 };
|
|
195
150
|
const baseHalfLifeDays = loadConfig(targetRoot).defaultHalfLifeDays;
|
|
151
|
+
if (!options.dryRun) {
|
|
152
|
+
const outcomes = writeCapturedItems(targetRoot, extracted.map((item) => ({ content: item.content, makeEntry: () => captureEntry(item, options, baseHalfLifeDays) })), keys, { actor: options.actor, lean: options.lean, onCaptured: options.lean ? undefined : (entry) => void embedMemory(targetRoot, entry) });
|
|
153
|
+
for (const outcome of outcomes)
|
|
154
|
+
tally[outcome]++;
|
|
155
|
+
return tally;
|
|
156
|
+
}
|
|
196
157
|
// Dry run probes the same checkRejectionGuard the real write uses, on a read-only handle,
|
|
197
158
|
// so a tombstoned item previews as rejected rather than captured.
|
|
198
|
-
|
|
199
|
-
const writeDb = options.dryRun ? null : openStore(targetRoot);
|
|
200
|
-
try {
|
|
159
|
+
return withRejectionProbe(targetRoot, (wouldReject) => {
|
|
201
160
|
for (const item of extracted) {
|
|
202
161
|
if (keys.has(duplicateKey(item.content))) {
|
|
203
162
|
tally.skipped++;
|
|
204
|
-
|
|
205
|
-
console.log(` [skip] (${item.category}) ${item.content.slice(0, 80)}`);
|
|
206
|
-
}
|
|
163
|
+
console.log(` [skip] (${item.category}) ${item.content.slice(0, 80)}`);
|
|
207
164
|
continue;
|
|
208
165
|
}
|
|
209
166
|
const entry = captureEntry(item, options, baseHalfLifeDays);
|
|
210
|
-
|
|
167
|
+
if (wouldReject(entry.tenantId ?? 'default', entry.id, entry.content)) {
|
|
168
|
+
console.log(` [reject] (${item.category}) ${item.content.slice(0, 80)} - matches a rejected value`);
|
|
169
|
+
tally.rejected++;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
console.log(` [capture] (${item.category}) ${item.content}`);
|
|
173
|
+
tally.captured++;
|
|
211
174
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
if (dryRunDb)
|
|
215
|
-
closeHippoDb(dryRunDb);
|
|
216
|
-
if (writeDb)
|
|
217
|
-
closeHippoDb(writeDb);
|
|
218
|
-
}
|
|
219
|
-
return tally;
|
|
175
|
+
return tally;
|
|
176
|
+
});
|
|
220
177
|
}
|
|
221
178
|
function captureEntry(item, options, baseHalfLifeDays) {
|
|
222
179
|
// kind stays 'distilled': these are curated items, not raw transcript (see MEMORY_ENVELOPE.md).
|
|
223
180
|
// The write tenant must match the dedup read's, or scoped dedup passes and the row lands in 'default'.
|
|
181
|
+
// A rule the person stated is pinned, so it injects even when a later prompt shares none of its words.
|
|
182
|
+
// SHORTCUT: every stated rule pins; cap or age these pins if a store's pins outgrow the hook budget.
|
|
224
183
|
const created = createMemory(item.content, {
|
|
225
184
|
layer: Layer.Episodic,
|
|
226
185
|
tags: item.tags,
|
|
227
186
|
source: 'capture',
|
|
228
187
|
confidence: 'observed',
|
|
188
|
+
pinned: item.fromUser === true && item.category === 'rule',
|
|
229
189
|
tenantId: options.tenantId,
|
|
230
190
|
source_session_id: options.sessionId,
|
|
231
191
|
baseHalfLifeDays,
|
|
232
192
|
});
|
|
233
193
|
return options.originProject === undefined ? created : { ...created, origin_project: projectId(options.originProject) };
|
|
234
194
|
}
|
|
235
|
-
/** Previews or writes one non-duplicate item and names the tally it counts toward. */
|
|
236
|
-
function captureOne(ctx, item, entry) {
|
|
237
|
-
const { targetRoot, options, dryRunDb, writeDb, keys } = ctx;
|
|
238
|
-
if (options.dryRun) {
|
|
239
|
-
if (dryRunDb) {
|
|
240
|
-
try {
|
|
241
|
-
checkRejectionGuard(dryRunDb, entry.tenantId ?? 'default', entry.id, entry.content);
|
|
242
|
-
}
|
|
243
|
-
catch (err) {
|
|
244
|
-
if (err instanceof RejectedValueError) {
|
|
245
|
-
console.log(` [reject] (${item.category}) ${item.content.slice(0, 80)} - matches a rejected value`);
|
|
246
|
-
return 'rejected';
|
|
247
|
-
}
|
|
248
|
-
throw err;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
console.log(` [capture] (${item.category}) ${item.content}`);
|
|
252
|
-
}
|
|
253
|
-
else if (writeDb !== null) {
|
|
254
|
-
// One rejected item must not abort the rest of this capture's items.
|
|
255
|
-
const stamped = stampOriginProject(targetRoot, entry);
|
|
256
|
-
const outcome = gatedWrite(writeDb, targetRoot, stamped, { actor: options.actor });
|
|
257
|
-
if (outcome === 'skipped:rejected')
|
|
258
|
-
return 'rejected';
|
|
259
|
-
if (outcome !== 'written')
|
|
260
|
-
return 'skipped';
|
|
261
|
-
writeEntryMirrors(targetRoot, stamped);
|
|
262
|
-
if (!options.lean)
|
|
263
|
-
updateStatsOn(writeDb, targetRoot, { remembered: 1 });
|
|
264
|
-
keys.add(duplicateKey(item.content)); // within-batch dedup
|
|
265
|
-
if (!options.lean)
|
|
266
|
-
void embedMemory(targetRoot, entry);
|
|
267
|
-
}
|
|
268
|
-
return 'captured';
|
|
269
|
-
}
|
|
270
195
|
//# sourceMappingURL=command.js.map
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { type HookRuntime } from '../core/capture-contract.js';
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
* (transcript paths, session ids). Strip C0 control chars — newlines above
|
|
5
|
-
* all — so a crafted value can't inject fake `[hippo] ...` log lines.
|
|
6
|
-
* Exported for every `[hippo]`-prefixed log writer that interpolates
|
|
7
|
-
* payload-controlled values (cli.ts appendSessionEndCloseLog) — one shared
|
|
8
|
-
* guard, not per-file copies.
|
|
9
|
-
*/
|
|
2
|
+
/** Log-forgery guard: strip C0 control chars (newlines above all) from payload-controlled values so a crafted value cannot inject fake `[hippo]` log lines.
|
|
3
|
+
* Exported as the one shared guard for every `[hippo]`-prefixed log writer that interpolates payload values. */
|
|
10
4
|
export declare function sanitizeLogMessage(message: string): string;
|
|
11
5
|
export interface PreCompactOptions {
|
|
12
6
|
stdinText?: string;
|
|
@@ -16,13 +10,8 @@ export interface PreCompactOptions {
|
|
|
16
10
|
/** Called once when the hook accepts a compaction, with the text it printed or null when it printed none. */
|
|
17
11
|
onBoundary?: (printed: string | null) => void;
|
|
18
12
|
}
|
|
19
|
-
/**
|
|
20
|
-
*
|
|
21
|
-
* so this verb must exit 0 on every path — malformed stdin, missing
|
|
22
|
-
* transcript, and store errors all degrade to a logged no-op rather than a
|
|
23
|
-
* thrown error. Callers (src/cli.ts) must not wrap this in anything that
|
|
24
|
-
* could turn a caught-and-logged failure back into a non-zero exit.
|
|
25
|
-
*/
|
|
13
|
+
/** PreCompact hook entry point. Exit code 2 BLOCKS compaction, so every path (bad stdin, missing transcript, store error) must exit 0 as a logged no-op.
|
|
14
|
+
* Callers must not wrap this in anything that turns a caught-and-logged failure into a non-zero exit. */
|
|
26
15
|
export declare function cmdPreCompact(hippoRoot: string, options: PreCompactOptions): Promise<void>;
|
|
27
16
|
export interface PostCompactOptions {
|
|
28
17
|
stdinText?: string;
|
package/dist/capture/compact.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import { isInitialized } from '../
|
|
3
|
+
import { isInitialized } from '../core/project-identity.js';
|
|
4
4
|
import { saveActiveTaskSnapshot, loadActiveTaskSnapshot } from '../store/sessions.js';
|
|
5
|
-
import { PRE_COMPACT_INSTRUCTION, postCompactLine,
|
|
5
|
+
import { PRE_COMPACT_INSTRUCTION, postCompactLine, saveCompaction, replayCompactionsAt } from './compaction-record.js';
|
|
6
|
+
import { recordCompactionStart, recordSnapshotSaved } from '../store/compactions-record.js';
|
|
7
|
+
import { COMPACTION_DB_WAIT_MS } from '../core/compaction-timing.js';
|
|
6
8
|
import { resolveTenantId } from '../store/tenant.js';
|
|
7
9
|
import { defaultPreCompactLogPath, vscodeUserHooksFile } from '../hooks/shared.js';
|
|
8
10
|
import { readClaudeCodePostCompact, readClaudeCodePreCompact } from '../core/capture-contract.js';
|
|
@@ -10,19 +12,10 @@ import { errorMessage, log as logger } from '../util/log.js';
|
|
|
10
12
|
import { resolveLastSessionTranscript } from './transcript.js';
|
|
11
13
|
import { isVscodeTranscript } from './copilot-transcript.js';
|
|
12
14
|
import { mergeWorkingState, transcriptWorkingState } from './working-state.js';
|
|
13
|
-
// ---------------------------------------------------------------------------
|
|
14
|
-
// `hippo pre-compact` — PreCompact hook producer
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
15
|
// Diagnostic-only log; a long-lived install must not grow it unbounded.
|
|
17
16
|
const PRE_COMPACT_LOG_MAX_BYTES = 256 * 1024;
|
|
18
|
-
/**
|
|
19
|
-
*
|
|
20
|
-
* (transcript paths, session ids). Strip C0 control chars — newlines above
|
|
21
|
-
* all — so a crafted value can't inject fake `[hippo] ...` log lines.
|
|
22
|
-
* Exported for every `[hippo]`-prefixed log writer that interpolates
|
|
23
|
-
* payload-controlled values (cli.ts appendSessionEndCloseLog) — one shared
|
|
24
|
-
* guard, not per-file copies.
|
|
25
|
-
*/
|
|
17
|
+
/** Log-forgery guard: strip C0 control chars (newlines above all) from payload-controlled values so a crafted value cannot inject fake `[hippo]` log lines.
|
|
18
|
+
* Exported as the one shared guard for every `[hippo]`-prefixed log writer that interpolates payload values. */
|
|
26
19
|
export function sanitizeLogMessage(message) {
|
|
27
20
|
// eslint-disable-next-line no-control-regex
|
|
28
21
|
return message.replace(/[\x00-\x1f]/g, '');
|
|
@@ -30,11 +23,18 @@ export function sanitizeLogMessage(message) {
|
|
|
30
23
|
function appendPreCompactLog(logFile, message) {
|
|
31
24
|
try {
|
|
32
25
|
fs.mkdirSync(path.dirname(logFile), { recursive: true });
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
// One handle, so the cap acts on the file it measured; two hooks writing in the same instant can overwrite one diagnostic line, which this log accepts.
|
|
27
|
+
const fd = fs.openSync(logFile, fs.constants.O_RDWR | fs.constants.O_CREAT);
|
|
28
|
+
try {
|
|
29
|
+
const size = fs.fstatSync(fd).size;
|
|
30
|
+
const startFresh = size > PRE_COMPACT_LOG_MAX_BYTES; // a dumb cap, no rotation
|
|
31
|
+
if (startFresh)
|
|
32
|
+
fs.ftruncateSync(fd, 0);
|
|
33
|
+
fs.writeSync(fd, `[hippo] ${new Date().toISOString()} ${sanitizeLogMessage(message)}\n`, startFresh ? 0 : size, 'utf8');
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
fs.closeSync(fd);
|
|
36
37
|
}
|
|
37
|
-
fs.appendFileSync(logFile, `[hippo] ${new Date().toISOString()} ${sanitizeLogMessage(message)}\n`, 'utf8');
|
|
38
38
|
}
|
|
39
39
|
catch (err) {
|
|
40
40
|
// Diagnostic-only; a log write failure must never affect the exit-0 contract.
|
|
@@ -51,7 +51,8 @@ function isReadableFile(filePath) {
|
|
|
51
51
|
return false; // missing and unreadable both mean "no file" to the caller
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
-
/** PreCompact stdout is the summariser's instructions; sent before the snapshot work because a locked store can run the hook past its 30
|
|
54
|
+
/** PreCompact stdout is the summariser's instructions; sent before the snapshot work because a locked store can run the hook past its 30
|
|
55
|
+
* s limit, and via writeSync because process.exit drops buffered pipe output. */
|
|
55
56
|
function printPreCompactInstruction(logFile) {
|
|
56
57
|
const text = `${PRE_COMPACT_INSTRUCTION}\n`;
|
|
57
58
|
try {
|
|
@@ -71,12 +72,11 @@ function snapshotJustSaved(hippoRoot, sessionId) {
|
|
|
71
72
|
const active = loadActiveTaskSnapshot(hippoRoot, resolveTenantId({}));
|
|
72
73
|
return active?.session_id === sessionId && active.source === 'pre-compact' && Date.now() - Date.parse(active.updated_at) < TWIN_FIRE_MS;
|
|
73
74
|
}
|
|
74
|
-
/** Runs the PreCompact producer: records the compaction, asks the summariser for memories, saves a working-state snapshot. Never extracts
|
|
75
|
+
/** Runs the PreCompact producer: records the compaction, asks the summariser for memories, saves a working-state snapshot. Never extracts
|
|
76
|
+
* memories itself; SessionEnd capture owns that. */
|
|
75
77
|
function runPreCompact(hippoRoot, options, logFile) {
|
|
76
78
|
const { stdinText, stdinTimedOut = false, runtime = 'claude-code' } = options;
|
|
77
|
-
//
|
|
78
|
-
// ones that never ran `hippo init`, so gate before any store-opening call
|
|
79
|
-
// (saveActiveTaskSnapshot etc. call initStore, which would create one).
|
|
79
|
+
// PreCompact fires in every Claude Code project, including ones that never ran `hippo init`; gate before any call that would create a store.
|
|
80
80
|
if (!isInitialized(hippoRoot)) {
|
|
81
81
|
appendPreCompactLog(logFile, 'skip: store not initialized');
|
|
82
82
|
return;
|
|
@@ -107,7 +107,8 @@ function runPreCompact(hippoRoot, options, logFile) {
|
|
|
107
107
|
return;
|
|
108
108
|
saveDerivedSnapshot(hippoRoot, logFile, sessionId, recordId, derived);
|
|
109
109
|
}
|
|
110
|
-
/** Starts the compaction record when the host will close one (`closable`), then tells `onBoundary` what was printed; the record id, or
|
|
110
|
+
/** Starts the compaction record when the host will close one (`closable`), then tells `onBoundary` what was printed; the record id, or
|
|
111
|
+
* null without a record. */
|
|
111
112
|
function markCompactionBoundary(hippoRoot, options, logFile, input, closable) {
|
|
112
113
|
const { sessionId } = input;
|
|
113
114
|
// The record is the "something saved before every compaction", so it lands even when no snapshot is derivable later.
|
|
@@ -180,13 +181,8 @@ function saveDerivedSnapshot(hippoRoot, logFile, sessionId, recordId, derived) {
|
|
|
180
181
|
}
|
|
181
182
|
}
|
|
182
183
|
}
|
|
183
|
-
/**
|
|
184
|
-
*
|
|
185
|
-
* so this verb must exit 0 on every path — malformed stdin, missing
|
|
186
|
-
* transcript, and store errors all degrade to a logged no-op rather than a
|
|
187
|
-
* thrown error. Callers (src/cli.ts) must not wrap this in anything that
|
|
188
|
-
* could turn a caught-and-logged failure back into a non-zero exit.
|
|
189
|
-
*/
|
|
184
|
+
/** PreCompact hook entry point. Exit code 2 BLOCKS compaction, so every path (bad stdin, missing transcript, store error) must exit 0 as a logged no-op.
|
|
185
|
+
* Callers must not wrap this in anything that turns a caught-and-logged failure into a non-zero exit. */
|
|
190
186
|
export async function cmdPreCompact(hippoRoot, options) {
|
|
191
187
|
const logFile = options.logFile ?? defaultPreCompactLogPath();
|
|
192
188
|
try {
|
|
@@ -1,34 +1,25 @@
|
|
|
1
1
|
// PostCompact for a caller on another machine: the items it parsed become rows under its owner and project, and a retried request id writes nothing twice.
|
|
2
2
|
import { BadRequestError } from '../core/api-errors.js';
|
|
3
|
-
import { COMPACTION_ITEM_MAX_CHARS } from '
|
|
4
|
-
import {
|
|
3
|
+
import { COMPACTION_ITEM_MAX_CHARS } from '../util/compaction-items.js';
|
|
4
|
+
import { saveCallerItems } from '../store/compaction-caller.js';
|
|
5
|
+
import { scrubCompactionItems } from './compaction-record.js';
|
|
5
6
|
import { log } from '../util/log.js';
|
|
6
|
-
import { assertRequestId, assertTrigger, bindCaller, callerInHoldout
|
|
7
|
+
import { assertRequestId, assertTrigger, bindCaller, callerInHoldout } from './caller-session.js';
|
|
7
8
|
/** Busy throws, for the server's 503: the retry carries the same request id, so nothing is spooled or deferred here. */
|
|
8
9
|
export function saveCompactionItemsForCaller(ctx, req) {
|
|
9
10
|
assertTrigger(req.trigger);
|
|
10
11
|
assertRequestId(req.requestId);
|
|
11
12
|
// Refused before the scrub, as failure text is, so the cut after it only ever takes back a mask's growth.
|
|
12
|
-
if (req.items.some((item) => item.length > COMPACTION_ITEM_MAX_CHARS))
|
|
13
|
+
if (req.items.some((item) => item.length > COMPACTION_ITEM_MAX_CHARS)) {
|
|
13
14
|
throw new BadRequestError(`items: each at most ${COMPACTION_ITEM_MAX_CHARS} characters`);
|
|
15
|
+
}
|
|
14
16
|
const key = bindCaller(ctx, req.sessionId, req.project);
|
|
15
17
|
if (callerInHoldout(ctx, req.sessionId))
|
|
16
18
|
return { written: 0 };
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const meta = { sessionId: req.sessionId, trigger: req.trigger, cwd: null, transcriptPath: null };
|
|
23
|
-
const text = { summary: '', items: scrubCompactionItems(req.items) };
|
|
24
|
-
const record = earlier ?? recordSummary(db, ctx.hippoRoot, ctx.tenantId, {
|
|
25
|
-
meta, text, at: new Date(), caller: { originProject: req.project.name, requestId: req.requestId },
|
|
26
|
-
});
|
|
27
|
-
const written = saveItems(db, ctx.hippoRoot, {
|
|
28
|
-
tenantId: ctx.tenantId, recordId: record.id, sessionId: req.sessionId, originProject: record.originProject, cwd: null,
|
|
29
|
-
items: record.items, caller: { actor: key.owner, origins: key.project },
|
|
30
|
-
}, (message) => log.info(`post-compact: ${message}`));
|
|
31
|
-
return { written };
|
|
32
|
-
});
|
|
19
|
+
const written = saveCallerItems(ctx.hippoRoot, ctx.tenantId, {
|
|
20
|
+
sessionId: req.sessionId, trigger: req.trigger, requestId: req.requestId, project: req.project.name, items: scrubCompactionItems(req.items),
|
|
21
|
+
owner: key.owner, origins: key.project,
|
|
22
|
+
}, (message) => log.info(`post-compact: ${message}`));
|
|
23
|
+
return { written };
|
|
33
24
|
}
|
|
34
25
|
//# sourceMappingURL=compaction-items-caller.js.map
|
|
@@ -1,31 +1,6 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import { type CompactionStatus } from '../store/compactions.js';
|
|
3
|
-
/** PostCompact has 10 s in all (PreCompact 30 s), so a locked store must be given up on early. */
|
|
4
|
-
export declare const COMPACTION_DB_WAIT_MS = 2000;
|
|
1
|
+
import { type CompactionSaveResult, type Log, type ReplayOptions } from '../store/compactions-record.js';
|
|
5
2
|
/** Tested verbatim: Claude Code hands PreCompact stdout to the summariser as instructions. */
|
|
6
|
-
export declare const PRE_COMPACT_INSTRUCTION
|
|
7
|
-
/** Long enough that a live hook has finished with its own record. */
|
|
8
|
-
export declare const REPLAY_AFTER_MS: number;
|
|
9
|
-
/** Claude Code deletes transcripts after 30 days, so an older gap can never be filled. */
|
|
10
|
-
export declare const TRANSCRIPT_FILL_WINDOW_MS: number;
|
|
11
|
-
export type { CompactionStatus };
|
|
12
|
-
export interface CompactionRecord {
|
|
13
|
-
id: string;
|
|
14
|
-
tenantId: string;
|
|
15
|
-
sessionId: string;
|
|
16
|
-
originProject: string;
|
|
17
|
-
trigger: string | null;
|
|
18
|
-
cwd: string | null;
|
|
19
|
-
transcriptPath: string | null;
|
|
20
|
-
snapshotSaved: boolean;
|
|
21
|
-
startedAt: string;
|
|
22
|
-
summarisedAt: string | null;
|
|
23
|
-
summary: string | null;
|
|
24
|
-
items: string[];
|
|
25
|
-
itemsWritten: number;
|
|
26
|
-
status: CompactionStatus;
|
|
27
|
-
}
|
|
28
|
-
export type Log = (message: string) => void;
|
|
3
|
+
export declare const PRE_COMPACT_INSTRUCTION: string;
|
|
29
4
|
interface ScrubbedSummary {
|
|
30
5
|
summary: string;
|
|
31
6
|
items: string[];
|
|
@@ -34,59 +9,9 @@ interface ScrubbedSummary {
|
|
|
34
9
|
}
|
|
35
10
|
/** What the record keeps of a compact_summary: the scrubbed body, and every parsed item scrubbed. */
|
|
36
11
|
export declare function readCompactionText(compactSummary: string): ScrubbedSummary;
|
|
37
|
-
/** A caller's items scrubbed as readCompactionText scrubs a summary's, since another machine's scrub is not trusted; cut after it, as a
|
|
12
|
+
/** A caller's items scrubbed as readCompactionText scrubs a summary's, since another machine's scrub is not trusted; cut after it, as a
|
|
13
|
+
* mask can run longer than what it hides. */
|
|
38
14
|
export declare function scrubCompactionItems(items: readonly string[]): string[];
|
|
39
|
-
export interface CompactionStart {
|
|
40
|
-
sessionId: string;
|
|
41
|
-
originProject: string;
|
|
42
|
-
trigger: string | null;
|
|
43
|
-
cwd: string | null;
|
|
44
|
-
transcriptPath: string | null;
|
|
45
|
-
}
|
|
46
|
-
export declare function startCompaction(db: DatabaseSyncLike, tenantId: string, start: CompactionStart, at?: Date): string;
|
|
47
|
-
/** A session's newest record, or null. */
|
|
48
|
-
export declare function latestCompaction(db: DatabaseSyncLike, tenantId: string, sessionId: string): CompactionRecord | null;
|
|
49
|
-
/** 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. */
|
|
50
|
-
export declare function compactionByRequest(db: DatabaseSyncLike, tenantId: string, requestId: string, sessionId: string): CompactionRecord | null;
|
|
51
|
-
/** Best effort, never throws: a compaction must not fail because its record could not be written. */
|
|
52
|
-
export declare function recordCompactionStart(hippoRoot: string, start: Omit<CompactionStart, 'originProject'>, log: Log): string | null;
|
|
53
|
-
/** On the caller's handle and tenant, so a server marks the record under the caller's tenant with its own wait. */
|
|
54
|
-
export declare function markSnapshotSaved(db: DatabaseSyncLike, tenantId: string, recordId: string): void;
|
|
55
|
-
export declare function recordSnapshotSaved(hippoRoot: string, tenantId: string, recordId: string, log: Log): void;
|
|
56
|
-
export interface CompactionText {
|
|
57
|
-
summary: string;
|
|
58
|
-
items: string[];
|
|
59
|
-
}
|
|
60
|
-
/** A caller's checked project, and the id its retries carry so a retry finds this record. */
|
|
61
|
-
export interface SummaryCaller {
|
|
62
|
-
originProject?: string;
|
|
63
|
-
requestId?: string;
|
|
64
|
-
}
|
|
65
|
-
export interface RecordSummaryOptions {
|
|
66
|
-
readonly meta: Omit<CompactionStart, 'originProject'>;
|
|
67
|
-
readonly text: CompactionText;
|
|
68
|
-
readonly at: Date;
|
|
69
|
-
readonly caller?: SummaryCaller;
|
|
70
|
-
}
|
|
71
|
-
/** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One statement each. */
|
|
72
|
-
export declare function recordSummary(db: DatabaseSyncLike, hippoRoot: string, tenantId: string, options: RecordSummaryOptions): CompactionRecord;
|
|
73
|
-
export interface ItemContext {
|
|
74
|
-
tenantId: string;
|
|
75
|
-
/** null when the record step failed: the items still go in, with no record to close. */
|
|
76
|
-
recordId: string | null;
|
|
77
|
-
sessionId: string;
|
|
78
|
-
originProject: string;
|
|
79
|
-
/** Where the session ran, so rows held under the project's older folder name count too. */
|
|
80
|
-
cwd: string | null;
|
|
81
|
-
items: string[];
|
|
82
|
-
/** Set when another machine sent the items: its audit actor and its project's names, since the server's folder is neither. */
|
|
83
|
-
caller?: {
|
|
84
|
-
actor: string;
|
|
85
|
-
origins: readonly string[];
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
/** Items that become rows, then the record `done`, in one transaction so two sessions cannot both insert one text. Mirrors after commit. */
|
|
89
|
-
export declare function saveItems(db: DatabaseSyncLike, hippoRoot: string, ctx: ItemContext, log: Log): number;
|
|
90
15
|
export interface PostCompactPayload {
|
|
91
16
|
sessionId: string;
|
|
92
17
|
trigger: string | null;
|
|
@@ -95,22 +20,11 @@ export interface PostCompactPayload {
|
|
|
95
20
|
/** null when Claude Code sent none; the transcript fills the record later. */
|
|
96
21
|
compactSummary: string | null;
|
|
97
22
|
}
|
|
98
|
-
export interface CompactionSaveResult {
|
|
99
|
-
/** Memories written; null when neither the record nor the items could be saved. */
|
|
100
|
-
written: number | null;
|
|
101
|
-
/** True when the rest waits for the next sleep or post-compact. */
|
|
102
|
-
deferred: boolean;
|
|
103
|
-
snapshotSaved: boolean;
|
|
104
|
-
}
|
|
105
23
|
/** The PostCompact work: record the summary, then write its items. Each step is independent; a busy store spools or defers. Never throws. */
|
|
106
24
|
export declare function saveCompaction(hippoRoot: string, payload: PostCompactPayload, log: Log): CompactionSaveResult;
|
|
107
25
|
/** The one line PostCompact prints, or null when nothing was saved. */
|
|
108
26
|
export declare function postCompactLine(result: CompactionSaveResult): string | null;
|
|
109
|
-
/**
|
|
110
|
-
export declare function
|
|
111
|
-
|
|
112
|
-
export declare function replayCompactionsAt(hippoRoot: string, log: Log, opts?: {
|
|
113
|
-
busyWaitMs?: number;
|
|
114
|
-
deadline?: number;
|
|
115
|
-
}): number;
|
|
27
|
+
/** For `hippo sleep` and post-compact: finishes what a killed hook or a busy store left, never throws. */
|
|
28
|
+
export declare function replayCompactionsAt(hippoRoot: string, log: Log, opts?: ReplayOptions): number;
|
|
29
|
+
export {};
|
|
116
30
|
//# sourceMappingURL=compaction-record.d.ts.map
|