hippo-memory 1.69.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 +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- 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.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- 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 +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- 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 +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- 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 +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- 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/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- 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 +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- 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 +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- 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/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- 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/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → 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 +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- 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 +2 -2
- package/dist/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -2,11 +2,15 @@ export declare const HOOK_MARKERS: {
|
|
|
2
2
|
start: string;
|
|
3
3
|
end: string;
|
|
4
4
|
};
|
|
5
|
-
export
|
|
5
|
+
export interface HookSpec {
|
|
6
6
|
file: string;
|
|
7
7
|
content: string;
|
|
8
8
|
description: string;
|
|
9
|
-
}
|
|
9
|
+
}
|
|
10
|
+
export interface HookTable {
|
|
11
|
+
[agent: string]: HookSpec;
|
|
12
|
+
}
|
|
13
|
+
export declare const HOOKS: HookTable;
|
|
10
14
|
/** The first hippo block in `text` and the agent whose current or shipped text it is; `owner` is undefined for an edited block. */
|
|
11
15
|
export declare function hippoBlock(text: string): {
|
|
12
16
|
start: number;
|
|
@@ -1,75 +1,26 @@
|
|
|
1
1
|
// The hippo block each agent's instruction file carries, and how init recognises one it wrote earlier.
|
|
2
2
|
import { createHash } from 'node:crypto';
|
|
3
|
-
import { escapeRegex } from '../escape.js';
|
|
3
|
+
import { escapeRegex } from '../util/escape.js';
|
|
4
4
|
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,40 +1,7 @@
|
|
|
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
|
-
import { type JsonValue } from '../json.js';
|
|
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. */
|
|
39
6
|
export interface JsonHookPaths {
|
|
40
7
|
settings: string;
|
|
@@ -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,44 +1,11 @@
|
|
|
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
|
-
import {
|
|
39
|
-
import { isJsonString, readJsonFile } from '../json.js';
|
|
40
|
-
import { escapeRegex } from '../escape.js';
|
|
41
|
-
import {
|
|
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';
|
|
6
|
+
import { isJsonString, readJsonFile, isJsonObjectLiteral } from '../util/json.js';
|
|
7
|
+
import { escapeRegex } from '../util/escape.js';
|
|
8
|
+
import { writeFileAtomic } from '../util/atomic-write.js';
|
|
42
9
|
/** The paths for `target` under the current home directory; reads and writes nothing. */
|
|
43
10
|
export function resolveJsonHookPaths(target) {
|
|
44
11
|
const home = homeDir();
|
|
@@ -66,20 +33,21 @@ 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);
|
|
73
41
|
}
|
|
74
42
|
const runsHippo = (...markers) => (command) => markers.some((m) => isHippoCommand(command, m));
|
|
75
43
|
function handlerCommand(handler) {
|
|
76
|
-
return
|
|
44
|
+
return isJsonObjectLiteral(handler) && isJsonString(handler.command) ? handler.command : null;
|
|
77
45
|
}
|
|
78
46
|
/** `groups` minus the handlers `isOurs` picks; a group goes only once it has no handler left. Null when no handler matched. */
|
|
79
47
|
function withoutHandlers(groups, isOurs) {
|
|
80
48
|
let removed = false;
|
|
81
49
|
const kept = groups.flatMap((group) => {
|
|
82
|
-
if (!
|
|
50
|
+
if (!isJsonObjectLiteral(group) || !Array.isArray(group.hooks))
|
|
83
51
|
return [group];
|
|
84
52
|
const handlers = group.hooks.filter((h) => {
|
|
85
53
|
const command = handlerCommand(h);
|
|
@@ -108,7 +76,7 @@ function stripHandlers(hooks, event, isOurs) {
|
|
|
108
76
|
}
|
|
109
77
|
/** Every command string in `groups`; a group or handler of an unexpected shape adds none. */
|
|
110
78
|
function handlerCommands(groups) {
|
|
111
|
-
return groups.flatMap((group) => (
|
|
79
|
+
return groups.flatMap((group) => (isJsonObjectLiteral(group) && Array.isArray(group.hooks) ? group.hooks.flatMap((h) => handlerCommand(h) ?? []) : []));
|
|
112
80
|
}
|
|
113
81
|
/** The loose "already installed?" test, on purpose weaker than isHippoCommand: a launcher or env prefix still counts, and a false hit only skips an append. */
|
|
114
82
|
function hookArrayContains(hookArray, marker) {
|
|
@@ -126,13 +94,13 @@ function migratePinnedInjectRecentCommands(hookArray) {
|
|
|
126
94
|
return false;
|
|
127
95
|
let changed = false;
|
|
128
96
|
for (const entry of hookArray) {
|
|
129
|
-
if (!
|
|
97
|
+
if (!isJsonObjectLiteral(entry))
|
|
130
98
|
continue;
|
|
131
99
|
const innerHooks = entry.hooks;
|
|
132
100
|
if (!Array.isArray(innerHooks))
|
|
133
101
|
continue;
|
|
134
102
|
for (const hook of innerHooks) {
|
|
135
|
-
if (!
|
|
103
|
+
if (!isJsonObjectLiteral(hook))
|
|
136
104
|
continue;
|
|
137
105
|
if (!isJsonString(hook.command))
|
|
138
106
|
continue;
|
|
@@ -167,19 +135,20 @@ 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 = {};
|
|
174
143
|
const hooks = settings.hooks;
|
|
175
|
-
if (!
|
|
144
|
+
if (!isJsonObjectLiteral(hooks) || events.some((e) => hooks[e] !== undefined && !Array.isArray(hooks[e])))
|
|
176
145
|
return null;
|
|
177
146
|
return hooks;
|
|
178
147
|
}
|
|
179
148
|
/** Codex keys trust to each hook's position and hash and re-asks for a changed one, so hippo only appends and never edits an entry. */
|
|
180
149
|
function installCodexHooks(settingsPath, settings) {
|
|
181
150
|
const result = nothingInstalled('codex', settingsPath);
|
|
182
|
-
if (!
|
|
151
|
+
if (!isJsonObjectLiteral(settings))
|
|
183
152
|
return { ...result, invalidJson: true };
|
|
184
153
|
const hooks = ensureHooksObject(settings, ['UserPromptSubmit', 'SessionStart']);
|
|
185
154
|
if (hooks === null)
|
|
@@ -225,7 +194,7 @@ function copilotHooksTable() {
|
|
|
225
194
|
/** The events in hippo's Copilot hooks file, in file order, for setup to name. */
|
|
226
195
|
export function copilotHookEvents() {
|
|
227
196
|
const hooks = copilotHooksTable().hooks;
|
|
228
|
-
return
|
|
197
|
+
return isJsonObjectLiteral(hooks) ? Object.keys(hooks) : [];
|
|
229
198
|
}
|
|
230
199
|
/** Hippo owns this whole file, so install writes the full table and a second install changes no byte. */
|
|
231
200
|
function installCopilotHooks(settingsPath) {
|
|
@@ -256,112 +225,13 @@ export function installJsonHooks(target) {
|
|
|
256
225
|
}
|
|
257
226
|
if (target === 'codex')
|
|
258
227
|
return installCodexHooks(settingsPath, settings);
|
|
259
|
-
if (!
|
|
228
|
+
if (!isJsonObjectLiteral(settings))
|
|
260
229
|
return { ...nothingInstalled(target, settingsPath), invalidJson: true };
|
|
261
230
|
return installClaudeCodeHooks(settingsPath, settings, logFile);
|
|
262
231
|
}
|
|
263
|
-
const RENAME_RETRY_MS = 1000;
|
|
264
|
-
const WINDOWS_RENAME_REFUSALS = ['EPERM', 'EACCES', 'EBUSY'];
|
|
265
|
-
// A rename can be refused where an in-place write still works (a bind-mounted file, a read-only folder), so these fall back to one.
|
|
266
|
-
const REPLACE_REFUSALS = ['EBUSY', 'EXDEV', 'EACCES', 'EPERM'];
|
|
267
|
-
// Matches the usual SYMLOOP_MAX, so a link cycle ends in an error instead of a hang.
|
|
268
|
-
const MAX_LINK_HOPS = 40;
|
|
269
|
-
function errnoCode(err) {
|
|
270
|
-
return 'code' in err ? String(err.code) : '';
|
|
271
|
-
}
|
|
272
|
-
/** Windows refuses a rename onto a file another program has open, usually for a moment, so a refusal is retried before it is reported. */
|
|
273
|
-
function renameOnto(tmp, target) {
|
|
274
|
-
const deadline = Date.now() + RENAME_RETRY_MS;
|
|
275
|
-
const idle = new Int32Array(new SharedArrayBuffer(4));
|
|
276
|
-
for (let pause = 10;; pause = Math.min(pause * 2, 200)) {
|
|
277
|
-
try {
|
|
278
|
-
fs.renameSync(tmp, target);
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
catch (err) {
|
|
282
|
-
const transient = process.platform === 'win32' && err instanceof Error && WINDOWS_RENAME_REFUSALS.includes(errnoCode(err));
|
|
283
|
-
const left = deadline - Date.now();
|
|
284
|
-
if (!transient || left <= 0)
|
|
285
|
-
throw err;
|
|
286
|
-
Atomics.wait(idle, 0, 0, Math.min(pause, left));
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
/** Where a write to `file` lands: through any symlink, a dangling one included, so a dotfile manager's link survives. */
|
|
291
|
-
function writeTarget(file) {
|
|
292
|
-
let target = file;
|
|
293
|
-
for (let hop = 0; hop < MAX_LINK_HOPS && fs.lstatSync(target, { throwIfNoEntry: false })?.isSymbolicLink(); hop++) {
|
|
294
|
-
target = path.resolve(path.dirname(target), fs.readlinkSync(target));
|
|
295
|
-
}
|
|
296
|
-
return fs.existsSync(target) ? fs.realpathSync(target) : target;
|
|
297
|
-
}
|
|
298
|
-
/** Gives the replacement the old file's exact mode (umask trims the create mode) and, for root, its owner. */
|
|
299
|
-
function keepAccess(tmp, old) {
|
|
300
|
-
fs.chmodSync(tmp, old.mode & 0o777);
|
|
301
|
-
if (process.getuid?.() === 0)
|
|
302
|
-
fs.chownSync(tmp, old.uid, old.gid);
|
|
303
|
-
}
|
|
304
|
-
/** Cleanup must not hide the failure that made it necessary, so a cleanup error is logged and the first error stays the one thrown. */
|
|
305
|
-
function removeTemp(tmp) {
|
|
306
|
-
try {
|
|
307
|
-
fs.rmSync(tmp, { force: true });
|
|
308
|
-
}
|
|
309
|
-
catch (err) {
|
|
310
|
-
log.warn(`could not remove the temporary file ${tmp}: ${errorMessage(err)}`);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
function replaceViaTemp(target, text, old) {
|
|
314
|
-
const tmp = `${target}.${process.pid}.tmp`;
|
|
315
|
-
try {
|
|
316
|
-
fs.writeFileSync(tmp, text, { encoding: 'utf8', mode: (old?.mode ?? 0o666) & 0o777 });
|
|
317
|
-
if (old)
|
|
318
|
-
keepAccess(tmp, old);
|
|
319
|
-
renameOnto(tmp, target);
|
|
320
|
-
}
|
|
321
|
-
catch (err) {
|
|
322
|
-
removeTemp(tmp);
|
|
323
|
-
throw err;
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
/** The pre-rename write: it truncates first, so it is only the fallback, but it needs just a writable file and keeps hard links together. */
|
|
327
|
-
function writeInPlace(target, text) {
|
|
328
|
-
try {
|
|
329
|
-
fs.writeFileSync(target, text, 'utf8');
|
|
330
|
-
}
|
|
331
|
-
catch (err) {
|
|
332
|
-
if (!(err instanceof Error))
|
|
333
|
-
throw err;
|
|
334
|
-
const reason = errnoCode(err) === 'EBUSY'
|
|
335
|
-
? 'is in use by another program, so hippo could not replace it; close that program and run the command again'
|
|
336
|
-
: `could not be replaced (${errnoCode(err) || err.message})`;
|
|
337
|
-
throw new Error(`${target} ${reason}`, { cause: err });
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
232
|
/** Swaps the file in with one rename, so a crash mid-write cannot leave a truncated settings.json that Claude Code cannot parse. */
|
|
341
233
|
export function writeSettingsFile(file, settings) {
|
|
342
|
-
|
|
343
|
-
const text = JSON.stringify(settings, null, 2) + '\n';
|
|
344
|
-
const old = fs.statSync(target, { throwIfNoEntry: false });
|
|
345
|
-
if (old === undefined) {
|
|
346
|
-
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
// A rename replaces a read-only file that the in-place write refused, and Windows would retry that refusal for a second.
|
|
350
|
-
fs.accessSync(target, fs.constants.W_OK);
|
|
351
|
-
}
|
|
352
|
-
if (old !== undefined && old.nlink > 1) {
|
|
353
|
-
// A rename gives the file a new inode, which would leave the other hard links on the old content.
|
|
354
|
-
writeInPlace(target, text);
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
try {
|
|
358
|
-
replaceViaTemp(target, text, old);
|
|
359
|
-
}
|
|
360
|
-
catch (err) {
|
|
361
|
-
if (!(err instanceof Error) || !REPLACE_REFUSALS.includes(errnoCode(err)))
|
|
362
|
-
throw err;
|
|
363
|
-
writeInPlace(target, text);
|
|
364
|
-
}
|
|
234
|
+
writeFileAtomic(file, JSON.stringify(settings, null, 2) + '\n');
|
|
365
235
|
}
|
|
366
236
|
function migrateLegacyClaudeHooks(hooks) {
|
|
367
237
|
const migratedFromStop = stripHandlers(hooks, 'Stop', runsHippo(HIPPO_SLEEP_MARKER));
|
|
@@ -406,40 +276,38 @@ const CLAUDE_HOOK_MARKERS = [
|
|
|
406
276
|
];
|
|
407
277
|
// Stop is only ever migrated away, so install never appends to it and a Stop that is not a list does not block the install.
|
|
408
278
|
const CLAUDE_APPENDED_EVENTS = CLAUDE_HOOK_MARKERS.map(([event]) => event).filter((event) => event !== 'Stop');
|
|
409
|
-
function
|
|
410
|
-
const merge = ensureHooksObject(settings, CLAUDE_APPENDED_EVENTS);
|
|
411
|
-
if (merge === null)
|
|
412
|
-
return { ...nothingInstalled('claude-code', settingsPath), invalidJson: true };
|
|
413
|
-
// SAFETY: ensureHooksObject left every event hippo appends to absent or an array.
|
|
414
|
-
const hooks = merge;
|
|
415
|
-
const migration = migrateLegacyClaudeHooks(hooks);
|
|
279
|
+
function appendSessionHooks(hooks, logFile) {
|
|
416
280
|
const installedSessionEnd = appendHookIfMissing(hooks, 'SessionEnd', HIPPO_SESSION_END_MARKER, claudeCommandGroup(`hippo session-end --log-file "${logFile}"`, 5));
|
|
417
281
|
const installedSessionStart = appendHookIfMissing(hooks, 'SessionStart', HIPPO_LAST_SLEEP_MARKER, claudeCommandGroup(`hippo last-sleep --path "${logFile}"`, 5));
|
|
418
|
-
// Mid-session pinned-rule re-injection: UserPromptSubmit runs every turn,
|
|
419
|
-
//
|
|
420
|
-
// "forget" them in a long session. Include the fresh write tail so lessons
|
|
421
|
-
// saved earlier in the same session become visible on the next prompt even
|
|
422
|
-
// 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.
|
|
423
284
|
const migratedPinnedInjectRecent = migratePinnedInjectRecentCommands(hooks.UserPromptSubmit);
|
|
424
285
|
const installedUserPromptSubmit = appendHookIfMissing(hooks, 'UserPromptSubmit', HIPPO_PINNED_INJECT_MARKER, claudeCommandGroup(HIPPO_PINNED_INJECT_COMMAND, 5));
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
//
|
|
286
|
+
return { installedSessionEnd, installedSessionStart, migratedPinnedInjectRecent, installedUserPromptSubmit };
|
|
287
|
+
}
|
|
288
|
+
function appendCompactionHooks(hooks) {
|
|
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.
|
|
429
291
|
const installedPreCompact = appendHookIfMissing(hooks, 'PreCompact', HIPPO_PRE_COMPACT_MARKER, claudeCommandGroup(`hippo pre-compact --log-file "${defaultPreCompactLogPath()}"`, 30));
|
|
430
|
-
// SessionStart(compact): a
|
|
431
|
-
//
|
|
432
|
-
// a dependency — compact-resume itself checks payload.source too, so an
|
|
433
|
-
// older Claude Code that ignores the matcher just runs a silent no-op on
|
|
434
|
-
// normal starts. Marker check keys on the command string, so this stays
|
|
435
|
-
// 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.
|
|
436
294
|
const installedCompactResume = appendHookIfMissing(hooks, 'SessionStart', HIPPO_COMPACT_RESUME_MARKER, claudeCommandGroup('hippo compact-resume', 10, 'compact'));
|
|
437
295
|
// PostCompact: saves the memories the summariser listed and prints one line, which Claude Code only shows.
|
|
438
296
|
// PreCompact stdout, by contrast, is handed to the summariser as instructions, so pre-compact prints just the request.
|
|
439
297
|
const installedPostCompact = appendHookIfMissing(hooks, 'PostCompact', HIPPO_POST_COMPACT_MARKER, claudeCommandGroup(`hippo post-compact --log-file "${defaultPreCompactLogPath()}"`, 10));
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
298
|
+
return { installedPreCompact, installedCompactResume, installedPostCompact };
|
|
299
|
+
}
|
|
300
|
+
function installClaudeCodeHooks(settingsPath, settings, logFile) {
|
|
301
|
+
const merge = ensureHooksObject(settings, CLAUDE_APPENDED_EVENTS);
|
|
302
|
+
if (merge === null)
|
|
303
|
+
return { ...nothingInstalled('claude-code', settingsPath), invalidJson: true };
|
|
304
|
+
// SAFETY: ensureHooksObject left every event hippo appends to absent or an array.
|
|
305
|
+
const hooks = merge;
|
|
306
|
+
const migration = migrateLegacyClaudeHooks(hooks);
|
|
307
|
+
const { installedSessionEnd, installedSessionStart, migratedPinnedInjectRecent, installedUserPromptSubmit } = appendSessionHooks(hooks, logFile);
|
|
308
|
+
const { installedPreCompact, installedCompactResume, installedPostCompact } = appendCompactionHooks(hooks);
|
|
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.
|
|
443
311
|
const installedCaptureError = appendHookIfMissing(hooks, 'PostToolUseFailure', HIPPO_CAPTURE_ERROR_MARKER, claudeCommandGroup('hippo capture-error', 10, '.*'));
|
|
444
312
|
const result = {
|
|
445
313
|
target: 'claude-code',
|
|
@@ -471,7 +339,8 @@ function uninstallCodexHooks(hooks) {
|
|
|
471
339
|
changed = stripHandlers(hooks, event, (c) => c === command) || changed;
|
|
472
340
|
return changed;
|
|
473
341
|
}
|
|
474
|
-
/** 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. */
|
|
475
344
|
function warnKeptHippoHandlers(settingsPath, hooks) {
|
|
476
345
|
const kept = CLAUDE_HOOK_MARKERS.flatMap(([event, markers]) => {
|
|
477
346
|
const groups = hooks[event];
|
|
@@ -499,7 +368,7 @@ export function uninstallJsonHooks(target) {
|
|
|
499
368
|
// Never rewrite a settings file we cannot parse; report nothing uninstalled.
|
|
500
369
|
return false;
|
|
501
370
|
}
|
|
502
|
-
if (!
|
|
371
|
+
if (!isJsonObjectLiteral(settings) || !isJsonObjectLiteral(settings.hooks))
|
|
503
372
|
return false;
|
|
504
373
|
const hooks = settings.hooks;
|
|
505
374
|
const changed = target === 'codex' ? uninstallCodexHooks(hooks) : uninstallClaudeCodeHooks(hooks);
|
|
@@ -512,14 +381,15 @@ export function uninstallJsonHooks(target) {
|
|
|
512
381
|
writeSettingsFile(settingsPath, settings);
|
|
513
382
|
return true;
|
|
514
383
|
}
|
|
515
|
-
/** 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. */
|
|
516
386
|
export function checkUninstallable(target) {
|
|
517
387
|
const { settings: settingsPath } = resolveJsonHookPaths(target);
|
|
518
388
|
if (!fs.existsSync(settingsPath))
|
|
519
389
|
return { settingsPath, invalidJson: false };
|
|
520
390
|
try {
|
|
521
391
|
const settings = readJsonFile(settingsPath);
|
|
522
|
-
return { settingsPath, invalidJson: !
|
|
392
|
+
return { settingsPath, invalidJson: !isJsonObjectLiteral(settings) || (settings.hooks !== undefined && !isJsonObjectLiteral(settings.hooks)) };
|
|
523
393
|
}
|
|
524
394
|
catch {
|
|
525
395
|
return { settingsPath, invalidJson: true };
|