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/flags.js
CHANGED
|
@@ -1,144 +1,9 @@
|
|
|
1
|
-
// Each
|
|
1
|
+
// Each flag's kind, read from the verb table's flags: parseArgs needs a flag's kind before the verb's module loads.
|
|
2
|
+
import { COMMANDS } from './verbs.js';
|
|
2
3
|
// The entry point reads these for every verb, so no verb declares them.
|
|
3
4
|
const GLOBAL_FLAGS = { switches: ['help', 'version'] };
|
|
4
|
-
export const VERB_FLAGS = {
|
|
5
|
-
init: { switches: ['global', 'no-hooks', 'no-learn', 'no-schedule'], values: ['scan'], numbers: ['days'] },
|
|
6
|
-
remember: {
|
|
7
|
-
switches: ['error', 'extract', 'force', 'global', 'inferred', 'observed', 'pin', 'verified'],
|
|
8
|
-
values: ['artifact-ref', 'kind', 'layer', 'owner', 'scope'],
|
|
9
|
-
lists: ['tag'],
|
|
10
|
-
},
|
|
11
|
-
recall: {
|
|
12
|
-
switches: ['classic', 'continuity', 'equal-sources', 'evc-adaptive', 'filter-conflicts', 'graph-stream',
|
|
13
|
-
'include-superseded', 'json', 'multihop', 'no-mmr', 'physics', 'rerank-utility', 'value-aware', 'why'],
|
|
14
|
-
values: ['as-of', 'budget', 'goal', 'graph-hops', 'graph-seeds', 'hops', 'layer', 'max-neighbors', 'outcome',
|
|
15
|
-
'reranker', 'salience-threshold', 'scope', 'session-id'],
|
|
16
|
-
numbers: ['limit', 'local-bump', 'min-results', 'mmr-lambda', 'reranker-top-k'],
|
|
17
|
-
},
|
|
18
|
-
drill: { switches: ['json'], values: ['budget', 'depth'], numbers: ['limit'] },
|
|
19
|
-
assemble: { switches: ['json', 'no-summarize-older'], values: ['budget', 'fresh-tail', 'scope', 'session'] },
|
|
20
|
-
supersede: { switches: ['pin'], values: ['layer'], lists: ['tag'] },
|
|
21
|
-
explain: {
|
|
22
|
-
switches: ['classic', 'equal-sources', 'include-superseded', 'json', 'no-mmr', 'physics'],
|
|
23
|
-
values: ['as-of', 'budget', 'scope'],
|
|
24
|
-
numbers: ['limit', 'local-bump', 'mmr-lambda'],
|
|
25
|
-
},
|
|
26
|
-
eval: {
|
|
27
|
-
switches: ['bootstrap', 'equal-sources', 'json', 'no-mmr', 'save-baseline', 'show-cases', 'suite'],
|
|
28
|
-
values: ['baseline', 'compare', 'out'],
|
|
29
|
-
numbers: ['embedding-weight', 'local-bump', 'max-cases', 'min-mrr', 'mmr-lambda'],
|
|
30
|
-
},
|
|
31
|
-
trace: { switches: ['json'], values: ['outcome', 'session', 'source', 'steps', 'task'], lists: ['tag'] },
|
|
32
|
-
refine: { switches: ['all', 'dry-run', 'json'], values: ['model'], numbers: ['limit'] },
|
|
33
|
-
sleep: { switches: ['dry-run', 'no-learn', 'no-share'], values: ['log-file'] },
|
|
34
|
-
'last-sleep': { switches: ['keep'], values: ['path'] },
|
|
35
|
-
'session-end': {
|
|
36
|
-
switches: ['dry-run', 'no-learn', 'no-share', 'turn'],
|
|
37
|
-
values: ['format', 'log-file', 'runtime', 'session-id', 'transcript'],
|
|
38
|
-
},
|
|
39
|
-
'__session-end-worker': {
|
|
40
|
-
switches: ['dry-run', 'no-learn', 'no-share', 'turn'],
|
|
41
|
-
values: ['log-file', 'session-id', 'transcript'],
|
|
42
|
-
},
|
|
43
|
-
'pre-compact': { values: ['format', 'log-file', 'runtime'] },
|
|
44
|
-
'post-compact': { values: ['log-file'] },
|
|
45
|
-
'capture-error': { values: ['format', 'runtime'] },
|
|
46
|
-
'compact-resume': {},
|
|
47
|
-
'codex-run': {},
|
|
48
|
-
'__codex-session-end-worker': { values: ['codex-home', 'history-path', 'log-file', 'start-offset', 'started-at'] },
|
|
49
|
-
dedup: { switches: ['dry-run'], numbers: ['threshold'] },
|
|
50
|
-
dag: { switches: ['stats'] },
|
|
51
|
-
auth: { switches: ['all', 'global', 'json', 'no-expiry'], values: ['label', 'role', 'tenant'], numbers: ['ttl-days'] },
|
|
52
|
-
goal: {
|
|
53
|
-
switches: ['all', 'no-propagate'],
|
|
54
|
-
values: ['level', 'outcome', 'parent', 'policy', 'session-id', 'success', 'tenant-id'],
|
|
55
|
-
},
|
|
56
|
-
slack: { switches: ['force'], values: ['channel', 'since', 'team', 'tenant'] },
|
|
57
|
-
github: { switches: ['force'], values: ['max', 'repo', 'since'] },
|
|
58
|
-
audit: {
|
|
59
|
-
switches: ['apply', 'dry-run', 'fix', 'global', 'json'],
|
|
60
|
-
values: ['older-than', 'op', 'since', 'tenant'],
|
|
61
|
-
numbers: ['limit'],
|
|
62
|
-
},
|
|
63
|
-
'correction-latency': { switches: ['json'] },
|
|
64
|
-
provenance: { switches: ['json', 'strict'] },
|
|
65
|
-
status: {},
|
|
66
|
-
outcome: { switches: ['bad', 'good'], values: ['id'] },
|
|
67
|
-
conflicts: { switches: ['json'], values: ['status'] },
|
|
68
|
-
resolve: { switches: ['forget', 'reject-loser'], values: ['keep', 'reason'] },
|
|
69
|
-
reject: { switches: ['global'], values: ['reason', 'value'] },
|
|
70
|
-
rejections: { switches: ['global', 'json'] },
|
|
71
|
-
unreject: { switches: ['global'] },
|
|
72
|
-
dormant: { switches: ['global', 'json'], numbers: ['limit'] },
|
|
73
|
-
projects: { switches: ['apply', 'global', 'json'] },
|
|
74
|
-
quarantine: { switches: ['all', 'global', 'json'] },
|
|
75
|
-
tokens: { switches: ['global', 'json'], numbers: ['days'] },
|
|
76
|
-
failures: { switches: ['global', 'json'], numbers: ['days'] },
|
|
77
|
-
doctor: { switches: ['json'] },
|
|
78
|
-
'support-bundle': { switches: ['include-logs'], values: ['out'] },
|
|
79
|
-
snapshot: { switches: ['json'], values: ['id', 'next-step', 'session', 'source', 'status', 'summary', 'task'] },
|
|
80
|
-
session: {
|
|
81
|
-
switches: ['json'],
|
|
82
|
-
values: ['content', 'id', 'outcome', 'session', 'source', 'summary', 'task', 'type'],
|
|
83
|
-
numbers: ['limit'],
|
|
84
|
-
},
|
|
85
|
-
handoff: {
|
|
86
|
-
switches: ['json'],
|
|
87
|
-
values: ['card-id', 'id', 'next', 'outcome', 'session', 'summary', 'target-runtime', 'task', 'tests'],
|
|
88
|
-
lists: ['artifact', 'constraint'],
|
|
89
|
-
},
|
|
90
|
-
// Every card subcommand's flags together; card.ts then refuses the ones its subcommand does not read.
|
|
91
|
-
card: {
|
|
92
|
-
switches: ['json'],
|
|
93
|
-
values: ['author', 'body', 'budget', 'contract', 'outcome', 'reason', 'repo', 'run', 'runtime', 'session',
|
|
94
|
-
'status', 'title'],
|
|
95
|
-
lists: ['depends-on'],
|
|
96
|
-
},
|
|
97
|
-
predict: {
|
|
98
|
-
values: ['actual', 'class', 'estimate', 'note', 'state', 'status', 'target', 'unit'],
|
|
99
|
-
numbers: ['limit'],
|
|
100
|
-
},
|
|
101
|
-
current: { switches: ['json'] },
|
|
102
|
-
forget: { switches: ['archive', 'dry-run'], values: ['reason'] },
|
|
103
|
-
inspect: {},
|
|
104
|
-
context: {
|
|
105
|
-
switches: ['auto', 'cross-project', 'pinned-only'],
|
|
106
|
-
values: ['budget', 'format', 'framing', 'include-recent', 'runtime', 'scope'],
|
|
107
|
-
numbers: ['limit'],
|
|
108
|
-
},
|
|
109
|
-
hook: {},
|
|
110
|
-
setup: { switches: ['all', 'dry-run', 'no-learn', 'no-schedule'] },
|
|
111
|
-
'daily-runner': {},
|
|
112
|
-
embed: { switches: ['global', 'reset-physics', 'status'] },
|
|
113
|
-
watch: {},
|
|
114
|
-
learn: { switches: ['git'], values: ['repos'], numbers: ['days'] },
|
|
115
|
-
promote: {},
|
|
116
|
-
sync: { switches: ['cross-project'] },
|
|
117
|
-
share: { switches: ['auto', 'dry-run', 'force'], numbers: ['min-score'] },
|
|
118
|
-
peers: { switches: ['all-tenants'] },
|
|
119
|
-
import: {
|
|
120
|
-
switches: ['agents', 'dry-run', 'global'],
|
|
121
|
-
values: ['chatgpt', 'claude', 'cursor', 'file', 'markdown', 'name', 'scope', 'vault'],
|
|
122
|
-
lists: ['tag'],
|
|
123
|
-
},
|
|
124
|
-
export: { values: ['format'] },
|
|
125
|
-
capture: { switches: ['dry-run', 'global', 'last-session', 'stdin'], values: ['file', 'log-file', 'transcript'] },
|
|
126
|
-
dashboard: { numbers: ['port'] },
|
|
127
|
-
wm: { switches: ['json'], values: ['content', 'importance', 'scope', 'session', 'task'], numbers: ['limit'] },
|
|
128
|
-
mcp: {},
|
|
129
|
-
serve: { values: ['host', 'tls-cert', 'tls-key'], numbers: ['port'] },
|
|
130
|
-
invalidate: { switches: ['churn', 'dry-run'], values: ['id', 'reason'] },
|
|
131
|
-
decide: { values: ['context', 'status', 'supersedes'], numbers: ['limit'] },
|
|
132
|
-
incident: { values: ['context', 'resolution', 'status'], numbers: ['limit'], lists: ['link'] },
|
|
133
|
-
process: { values: ['change', 'description', 'status'], numbers: ['limit'], lists: ['step'] },
|
|
134
|
-
policy: { values: ['change', 'from', 'name', 'status', 'text', 'to'], numbers: ['limit'] },
|
|
135
|
-
skill: { values: ['change', 'instructions', 'status', 'trigger'], numbers: ['limit'] },
|
|
136
|
-
brief: { switches: ['dry-run'], values: ['change', 'repo', 'status', 'summary'], numbers: ['limit'] },
|
|
137
|
-
note: { values: ['change', 'customer', 'status', 'text'], numbers: ['limit'] },
|
|
138
|
-
graph: { switches: ['json', 'open'], values: ['entity', 'format', 'out'] },
|
|
139
|
-
};
|
|
140
5
|
const FIELD_KINDS = [['switches', 'switch'], ['values', 'value'], ['numbers', 'number'], ['lists', 'list']];
|
|
141
|
-
const DECLARED = new Map([GLOBAL_FLAGS, ...Object.values(
|
|
6
|
+
const DECLARED = new Map([GLOBAL_FLAGS, ...Object.values(COMMANDS).map((row) => row.flags)].map((verb) => [
|
|
142
7
|
verb,
|
|
143
8
|
new Map(FIELD_KINDS.flatMap(([field, kind]) => (verb[field] ?? []).map((name) => [name, kind]))),
|
|
144
9
|
]));
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// The entity graph verbs: rebuild it from the consolidated objects, print it, or write it out as a diagram.
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import { extractGraph } from '../graph/extract.js';
|
|
4
|
+
import { buildGraphModel, renderGraphHtml, renderGraphCanvas, DEFAULT_VIEW_LIMIT } from '../graph/view.js';
|
|
5
|
+
import { printError } from './output.js';
|
|
6
|
+
import { stringFlag } from './flag-values.js';
|
|
7
|
+
import { requireInit } from './shared.js';
|
|
8
|
+
import { CliExit } from './exit.js';
|
|
9
|
+
import { openInBrowser } from './open-browser.js';
|
|
10
|
+
function graphExtract(hippoRoot, tenantId) {
|
|
11
|
+
const result = extractGraph(hippoRoot, tenantId);
|
|
12
|
+
const byType = Object.entries(result.byType)
|
|
13
|
+
.map(([t, n]) => `${t} ${n}`)
|
|
14
|
+
.join(', ');
|
|
15
|
+
const supersedes = result.relations - result.references;
|
|
16
|
+
const relations = `${result.relations} relations (${supersedes} supersedes, ${result.references} references)`;
|
|
17
|
+
console.log(`Graph extracted: ${result.entities} entities (${byType}) + ${relations}.`);
|
|
18
|
+
if (result.truncated.length > 0) {
|
|
19
|
+
printError(`WARNING: under-extracted (hit the per-type cap): ${result.truncated.join(', ')}. The graph is incomplete for those types.`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function graphShow(hippoRoot, tenantId, entity, flags) {
|
|
23
|
+
const model = buildGraphModel(hippoRoot, tenantId, { entity, limit: DEFAULT_VIEW_LIMIT });
|
|
24
|
+
if (flags['json']) {
|
|
25
|
+
console.log(JSON.stringify(model, null, 2));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (model.nodes.length === 0) {
|
|
29
|
+
console.log(entity ? `No entity named "${entity}".` : 'Graph is empty. Run `hippo graph extract` first.');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.log(`Graph: ${model.nodes.length} entities, ${model.edges.length} relations${model.truncated ? ' (truncated)' : ''}`);
|
|
33
|
+
const byType = new Map();
|
|
34
|
+
for (const n of model.nodes) {
|
|
35
|
+
const arr = byType.get(n.type) ?? [];
|
|
36
|
+
arr.push({ id: n.id, name: n.name });
|
|
37
|
+
byType.set(n.type, arr);
|
|
38
|
+
}
|
|
39
|
+
for (const [type, ns] of byType) {
|
|
40
|
+
console.log(`\n${type} (${ns.length}):`);
|
|
41
|
+
for (const n of ns)
|
|
42
|
+
console.log(` [${n.id}] ${n.name}`);
|
|
43
|
+
}
|
|
44
|
+
if (model.edges.length > 0) {
|
|
45
|
+
const nameById = new Map(model.nodes.map((n) => [n.id, n.name]));
|
|
46
|
+
console.log('\nrelations:');
|
|
47
|
+
for (const e of model.edges) {
|
|
48
|
+
console.log(` ${nameById.get(e.from)} --${e.relType}--> ${nameById.get(e.to)}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function graphView(hippoRoot, tenantId, entity, flags) {
|
|
53
|
+
const format = stringFlag(flags, 'format') ?? 'html';
|
|
54
|
+
if (format !== 'html' && format !== 'canvas') {
|
|
55
|
+
printError("graph view: --format must be 'html' or 'canvas'");
|
|
56
|
+
throw new CliExit(1);
|
|
57
|
+
}
|
|
58
|
+
const model = buildGraphModel(hippoRoot, tenantId, { entity, limit: DEFAULT_VIEW_LIMIT });
|
|
59
|
+
const content = format === 'canvas' ? renderGraphCanvas(model) : renderGraphHtml(model);
|
|
60
|
+
const defaultOut = format === 'canvas' ? 'hippo-graph.canvas' : 'hippo-graph.html';
|
|
61
|
+
const out = stringFlag(flags, 'out') ?? defaultOut;
|
|
62
|
+
fs.writeFileSync(out, content, 'utf8');
|
|
63
|
+
console.log(`Wrote ${model.nodes.length} entities + ${model.edges.length} relations to ${out}${model.truncated ? ' (truncated)' : ''}`);
|
|
64
|
+
if (flags['open'] && format === 'html')
|
|
65
|
+
openInBrowser(out);
|
|
66
|
+
}
|
|
67
|
+
export function handleGraph({ hippoRoot, tenantId, args, flags }) {
|
|
68
|
+
requireInit(hippoRoot);
|
|
69
|
+
const subcommand = args[0] ?? '';
|
|
70
|
+
if (subcommand === 'extract')
|
|
71
|
+
return graphExtract(hippoRoot, tenantId);
|
|
72
|
+
const entity = stringFlag(flags, 'entity');
|
|
73
|
+
if (subcommand === 'show')
|
|
74
|
+
return graphShow(hippoRoot, tenantId, entity, flags);
|
|
75
|
+
if (subcommand === 'view')
|
|
76
|
+
return graphView(hippoRoot, tenantId, entity, flags);
|
|
77
|
+
printError('Usage:\n' +
|
|
78
|
+
' hippo graph extract Rebuild the entity/relation graph from consolidated objects\n' +
|
|
79
|
+
' hippo graph show [--entity NAME] [--json] Inspect entities + their edges (text or JSON)\n' +
|
|
80
|
+
' hippo graph view [--out FILE] [--open] [--format html|canvas] [--entity NAME] Generate an interactive node-link diagram');
|
|
81
|
+
throw new CliExit(1);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { HookRuntime } from '../core/capture-contract.js';
|
|
2
|
-
import { type DeliveryEventType, type DeliveryRecorder } from '../store/delivery-recorder.js';
|
|
3
2
|
import type { CliFlags } from './flag-values.js';
|
|
4
3
|
/** Detached worker (internal `__session-end-worker`): counts re-reads, runs sleep, then capture; one stage failing does not block the other. */
|
|
5
4
|
/** A folder without its own store never sleeps at session end, so its project's agent notes go to the global store here. */
|
|
@@ -14,18 +13,19 @@ export declare function reportSessionEndFailure<E>(logFile: string | null, step:
|
|
|
14
13
|
export declare function hostSessionId(): string | undefined;
|
|
15
14
|
/** Compaction drops the pinned blocks the per-prompt hook injected, so record a `reset` for the payload's session and the next prompt injects again.
|
|
16
15
|
* `requiredSource` limits it to payloads with that `source`; best-effort and silent on a malformed payload. */
|
|
17
|
-
export declare function resetHookInjection(hippoRoot: string, stdinText: string | undefined, requiredSource: string | null): void;
|
|
16
|
+
export declare function resetHookInjection(hippoRoot: string, tenantId: string, stdinText: string | undefined, requiredSource: string | null): void;
|
|
18
17
|
/** Store a hook writes to: the project store, else an existing global one, else the project path (skipped: hooks must not create a store).
|
|
19
18
|
* Pre-compact and compact-resume must agree, or a snapshot is looked for in the other store. */
|
|
20
19
|
export declare function hookStoreRoot(hippoRoot: string): string;
|
|
21
20
|
/** `--runtime copilot`, or `--format copilot` on `hippo context`, marks a Copilot hook: the flag decides, never the payload. */
|
|
22
21
|
export declare function hookRuntime(flags: CliFlags): HookRuntime;
|
|
23
|
-
/** A delivery recorder when the ledger store enables one, else null; never throws. */
|
|
24
|
-
export declare function startDeliveryRecorder(hippoRoot: string, stdinText: string | undefined, runtime: HookRuntime, eventType?: DeliveryEventType): DeliveryRecorder | null;
|
|
25
22
|
/** A Copilot hook's project root, from the payload's `cwd`, since VS Code runs user-level hooks in the home folder; other runtimes keep `hippoRoot`. */
|
|
26
23
|
export declare function payloadCwdRoot(hippoRoot: string, stdinText: string | undefined, runtime: HookRuntime): string;
|
|
27
|
-
/** Hook commands share one handle per store and wait at most HOOK_DB_WAIT_MS for a lock; a store still busy after that skips the hook's
|
|
24
|
+
/** Hook commands share one handle per store and wait at most HOOK_DB_WAIT_MS for a lock; a store still busy after that skips the hook's
|
|
25
|
+
* work with one warning, exit 0. */
|
|
28
26
|
export declare function runHookWithStores<T>(fn: () => T | Promise<T>): Promise<T | undefined>;
|
|
29
27
|
/** Whether this session sits in the pilot's holdout arm; off at rate 0 and with no session id. */
|
|
30
|
-
export declare function inPilotHoldout(hippoRoot: string, tenantId: string, sessionId: string | undefined,
|
|
28
|
+
export declare function inPilotHoldout(hippoRoot: string, tenantId: string, sessionId: string | undefined, opts: {
|
|
29
|
+
write: boolean;
|
|
30
|
+
}): boolean;
|
|
31
31
|
//# sourceMappingURL=hook-runtime.d.ts.map
|
package/dist/cli/hook-runtime.js
CHANGED
|
@@ -2,20 +2,15 @@
|
|
|
2
2
|
import { envClaudeCodeSessionId, envHippoSessionId } from '../util/env.js';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import * as fs from 'fs';
|
|
5
|
-
import { getHippoRoot, isInitialized } from '../store/open.js';
|
|
6
|
-
import { loadConfig } from '../core/config.js';
|
|
7
|
-
import { createDeliveryRecorder } from '../store/delivery-recorder.js';
|
|
8
5
|
import { isSqliteBusy, noteStoreBusy, runWithRequestStores, HOOK_DB_WAIT_MS } from '../db/index.js';
|
|
9
|
-
import { bookTokenUse
|
|
6
|
+
import { bookTokenUse } from '../api/ledger-db.js';
|
|
10
7
|
import { sessionPilotArm } from '../api/pilot-arm.js';
|
|
11
|
-
import { hookPayloadSessionId, hookPayloadString, isSubagentPayload } from '../
|
|
12
|
-
import { blockHash } from '../util/token-text.js';
|
|
8
|
+
import { hookPayloadSessionId, hookPayloadString, isSubagentPayload } from '../util/hook-payload.js';
|
|
13
9
|
import { importAtSessionEnd, currentMachine } from '../agent-memories/sync.js';
|
|
14
10
|
import { summaryLine } from '../agent-memories/report.js';
|
|
15
|
-
import {
|
|
11
|
+
import { getHippoRoot, isInitialized } from '../core/project-identity.js';
|
|
16
12
|
import { getGlobalRoot } from '../sharing/global-store.js';
|
|
17
13
|
import { sanitizeLogMessage } from '../capture/compact.js';
|
|
18
|
-
import { resolveTenantId } from '../store/tenant.js';
|
|
19
14
|
import { errorMessage, log } from '../util/log.js';
|
|
20
15
|
/** Detached worker (internal `__session-end-worker`): counts re-reads, runs sleep, then capture; one stage failing does not block the other. */
|
|
21
16
|
/** A folder without its own store never sleeps at session end, so its project's agent notes go to the global store here. */
|
|
@@ -61,13 +56,13 @@ export function hostSessionId() {
|
|
|
61
56
|
}
|
|
62
57
|
/** Compaction drops the pinned blocks the per-prompt hook injected, so record a `reset` for the payload's session and the next prompt injects again.
|
|
63
58
|
* `requiredSource` limits it to payloads with that `source`; best-effort and silent on a malformed payload. */
|
|
64
|
-
export function resetHookInjection(hippoRoot, stdinText, requiredSource) {
|
|
59
|
+
export function resetHookInjection(hippoRoot, tenantId, stdinText, requiredSource) {
|
|
65
60
|
const sessionId = hookPayloadSessionId(stdinText, requiredSource);
|
|
66
61
|
// A sub-agent's compaction leaves its parent's context, and the blocks in it, as they were.
|
|
67
62
|
if (sessionId === null || isSubagentPayload(stdinText))
|
|
68
63
|
return;
|
|
69
64
|
bookTokenUse(hippoRoot, {
|
|
70
|
-
tenantId
|
|
65
|
+
tenantId, sessionId, surface: 'hook', event: 'reset', items: 0, tokens: 0,
|
|
71
66
|
});
|
|
72
67
|
}
|
|
73
68
|
/** Store a hook writes to: the project store, else an existing global one, else the project path (skipped: hooks must not create a store).
|
|
@@ -82,29 +77,6 @@ export function hookStoreRoot(hippoRoot) {
|
|
|
82
77
|
export function hookRuntime(flags) {
|
|
83
78
|
return flags['runtime'] === 'copilot' || flags['format'] === 'copilot' ? 'copilot' : 'claude-code';
|
|
84
79
|
}
|
|
85
|
-
/** A delivery recorder when the ledger store enables one, else null; never throws. */
|
|
86
|
-
export function startDeliveryRecorder(hippoRoot, stdinText, runtime, eventType) {
|
|
87
|
-
try {
|
|
88
|
-
// The same store withLedgerDb writes the token ledger to, so its config governs both.
|
|
89
|
-
const root = ledgerRoot(hippoRoot);
|
|
90
|
-
if (root === null || !loadConfig(root).deliveryLedger.enabled)
|
|
91
|
-
return null;
|
|
92
|
-
return createDeliveryRecorder({
|
|
93
|
-
root,
|
|
94
|
-
storeHash: blockHash(path.resolve(root)),
|
|
95
|
-
writeStore: isGlobalStoreRoot(root) ? 'global' : 'local',
|
|
96
|
-
tenantId: resolveTenantId({}),
|
|
97
|
-
stdinText,
|
|
98
|
-
envSessionId: hostSessionId(),
|
|
99
|
-
runtime: runtime === 'copilot' ? 'copilot' : undefined,
|
|
100
|
-
eventType,
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
catch (error) {
|
|
104
|
-
log.warn(`delivery ledger skipped: ${errorMessage(error)}`);
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
80
|
/** A Copilot hook's project root, from the payload's `cwd`, since VS Code runs user-level hooks in the home folder; other runtimes keep `hippoRoot`. */
|
|
109
81
|
export function payloadCwdRoot(hippoRoot, stdinText, runtime) {
|
|
110
82
|
const cwd = runtime === 'copilot' ? hookPayloadString(stdinText, 'cwd') : null;
|
|
@@ -120,7 +92,8 @@ export function payloadCwdRoot(hippoRoot, stdinText, runtime) {
|
|
|
120
92
|
}
|
|
121
93
|
return getHippoRoot(process.cwd());
|
|
122
94
|
}
|
|
123
|
-
/** Hook commands share one handle per store and wait at most HOOK_DB_WAIT_MS for a lock; a store still busy after that skips the hook's
|
|
95
|
+
/** Hook commands share one handle per store and wait at most HOOK_DB_WAIT_MS for a lock; a store still busy after that skips the hook's
|
|
96
|
+
* work with one warning, exit 0. */
|
|
124
97
|
export async function runHookWithStores(fn) {
|
|
125
98
|
try {
|
|
126
99
|
return await runWithRequestStores(fn, { busyWaitMs: HOOK_DB_WAIT_MS, failFastWhenBusy: true });
|
|
@@ -133,7 +106,7 @@ export async function runHookWithStores(fn) {
|
|
|
133
106
|
}
|
|
134
107
|
}
|
|
135
108
|
/** Whether this session sits in the pilot's holdout arm; off at rate 0 and with no session id. */
|
|
136
|
-
export function inPilotHoldout(hippoRoot, tenantId, sessionId,
|
|
137
|
-
return sessionPilotArm(hippoRoot, tenantId, sessionId, write) === 'holdout';
|
|
109
|
+
export function inPilotHoldout(hippoRoot, tenantId, sessionId, opts) {
|
|
110
|
+
return sessionPilotArm(hippoRoot, tenantId, sessionId, opts.write) === 'holdout';
|
|
138
111
|
}
|
|
139
112
|
//# sourceMappingURL=hook-runtime.js.map
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// First-class object verbs for incidents: open one, resolve it, close it.
|
|
2
|
+
import { extractPathTags } from '../search/path-context.js';
|
|
3
|
+
import * as incidentsModule from '../objects/incidents.js';
|
|
4
|
+
import { printError } from './output.js';
|
|
5
|
+
import { nonEmptyStringFlag, isStringFlag, stringFlag } from './flag-values.js';
|
|
6
|
+
import { requireInit } from './shared.js';
|
|
7
|
+
import { closeObject, foundOrExit, idArgOrExit, listObjects } from './object-verbs.js';
|
|
8
|
+
import { CliExit } from './exit.js';
|
|
9
|
+
const INCIDENT = { cmd: 'incident', noun: 'Incident', idLabel: 'incident' };
|
|
10
|
+
function printIncidentRow(inc) {
|
|
11
|
+
const linkPart = inc.linkedMemoryIds.length > 0 ? ` links=${inc.linkedMemoryIds.length}` : '';
|
|
12
|
+
console.log(`#${inc.id} [${inc.status}]${linkPart} memory=${inc.memoryId ?? '-'}`);
|
|
13
|
+
console.log(` ${inc.incidentText}`);
|
|
14
|
+
if (inc.context)
|
|
15
|
+
console.log(` context: ${inc.context}`);
|
|
16
|
+
}
|
|
17
|
+
function incidentList(hippoRoot, tenantId, flags) {
|
|
18
|
+
listObjects(flags, {
|
|
19
|
+
plural: 'incidents',
|
|
20
|
+
states: incidentsModule.VALID_INCIDENT_STATES,
|
|
21
|
+
load: (opts) => incidentsModule.loadIncidents(hippoRoot, tenantId, opts),
|
|
22
|
+
printRow: printIncidentRow,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function incidentGet(hippoRoot, tenantId, args) {
|
|
26
|
+
const id = idArgOrExit(args, 'Usage: hippo incident get <id>', INCIDENT.idLabel);
|
|
27
|
+
const incident = foundOrExit(incidentsModule.loadIncidentById(hippoRoot, tenantId, id), INCIDENT.noun, id);
|
|
28
|
+
console.log(`Incident #${incident.id}`);
|
|
29
|
+
console.log(` status: ${incident.status}`);
|
|
30
|
+
console.log(` text: ${incident.incidentText}`);
|
|
31
|
+
if (incident.context)
|
|
32
|
+
console.log(` context: ${incident.context}`);
|
|
33
|
+
if (incident.resolutionText)
|
|
34
|
+
console.log(` resolution: ${incident.resolutionText}`);
|
|
35
|
+
if (incident.resolvedAt)
|
|
36
|
+
console.log(` resolved_at: ${incident.resolvedAt}`);
|
|
37
|
+
if (incident.closedAt)
|
|
38
|
+
console.log(` closed_at: ${incident.closedAt}`);
|
|
39
|
+
if (incident.linkedMemoryIds.length > 0) {
|
|
40
|
+
console.log(` linked memories: ${incident.linkedMemoryIds.join(', ')}`);
|
|
41
|
+
}
|
|
42
|
+
if (incident.memoryId)
|
|
43
|
+
console.log(` memory: ${incident.memoryId}`);
|
|
44
|
+
console.log(` created: ${incident.createdAt}`);
|
|
45
|
+
}
|
|
46
|
+
function incidentResolve(hippoRoot, tenantId, args, flags) {
|
|
47
|
+
const id = idArgOrExit(args, 'Usage: hippo incident resolve <id> --resolution "<text>"', INCIDENT.idLabel);
|
|
48
|
+
const resolutionRaw = stringFlag(flags, 'resolution');
|
|
49
|
+
if (!resolutionRaw?.trim()) {
|
|
50
|
+
printError('--resolution requires a non-empty value, e.g. hippo incident resolve <id> --resolution "root cause fixed".');
|
|
51
|
+
throw new CliExit(1);
|
|
52
|
+
}
|
|
53
|
+
const resolved = incidentsModule.resolveIncident(hippoRoot, tenantId, id, resolutionRaw);
|
|
54
|
+
console.log(`Incident #${resolved.id} resolved.`);
|
|
55
|
+
}
|
|
56
|
+
function incidentClose(hippoRoot, tenantId, args) {
|
|
57
|
+
closeObject(args, INCIDENT, (id) => incidentsModule.closeIncident(hippoRoot, tenantId, id));
|
|
58
|
+
}
|
|
59
|
+
export function handleIncident({ hippoRoot, tenantId, args, flags }) {
|
|
60
|
+
requireInit(hippoRoot);
|
|
61
|
+
const subcommand = args[0] ?? '';
|
|
62
|
+
if (subcommand === 'list')
|
|
63
|
+
return incidentList(hippoRoot, tenantId, flags);
|
|
64
|
+
if (subcommand === 'get')
|
|
65
|
+
return incidentGet(hippoRoot, tenantId, args);
|
|
66
|
+
if (subcommand === 'resolve')
|
|
67
|
+
return incidentResolve(hippoRoot, tenantId, args, flags);
|
|
68
|
+
if (subcommand === 'close')
|
|
69
|
+
return incidentClose(hippoRoot, tenantId, args);
|
|
70
|
+
// Default subcommand is open (create): accept both `incident open "<text>"` and bare `incident "<text>"`;
|
|
71
|
+
// for the `open` keyword the text is args[1], otherwise args[0] is the text.
|
|
72
|
+
incidentCreate(hippoRoot, tenantId, subcommand === 'open' ? (args[1] ?? '') : subcommand, flags);
|
|
73
|
+
}
|
|
74
|
+
function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
|
|
75
|
+
if (!incidentText) {
|
|
76
|
+
printError('Usage: hippo incident "<incident>" [--context "<details>"] [--link <memory-id>]...');
|
|
77
|
+
printError(' hippo incident list [--status open|resolved|closed|all] [--limit N]');
|
|
78
|
+
printError(' hippo incident get <id>');
|
|
79
|
+
printError(' hippo incident resolve <id> --resolution "<text>"');
|
|
80
|
+
printError(' hippo incident close <id>');
|
|
81
|
+
throw new CliExit(1);
|
|
82
|
+
}
|
|
83
|
+
const context = nonEmptyStringFlag(flags, 'context');
|
|
84
|
+
// --link is a repeatable flag (collected into an array by parseArgs). A
|
|
85
|
+
// single --link <id> yields a string; normalize both to string[].
|
|
86
|
+
const linkRaw = flags['link'];
|
|
87
|
+
let linkedMemoryIds;
|
|
88
|
+
if (Array.isArray(linkRaw)) {
|
|
89
|
+
linkedMemoryIds = linkRaw;
|
|
90
|
+
}
|
|
91
|
+
else if (isStringFlag(linkRaw)) {
|
|
92
|
+
linkedMemoryIds = [linkRaw];
|
|
93
|
+
}
|
|
94
|
+
else if (linkRaw === true) {
|
|
95
|
+
printError('--link requires a memory id, e.g. hippo incident "<text>" --link mem_abc123.');
|
|
96
|
+
throw new CliExit(1);
|
|
97
|
+
}
|
|
98
|
+
const incidentPathTags = extractPathTags(process.cwd());
|
|
99
|
+
const created = incidentsModule.saveIncident(hippoRoot, tenantId, {
|
|
100
|
+
incidentText,
|
|
101
|
+
context,
|
|
102
|
+
linkedMemoryIds,
|
|
103
|
+
extraTags: incidentPathTags,
|
|
104
|
+
});
|
|
105
|
+
console.log(`Incident recorded: #${created.id}`);
|
|
106
|
+
if (created.memoryId)
|
|
107
|
+
console.log(` memory: ${created.memoryId}`);
|
|
108
|
+
if (created.linkedMemoryIds.length > 0) {
|
|
109
|
+
console.log(` linked memories: ${created.linkedMemoryIds.join(', ')}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=incidents.js.map
|
package/dist/cli/init.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type CommandContext } from './flag-values.js';
|
|
2
|
-
export declare function handleInit({ hippoRoot, flags }: CommandContext): void
|
|
2
|
+
export declare function handleInit({ hippoRoot, tenantId, flags }: CommandContext): Promise<void>;
|
|
3
3
|
//# sourceMappingURL=init.d.ts.map
|
package/dist/cli/init.js
CHANGED
|
@@ -8,18 +8,23 @@ import { writeFileAtomic } from '../util/atomic-write.js';
|
|
|
8
8
|
import { isCodexPresent } from '../hooks/shared.js';
|
|
9
9
|
import { isCodexWrapperInstalled } from '../hooks/codex-wrapper.js';
|
|
10
10
|
import { installOpencodePlugin } from '../hooks/opencode.js';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
11
|
+
import { initMemoryStore } from '../api/store-init.js';
|
|
12
|
+
import { isInitialized } from '../core/project-identity.js';
|
|
13
|
+
import { listMemories } from '../api/memories.js';
|
|
14
|
+
import { cliApiContext } from './api-context.js';
|
|
13
15
|
import { isGitRepo } from '../learn/autolearn.js';
|
|
14
16
|
import { currentMachine, importForStore, importProjectMemories, importUserMemories } from '../agent-memories/sync.js';
|
|
15
17
|
import { emptyReport, mergeReports } from '../agent-memories/report.js';
|
|
16
18
|
import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
|
|
17
19
|
import { registerWorkspace } from './scheduler.js';
|
|
18
|
-
import { stringFlag } from './flag-values.js';
|
|
20
|
+
import { numberFlag, stringFlag } from './flag-values.js';
|
|
19
21
|
import { printAgentImport } from './print.js';
|
|
22
|
+
import { errorCode, errorMessage, log } from '../util/log.js';
|
|
20
23
|
import { installCodexMemoryHooks, setupDailySchedule, warnClaudeSettingsUnusable } from './install-steps.js';
|
|
21
24
|
import { learnFromRepo, skipLearnOnSharedStore } from './shared.js';
|
|
22
25
|
import { HOOK_MARKERS, HOOKS, hippoBlock } from '../hooks/hook-blocks.js';
|
|
26
|
+
// An unreadable or vanished folder is expected while scanning; any other failure is worth a line.
|
|
27
|
+
const QUIET_SCAN_ERRORS = new Set(['EACCES', 'EPERM', 'ENOENT', 'ENOTDIR']);
|
|
23
28
|
function scanForGitRepos(rootDir, maxDepth = 2) {
|
|
24
29
|
const repos = [];
|
|
25
30
|
function walk(dir, depth) {
|
|
@@ -40,7 +45,11 @@ function scanForGitRepos(rootDir, maxDepth = 2) {
|
|
|
40
45
|
walk(full, depth + 1);
|
|
41
46
|
}
|
|
42
47
|
}
|
|
43
|
-
catch {
|
|
48
|
+
catch (err) {
|
|
49
|
+
const code = errorCode(err);
|
|
50
|
+
if (!QUIET_SCAN_ERRORS.has(code))
|
|
51
|
+
log.warn(`repo scan skipped ${dir}`, { code: code || 'unknown', reason: errorMessage(err) });
|
|
52
|
+
}
|
|
44
53
|
}
|
|
45
54
|
// Check if rootDir itself is a git repo
|
|
46
55
|
if (fs.existsSync(path.join(rootDir, '.git')))
|
|
@@ -49,22 +58,22 @@ function scanForGitRepos(rootDir, maxDepth = 2) {
|
|
|
49
58
|
return repos;
|
|
50
59
|
}
|
|
51
60
|
/** Creates the repo's store when absent and registers it; returns whether it already existed. */
|
|
52
|
-
function initScannedRepo(repo, globalRoot) {
|
|
61
|
+
function initScannedRepo(repo, tenantId, globalRoot) {
|
|
53
62
|
const repoHippo = path.join(repo, '.hippo');
|
|
54
63
|
const alreadyExists = isInitialized(repoHippo);
|
|
55
64
|
if (!alreadyExists) {
|
|
56
|
-
|
|
65
|
+
initMemoryStore(cliApiContext(repoHippo, tenantId));
|
|
57
66
|
}
|
|
58
67
|
registerWorkspace(globalRoot, repo);
|
|
59
68
|
return alreadyExists;
|
|
60
69
|
}
|
|
61
70
|
/** Seeds one scanned repo from git history and its agents' notes, unless --no-learn. */
|
|
62
|
-
function learnScannedRepo(repo, seedDays, learn, machine, agentImport) {
|
|
71
|
+
async function learnScannedRepo(repo, tenantId, seedDays, learn, machine, agentImport) {
|
|
63
72
|
const repoHippo = path.join(repo, '.hippo');
|
|
64
73
|
let added = 0;
|
|
65
74
|
let lowInfo = 0;
|
|
66
75
|
if (learn && isGitRepo(repo)) {
|
|
67
|
-
const result = learnFromRepo(repoHippo, repo, seedDays, path.basename(repo));
|
|
76
|
+
const result = await learnFromRepo(repoHippo, tenantId, repo, seedDays, path.basename(repo));
|
|
68
77
|
added = result.added;
|
|
69
78
|
lowInfo = result.lowInfo;
|
|
70
79
|
}
|
|
@@ -93,7 +102,7 @@ function printScanSummary(repoCount, totalLessons, totalLowInfo) {
|
|
|
93
102
|
(totalLowInfo > 0 ? `, ${totalLowInfo} low-information subject(s) dropped` : '') +
|
|
94
103
|
'.');
|
|
95
104
|
}
|
|
96
|
-
function cmdInitScan(scanDir, flags) {
|
|
105
|
+
async function cmdInitScan(scanDir, tenantId, flags) {
|
|
97
106
|
const resolved = path.resolve(scanDir);
|
|
98
107
|
console.log(`Scanning ${resolved} for git repositories...\n`);
|
|
99
108
|
const repos = scanForGitRepos(resolved);
|
|
@@ -106,17 +115,17 @@ function cmdInitScan(scanDir, flags) {
|
|
|
106
115
|
let totalLessons = 0;
|
|
107
116
|
// Rolled up so the cross-repo summary reports the gate too: a dropped subject is never invisible.
|
|
108
117
|
let totalLowInfo = 0;
|
|
109
|
-
const seedDays =
|
|
118
|
+
const seedDays = numberFlag(flags, 'days') ?? 365;
|
|
110
119
|
const machine = currentMachine();
|
|
111
120
|
const agentImport = emptyReport();
|
|
112
121
|
const learn = !flags['no-learn'];
|
|
113
122
|
for (const repo of repos) {
|
|
114
|
-
const alreadyExists = initScannedRepo(repo, globalRoot);
|
|
115
|
-
const { added, lowInfo } = learnScannedRepo(repo, seedDays, learn, machine, agentImport);
|
|
123
|
+
const alreadyExists = initScannedRepo(repo, tenantId, globalRoot);
|
|
124
|
+
const { added, lowInfo } = await learnScannedRepo(repo, tenantId, seedDays, learn, machine, agentImport);
|
|
116
125
|
totalLessons += added;
|
|
117
126
|
totalLowInfo += lowInfo;
|
|
118
127
|
const status = alreadyExists ? 'existing' : 'new';
|
|
119
|
-
const entries =
|
|
128
|
+
const entries = listMemories(cliApiContext(path.join(repo, '.hippo'), tenantId), { everyTenant: true });
|
|
120
129
|
console.log(` ${path.basename(repo).padEnd(25)} ${status.padEnd(10)} ${entries.length} memories${added > 0 ? ` (+${added} from git)` : ''}`);
|
|
121
130
|
}
|
|
122
131
|
printScanSummary(repos.length, totalLessons, totalLowInfo);
|
|
@@ -144,12 +153,12 @@ function initGlobalOnly(flags) {
|
|
|
144
153
|
if (!flags['no-learn'])
|
|
145
154
|
printAgentImport(importUserMemories(globalRoot, { machine: currentMachine() }));
|
|
146
155
|
}
|
|
147
|
-
function seedFromGitHistory(hippoRoot) {
|
|
156
|
+
async function seedFromGitHistory(hippoRoot, tenantId) {
|
|
148
157
|
if (!isGitRepo(process.cwd()))
|
|
149
158
|
return;
|
|
150
159
|
const seedDays = 30;
|
|
151
160
|
console.log(`\n Seeding memories from last ${seedDays} days of git history...`);
|
|
152
|
-
const { added, skipped } = learnFromRepo(hippoRoot, process.cwd(), seedDays);
|
|
161
|
+
const { added, skipped } = await learnFromRepo(hippoRoot, tenantId, process.cwd(), seedDays);
|
|
153
162
|
if (added > 0) {
|
|
154
163
|
console.log(` Learned ${added} lessons from git (${skipped} duplicates skipped).`);
|
|
155
164
|
}
|
|
@@ -157,11 +166,11 @@ function seedFromGitHistory(hippoRoot) {
|
|
|
157
166
|
console.log(` No matching commits found in git history.`);
|
|
158
167
|
}
|
|
159
168
|
}
|
|
160
|
-
export function handleInit({ hippoRoot, flags }) {
|
|
169
|
+
export async function handleInit({ hippoRoot, tenantId, flags }) {
|
|
161
170
|
// Handle --scan mode
|
|
162
171
|
if (flags['scan']) {
|
|
163
172
|
const scanDir = stringFlag(flags, 'scan') ?? os.homedir();
|
|
164
|
-
cmdInitScan(scanDir, flags);
|
|
173
|
+
await cmdInitScan(scanDir, tenantId, flags);
|
|
165
174
|
return;
|
|
166
175
|
}
|
|
167
176
|
if (flags['global']) {
|
|
@@ -173,7 +182,7 @@ export function handleInit({ hippoRoot, flags }) {
|
|
|
173
182
|
console.log('Already initialized at', hippoRoot);
|
|
174
183
|
}
|
|
175
184
|
else {
|
|
176
|
-
|
|
185
|
+
initMemoryStore(cliApiContext(hippoRoot, tenantId));
|
|
177
186
|
console.log('Initialized Hippo at', hippoRoot);
|
|
178
187
|
console.log(' Directories: buffer/ episodic/ semantic/ conflicts/');
|
|
179
188
|
console.log(' Files: hippo.db stats.json');
|
|
@@ -190,7 +199,7 @@ export function handleInit({ hippoRoot, flags }) {
|
|
|
190
199
|
const learn = !flags['no-learn'] && !skipLearnOnSharedStore(hippoRoot);
|
|
191
200
|
// Seed with git history on first init (unless --no-learn)
|
|
192
201
|
if (!alreadyExists && learn && !flags['global'])
|
|
193
|
-
seedFromGitHistory(hippoRoot);
|
|
202
|
+
await seedFromGitHistory(hippoRoot, tenantId);
|
|
194
203
|
// Every run, not only the first: an agent's notes change between inits.
|
|
195
204
|
if (learn)
|
|
196
205
|
printAgentImport(importForStore(hippoRoot, { machine: currentMachine() }));
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type InstallResult } from '../hooks/json-hooks.js';
|
|
2
2
|
/** Adds hippo's two Codex hooks and says what changed; each install ends on the trust reminder, since Codex skips an untrusted hook. */
|
|
3
3
|
export declare function installCodexMemoryHooks(indent: string): void;
|
|
4
|
-
/** The one line init, hook install, hook uninstall and setup print when Claude Code's settings.json is not JSON hippo can edit and so was
|
|
4
|
+
/** The one line init, hook install, hook uninstall and setup print when Claude Code's settings.json is not JSON hippo can edit and so was
|
|
5
|
+
* left unchanged; true when it printed. */
|
|
5
6
|
export declare function warnClaudeSettingsUnusable(result: Pick<InstallResult, 'settingsPath' | 'invalidJson'>, indent: string, action?: 'install' | 'uninstall'): boolean;
|
|
6
7
|
export declare function setupDailySchedule(globalRoot: string): void;
|
|
7
8
|
//# sourceMappingURL=install-steps.d.ts.map
|