hippo-memory 1.69.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 +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 +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.js +3 -2
- 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 +5 -5
- package/dist/api/context-select.js +37 -45
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +48 -61
- 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 +2 -11
- package/dist/api/forget.js +13 -46
- 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 +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/promote.d.ts +4 -15
- package/dist/api/promote.js +29 -106
- 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 +10 -12
- package/dist/api/remember.js +29 -45
- 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 +40 -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.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} +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.js +6 -4
- 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 +190 -184
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +41 -21
- 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 +4 -2
- 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 -83
- 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 -49
- 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 -91
- 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} +13 -2
- package/dist/{capture-contract.js → core/capture-contract.js} +64 -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} +17 -5
- package/dist/{memory.js → core/memory.js} +110 -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.js → core/prompt-recall.js} +1 -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 +1 -8
- package/dist/hooks/copilot.js +14 -15
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +1 -1
- package/dist/hooks/json-hooks.js +31 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +0 -4
- package/dist/hooks/shared.js +1 -5
- 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.js +7 -27
- 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 +62 -60
- 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 +12 -14
- 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} +1 -1
- 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 +39 -61
- package/dist/server.js +24 -568
- 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 +11 -5
- package/dist/store/audit-event.js +5 -4
- 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 +1 -1
- package/dist/store/handoffs.js +39 -30
- 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 +6 -4
- package/dist/store/open.js +24 -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} +3 -1
- package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
- package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
- 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 +41 -28
- package/dist/store/sessions.d.ts +13 -2
- package/dist/store/sessions.js +79 -45
- 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 +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} +15 -2
- package/dist/{env.js → util/env.js} +20 -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/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/entry-writes-group.d.ts +0 -9
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- /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/{prompt-recall.d.ts → core/prompt-recall.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/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();
|
|
@@ -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)
|
|
@@ -225,7 +225,7 @@ function copilotHooksTable() {
|
|
|
225
225
|
/** The events in hippo's Copilot hooks file, in file order, for setup to name. */
|
|
226
226
|
export function copilotHookEvents() {
|
|
227
227
|
const hooks = copilotHooksTable().hooks;
|
|
228
|
-
return
|
|
228
|
+
return isJsonObjectLiteral(hooks) ? Object.keys(hooks) : [];
|
|
229
229
|
}
|
|
230
230
|
/** Hippo owns this whole file, so install writes the full table and a second install changes no byte. */
|
|
231
231
|
function installCopilotHooks(settingsPath) {
|
|
@@ -256,112 +256,13 @@ export function installJsonHooks(target) {
|
|
|
256
256
|
}
|
|
257
257
|
if (target === 'codex')
|
|
258
258
|
return installCodexHooks(settingsPath, settings);
|
|
259
|
-
if (!
|
|
259
|
+
if (!isJsonObjectLiteral(settings))
|
|
260
260
|
return { ...nothingInstalled(target, settingsPath), invalidJson: true };
|
|
261
261
|
return installClaudeCodeHooks(settingsPath, settings, logFile);
|
|
262
262
|
}
|
|
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
263
|
/** Swaps the file in with one rename, so a crash mid-write cannot leave a truncated settings.json that Claude Code cannot parse. */
|
|
341
264
|
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
|
-
}
|
|
265
|
+
writeFileAtomic(file, JSON.stringify(settings, null, 2) + '\n');
|
|
365
266
|
}
|
|
366
267
|
function migrateLegacyClaudeHooks(hooks) {
|
|
367
268
|
const migratedFromStop = stripHandlers(hooks, 'Stop', runsHippo(HIPPO_SLEEP_MARKER));
|
|
@@ -406,13 +307,7 @@ const CLAUDE_HOOK_MARKERS = [
|
|
|
406
307
|
];
|
|
407
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.
|
|
408
309
|
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);
|
|
310
|
+
function appendSessionHooks(hooks, logFile) {
|
|
416
311
|
const installedSessionEnd = appendHookIfMissing(hooks, 'SessionEnd', HIPPO_SESSION_END_MARKER, claudeCommandGroup(`hippo session-end --log-file "${logFile}"`, 5));
|
|
417
312
|
const installedSessionStart = appendHookIfMissing(hooks, 'SessionStart', HIPPO_LAST_SLEEP_MARKER, claudeCommandGroup(`hippo last-sleep --path "${logFile}"`, 5));
|
|
418
313
|
// Mid-session pinned-rule re-injection: UserPromptSubmit runs every turn,
|
|
@@ -422,6 +317,9 @@ function installClaudeCodeHooks(settingsPath, settings, logFile) {
|
|
|
422
317
|
// before the user pins them explicitly.
|
|
423
318
|
const migratedPinnedInjectRecent = migratePinnedInjectRecentCommands(hooks.UserPromptSubmit);
|
|
424
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) {
|
|
425
323
|
// PreCompact: fires on manual AND auto compaction (no matcher). Records the compaction, asks the
|
|
426
324
|
// summariser for a "Memories for hippo" list and saves a working-state snapshot before the summary drops detail.
|
|
427
325
|
// Exit-0 contract lives in the verb itself (src/capture.ts cmdPreCompact),
|
|
@@ -437,6 +335,17 @@ function installClaudeCodeHooks(settingsPath, settings, logFile) {
|
|
|
437
335
|
// PostCompact: saves the memories the summariser listed and prints one line, which Claude Code only shows.
|
|
438
336
|
// PreCompact stdout, by contrast, is handed to the summariser as instructions, so pre-compact prints just the request.
|
|
439
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);
|
|
440
349
|
// PostToolUseFailure: a failed tool call becomes an error memory, after
|
|
441
350
|
// `hippo capture-error` drops routine failures (interrupts, declined
|
|
442
351
|
// permissions, empty searches) and repeats. Same hook the plugin ships.
|
|
@@ -499,7 +408,7 @@ export function uninstallJsonHooks(target) {
|
|
|
499
408
|
// Never rewrite a settings file we cannot parse; report nothing uninstalled.
|
|
500
409
|
return false;
|
|
501
410
|
}
|
|
502
|
-
if (!
|
|
411
|
+
if (!isJsonObjectLiteral(settings) || !isJsonObjectLiteral(settings.hooks))
|
|
503
412
|
return false;
|
|
504
413
|
const hooks = settings.hooks;
|
|
505
414
|
const changed = target === 'codex' ? uninstallCodexHooks(hooks) : uninstallClaudeCodeHooks(hooks);
|
|
@@ -519,7 +428,7 @@ export function checkUninstallable(target) {
|
|
|
519
428
|
return { settingsPath, invalidJson: false };
|
|
520
429
|
try {
|
|
521
430
|
const settings = readJsonFile(settingsPath);
|
|
522
|
-
return { settingsPath, invalidJson: !
|
|
431
|
+
return { settingsPath, invalidJson: !isJsonObjectLiteral(settings) || (settings.hooks !== undefined && !isJsonObjectLiteral(settings.hooks)) };
|
|
523
432
|
}
|
|
524
433
|
catch {
|
|
525
434
|
return { settingsPath, invalidJson: true };
|
package/dist/hooks/opencode.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { homeDir } from './shared.js';
|
|
4
|
+
import { writeFileAtomic } from '../util/atomic-write.js';
|
|
5
|
+
import { isJsonString, isJsonObjectLiteral } from '../util/json.js';
|
|
5
6
|
const HIPPO_OPENCODE_PLUGIN_MARKER = 'HIPPO_OPENCODE_PLUGIN_V1';
|
|
6
7
|
/**
|
|
7
8
|
* The opencode plugin file we install at ~/.config/opencode/plugins/hippo.ts.
|
|
@@ -91,7 +92,7 @@ function resolveOpencodeConfigPath() {
|
|
|
91
92
|
*/
|
|
92
93
|
const HIPPO_OWNED_COMMAND_RE = /^\s*hippo\s+(session-end|last-sleep|sleep|capture|context)(?=\s|$)/;
|
|
93
94
|
function hookIsHippoOwned(hook) {
|
|
94
|
-
if (!
|
|
95
|
+
if (!isJsonObjectLiteral(hook))
|
|
95
96
|
return false;
|
|
96
97
|
const cmd = hook.command;
|
|
97
98
|
return isJsonString(cmd) && HIPPO_OWNED_COMMAND_RE.test(cmd);
|
|
@@ -127,7 +128,7 @@ function migrateLegacyOpencodeHooksBlock() {
|
|
|
127
128
|
const hooks = settings.hooks;
|
|
128
129
|
// Non-object hooks values (string, array, null) are user content we don't
|
|
129
130
|
// recognise — leave them alone, return migrated=false.
|
|
130
|
-
if (!
|
|
131
|
+
if (!isJsonObjectLiteral(hooks)) {
|
|
131
132
|
return { migrated: false, jsonRepairFailed: false };
|
|
132
133
|
}
|
|
133
134
|
const hooksObj = hooks;
|
|
@@ -135,26 +136,9 @@ function migrateLegacyOpencodeHooksBlock() {
|
|
|
135
136
|
for (const key of Object.keys(hooksObj)) {
|
|
136
137
|
if (!Array.isArray(hooksObj[key]))
|
|
137
138
|
continue;
|
|
138
|
-
const survivingEntries = [];
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
survivingEntries.push(entry);
|
|
142
|
-
continue;
|
|
143
|
-
}
|
|
144
|
-
const innerHooks = entry.hooks;
|
|
145
|
-
if (!Array.isArray(innerHooks)) {
|
|
146
|
-
survivingEntries.push(entry);
|
|
147
|
-
continue;
|
|
148
|
-
}
|
|
149
|
-
const beforeInner = innerHooks.length;
|
|
150
|
-
const survivingInner = innerHooks.filter((h) => !hookIsHippoOwned(h));
|
|
151
|
-
if (survivingInner.length !== beforeInner)
|
|
152
|
-
changed = true;
|
|
153
|
-
if (survivingInner.length === 0)
|
|
154
|
-
continue; // drop entry, nothing left
|
|
155
|
-
entry.hooks = survivingInner;
|
|
156
|
-
survivingEntries.push(entry);
|
|
157
|
-
}
|
|
139
|
+
const { survivingEntries, strippedAny } = stripHippoHooksFromEntries(hooksObj[key]);
|
|
140
|
+
if (strippedAny)
|
|
141
|
+
changed = true;
|
|
158
142
|
if (survivingEntries.length !== hooksObj[key].length)
|
|
159
143
|
changed = true;
|
|
160
144
|
hooksObj[key] = survivingEntries;
|
|
@@ -165,9 +149,34 @@ function migrateLegacyOpencodeHooksBlock() {
|
|
|
165
149
|
return { migrated: false, jsonRepairFailed: false };
|
|
166
150
|
if (Object.keys(hooksObj).length === 0)
|
|
167
151
|
delete settings.hooks;
|
|
168
|
-
|
|
152
|
+
writeFileAtomic(configPath, JSON.stringify(settings, null, 2) + '\n');
|
|
169
153
|
return { migrated: true, jsonRepairFailed: false };
|
|
170
154
|
}
|
|
155
|
+
/** One event's entries with every hippo-owned hook taken out, and whether any was. */
|
|
156
|
+
function stripHippoHooksFromEntries(entries) {
|
|
157
|
+
const survivingEntries = [];
|
|
158
|
+
let strippedAny = false;
|
|
159
|
+
for (const entry of entries) {
|
|
160
|
+
if (!isJsonObjectLiteral(entry)) {
|
|
161
|
+
survivingEntries.push(entry);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const innerHooks = entry.hooks;
|
|
165
|
+
if (!Array.isArray(innerHooks)) {
|
|
166
|
+
survivingEntries.push(entry);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const beforeInner = innerHooks.length;
|
|
170
|
+
const survivingInner = innerHooks.filter((h) => !hookIsHippoOwned(h));
|
|
171
|
+
if (survivingInner.length !== beforeInner)
|
|
172
|
+
strippedAny = true;
|
|
173
|
+
if (survivingInner.length === 0)
|
|
174
|
+
continue; // drop entry, nothing left
|
|
175
|
+
entry.hooks = survivingInner;
|
|
176
|
+
survivingEntries.push(entry);
|
|
177
|
+
}
|
|
178
|
+
return { survivingEntries, strippedAny };
|
|
179
|
+
}
|
|
171
180
|
export function installOpencodePlugin() {
|
|
172
181
|
const pluginPath = resolveOpencodePluginPath();
|
|
173
182
|
const { migrated, jsonRepairFailed } = migrateLegacyOpencodeHooksBlock();
|
|
@@ -181,8 +190,7 @@ export function installOpencodePlugin() {
|
|
|
181
190
|
return { installed: false, pluginPath, migratedLegacyHooks: migrated, jsonRepairFailed };
|
|
182
191
|
}
|
|
183
192
|
}
|
|
184
|
-
|
|
185
|
-
fs.writeFileSync(pluginPath, OPENCODE_PLUGIN_SOURCE, 'utf8');
|
|
193
|
+
writeFileAtomic(pluginPath, OPENCODE_PLUGIN_SOURCE);
|
|
186
194
|
return { installed: true, pluginPath, migratedLegacyHooks: migrated, jsonRepairFailed };
|
|
187
195
|
}
|
|
188
196
|
export function uninstallOpencodePlugin() {
|
package/dist/hooks/shared.d.ts
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import type { JsonObject } from '../working-memory.js';
|
|
2
|
-
import type { JsonValue } from '../json.js';
|
|
3
|
-
/** JSON-value plain-object check (excludes arrays and null); `constructor` avoids the `typeof` tag banned by anti-slop/no-runtime-typeof. */
|
|
4
|
-
export declare function isJsonObject(value: JsonValue | undefined): value is JsonObject;
|
|
5
1
|
export type JsonHookTarget = 'claude-code' | 'codex' | 'copilot';
|
|
6
2
|
export interface ToolDetection {
|
|
7
3
|
name: string;
|
package/dist/hooks/shared.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
import { envHomeDir, processEnv } from '../env.js';
|
|
1
|
+
import { envHomeDir, processEnv } from '../util/env.js';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as os from 'os';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import { vscodeDataFolders } from '../agent-memories/copilot.js';
|
|
6
|
-
/** JSON-value plain-object check (excludes arrays and null); `constructor` avoids the `typeof` tag banned by anti-slop/no-runtime-typeof. */
|
|
7
|
-
export function isJsonObject(value) {
|
|
8
|
-
return value !== undefined && value !== null && !Array.isArray(value) && value.constructor === Object;
|
|
9
|
-
}
|
|
10
6
|
export const HIPPO_SLEEP_MARKER = 'hippo sleep';
|
|
11
7
|
export const HIPPO_LAST_SLEEP_MARKER = 'hippo last-sleep';
|
|
12
8
|
export const HIPPO_CAPTURE_MARKER = 'hippo capture --last-session';
|
package/dist/importers/core.d.ts
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
* Memory importers for Hippo.
|
|
3
3
|
* Imports memories from ChatGPT, Claude, Cursor, generic files, and structured markdown.
|
|
4
4
|
*/
|
|
5
|
-
import { MemoryEntry } from '../memory.js';
|
|
6
|
-
import type { JsonValue } from '../json.js';
|
|
5
|
+
import { MemoryEntry } from '../core/memory.js';
|
|
7
6
|
export interface ImportResult {
|
|
8
7
|
total: number;
|
|
9
8
|
imported: number;
|
|
@@ -45,7 +44,7 @@ export interface ImportOptions {
|
|
|
45
44
|
* sharing a basename would collide and clobber each other). importVault throws
|
|
46
45
|
* if it is missing or blank. Optional in this shared type only because the
|
|
47
46
|
* other importers ignore it. Operator-supplied, so the loader query LIKE-escapes
|
|
48
|
-
* it (`escapeLike` in src/escape.ts).
|
|
47
|
+
* it (`escapeLike` in src/util/escape.ts).
|
|
49
48
|
*/
|
|
50
49
|
name?: string;
|
|
51
50
|
/**
|
|
@@ -59,7 +58,4 @@ export interface ImportOptions {
|
|
|
59
58
|
* create MemoryEntry objects, write them (unless dry-run), and return a result.
|
|
60
59
|
*/
|
|
61
60
|
export declare function importEntries(chunks: string[], source: string, tags: string[], options: ImportOptions): ImportResult;
|
|
62
|
-
export declare function isJsonPlainObject(x: JsonValue): x is {
|
|
63
|
-
[key: string]: JsonValue;
|
|
64
|
-
};
|
|
65
61
|
//# sourceMappingURL=core.d.ts.map
|
package/dist/importers/core.js
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
* Memory importers for Hippo.
|
|
3
3
|
* Imports memories from ChatGPT, Claude, Cursor, generic files, and structured markdown.
|
|
4
4
|
*/
|
|
5
|
-
import { createMemory, Layer } from '../memory.js';
|
|
6
|
-
import {
|
|
7
|
-
import { openStore } from '../store/open.js';
|
|
5
|
+
import { createMemory, Layer } from '../core/memory.js';
|
|
6
|
+
import { writeEntry } from '../store/entry-writes.js';
|
|
8
7
|
import { loadAllEntries } from '../store/entry-reads.js';
|
|
9
|
-
import { duplicateKey, storedTextKeys } from '../same-text.js';
|
|
10
|
-
import { getGlobalRoot, initGlobal } from '../shared.js';
|
|
11
|
-
import {
|
|
12
|
-
import { RejectedValueError
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
8
|
+
import { duplicateKey, storedTextKeys } from '../util/same-text.js';
|
|
9
|
+
import { getGlobalRoot, initGlobal } from '../sharing/shared.js';
|
|
10
|
+
import { withRequestStoresSync } from '../db/request-stores.js';
|
|
11
|
+
import { RejectedValueError } from '../store/rejection.js';
|
|
12
|
+
import { rejectionGuardRefuses } from '../store/rejected-values.js';
|
|
13
|
+
import { loadConfig } from '../core/config.js';
|
|
14
|
+
import { vetSecrets } from '../util/secret-detect.js';
|
|
15
|
+
import { log } from '../util/log.js';
|
|
16
16
|
// ---------------------------------------------------------------------------
|
|
17
17
|
// Shared core: dedup + write
|
|
18
18
|
// ---------------------------------------------------------------------------
|
|
@@ -21,12 +21,7 @@ import { log } from '../log.js';
|
|
|
21
21
|
* create MemoryEntry objects, write them (unless dry-run), and return a result.
|
|
22
22
|
*/
|
|
23
23
|
export function importEntries(chunks, source, tags, options) {
|
|
24
|
-
const targetRoot
|
|
25
|
-
// Ensure store is ready
|
|
26
|
-
if (options.global) {
|
|
27
|
-
initGlobal();
|
|
28
|
-
}
|
|
29
|
-
const keys = storedTextKeys(loadAllEntries(targetRoot, options.global ? undefined : options.tenantId));
|
|
24
|
+
const { targetRoot, keys } = openImportTarget(options);
|
|
30
25
|
const allTags = [...new Set([...tags, ...(options.extraTags ?? [])])];
|
|
31
26
|
const baseHalfLifeDays = loadConfig(targetRoot).defaultHalfLifeDays;
|
|
32
27
|
let total = 0;
|
|
@@ -35,24 +30,19 @@ export function importEntries(chunks, source, tags, options) {
|
|
|
35
30
|
let rejected = 0;
|
|
36
31
|
let redacted = 0;
|
|
37
32
|
const entries = [];
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
try {
|
|
33
|
+
// One scope, so the store opens once however many chunks land: each write, or a dry run's guard probe, shares its handle.
|
|
34
|
+
return withRequestStoresSync(() => {
|
|
41
35
|
for (const raw of chunks) {
|
|
42
36
|
const { chunk, wasRedacted } = prepareImportChunk(raw, allTags);
|
|
43
|
-
|
|
44
|
-
if (
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
total++;
|
|
49
|
-
// Dedup check: skip only when the same text is already stored
|
|
50
|
-
if (keys.has(duplicateKey(chunk))) {
|
|
37
|
+
const skip = skipReason(chunk, keys);
|
|
38
|
+
if (skip !== 'too-short')
|
|
39
|
+
total++;
|
|
40
|
+
if (skip !== null) {
|
|
51
41
|
skipped++;
|
|
52
42
|
continue;
|
|
53
43
|
}
|
|
54
44
|
const entry = createImportEntry(chunk, source, allTags, options, baseHalfLifeDays);
|
|
55
|
-
if (!writeOrProbeImport(
|
|
45
|
+
if (!writeOrProbeImport(targetRoot, entry, options)) {
|
|
56
46
|
rejected++;
|
|
57
47
|
continue;
|
|
58
48
|
}
|
|
@@ -65,10 +55,26 @@ export function importEntries(chunks, source, tags, options) {
|
|
|
65
55
|
redacted++;
|
|
66
56
|
}
|
|
67
57
|
return { total, imported, skipped, rejected, redacted, entries };
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/** The store the import writes to, made ready, with the text keys it already holds. */
|
|
61
|
+
function openImportTarget(options) {
|
|
62
|
+
const targetRoot = options.global ? getGlobalRoot() : options.hippoRoot;
|
|
63
|
+
// Ensure store is ready
|
|
64
|
+
if (options.global) {
|
|
65
|
+
initGlobal();
|
|
68
66
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
const keys = storedTextKeys(loadAllEntries(targetRoot, options.global ? undefined : options.tenantId));
|
|
68
|
+
return { targetRoot, keys };
|
|
69
|
+
}
|
|
70
|
+
function skipReason(chunk, keys) {
|
|
71
|
+
// Skip empty or too-short chunks
|
|
72
|
+
if (!chunk || chunk.length < 10)
|
|
73
|
+
return 'too-short';
|
|
74
|
+
// Dedup check: skip only when the same text is already stored
|
|
75
|
+
if (keys.has(duplicateKey(chunk)))
|
|
76
|
+
return 'duplicate';
|
|
77
|
+
return null;
|
|
72
78
|
}
|
|
73
79
|
/** The secret-vetted chunk capped at 1000 chars, and whether vetting changed it. */
|
|
74
80
|
function prepareImportChunk(raw, allTags) {
|
|
@@ -102,13 +108,12 @@ function createImportEntry(chunk, source, allTags, options, baseHalfLifeDays) {
|
|
|
102
108
|
});
|
|
103
109
|
}
|
|
104
110
|
/** Writes the entry, or on a dry run only probes the guard; false when a rejected value refuses it. */
|
|
105
|
-
function writeOrProbeImport(
|
|
111
|
+
function writeOrProbeImport(targetRoot, entry, options) {
|
|
112
|
+
if (options.dryRun)
|
|
113
|
+
return !rejectionGuardRefuses(targetRoot, entry.tenantId ?? 'default', entry.id, entry.content);
|
|
106
114
|
// A rejection refuses one chunk, not the whole import, so siblings still land.
|
|
107
115
|
try {
|
|
108
|
-
|
|
109
|
-
checkRejectionGuard(db, entry.tenantId ?? 'default', entry.id, entry.content);
|
|
110
|
-
else
|
|
111
|
-
writeEntryOn(db, targetRoot, entry);
|
|
116
|
+
writeEntry(targetRoot, entry);
|
|
112
117
|
}
|
|
113
118
|
catch (err) {
|
|
114
119
|
if (err instanceof RejectedValueError)
|
|
@@ -120,7 +125,4 @@ function writeOrProbeImport(db, targetRoot, entry, options) {
|
|
|
120
125
|
// ---------------------------------------------------------------------------
|
|
121
126
|
// ChatGPT importer
|
|
122
127
|
// ---------------------------------------------------------------------------
|
|
123
|
-
export function isJsonPlainObject(x) {
|
|
124
|
-
return x !== null && !Array.isArray(x) && typeof x === 'object';
|
|
125
|
-
}
|
|
126
128
|
//# sourceMappingURL=core.js.map
|
|
@@ -6,7 +6,7 @@ interface FrontmatterParseResult {
|
|
|
6
6
|
fm: Record<string, string>;
|
|
7
7
|
body: string;
|
|
8
8
|
}
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function splitMarkdownFrontmatter(raw: string): FrontmatterParseResult;
|
|
10
10
|
/** Pull a frontmatter field that may be a YAML flow list (`[a, b]`), a
|
|
11
11
|
* comma-separated scalar (`a, b`), or a single token, into a string[]. Quotes
|
|
12
12
|
* and surrounding brackets are stripped; empty entries dropped. */
|
|
@@ -28,14 +28,5 @@ export declare function parseWikilinks(body: string): string[];
|
|
|
28
28
|
* importVault (a no-op early return), NOT here: returning [] for it would feed
|
|
29
29
|
* the deletion-sync an empty scan that mass-archives every live row (codex R8). */
|
|
30
30
|
export declare function collectMarkdownFiles(root: string, hippoRoot: string, match?: RegExp): string[];
|
|
31
|
-
/** Canonicalize a path for the self-store comparison: dereference symlinks /
|
|
32
|
-
* junctions and normalize case (Windows) via the OS realpath, so a junction or
|
|
33
|
-
* a case-variant path to the store is still recognized as self-store (codex R9
|
|
34
|
-
* P2: path.resolve does neither, so an aliased store path slipped past the
|
|
35
|
-
* guard and triggered the mass-archive). Falls back to path.resolve when the
|
|
36
|
-
* path does not exist yet - an uninitialized store or a typo'd vault path
|
|
37
|
-
* cannot be a live self-store, and a non-existent vault folder fails later in
|
|
38
|
-
* the walk (readdirSync) before deletion-sync can archive anything. */
|
|
39
|
-
export declare function realpathOrResolve(p: string): string;
|
|
40
31
|
export {};
|
|
41
32
|
//# sourceMappingURL=markdown-parse.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import {
|
|
4
|
-
export function
|
|
3
|
+
import { realpathOrResolve } from '../util/real-path.js';
|
|
4
|
+
export function splitMarkdownFrontmatter(raw) {
|
|
5
5
|
// Must start with `---` on its own line. Accept CRLF or LF.
|
|
6
6
|
const m = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);
|
|
7
7
|
if (!m)
|
|
@@ -112,21 +112,4 @@ export function collectMarkdownFiles(root, hippoRoot, match = /\.md$/i) {
|
|
|
112
112
|
out.sort();
|
|
113
113
|
return out;
|
|
114
114
|
}
|
|
115
|
-
/** Canonicalize a path for the self-store comparison: dereference symlinks /
|
|
116
|
-
* junctions and normalize case (Windows) via the OS realpath, so a junction or
|
|
117
|
-
* a case-variant path to the store is still recognized as self-store (codex R9
|
|
118
|
-
* P2: path.resolve does neither, so an aliased store path slipped past the
|
|
119
|
-
* guard and triggered the mass-archive). Falls back to path.resolve when the
|
|
120
|
-
* path does not exist yet - an uninitialized store or a typo'd vault path
|
|
121
|
-
* cannot be a live self-store, and a non-existent vault folder fails later in
|
|
122
|
-
* the walk (readdirSync) before deletion-sync can archive anything. */
|
|
123
|
-
export function realpathOrResolve(p) {
|
|
124
|
-
try {
|
|
125
|
-
return fs.realpathSync.native(p);
|
|
126
|
-
}
|
|
127
|
-
catch (err) {
|
|
128
|
-
log.debug(`import: realpath fell back to resolve for ${p}: ${err instanceof Error ? err.message : String(err)}`);
|
|
129
|
-
return path.resolve(p);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
115
|
//# sourceMappingURL=markdown-parse.js.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import { importEntries } from './core.js';
|
|
3
|
+
const SLUG_MAX_CHARS = 50;
|
|
3
4
|
// ---------------------------------------------------------------------------
|
|
4
5
|
// Structured markdown importer (MEMORY.md / AGENTS.md format)
|
|
5
6
|
// ---------------------------------------------------------------------------
|
|
@@ -14,7 +15,7 @@ function slugify(heading) {
|
|
|
14
15
|
.trim()
|
|
15
16
|
.replace(/\s+/g, '-')
|
|
16
17
|
.replace(/-+/g, '-')
|
|
17
|
-
.slice(0,
|
|
18
|
+
.slice(0, SLUG_MAX_CHARS);
|
|
18
19
|
}
|
|
19
20
|
/**
|
|
20
21
|
* Parse structured markdown into {content, sectionSlug} pairs.
|