hippo-memory 1.69.0 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
package/dist/graph/write.js
CHANGED
|
@@ -1,285 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* `relations` (owns/supersedes/depends-on/blocked-by/references) sits ON TOP OF
|
|
6
|
-
* consolidated memories. The hard rule: the graph NEVER indexes the raw layer - every
|
|
7
|
-
* entity and relation references a memory whose `kind IN ('distilled','superseded')`,
|
|
8
|
-
* never `kind='raw'`. Enforced at the DB level (CHECK on source_kind/kind + BEFORE
|
|
9
|
-
* INSERT and BEFORE UPDATE triggers that tie source_kind/kind to the FK'd memory's
|
|
10
|
-
* actual kind and enforce tenant-match - relations also reject cross-tenant edges), so
|
|
11
|
-
* the forbidden state is unrepresentable regardless of code path. These helpers
|
|
12
|
-
* surface the same guard as clear throws BEFORE hitting the trigger backstop.
|
|
13
|
-
*/
|
|
14
|
-
import { openHippoDb, closeHippoDb } from '../db.js';
|
|
15
|
-
import { assertTenantId } from '../tenant.js';
|
|
16
|
-
import { log } from '../log.js';
|
|
17
|
-
import { clock } from '../write-budget.js';
|
|
18
|
-
import { GRAPH_ENTITY_TYPES, GRAPH_RELATION_TYPES, MAX_ENTITY_NAME_LEN } from './types.js';
|
|
19
|
-
import { rowToEntity, rowToRelation, rowToQueueItem, ENTITY_COLS, RELATION_COLS, QUEUE_COLS } from './rows.js';
|
|
20
|
-
const SOURCE_OBJECT_TABLE = {
|
|
21
|
-
decision: 'decisions',
|
|
22
|
-
policy: 'policies',
|
|
23
|
-
customer: 'customer_notes',
|
|
24
|
-
project: 'project_briefs',
|
|
25
|
-
};
|
|
26
|
-
function resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, label) {
|
|
27
|
-
let memKind = null;
|
|
28
|
-
let effectiveMemoryId = memoryId;
|
|
29
|
-
if (memoryId != null) {
|
|
30
|
-
// SAFETY: row's shape matches the two columns (kind, tenant_id) named in
|
|
31
|
-
// the SELECT above.
|
|
32
|
-
const row = db.prepare(`SELECT kind, tenant_id FROM memories WHERE id = ?`).get(memoryId);
|
|
33
|
-
if (!row) {
|
|
34
|
-
// Stale / forgotten mirror. Tolerate it IFF a valid source object provides provenance:
|
|
35
|
-
// graph-extract reads object rows then inserts, and a mirror forgotten/pruned in that window
|
|
36
|
-
// must NOT roll back the whole tenant rebuild - the active object survives mirror loss.
|
|
37
|
-
// Anchor to the object; drop the dead memory pointer.
|
|
38
|
-
if (sourceObject == null) {
|
|
39
|
-
throw new Error(`${label}: source memory ${memoryId} not found`);
|
|
40
|
-
}
|
|
41
|
-
effectiveMemoryId = null;
|
|
42
|
-
}
|
|
43
|
-
else if (row.tenant_id !== tenantId) {
|
|
44
|
-
throw new Error(`${label}: source memory ${memoryId} belongs to another tenant`);
|
|
45
|
-
}
|
|
46
|
-
else if (row.kind === 'raw') {
|
|
47
|
-
throw new Error(`${label}: source memory ${memoryId} is raw; the graph indexes consolidated state only`);
|
|
48
|
-
}
|
|
49
|
-
else if (row.kind !== 'distilled' && row.kind !== 'superseded') {
|
|
50
|
-
throw new Error(`${label}: source memory ${memoryId} has unsupported kind '${row.kind}'`);
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
memKind = row.kind;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// Validate the object pointer WHENEVER it is provided, not only when memory is null:
|
|
57
|
-
// a dual-set row whose object is wrong/closed/cross-tenant would become
|
|
58
|
-
// the active provenance after ON DELETE SET NULL and could then block the memory delete.
|
|
59
|
-
if (sourceObject != null) {
|
|
60
|
-
const table = SOURCE_OBJECT_TABLE[sourceObject.type];
|
|
61
|
-
if (!table) {
|
|
62
|
-
throw new Error(`${label}: unsupported source_object_type '${sourceObject.type}'`);
|
|
63
|
-
}
|
|
64
|
-
// `table` is a fixed value from the SOURCE_OBJECT_TABLE map (never user-supplied), so
|
|
65
|
-
// this string interpolation is safe; `id`/`tenant_id` stay parametrized.
|
|
66
|
-
// SAFETY: row's shape matches the single `status` column named in the
|
|
67
|
-
// SELECT above.
|
|
68
|
-
const row = db.prepare(`SELECT status FROM ${table} WHERE id = ? AND tenant_id = ?`).get(sourceObject.id, tenantId);
|
|
69
|
-
if (!row) {
|
|
70
|
-
throw new Error(`${label}: source ${sourceObject.type} ${sourceObject.id} not found for tenant ${tenantId}`);
|
|
71
|
-
}
|
|
72
|
-
if (row.status !== 'active' && row.status !== 'superseded') {
|
|
73
|
-
throw new Error(`${label}: source ${sourceObject.type} ${sourceObject.id} has status '${row.status}' (must be active|superseded)`);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// source_kind is the memory's kind when a memory is present, else 'distilled' for an
|
|
77
|
-
// object-only row (objects are consolidated by construction). All-null is rejected.
|
|
78
|
-
if (memKind != null)
|
|
79
|
-
return { sourceKind: memKind, memoryId: effectiveMemoryId };
|
|
80
|
-
if (sourceObject != null)
|
|
81
|
-
return { sourceKind: 'distilled', memoryId: null };
|
|
82
|
-
throw new Error(`${label}: graph row needs a memory or a source object`);
|
|
83
|
-
}
|
|
84
|
-
// ---------------------------------------------------------------------------
|
|
85
|
-
// Public API
|
|
86
|
-
// ---------------------------------------------------------------------------
|
|
87
|
-
/**
|
|
88
|
-
* Insert a graph entity extracted from a consolidated memory. Throws if the source
|
|
89
|
-
* memory is missing / cross-tenant / raw (the DB trigger is the backstop).
|
|
90
|
-
*/
|
|
91
|
-
export function insertEntity(hippoRoot, tenantId, opts, txDb) {
|
|
92
|
-
assertTenantId('insertEntity', tenantId);
|
|
93
|
-
if (!GRAPH_ENTITY_TYPES.has(opts.entityType)) {
|
|
94
|
-
throw new Error(`insertEntity: entityType must be one of ${Array.from(GRAPH_ENTITY_TYPES).join('|')}; got ${opts.entityType}`);
|
|
95
|
-
}
|
|
96
|
-
const name = checkedName('insertEntity', opts.name);
|
|
97
|
-
const now = new Date().toISOString();
|
|
98
|
-
const memoryId = opts.memoryId ?? null;
|
|
99
|
-
const sourceObject = opts.sourceObject ?? null;
|
|
100
|
-
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
101
|
-
const db = txDb ?? ownDb;
|
|
102
|
-
try {
|
|
103
|
-
const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertEntity');
|
|
104
|
-
const result = db.prepare(`
|
|
105
|
-
INSERT INTO entities(tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id, created_at)
|
|
106
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
107
|
-
`).run(tenantId, opts.entityType, name, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
|
|
108
|
-
const id = Number(result.lastInsertRowid ?? 0);
|
|
109
|
-
// SAFETY: row's shape matches the columns named in ENTITY_COLS above.
|
|
110
|
-
const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ?`).get(id);
|
|
111
|
-
if (!row)
|
|
112
|
-
throw new Error('insertEntity: failed to reload inserted entity');
|
|
113
|
-
return rowToEntity(row);
|
|
114
|
-
}
|
|
115
|
-
finally {
|
|
116
|
-
if (ownDb)
|
|
117
|
-
closeHippoDb(ownDb);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
function checkedName(label, raw) {
|
|
121
|
-
const name = (raw ?? '').trim();
|
|
122
|
-
if (name.length === 0)
|
|
123
|
-
throw new Error(`${label}: name is required`);
|
|
124
|
-
if (name.length > MAX_ENTITY_NAME_LEN) {
|
|
125
|
-
throw new Error(`${label}: name exceeds the ${MAX_ENTITY_NAME_LEN}-char cap`);
|
|
126
|
-
}
|
|
127
|
-
return name;
|
|
128
|
-
}
|
|
129
|
-
/** Renames an entity or moves its memory provenance in place, keeping id and created_at; null when the row is gone.
|
|
130
|
-
* A delete plus an insert would cascade away every relation that points at it. */
|
|
131
|
-
export function updateEntity(hippoRoot, tenantId, id, opts, txDb) {
|
|
132
|
-
assertTenantId('updateEntity', tenantId);
|
|
133
|
-
const name = checkedName('updateEntity', opts.name);
|
|
134
|
-
const db = txDb ?? openHippoDb(hippoRoot);
|
|
135
|
-
try {
|
|
136
|
-
// SAFETY: row's shape matches the columns named in ENTITY_COLS above.
|
|
137
|
-
const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
|
|
138
|
-
if (!row)
|
|
139
|
-
return null;
|
|
140
|
-
const entity = rowToEntity(row);
|
|
141
|
-
const sourceObject = entity.sourceObjectType === undefined || entity.sourceObjectId === undefined
|
|
142
|
-
? null
|
|
143
|
-
: { type: entity.sourceObjectType, id: entity.sourceObjectId };
|
|
144
|
-
const resolved = resolveConsolidatedSource(db, tenantId, opts.memoryId ?? null, sourceObject, 'updateEntity');
|
|
145
|
-
db.prepare(`UPDATE entities SET name = ?, memory_id = ?, source_kind = ? WHERE id = ? AND tenant_id = ?`)
|
|
146
|
-
.run(name, resolved.memoryId, resolved.sourceKind, id, tenantId);
|
|
147
|
-
return { ...entity, name, memoryId: resolved.memoryId, sourceKind: resolved.sourceKind };
|
|
148
|
-
}
|
|
149
|
-
finally {
|
|
150
|
-
if (db !== txDb)
|
|
151
|
-
closeHippoDb(db);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Insert a graph relation between two entities, sourced from a consolidated memory.
|
|
156
|
-
* Both entities must exist in the same tenant; the source memory must be consolidated.
|
|
157
|
-
*/
|
|
158
|
-
export function insertRelation(hippoRoot, tenantId, opts, txDb) {
|
|
159
|
-
assertTenantId('insertRelation', tenantId);
|
|
160
|
-
if (!GRAPH_RELATION_TYPES.has(opts.relType)) {
|
|
161
|
-
throw new Error(`insertRelation: relType must be one of ${Array.from(GRAPH_RELATION_TYPES).join('|')}; got ${opts.relType}`);
|
|
162
|
-
}
|
|
163
|
-
const now = new Date().toISOString();
|
|
164
|
-
const memoryId = opts.memoryId ?? null;
|
|
165
|
-
const sourceObject = opts.sourceObject ?? null;
|
|
166
|
-
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
167
|
-
const db = txDb ?? ownDb;
|
|
168
|
-
try {
|
|
169
|
-
for (const [eid, role] of [[opts.fromEntityId, 'from'], [opts.toEntityId, 'to']]) {
|
|
170
|
-
// SAFETY: ent's shape matches the single `tenant_id` column named in
|
|
171
|
-
// the SELECT above.
|
|
172
|
-
const ent = db.prepare(`SELECT tenant_id FROM entities WHERE id = ?`).get(eid);
|
|
173
|
-
if (!ent)
|
|
174
|
-
throw new Error(`insertRelation: ${role}_entity ${eid} not found`);
|
|
175
|
-
if (ent.tenant_id !== tenantId) {
|
|
176
|
-
throw new Error(`insertRelation: ${role}_entity ${eid} belongs to another tenant (no cross-tenant edges)`);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertRelation');
|
|
180
|
-
const result = db.prepare(`
|
|
181
|
-
INSERT INTO relations(tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id, created_at)
|
|
182
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
183
|
-
`).run(tenantId, opts.fromEntityId, opts.toEntityId, opts.relType, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
|
|
184
|
-
const id = Number(result.lastInsertRowid ?? 0);
|
|
185
|
-
// SAFETY: row's shape matches the columns named in RELATION_COLS above.
|
|
186
|
-
const row = db.prepare(`SELECT ${RELATION_COLS} FROM relations WHERE id = ?`).get(id);
|
|
187
|
-
if (!row)
|
|
188
|
-
throw new Error('insertRelation: failed to reload inserted relation');
|
|
189
|
-
return rowToRelation(row);
|
|
190
|
-
}
|
|
191
|
-
finally {
|
|
192
|
-
if (ownDb)
|
|
193
|
-
closeHippoDb(ownDb);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
// ---------------------------------------------------------------------------
|
|
197
|
-
// Extraction queue
|
|
198
|
-
// ---------------------------------------------------------------------------
|
|
199
|
-
/**
|
|
200
|
-
* Enqueue a consolidated memory for later graph extraction. Rejects a raw / missing /
|
|
201
|
-
* cross-tenant memory (the DB trigger is the backstop).
|
|
202
|
-
*/
|
|
203
|
-
export function enqueueExtraction(hippoRoot, tenantId, memoryId) {
|
|
204
|
-
assertTenantId('enqueueExtraction', tenantId);
|
|
205
|
-
const now = new Date().toISOString();
|
|
206
|
-
const db = openHippoDb(hippoRoot);
|
|
207
|
-
try {
|
|
208
|
-
// enqueue is memory-keyed (no source object), so a missing memory still throws (correct -
|
|
209
|
-
// you cannot enqueue a forgotten mirror); memoryId is non-null here by construction.
|
|
210
|
-
const { sourceKind } = resolveConsolidatedSource(db, tenantId, memoryId, null, 'enqueueExtraction');
|
|
211
|
-
const result = db.prepare(`
|
|
212
|
-
INSERT INTO graph_extraction_queue(tenant_id, memory_id, kind, status, enqueued_at, processed_at)
|
|
213
|
-
VALUES (?, ?, ?, 'pending', ?, NULL)
|
|
214
|
-
`).run(tenantId, memoryId, sourceKind, now);
|
|
215
|
-
const id = Number(result.lastInsertRowid ?? 0);
|
|
216
|
-
// SAFETY: row's shape matches the columns named in QUEUE_COLS above.
|
|
217
|
-
const row = db.prepare(`SELECT ${QUEUE_COLS} FROM graph_extraction_queue WHERE id = ?`).get(id);
|
|
218
|
-
if (!row)
|
|
219
|
-
throw new Error('enqueueExtraction: failed to reload queue item');
|
|
220
|
-
return rowToQueueItem(row);
|
|
221
|
-
}
|
|
222
|
-
finally {
|
|
223
|
-
closeHippoDb(db);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Mark a queue item terminal (processed | skipped). Only `status`/`processed_at`
|
|
228
|
-
* change, so the consolidated-source guard trigger (which fires on
|
|
229
|
-
* memory_id/kind/tenant_id changes) is not involved. CAS on the current status to a
|
|
230
|
-
* non-terminal 'pending'.
|
|
231
|
-
*/
|
|
232
|
-
export function markExtractionProcessed(hippoRoot, tenantId, id, status = 'processed') {
|
|
233
|
-
assertTenantId('markExtractionProcessed', tenantId);
|
|
234
|
-
const now = new Date().toISOString();
|
|
235
|
-
const db = openHippoDb(hippoRoot);
|
|
236
|
-
try {
|
|
237
|
-
const updated = db.prepare(`
|
|
238
|
-
UPDATE graph_extraction_queue
|
|
239
|
-
SET status = ?, processed_at = ?
|
|
240
|
-
WHERE id = ? AND tenant_id = ? AND status = 'pending'
|
|
241
|
-
`).run(status, now, id, tenantId);
|
|
242
|
-
if (updated.changes === 0) {
|
|
243
|
-
// SAFETY: existing's shape matches the single `status` column named in
|
|
244
|
-
// the SELECT above.
|
|
245
|
-
const existing = db.prepare(`SELECT status FROM graph_extraction_queue WHERE id = ? AND tenant_id = ?`)
|
|
246
|
-
.get(id, tenantId);
|
|
247
|
-
if (!existing)
|
|
248
|
-
throw new Error(`markExtractionProcessed: queue item ${id} not found for tenant ${tenantId}`);
|
|
249
|
-
throw new Error(`markExtractionProcessed: queue item ${id} is not pending (status='${existing.status}')`);
|
|
250
|
-
}
|
|
251
|
-
// SAFETY: row's shape matches the columns named in QUEUE_COLS above.
|
|
252
|
-
const row = db.prepare(`SELECT ${QUEUE_COLS} FROM graph_extraction_queue WHERE id = ? AND tenant_id = ?`)
|
|
253
|
-
.get(id, tenantId);
|
|
254
|
-
if (!row)
|
|
255
|
-
throw new Error(`markExtractionProcessed: queue item ${id} not found after UPDATE`);
|
|
256
|
-
return rowToQueueItem(row);
|
|
257
|
-
}
|
|
258
|
-
finally {
|
|
259
|
-
closeHippoDb(db);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
/** The source object still holds the loader's rule (active or superseded); a closed or gone one gets no new graph row. */
|
|
263
|
-
function objectInForce(db, tenantId, ref) {
|
|
264
|
-
// `table` comes from the fixed SOURCE_OBJECT_TABLE map, never from input.
|
|
265
|
-
const table = SOURCE_OBJECT_TABLE[ref.type];
|
|
266
|
-
// SAFETY: row's shape matches the single `status` column named in the SELECT.
|
|
267
|
-
const row = db.prepare(`SELECT status FROM ${table} WHERE id = ? AND tenant_id = ?`).get(ref.id, tenantId);
|
|
268
|
-
return row?.status === 'active' || row?.status === 'superseded';
|
|
269
|
-
}
|
|
270
|
-
function entityIdByKey(db, tenantId, key) {
|
|
271
|
-
// SAFETY: row's shape matches the single `id` column named in the SELECT.
|
|
272
|
-
const row = db.prepare(`SELECT id FROM entities WHERE tenant_id = ? AND entity_type = ? AND source_object_type = ? AND source_object_id = ? ORDER BY id LIMIT 1`).get(tenantId, key.entityType, key.sourceObject.type, key.sourceObject.id);
|
|
273
|
-
return row?.id;
|
|
274
|
-
}
|
|
1
|
+
// Applies a rebuild's op list on the caller's transaction. The statements and the consolidated-source guard sit in the store's graph writers.
|
|
2
|
+
import { assertTenantId } from '../store/tenant.js';
|
|
3
|
+
import { clock } from '../util/write-budget.js';
|
|
4
|
+
import { deleteEntityRow, deleteRelationRow, entityIdBySource, insertEntity, insertRelation, objectInForce, relationPresent, updateEntity } from '../store/graph-writes.js';
|
|
275
5
|
function insertDesiredRelation(db, hippoRoot, tenantId, rel) {
|
|
276
|
-
const fromEntityId =
|
|
277
|
-
const toEntityId =
|
|
6
|
+
const fromEntityId = entityIdBySource(db, tenantId, rel.from.entityType, rel.from.sourceObject);
|
|
7
|
+
const toEntityId = entityIdBySource(db, tenantId, rel.to.entityType, rel.to.sourceObject);
|
|
278
8
|
if (fromEntityId === undefined || toEntityId === undefined || !objectInForce(db, tenantId, rel.sourceObject))
|
|
279
9
|
return false;
|
|
280
|
-
|
|
281
|
-
const present = db.prepare(`SELECT 1 AS hit FROM relations WHERE tenant_id = ? AND from_entity_id = ? AND to_entity_id = ? AND rel_type = ? LIMIT 1`).get(tenantId, fromEntityId, toEntityId, rel.relType);
|
|
282
|
-
if (present)
|
|
10
|
+
if (relationPresent(db, tenantId, fromEntityId, toEntityId, rel.relType))
|
|
283
11
|
return false;
|
|
284
12
|
insertRelation(hippoRoot, tenantId, { fromEntityId, toEntityId, relType: rel.relType, memoryId: rel.memoryId, sourceObject: rel.sourceObject }, db);
|
|
285
13
|
return true;
|
|
@@ -288,10 +16,10 @@ function insertDesiredRelation(db, hippoRoot, tenantId, rel) {
|
|
|
288
16
|
function applyGraphOp(db, hippoRoot, tenantId, op) {
|
|
289
17
|
switch (op.op) {
|
|
290
18
|
case 'deleteEntity':
|
|
291
|
-
db
|
|
19
|
+
deleteEntityRow(db, tenantId, op.id);
|
|
292
20
|
return true;
|
|
293
21
|
case 'deleteRelation':
|
|
294
|
-
db
|
|
22
|
+
deleteRelationRow(db, tenantId, op.id);
|
|
295
23
|
return true;
|
|
296
24
|
case 'updateEntity':
|
|
297
25
|
if (!objectInForce(db, tenantId, op.entity.sourceObject))
|
|
@@ -299,7 +27,7 @@ function applyGraphOp(db, hippoRoot, tenantId, op) {
|
|
|
299
27
|
return updateEntity(hippoRoot, tenantId, op.id, op.entity, db) !== null;
|
|
300
28
|
case 'insertEntity':
|
|
301
29
|
// A mirrorless object closed since the load is never enqueued again, so a stale insert would stay for good.
|
|
302
|
-
if (!objectInForce(db, tenantId, op.entity.sourceObject) ||
|
|
30
|
+
if (!objectInForce(db, tenantId, op.entity.sourceObject) || entityIdBySource(db, tenantId, op.entity.entityType, op.entity.sourceObject) !== undefined)
|
|
303
31
|
return false;
|
|
304
32
|
insertEntity(hippoRoot, tenantId, op.entity, db);
|
|
305
33
|
return true;
|
|
@@ -307,13 +35,13 @@ function applyGraphOp(db, hippoRoot, tenantId, op) {
|
|
|
307
35
|
return insertDesiredRelation(db, hippoRoot, tenantId, op.relation);
|
|
308
36
|
}
|
|
309
37
|
}
|
|
310
|
-
/** Applies `ops` from index `from` on the caller's open transaction and stops at the first op boundary past `opts.holdMs`.
|
|
38
|
+
/** Applies `ops` from index `opts.from` on the caller's open transaction and stops at the first op boundary past `opts.holdMs`.
|
|
311
39
|
* Returns where the next chunk starts and how many ops were skipped as stale. */
|
|
312
|
-
export function applyGraphOps(db, hippoRoot, tenantId, ops,
|
|
40
|
+
export function applyGraphOps(db, hippoRoot, tenantId, ops, opts) {
|
|
313
41
|
assertTenantId('applyGraphOps', tenantId);
|
|
314
42
|
const now = opts.clock ?? clock;
|
|
315
43
|
const begunAt = now();
|
|
316
|
-
let next = from;
|
|
44
|
+
let next = opts.from;
|
|
317
45
|
let skipped = 0;
|
|
318
46
|
while (next < ops.length) {
|
|
319
47
|
if (!applyGraphOp(db, hippoRoot, tenantId, ops[next]))
|
|
@@ -324,116 +52,4 @@ export function applyGraphOps(db, hippoRoot, tenantId, ops, from, opts) {
|
|
|
324
52
|
}
|
|
325
53
|
return { next, skipped };
|
|
326
54
|
}
|
|
327
|
-
/** Runs one tenant's graph writes in `fn` on `txDb` under one BEGIN IMMEDIATE, so two rebuilds serialize instead of
|
|
328
|
-
* interleaving and a throw rolls back the whole chunk. The sole sanctioned place to wrap graph writes in a transaction. */
|
|
329
|
-
export function runGraphRebuildTransaction(hippoRoot, tenantId, fn, opts) {
|
|
330
|
-
assertTenantId('runGraphRebuildTransaction', tenantId);
|
|
331
|
-
const db = openHippoDb(hippoRoot, opts);
|
|
332
|
-
try {
|
|
333
|
-
db.exec('BEGIN IMMEDIATE');
|
|
334
|
-
let committed = false;
|
|
335
|
-
try {
|
|
336
|
-
const out = fn(db);
|
|
337
|
-
db.exec('COMMIT');
|
|
338
|
-
committed = true;
|
|
339
|
-
return out;
|
|
340
|
-
}
|
|
341
|
-
finally {
|
|
342
|
-
if (!committed) {
|
|
343
|
-
try {
|
|
344
|
-
db.exec('ROLLBACK');
|
|
345
|
-
}
|
|
346
|
-
catch { /* preserve the original throw */ }
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
finally {
|
|
351
|
-
closeHippoDb(db);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
// ---------------------------------------------------------------------------
|
|
355
|
-
// Sleep enqueue-hook: producer helper + drain support
|
|
356
|
-
// ---------------------------------------------------------------------------
|
|
357
|
-
/**
|
|
358
|
-
* Fail-soft producer hook: mark a tenant dirty for graph re-extraction by
|
|
359
|
-
* enqueuing its consolidated mirror memory. NEVER throws into the caller — a
|
|
360
|
-
* graph-dirty signal failing must not abort a core object write. Graph staleness is
|
|
361
|
-
* recoverable (next sleep / manual `graph extract`); a broken `hippo decide` is
|
|
362
|
-
* not. Called POST-COMMIT from the graph-source save/close mutations of
|
|
363
|
-
* decision, policy, customer_note and project_brief. A null memoryId (a
|
|
364
|
-
* forgotten mirror) is a no-op.
|
|
365
|
-
*/
|
|
366
|
-
export function markGraphDirty(hippoRoot, tenantId, memoryId) {
|
|
367
|
-
if (!memoryId)
|
|
368
|
-
return;
|
|
369
|
-
try {
|
|
370
|
-
enqueueExtraction(hippoRoot, tenantId, memoryId);
|
|
371
|
-
}
|
|
372
|
-
catch (err) {
|
|
373
|
-
// Logged (warn) so a SYSTEMATIC enqueue failure surfaces to operators, but
|
|
374
|
-
// swallowed so the already-committed object write is never rolled back.
|
|
375
|
-
log.warn(`markGraphDirty: enqueue failed for tenant=${tenantId} memory=${memoryId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* Remove the graph rows sourced from one first-class object, by its (type, id). Used when a
|
|
380
|
-
* MIRRORLESS object is closed: it has no mirror memory, so `markGraphDirty` cannot
|
|
381
|
-
* enqueue a rebuild (the queue is memory-keyed). Closing must still drop the object's
|
|
382
|
-
* now-stale entity + edges from the graph, so we remove them directly here. Fail-soft
|
|
383
|
-
* like `markGraphDirty` (never throws into the object close caller; graph staleness is
|
|
384
|
-
* recoverable). Deleting the entity cascade-deletes any relation where it is an endpoint
|
|
385
|
-
* (relations FK entities ON DELETE CASCADE); the explicit relations DELETE also covers a
|
|
386
|
-
* relation whose OWN provenance is this object (defensive — every such edge has the object
|
|
387
|
-
* as an endpoint today, so the cascade already covers it). DELETE fires no BEFORE
|
|
388
|
-
* INSERT/UPDATE guard trigger.
|
|
389
|
-
*/
|
|
390
|
-
export function removeGraphEntitiesForObject(hippoRoot, tenantId, sourceObjectType, sourceObjectId) {
|
|
391
|
-
try {
|
|
392
|
-
assertTenantId('removeGraphEntitiesForObject', tenantId);
|
|
393
|
-
const db = openHippoDb(hippoRoot);
|
|
394
|
-
try {
|
|
395
|
-
db.exec('BEGIN IMMEDIATE');
|
|
396
|
-
db.prepare(`DELETE FROM relations WHERE tenant_id = ? AND source_object_type = ? AND source_object_id = ?`)
|
|
397
|
-
.run(tenantId, sourceObjectType, sourceObjectId);
|
|
398
|
-
db.prepare(`DELETE FROM entities WHERE tenant_id = ? AND source_object_type = ? AND source_object_id = ?`)
|
|
399
|
-
.run(tenantId, sourceObjectType, sourceObjectId);
|
|
400
|
-
db.exec('COMMIT');
|
|
401
|
-
}
|
|
402
|
-
catch (e) {
|
|
403
|
-
try {
|
|
404
|
-
db.exec('ROLLBACK');
|
|
405
|
-
}
|
|
406
|
-
catch { /* preserve original throw */ }
|
|
407
|
-
throw e;
|
|
408
|
-
}
|
|
409
|
-
finally {
|
|
410
|
-
closeHippoDb(db);
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
catch (err) {
|
|
414
|
-
log.warn(`removeGraphEntitiesForObject: failed for tenant=${tenantId} ${sourceObjectType}#${sourceObjectId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
/**
|
|
418
|
-
* Mark every pending queue item for a tenant with `id <= maxId` processed, in
|
|
419
|
-
* one UPDATE. Status/processed_at only, so the consolidated-source guard trigger
|
|
420
|
-
* is not involved (same as markExtractionProcessed). Returns the count marked.
|
|
421
|
-
* The `<= maxId` watermark excludes items enqueued after the drain snapshot.
|
|
422
|
-
*/
|
|
423
|
-
export function markPendingProcessedUpTo(hippoRoot, tenantId, maxId) {
|
|
424
|
-
assertTenantId('markPendingProcessedUpTo', tenantId);
|
|
425
|
-
const now = new Date().toISOString();
|
|
426
|
-
const db = openHippoDb(hippoRoot);
|
|
427
|
-
try {
|
|
428
|
-
const res = db.prepare(`
|
|
429
|
-
UPDATE graph_extraction_queue
|
|
430
|
-
SET status = 'processed', processed_at = ?
|
|
431
|
-
WHERE tenant_id = ? AND status = 'pending' AND id <= ?
|
|
432
|
-
`).run(now, tenantId, maxId);
|
|
433
|
-
return Number(res.changes ?? 0);
|
|
434
|
-
}
|
|
435
|
-
finally {
|
|
436
|
-
closeHippoDb(db);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
55
|
//# sourceMappingURL=write.js.map
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { envPath } from '../env.js';
|
|
1
|
+
import { envPath } from '../util/env.js';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as path from 'path';
|
|
4
|
-
import {
|
|
4
|
+
import { PACKAGE_ROOT } from '../core/package-root.js';
|
|
5
|
+
import { errorMessage, log } from '../util/log.js';
|
|
5
6
|
import { HIPPO_CODEX_WRAPPER_MARKER, homeDir, codexHomeDir, ensureDir } from './shared.js';
|
|
6
|
-
import { isJsonString } from '../json.js';
|
|
7
|
+
import { isJsonString } from '../util/json.js';
|
|
8
|
+
import { writeFileAtomic } from '../util/atomic-write.js';
|
|
7
9
|
export function resolveCodexWrapperPaths() {
|
|
8
10
|
const home = homeDir();
|
|
9
11
|
const codexHome = codexHomeDir(home);
|
|
@@ -66,7 +68,7 @@ function isCodexWrapperMetadataValid(metadata) {
|
|
|
66
68
|
isHippoCodexWrapperFile(metadata.commandPath));
|
|
67
69
|
}
|
|
68
70
|
function resolveHippoCliPath() {
|
|
69
|
-
return
|
|
71
|
+
return path.join(PACKAGE_ROOT, 'bin', 'hippo.js');
|
|
70
72
|
}
|
|
71
73
|
function quoteForShell(value) {
|
|
72
74
|
return `"${value.replace(/(["\\$`])/g, '\\$1')}"`;
|
|
@@ -152,26 +154,20 @@ export function detectRealCodexPath() {
|
|
|
152
154
|
return null;
|
|
153
155
|
}
|
|
154
156
|
function writeExecutableFile(filePath, content) {
|
|
155
|
-
|
|
157
|
+
writeFileAtomic(filePath, content);
|
|
156
158
|
try {
|
|
157
159
|
fs.chmodSync(filePath, 0o755);
|
|
158
160
|
}
|
|
159
|
-
catch {
|
|
160
|
-
//
|
|
161
|
+
catch (err) {
|
|
162
|
+
// The mode bit means nothing on Windows; elsewhere a wrapper that is not executable breaks `codex`, so say so.
|
|
163
|
+
log.warn(`could not mark ${filePath} executable: ${errorMessage(err)}`);
|
|
161
164
|
}
|
|
162
165
|
}
|
|
163
166
|
export function installCodexWrapper(realCodexPath) {
|
|
164
167
|
const existingMetadata = readCodexWrapperMetadata();
|
|
165
168
|
if (isCodexWrapperMetadataValid(existingMetadata) && !realCodexPath) {
|
|
166
169
|
cleanupLegacyCodexPathWrappers(resolveCodexWrapperPaths());
|
|
167
|
-
return
|
|
168
|
-
installed: true,
|
|
169
|
-
metadataPath: resolveCodexWrapperPaths().metadataPath,
|
|
170
|
-
realCodexPath: existingMetadata.realCodexPath,
|
|
171
|
-
commandPath: existingMetadata.commandPath,
|
|
172
|
-
backupPath: existingMetadata.backupPath,
|
|
173
|
-
installMode: existingMetadata.installMode,
|
|
174
|
-
};
|
|
170
|
+
return installResult(resolveCodexWrapperPaths().metadataPath, existingMetadata);
|
|
175
171
|
}
|
|
176
172
|
const resolvedRealCodexPath = realCodexPath ?? detectRealCodexPath();
|
|
177
173
|
if (!resolvedRealCodexPath) {
|
|
@@ -200,10 +196,13 @@ export function installCodexWrapper(realCodexPath) {
|
|
|
200
196
|
logFile: paths.logFile,
|
|
201
197
|
installedAt: new Date().toISOString(),
|
|
202
198
|
};
|
|
203
|
-
|
|
199
|
+
writeFileAtomic(paths.metadataPath, JSON.stringify(metadata, null, 2) + '\n');
|
|
200
|
+
return installResult(paths.metadataPath, metadata);
|
|
201
|
+
}
|
|
202
|
+
function installResult(metadataPath, metadata) {
|
|
204
203
|
return {
|
|
205
204
|
installed: true,
|
|
206
|
-
metadataPath
|
|
205
|
+
metadataPath,
|
|
207
206
|
realCodexPath: metadata.realCodexPath,
|
|
208
207
|
commandPath: metadata.commandPath,
|
|
209
208
|
backupPath: metadata.backupPath,
|
package/dist/hooks/copilot.d.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import type { JsonObject } from '../working-memory.js';
|
|
2
|
-
/** Copilot drops what a per-prompt hook prints, so per-task recall goes through the MCP tool the block names. */
|
|
3
|
-
export declare const COPILOT_INSTRUCTIONS: string;
|
|
4
|
-
export declare const VSCODE_INSTRUCTIONS: string;
|
|
1
|
+
import type { JsonObject } from '../store/working-memory.js';
|
|
5
2
|
/** The files hippo writes in one VS Code User folder. */
|
|
6
3
|
export interface VscodePaths {
|
|
7
4
|
readonly userDir: string;
|
|
@@ -30,8 +27,6 @@ export declare const VSCODE_MCP: McpHost;
|
|
|
30
27
|
/** What to paste under the host's key when hippo cannot edit the file itself. */
|
|
31
28
|
export declare function copilotMcpSnippet(host?: McpHost): string;
|
|
32
29
|
export type McpMergeStatus = 'added' | 'present' | 'user-owned' | 'unreadable';
|
|
33
|
-
/** 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. */
|
|
34
|
-
export declare function mergeMcpServer(file: string, host?: McpHost): McpMergeStatus;
|
|
35
30
|
export type McpRemoveStatus = 'removed' | 'absent' | 'user-owned' | 'unreadable';
|
|
36
31
|
/** Removes the "hippo" key only when hippo wrote it. */
|
|
37
32
|
export declare function removeMcpServer(file: string, host?: McpHost): McpRemoveStatus;
|
|
@@ -42,8 +37,6 @@ export interface McpFailure {
|
|
|
42
37
|
export declare function isMcpFailure(status: string | McpFailure): status is McpFailure;
|
|
43
38
|
/** `kept`: a hippo block that is not the Copilot text (edited, or another agent's in a shared file); `unclosed`: a start marker with no end. */
|
|
44
39
|
export type InstructionsInstallStatus = 'written' | 'present' | 'kept' | 'unclosed';
|
|
45
|
-
/** 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. */
|
|
46
|
-
export declare function ensureInstructionsBlock(file: string): InstructionsInstallStatus;
|
|
47
40
|
export type InstructionsRemoveStatus = 'removed' | 'absent' | 'kept' | 'unclosed';
|
|
48
41
|
/** Splices out only hippo's own Copilot block and keeps every other byte; a file left with nothing but whitespace goes. */
|
|
49
42
|
export declare function removeInstructionsBlock(file: string): InstructionsRemoveStatus;
|
package/dist/hooks/copilot.js
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import { isDeepStrictEqual } from 'node:util';
|
|
6
|
-
import { readJsonFile } from '../json.js';
|
|
7
|
-
import { HOOK_MARKERS, hippoBlock } from '
|
|
8
|
-
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';
|
|
9
10
|
import { installJsonHooks, resolveJsonHookPaths, uninstallJsonHooks, writeSettingsFile } from './json-hooks.js';
|
|
10
11
|
const MCP_KEY = 'hippo';
|
|
11
12
|
/** Copilot drops what a per-prompt hook prints, so per-task recall goes through the MCP tool the block names. */
|
|
12
|
-
|
|
13
|
+
const COPILOT_INSTRUCTIONS = `
|
|
13
14
|
## Project Memory (Hippo)
|
|
14
15
|
|
|
15
16
|
At the start of each task, call the \`hippo_recall\` tool with a short query that
|
|
@@ -44,7 +45,7 @@ before you finish.
|
|
|
44
45
|
];
|
|
45
46
|
/** VS Code attaches a User `*.instructions.md` file to every chat request its `applyTo` glob matches. */
|
|
46
47
|
const withApplyToAll = (text) => `---\napplyTo: "**"\n---\n${text}\n`;
|
|
47
|
-
|
|
48
|
+
const VSCODE_INSTRUCTIONS = withApplyToAll(COPILOT_INSTRUCTIONS);
|
|
48
49
|
function isHipposVscodeInstructions(text) {
|
|
49
50
|
return SHIPPED_COPILOT_INSTRUCTIONS.some((shipped) => text === withApplyToAll(shipped));
|
|
50
51
|
}
|
|
@@ -76,9 +77,10 @@ function hippoCommand() {
|
|
|
76
77
|
export const COPILOT_CLI_MCP = { key: 'mcpServers', server: () => ({ type: 'local', command: hippoCommand(), args: ['mcp'], env: {}, tools: ['*'] }) };
|
|
77
78
|
/** VS Code's mcp.json keeps stdio servers under "servers"; it has no "mcpServers" key. */
|
|
78
79
|
export const VSCODE_MCP = { key: 'servers', server: () => ({ type: 'stdio', command: hippoCommand(), args: ['mcp'] }) };
|
|
79
|
-
/** Only a server hippo wrote counts as hippo's: another command, other args, or
|
|
80
|
+
/** Only a server hippo wrote counts as hippo's: another command, other args, or
|
|
81
|
+
* any key or value setup does not write (an env you added) makes it the user's. */
|
|
80
82
|
function isHipposServer(entry, host) {
|
|
81
|
-
if (!
|
|
83
|
+
if (!isJsonObjectLiteral(entry) || !('command' in entry) || !('args' in entry))
|
|
82
84
|
return false;
|
|
83
85
|
const ours = host.server();
|
|
84
86
|
return Object.entries(entry).every(([key, value]) => (key === 'command' ? value === 'hippo' || value === 'hippo.cmd' : isDeepStrictEqual(value, ours[key])));
|
|
@@ -103,15 +105,15 @@ function readMcpConfig(file, host) {
|
|
|
103
105
|
return null;
|
|
104
106
|
}
|
|
105
107
|
}
|
|
106
|
-
if (!
|
|
108
|
+
if (!isJsonObjectLiteral(config))
|
|
107
109
|
return null;
|
|
108
110
|
if (config[host.key] === undefined)
|
|
109
111
|
config[host.key] = {};
|
|
110
112
|
const servers = config[host.key];
|
|
111
|
-
return
|
|
113
|
+
return isJsonObjectLiteral(servers) ? { config, servers } : null;
|
|
112
114
|
}
|
|
113
115
|
/** 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. */
|
|
114
|
-
|
|
116
|
+
function mergeMcpServer(file, host = COPILOT_CLI_MCP) {
|
|
115
117
|
const read = readMcpConfig(file, host);
|
|
116
118
|
if (read === null)
|
|
117
119
|
return 'unreadable';
|
|
@@ -172,7 +174,7 @@ function withCopilotBlock(text, found) {
|
|
|
172
174
|
return `${text}${text.endsWith('\n') ? '\n' : '\n\n'}${block}`;
|
|
173
175
|
}
|
|
174
176
|
/** 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. */
|
|
175
|
-
|
|
177
|
+
function ensureInstructionsBlock(file) {
|
|
176
178
|
const old = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';
|
|
177
179
|
const found = hippoBlock(old);
|
|
178
180
|
if (found === null && old.includes(HOOK_MARKERS.start))
|
|
@@ -182,8 +184,7 @@ export function ensureInstructionsBlock(file) {
|
|
|
182
184
|
const next = withCopilotBlock(old, found);
|
|
183
185
|
if (next === old)
|
|
184
186
|
return 'present';
|
|
185
|
-
|
|
186
|
-
fs.writeFileSync(file, next, 'utf8');
|
|
187
|
+
writeFileAtomic(file, next);
|
|
187
188
|
return 'written';
|
|
188
189
|
}
|
|
189
190
|
/** `text` without the block and its markers, plus the line break after the end marker, else the one before the start marker. */
|
|
@@ -208,7 +209,7 @@ export function removeInstructionsBlock(file) {
|
|
|
208
209
|
if (left.trim() === '')
|
|
209
210
|
fs.rmSync(file);
|
|
210
211
|
else
|
|
211
|
-
|
|
212
|
+
writeFileAtomic(file, left);
|
|
212
213
|
return 'removed';
|
|
213
214
|
}
|
|
214
215
|
/** The file is hippo's alone, so it is written whole; an earlier hippo text is upgraded, and any other text already there stays. */
|
|
@@ -220,8 +221,7 @@ export function ensureVscodeInstructions(file) {
|
|
|
220
221
|
if (!isHipposVscodeInstructions(old))
|
|
221
222
|
return 'kept';
|
|
222
223
|
}
|
|
223
|
-
|
|
224
|
-
fs.writeFileSync(file, VSCODE_INSTRUCTIONS, 'utf8');
|
|
224
|
+
writeFileAtomic(file, VSCODE_INSTRUCTIONS);
|
|
225
225
|
return 'written';
|
|
226
226
|
}
|
|
227
227
|
/** Deletes the file only when it still holds exactly what a hippo release wrote. */
|