hippo-memory 1.60.0 → 1.62.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 +29 -54
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.d.ts +1 -1
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.d.ts +3 -1
- package/dist/agent-memories/claude-code.js +54 -10
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/gemini.js +1 -1
- package/dist/agent-memories/legacy.js +1 -1
- package/dist/agent-memories/source.js +1 -1
- package/dist/agent-memories/sync.d.ts +3 -3
- package/dist/agent-memories/sync.js +22 -9
- package/dist/agent-memories/types.d.ts +0 -2
- package/dist/ambient-store.d.ts +14 -0
- package/dist/ambient-store.js +90 -0
- package/dist/ambient.d.ts +23 -0
- package/dist/ambient.js +72 -50
- package/dist/api/assemble.d.ts +93 -0
- package/dist/api/assemble.js +153 -0
- package/dist/api/audit.d.ts +17 -0
- package/dist/api/audit.js +23 -0
- package/dist/api/auth.d.ts +79 -0
- package/dist/api/auth.js +178 -0
- package/dist/api/context-select.d.ts +49 -0
- package/dist/api/context-select.js +344 -0
- package/dist/api/context-types.d.ts +105 -0
- package/dist/api/context-types.js +3 -0
- package/dist/api/context.d.ts +31 -0
- package/dist/api/context.js +378 -0
- package/dist/api/dormant.d.ts +30 -0
- package/dist/api/dormant.js +140 -0
- package/dist/api/drill-down.d.ts +84 -0
- package/dist/api/drill-down.js +126 -0
- package/dist/api/forget.d.ts +57 -0
- package/dist/api/forget.js +87 -0
- package/dist/api/goals.d.ts +18 -0
- package/dist/api/goals.js +33 -0
- package/dist/api/learn.d.ts +31 -0
- package/dist/api/learn.js +88 -0
- package/dist/api/outcome.d.ts +61 -0
- package/dist/api/outcome.js +66 -0
- package/dist/api/promote.d.ts +54 -0
- package/dist/api/promote.js +192 -0
- package/dist/api/quarantine.d.ts +24 -0
- package/dist/api/quarantine.js +121 -0
- package/dist/api/recall-types.d.ts +390 -0
- package/dist/api/recall-types.js +3 -0
- package/dist/api/recall.d.ts +36 -0
- package/dist/api/recall.js +499 -0
- package/dist/api/remember.d.ts +35 -0
- package/dist/api/remember.js +43 -0
- package/dist/api/sleep.d.ts +136 -0
- package/dist/api/sleep.js +256 -0
- package/dist/api/tokens.d.ts +26 -0
- package/dist/api/tokens.js +60 -0
- package/dist/api/types.d.ts +56 -0
- package/dist/api/types.js +38 -0
- package/dist/api.d.ts +20 -1262
- package/dist/api.js +25 -2727
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +6 -3
- package/dist/auth.d.ts +45 -4
- package/dist/auth.js +125 -48
- package/dist/autolearn.js +2 -2
- package/dist/capture/command.d.ts +33 -0
- package/dist/capture/command.js +264 -0
- package/dist/capture/compact.d.ts +44 -0
- package/dist/capture/compact.js +354 -0
- package/dist/capture/extract.d.ts +21 -0
- package/dist/capture/extract.js +464 -0
- package/dist/capture/transcript.d.ts +40 -0
- package/dist/capture/transcript.js +193 -0
- package/dist/capture-error.js +2 -1
- package/dist/churn-git.js +4 -2
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.js +159 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.js +171 -0
- package/dist/cli/briefs.d.ts +4 -0
- package/dist/cli/briefs.js +453 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +333 -0
- package/dist/cli/context.d.ts +15 -0
- package/dist/cli/context.js +376 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +457 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +556 -0
- package/dist/cli/dag.d.ts +5 -0
- package/dist/cli/dag.js +177 -0
- package/dist/cli/decisions.d.ts +4 -0
- package/dist/cli/decisions.js +528 -0
- package/dist/cli/eval.d.ts +5 -0
- package/dist/cli/eval.js +213 -0
- package/dist/cli/explain.d.ts +4 -0
- package/dist/cli/explain.js +156 -0
- package/dist/cli/goals.d.ts +2 -0
- package/dist/cli/goals.js +196 -0
- package/dist/cli/hook-blocks.d.ts +18 -0
- package/dist/cli/hook-blocks.js +233 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +305 -0
- package/dist/cli/maintenance.d.ts +4 -0
- package/dist/cli/maintenance.js +190 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +573 -0
- package/dist/cli/projects.js +9 -6
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +582 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +485 -0
- package/dist/cli/serve.d.ts +5 -0
- package/dist/cli/serve.js +40 -0
- package/dist/cli/session-hooks.d.ts +29 -0
- package/dist/cli/session-hooks.js +647 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +397 -0
- package/dist/cli/shared.d.ts +15 -19
- package/dist/cli/shared.js +50 -341
- package/dist/cli/slack.d.ts +2 -0
- package/dist/cli/slack.js +171 -0
- package/dist/cli/status.d.ts +18 -0
- package/dist/cli/status.js +409 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +424 -0
- package/dist/cli/usage.d.ts +85 -0
- package/dist/cli/usage.js +741 -0
- package/dist/cli.d.ts +71 -120
- package/dist/cli.js +170 -8469
- package/dist/client.js +15 -8
- package/dist/compaction-record.d.ts +0 -2
- package/dist/compaction-record.js +7 -5
- package/dist/connectors/github/backfill.js +94 -87
- package/dist/connectors/github/cli-impl.js +4 -3
- package/dist/connectors/github/dlq.js +67 -54
- package/dist/connectors/github/ingest.js +34 -35
- package/dist/connectors/github/tenant-routing.js +3 -2
- package/dist/connectors/github/webhook.js +135 -216
- package/dist/connectors/slack/dlq.js +49 -61
- package/dist/connectors/slack/ingest.js +55 -48
- package/dist/connectors/slack/tenant-routing.js +4 -3
- package/dist/connectors/slack/webhook.js +72 -74
- package/dist/consolidate/conflicts.d.ts +10 -0
- package/dist/consolidate/conflicts.js +178 -0
- package/dist/consolidate/decay.d.ts +12 -0
- package/dist/consolidate/decay.js +145 -0
- package/dist/consolidate/llm-passes.d.ts +3 -0
- package/dist/consolidate/llm-passes.js +141 -0
- package/dist/consolidate/merge.d.ts +7 -0
- package/dist/consolidate/merge.js +251 -0
- package/dist/consolidate/physics-pass.d.ts +3 -0
- package/dist/consolidate/physics-pass.js +60 -0
- package/dist/consolidate/run.d.ts +69 -0
- package/dist/consolidate/run.js +76 -0
- package/dist/consolidate/sleep.d.ts +18 -0
- package/dist/consolidate/sleep.js +209 -0
- package/dist/consolidate/traces.d.ts +4 -0
- package/dist/consolidate/traces.js +178 -0
- package/dist/context-auto.js +7 -11
- package/dist/context-render.d.ts +1 -1
- package/dist/context-render.js +1 -1
- package/dist/customer-notes.d.ts +3 -0
- package/dist/customer-notes.js +83 -72
- package/dist/dag.js +225 -188
- package/dist/dashboard-actions.d.ts +20 -0
- package/dist/dashboard-actions.js +88 -0
- package/dist/dashboard-params.d.ts +45 -0
- package/dist/dashboard-params.js +127 -0
- package/dist/dashboard-queries.d.ts +15 -0
- package/dist/dashboard-queries.js +355 -0
- package/dist/dashboard-snapshot.d.ts +138 -0
- package/dist/dashboard-snapshot.js +308 -0
- package/dist/dashboard-types.d.ts +163 -0
- package/dist/dashboard-types.js +3 -0
- package/dist/dashboard.d.ts +6 -7
- package/dist/dashboard.js +228 -202
- package/dist/db/busy.d.ts +5 -0
- package/dist/db/busy.js +24 -0
- package/dist/db/continuity.d.ts +5 -0
- package/dist/db/continuity.js +145 -0
- package/dist/db/meta.d.ts +8 -0
- package/dist/db/meta.js +35 -0
- package/dist/db/migrate.d.ts +9 -0
- package/dist/db/migrate.js +138 -0
- package/dist/db/migrations/index.d.ts +5 -0
- package/dist/db/migrations/index.js +109 -0
- package/dist/db/migrations/types.d.ts +14 -0
- package/dist/db/migrations/types.js +2 -0
- package/dist/db/migrations/v01.d.ts +3 -0
- package/dist/db/migrations/v01.js +38 -0
- package/dist/db/migrations/v02.d.ts +3 -0
- package/dist/db/migrations/v02.js +21 -0
- package/dist/db/migrations/v03.d.ts +3 -0
- package/dist/db/migrations/v03.js +22 -0
- package/dist/db/migrations/v04.d.ts +3 -0
- package/dist/db/migrations/v04.js +28 -0
- package/dist/db/migrations/v05.d.ts +3 -0
- package/dist/db/migrations/v05.js +21 -0
- package/dist/db/migrations/v06.d.ts +3 -0
- package/dist/db/migrations/v06.js +25 -0
- package/dist/db/migrations/v07.d.ts +3 -0
- package/dist/db/migrations/v07.js +13 -0
- package/dist/db/migrations/v08.d.ts +3 -0
- package/dist/db/migrations/v08.js +8 -0
- package/dist/db/migrations/v09.d.ts +3 -0
- package/dist/db/migrations/v09.js +13 -0
- package/dist/db/migrations/v10.d.ts +3 -0
- package/dist/db/migrations/v10.js +17 -0
- package/dist/db/migrations/v11.d.ts +3 -0
- package/dist/db/migrations/v11.js +15 -0
- package/dist/db/migrations/v12.d.ts +3 -0
- package/dist/db/migrations/v12.js +11 -0
- package/dist/db/migrations/v13.d.ts +3 -0
- package/dist/db/migrations/v13.js +15 -0
- package/dist/db/migrations/v14.d.ts +3 -0
- package/dist/db/migrations/v14.js +66 -0
- package/dist/db/migrations/v15.d.ts +3 -0
- package/dist/db/migrations/v15.js +42 -0
- package/dist/db/migrations/v16.d.ts +3 -0
- package/dist/db/migrations/v16.js +61 -0
- package/dist/db/migrations/v17.d.ts +3 -0
- package/dist/db/migrations/v17.js +46 -0
- package/dist/db/migrations/v18.d.ts +3 -0
- package/dist/db/migrations/v18.js +60 -0
- package/dist/db/migrations/v19.d.ts +3 -0
- package/dist/db/migrations/v19.js +28 -0
- package/dist/db/migrations/v20.d.ts +3 -0
- package/dist/db/migrations/v20.js +42 -0
- package/dist/db/migrations/v21.d.ts +3 -0
- package/dist/db/migrations/v21.js +16 -0
- package/dist/db/migrations/v22.d.ts +3 -0
- package/dist/db/migrations/v22.js +82 -0
- package/dist/db/migrations/v23.d.ts +3 -0
- package/dist/db/migrations/v23.js +48 -0
- package/dist/db/migrations/v24.d.ts +3 -0
- package/dist/db/migrations/v24.js +72 -0
- package/dist/db/migrations/v25.d.ts +3 -0
- package/dist/db/migrations/v25.js +46 -0
- package/dist/db/migrations/v26.d.ts +3 -0
- package/dist/db/migrations/v26.js +23 -0
- package/dist/db/migrations/v27.d.ts +3 -0
- package/dist/db/migrations/v27.js +57 -0
- package/dist/db/migrations/v28.d.ts +3 -0
- package/dist/db/migrations/v28.js +38 -0
- package/dist/db/migrations/v29.d.ts +3 -0
- package/dist/db/migrations/v29.js +78 -0
- package/dist/db/migrations/v30.d.ts +3 -0
- package/dist/db/migrations/v30.js +92 -0
- package/dist/db/migrations/v31.d.ts +3 -0
- package/dist/db/migrations/v31.js +74 -0
- package/dist/db/migrations/v32.d.ts +3 -0
- package/dist/db/migrations/v32.js +102 -0
- package/dist/db/migrations/v33.d.ts +3 -0
- package/dist/db/migrations/v33.js +104 -0
- package/dist/db/migrations/v34.d.ts +3 -0
- package/dist/db/migrations/v34.js +93 -0
- package/dist/db/migrations/v35.d.ts +3 -0
- package/dist/db/migrations/v35.js +98 -0
- package/dist/db/migrations/v36.d.ts +3 -0
- package/dist/db/migrations/v36.js +98 -0
- package/dist/db/migrations/v37.d.ts +3 -0
- package/dist/db/migrations/v37.js +219 -0
- package/dist/db/migrations/v38.d.ts +3 -0
- package/dist/db/migrations/v38.js +277 -0
- package/dist/db/migrations/v39.d.ts +3 -0
- package/dist/db/migrations/v39.js +59 -0
- package/dist/db/migrations/v40.d.ts +3 -0
- package/dist/db/migrations/v40.js +74 -0
- package/dist/db/migrations/v41.d.ts +3 -0
- package/dist/db/migrations/v41.js +43 -0
- package/dist/db/migrations/v42.d.ts +3 -0
- package/dist/db/migrations/v42.js +41 -0
- package/dist/db/migrations/v43.d.ts +3 -0
- package/dist/db/migrations/v43.js +67 -0
- package/dist/db/migrations/v44.d.ts +3 -0
- package/dist/db/migrations/v44.js +28 -0
- package/dist/db/migrations/v45.d.ts +3 -0
- package/dist/db/migrations/v45.js +30 -0
- package/dist/db/migrations/v46.d.ts +3 -0
- package/dist/db/migrations/v46.js +25 -0
- package/dist/db/migrations/v47.d.ts +3 -0
- package/dist/db/migrations/v47.js +17 -0
- package/dist/db/migrations/v48.d.ts +3 -0
- package/dist/db/migrations/v48.js +10 -0
- package/dist/db/migrations/v49.d.ts +3 -0
- package/dist/db/migrations/v49.js +31 -0
- package/dist/db/migrations/v50.d.ts +3 -0
- package/dist/db/migrations/v50.js +67 -0
- package/dist/db/migrations/v51.d.ts +3 -0
- package/dist/db/migrations/v51.js +14 -0
- package/dist/db/migrations/v52.d.ts +3 -0
- package/dist/db/migrations/v52.js +7 -0
- package/dist/db/open.d.ts +23 -0
- package/dist/db/open.js +146 -0
- package/dist/db/sqlite.d.ts +21 -0
- package/dist/db/sqlite.js +8 -0
- package/dist/db/tables.d.ts +7 -0
- package/dist/db/tables.js +38 -0
- package/dist/db.d.ts +6 -46
- package/dist/db.js +5 -3049
- package/dist/decisions.d.ts +4 -1
- package/dist/decisions.js +102 -83
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +4 -1
- package/dist/doctor.js +14 -10
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +4 -3
- package/dist/embeddings.d.ts +9 -52
- package/dist/embeddings.js +43 -297
- package/dist/env.d.ts +75 -0
- package/dist/env.js +119 -0
- package/dist/eval-suite.js +1 -1
- package/dist/eval.js +2 -2
- package/dist/extract.js +1 -1
- package/dist/gated-write.js +3 -1
- package/dist/goals.d.ts +3 -1
- package/dist/goals.js +117 -86
- package/dist/graph/read.d.ts +73 -0
- package/dist/graph/read.js +325 -0
- package/dist/graph/rows.d.ts +45 -0
- package/dist/graph/rows.js +51 -0
- package/dist/graph/types.d.ts +83 -0
- package/dist/graph/types.js +11 -0
- package/dist/graph/write.d.ts +93 -0
- package/dist/{graph.js → graph/write.js} +6 -384
- package/dist/graph-extract.js +2 -1
- package/dist/graph-recall.d.ts +1 -1
- package/dist/graph-recall.js +2 -2
- package/dist/graph-stream.js +1 -1
- package/dist/graph-view.d.ts +1 -1
- package/dist/graph-view.js +1 -1
- package/dist/half-life-migration.d.ts +1 -1
- package/dist/half-life-migration.js +2 -1
- package/dist/hooks/codex-session.d.ts +8 -0
- package/dist/hooks/codex-session.js +76 -0
- package/dist/hooks/codex-wrapper.d.ts +55 -0
- package/dist/hooks/codex-wrapper.js +288 -0
- package/dist/hooks/json-hooks.d.ts +63 -0
- package/dist/hooks/json-hooks.js +356 -0
- package/dist/hooks/opencode.d.ts +50 -0
- package/dist/hooks/opencode.js +202 -0
- package/dist/hooks/shared.d.ts +54 -0
- package/dist/hooks/shared.js +77 -0
- package/dist/http-retry.d.ts +2 -0
- package/dist/http-retry.js +4 -3
- package/dist/http-util.d.ts +3 -0
- package/dist/http-util.js +10 -0
- package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
- package/dist/importers/core.js +141 -0
- package/dist/importers/markdown-parse.d.ts +41 -0
- package/dist/importers/markdown-parse.js +132 -0
- package/dist/importers/markdown.d.ts +3 -0
- package/dist/importers/markdown.js +92 -0
- package/dist/importers/sources.d.ts +7 -0
- package/dist/importers/sources.js +229 -0
- package/dist/importers/vault.d.ts +11 -0
- package/dist/importers/vault.js +352 -0
- package/dist/incidents.d.ts +3 -0
- package/dist/incidents.js +52 -43
- package/dist/index.d.ts +25 -6
- package/dist/index.js +23 -6
- package/dist/invalidation.js +2 -1
- package/dist/judgment.js +2 -1
- package/dist/keyset.d.ts +13 -0
- package/dist/keyset.js +8 -0
- package/dist/local-embedding.d.ts +13 -0
- package/dist/local-embedding.js +165 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +19 -1
- package/dist/mcp/admin-tools.d.ts +8 -0
- package/dist/mcp/admin-tools.js +116 -0
- package/dist/mcp/format.d.ts +27 -0
- package/dist/mcp/format.js +135 -0
- package/dist/mcp/memory-tools.d.ts +5 -0
- package/dist/mcp/memory-tools.js +83 -0
- package/dist/mcp/protocol.d.ts +83 -0
- package/dist/mcp/protocol.js +55 -0
- package/dist/mcp/recall-tools.d.ts +6 -0
- package/dist/mcp/recall-tools.js +320 -0
- package/dist/mcp/request.d.ts +10 -0
- package/dist/mcp/request.js +163 -0
- package/dist/mcp/server.d.ts +4 -75
- package/dist/mcp/server.js +7 -1190
- package/dist/mcp/session-state.d.ts +11 -0
- package/dist/mcp/session-state.js +28 -0
- package/dist/mcp/stdio.d.ts +8 -0
- package/dist/mcp/stdio.js +79 -0
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.js +247 -0
- package/dist/memory.d.ts +3 -0
- package/dist/memory.js +27 -1
- package/dist/multihop.d.ts +1 -1
- package/dist/multihop.js +2 -1
- package/dist/owner-validation.js +2 -1
- package/dist/physics-state.js +10 -7
- package/dist/policies.d.ts +3 -0
- package/dist/policies.js +93 -74
- package/dist/postinstall.js +3 -2
- package/dist/predictions/planning-fallacy.d.ts +100 -0
- package/dist/predictions/planning-fallacy.js +190 -0
- package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
- package/dist/predictions/store.js +434 -0
- package/dist/processes.d.ts +3 -0
- package/dist/processes.js +94 -76
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +142 -113
- package/dist/project-identity.js +3 -2
- package/dist/project-merge.d.ts +12 -4
- package/dist/project-merge.js +132 -45
- package/dist/quarantine.d.ts +2 -1
- package/dist/quarantine.js +8 -5
- package/dist/raw-archive.js +1 -1
- package/dist/recall-history.js +3 -2
- package/dist/recall-pipeline.d.ts +2 -2
- package/dist/recall-pipeline.js +16 -8
- package/dist/recall-scope.js +1 -1
- package/dist/recall-trace.d.ts +1 -1
- package/dist/refine-llm.js +2 -1
- package/dist/reject-flow.js +6 -1
- package/dist/rerankers/clef.js +6 -5
- package/dist/rerankers/jev.d.ts +1 -1
- package/dist/rerankers/jev.js +4 -4
- package/dist/rerankers/llm.d.ts +4 -2
- package/dist/rerankers/llm.js +58 -38
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/salience.js +1 -1
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.js +26 -4
- package/dist/scope.js +4 -3
- package/dist/search/as-of.d.ts +10 -0
- package/dist/search/as-of.js +22 -0
- package/dist/search/bm25-search.d.ts +14 -0
- package/dist/search/bm25-search.js +43 -0
- package/dist/search/bm25.d.ts +15 -0
- package/dist/search/bm25.js +54 -0
- package/dist/search/boosts.d.ts +54 -0
- package/dist/search/boosts.js +94 -0
- package/dist/search/breakdown.d.ts +7 -0
- package/dist/search/breakdown.js +20 -0
- package/dist/search/explain.d.ts +25 -0
- package/dist/search/explain.js +31 -0
- package/dist/search/finalize.d.ts +8 -0
- package/dist/search/finalize.js +52 -0
- package/dist/search/fusion.d.ts +27 -0
- package/dist/search/fusion.js +42 -0
- package/dist/search/hybrid-score.d.ts +20 -0
- package/dist/search/hybrid-score.js +73 -0
- package/dist/search/hybrid.d.ts +46 -0
- package/dist/search/hybrid.js +64 -0
- package/dist/search/physics-search.d.ts +29 -0
- package/dist/search/physics-search.js +162 -0
- package/dist/search/rerank.d.ts +10 -0
- package/dist/search/rerank.js +72 -0
- package/dist/search/temporal.d.ts +15 -0
- package/dist/search/temporal.js +45 -0
- package/dist/search/types.d.ts +91 -0
- package/dist/search/types.js +2 -0
- package/dist/search/vector.d.ts +30 -0
- package/dist/search/vector.js +71 -0
- package/dist/secret-detect.d.ts +2 -0
- package/dist/secret-detect.js +2 -1
- package/dist/server/auth.d.ts +52 -0
- package/dist/server/auth.js +221 -0
- package/dist/server/client-ip.d.ts +25 -0
- package/dist/server/client-ip.js +92 -0
- package/dist/server/cursor.d.ts +23 -0
- package/dist/server/cursor.js +58 -0
- package/dist/server/lifecycle.d.ts +7 -0
- package/dist/server/lifecycle.js +29 -0
- package/dist/server/mcp-http.d.ts +5 -0
- package/dist/server/mcp-http.js +199 -0
- package/dist/server/request.d.ts +33 -0
- package/dist/server/request.js +103 -0
- package/dist/server/routes/admin.d.ts +9 -0
- package/dist/server/routes/admin.js +158 -0
- package/dist/server/routes/customer-notes.d.ts +7 -0
- package/dist/server/routes/customer-notes.js +112 -0
- package/dist/server/routes/decisions.d.ts +7 -0
- package/dist/server/routes/decisions.js +133 -0
- package/dist/server/routes/incidents.d.ts +7 -0
- package/dist/server/routes/incidents.js +126 -0
- package/dist/server/routes/memories.d.ts +10 -0
- package/dist/server/routes/memories.js +179 -0
- package/dist/server/routes/policies.d.ts +8 -0
- package/dist/server/routes/policies.js +151 -0
- package/dist/server/routes/predictions.d.ts +7 -0
- package/dist/server/routes/predictions.js +164 -0
- package/dist/server/routes/processes.d.ts +7 -0
- package/dist/server/routes/processes.js +161 -0
- package/dist/server/routes/project-briefs.d.ts +8 -0
- package/dist/server/routes/project-briefs.js +136 -0
- package/dist/server/routes/recall.d.ts +8 -0
- package/dist/server/routes/recall.js +340 -0
- package/dist/server/routes/skills.d.ts +8 -0
- package/dist/server/routes/skills.js +150 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/types.js +2 -0
- package/dist/server/validation.d.ts +14 -0
- package/dist/server/validation.js +91 -0
- package/dist/server.d.ts +7 -61
- package/dist/server.js +69 -2362
- package/dist/session-digest.d.ts +1 -1
- package/dist/session-digest.js +9 -2
- package/dist/shared.d.ts +12 -1
- package/dist/shared.js +33 -27
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +88 -70
- package/dist/stdin.js +2 -2
- package/dist/store/audit-event.d.ts +19 -0
- package/dist/store/audit-event.js +33 -0
- package/dist/store/candidates.d.ts +42 -0
- package/dist/store/candidates.js +152 -0
- package/dist/store/conflicts.d.ts +44 -0
- package/dist/store/conflicts.js +444 -0
- package/dist/store/delete-and-batch.d.ts +63 -0
- package/dist/store/delete-and-batch.js +310 -0
- package/dist/store/entry-reads.d.ts +92 -0
- package/dist/store/entry-reads.js +255 -0
- package/dist/store/entry-row.d.ts +67 -0
- package/dist/store/entry-row.js +208 -0
- package/dist/store/entry-writes.d.ts +46 -0
- package/dist/store/entry-writes.js +148 -0
- package/dist/store/handoffs.d.ts +26 -0
- package/dist/store/handoffs.js +184 -0
- package/dist/store/index-and-stats.d.ts +52 -0
- package/dist/store/index-and-stats.js +214 -0
- package/dist/store/markdown.d.ts +10 -0
- package/dist/store/markdown.js +108 -0
- package/dist/store/mirrors.d.ts +49 -0
- package/dist/store/mirrors.js +312 -0
- package/dist/store/open.d.ts +15 -0
- package/dist/store/open.js +223 -0
- package/dist/store/rows.d.ts +178 -0
- package/dist/store/rows.js +158 -0
- package/dist/store/search-rows.d.ts +86 -0
- package/dist/store/search-rows.js +260 -0
- package/dist/store/sessions.d.ts +83 -0
- package/dist/store/sessions.js +272 -0
- package/dist/store/summaries.d.ts +94 -0
- package/dist/store/summaries.js +377 -0
- package/dist/store/tenant-lookup.d.ts +12 -0
- package/dist/store/tenant-lookup.js +16 -0
- package/dist/store-cards.js +2 -1
- package/dist/summary-dirty.d.ts +4 -0
- package/dist/summary-dirty.js +32 -0
- package/dist/support-bundle.js +4 -3
- package/dist/tenant.js +2 -2
- package/dist/tokenize.d.ts +2 -0
- package/dist/tokenize.js +16 -0
- package/dist/transcript-tail.d.ts +7 -0
- package/dist/transcript-tail.js +48 -0
- package/dist/vector-store.d.ts +27 -0
- package/dist/vector-store.js +210 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/dist/working-memory.js +1 -1
- package/dist/yaml.js +36 -11
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist-ui/assets/index-DPN7cP19.js +33 -0
- package/dist-ui/assets/index-dFloKRVr.css +1 -0
- package/dist-ui/index.html +3 -25
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/dist/capture.d.ts +0 -155
- package/dist/capture.js +0 -1295
- package/dist/consolidate.d.ts +0 -58
- package/dist/consolidate.js +0 -1124
- package/dist/graph.d.ts +0 -245
- package/dist/hooks.d.ts +0 -208
- package/dist/hooks.js +0 -1076
- package/dist/importers.js +0 -900
- package/dist/predictions.js +0 -620
- package/dist/search.d.ts +0 -320
- package/dist/search.js +0 -970
- package/dist/store.d.ts +0 -776
- package/dist/store.js +0 -3473
- package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
- package/dist-ui/assets/index-BhT8RvO6.js +0 -61
- package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
- package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// The hippo block each agent's instruction file carries, and how init recognises one it wrote earlier.
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
export const HOOK_MARKERS = {
|
|
4
|
+
start: '<!-- hippo:start -->',
|
|
5
|
+
end: '<!-- hippo:end -->',
|
|
6
|
+
};
|
|
7
|
+
export const HOOKS = {
|
|
8
|
+
'claude-code': {
|
|
9
|
+
file: 'CLAUDE.md',
|
|
10
|
+
description: 'Claude Code',
|
|
11
|
+
content: `
|
|
12
|
+
## Project Memory (Hippo)
|
|
13
|
+
|
|
14
|
+
Pinned rules and recent writes auto-inject at every prompt via the installed
|
|
15
|
+
UserPromptSubmit hook; never re-run that part manually. At the START of a
|
|
16
|
+
task (not per prompt), additionally load task-specific context: git-aware
|
|
17
|
+
recall over the full store that per-prompt injection does not cover. Also
|
|
18
|
+
run it if the hook is not installed:
|
|
19
|
+
\`\`\`bash
|
|
20
|
+
hippo context --auto --budget 1500
|
|
21
|
+
\`\`\`
|
|
22
|
+
|
|
23
|
+
When you find out why something failed, record it right then, while you
|
|
24
|
+
work, never as a closing step:
|
|
25
|
+
\`\`\`bash
|
|
26
|
+
hippo remember "<what went wrong and why>" --error
|
|
27
|
+
\`\`\`
|
|
28
|
+
|
|
29
|
+
The installed hooks store failed tool calls and capture the session when it
|
|
30
|
+
ends, so there is nothing to run before you finish.
|
|
31
|
+
`.trim(),
|
|
32
|
+
},
|
|
33
|
+
'codex': {
|
|
34
|
+
file: 'AGENTS.md',
|
|
35
|
+
description: 'OpenAI Codex',
|
|
36
|
+
content: `
|
|
37
|
+
## Project Memory (Hippo)
|
|
38
|
+
|
|
39
|
+
At the start of every task, run:
|
|
40
|
+
\`\`\`bash
|
|
41
|
+
hippo context --auto --budget 1500
|
|
42
|
+
\`\`\`
|
|
43
|
+
Read the output before writing any code.
|
|
44
|
+
|
|
45
|
+
On errors or unexpected behaviour, record it right then, while you work,
|
|
46
|
+
never as a closing step:
|
|
47
|
+
\`\`\`bash
|
|
48
|
+
hippo remember "<description of what went wrong>" --error
|
|
49
|
+
\`\`\`
|
|
50
|
+
|
|
51
|
+
When you learn something that should outlive this session (a decision and
|
|
52
|
+
its reason, a user preference, a lesson), record it right then, while you
|
|
53
|
+
work, never as a closing step. Leave out secrets and personal details:
|
|
54
|
+
\`\`\`bash
|
|
55
|
+
hippo remember "<what you learned and why>"
|
|
56
|
+
\`\`\`
|
|
57
|
+
|
|
58
|
+
When Hippo's Codex wrapper is installed, session-end capture runs automatically.
|
|
59
|
+
If the wrapper is not installed, capture a brief summary manually:
|
|
60
|
+
\`\`\`bash
|
|
61
|
+
hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
|
|
62
|
+
\`\`\`
|
|
63
|
+
`.trim(),
|
|
64
|
+
},
|
|
65
|
+
'cursor': {
|
|
66
|
+
file: 'AGENTS.md',
|
|
67
|
+
description: 'Cursor',
|
|
68
|
+
content: `
|
|
69
|
+
## Project Memory (Hippo)
|
|
70
|
+
|
|
71
|
+
At the start of every task, run:
|
|
72
|
+
\`\`\`bash
|
|
73
|
+
hippo context --auto --budget 1500
|
|
74
|
+
\`\`\`
|
|
75
|
+
Read the output before writing any code.
|
|
76
|
+
|
|
77
|
+
On errors or unexpected behaviour, record it right then, while you work,
|
|
78
|
+
never as a closing step:
|
|
79
|
+
\`\`\`bash
|
|
80
|
+
hippo remember "<description of what went wrong>" --error
|
|
81
|
+
\`\`\`
|
|
82
|
+
|
|
83
|
+
When you learn something that should outlive this session (a decision and
|
|
84
|
+
its reason, a user preference, a lesson), record it right then, while you
|
|
85
|
+
work, never as a closing step. Leave out secrets and personal details:
|
|
86
|
+
\`\`\`bash
|
|
87
|
+
hippo remember "<what you learned and why>"
|
|
88
|
+
\`\`\`
|
|
89
|
+
|
|
90
|
+
When ending a session, capture a brief summary:
|
|
91
|
+
\`\`\`bash
|
|
92
|
+
hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
|
|
93
|
+
\`\`\`
|
|
94
|
+
`.trim(),
|
|
95
|
+
},
|
|
96
|
+
'openclaw': {
|
|
97
|
+
file: 'AGENTS.md',
|
|
98
|
+
description: 'OpenClaw',
|
|
99
|
+
content: `
|
|
100
|
+
## Project Memory (Hippo)
|
|
101
|
+
|
|
102
|
+
At the start of every session, run:
|
|
103
|
+
\`\`\`bash
|
|
104
|
+
hippo context --auto --budget 1500
|
|
105
|
+
\`\`\`
|
|
106
|
+
Read the output before writing any code.
|
|
107
|
+
|
|
108
|
+
On errors or unexpected behaviour, record it right then, while you work,
|
|
109
|
+
never as a closing step:
|
|
110
|
+
\`\`\`bash
|
|
111
|
+
hippo remember "<description of what went wrong>" --error
|
|
112
|
+
\`\`\`
|
|
113
|
+
|
|
114
|
+
When you learn something that should outlive this session (a decision and
|
|
115
|
+
its reason, a user preference, a lesson), record it right then, while you
|
|
116
|
+
work, never as a closing step. Leave out secrets and personal details:
|
|
117
|
+
\`\`\`bash
|
|
118
|
+
hippo remember "<what you learned and why>"
|
|
119
|
+
\`\`\`
|
|
120
|
+
|
|
121
|
+
When ending a session, capture a brief summary:
|
|
122
|
+
\`\`\`bash
|
|
123
|
+
hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
|
|
124
|
+
\`\`\`
|
|
125
|
+
`.trim(),
|
|
126
|
+
},
|
|
127
|
+
'opencode': {
|
|
128
|
+
file: 'AGENTS.md',
|
|
129
|
+
description: 'OpenCode',
|
|
130
|
+
content: `
|
|
131
|
+
## Project Memory (Hippo)
|
|
132
|
+
|
|
133
|
+
At the start of every task, run:
|
|
134
|
+
\`\`\`bash
|
|
135
|
+
hippo context --auto --budget 1500
|
|
136
|
+
\`\`\`
|
|
137
|
+
Read the output before writing any code.
|
|
138
|
+
|
|
139
|
+
On errors or unexpected behaviour, record it right then, while you work,
|
|
140
|
+
never as a closing step:
|
|
141
|
+
\`\`\`bash
|
|
142
|
+
hippo remember "<description of what went wrong>" --error
|
|
143
|
+
\`\`\`
|
|
144
|
+
|
|
145
|
+
When you learn something that should outlive this session (a decision and
|
|
146
|
+
its reason, a user preference, a lesson), record it right then, while you
|
|
147
|
+
work, never as a closing step. Leave out secrets and personal details:
|
|
148
|
+
\`\`\`bash
|
|
149
|
+
hippo remember "<what you learned and why>"
|
|
150
|
+
\`\`\`
|
|
151
|
+
|
|
152
|
+
When stuck or repeating yourself, check if this happened before:
|
|
153
|
+
\`\`\`bash
|
|
154
|
+
hippo recall "<what's going wrong>" --budget 2000
|
|
155
|
+
\`\`\`
|
|
156
|
+
|
|
157
|
+
When ending a session, capture a brief summary:
|
|
158
|
+
\`\`\`bash
|
|
159
|
+
hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
|
|
160
|
+
\`\`\`
|
|
161
|
+
`.trim(),
|
|
162
|
+
},
|
|
163
|
+
'pi': {
|
|
164
|
+
file: 'AGENTS.md',
|
|
165
|
+
description: 'Pi',
|
|
166
|
+
content: `
|
|
167
|
+
## Project Memory (Hippo)
|
|
168
|
+
|
|
169
|
+
At the start of every session, run:
|
|
170
|
+
\`\`\`bash
|
|
171
|
+
hippo context --auto --budget 1500
|
|
172
|
+
\`\`\`
|
|
173
|
+
Read the output before writing any code.
|
|
174
|
+
|
|
175
|
+
On errors or unexpected behaviour, record it right then, while you work,
|
|
176
|
+
never as a closing step:
|
|
177
|
+
\`\`\`bash
|
|
178
|
+
hippo remember "<description of what went wrong>" --error
|
|
179
|
+
\`\`\`
|
|
180
|
+
|
|
181
|
+
When you learn something that should outlive this session (a decision and
|
|
182
|
+
its reason, a user preference, a lesson), record it right then, while you
|
|
183
|
+
work, never as a closing step. Leave out secrets and personal details:
|
|
184
|
+
\`\`\`bash
|
|
185
|
+
hippo remember "<what you learned and why>"
|
|
186
|
+
\`\`\`
|
|
187
|
+
|
|
188
|
+
When ending a session, capture a brief summary:
|
|
189
|
+
\`\`\`bash
|
|
190
|
+
hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
|
|
191
|
+
\`\`\`
|
|
192
|
+
|
|
193
|
+
For full integration, copy the hippo-memory Pi extension to \`~/.pi/agent/extensions/hippo-memory/\`.
|
|
194
|
+
`.trim(),
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
// sha256 of each trimmed block an earlier hippo wrote, so init refreshes only blocks nobody edited. Add the old hash when a block changes.
|
|
198
|
+
const SHIPPED_HOOK_HASHES = new Map([
|
|
199
|
+
['c04e48f2896a4fee9ae98f8f832e2d26a3910269df3beb5bcd6baee3cd9db68e', 'claude-code'],
|
|
200
|
+
['e6b12bd8983c032e5ca8e95a97aeff4178a5a05026d10acad5b2e1b25d5656dd', 'claude-code'],
|
|
201
|
+
['4c64e11d3e5be68fa547c9248d7553feb645a02f7cf13ba02f7275e1854baf44', 'claude-code'],
|
|
202
|
+
['293bd319bbc86225a0ee027490a3322a0336257f5832f7fade65e4ffb2530654', 'claude-code'],
|
|
203
|
+
['15abcece9712279fb4721f7a8f0ba117457400278977beb5cf5b5d7ba49f7b1a', 'codex'],
|
|
204
|
+
['0c81a6b2c21473313001f624b80ea870e661aecbfda9bfe8503febc0d5f34533', 'codex'],
|
|
205
|
+
['88e45358aba4f17912f113221c991dc758275991335d1daa4aa1974a69c46769', 'codex'],
|
|
206
|
+
['e61632fe177450a06541c148a9a4f9182530d8df667806927a99792825903298', 'codex'],
|
|
207
|
+
['a1415ecda9b2f8f317c233738e4a5ac16e6b2cc385a017c0c8ecfbfacbcab6a3', 'cursor'],
|
|
208
|
+
['a38c428bbdfc14ec50f6f7b9183785170a4eae1ce9cde60257cca6efc7206b3a', 'cursor'],
|
|
209
|
+
['0ec9f556abfd55e94f9e6fb47ece0fc5acb841977d144b35a2371e03645d8636', 'cursor'],
|
|
210
|
+
['40524c3bd5a2eb04036567cc761451961d950995768bccd93a9900b0f75eafea', 'openclaw'],
|
|
211
|
+
['7b3518e8c0feaa7b8b454cde7743f7598ad14cd9979e1680d0954484e2464aae', 'openclaw'],
|
|
212
|
+
['1137dcf04568caf011e41db77bc55324faee88bc29c3a5fcc98ab687cd952a16', 'openclaw'],
|
|
213
|
+
['4601c67c31f41cd5b1324cfccdb1afc66872b7fb0bc1e7c5789ecabb1f6bd942', 'opencode'],
|
|
214
|
+
['90d9e21d8d1ecbe99a0fc7b7f2d9f8af7b5315a6b4b0203df4f7a9bdc0699b98', 'opencode'],
|
|
215
|
+
['ca4e00284f1397ed2f2fcc53210c27f63b90edf6b37fd66dad5ee58b94ea3eee', 'opencode'],
|
|
216
|
+
['8b8f5986d7f7ed15f06e68720d8913c3cab23d94366b411935ca2bbaa334553b', 'pi'],
|
|
217
|
+
['37767b355e18beac726b05b9e2b898dab8c6135fd7b98f3aa52edc734d5dd283', 'pi'],
|
|
218
|
+
['6e85a5cccb3cfeaa9a080713754936db730f96376f94cc9a9888a746149c7268', 'pi'],
|
|
219
|
+
]);
|
|
220
|
+
/** The first hippo block in `text` and the agent whose current or shipped text it is; `owner` is undefined for an edited block. */
|
|
221
|
+
export function hippoBlock(text) {
|
|
222
|
+
const at = text.indexOf(HOOK_MARKERS.start);
|
|
223
|
+
const start = at + HOOK_MARKERS.start.length;
|
|
224
|
+
const end = text.indexOf(HOOK_MARKERS.end, start);
|
|
225
|
+
if (at < 0 || end < 0)
|
|
226
|
+
return null;
|
|
227
|
+
// git autocrlf checks these files out with CRLF: match as LF, write back in the file's own ending.
|
|
228
|
+
const raw = text.slice(start, end);
|
|
229
|
+
const inner = raw.replace(/\r\n/g, '\n').trim();
|
|
230
|
+
const owner = Object.keys(HOOKS).find((k) => HOOKS[k].content === inner) ?? SHIPPED_HOOK_HASHES.get(createHash('sha256').update(inner).digest('hex'));
|
|
231
|
+
return { start, end, eol: raw.includes('\r\n') ? '\r\n' : '\n', inner, owner };
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=hook-blocks.js.map
|
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
// `hippo init`: create a store and wire the detected agents' instruction files, hooks and daily runner.
|
|
2
|
+
import { envSkipAutoIntegrations } from '../env.js';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as os from 'os';
|
|
6
|
+
import { installJsonHooks } from '../hooks/json-hooks.js';
|
|
7
|
+
import { isCodexPresent } from '../hooks/shared.js';
|
|
8
|
+
import { isCodexWrapperInstalled } from '../hooks/codex-wrapper.js';
|
|
9
|
+
import { installOpencodePlugin } from '../hooks/opencode.js';
|
|
10
|
+
import { isInitialized, initStore } from '../store/open.js';
|
|
11
|
+
import { loadAllEntries } from '../store/entry-reads.js';
|
|
12
|
+
import { isGitRepo } from '../autolearn.js';
|
|
13
|
+
import { currentMachine, importForStore, importProjectMemories, importUserMemories } from '../agent-memories/sync.js';
|
|
14
|
+
import { emptyReport, mergeReports } from '../agent-memories/report.js';
|
|
15
|
+
import { getGlobalRoot, initGlobal } from '../shared.js';
|
|
16
|
+
import { registerWorkspace } from '../scheduler.js';
|
|
17
|
+
import { printAgentImport, installCodexMemoryHooks, setupDailySchedule, learnFromRepo } from './shared.js';
|
|
18
|
+
import { HOOK_MARKERS, HOOKS, hippoBlock } from './hook-blocks.js';
|
|
19
|
+
function scanForGitRepos(rootDir, maxDepth = 2) {
|
|
20
|
+
const repos = [];
|
|
21
|
+
function walk(dir, depth) {
|
|
22
|
+
if (depth > maxDepth)
|
|
23
|
+
return;
|
|
24
|
+
try {
|
|
25
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
if (!entry.isDirectory())
|
|
28
|
+
continue;
|
|
29
|
+
if (entry.name === 'node_modules' || entry.name === '.git' || entry.name.startsWith('.'))
|
|
30
|
+
continue;
|
|
31
|
+
const full = path.join(dir, entry.name);
|
|
32
|
+
if (fs.existsSync(path.join(full, '.git'))) {
|
|
33
|
+
repos.push(full);
|
|
34
|
+
}
|
|
35
|
+
if (depth < maxDepth)
|
|
36
|
+
walk(full, depth + 1);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch { /* permission denied, etc */ }
|
|
40
|
+
}
|
|
41
|
+
// Check if rootDir itself is a git repo
|
|
42
|
+
if (fs.existsSync(path.join(rootDir, '.git')))
|
|
43
|
+
repos.push(rootDir);
|
|
44
|
+
walk(rootDir, 0);
|
|
45
|
+
return repos;
|
|
46
|
+
}
|
|
47
|
+
function cmdInitScan(scanDir, flags) {
|
|
48
|
+
const resolved = path.resolve(scanDir);
|
|
49
|
+
console.log(`Scanning ${resolved} for git repositories...\n`);
|
|
50
|
+
const repos = scanForGitRepos(resolved);
|
|
51
|
+
if (repos.length === 0) {
|
|
52
|
+
console.log('No git repositories found.');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
console.log(`Found ${repos.length} repositories:\n`);
|
|
56
|
+
// Init global store first
|
|
57
|
+
const globalRoot = getGlobalRoot();
|
|
58
|
+
if (!isInitialized(globalRoot)) {
|
|
59
|
+
initGlobal();
|
|
60
|
+
console.log(`Initialized global store at ${globalRoot}\n`);
|
|
61
|
+
}
|
|
62
|
+
let totalLessons = 0;
|
|
63
|
+
// Rolled up so the cross-repo summary reports the gate too. Each repo
|
|
64
|
+
// already prints its own count inside learnFromRepo, but the aggregate
|
|
65
|
+
// line showed only what was ADDED - and the point of this change is
|
|
66
|
+
// that a dropped subject is never invisible.
|
|
67
|
+
let totalLowInfo = 0;
|
|
68
|
+
const seedDays = parseInt(String(flags['days'] ?? '365'), 10);
|
|
69
|
+
const machine = currentMachine();
|
|
70
|
+
const agentImport = emptyReport();
|
|
71
|
+
for (const repo of repos) {
|
|
72
|
+
const name = path.basename(repo);
|
|
73
|
+
const repoHippo = path.join(repo, '.hippo');
|
|
74
|
+
const alreadyExists = isInitialized(repoHippo);
|
|
75
|
+
if (!alreadyExists) {
|
|
76
|
+
initStore(repoHippo);
|
|
77
|
+
}
|
|
78
|
+
registerWorkspace(globalRoot, repo);
|
|
79
|
+
// Learn from git history
|
|
80
|
+
let added = 0;
|
|
81
|
+
if (!flags['no-learn'] && isGitRepo(repo)) {
|
|
82
|
+
const result = learnFromRepo(repoHippo, repo, seedDays, name);
|
|
83
|
+
added = result.added;
|
|
84
|
+
totalLessons += added;
|
|
85
|
+
totalLowInfo += result.lowInfo;
|
|
86
|
+
}
|
|
87
|
+
if (!flags['no-learn'])
|
|
88
|
+
mergeReports(agentImport, importProjectMemories(repoHippo, { machine }));
|
|
89
|
+
const status = alreadyExists ? 'existing' : 'new';
|
|
90
|
+
const entries = loadAllEntries(repoHippo);
|
|
91
|
+
console.log(` ${name.padEnd(25)} ${status.padEnd(10)} ${entries.length} memories${added > 0 ? ` (+${added} from git)` : ''}`);
|
|
92
|
+
}
|
|
93
|
+
console.log(`\n${repos.length} repositories, ${totalLessons} new lessons learned` +
|
|
94
|
+
(totalLowInfo > 0 ? `, ${totalLowInfo} low-information subject(s) dropped` : '') +
|
|
95
|
+
'.');
|
|
96
|
+
if (!flags['no-learn']) {
|
|
97
|
+
mergeReports(agentImport, importUserMemories(globalRoot, { machine }));
|
|
98
|
+
printAgentImport(agentImport, '');
|
|
99
|
+
}
|
|
100
|
+
console.log(`Global store: ${globalRoot}`);
|
|
101
|
+
if (initInstallsIntegrations(flags)) {
|
|
102
|
+
// User-level hooks only: a hippo block in each repo's CLAUDE.md or AGENTS.md would leave a diff in every repo.
|
|
103
|
+
const agents = detectAgentHooks(repos);
|
|
104
|
+
if (agents.length === 0) {
|
|
105
|
+
console.log(' No agent config found in these repositories. Run `hippo setup` to add hooks for the agents on this machine.');
|
|
106
|
+
}
|
|
107
|
+
installUserLevelHooks(agents, true);
|
|
108
|
+
}
|
|
109
|
+
if (!flags['no-schedule']) {
|
|
110
|
+
setupDailySchedule(globalRoot);
|
|
111
|
+
}
|
|
112
|
+
console.log(`\nRun \`hippo sleep\` in any project to consolidate and auto-share to global.`);
|
|
113
|
+
}
|
|
114
|
+
export function cmdInit(hippoRoot, flags) {
|
|
115
|
+
// Handle --scan mode
|
|
116
|
+
if (flags['scan']) {
|
|
117
|
+
const scanDir = typeof flags['scan'] === 'string' ? flags['scan'] : os.homedir();
|
|
118
|
+
cmdInitScan(scanDir, flags);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (flags['global']) {
|
|
122
|
+
const globalRoot = getGlobalRoot();
|
|
123
|
+
if (isInitialized(globalRoot)) {
|
|
124
|
+
console.log('Already initialized global store at', globalRoot);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
initGlobal();
|
|
128
|
+
console.log('Initialized global Hippo store at', globalRoot);
|
|
129
|
+
}
|
|
130
|
+
if (!flags['no-learn'])
|
|
131
|
+
printAgentImport(importUserMemories(globalRoot, { machine: currentMachine() }));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const alreadyExists = isInitialized(hippoRoot);
|
|
135
|
+
if (alreadyExists) {
|
|
136
|
+
console.log('Already initialized at', hippoRoot);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
initStore(hippoRoot);
|
|
140
|
+
console.log('Initialized Hippo at', hippoRoot);
|
|
141
|
+
console.log(' Directories: buffer/ episodic/ semantic/ conflicts/');
|
|
142
|
+
console.log(' Files: hippo.db stats.json');
|
|
143
|
+
}
|
|
144
|
+
const globalRoot = getGlobalRoot();
|
|
145
|
+
registerWorkspace(globalRoot, path.dirname(hippoRoot));
|
|
146
|
+
if (initInstallsIntegrations(flags)) {
|
|
147
|
+
autoInstallHooks();
|
|
148
|
+
}
|
|
149
|
+
// Auto-setup daily schedule (unless --no-schedule)
|
|
150
|
+
if (!flags['no-schedule'] && !flags['global']) {
|
|
151
|
+
setupDailySchedule(globalRoot);
|
|
152
|
+
}
|
|
153
|
+
// Seed with git history on first init (unless --no-learn)
|
|
154
|
+
if (!alreadyExists && !flags['no-learn'] && !flags['global']) {
|
|
155
|
+
if (isGitRepo(process.cwd())) {
|
|
156
|
+
const seedDays = 30;
|
|
157
|
+
console.log(`\n Seeding memories from last ${seedDays} days of git history...`);
|
|
158
|
+
const { added, skipped } = learnFromRepo(hippoRoot, process.cwd(), seedDays);
|
|
159
|
+
if (added > 0) {
|
|
160
|
+
console.log(` Learned ${added} lessons from git (${skipped} duplicates skipped).`);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
console.log(` No matching commits found in git history.`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Every run, not only the first: an agent's notes change between inits.
|
|
168
|
+
if (!flags['no-learn'])
|
|
169
|
+
printAgentImport(importForStore(hippoRoot, { machine: currentMachine() }));
|
|
170
|
+
}
|
|
171
|
+
/** Every write init makes into agent config (instruction blocks, hooks, plugins) is an automatic integration, so one switch skips them all. */
|
|
172
|
+
function initInstallsIntegrations(flags) {
|
|
173
|
+
if (flags['no-hooks'])
|
|
174
|
+
return false;
|
|
175
|
+
if (!envSkipAutoIntegrations())
|
|
176
|
+
return true;
|
|
177
|
+
console.log(' HIPPO_SKIP_AUTO_INTEGRATIONS=1, so init left agent instruction files and hooks alone.');
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
/** Plain init: patch the detected agents' instruction files in cwd, then install their user-level hooks. */
|
|
181
|
+
function autoInstallHooks() {
|
|
182
|
+
const cwd = process.cwd();
|
|
183
|
+
const agents = detectAgentHooks([cwd]);
|
|
184
|
+
const agentsMd = path.join(cwd, HOOKS.codex.file);
|
|
185
|
+
// Read before patching: a re-run of init finds its own block and skips the Codex hint.
|
|
186
|
+
const codexHint = !(fs.existsSync(agentsMd) && fs.readFileSync(agentsMd, 'utf8').includes(HOOK_MARKERS.start));
|
|
187
|
+
patchInstructionFiles(cwd, agents);
|
|
188
|
+
installUserLevelHooks(agents, codexHint);
|
|
189
|
+
}
|
|
190
|
+
/** HOOKS keys of the agents with a marker file in any of dirs, in detector order. */
|
|
191
|
+
function detectAgentHooks(dirs) {
|
|
192
|
+
// Map: filename to check -> hook key(s) to install
|
|
193
|
+
const detectors = [
|
|
194
|
+
{ files: ['CLAUDE.md', '.claude/settings.json'], hook: 'claude-code' },
|
|
195
|
+
{ files: ['AGENTS.md', '.codex'], hook: 'codex' },
|
|
196
|
+
// No Cursor row: Cursor reads the root AGENTS.md, which the rows either side patch.
|
|
197
|
+
{ files: ['.openclaw', 'AGENTS.md'], hook: 'openclaw' },
|
|
198
|
+
{ files: ['.opencode', 'opencode.json'], hook: 'opencode' },
|
|
199
|
+
{ files: ['.pi', '.pi/agent'], hook: 'pi' },
|
|
200
|
+
];
|
|
201
|
+
return detectors
|
|
202
|
+
.filter(({ files }) => dirs.some((dir) => files.some((f) => fs.existsSync(path.join(dir, f)))))
|
|
203
|
+
.map(({ hook }) => hook);
|
|
204
|
+
}
|
|
205
|
+
function patchInstructionFiles(dir, agents) {
|
|
206
|
+
// One block per file: several agents share AGENTS.md.
|
|
207
|
+
const seen = new Set();
|
|
208
|
+
for (const hook of agents) {
|
|
209
|
+
const hookDef = HOOKS[hook];
|
|
210
|
+
if (!hookDef)
|
|
211
|
+
continue;
|
|
212
|
+
const targetPath = path.resolve(dir, hookDef.file);
|
|
213
|
+
// Never create the file: a marker such as .codex or .claude/settings.json does not ask for a new AGENTS.md or CLAUDE.md.
|
|
214
|
+
if (!fs.existsSync(targetPath) || seen.has(targetPath))
|
|
215
|
+
continue;
|
|
216
|
+
seen.add(targetPath);
|
|
217
|
+
const existing = fs.readFileSync(targetPath, 'utf8');
|
|
218
|
+
if (existing.includes(HOOK_MARKERS.start)) {
|
|
219
|
+
refreshShippedBlock(targetPath, existing, hook);
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
const block = `${HOOK_MARKERS.start}\n${hookDef.content}\n${HOOK_MARKERS.end}`;
|
|
223
|
+
const sep = existing.endsWith('\n') ? '\n' : '\n\n';
|
|
224
|
+
fs.writeFileSync(targetPath, existing + sep + block + '\n', 'utf8');
|
|
225
|
+
console.log(` Auto-installed ${hook} hook in ${hookDef.file}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/** Swap an unedited block from an earlier hippo for the current one; an edited block stays, with a hint. */
|
|
229
|
+
function refreshShippedBlock(filePath, text, hook) {
|
|
230
|
+
const block = hippoBlock(text);
|
|
231
|
+
if (!block || (block.owner && HOOKS[block.owner].content === block.inner))
|
|
232
|
+
return;
|
|
233
|
+
const { start, end, eol, owner } = block;
|
|
234
|
+
const name = path.basename(filePath);
|
|
235
|
+
if (!owner) {
|
|
236
|
+
console.log(` Left the edited hippo block in ${name} as is; \`hippo hook install ${hook}\` replaces it.`);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
fs.writeFileSync(filePath, `${text.slice(0, start)}${eol}${HOOKS[owner].content.replace(/\n/g, eol)}${eol}${text.slice(end)}`, 'utf8');
|
|
240
|
+
console.log(` Refreshed the ${owner} hippo block in ${name}`);
|
|
241
|
+
}
|
|
242
|
+
/** Claude Code settings hooks, Codex's hooks.json and the OpenCode plugin, under the home directory; idempotent, so re-running init adds newer hooks. */
|
|
243
|
+
function installUserLevelHooks(agents, codexHint) {
|
|
244
|
+
for (const hook of agents) {
|
|
245
|
+
// The Codex capture wrapper swaps the codex launcher binary, so init only points at the opt-in (issue #133).
|
|
246
|
+
if (hook === 'codex' && codexHint && !isCodexWrapperInstalled()) {
|
|
247
|
+
console.log(' Codex detected. To capture Codex sessions: hippo hook install codex');
|
|
248
|
+
}
|
|
249
|
+
// Checked first so init never creates ~/.codex on a machine without Codex.
|
|
250
|
+
if (hook === 'codex' && isCodexPresent())
|
|
251
|
+
installCodexMemoryHooks(' ');
|
|
252
|
+
// For Claude Code, also install SessionEnd+SessionStart entries in its
|
|
253
|
+
// settings.json. Keeps `hippo init` in lockstep with `hippo hook install
|
|
254
|
+
// claude-code` and `hippo setup`.
|
|
255
|
+
if (hook === 'claude-code') {
|
|
256
|
+
const result = installJsonHooks(hook);
|
|
257
|
+
if (result.installedSessionEnd) {
|
|
258
|
+
console.log(` Auto-installed hippo session-end SessionEnd hook in ${hook} settings`);
|
|
259
|
+
}
|
|
260
|
+
if (result.installedSessionStart) {
|
|
261
|
+
console.log(` Auto-installed hippo last-sleep SessionStart hook in ${hook} settings`);
|
|
262
|
+
}
|
|
263
|
+
if (result.installedUserPromptSubmit) {
|
|
264
|
+
console.log(` Auto-installed hippo pinned-inject UserPromptSubmit hook in ${hook} settings`);
|
|
265
|
+
}
|
|
266
|
+
if (result.installedPreCompact) {
|
|
267
|
+
console.log(` Auto-installed hippo pre-compact PreCompact hook in ${hook} settings`);
|
|
268
|
+
}
|
|
269
|
+
if (result.installedCompactResume) {
|
|
270
|
+
console.log(` Auto-installed hippo compact-resume SessionStart(compact) hook in ${hook} settings`);
|
|
271
|
+
}
|
|
272
|
+
if (result.installedPostCompact) {
|
|
273
|
+
console.log(` Auto-installed hippo post-compact PostCompact hook in ${hook} settings`);
|
|
274
|
+
}
|
|
275
|
+
if (result.installedCaptureError) {
|
|
276
|
+
console.log(` Auto-installed hippo capture-error PostToolUseFailure hook in ${hook} settings`);
|
|
277
|
+
}
|
|
278
|
+
if (result.migratedFromStop) {
|
|
279
|
+
console.log(` Migrated legacy Stop hook → SessionEnd (no longer runs every turn)`);
|
|
280
|
+
}
|
|
281
|
+
if (result.migratedSplitSessionEnd) {
|
|
282
|
+
console.log(` Migrated split sleep+capture SessionEnd entries → single detached hippo session-end`);
|
|
283
|
+
}
|
|
284
|
+
else if (result.migratedLegacySessionEnd) {
|
|
285
|
+
console.log(` Migrated legacy SessionEnd entry to the new detached form`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
else if (hook === 'opencode') {
|
|
289
|
+
// opencode uses a TS plugin, not Claude Code's JSON-hook schema.
|
|
290
|
+
// See OPENCODE_PLUGIN_SOURCE in src/hooks.ts for the plugin file
|
|
291
|
+
// content + design rationale.
|
|
292
|
+
const result = installOpencodePlugin();
|
|
293
|
+
if (result.installed) {
|
|
294
|
+
console.log(` Auto-installed hippo opencode plugin -> ${result.pluginPath}`);
|
|
295
|
+
}
|
|
296
|
+
if (result.migratedLegacyHooks) {
|
|
297
|
+
console.log(` Removed legacy Claude Code-style hooks block from opencode.json — opencode can now launch`);
|
|
298
|
+
}
|
|
299
|
+
if (result.jsonRepairFailed) {
|
|
300
|
+
console.log(` WARNING: opencode.json is unparseable; legacy hooks block could not be auto-removed. Fix the file manually.`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function cmdRefine(hippoRoot: string, flags: Record<string, string | boolean | string[]>): Promise<void>;
|
|
2
|
+
export declare function cmdDedup(hippoRoot: string, flags: Record<string, string | boolean | string[]>): void;
|
|
3
|
+
export declare function cmdEmbed(hippoRoot: string, flags: Record<string, string | boolean | string[]>): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=maintenance.d.ts.map
|