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/cli/sleep.js
CHANGED
|
@@ -9,8 +9,7 @@ import * as api from '../api/index.js';
|
|
|
9
9
|
import { cliApiContext } from './api-context.js';
|
|
10
10
|
import { sleepResultLines } from './sleep-render.js';
|
|
11
11
|
import { errorMessage, log } from '../util/log.js';
|
|
12
|
-
import {
|
|
13
|
-
import { repairOnceOnSleep } from '../sharing/project-merge.js';
|
|
12
|
+
import { teeStdStreams } from '../util/stream-tee.js';
|
|
14
13
|
import { boolFlag, stringFlag } from './flag-values.js';
|
|
15
14
|
import { requireInit, learnFromRepo, runChurnStaleForRepo, skipLearnOnSharedStore } from './shared.js';
|
|
16
15
|
import { printAgentImport } from './print.js';
|
|
@@ -25,31 +24,7 @@ export async function cmdSleep(hippoRoot, tenantId, flags) {
|
|
|
25
24
|
try {
|
|
26
25
|
fs.mkdirSync(path.dirname(logFile), { recursive: true });
|
|
27
26
|
fs.writeFileSync(logFile, `[hippo] ${new Date().toISOString()} consolidating memory...\n`, 'utf8');
|
|
28
|
-
|
|
29
|
-
const origStderrWrite = process.stderr.write.bind(process.stderr);
|
|
30
|
-
const tee = (chunk) => {
|
|
31
|
-
try {
|
|
32
|
-
const buf = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk);
|
|
33
|
-
fs.appendFileSync(logFile, buf, 'utf8');
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
// log failures are non-fatal — still write to the real stream
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
// SAFETY: the wrapper forwards chunk, enc and cb untouched to the original write, so it keeps write's contract.
|
|
40
|
-
process.stdout.write = ((chunk, enc, cb) => {
|
|
41
|
-
tee(chunk);
|
|
42
|
-
return origStdoutWrite(chunk, enc, cb);
|
|
43
|
-
});
|
|
44
|
-
// SAFETY: the wrapper forwards chunk, enc and cb untouched to the original write, so it keeps write's contract.
|
|
45
|
-
process.stderr.write = ((chunk, enc, cb) => {
|
|
46
|
-
tee(chunk);
|
|
47
|
-
return origStderrWrite(chunk, enc, cb);
|
|
48
|
-
});
|
|
49
|
-
restoreStdout = () => {
|
|
50
|
-
process.stdout.write = origStdoutWrite;
|
|
51
|
-
process.stderr.write = origStderrWrite;
|
|
52
|
-
};
|
|
27
|
+
restoreStdout = teeStdStreams(logFile);
|
|
53
28
|
}
|
|
54
29
|
catch (err) {
|
|
55
30
|
log.warn(`could not open log file ${logFile}: ${errorMessage(err)}`);
|
|
@@ -79,10 +54,8 @@ function renderSleepResult(result) {
|
|
|
79
54
|
}
|
|
80
55
|
/** Fault-isolated: a failed repair warns and runs again next sleep, and never stops the sleep. */
|
|
81
56
|
function repairProjectTagsOnce(hippoRoot, tenantId) {
|
|
82
|
-
let db;
|
|
83
57
|
try {
|
|
84
|
-
|
|
85
|
-
const r = repairOnceOnSleep(db, hippoRoot, tenantId);
|
|
58
|
+
const r = api.repairProjectNamesOnce(cliApiContext(hippoRoot, tenantId));
|
|
86
59
|
if (r === null)
|
|
87
60
|
return;
|
|
88
61
|
const parts = [
|
|
@@ -95,10 +68,6 @@ function repairProjectTagsOnce(hippoRoot, tenantId) {
|
|
|
95
68
|
catch (err) {
|
|
96
69
|
log.warn(`project tag repair skipped, retried next sleep: ${errorMessage(err)}`);
|
|
97
70
|
}
|
|
98
|
-
finally {
|
|
99
|
-
if (db)
|
|
100
|
-
closeHippoDb(db);
|
|
101
|
-
}
|
|
102
71
|
}
|
|
103
72
|
async function cmdSleepCore(hippoRoot, tenantId, flags) {
|
|
104
73
|
requireInit(hippoRoot);
|
|
@@ -111,13 +80,13 @@ async function cmdSleepCore(hippoRoot, tenantId, flags) {
|
|
|
111
80
|
else if (learn) {
|
|
112
81
|
const config = loadConfig(hippoRoot);
|
|
113
82
|
if (config.autoLearnOnSleep && isGitRepo(process.cwd())) {
|
|
114
|
-
const { added } = learnFromRepo(hippoRoot, process.cwd(), 1);
|
|
83
|
+
const { added } = await learnFromRepo(hippoRoot, tenantId, process.cwd(), 1);
|
|
115
84
|
if (added > 0)
|
|
116
85
|
console.log(`Auto-learned ${added} lessons from today's git commits.`);
|
|
117
86
|
}
|
|
118
87
|
// Opt-in code-churn staleness, off by default (config.churnStaleness.enabled).
|
|
119
88
|
if (config.churnStaleness.enabled && isGitRepo(process.cwd())) {
|
|
120
|
-
for (const { root, result } of runChurnStaleForRepo(hippoRoot, false)) {
|
|
89
|
+
for (const { root, result } of runChurnStaleForRepo(hippoRoot, tenantId, false)) {
|
|
121
90
|
if (result.marked > 0)
|
|
122
91
|
console.log(`Tagged ${result.marked} memories churn-stale in ${root}.`);
|
|
123
92
|
if (result.error)
|
|
@@ -132,7 +101,7 @@ async function cmdSleepCore(hippoRoot, tenantId, flags) {
|
|
|
132
101
|
if (finished > 0)
|
|
133
102
|
console.log(`Finished saving ${finished} compaction${finished === 1 ? '' : 's'} left over from earlier sessions.`);
|
|
134
103
|
repairProjectTagsOnce(hippoRoot, tenantId);
|
|
135
|
-
repairQualityOnceAt(hippoRoot);
|
|
104
|
+
await repairQualityOnceAt(hippoRoot, tenantId);
|
|
136
105
|
}
|
|
137
106
|
// Phase 2-6: Pure-storage pipeline (consolidate + dedup + audit + share + ambient).
|
|
138
107
|
const ctx = cliApiContext(hippoRoot, tenantId);
|
package/dist/cli/status.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { type PhysicsParticle } from '../core/physics.js';
|
|
2
2
|
import { type CommandContext } from './flag-values.js';
|
|
3
|
-
export declare function handleStatus({ hippoRoot }: CommandContext): void;
|
|
3
|
+
export declare function handleStatus({ hippoRoot, tenantId }: CommandContext): void;
|
|
4
4
|
export declare function physicsEnergyText(particles: PhysicsParticle[], gMemory: number): string;
|
|
5
5
|
/** `hippo tokens [--days <n>] [--json] [--global]`: the token ledger per surface, tokens saved by skipped unchanged blocks, and re-read hook tokens.
|
|
6
6
|
* Counts are estimates (characters / 4), the same estimate every budget uses. */
|
|
7
7
|
export declare function handleTokens({ hippoRoot, tenantId, flags }: CommandContext): void;
|
|
8
8
|
/** `hippo failures [--days <n>] [--json] [--global]`: failed tool calls by outcome, and repeats across sessions. */
|
|
9
9
|
export declare function handleFailures({ hippoRoot, tenantId, flags }: CommandContext): void;
|
|
10
|
-
export declare function handleCorrectionLatency({ hippoRoot, flags }: CommandContext): void;
|
|
11
|
-
export declare function handleProvenance({ hippoRoot, flags }: CommandContext): void;
|
|
10
|
+
export declare function handleCorrectionLatency({ hippoRoot, tenantId, flags }: CommandContext): void;
|
|
11
|
+
export declare function handleProvenance({ hippoRoot, tenantId, flags }: CommandContext): void;
|
|
12
12
|
export declare function handleDoctor({ flags }: CommandContext): void;
|
|
13
13
|
export declare function handleSupportBundle({ flags }: CommandContext): void;
|
|
14
14
|
export declare function handleInspect({ hippoRoot, tenantId, args }: CommandContext): Promise<void>;
|
package/dist/cli/status.js
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
// Read-only report verbs: status, inspect, tokens, failures, provenance, correction latency, doctor and support bundle.
|
|
2
2
|
import { envHomeDir } from '../util/env.js';
|
|
3
|
-
import { evalNow } from '../core/ablation.js';
|
|
3
|
+
import { evalNow, strengthAblation } from '../core/ablation.js';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import * as fs from 'fs';
|
|
6
6
|
import * as os from 'os';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
8
|
import { calculateStrength, calculateRewardFactor, resolveConfidence, Layer } from '../core/memory.js';
|
|
9
|
-
import {
|
|
10
|
-
import { loadStats } from '../store/index-and-stats.js';
|
|
11
|
-
import { loadStatusCounts } from '../store/candidates.js';
|
|
12
|
-
import { embeddingModelRequiresReindex } from '../store/embeddings/index.js';
|
|
13
|
-
import { resolveEmbeddingProvider } from '../store/embeddings/provider.js';
|
|
14
|
-
import { loadStoredParticles, storedVectorSummary } from '../store/vector-index.js';
|
|
9
|
+
import { resolveEmbeddingProvider } from '../embeddings/provider.js';
|
|
15
10
|
import { computeSystemEnergy, vecNorm } from '../core/physics.js';
|
|
16
11
|
import { loadConfig } from '../core/config.js';
|
|
17
12
|
import { runDoctor, formatDoctor } from '../doctor.js';
|
|
@@ -19,10 +14,9 @@ import { buildSupportBundle, TAIL_MAX_LINES } from '../support-bundle.js';
|
|
|
19
14
|
import { PACKAGE_VERSION } from '../util/version.js';
|
|
20
15
|
import { FAILURE_LOG_RETENTION_DAYS } from '../store/failure-log.js';
|
|
21
16
|
import { getGlobalRoot } from '../sharing/global-store.js';
|
|
22
|
-
import { buildProvenanceCoverage } from './provenance-coverage.js';
|
|
23
|
-
import { buildCorrectionLatency } from './correction-latency.js';
|
|
24
17
|
import * as api from '../api/index.js';
|
|
25
18
|
import { getMemory } from '../api/memories.js';
|
|
19
|
+
import { correctionLatencyReport, embeddingReindexNeeded, provenanceCoverageReport, storeStatus, storedParticles, vectorSummary, } from '../api/status.js';
|
|
26
20
|
import { cliApiContext } from './api-context.js';
|
|
27
21
|
import { errorMessage, log } from '../util/log.js';
|
|
28
22
|
import { printError } from './output.js';
|
|
@@ -31,12 +25,12 @@ import { requireInit, resolveAuthRoot } from './shared.js';
|
|
|
31
25
|
import { fmt } from './print.js';
|
|
32
26
|
import { isJsonObject } from '../util/json.js';
|
|
33
27
|
import { hookStoreRoot } from './hook-runtime.js';
|
|
34
|
-
import { DAY_MS } from '../util/time.js';
|
|
28
|
+
import { DAY_MS, HOUR_MS, MINUTE_MS } from '../util/time.js';
|
|
35
29
|
import { CliExit } from './exit.js';
|
|
36
|
-
export function handleStatus({ hippoRoot }) {
|
|
30
|
+
export function handleStatus({ hippoRoot, tenantId }) {
|
|
37
31
|
requireInit(hippoRoot);
|
|
38
|
-
const
|
|
39
|
-
const counts =
|
|
32
|
+
const ctx = cliApiContext(hippoRoot, tenantId);
|
|
33
|
+
const { stats, counts } = storeStatus(ctx, evalNow(), 0.2);
|
|
40
34
|
const { byLayer, byConfidence, pinned, atRisk, agedOut, avgStrength } = counts;
|
|
41
35
|
console.log('Hippo Status');
|
|
42
36
|
console.log('---------------------------');
|
|
@@ -68,14 +62,14 @@ export function handleStatus({ hippoRoot }) {
|
|
|
68
62
|
else {
|
|
69
63
|
console.log(`Last sleep: never`);
|
|
70
64
|
}
|
|
71
|
-
printEmbeddingStatus(
|
|
72
|
-
printPhysicsStatus(
|
|
65
|
+
printEmbeddingStatus(ctx, counts);
|
|
66
|
+
printPhysicsStatus(ctx);
|
|
73
67
|
}
|
|
74
68
|
// Embedding status (provider-aware)
|
|
75
|
-
function printEmbeddingStatus(
|
|
69
|
+
function printEmbeddingStatus(ctx, counts) {
|
|
76
70
|
const embedProvider = (() => {
|
|
77
71
|
try {
|
|
78
|
-
return resolveEmbeddingProvider(hippoRoot);
|
|
72
|
+
return resolveEmbeddingProvider(ctx.hippoRoot);
|
|
79
73
|
}
|
|
80
74
|
catch {
|
|
81
75
|
// Status reports a bad provider config as "misconfigured" below instead of failing.
|
|
@@ -87,7 +81,7 @@ function printEmbeddingStatus(hippoRoot, counts) {
|
|
|
87
81
|
console.log(`Embeddings: misconfigured (check embeddings.provider / apiBaseUrl), BM25 only`);
|
|
88
82
|
return;
|
|
89
83
|
}
|
|
90
|
-
const embeddingsDisabled = loadConfig(hippoRoot).embeddings.enabled === false;
|
|
84
|
+
const embeddingsDisabled = loadConfig(ctx.hippoRoot).embeddings.enabled === false;
|
|
91
85
|
const embAvail = embedProvider.isAvailable();
|
|
92
86
|
if (embeddingsDisabled) {
|
|
93
87
|
console.log(`Embeddings: disabled in config (embeddings.enabled = false), BM25 only`);
|
|
@@ -103,7 +97,7 @@ function printEmbeddingStatus(hippoRoot, counts) {
|
|
|
103
97
|
}
|
|
104
98
|
// Show cached counts whenever vectors exist on disk (even when disabled or
|
|
105
99
|
// the key was removed), so the user still sees what is already indexed.
|
|
106
|
-
const { ids: embeddedIds, dims } =
|
|
100
|
+
const { ids: embeddedIds, dims } = vectorSummary(ctx);
|
|
107
101
|
if (!embAvail && embeddedIds.size === 0)
|
|
108
102
|
return;
|
|
109
103
|
const orphaned = embeddedIds.size - counts.embedded;
|
|
@@ -114,23 +108,24 @@ function printEmbeddingStatus(hippoRoot, counts) {
|
|
|
114
108
|
line += ` (${orphaned} orphaned, run \`hippo embed\` to prune)`;
|
|
115
109
|
console.log(line);
|
|
116
110
|
// No index argument: the check then asks SQLite whether any vector exists instead of loading them.
|
|
117
|
-
if (
|
|
111
|
+
if (embeddingReindexNeeded(ctx, embedProvider.id)) {
|
|
118
112
|
console.log(` model changed, run \`hippo embed\` to reindex`);
|
|
119
113
|
}
|
|
120
114
|
}
|
|
121
115
|
// The all-pairs energy sum is quadratic, so a large particle set skips it.
|
|
122
116
|
const PHYSICS_ENERGY_STATUS_MAX = 2000;
|
|
123
117
|
// Physics status
|
|
124
|
-
function printPhysicsStatus(
|
|
118
|
+
function printPhysicsStatus(ctx) {
|
|
125
119
|
try {
|
|
126
|
-
const particles =
|
|
120
|
+
const particles = storedParticles(ctx);
|
|
127
121
|
if (particles.length > 0) {
|
|
128
122
|
let sumVelMag = 0;
|
|
129
123
|
for (const p of particles)
|
|
130
124
|
sumVelMag += vecNorm(p.velocity);
|
|
131
125
|
const avgVelMag = sumVelMag / particles.length;
|
|
132
126
|
console.log('');
|
|
133
|
-
console.log(`Physics: ${particles.length} particles,
|
|
127
|
+
console.log(`Physics: ${particles.length} particles, ` +
|
|
128
|
+
`${physicsEnergyText(particles, loadConfig(ctx.hippoRoot).physics.G_memory)}, avg vel: ${fmt(avgVelMag, 4)}`);
|
|
134
129
|
}
|
|
135
130
|
}
|
|
136
131
|
catch (err) {
|
|
@@ -152,7 +147,7 @@ async function cmdInspect(hippoRoot, tenantId, id) {
|
|
|
152
147
|
throw new CliExit(1);
|
|
153
148
|
}
|
|
154
149
|
const now = evalNow();
|
|
155
|
-
const currentStrength = calculateStrength(entry, now);
|
|
150
|
+
const currentStrength = calculateStrength(entry, now, { ablation: strengthAblation() });
|
|
156
151
|
const lastRetrieved = new Date(entry.last_retrieved);
|
|
157
152
|
const created = new Date(entry.created);
|
|
158
153
|
const ageDays = (now.getTime() - created.getTime()) / DAY_MS;
|
|
@@ -171,7 +166,7 @@ async function cmdInspect(hippoRoot, tenantId, id) {
|
|
|
171
166
|
console.log(`Schema fit: ${entry.schema_fit}`);
|
|
172
167
|
console.log(`Pinned: ${entry.pinned}`);
|
|
173
168
|
console.log(`Tags: ${entry.tags.join(', ') || 'none'}`);
|
|
174
|
-
const rewardFactor = calculateRewardFactor(entry);
|
|
169
|
+
const rewardFactor = calculateRewardFactor(entry, strengthAblation());
|
|
175
170
|
const pos = entry.outcome_positive ?? 0;
|
|
176
171
|
const neg = entry.outcome_negative ?? 0;
|
|
177
172
|
const outcomeLabel = pos === 0 && neg === 0
|
|
@@ -257,9 +252,9 @@ export function handleFailures({ hippoRoot, tenantId, flags }) {
|
|
|
257
252
|
console.log(`\n Repeats: ${summary.repeats} of ${summary.rated} errors first happened in another session.${unrated}`);
|
|
258
253
|
}
|
|
259
254
|
}
|
|
260
|
-
export function handleCorrectionLatency({ hippoRoot, flags }) {
|
|
255
|
+
export function handleCorrectionLatency({ hippoRoot, tenantId, flags }) {
|
|
261
256
|
requireInit(hippoRoot);
|
|
262
|
-
const report =
|
|
257
|
+
const report = correctionLatencyReport(cliApiContext(hippoRoot, tenantId));
|
|
263
258
|
if (flags['json']) {
|
|
264
259
|
console.log(JSON.stringify(report, null, 2));
|
|
265
260
|
}
|
|
@@ -272,11 +267,11 @@ export function handleCorrectionLatency({ hippoRoot, flags }) {
|
|
|
272
267
|
return 'n/a';
|
|
273
268
|
if (ms < 1000)
|
|
274
269
|
return `${ms}ms`;
|
|
275
|
-
if (ms <
|
|
270
|
+
if (ms < MINUTE_MS)
|
|
276
271
|
return `${(ms / 1000).toFixed(1)}s`;
|
|
277
|
-
if (ms <
|
|
278
|
-
return `${(ms /
|
|
279
|
-
return `${(ms /
|
|
272
|
+
if (ms < HOUR_MS)
|
|
273
|
+
return `${(ms / MINUTE_MS).toFixed(1)}m`;
|
|
274
|
+
return `${(ms / HOUR_MS).toFixed(1)}h`;
|
|
280
275
|
};
|
|
281
276
|
console.log(`Corrections: ${report.count} total (${report.extractionCount} extraction-driven, ${report.manualCount} manual)`);
|
|
282
277
|
console.log(`Latency p50: ${fmt(report.p50Ms)}, p95: ${fmt(report.p95Ms)}, max: ${fmt(report.maxMs)}`);
|
|
@@ -286,9 +281,9 @@ export function handleCorrectionLatency({ hippoRoot, flags }) {
|
|
|
286
281
|
}
|
|
287
282
|
}
|
|
288
283
|
}
|
|
289
|
-
export function handleProvenance({ hippoRoot, flags }) {
|
|
284
|
+
export function handleProvenance({ hippoRoot, tenantId, flags }) {
|
|
290
285
|
requireInit(hippoRoot);
|
|
291
|
-
const coverage =
|
|
286
|
+
const coverage = provenanceCoverageReport(cliApiContext(hippoRoot, tenantId));
|
|
292
287
|
if (flags['json']) {
|
|
293
288
|
console.log(JSON.stringify(coverage, null, 2));
|
|
294
289
|
}
|
|
@@ -345,8 +340,10 @@ export function handleSupportBundle({ flags }) {
|
|
|
345
340
|
const kb = Math.round(Buffer.byteLength(json) / 1024);
|
|
346
341
|
console.log(`Wrote ${file} (${kb} KB).`);
|
|
347
342
|
console.log(includeLogs
|
|
348
|
-
? `It holds versions, doctor checks, config with secrets removed, store counts, and the last ${TAIL_MAX_LINES} lines of
|
|
349
|
-
|
|
343
|
+
? `It holds versions, doctor checks, config with secrets removed, store counts, and the last ${TAIL_MAX_LINES} lines of ` +
|
|
344
|
+
'each hippo log with known secret shapes removed. Those log lines can quote memory text. Read it before you attach it to a ticket.'
|
|
345
|
+
: 'It holds versions, doctor checks, config with secrets removed, store counts and log file names. It never holds memory text. Read it before you ' +
|
|
346
|
+
'attach it to a ticket.');
|
|
350
347
|
}
|
|
351
348
|
export async function handleInspect({ hippoRoot, tenantId, args }) {
|
|
352
349
|
const id = args[0];
|
package/dist/cli/transfer.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type CommandContext } from './flag-values.js';
|
|
2
|
-
export declare function handleLearn({ hippoRoot, flags }: CommandContext): void
|
|
3
|
-
export declare function handleImport({ hippoRoot, tenantId, args, flags }: CommandContext): void
|
|
2
|
+
export declare function handleLearn({ hippoRoot, tenantId, flags }: CommandContext): Promise<void>;
|
|
3
|
+
export declare function handleImport({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
|
|
4
4
|
export declare function handleSync({ hippoRoot, flags }: CommandContext): void;
|
|
5
|
-
export declare function handleWatch({ hippoRoot, tenantId, args }: CommandContext): Promise<void>;
|
|
5
|
+
export declare function handleWatch({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
|
|
6
6
|
export declare function handlePromote({ hippoRoot, tenantId, args }: CommandContext): Promise<void>;
|
|
7
7
|
export declare function handleShare({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
|
|
8
8
|
export declare function handlePeers({ tenantId, flags }: CommandContext): void;
|
package/dist/cli/transfer.js
CHANGED
|
@@ -1,40 +1,57 @@
|
|
|
1
1
|
// Verbs that move memories in and out: watch, learn, import, export, promote, sync, share and peers.
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import * as fs from 'fs';
|
|
4
|
-
import { isInitialized } from '../
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { embedAll } from '../store/embeddings/index.js';
|
|
8
|
-
import { loadEmbeddingIndex } from '../store/vector-index.js';
|
|
4
|
+
import { isInitialized } from '../core/project-identity.js';
|
|
5
|
+
import { RejectedValueError } from '../core/api-errors.js';
|
|
6
|
+
import { embedCoverage, embedMissingMemories } from '../api/embeddings.js';
|
|
9
7
|
import { captureError, runWatched } from '../learn/autolearn.js';
|
|
10
8
|
import { currentMachine, importAtSessionEnd, importForStore } from '../agent-memories/sync.js';
|
|
11
9
|
import { detailLines } from '../agent-memories/report.js';
|
|
12
10
|
import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
|
|
13
|
-
import { shareMemory, listPeers, autoShare, transferScore } from '../sharing/share.js';
|
|
11
|
+
import { AUTO_SHARE_MIN_SCORE, shareMemory, listPeers, autoShare, transferScore } from '../sharing/share.js';
|
|
14
12
|
import { syncGlobalToLocal } from '../sharing/global-sync.js';
|
|
15
13
|
import { importChatGPT, importClaude, importCursor, importGenericFile, } from '../importers/sources.js';
|
|
16
14
|
import { importMarkdown } from '../importers/markdown.js';
|
|
17
15
|
import { importVault } from '../importers/vault.js';
|
|
18
16
|
import * as api from '../api/index.js';
|
|
19
|
-
import { getMemory } from '../api/memories.js';
|
|
17
|
+
import { getMemory, listMemories } from '../api/memories.js';
|
|
20
18
|
import * as client from './client.js';
|
|
21
19
|
import { cliApiContext } from './api-context.js';
|
|
22
20
|
import { printError } from './output.js';
|
|
23
21
|
import { errorMessage, log } from '../util/log.js';
|
|
24
22
|
import { requireInit, runViaServerIfAvailable, learnFromRepo } from './shared.js';
|
|
25
23
|
import { fmt } from './print.js';
|
|
26
|
-
import { boolFlag, flagIsTrue, isStringFlag, nonEmptyStringFlag } from './flag-values.js';
|
|
24
|
+
import { boolFlag, flagIsTrue, isStringFlag, nonEmptyStringFlag, numberFlag } from './flag-values.js';
|
|
27
25
|
import { CONTENT_PREVIEW_CHARS, DATE_PREFIX_CHARS } from '../util/token-text.js';
|
|
28
26
|
import { CliExit } from './exit.js';
|
|
29
27
|
const STDERR_PREVIEW_CHARS = 80;
|
|
30
28
|
const MAX_ENTRIES_SHOWN = 10;
|
|
31
29
|
// Watch command
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
const WATCH_USAGE = 'Usage: hippo watch -- <command> [args...], or hippo watch --shell "<command line>"';
|
|
31
|
+
/** The argv to run and whether a shell parses it: `--shell` takes one command line, anything else is argv as given. */
|
|
32
|
+
function watchedCommand(args, flags) {
|
|
33
|
+
if (flags['shell'] !== undefined) {
|
|
34
|
+
const line = nonEmptyStringFlag(flags, 'shell');
|
|
35
|
+
if (line === undefined) {
|
|
36
|
+
printError(WATCH_USAGE);
|
|
37
|
+
throw new CliExit(1);
|
|
38
|
+
}
|
|
39
|
+
return { argv: [line], shell: true };
|
|
40
|
+
}
|
|
41
|
+
if (args.length === 0) {
|
|
42
|
+
printError(WATCH_USAGE);
|
|
43
|
+
throw new CliExit(1);
|
|
44
|
+
}
|
|
45
|
+
// A quoted 1.x command line would now run as one program name, so it is refused rather than guessed at.
|
|
46
|
+
if (args.length === 1 && /\s/.test(args[0])) {
|
|
47
|
+
printError(`hippo watch: "${args[0]}" is one argument with spaces. Use \`hippo watch -- cmd args\` or \`hippo watch --shell "<command line>"\`.`);
|
|
35
48
|
throw new CliExit(1);
|
|
36
49
|
}
|
|
37
|
-
|
|
50
|
+
return { argv: [...args], shell: false };
|
|
51
|
+
}
|
|
52
|
+
async function cmdWatch(argv, shell, hippoRoot, tenantId) {
|
|
53
|
+
const command = argv.join(' ');
|
|
54
|
+
const { exitCode, stderr } = await runWatched(argv, undefined, { shell });
|
|
38
55
|
if (exitCode === 0) {
|
|
39
56
|
// Success: no noise
|
|
40
57
|
return;
|
|
@@ -48,7 +65,7 @@ async function cmdWatch(command, hippoRoot, tenantId) {
|
|
|
48
65
|
// A rejection-guard refusal of a failed command's output must not crash the watcher:
|
|
49
66
|
// skip with the message below and still exit with the wrapped command's real exit code.
|
|
50
67
|
try {
|
|
51
|
-
api.rememberLocally(cliApiContext(hippoRoot, tenantId), {
|
|
68
|
+
await api.rememberLocally(cliApiContext(hippoRoot, tenantId), {
|
|
52
69
|
content: failure.content,
|
|
53
70
|
tags: failure.tags,
|
|
54
71
|
layer: failure.layer,
|
|
@@ -71,13 +88,13 @@ async function cmdWatch(command, hippoRoot, tenantId) {
|
|
|
71
88
|
throw new CliExit(exitCode);
|
|
72
89
|
}
|
|
73
90
|
// Learn command
|
|
74
|
-
export function handleLearn({ hippoRoot, flags }) {
|
|
91
|
+
export async function handleLearn({ hippoRoot, tenantId, flags }) {
|
|
75
92
|
requireInit(hippoRoot);
|
|
76
93
|
if (!flags['git']) {
|
|
77
94
|
printError('Usage: hippo learn --git [--days <n>] [--repos <paths>]');
|
|
78
95
|
throw new CliExit(1);
|
|
79
96
|
}
|
|
80
|
-
const days =
|
|
97
|
+
const days = numberFlag(flags, 'days') ?? 7;
|
|
81
98
|
console.log(`Scanning git log for the last ${days} days...`);
|
|
82
99
|
const reposFlag = nonEmptyStringFlag(flags, 'repos');
|
|
83
100
|
if (reposFlag) {
|
|
@@ -86,35 +103,41 @@ export function handleLearn({ hippoRoot, flags }) {
|
|
|
86
103
|
let totalSkipped = 0;
|
|
87
104
|
for (const repo of repos) {
|
|
88
105
|
const label = path.basename(repo);
|
|
89
|
-
const { added, skipped } = learnFromRepo(hippoRoot, repo, days, label);
|
|
106
|
+
const { added, skipped } = await learnFromRepo(hippoRoot, tenantId, repo, days, label);
|
|
90
107
|
totalAdded += added;
|
|
91
108
|
totalSkipped += skipped;
|
|
92
109
|
}
|
|
93
110
|
console.log(`Git learn complete: ${totalAdded} new lessons added, ${totalSkipped} duplicates skipped across ${repos.length} repos.`);
|
|
94
111
|
}
|
|
95
112
|
else {
|
|
96
|
-
const { added, skipped } = learnFromRepo(hippoRoot, process.cwd(), days);
|
|
113
|
+
const { added, skipped } = await learnFromRepo(hippoRoot, tenantId, process.cwd(), days);
|
|
97
114
|
console.log(`Git learn complete: ${added} new lessons added, ${skipped} duplicates skipped.`);
|
|
98
115
|
}
|
|
99
116
|
}
|
|
100
117
|
// Import command
|
|
101
118
|
/** The rows are saved either way; a failed backfill only delays vectors, so it warns with how many wait and the command that finishes them. */
|
|
102
|
-
function warnBackfillFailed(
|
|
119
|
+
function warnBackfillFailed(ctx, embedCommand, err) {
|
|
103
120
|
let waiting;
|
|
104
121
|
try {
|
|
105
|
-
const
|
|
106
|
-
|
|
122
|
+
const { memoryIds, vectorIds } = embedCoverage(ctx);
|
|
123
|
+
const embedded = new Set(vectorIds);
|
|
124
|
+
waiting = String(memoryIds.filter((id) => !embedded.has(id)).length);
|
|
107
125
|
}
|
|
108
126
|
catch (countErr) {
|
|
109
127
|
waiting = `an unknown number of (count failed: ${errorMessage(countErr)})`;
|
|
110
128
|
}
|
|
111
129
|
log.warn(`import: embedding backfill failed (${errorMessage(err)}); ${waiting} rows have no vector; run '${embedCommand}' to backfill`);
|
|
112
130
|
}
|
|
131
|
+
/** Batch-embed freshly imported rows. The floating promise is deliberate: libuv keeps the process alive until it settles, and awaiting
|
|
132
|
+
* would block the CLI on model load; `hippo embed` is the backstop if interrupted. */
|
|
133
|
+
function backfillVectors(ctx, embedCommand) {
|
|
134
|
+
void embedMissingMemories(ctx).catch((err) => warnBackfillFailed(ctx, embedCommand, err));
|
|
135
|
+
}
|
|
113
136
|
function warnRedacted(count) {
|
|
114
137
|
if (count)
|
|
115
138
|
printError(`Warning: secret-shaped text was redacted from ${count} imported ${count === 1 ? 'entry' : 'entries'} before storing`);
|
|
116
139
|
}
|
|
117
|
-
export function handleImport({ hippoRoot, tenantId, args, flags }) {
|
|
140
|
+
export async function handleImport({ hippoRoot, tenantId, args, flags }) {
|
|
118
141
|
const useGlobal = boolFlag(flags, 'global');
|
|
119
142
|
const dryRun = boolFlag(flags, 'dry-run');
|
|
120
143
|
const extraTags = Array.isArray(flags['tag'])
|
|
@@ -140,8 +163,8 @@ export function handleImport({ hippoRoot, tenantId, args, flags }) {
|
|
|
140
163
|
// Vault import is a FOLDER importer that dispatches apart from the single-file slot below; it writes through tenant-scoped api calls,
|
|
141
164
|
// so the tenant is resolved and passed through. --global is unsupported (the connector raw-archive path is tenant-local).
|
|
142
165
|
if (flags['vault'])
|
|
143
|
-
return importVaultFolder(hippoRoot, tenantId, flags, importOptions, useGlobal, dryRun);
|
|
144
|
-
importFromFile(targetRoot, args, flags, { importOptions, useGlobal, dryRun });
|
|
166
|
+
return await importVaultFolder(hippoRoot, tenantId, flags, importOptions, useGlobal, dryRun);
|
|
167
|
+
importFromFile(targetRoot, args, flags, { importOptions, useGlobal, dryRun, tenantId });
|
|
145
168
|
}
|
|
146
169
|
// Determine which importer to use based on flag
|
|
147
170
|
function pickImporter(args, flags) {
|
|
@@ -161,7 +184,7 @@ function pickImporter(args, flags) {
|
|
|
161
184
|
return { filePath: undefined, importer: undefined, importerName: '' };
|
|
162
185
|
}
|
|
163
186
|
function importFromFile(targetRoot, args, flags, options) {
|
|
164
|
-
const { importOptions, useGlobal, dryRun } = options;
|
|
187
|
+
const { importOptions, useGlobal, dryRun, tenantId } = options;
|
|
165
188
|
const { filePath, importer, importerName } = pickImporter(args, flags);
|
|
166
189
|
if (!filePath || !importer) {
|
|
167
190
|
printError('Usage: hippo import <--chatgpt|--claude|--cursor|--file|--markdown|--vault> <path>, or hippo import --agents [--dry-run]');
|
|
@@ -172,10 +195,9 @@ function importFromFile(targetRoot, args, flags, options) {
|
|
|
172
195
|
throw new CliExit(1);
|
|
173
196
|
}
|
|
174
197
|
const result = importer(filePath, importOptions);
|
|
175
|
-
//
|
|
176
|
-
// alive until it settles; do not await it, that would block the CLI on model load. `hippo embed` is the backstop if interrupted.
|
|
198
|
+
// The importers' writeEntry sites don't embed, so the new rows are embedded here in one pass.
|
|
177
199
|
if (!dryRun && result.imported >= 1) {
|
|
178
|
-
|
|
200
|
+
backfillVectors(cliApiContext(targetRoot, tenantId), useGlobal ? 'hippo embed --global' : 'hippo embed');
|
|
179
201
|
}
|
|
180
202
|
const storeLabel = useGlobal ? `global (${getGlobalRoot()})` : targetRoot;
|
|
181
203
|
printFileImportSummary(result, importerName, filePath, storeLabel, dryRun);
|
|
@@ -216,7 +238,7 @@ function importAgentMemories(hippoRoot, useGlobal, dryRun) {
|
|
|
216
238
|
for (const warning of report.warnings)
|
|
217
239
|
printError(`hippo: agent memories: ${warning}`);
|
|
218
240
|
}
|
|
219
|
-
function importVaultFolder(hippoRoot, tenantId, flags, importOptions, useGlobal, dryRun) {
|
|
241
|
+
async function importVaultFolder(hippoRoot, tenantId, flags, importOptions, useGlobal, dryRun) {
|
|
220
242
|
const folderPath = String(flags['vault']);
|
|
221
243
|
checkVaultArgs(folderPath, flags, useGlobal);
|
|
222
244
|
const vaultOptions = {
|
|
@@ -225,8 +247,8 @@ function importVaultFolder(hippoRoot, tenantId, flags, importOptions, useGlobal,
|
|
|
225
247
|
name: flags['name'] ? String(flags['name']) : undefined,
|
|
226
248
|
scope: flags['scope'] ? String(flags['scope']) : undefined,
|
|
227
249
|
};
|
|
228
|
-
const vaultResult = importVault(folderPath, vaultOptions);
|
|
229
|
-
printVaultSummary(vaultResult, folderPath, hippoRoot, dryRun);
|
|
250
|
+
const vaultResult = await importVault(folderPath, vaultOptions);
|
|
251
|
+
printVaultSummary(vaultResult, folderPath, cliApiContext(hippoRoot, tenantId), dryRun);
|
|
230
252
|
}
|
|
231
253
|
function checkVaultArgs(folderPath, flags, useGlobal) {
|
|
232
254
|
if (!fs.existsSync(folderPath) || !fs.statSync(folderPath).isDirectory()) {
|
|
@@ -250,7 +272,7 @@ function checkVaultArgs(folderPath, flags, useGlobal) {
|
|
|
250
272
|
throw new CliExit(1);
|
|
251
273
|
}
|
|
252
274
|
}
|
|
253
|
-
function printVaultSummary(vaultResult, folderPath,
|
|
275
|
+
function printVaultSummary(vaultResult, folderPath, ctx, dryRun) {
|
|
254
276
|
console.log(`\nImport Vault: ${folderPath}${dryRun ? ' (dry run - no writes)' : ''}`);
|
|
255
277
|
console.log(` Notes found: ${vaultResult.total}`);
|
|
256
278
|
console.log(` ${dryRun ? 'Would import: ' : 'Imported: '}${vaultResult.imported}`);
|
|
@@ -260,12 +282,10 @@ function printVaultSummary(vaultResult, folderPath, hippoRoot, dryRun) {
|
|
|
260
282
|
}
|
|
261
283
|
warnRedacted(vaultResult.redacted);
|
|
262
284
|
console.log(` ${dryRun ? 'Would archive: ' : 'Archived (removed): '}${vaultResult.archived ?? 0}`);
|
|
263
|
-
console.log(` Store: ${hippoRoot}`);
|
|
264
|
-
//
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
void embedAll(hippoRoot).catch((err) => warnBackfillFailed(hippoRoot, 'hippo embed', err));
|
|
268
|
-
}
|
|
285
|
+
console.log(` Store: ${ctx.hippoRoot}`);
|
|
286
|
+
// Vault rows write through api.remember, which never embeds, so backfill them as the single-file import does.
|
|
287
|
+
if (!dryRun && vaultResult.imported >= 1)
|
|
288
|
+
backfillVectors(ctx, 'hippo embed');
|
|
269
289
|
}
|
|
270
290
|
// Promote command
|
|
271
291
|
function cmdPromote(hippoRoot, tenantId, id) {
|
|
@@ -296,11 +316,12 @@ export function handleSync({ hippoRoot, flags }) {
|
|
|
296
316
|
// v39: other-project rows are skipped by default; secrets always are.
|
|
297
317
|
const includeCrossProject = flagIsTrue(flags, 'cross-project');
|
|
298
318
|
const count = syncGlobalToLocal(hippoRoot, globalRoot, { includeCrossProject });
|
|
299
|
-
console.log(`Synced ${count} global memories into local project.${includeCrossProject ? '' : ' (other-project rows skipped; use --cross-project to
|
|
319
|
+
console.log(`Synced ${count} global memories into local project.${includeCrossProject ? '' : ' (other-project rows skipped; use --cross-project to ' +
|
|
320
|
+
'include them)'}`);
|
|
300
321
|
}
|
|
301
|
-
export async function handleWatch({ hippoRoot, tenantId, args }) {
|
|
302
|
-
const
|
|
303
|
-
await cmdWatch(
|
|
322
|
+
export async function handleWatch({ hippoRoot, tenantId, args, flags }) {
|
|
323
|
+
const { argv, shell } = watchedCommand(args, flags);
|
|
324
|
+
await cmdWatch(argv, shell, hippoRoot, tenantId);
|
|
304
325
|
}
|
|
305
326
|
export async function handlePromote({ hippoRoot, tenantId, args }) {
|
|
306
327
|
const id = args[0];
|
|
@@ -327,7 +348,7 @@ export async function handleShare({ hippoRoot, tenantId, args, flags }) {
|
|
|
327
348
|
if (shareId === '--auto' || flags['auto']) {
|
|
328
349
|
// Auto-share mode
|
|
329
350
|
requireInit(hippoRoot);
|
|
330
|
-
const minScore =
|
|
351
|
+
const minScore = numberFlag(flags, 'min-score') ?? AUTO_SHARE_MIN_SCORE;
|
|
331
352
|
const dryRun = boolFlag(flags, 'dry-run');
|
|
332
353
|
const results = autoShare(hippoRoot, { minScore, dryRun, tenantId });
|
|
333
354
|
if (results.length === 0) {
|
|
@@ -393,7 +414,7 @@ export function handleExport({ hippoRoot, tenantId, args, flags }) {
|
|
|
393
414
|
requireInit(hippoRoot);
|
|
394
415
|
const format = String(flags['format'] || 'json');
|
|
395
416
|
const outputPath = args[0] || null;
|
|
396
|
-
const entries =
|
|
417
|
+
const entries = listMemories(cliApiContext(hippoRoot, tenantId));
|
|
397
418
|
let output;
|
|
398
419
|
if (format === 'markdown' || format === 'md') {
|
|
399
420
|
output = entries.map(e => {
|