hippo-memory 1.70.0 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +14 -5
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +10 -5
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +2 -22
- package/dist/api/audit.d.ts +5 -1
- package/dist/api/audit.js +9 -1
- package/dist/api/auth.d.ts +13 -22
- package/dist/api/auth.js +34 -24
- package/dist/api/auto-sleep.js +2 -2
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +2 -15
- package/dist/api/context-select.js +3 -4
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +21 -38
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +7 -26
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +5 -26
- package/dist/api/forget.d.ts +5 -24
- package/dist/api/forget.js +5 -28
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/instruction-detect.js +16 -5
- package/dist/api/ledger-db.d.ts +2 -1
- package/dist/api/ledger-db.js +5 -3
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +11 -19
- package/dist/api/prompt-hook.d.ts +4 -4
- package/dist/api/prompt-hook.js +10 -9
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.js +14 -6
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +16 -9
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +59 -60
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +18 -1
- package/dist/api/remember.js +13 -1
- package/dist/api/sleep-run.d.ts +1 -3
- package/dist/api/sleep-run.js +17 -21
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +3 -10
- package/dist/api/types.d.ts +6 -29
- package/dist/api/types.js +4 -22
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +6 -22
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +16 -25
- package/dist/capture/compaction-record.js +101 -69
- package/dist/capture/compaction-spool.d.ts +1 -1
- package/dist/capture/compaction-spool.js +1 -1
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +13 -7
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +4 -18
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +6 -39
- package/dist/cli/audit-prune.js +6 -39
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +33 -34
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +57 -39
- package/dist/cli/briefs.d.ts +4 -4
- package/dist/cli/briefs.js +18 -22
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +31 -32
- package/dist/cli/client.d.ts +7 -27
- package/dist/cli/client.js +24 -43
- package/dist/cli/compact-resume-payload.js +3 -2
- package/dist/cli/context.d.ts +1 -2
- package/dist/cli/context.js +12 -8
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +62 -64
- package/dist/cli/correction-latency.d.ts +2 -14
- package/dist/cli/correction-latency.js +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +68 -92
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +33 -27
- package/dist/cli/decisions.d.ts +4 -4
- package/dist/cli/decisions.js +33 -47
- package/dist/cli/eval.js +15 -13
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +6 -4
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +27 -10
- package/dist/cli/flags.d.ts +1 -0
- package/dist/cli/flags.js +1 -1
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/hook-runtime.d.ts +9 -27
- package/dist/cli/hook-runtime.js +15 -31
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +6 -12
- package/dist/cli/install-steps.js +3 -12
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +3 -0
- package/dist/cli/maintenance.d.ts +4 -4
- package/dist/cli/maintenance.js +14 -19
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +4 -4
- package/dist/cli/playbooks.js +23 -28
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +1 -4
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +1 -3
- package/dist/cli/provenance-coverage.d.ts +2 -6
- package/dist/cli/provenance-coverage.js +2 -6
- package/dist/cli/quality-repair-once.js +2 -2
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +55 -131
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +9 -36
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +122 -180
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +12 -18
- package/dist/cli/serve.js +21 -12
- package/dist/cli/session-hooks.d.ts +10 -18
- package/dist/cli/session-hooks.js +112 -113
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +19 -21
- package/dist/cli/shared.d.ts +9 -23
- package/dist/cli/shared.js +9 -32
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +15 -16
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +55 -98
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +66 -89
- package/dist/cli/usage.js +11 -5
- package/dist/cli.d.ts +66 -448
- package/dist/cli.js +87 -263
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +14 -49
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +12 -29
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +4 -10
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +2 -16
- package/dist/connectors/github/webhook.js +6 -22
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +2 -19
- package/dist/connectors/slack/ingest.d.ts +2 -3
- package/dist/connectors/slack/ingest.js +2 -3
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +2 -19
- package/dist/connectors/slack/webhook.js +5 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +6 -14
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +14 -75
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +6 -52
- package/dist/consolidate/dedupe.js +13 -71
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +4 -21
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +16 -104
- package/dist/consolidate/merge.js +10 -31
- package/dist/consolidate/merged-row.js +2 -1
- package/dist/consolidate/physics-pass.js +1 -3
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +14 -52
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +5 -17
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +6 -22
- package/dist/core/ablation.d.ts +4 -91
- package/dist/core/ablation.js +4 -91
- package/dist/core/ambient.d.ts +1 -8
- package/dist/core/ambient.js +1 -8
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +8 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +13 -14
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +41 -164
- package/dist/core/memory.js +51 -221
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +59 -122
- package/dist/core/project-identity.d.ts +17 -58
- package/dist/core/project-identity.js +17 -38
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +1 -1
- package/dist/db/busy.js +17 -8
- package/dist/db/connect.d.ts +1 -0
- package/dist/db/connect.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/open.d.ts +2 -0
- package/dist/db/open.js +17 -1
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +25 -36
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +8 -1
- package/dist/doctor.js +74 -19
- package/dist/entry/session-text.js +2 -1
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +74 -34
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +7 -34
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +19 -11
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +7 -33
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +14 -76
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +11 -39
- package/dist/hooks/codex-wrapper.js +2 -2
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +18 -57
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +9 -76
- package/dist/hooks/shared.d.ts +8 -17
- package/dist/hooks/shared.js +29 -20
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +9 -27
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +7 -35
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +25 -81
- package/dist/index.d.ts +6 -2
- package/dist/index.js +6 -2
- package/dist/learn/autolearn.d.ts +14 -41
- package/dist/learn/autolearn.js +14 -41
- package/dist/learn/extract.js +2 -4
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +14 -66
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +9 -26
- package/dist/mcp/admin-tools.js +3 -5
- package/dist/mcp/memory-tools.js +4 -9
- package/dist/mcp/protocol.d.ts +8 -26
- package/dist/mcp/protocol.js +3 -6
- package/dist/mcp/recall-tools.js +3 -3
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +10 -26
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +48 -12
- package/dist/mcp/tools.js +5 -3
- package/dist/objects/customer-notes.d.ts +7 -42
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +12 -50
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/incidents.d.ts +7 -38
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/policies.d.ts +11 -89
- package/dist/objects/policies.js +11 -98
- package/dist/objects/processes.d.ts +7 -52
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +11 -55
- package/dist/objects/project-briefs.js +14 -75
- package/dist/objects/skills.d.ts +7 -42
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +6 -19
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +3 -31
- package/dist/rerankers/cross-encoder.js +4 -6
- package/dist/rerankers/jev.js +9 -6
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +2 -1
- package/dist/rerankers/outage-warning.js +2 -1
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +2 -2
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid.d.ts +2 -0
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.js +11 -8
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +7 -0
- package/dist/search/vector.js +35 -5
- package/dist/server/auth.d.ts +9 -28
- package/dist/server/auth.js +32 -25
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +63 -96
- package/dist/server/client-ip.d.ts +3 -19
- package/dist/server/client-ip.js +5 -28
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +10 -44
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +9 -17
- package/dist/server/route-table.js +42 -49
- package/dist/server/routes/admin.js +22 -28
- package/dist/server/routes/customer-notes.js +7 -12
- package/dist/server/routes/decisions.js +10 -17
- package/dist/server/routes/incidents.js +12 -20
- package/dist/server/routes/memories.js +12 -32
- package/dist/server/routes/object-routes.d.ts +0 -5
- package/dist/server/routes/object-routes.js +7 -15
- package/dist/server/routes/policies.js +10 -18
- package/dist/server/routes/predictions.js +13 -25
- package/dist/server/routes/processes.js +16 -26
- package/dist/server/routes/project-briefs.js +9 -16
- package/dist/server/routes/recall.js +10 -35
- package/dist/server/routes/skills.js +8 -18
- package/dist/server/server-detect.d.ts +9 -53
- package/dist/server/server-detect.js +24 -90
- package/dist/server/sleep-offload.js +4 -1
- package/dist/server/types.d.ts +12 -10
- package/dist/server/validation.d.ts +3 -1
- package/dist/server/validation.js +10 -23
- package/dist/server.d.ts +2 -2
- package/dist/server.js +3 -2
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/sharing/project-merge.d.ts +4 -5
- package/dist/sharing/project-merge.js +9 -7
- package/dist/sharing/scope.d.ts +4 -11
- package/dist/sharing/scope.js +4 -11
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/store/ambient.js +4 -9
- package/dist/store/audit-event.d.ts +4 -12
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -5
- package/dist/store/audit.js +4 -12
- package/dist/store/auth.d.ts +6 -6
- package/dist/store/auth.js +10 -9
- package/dist/store/candidates.d.ts +20 -3
- package/dist/store/candidates.js +77 -48
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +71 -150
- package/dist/store/connectors/github.d.ts +10 -10
- package/dist/store/connectors/github.js +10 -10
- package/dist/store/dashboard-reads.js +4 -8
- package/dist/store/delete-and-batch.d.ts +11 -31
- package/dist/store/delete-and-batch.js +48 -64
- package/dist/store/delivery-recorder.d.ts +8 -4
- package/dist/store/delivery-recorder.js +25 -15
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +7 -29
- package/dist/store/dormant.js +15 -56
- package/dist/store/embeddings/index.d.ts +11 -80
- package/dist/store/embeddings/index.js +71 -207
- package/dist/store/embeddings/local.js +15 -32
- package/dist/store/embeddings/provider.d.ts +16 -53
- package/dist/store/embeddings/provider.js +41 -69
- package/dist/store/entry-reads.d.ts +21 -57
- package/dist/store/entry-reads.js +65 -126
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +10 -16
- package/dist/store/entry-writes.js +17 -35
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +21 -160
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +20 -58
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -31
- package/dist/store/graph-writes.js +13 -37
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +5 -11
- package/dist/store/handoffs.js +16 -34
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +34 -82
- package/dist/store/markdown.d.ts +2 -6
- package/dist/store/markdown.js +21 -20
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +14 -23
- package/dist/store/open.js +6 -13
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +82 -79
- package/dist/store/predictions.d.ts +11 -51
- package/dist/store/predictions.js +38 -119
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-scope.d.ts +19 -79
- package/dist/store/recall-scope.js +21 -82
- package/dist/store/recall-trace.d.ts +10 -77
- package/dist/store/recall-trace.js +19 -95
- package/dist/store/rejected-values.js +7 -19
- package/dist/store/rejection.d.ts +12 -58
- package/dist/store/rejection.js +13 -65
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +14 -50
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +17 -73
- package/dist/store/sqlite/connector-events-group.js +2 -2
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- package/dist/store/sqlite/error-codec.js +4 -2
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +2 -1
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.js +4 -2
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +2 -3
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +10 -62
- package/dist/store/summaries.js +34 -146
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -43
- package/dist/store/token-ledger.js +19 -50
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/store/yaml.d.ts +1 -5
- package/dist/store/yaml.js +2 -6
- package/dist/support-bundle.js +7 -5
- package/dist/trust/reject-flow.js +1 -3
- package/dist/util/anthropic-messages.js +14 -2
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/env.d.ts +13 -6
- package/dist/util/env.js +14 -7
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/http-retry.d.ts +3 -1
- package/dist/util/http-retry.js +26 -5
- package/dist/util/log.d.ts +3 -2
- package/dist/util/log.js +25 -9
- package/dist/util/request-scope.d.ts +2 -1
- package/dist/util/request-scope.js +2 -1
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +13 -39
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/extensions/openclaw-plugin/index.ts +1 -1
- 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 +1 -1
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
|
@@ -1,23 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* A `customer_note` is a discrete note recorded against an account/customer entity:
|
|
5
|
-
* a `note` body scoped to a `customer`, evolving via the supersede delta lifecycle.
|
|
6
|
-
* Entity-scoping is a free-form `customer` column (the `entities` table is unbuilt,
|
|
7
|
-
* so an FK is deferred). Unlike project_brief's one-summary-per-repo,
|
|
8
|
-
* a customer accrues MANY discrete notes over time, each with its own supersede chain
|
|
9
|
-
* (correct a note -> a new version preserving history; close retires it).
|
|
10
|
-
*
|
|
11
|
-
* Reuses the project_brief/skill supersede machinery verbatim (superseded_by self-FK
|
|
12
|
-
* + CAS + INSERT-preflight + server-derived version + change_summary + supersede
|
|
13
|
-
* tenant-match trigger). It has NO assembler/renderer (the simplest first-class object): the
|
|
14
|
-
* contribution is purely the entity-scoping dimension.
|
|
15
|
-
*
|
|
16
|
-
* The `customer_notes` table is the source of truth (survives memory decay); the
|
|
17
|
-
* memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
|
|
18
|
-
*
|
|
19
|
-
* Lifecycle: active -> superseded (a corrected version) or active -> closed (retired).
|
|
20
|
-
*/
|
|
1
|
+
/** customer_note object: many discrete notes per free-form `customer` column (no entities FK yet), each with its own supersede chain.
|
|
2
|
+
* The `customer_notes` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
|
|
21
3
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
22
4
|
import type { SavableDescriptor } from './descriptor.js';
|
|
23
5
|
import type { CustomerNote, NoteStatus } from '../store/object-types.js';
|
|
@@ -47,32 +29,15 @@ export interface ListCustomerNotesOpts {
|
|
|
47
29
|
after?: KeysetPosition;
|
|
48
30
|
}
|
|
49
31
|
export declare const CUSTOMER_NOTE: SavableDescriptor<'customer_note', SaveCustomerNoteOpts>;
|
|
50
|
-
/**
|
|
51
|
-
*
|
|
52
|
-
* the memory mirror + the customer_notes row in the `objects` store group's one transaction.
|
|
53
|
-
* When supersedesNoteId is given, the referenced ACTIVE row is preflighted (status +
|
|
54
|
-
* version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same transaction;
|
|
55
|
-
* the new version = predecessor.version + 1 (server-derived).
|
|
56
|
-
*
|
|
57
|
-
* The memory mirror carries a `customer:<lc>` tag (in addition to ['customer_note']
|
|
58
|
-
* + caller extraTags) so scope-aware recall treats the note as entity-local. There is
|
|
59
|
-
* no self-recursion path (customer_note has no receipt-query/refresh).
|
|
60
|
-
*/
|
|
32
|
+
/** Create a customer_note, or a new version superseding an existing one, in the `objects` store group's one transaction.
|
|
33
|
+
* The mirror carries a `customer:<lc>` tag so scope-aware recall treats the note as entity-local. */
|
|
61
34
|
export declare function saveCustomerNote(hippoRoot: string, tenantId: string, opts: SaveCustomerNoteOpts, actor?: string): CustomerNote;
|
|
62
|
-
/**
|
|
63
|
-
* Close (retire) an active note. CAS guard WHERE status='active'; 0 changes
|
|
64
|
-
* distinguishes not-found from not-active. A superseded row is terminal.
|
|
65
|
-
*/
|
|
35
|
+
/** Close (retire) an active note; CAS on status='active', 0 changes means not-found or not-active. */
|
|
66
36
|
export declare function closeCustomerNote(hippoRoot: string, tenantId: string, id: number, actor?: string): CustomerNote;
|
|
67
37
|
export declare function loadCustomerNoteById(hippoRoot: string, tenantId: string, id: number): CustomerNote | null;
|
|
68
38
|
export declare function loadCustomerNotes(hippoRoot: string, tenantId: string, opts?: ListCustomerNotesOpts): CustomerNote[];
|
|
69
|
-
/**
|
|
70
|
-
*
|
|
71
|
-
* MANY notes) - this deliberately DIVERGES from project_brief's
|
|
72
|
-
* loadActiveBriefForRepo, which returns a single brief-or-null because a repo has one
|
|
73
|
-
* evolving summary. A future caller cloning the project_brief shape by analogy must
|
|
74
|
-
* not assume a single-return here; the plural name signals the list contract.
|
|
75
|
-
*/
|
|
39
|
+
/** All ACTIVE notes for a customer, newest first. Returns a LIST, unlike project_brief's single-or-null
|
|
40
|
+
* loadActiveBriefForRepo: a customer accrues many notes. */
|
|
76
41
|
export declare function loadActiveNotesForCustomer(hippoRoot: string, tenantId: string, customer: string, opts?: {
|
|
77
42
|
limit?: number;
|
|
78
43
|
}): CustomerNote[];
|
|
@@ -1,28 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* A `customer_note` is a discrete note recorded against an account/customer entity:
|
|
5
|
-
* a `note` body scoped to a `customer`, evolving via the supersede delta lifecycle.
|
|
6
|
-
* Entity-scoping is a free-form `customer` column (the `entities` table is unbuilt,
|
|
7
|
-
* so an FK is deferred). Unlike project_brief's one-summary-per-repo,
|
|
8
|
-
* a customer accrues MANY discrete notes over time, each with its own supersede chain
|
|
9
|
-
* (correct a note -> a new version preserving history; close retires it).
|
|
10
|
-
*
|
|
11
|
-
* Reuses the project_brief/skill supersede machinery verbatim (superseded_by self-FK
|
|
12
|
-
* + CAS + INSERT-preflight + server-derived version + change_summary + supersede
|
|
13
|
-
* tenant-match trigger). It has NO assembler/renderer (the simplest first-class object): the
|
|
14
|
-
* contribution is purely the entity-scoping dimension.
|
|
15
|
-
*
|
|
16
|
-
* The `customer_notes` table is the source of truth (survives memory decay); the
|
|
17
|
-
* memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
|
|
18
|
-
*
|
|
19
|
-
* Lifecycle: active -> superseded (a corrected version) or active -> closed (retired).
|
|
20
|
-
*/
|
|
1
|
+
/** customer_note object: many discrete notes per free-form `customer` column (no entities FK yet), each with its own supersede chain.
|
|
2
|
+
* The `customer_notes` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
|
|
21
3
|
import { checkText, requireLine } from './fields.js';
|
|
22
4
|
import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
|
|
23
|
-
// ---------------------------------------------------------------------------
|
|
24
|
-
// Domain types
|
|
25
|
-
// ---------------------------------------------------------------------------
|
|
26
5
|
export const VALID_NOTE_STATES = new Set([
|
|
27
6
|
'active',
|
|
28
7
|
'superseded',
|
|
@@ -69,27 +48,12 @@ export const CUSTOMER_NOTE = {
|
|
|
69
48
|
};
|
|
70
49
|
},
|
|
71
50
|
};
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
// ---------------------------------------------------------------------------
|
|
75
|
-
/**
|
|
76
|
-
* Create a customer_note (or a new version that supersedes an existing one). Writes
|
|
77
|
-
* the memory mirror + the customer_notes row in the `objects` store group's one transaction.
|
|
78
|
-
* When supersedesNoteId is given, the referenced ACTIVE row is preflighted (status +
|
|
79
|
-
* version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same transaction;
|
|
80
|
-
* the new version = predecessor.version + 1 (server-derived).
|
|
81
|
-
*
|
|
82
|
-
* The memory mirror carries a `customer:<lc>` tag (in addition to ['customer_note']
|
|
83
|
-
* + caller extraTags) so scope-aware recall treats the note as entity-local. There is
|
|
84
|
-
* no self-recursion path (customer_note has no receipt-query/refresh).
|
|
85
|
-
*/
|
|
51
|
+
/** Create a customer_note, or a new version superseding an existing one, in the `objects` store group's one transaction.
|
|
52
|
+
* The mirror carries a `customer:<lc>` tag so scope-aware recall treats the note as entity-local. */
|
|
86
53
|
export function saveCustomerNote(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
87
54
|
return saveObjectAt(CUSTOMER_NOTE, { hippoRoot, tenantId, actor }, opts);
|
|
88
55
|
}
|
|
89
|
-
/**
|
|
90
|
-
* Close (retire) an active note. CAS guard WHERE status='active'; 0 changes
|
|
91
|
-
* distinguishes not-found from not-active. A superseded row is terminal.
|
|
92
|
-
*/
|
|
56
|
+
/** Close (retire) an active note; CAS on status='active', 0 changes means not-found or not-active. */
|
|
93
57
|
export function closeCustomerNote(hippoRoot, tenantId, id, actor = 'cli') {
|
|
94
58
|
return closeObjectAt(hippoRoot, CUSTOMER_NOTE, tenantId, id, actor);
|
|
95
59
|
}
|
|
@@ -99,13 +63,8 @@ export function loadCustomerNoteById(hippoRoot, tenantId, id) {
|
|
|
99
63
|
export function loadCustomerNotes(hippoRoot, tenantId, opts = {}) {
|
|
100
64
|
return listObjectsAt(hippoRoot, CUSTOMER_NOTE, tenantId, { status: opts.status, filter: opts.customer, limit: opts.limit, after: opts.after });
|
|
101
65
|
}
|
|
102
|
-
/**
|
|
103
|
-
*
|
|
104
|
-
* MANY notes) - this deliberately DIVERGES from project_brief's
|
|
105
|
-
* loadActiveBriefForRepo, which returns a single brief-or-null because a repo has one
|
|
106
|
-
* evolving summary. A future caller cloning the project_brief shape by analogy must
|
|
107
|
-
* not assume a single-return here; the plural name signals the list contract.
|
|
108
|
-
*/
|
|
66
|
+
/** All ACTIVE notes for a customer, newest first. Returns a LIST, unlike project_brief's single-or-null
|
|
67
|
+
* loadActiveBriefForRepo: a customer accrues many notes. */
|
|
109
68
|
export function loadActiveNotesForCustomer(hippoRoot, tenantId, customer, opts = {}) {
|
|
110
69
|
return loadCustomerNotes(hippoRoot, tenantId, { customer, status: 'active', limit: opts.limit });
|
|
111
70
|
}
|
|
@@ -1,27 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
* `hippo decide` used to write only a tagged memory (tags ['decision'], source
|
|
5
|
-
* 'decision') with a 90-day half-life, so an in-force decision decayed out of
|
|
6
|
-
* recall even though it was never reversed. The `decisions` table is now the
|
|
7
|
-
* source of truth: a decision stays `active` regardless of memory decay, and
|
|
8
|
-
* `hippo decide list --status active` is authoritative. A memory row still
|
|
9
|
-
* mirrors the decision for recall surfaces but is NOT canonical — memory_id is
|
|
10
|
-
* NULLABLE with ON DELETE SET NULL so forget/consolidate/archive gracefully
|
|
11
|
-
* orphans the decision row.
|
|
12
|
-
*
|
|
13
|
-
* Lifecycle: active -> superseded (a newer decision replaces it; superseded_by
|
|
14
|
-
* points to the successor) or active -> closed (retired with no successor).
|
|
15
|
-
*
|
|
16
|
-
* Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
|
|
17
|
-
* enforce decisions.tenant_id == the referenced memory's tenant_id, and a
|
|
18
|
-
* superseded_by same-tenant trigger makes cross-tenant supersession
|
|
19
|
-
* unrepresentable. Mirrors the predictions pattern (src/predictions.ts).
|
|
20
|
-
*
|
|
21
|
-
* Dual-write atomicity: `saveDecision` hands the memory and the decision to the
|
|
22
|
-
* `objects` store group, which commits them (and, when superseding, the old
|
|
23
|
-
* row's UPDATE) together, so a failure in any step rolls all of them back.
|
|
24
|
-
*/
|
|
1
|
+
/** Decision object: the `decisions` table is the source of truth, so an in-force decision stays `active` despite memory decay.
|
|
2
|
+
* The memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall only; saveDecision commits both in one `objects` transaction. */
|
|
3
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
25
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
26
5
|
import type { SavableDescriptor } from './descriptor.js';
|
|
27
6
|
import type { Decision, DecisionStatus } from '../store/object-types.js';
|
|
@@ -30,9 +9,8 @@ export declare const VALID_DECISION_STATES: ReadonlySet<DecisionStatus>;
|
|
|
30
9
|
export interface SaveDecisionOpts {
|
|
31
10
|
decisionText: string;
|
|
32
11
|
context?: string;
|
|
33
|
-
/** Table id of an ACTIVE decision this one supersedes
|
|
34
|
-
*
|
|
35
|
-
* HTTP/SDK pass the table id directly. */
|
|
12
|
+
/** Table id of an ACTIVE decision this one supersedes; the CLI resolves a `--supersedes <memory-id>`
|
|
13
|
+
* via resolveActiveDecisionIdByMemory, HTTP/SDK pass the table id. */
|
|
36
14
|
supersedesDecisionId?: number;
|
|
37
15
|
/** Extra memory tags merged after ['decision'] (the CLI passes path-context
|
|
38
16
|
* tags; HTTP/SDK pass none). */
|
|
@@ -45,35 +23,19 @@ export interface ListDecisionsOpts {
|
|
|
45
23
|
after?: KeysetPosition;
|
|
46
24
|
}
|
|
47
25
|
export declare const DECISION: SavableDescriptor<'decision', SaveDecisionOpts>;
|
|
48
|
-
/**
|
|
49
|
-
*
|
|
50
|
-
* one transaction by the `objects` store group. When supersedesDecisionId is
|
|
51
|
-
* given, the referenced ACTIVE row is UPDATEd -> superseded in the SAME
|
|
52
|
-
* transaction (CAS: WHERE status='active'; zero rows changed means a duplicate
|
|
53
|
-
* supersede aborts the whole write rather than orphaning a successor).
|
|
54
|
-
*
|
|
55
|
-
* The memory mirror preserves the legacy `hippo decide` shape: tags
|
|
56
|
-
* ['decision', ...extraTags], source 'decision', confidence 'verified',
|
|
57
|
-
* the configured default half-life, content = "<text>\n\nContext: <context>"
|
|
58
|
-
* when context is given (so existing recall output is unchanged).
|
|
59
|
-
*/
|
|
26
|
+
/** Create a decision; the memory mirror and the row commit in one transaction.
|
|
27
|
+
* Superseding CASes the old row (WHERE status='active'), so a duplicate supersede aborts the whole write. */
|
|
60
28
|
export declare function saveDecision(hippoRoot: string, tenantId: string, opts: SaveDecisionOpts, actor?: string): Decision;
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
*/
|
|
29
|
+
/** Weaken the memory a new decision replaces, once the save has committed: half-life halved to a day at least, marked stale, tagged `superseded`. */
|
|
30
|
+
export declare function weakenSupersededMemory(hippoRoot: string, entry: MemoryEntry, actor?: string): void;
|
|
31
|
+
/** Close (retire) an active decision with no successor; the memory mirror is not mutated. */
|
|
65
32
|
export declare function closeDecision(hippoRoot: string, tenantId: string, id: number, actor?: string): Decision;
|
|
66
33
|
export declare function loadDecisionById(hippoRoot: string, tenantId: string, id: number): Decision | null;
|
|
67
34
|
export declare function loadDecisions(hippoRoot: string, tenantId: string, opts?: ListDecisionsOpts): Decision[];
|
|
68
35
|
export declare function loadActiveDecisions(hippoRoot: string, tenantId: string, opts?: {
|
|
69
36
|
limit?: number;
|
|
70
37
|
}): Decision[];
|
|
71
|
-
/**
|
|
72
|
-
*
|
|
73
|
-
* of the ACTIVE decision backed by that memory, or null when the memory has no
|
|
74
|
-
* active decision row (a legacy pre-episode decision-tagged memory). Extracted
|
|
75
|
-
* so the CLI's backward-compat path is unit-testable at the store layer without
|
|
76
|
-
* exporting cmdDecide.
|
|
77
|
-
*/
|
|
38
|
+
/** Resolve a `--supersedes <memory-id>` to the table id of the ACTIVE decision backed by that memory, or null.
|
|
39
|
+
* Exported so the CLI's backward-compat path is testable at the store layer. */
|
|
78
40
|
export declare function resolveActiveDecisionIdByMemory(hippoRoot: string, tenantId: string, memoryId: string): number | null;
|
|
79
41
|
//# sourceMappingURL=decisions.d.ts.map
|
|
@@ -1,34 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* `hippo decide` used to write only a tagged memory (tags ['decision'], source
|
|
5
|
-
* 'decision') with a 90-day half-life, so an in-force decision decayed out of
|
|
6
|
-
* recall even though it was never reversed. The `decisions` table is now the
|
|
7
|
-
* source of truth: a decision stays `active` regardless of memory decay, and
|
|
8
|
-
* `hippo decide list --status active` is authoritative. A memory row still
|
|
9
|
-
* mirrors the decision for recall surfaces but is NOT canonical — memory_id is
|
|
10
|
-
* NULLABLE with ON DELETE SET NULL so forget/consolidate/archive gracefully
|
|
11
|
-
* orphans the decision row.
|
|
12
|
-
*
|
|
13
|
-
* Lifecycle: active -> superseded (a newer decision replaces it; superseded_by
|
|
14
|
-
* points to the successor) or active -> closed (retired with no successor).
|
|
15
|
-
*
|
|
16
|
-
* Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
|
|
17
|
-
* enforce decisions.tenant_id == the referenced memory's tenant_id, and a
|
|
18
|
-
* superseded_by same-tenant trigger makes cross-tenant supersession
|
|
19
|
-
* unrepresentable. Mirrors the predictions pattern (src/predictions.ts).
|
|
20
|
-
*
|
|
21
|
-
* Dual-write atomicity: `saveDecision` hands the memory and the decision to the
|
|
22
|
-
* `objects` store group, which commits them (and, when superseding, the old
|
|
23
|
-
* row's UPDATE) together, so a failure in any step rolls all of them back.
|
|
24
|
-
*/
|
|
1
|
+
/** Decision object: the `decisions` table is the source of truth, so an in-force decision stays `active` despite memory decay.
|
|
2
|
+
* The memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall only; saveDecision commits both in one `objects` transaction. */
|
|
25
3
|
import { BadRequestError } from '../core/api-errors.js';
|
|
4
|
+
import { writeEntry } from '../store/entry-writes.js';
|
|
26
5
|
import { assertTenantId } from '../store/tenant.js';
|
|
27
6
|
import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
|
|
28
7
|
import { objectIdByMemory } from '../store/sqlite/objects-group.js';
|
|
29
|
-
|
|
30
|
-
// Domain types
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
8
|
+
const SUPERSEDED_TAG = 'superseded';
|
|
32
9
|
export const VALID_DECISION_STATES = new Set([
|
|
33
10
|
'active',
|
|
34
11
|
'superseded',
|
|
@@ -53,28 +30,18 @@ export const DECISION = {
|
|
|
53
30
|
};
|
|
54
31
|
},
|
|
55
32
|
};
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
// ---------------------------------------------------------------------------
|
|
59
|
-
/**
|
|
60
|
-
* Create a decision. The memory mirror and the decisions row are written in
|
|
61
|
-
* one transaction by the `objects` store group. When supersedesDecisionId is
|
|
62
|
-
* given, the referenced ACTIVE row is UPDATEd -> superseded in the SAME
|
|
63
|
-
* transaction (CAS: WHERE status='active'; zero rows changed means a duplicate
|
|
64
|
-
* supersede aborts the whole write rather than orphaning a successor).
|
|
65
|
-
*
|
|
66
|
-
* The memory mirror preserves the legacy `hippo decide` shape: tags
|
|
67
|
-
* ['decision', ...extraTags], source 'decision', confidence 'verified',
|
|
68
|
-
* the configured default half-life, content = "<text>\n\nContext: <context>"
|
|
69
|
-
* when context is given (so existing recall output is unchanged).
|
|
70
|
-
*/
|
|
33
|
+
/** Create a decision; the memory mirror and the row commit in one transaction.
|
|
34
|
+
* Superseding CASes the old row (WHERE status='active'), so a duplicate supersede aborts the whole write. */
|
|
71
35
|
export function saveDecision(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
72
36
|
return saveObjectAt(DECISION, { hippoRoot, tenantId, actor }, opts);
|
|
73
37
|
}
|
|
74
|
-
/**
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
38
|
+
/** Weaken the memory a new decision replaces, once the save has committed: half-life halved to a day at least, marked stale, tagged `superseded`. */
|
|
39
|
+
export function weakenSupersededMemory(hippoRoot, entry, actor = 'cli') {
|
|
40
|
+
const tags = entry.tags.includes(SUPERSEDED_TAG) ? entry.tags : [...entry.tags, SUPERSEDED_TAG];
|
|
41
|
+
const halved = Math.max(1, Math.floor(entry.half_life_days / 2));
|
|
42
|
+
writeEntry(hippoRoot, { ...entry, half_life_days: halved, confidence: 'stale', tags }, { actor });
|
|
43
|
+
}
|
|
44
|
+
/** Close (retire) an active decision with no successor; the memory mirror is not mutated. */
|
|
78
45
|
export function closeDecision(hippoRoot, tenantId, id, actor = 'cli') {
|
|
79
46
|
return closeObjectAt(hippoRoot, DECISION, tenantId, id, actor);
|
|
80
47
|
}
|
|
@@ -87,13 +54,8 @@ export function loadDecisions(hippoRoot, tenantId, opts = {}) {
|
|
|
87
54
|
export function loadActiveDecisions(hippoRoot, tenantId, opts = {}) {
|
|
88
55
|
return loadDecisions(hippoRoot, tenantId, { status: 'active', limit: opts.limit });
|
|
89
56
|
}
|
|
90
|
-
/**
|
|
91
|
-
*
|
|
92
|
-
* of the ACTIVE decision backed by that memory, or null when the memory has no
|
|
93
|
-
* active decision row (a legacy pre-episode decision-tagged memory). Extracted
|
|
94
|
-
* so the CLI's backward-compat path is unit-testable at the store layer without
|
|
95
|
-
* exporting cmdDecide.
|
|
96
|
-
*/
|
|
57
|
+
/** Resolve a `--supersedes <memory-id>` to the table id of the ACTIVE decision backed by that memory, or null.
|
|
58
|
+
* Exported so the CLI's backward-compat path is testable at the store layer. */
|
|
97
59
|
export function resolveActiveDecisionIdByMemory(hippoRoot, tenantId, memoryId) {
|
|
98
60
|
assertTenantId('resolveActiveDecisionIdByMemory', tenantId);
|
|
99
61
|
return objectIdByMemory(hippoRoot, tenantId, 'decision', 'active', memoryId);
|
|
@@ -1,30 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
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
|
-
*/
|
|
1
|
+
/** Incident object: a postmortem capsule with lifecycle open -> resolved -> closed (no supersede chain) and optional linked receipts.
|
|
2
|
+
* The `incidents` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall.
|
|
3
|
+
* linked_memory_ids must all exist in the SAME tenant or save throws before the insert. */
|
|
28
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
29
5
|
import type { ObjectDescriptor } from './descriptor.js';
|
|
30
6
|
import type { Incident, IncidentStatus } from '../store/object-types.js';
|
|
@@ -48,7 +24,8 @@ export interface ListIncidentsOpts {
|
|
|
48
24
|
after?: KeysetPosition;
|
|
49
25
|
}
|
|
50
26
|
export declare const INCIDENT: ObjectDescriptor<'incident'>;
|
|
51
|
-
/** Opens an incident with its mirror memory (content "<text>\n\nContext: <context>" when
|
|
27
|
+
/** Opens an incident with its mirror memory (content "<text>\n\nContext: <context>" when
|
|
28
|
+
* context is given) in one write; a linked memory outside the tenant refuses the whole write. */
|
|
52
29
|
export declare function saveIncident(hippoRoot: string, tenantId: string, opts: SaveIncidentOpts, actor?: string): Incident;
|
|
53
30
|
/** `saveIncident` over a served store's group. */
|
|
54
31
|
export declare function openIncident(objects: Objects, hippoRoot: string, tenantId: string, opts: SaveIncidentOpts, actor: string): Promise<Incident>;
|
|
@@ -56,21 +33,13 @@ export declare function openIncident(objects: Objects, hippoRoot: string, tenant
|
|
|
56
33
|
export declare function resolveIncident(hippoRoot: string, tenantId: string, id: number, resolutionText: string, actor?: string): Incident;
|
|
57
34
|
/** `resolveIncident` over a served store's group. */
|
|
58
35
|
export declare function resolveOpenIncident(objects: Objects, tenantId: string, id: number, resolutionText: string, actor: string): Promise<Incident>;
|
|
59
|
-
/**
|
|
60
|
-
* Close (retire) an incident from open or resolved (open|resolved -> closed).
|
|
61
|
-
* Updates closed_at only; the memory mirror is not mutated.
|
|
62
|
-
*/
|
|
36
|
+
/** Close (retire) an incident from open or resolved; sets closed_at only, the memory mirror is not mutated. */
|
|
63
37
|
export declare function closeIncident(hippoRoot: string, tenantId: string, id: number, actor?: string): Incident;
|
|
64
38
|
export declare function loadIncidentById(hippoRoot: string, tenantId: string, id: number): Incident | null;
|
|
65
39
|
export declare function loadIncidents(hippoRoot: string, tenantId: string, opts?: ListIncidentsOpts): Incident[];
|
|
66
40
|
export declare function loadOpenIncidents(hippoRoot: string, tenantId: string, opts?: {
|
|
67
41
|
limit?: number;
|
|
68
42
|
}): Incident[];
|
|
69
|
-
/**
|
|
70
|
-
* Resolve a memory id to the table id of the OPEN incident backed by that
|
|
71
|
-
* memory, or null when the memory has no open incident row. Extracted so a
|
|
72
|
-
* memory-id-based lookup is unit-testable at the store layer (mirror of
|
|
73
|
-
* resolveActiveDecisionIdByMemory).
|
|
74
|
-
*/
|
|
43
|
+
/** Resolve a memory id to the table id of the OPEN incident backed by it, or null; exported for store-layer tests. */
|
|
75
44
|
export declare function resolveActiveIncidentIdByMemory(hippoRoot: string, tenantId: string, memoryId: string): number | null;
|
|
76
45
|
//# sourceMappingURL=incidents.d.ts.map
|
|
@@ -1,38 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
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
|
-
*/
|
|
1
|
+
/** Incident object: a postmortem capsule with lifecycle open -> resolved -> closed (no supersede chain) and optional linked receipts.
|
|
2
|
+
* The `incidents` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall.
|
|
3
|
+
* linked_memory_ids must all exist in the SAME tenant or save throws before the insert. */
|
|
28
4
|
import { BadRequestError, ConflictError, NotFoundError } from '../core/api-errors.js';
|
|
29
5
|
import { assertTenantId } from '../store/tenant.js';
|
|
30
6
|
import { closeObjectAt, listObjectsAt, objectByIdAt, objectMirror } from './lifecycle.js';
|
|
31
7
|
import { isObjectRefusal } from '../store/port.js';
|
|
32
8
|
import { objectIdByMemory, sqliteObjects } from '../store/sqlite/objects-group.js';
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
// Domain types
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
9
|
export const VALID_INCIDENT_STATES = new Set([
|
|
37
10
|
'open',
|
|
38
11
|
'resolved',
|
|
@@ -69,7 +42,8 @@ function opened(tenantId, written) {
|
|
|
69
42
|
throw new NotFoundError(`saveIncident: linked memory ${written.memoryId} not found for tenant ${tenantId}`);
|
|
70
43
|
throw new Error('saveIncident: failed to reload saved incident row');
|
|
71
44
|
}
|
|
72
|
-
/** Opens an incident with its mirror memory (content "<text>\n\nContext: <context>" when
|
|
45
|
+
/** Opens an incident with its mirror memory (content "<text>\n\nContext: <context>" when
|
|
46
|
+
* context is given) in one write; a linked memory outside the tenant refuses the whole write. */
|
|
73
47
|
export function saveIncident(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
74
48
|
return opened(tenantId, sqliteObjects(hippoRoot).openIncident(tenantId, incidentOpen(hippoRoot, tenantId, opts, actor)));
|
|
75
49
|
}
|
|
@@ -101,10 +75,7 @@ export function resolveIncident(hippoRoot, tenantId, id, resolutionText, actor =
|
|
|
101
75
|
export async function resolveOpenIncident(objects, tenantId, id, resolutionText, actor) {
|
|
102
76
|
return resolved(tenantId, id, await objects.resolveIncident(tenantId, id, resolving(tenantId, resolutionText, actor)));
|
|
103
77
|
}
|
|
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
|
-
*/
|
|
78
|
+
/** Close (retire) an incident from open or resolved; sets closed_at only, the memory mirror is not mutated. */
|
|
108
79
|
export function closeIncident(hippoRoot, tenantId, id, actor = 'cli') {
|
|
109
80
|
return closeObjectAt(hippoRoot, INCIDENT, tenantId, id, actor);
|
|
110
81
|
}
|
|
@@ -117,12 +88,7 @@ export function loadIncidents(hippoRoot, tenantId, opts = {}) {
|
|
|
117
88
|
export function loadOpenIncidents(hippoRoot, tenantId, opts = {}) {
|
|
118
89
|
return loadIncidents(hippoRoot, tenantId, { status: 'open', limit: opts.limit });
|
|
119
90
|
}
|
|
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
|
-
*/
|
|
91
|
+
/** Resolve a memory id to the table id of the OPEN incident backed by it, or null; exported for store-layer tests. */
|
|
126
92
|
export function resolveActiveIncidentIdByMemory(hippoRoot, tenantId, memoryId) {
|
|
127
93
|
assertTenantId('resolveActiveIncidentIdByMemory', tenantId);
|
|
128
94
|
return objectIdByMemory(hippoRoot, tenantId, 'incident', 'open', memoryId);
|
|
@@ -1,41 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
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
|
-
*/
|
|
1
|
+
/** Policy object: a rule in force over a valid-time range [valid_from, valid_to), evolving via supersession; `loadPoliciesAsOf` queries it.
|
|
2
|
+
* Transaction-time travel (what we believed at past system time T) is deferred. Superseding keeps the predecessor's valid-time range.
|
|
3
|
+
* All dates are normalised to ISO-8601 (`toISOString`) at the store boundary so the lexical half-open comparison is sound. */
|
|
39
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
40
5
|
import type { SavableDescriptor } from './descriptor.js';
|
|
41
6
|
import type { Policy, PolicyStatus } from '../store/object-types.js';
|
|
@@ -62,70 +27,27 @@ export interface ListPoliciesOpts {
|
|
|
62
27
|
/** Resume after this row: the position the previous page ended on. */
|
|
63
28
|
after?: KeysetPosition;
|
|
64
29
|
}
|
|
65
|
-
/**
|
|
66
|
-
*
|
|
67
|
-
* on an unparseable value. Whatever `new Date()` accepts is re-emitted in the
|
|
68
|
-
* single fixed-width canonical form, so date-only and datetime inputs collapse to
|
|
69
|
-
* comparable values and lexical ordering is sound. (Overflow inputs like
|
|
70
|
-
* '2026-02-30' roll forward per JS Date semantics rather than throwing; the
|
|
71
|
-
* stored value is still canonical.)
|
|
72
|
-
*/
|
|
30
|
+
/** Parse a date input to a fixed-width ISO-8601 datetime so lexical ordering is sound; throws on an unparseable value.
|
|
31
|
+
* Overflow inputs like '2026-02-30' roll forward per JS Date semantics. */
|
|
73
32
|
export declare function normalizePolicyDate(input: string, label?: string): string;
|
|
74
|
-
/**
|
|
75
|
-
* Normalize valid_from (defaulting to `nowIso` when undefined) + valid_to (null
|
|
76
|
-
* when undefined), then enforce valid_to > valid_from. Returns the canonical pair.
|
|
77
|
-
*/
|
|
33
|
+
/** Normalise valid_from (default `nowIso`) and valid_to (default null), then enforce valid_to > valid_from. */
|
|
78
34
|
export declare function validatePolicyDates(validFromRaw: string | undefined, validToRaw: string | undefined, nowIso: string): {
|
|
79
35
|
validFrom: string;
|
|
80
36
|
validTo: string | null;
|
|
81
37
|
};
|
|
82
38
|
export declare const POLICY: SavableDescriptor<'policy', SavePolicyOpts>;
|
|
83
|
-
/**
|
|
84
|
-
*
|
|
85
|
-
* memory mirror + the policies row in the `objects` store group's one transaction.
|
|
86
|
-
* valid_from defaults to now; valid_to must be > valid_from (validatePolicyDates).
|
|
87
|
-
* When supersedesPolicyId is given, the referenced ACTIVE row is preflighted
|
|
88
|
-
* (status + version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same
|
|
89
|
-
* transaction; the new version = predecessor.version + 1 (server-derived).
|
|
90
|
-
*/
|
|
39
|
+
/** Create a policy, or a new version superseding an existing one, in the `objects` store group's one transaction.
|
|
40
|
+
* valid_from defaults to now; valid_to must be > valid_from (validatePolicyDates). */
|
|
91
41
|
export declare function savePolicy(hippoRoot: string, tenantId: string, opts: SavePolicyOpts, actor?: string): Policy;
|
|
92
|
-
/**
|
|
93
|
-
* Close (retire) an active policy with no successor. CAS guard WHERE
|
|
94
|
-
* status='active'; 0 changes distinguishes not-found from not-active. A
|
|
95
|
-
* superseded row is terminal and cannot be closed.
|
|
96
|
-
*/
|
|
42
|
+
/** Close (retire) an active policy with no successor; CAS on status='active', a superseded row is terminal. */
|
|
97
43
|
export declare function closePolicy(hippoRoot: string, tenantId: string, id: number, actor?: string): Policy;
|
|
98
44
|
export declare function loadPolicyById(hippoRoot: string, tenantId: string, id: number): Policy | null;
|
|
99
45
|
export declare function loadPolicies(hippoRoot: string, tenantId: string, opts?: ListPoliciesOpts): Policy[];
|
|
100
46
|
export declare function loadActivePolicies(hippoRoot: string, tenantId: string, opts?: {
|
|
101
47
|
limit?: number;
|
|
102
48
|
}): Policy[];
|
|
103
|
-
/**
|
|
104
|
-
*
|
|
105
|
-
* per current knowledge. Half-open interval [valid_from, valid_to): a row covers
|
|
106
|
-
* T when valid_from <= asOf AND (valid_to IS NULL OR asOf < valid_to). asOfDate is
|
|
107
|
-
* normalized to canonical datetime first so the lexical comparison is sound.
|
|
108
|
-
*
|
|
109
|
-
* A row is returned when it covers T AND it is the live answer for T:
|
|
110
|
-
* - `active` rows that cover T, OR
|
|
111
|
-
* - `superseded` rows that cover T BUT whose successor was not yet effective at T
|
|
112
|
-
* (successor.valid_from > asOf) - i.e. an earlier version that was genuinely in
|
|
113
|
-
* force then. This is the core valid-time correctness: a Jan-Jun policy
|
|
114
|
-
* superseded in May is still the answer for `asof March`. Filtering on
|
|
115
|
-
* status='active' alone would conflate transaction-time with valid-time; the
|
|
116
|
-
* successor-aware filter mirrors the existing recall-history.ts asOf pattern.
|
|
117
|
-
*
|
|
118
|
-
* `closed` rows are EXCLUDED: closing is a deliberate transaction-time retirement,
|
|
119
|
-
* and resurrecting closed policies for a historical valid-time is full
|
|
120
|
-
* transaction-time-travel (deferred). Returns an ARRAY (overlapping same-name
|
|
121
|
-
* ranges are allowed in v1). Optionally filtered to one policy_name.
|
|
122
|
-
*
|
|
123
|
-
* Date-only `asOfDate` (YYYY-MM-DD, no time component) resolves to the END
|
|
124
|
-
* of that UTC day (23:59:59.999Z), so "as of [day D]" includes a policy that
|
|
125
|
-
* became effective at any instant during D - this is the read-side fix for the
|
|
126
|
-
* common create-then-asof-today workflow, keeping the stored valid_from honest.
|
|
127
|
-
* A full datetime asOf is used as the precise instant.
|
|
128
|
-
*/
|
|
49
|
+
/** The policies in force at `asOfDate` (valid-time, half-open [valid_from, valid_to)); superseded rows still answer while the successor is not yet effective.
|
|
50
|
+
* `closed` rows are excluded; a date-only asOfDate means the END of that UTC day (23:59:59.999Z), so a policy created today shows up in "as of today". */
|
|
129
51
|
export declare function loadPoliciesAsOf(hippoRoot: string, tenantId: string, asOfDate: string, opts?: {
|
|
130
52
|
name?: string;
|
|
131
53
|
limit?: number;
|