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
package/dist/objects/policies.js
CHANGED
|
@@ -1,64 +1,17 @@
|
|
|
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 { BadRequestError } from '../core/api-errors.js';
|
|
40
5
|
import { assertTenantId } from '../store/tenant.js';
|
|
41
6
|
import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
|
|
42
7
|
import { sqliteObjects } from '../store/sqlite/objects-group.js';
|
|
43
|
-
// ---------------------------------------------------------------------------
|
|
44
|
-
// Domain types
|
|
45
|
-
// ---------------------------------------------------------------------------
|
|
46
8
|
export const VALID_POLICY_STATES = new Set([
|
|
47
9
|
'active',
|
|
48
10
|
'superseded',
|
|
49
11
|
'closed',
|
|
50
12
|
]);
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
*/
|
|
13
|
+
/** Parse a date input to a fixed-width ISO-8601 datetime so lexical ordering is sound; throws on an unparseable value.
|
|
14
|
+
* Overflow inputs like '2026-02-30' roll forward per JS Date semantics. */
|
|
62
15
|
export function normalizePolicyDate(input, label = 'date') {
|
|
63
16
|
const d = new Date(input);
|
|
64
17
|
if (Number.isNaN(d.getTime())) {
|
|
@@ -66,10 +19,7 @@ export function normalizePolicyDate(input, label = 'date') {
|
|
|
66
19
|
}
|
|
67
20
|
return d.toISOString();
|
|
68
21
|
}
|
|
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
|
-
*/
|
|
22
|
+
/** Normalise valid_from (default `nowIso`) and valid_to (default null), then enforce valid_to > valid_from. */
|
|
73
23
|
export function validatePolicyDates(validFromRaw, validToRaw, nowIso) {
|
|
74
24
|
const validFrom = validFromRaw !== undefined ? normalizePolicyDate(validFromRaw, 'valid_from') : nowIso;
|
|
75
25
|
const validTo = validToRaw !== undefined && validToRaw !== null
|
|
@@ -113,25 +63,12 @@ export const POLICY = {
|
|
|
113
63
|
};
|
|
114
64
|
},
|
|
115
65
|
};
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
*/
|
|
66
|
+
/** Create a policy, or a new version superseding an existing one, in the `objects` store group's one transaction.
|
|
67
|
+
* valid_from defaults to now; valid_to must be > valid_from (validatePolicyDates). */
|
|
127
68
|
export function savePolicy(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
128
69
|
return saveObjectAt(POLICY, { hippoRoot, tenantId, actor }, opts);
|
|
129
70
|
}
|
|
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
|
-
*/
|
|
71
|
+
/** Close (retire) an active policy with no successor; CAS on status='active', a superseded row is terminal. */
|
|
135
72
|
export function closePolicy(hippoRoot, tenantId, id, actor = 'cli') {
|
|
136
73
|
return closeObjectAt(hippoRoot, POLICY, tenantId, id, actor);
|
|
137
74
|
}
|
|
@@ -144,32 +81,8 @@ export function loadPolicies(hippoRoot, tenantId, opts = {}) {
|
|
|
144
81
|
export function loadActivePolicies(hippoRoot, tenantId, opts = {}) {
|
|
145
82
|
return loadPolicies(hippoRoot, tenantId, { status: 'active', limit: opts.limit });
|
|
146
83
|
}
|
|
147
|
-
/**
|
|
148
|
-
*
|
|
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
|
-
*/
|
|
84
|
+
/** 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.
|
|
85
|
+
* `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". */
|
|
173
86
|
export function loadPoliciesAsOf(hippoRoot, tenantId, asOfDate, opts = {}) {
|
|
174
87
|
return sqliteObjects(hippoRoot).policiesInForce(tenantId, inForceQuery(tenantId, asOfDate, opts));
|
|
175
88
|
}
|
|
@@ -1,34 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* A `process` is a "living process map": a named, ordered list of steps that
|
|
5
|
-
* evolves over time. Unlike `incident` (open->resolved->closed, no supersede),
|
|
6
|
-
* `process` REUSES the `decision` supersede path as its delta mechanism: a
|
|
7
|
-
* process evolves by being superseded by a NEW VERSION that records what
|
|
8
|
-
* changed (`change_summary`) and the full new state (`steps`), carrying a
|
|
9
|
-
* server-derived `version` counter. The version chain (walk `superseded_by`)
|
|
10
|
-
* is the changelog. Computed structural step-diffing is a deferred v2 read-side
|
|
11
|
-
* feature; the row stores enough to reconstruct any delta
|
|
12
|
-
* (predecessor.steps + successor.steps + change_summary).
|
|
13
|
-
*
|
|
14
|
-
* The `processes` table is the source of truth: a process stays `active`
|
|
15
|
-
* regardless of memory decay. A memory row mirrors the process for recall but
|
|
16
|
-
* is NOT canonical — memory_id is NULLABLE with ON DELETE SET NULL so
|
|
17
|
-
* forget/consolidate/archive gracefully orphans the process row.
|
|
18
|
-
*
|
|
19
|
-
* Lifecycle: active -> superseded (a newer version replaces it; superseded_by
|
|
20
|
-
* points to the successor) or active -> closed (retired with no successor;
|
|
21
|
-
* only an active head closes).
|
|
22
|
-
*
|
|
23
|
-
* Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
|
|
24
|
-
* enforce processes.tenant_id == the referenced memory's tenant_id, and a
|
|
25
|
-
* superseded_by same-tenant trigger makes cross-tenant supersession
|
|
26
|
-
* unrepresentable. Mirrors the v30 decisions pattern (src/objects/decisions.ts).
|
|
27
|
-
*
|
|
28
|
-
* Dual-write atomicity: `saveProcess` hands the memory and the process to the
|
|
29
|
-
* `objects` store group, which commits them (and, when superseding, the
|
|
30
|
-
* predecessor's UPDATE) together, so a failure in any step rolls all of them back.
|
|
31
|
-
*/
|
|
1
|
+
/** Process object: a named, ordered list of `steps` that evolves by supersession, each version recording `change_summary` and a server-derived `version`.
|
|
2
|
+
* The `processes` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall.
|
|
3
|
+
* Structural step-diffing is a deferred read-side feature; the version chain is the changelog. */
|
|
32
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
33
5
|
import { type JsonValue } from '../util/json.js';
|
|
34
6
|
import type { SavableDescriptor } from './descriptor.js';
|
|
@@ -55,30 +27,13 @@ export interface ListProcessesOpts {
|
|
|
55
27
|
/** Resume after this row: the position the previous page ended on. */
|
|
56
28
|
after?: KeysetPosition;
|
|
57
29
|
}
|
|
58
|
-
/**
|
|
59
|
-
* Validate + normalise the steps body. Returns the trimmed step strings
|
|
60
|
-
* (trim-then-store, so ' x ' is stored as 'x'). Throws on a non-array, a
|
|
61
|
-
* non-string / empty element, or a cap breach. Mirrors the incident DoS-cap
|
|
62
|
-
* discipline.
|
|
63
|
-
*/
|
|
30
|
+
/** Validate and trim the steps body; throws on a non-array, a non-string or empty element, or a cap breach. */
|
|
64
31
|
export declare function validateProcessSteps(steps: JsonValue): string[];
|
|
65
32
|
export declare const PROCESS: SavableDescriptor<'process', SaveProcessOpts>;
|
|
66
|
-
/**
|
|
67
|
-
*
|
|
68
|
-
* the memory mirror + the processes row in the `objects` store group's one
|
|
69
|
-
* transaction. When supersedesProcessId is given, the referenced ACTIVE row is
|
|
70
|
-
* preflighted (status + version) BEFORE the INSERT, then UPDATEd -> superseded in
|
|
71
|
-
* the SAME transaction (CAS: WHERE status='active' AND id != <new id>; throws on
|
|
72
|
-
* changes===0 so a duplicate supersede aborts the whole write). The new row's
|
|
73
|
-
* version = predecessor.version + 1 (server-derived); change_summary carries the
|
|
74
|
-
* delta note. A fresh create has version 1 and change_summary NULL.
|
|
75
|
-
*/
|
|
33
|
+
/** Create a process, or a new version superseding an existing one, in the `objects` store group's one transaction.
|
|
34
|
+
* The supersede CAS (WHERE status='active' AND id != <new id>) throws on changes===0 so a duplicate supersede aborts the write. */
|
|
76
35
|
export declare function saveProcess(hippoRoot: string, tenantId: string, opts: SaveProcessOpts, actor?: string): Process;
|
|
77
|
-
/**
|
|
78
|
-
* Close (retire) an active process with no successor. Updates the processes row
|
|
79
|
-
* only; the memory mirror is not mutated. A superseded row is already
|
|
80
|
-
* terminal in the chain and cannot be closed.
|
|
81
|
-
*/
|
|
36
|
+
/** Close (retire) an active process with no successor; a superseded row cannot be closed. */
|
|
82
37
|
export declare function closeProcess(hippoRoot: string, tenantId: string, id: number, actor?: string): Process;
|
|
83
38
|
export declare function loadProcessById(hippoRoot: string, tenantId: string, id: number): Process | null;
|
|
84
39
|
export declare function loadProcesses(hippoRoot: string, tenantId: string, opts?: ListProcessesOpts): Process[];
|
|
@@ -1,40 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* A `process` is a "living process map": a named, ordered list of steps that
|
|
5
|
-
* evolves over time. Unlike `incident` (open->resolved->closed, no supersede),
|
|
6
|
-
* `process` REUSES the `decision` supersede path as its delta mechanism: a
|
|
7
|
-
* process evolves by being superseded by a NEW VERSION that records what
|
|
8
|
-
* changed (`change_summary`) and the full new state (`steps`), carrying a
|
|
9
|
-
* server-derived `version` counter. The version chain (walk `superseded_by`)
|
|
10
|
-
* is the changelog. Computed structural step-diffing is a deferred v2 read-side
|
|
11
|
-
* feature; the row stores enough to reconstruct any delta
|
|
12
|
-
* (predecessor.steps + successor.steps + change_summary).
|
|
13
|
-
*
|
|
14
|
-
* The `processes` table is the source of truth: a process stays `active`
|
|
15
|
-
* regardless of memory decay. A memory row mirrors the process for recall but
|
|
16
|
-
* is NOT canonical — memory_id is NULLABLE with ON DELETE SET NULL so
|
|
17
|
-
* forget/consolidate/archive gracefully orphans the process row.
|
|
18
|
-
*
|
|
19
|
-
* Lifecycle: active -> superseded (a newer version replaces it; superseded_by
|
|
20
|
-
* points to the successor) or active -> closed (retired with no successor;
|
|
21
|
-
* only an active head closes).
|
|
22
|
-
*
|
|
23
|
-
* Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
|
|
24
|
-
* enforce processes.tenant_id == the referenced memory's tenant_id, and a
|
|
25
|
-
* superseded_by same-tenant trigger makes cross-tenant supersession
|
|
26
|
-
* unrepresentable. Mirrors the v30 decisions pattern (src/objects/decisions.ts).
|
|
27
|
-
*
|
|
28
|
-
* Dual-write atomicity: `saveProcess` hands the memory and the process to the
|
|
29
|
-
* `objects` store group, which commits them (and, when superseding, the
|
|
30
|
-
* predecessor's UPDATE) together, so a failure in any step rolls all of them back.
|
|
31
|
-
*/
|
|
1
|
+
/** Process object: a named, ordered list of `steps` that evolves by supersession, each version recording `change_summary` and a server-derived `version`.
|
|
2
|
+
* The `processes` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall.
|
|
3
|
+
* Structural step-diffing is a deferred read-side feature; the version chain is the changelog. */
|
|
32
4
|
import { BadRequestError } from '../core/api-errors.js';
|
|
33
5
|
import { isJsonString } from '../util/json.js';
|
|
34
6
|
import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
// Domain types
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
7
|
export const VALID_PROCESS_STATES = new Set([
|
|
39
8
|
'active',
|
|
40
9
|
'superseded',
|
|
@@ -43,15 +12,7 @@ export const VALID_PROCESS_STATES = new Set([
|
|
|
43
12
|
/** DoS / abuse caps on the steps body (untrusted at the HTTP/SDK boundary). */
|
|
44
13
|
export const MAX_PROCESS_STEPS = 200;
|
|
45
14
|
export const MAX_PROCESS_STEP_LEN = 2000;
|
|
46
|
-
|
|
47
|
-
// steps validation (untrusted input)
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
/**
|
|
50
|
-
* Validate + normalise the steps body. Returns the trimmed step strings
|
|
51
|
-
* (trim-then-store, so ' x ' is stored as 'x'). Throws on a non-array, a
|
|
52
|
-
* non-string / empty element, or a cap breach. Mirrors the incident DoS-cap
|
|
53
|
-
* discipline.
|
|
54
|
-
*/
|
|
15
|
+
/** Validate and trim the steps body; throws on a non-array, a non-string or empty element, or a cap breach. */
|
|
55
16
|
export function validateProcessSteps(steps) {
|
|
56
17
|
if (!Array.isArray(steps)) {
|
|
57
18
|
throw new BadRequestError('saveProcess: steps must be an array of strings');
|
|
@@ -110,27 +71,12 @@ export const PROCESS = {
|
|
|
110
71
|
};
|
|
111
72
|
},
|
|
112
73
|
};
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
// ---------------------------------------------------------------------------
|
|
116
|
-
/**
|
|
117
|
-
* Create a process (or a new version that supersedes an existing one). Writes
|
|
118
|
-
* the memory mirror + the processes row in the `objects` store group's one
|
|
119
|
-
* transaction. When supersedesProcessId is given, the referenced ACTIVE row is
|
|
120
|
-
* preflighted (status + version) BEFORE the INSERT, then UPDATEd -> superseded in
|
|
121
|
-
* the SAME transaction (CAS: WHERE status='active' AND id != <new id>; throws on
|
|
122
|
-
* changes===0 so a duplicate supersede aborts the whole write). The new row's
|
|
123
|
-
* version = predecessor.version + 1 (server-derived); change_summary carries the
|
|
124
|
-
* delta note. A fresh create has version 1 and change_summary NULL.
|
|
125
|
-
*/
|
|
74
|
+
/** Create a process, or a new version superseding an existing one, in the `objects` store group's one transaction.
|
|
75
|
+
* The supersede CAS (WHERE status='active' AND id != <new id>) throws on changes===0 so a duplicate supersede aborts the write. */
|
|
126
76
|
export function saveProcess(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
127
77
|
return saveObjectAt(PROCESS, { hippoRoot, tenantId, actor }, opts);
|
|
128
78
|
}
|
|
129
|
-
/**
|
|
130
|
-
* Close (retire) an active process with no successor. Updates the processes row
|
|
131
|
-
* only; the memory mirror is not mutated. A superseded row is already
|
|
132
|
-
* terminal in the chain and cannot be closed.
|
|
133
|
-
*/
|
|
79
|
+
/** Close (retire) an active process with no successor; a superseded row cannot be closed. */
|
|
134
80
|
export function closeProcess(hippoRoot, tenantId, id, actor = 'cli') {
|
|
135
81
|
return closeObjectAt(hippoRoot, PROCESS, tenantId, id, actor);
|
|
136
82
|
}
|
|
@@ -1,25 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* A `project_brief` is the living, repo-scoped summary of a repository's state: a
|
|
5
|
-
* `summary` body scoped to a `repo`, evolving via the supersede delta lifecycle.
|
|
6
|
-
* "Auto-refreshes from receipts" is scoped to a DETERMINISTIC (no-LLM) assembler:
|
|
7
|
-
* `refreshBrief` gathers the repo's recent receipts (memory rows tagged
|
|
8
|
-
* `path:<repo>`) and assembles them into the brief body. The distinguishing
|
|
9
|
-
* capability is therefore the refresh assembler (analog of skill's export
|
|
10
|
-
* renderer), not an LLM/async pipeline (deferred).
|
|
11
|
-
*
|
|
12
|
-
* Reuses the skill/process supersede machinery verbatim (superseded_by self-FK +
|
|
13
|
-
* CAS + INSERT-preflight + server-derived version + change_summary + supersede
|
|
14
|
-
* tenant-match trigger). It DROPS skill's `skill_name`/`trigger_text` and ADDS
|
|
15
|
-
* `repo` (the repo-scoping dimension) + `summary` (the brief body).
|
|
16
|
-
*
|
|
17
|
-
* The `project_briefs` table is the source of truth (survives memory decay); the
|
|
18
|
-
* memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
|
|
19
|
-
*
|
|
20
|
-
* Lifecycle: active -> superseded (a newer version replaces it) or active ->
|
|
21
|
-
* closed (retired).
|
|
22
|
-
*/
|
|
1
|
+
/** Project_brief object: the living, repo-scoped `summary` of a repository, evolving via supersession.
|
|
2
|
+
* `refreshBrief` assembles recent `path:<repo>` receipts with a deterministic (no-LLM) assembler; an LLM pipeline is deferred.
|
|
3
|
+
* The `project_briefs` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
|
|
23
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
24
5
|
import type { SavableDescriptor } from './descriptor.js';
|
|
25
6
|
import { type ObjectSaveSite } from './lifecycle.js';
|
|
@@ -46,9 +27,8 @@ export interface SaveProjectBriefOpts {
|
|
|
46
27
|
supersedesBriefId?: number;
|
|
47
28
|
/** Extra memory tags merged after ['project_brief']. */
|
|
48
29
|
extraTags?: string[];
|
|
49
|
-
/** Internal: set by refreshBrief to the receipt count so
|
|
50
|
-
*
|
|
51
|
-
* op. Not part of the public CLI/HTTP surface. */
|
|
30
|
+
/** Internal: set by refreshBrief to the receipt count so audit metadata marks the write as an auto-refresh
|
|
31
|
+
* without a 4th audit op. Not part of the CLI/HTTP surface. */
|
|
52
32
|
refreshReceiptCount?: number;
|
|
53
33
|
}
|
|
54
34
|
export interface ListProjectBriefsOpts {
|
|
@@ -60,39 +40,14 @@ export interface ListProjectBriefsOpts {
|
|
|
60
40
|
after?: KeysetPosition;
|
|
61
41
|
}
|
|
62
42
|
export declare const PROJECT_BRIEF: SavableDescriptor<'project_brief', SaveProjectBriefOpts>;
|
|
63
|
-
/**
|
|
64
|
-
* Create a project_brief (or a new version that supersedes an existing one). Writes
|
|
65
|
-
* the memory mirror + the project_briefs row in the `objects` store group's one
|
|
66
|
-
* transaction. When supersedesBriefId is given, the referenced ACTIVE row is
|
|
67
|
-
* preflighted (status + version) BEFORE the INSERT, then CAS-UPDATEd -> superseded
|
|
68
|
-
* in the same transaction; the new version = predecessor.version + 1 (server-derived).
|
|
69
|
-
*/
|
|
43
|
+
/** Create a project_brief, or a new version superseding an existing one, in the `objects` store group's one transaction. */
|
|
70
44
|
export declare function saveProjectBrief(hippoRoot: string, tenantId: string, opts: SaveProjectBriefOpts, actor?: string): ProjectBrief;
|
|
71
|
-
/**
|
|
72
|
-
* Close (retire) an active brief. A superseded row is terminal.
|
|
73
|
-
*/
|
|
45
|
+
/** Close (retire) an active brief; a superseded row is terminal. */
|
|
74
46
|
export declare function closeProjectBrief(hippoRoot: string, tenantId: string, id: number, actor?: string): ProjectBrief;
|
|
75
47
|
export declare function loadProjectBriefById(hippoRoot: string, tenantId: string, id: number): ProjectBrief | null;
|
|
76
48
|
export declare function loadProjectBriefs(hippoRoot: string, tenantId: string, opts?: ListProjectBriefsOpts): ProjectBrief[];
|
|
77
|
-
/**
|
|
78
|
-
*
|
|
79
|
-
* per (tenant, repo); if an operator created more than one (the DB does not prevent
|
|
80
|
-
* it, consistent with every other first-class object), the MOST-RECENT active row wins.
|
|
81
|
-
*/
|
|
82
|
-
export declare function loadActiveBriefForRepo(hippoRoot: string, tenantId: string, repo: string): ProjectBrief | null;
|
|
83
|
-
/**
|
|
84
|
-
* Assemble the repo's recent receipts into a deterministic markdown digest, and
|
|
85
|
-
* return it WITH the receipt count (the count feeds refreshBrief's change_summary +
|
|
86
|
-
* audit metadata). NO LLM. Always returns a non-empty, valid summary (a brief
|
|
87
|
-
* `summary` is NOT NULL), including the zero-receipts case.
|
|
88
|
-
*
|
|
89
|
-
* A "receipt" = a tenant memory row carrying the repo's `path:<repo>` tag. The
|
|
90
|
-
* brief's OWN memory mirror (source='project_brief') is excluded so a brief never
|
|
91
|
-
* becomes its own receipt on the next refresh. The match is against the JSON-array
|
|
92
|
-
* serialization (each element is a double-quoted string `"path:hippo"`); the
|
|
93
|
-
* surrounding quotes are load-bearing — they stop `hip` matching `path:hippo`.
|
|
94
|
-
* `repo` is LIKE-escaped + parameterized (operator-supplied; security.md).
|
|
95
|
-
*/
|
|
49
|
+
/** Assemble the repo's recent receipts into a deterministic markdown digest and return it with the receipt count; never empty (summary is NOT NULL).
|
|
50
|
+
* The brief's own mirror (source='project_brief') is excluded; the quotes in the JSON-array LIKE are load-bearing (`hip` must not match `path:hippo`). */
|
|
96
51
|
export declare function assembleBriefFromReceipts(hippoRoot: string, tenantId: string, repo: string): BriefDigest;
|
|
97
52
|
/** `assembleBriefFromReceipts` over a served store's group. */
|
|
98
53
|
export declare function briefFromReceipts(objects: Objects, tenantId: string, repo: string): Promise<BriefDigest>;
|
|
@@ -100,7 +55,8 @@ export interface BriefDigest {
|
|
|
100
55
|
markdown: string;
|
|
101
56
|
receiptCount: number;
|
|
102
57
|
}
|
|
103
|
-
/** Saves a new version of the repo's brief from its receipts. The receipts are read before
|
|
58
|
+
/** Saves a new version of the repo's brief from its receipts. The receipts are read before
|
|
59
|
+
* the save's transaction, so a receipt written in between shows in the next refresh. */
|
|
104
60
|
export declare function refreshBrief(hippoRoot: string, tenantId: string, repo: string, actor?: string): ProjectBrief;
|
|
105
61
|
/** `refreshBrief` over a served store's group. */
|
|
106
62
|
export declare function refreshedBrief(objects: Objects, site: ObjectSaveSite, repo: string): Promise<ProjectBrief>;
|
|
@@ -1,33 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* A `project_brief` is the living, repo-scoped summary of a repository's state: a
|
|
5
|
-
* `summary` body scoped to a `repo`, evolving via the supersede delta lifecycle.
|
|
6
|
-
* "Auto-refreshes from receipts" is scoped to a DETERMINISTIC (no-LLM) assembler:
|
|
7
|
-
* `refreshBrief` gathers the repo's recent receipts (memory rows tagged
|
|
8
|
-
* `path:<repo>`) and assembles them into the brief body. The distinguishing
|
|
9
|
-
* capability is therefore the refresh assembler (analog of skill's export
|
|
10
|
-
* renderer), not an LLM/async pipeline (deferred).
|
|
11
|
-
*
|
|
12
|
-
* Reuses the skill/process supersede machinery verbatim (superseded_by self-FK +
|
|
13
|
-
* CAS + INSERT-preflight + server-derived version + change_summary + supersede
|
|
14
|
-
* tenant-match trigger). It DROPS skill's `skill_name`/`trigger_text` and ADDS
|
|
15
|
-
* `repo` (the repo-scoping dimension) + `summary` (the brief body).
|
|
16
|
-
*
|
|
17
|
-
* The `project_briefs` table is the source of truth (survives memory decay); the
|
|
18
|
-
* memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
|
|
19
|
-
*
|
|
20
|
-
* Lifecycle: active -> superseded (a newer version replaces it) or active ->
|
|
21
|
-
* closed (retired).
|
|
22
|
-
*/
|
|
1
|
+
/** Project_brief object: the living, repo-scoped `summary` of a repository, evolving via supersession.
|
|
2
|
+
* `refreshBrief` assembles recent `path:<repo>` receipts with a deterministic (no-LLM) assembler; an LLM pipeline is deferred.
|
|
3
|
+
* The `project_briefs` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
|
|
23
4
|
import { BadRequestError } from '../core/api-errors.js';
|
|
24
5
|
import { assertTenantId } from '../store/tenant.js';
|
|
25
6
|
import { checkText, requireLine } from './fields.js';
|
|
26
7
|
import { closeObjectAt, listObjectsAt, objectByIdAt, saveObject, saveObjectAt } from './lifecycle.js';
|
|
27
8
|
import { sqliteObjects } from '../store/sqlite/objects-group.js';
|
|
28
|
-
// ---------------------------------------------------------------------------
|
|
29
|
-
// Domain types
|
|
30
|
-
// ---------------------------------------------------------------------------
|
|
31
9
|
export const VALID_BRIEF_STATES = new Set([
|
|
32
10
|
'active',
|
|
33
11
|
'superseded',
|
|
@@ -79,22 +57,11 @@ export const PROJECT_BRIEF = {
|
|
|
79
57
|
function buildBriefContent(repo, summary) {
|
|
80
58
|
return `${repo}\n\n${summary}`;
|
|
81
59
|
}
|
|
82
|
-
|
|
83
|
-
// Public API
|
|
84
|
-
// ---------------------------------------------------------------------------
|
|
85
|
-
/**
|
|
86
|
-
* Create a project_brief (or a new version that supersedes an existing one). Writes
|
|
87
|
-
* the memory mirror + the project_briefs row in the `objects` store group's one
|
|
88
|
-
* transaction. When supersedesBriefId is given, the referenced ACTIVE row is
|
|
89
|
-
* preflighted (status + version) BEFORE the INSERT, then CAS-UPDATEd -> superseded
|
|
90
|
-
* in the same transaction; the new version = predecessor.version + 1 (server-derived).
|
|
91
|
-
*/
|
|
60
|
+
/** Create a project_brief, or a new version superseding an existing one, in the `objects` store group's one transaction. */
|
|
92
61
|
export function saveProjectBrief(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
93
62
|
return saveObjectAt(PROJECT_BRIEF, { hippoRoot, tenantId, actor }, opts);
|
|
94
63
|
}
|
|
95
|
-
/**
|
|
96
|
-
* Close (retire) an active brief. A superseded row is terminal.
|
|
97
|
-
*/
|
|
64
|
+
/** Close (retire) an active brief; a superseded row is terminal. */
|
|
98
65
|
export function closeProjectBrief(hippoRoot, tenantId, id, actor = 'cli') {
|
|
99
66
|
return closeObjectAt(hippoRoot, PROJECT_BRIEF, tenantId, id, actor);
|
|
100
67
|
}
|
|
@@ -104,12 +71,8 @@ export function loadProjectBriefById(hippoRoot, tenantId, id) {
|
|
|
104
71
|
export function loadProjectBriefs(hippoRoot, tenantId, opts = {}) {
|
|
105
72
|
return listObjectsAt(hippoRoot, PROJECT_BRIEF, tenantId, { status: opts.status, filter: opts.repo, limit: opts.limit, after: opts.after });
|
|
106
73
|
}
|
|
107
|
-
/**
|
|
108
|
-
|
|
109
|
-
* per (tenant, repo); if an operator created more than one (the DB does not prevent
|
|
110
|
-
* it, consistent with every other first-class object), the MOST-RECENT active row wins.
|
|
111
|
-
*/
|
|
112
|
-
export function loadActiveBriefForRepo(hippoRoot, tenantId, repo) {
|
|
74
|
+
/** The repo's current active brief, or null. The DB allows several active rows per (tenant, repo); the most recent wins. */
|
|
75
|
+
function loadActiveBriefForRepo(hippoRoot, tenantId, repo) {
|
|
113
76
|
assertTenantId('loadActiveBriefForRepo', tenantId);
|
|
114
77
|
if (repo === '')
|
|
115
78
|
return null;
|
|
@@ -119,9 +82,6 @@ export function loadActiveBriefForRepo(hippoRoot, tenantId, repo) {
|
|
|
119
82
|
function newestActive(repo) {
|
|
120
83
|
return { status: 'active', filter: repo, limit: 1 };
|
|
121
84
|
}
|
|
122
|
-
// ---------------------------------------------------------------------------
|
|
123
|
-
// Refresh assembler (the distinguishing deliverable)
|
|
124
|
-
// ---------------------------------------------------------------------------
|
|
125
85
|
/** Single-line headline for a receipt: first non-empty line, newline-stripped,
|
|
126
86
|
* truncated. Deterministic + safe for the markdown bullet list. */
|
|
127
87
|
function receiptHeadline(content) {
|
|
@@ -135,17 +95,8 @@ function receiptHeadline(content) {
|
|
|
135
95
|
function receiptTag(normalizedRepo) {
|
|
136
96
|
return `path:${normalizedRepo.toLowerCase()}`;
|
|
137
97
|
}
|
|
138
|
-
//
|
|
139
|
-
// (
|
|
140
|
-
// order is stable-but-arbitrary, not insertion order. `created DESC` is the real
|
|
141
|
-
// recency ordering.
|
|
142
|
-
//
|
|
143
|
-
// Budget-aware assembly: the digest is the
|
|
144
|
-
// brief `summary`, which saveProjectBrief caps at MAX_BRIEF_SUMMARY_LEN. The
|
|
145
|
-
// receipt/headline caps (50 x ~200) could otherwise build an ~11KB body that the
|
|
146
|
-
// store then REJECTS, breaking refresh for inputs within the advertised caps. So
|
|
147
|
-
// include receipt lines newest-first only while they fit under the cap (reserving
|
|
148
|
-
// slack for the header + an omission footer), and note the omitted remainder.
|
|
98
|
+
// `id DESC` is a lexical tiebreak on a random-ish id, so same-`created` order is stable but arbitrary; `created DESC` is the recency order.
|
|
99
|
+
// Receipt lines go newest-first only while they fit MAX_BRIEF_SUMMARY_LEN (reserving slack for header and omission footer), else the store rejects the body.
|
|
149
100
|
function fitReceiptLines(receipts) {
|
|
150
101
|
const buildReceiptLine = (r) => `- ${(r.created ?? '').slice(0, 10)} [${r.source}] ${receiptHeadline(r.content)}`;
|
|
151
102
|
const receiptLines = [];
|
|
@@ -185,28 +136,15 @@ function renderBriefDigest(normalizedRepo, receiptCount, receiptLines) {
|
|
|
185
136
|
lines.push(`_... ${omitted} more receipt(s) omitted (summary cap)._`);
|
|
186
137
|
}
|
|
187
138
|
}
|
|
188
|
-
// Belt-and-suspenders: the
|
|
189
|
-
// joined string so the store's NOT-NULL/<=cap contract can never be violated even
|
|
190
|
-
// for a pathological single oversized line.
|
|
139
|
+
// Belt-and-suspenders: hard-clamp so the store's NOT-NULL/<=cap contract holds even for a single oversized line.
|
|
191
140
|
let markdown = lines.join('\n');
|
|
192
141
|
if (markdown.length > MAX_BRIEF_SUMMARY_LEN) {
|
|
193
142
|
markdown = markdown.slice(0, MAX_BRIEF_SUMMARY_LEN);
|
|
194
143
|
}
|
|
195
144
|
return markdown;
|
|
196
145
|
}
|
|
197
|
-
/**
|
|
198
|
-
*
|
|
199
|
-
* return it WITH the receipt count (the count feeds refreshBrief's change_summary +
|
|
200
|
-
* audit metadata). NO LLM. Always returns a non-empty, valid summary (a brief
|
|
201
|
-
* `summary` is NOT NULL), including the zero-receipts case.
|
|
202
|
-
*
|
|
203
|
-
* A "receipt" = a tenant memory row carrying the repo's `path:<repo>` tag. The
|
|
204
|
-
* brief's OWN memory mirror (source='project_brief') is excluded so a brief never
|
|
205
|
-
* becomes its own receipt on the next refresh. The match is against the JSON-array
|
|
206
|
-
* serialization (each element is a double-quoted string `"path:hippo"`); the
|
|
207
|
-
* surrounding quotes are load-bearing — they stop `hip` matching `path:hippo`.
|
|
208
|
-
* `repo` is LIKE-escaped + parameterized (operator-supplied; security.md).
|
|
209
|
-
*/
|
|
146
|
+
/** Assemble the repo's recent receipts into a deterministic markdown digest and return it with the receipt count; never empty (summary is NOT NULL).
|
|
147
|
+
* The brief's own mirror (source='project_brief') is excluded; the quotes in the JSON-array LIKE are load-bearing (`hip` must not match `path:hippo`). */
|
|
210
148
|
export function assembleBriefFromReceipts(hippoRoot, tenantId, repo) {
|
|
211
149
|
const normalizedRepo = requiredRepo('assembleBriefFromReceipts', tenantId, repo);
|
|
212
150
|
return briefDigest(normalizedRepo, sqliteObjects(hippoRoot).briefReceipts(tenantId, receiptTag(normalizedRepo), MAX_BRIEF_RECEIPTS));
|
|
@@ -238,7 +176,8 @@ function refreshWrite(normalizedRepo, digest, active) {
|
|
|
238
176
|
extraTags: [receiptTag(normalizedRepo)],
|
|
239
177
|
};
|
|
240
178
|
}
|
|
241
|
-
/** Saves a new version of the repo's brief from its receipts. The receipts are read before
|
|
179
|
+
/** Saves a new version of the repo's brief from its receipts. The receipts are read before
|
|
180
|
+
* the save's transaction, so a receipt written in between shows in the next refresh. */
|
|
242
181
|
export function refreshBrief(hippoRoot, tenantId, repo, actor = 'cli') {
|
|
243
182
|
const normalizedRepo = requiredRepo('refreshBrief', tenantId, repo);
|
|
244
183
|
const digest = assembleBriefFromReceipts(hippoRoot, tenantId, normalizedRepo);
|
package/dist/objects/skills.d.ts
CHANGED
|
@@ -1,26 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* A `skill` is a reusable, agent-followable capability: an `instructions` body
|
|
5
|
-
* plus an optional `trigger` ("when to apply"), evolving via the supersede delta
|
|
6
|
-
* lifecycle. "Executable" is scoped to an agent-followable INSTRUCTION that, once
|
|
7
|
-
* exported into the agent's in-force rules (AGENTS.md / CLAUDE.md) via
|
|
8
|
-
* `exportSkills`, is executed by the agent reading it. Literal code/command
|
|
9
|
-
* execution is deferred (security; a future sandbox). The distinguishing
|
|
10
|
-
* capability is therefore the EXPORT renderer, not a runtime.
|
|
11
|
-
*
|
|
12
|
-
* Reuses the process/decision supersede machinery verbatim (superseded_by self-FK
|
|
13
|
-
* + CAS + INSERT-preflight + server-derived version + change_summary + supersede
|
|
14
|
-
* tenant-match trigger). It DROPS process's `steps` (a skill's content is a single
|
|
15
|
-
* `instructions` body) and ADDS `trigger` (stored in the `trigger_text` column -
|
|
16
|
-
* `trigger` is a SQLite reserved keyword).
|
|
17
|
-
*
|
|
18
|
-
* The `skills` table is the source of truth (survives memory decay); the memory
|
|
19
|
-
* mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
|
|
20
|
-
*
|
|
21
|
-
* Lifecycle: active -> superseded (a newer version replaces it) or active ->
|
|
22
|
-
* closed (retired). Export renders ACTIVE skills only.
|
|
23
|
-
*/
|
|
1
|
+
/** Skill object: an agent-followable `instructions` body plus an optional `trigger`, evolving via supersession.
|
|
2
|
+
* `exportSkills` renders ACTIVE skills into AGENTS.md / CLAUDE.md rules; running code from a skill is deferred (security).
|
|
3
|
+
* `trigger` is stored in `trigger_text` because it is a SQLite reserved keyword. */
|
|
24
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
25
5
|
import type { SavableDescriptor } from './descriptor.js';
|
|
26
6
|
import type { Skill, SkillStatus } from '../store/object-types.js';
|
|
@@ -54,32 +34,17 @@ export interface ListSkillsOpts {
|
|
|
54
34
|
after?: KeysetPosition;
|
|
55
35
|
}
|
|
56
36
|
export declare const SKILL: SavableDescriptor<'skill', SaveSkillOpts>;
|
|
57
|
-
/**
|
|
58
|
-
* Create a skill (or a new version that supersedes an existing one). Writes the
|
|
59
|
-
* memory mirror + the skills row in the `objects` store group's one transaction. When
|
|
60
|
-
* supersedesSkillId is given, the referenced ACTIVE row is preflighted (status +
|
|
61
|
-
* version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same transaction;
|
|
62
|
-
* the new version = predecessor.version + 1 (server-derived).
|
|
63
|
-
*/
|
|
37
|
+
/** Create a skill, or a new version superseding an existing one, in the `objects` store group's one transaction. */
|
|
64
38
|
export declare function saveSkill(hippoRoot: string, tenantId: string, opts: SaveSkillOpts, actor?: string): Skill;
|
|
65
|
-
/**
|
|
66
|
-
* Close (retire) an active skill. A superseded row is terminal.
|
|
67
|
-
*/
|
|
39
|
+
/** Close (retire) an active skill; a superseded row is terminal. */
|
|
68
40
|
export declare function closeSkill(hippoRoot: string, tenantId: string, id: number, actor?: string): Skill;
|
|
69
41
|
export declare function loadSkillById(hippoRoot: string, tenantId: string, id: number): Skill | null;
|
|
70
42
|
export declare function loadSkills(hippoRoot: string, tenantId: string, opts?: ListSkillsOpts): Skill[];
|
|
71
43
|
export declare function loadActiveSkills(hippoRoot: string, tenantId: string, opts?: {
|
|
72
44
|
limit?: number;
|
|
73
45
|
}): Skill[];
|
|
74
|
-
/**
|
|
75
|
-
*
|
|
76
|
-
* block (one H2 per skill, ordered by skill_name ASC for determinism), and RETURN
|
|
77
|
-
* the string. Does NOT write any file. Returns '' when there are no active skills.
|
|
78
|
-
*
|
|
79
|
-
* skill_name is single-line (validated on save) so it cannot break the H2 header;
|
|
80
|
-
* instructions are emitted verbatim (operator content). Bounded by MAX_EXPORT_SKILLS
|
|
81
|
-
* active rows; each field is capped on save, so the rendered string is bounded.
|
|
82
|
-
*/
|
|
46
|
+
/** Render the tenant's ACTIVE skills into one AGENTS.md / CLAUDE.md-style markdown block (H2 per skill, ordered by skill_name) and return it; writes no file.
|
|
47
|
+
* Bounded by MAX_EXPORT_SKILLS rows; instructions are emitted verbatim. */
|
|
83
48
|
export declare function exportSkills(hippoRoot: string, tenantId: string): string;
|
|
84
49
|
/** `exportSkills` over a served store's group. */
|
|
85
50
|
export declare function skillsMarkdown(objects: Objects, tenantId: string): Promise<string>;
|