hippo-memory 1.69.0 → 1.70.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +3 -2
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +1 -1
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +1 -1
- package/dist/agent-memories/sync.js +24 -33
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +2 -2
- package/dist/api/assemble.js +42 -32
- package/dist/api/audit.d.ts +4 -7
- package/dist/api/audit.js +6 -20
- package/dist/api/auth.d.ts +5 -18
- package/dist/api/auth.js +44 -194
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
- package/dist/{availability.js → api/availability.js} +12 -29
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +37 -45
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +48 -61
- package/dist/api/dormant.d.ts +3 -3
- package/dist/api/dormant.js +38 -107
- package/dist/api/drill-down.d.ts +2 -2
- package/dist/api/drill-down.js +37 -65
- package/dist/api/forget.d.ts +2 -11
- package/dist/api/forget.js +13 -46
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/index.d.ts +26 -0
- package/dist/api/index.js +29 -0
- package/dist/api/instruction-detect.js +74 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +20 -0
- package/dist/api/ledger-db.js +79 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +36 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/promote.d.ts +4 -15
- package/dist/api/promote.js +29 -106
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
- package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +112 -0
- package/dist/{recall-history.js → api/recall-history.js} +30 -25
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +41 -16
- package/dist/api/recall.d.ts +1 -1
- package/dist/api/recall.js +39 -37
- package/dist/api/remember.d.ts +10 -12
- package/dist/api/remember.js +29 -45
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -7
- package/dist/api/sleep-run.js +63 -75
- package/dist/api/sleep.d.ts +1 -1
- package/dist/api/tokens.d.ts +2 -2
- package/dist/api/tokens.js +9 -21
- package/dist/api/types.d.ts +2 -2
- package/dist/api/types.js +1 -1
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +1 -1
- package/dist/capture/command.js +54 -41
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +4 -1
- package/dist/capture/compact.js +40 -22
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
- package/dist/{session-digest.js → capture/session-digest.js} +17 -23
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.js +68 -74
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
- package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +77 -72
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +18 -20
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +59 -181
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +25 -23
- package/dist/{client.d.ts → cli/client.d.ts} +1 -1
- package/dist/{client.js → cli/client.js} +1 -1
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +39 -0
- package/dist/cli/context.d.ts +2 -13
- package/dist/cli/context.js +41 -71
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +109 -99
- package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
- package/dist/cli/curate.d.ts +9 -9
- package/dist/cli/curate.js +177 -149
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +46 -34
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +108 -218
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +43 -31
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +35 -19
- package/dist/cli/flag-values.d.ts +25 -0
- package/dist/cli/flag-values.js +103 -0
- package/dist/cli/flags.d.ts +303 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +39 -34
- package/dist/cli/hook-runtime.d.ts +49 -0
- package/dist/cli/hook-runtime.js +155 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +151 -118
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +110 -0
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +9 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +31 -27
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +65 -0
- package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
- package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +77 -280
- package/dist/cli/print.d.ts +18 -0
- package/dist/cli/print.js +85 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -49
- package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +101 -150
- package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
- package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
- package/dist/cli/remember.d.ts +1 -3
- package/dist/cli/remember.js +124 -103
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
- package/dist/{scheduler.js → cli/scheduler.js} +13 -7
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +34 -4
- package/dist/cli/session-hooks.d.ts +4 -4
- package/dist/cli/session-hooks.js +190 -184
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +41 -21
- package/dist/cli/shared.d.ts +5 -95
- package/dist/cli/shared.js +18 -369
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +31 -55
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +2 -8
- package/dist/cli/sleep.js +20 -76
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +39 -41
- package/dist/{stdin.js → cli/stdin.js} +6 -6
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +68 -42
- package/dist/cli/usage.js +4 -2
- package/dist/cli.d.ts +289 -5
- package/dist/cli.js +184 -117
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +1 -1
- package/dist/connectors/github/backfill.js +29 -66
- package/dist/connectors/github/cli-impl.js +59 -74
- package/dist/connectors/github/deletion.d.ts +5 -6
- package/dist/connectors/github/deletion.js +18 -52
- package/dist/connectors/github/dlq.d.ts +7 -61
- package/dist/connectors/github/dlq.js +19 -119
- package/dist/connectors/github/ingest.d.ts +2 -31
- package/dist/connectors/github/ingest.js +20 -83
- package/dist/connectors/github/octokit-client.d.ts +1 -1
- package/dist/connectors/github/octokit-client.js +2 -1
- package/dist/connectors/github/tenant-routing.d.ts +2 -2
- package/dist/connectors/github/tenant-routing.js +10 -36
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/types.d.ts +1 -1
- package/dist/connectors/github/types.js +15 -18
- package/dist/connectors/github/webhook.d.ts +3 -2
- package/dist/connectors/github/webhook.js +84 -87
- package/dist/connectors/slack/backfill.d.ts +1 -1
- package/dist/connectors/slack/backfill.js +5 -29
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +7 -49
- package/dist/connectors/slack/dlq.js +25 -118
- package/dist/connectors/slack/ingest.d.ts +5 -18
- package/dist/connectors/slack/ingest.js +27 -91
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.js +13 -14
- package/dist/connectors/slack/transform.d.ts +1 -1
- package/dist/connectors/slack/types.d.ts +1 -1
- package/dist/connectors/slack/types.js +3 -12
- package/dist/connectors/slack/web-client.js +2 -2
- package/dist/connectors/slack/webhook.d.ts +3 -2
- package/dist/connectors/slack/webhook.js +75 -82
- package/dist/connectors/slack/workspaces.d.ts +4 -17
- package/dist/connectors/slack/workspaces.js +4 -34
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +4 -4
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
- package/dist/{dag.js → consolidate/dag.js} +60 -81
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +28 -22
- package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
- package/dist/consolidate/flush-units.d.ts +2 -2
- package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
- package/dist/consolidate/half-life-migration.js +106 -0
- package/dist/consolidate/llm-passes.js +8 -8
- package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
- package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
- package/dist/consolidate/merge.js +57 -54
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
- package/dist/consolidate/physics-pass.js +46 -46
- package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
- package/dist/{replay.js → consolidate/replay.js} +2 -2
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +1 -1
- package/dist/consolidate/sleep.js +64 -134
- package/dist/{trace.js → consolidate/trace.js} +4 -6
- package/dist/consolidate/traces.js +34 -29
- package/dist/{ablation.js → core/ablation.js} +1 -1
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.js → core/ambient.js} +12 -10
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +13 -2
- package/dist/{capture-contract.js → core/capture-contract.js} +64 -0
- package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
- package/dist/{compare.js → core/compare.js} +10 -3
- package/dist/{config.d.ts → core/config.d.ts} +6 -6
- package/dist/{config.js → core/config.js} +99 -72
- package/dist/core/handoff.js +87 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
- package/dist/{memory.d.ts → core/memory.d.ts} +17 -5
- package/dist/{memory.js → core/memory.js} +110 -82
- package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
- package/dist/{physics.js → core/physics.js} +2 -1
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
- package/dist/{project-identity.js → core/project-identity.js} +5 -17
- package/dist/{project-remote.js → core/project-remote.js} +4 -4
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/{salience.js → core/salience.js} +35 -20
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
- package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +18 -1
- package/dist/db/busy.js +74 -9
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +25 -30
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -35
- package/dist/db/migrations/v16.js +29 -26
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v20.js +4 -2
- package/dist/db/migrations/v22.js +39 -36
- package/dist/db/migrations/v24.js +27 -22
- package/dist/db/migrations/v29.js +37 -32
- package/dist/db/migrations/v31.js +36 -31
- package/dist/db/migrations/v35.js +1 -1
- package/dist/db/migrations/v39.js +1 -1
- package/dist/db/migrations/v40.js +15 -14
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +1 -1
- package/dist/db/migrations/v45.js +1 -1
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +1 -1
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +9 -1
- package/dist/db/open.js +21 -4
- package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
- package/dist/{physics-state.js → db/physics-state.js} +9 -16
- package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
- package/dist/{vector-store.js → db/vector-store.js} +76 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +105 -136
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +3 -3
- package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
- package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
- package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
- package/dist/{eval.js → eval/eval.js} +29 -22
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
- package/dist/{judgment.js → eval/judgment.js} +4 -9
- package/dist/extensions/openclaw-plugin/index.js +1 -2
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
- package/dist/{graph-extract.js → graph/extract.js} +37 -52
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
- package/dist/{graph-recall.js → graph/recall.js} +55 -36
- package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
- package/dist/{graph-stream.js → graph/stream.js} +9 -7
- package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
- package/dist/{graph-view.js → graph/view.js} +127 -167
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +14 -15
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +14 -15
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +1 -1
- package/dist/hooks/json-hooks.js +31 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +0 -4
- package/dist/hooks/shared.js +1 -5
- package/dist/importers/core.d.ts +2 -6
- package/dist/importers/core.js +41 -39
- package/dist/importers/markdown-parse.d.ts +1 -10
- package/dist/importers/markdown-parse.js +2 -19
- package/dist/importers/markdown.js +2 -1
- package/dist/importers/sources.js +50 -46
- package/dist/importers/vault.js +71 -92
- package/dist/index.d.ts +22 -22
- package/dist/index.js +21 -21
- package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
- package/dist/{autolearn.js → learn/autolearn.js} +13 -11
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +125 -0
- package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
- package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
- package/dist/{invalidation.js → learn/invalidation.js} +83 -99
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +37 -60
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +7 -27
- package/dist/mcp/protocol.d.ts +6 -10
- package/dist/mcp/protocol.js +8 -14
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +68 -50
- package/dist/mcp/request.js +62 -60
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/session-state.d.ts +1 -2
- package/dist/mcp/session-state.js +2 -2
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.js +69 -31
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +2 -2
- package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
- package/dist/objects/customer-notes.js +112 -0
- package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
- package/dist/objects/decisions.js +101 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
- package/dist/objects/incidents.js +130 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
- package/dist/objects/policies.js +189 -0
- package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
- package/dist/objects/processes.js +146 -0
- package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
- package/dist/objects/project-briefs.js +255 -0
- package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
- package/dist/objects/skills.js +156 -0
- package/dist/postinstall.js +4 -2
- package/dist/predictions/planning-fallacy.d.ts +4 -76
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +27 -47
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +15 -23
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +30 -49
- package/dist/rerankers/llm.d.ts +2 -4
- package/dist/rerankers/llm.js +33 -50
- package/dist/rerankers/outage-warning.d.ts +7 -0
- package/dist/rerankers/outage-warning.js +31 -0
- package/dist/rerankers/remote.d.ts +3 -0
- package/dist/rerankers/remote.js +23 -0
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -1
- package/dist/search/boosts.js +34 -13
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +4 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +7 -5
- package/dist/{path-context.js → search/path-context.js} +3 -1
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +15 -15
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +3 -3
- package/dist/search/vector.js +17 -11
- package/dist/server/auth.d.ts +1 -1
- package/dist/server/auth.js +26 -18
- package/dist/server/boot.d.ts +24 -0
- package/dist/server/boot.js +465 -0
- package/dist/server/client-ip.d.ts +5 -1
- package/dist/server/client-ip.js +18 -6
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/key-check-bounds.d.ts +8 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.js +1 -1
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +34 -24
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +10 -4
- package/dist/server/request.js +63 -12
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +209 -0
- package/dist/server/routes/admin.js +13 -8
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +32 -97
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +42 -105
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +42 -95
- package/dist/server/routes/memories.js +12 -14
- package/dist/server/routes/object-routes.d.ts +40 -0
- package/dist/server/routes/object-routes.js +80 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +40 -124
- package/dist/server/routes/predictions.js +29 -45
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +38 -118
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +38 -110
- package/dist/server/routes/recall.js +14 -12
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +37 -125
- package/dist/{server-detect.js → server/server-detect.js} +1 -1
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +70 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +27 -8
- package/dist/server/validation.d.ts +3 -4
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +39 -61
- package/dist/server.js +24 -568
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
- package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
- package/dist/{scope.js → sharing/scope.js} +1 -1
- package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
- package/dist/{shared.js → sharing/shared.js} +100 -77
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +10 -10
- package/dist/store/audit-event.d.ts +11 -5
- package/dist/store/audit-event.js +5 -4
- package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
- package/dist/{audit.js → store/audit.js} +91 -6
- package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
- package/dist/{auth.js → store/auth.js} +100 -92
- package/dist/store/candidates.d.ts +23 -12
- package/dist/store/candidates.js +87 -35
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
- package/dist/{card-detail.js → store/card-detail.js} +1 -1
- package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
- package/dist/{store-cards.js → store/cards.js} +85 -146
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +22 -5
- package/dist/store/conflicts.js +160 -109
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +92 -0
- package/dist/store/delete-and-batch.d.ts +20 -24
- package/dist/store/delete-and-batch.js +64 -40
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +51 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
- package/dist/{dormant.js → store/dormant.js} +151 -6
- package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
- package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
- package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
- package/dist/store/entry-reads.d.ts +46 -7
- package/dist/store/entry-reads.js +120 -21
- package/dist/store/entry-row.d.ts +8 -2
- package/dist/store/entry-row.js +28 -8
- package/dist/store/entry-writes.d.ts +33 -4
- package/dist/store/entry-writes.js +108 -26
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
- package/dist/{goals.js → store/goals.js} +45 -94
- package/dist/store/graph-queue.d.ts +29 -0
- package/dist/store/graph-queue.js +101 -0
- package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
- package/dist/{graph/read.js → store/graph-reads.js} +63 -115
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
- package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
- package/dist/store/graph-view-rows.d.ts +12 -0
- package/dist/store/graph-view-rows.js +67 -0
- package/dist/store/graph-writes.d.ts +58 -0
- package/dist/store/graph-writes.js +256 -0
- package/dist/store/half-life.d.ts +34 -0
- package/dist/store/half-life.js +77 -0
- package/dist/store/handoffs.d.ts +1 -1
- package/dist/store/handoffs.js +39 -30
- package/dist/store/index-and-stats.d.ts +8 -1
- package/dist/store/index-and-stats.js +51 -48
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +1 -1
- package/dist/store/markdown.js +4 -3
- package/dist/store/mirrors.d.ts +5 -7
- package/dist/store/mirrors.js +39 -25
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +24 -23
- package/dist/store/planning-fallacy-evidence.d.ts +42 -0
- package/dist/store/planning-fallacy-evidence.js +81 -0
- package/dist/store/port.d.ts +646 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
- package/dist/{predictions/store.js → store/predictions.js} +52 -67
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +3 -1
- package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
- package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
- package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +162 -0
- package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
- package/dist/{rejection.js → store/rejection.js} +3 -2
- package/dist/store/rows.d.ts +2 -3
- package/dist/store/rows.js +18 -11
- package/dist/store/search-rows.d.ts +15 -4
- package/dist/store/search-rows.js +41 -28
- package/dist/store/sessions.d.ts +13 -2
- package/dist/store/sessions.js +79 -45
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +59 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +28 -0
- package/dist/store/sqlite/executor.js +286 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +38 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +218 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +314 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +26 -0
- package/dist/store/sqlite/store.js +295 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +124 -0
- package/dist/store/sqlite/worker-ops.js +82 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +76 -0
- package/dist/store/summaries.d.ts +2 -11
- package/dist/store/summaries.js +17 -44
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/store/tenant-lookup.d.ts +1 -1
- package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
- package/dist/{tenant.js → store/tenant.js} +1 -1
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
- package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +26 -0
- package/dist/store/vector-writes.d.ts +10 -3
- package/dist/store/vector-writes.js +35 -5
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
- package/dist/{working-memory.js → store/working-memory.js} +39 -41
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +13 -33
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +67 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +46 -0
- package/dist/util/atomic-write.d.ts +3 -0
- package/dist/util/atomic-write.js +107 -0
- package/dist/util/crash-handlers.d.ts +5 -0
- package/dist/util/crash-handlers.js +30 -0
- package/dist/{env.d.ts → util/env.d.ts} +15 -2
- package/dist/{env.js → util/env.js} +20 -2
- package/dist/util/home-path.js +67 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
- package/dist/{http-retry.js → util/http-retry.js} +38 -7
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +5 -2
- package/dist/{log.js → util/log.js} +12 -3
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +27 -0
- package/dist/util/request-scope.js +47 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +18 -0
- package/dist/util/token-text.js +23 -0
- package/dist/{version.d.ts → util/version.d.ts} +1 -1
- package/dist/{version.js → util/version.js} +1 -1
- package/extensions/openclaw-plugin/index.ts +1 -5
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.js +0 -326
- package/dist/extract.js +0 -133
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/policies.js +0 -434
- package/dist/processes.js +0 -371
- package/dist/project-briefs.js +0 -523
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
- /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
- /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
- /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
- /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
- /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
- /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
- /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
- /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{card.d.ts → core/card.d.ts} +0 -0
- /package/dist/{card.js → core/card.js} +0 -0
- /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
- /package/dist/{physics-config.js → core/physics-config.js} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
- /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
- /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
- /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
- /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
- /package/dist/{rrf.js → search/rrf.js} +0 -0
- /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
- /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
- /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
- /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
- /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
- /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
- /package/dist/{yaml.js → store/yaml.js} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
- /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -15,36 +15,22 @@
|
|
|
15
15
|
*
|
|
16
16
|
* Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
|
|
17
17
|
* enforce incidents.tenant_id == the referenced memory's tenant_id. Mirrors the
|
|
18
|
-
* v30 decisions pattern (src/decisions.ts).
|
|
18
|
+
* v30 decisions pattern (src/objects/decisions.ts).
|
|
19
19
|
*
|
|
20
|
-
* Dual-write atomicity: `saveIncident` writes the memory + incidents row
|
|
21
|
-
*
|
|
22
|
-
*
|
|
20
|
+
* Dual-write atomicity: `saveIncident` writes the memory + incidents row in the
|
|
21
|
+
* `objects` store group's one transaction, so a failure in any step rolls all of
|
|
22
|
+
* them back.
|
|
23
23
|
*
|
|
24
24
|
* linked_memory_ids ("linked receipts"): a JSON-encoded array of memory ids on
|
|
25
25
|
* the row, default `[]`. On save, every id must exist in the SAME tenant; a
|
|
26
26
|
* cross-tenant or nonexistent id is rejected (throw) before the insert.
|
|
27
27
|
*/
|
|
28
|
-
import {
|
|
29
|
-
|
|
28
|
+
import type { KeysetPosition } from '../util/keyset.js';
|
|
29
|
+
import type { ObjectDescriptor } from './descriptor.js';
|
|
30
|
+
import type { Incident, IncidentStatus } from '../store/object-types.js';
|
|
31
|
+
import { type Objects } from '../store/port.js';
|
|
32
|
+
export type { Incident, IncidentStatus } from '../store/object-types.js';
|
|
30
33
|
export declare const VALID_INCIDENT_STATES: ReadonlySet<IncidentStatus>;
|
|
31
|
-
export interface Incident {
|
|
32
|
-
id: number;
|
|
33
|
-
/** Nullable: ON DELETE SET NULL lets memory deletion (forget / consolidate /
|
|
34
|
-
* archive) proceed without breaking the incident row. */
|
|
35
|
-
memoryId: string | null;
|
|
36
|
-
tenantId: string;
|
|
37
|
-
incidentText: string;
|
|
38
|
-
context: string | null;
|
|
39
|
-
status: IncidentStatus;
|
|
40
|
-
/** Set only when status === 'resolved'. */
|
|
41
|
-
resolutionText: string | null;
|
|
42
|
-
resolvedAt: string | null;
|
|
43
|
-
closedAt: string | null;
|
|
44
|
-
/** Linked receipts: memory ids that are this incident's evidence. */
|
|
45
|
-
linkedMemoryIds: string[];
|
|
46
|
-
createdAt: string;
|
|
47
|
-
}
|
|
48
34
|
export interface SaveIncidentOpts {
|
|
49
35
|
incidentText: string;
|
|
50
36
|
context?: string;
|
|
@@ -61,31 +47,18 @@ export interface ListIncidentsOpts {
|
|
|
61
47
|
/** Resume after this row: the position the previous page ended on. */
|
|
62
48
|
after?: KeysetPosition;
|
|
63
49
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
* inside writeEntry's SAVEPOINT 'write_entry'.
|
|
67
|
-
*
|
|
68
|
-
* The memory mirror: tags ['incident', ...extraTags], source 'incident',
|
|
69
|
-
* confidence 'verified', the half-life objectHalfLifeDays picks, content =
|
|
70
|
-
* "<text>\n\nContext: <context>" when context is given.
|
|
71
|
-
*
|
|
72
|
-
* linked_memory_ids are validated BEFORE insert: each must exist in the SAME
|
|
73
|
-
* tenant. A cross-tenant or nonexistent id throws and rolls back the whole
|
|
74
|
-
* write. The validated ids are stored as JSON.stringify(validated).
|
|
75
|
-
*/
|
|
50
|
+
export declare const INCIDENT: ObjectDescriptor<'incident'>;
|
|
51
|
+
/** Opens an incident with its mirror memory (content "<text>\n\nContext: <context>" when context is given) in one write; a linked memory outside the tenant refuses the whole write. */
|
|
76
52
|
export declare function saveIncident(hippoRoot: string, tenantId: string, opts: SaveIncidentOpts, actor?: string): Incident;
|
|
77
|
-
/**
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
* 0 changes distinguishes not-found from not-open so callers surface the right
|
|
81
|
-
* error. Emits incident_resolve.
|
|
82
|
-
*/
|
|
53
|
+
/** `saveIncident` over a served store's group. */
|
|
54
|
+
export declare function openIncident(objects: Objects, hippoRoot: string, tenantId: string, opts: SaveIncidentOpts, actor: string): Promise<Incident>;
|
|
55
|
+
/** Moves an open incident to resolved and keeps it on record; a missing incident and one that is not open are told apart. */
|
|
83
56
|
export declare function resolveIncident(hippoRoot: string, tenantId: string, id: number, resolutionText: string, actor?: string): Incident;
|
|
57
|
+
/** `resolveIncident` over a served store's group. */
|
|
58
|
+
export declare function resolveOpenIncident(objects: Objects, tenantId: string, id: number, resolutionText: string, actor: string): Promise<Incident>;
|
|
84
59
|
/**
|
|
85
60
|
* Close (retire) an incident from open or resolved (open|resolved -> closed).
|
|
86
|
-
* Updates closed_at only; the memory mirror is not mutated.
|
|
87
|
-
* status IN ('open','resolved'); 0 changes distinguishes not-found from
|
|
88
|
-
* wrong-state. Emits incident_close.
|
|
61
|
+
* Updates closed_at only; the memory mirror is not mutated.
|
|
89
62
|
*/
|
|
90
63
|
export declare function closeIncident(hippoRoot: string, tenantId: string, id: number, actor?: string): Incident;
|
|
91
64
|
export declare function loadIncidentById(hippoRoot: string, tenantId: string, id: number): Incident | null;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incident first-class object.
|
|
3
|
+
*
|
|
4
|
+
* An incident is a postmortem capsule: a recorded operational event with a
|
|
5
|
+
* lifecycle and optional linked receipts (the memories that are its evidence).
|
|
6
|
+
* The `incidents` table is the source of truth: an incident stays `open`
|
|
7
|
+
* regardless of memory decay. A memory row still mirrors the incident for
|
|
8
|
+
* recall surfaces but is NOT canonical — memory_id is NULLABLE with ON DELETE
|
|
9
|
+
* SET NULL so forget/consolidate/archive gracefully orphans the incident row.
|
|
10
|
+
*
|
|
11
|
+
* Lifecycle: open -> resolved (a resolution was recorded; the incident stays on
|
|
12
|
+
* record with resolution_text + resolved_at) or open|resolved -> closed
|
|
13
|
+
* (retired with closed_at). This is NOT decision's supersede: there is no
|
|
14
|
+
* superseded_by self-FK, no supersede CAS, and no supersede trigger.
|
|
15
|
+
*
|
|
16
|
+
* Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
|
|
17
|
+
* enforce incidents.tenant_id == the referenced memory's tenant_id. Mirrors the
|
|
18
|
+
* v30 decisions pattern (src/objects/decisions.ts).
|
|
19
|
+
*
|
|
20
|
+
* Dual-write atomicity: `saveIncident` writes the memory + incidents row in the
|
|
21
|
+
* `objects` store group's one transaction, so a failure in any step rolls all of
|
|
22
|
+
* them back.
|
|
23
|
+
*
|
|
24
|
+
* linked_memory_ids ("linked receipts"): a JSON-encoded array of memory ids on
|
|
25
|
+
* the row, default `[]`. On save, every id must exist in the SAME tenant; a
|
|
26
|
+
* cross-tenant or nonexistent id is rejected (throw) before the insert.
|
|
27
|
+
*/
|
|
28
|
+
import { BadRequestError, ConflictError, NotFoundError } from '../core/api-errors.js';
|
|
29
|
+
import { assertTenantId } from '../store/tenant.js';
|
|
30
|
+
import { closeObjectAt, listObjectsAt, objectByIdAt, objectMirror } from './lifecycle.js';
|
|
31
|
+
import { isObjectRefusal } from '../store/port.js';
|
|
32
|
+
import { objectIdByMemory, sqliteObjects } from '../store/sqlite/objects-group.js';
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Domain types
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
export const VALID_INCIDENT_STATES = new Set([
|
|
37
|
+
'open',
|
|
38
|
+
'resolved',
|
|
39
|
+
'closed',
|
|
40
|
+
]);
|
|
41
|
+
// No draft: an incident is opened with linked memories and is never superseded, so it keeps its own save.
|
|
42
|
+
export const INCIDENT = {
|
|
43
|
+
kind: 'incident',
|
|
44
|
+
label: 'incident',
|
|
45
|
+
plural: 'incidents',
|
|
46
|
+
fn: { get: 'loadIncidentById', close: 'closeIncident', list: 'loadIncidents' },
|
|
47
|
+
states: VALID_INCIDENT_STATES,
|
|
48
|
+
closableFrom: ['open', 'resolved'],
|
|
49
|
+
closeRefusal: 'already closed',
|
|
50
|
+
};
|
|
51
|
+
/** One open, checked before a store is asked; `hippoRoot` is read only for the configured half-life. */
|
|
52
|
+
function incidentOpen(hippoRoot, tenantId, opts, actor) {
|
|
53
|
+
assertTenantId('saveIncident', tenantId);
|
|
54
|
+
if (!opts.incidentText)
|
|
55
|
+
throw new BadRequestError('saveIncident: incidentText is required');
|
|
56
|
+
const at = new Date().toISOString();
|
|
57
|
+
const content = opts.context
|
|
58
|
+
? `${opts.incidentText}\n\nContext: ${opts.context}`
|
|
59
|
+
: opts.incidentText;
|
|
60
|
+
const mirror = objectMirror(hippoRoot, tenantId, 'incident', { content, tags: opts.extraTags ?? [] });
|
|
61
|
+
const fields = { incidentText: opts.incidentText, context: opts.context ?? undefined, linkedMemoryIds: opts.linkedMemoryIds ?? [] };
|
|
62
|
+
return { mirror, fields, actor, at };
|
|
63
|
+
}
|
|
64
|
+
function opened(tenantId, written) {
|
|
65
|
+
if (!('refused' in written))
|
|
66
|
+
return written;
|
|
67
|
+
// A linked id of another tenant reads as missing, so an unverifiable receipt is never recorded.
|
|
68
|
+
if (written.refused === 'unlinked')
|
|
69
|
+
throw new NotFoundError(`saveIncident: linked memory ${written.memoryId} not found for tenant ${tenantId}`);
|
|
70
|
+
throw new Error('saveIncident: failed to reload saved incident row');
|
|
71
|
+
}
|
|
72
|
+
/** Opens an incident with its mirror memory (content "<text>\n\nContext: <context>" when context is given) in one write; a linked memory outside the tenant refuses the whole write. */
|
|
73
|
+
export function saveIncident(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
74
|
+
return opened(tenantId, sqliteObjects(hippoRoot).openIncident(tenantId, incidentOpen(hippoRoot, tenantId, opts, actor)));
|
|
75
|
+
}
|
|
76
|
+
/** `saveIncident` over a served store's group. */
|
|
77
|
+
export async function openIncident(objects, hippoRoot, tenantId, opts, actor) {
|
|
78
|
+
return opened(tenantId, await objects.openIncident(tenantId, incidentOpen(hippoRoot, tenantId, opts, actor)));
|
|
79
|
+
}
|
|
80
|
+
function resolving(tenantId, resolutionText, actor) {
|
|
81
|
+
assertTenantId('resolveIncident', tenantId);
|
|
82
|
+
if (!resolutionText || !resolutionText.trim()) {
|
|
83
|
+
throw new BadRequestError('resolveIncident: resolutionText is required (non-empty)');
|
|
84
|
+
}
|
|
85
|
+
return { text: resolutionText, actor, at: new Date().toISOString() };
|
|
86
|
+
}
|
|
87
|
+
function resolved(tenantId, id, written) {
|
|
88
|
+
if (!isObjectRefusal(written))
|
|
89
|
+
return written;
|
|
90
|
+
if (written.refused === 'missing')
|
|
91
|
+
throw new NotFoundError(`resolveIncident: incident ${id} not found for tenant ${tenantId}`);
|
|
92
|
+
if (written.refused !== 'status')
|
|
93
|
+
throw new NotFoundError(`resolveIncident: incident ${id} not found after UPDATE`);
|
|
94
|
+
throw new ConflictError(`resolveIncident: incident ${id} is not open (status='${written.status}'); only open incidents can be resolved.`);
|
|
95
|
+
}
|
|
96
|
+
/** Moves an open incident to resolved and keeps it on record; a missing incident and one that is not open are told apart. */
|
|
97
|
+
export function resolveIncident(hippoRoot, tenantId, id, resolutionText, actor = 'cli') {
|
|
98
|
+
return resolved(tenantId, id, sqliteObjects(hippoRoot).resolveIncident(tenantId, id, resolving(tenantId, resolutionText, actor)));
|
|
99
|
+
}
|
|
100
|
+
/** `resolveIncident` over a served store's group. */
|
|
101
|
+
export async function resolveOpenIncident(objects, tenantId, id, resolutionText, actor) {
|
|
102
|
+
return resolved(tenantId, id, await objects.resolveIncident(tenantId, id, resolving(tenantId, resolutionText, actor)));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Close (retire) an incident from open or resolved (open|resolved -> closed).
|
|
106
|
+
* Updates closed_at only; the memory mirror is not mutated.
|
|
107
|
+
*/
|
|
108
|
+
export function closeIncident(hippoRoot, tenantId, id, actor = 'cli') {
|
|
109
|
+
return closeObjectAt(hippoRoot, INCIDENT, tenantId, id, actor);
|
|
110
|
+
}
|
|
111
|
+
export function loadIncidentById(hippoRoot, tenantId, id) {
|
|
112
|
+
return objectByIdAt(hippoRoot, INCIDENT, tenantId, id);
|
|
113
|
+
}
|
|
114
|
+
export function loadIncidents(hippoRoot, tenantId, opts = {}) {
|
|
115
|
+
return listObjectsAt(hippoRoot, INCIDENT, tenantId, opts);
|
|
116
|
+
}
|
|
117
|
+
export function loadOpenIncidents(hippoRoot, tenantId, opts = {}) {
|
|
118
|
+
return loadIncidents(hippoRoot, tenantId, { status: 'open', limit: opts.limit });
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Resolve a memory id to the table id of the OPEN incident backed by that
|
|
122
|
+
* memory, or null when the memory has no open incident row. Extracted so a
|
|
123
|
+
* memory-id-based lookup is unit-testable at the store layer (mirror of
|
|
124
|
+
* resolveActiveDecisionIdByMemory).
|
|
125
|
+
*/
|
|
126
|
+
export function resolveActiveIncidentIdByMemory(hippoRoot, tenantId, memoryId) {
|
|
127
|
+
assertTenantId('resolveActiveIncidentIdByMemory', tenantId);
|
|
128
|
+
return objectIdByMemory(hippoRoot, tenantId, 'incident', 'open', memoryId);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=incidents.js.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import type { ObjectByKind, ObjectKind, SavableKind } from '../store/object-types.js';
|
|
3
|
+
import { type Objects } from '../store/port.js';
|
|
4
|
+
import type { ObjectDescriptor, ObjectListOpts, SavableDescriptor } from './descriptor.js';
|
|
5
|
+
/** Newest first. */
|
|
6
|
+
export declare function listObjectsAt<K extends ObjectKind>(hippoRoot: string, d: ObjectDescriptor<K>, tenantId: string, opts: ObjectListOpts<K>): ObjectByKind[K][];
|
|
7
|
+
export declare function listObjects<K extends ObjectKind>(objects: Objects, d: ObjectDescriptor<K>, tenantId: string, opts: ObjectListOpts<K>): Promise<ObjectByKind[K][]>;
|
|
8
|
+
export declare function objectByIdAt<K extends ObjectKind>(hippoRoot: string, d: ObjectDescriptor<K>, tenantId: string, id: number): ObjectByKind[K] | null;
|
|
9
|
+
export declare function objectById<K extends ObjectKind>(objects: Objects, d: ObjectDescriptor<K>, tenantId: string, id: number): Promise<ObjectByKind[K] | null>;
|
|
10
|
+
/** Retires one object; its mirror memory stays as saved. */
|
|
11
|
+
export declare function closeObjectAt<K extends ObjectKind>(hippoRoot: string, d: ObjectDescriptor<K>, tenantId: string, id: number, actor: string): ObjectByKind[K];
|
|
12
|
+
export declare function closeObject<K extends ObjectKind>(objects: Objects, d: ObjectDescriptor<K>, tenantId: string, id: number, actor: string): Promise<ObjectByKind[K]>;
|
|
13
|
+
/** The memory a typed object writes beside its row, so recall finds the object. */
|
|
14
|
+
export declare function objectMirror(hippoRoot: string, tenantId: string, source: ObjectKind, text: {
|
|
15
|
+
readonly content: string;
|
|
16
|
+
readonly tags: readonly string[];
|
|
17
|
+
}): MemoryEntry;
|
|
18
|
+
/** Where a save lands and who makes it; `hippoRoot` is read only for the configured half-life. */
|
|
19
|
+
export interface ObjectSaveSite {
|
|
20
|
+
readonly hippoRoot: string;
|
|
21
|
+
readonly tenantId: string;
|
|
22
|
+
readonly actor: string;
|
|
23
|
+
}
|
|
24
|
+
/** Creates an object, or the version that replaces the one its options name, with its mirror memory in one write. */
|
|
25
|
+
export declare function saveObjectAt<K extends SavableKind, W>(d: SavableDescriptor<K, W>, site: ObjectSaveSite, opts: W): ObjectByKind[K];
|
|
26
|
+
export declare function saveObject<K extends SavableKind, W>(objects: Objects, d: SavableDescriptor<K, W>, site: ObjectSaveSite, opts: W): Promise<ObjectByKind[K]>;
|
|
27
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Save, close, load-by-id and list for every typed object: the checks, the mirror memory and the error text, over the `objects` store group.
|
|
2
|
+
// Each flow is written twice over the same steps: `...At` answers at once on hippo.db for the CLI, and the other awaits a served store's group for the routes.
|
|
3
|
+
// The tenant, the fields and the list status are checked first, so a bad request fails before a store is asked.
|
|
4
|
+
import { BadRequestError, ConflictError, NotFoundError } from '../core/api-errors.js';
|
|
5
|
+
import { loadConfig } from '../core/config.js';
|
|
6
|
+
import { createMemory, Layer } from '../core/memory.js';
|
|
7
|
+
import { isObjectRefusal } from '../store/port.js';
|
|
8
|
+
import { sqliteObjects } from '../store/sqlite/objects-group.js';
|
|
9
|
+
import { assertTenantId } from '../store/tenant.js';
|
|
10
|
+
/** An empty status or filter lists every row, as an absent one does. */
|
|
11
|
+
function listQuery(d, tenantId, opts) {
|
|
12
|
+
assertTenantId(d.fn.list, tenantId);
|
|
13
|
+
if (opts.status && !d.states.has(opts.status)) {
|
|
14
|
+
throw new BadRequestError(`${d.fn.list}: status must be one of ${Array.from(d.states).join('|')}; got ${opts.status}`);
|
|
15
|
+
}
|
|
16
|
+
return { status: opts.status || undefined, filter: opts.filter || undefined, limit: opts.limit ?? 100, after: opts.after };
|
|
17
|
+
}
|
|
18
|
+
/** Newest first. */
|
|
19
|
+
export function listObjectsAt(hippoRoot, d, tenantId, opts) {
|
|
20
|
+
return sqliteObjects(hippoRoot).listObjects(tenantId, d.kind, listQuery(d, tenantId, opts));
|
|
21
|
+
}
|
|
22
|
+
export async function listObjects(objects, d, tenantId, opts) {
|
|
23
|
+
return objects.listObjects(tenantId, d.kind, listQuery(d, tenantId, opts));
|
|
24
|
+
}
|
|
25
|
+
export function objectByIdAt(hippoRoot, d, tenantId, id) {
|
|
26
|
+
assertTenantId(d.fn.get, tenantId);
|
|
27
|
+
return sqliteObjects(hippoRoot).objectById(tenantId, d.kind, id);
|
|
28
|
+
}
|
|
29
|
+
export async function objectById(objects, d, tenantId, id) {
|
|
30
|
+
assertTenantId(d.fn.get, tenantId);
|
|
31
|
+
return objects.objectById(tenantId, d.kind, id);
|
|
32
|
+
}
|
|
33
|
+
function closing(d, tenantId, actor) {
|
|
34
|
+
assertTenantId(d.fn.close, tenantId);
|
|
35
|
+
return { from: d.closableFrom, actor, at: new Date().toISOString() };
|
|
36
|
+
}
|
|
37
|
+
function closed(d, tenantId, id, written) {
|
|
38
|
+
if (!isObjectRefusal(written))
|
|
39
|
+
return written;
|
|
40
|
+
if (written.refused === 'missing')
|
|
41
|
+
throw new NotFoundError(`${d.fn.close}: ${d.label} ${id} not found for tenant ${tenantId}`);
|
|
42
|
+
if (written.refused !== 'status')
|
|
43
|
+
throw new NotFoundError(`${d.fn.close}: ${d.label} ${id} not found after UPDATE`);
|
|
44
|
+
const closable = d.closableFrom.join(' or ');
|
|
45
|
+
throw new ConflictError(`${d.fn.close}: ${d.label} ${id} is ${d.closeRefusal ?? `not ${closable}`} (status='${written.status}'); only ${closable} ${d.plural} can be closed.`);
|
|
46
|
+
}
|
|
47
|
+
/** Retires one object; its mirror memory stays as saved. */
|
|
48
|
+
export function closeObjectAt(hippoRoot, d, tenantId, id, actor) {
|
|
49
|
+
const close = closing(d, tenantId, actor);
|
|
50
|
+
return closed(d, tenantId, id, sqliteObjects(hippoRoot).closeObject(tenantId, d.kind, id, close));
|
|
51
|
+
}
|
|
52
|
+
export async function closeObject(objects, d, tenantId, id, actor) {
|
|
53
|
+
const close = closing(d, tenantId, actor);
|
|
54
|
+
return closed(d, tenantId, id, await objects.closeObject(tenantId, d.kind, id, close));
|
|
55
|
+
}
|
|
56
|
+
/** The memory a typed object writes beside its row, so recall finds the object. */
|
|
57
|
+
export function objectMirror(hippoRoot, tenantId, source, text) {
|
|
58
|
+
return createMemory(text.content, {
|
|
59
|
+
tags: [source, ...text.tags],
|
|
60
|
+
layer: Layer.Semantic,
|
|
61
|
+
confidence: 'verified',
|
|
62
|
+
source,
|
|
63
|
+
baseHalfLifeDays: loadConfig(hippoRoot).defaultHalfLifeDays,
|
|
64
|
+
tenantId,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function objectSave(site, kind, draft) {
|
|
68
|
+
const mirror = objectMirror(site.hippoRoot, site.tenantId, kind, draft);
|
|
69
|
+
return { mirror, fields: draft.fields, supersedesId: draft.supersedesId, changeSummary: draft.changeSummary, actor: site.actor, at: draft.at };
|
|
70
|
+
}
|
|
71
|
+
function saved(d, tenantId, replaced, written) {
|
|
72
|
+
if (!isObjectRefusal(written))
|
|
73
|
+
return written;
|
|
74
|
+
switch (written.refused) {
|
|
75
|
+
case 'missing':
|
|
76
|
+
throw new NotFoundError(`${d.fn.save}: ${d.label} ${replaced} to supersede not found for tenant ${tenantId}`);
|
|
77
|
+
case 'status':
|
|
78
|
+
throw new ConflictError(`${d.fn.save}: ${d.label} ${replaced} is not active (status='${written.status}'); only active ${d.plural} can be superseded.`);
|
|
79
|
+
case 'raced':
|
|
80
|
+
throw new ConflictError(`${d.fn.save}: ${d.label} ${replaced} could not be superseded (no longer active or self-reference).`);
|
|
81
|
+
case 'vanished':
|
|
82
|
+
throw new Error(`${d.fn.save}: failed to reload saved ${d.label} row`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Creates an object, or the version that replaces the one its options name, with its mirror memory in one write. */
|
|
86
|
+
export function saveObjectAt(d, site, opts) {
|
|
87
|
+
assertTenantId(d.fn.save, site.tenantId);
|
|
88
|
+
const draft = d.draft(opts);
|
|
89
|
+
return saved(d, site.tenantId, draft.supersedesId, sqliteObjects(site.hippoRoot).saveObject(site.tenantId, d.kind, objectSave(site, d.kind, draft)));
|
|
90
|
+
}
|
|
91
|
+
export async function saveObject(objects, d, site, opts) {
|
|
92
|
+
assertTenantId(d.fn.save, site.tenantId);
|
|
93
|
+
const draft = d.draft(opts);
|
|
94
|
+
return saved(d, site.tenantId, draft.supersedesId, await objects.saveObject(site.tenantId, d.kind, objectSave(site, d.kind, draft)));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -34,33 +34,14 @@
|
|
|
34
34
|
* otherwise make a same-day policy invisible).
|
|
35
35
|
*
|
|
36
36
|
* Dual-write atomicity: `savePolicy` writes the memory + policies row (and, on
|
|
37
|
-
* supersede, the predecessor's UPDATE)
|
|
37
|
+
* supersede, the predecessor's UPDATE) in the `objects` store group's one transaction.
|
|
38
38
|
*/
|
|
39
|
-
import {
|
|
40
|
-
|
|
39
|
+
import type { KeysetPosition } from '../util/keyset.js';
|
|
40
|
+
import type { SavableDescriptor } from './descriptor.js';
|
|
41
|
+
import type { Policy, PolicyStatus } from '../store/object-types.js';
|
|
42
|
+
import type { Objects } from '../store/port.js';
|
|
43
|
+
export type { Policy, PolicyStatus } from '../store/object-types.js';
|
|
41
44
|
export declare const VALID_POLICY_STATES: ReadonlySet<PolicyStatus>;
|
|
42
|
-
export interface Policy {
|
|
43
|
-
id: number;
|
|
44
|
-
/** Nullable: ON DELETE SET NULL lets memory deletion proceed without breaking
|
|
45
|
-
* the policy row. */
|
|
46
|
-
memoryId: string | null;
|
|
47
|
-
tenantId: string;
|
|
48
|
-
policyName: string;
|
|
49
|
-
policyText: string;
|
|
50
|
-
/** Canonical ISO-8601 datetime; when the policy takes effect. Always set. */
|
|
51
|
-
validFrom: string;
|
|
52
|
-
/** Canonical ISO-8601 datetime; when it expires. null = open-ended. */
|
|
53
|
-
validTo: string | null;
|
|
54
|
-
/** Server-derived: 1 on a fresh create, predecessor.version + 1 on supersede. */
|
|
55
|
-
version: number;
|
|
56
|
-
status: PolicyStatus;
|
|
57
|
-
supersededBy: number | null;
|
|
58
|
-
supersededAt: string | null;
|
|
59
|
-
/** The per-version delta note; set on a successor row only (NULL on a v1). */
|
|
60
|
-
changeSummary: string | null;
|
|
61
|
-
closedAt: string | null;
|
|
62
|
-
createdAt: string;
|
|
63
|
-
}
|
|
64
45
|
export interface SavePolicyOpts {
|
|
65
46
|
policyName: string;
|
|
66
47
|
policyText: string;
|
|
@@ -98,13 +79,14 @@ export declare function validatePolicyDates(validFromRaw: string | undefined, va
|
|
|
98
79
|
validFrom: string;
|
|
99
80
|
validTo: string | null;
|
|
100
81
|
};
|
|
82
|
+
export declare const POLICY: SavableDescriptor<'policy', SavePolicyOpts>;
|
|
101
83
|
/**
|
|
102
84
|
* Create a policy (or a new version that supersedes an existing one). Writes the
|
|
103
|
-
* memory mirror + the policies row
|
|
85
|
+
* memory mirror + the policies row in the `objects` store group's one transaction.
|
|
104
86
|
* valid_from defaults to now; valid_to must be > valid_from (validatePolicyDates).
|
|
105
87
|
* When supersedesPolicyId is given, the referenced ACTIVE row is preflighted
|
|
106
88
|
* (status + version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same
|
|
107
|
-
*
|
|
89
|
+
* transaction; the new version = predecessor.version + 1 (server-derived).
|
|
108
90
|
*/
|
|
109
91
|
export declare function savePolicy(hippoRoot: string, tenantId: string, opts: SavePolicyOpts, actor?: string): Policy;
|
|
110
92
|
/**
|
|
@@ -148,4 +130,9 @@ export declare function loadPoliciesAsOf(hippoRoot: string, tenantId: string, as
|
|
|
148
130
|
name?: string;
|
|
149
131
|
limit?: number;
|
|
150
132
|
}): Policy[];
|
|
133
|
+
/** `loadPoliciesAsOf` over a served store's group. */
|
|
134
|
+
export declare function policiesAsOf(objects: Objects, tenantId: string, asOfDate: string, opts?: {
|
|
135
|
+
name?: string;
|
|
136
|
+
limit?: number;
|
|
137
|
+
}): Promise<Policy[]>;
|
|
151
138
|
//# sourceMappingURL=policies.d.ts.map
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy first-class object.
|
|
3
|
+
*
|
|
4
|
+
* The "bi-temporal-first" object type: a named rule/statement that is in force
|
|
5
|
+
* over an EFFECTIVE-TIME range and evolves via supersession. Two time axes:
|
|
6
|
+
*
|
|
7
|
+
* - Valid time (effective time): when the policy is in force in the real world,
|
|
8
|
+
* as first-class columns `valid_from` (required; defaults to creation time)
|
|
9
|
+
* and `valid_to` (nullable = open-ended). This is the queryable axis: see
|
|
10
|
+
* `loadPoliciesAsOf` (the active policies in force at a given valid-time).
|
|
11
|
+
* - Transaction time (system time): when the row was recorded / retired, via
|
|
12
|
+
* `created_at` + the supersede chain's `superseded_at`. Present, but
|
|
13
|
+
* time-travel ("what did we BELIEVE was in force at past system time T") is
|
|
14
|
+
* deferred to a future version.
|
|
15
|
+
*
|
|
16
|
+
* The delta lifecycle reuses the process/decision supersede machinery verbatim
|
|
17
|
+
* (superseded_by self-FK + CAS + INSERT-preflight + server-derived version +
|
|
18
|
+
* change_summary + supersede tenant-match trigger). It DROPS process's `steps`
|
|
19
|
+
* (a policy has `policy_text`) and ADDS `valid_from`/`valid_to`.
|
|
20
|
+
*
|
|
21
|
+
* The `policies` table is the source of truth (survives memory decay); the
|
|
22
|
+
* memory mirror is for recall only. memory_id is NULLABLE with ON DELETE SET
|
|
23
|
+
* NULL so forget/consolidate/archive gracefully orphans the policy row.
|
|
24
|
+
*
|
|
25
|
+
* Lifecycle: active -> superseded (a newer version replaces it) or active ->
|
|
26
|
+
* closed (retired with no successor). Superseding leaves the predecessor's
|
|
27
|
+
* valid-time range intact (it WAS effective then); only the status flips.
|
|
28
|
+
*
|
|
29
|
+
* Date handling: every date input (savePolicy's valid_from/valid_to,
|
|
30
|
+
* loadPoliciesAsOf's asOfDate) is normalized to canonical ISO-8601 datetime
|
|
31
|
+
* (`toISOString`) at the store boundary BEFORE any persist or compare, so the
|
|
32
|
+
* fixed-width values sort lexically and the half-open [valid_from, valid_to)
|
|
33
|
+
* comparison is correct (a date-only asOf vs a datetime valid_from would
|
|
34
|
+
* otherwise make a same-day policy invisible).
|
|
35
|
+
*
|
|
36
|
+
* Dual-write atomicity: `savePolicy` writes the memory + policies row (and, on
|
|
37
|
+
* supersede, the predecessor's UPDATE) in the `objects` store group's one transaction.
|
|
38
|
+
*/
|
|
39
|
+
import { BadRequestError } from '../core/api-errors.js';
|
|
40
|
+
import { assertTenantId } from '../store/tenant.js';
|
|
41
|
+
import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
|
|
42
|
+
import { sqliteObjects } from '../store/sqlite/objects-group.js';
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Domain types
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
export const VALID_POLICY_STATES = new Set([
|
|
47
|
+
'active',
|
|
48
|
+
'superseded',
|
|
49
|
+
'closed',
|
|
50
|
+
]);
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Date normalization + validation (the bi-temporal correctness core)
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
/**
|
|
55
|
+
* Parse + canonicalize a date input to ISO-8601 datetime (`toISOString`). Throws
|
|
56
|
+
* on an unparseable value. Whatever `new Date()` accepts is re-emitted in the
|
|
57
|
+
* single fixed-width canonical form, so date-only and datetime inputs collapse to
|
|
58
|
+
* comparable values and lexical ordering is sound. (Overflow inputs like
|
|
59
|
+
* '2026-02-30' roll forward per JS Date semantics rather than throwing; the
|
|
60
|
+
* stored value is still canonical.)
|
|
61
|
+
*/
|
|
62
|
+
export function normalizePolicyDate(input, label = 'date') {
|
|
63
|
+
const d = new Date(input);
|
|
64
|
+
if (Number.isNaN(d.getTime())) {
|
|
65
|
+
throw new BadRequestError(`policy: invalid ${label} "${input}" (expected an ISO-8601 date or datetime)`);
|
|
66
|
+
}
|
|
67
|
+
return d.toISOString();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Normalize valid_from (defaulting to `nowIso` when undefined) + valid_to (null
|
|
71
|
+
* when undefined), then enforce valid_to > valid_from. Returns the canonical pair.
|
|
72
|
+
*/
|
|
73
|
+
export function validatePolicyDates(validFromRaw, validToRaw, nowIso) {
|
|
74
|
+
const validFrom = validFromRaw !== undefined ? normalizePolicyDate(validFromRaw, 'valid_from') : nowIso;
|
|
75
|
+
const validTo = validToRaw !== undefined && validToRaw !== null
|
|
76
|
+
? normalizePolicyDate(validToRaw, 'valid_to')
|
|
77
|
+
: null;
|
|
78
|
+
if (validTo !== null && validTo <= validFrom) {
|
|
79
|
+
throw new BadRequestError(`policy: valid_to (${validTo}) must be strictly after valid_from (${validFrom})`);
|
|
80
|
+
}
|
|
81
|
+
return { validFrom, validTo };
|
|
82
|
+
}
|
|
83
|
+
/** Recall-surface content for the memory mirror: name + rule + effective range. */
|
|
84
|
+
function buildPolicyContent(policyName, policyText, validFrom, validTo) {
|
|
85
|
+
const range = validTo ? `${validFrom} to ${validTo}` : `${validFrom} onward`;
|
|
86
|
+
return `${policyName}\n\n${policyText}\n\nEffective: ${range}`;
|
|
87
|
+
}
|
|
88
|
+
export const POLICY = {
|
|
89
|
+
kind: 'policy',
|
|
90
|
+
label: 'policy',
|
|
91
|
+
plural: 'policies',
|
|
92
|
+
fn: { get: 'loadPolicyById', close: 'closePolicy', list: 'loadPolicies', save: 'savePolicy' },
|
|
93
|
+
states: VALID_POLICY_STATES,
|
|
94
|
+
closableFrom: ['active'],
|
|
95
|
+
draft(opts) {
|
|
96
|
+
if (!opts.policyName || opts.policyName.trim().length === 0) {
|
|
97
|
+
throw new BadRequestError('savePolicy: policyName is required');
|
|
98
|
+
}
|
|
99
|
+
if (!opts.policyText || opts.policyText.trim().length === 0) {
|
|
100
|
+
throw new BadRequestError('savePolicy: policyText is required');
|
|
101
|
+
}
|
|
102
|
+
const at = new Date().toISOString();
|
|
103
|
+
// valid_from defaults to the creation instant. A date-only as-of is widened to end-of-day on the read side,
|
|
104
|
+
// because backdating valid_from to midnight would report the policy in force earlier that day.
|
|
105
|
+
const { validFrom, validTo } = validatePolicyDates(opts.validFrom, opts.validTo, at);
|
|
106
|
+
return {
|
|
107
|
+
fields: { policyName: opts.policyName, policyText: opts.policyText, validFrom, validTo },
|
|
108
|
+
content: buildPolicyContent(opts.policyName, opts.policyText, validFrom, validTo),
|
|
109
|
+
tags: opts.extraTags ?? [],
|
|
110
|
+
supersedesId: opts.supersedesPolicyId,
|
|
111
|
+
changeSummary: opts.changeSummary,
|
|
112
|
+
at,
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// Public API
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
/**
|
|
120
|
+
* Create a policy (or a new version that supersedes an existing one). Writes the
|
|
121
|
+
* memory mirror + the policies row in the `objects` store group's one transaction.
|
|
122
|
+
* valid_from defaults to now; valid_to must be > valid_from (validatePolicyDates).
|
|
123
|
+
* When supersedesPolicyId is given, the referenced ACTIVE row is preflighted
|
|
124
|
+
* (status + version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same
|
|
125
|
+
* transaction; the new version = predecessor.version + 1 (server-derived).
|
|
126
|
+
*/
|
|
127
|
+
export function savePolicy(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
128
|
+
return saveObjectAt(POLICY, { hippoRoot, tenantId, actor }, opts);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Close (retire) an active policy with no successor. CAS guard WHERE
|
|
132
|
+
* status='active'; 0 changes distinguishes not-found from not-active. A
|
|
133
|
+
* superseded row is terminal and cannot be closed.
|
|
134
|
+
*/
|
|
135
|
+
export function closePolicy(hippoRoot, tenantId, id, actor = 'cli') {
|
|
136
|
+
return closeObjectAt(hippoRoot, POLICY, tenantId, id, actor);
|
|
137
|
+
}
|
|
138
|
+
export function loadPolicyById(hippoRoot, tenantId, id) {
|
|
139
|
+
return objectByIdAt(hippoRoot, POLICY, tenantId, id);
|
|
140
|
+
}
|
|
141
|
+
export function loadPolicies(hippoRoot, tenantId, opts = {}) {
|
|
142
|
+
return listObjectsAt(hippoRoot, POLICY, tenantId, opts);
|
|
143
|
+
}
|
|
144
|
+
export function loadActivePolicies(hippoRoot, tenantId, opts = {}) {
|
|
145
|
+
return loadPolicies(hippoRoot, tenantId, { status: 'active', limit: opts.limit });
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* The bi-temporal as-of query: the policies in force at `asOfDate` (a valid-time)
|
|
149
|
+
* per current knowledge. Half-open interval [valid_from, valid_to): a row covers
|
|
150
|
+
* T when valid_from <= asOf AND (valid_to IS NULL OR asOf < valid_to). asOfDate is
|
|
151
|
+
* normalized to canonical datetime first so the lexical comparison is sound.
|
|
152
|
+
*
|
|
153
|
+
* A row is returned when it covers T AND it is the live answer for T:
|
|
154
|
+
* - `active` rows that cover T, OR
|
|
155
|
+
* - `superseded` rows that cover T BUT whose successor was not yet effective at T
|
|
156
|
+
* (successor.valid_from > asOf) - i.e. an earlier version that was genuinely in
|
|
157
|
+
* force then. This is the core valid-time correctness: a Jan-Jun policy
|
|
158
|
+
* superseded in May is still the answer for `asof March`. Filtering on
|
|
159
|
+
* status='active' alone would conflate transaction-time with valid-time; the
|
|
160
|
+
* successor-aware filter mirrors the existing recall-history.ts asOf pattern.
|
|
161
|
+
*
|
|
162
|
+
* `closed` rows are EXCLUDED: closing is a deliberate transaction-time retirement,
|
|
163
|
+
* and resurrecting closed policies for a historical valid-time is full
|
|
164
|
+
* transaction-time-travel (deferred). Returns an ARRAY (overlapping same-name
|
|
165
|
+
* ranges are allowed in v1). Optionally filtered to one policy_name.
|
|
166
|
+
*
|
|
167
|
+
* Date-only `asOfDate` (YYYY-MM-DD, no time component) resolves to the END
|
|
168
|
+
* of that UTC day (23:59:59.999Z), so "as of [day D]" includes a policy that
|
|
169
|
+
* became effective at any instant during D - this is the read-side fix for the
|
|
170
|
+
* common create-then-asof-today workflow, keeping the stored valid_from honest.
|
|
171
|
+
* A full datetime asOf is used as the precise instant.
|
|
172
|
+
*/
|
|
173
|
+
export function loadPoliciesAsOf(hippoRoot, tenantId, asOfDate, opts = {}) {
|
|
174
|
+
return sqliteObjects(hippoRoot).policiesInForce(tenantId, inForceQuery(tenantId, asOfDate, opts));
|
|
175
|
+
}
|
|
176
|
+
/** `loadPoliciesAsOf` over a served store's group. */
|
|
177
|
+
export async function policiesAsOf(objects, tenantId, asOfDate, opts = {}) {
|
|
178
|
+
return objects.policiesInForce(tenantId, inForceQuery(tenantId, asOfDate, opts));
|
|
179
|
+
}
|
|
180
|
+
/** The as-of read, checked before a store is asked. */
|
|
181
|
+
function inForceQuery(tenantId, asOfDate, opts) {
|
|
182
|
+
assertTenantId('loadPoliciesAsOf', tenantId);
|
|
183
|
+
// A bare date means the whole of that day, so it reads as the day's last instant; a datetime is used as given.
|
|
184
|
+
const asOf = /^\d{4}-\d{2}-\d{2}$/.test(asOfDate.trim())
|
|
185
|
+
? normalizePolicyDate(`${asOfDate.trim()}T23:59:59.999Z`, 'asOfDate')
|
|
186
|
+
: normalizePolicyDate(asOfDate, 'asOfDate');
|
|
187
|
+
return { asOf, name: opts.name, limit: opts.limit ?? 100 };
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=policies.js.map
|