hippo-memory 1.68.0 → 1.70.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 +6 -3
- 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 +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.d.ts +3 -1
- package/dist/agent-memories/copilot.js +5 -4
- package/dist/agent-memories/files.js +3 -2
- 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/report.d.ts +1 -1
- package/dist/agent-memories/report.js +1 -1
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +1 -1
- package/dist/agent-memories/sync.js +24 -33
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +2 -2
- package/dist/api/assemble.js +42 -32
- package/dist/api/audit.d.ts +4 -7
- package/dist/api/audit.js +6 -20
- package/dist/api/auth.d.ts +5 -18
- package/dist/api/auth.js +44 -194
- 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} +2 -2
- package/dist/{availability.js → api/availability.js} +12 -29
- 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 +14 -4
- package/dist/api/context-select.js +50 -60
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +113 -85
- package/dist/api/dormant.d.ts +3 -3
- package/dist/api/dormant.js +38 -107
- package/dist/api/drill-down.d.ts +2 -2
- package/dist/api/drill-down.js +37 -65
- package/dist/api/forget.d.ts +4 -13
- package/dist/api/forget.js +13 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/index.d.ts +26 -0
- package/dist/api/index.js +29 -0
- package/dist/api/instruction-detect.js +74 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +20 -0
- package/dist/api/ledger-db.js +79 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +36 -0
- package/dist/api/outcome.d.ts +9 -46
- package/dist/api/outcome.js +15 -57
- 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/promote.d.ts +7 -18
- package/dist/api/promote.js +30 -152
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
- package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +112 -0
- package/dist/{recall-history.js → api/recall-history.js} +30 -25
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
- 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 +41 -16
- package/dist/api/recall.d.ts +1 -1
- package/dist/api/recall.js +39 -37
- package/dist/api/remember.d.ts +12 -13
- package/dist/api/remember.js +38 -27
- 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 -7
- package/dist/api/sleep-run.js +63 -75
- package/dist/api/sleep.d.ts +1 -1
- package/dist/api/tokens.d.ts +2 -2
- package/dist/api/tokens.js +9 -21
- package/dist/api/types.d.ts +2 -2
- package/dist/api/types.js +1 -1
- 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 +1 -1
- package/dist/capture/command.js +54 -41
- 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 +4 -1
- package/dist/capture/compact.js +59 -22
- 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} +48 -94
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
- package/dist/capture/copilot-transcript.d.ts +3 -0
- package/dist/capture/copilot-transcript.js +9 -2
- 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} +1 -5
- package/dist/{session-digest.js → capture/session-digest.js} +17 -23
- 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.d.ts +13 -0
- package/dist/capture/session-worker.js +196 -0
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.js +68 -74
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
- package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +77 -72
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +18 -20
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +59 -181
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +25 -23
- package/dist/{client.d.ts → cli/client.d.ts} +1 -1
- package/dist/{client.js → cli/client.js} +1 -1
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +39 -0
- package/dist/cli/context.d.ts +2 -13
- package/dist/cli/context.js +41 -71
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +109 -99
- package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
- package/dist/cli/curate.d.ts +9 -9
- package/dist/cli/curate.js +177 -149
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +46 -34
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +108 -218
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +43 -31
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +35 -19
- package/dist/cli/flag-values.d.ts +25 -0
- package/dist/cli/flag-values.js +103 -0
- package/dist/cli/flags.d.ts +303 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +39 -34
- package/dist/cli/hook-runtime.d.ts +49 -0
- package/dist/cli/hook-runtime.js +155 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +151 -118
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +110 -0
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +9 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +31 -27
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +65 -0
- package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
- package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +77 -280
- package/dist/cli/print.d.ts +18 -0
- package/dist/cli/print.js +85 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -49
- package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +101 -150
- package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
- package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
- package/dist/cli/remember.d.ts +1 -3
- package/dist/cli/remember.js +124 -103
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
- package/dist/{scheduler.js → cli/scheduler.js} +13 -7
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +34 -4
- package/dist/cli/session-hooks.d.ts +4 -4
- package/dist/cli/session-hooks.js +265 -191
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +111 -45
- package/dist/cli/shared.d.ts +5 -95
- package/dist/cli/shared.js +18 -369
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +31 -55
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +2 -8
- package/dist/cli/sleep.js +20 -76
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +39 -41
- package/dist/{stdin.js → cli/stdin.js} +6 -6
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +68 -42
- package/dist/cli/usage.js +8 -3
- package/dist/cli.d.ts +289 -5
- package/dist/cli.js +184 -117
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +1 -1
- package/dist/connectors/github/backfill.js +29 -66
- package/dist/connectors/github/cli-impl.js +59 -74
- package/dist/connectors/github/deletion.d.ts +5 -6
- package/dist/connectors/github/deletion.js +18 -52
- package/dist/connectors/github/dlq.d.ts +7 -61
- package/dist/connectors/github/dlq.js +19 -119
- package/dist/connectors/github/ingest.d.ts +2 -31
- package/dist/connectors/github/ingest.js +20 -82
- package/dist/connectors/github/octokit-client.d.ts +1 -1
- package/dist/connectors/github/octokit-client.js +2 -1
- package/dist/connectors/github/tenant-routing.d.ts +2 -2
- package/dist/connectors/github/tenant-routing.js +10 -36
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/types.d.ts +1 -1
- package/dist/connectors/github/types.js +15 -18
- package/dist/connectors/github/webhook.d.ts +3 -2
- package/dist/connectors/github/webhook.js +84 -87
- package/dist/connectors/slack/backfill.d.ts +1 -1
- package/dist/connectors/slack/backfill.js +5 -29
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -48
- package/dist/connectors/slack/dlq.d.ts +7 -49
- package/dist/connectors/slack/dlq.js +25 -118
- package/dist/connectors/slack/ingest.d.ts +5 -18
- package/dist/connectors/slack/ingest.js +27 -90
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.js +13 -14
- package/dist/connectors/slack/transform.d.ts +1 -1
- package/dist/connectors/slack/types.d.ts +1 -1
- package/dist/connectors/slack/types.js +3 -12
- package/dist/connectors/slack/web-client.js +2 -2
- package/dist/connectors/slack/webhook.d.ts +3 -2
- package/dist/connectors/slack/webhook.js +75 -82
- package/dist/connectors/slack/workspaces.d.ts +4 -17
- package/dist/connectors/slack/workspaces.js +4 -34
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +4 -4
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
- package/dist/{dag.js → consolidate/dag.js} +60 -81
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +28 -22
- package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
- package/dist/consolidate/flush-units.d.ts +2 -2
- package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
- package/dist/consolidate/half-life-migration.js +106 -0
- package/dist/consolidate/llm-passes.js +8 -8
- package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
- package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
- package/dist/consolidate/merge.js +57 -54
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
- package/dist/consolidate/physics-pass.js +46 -46
- package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
- package/dist/{replay.js → consolidate/replay.js} +2 -2
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +1 -1
- package/dist/consolidate/sleep.js +64 -134
- package/dist/{trace.js → consolidate/trace.js} +4 -6
- package/dist/consolidate/traces.js +34 -29
- package/dist/{ablation.js → core/ablation.js} +1 -1
- 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.js → core/ambient.js} +12 -10
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/core/capture-contract.js +149 -0
- package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
- package/dist/{compare.js → core/compare.js} +10 -3
- package/dist/{config.d.ts → core/config.d.ts} +6 -6
- package/dist/{config.js → core/config.js} +99 -72
- package/dist/core/handoff.js +87 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
- package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
- package/dist/{memory.js → core/memory.js} +117 -82
- package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
- package/dist/{physics.js → core/physics.js} +2 -1
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
- package/dist/{project-identity.js → core/project-identity.js} +5 -17
- package/dist/{project-remote.js → core/project-remote.js} +4 -4
- package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
- package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
- package/dist/{salience.js → core/salience.js} +35 -20
- 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} +5 -5
- 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} +9 -9
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
- package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +18 -1
- package/dist/db/busy.js +74 -9
- package/dist/db/connect.d.ts +10 -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 +25 -30
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -35
- package/dist/db/migrations/v16.js +29 -26
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v20.js +4 -2
- package/dist/db/migrations/v22.js +39 -36
- package/dist/db/migrations/v24.js +27 -22
- package/dist/db/migrations/v29.js +37 -32
- package/dist/db/migrations/v31.js +36 -31
- package/dist/db/migrations/v35.js +1 -1
- package/dist/db/migrations/v39.js +1 -1
- package/dist/db/migrations/v40.js +15 -14
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +1 -1
- package/dist/db/migrations/v45.js +1 -1
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +1 -1
- 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/v52.js +1 -1
- package/dist/db/open.d.ts +9 -1
- package/dist/db/open.js +21 -4
- package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
- package/dist/{physics-state.js → db/physics-state.js} +9 -16
- package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
- 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} +4 -2
- package/dist/{vector-store.js → db/vector-store.js} +76 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +105 -136
- 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 +3 -3
- package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
- package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
- package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
- package/dist/{eval.js → eval/eval.js} +29 -22
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
- package/dist/{judgment.js → eval/judgment.js} +4 -9
- package/dist/extensions/openclaw-plugin/index.js +1 -2
- 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} +6 -6
- package/dist/{graph-extract.js → graph/extract.js} +37 -52
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
- package/dist/{graph-recall.js → graph/recall.js} +55 -36
- package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
- package/dist/{graph-stream.js → graph/stream.js} +9 -7
- package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
- package/dist/{graph-view.js → graph/view.js} +127 -167
- 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 +14 -15
- package/dist/hooks/copilot.d.ts +48 -13
- package/dist/hooks/copilot.js +124 -39
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +3 -1
- package/dist/hooks/json-hooks.js +40 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +7 -5
- package/dist/hooks/shared.js +19 -8
- package/dist/importers/core.d.ts +2 -6
- package/dist/importers/core.js +41 -39
- package/dist/importers/markdown-parse.d.ts +1 -10
- package/dist/importers/markdown-parse.js +2 -19
- package/dist/importers/markdown.js +2 -1
- package/dist/importers/sources.js +50 -46
- package/dist/importers/vault.js +71 -92
- package/dist/index.d.ts +22 -22
- package/dist/index.js +21 -21
- package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
- package/dist/{autolearn.js → learn/autolearn.js} +13 -11
- 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 +125 -0
- package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
- package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
- package/dist/{invalidation.js → learn/invalidation.js} +83 -99
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +37 -60
- 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.d.ts +2 -2
- package/dist/mcp/memory-tools.js +12 -31
- package/dist/mcp/protocol.d.ts +6 -10
- package/dist/mcp/protocol.js +8 -14
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +68 -50
- package/dist/mcp/request.js +65 -63
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/session-state.d.ts +1 -2
- package/dist/mcp/session-state.js +2 -2
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.js +69 -31
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +2 -2
- package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
- package/dist/objects/customer-notes.js +112 -0
- package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
- package/dist/objects/decisions.js +101 -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/{incidents.d.ts → objects/incidents.d.ts} +17 -44
- package/dist/objects/incidents.js +130 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
- package/dist/objects/policies.js +189 -0
- package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
- package/dist/objects/processes.js +146 -0
- package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
- package/dist/objects/project-briefs.js +255 -0
- package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
- package/dist/objects/skills.js +156 -0
- package/dist/postinstall.js +4 -2
- package/dist/predictions/planning-fallacy.d.ts +4 -76
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +27 -47
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +15 -23
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +30 -49
- package/dist/rerankers/llm.d.ts +2 -4
- package/dist/rerankers/llm.js +33 -50
- package/dist/rerankers/outage-warning.d.ts +7 -0
- package/dist/rerankers/outage-warning.js +31 -0
- package/dist/rerankers/remote.d.ts +3 -0
- package/dist/rerankers/remote.js +23 -0
- package/dist/rerankers/types.d.ts +1 -1
- 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 -1
- package/dist/search/boosts.js +34 -13
- 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/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +4 -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} +7 -5
- package/dist/{path-context.js → search/path-context.js} +3 -1
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +15 -15
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +3 -3
- package/dist/search/vector.js +17 -11
- package/dist/server/auth.d.ts +1 -1
- package/dist/server/auth.js +26 -18
- package/dist/server/boot.d.ts +24 -0
- package/dist/server/boot.js +465 -0
- package/dist/server/client-ip.d.ts +5 -1
- package/dist/server/client-ip.js +18 -6
- 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/key-check-bounds.d.ts +8 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.js +1 -1
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +34 -24
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +10 -4
- package/dist/server/request.js +63 -12
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +209 -0
- package/dist/server/routes/admin.js +13 -8
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +32 -97
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +42 -105
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +42 -95
- package/dist/server/routes/memories.js +21 -20
- package/dist/server/routes/object-routes.d.ts +40 -0
- package/dist/server/routes/object-routes.js +80 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +40 -124
- package/dist/server/routes/predictions.js +29 -45
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +38 -118
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +38 -110
- package/dist/server/routes/recall.js +14 -12
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +37 -125
- package/dist/{server-detect.js → server/server-detect.js} +3 -2
- 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 +70 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +27 -8
- package/dist/server/validation.d.ts +3 -4
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +41 -50
- package/dist/server.js +26 -560
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
- package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
- package/dist/{scope.js → sharing/scope.js} +1 -1
- package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
- package/dist/{shared.js → sharing/shared.js} +100 -77
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +10 -10
- package/dist/store/audit-event.d.ts +12 -6
- package/dist/store/audit-event.js +6 -5
- package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
- package/dist/{audit.js → store/audit.js} +91 -6
- package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
- package/dist/{auth.js → store/auth.js} +100 -92
- package/dist/store/candidates.d.ts +23 -12
- package/dist/store/candidates.js +87 -35
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
- package/dist/{card-detail.js → store/card-detail.js} +1 -1
- package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
- package/dist/{store-cards.js → store/cards.js} +85 -146
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +22 -5
- package/dist/store/conflicts.js +160 -109
- 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 +92 -0
- package/dist/store/delete-and-batch.d.ts +20 -24
- package/dist/store/delete-and-batch.js +64 -40
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
- 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 +51 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
- package/dist/{dormant.js → store/dormant.js} +151 -6
- package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
- package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
- package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
- package/dist/store/entry-reads.d.ts +46 -7
- package/dist/store/entry-reads.js +120 -21
- package/dist/store/entry-row.d.ts +8 -2
- package/dist/store/entry-row.js +28 -8
- package/dist/store/entry-writes.d.ts +33 -4
- package/dist/store/entry-writes.js +108 -26
- 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/{goals.d.ts → store/goals.d.ts} +6 -46
- package/dist/{goals.js → store/goals.js} +45 -94
- package/dist/store/graph-queue.d.ts +29 -0
- package/dist/store/graph-queue.js +101 -0
- package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
- package/dist/{graph/read.js → store/graph-reads.js} +63 -115
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
- package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
- package/dist/store/graph-view-rows.d.ts +12 -0
- package/dist/store/graph-view-rows.js +67 -0
- package/dist/store/graph-writes.d.ts +58 -0
- package/dist/store/graph-writes.js +256 -0
- package/dist/store/half-life.d.ts +34 -0
- package/dist/store/half-life.js +77 -0
- package/dist/store/handoffs.d.ts +6 -3
- package/dist/store/handoffs.js +70 -31
- package/dist/store/index-and-stats.d.ts +8 -1
- package/dist/store/index-and-stats.js +51 -48
- 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 +1 -1
- package/dist/store/markdown.js +4 -3
- package/dist/store/mirrors.d.ts +5 -7
- package/dist/store/mirrors.js +39 -25
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +8 -4
- package/dist/store/open.js +34 -23
- package/dist/store/planning-fallacy-evidence.d.ts +42 -0
- package/dist/store/planning-fallacy-evidence.js +81 -0
- package/dist/store/port.d.ts +646 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
- package/dist/{predictions/store.js → store/predictions.js} +52 -67
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
- package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
- package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
- package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +162 -0
- package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
- package/dist/{rejection.js → store/rejection.js} +3 -2
- package/dist/store/rows.d.ts +2 -3
- package/dist/store/rows.js +18 -11
- package/dist/store/search-rows.d.ts +15 -4
- package/dist/store/search-rows.js +43 -36
- package/dist/store/sessions.d.ts +18 -2
- package/dist/store/sessions.js +83 -46
- 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/sqlite/entry-writes-group.js +170 -0
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +59 -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 +28 -0
- package/dist/store/sqlite/executor.js +286 -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 +38 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +218 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +314 -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 +26 -0
- package/dist/store/sqlite/store.js +295 -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 +124 -0
- package/dist/store/sqlite/worker-ops.js +82 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +76 -0
- package/dist/store/summaries.d.ts +2 -11
- package/dist/store/summaries.js +17 -44
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/store/tenant-lookup.d.ts +1 -1
- package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
- package/dist/{tenant.js → store/tenant.js} +1 -1
- 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} +2 -9
- package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
- 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 +26 -0
- package/dist/store/vector-writes.d.ts +10 -3
- package/dist/store/vector-writes.js +35 -5
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
- package/dist/{working-memory.js → store/working-memory.js} +39 -41
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +13 -33
- 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 +67 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +46 -0
- package/dist/util/atomic-write.d.ts +3 -0
- package/dist/util/atomic-write.js +107 -0
- package/dist/util/crash-handlers.d.ts +5 -0
- package/dist/util/crash-handlers.js +30 -0
- package/dist/{env.d.ts → util/env.d.ts} +17 -2
- package/dist/{env.js → util/env.js} +22 -2
- package/dist/util/home-path.js +67 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
- package/dist/{http-retry.js → util/http-retry.js} +38 -7
- 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} +5 -2
- package/dist/{log.js → util/log.js} +12 -3
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +27 -0
- package/dist/util/request-scope.js +47 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
- 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 +18 -0
- package/dist/util/token-text.js +23 -0
- package/dist/{version.d.ts → util/version.d.ts} +1 -1
- package/dist/{version.js → util/version.js} +1 -1
- package/extensions/openclaw-plugin/index.ts +1 -5
- 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/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/capture-contract.js +0 -49
- 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/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.js +0 -326
- package/dist/extract.js +0 -133
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- 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/policies.js +0 -434
- package/dist/processes.js +0 -371
- package/dist/project-briefs.js +0 -523
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/skills.js +0 -367
- package/dist/store-port.d.ts +0 -191
- package/dist/store-port.js +0 -166
- /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/{recall-history.d.ts → api/recall-history.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/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
- /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
- /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
- /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
- /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
- /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
- /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +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/{trace.d.ts → consolidate/trace.d.ts} +0 -0
- /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
- /package/dist/{ambient.d.ts → core/ambient.d.ts} +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/{card.d.ts → core/card.d.ts} +0 -0
- /package/dist/{card.js → core/card.js} +0 -0
- /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
- /package/dist/{physics-config.js → core/physics-config.js} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{salience.d.ts → core/salience.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.d.ts → dashboard/dashboard-types.d.ts} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
- /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
- /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
- /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
- /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
- /package/dist/{rrf.js → search/rrf.js} +0 -0
- /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
- /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
- /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
- /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
- /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
- /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
- /package/dist/{yaml.js → store/yaml.js} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{home-path.d.ts → util/home-path.d.ts} +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/{secret-detect.d.ts → util/secret-detect.d.ts} +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/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
- /package/dist/{transcript-tail.js → util/transcript-tail.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
package/dist/hooks/copilot.js
CHANGED
|
@@ -1,14 +1,33 @@
|
|
|
1
|
-
// GitHub Copilot: hippo's hooks file, one MCP server key and an instructions block
|
|
1
|
+
// GitHub Copilot: hippo's hooks file, one MCP server key and an instructions block under the Copilot home folder,
|
|
2
|
+
// plus the MCP server and an instructions file in each VS Code User folder.
|
|
2
3
|
import * as fs from 'fs';
|
|
3
4
|
import * as path from 'path';
|
|
4
5
|
import { isDeepStrictEqual } from 'node:util';
|
|
5
|
-
import { readJsonFile } from '../json.js';
|
|
6
|
-
import { HOOK_MARKERS, hippoBlock } from '
|
|
7
|
-
import { copilotHomeDir,
|
|
6
|
+
import { readJsonFile, isJsonObjectLiteral } from '../util/json.js';
|
|
7
|
+
import { HOOK_MARKERS, hippoBlock } from './hook-blocks.js';
|
|
8
|
+
import { copilotHomeDir, vscodeUserDirs } from './shared.js';
|
|
9
|
+
import { writeFileAtomic } from '../util/atomic-write.js';
|
|
8
10
|
import { installJsonHooks, resolveJsonHookPaths, uninstallJsonHooks, writeSettingsFile } from './json-hooks.js';
|
|
9
11
|
const MCP_KEY = 'hippo';
|
|
10
12
|
/** Copilot drops what a per-prompt hook prints, so per-task recall goes through the MCP tool the block names. */
|
|
11
|
-
|
|
13
|
+
const COPILOT_INSTRUCTIONS = `
|
|
14
|
+
## Project Memory (Hippo)
|
|
15
|
+
|
|
16
|
+
At the start of each task, call the \`hippo_recall\` tool with a short query that
|
|
17
|
+
names the task. Read the memories it returns before you write any code.
|
|
18
|
+
|
|
19
|
+
When you learn something that should outlive this session (a decision and its
|
|
20
|
+
reason, a user preference, why something failed), call the \`hippo_remember\`
|
|
21
|
+
tool right then, while you work, never as a closing step. Set \`error\` to true
|
|
22
|
+
for a failure. Leave out secrets and personal details.
|
|
23
|
+
|
|
24
|
+
The installed hooks load pinned memories when a session starts and capture
|
|
25
|
+
the session as you work, so there is nothing to run before you finish.
|
|
26
|
+
`.trim();
|
|
27
|
+
/** Every Copilot text a release has written, so install upgrades an old block and uninstall still removes it; add the old text when the text changes. */
|
|
28
|
+
const SHIPPED_COPILOT_INSTRUCTIONS = [
|
|
29
|
+
COPILOT_INSTRUCTIONS,
|
|
30
|
+
`
|
|
12
31
|
## Project Memory (Hippo)
|
|
13
32
|
|
|
14
33
|
At the start of each task, call the \`hippo_recall\` tool with a short query that
|
|
@@ -22,29 +41,55 @@ for a failure. Leave out secrets and personal details.
|
|
|
22
41
|
The installed hooks load pinned memories when a session starts, store failed
|
|
23
42
|
tool calls and capture the session when it ends, so there is nothing to run
|
|
24
43
|
before you finish.
|
|
25
|
-
`.trim()
|
|
44
|
+
`.trim(),
|
|
45
|
+
];
|
|
46
|
+
/** VS Code attaches a User `*.instructions.md` file to every chat request its `applyTo` glob matches. */
|
|
47
|
+
const withApplyToAll = (text) => `---\napplyTo: "**"\n---\n${text}\n`;
|
|
48
|
+
const VSCODE_INSTRUCTIONS = withApplyToAll(COPILOT_INSTRUCTIONS);
|
|
49
|
+
function isHipposVscodeInstructions(text) {
|
|
50
|
+
return SHIPPED_COPILOT_INSTRUCTIONS.some((shipped) => text === withApplyToAll(shipped));
|
|
51
|
+
}
|
|
52
|
+
function profileDirs(userDir) {
|
|
53
|
+
const dir = path.join(userDir, 'profiles');
|
|
54
|
+
if (!fs.existsSync(dir))
|
|
55
|
+
return [];
|
|
56
|
+
return fs.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => path.join(dir, e.name)).sort();
|
|
57
|
+
}
|
|
26
58
|
export function copilotPaths() {
|
|
27
59
|
const home = copilotHomeDir();
|
|
28
60
|
return {
|
|
29
61
|
hooks: resolveJsonHookPaths('copilot').settings,
|
|
30
62
|
mcpConfig: path.join(home, 'mcp-config.json'),
|
|
31
63
|
instructions: path.join(home, 'copilot-instructions.md'),
|
|
64
|
+
vscode: vscodeUserDirs().map((userDir) => ({
|
|
65
|
+
userDir,
|
|
66
|
+
mcpConfig: path.join(userDir, 'mcp.json'),
|
|
67
|
+
instructions: path.join(userDir, 'prompts', 'hippo.instructions.md'),
|
|
68
|
+
profiles: profileDirs(userDir),
|
|
69
|
+
})),
|
|
32
70
|
};
|
|
33
71
|
}
|
|
34
72
|
/** Windows gets npm's .cmd shim, as the Codex hooks do, since a PowerShell execution policy can block hippo.ps1. */
|
|
35
|
-
function
|
|
36
|
-
return
|
|
73
|
+
function hippoCommand() {
|
|
74
|
+
return process.platform === 'win32' ? 'hippo.cmd' : 'hippo';
|
|
37
75
|
}
|
|
38
|
-
/**
|
|
39
|
-
|
|
40
|
-
|
|
76
|
+
/** The Copilot CLI's mcp-config.json keeps servers under "mcpServers", each with an env and a tool list. */
|
|
77
|
+
export const COPILOT_CLI_MCP = { key: 'mcpServers', server: () => ({ type: 'local', command: hippoCommand(), args: ['mcp'], env: {}, tools: ['*'] }) };
|
|
78
|
+
/** VS Code's mcp.json keeps stdio servers under "servers"; it has no "mcpServers" key. */
|
|
79
|
+
export const VSCODE_MCP = { key: 'servers', server: () => ({ type: 'stdio', command: hippoCommand(), args: ['mcp'] }) };
|
|
80
|
+
/** Only a server hippo wrote counts as hippo's: another command, other args, or any key or value setup does not write (an env you added) makes it the user's. */
|
|
81
|
+
function isHipposServer(entry, host) {
|
|
82
|
+
if (!isJsonObjectLiteral(entry) || !('command' in entry) || !('args' in entry))
|
|
83
|
+
return false;
|
|
84
|
+
const ours = host.server();
|
|
85
|
+
return Object.entries(entry).every(([key, value]) => (key === 'command' ? value === 'hippo' || value === 'hippo.cmd' : isDeepStrictEqual(value, ours[key])));
|
|
41
86
|
}
|
|
42
|
-
/** What to paste under
|
|
43
|
-
export function copilotMcpSnippet() {
|
|
44
|
-
return `"${MCP_KEY}": ${JSON.stringify(
|
|
87
|
+
/** What to paste under the host's key when hippo cannot edit the file itself. */
|
|
88
|
+
export function copilotMcpSnippet(host = COPILOT_CLI_MCP) {
|
|
89
|
+
return `"${MCP_KEY}": ${JSON.stringify(host.server())}`;
|
|
45
90
|
}
|
|
46
91
|
/** Null for a file with comments, one that is not JSON, or one whose shape a merge would overwrite; a missing file reads as empty. */
|
|
47
|
-
function readMcpConfig(file) {
|
|
92
|
+
function readMcpConfig(file, host) {
|
|
48
93
|
let config = {};
|
|
49
94
|
if (fs.existsSync(file)) {
|
|
50
95
|
try {
|
|
@@ -52,45 +97,47 @@ function readMcpConfig(file) {
|
|
|
52
97
|
}
|
|
53
98
|
catch (err) {
|
|
54
99
|
// Only a parse failure means the text is not JSON hippo can merge; EACCES or EISDIR is thrown with its own message.
|
|
55
|
-
if (err instanceof SyntaxError)
|
|
100
|
+
if (!(err instanceof SyntaxError))
|
|
101
|
+
throw err;
|
|
102
|
+
// An empty file is a new one with no servers yet, not one with comments.
|
|
103
|
+
if (fs.readFileSync(file, 'utf8').trim() !== '')
|
|
56
104
|
return null;
|
|
57
|
-
throw err;
|
|
58
105
|
}
|
|
59
106
|
}
|
|
60
|
-
if (!
|
|
107
|
+
if (!isJsonObjectLiteral(config))
|
|
61
108
|
return null;
|
|
62
|
-
if (config.
|
|
63
|
-
config.
|
|
64
|
-
const servers = config.
|
|
65
|
-
return
|
|
109
|
+
if (config[host.key] === undefined)
|
|
110
|
+
config[host.key] = {};
|
|
111
|
+
const servers = config[host.key];
|
|
112
|
+
return isJsonObjectLiteral(servers) ? { config, servers } : null;
|
|
66
113
|
}
|
|
67
114
|
/** Adds hippo's server and keeps every other key; a file hippo cannot parse, or a "hippo" key it did not write, stays as it is. */
|
|
68
|
-
|
|
69
|
-
const read = readMcpConfig(file);
|
|
115
|
+
function mergeMcpServer(file, host = COPILOT_CLI_MCP) {
|
|
116
|
+
const read = readMcpConfig(file, host);
|
|
70
117
|
if (read === null)
|
|
71
118
|
return 'unreadable';
|
|
72
119
|
const existing = read.servers[MCP_KEY];
|
|
73
120
|
if (existing !== undefined)
|
|
74
|
-
return isHipposServer(existing) ? 'present' : 'user-owned';
|
|
75
|
-
read.servers[MCP_KEY] =
|
|
121
|
+
return isHipposServer(existing, host) ? 'present' : 'user-owned';
|
|
122
|
+
read.servers[MCP_KEY] = host.server();
|
|
76
123
|
writeSettingsFile(file, read.config);
|
|
77
124
|
return 'added';
|
|
78
125
|
}
|
|
79
126
|
/** Removes the "hippo" key only when hippo wrote it. */
|
|
80
|
-
export function removeMcpServer(file) {
|
|
127
|
+
export function removeMcpServer(file, host = COPILOT_CLI_MCP) {
|
|
81
128
|
if (!fs.existsSync(file))
|
|
82
129
|
return 'absent';
|
|
83
|
-
const read = readMcpConfig(file);
|
|
130
|
+
const read = readMcpConfig(file, host);
|
|
84
131
|
if (read === null)
|
|
85
132
|
return 'unreadable';
|
|
86
133
|
const existing = read.servers[MCP_KEY];
|
|
87
134
|
if (existing === undefined)
|
|
88
135
|
return 'absent';
|
|
89
|
-
if (!isHipposServer(existing))
|
|
136
|
+
if (!isHipposServer(existing, host))
|
|
90
137
|
return 'user-owned';
|
|
91
138
|
delete read.servers[MCP_KEY];
|
|
92
139
|
if (Object.keys(read.servers).length === 0)
|
|
93
|
-
delete read.config.
|
|
140
|
+
delete read.config[host.key];
|
|
94
141
|
writeSettingsFile(file, read.config);
|
|
95
142
|
return 'removed';
|
|
96
143
|
}
|
|
@@ -100,7 +147,7 @@ export function isMcpFailure(status) {
|
|
|
100
147
|
function hasErrnoCode(err) {
|
|
101
148
|
return 'code' in err && typeof err.code === 'string';
|
|
102
149
|
}
|
|
103
|
-
/** One
|
|
150
|
+
/** One MCP config step; a filesystem error comes back as a failure, so the hooks file and the instructions still install. */
|
|
104
151
|
function mcpStep(step) {
|
|
105
152
|
try {
|
|
106
153
|
return step();
|
|
@@ -111,9 +158,8 @@ function mcpStep(step) {
|
|
|
111
158
|
throw err;
|
|
112
159
|
}
|
|
113
160
|
}
|
|
114
|
-
// A later release adds the hash of each earlier Copilot text here, as SHIPPED_HOOK_HASHES does for the other agents.
|
|
115
161
|
function isCopilotBlock(inner) {
|
|
116
|
-
return inner
|
|
162
|
+
return SHIPPED_COPILOT_INSTRUCTIONS.includes(inner);
|
|
117
163
|
}
|
|
118
164
|
/** Replaces only the text between the markers, in the file's own line ending, or appends a block after the user's text. */
|
|
119
165
|
function withCopilotBlock(text, found) {
|
|
@@ -127,7 +173,7 @@ function withCopilotBlock(text, found) {
|
|
|
127
173
|
return `${text}${text.endsWith('\n') ? '\n' : '\n\n'}${block}`;
|
|
128
174
|
}
|
|
129
175
|
/** Creates the file when missing; any block but hippo's own Copilot one, and a start marker with no end, leave the file as it is. */
|
|
130
|
-
|
|
176
|
+
function ensureInstructionsBlock(file) {
|
|
131
177
|
const old = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';
|
|
132
178
|
const found = hippoBlock(old);
|
|
133
179
|
if (found === null && old.includes(HOOK_MARKERS.start))
|
|
@@ -137,8 +183,7 @@ export function ensureInstructionsBlock(file) {
|
|
|
137
183
|
const next = withCopilotBlock(old, found);
|
|
138
184
|
if (next === old)
|
|
139
185
|
return 'present';
|
|
140
|
-
|
|
141
|
-
fs.writeFileSync(file, next, 'utf8');
|
|
186
|
+
writeFileAtomic(file, next);
|
|
142
187
|
return 'written';
|
|
143
188
|
}
|
|
144
189
|
/** `text` without the block and its markers, plus the line break after the end marker, else the one before the start marker. */
|
|
@@ -163,16 +208,51 @@ export function removeInstructionsBlock(file) {
|
|
|
163
208
|
if (left.trim() === '')
|
|
164
209
|
fs.rmSync(file);
|
|
165
210
|
else
|
|
166
|
-
|
|
211
|
+
writeFileAtomic(file, left);
|
|
212
|
+
return 'removed';
|
|
213
|
+
}
|
|
214
|
+
/** The file is hippo's alone, so it is written whole; an earlier hippo text is upgraded, and any other text already there stays. */
|
|
215
|
+
export function ensureVscodeInstructions(file) {
|
|
216
|
+
if (fs.existsSync(file)) {
|
|
217
|
+
const old = fs.readFileSync(file, 'utf8');
|
|
218
|
+
if (old === VSCODE_INSTRUCTIONS)
|
|
219
|
+
return 'present';
|
|
220
|
+
if (!isHipposVscodeInstructions(old))
|
|
221
|
+
return 'kept';
|
|
222
|
+
}
|
|
223
|
+
writeFileAtomic(file, VSCODE_INSTRUCTIONS);
|
|
224
|
+
return 'written';
|
|
225
|
+
}
|
|
226
|
+
/** Deletes the file only when it still holds exactly what a hippo release wrote. */
|
|
227
|
+
export function removeVscodeInstructions(file) {
|
|
228
|
+
if (!fs.existsSync(file))
|
|
229
|
+
return 'absent';
|
|
230
|
+
if (!isHipposVscodeInstructions(fs.readFileSync(file, 'utf8')))
|
|
231
|
+
return 'kept';
|
|
232
|
+
fs.rmSync(file);
|
|
167
233
|
return 'removed';
|
|
168
234
|
}
|
|
235
|
+
/** The CLI's folder holds more than the hooks folder setup makes for VS Code, so a rerun on a VS Code-only machine still finds no CLI. */
|
|
236
|
+
export function isCopilotCliPresent(home = copilotHomeDir()) {
|
|
237
|
+
if (fs.statSync(home, { throwIfNoEntry: false })?.isDirectory() !== true)
|
|
238
|
+
return false;
|
|
239
|
+
const entries = fs.readdirSync(home);
|
|
240
|
+
return entries.length !== 1 || entries[0] !== 'hooks';
|
|
241
|
+
}
|
|
169
242
|
export function installCopilot() {
|
|
170
243
|
const paths = copilotPaths();
|
|
244
|
+
// Read before the hooks install, which makes the folder on a machine with only VS Code.
|
|
245
|
+
const cli = isCopilotCliPresent();
|
|
171
246
|
return {
|
|
172
247
|
paths,
|
|
173
248
|
hooks: installJsonHooks('copilot').installedSessionStart,
|
|
174
|
-
mcp: mcpStep(() => mergeMcpServer(paths.mcpConfig)),
|
|
175
|
-
instructions: ensureInstructionsBlock(paths.instructions),
|
|
249
|
+
mcp: cli ? mcpStep(() => mergeMcpServer(paths.mcpConfig)) : null,
|
|
250
|
+
instructions: cli ? ensureInstructionsBlock(paths.instructions) : null,
|
|
251
|
+
vscode: paths.vscode.map((dir) => ({
|
|
252
|
+
paths: dir,
|
|
253
|
+
mcp: mcpStep(() => mergeMcpServer(dir.mcpConfig, VSCODE_MCP)),
|
|
254
|
+
instructions: ensureVscodeInstructions(dir.instructions),
|
|
255
|
+
})),
|
|
176
256
|
};
|
|
177
257
|
}
|
|
178
258
|
export function uninstallCopilot() {
|
|
@@ -182,6 +262,11 @@ export function uninstallCopilot() {
|
|
|
182
262
|
hooks: uninstallJsonHooks('copilot'),
|
|
183
263
|
mcp: mcpStep(() => removeMcpServer(paths.mcpConfig)),
|
|
184
264
|
instructions: removeInstructionsBlock(paths.instructions),
|
|
265
|
+
vscode: paths.vscode.map((dir) => ({
|
|
266
|
+
paths: dir,
|
|
267
|
+
mcp: mcpStep(() => removeMcpServer(dir.mcpConfig, VSCODE_MCP)),
|
|
268
|
+
instructions: removeVscodeInstructions(dir.instructions),
|
|
269
|
+
})),
|
|
185
270
|
};
|
|
186
271
|
}
|
|
187
272
|
//# sourceMappingURL=copilot.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
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 -->',
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* `hooks` block from opencode.json.
|
|
35
35
|
*/
|
|
36
36
|
import { type JsonHookTarget } from './shared.js';
|
|
37
|
-
import { type JsonValue } from '../json.js';
|
|
37
|
+
import { type JsonValue } from '../util/json.js';
|
|
38
38
|
/** A target's hook settings file, the log its SessionEnd hook writes, and the tool's display name. */
|
|
39
39
|
export interface JsonHookPaths {
|
|
40
40
|
settings: string;
|
|
@@ -63,6 +63,8 @@ export interface InstallResult {
|
|
|
63
63
|
}
|
|
64
64
|
/** The paths for `target` under the current home directory; reads and writes nothing. */
|
|
65
65
|
export declare function resolveJsonHookPaths(target: JsonHookTarget): JsonHookPaths;
|
|
66
|
+
/** The events in hippo's Copilot hooks file, in file order, for setup to name. */
|
|
67
|
+
export declare function copilotHookEvents(): string[];
|
|
66
68
|
/** Adds hippo's hooks to `target`'s settings file and migrates older hippo entries; a file that is not JSON stays untouched. */
|
|
67
69
|
export declare function installJsonHooks(target: JsonHookTarget): InstallResult;
|
|
68
70
|
/** Swaps the file in with one rename, so a crash mid-write cannot leave a truncated settings.json that Claude Code cannot parse. */
|
package/dist/hooks/json-hooks.js
CHANGED
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
*/
|
|
36
36
|
import * as fs from 'fs';
|
|
37
37
|
import * as path from 'path';
|
|
38
|
-
import {
|
|
39
|
-
import { isJsonString, readJsonFile } from '../json.js';
|
|
40
|
-
import { escapeRegex } from '../escape.js';
|
|
41
|
-
import {
|
|
38
|
+
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';
|
|
39
|
+
import { isJsonString, readJsonFile, isJsonObjectLiteral } from '../util/json.js';
|
|
40
|
+
import { escapeRegex } from '../util/escape.js';
|
|
41
|
+
import { writeFileAtomic } from '../util/atomic-write.js';
|
|
42
42
|
/** The paths for `target` under the current home directory; reads and writes nothing. */
|
|
43
43
|
export function resolveJsonHookPaths(target) {
|
|
44
44
|
const home = homeDir();
|
|
@@ -58,7 +58,7 @@ export function resolveJsonHookPaths(target) {
|
|
|
58
58
|
};
|
|
59
59
|
case 'copilot':
|
|
60
60
|
return {
|
|
61
|
-
settings:
|
|
61
|
+
settings: copilotHooksFile(),
|
|
62
62
|
logFile: path.join(logsDir, 'copilot-sleep.log'),
|
|
63
63
|
display: 'Copilot',
|
|
64
64
|
};
|
|
@@ -73,13 +73,13 @@ function isHippoCommand(command, marker) {
|
|
|
73
73
|
}
|
|
74
74
|
const runsHippo = (...markers) => (command) => markers.some((m) => isHippoCommand(command, m));
|
|
75
75
|
function handlerCommand(handler) {
|
|
76
|
-
return
|
|
76
|
+
return isJsonObjectLiteral(handler) && isJsonString(handler.command) ? handler.command : null;
|
|
77
77
|
}
|
|
78
78
|
/** `groups` minus the handlers `isOurs` picks; a group goes only once it has no handler left. Null when no handler matched. */
|
|
79
79
|
function withoutHandlers(groups, isOurs) {
|
|
80
80
|
let removed = false;
|
|
81
81
|
const kept = groups.flatMap((group) => {
|
|
82
|
-
if (!
|
|
82
|
+
if (!isJsonObjectLiteral(group) || !Array.isArray(group.hooks))
|
|
83
83
|
return [group];
|
|
84
84
|
const handlers = group.hooks.filter((h) => {
|
|
85
85
|
const command = handlerCommand(h);
|
|
@@ -108,7 +108,7 @@ function stripHandlers(hooks, event, isOurs) {
|
|
|
108
108
|
}
|
|
109
109
|
/** Every command string in `groups`; a group or handler of an unexpected shape adds none. */
|
|
110
110
|
function handlerCommands(groups) {
|
|
111
|
-
return groups.flatMap((group) => (
|
|
111
|
+
return groups.flatMap((group) => (isJsonObjectLiteral(group) && Array.isArray(group.hooks) ? group.hooks.flatMap((h) => handlerCommand(h) ?? []) : []));
|
|
112
112
|
}
|
|
113
113
|
/** 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
114
|
function hookArrayContains(hookArray, marker) {
|
|
@@ -126,13 +126,13 @@ function migratePinnedInjectRecentCommands(hookArray) {
|
|
|
126
126
|
return false;
|
|
127
127
|
let changed = false;
|
|
128
128
|
for (const entry of hookArray) {
|
|
129
|
-
if (!
|
|
129
|
+
if (!isJsonObjectLiteral(entry))
|
|
130
130
|
continue;
|
|
131
131
|
const innerHooks = entry.hooks;
|
|
132
132
|
if (!Array.isArray(innerHooks))
|
|
133
133
|
continue;
|
|
134
134
|
for (const hook of innerHooks) {
|
|
135
|
-
if (!
|
|
135
|
+
if (!isJsonObjectLiteral(hook))
|
|
136
136
|
continue;
|
|
137
137
|
if (!isJsonString(hook.command))
|
|
138
138
|
continue;
|
|
@@ -172,14 +172,14 @@ function ensureHooksObject(settings, events) {
|
|
|
172
172
|
if (settings.hooks === undefined)
|
|
173
173
|
settings.hooks = {};
|
|
174
174
|
const hooks = settings.hooks;
|
|
175
|
-
if (!
|
|
175
|
+
if (!isJsonObjectLiteral(hooks) || events.some((e) => hooks[e] !== undefined && !Array.isArray(hooks[e])))
|
|
176
176
|
return null;
|
|
177
177
|
return hooks;
|
|
178
178
|
}
|
|
179
179
|
/** 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
180
|
function installCodexHooks(settingsPath, settings) {
|
|
181
181
|
const result = nothingInstalled('codex', settingsPath);
|
|
182
|
-
if (!
|
|
182
|
+
if (!isJsonObjectLiteral(settings))
|
|
183
183
|
return { ...result, invalidJson: true };
|
|
184
184
|
const hooks = ensureHooksObject(settings, ['UserPromptSubmit', 'SessionStart']);
|
|
185
185
|
if (hooks === null)
|
|
@@ -214,10 +214,19 @@ function copilotHooksTable() {
|
|
|
214
214
|
sessionStart: copilotCommandHook('context --pinned-only --include-recent 5 --format copilot', 10),
|
|
215
215
|
postToolUseFailure: copilotCommandHook('capture-error --runtime copilot', 10),
|
|
216
216
|
preCompact: copilotCommandHook('pre-compact --runtime copilot', 30),
|
|
217
|
+
// VS Code maps no camelCase preCompact. The Copilot CLI may run both names, so pre-compact skips a snapshot saved seconds before.
|
|
218
|
+
PreCompact: copilotCommandHook('pre-compact --runtime copilot', 30),
|
|
219
|
+
// VS Code's per-reply Stop. --turn acts on a VS Code payload only, so the Copilot CLI's agentStop does nothing.
|
|
220
|
+
agentStop: copilotCommandHook('session-end --runtime copilot --turn', 30),
|
|
217
221
|
sessionEnd: copilotCommandHook('session-end --runtime copilot', 30),
|
|
218
222
|
},
|
|
219
223
|
};
|
|
220
224
|
}
|
|
225
|
+
/** The events in hippo's Copilot hooks file, in file order, for setup to name. */
|
|
226
|
+
export function copilotHookEvents() {
|
|
227
|
+
const hooks = copilotHooksTable().hooks;
|
|
228
|
+
return isJsonObjectLiteral(hooks) ? Object.keys(hooks) : [];
|
|
229
|
+
}
|
|
221
230
|
/** Hippo owns this whole file, so install writes the full table and a second install changes no byte. */
|
|
222
231
|
function installCopilotHooks(settingsPath) {
|
|
223
232
|
const result = nothingInstalled('copilot', settingsPath);
|
|
@@ -247,112 +256,13 @@ export function installJsonHooks(target) {
|
|
|
247
256
|
}
|
|
248
257
|
if (target === 'codex')
|
|
249
258
|
return installCodexHooks(settingsPath, settings);
|
|
250
|
-
if (!
|
|
259
|
+
if (!isJsonObjectLiteral(settings))
|
|
251
260
|
return { ...nothingInstalled(target, settingsPath), invalidJson: true };
|
|
252
261
|
return installClaudeCodeHooks(settingsPath, settings, logFile);
|
|
253
262
|
}
|
|
254
|
-
const RENAME_RETRY_MS = 1000;
|
|
255
|
-
const WINDOWS_RENAME_REFUSALS = ['EPERM', 'EACCES', 'EBUSY'];
|
|
256
|
-
// 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.
|
|
257
|
-
const REPLACE_REFUSALS = ['EBUSY', 'EXDEV', 'EACCES', 'EPERM'];
|
|
258
|
-
// Matches the usual SYMLOOP_MAX, so a link cycle ends in an error instead of a hang.
|
|
259
|
-
const MAX_LINK_HOPS = 40;
|
|
260
|
-
function errnoCode(err) {
|
|
261
|
-
return 'code' in err ? String(err.code) : '';
|
|
262
|
-
}
|
|
263
|
-
/** Windows refuses a rename onto a file another program has open, usually for a moment, so a refusal is retried before it is reported. */
|
|
264
|
-
function renameOnto(tmp, target) {
|
|
265
|
-
const deadline = Date.now() + RENAME_RETRY_MS;
|
|
266
|
-
const idle = new Int32Array(new SharedArrayBuffer(4));
|
|
267
|
-
for (let pause = 10;; pause = Math.min(pause * 2, 200)) {
|
|
268
|
-
try {
|
|
269
|
-
fs.renameSync(tmp, target);
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
catch (err) {
|
|
273
|
-
const transient = process.platform === 'win32' && err instanceof Error && WINDOWS_RENAME_REFUSALS.includes(errnoCode(err));
|
|
274
|
-
const left = deadline - Date.now();
|
|
275
|
-
if (!transient || left <= 0)
|
|
276
|
-
throw err;
|
|
277
|
-
Atomics.wait(idle, 0, 0, Math.min(pause, left));
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
/** Where a write to `file` lands: through any symlink, a dangling one included, so a dotfile manager's link survives. */
|
|
282
|
-
function writeTarget(file) {
|
|
283
|
-
let target = file;
|
|
284
|
-
for (let hop = 0; hop < MAX_LINK_HOPS && fs.lstatSync(target, { throwIfNoEntry: false })?.isSymbolicLink(); hop++) {
|
|
285
|
-
target = path.resolve(path.dirname(target), fs.readlinkSync(target));
|
|
286
|
-
}
|
|
287
|
-
return fs.existsSync(target) ? fs.realpathSync(target) : target;
|
|
288
|
-
}
|
|
289
|
-
/** Gives the replacement the old file's exact mode (umask trims the create mode) and, for root, its owner. */
|
|
290
|
-
function keepAccess(tmp, old) {
|
|
291
|
-
fs.chmodSync(tmp, old.mode & 0o777);
|
|
292
|
-
if (process.getuid?.() === 0)
|
|
293
|
-
fs.chownSync(tmp, old.uid, old.gid);
|
|
294
|
-
}
|
|
295
|
-
/** Cleanup must not hide the failure that made it necessary, so a cleanup error is logged and the first error stays the one thrown. */
|
|
296
|
-
function removeTemp(tmp) {
|
|
297
|
-
try {
|
|
298
|
-
fs.rmSync(tmp, { force: true });
|
|
299
|
-
}
|
|
300
|
-
catch (err) {
|
|
301
|
-
log.warn(`could not remove the temporary file ${tmp}: ${errorMessage(err)}`);
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
function replaceViaTemp(target, text, old) {
|
|
305
|
-
const tmp = `${target}.${process.pid}.tmp`;
|
|
306
|
-
try {
|
|
307
|
-
fs.writeFileSync(tmp, text, { encoding: 'utf8', mode: (old?.mode ?? 0o666) & 0o777 });
|
|
308
|
-
if (old)
|
|
309
|
-
keepAccess(tmp, old);
|
|
310
|
-
renameOnto(tmp, target);
|
|
311
|
-
}
|
|
312
|
-
catch (err) {
|
|
313
|
-
removeTemp(tmp);
|
|
314
|
-
throw err;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
/** 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. */
|
|
318
|
-
function writeInPlace(target, text) {
|
|
319
|
-
try {
|
|
320
|
-
fs.writeFileSync(target, text, 'utf8');
|
|
321
|
-
}
|
|
322
|
-
catch (err) {
|
|
323
|
-
if (!(err instanceof Error))
|
|
324
|
-
throw err;
|
|
325
|
-
const reason = errnoCode(err) === 'EBUSY'
|
|
326
|
-
? 'is in use by another program, so hippo could not replace it; close that program and run the command again'
|
|
327
|
-
: `could not be replaced (${errnoCode(err) || err.message})`;
|
|
328
|
-
throw new Error(`${target} ${reason}`, { cause: err });
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
263
|
/** Swaps the file in with one rename, so a crash mid-write cannot leave a truncated settings.json that Claude Code cannot parse. */
|
|
332
264
|
export function writeSettingsFile(file, settings) {
|
|
333
|
-
|
|
334
|
-
const text = JSON.stringify(settings, null, 2) + '\n';
|
|
335
|
-
const old = fs.statSync(target, { throwIfNoEntry: false });
|
|
336
|
-
if (old === undefined) {
|
|
337
|
-
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
338
|
-
}
|
|
339
|
-
else {
|
|
340
|
-
// A rename replaces a read-only file that the in-place write refused, and Windows would retry that refusal for a second.
|
|
341
|
-
fs.accessSync(target, fs.constants.W_OK);
|
|
342
|
-
}
|
|
343
|
-
if (old !== undefined && old.nlink > 1) {
|
|
344
|
-
// A rename gives the file a new inode, which would leave the other hard links on the old content.
|
|
345
|
-
writeInPlace(target, text);
|
|
346
|
-
return;
|
|
347
|
-
}
|
|
348
|
-
try {
|
|
349
|
-
replaceViaTemp(target, text, old);
|
|
350
|
-
}
|
|
351
|
-
catch (err) {
|
|
352
|
-
if (!(err instanceof Error) || !REPLACE_REFUSALS.includes(errnoCode(err)))
|
|
353
|
-
throw err;
|
|
354
|
-
writeInPlace(target, text);
|
|
355
|
-
}
|
|
265
|
+
writeFileAtomic(file, JSON.stringify(settings, null, 2) + '\n');
|
|
356
266
|
}
|
|
357
267
|
function migrateLegacyClaudeHooks(hooks) {
|
|
358
268
|
const migratedFromStop = stripHandlers(hooks, 'Stop', runsHippo(HIPPO_SLEEP_MARKER));
|
|
@@ -397,13 +307,7 @@ const CLAUDE_HOOK_MARKERS = [
|
|
|
397
307
|
];
|
|
398
308
|
// 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.
|
|
399
309
|
const CLAUDE_APPENDED_EVENTS = CLAUDE_HOOK_MARKERS.map(([event]) => event).filter((event) => event !== 'Stop');
|
|
400
|
-
function
|
|
401
|
-
const merge = ensureHooksObject(settings, CLAUDE_APPENDED_EVENTS);
|
|
402
|
-
if (merge === null)
|
|
403
|
-
return { ...nothingInstalled('claude-code', settingsPath), invalidJson: true };
|
|
404
|
-
// SAFETY: ensureHooksObject left every event hippo appends to absent or an array.
|
|
405
|
-
const hooks = merge;
|
|
406
|
-
const migration = migrateLegacyClaudeHooks(hooks);
|
|
310
|
+
function appendSessionHooks(hooks, logFile) {
|
|
407
311
|
const installedSessionEnd = appendHookIfMissing(hooks, 'SessionEnd', HIPPO_SESSION_END_MARKER, claudeCommandGroup(`hippo session-end --log-file "${logFile}"`, 5));
|
|
408
312
|
const installedSessionStart = appendHookIfMissing(hooks, 'SessionStart', HIPPO_LAST_SLEEP_MARKER, claudeCommandGroup(`hippo last-sleep --path "${logFile}"`, 5));
|
|
409
313
|
// Mid-session pinned-rule re-injection: UserPromptSubmit runs every turn,
|
|
@@ -413,6 +317,9 @@ function installClaudeCodeHooks(settingsPath, settings, logFile) {
|
|
|
413
317
|
// before the user pins them explicitly.
|
|
414
318
|
const migratedPinnedInjectRecent = migratePinnedInjectRecentCommands(hooks.UserPromptSubmit);
|
|
415
319
|
const installedUserPromptSubmit = appendHookIfMissing(hooks, 'UserPromptSubmit', HIPPO_PINNED_INJECT_MARKER, claudeCommandGroup(HIPPO_PINNED_INJECT_COMMAND, 5));
|
|
320
|
+
return { installedSessionEnd, installedSessionStart, migratedPinnedInjectRecent, installedUserPromptSubmit };
|
|
321
|
+
}
|
|
322
|
+
function appendCompactionHooks(hooks) {
|
|
416
323
|
// PreCompact: fires on manual AND auto compaction (no matcher). Records the compaction, asks the
|
|
417
324
|
// summariser for a "Memories for hippo" list and saves a working-state snapshot before the summary drops detail.
|
|
418
325
|
// Exit-0 contract lives in the verb itself (src/capture.ts cmdPreCompact),
|
|
@@ -428,6 +335,17 @@ function installClaudeCodeHooks(settingsPath, settings, logFile) {
|
|
|
428
335
|
// PostCompact: saves the memories the summariser listed and prints one line, which Claude Code only shows.
|
|
429
336
|
// PreCompact stdout, by contrast, is handed to the summariser as instructions, so pre-compact prints just the request.
|
|
430
337
|
const installedPostCompact = appendHookIfMissing(hooks, 'PostCompact', HIPPO_POST_COMPACT_MARKER, claudeCommandGroup(`hippo post-compact --log-file "${defaultPreCompactLogPath()}"`, 10));
|
|
338
|
+
return { installedPreCompact, installedCompactResume, installedPostCompact };
|
|
339
|
+
}
|
|
340
|
+
function installClaudeCodeHooks(settingsPath, settings, logFile) {
|
|
341
|
+
const merge = ensureHooksObject(settings, CLAUDE_APPENDED_EVENTS);
|
|
342
|
+
if (merge === null)
|
|
343
|
+
return { ...nothingInstalled('claude-code', settingsPath), invalidJson: true };
|
|
344
|
+
// SAFETY: ensureHooksObject left every event hippo appends to absent or an array.
|
|
345
|
+
const hooks = merge;
|
|
346
|
+
const migration = migrateLegacyClaudeHooks(hooks);
|
|
347
|
+
const { installedSessionEnd, installedSessionStart, migratedPinnedInjectRecent, installedUserPromptSubmit } = appendSessionHooks(hooks, logFile);
|
|
348
|
+
const { installedPreCompact, installedCompactResume, installedPostCompact } = appendCompactionHooks(hooks);
|
|
431
349
|
// PostToolUseFailure: a failed tool call becomes an error memory, after
|
|
432
350
|
// `hippo capture-error` drops routine failures (interrupts, declined
|
|
433
351
|
// permissions, empty searches) and repeats. Same hook the plugin ships.
|
|
@@ -490,7 +408,7 @@ export function uninstallJsonHooks(target) {
|
|
|
490
408
|
// Never rewrite a settings file we cannot parse; report nothing uninstalled.
|
|
491
409
|
return false;
|
|
492
410
|
}
|
|
493
|
-
if (!
|
|
411
|
+
if (!isJsonObjectLiteral(settings) || !isJsonObjectLiteral(settings.hooks))
|
|
494
412
|
return false;
|
|
495
413
|
const hooks = settings.hooks;
|
|
496
414
|
const changed = target === 'codex' ? uninstallCodexHooks(hooks) : uninstallClaudeCodeHooks(hooks);
|
|
@@ -510,7 +428,7 @@ export function checkUninstallable(target) {
|
|
|
510
428
|
return { settingsPath, invalidJson: false };
|
|
511
429
|
try {
|
|
512
430
|
const settings = readJsonFile(settingsPath);
|
|
513
|
-
return { settingsPath, invalidJson: !
|
|
431
|
+
return { settingsPath, invalidJson: !isJsonObjectLiteral(settings) || (settings.hooks !== undefined && !isJsonObjectLiteral(settings.hooks)) };
|
|
514
432
|
}
|
|
515
433
|
catch {
|
|
516
434
|
return { settingsPath, invalidJson: true };
|