hippo-memory 1.71.0 → 2.0.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 +7 -5
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +11 -26
- package/dist/agent-memories/claude-code.js +1 -1
- 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/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/sync.js +8 -6
- package/dist/api/assemble.js +3 -2
- package/dist/api/audit.d.ts +30 -2
- package/dist/api/audit.js +48 -7
- package/dist/api/auth.d.ts +11 -9
- package/dist/api/auth.js +39 -40
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +7 -3
- package/dist/api/availability.js +2 -3
- 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-auto.js +4 -2
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +15 -29
- package/dist/api/context.js +29 -18
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/api/dormant.js +4 -2
- package/dist/api/drill-down.js +3 -2
- 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 +7 -3
- package/dist/api/forget.js +24 -14
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.js +2 -1
- package/dist/api/index.d.ts +4 -2
- package/dist/api/index.js +4 -2
- package/dist/api/instruction-detect.js +5 -1
- package/dist/api/learn.d.ts +5 -1
- package/dist/api/learn.js +71 -44
- package/dist/api/ledger-db.d.ts +2 -6
- package/dist/api/ledger-db.js +4 -36
- package/dist/api/memories.d.ts +21 -1
- package/dist/api/memories.js +51 -1
- package/dist/api/objects.d.ts +1 -1
- package/dist/api/objects.js +2 -1
- package/dist/api/outcome.d.ts +5 -5
- package/dist/api/outcome.js +17 -16
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +3 -1
- package/dist/api/predictions.js +8 -1
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +3 -3
- package/dist/api/promote.js +26 -28
- package/dist/api/prompt-hook.d.ts +17 -2
- package/dist/api/prompt-hook.js +45 -4
- package/dist/api/quarantine.js +2 -1
- package/dist/api/recall-cli.d.ts +3 -0
- package/dist/api/recall-cli.js +13 -4
- package/dist/api/recall-core.js +10 -5
- package/dist/api/recall-pipeline.js +23 -24
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +3 -1
- package/dist/api/recall.d.ts +0 -3
- package/dist/api/recall.js +51 -73
- package/dist/api/remember-local.d.ts +5 -2
- package/dist/api/remember-local.js +15 -7
- package/dist/api/remember.d.ts +7 -3
- package/dist/api/remember.js +19 -16
- package/dist/api/session-end.d.ts +46 -0
- package/dist/api/session-end.js +131 -0
- package/dist/api/sleep-run.d.ts +1 -1
- package/dist/api/sleep-run.js +16 -11
- package/dist/api/sleep.js +4 -3
- 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.js +2 -2
- package/dist/api/types.d.ts +3 -7
- package/dist/api/types.js +6 -1
- 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.js +36 -95
- package/dist/capture/compact.js +10 -5
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +29 -426
- package/dist/capture/compaction-spool.d.ts +7 -7
- package/dist/capture/compaction-spool.js +60 -51
- 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.js +4 -3
- package/dist/capture/session-end-caller.js +3 -2
- package/dist/capture/session-worker.js +22 -10
- package/dist/capture/transcript.d.ts +2 -1
- package/dist/capture/transcript.js +6 -3
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/audit-prune.d.ts +0 -25
- package/dist/cli/audit-prune.js +1 -27
- package/dist/cli/audit.js +20 -20
- package/dist/cli/auth.d.ts +1 -1
- package/dist/cli/auth.js +16 -17
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +37 -292
- package/dist/cli/card.js +41 -33
- package/dist/cli/client.d.ts +6 -2
- package/dist/cli/client.js +37 -21
- package/dist/cli/compact-resume-payload.js +1 -1
- package/dist/cli/context.d.ts +1 -1
- package/dist/cli/context.js +13 -13
- package/dist/cli/continuity.d.ts +1 -1
- package/dist/cli/continuity.js +36 -39
- package/dist/cli/curate.d.ts +2 -2
- package/dist/cli/curate.js +32 -36
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +23 -8
- package/dist/cli/decisions.d.ts +0 -2
- package/dist/cli/decisions.js +7 -285
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +12 -13
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +21 -25
- package/dist/cli/flag-values.js +16 -6
- package/dist/cli/flags.d.ts +0 -289
- package/dist/cli/flags.js +3 -138
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +6 -6
- package/dist/cli/hook-runtime.js +9 -36
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +28 -19
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +11 -3
- package/dist/cli/last-sleep.js +1 -1
- package/dist/cli/maintenance.d.ts +3 -3
- package/dist/cli/maintenance.js +29 -30
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.d.ts +2 -2
- package/dist/cli/object-verbs.js +4 -4
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +126 -290
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +174 -0
- package/dist/cli/print.js +2 -1
- package/dist/cli/projects.js +30 -22
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +6 -5
- package/dist/cli/recall.js +13 -7
- package/dist/cli/refine-llm.js +18 -17
- package/dist/cli/remember.js +17 -17
- package/dist/cli/scheduler.js +2 -1
- package/dist/cli/serve.js +11 -6
- package/dist/cli/session-hooks.d.ts +1 -5
- package/dist/cli/session-hooks.js +89 -168
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +17 -10
- package/dist/cli/shared.d.ts +2 -6
- package/dist/cli/shared.js +9 -29
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.js +6 -37
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +32 -35
- package/dist/cli/transfer.d.ts +3 -3
- package/dist/cli/transfer.js +64 -43
- package/dist/cli/usage.d.ts +1 -80
- package/dist/cli/usage.js +2 -696
- package/dist/cli/verb-row.d.ts +34 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +234 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +236 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +257 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +314 -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 -272
- package/dist/cli.js +24 -315
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +39 -4
- package/dist/connectors/github/backfill.js +12 -3
- package/dist/connectors/github/deletion.js +2 -1
- package/dist/connectors/github/dlq.js +31 -73
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +5 -29
- package/dist/connectors/github/tenant-routing.js +2 -1
- package/dist/connectors/github/webhook.d.ts +2 -1
- package/dist/connectors/github/webhook.js +35 -2
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +29 -0
- package/dist/connectors/slack/deletion.js +2 -1
- package/dist/connectors/slack/dlq.js +49 -71
- package/dist/connectors/slack/ingest.d.ts +2 -6
- package/dist/connectors/slack/ingest.js +4 -28
- package/dist/connectors/slack/tenant-routing.js +2 -1
- package/dist/connectors/slack/webhook.d.ts +2 -1
- package/dist/connectors/slack/webhook.js +2 -1
- package/dist/consolidate/conflicts.js +2 -2
- package/dist/consolidate/dag.js +29 -18
- package/dist/consolidate/dedupe.d.ts +7 -0
- package/dist/consolidate/dedupe.js +6 -4
- package/dist/consolidate/llm-passes.js +45 -19
- package/dist/consolidate/memory-value.js +3 -2
- package/dist/consolidate/merge.js +8 -8
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +26 -6
- package/dist/consolidate/replay.js +11 -4
- package/dist/consolidate/sleep.js +9 -6
- package/dist/consolidate/traces.js +5 -5
- package/dist/core/ablation.d.ts +10 -0
- package/dist/core/ablation.js +12 -0
- package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
- package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
- package/dist/core/ambient.d.ts +4 -0
- package/dist/core/ambient.js +39 -18
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/card.js +3 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/config.d.ts +1 -1
- package/dist/core/config.js +22 -18
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/{store → core}/markdown.d.ts +1 -1
- package/dist/{store → core}/markdown.js +4 -4
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory.d.ts +14 -8
- package/dist/core/memory.js +35 -23
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +1 -1
- package/dist/core/physics.d.ts +3 -1
- package/dist/core/physics.js +23 -18
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +3 -0
- package/dist/core/project-identity.js +12 -2
- package/dist/{store → core}/recall-scope.d.ts +1 -10
- package/dist/{store → core}/recall-scope.js +2 -19
- package/dist/core/search-types.d.ts +1 -1
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +5 -5
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.js +1 -3
- package/dist/dashboard/dashboard.js +16 -5
- package/dist/db/busy.d.ts +2 -7
- package/dist/db/busy.js +21 -26
- package/dist/db/connect.d.ts +2 -2
- package/dist/db/connect.js +7 -7
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +14 -7
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v14.js +1 -0
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +0 -2
- package/dist/db/open.js +6 -10
- package/dist/db/physics-state.d.ts +0 -4
- package/dist/db/physics-state.js +7 -33
- package/dist/db/request-stores.d.ts +1 -0
- package/dist/db/request-stores.js +2 -1
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.js +19 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.js +18 -15
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
- package/dist/{store/embeddings → embeddings}/provider.js +19 -25
- 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 +1 -1
- package/dist/entry/store-kit.d.ts +37 -0
- package/dist/entry/store-kit.js +25 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-suite.js +17 -11
- package/dist/eval/eval.js +1 -1
- package/dist/eval/judgment.js +12 -5
- package/dist/graph/extract.js +3 -3
- package/dist/graph/recall.js +1 -1
- package/dist/graph/view.js +13 -5
- 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 +2 -1
- package/dist/hooks/json-hooks.js +10 -4
- package/dist/hooks/opencode.js +8 -5
- package/dist/hooks/shared.d.ts +0 -6
- package/dist/hooks/shared.js +4 -15
- package/dist/importers/core.js +4 -4
- package/dist/importers/sources.js +5 -4
- package/dist/importers/vault.d.ts +1 -1
- package/dist/importers/vault.js +25 -23
- package/dist/index.d.ts +5 -4
- package/dist/index.js +4 -3
- package/dist/learn/autolearn.d.ts +15 -3
- package/dist/learn/autolearn.js +38 -16
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +7 -5
- package/dist/learn/forward-claim-detector.js +4 -2
- package/dist/learn/invalidation.d.ts +2 -1
- package/dist/learn/invalidation.js +18 -9
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +27 -48
- 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.d.ts +1 -1
- package/dist/mcp/memory-tools.js +8 -9
- package/dist/mcp/protocol.d.ts +11 -7
- package/dist/mcp/protocol.js +25 -12
- package/dist/mcp/recall-tools.js +12 -9
- package/dist/mcp/request.js +22 -20
- package/dist/mcp/stdio.js +37 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +44 -21
- package/dist/objects/customer-notes.d.ts +2 -2
- package/dist/objects/decisions.d.ts +2 -2
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +2 -2
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +2 -2
- package/dist/objects/policies.js +2 -1
- package/dist/objects/processes.d.ts +2 -2
- package/dist/objects/project-briefs.d.ts +2 -2
- package/dist/objects/project-briefs.js +2 -3
- package/dist/objects/skills.d.ts +2 -2
- package/dist/postinstall.js +1 -1
- package/dist/rerankers/clef.js +3 -6
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +71 -98
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +2 -4
- package/dist/rerankers/outage-warning.d.ts +3 -1
- package/dist/rerankers/outage-warning.js +5 -3
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.js +1 -1
- package/dist/search/embed-memories.d.ts +12 -0
- package/dist/search/embed-memories.js +389 -0
- package/dist/search/engine.d.ts +8 -0
- package/dist/search/engine.js +10 -0
- package/dist/search/goal-boost.d.ts +1 -1
- package/dist/search/goal-boost.js +6 -3
- package/dist/search/hybrid.d.ts +9 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +22 -15
- package/dist/search/rerank.js +1 -1
- package/dist/search/vector.d.ts +8 -6
- package/dist/search/vector.js +14 -17
- package/dist/server/auth.d.ts +3 -1
- package/dist/server/auth.js +24 -15
- package/dist/server/boot.d.ts +2 -1
- package/dist/server/boot.js +34 -84
- package/dist/server/client-ip.d.ts +9 -6
- package/dist/server/client-ip.js +36 -17
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +1 -0
- package/dist/server/defaults.js +1 -0
- package/dist/server/mcp-http.js +16 -11
- package/dist/server/request.js +7 -2
- 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 -133
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +13 -21
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +1 -2
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +2 -4
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +2 -5
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +19 -40
- package/dist/server/routes/object-routes.d.ts +6 -6
- package/dist/server/routes/object-routes.js +4 -7
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +2 -4
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +9 -13
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +1 -2
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +2 -4
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +6 -10
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +2 -4
- package/dist/server/server-detect.d.ts +7 -1
- package/dist/server/server-detect.js +36 -11
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +17 -11
- package/dist/server/tls.d.ts +7 -2
- package/dist/server/tls.js +17 -5
- package/dist/server/types.d.ts +29 -12
- package/dist/server/validation.d.ts +1 -2
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +4 -40
- package/dist/server.js +3 -29
- package/dist/sharing/global-store.d.ts +4 -5
- package/dist/sharing/global-store.js +8 -13
- package/dist/sharing/global-sync.js +38 -45
- package/dist/sharing/project-merge.d.ts +7 -14
- package/dist/sharing/project-merge.js +57 -121
- package/dist/sharing/search-both.js +10 -3
- package/dist/sharing/share.d.ts +2 -0
- package/dist/sharing/share.js +39 -38
- package/dist/store/ambient.js +7 -7
- package/dist/store/audit-event.d.ts +1 -1
- package/dist/store/audit.d.ts +0 -16
- package/dist/store/audit.js +4 -55
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +7 -3
- package/dist/store/candidates.d.ts +3 -2
- package/dist/store/candidates.js +59 -30
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/cards.js +6 -5
- 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 +418 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +7 -1
- package/dist/store/conflicts.js +13 -9
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +33 -0
- package/dist/store/connectors/event-log.d.ts +13 -0
- package/dist/store/connectors/event-log.js +24 -0
- package/dist/store/connectors/github.d.ts +7 -9
- package/dist/store/connectors/github.js +35 -60
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +24 -57
- package/dist/store/dashboard-reads.js +8 -6
- package/dist/store/delete-and-batch.d.ts +6 -0
- package/dist/store/delete-and-batch.js +40 -6
- package/dist/store/delivery-recorder.d.ts +12 -5
- package/dist/store/delivery-recorder.js +13 -11
- package/dist/store/descendant-page.js +8 -4
- package/dist/store/dormant.d.ts +1 -1
- package/dist/store/dormant.js +10 -4
- package/dist/store/embeddings/index.d.ts +2 -12
- package/dist/store/embeddings/index.js +5 -374
- package/dist/store/entry-reads.d.ts +35 -4
- package/dist/store/entry-reads.js +86 -19
- package/dist/store/entry-row.js +9 -2
- package/dist/store/entry-writes.d.ts +15 -12
- package/dist/store/entry-writes.js +54 -22
- 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.js +22 -19
- package/dist/store/graph-reads.js +9 -6
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -6
- package/dist/store/graph-writes.js +48 -71
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +10 -4
- package/dist/store/handoffs.js +10 -9
- package/dist/store/index-and-stats.js +2 -2
- package/dist/store/index.d.ts +2 -2
- package/dist/store/index.js +1 -1
- 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.js +19 -10
- package/dist/store/open.d.ts +2 -5
- package/dist/store/open.js +42 -54
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/port.d.ts +68 -6
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +1 -2
- package/dist/store/predictions.js +3 -6
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/store/quality-repair.js +1 -1
- package/dist/store/quarantine.js +2 -1
- package/dist/store/recall-trace.d.ts +2 -0
- package/dist/store/recall-trace.js +20 -3
- package/dist/store/rejected-values.js +16 -10
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +0 -17
- package/dist/store/rejection.js +1 -21
- package/dist/store/rows.js +2 -2
- package/dist/store/rule-sql.d.ts +11 -0
- package/dist/store/rule-sql.js +31 -6
- package/dist/store/search-rows.d.ts +5 -5
- package/dist/store/search-rows.js +18 -16
- package/dist/store/sessions.js +4 -2
- 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 +4 -7
- package/dist/store/sqlite/connector-writes-group.js +6 -4
- package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
- package/dist/store/sqlite/entry-writes-group.js +3 -3
- package/dist/store/sqlite/error-codec.js +4 -3
- package/dist/store/sqlite/executor.js +10 -4
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +11 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/last-recall-group.d.ts +13 -0
- package/dist/store/sqlite/last-recall-group.js +57 -0
- package/dist/store/sqlite/local.d.ts +0 -17
- package/dist/store/sqlite/local.js +0 -31
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +60 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +15 -7
- package/dist/store/sqlite/store.d.ts +1 -8
- package/dist/store/sqlite/store.js +13 -22
- package/dist/store/summaries.d.ts +10 -3
- package/dist/store/summaries.js +54 -11
- package/dist/store/token-ledger-rows.js +3 -2
- package/dist/store/token-ledger.d.ts +0 -7
- package/dist/store/token-ledger.js +0 -35
- package/dist/store/vector-index.js +8 -4
- package/dist/support-bundle.js +2 -3
- package/dist/trust/reject-flow.js +2 -2
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +6 -1
- package/dist/util/anthropic-messages.js +26 -7
- package/dist/util/atomic-write.d.ts +5 -2
- package/dist/util/atomic-write.js +12 -8
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +12 -2
- package/dist/util/env.js +12 -2
- package/dist/util/format.d.ts +5 -0
- package/dist/util/format.js +10 -0
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +6 -0
- package/dist/util/http-retry.js +43 -5
- 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 +4 -0
- package/dist/util/log.js +9 -0
- package/dist/util/request-scope.d.ts +9 -3
- package/dist/util/request-scope.js +18 -9
- package/dist/util/secret-detect.js +6 -1
- package/dist/util/spawn-argv.d.ts +9 -0
- package/dist/util/spawn-argv.js +57 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- 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/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +1 -1
- package/dist/util/version.js +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 +4 -2
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -175
- /package/dist/{cli → api}/correction-latency.d.ts +0 -0
- /package/dist/{cli → api}/correction-latency.js +0 -0
- /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
- /package/dist/{cli → api}/provenance-coverage.js +0 -0
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
- /package/dist/{store → util}/yaml.d.ts +0 -0
- /package/dist/{store → util}/yaml.js +0 -0
package/dist/capture/command.js
CHANGED
|
@@ -2,21 +2,16 @@ 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 { updateStatsOn } from '../store/index-and-stats.js';
|
|
10
|
-
import { gatedWrite } from '../trust/gated-write.js';
|
|
11
8
|
import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
|
|
12
|
-
import { embedMemory } from '../store/embeddings/index.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) {
|
|
@@ -37,28 +32,11 @@ export function cmdCapture(hippoRoot, options) {
|
|
|
37
32
|
restoreStdio();
|
|
38
33
|
}
|
|
39
34
|
}
|
|
40
|
-
/** Append-mode tee: mirror every stdout/stderr chunk to `logFile` until the returned restore function is called
|
|
35
|
+
/** Append-mode tee: mirror every stdout/stderr chunk to `logFile` until the returned restore function is called. */
|
|
41
36
|
function beginLogTee(logFile) {
|
|
42
37
|
if (!writeLogBanner(logFile))
|
|
43
38
|
return () => { };
|
|
44
|
-
|
|
45
|
-
const origStderrWrite = process.stderr.write.bind(process.stderr);
|
|
46
|
-
const tee = (chunk) => appendToLog(logFile, chunk);
|
|
47
|
-
const wrapWrite = (origWrite) => {
|
|
48
|
-
const wrapped = (...args) => {
|
|
49
|
-
tee(args[0]);
|
|
50
|
-
// SAFETY: forwarding the exact arguments the real overloaded `write` received is safe; `StreamWriteArgs` is the union of both overloads' parameter lists.
|
|
51
|
-
return origWrite(...args);
|
|
52
|
-
};
|
|
53
|
-
// SAFETY: `wrapped` matches both real `write` overload shapes; TS cannot verify one implementation covers an overloaded type.
|
|
54
|
-
return wrapped;
|
|
55
|
-
};
|
|
56
|
-
process.stdout.write = wrapWrite(origStdoutWrite);
|
|
57
|
-
process.stderr.write = wrapWrite(origStderrWrite);
|
|
58
|
-
return () => {
|
|
59
|
-
process.stdout.write = origStdoutWrite;
|
|
60
|
-
process.stderr.write = origStderrWrite;
|
|
61
|
-
};
|
|
39
|
+
return teeStdStreams(logFile);
|
|
62
40
|
}
|
|
63
41
|
/** Creates the log's folder and appends the banner line; false, after a warning, when the log cannot be written. */
|
|
64
42
|
function writeLogBanner(logFile) {
|
|
@@ -72,15 +50,6 @@ function writeLogBanner(logFile) {
|
|
|
72
50
|
}
|
|
73
51
|
return true;
|
|
74
52
|
}
|
|
75
|
-
function appendToLog(logFile, chunk) {
|
|
76
|
-
try {
|
|
77
|
-
const buf = isStringValue(chunk) ? chunk : Buffer.from(chunk).toString('utf8');
|
|
78
|
-
fs.appendFileSync(logFile, buf, 'utf8');
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
// log failures are non-fatal
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
53
|
// Console lines here are the `hippo capture` command's printed result, so they stay off the logger.
|
|
85
54
|
function cmdCaptureCore(hippoRoot, options) {
|
|
86
55
|
const useGlobal = options.global;
|
|
@@ -94,15 +63,16 @@ function cmdCaptureCore(hippoRoot, options) {
|
|
|
94
63
|
process.exit(1);
|
|
95
64
|
}
|
|
96
65
|
}
|
|
97
|
-
const
|
|
98
|
-
if (
|
|
66
|
+
const read = readCaptureTexts(options);
|
|
67
|
+
if (read === null)
|
|
99
68
|
return;
|
|
69
|
+
const { texts, userTexts } = read;
|
|
100
70
|
if (texts.every((text) => text.trim().length === 0)) {
|
|
101
71
|
console.log('No text to capture from.');
|
|
102
72
|
return;
|
|
103
73
|
}
|
|
104
74
|
// Scrub once here, as the snapshot fields are: every source can carry a pasted token (AGENTS.md: no secrets in memories).
|
|
105
|
-
const extracted = extractFromTexts(texts.map((text) => maskEmails(redactSecretsStrict(text))));
|
|
75
|
+
const extracted = extractFromTexts(texts.map((text) => maskEmails(redactSecretsStrict(text))), userTexts);
|
|
106
76
|
if (extracted.length === 0) {
|
|
107
77
|
console.log('No actionable items found in the input.');
|
|
108
78
|
return;
|
|
@@ -132,12 +102,13 @@ function printCaptureTally(options, { captured, skipped, rejected }) {
|
|
|
132
102
|
(rejected > 0 ? `, ${rejected} rejected` : '') +
|
|
133
103
|
')');
|
|
134
104
|
}
|
|
135
|
-
/** 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. */
|
|
136
107
|
function readCaptureTexts(options) {
|
|
137
108
|
switch (options.source) {
|
|
138
109
|
case 'stdin': {
|
|
139
110
|
try {
|
|
140
|
-
return [fs.readFileSync(0, 'utf8')];
|
|
111
|
+
return { texts: [fs.readFileSync(0, 'utf8')], userTexts: 0 };
|
|
141
112
|
}
|
|
142
113
|
catch {
|
|
143
114
|
console.error('No input on stdin. Pipe text in or use --file <path>.');
|
|
@@ -153,7 +124,7 @@ function readCaptureTexts(options) {
|
|
|
153
124
|
console.error(`File not found: ${options.filePath}`);
|
|
154
125
|
process.exit(1);
|
|
155
126
|
}
|
|
156
|
-
return [fs.readFileSync(options.filePath, 'utf8')];
|
|
127
|
+
return { texts: [fs.readFileSync(options.filePath, 'utf8')], userTexts: 0 };
|
|
157
128
|
}
|
|
158
129
|
case 'last-session': {
|
|
159
130
|
let turns = options.sessionTurns;
|
|
@@ -170,85 +141,55 @@ function readCaptureTexts(options) {
|
|
|
170
141
|
console.log('Transcript had no user/assistant messages to summarise.');
|
|
171
142
|
return null;
|
|
172
143
|
}
|
|
173
|
-
return [...users, ...assistants];
|
|
144
|
+
return { texts: [...users, ...assistants], userTexts: users.length };
|
|
174
145
|
}
|
|
175
146
|
}
|
|
176
147
|
}
|
|
177
148
|
export function captureExtractedItems(targetRoot, options, extracted, keys) {
|
|
178
149
|
const tally = { captured: 0, skipped: 0, rejected: 0 };
|
|
179
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
|
+
}
|
|
180
157
|
// Dry run probes the same checkRejectionGuard the real write uses, on a read-only handle,
|
|
181
158
|
// so a tombstoned item previews as rejected rather than captured.
|
|
182
|
-
|
|
183
|
-
const writeDb = options.dryRun ? null : openStore(targetRoot);
|
|
184
|
-
try {
|
|
159
|
+
return withRejectionProbe(targetRoot, (wouldReject) => {
|
|
185
160
|
for (const item of extracted) {
|
|
186
161
|
if (keys.has(duplicateKey(item.content))) {
|
|
187
162
|
tally.skipped++;
|
|
188
|
-
|
|
189
|
-
console.log(` [skip] (${item.category}) ${item.content.slice(0, 80)}`);
|
|
190
|
-
}
|
|
163
|
+
console.log(` [skip] (${item.category}) ${item.content.slice(0, 80)}`);
|
|
191
164
|
continue;
|
|
192
165
|
}
|
|
193
166
|
const entry = captureEntry(item, options, baseHalfLifeDays);
|
|
194
|
-
|
|
167
|
+
if (wouldReject(entry.tenant_id ?? '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++;
|
|
195
174
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
if (dryRunDb)
|
|
199
|
-
closeHippoDb(dryRunDb);
|
|
200
|
-
if (writeDb)
|
|
201
|
-
closeHippoDb(writeDb);
|
|
202
|
-
}
|
|
203
|
-
return tally;
|
|
175
|
+
return tally;
|
|
176
|
+
});
|
|
204
177
|
}
|
|
205
178
|
function captureEntry(item, options, baseHalfLifeDays) {
|
|
206
179
|
// kind stays 'distilled': these are curated items, not raw transcript (see MEMORY_ENVELOPE.md).
|
|
207
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.
|
|
208
183
|
const created = createMemory(item.content, {
|
|
209
184
|
layer: Layer.Episodic,
|
|
210
185
|
tags: item.tags,
|
|
211
186
|
source: 'capture',
|
|
212
187
|
confidence: 'observed',
|
|
188
|
+
pinned: item.fromUser === true && item.category === 'rule',
|
|
213
189
|
tenantId: options.tenantId,
|
|
214
190
|
source_session_id: options.sessionId,
|
|
215
191
|
baseHalfLifeDays,
|
|
216
192
|
});
|
|
217
193
|
return options.originProject === undefined ? created : { ...created, origin_project: projectId(options.originProject) };
|
|
218
194
|
}
|
|
219
|
-
/** Previews or writes one non-duplicate item and names the tally it counts toward. */
|
|
220
|
-
function captureOne(ctx, item, entry) {
|
|
221
|
-
const { targetRoot, options, dryRunDb, writeDb, keys } = ctx;
|
|
222
|
-
if (options.dryRun) {
|
|
223
|
-
if (dryRunDb) {
|
|
224
|
-
try {
|
|
225
|
-
checkRejectionGuard(dryRunDb, entry.tenantId ?? 'default', entry.id, entry.content);
|
|
226
|
-
}
|
|
227
|
-
catch (err) {
|
|
228
|
-
if (err instanceof RejectedValueError) {
|
|
229
|
-
console.log(` [reject] (${item.category}) ${item.content.slice(0, 80)} - matches a rejected value`);
|
|
230
|
-
return 'rejected';
|
|
231
|
-
}
|
|
232
|
-
throw err;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
console.log(` [capture] (${item.category}) ${item.content}`);
|
|
236
|
-
}
|
|
237
|
-
else if (writeDb !== null) {
|
|
238
|
-
// One rejected item must not abort the rest of this capture's items.
|
|
239
|
-
const stamped = stampOriginProject(targetRoot, entry);
|
|
240
|
-
const outcome = gatedWrite(writeDb, targetRoot, stamped, { actor: options.actor });
|
|
241
|
-
if (outcome === 'skipped:rejected')
|
|
242
|
-
return 'rejected';
|
|
243
|
-
if (outcome !== 'written')
|
|
244
|
-
return 'skipped';
|
|
245
|
-
writeEntryMirrors(targetRoot, stamped);
|
|
246
|
-
if (!options.lean)
|
|
247
|
-
updateStatsOn(writeDb, targetRoot, { remembered: 1 });
|
|
248
|
-
keys.add(duplicateKey(item.content)); // within-batch dedup
|
|
249
|
-
if (!options.lean)
|
|
250
|
-
void embedMemory(targetRoot, entry);
|
|
251
|
-
}
|
|
252
|
-
return 'captured';
|
|
253
|
-
}
|
|
254
195
|
//# sourceMappingURL=command.js.map
|
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';
|
|
@@ -49,7 +51,8 @@ function isReadableFile(filePath) {
|
|
|
49
51
|
return false; // missing and unreadable both mean "no file" to the caller
|
|
50
52
|
}
|
|
51
53
|
}
|
|
52
|
-
/** 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. */
|
|
53
56
|
function printPreCompactInstruction(logFile) {
|
|
54
57
|
const text = `${PRE_COMPACT_INSTRUCTION}\n`;
|
|
55
58
|
try {
|
|
@@ -69,7 +72,8 @@ function snapshotJustSaved(hippoRoot, sessionId) {
|
|
|
69
72
|
const active = loadActiveTaskSnapshot(hippoRoot, resolveTenantId({}));
|
|
70
73
|
return active?.session_id === sessionId && active.source === 'pre-compact' && Date.now() - Date.parse(active.updated_at) < TWIN_FIRE_MS;
|
|
71
74
|
}
|
|
72
|
-
/** 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. */
|
|
73
77
|
function runPreCompact(hippoRoot, options, logFile) {
|
|
74
78
|
const { stdinText, stdinTimedOut = false, runtime = 'claude-code' } = options;
|
|
75
79
|
// PreCompact fires in every Claude Code project, including ones that never ran `hippo init`; gate before any call that would create a store.
|
|
@@ -103,7 +107,8 @@ function runPreCompact(hippoRoot, options, logFile) {
|
|
|
103
107
|
return;
|
|
104
108
|
saveDerivedSnapshot(hippoRoot, logFile, sessionId, recordId, derived);
|
|
105
109
|
}
|
|
106
|
-
/** 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. */
|
|
107
112
|
function markCompactionBoundary(hippoRoot, options, logFile, input, closable) {
|
|
108
113
|
const { sessionId } = input;
|
|
109
114
|
// The record is the "something saved before every compaction", so it lands even when no snapshot is derivable later.
|
|
@@ -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
|