hippo-memory 1.70.0 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +14 -5
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +10 -5
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +2 -22
- package/dist/api/audit.d.ts +5 -1
- package/dist/api/audit.js +9 -1
- package/dist/api/auth.d.ts +13 -22
- package/dist/api/auth.js +34 -24
- package/dist/api/auto-sleep.js +2 -2
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +2 -15
- package/dist/api/context-select.js +3 -4
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +21 -38
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +7 -26
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +5 -26
- package/dist/api/forget.d.ts +5 -24
- package/dist/api/forget.js +5 -28
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/instruction-detect.js +16 -5
- package/dist/api/ledger-db.d.ts +2 -1
- package/dist/api/ledger-db.js +5 -3
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +11 -19
- package/dist/api/prompt-hook.d.ts +4 -4
- package/dist/api/prompt-hook.js +10 -9
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.js +14 -6
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +16 -9
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +59 -60
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +18 -1
- package/dist/api/remember.js +13 -1
- package/dist/api/sleep-run.d.ts +1 -3
- package/dist/api/sleep-run.js +17 -21
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +3 -10
- package/dist/api/types.d.ts +6 -29
- package/dist/api/types.js +4 -22
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +6 -22
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +16 -25
- package/dist/capture/compaction-record.js +101 -69
- package/dist/capture/compaction-spool.d.ts +1 -1
- package/dist/capture/compaction-spool.js +1 -1
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +13 -7
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +4 -18
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +6 -39
- package/dist/cli/audit-prune.js +6 -39
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +33 -34
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +57 -39
- package/dist/cli/briefs.d.ts +4 -4
- package/dist/cli/briefs.js +18 -22
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +31 -32
- package/dist/cli/client.d.ts +7 -27
- package/dist/cli/client.js +24 -43
- package/dist/cli/compact-resume-payload.js +3 -2
- package/dist/cli/context.d.ts +1 -2
- package/dist/cli/context.js +12 -8
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +62 -64
- package/dist/cli/correction-latency.d.ts +2 -14
- package/dist/cli/correction-latency.js +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +68 -92
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +33 -27
- package/dist/cli/decisions.d.ts +4 -4
- package/dist/cli/decisions.js +33 -47
- package/dist/cli/eval.js +15 -13
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +6 -4
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +27 -10
- package/dist/cli/flags.d.ts +1 -0
- package/dist/cli/flags.js +1 -1
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/hook-runtime.d.ts +9 -27
- package/dist/cli/hook-runtime.js +15 -31
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +6 -12
- package/dist/cli/install-steps.js +3 -12
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +3 -0
- package/dist/cli/maintenance.d.ts +4 -4
- package/dist/cli/maintenance.js +14 -19
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +4 -4
- package/dist/cli/playbooks.js +23 -28
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +1 -4
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +1 -3
- package/dist/cli/provenance-coverage.d.ts +2 -6
- package/dist/cli/provenance-coverage.js +2 -6
- package/dist/cli/quality-repair-once.js +2 -2
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +55 -131
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +9 -36
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +122 -180
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +12 -18
- package/dist/cli/serve.js +21 -12
- package/dist/cli/session-hooks.d.ts +10 -18
- package/dist/cli/session-hooks.js +112 -113
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +19 -21
- package/dist/cli/shared.d.ts +9 -23
- package/dist/cli/shared.js +9 -32
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +15 -16
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +55 -98
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +66 -89
- package/dist/cli/usage.js +11 -5
- package/dist/cli.d.ts +66 -448
- package/dist/cli.js +87 -263
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +14 -49
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +12 -29
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +4 -10
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +2 -16
- package/dist/connectors/github/webhook.js +6 -22
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +2 -19
- package/dist/connectors/slack/ingest.d.ts +2 -3
- package/dist/connectors/slack/ingest.js +2 -3
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +2 -19
- package/dist/connectors/slack/webhook.js +5 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +6 -14
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +14 -75
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +6 -52
- package/dist/consolidate/dedupe.js +13 -71
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +4 -21
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +16 -104
- package/dist/consolidate/merge.js +10 -31
- package/dist/consolidate/merged-row.js +2 -1
- package/dist/consolidate/physics-pass.js +1 -3
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +14 -52
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +5 -17
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +6 -22
- package/dist/core/ablation.d.ts +4 -91
- package/dist/core/ablation.js +4 -91
- package/dist/core/ambient.d.ts +1 -8
- package/dist/core/ambient.js +1 -8
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +8 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +13 -14
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +41 -164
- package/dist/core/memory.js +51 -221
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +59 -122
- package/dist/core/project-identity.d.ts +17 -58
- package/dist/core/project-identity.js +17 -38
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +1 -1
- package/dist/db/busy.js +17 -8
- package/dist/db/connect.d.ts +1 -0
- package/dist/db/connect.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/open.d.ts +2 -0
- package/dist/db/open.js +17 -1
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +25 -36
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +8 -1
- package/dist/doctor.js +74 -19
- package/dist/entry/session-text.js +2 -1
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +74 -34
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +7 -34
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +19 -11
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +7 -33
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +14 -76
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +11 -39
- package/dist/hooks/codex-wrapper.js +2 -2
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +18 -57
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +9 -76
- package/dist/hooks/shared.d.ts +8 -17
- package/dist/hooks/shared.js +29 -20
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +9 -27
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +7 -35
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +25 -81
- package/dist/index.d.ts +6 -2
- package/dist/index.js +6 -2
- package/dist/learn/autolearn.d.ts +14 -41
- package/dist/learn/autolearn.js +14 -41
- package/dist/learn/extract.js +2 -4
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +14 -66
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +9 -26
- package/dist/mcp/admin-tools.js +3 -5
- package/dist/mcp/memory-tools.js +4 -9
- package/dist/mcp/protocol.d.ts +8 -26
- package/dist/mcp/protocol.js +3 -6
- package/dist/mcp/recall-tools.js +3 -3
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +10 -26
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +48 -12
- package/dist/mcp/tools.js +5 -3
- package/dist/objects/customer-notes.d.ts +7 -42
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +12 -50
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/incidents.d.ts +7 -38
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/policies.d.ts +11 -89
- package/dist/objects/policies.js +11 -98
- package/dist/objects/processes.d.ts +7 -52
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +11 -55
- package/dist/objects/project-briefs.js +14 -75
- package/dist/objects/skills.d.ts +7 -42
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +6 -19
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +3 -31
- package/dist/rerankers/cross-encoder.js +4 -6
- package/dist/rerankers/jev.js +9 -6
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +2 -1
- package/dist/rerankers/outage-warning.js +2 -1
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +2 -2
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid.d.ts +2 -0
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.js +11 -8
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +7 -0
- package/dist/search/vector.js +35 -5
- package/dist/server/auth.d.ts +9 -28
- package/dist/server/auth.js +32 -25
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +63 -96
- package/dist/server/client-ip.d.ts +3 -19
- package/dist/server/client-ip.js +5 -28
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +10 -44
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +9 -17
- package/dist/server/route-table.js +42 -49
- package/dist/server/routes/admin.js +22 -28
- package/dist/server/routes/customer-notes.js +7 -12
- package/dist/server/routes/decisions.js +10 -17
- package/dist/server/routes/incidents.js +12 -20
- package/dist/server/routes/memories.js +12 -32
- package/dist/server/routes/object-routes.d.ts +0 -5
- package/dist/server/routes/object-routes.js +7 -15
- package/dist/server/routes/policies.js +10 -18
- package/dist/server/routes/predictions.js +13 -25
- package/dist/server/routes/processes.js +16 -26
- package/dist/server/routes/project-briefs.js +9 -16
- package/dist/server/routes/recall.js +10 -35
- package/dist/server/routes/skills.js +8 -18
- package/dist/server/server-detect.d.ts +9 -53
- package/dist/server/server-detect.js +24 -90
- package/dist/server/sleep-offload.js +4 -1
- package/dist/server/types.d.ts +12 -10
- package/dist/server/validation.d.ts +3 -1
- package/dist/server/validation.js +10 -23
- package/dist/server.d.ts +2 -2
- package/dist/server.js +3 -2
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/sharing/project-merge.d.ts +4 -5
- package/dist/sharing/project-merge.js +9 -7
- package/dist/sharing/scope.d.ts +4 -11
- package/dist/sharing/scope.js +4 -11
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/store/ambient.js +4 -9
- package/dist/store/audit-event.d.ts +4 -12
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -5
- package/dist/store/audit.js +4 -12
- package/dist/store/auth.d.ts +6 -6
- package/dist/store/auth.js +10 -9
- package/dist/store/candidates.d.ts +20 -3
- package/dist/store/candidates.js +77 -48
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +71 -150
- package/dist/store/connectors/github.d.ts +10 -10
- package/dist/store/connectors/github.js +10 -10
- package/dist/store/dashboard-reads.js +4 -8
- package/dist/store/delete-and-batch.d.ts +11 -31
- package/dist/store/delete-and-batch.js +48 -64
- package/dist/store/delivery-recorder.d.ts +8 -4
- package/dist/store/delivery-recorder.js +25 -15
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +7 -29
- package/dist/store/dormant.js +15 -56
- package/dist/store/embeddings/index.d.ts +11 -80
- package/dist/store/embeddings/index.js +71 -207
- package/dist/store/embeddings/local.js +15 -32
- package/dist/store/embeddings/provider.d.ts +16 -53
- package/dist/store/embeddings/provider.js +41 -69
- package/dist/store/entry-reads.d.ts +21 -57
- package/dist/store/entry-reads.js +65 -126
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +10 -16
- package/dist/store/entry-writes.js +17 -35
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +21 -160
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +20 -58
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -31
- package/dist/store/graph-writes.js +13 -37
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +5 -11
- package/dist/store/handoffs.js +16 -34
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +34 -82
- package/dist/store/markdown.d.ts +2 -6
- package/dist/store/markdown.js +21 -20
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +14 -23
- package/dist/store/open.js +6 -13
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +82 -79
- package/dist/store/predictions.d.ts +11 -51
- package/dist/store/predictions.js +38 -119
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-scope.d.ts +19 -79
- package/dist/store/recall-scope.js +21 -82
- package/dist/store/recall-trace.d.ts +10 -77
- package/dist/store/recall-trace.js +19 -95
- package/dist/store/rejected-values.js +7 -19
- package/dist/store/rejection.d.ts +12 -58
- package/dist/store/rejection.js +13 -65
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +14 -50
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +17 -73
- package/dist/store/sqlite/connector-events-group.js +2 -2
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- package/dist/store/sqlite/error-codec.js +4 -2
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +2 -1
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.js +4 -2
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +2 -3
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +10 -62
- package/dist/store/summaries.js +34 -146
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -43
- package/dist/store/token-ledger.js +19 -50
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/store/yaml.d.ts +1 -5
- package/dist/store/yaml.js +2 -6
- package/dist/support-bundle.js +7 -5
- package/dist/trust/reject-flow.js +1 -3
- package/dist/util/anthropic-messages.js +14 -2
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/env.d.ts +13 -6
- package/dist/util/env.js +14 -7
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/http-retry.d.ts +3 -1
- package/dist/util/http-retry.js +26 -5
- package/dist/util/log.d.ts +3 -2
- package/dist/util/log.js +25 -9
- package/dist/util/request-scope.d.ts +2 -1
- package/dist/util/request-scope.js +2 -1
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +13 -39
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/extensions/openclaw-plugin/index.ts +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 +1 -1
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
|
@@ -5,71 +5,22 @@ export const HOOK_MARKERS = {
|
|
|
5
5
|
start: '<!-- hippo:start -->',
|
|
6
6
|
end: '<!-- hippo:end -->',
|
|
7
7
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Pinned rules and recent writes auto-inject at every prompt via the installed
|
|
16
|
-
UserPromptSubmit hook; never re-run that part manually. At the START of a
|
|
17
|
-
task (not per prompt), additionally load task-specific context: git-aware
|
|
18
|
-
recall over the full store that per-prompt injection does not cover. Also
|
|
19
|
-
run it if the hook is not installed:
|
|
20
|
-
\`\`\`bash
|
|
21
|
-
hippo context --auto --budget 1500
|
|
22
|
-
\`\`\`
|
|
23
|
-
|
|
24
|
-
When you find out why something failed, record it right then, while you
|
|
25
|
-
work, never as a closing step:
|
|
26
|
-
\`\`\`bash
|
|
27
|
-
hippo remember "<what went wrong and why>" --error
|
|
28
|
-
\`\`\`
|
|
29
|
-
|
|
30
|
-
The installed hooks store failed tool calls and capture the session when it
|
|
31
|
-
ends, so there is nothing to run before you finish.
|
|
32
|
-
`.trim(),
|
|
33
|
-
},
|
|
34
|
-
'codex': {
|
|
35
|
-
file: 'AGENTS.md',
|
|
36
|
-
description: 'OpenAI Codex',
|
|
37
|
-
content: `
|
|
38
|
-
## Project Memory (Hippo)
|
|
39
|
-
|
|
40
|
-
At the start of every task, run:
|
|
41
|
-
\`\`\`bash
|
|
42
|
-
hippo context --auto --budget 1500
|
|
43
|
-
\`\`\`
|
|
44
|
-
Read the output before writing any code.
|
|
45
|
-
|
|
46
|
-
On errors or unexpected behaviour, record it right then, while you work,
|
|
47
|
-
never as a closing step:
|
|
48
|
-
\`\`\`bash
|
|
49
|
-
hippo remember "<description of what went wrong>" --error
|
|
50
|
-
\`\`\`
|
|
51
|
-
|
|
52
|
-
When you learn something that should outlive this session (a decision and
|
|
53
|
-
its reason, a user preference, a lesson), record it right then, while you
|
|
54
|
-
work, never as a closing step. Leave out secrets and personal details:
|
|
55
|
-
\`\`\`bash
|
|
56
|
-
hippo remember "<what you learned and why>"
|
|
57
|
-
\`\`\`
|
|
58
|
-
|
|
59
|
-
When Hippo's Codex wrapper is installed, session-end capture runs automatically.
|
|
60
|
-
If the wrapper is not installed, capture a brief summary manually:
|
|
8
|
+
// Shared by the agents that differ only in the noun, an optional recall paragraph and an optional footer.
|
|
9
|
+
const PI_FOOTER = 'For full integration, copy the hippo-memory Pi extension to `~/.pi/agent/extensions/hippo-memory/`.';
|
|
10
|
+
function agentsBlock(noun, opts = {}) {
|
|
11
|
+
const recall = opts.recall
|
|
12
|
+
? `
|
|
13
|
+
When stuck or repeating yourself, check if this happened before:
|
|
61
14
|
\`\`\`bash
|
|
62
|
-
hippo
|
|
15
|
+
hippo recall "<what's going wrong>" --budget 2000
|
|
63
16
|
\`\`\`
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
'
|
|
67
|
-
|
|
68
|
-
description: 'Cursor',
|
|
69
|
-
content: `
|
|
17
|
+
`
|
|
18
|
+
: '';
|
|
19
|
+
const footer = opts.footer ? `\n${opts.footer}\n` : '';
|
|
20
|
+
return `
|
|
70
21
|
## Project Memory (Hippo)
|
|
71
22
|
|
|
72
|
-
At the start of every
|
|
23
|
+
At the start of every ${noun}, run:
|
|
73
24
|
\`\`\`bash
|
|
74
25
|
hippo context --auto --budget 1500
|
|
75
26
|
\`\`\`
|
|
@@ -87,47 +38,42 @@ work, never as a closing step. Leave out secrets and personal details:
|
|
|
87
38
|
\`\`\`bash
|
|
88
39
|
hippo remember "<what you learned and why>"
|
|
89
40
|
\`\`\`
|
|
90
|
-
|
|
41
|
+
${recall}
|
|
91
42
|
When ending a session, capture a brief summary:
|
|
92
43
|
\`\`\`bash
|
|
93
44
|
hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
|
|
94
45
|
\`\`\`
|
|
95
|
-
`.trim()
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
46
|
+
${footer}`.trim();
|
|
47
|
+
}
|
|
48
|
+
export const HOOKS = {
|
|
49
|
+
'claude-code': {
|
|
50
|
+
file: 'CLAUDE.md',
|
|
51
|
+
description: 'Claude Code',
|
|
100
52
|
content: `
|
|
101
53
|
## Project Memory (Hippo)
|
|
102
54
|
|
|
103
|
-
|
|
55
|
+
Pinned rules and recent writes auto-inject at every prompt via the installed
|
|
56
|
+
UserPromptSubmit hook; never re-run that part manually. At the START of a
|
|
57
|
+
task (not per prompt), additionally load task-specific context: git-aware
|
|
58
|
+
recall over the full store that per-prompt injection does not cover. Also
|
|
59
|
+
run it if the hook is not installed:
|
|
104
60
|
\`\`\`bash
|
|
105
61
|
hippo context --auto --budget 1500
|
|
106
62
|
\`\`\`
|
|
107
|
-
Read the output before writing any code.
|
|
108
63
|
|
|
109
|
-
|
|
110
|
-
never as a closing step:
|
|
111
|
-
\`\`\`bash
|
|
112
|
-
hippo remember "<description of what went wrong>" --error
|
|
113
|
-
\`\`\`
|
|
114
|
-
|
|
115
|
-
When you learn something that should outlive this session (a decision and
|
|
116
|
-
its reason, a user preference, a lesson), record it right then, while you
|
|
117
|
-
work, never as a closing step. Leave out secrets and personal details:
|
|
64
|
+
When you find out why something failed, record it right then, while you
|
|
65
|
+
work, never as a closing step:
|
|
118
66
|
\`\`\`bash
|
|
119
|
-
hippo remember "<what
|
|
67
|
+
hippo remember "<what went wrong and why>" --error
|
|
120
68
|
\`\`\`
|
|
121
69
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
|
|
125
|
-
\`\`\`
|
|
70
|
+
The installed hooks store failed tool calls and capture the session when it
|
|
71
|
+
ends, so there is nothing to run before you finish.
|
|
126
72
|
`.trim(),
|
|
127
73
|
},
|
|
128
|
-
'
|
|
74
|
+
'codex': {
|
|
129
75
|
file: 'AGENTS.md',
|
|
130
|
-
description: '
|
|
76
|
+
description: 'OpenAI Codex',
|
|
131
77
|
content: `
|
|
132
78
|
## Project Memory (Hippo)
|
|
133
79
|
|
|
@@ -150,50 +96,17 @@ work, never as a closing step. Leave out secrets and personal details:
|
|
|
150
96
|
hippo remember "<what you learned and why>"
|
|
151
97
|
\`\`\`
|
|
152
98
|
|
|
153
|
-
When
|
|
154
|
-
|
|
155
|
-
hippo recall "<what's going wrong>" --budget 2000
|
|
156
|
-
\`\`\`
|
|
157
|
-
|
|
158
|
-
When ending a session, capture a brief summary:
|
|
159
|
-
\`\`\`bash
|
|
160
|
-
hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
|
|
161
|
-
\`\`\`
|
|
162
|
-
`.trim(),
|
|
163
|
-
},
|
|
164
|
-
'pi': {
|
|
165
|
-
file: 'AGENTS.md',
|
|
166
|
-
description: 'Pi',
|
|
167
|
-
content: `
|
|
168
|
-
## Project Memory (Hippo)
|
|
169
|
-
|
|
170
|
-
At the start of every session, run:
|
|
171
|
-
\`\`\`bash
|
|
172
|
-
hippo context --auto --budget 1500
|
|
173
|
-
\`\`\`
|
|
174
|
-
Read the output before writing any code.
|
|
175
|
-
|
|
176
|
-
On errors or unexpected behaviour, record it right then, while you work,
|
|
177
|
-
never as a closing step:
|
|
178
|
-
\`\`\`bash
|
|
179
|
-
hippo remember "<description of what went wrong>" --error
|
|
180
|
-
\`\`\`
|
|
181
|
-
|
|
182
|
-
When you learn something that should outlive this session (a decision and
|
|
183
|
-
its reason, a user preference, a lesson), record it right then, while you
|
|
184
|
-
work, never as a closing step. Leave out secrets and personal details:
|
|
185
|
-
\`\`\`bash
|
|
186
|
-
hippo remember "<what you learned and why>"
|
|
187
|
-
\`\`\`
|
|
188
|
-
|
|
189
|
-
When ending a session, capture a brief summary:
|
|
99
|
+
When Hippo's Codex wrapper is installed, session-end capture runs automatically.
|
|
100
|
+
If the wrapper is not installed, capture a brief summary manually:
|
|
190
101
|
\`\`\`bash
|
|
191
102
|
hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
|
|
192
103
|
\`\`\`
|
|
193
|
-
|
|
194
|
-
For full integration, copy the hippo-memory Pi extension to \`~/.pi/agent/extensions/hippo-memory/\`.
|
|
195
104
|
`.trim(),
|
|
196
105
|
},
|
|
106
|
+
'cursor': { file: 'AGENTS.md', description: 'Cursor', content: agentsBlock('task') },
|
|
107
|
+
'openclaw': { file: 'AGENTS.md', description: 'OpenClaw', content: agentsBlock('session') },
|
|
108
|
+
'opencode': { file: 'AGENTS.md', description: 'OpenCode', content: agentsBlock('task', { recall: true }) },
|
|
109
|
+
'pi': { file: 'AGENTS.md', description: 'Pi', content: agentsBlock('session', { footer: PI_FOOTER }) },
|
|
197
110
|
};
|
|
198
111
|
// sha256 of each trimmed block an earlier hippo wrote, so init refreshes only blocks nobody edited. Add the old hash when a block changes.
|
|
199
112
|
const SHIPPED_HOOK_HASHES = new Map([
|
|
@@ -1,38 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Two integration models live in this file:
|
|
5
|
-
*
|
|
6
|
-
* 1. JSON-hook install (Claude Code only). Writes a `hooks` block into the
|
|
7
|
-
* tool's settings.json with two entries:
|
|
8
|
-
* - SessionEnd: `hippo session-end --log-file <path>` - spawns a detached
|
|
9
|
-
* child that runs `hippo sleep` then `hippo capture --last-session` in
|
|
10
|
-
* sequence, writing both outputs to the log file. The parent returns in
|
|
11
|
-
* <100ms so the TUI teardown can't kill the child before it finishes.
|
|
12
|
-
* - SessionStart: `hippo last-sleep --path <path>` - prints the log
|
|
13
|
-
* written by the previous session's detached worker on stderr and
|
|
14
|
-
* clears it. Stdout carries only a `systemMessage` problems line,
|
|
15
|
-
* because Claude Code shows that to the user, not the model.
|
|
16
|
-
* Earlier Claude Code forms are detected and migrated automatically:
|
|
17
|
-
* - < 0.20.2: `Stop` hook firing `hippo sleep` on every assistant turn.
|
|
18
|
-
* - < 0.21.0: bare `hippo sleep` in SessionEnd, no `--log-file`.
|
|
19
|
-
* - 0.22.x: separate sleep + capture SessionEnd entries.
|
|
20
|
-
* PreCompact and PostCompact entries go in too: the first records the compaction and
|
|
21
|
-
* asks the summariser for a "Memories for hippo" list, the second saves that list.
|
|
22
|
-
* Codex's hooks.json gets only two groups (per-prompt memory and
|
|
23
|
-
* compact-resume); see installCodexHooks. Copilot gets a file of its own; see installCopilotHooks.
|
|
24
|
-
*
|
|
25
|
-
* 2. Plugin install (OpenCode only). OpenCode does NOT share Claude Code's
|
|
26
|
-
* JSON-hook schema — its config has `additionalProperties: false` and no
|
|
27
|
-
* `hooks` key, so a JSON-hook install breaks opencode launch. Hippo
|
|
28
|
-
* installs a TypeScript plugin at
|
|
29
|
-
* `~/.config/opencode/plugins/hippo.ts` subscribing to opencode's
|
|
30
|
-
* `session.idle` (→ `hippo session-end`) and `session.created` (→
|
|
31
|
-
* `hippo last-sleep`) events. See OPENCODE_PLUGIN_SOURCE below for the
|
|
32
|
-
* plugin file content + design rationale; see installOpencodePlugin for
|
|
33
|
-
* the installer + the migration that removes any pre-existing broken
|
|
34
|
-
* `hooks` block from opencode.json.
|
|
35
|
-
*/
|
|
1
|
+
/** Hook install/uninstall for AI coding tools. Claude Code gets a JSON `hooks` block in settings.json; older forms are migrated automatically.
|
|
2
|
+
* OpenCode rejects the JSON-hook schema (no `hooks` key), so it gets a TS plugin (OPENCODE_PLUGIN_SOURCE); see installCodexHooks, installCopilotHooks. */
|
|
36
3
|
import { type JsonHookTarget } from './shared.js';
|
|
37
4
|
import { type JsonValue } from '../util/json.js';
|
|
38
5
|
/** A target's hook settings file, the log its SessionEnd hook writes, and the tool's display name. */
|
|
@@ -71,6 +38,7 @@ export declare function installJsonHooks(target: JsonHookTarget): InstallResult;
|
|
|
71
38
|
export declare function writeSettingsFile(file: string, settings: JsonValue): void;
|
|
72
39
|
/** Removes hippo's own hook handlers from `target`'s settings file and keeps every other handler; true when the file changed. */
|
|
73
40
|
export declare function uninstallJsonHooks(target: JsonHookTarget): boolean;
|
|
74
|
-
/** Whether uninstall can edit settings.json; `invalidJson` marks a file that exists
|
|
41
|
+
/** Whether uninstall can edit settings.json; `invalidJson` marks a file that exists
|
|
42
|
+
* but is not JSON hippo can edit, which `uninstallJsonHooks` reports only as false. */
|
|
75
43
|
export declare function checkUninstallable(target: JsonHookTarget): Pick<InstallResult, 'settingsPath' | 'invalidJson'>;
|
|
76
44
|
//# sourceMappingURL=json-hooks.d.ts.map
|
package/dist/hooks/json-hooks.js
CHANGED
|
@@ -1,38 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Two integration models live in this file:
|
|
5
|
-
*
|
|
6
|
-
* 1. JSON-hook install (Claude Code only). Writes a `hooks` block into the
|
|
7
|
-
* tool's settings.json with two entries:
|
|
8
|
-
* - SessionEnd: `hippo session-end --log-file <path>` - spawns a detached
|
|
9
|
-
* child that runs `hippo sleep` then `hippo capture --last-session` in
|
|
10
|
-
* sequence, writing both outputs to the log file. The parent returns in
|
|
11
|
-
* <100ms so the TUI teardown can't kill the child before it finishes.
|
|
12
|
-
* - SessionStart: `hippo last-sleep --path <path>` - prints the log
|
|
13
|
-
* written by the previous session's detached worker on stderr and
|
|
14
|
-
* clears it. Stdout carries only a `systemMessage` problems line,
|
|
15
|
-
* because Claude Code shows that to the user, not the model.
|
|
16
|
-
* Earlier Claude Code forms are detected and migrated automatically:
|
|
17
|
-
* - < 0.20.2: `Stop` hook firing `hippo sleep` on every assistant turn.
|
|
18
|
-
* - < 0.21.0: bare `hippo sleep` in SessionEnd, no `--log-file`.
|
|
19
|
-
* - 0.22.x: separate sleep + capture SessionEnd entries.
|
|
20
|
-
* PreCompact and PostCompact entries go in too: the first records the compaction and
|
|
21
|
-
* asks the summariser for a "Memories for hippo" list, the second saves that list.
|
|
22
|
-
* Codex's hooks.json gets only two groups (per-prompt memory and
|
|
23
|
-
* compact-resume); see installCodexHooks. Copilot gets a file of its own; see installCopilotHooks.
|
|
24
|
-
*
|
|
25
|
-
* 2. Plugin install (OpenCode only). OpenCode does NOT share Claude Code's
|
|
26
|
-
* JSON-hook schema — its config has `additionalProperties: false` and no
|
|
27
|
-
* `hooks` key, so a JSON-hook install breaks opencode launch. Hippo
|
|
28
|
-
* installs a TypeScript plugin at
|
|
29
|
-
* `~/.config/opencode/plugins/hippo.ts` subscribing to opencode's
|
|
30
|
-
* `session.idle` (→ `hippo session-end`) and `session.created` (→
|
|
31
|
-
* `hippo last-sleep`) events. See OPENCODE_PLUGIN_SOURCE below for the
|
|
32
|
-
* plugin file content + design rationale; see installOpencodePlugin for
|
|
33
|
-
* the installer + the migration that removes any pre-existing broken
|
|
34
|
-
* `hooks` block from opencode.json.
|
|
35
|
-
*/
|
|
1
|
+
/** Hook install/uninstall for AI coding tools. Claude Code gets a JSON `hooks` block in settings.json; older forms are migrated automatically.
|
|
2
|
+
* OpenCode rejects the JSON-hook schema (no `hooks` key), so it gets a TS plugin (OPENCODE_PLUGIN_SOURCE); see installCodexHooks, installCopilotHooks. */
|
|
36
3
|
import * as fs from 'fs';
|
|
37
4
|
import * as path from 'path';
|
|
38
5
|
import { HIPPO_SLEEP_MARKER, HIPPO_LAST_SLEEP_MARKER, HIPPO_CAPTURE_MARKER, HIPPO_SESSION_END_MARKER, HIPPO_PINNED_INJECT_MARKER, HIPPO_PINNED_INJECT_COMMAND, HIPPO_PRE_COMPACT_MARKER, HIPPO_COMPACT_RESUME_MARKER, HIPPO_CAPTURE_ERROR_MARKER, HIPPO_POST_COMPACT_MARKER, homeDir, claudeConfigDir, codexHomeDir, copilotHooksFile, defaultPreCompactLogPath } from './shared.js';
|
|
@@ -66,7 +33,8 @@ export function resolveJsonHookPaths(target) {
|
|
|
66
33
|
}
|
|
67
34
|
// An unterminated quote runs to the end, as in a shell, which also keeps the scan linear.
|
|
68
35
|
const QUOTED_SPAN = /'[^']*(?:'|$)|"(?:[^"\\]|\\[\s\S]?)*(?:"|$)/g;
|
|
69
|
-
/** Hippo's command only at string start or after `(`, past env assignments and an install path, with quoted
|
|
36
|
+
/** Hippo's command only at string start or after `(`, past env assignments and an install path, with quoted
|
|
37
|
+
* text ignored: `say hippo sleep`, `echo "a; hippo sleep"` and `./backup.sh && hippo sleep` stay a user's. */
|
|
70
38
|
function isHippoCommand(command, marker) {
|
|
71
39
|
const unquoted = command.replace(QUOTED_SPAN, '');
|
|
72
40
|
return new RegExp(`(?:^|\\()\\s*(?:[A-Za-z_]\\w*=\\S*\\s+)*(?:[^\\s(]*[/\\\\])?${escapeRegex(marker)}(?![\\w.-])`).test(unquoted);
|
|
@@ -167,7 +135,8 @@ function nothingInstalled(target, settingsPath) {
|
|
|
167
135
|
function codexCommandHook(command, timeout) {
|
|
168
136
|
return { type: 'command', command, commandWindows: command.replace(/^hippo /, 'hippo.cmd '), timeout };
|
|
169
137
|
}
|
|
170
|
-
/** Assigns `settings.hooks = {}` when it is absent, then returns it if it is an object whose
|
|
138
|
+
/** Assigns `settings.hooks = {}` when it is absent, then returns it if it is an object whose
|
|
139
|
+
* `events`, where present, are arrays; null when appending would overwrite anything else. */
|
|
171
140
|
function ensureHooksObject(settings, events) {
|
|
172
141
|
if (settings.hooks === undefined)
|
|
173
142
|
settings.hooks = {};
|
|
@@ -310,27 +279,18 @@ const CLAUDE_APPENDED_EVENTS = CLAUDE_HOOK_MARKERS.map(([event]) => event).filte
|
|
|
310
279
|
function appendSessionHooks(hooks, logFile) {
|
|
311
280
|
const installedSessionEnd = appendHookIfMissing(hooks, 'SessionEnd', HIPPO_SESSION_END_MARKER, claudeCommandGroup(`hippo session-end --log-file "${logFile}"`, 5));
|
|
312
281
|
const installedSessionStart = appendHookIfMissing(hooks, 'SessionStart', HIPPO_LAST_SLEEP_MARKER, claudeCommandGroup(`hippo last-sleep --path "${logFile}"`, 5));
|
|
313
|
-
// Mid-session pinned-rule re-injection: UserPromptSubmit runs every turn,
|
|
314
|
-
//
|
|
315
|
-
// "forget" them in a long session. Include the fresh write tail so lessons
|
|
316
|
-
// saved earlier in the same session become visible on the next prompt even
|
|
317
|
-
// before the user pins them explicitly.
|
|
282
|
+
// Mid-session pinned-rule re-injection: UserPromptSubmit runs every turn, so pinned memories stay in context; the fresh write tail
|
|
283
|
+
// makes lessons saved earlier in the session visible on the next prompt even before they are pinned.
|
|
318
284
|
const migratedPinnedInjectRecent = migratePinnedInjectRecentCommands(hooks.UserPromptSubmit);
|
|
319
285
|
const installedUserPromptSubmit = appendHookIfMissing(hooks, 'UserPromptSubmit', HIPPO_PINNED_INJECT_MARKER, claudeCommandGroup(HIPPO_PINNED_INJECT_COMMAND, 5));
|
|
320
286
|
return { installedSessionEnd, installedSessionStart, migratedPinnedInjectRecent, installedUserPromptSubmit };
|
|
321
287
|
}
|
|
322
288
|
function appendCompactionHooks(hooks) {
|
|
323
|
-
// PreCompact: fires on manual AND auto compaction (no matcher)
|
|
324
|
-
//
|
|
325
|
-
// Exit-0 contract lives in the verb itself (src/capture.ts cmdPreCompact),
|
|
326
|
-
// not here — this is install-time wiring only.
|
|
289
|
+
// PreCompact: fires on manual AND auto compaction (no matcher); records it, asks the summariser for a "Memories for hippo" list and saves a snapshot.
|
|
290
|
+
// The exit-0 contract lives in the verb itself (cmdPreCompact, src/capture/compact.ts), not in this install-time wiring.
|
|
327
291
|
const installedPreCompact = appendHookIfMissing(hooks, 'PreCompact', HIPPO_PRE_COMPACT_MARKER, claudeCommandGroup(`hippo pre-compact --log-file "${defaultPreCompactLogPath()}"`, 30));
|
|
328
|
-
// SessionStart(compact): a
|
|
329
|
-
//
|
|
330
|
-
// a dependency — compact-resume itself checks payload.source too, so an
|
|
331
|
-
// older Claude Code that ignores the matcher just runs a silent no-op on
|
|
332
|
-
// normal starts. Marker check keys on the command string, so this stays
|
|
333
|
-
// idempotent alongside the sibling last-sleep entry.
|
|
292
|
+
// SessionStart(compact): a second SessionStart entry beside the unmatched last-sleep one. The matcher is an optimization, not a dependency:
|
|
293
|
+
// compact-resume checks payload.source itself, and the marker check keys on the command string, so this stays idempotent.
|
|
334
294
|
const installedCompactResume = appendHookIfMissing(hooks, 'SessionStart', HIPPO_COMPACT_RESUME_MARKER, claudeCommandGroup('hippo compact-resume', 10, 'compact'));
|
|
335
295
|
// PostCompact: saves the memories the summariser listed and prints one line, which Claude Code only shows.
|
|
336
296
|
// PreCompact stdout, by contrast, is handed to the summariser as instructions, so pre-compact prints just the request.
|
|
@@ -346,9 +306,8 @@ function installClaudeCodeHooks(settingsPath, settings, logFile) {
|
|
|
346
306
|
const migration = migrateLegacyClaudeHooks(hooks);
|
|
347
307
|
const { installedSessionEnd, installedSessionStart, migratedPinnedInjectRecent, installedUserPromptSubmit } = appendSessionHooks(hooks, logFile);
|
|
348
308
|
const { installedPreCompact, installedCompactResume, installedPostCompact } = appendCompactionHooks(hooks);
|
|
349
|
-
// PostToolUseFailure: a failed tool call becomes an error memory, after
|
|
350
|
-
//
|
|
351
|
-
// permissions, empty searches) and repeats. Same hook the plugin ships.
|
|
309
|
+
// PostToolUseFailure: a failed tool call becomes an error memory, after `hippo capture-error` drops routine failures
|
|
310
|
+
// (interrupts, declined permissions, empty searches) and repeats. Same hook the plugin ships.
|
|
352
311
|
const installedCaptureError = appendHookIfMissing(hooks, 'PostToolUseFailure', HIPPO_CAPTURE_ERROR_MARKER, claudeCommandGroup('hippo capture-error', 10, '.*'));
|
|
353
312
|
const result = {
|
|
354
313
|
target: 'claude-code',
|
|
@@ -380,7 +339,8 @@ function uninstallCodexHooks(hooks) {
|
|
|
380
339
|
changed = stripHandlers(hooks, event, (c) => c === command) || changed;
|
|
381
340
|
return changed;
|
|
382
341
|
}
|
|
383
|
-
/** One stderr line naming the handlers uninstall kept that still mention a hippo command
|
|
342
|
+
/** One stderr line naming the handlers uninstall kept that still mention a hippo command
|
|
343
|
+
* (`nice hippo sleep`, `pnpm exec hippo ...`), so the user can remove them by hand. */
|
|
384
344
|
function warnKeptHippoHandlers(settingsPath, hooks) {
|
|
385
345
|
const kept = CLAUDE_HOOK_MARKERS.flatMap(([event, markers]) => {
|
|
386
346
|
const groups = hooks[event];
|
|
@@ -421,7 +381,8 @@ export function uninstallJsonHooks(target) {
|
|
|
421
381
|
writeSettingsFile(settingsPath, settings);
|
|
422
382
|
return true;
|
|
423
383
|
}
|
|
424
|
-
/** Whether uninstall can edit settings.json; `invalidJson` marks a file that exists
|
|
384
|
+
/** Whether uninstall can edit settings.json; `invalidJson` marks a file that exists
|
|
385
|
+
* but is not JSON hippo can edit, which `uninstallJsonHooks` reports only as false. */
|
|
425
386
|
export function checkUninstallable(target) {
|
|
426
387
|
const { settings: settingsPath } = resolveJsonHookPaths(target);
|
|
427
388
|
if (!fs.existsSync(settingsPath))
|
package/dist/hooks/opencode.d.ts
CHANGED
|
@@ -1,42 +1,4 @@
|
|
|
1
1
|
declare const HIPPO_OPENCODE_PLUGIN_MARKER = "HIPPO_OPENCODE_PLUGIN_V1";
|
|
2
|
-
/**
|
|
3
|
-
* The opencode plugin file we install at ~/.config/opencode/plugins/hippo.ts.
|
|
4
|
-
*
|
|
5
|
-
* Per https://opencode.ai/docs/plugins/, plugins are TS/JS modules exporting an
|
|
6
|
-
* async function returning hooks. We subscribe to `event` and route:
|
|
7
|
-
* session.idle → `hippo session-end` (Claude Code's SessionEnd equiv)
|
|
8
|
-
* session.created → `hippo last-sleep` (Claude Code's SessionStart equiv)
|
|
9
|
-
*
|
|
10
|
-
* Design choices:
|
|
11
|
-
*
|
|
12
|
-
* 1. No `import type { Plugin } from "@opencode-ai/plugin"`. The package's npm
|
|
13
|
-
* publication status was unverifiable from the build sandbox (npmjs.com
|
|
14
|
-
* returned 403); an unresolved type-only import would still crash the TS
|
|
15
|
-
* runtime opencode uses to load the plugin. opencode infers plugin shape
|
|
16
|
-
* from the returned object, so the type was convenience-only.
|
|
17
|
-
*
|
|
18
|
-
* 2. Defensive `typeof $ !== 'function'` guard. opencode runs in Bun (where
|
|
19
|
-
* `$` is the shell-template helper), but a future Node-mode deployment
|
|
20
|
-
* would have `$` undefined in the destructured context and the plugin
|
|
21
|
-
* would throw on every session.idle, killing opencode sessions in a
|
|
22
|
-
* hard-to-recover way (the idempotence marker prevents auto-reinstall).
|
|
23
|
-
* Fail closed, let opencode continue.
|
|
24
|
-
*
|
|
25
|
-
* 3. `.quiet().nothrow()` on each `$\`...\`` so a missing hippo binary
|
|
26
|
-
* (e.g. PATH-misconfigured user) does NOT throw out of the event handler.
|
|
27
|
-
* The surrounding try/catch is belt-and-braces.
|
|
28
|
-
*
|
|
29
|
-
* 4. UserPromptSubmit equivalent NOT wired. opencode's `message.updated`
|
|
30
|
-
* fires per-token, not per-prompt-submit; no clean per-prompt event.
|
|
31
|
-
* Users wanting pinned-context auto-injection can call `hippo context`
|
|
32
|
-
* via the MCP server (`hippo mcp`).
|
|
33
|
-
*
|
|
34
|
-
* 5. Versioned marker `HIPPO_OPENCODE_PLUGIN_V1` allows future versions to
|
|
35
|
-
* overwrite cleanly. The installer's idempotence check requires BOTH
|
|
36
|
-
* marker match AND content equality, so a plugin-source revision under
|
|
37
|
-
* the same V1 marker re-writes the file on next install.
|
|
38
|
-
*/
|
|
39
|
-
export declare const OPENCODE_PLUGIN_SOURCE = "// HIPPO_OPENCODE_PLUGIN_V1\n// hippo-memory opencode plugin. DO NOT EDIT \u2014 regenerated on every\n// `hippo hook install opencode` from src/hooks.ts OPENCODE_PLUGIN_SOURCE\n// in https://github.com/kitfunso/hippo-memory. Local changes will be lost.\n\nexport const HippoPlugin = async ({ $ }) => {\n return {\n event: async ({ event }) => {\n // Defense in depth: opencode currently runs in Bun where $ is the shell\n // template helper. A non-Bun runtime would have $ as undefined; fail\n // closed instead of crashing the host session.\n if (typeof $ !== \"function\") return;\n try {\n if (event.type === \"session.idle\") {\n await $`hippo session-end`.quiet().nothrow();\n } else if (event.type === \"session.created\") {\n await $`hippo last-sleep`.quiet().nothrow();\n }\n } catch {\n // hippo CLI not on PATH or other failure \u2014 never crash the host session.\n }\n },\n };\n};\n";
|
|
40
2
|
export { HIPPO_OPENCODE_PLUGIN_MARKER };
|
|
41
3
|
export interface OpencodePluginInstallResult {
|
|
42
4
|
installed: boolean;
|
package/dist/hooks/opencode.js
CHANGED
|
@@ -4,44 +4,9 @@ import { homeDir } from './shared.js';
|
|
|
4
4
|
import { writeFileAtomic } from '../util/atomic-write.js';
|
|
5
5
|
import { isJsonString, isJsonObjectLiteral } from '../util/json.js';
|
|
6
6
|
const HIPPO_OPENCODE_PLUGIN_MARKER = 'HIPPO_OPENCODE_PLUGIN_V1';
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
|
|
10
|
-
* Per https://opencode.ai/docs/plugins/, plugins are TS/JS modules exporting an
|
|
11
|
-
* async function returning hooks. We subscribe to `event` and route:
|
|
12
|
-
* session.idle → `hippo session-end` (Claude Code's SessionEnd equiv)
|
|
13
|
-
* session.created → `hippo last-sleep` (Claude Code's SessionStart equiv)
|
|
14
|
-
*
|
|
15
|
-
* Design choices:
|
|
16
|
-
*
|
|
17
|
-
* 1. No `import type { Plugin } from "@opencode-ai/plugin"`. The package's npm
|
|
18
|
-
* publication status was unverifiable from the build sandbox (npmjs.com
|
|
19
|
-
* returned 403); an unresolved type-only import would still crash the TS
|
|
20
|
-
* runtime opencode uses to load the plugin. opencode infers plugin shape
|
|
21
|
-
* from the returned object, so the type was convenience-only.
|
|
22
|
-
*
|
|
23
|
-
* 2. Defensive `typeof $ !== 'function'` guard. opencode runs in Bun (where
|
|
24
|
-
* `$` is the shell-template helper), but a future Node-mode deployment
|
|
25
|
-
* would have `$` undefined in the destructured context and the plugin
|
|
26
|
-
* would throw on every session.idle, killing opencode sessions in a
|
|
27
|
-
* hard-to-recover way (the idempotence marker prevents auto-reinstall).
|
|
28
|
-
* Fail closed, let opencode continue.
|
|
29
|
-
*
|
|
30
|
-
* 3. `.quiet().nothrow()` on each `$\`...\`` so a missing hippo binary
|
|
31
|
-
* (e.g. PATH-misconfigured user) does NOT throw out of the event handler.
|
|
32
|
-
* The surrounding try/catch is belt-and-braces.
|
|
33
|
-
*
|
|
34
|
-
* 4. UserPromptSubmit equivalent NOT wired. opencode's `message.updated`
|
|
35
|
-
* fires per-token, not per-prompt-submit; no clean per-prompt event.
|
|
36
|
-
* Users wanting pinned-context auto-injection can call `hippo context`
|
|
37
|
-
* via the MCP server (`hippo mcp`).
|
|
38
|
-
*
|
|
39
|
-
* 5. Versioned marker `HIPPO_OPENCODE_PLUGIN_V1` allows future versions to
|
|
40
|
-
* overwrite cleanly. The installer's idempotence check requires BOTH
|
|
41
|
-
* marker match AND content equality, so a plugin-source revision under
|
|
42
|
-
* the same V1 marker re-writes the file on next install.
|
|
43
|
-
*/
|
|
44
|
-
export const OPENCODE_PLUGIN_SOURCE = `// ${HIPPO_OPENCODE_PLUGIN_MARKER}
|
|
7
|
+
/** The opencode plugin installed at ~/.config/opencode/plugins/hippo.ts: session.idle runs `hippo session-end`, session.created runs `hippo last-sleep`.
|
|
8
|
+
* No `@opencode-ai/plugin` type import (unresolved, it would crash the loader); `$` is guarded and `.nothrow()` keeps a missing hippo binary from throwing. */
|
|
9
|
+
const OPENCODE_PLUGIN_SOURCE = `// ${HIPPO_OPENCODE_PLUGIN_MARKER}
|
|
45
10
|
// hippo-memory opencode plugin. DO NOT EDIT — regenerated on every
|
|
46
11
|
// \`hippo hook install opencode\` from src/hooks.ts OPENCODE_PLUGIN_SOURCE
|
|
47
12
|
// in https://github.com/kitfunso/hippo-memory. Local changes will be lost.
|
|
@@ -73,23 +38,8 @@ export function resolveOpencodePluginPath() {
|
|
|
73
38
|
function resolveOpencodeConfigPath() {
|
|
74
39
|
return path.join(homeDir(), '.config', 'opencode', 'opencode.json');
|
|
75
40
|
}
|
|
76
|
-
/**
|
|
77
|
-
*
|
|
78
|
-
* `hippo ` (the verb-prefix). Used to surgically remove only hippo-owned
|
|
79
|
-
* commands when migrating an opencode.json. We own the install side, so only
|
|
80
|
-
* the canonical `hippo <verb>` form needs to match — and only canonical verbs
|
|
81
|
-
* hippo itself installs (session-end, last-sleep, sleep, capture, context),
|
|
82
|
-
* not any third-party tool that happens to be named `hippo`.
|
|
83
|
-
*
|
|
84
|
-
* Structural check: substring matching against
|
|
85
|
-
* arbitrary user content is unsafe — a user's
|
|
86
|
-
* `echo "remember to hippo sleep your laptop"` is not a hippo-owned hook.
|
|
87
|
-
*
|
|
88
|
-
* Per-hook (not per-entry) granularity: an entry whose inner
|
|
89
|
-
* hooks array mixes hippo-installed commands with user-authored commands
|
|
90
|
-
* must NOT lose the user-authored commands. The migration filters the inner
|
|
91
|
-
* array per-hook, then drops the entry only when its inner array is empty.
|
|
92
|
-
*/
|
|
41
|
+
/** True iff a hook entry's command starts with `hippo ` plus a verb hippo itself installs (session-end, last-sleep, sleep, capture, context).
|
|
42
|
+
* Structural, not substring (`echo "remember to hippo sleep"` is not ours), and per hook so user-authored hooks in the same entry survive. */
|
|
93
43
|
const HIPPO_OWNED_COMMAND_RE = /^\s*hippo\s+(session-end|last-sleep|sleep|capture|context)(?=\s|$)/;
|
|
94
44
|
function hookIsHippoOwned(hook) {
|
|
95
45
|
if (!isJsonObjectLiteral(hook))
|
|
@@ -97,23 +47,8 @@ function hookIsHippoOwned(hook) {
|
|
|
97
47
|
const cmd = hook.command;
|
|
98
48
|
return isJsonString(cmd) && HIPPO_OWNED_COMMAND_RE.test(cmd);
|
|
99
49
|
}
|
|
100
|
-
/**
|
|
101
|
-
*
|
|
102
|
-
* Returns one of:
|
|
103
|
-
* { migrated: true, jsonRepairFailed: false } — at least one hook removed.
|
|
104
|
-
* { migrated: false, jsonRepairFailed: false } — file fine, nothing to do.
|
|
105
|
-
* { migrated: false, jsonRepairFailed: true } — file present but unparseable.
|
|
106
|
-
*
|
|
107
|
-
* Per-hook surgery:
|
|
108
|
-
* - For each entry in each event-key array, filter the inner `hooks` array
|
|
109
|
-
* to remove hippo-owned hooks only. User-authored hooks in the same
|
|
110
|
-
* inner array are preserved.
|
|
111
|
-
* - When an entry's inner `hooks` array becomes empty, that entry is
|
|
112
|
-
* removed from the outer array.
|
|
113
|
-
* - When an event-key array becomes empty, the key is deleted.
|
|
114
|
-
* - When the top-level `hooks` object becomes empty, it is deleted.
|
|
115
|
-
* - Other keys (theme, etc.) are always preserved.
|
|
116
|
-
*/
|
|
50
|
+
/** Strip every hippo-owned hook from opencode.json's `hooks` key, deleting entries, keys and the object as they empty; user-authored hooks and other keys stay.
|
|
51
|
+
* Returns `{ migrated, jsonRepairFailed }`; jsonRepairFailed means the file is present but unparseable. */
|
|
117
52
|
function migrateLegacyOpencodeHooksBlock() {
|
|
118
53
|
const configPath = resolveOpencodeConfigPath();
|
|
119
54
|
if (!fs.existsSync(configPath))
|
|
@@ -180,10 +115,8 @@ function stripHippoHooksFromEntries(entries) {
|
|
|
180
115
|
export function installOpencodePlugin() {
|
|
181
116
|
const pluginPath = resolveOpencodePluginPath();
|
|
182
117
|
const { migrated, jsonRepairFailed } = migrateLegacyOpencodeHooksBlock();
|
|
183
|
-
//
|
|
184
|
-
// content
|
|
185
|
-
// content) overwrite cleanly so future plugin-source patches reach
|
|
186
|
-
// existing installs.
|
|
118
|
+
// Skip the write only if BOTH the marker is present and the content matches; a marker-only match with stale
|
|
119
|
+
// content is rewritten so plugin-source patches reach existing installs.
|
|
187
120
|
if (fs.existsSync(pluginPath)) {
|
|
188
121
|
const existing = fs.readFileSync(pluginPath, 'utf8');
|
|
189
122
|
if (existing.includes(HIPPO_OPENCODE_PLUGIN_MARKER) && existing === OPENCODE_PLUGIN_SOURCE) {
|
package/dist/hooks/shared.d.ts
CHANGED
|
@@ -20,9 +20,11 @@ export declare const HIPPO_POST_COMPACT_MARKER = "hippo post-compact";
|
|
|
20
20
|
export declare function homeDir(): string;
|
|
21
21
|
/** Codex's config folder: $CODEX_HOME, else ~/.codex, as the Codex hooks docs describe. */
|
|
22
22
|
export declare function codexHomeDir(home?: string, env?: Readonly<Record<string, string | undefined>>): string;
|
|
23
|
-
/** Copilot's config folder: $COPILOT_HOME, else ~/.copilot under os.homedir(), as the
|
|
23
|
+
/** Copilot's config folder: $COPILOT_HOME, else ~/.copilot under os.homedir(), as the
|
|
24
|
+
* Copilot apps resolve it (a HOME that differs from the profile must not move it). */
|
|
24
25
|
export declare function copilotHomeDir(home?: string, env?: Readonly<Record<string, string | undefined>>): string;
|
|
25
|
-
/** Claude Code's config folder, where it reads settings.json: $CLAUDE_CONFIG_DIR when set and non-empty, else
|
|
26
|
+
/** Claude Code's config folder, where it reads settings.json: $CLAUDE_CONFIG_DIR when set and non-empty, else
|
|
27
|
+
* ~/.claude under os.homedir(), as Claude Code does (a HOME that differs from the profile must not move it). */
|
|
26
28
|
export declare function claudeConfigDir(home?: string, env?: Readonly<Record<string, string | undefined>>): string;
|
|
27
29
|
/** Codex counts as installed only when its config folder exists: Codex itself refuses a CODEX_HOME that is not a folder. */
|
|
28
30
|
export declare function isCodexPresent(home?: string): boolean;
|
|
@@ -36,23 +38,12 @@ export declare function vscodeUserDirs(env?: Readonly<Record<string, string | un
|
|
|
36
38
|
export declare function isCopilotPresent(home?: string): boolean;
|
|
37
39
|
/** Codex hashes each hook and skips new or changed ones until the user reviews them in `/hooks`, so the reminder says what they would trust. */
|
|
38
40
|
export declare const CODEX_TRUST_LINE = "The per-prompt hook sends your pinned memories plus up to 5 that match the prompt. Codex runs hippo's hooks only after you trust them once in `/hooks`.";
|
|
39
|
-
/**
|
|
40
|
-
* Default log path consumed by `hippo last-sleep`. Shared fallback when
|
|
41
|
-
* a caller doesn't pass --path explicitly.
|
|
42
|
-
*/
|
|
41
|
+
/** Default log path consumed by `hippo last-sleep` when a caller passes no --path. */
|
|
43
42
|
export declare function defaultSleepLogPath(): string;
|
|
44
|
-
/**
|
|
45
|
-
*
|
|
46
|
-
* from the SessionEnd sleep log: `hippo last-sleep` truncates that file on
|
|
47
|
-
* every SessionStart, which would wipe pre-compact lines before anyone
|
|
48
|
-
* could read them. Nothing consumes this file programmatically — it exists
|
|
49
|
-
* for manual troubleshooting only. Overridden by `--log-file`.
|
|
50
|
-
*/
|
|
43
|
+
/** Diagnostic-only log path for `hippo pre-compact`, kept apart from the SessionEnd sleep log because `hippo last-sleep` truncates that one every SessionStart.
|
|
44
|
+
* Nothing reads it programmatically; overridden by `--log-file`. */
|
|
51
45
|
export declare function defaultPreCompactLogPath(): string;
|
|
52
46
|
export declare function ensureDir(dir: string): void;
|
|
53
|
-
/**
|
|
54
|
-
* Detect which AI coding tools are installed based on config directory presence.
|
|
55
|
-
* Used by `hippo setup` to decide which JSON-hook installs to run.
|
|
56
|
-
*/
|
|
47
|
+
/** Detect which AI coding tools are installed from config directory presence; `hippo setup` uses it to pick JSON-hook installs. */
|
|
57
48
|
export declare function detectInstalledTools(): ToolDetection[];
|
|
58
49
|
//# sourceMappingURL=shared.d.ts.map
|