hippo-memory 1.68.0 → 1.70.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.d.ts +3 -1
- package/dist/agent-memories/copilot.js +5 -4
- package/dist/agent-memories/files.js +3 -2
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +1 -1
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +1 -1
- package/dist/agent-memories/sync.js +24 -33
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +2 -2
- package/dist/api/assemble.js +42 -32
- package/dist/api/audit.d.ts +4 -7
- package/dist/api/audit.js +6 -20
- package/dist/api/auth.d.ts +5 -18
- package/dist/api/auth.js +44 -194
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
- package/dist/{availability.js → api/availability.js} +12 -29
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +14 -4
- package/dist/api/context-select.js +50 -60
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +113 -85
- package/dist/api/dormant.d.ts +3 -3
- package/dist/api/dormant.js +38 -107
- package/dist/api/drill-down.d.ts +2 -2
- package/dist/api/drill-down.js +37 -65
- package/dist/api/forget.d.ts +4 -13
- package/dist/api/forget.js +13 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/index.d.ts +26 -0
- package/dist/api/index.js +29 -0
- package/dist/api/instruction-detect.js +74 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +20 -0
- package/dist/api/ledger-db.js +79 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +36 -0
- package/dist/api/outcome.d.ts +9 -46
- package/dist/api/outcome.js +15 -57
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/promote.d.ts +7 -18
- package/dist/api/promote.js +30 -152
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
- package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +112 -0
- package/dist/{recall-history.js → api/recall-history.js} +30 -25
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +41 -16
- package/dist/api/recall.d.ts +1 -1
- package/dist/api/recall.js +39 -37
- package/dist/api/remember.d.ts +12 -13
- package/dist/api/remember.js +38 -27
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -7
- package/dist/api/sleep-run.js +63 -75
- package/dist/api/sleep.d.ts +1 -1
- package/dist/api/tokens.d.ts +2 -2
- package/dist/api/tokens.js +9 -21
- package/dist/api/types.d.ts +2 -2
- package/dist/api/types.js +1 -1
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +1 -1
- package/dist/capture/command.js +54 -41
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +4 -1
- package/dist/capture/compact.js +59 -22
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
- package/dist/capture/copilot-transcript.d.ts +3 -0
- package/dist/capture/copilot-transcript.js +9 -2
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
- package/dist/{session-digest.js → capture/session-digest.js} +17 -23
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.d.ts +13 -0
- package/dist/capture/session-worker.js +196 -0
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.js +68 -74
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
- package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +77 -72
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +18 -20
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +59 -181
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +25 -23
- package/dist/{client.d.ts → cli/client.d.ts} +1 -1
- package/dist/{client.js → cli/client.js} +1 -1
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +39 -0
- package/dist/cli/context.d.ts +2 -13
- package/dist/cli/context.js +41 -71
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +109 -99
- package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
- package/dist/cli/curate.d.ts +9 -9
- package/dist/cli/curate.js +177 -149
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +46 -34
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +108 -218
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +43 -31
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +35 -19
- package/dist/cli/flag-values.d.ts +25 -0
- package/dist/cli/flag-values.js +103 -0
- package/dist/cli/flags.d.ts +303 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +39 -34
- package/dist/cli/hook-runtime.d.ts +49 -0
- package/dist/cli/hook-runtime.js +155 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +151 -118
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +110 -0
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +9 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +31 -27
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +65 -0
- package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
- package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +77 -280
- package/dist/cli/print.d.ts +18 -0
- package/dist/cli/print.js +85 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -49
- package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +101 -150
- package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
- package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
- package/dist/cli/remember.d.ts +1 -3
- package/dist/cli/remember.js +124 -103
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
- package/dist/{scheduler.js → cli/scheduler.js} +13 -7
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +34 -4
- package/dist/cli/session-hooks.d.ts +4 -4
- package/dist/cli/session-hooks.js +265 -191
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +111 -45
- package/dist/cli/shared.d.ts +5 -95
- package/dist/cli/shared.js +18 -369
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +31 -55
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +2 -8
- package/dist/cli/sleep.js +20 -76
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +39 -41
- package/dist/{stdin.js → cli/stdin.js} +6 -6
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +68 -42
- package/dist/cli/usage.js +8 -3
- package/dist/cli.d.ts +289 -5
- package/dist/cli.js +184 -117
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +1 -1
- package/dist/connectors/github/backfill.js +29 -66
- package/dist/connectors/github/cli-impl.js +59 -74
- package/dist/connectors/github/deletion.d.ts +5 -6
- package/dist/connectors/github/deletion.js +18 -52
- package/dist/connectors/github/dlq.d.ts +7 -61
- package/dist/connectors/github/dlq.js +19 -119
- package/dist/connectors/github/ingest.d.ts +2 -31
- package/dist/connectors/github/ingest.js +20 -82
- package/dist/connectors/github/octokit-client.d.ts +1 -1
- package/dist/connectors/github/octokit-client.js +2 -1
- package/dist/connectors/github/tenant-routing.d.ts +2 -2
- package/dist/connectors/github/tenant-routing.js +10 -36
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/types.d.ts +1 -1
- package/dist/connectors/github/types.js +15 -18
- package/dist/connectors/github/webhook.d.ts +3 -2
- package/dist/connectors/github/webhook.js +84 -87
- package/dist/connectors/slack/backfill.d.ts +1 -1
- package/dist/connectors/slack/backfill.js +5 -29
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -48
- package/dist/connectors/slack/dlq.d.ts +7 -49
- package/dist/connectors/slack/dlq.js +25 -118
- package/dist/connectors/slack/ingest.d.ts +5 -18
- package/dist/connectors/slack/ingest.js +27 -90
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.js +13 -14
- package/dist/connectors/slack/transform.d.ts +1 -1
- package/dist/connectors/slack/types.d.ts +1 -1
- package/dist/connectors/slack/types.js +3 -12
- package/dist/connectors/slack/web-client.js +2 -2
- package/dist/connectors/slack/webhook.d.ts +3 -2
- package/dist/connectors/slack/webhook.js +75 -82
- package/dist/connectors/slack/workspaces.d.ts +4 -17
- package/dist/connectors/slack/workspaces.js +4 -34
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +4 -4
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
- package/dist/{dag.js → consolidate/dag.js} +60 -81
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +28 -22
- package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
- package/dist/consolidate/flush-units.d.ts +2 -2
- package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
- package/dist/consolidate/half-life-migration.js +106 -0
- package/dist/consolidate/llm-passes.js +8 -8
- package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
- package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
- package/dist/consolidate/merge.js +57 -54
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
- package/dist/consolidate/physics-pass.js +46 -46
- package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
- package/dist/{replay.js → consolidate/replay.js} +2 -2
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +1 -1
- package/dist/consolidate/sleep.js +64 -134
- package/dist/{trace.js → consolidate/trace.js} +4 -6
- package/dist/consolidate/traces.js +34 -29
- package/dist/{ablation.js → core/ablation.js} +1 -1
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.js → core/ambient.js} +12 -10
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/core/capture-contract.js +149 -0
- package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
- package/dist/{compare.js → core/compare.js} +10 -3
- package/dist/{config.d.ts → core/config.d.ts} +6 -6
- package/dist/{config.js → core/config.js} +99 -72
- package/dist/core/handoff.js +87 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
- package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
- package/dist/{memory.js → core/memory.js} +117 -82
- package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
- package/dist/{physics.js → core/physics.js} +2 -1
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
- package/dist/{project-identity.js → core/project-identity.js} +5 -17
- package/dist/{project-remote.js → core/project-remote.js} +4 -4
- package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
- package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
- package/dist/{salience.js → core/salience.js} +35 -20
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
- package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +18 -1
- package/dist/db/busy.js +74 -9
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +25 -30
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -35
- package/dist/db/migrations/v16.js +29 -26
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v20.js +4 -2
- package/dist/db/migrations/v22.js +39 -36
- package/dist/db/migrations/v24.js +27 -22
- package/dist/db/migrations/v29.js +37 -32
- package/dist/db/migrations/v31.js +36 -31
- package/dist/db/migrations/v35.js +1 -1
- package/dist/db/migrations/v39.js +1 -1
- package/dist/db/migrations/v40.js +15 -14
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +1 -1
- package/dist/db/migrations/v45.js +1 -1
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +1 -1
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +9 -1
- package/dist/db/open.js +21 -4
- package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
- package/dist/{physics-state.js → db/physics-state.js} +9 -16
- package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
- package/dist/{vector-store.js → db/vector-store.js} +76 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +105 -136
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +3 -3
- package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
- package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
- package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
- package/dist/{eval.js → eval/eval.js} +29 -22
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
- package/dist/{judgment.js → eval/judgment.js} +4 -9
- package/dist/extensions/openclaw-plugin/index.js +1 -2
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
- package/dist/{graph-extract.js → graph/extract.js} +37 -52
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
- package/dist/{graph-recall.js → graph/recall.js} +55 -36
- package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
- package/dist/{graph-stream.js → graph/stream.js} +9 -7
- package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
- package/dist/{graph-view.js → graph/view.js} +127 -167
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +14 -15
- package/dist/hooks/copilot.d.ts +48 -13
- package/dist/hooks/copilot.js +124 -39
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +3 -1
- package/dist/hooks/json-hooks.js +40 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +7 -5
- package/dist/hooks/shared.js +19 -8
- package/dist/importers/core.d.ts +2 -6
- package/dist/importers/core.js +41 -39
- package/dist/importers/markdown-parse.d.ts +1 -10
- package/dist/importers/markdown-parse.js +2 -19
- package/dist/importers/markdown.js +2 -1
- package/dist/importers/sources.js +50 -46
- package/dist/importers/vault.js +71 -92
- package/dist/index.d.ts +22 -22
- package/dist/index.js +21 -21
- package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
- package/dist/{autolearn.js → learn/autolearn.js} +13 -11
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +125 -0
- package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
- package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
- package/dist/{invalidation.js → learn/invalidation.js} +83 -99
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +37 -60
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.d.ts +2 -2
- package/dist/mcp/memory-tools.js +12 -31
- package/dist/mcp/protocol.d.ts +6 -10
- package/dist/mcp/protocol.js +8 -14
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +68 -50
- package/dist/mcp/request.js +65 -63
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/session-state.d.ts +1 -2
- package/dist/mcp/session-state.js +2 -2
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.js +69 -31
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +2 -2
- package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
- package/dist/objects/customer-notes.js +112 -0
- package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
- package/dist/objects/decisions.js +101 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
- package/dist/objects/incidents.js +130 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
- package/dist/objects/policies.js +189 -0
- package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
- package/dist/objects/processes.js +146 -0
- package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
- package/dist/objects/project-briefs.js +255 -0
- package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
- package/dist/objects/skills.js +156 -0
- package/dist/postinstall.js +4 -2
- package/dist/predictions/planning-fallacy.d.ts +4 -76
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +27 -47
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +15 -23
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +30 -49
- package/dist/rerankers/llm.d.ts +2 -4
- package/dist/rerankers/llm.js +33 -50
- package/dist/rerankers/outage-warning.d.ts +7 -0
- package/dist/rerankers/outage-warning.js +31 -0
- package/dist/rerankers/remote.d.ts +3 -0
- package/dist/rerankers/remote.js +23 -0
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -1
- package/dist/search/boosts.js +34 -13
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +4 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +7 -5
- package/dist/{path-context.js → search/path-context.js} +3 -1
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +15 -15
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +3 -3
- package/dist/search/vector.js +17 -11
- package/dist/server/auth.d.ts +1 -1
- package/dist/server/auth.js +26 -18
- package/dist/server/boot.d.ts +24 -0
- package/dist/server/boot.js +465 -0
- package/dist/server/client-ip.d.ts +5 -1
- package/dist/server/client-ip.js +18 -6
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/key-check-bounds.d.ts +8 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.js +1 -1
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +34 -24
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +10 -4
- package/dist/server/request.js +63 -12
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +209 -0
- package/dist/server/routes/admin.js +13 -8
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +32 -97
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +42 -105
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +42 -95
- package/dist/server/routes/memories.js +21 -20
- package/dist/server/routes/object-routes.d.ts +40 -0
- package/dist/server/routes/object-routes.js +80 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +40 -124
- package/dist/server/routes/predictions.js +29 -45
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +38 -118
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +38 -110
- package/dist/server/routes/recall.js +14 -12
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +37 -125
- package/dist/{server-detect.js → server/server-detect.js} +3 -2
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +70 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +27 -8
- package/dist/server/validation.d.ts +3 -4
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +41 -50
- package/dist/server.js +26 -560
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
- package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
- package/dist/{scope.js → sharing/scope.js} +1 -1
- package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
- package/dist/{shared.js → sharing/shared.js} +100 -77
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +10 -10
- package/dist/store/audit-event.d.ts +12 -6
- package/dist/store/audit-event.js +6 -5
- package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
- package/dist/{audit.js → store/audit.js} +91 -6
- package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
- package/dist/{auth.js → store/auth.js} +100 -92
- package/dist/store/candidates.d.ts +23 -12
- package/dist/store/candidates.js +87 -35
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
- package/dist/{card-detail.js → store/card-detail.js} +1 -1
- package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
- package/dist/{store-cards.js → store/cards.js} +85 -146
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +22 -5
- package/dist/store/conflicts.js +160 -109
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +92 -0
- package/dist/store/delete-and-batch.d.ts +20 -24
- package/dist/store/delete-and-batch.js +64 -40
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +51 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
- package/dist/{dormant.js → store/dormant.js} +151 -6
- package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
- package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
- package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
- package/dist/store/entry-reads.d.ts +46 -7
- package/dist/store/entry-reads.js +120 -21
- package/dist/store/entry-row.d.ts +8 -2
- package/dist/store/entry-row.js +28 -8
- package/dist/store/entry-writes.d.ts +33 -4
- package/dist/store/entry-writes.js +108 -26
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
- package/dist/{goals.js → store/goals.js} +45 -94
- package/dist/store/graph-queue.d.ts +29 -0
- package/dist/store/graph-queue.js +101 -0
- package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
- package/dist/{graph/read.js → store/graph-reads.js} +63 -115
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
- package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
- package/dist/store/graph-view-rows.d.ts +12 -0
- package/dist/store/graph-view-rows.js +67 -0
- package/dist/store/graph-writes.d.ts +58 -0
- package/dist/store/graph-writes.js +256 -0
- package/dist/store/half-life.d.ts +34 -0
- package/dist/store/half-life.js +77 -0
- package/dist/store/handoffs.d.ts +6 -3
- package/dist/store/handoffs.js +70 -31
- package/dist/store/index-and-stats.d.ts +8 -1
- package/dist/store/index-and-stats.js +51 -48
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +1 -1
- package/dist/store/markdown.js +4 -3
- package/dist/store/mirrors.d.ts +5 -7
- package/dist/store/mirrors.js +39 -25
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +8 -4
- package/dist/store/open.js +34 -23
- package/dist/store/planning-fallacy-evidence.d.ts +42 -0
- package/dist/store/planning-fallacy-evidence.js +81 -0
- package/dist/store/port.d.ts +646 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
- package/dist/{predictions/store.js → store/predictions.js} +52 -67
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
- package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
- package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
- package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +162 -0
- package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
- package/dist/{rejection.js → store/rejection.js} +3 -2
- package/dist/store/rows.d.ts +2 -3
- package/dist/store/rows.js +18 -11
- package/dist/store/search-rows.d.ts +15 -4
- package/dist/store/search-rows.js +43 -36
- package/dist/store/sessions.d.ts +18 -2
- package/dist/store/sessions.js +83 -46
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/sqlite/entry-writes-group.js +170 -0
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +59 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +28 -0
- package/dist/store/sqlite/executor.js +286 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +38 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +218 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +314 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +26 -0
- package/dist/store/sqlite/store.js +295 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +124 -0
- package/dist/store/sqlite/worker-ops.js +82 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +76 -0
- package/dist/store/summaries.d.ts +2 -11
- package/dist/store/summaries.js +17 -44
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/store/tenant-lookup.d.ts +1 -1
- package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
- package/dist/{tenant.js → store/tenant.js} +1 -1
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
- package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +26 -0
- package/dist/store/vector-writes.d.ts +10 -3
- package/dist/store/vector-writes.js +35 -5
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
- package/dist/{working-memory.js → store/working-memory.js} +39 -41
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +13 -33
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +67 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +46 -0
- package/dist/util/atomic-write.d.ts +3 -0
- package/dist/util/atomic-write.js +107 -0
- package/dist/util/crash-handlers.d.ts +5 -0
- package/dist/util/crash-handlers.js +30 -0
- package/dist/{env.d.ts → util/env.d.ts} +17 -2
- package/dist/{env.js → util/env.js} +22 -2
- package/dist/util/home-path.js +67 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
- package/dist/{http-retry.js → util/http-retry.js} +38 -7
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +5 -2
- package/dist/{log.js → util/log.js} +12 -3
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +27 -0
- package/dist/util/request-scope.js +47 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +18 -0
- package/dist/util/token-text.js +23 -0
- package/dist/{version.d.ts → util/version.d.ts} +1 -1
- package/dist/{version.js → util/version.js} +1 -1
- package/extensions/openclaw-plugin/index.ts +1 -5
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/capture-contract.js +0 -49
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.js +0 -326
- package/dist/extract.js +0 -133
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/policies.js +0 -434
- package/dist/processes.js +0 -371
- package/dist/project-briefs.js +0 -523
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/skills.js +0 -367
- package/dist/store-port.d.ts +0 -191
- package/dist/store-port.js +0 -166
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
- /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
- /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
- /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
- /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
- /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
- /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
- /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
- /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{card.d.ts → core/card.d.ts} +0 -0
- /package/dist/{card.js → core/card.js} +0 -0
- /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
- /package/dist/{physics-config.js → core/physics-config.js} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
- /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
- /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
- /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
- /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
- /package/dist/{rrf.js → search/rrf.js} +0 -0
- /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
- /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
- /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
- /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
- /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
- /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
- /package/dist/{yaml.js → store/yaml.js} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
- /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
package/dist/api/drill-down.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
// DAG drill-down from a summary to its children.
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
import { classifyOriginProject } from '../project-identity.js';
|
|
2
|
+
import { requireGroup, storeFor } from '../store/index.js';
|
|
3
|
+
import { estimateTokens } from '../util/token-text.js';
|
|
4
|
+
import { passesScopeFilterForRecall, personalScopeOf } from '../store/recall-scope.js';
|
|
5
|
+
import { classifyOriginProject } from '../core/project-identity.js';
|
|
6
|
+
const DEFAULT_DRILL_DOWN_LIMIT = 50;
|
|
8
7
|
/**
|
|
9
8
|
* Walk one step down the DAG from a level-2 (or higher) summary to its direct
|
|
10
9
|
* children. Companion to `recall(... summarizeOverflow: true)` — when recall
|
|
@@ -24,47 +23,48 @@ import { classifyOriginProject } from '../project-identity.js';
|
|
|
24
23
|
* Pre-v1.6.4 returned null for all three cases. JS callers migrate via
|
|
25
24
|
* `'failure' in result` checks; HTTP route maps `not_drillable` to 422.
|
|
26
25
|
*/
|
|
27
|
-
export function drillDown(ctx, summaryId, opts = {}) {
|
|
28
|
-
const limit = opts.limit ??
|
|
26
|
+
export async function drillDown(ctx, summaryId, opts = {}) {
|
|
27
|
+
const limit = opts.limit ?? DEFAULT_DRILL_DOWN_LIMIT;
|
|
29
28
|
// v0.30 / E5: depth defaults 1 (backward compat); hard cap 10 levels
|
|
30
29
|
// prevents pathological deep trees. CLI/HTTP/MCP reject invalid values.
|
|
31
30
|
const depth = Math.max(1, Math.min(Math.trunc(opts.depth ?? 1), 10));
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
const own = personalScopeOf(ctx.actor) ?? undefined;
|
|
32
|
+
const readable = (row) => passesScopeFilterForRecall(row.scope ?? null, undefined, own)
|
|
33
|
+
&& (!opts.project || classifyOriginProject(row.origin_project, opts.project) !== 'cross-project');
|
|
34
|
+
const pastLimit = Math.floor(limit) + 1;
|
|
35
|
+
const walked = await requireGroup(storeFor(ctx), 'dagReads').summaryWithDescendants(ctx.tenantId, summaryId, {
|
|
36
|
+
depth,
|
|
37
|
+
// A leaf answers not_drillable, so nothing under it is read.
|
|
38
|
+
admit: (row) => readable(row) && (row.id !== summaryId || isDrillable(row)),
|
|
39
|
+
page: limit >= 0 && Number.isSafeInteger(pastLimit) ? { rows: pastLimit, admit: readable } : undefined,
|
|
40
|
+
});
|
|
42
41
|
// No unscoped cross-tenant probe here: the tenant-scoped read's miss covers
|
|
43
42
|
// both "doesn't exist" and "exists in another tenant" by design.
|
|
44
43
|
// Distinguishing them via an unscoped lookup would leak existence to
|
|
45
44
|
// unauthorised tenants. The two cases collapse into not_found.
|
|
46
|
-
if (!
|
|
45
|
+
if (!walked)
|
|
47
46
|
return { failure: 'not_found' };
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
// "scope_blocked" tells a no-scope caller "this row exists, just
|
|
52
|
-
// not for you" — same existence-leak the HTTP 404 collapse was
|
|
53
|
-
// already preventing. Match the HTTP behaviour at the API level.
|
|
54
|
-
return { failure: 'not_found' };
|
|
55
|
-
}
|
|
56
|
-
const shown = (row) => !opts.project || classifyOriginProject(row.origin_project, opts.project) !== 'cross-project';
|
|
57
|
-
if (!shown(summary))
|
|
47
|
+
// A distinguishable "scope_blocked" would tell a no-scope caller "this row
|
|
48
|
+
// exists, just not for you", the existence leak the HTTP 404 collapse prevents.
|
|
49
|
+
if (!readable(walked.summary))
|
|
58
50
|
return { failure: 'not_found' };
|
|
59
|
-
if ((summary
|
|
51
|
+
if (!isDrillable(walked.summary))
|
|
60
52
|
return { failure: 'not_drillable' };
|
|
61
|
-
|
|
53
|
+
return drillResult(walked, opts, limit);
|
|
54
|
+
}
|
|
55
|
+
function isDrillable(row) {
|
|
56
|
+
return (row.dag_level ?? 0) >= 2;
|
|
57
|
+
}
|
|
58
|
+
function drillResult({ summary, levels, sizes: counted }, opts, limit) {
|
|
59
|
+
const collected = levels.flat();
|
|
60
|
+
const sizes = counted ?? levels.map((level) => level.length);
|
|
61
|
+
const total = sizes.reduce((sum, n) => sum + n, 0);
|
|
62
62
|
const summaryOut = {
|
|
63
63
|
id: summary.id,
|
|
64
64
|
content: summary.content,
|
|
65
65
|
// v0.30 / E5: the STORED direct-child count; the legacy fallback counts
|
|
66
66
|
// level-0 children, never the BFS-depth-N total (independent-review MED #4).
|
|
67
|
-
descendantCount: summary.descendant_count ??
|
|
67
|
+
descendantCount: summary.descendant_count ?? (sizes[0] ?? 0),
|
|
68
68
|
earliestAt: summary.earliest_at ?? null,
|
|
69
69
|
latestAt: summary.latest_at ?? null,
|
|
70
70
|
};
|
|
@@ -75,54 +75,26 @@ function drillDownOn(db, ctx, summaryId, depth, opts, limit) {
|
|
|
75
75
|
dagLevel: c.dag_level ?? 0,
|
|
76
76
|
created: c.created,
|
|
77
77
|
}));
|
|
78
|
-
const
|
|
78
|
+
const fixed = opts.budget !== undefined ? opts.cost?.fixed(summaryOut, total) ?? 0 : 0;
|
|
79
|
+
const { children, truncated } = capChildren(all, fixed, opts, limit);
|
|
79
80
|
return {
|
|
80
81
|
summary: summaryOut,
|
|
81
82
|
children,
|
|
82
83
|
// v0.30 / E5: totalChildren = BFS-collected count (depth-aware). For
|
|
83
84
|
// depth=1 this equals the eligible direct-children count (backward
|
|
84
85
|
// compat). For depth>1 it is the cumulative count across levels.
|
|
85
|
-
totalChildren:
|
|
86
|
+
totalChildren: total,
|
|
86
87
|
truncated,
|
|
87
88
|
};
|
|
88
89
|
}
|
|
89
|
-
// BFS with a visited set: dag_parent_id is not unique, so a misconfigured tree could emit a child twice past depth 1.
|
|
90
|
-
// The level-0 count is kept apart so a legacy summary's descendantCount fallback counts direct children only.
|
|
91
|
-
function collectDescendants(db, tenantId, summaryId, depth, own, shown) {
|
|
92
|
-
const collected = [];
|
|
93
|
-
const visited = new Set([summaryId]);
|
|
94
|
-
let frontier = [summaryId];
|
|
95
|
-
let level0DirectCount = 0;
|
|
96
|
-
for (let level = 0; level < depth; level++) {
|
|
97
|
-
const nextFrontier = [];
|
|
98
|
-
const kidsByParent = selectChildrenByParent(db, frontier, tenantId);
|
|
99
|
-
for (const parentId of frontier) {
|
|
100
|
-
const kids = kidsByParent.get(parentId) ?? [];
|
|
101
|
-
const eligibleKids = kids.filter((c) => passesScopeFilterForRecall(c.scope ?? null, undefined, own) && shown(c));
|
|
102
|
-
for (const k of eligibleKids) {
|
|
103
|
-
if (visited.has(k.id))
|
|
104
|
-
continue;
|
|
105
|
-
visited.add(k.id);
|
|
106
|
-
collected.push(k);
|
|
107
|
-
nextFrontier.push(k.id);
|
|
108
|
-
if (level === 0)
|
|
109
|
-
level0DirectCount++;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
if (nextFrontier.length === 0)
|
|
113
|
-
break;
|
|
114
|
-
frontier = nextFrontier;
|
|
115
|
-
}
|
|
116
|
-
return { collected, level0DirectCount };
|
|
117
|
-
}
|
|
118
90
|
/** Global cumulative token budget first, then the `limit` cap. */
|
|
119
|
-
function capChildren(all,
|
|
91
|
+
function capChildren(all, fixed, opts, limit) {
|
|
120
92
|
let children = all;
|
|
121
93
|
let truncated = false;
|
|
122
94
|
if (opts.budget !== undefined) {
|
|
123
95
|
const out = [];
|
|
124
96
|
let used = 0;
|
|
125
|
-
const room = opts.budget -
|
|
97
|
+
const room = opts.budget - fixed;
|
|
126
98
|
for (const c of all) {
|
|
127
99
|
const t = opts.cost ? opts.cost.child(c) : estimateTokens(c.content);
|
|
128
100
|
if (out.length > 0 && used + t > room) {
|
package/dist/api/forget.d.ts
CHANGED
|
@@ -1,20 +1,11 @@
|
|
|
1
|
-
import type { RejectedValueRow } from '../rejection.js';
|
|
2
|
-
import type { Context } from './types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Delete a memory by id. `deleteEntry` threads ctx.actor.subject into its internal
|
|
5
|
-
* audit hook, so exactly one 'forget' event lands with the supplied actor.
|
|
6
|
-
*
|
|
7
|
-
* Tenant scope: deleteEntry looks up the row by id alone, so without an
|
|
8
|
-
* explicit tenant guard a Bearer for tenant A could delete tenant B's row
|
|
9
|
-
* by guessing or leaking the id. Pre-check the row's tenant_id and deny
|
|
10
|
-
* cross-tenant access with a not-found error (no info leak about whether
|
|
11
|
-
* the id exists in another tenant).
|
|
12
|
-
*/
|
|
1
|
+
import type { RejectedValueRow } from '../store/rejection.js';
|
|
2
|
+
import type { Context, StoreReply } from './types.js';
|
|
3
|
+
/** Delete a memory by id. Reach is checked inside the delete's write scope, and a row out of reach answers as not found, so a caller learns nothing about it. */
|
|
13
4
|
export interface ForgetResult {
|
|
14
5
|
ok: true;
|
|
15
6
|
id: string;
|
|
16
7
|
}
|
|
17
|
-
export declare function forget(ctx:
|
|
8
|
+
export declare function forget<C extends Context>(ctx: C, id: string): StoreReply<C, ForgetResult>;
|
|
18
9
|
export interface RejectOpts {
|
|
19
10
|
/** By-id form: reject the CURRENT content of an existing memory. */
|
|
20
11
|
memoryId?: string;
|
package/dist/api/forget.js
CHANGED
|
@@ -1,31 +1,15 @@
|
|
|
1
1
|
// Forget a memory, and reject or unreject a value so it cannot be stored again.
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { selectMemoryReach } from '../store/tenant-lookup.js';
|
|
8
|
-
import { canTouchScope, personalScopeOf } from '../recall-scope.js';
|
|
2
|
+
import { BadRequestError, NotFoundError } from '../core/api-errors.js';
|
|
3
|
+
import { rejectValue, unrejectValue, listRejectionsForTenant } from '../trust/reject-flow.js';
|
|
4
|
+
import { andThen, notPorted, onStore } from './on-store.js';
|
|
5
|
+
import { readEntry } from '../store/entry-reads.js';
|
|
6
|
+
import { canTouchScope, personalScopeOf } from '../store/recall-scope.js';
|
|
9
7
|
export function forget(ctx, id) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
finally {
|
|
18
|
-
closeHippoDb(db);
|
|
19
|
-
}
|
|
20
|
-
const removed = deleteEntry(ctx.hippoRoot, id, { actor: ctx.actor.subject });
|
|
21
|
-
if (!removed) {
|
|
22
|
-
throw new NotFoundError(`memory not found: ${id}`);
|
|
23
|
-
}
|
|
24
|
-
// Counted here, not in the CLI: both callers of this function (cmdForget and
|
|
25
|
-
// the HTTP route) are the two paths of one user command, so neither can miss
|
|
26
|
-
// it. api.remember cannot take the same move; see the server route.
|
|
27
|
-
updateStatsUnlessBusy(ctx.hippoRoot, { forgotten: 1 }, `removed ${id}`);
|
|
28
|
-
return { ok: true, id };
|
|
8
|
+
return onStore(ctx, (port) => {
|
|
9
|
+
const entryWrites = port.entryWrites ?? notPorted(port, 'entryWrites');
|
|
10
|
+
const removal = { tenantId: ctx.tenantId, actor: ctx.actor.subject, ownScope: personalScopeOf(ctx.actor), id };
|
|
11
|
+
return andThen(entryWrites.forget(removal), () => ({ ok: true, id }));
|
|
12
|
+
});
|
|
29
13
|
}
|
|
30
14
|
/**
|
|
31
15
|
* Reject a value: tombstone its normalized digest so a matching write is
|
|
@@ -46,15 +30,9 @@ export function reject(ctx, opts) {
|
|
|
46
30
|
// Tenant scope, same not-found-shaped denial as forget/promote above:
|
|
47
31
|
// rejectValue itself also tenant-checks the id, but pre-checking here
|
|
48
32
|
// keeps the error message consistent with the rest of this module.
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (reach?.tenantId !== ctx.tenantId || !canTouchScope(ctx.actor, reach.scope)) {
|
|
53
|
-
throw new NotFoundError(`memory not found: ${opts.memoryId}`);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
finally {
|
|
57
|
-
closeHippoDb(db);
|
|
33
|
+
const entry = readEntry(ctx.hippoRoot, opts.memoryId);
|
|
34
|
+
if (entry?.tenantId !== ctx.tenantId || !canTouchScope(ctx.actor, entry.scope)) {
|
|
35
|
+
throw new NotFoundError(`memory not found: ${opts.memoryId}`);
|
|
58
36
|
}
|
|
59
37
|
}
|
|
60
38
|
const result = rejectValue({
|
package/dist/api/goals.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CompleteGoalOpts, type Goal, type PushGoalOpts } from '../goals.js';
|
|
1
|
+
import { type CompleteGoalOpts, type Goal, type PushGoalOpts } from '../store/goals.js';
|
|
2
2
|
import type { Context } from './types.js';
|
|
3
3
|
/** What a new goal carries; its tenant is always the caller's. */
|
|
4
4
|
export type GoalPushOpts = Omit<PushGoalOpts, 'tenantId'>;
|
package/dist/api/goals.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// The per-session goal stack that recall boosts: push, list, complete, suspend and resume.
|
|
2
|
-
import { ForbiddenError } from '../api-errors.js';
|
|
3
|
-
import { completeGoal, getActiveGoals, getSessionGoals, pushGoal, resumeGoal, suspendGoal, } from '../goals.js';
|
|
2
|
+
import { ForbiddenError } from '../core/api-errors.js';
|
|
3
|
+
import { completeGoal, getActiveGoals, getSessionGoals, pushGoal, resumeGoal, suspendGoal, } from '../store/goals.js';
|
|
4
4
|
/** Push a goal onto `sessionId`'s stack in the caller's tenant. */
|
|
5
5
|
export function goalPush(ctx, opts) {
|
|
6
6
|
return pushGoal(ctx.hippoRoot, { ...opts, tenantId: ctx.tenantId });
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export { ApiError, BadRequestError, ConflictError, ForbiddenError, NotFoundError } from '../core/api-errors.js';
|
|
2
|
+
export { isPrivateScope, passesScopeFilterForRecall } from '../store/recall-scope.js';
|
|
3
|
+
export { passesCliRecallScopeFilter, ScopeForbiddenError } from '../store/recall-scope.js';
|
|
4
|
+
export type { TokenSummary, TokenSurface, TokenSurfaceSummary } from '../store/token-ledger.js';
|
|
5
|
+
export type { FailureSummary } from '../store/failure-log.js';
|
|
6
|
+
export { classifyOriginProject } from '../core/project-identity.js';
|
|
7
|
+
export * from './types.js';
|
|
8
|
+
export * from './remember.js';
|
|
9
|
+
export * from './recall-types.js';
|
|
10
|
+
export * from './recall.js';
|
|
11
|
+
export * from './assemble.js';
|
|
12
|
+
export * from './drill-down.js';
|
|
13
|
+
export * from './outcome.js';
|
|
14
|
+
export * from './forget.js';
|
|
15
|
+
export * from './promote.js';
|
|
16
|
+
export * from './auth.js';
|
|
17
|
+
export * from './audit.js';
|
|
18
|
+
export * from './context-types.js';
|
|
19
|
+
export * from './context.js';
|
|
20
|
+
export * from './tokens.js';
|
|
21
|
+
export * from './dormant.js';
|
|
22
|
+
export * from './quarantine.js';
|
|
23
|
+
export * from './sleep.js';
|
|
24
|
+
export * from './goals.js';
|
|
25
|
+
export * from './learn.js';
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Domain API layer: Context-taking functions that the CLI, the HTTP server and MCP all call, so the
|
|
2
|
+
// business logic lives in one place. The code lives in src/api/, one module per domain; this barrel
|
|
3
|
+
// keeps every import path that callers already use.
|
|
4
|
+
export { ApiError, BadRequestError, ConflictError, ForbiddenError, NotFoundError } from '../core/api-errors.js';
|
|
5
|
+
// The recall-side scope predicates live in recall-scope.ts (leaf) so shared.ts can use them without an import cycle.
|
|
6
|
+
export { isPrivateScope, passesScopeFilterForRecall } from '../store/recall-scope.js';
|
|
7
|
+
export { passesCliRecallScopeFilter, ScopeForbiddenError } from '../store/recall-scope.js';
|
|
8
|
+
// classifyOriginProject lives in project-identity.ts (leaf) for the same reason.
|
|
9
|
+
export { classifyOriginProject } from '../core/project-identity.js';
|
|
10
|
+
export * from './types.js';
|
|
11
|
+
export * from './remember.js';
|
|
12
|
+
export * from './recall-types.js';
|
|
13
|
+
export * from './recall.js';
|
|
14
|
+
export * from './assemble.js';
|
|
15
|
+
export * from './drill-down.js';
|
|
16
|
+
export * from './outcome.js';
|
|
17
|
+
export * from './forget.js';
|
|
18
|
+
export * from './promote.js';
|
|
19
|
+
export * from './auth.js';
|
|
20
|
+
export * from './audit.js';
|
|
21
|
+
export * from './context-types.js';
|
|
22
|
+
export * from './context.js';
|
|
23
|
+
export * from './tokens.js';
|
|
24
|
+
export * from './dormant.js';
|
|
25
|
+
export * from './quarantine.js';
|
|
26
|
+
export * from './sleep.js';
|
|
27
|
+
export * from './goals.js';
|
|
28
|
+
export * from './learn.js';
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/** Prompt-injection detection for untrusted memory content. Same shape as secret-detect.ts; leaf module, no store/api/shared imports. */
|
|
2
|
+
const INSTRUCTION_PATTERNS = [
|
|
3
|
+
{ name: 'override-instructions', re: /\b(?:ignore|disregard|forget)\b[^.\n]{0,40}\b(?:previous|prior|above)\b[^.\n]{0,40}\binstructions?\b/i },
|
|
4
|
+
{ name: 'role-reassignment', re: /\b(?:you are now|act as|pretend to be)\b[^.\n]{0,40}\b(?:an?\s+)?(?:ai|assistant|agent|system)\b/i },
|
|
5
|
+
{ name: 'chat-role-markup', re: /<\|im_start\|>|<\|system\|>|\[INST\]|<\/?system>|###\s*system\s*:/i },
|
|
6
|
+
{ name: 'system-prompt-reference', re: /\b(?:(?:override|ignore|bypass|replace|reveal)\b[^.\n]{0,40}\b(?:system prompt|developer message)|(?:system prompt|developer message)\b[^.\n]{0,40}\b(?:override|ignore|bypass|replace|reveal))\b/i },
|
|
7
|
+
// "always"/"never" alone (ordinary PR prose) doesn't flag without an agent-facing target nearby too.
|
|
8
|
+
{ name: 'standing-order', re: /\b(?:from now on|whenever you|always|never)\b[^.\n]{0,50}\b(?:you must|(?:the ai|the assistant|the agent|claude|copilot)\s+(?:must|should|will)\b)/i },
|
|
9
|
+
{ name: 'concealment', re: /\b(?:do not|never|don't)\b[^.\n]{0,40}\b(?:tell|mention|reveal)\b[^.\n]{0,40}\bthe user\b/i },
|
|
10
|
+
{ name: 'remote-script-exec', re: /\b(?:curl|wget)\b[^\n|]{0,80}\|\s*(?:sudo\s+)?(?:sh|bash|zsh)\b|\biex\s*\(\s*(?:iwr|invoke-webrequest|new-object\s+net\.webclient)/i },
|
|
11
|
+
{ name: 'exfiltration', re: /\b(?:send|post|upload|exfiltrate)\b[^.\n]{0,40}\b(?:secrets?|tokens?|api[- ]?keys?|credentials?|env(?:ironment)? variables?)\b/i },
|
|
12
|
+
{ name: 'unicode-tag-chars', re: /[\u{E0000}-\u{E007F}]/u },
|
|
13
|
+
];
|
|
14
|
+
// A stray zero-width char has legitimate uses (ZWJ); only a run of 3+ adjacent ones reads as smuggling.
|
|
15
|
+
const ZERO_WIDTH_RUN_RE = /[\u200B-\u200F\u2060-\u2064]{3,}/;
|
|
16
|
+
// Reorders what is drawn without changing a byte a pattern reads, and ordinary right-to-left prose never needs one.
|
|
17
|
+
const BIDI_CONTROL_RE = /[\u202A-\u202E\u2066-\u2069]/;
|
|
18
|
+
// A renderer draws a reference as the character it names: decimal, hex, or one of the five names XML defines.
|
|
19
|
+
const CHARACTER_REFERENCE_RE = /&(?:#(\d{1,7})|#[xX]([0-9a-fA-F]{1,6})|(amp|lt|gt|quot|apos));/g;
|
|
20
|
+
const NAMED_REFERENCES = new Map([['amp', '&'], ['lt', '<'], ['gt', '>'], ['quot', '"'], ['apos', "'"]]);
|
|
21
|
+
// Drawn with no width, so one inside a word splits it for a pattern and not for a reader: soft hyphen, joiners, zero-width and bidi format characters.
|
|
22
|
+
const INVISIBLE_RE = /[\u034F\u00AD\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u2069\uFEFF]/g;
|
|
23
|
+
// Cyrillic, then Greek, letters drawn like a c e i j o p s x y; closed at those, so Russian or Greek prose folds into no phrase a pattern names.
|
|
24
|
+
const LOOKALIKES = new Map([
|
|
25
|
+
['\u0430', 'a'], ['\u0441', 'c'], ['\u0435', 'e'], ['\u0456', 'i'], ['\u0458', 'j'], ['\u043E', 'o'], ['\u0440', 'p'], ['\u0455', 's'], ['\u0445', 'x'], ['\u0443', 'y'],
|
|
26
|
+
['\u0410', 'A'], ['\u0421', 'C'], ['\u0415', 'E'], ['\u0406', 'I'], ['\u0408', 'J'], ['\u041E', 'O'], ['\u0420', 'P'], ['\u0405', 'S'], ['\u0425', 'X'], ['\u0423', 'Y'],
|
|
27
|
+
['\u03B1', 'a'], ['\u03B5', 'e'], ['\u03B9', 'i'], ['\u03F3', 'j'], ['\u03BF', 'o'], ['\u03C1', 'p'], ['\u03C7', 'x'], ['\u03B3', 'y'],
|
|
28
|
+
['\u0391', 'A'], ['\u0395', 'E'], ['\u0399', 'I'], ['\u037F', 'J'], ['\u039F', 'O'], ['\u03A1', 'P'], ['\u03A7', 'X'], ['\u03A5', 'Y'],
|
|
29
|
+
]);
|
|
30
|
+
const GREEK_OR_CYRILLIC_RE = /[\u0370-\u03FF\u0400-\u04FF]/g;
|
|
31
|
+
// A line break stays: it is the sentence bound the patterns rely on where a list or a chat message ends a line with no full stop.
|
|
32
|
+
const SPACE_RUN_RE = /[^\S\n]+/g;
|
|
33
|
+
function referencedCharacter(reference, decimal, hex, name) {
|
|
34
|
+
if (name !== undefined)
|
|
35
|
+
return NAMED_REFERENCES.get(name) ?? reference;
|
|
36
|
+
const code = decimal !== undefined ? Number.parseInt(decimal, 10) : Number.parseInt(hex ?? '', 16);
|
|
37
|
+
// NUL, half a surrogate pair and a number past Unicode name no character, so the reference is read as written.
|
|
38
|
+
const drawn = code > 0 && code <= 0x10ffff && (code < 0xd800 || code > 0xdfff);
|
|
39
|
+
return drawn ? String.fromCodePoint(code) : reference;
|
|
40
|
+
}
|
|
41
|
+
/** `content` as a reader or a model takes it in. For matching only: what is stored is never this. */
|
|
42
|
+
function screeningForm(content) {
|
|
43
|
+
return content
|
|
44
|
+
.replace(CHARACTER_REFERENCE_RE, referencedCharacter)
|
|
45
|
+
// Full-width, mathematical and enclosed letters become the plain ones, and every space character a U+0020.
|
|
46
|
+
.normalize('NFKC')
|
|
47
|
+
.replace(INVISIBLE_RE, '')
|
|
48
|
+
.replace(GREEK_OR_CYRILLIC_RE, (letter) => LOOKALIKES.get(letter) ?? letter)
|
|
49
|
+
.replace(SPACE_RUN_RE, ' ');
|
|
50
|
+
}
|
|
51
|
+
function matchedPattern(text) {
|
|
52
|
+
for (const { name, re } of INSTRUCTION_PATTERNS) {
|
|
53
|
+
if (re.test(text))
|
|
54
|
+
return `pattern:${name}`;
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
export function detectInstruction(content) {
|
|
59
|
+
// The text as written goes first: a phrase in plain sight is named before any smuggling rule, and the screening form only adds flags.
|
|
60
|
+
const plain = matchedPattern(content);
|
|
61
|
+
if (plain !== null)
|
|
62
|
+
return { flagged: true, reason: plain };
|
|
63
|
+
if (ZERO_WIDTH_RUN_RE.test(content)) {
|
|
64
|
+
return { flagged: true, reason: 'pattern:zero-width-smuggling' };
|
|
65
|
+
}
|
|
66
|
+
const screened = screeningForm(content);
|
|
67
|
+
const disguised = screened === content ? null : matchedPattern(screened);
|
|
68
|
+
if (disguised !== null)
|
|
69
|
+
return { flagged: true, reason: disguised };
|
|
70
|
+
if (BIDI_CONTROL_RE.test(content))
|
|
71
|
+
return { flagged: true, reason: 'pattern:bidi-control' };
|
|
72
|
+
return { flagged: false, reason: null };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=instruction-detect.js.map
|
package/dist/api/learn.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
// Git auto-learn: fix/revert/bug commit subjects become memories. `hippo learn`, init, sleep and MCP hippo_learn share it.
|
|
2
|
-
import { ForbiddenError } from '../api-errors.js';
|
|
3
|
-
import { fetchGitLog, extractLessons, partitionLessons, isGitRepo } from '../autolearn.js';
|
|
4
|
-
import { loadConfig } from '../config.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
2
|
+
import { ForbiddenError } from '../core/api-errors.js';
|
|
3
|
+
import { fetchGitLog, extractLessons, partitionLessons, isGitRepo } from '../learn/autolearn.js';
|
|
4
|
+
import { loadConfig } from '../core/config.js';
|
|
5
|
+
import { withRequestStoresSync } from '../db/request-stores.js';
|
|
6
|
+
import { embedMemory } from '../store/embeddings/index.js';
|
|
7
|
+
import { extractInvalidationTarget, invalidateMatchingAmong } from '../learn/invalidation.js';
|
|
8
|
+
import { computeSchemaFit, createMemory, Layer } from '../core/memory.js';
|
|
9
|
+
import { extractPathTags } from '../search/path-context.js';
|
|
10
|
+
import { canReadScope, personalScopeOf, touchableScopeSql } from '../store/recall-scope.js';
|
|
11
|
+
import { RejectedValueError } from '../store/rejection.js';
|
|
12
|
+
import { duplicateKey, longestWord, storedTextKeys } from '../util/same-text.js';
|
|
12
13
|
import { loadTextsHoldingWords } from '../store/candidates.js';
|
|
13
14
|
import { loadAllEntries } from '../store/entry-reads.js';
|
|
14
15
|
import { writeEntry } from '../store/entry-writes.js';
|
|
@@ -38,53 +39,60 @@ export function learn(ctx, opts) {
|
|
|
38
39
|
function writeLessons(ctx, lessons, opts, config) {
|
|
39
40
|
const { hippoRoot, tenantId } = ctx;
|
|
40
41
|
const { profile } = opts;
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const { invalidated } = invalidateMatching(hippoRoot, target, tenantId);
|
|
55
|
-
if (invalidated > 0)
|
|
56
|
-
counts.invalidations.push({ from: target.from, count: invalidated });
|
|
57
|
-
}
|
|
58
|
-
const entry = createMemory(lesson, {
|
|
59
|
-
layer: Layer.Episodic,
|
|
60
|
-
tags: [...profile.tags],
|
|
61
|
-
source: profile.source,
|
|
62
|
-
confidence: 'observed',
|
|
63
|
-
schema_fit: existing && computeSchemaFit(lesson, [...profile.tags], existing),
|
|
64
|
-
tenantId,
|
|
65
|
-
baseHalfLifeDays: config.defaultHalfLifeDays,
|
|
66
|
-
});
|
|
67
|
-
for (const tag of pathTags)
|
|
68
|
-
if (!entry.tags.includes(tag))
|
|
69
|
-
entry.tags.push(tag);
|
|
70
|
-
// A refused lesson must not abort the rest of the git-log scan.
|
|
71
|
-
try {
|
|
72
|
-
writeEntry(hippoRoot, entry, { actor: ctx.actor.subject });
|
|
73
|
-
}
|
|
74
|
-
catch (err) {
|
|
75
|
-
if (err instanceof RejectedValueError) {
|
|
76
|
-
counts.rejected++;
|
|
42
|
+
// `hippo init` calls this outside any request, so the batch brings its own scope: every read and write below shares one handle.
|
|
43
|
+
return withRequestStoresSync(() => {
|
|
44
|
+
// One read serves the batch: invalidation matches against `live`, which follows every write below, as a reload per lesson did.
|
|
45
|
+
const live = profile.full ? loadAllEntries(hippoRoot, tenantId) : [];
|
|
46
|
+
// Schema fit needs every row; without it, only rows holding a lesson's longest word can be its copy. Learn is host-admin only, so both read what an admin can.
|
|
47
|
+
const existing = profile.full ? live.filter((e) => e.scope == null || canReadScope(ctx.actor, e.scope)) : undefined;
|
|
48
|
+
const readable = touchableScopeSql('', personalScopeOf(ctx.actor));
|
|
49
|
+
const keys = storedTextKeys(existing ?? loadTextsHoldingWords(hippoRoot, tenantId, lessons.map(longestWord), undefined, readable));
|
|
50
|
+
const pathTags = profile.full ? extractPathTags(opts.repoPath) : [];
|
|
51
|
+
const counts = { added: 0, skipped: 0, rejected: 0, invalidations: [] };
|
|
52
|
+
for (const lesson of lessons) {
|
|
53
|
+
if (keys.has(duplicateKey(lesson))) {
|
|
54
|
+
counts.skipped++;
|
|
77
55
|
continue;
|
|
78
56
|
}
|
|
79
|
-
|
|
57
|
+
const target = profile.full ? extractInvalidationTarget(lesson) : null;
|
|
58
|
+
if (target) {
|
|
59
|
+
const { invalidated } = invalidateMatchingAmong(hippoRoot, live, target, tenantId);
|
|
60
|
+
if (invalidated > 0)
|
|
61
|
+
counts.invalidations.push({ from: target.from, count: invalidated });
|
|
62
|
+
}
|
|
63
|
+
const entry = createMemory(lesson, {
|
|
64
|
+
layer: Layer.Episodic,
|
|
65
|
+
tags: [...profile.tags],
|
|
66
|
+
source: profile.source,
|
|
67
|
+
confidence: 'observed',
|
|
68
|
+
schema_fit: existing && computeSchemaFit(lesson, [...profile.tags], existing),
|
|
69
|
+
tenantId,
|
|
70
|
+
baseHalfLifeDays: config.defaultHalfLifeDays,
|
|
71
|
+
});
|
|
72
|
+
for (const tag of pathTags)
|
|
73
|
+
if (!entry.tags.includes(tag))
|
|
74
|
+
entry.tags.push(tag);
|
|
75
|
+
// A refused lesson must not abort the rest of the git-log scan.
|
|
76
|
+
try {
|
|
77
|
+
writeEntry(hippoRoot, entry, { actor: ctx.actor.subject });
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
if (err instanceof RejectedValueError) {
|
|
81
|
+
counts.rejected++;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
throw err;
|
|
85
|
+
}
|
|
86
|
+
if (profile.full) {
|
|
87
|
+
updateStats(hippoRoot, { remembered: 1 });
|
|
88
|
+
live.push(entry);
|
|
89
|
+
}
|
|
90
|
+
keys.add(duplicateKey(lesson));
|
|
91
|
+
if (profile.full)
|
|
92
|
+
void embedMemory(hippoRoot, entry);
|
|
93
|
+
counts.added++;
|
|
80
94
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
keys.add(duplicateKey(lesson));
|
|
84
|
-
if (profile.full)
|
|
85
|
-
void embedMemory(hippoRoot, entry);
|
|
86
|
-
counts.added++;
|
|
87
|
-
}
|
|
88
|
-
return counts;
|
|
95
|
+
return counts;
|
|
96
|
+
});
|
|
89
97
|
}
|
|
90
98
|
//# sourceMappingURL=learn.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type openHippoDb } from '../db/index.js';
|
|
2
|
+
import { type LedgerTurn } from '../store/ledger-turn.js';
|
|
3
|
+
import type { LastSent, TokenSurface, TokenUse } from '../store/token-ledger.js';
|
|
4
|
+
export interface LedgerRootOpts {
|
|
5
|
+
/** The store serves many people, so the global store of the user running it belongs to none of them. */
|
|
6
|
+
readonly sharedStore?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** `hippoRoot` when it holds a store, else the global store (the prompt hook fires where no local one exists), else null. */
|
|
9
|
+
export declare function ledgerRoot(hippoRoot: string, opts?: LedgerRootOpts): string | null;
|
|
10
|
+
/** Says why a ledger row did not land, at the level its class earns: busy warns once through noteStoreBusy, absent is debug with no stack, unexpected warns once with the error class and stack. */
|
|
11
|
+
export declare function noteLedgerRowSkipped<E>(error: E): void;
|
|
12
|
+
/** Books one row in ledgerRoot's store, best-effort. */
|
|
13
|
+
export declare function bookTokenUse(hippoRoot: string, use: TokenUse, opts?: LedgerRootOpts): void;
|
|
14
|
+
/** Books a turn's rows and then its delivery event on one connection of ledgerRoot's store, best-effort. */
|
|
15
|
+
export declare function bookLedgerTurn(hippoRoot: string, turn: LedgerTurn, opts?: LedgerRootOpts): void;
|
|
16
|
+
/** What the session last sent on `surface` in ledgerRoot's store; undefined with no ledger or a failed read. */
|
|
17
|
+
export declare function ledgerLastSent(hippoRoot: string, tenantId: string, sessionId: string | null | undefined, surface: TokenSurface, opts?: LedgerRootOpts): LastSent | null | undefined;
|
|
18
|
+
/** Runs `fn` on a handle of ledgerRoot's store, best-effort as the calls above. */
|
|
19
|
+
export declare function withLedgerDb<T>(hippoRoot: string, fn: (db: ReturnType<typeof openHippoDb>) => T, opts?: LedgerRootOpts): T | undefined;
|
|
20
|
+
//# sourceMappingURL=ledger-db.d.ts.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// The store the token ledger writes to for a caller's root; context, recall and the session hooks share it.
|
|
2
|
+
import { isSqliteBusy, noteStoreBusy } from '../db/index.js';
|
|
3
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
4
|
+
import { getGlobalRoot } from '../sharing/shared.js';
|
|
5
|
+
import { lastSentOnSurface, recordLedgerTurn } from '../store/ledger-turn.js';
|
|
6
|
+
import { isInitialized, onHandle } from '../store/open.js';
|
|
7
|
+
import { sqliteSyncStore } from '../store/sqlite/store.js';
|
|
8
|
+
/** `hippoRoot` when it holds a store, else the global store (the prompt hook fires where no local one exists), else null. */
|
|
9
|
+
export function ledgerRoot(hippoRoot, opts) {
|
|
10
|
+
if (isInitialized(hippoRoot))
|
|
11
|
+
return hippoRoot;
|
|
12
|
+
if (opts?.sharedStore)
|
|
13
|
+
return null;
|
|
14
|
+
const globalRoot = getGlobalRoot();
|
|
15
|
+
return isInitialized(globalRoot) ? globalRoot : null;
|
|
16
|
+
}
|
|
17
|
+
// SQLite's result codes for a hippo.db it cannot read: a corrupt image, and a file that is no database.
|
|
18
|
+
const SQLITE_CORRUPT = 11;
|
|
19
|
+
const SQLITE_NOTADB = 26;
|
|
20
|
+
/** The one rule for a skipped ledger row. `absent` is a store with no token_ledger table or a hippo.db SQLite cannot read; the command that owns the store reports that, and a hook must stay quiet about it. */
|
|
21
|
+
function ledgerSkipClass(error) {
|
|
22
|
+
if (isSqliteBusy(error))
|
|
23
|
+
return 'busy';
|
|
24
|
+
const code = error instanceof Error && 'errcode' in error ? error.errcode : undefined;
|
|
25
|
+
if (code === SQLITE_CORRUPT || code === SQLITE_NOTADB)
|
|
26
|
+
return 'absent';
|
|
27
|
+
return errorMessage(error).includes('no such table: token_ledger') ? 'absent' : 'unexpected';
|
|
28
|
+
}
|
|
29
|
+
/** Says why a ledger row did not land, at the level its class earns: busy warns once through noteStoreBusy, absent is debug with no stack, unexpected warns once with the error class and stack. */
|
|
30
|
+
export function noteLedgerRowSkipped(error) {
|
|
31
|
+
const skip = ledgerSkipClass(error);
|
|
32
|
+
if (skip === 'busy') {
|
|
33
|
+
noteStoreBusy('token ledger row skipped');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const message = `token ledger row skipped: ${errorMessage(error)}`;
|
|
37
|
+
if (skip === 'absent')
|
|
38
|
+
log.debug(message);
|
|
39
|
+
else
|
|
40
|
+
log.warnThenDebug('token-ledger-row', message, errorFields(error));
|
|
41
|
+
}
|
|
42
|
+
/** Runs `call` on ledgerRoot's store root. Best-effort: undefined on any failure, because a ledger failure must not break context or recall. */
|
|
43
|
+
function onLedgerRoot(hippoRoot, opts, call) {
|
|
44
|
+
let root = null;
|
|
45
|
+
try {
|
|
46
|
+
root = ledgerRoot(hippoRoot, opts);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
// An unreadable store root means no ledger write; the ledger must never break context or recall.
|
|
50
|
+
log.debug(`token ledger skipped, store root unreadable: ${errorMessage(error)}`);
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
if (root === null)
|
|
54
|
+
return undefined;
|
|
55
|
+
try {
|
|
56
|
+
return call(root);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
noteLedgerRowSkipped(error);
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Books one row in ledgerRoot's store, best-effort. */
|
|
64
|
+
export function bookTokenUse(hippoRoot, use, opts) {
|
|
65
|
+
onLedgerRoot(hippoRoot, opts, (root) => sqliteSyncStore(root).recordTokens(use));
|
|
66
|
+
}
|
|
67
|
+
/** Books a turn's rows and then its delivery event on one connection of ledgerRoot's store, best-effort. */
|
|
68
|
+
export function bookLedgerTurn(hippoRoot, turn, opts) {
|
|
69
|
+
onLedgerRoot(hippoRoot, opts, (root) => recordLedgerTurn(root, turn));
|
|
70
|
+
}
|
|
71
|
+
/** What the session last sent on `surface` in ledgerRoot's store; undefined with no ledger or a failed read. */
|
|
72
|
+
export function ledgerLastSent(hippoRoot, tenantId, sessionId, surface, opts) {
|
|
73
|
+
return onLedgerRoot(hippoRoot, opts, (root) => lastSentOnSurface(root, tenantId, sessionId, surface));
|
|
74
|
+
}
|
|
75
|
+
/** Runs `fn` on a handle of ledgerRoot's store, best-effort as the calls above. */
|
|
76
|
+
export function withLedgerDb(hippoRoot, fn, opts) {
|
|
77
|
+
return onLedgerRoot(hippoRoot, opts, (root) => onHandle(root, fn));
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=ledger-db.js.map
|