hippo-memory 1.60.0 → 1.61.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 +1 -1
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/gemini.js +1 -1
- package/dist/agent-memories/legacy.js +1 -1
- package/dist/agent-memories/source.js +1 -1
- package/dist/agent-memories/sync.js +8 -3
- package/dist/ambient-store.d.ts +14 -0
- package/dist/ambient-store.js +90 -0
- package/dist/ambient.d.ts +23 -0
- package/dist/ambient.js +72 -50
- package/dist/api/assemble.d.ts +93 -0
- package/dist/api/assemble.js +152 -0
- package/dist/api/audit.d.ts +17 -0
- package/dist/api/audit.js +23 -0
- package/dist/api/auth.d.ts +79 -0
- package/dist/api/auth.js +178 -0
- package/dist/api/context-types.d.ts +105 -0
- package/dist/api/context-types.js +3 -0
- package/dist/api/context.d.ts +31 -0
- package/dist/api/context.js +705 -0
- package/dist/api/dormant.d.ts +30 -0
- package/dist/api/dormant.js +140 -0
- package/dist/api/drill-down.d.ts +84 -0
- package/dist/api/drill-down.js +123 -0
- package/dist/api/forget.d.ts +57 -0
- package/dist/api/forget.js +87 -0
- package/dist/api/goals.d.ts +18 -0
- package/dist/api/goals.js +33 -0
- package/dist/api/learn.d.ts +31 -0
- package/dist/api/learn.js +88 -0
- package/dist/api/outcome.d.ts +61 -0
- package/dist/api/outcome.js +66 -0
- package/dist/api/promote.d.ts +54 -0
- package/dist/api/promote.js +203 -0
- package/dist/api/quarantine.d.ts +24 -0
- package/dist/api/quarantine.js +121 -0
- package/dist/api/recall-types.d.ts +390 -0
- package/dist/api/recall-types.js +3 -0
- package/dist/api/recall.d.ts +36 -0
- package/dist/api/recall.js +634 -0
- package/dist/api/remember.d.ts +35 -0
- package/dist/api/remember.js +43 -0
- package/dist/api/sleep.d.ts +136 -0
- package/dist/api/sleep.js +271 -0
- package/dist/api/tokens.d.ts +26 -0
- package/dist/api/tokens.js +60 -0
- package/dist/api/types.d.ts +56 -0
- package/dist/api/types.js +38 -0
- package/dist/api.d.ts +20 -1262
- package/dist/api.js +25 -2727
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +6 -3
- package/dist/auth.d.ts +45 -4
- package/dist/auth.js +125 -48
- package/dist/autolearn.js +2 -2
- package/dist/capture/command.d.ts +33 -0
- package/dist/capture/command.js +264 -0
- package/dist/capture/compact.d.ts +44 -0
- package/dist/capture/compact.js +354 -0
- package/dist/capture/extract.d.ts +21 -0
- package/dist/capture/extract.js +464 -0
- package/dist/capture/transcript.d.ts +40 -0
- package/dist/capture/transcript.js +193 -0
- package/dist/capture-error.js +2 -1
- package/dist/churn-git.js +4 -2
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.js +159 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.js +171 -0
- package/dist/cli/briefs.d.ts +4 -0
- package/dist/cli/briefs.js +435 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +333 -0
- package/dist/cli/context.d.ts +15 -0
- package/dist/cli/context.js +366 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +445 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +555 -0
- package/dist/cli/dag.d.ts +5 -0
- package/dist/cli/dag.js +177 -0
- package/dist/cli/decisions.d.ts +4 -0
- package/dist/cli/decisions.js +528 -0
- package/dist/cli/eval.d.ts +5 -0
- package/dist/cli/eval.js +213 -0
- package/dist/cli/explain.d.ts +4 -0
- package/dist/cli/explain.js +150 -0
- package/dist/cli/goals.d.ts +2 -0
- package/dist/cli/goals.js +196 -0
- package/dist/cli/hook-blocks.d.ts +18 -0
- package/dist/cli/hook-blocks.js +233 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +305 -0
- package/dist/cli/maintenance.d.ts +4 -0
- package/dist/cli/maintenance.js +179 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +556 -0
- package/dist/cli/projects.js +1 -1
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +597 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +442 -0
- package/dist/cli/serve.d.ts +5 -0
- package/dist/cli/serve.js +40 -0
- package/dist/cli/session-hooks.d.ts +29 -0
- package/dist/cli/session-hooks.js +637 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +376 -0
- package/dist/cli/shared.d.ts +15 -19
- package/dist/cli/shared.js +50 -341
- package/dist/cli/slack.d.ts +2 -0
- package/dist/cli/slack.js +171 -0
- package/dist/cli/status.d.ts +18 -0
- package/dist/cli/status.js +400 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +438 -0
- package/dist/cli/usage.d.ts +85 -0
- package/dist/cli/usage.js +741 -0
- package/dist/cli.d.ts +71 -120
- package/dist/cli.js +170 -8469
- package/dist/client.js +15 -8
- package/dist/compaction-record.js +6 -4
- package/dist/connectors/github/backfill.js +94 -87
- package/dist/connectors/github/cli-impl.js +4 -3
- package/dist/connectors/github/dlq.js +67 -54
- package/dist/connectors/github/ingest.js +34 -35
- package/dist/connectors/github/tenant-routing.js +3 -2
- package/dist/connectors/github/webhook.js +135 -216
- package/dist/connectors/slack/dlq.js +49 -61
- package/dist/connectors/slack/ingest.js +55 -48
- package/dist/connectors/slack/tenant-routing.js +4 -3
- package/dist/connectors/slack/webhook.js +72 -74
- package/dist/consolidate/conflicts.d.ts +10 -0
- package/dist/consolidate/conflicts.js +178 -0
- package/dist/consolidate/decay.d.ts +12 -0
- package/dist/consolidate/decay.js +145 -0
- package/dist/consolidate/llm-passes.d.ts +3 -0
- package/dist/consolidate/llm-passes.js +141 -0
- package/dist/consolidate/merge.d.ts +7 -0
- package/dist/consolidate/merge.js +251 -0
- package/dist/consolidate/physics-pass.d.ts +3 -0
- package/dist/consolidate/physics-pass.js +60 -0
- package/dist/consolidate/run.d.ts +69 -0
- package/dist/consolidate/run.js +76 -0
- package/dist/consolidate/sleep.d.ts +18 -0
- package/dist/consolidate/sleep.js +209 -0
- package/dist/consolidate/traces.d.ts +4 -0
- package/dist/consolidate/traces.js +178 -0
- package/dist/context-auto.js +7 -11
- package/dist/context-render.d.ts +1 -1
- package/dist/context-render.js +1 -1
- package/dist/customer-notes.d.ts +3 -0
- package/dist/customer-notes.js +6 -4
- package/dist/dag.js +6 -5
- package/dist/dashboard-actions.d.ts +20 -0
- package/dist/dashboard-actions.js +88 -0
- package/dist/dashboard-params.d.ts +45 -0
- package/dist/dashboard-params.js +127 -0
- package/dist/dashboard-queries.d.ts +15 -0
- package/dist/dashboard-queries.js +355 -0
- package/dist/dashboard-snapshot.d.ts +138 -0
- package/dist/dashboard-snapshot.js +308 -0
- package/dist/dashboard-types.d.ts +163 -0
- package/dist/dashboard-types.js +3 -0
- package/dist/dashboard.d.ts +6 -7
- package/dist/dashboard.js +228 -202
- package/dist/db/busy.d.ts +5 -0
- package/dist/db/busy.js +24 -0
- package/dist/db/continuity.d.ts +5 -0
- package/dist/db/continuity.js +145 -0
- package/dist/db/meta.d.ts +8 -0
- package/dist/db/meta.js +35 -0
- package/dist/db/migrate.d.ts +9 -0
- package/dist/db/migrate.js +138 -0
- package/dist/db/migrations/index.d.ts +5 -0
- package/dist/db/migrations/index.js +109 -0
- package/dist/db/migrations/types.d.ts +14 -0
- package/dist/db/migrations/types.js +2 -0
- package/dist/db/migrations/v01.d.ts +3 -0
- package/dist/db/migrations/v01.js +38 -0
- package/dist/db/migrations/v02.d.ts +3 -0
- package/dist/db/migrations/v02.js +21 -0
- package/dist/db/migrations/v03.d.ts +3 -0
- package/dist/db/migrations/v03.js +22 -0
- package/dist/db/migrations/v04.d.ts +3 -0
- package/dist/db/migrations/v04.js +28 -0
- package/dist/db/migrations/v05.d.ts +3 -0
- package/dist/db/migrations/v05.js +21 -0
- package/dist/db/migrations/v06.d.ts +3 -0
- package/dist/db/migrations/v06.js +25 -0
- package/dist/db/migrations/v07.d.ts +3 -0
- package/dist/db/migrations/v07.js +13 -0
- package/dist/db/migrations/v08.d.ts +3 -0
- package/dist/db/migrations/v08.js +8 -0
- package/dist/db/migrations/v09.d.ts +3 -0
- package/dist/db/migrations/v09.js +13 -0
- package/dist/db/migrations/v10.d.ts +3 -0
- package/dist/db/migrations/v10.js +17 -0
- package/dist/db/migrations/v11.d.ts +3 -0
- package/dist/db/migrations/v11.js +15 -0
- package/dist/db/migrations/v12.d.ts +3 -0
- package/dist/db/migrations/v12.js +11 -0
- package/dist/db/migrations/v13.d.ts +3 -0
- package/dist/db/migrations/v13.js +15 -0
- package/dist/db/migrations/v14.d.ts +3 -0
- package/dist/db/migrations/v14.js +66 -0
- package/dist/db/migrations/v15.d.ts +3 -0
- package/dist/db/migrations/v15.js +42 -0
- package/dist/db/migrations/v16.d.ts +3 -0
- package/dist/db/migrations/v16.js +61 -0
- package/dist/db/migrations/v17.d.ts +3 -0
- package/dist/db/migrations/v17.js +46 -0
- package/dist/db/migrations/v18.d.ts +3 -0
- package/dist/db/migrations/v18.js +60 -0
- package/dist/db/migrations/v19.d.ts +3 -0
- package/dist/db/migrations/v19.js +28 -0
- package/dist/db/migrations/v20.d.ts +3 -0
- package/dist/db/migrations/v20.js +42 -0
- package/dist/db/migrations/v21.d.ts +3 -0
- package/dist/db/migrations/v21.js +16 -0
- package/dist/db/migrations/v22.d.ts +3 -0
- package/dist/db/migrations/v22.js +82 -0
- package/dist/db/migrations/v23.d.ts +3 -0
- package/dist/db/migrations/v23.js +48 -0
- package/dist/db/migrations/v24.d.ts +3 -0
- package/dist/db/migrations/v24.js +72 -0
- package/dist/db/migrations/v25.d.ts +3 -0
- package/dist/db/migrations/v25.js +46 -0
- package/dist/db/migrations/v26.d.ts +3 -0
- package/dist/db/migrations/v26.js +23 -0
- package/dist/db/migrations/v27.d.ts +3 -0
- package/dist/db/migrations/v27.js +57 -0
- package/dist/db/migrations/v28.d.ts +3 -0
- package/dist/db/migrations/v28.js +38 -0
- package/dist/db/migrations/v29.d.ts +3 -0
- package/dist/db/migrations/v29.js +78 -0
- package/dist/db/migrations/v30.d.ts +3 -0
- package/dist/db/migrations/v30.js +92 -0
- package/dist/db/migrations/v31.d.ts +3 -0
- package/dist/db/migrations/v31.js +74 -0
- package/dist/db/migrations/v32.d.ts +3 -0
- package/dist/db/migrations/v32.js +102 -0
- package/dist/db/migrations/v33.d.ts +3 -0
- package/dist/db/migrations/v33.js +104 -0
- package/dist/db/migrations/v34.d.ts +3 -0
- package/dist/db/migrations/v34.js +93 -0
- package/dist/db/migrations/v35.d.ts +3 -0
- package/dist/db/migrations/v35.js +98 -0
- package/dist/db/migrations/v36.d.ts +3 -0
- package/dist/db/migrations/v36.js +98 -0
- package/dist/db/migrations/v37.d.ts +3 -0
- package/dist/db/migrations/v37.js +219 -0
- package/dist/db/migrations/v38.d.ts +3 -0
- package/dist/db/migrations/v38.js +277 -0
- package/dist/db/migrations/v39.d.ts +3 -0
- package/dist/db/migrations/v39.js +59 -0
- package/dist/db/migrations/v40.d.ts +3 -0
- package/dist/db/migrations/v40.js +74 -0
- package/dist/db/migrations/v41.d.ts +3 -0
- package/dist/db/migrations/v41.js +43 -0
- package/dist/db/migrations/v42.d.ts +3 -0
- package/dist/db/migrations/v42.js +41 -0
- package/dist/db/migrations/v43.d.ts +3 -0
- package/dist/db/migrations/v43.js +67 -0
- package/dist/db/migrations/v44.d.ts +3 -0
- package/dist/db/migrations/v44.js +28 -0
- package/dist/db/migrations/v45.d.ts +3 -0
- package/dist/db/migrations/v45.js +30 -0
- package/dist/db/migrations/v46.d.ts +3 -0
- package/dist/db/migrations/v46.js +25 -0
- package/dist/db/migrations/v47.d.ts +3 -0
- package/dist/db/migrations/v47.js +17 -0
- package/dist/db/migrations/v48.d.ts +3 -0
- package/dist/db/migrations/v48.js +10 -0
- package/dist/db/migrations/v49.d.ts +3 -0
- package/dist/db/migrations/v49.js +31 -0
- package/dist/db/migrations/v50.d.ts +3 -0
- package/dist/db/migrations/v50.js +67 -0
- package/dist/db/migrations/v51.d.ts +3 -0
- package/dist/db/migrations/v51.js +14 -0
- package/dist/db/migrations/v52.d.ts +3 -0
- package/dist/db/migrations/v52.js +7 -0
- package/dist/db/open.d.ts +23 -0
- package/dist/db/open.js +146 -0
- package/dist/db/sqlite.d.ts +21 -0
- package/dist/db/sqlite.js +8 -0
- package/dist/db/tables.d.ts +7 -0
- package/dist/db/tables.js +38 -0
- package/dist/db.d.ts +6 -46
- package/dist/db.js +5 -3049
- package/dist/decisions.d.ts +4 -1
- package/dist/decisions.js +9 -7
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +4 -1
- package/dist/doctor.js +3 -3
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +4 -3
- package/dist/embeddings.d.ts +9 -52
- package/dist/embeddings.js +43 -297
- package/dist/env.d.ts +75 -0
- package/dist/env.js +119 -0
- package/dist/eval-suite.js +1 -1
- package/dist/eval.js +2 -2
- package/dist/extract.js +1 -1
- package/dist/gated-write.js +3 -1
- package/dist/goals.d.ts +3 -1
- package/dist/goals.js +18 -0
- package/dist/graph/read.d.ts +73 -0
- package/dist/graph/read.js +325 -0
- package/dist/graph/rows.d.ts +45 -0
- package/dist/graph/rows.js +51 -0
- package/dist/graph/types.d.ts +83 -0
- package/dist/graph/types.js +11 -0
- package/dist/graph/write.d.ts +93 -0
- package/dist/{graph.js → graph/write.js} +6 -384
- package/dist/graph-extract.js +2 -1
- package/dist/graph-recall.d.ts +1 -1
- package/dist/graph-recall.js +2 -2
- package/dist/graph-stream.js +1 -1
- package/dist/graph-view.d.ts +1 -1
- package/dist/graph-view.js +1 -1
- package/dist/half-life-migration.d.ts +1 -1
- package/dist/half-life-migration.js +2 -1
- package/dist/hooks/codex-session.d.ts +8 -0
- package/dist/hooks/codex-session.js +76 -0
- package/dist/hooks/codex-wrapper.d.ts +55 -0
- package/dist/hooks/codex-wrapper.js +288 -0
- package/dist/hooks/json-hooks.d.ts +63 -0
- package/dist/hooks/json-hooks.js +356 -0
- package/dist/hooks/opencode.d.ts +50 -0
- package/dist/hooks/opencode.js +202 -0
- package/dist/hooks/shared.d.ts +54 -0
- package/dist/hooks/shared.js +77 -0
- package/dist/http-retry.d.ts +2 -0
- package/dist/http-retry.js +4 -3
- package/dist/http-util.d.ts +3 -0
- package/dist/http-util.js +10 -0
- package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
- package/dist/importers/core.js +141 -0
- package/dist/importers/markdown-parse.d.ts +41 -0
- package/dist/importers/markdown-parse.js +132 -0
- package/dist/importers/markdown.d.ts +3 -0
- package/dist/importers/markdown.js +92 -0
- package/dist/importers/sources.d.ts +7 -0
- package/dist/importers/sources.js +229 -0
- package/dist/importers/vault.d.ts +11 -0
- package/dist/importers/vault.js +352 -0
- package/dist/incidents.d.ts +3 -0
- package/dist/incidents.js +7 -5
- package/dist/index.d.ts +25 -6
- package/dist/index.js +23 -6
- package/dist/invalidation.js +2 -1
- package/dist/judgment.js +2 -1
- package/dist/keyset.d.ts +13 -0
- package/dist/keyset.js +8 -0
- package/dist/local-embedding.d.ts +13 -0
- package/dist/local-embedding.js +165 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +19 -1
- package/dist/mcp/admin-tools.d.ts +8 -0
- package/dist/mcp/admin-tools.js +116 -0
- package/dist/mcp/format.d.ts +27 -0
- package/dist/mcp/format.js +135 -0
- package/dist/mcp/memory-tools.d.ts +5 -0
- package/dist/mcp/memory-tools.js +83 -0
- package/dist/mcp/protocol.d.ts +83 -0
- package/dist/mcp/protocol.js +55 -0
- package/dist/mcp/recall-tools.d.ts +6 -0
- package/dist/mcp/recall-tools.js +320 -0
- package/dist/mcp/request.d.ts +10 -0
- package/dist/mcp/request.js +163 -0
- package/dist/mcp/server.d.ts +4 -75
- package/dist/mcp/server.js +7 -1190
- package/dist/mcp/session-state.d.ts +11 -0
- package/dist/mcp/session-state.js +28 -0
- package/dist/mcp/stdio.d.ts +8 -0
- package/dist/mcp/stdio.js +79 -0
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.js +247 -0
- package/dist/memory.d.ts +3 -0
- package/dist/memory.js +27 -1
- package/dist/multihop.d.ts +1 -1
- package/dist/multihop.js +2 -1
- package/dist/owner-validation.js +2 -1
- package/dist/physics-state.js +10 -7
- package/dist/policies.d.ts +3 -0
- package/dist/policies.js +8 -6
- package/dist/postinstall.js +3 -2
- package/dist/predictions/planning-fallacy.d.ts +100 -0
- package/dist/predictions/planning-fallacy.js +190 -0
- package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
- package/dist/predictions/store.js +434 -0
- package/dist/processes.d.ts +3 -0
- package/dist/processes.js +7 -5
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +7 -5
- package/dist/project-identity.js +3 -2
- package/dist/project-merge.js +3 -1
- package/dist/quarantine.d.ts +2 -1
- package/dist/quarantine.js +8 -5
- package/dist/raw-archive.js +1 -1
- package/dist/recall-history.js +3 -2
- package/dist/recall-pipeline.d.ts +2 -2
- package/dist/recall-pipeline.js +16 -8
- package/dist/recall-scope.js +1 -1
- package/dist/recall-trace.d.ts +1 -1
- package/dist/refine-llm.js +2 -1
- package/dist/reject-flow.js +6 -1
- package/dist/rerankers/clef.js +6 -5
- package/dist/rerankers/jev.d.ts +1 -1
- package/dist/rerankers/jev.js +4 -4
- package/dist/rerankers/llm.d.ts +4 -2
- package/dist/rerankers/llm.js +58 -38
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/salience.js +1 -1
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.js +26 -4
- package/dist/scope.js +4 -3
- package/dist/search/as-of.d.ts +10 -0
- package/dist/search/as-of.js +22 -0
- package/dist/search/bm25-search.d.ts +14 -0
- package/dist/search/bm25-search.js +43 -0
- package/dist/search/bm25.d.ts +15 -0
- package/dist/search/bm25.js +54 -0
- package/dist/search/boosts.d.ts +54 -0
- package/dist/search/boosts.js +94 -0
- package/dist/search/breakdown.d.ts +7 -0
- package/dist/search/breakdown.js +20 -0
- package/dist/search/explain.d.ts +25 -0
- package/dist/search/explain.js +31 -0
- package/dist/search/finalize.d.ts +8 -0
- package/dist/search/finalize.js +52 -0
- package/dist/search/fusion.d.ts +27 -0
- package/dist/search/fusion.js +42 -0
- package/dist/search/hybrid-score.d.ts +20 -0
- package/dist/search/hybrid-score.js +73 -0
- package/dist/search/hybrid.d.ts +46 -0
- package/dist/search/hybrid.js +64 -0
- package/dist/search/physics-search.d.ts +29 -0
- package/dist/search/physics-search.js +162 -0
- package/dist/search/rerank.d.ts +10 -0
- package/dist/search/rerank.js +72 -0
- package/dist/search/temporal.d.ts +15 -0
- package/dist/search/temporal.js +45 -0
- package/dist/search/types.d.ts +91 -0
- package/dist/search/types.js +2 -0
- package/dist/search/vector.d.ts +30 -0
- package/dist/search/vector.js +71 -0
- package/dist/secret-detect.d.ts +2 -0
- package/dist/secret-detect.js +2 -1
- package/dist/server/auth.d.ts +52 -0
- package/dist/server/auth.js +221 -0
- package/dist/server/client-ip.d.ts +25 -0
- package/dist/server/client-ip.js +92 -0
- package/dist/server/cursor.d.ts +23 -0
- package/dist/server/cursor.js +58 -0
- package/dist/server/lifecycle.d.ts +7 -0
- package/dist/server/lifecycle.js +29 -0
- package/dist/server/mcp-http.d.ts +5 -0
- package/dist/server/mcp-http.js +199 -0
- package/dist/server/request.d.ts +33 -0
- package/dist/server/request.js +103 -0
- package/dist/server/routes/admin.d.ts +9 -0
- package/dist/server/routes/admin.js +158 -0
- package/dist/server/routes/customer-notes.d.ts +7 -0
- package/dist/server/routes/customer-notes.js +112 -0
- package/dist/server/routes/decisions.d.ts +7 -0
- package/dist/server/routes/decisions.js +133 -0
- package/dist/server/routes/incidents.d.ts +7 -0
- package/dist/server/routes/incidents.js +126 -0
- package/dist/server/routes/memories.d.ts +10 -0
- package/dist/server/routes/memories.js +179 -0
- package/dist/server/routes/policies.d.ts +8 -0
- package/dist/server/routes/policies.js +151 -0
- package/dist/server/routes/predictions.d.ts +7 -0
- package/dist/server/routes/predictions.js +164 -0
- package/dist/server/routes/processes.d.ts +7 -0
- package/dist/server/routes/processes.js +161 -0
- package/dist/server/routes/project-briefs.d.ts +8 -0
- package/dist/server/routes/project-briefs.js +136 -0
- package/dist/server/routes/recall.d.ts +8 -0
- package/dist/server/routes/recall.js +340 -0
- package/dist/server/routes/skills.d.ts +8 -0
- package/dist/server/routes/skills.js +150 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/types.js +2 -0
- package/dist/server/validation.d.ts +14 -0
- package/dist/server/validation.js +91 -0
- package/dist/server.d.ts +7 -61
- package/dist/server.js +69 -2362
- package/dist/session-digest.d.ts +1 -1
- package/dist/session-digest.js +9 -2
- package/dist/shared.d.ts +3 -1
- package/dist/shared.js +26 -22
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +7 -5
- package/dist/stdin.js +2 -2
- package/dist/store/audit-event.d.ts +19 -0
- package/dist/store/audit-event.js +33 -0
- package/dist/store/candidates.d.ts +42 -0
- package/dist/store/candidates.js +152 -0
- package/dist/store/conflicts.d.ts +44 -0
- package/dist/store/conflicts.js +444 -0
- package/dist/store/delete-and-batch.d.ts +63 -0
- package/dist/store/delete-and-batch.js +310 -0
- package/dist/store/entry-reads.d.ts +92 -0
- package/dist/store/entry-reads.js +255 -0
- package/dist/store/entry-row.d.ts +67 -0
- package/dist/store/entry-row.js +208 -0
- package/dist/store/entry-writes.d.ts +46 -0
- package/dist/store/entry-writes.js +148 -0
- package/dist/store/handoffs.d.ts +26 -0
- package/dist/store/handoffs.js +184 -0
- package/dist/store/index-and-stats.d.ts +52 -0
- package/dist/store/index-and-stats.js +214 -0
- package/dist/store/markdown.d.ts +10 -0
- package/dist/store/markdown.js +108 -0
- package/dist/store/mirrors.d.ts +49 -0
- package/dist/store/mirrors.js +312 -0
- package/dist/store/open.d.ts +15 -0
- package/dist/store/open.js +223 -0
- package/dist/store/rows.d.ts +178 -0
- package/dist/store/rows.js +158 -0
- package/dist/store/search-rows.d.ts +86 -0
- package/dist/store/search-rows.js +254 -0
- package/dist/store/sessions.d.ts +83 -0
- package/dist/store/sessions.js +272 -0
- package/dist/store/summaries.d.ts +94 -0
- package/dist/store/summaries.js +377 -0
- package/dist/store/tenant-lookup.d.ts +12 -0
- package/dist/store/tenant-lookup.js +16 -0
- package/dist/store-cards.js +2 -1
- package/dist/summary-dirty.d.ts +4 -0
- package/dist/summary-dirty.js +32 -0
- package/dist/support-bundle.js +4 -3
- package/dist/tenant.js +2 -2
- package/dist/tokenize.d.ts +2 -0
- package/dist/tokenize.js +16 -0
- package/dist/transcript-tail.d.ts +7 -0
- package/dist/transcript-tail.js +48 -0
- package/dist/vector-store.d.ts +27 -0
- package/dist/vector-store.js +210 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/dist/working-memory.js +1 -1
- package/dist/yaml.js +36 -11
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist-ui/assets/index-DPN7cP19.js +33 -0
- package/dist-ui/assets/index-dFloKRVr.css +1 -0
- package/dist-ui/index.html +3 -25
- 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 +1 -1
- package/dist/capture.d.ts +0 -155
- package/dist/capture.js +0 -1295
- package/dist/consolidate.d.ts +0 -58
- package/dist/consolidate.js +0 -1124
- package/dist/graph.d.ts +0 -245
- package/dist/hooks.d.ts +0 -208
- package/dist/hooks.js +0 -1076
- package/dist/importers.js +0 -900
- package/dist/predictions.js +0 -620
- package/dist/search.d.ts +0 -320
- package/dist/search.js +0 -970
- package/dist/store.d.ts +0 -776
- package/dist/store.js +0 -3473
- package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
- package/dist-ui/assets/index-BhT8RvO6.js +0 -61
- package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
- package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
// The `hippo context` verb, which the per-prompt hook also runs; main() loads it lazily from the command table.
|
|
2
|
+
import { evalNow } from '../ablation.js';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { isInitialized } from '../store/open.js';
|
|
5
|
+
import { writeDeliveryEventAtRoot, writeDeliveryEventOnHandle } from '../recall-trace.js';
|
|
6
|
+
import { createDeliveryRecorder } from '../delivery-recorder.js';
|
|
7
|
+
import { loadConfig } from '../config.js';
|
|
8
|
+
import { isSqliteBusy, noteStoreBusy } from '../db.js';
|
|
9
|
+
import { blockHash, estimateTokens, isSubagentPayload, lastSentState, recordTokenUse, shouldSkipUnchanged, } from '../token-ledger.js';
|
|
10
|
+
import { isGlobalStoreRoot } from '../project-identity.js';
|
|
11
|
+
import { autoDetectContext } from '../context-auto.js';
|
|
12
|
+
import { detectScope } from '../scope.js';
|
|
13
|
+
import { getGlobalRoot } from '../shared.js';
|
|
14
|
+
import { readStdinBounded } from '../stdin.js';
|
|
15
|
+
import * as api from '../api.js';
|
|
16
|
+
import { resolveTenantId } from '../tenant.js';
|
|
17
|
+
import { renderAmbientSummary } from '../ambient.js';
|
|
18
|
+
import { contextCost, contextHeading, contextLine, crossProjectHeading, crossProjectLine, settleTokens, } from '../context-render.js';
|
|
19
|
+
import { printError } from './output.js';
|
|
20
|
+
import { parseLimitFlag, parseCountFlag, parseBudgetFlag, requireInit, printActiveTaskSnapshot, printSessionEvents, printHandoff, hostSessionId, captureConsole, hookStoreRoot, withLedgerDb, runHookWithStores, inPilotHoldout, } from './shared.js';
|
|
21
|
+
export async function cmdContext(hippoRoot, args, flags, stdinText) {
|
|
22
|
+
const rec = startDeliveryRecorder(hippoRoot, flags, stdinText);
|
|
23
|
+
// No try/finally: a render throw keeps its own exit code and writes no event.
|
|
24
|
+
await renderContext(hippoRoot, args, flags, stdinText, rec);
|
|
25
|
+
flushDeliveryRecorder(rec);
|
|
26
|
+
}
|
|
27
|
+
/** A delivery recorder for a pinned-only call when its ledger store enables one, else null; never throws. */
|
|
28
|
+
function startDeliveryRecorder(hippoRoot, flags, stdinText) {
|
|
29
|
+
if (flags['pinned-only'] !== true)
|
|
30
|
+
return null;
|
|
31
|
+
try {
|
|
32
|
+
// The same store withLedgerDb writes the token ledger to, so its config governs both.
|
|
33
|
+
const root = isInitialized(hippoRoot) ? hippoRoot : isInitialized(getGlobalRoot()) ? getGlobalRoot() : null;
|
|
34
|
+
if (root === null || !loadConfig(root).deliveryLedger.enabled)
|
|
35
|
+
return null;
|
|
36
|
+
return createDeliveryRecorder({
|
|
37
|
+
root,
|
|
38
|
+
storeHash: blockHash(path.resolve(root)),
|
|
39
|
+
writeStore: isGlobalStoreRoot(root) ? 'global' : 'local',
|
|
40
|
+
tenantId: resolveTenantId({}),
|
|
41
|
+
stdinText,
|
|
42
|
+
envSessionId: hostSessionId(),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
// The hook's one-line stderr contract pins this exact text, so it bypasses the leveled logger.
|
|
47
|
+
printError(`[hippo] delivery ledger skipped:${error instanceof Error ? error.message : String(error)}`);
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** With `db`, writes on the token ledger's handle (same store); without it, opens its own. A second flush is a no-op. */
|
|
52
|
+
function flushDeliveryRecorder(rec, db) {
|
|
53
|
+
if (rec === null)
|
|
54
|
+
return;
|
|
55
|
+
try {
|
|
56
|
+
rec.flush((input) => (db ? writeDeliveryEventOnHandle(db, input) : writeDeliveryEventAtRoot(rec.root, input)));
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// Pinned stderr text, as in the recorder build above.
|
|
60
|
+
printError(`[hippo] delivery ledger write failed:${error instanceof Error ? error.message : String(error)}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** The hook payload's session id and raw prompt; a malformed or empty payload yields neither. */
|
|
64
|
+
function readHookPayload(stdinText) {
|
|
65
|
+
let sessionId;
|
|
66
|
+
let prompt;
|
|
67
|
+
if (stdinText && stdinText.trim() !== '') {
|
|
68
|
+
try {
|
|
69
|
+
// SAFETY: both fields are type-checked below before use; `?? {}` covers a JSON null payload.
|
|
70
|
+
const { session_id: sid, prompt: raw } = (JSON.parse(stdinText.trim()) ?? {});
|
|
71
|
+
if (typeof sid === 'string' && sid.trim() !== '')
|
|
72
|
+
sessionId = sid;
|
|
73
|
+
if (typeof raw === 'string')
|
|
74
|
+
prompt = raw;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Malformed/non-JSON stdin: fall through to the env fallback below.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { sessionId, prompt };
|
|
81
|
+
}
|
|
82
|
+
async function renderContext(hippoRoot, args, flags, stdinText, rec) {
|
|
83
|
+
// --pinned-only fires on every prompt, even where no local .hippo exists, so it skips requireInit
|
|
84
|
+
// and api.getContext falls back to global-only.
|
|
85
|
+
const pinnedOnly = flags['pinned-only'] === true;
|
|
86
|
+
if (!pinnedOnly) {
|
|
87
|
+
requireInit(hippoRoot);
|
|
88
|
+
}
|
|
89
|
+
// The session id bounds the active-task-snapshot read: the stdin hook payload wins, then hostSessionId();
|
|
90
|
+
// absent both, api.getContext applies the pure freshness bound.
|
|
91
|
+
const payload = readHookPayload(stdinText);
|
|
92
|
+
let payloadSessionId = payload.sessionId;
|
|
93
|
+
const currentSessionId = payloadSessionId ?? hostSessionId();
|
|
94
|
+
// A sub-agent's payload and env both carry its parent's session id, so it books no session and never skips a block.
|
|
95
|
+
const subagent = isSubagentPayload(stdinText);
|
|
96
|
+
const ledgerSessionId = subagent ? undefined : currentSessionId;
|
|
97
|
+
if (subagent)
|
|
98
|
+
payloadSessionId = undefined;
|
|
99
|
+
// The pilot arm is booked at the first hook call whatever the flags, so the holdout sees no budget or content branch.
|
|
100
|
+
const resolvedTenant = resolveTenantId({});
|
|
101
|
+
if (inPilotHoldout(hippoRoot, resolvedTenant, currentSessionId, payloadSessionId !== undefined)) {
|
|
102
|
+
rec?.disabled();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const budget = parseBudgetFlag(flags['budget'], 1500);
|
|
106
|
+
if (budget <= 0) {
|
|
107
|
+
rec?.disabled();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// --auto shells out to git, so it stays CLI-side; api.getContext stays host-agnostic and falls back to '*'.
|
|
111
|
+
let query = args.join(' ').trim();
|
|
112
|
+
if (!query && flags['auto']) {
|
|
113
|
+
query = autoDetectContext();
|
|
114
|
+
}
|
|
115
|
+
// Scope detection uses cwd, so it is resolved here and passed in via opts.scope.
|
|
116
|
+
const ctxExplicitScope = flags['scope'] !== undefined ? String(flags['scope']).trim() : null;
|
|
117
|
+
const ctxActiveScope = ctxExplicitScope || detectScope();
|
|
118
|
+
const ctx = {
|
|
119
|
+
hippoRoot,
|
|
120
|
+
tenantId: resolvedTenant,
|
|
121
|
+
actor: api.adminActor('cli'),
|
|
122
|
+
};
|
|
123
|
+
// --cross-project re-includes other-project memories, rendered under their own section.
|
|
124
|
+
const crossProject = flags['cross-project'] === true;
|
|
125
|
+
const format = String(flags['format'] ?? 'markdown');
|
|
126
|
+
const framing = String(flags['framing'] ?? 'observe');
|
|
127
|
+
const opts = {
|
|
128
|
+
q: query,
|
|
129
|
+
budget,
|
|
130
|
+
limit: parseLimitFlag(flags['limit']),
|
|
131
|
+
pinnedOnly,
|
|
132
|
+
scope: ctxActiveScope ?? undefined,
|
|
133
|
+
includeRecent: parseCountFlag(flags['include-recent']),
|
|
134
|
+
crossProject,
|
|
135
|
+
currentSessionId,
|
|
136
|
+
prompt: payload.prompt,
|
|
137
|
+
// JSON is budgeted as the markdown it stands for, so one budget picks the same memories in every format.
|
|
138
|
+
cost: contextCost(format === 'additional-context' ? 'additional-context' : 'markdown', framing),
|
|
139
|
+
deliveryObserver: rec ?? undefined,
|
|
140
|
+
};
|
|
141
|
+
const result = await api.getContext(ctx, opts);
|
|
142
|
+
const hasContextData = result.entries.length > 0 ||
|
|
143
|
+
result.activeSnapshot ||
|
|
144
|
+
result.sessionHandoff ||
|
|
145
|
+
(result.recentEvents && result.recentEvents.length > 0);
|
|
146
|
+
if (!hasContextData) {
|
|
147
|
+
rec?.delivered({ state: 'empty' });
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const view = { hippoRoot, tenantId: ctx.tenantId, ledgerSessionId, payloadSessionId, pinnedOnly, framing, rec, result };
|
|
151
|
+
if (format === 'json') {
|
|
152
|
+
renderContextJson(view, query);
|
|
153
|
+
}
|
|
154
|
+
else if (format === 'additional-context') {
|
|
155
|
+
renderAdditionalContext(view);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
renderContextMarkdown(view);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function toRenderItems(entries) {
|
|
162
|
+
return entries.map((r) => ({ entry: r.entry, score: r.score, tokens: r.tokens, isGlobal: r.isGlobal ?? false }));
|
|
163
|
+
}
|
|
164
|
+
function renderContextJson(view, query) {
|
|
165
|
+
const { result, rec } = view;
|
|
166
|
+
const output = result.entries.map((r) => ({
|
|
167
|
+
id: r.entry.id,
|
|
168
|
+
score: r.score,
|
|
169
|
+
strength: r.entry.strength,
|
|
170
|
+
tags: r.entry.tags,
|
|
171
|
+
confidence: r.entry.confidence,
|
|
172
|
+
content: r.entry.content,
|
|
173
|
+
global: r.isGlobal ?? false,
|
|
174
|
+
origin: r.origin ?? null,
|
|
175
|
+
category: r.category ?? null,
|
|
176
|
+
}));
|
|
177
|
+
const jsonText = JSON.stringify({
|
|
178
|
+
query: query || '*',
|
|
179
|
+
activeSnapshot: result.activeSnapshot ?? null,
|
|
180
|
+
sessionHandoff: result.sessionHandoff ?? null,
|
|
181
|
+
recentSessionEvents: result.recentEvents ?? [],
|
|
182
|
+
memories: output,
|
|
183
|
+
tokens: result.tokens,
|
|
184
|
+
});
|
|
185
|
+
console.log(jsonText);
|
|
186
|
+
rec?.delivered({ state: 'sent', emittedText: `${jsonText}\n` });
|
|
187
|
+
withLedgerDb(view.hippoRoot, (db) => {
|
|
188
|
+
recordTokenUse(db, {
|
|
189
|
+
tenantId: view.tenantId, sessionId: view.ledgerSessionId, surface: view.pinnedOnly ? 'hook' : 'context',
|
|
190
|
+
event: 'inject', items: output.length, tokens: estimateTokens(jsonText),
|
|
191
|
+
});
|
|
192
|
+
flushDeliveryRecorder(rec, db);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
/** The hook format: a skippable static block (snapshot, handoff, events, pins, recent-N) and a never-skipped recall block. */
|
|
196
|
+
function renderAdditionalContext(view) {
|
|
197
|
+
const { result, rec, framing } = view;
|
|
198
|
+
const staticEntries = result.entries.filter((r) => r.category !== 'cross-project' && !r.promptRecall);
|
|
199
|
+
const staticCrossEntries = result.entries.filter((r) => r.category === 'cross-project' && !r.promptRecall);
|
|
200
|
+
const staticItems = toRenderItems(staticEntries);
|
|
201
|
+
const recallItems = toRenderItems(result.entries.filter((r) => r.promptRecall));
|
|
202
|
+
const staticBlock = settleTokens((t) => captureConsole(() => {
|
|
203
|
+
if (result.activeSnapshot)
|
|
204
|
+
printActiveTaskSnapshot(result.activeSnapshot);
|
|
205
|
+
if (result.sessionHandoff)
|
|
206
|
+
printHandoff(result.sessionHandoff);
|
|
207
|
+
if (result.recentEvents && result.recentEvents.length > 0) {
|
|
208
|
+
printSessionEvents(result.recentEvents);
|
|
209
|
+
}
|
|
210
|
+
// No live strength percentage, so an unchanged set of memories renders byte-identically turn after turn.
|
|
211
|
+
if (staticItems.length > 0)
|
|
212
|
+
printContextMarkdown(staticItems, t, framing, { showStrength: false });
|
|
213
|
+
printCrossProjectSection(staticCrossEntries);
|
|
214
|
+
}));
|
|
215
|
+
const recallBlock = recallItems.length > 0
|
|
216
|
+
? settleTokens((t) => captureConsole(() => printContextMarkdown(recallItems, t, framing, { showStrength: false, heading: 'Prompt-Relevant Memory' })))
|
|
217
|
+
: '';
|
|
218
|
+
if (!staticBlock.trim() && !recallBlock.trim()) {
|
|
219
|
+
rec?.delivered({ state: 'empty' });
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const surface = view.pinnedOnly ? 'hook' : 'context';
|
|
223
|
+
const sendStatic = staticBlock.trim().length > 0 && !skipUnchangedStatic(view, surface, staticBlock, recallBlock, staticItems.length);
|
|
224
|
+
const finalStatic = sendStatic ? staticBlock : '';
|
|
225
|
+
const additionalContext = finalStatic && recallBlock
|
|
226
|
+
? `${finalStatic}\n\n${recallBlock}`
|
|
227
|
+
: finalStatic || recallBlock;
|
|
228
|
+
const staticReused = !sendStatic && staticBlock.trim().length > 0;
|
|
229
|
+
if (!additionalContext.trim()) {
|
|
230
|
+
rec?.delivered({ state: 'reused', staticHash: blockHash(staticBlock), staticReused });
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const payload = {
|
|
234
|
+
hookSpecificOutput: {
|
|
235
|
+
hookEventName: 'UserPromptSubmit',
|
|
236
|
+
additionalContext,
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
process.stdout.write(JSON.stringify(payload));
|
|
240
|
+
rec?.delivered({
|
|
241
|
+
state: staticReused ? 'reused-recall-sent' : 'sent',
|
|
242
|
+
staticHash: staticBlock.trim() ? blockHash(staticBlock) : null,
|
|
243
|
+
recallHash: recallBlock ? blockHash(recallBlock) : null,
|
|
244
|
+
emittedText: additionalContext,
|
|
245
|
+
staticReused,
|
|
246
|
+
});
|
|
247
|
+
if (finalStatic || recallBlock) {
|
|
248
|
+
recordAdditionalContextRows(view, surface, { text: finalStatic, items: staticItems.length }, { text: recallBlock, items: recallItems.length });
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/** True, after booking the skip row, when the hook may omit a static block this session already holds. */
|
|
252
|
+
function skipUnchangedStatic(view, surface, staticBlock, recallBlock, staticCount) {
|
|
253
|
+
const { hippoRoot, payloadSessionId, rec } = view;
|
|
254
|
+
if (!view.pinnedOnly || payloadSessionId === undefined)
|
|
255
|
+
return false;
|
|
256
|
+
const injectCfg = loadConfig(hippoRoot).pinnedInject;
|
|
257
|
+
if (injectCfg.skipUnchanged === false)
|
|
258
|
+
return false;
|
|
259
|
+
const refreshTurns = Number.isFinite(injectCfg.refreshTurns) && injectCfg.refreshTurns >= 0
|
|
260
|
+
? injectCfg.refreshTurns
|
|
261
|
+
: 10;
|
|
262
|
+
// Hashed on the static text alone so an unchanged pin set still skips while recall varies.
|
|
263
|
+
const staticHash = blockHash(staticBlock);
|
|
264
|
+
const last = withLedgerDb(hippoRoot, (db) => lastSentState(db, view.tenantId, payloadSessionId, surface));
|
|
265
|
+
if (!shouldSkipUnchanged(last ?? null, staticHash, refreshTurns))
|
|
266
|
+
return false;
|
|
267
|
+
withLedgerDb(hippoRoot, (db) => {
|
|
268
|
+
recordTokenUse(db, {
|
|
269
|
+
tenantId: view.tenantId, sessionId: payloadSessionId, surface, event: 'skip',
|
|
270
|
+
items: staticCount, tokens: estimateTokens(staticBlock), hash: staticHash,
|
|
271
|
+
});
|
|
272
|
+
if (recallBlock.trim())
|
|
273
|
+
return;
|
|
274
|
+
rec?.delivered({ state: 'reused', staticHash, staticReused: true });
|
|
275
|
+
flushDeliveryRecorder(rec, db);
|
|
276
|
+
});
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
/** One connection for both rows; each insert in its own try so one failing doesn't skip the other. */
|
|
280
|
+
function recordAdditionalContextRows(view, surface, staticPart, recallPart) {
|
|
281
|
+
withLedgerDb(view.hippoRoot, (db) => {
|
|
282
|
+
if (staticPart.text) {
|
|
283
|
+
try {
|
|
284
|
+
recordTokenUse(db, {
|
|
285
|
+
tenantId: view.tenantId, sessionId: view.ledgerSessionId, surface, event: 'inject',
|
|
286
|
+
items: staticPart.items, tokens: estimateTokens(staticPart.text), hash: blockHash(staticPart.text),
|
|
287
|
+
});
|
|
288
|
+
// Best-effort row: only a busy store is actionable, and a ledger failure must not break the hook.
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
if (isSqliteBusy(error))
|
|
292
|
+
noteStoreBusy('token ledger row skipped');
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (recallPart.text) {
|
|
296
|
+
try {
|
|
297
|
+
recordTokenUse(db, {
|
|
298
|
+
tenantId: view.tenantId, sessionId: view.ledgerSessionId, surface: 'hook_recall', event: 'inject',
|
|
299
|
+
items: recallPart.items, tokens: estimateTokens(recallPart.text), hash: blockHash(recallPart.text),
|
|
300
|
+
});
|
|
301
|
+
// Same best-effort rule as the inject row above.
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
if (isSqliteBusy(error))
|
|
305
|
+
noteStoreBusy('token ledger row skipped');
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
flushDeliveryRecorder(view.rec, db);
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
/** The default format; the header figure counts the whole block, sections included, as the ledger does. */
|
|
312
|
+
function renderContextMarkdown(view) {
|
|
313
|
+
const { result, rec, framing } = view;
|
|
314
|
+
// Cross-project inclusions get their own section so they never masquerade as project memory.
|
|
315
|
+
const renderItems = toRenderItems(result.entries.filter((r) => r.category !== 'cross-project'));
|
|
316
|
+
const crossEntries = result.entries.filter((r) => r.category === 'cross-project');
|
|
317
|
+
const text = settleTokens((t) => captureConsole(() => {
|
|
318
|
+
if (result.activeSnapshot) {
|
|
319
|
+
printActiveTaskSnapshot(result.activeSnapshot);
|
|
320
|
+
}
|
|
321
|
+
if (result.sessionHandoff) {
|
|
322
|
+
printHandoff(result.sessionHandoff);
|
|
323
|
+
}
|
|
324
|
+
if (result.recentEvents && result.recentEvents.length > 0) {
|
|
325
|
+
printSessionEvents(result.recentEvents);
|
|
326
|
+
}
|
|
327
|
+
if (renderItems.length > 0)
|
|
328
|
+
printContextMarkdown(renderItems, t, framing);
|
|
329
|
+
printCrossProjectSection(crossEntries);
|
|
330
|
+
if (result.ambientState) {
|
|
331
|
+
console.log(`\n${renderAmbientSummary(result.ambientState)}`);
|
|
332
|
+
}
|
|
333
|
+
}));
|
|
334
|
+
if (text.length > 0)
|
|
335
|
+
console.log(text);
|
|
336
|
+
rec?.delivered(text.length > 0 ? { state: 'sent', emittedText: `${text}\n` } : { state: 'empty' });
|
|
337
|
+
withLedgerDb(view.hippoRoot, (db) => {
|
|
338
|
+
recordTokenUse(db, {
|
|
339
|
+
tenantId: view.tenantId, sessionId: view.ledgerSessionId, surface: view.pinnedOnly ? 'hook' : 'context',
|
|
340
|
+
event: 'inject', items: renderItems.length, tokens: estimateTokens(text),
|
|
341
|
+
});
|
|
342
|
+
flushDeliveryRecorder(rec, db);
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
/** An explicit header lets agents and humans tell borrowed context from project memory. */
|
|
346
|
+
function printCrossProjectSection(items) {
|
|
347
|
+
if (items.length === 0)
|
|
348
|
+
return;
|
|
349
|
+
console.log(crossProjectHeading(items.length));
|
|
350
|
+
for (const item of items)
|
|
351
|
+
console.log(crossProjectLine(item));
|
|
352
|
+
}
|
|
353
|
+
/** @internal Exported for the render snapshot test; not a stable public API. */
|
|
354
|
+
export function printContextMarkdown(items, totalTokens, framing = 'observe', opts = {}) {
|
|
355
|
+
const now = evalNow();
|
|
356
|
+
const showStrength = opts.showStrength !== false;
|
|
357
|
+
console.log(contextHeading(opts.heading ?? 'Project Memory', items.length, totalTokens));
|
|
358
|
+
for (const item of items)
|
|
359
|
+
console.log(contextLine(item, framing, showStrength, now));
|
|
360
|
+
}
|
|
361
|
+
export async function handleContext({ hippoRoot, args, flags }) {
|
|
362
|
+
// Bounded, not a TTY guard: the hot stdin path and a manual run share this one command.
|
|
363
|
+
const { text: stdinText } = await readStdinBounded();
|
|
364
|
+
await runHookWithStores(() => cmdContext(hookStoreRoot(hippoRoot), args, flags, stdinText));
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function cmdSnapshot(hippoRoot: string, args: string[], flags: Record<string, string | boolean | string[]>): void;
|
|
2
|
+
export declare function cmdSession(hippoRoot: string, args: string[], flags: Record<string, string | boolean | string[]>): void;
|
|
3
|
+
export declare function cmdHandoff(hippoRoot: string, args: string[], flags: Record<string, string | boolean | string[]>): void;
|
|
4
|
+
export declare function cmdCurrent(hippoRoot: string, args: string[], flags: Record<string, string | boolean | string[]>): void;
|
|
5
|
+
export declare function cmdWm(hippoRoot: string, args: string[], flags: Record<string, string | boolean | string[]>): void;
|
|
6
|
+
//# sourceMappingURL=continuity.d.ts.map
|