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
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
import { policiesAsOf, POLICY } from '../../objects/policies.js';
|
|
3
3
|
import { HttpError, sendJson } from '../../util/http-util.js';
|
|
4
4
|
import { buildContextWithAuth } from '../auth.js';
|
|
5
|
-
import { parseJsonBody } from '../validation.js';
|
|
6
|
-
import {
|
|
5
|
+
import { MAX_SHORT_FIELD_LEN, parseJsonBody } from '../validation.js';
|
|
6
|
+
import { objectsOf, saveFor } from '../../api/objects.js';
|
|
7
|
+
import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute, } from './object-routes.js';
|
|
7
8
|
// The date fields get a type and length check only: the store parses the date, and the cap bounds a junk string before it reaches the Date parser.
|
|
8
9
|
const MAX_DATE_LEN = 64;
|
|
9
10
|
const policyRoutes = {
|
|
@@ -12,28 +13,20 @@ const policyRoutes = {
|
|
|
12
13
|
listField: 'policies',
|
|
13
14
|
object: POLICY,
|
|
14
15
|
revise: (body) => {
|
|
15
|
-
const policyText = requiredString(body, 'policyText', { max:
|
|
16
|
+
const policyText = requiredString(body, 'policyText', { max: MAX_SHORT_FIELD_LEN });
|
|
16
17
|
const validFrom = optionalString(body, 'validFrom', MAX_DATE_LEN);
|
|
17
18
|
const validTo = optionalString(body, 'validTo', MAX_DATE_LEN);
|
|
18
|
-
const changeSummary = optionalString(body, 'changeSummary',
|
|
19
|
+
const changeSummary = optionalString(body, 'changeSummary', MAX_SHORT_FIELD_LEN);
|
|
19
20
|
return (existing, id) => ({ policyName: existing.policyName, policyText, validFrom, validTo, changeSummary, supersedesPolicyId: id });
|
|
20
21
|
},
|
|
21
22
|
};
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
// 6 routes: POST /v1/policies (new; processName-style body policyName +
|
|
25
|
-
// policyText + validFrom? + validTo?), GET /v1/policies (list, status filter),
|
|
26
|
-
// GET /v1/policies/asof (date + optional name; the bi-temporal as-of query;
|
|
27
|
-
// placed BEFORE the /:id GET so the literal 'asof' is matched first), GET
|
|
28
|
-
// /v1/policies/:id, POST /v1/policies/:id/supersede, POST /v1/policies/:id/close.
|
|
29
|
-
// Date inputs are normalized + range-validated in the store; an invalid/inverted
|
|
30
|
-
// date throws -> 400. DoS caps: policyName/policyText/changeSummary 4096.
|
|
23
|
+
// The as-of route is registered BEFORE /:id so the literal 'asof' is matched first; date errors surface as 400.
|
|
31
24
|
export async function handleCreatePolicy(rr) {
|
|
32
25
|
const ctx = await buildContextWithAuth(rr.req, rr.opts);
|
|
33
26
|
const body = await parseJsonBody(rr.req, ctx);
|
|
34
|
-
const policy = await saveFor(
|
|
35
|
-
policyName: requiredString(body, 'policyName', { max:
|
|
36
|
-
policyText: requiredString(body, 'policyText', { max:
|
|
27
|
+
const policy = await saveFor(ctx, POLICY, {
|
|
28
|
+
policyName: requiredString(body, 'policyName', { max: MAX_SHORT_FIELD_LEN }),
|
|
29
|
+
policyText: requiredString(body, 'policyText', { max: MAX_SHORT_FIELD_LEN }),
|
|
37
30
|
validFrom: optionalString(body, 'validFrom', MAX_DATE_LEN),
|
|
38
31
|
validTo: optionalString(body, 'validTo', MAX_DATE_LEN),
|
|
39
32
|
});
|
|
@@ -52,9 +45,8 @@ export async function handlePoliciesAsOf(rr) {
|
|
|
52
45
|
}
|
|
53
46
|
const name = query.get('name') ?? undefined;
|
|
54
47
|
const ctx = await buildContextWithAuth(req, opts);
|
|
55
|
-
const policies = await policiesAsOf(objectsOf(
|
|
48
|
+
const policies = await policiesAsOf(objectsOf(ctx), ctx.tenantId, date, { name });
|
|
56
49
|
sendJson(res, 200, { policies });
|
|
57
|
-
return;
|
|
58
50
|
}
|
|
59
51
|
export function handleSupersedePolicy(rr, match) {
|
|
60
52
|
return supersedeRoute(policyRoutes, rr, match);
|
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
// /v1/predictions routes.
|
|
2
|
+
import { closePrediction, listPredictions, predictionBaserate, predictionById, savePrediction } from '../../api/predictions.js';
|
|
2
3
|
import { loadConfig } from '../../core/config.js';
|
|
3
4
|
import { predictionMirror, VALID_CLOSURE_STATES } from '../../store/predictions.js';
|
|
4
|
-
import { requireGroup } from '../../store/port.js';
|
|
5
5
|
import { HttpError, MAX_ID_LEN, sendJson } from '../../util/http-util.js';
|
|
6
6
|
import { buildContextWithAuth } from '../auth.js';
|
|
7
7
|
import { byCreatedAt, pageOf, parseCursor } from '../cursor.js';
|
|
8
|
-
import { isSetMember, parseJsonBody, parseListLimit } from '../validation.js';
|
|
8
|
+
import { isSetMember, MAX_SHORT_FIELD_LEN, parseJsonBody, parseListLimit } from '../validation.js';
|
|
9
9
|
import { isJsonString, isJsonNumber } from '../../util/json.js';
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// 4 routes: POST /v1/predictions (create), GET /v1/predictions (list),
|
|
13
|
-
// GET /v1/predictions/:id (show), POST /v1/predictions/:id/close (close).
|
|
14
|
-
// All Bearer-authed + tenant-scoped via buildContextWithAuth. closure_state
|
|
15
|
-
// validated against VALID_CLOSURE_STATES (3 states). DoS caps on claim
|
|
16
|
-
// (4096 chars) + closureNote (2048 chars).
|
|
10
|
+
// Routes: /v1/predictions (create, list, show, close), Bearer-authed and tenant-scoped; closure_state is validated against VALID_CLOSURE_STATES.
|
|
11
|
+
// DoS caps: claim MAX_SHORT_FIELD_LEN chars, closureNote 2048.
|
|
17
12
|
export async function handleCreatePrediction({ req, res, opts }) {
|
|
18
13
|
const ctx = await buildContextWithAuth(req, opts);
|
|
19
14
|
const body = await parseJsonBody(req, ctx);
|
|
@@ -21,8 +16,8 @@ export async function handleCreatePrediction({ req, res, opts }) {
|
|
|
21
16
|
if (!isJsonString(claim) || claim.length === 0) {
|
|
22
17
|
throw new HttpError(400, 'claim is required (non-empty string)');
|
|
23
18
|
}
|
|
24
|
-
if (claim.length >
|
|
25
|
-
throw new HttpError(400,
|
|
19
|
+
if (claim.length > MAX_SHORT_FIELD_LEN) {
|
|
20
|
+
throw new HttpError(400, `claim exceeds ${MAX_SHORT_FIELD_LEN}-character cap`);
|
|
26
21
|
}
|
|
27
22
|
const classTag = body['classTag'];
|
|
28
23
|
if (!isJsonString(classTag) || classTag.length === 0) {
|
|
@@ -54,9 +49,8 @@ export async function handleCreatePrediction({ req, res, opts }) {
|
|
|
54
49
|
}
|
|
55
50
|
const claimed = { classTag, claimText: claim, estimateValue, estimateUnit, targetDate: targetDateValue };
|
|
56
51
|
const mirror = predictionMirror(ctx.tenantId, claimed, loadConfig(opts.hippoRoot).defaultHalfLifeDays);
|
|
57
|
-
const prediction = await
|
|
52
|
+
const prediction = await savePrediction(ctx, { ...claimed, mirror });
|
|
58
53
|
sendJson(res, 201, { prediction });
|
|
59
|
-
return;
|
|
60
54
|
}
|
|
61
55
|
/** Which rows a list reads; a status other than all or open needs a class, as no store reads one closed state across classes. */
|
|
62
56
|
function listFilter(classTag, status) {
|
|
@@ -78,15 +72,12 @@ export async function handleListPredictions({ req, res, opts, query }) {
|
|
|
78
72
|
const limit = parseListLimit(query.get('limit'));
|
|
79
73
|
const after = parseCursor(query.get('cursor'), 'string', 'integer');
|
|
80
74
|
const ctx = await buildContextWithAuth(req, opts);
|
|
81
|
-
const predictions = await
|
|
75
|
+
const predictions = await listPredictions(ctx, { ...listFilter(classTag, status), limit: limit + 1, after });
|
|
82
76
|
const page = pageOf(predictions, limit, byCreatedAt);
|
|
83
77
|
sendJson(res, 200, { predictions: page.items, next_cursor: page.nextCursor });
|
|
84
|
-
return;
|
|
85
78
|
}
|
|
86
|
-
// Reference-class / planning-fallacy detector
|
|
87
|
-
//
|
|
88
|
-
// is not a number — the :id regex requires \d+ so they don't conflict,
|
|
89
|
-
// but routing this first avoids the dispatch order risk.
|
|
79
|
+
// Reference-class / planning-fallacy detector; registered BEFORE /v1/predictions/:id so dispatch order cannot matter ('stats' is not a number, but routing
|
|
80
|
+
// it first is safer).
|
|
90
81
|
export async function handlePredictionStats({ req, res, opts, query }) {
|
|
91
82
|
const classTag = query.get('class');
|
|
92
83
|
if (!classTag || classTag.length === 0) {
|
|
@@ -96,19 +87,17 @@ export async function handlePredictionStats({ req, res, opts, query }) {
|
|
|
96
87
|
throw new HttpError(400, `class exceeds ${MAX_ID_LEN}-character cap`);
|
|
97
88
|
}
|
|
98
89
|
const ctx = await buildContextWithAuth(req, opts);
|
|
99
|
-
const baserate = await
|
|
90
|
+
const baserate = await predictionBaserate(ctx, classTag);
|
|
100
91
|
sendJson(res, 200, { baserate });
|
|
101
|
-
return;
|
|
102
92
|
}
|
|
103
93
|
export async function handleGetPrediction({ req, res, opts }, predictionByIdMatch) {
|
|
104
94
|
const id = parseInt(predictionByIdMatch[1], 10);
|
|
105
95
|
const ctx = await buildContextWithAuth(req, opts);
|
|
106
|
-
const prediction = await
|
|
96
|
+
const prediction = await predictionById(ctx, id);
|
|
107
97
|
if (!prediction) {
|
|
108
98
|
throw new HttpError(404, `prediction ${id} not found`);
|
|
109
99
|
}
|
|
110
100
|
sendJson(res, 200, { prediction });
|
|
111
|
-
return;
|
|
112
101
|
}
|
|
113
102
|
export async function handleClosePrediction({ req, res, opts }, predictionCloseMatch) {
|
|
114
103
|
const id = parseInt(predictionCloseMatch[1], 10);
|
|
@@ -138,8 +127,7 @@ export async function handleClosePrediction({ req, res, opts }, predictionCloseM
|
|
|
138
127
|
closureNote = note;
|
|
139
128
|
}
|
|
140
129
|
const close = { closureState: state, actualValue, closureNote };
|
|
141
|
-
const prediction = await
|
|
130
|
+
const prediction = await closePrediction(ctx, id, close);
|
|
142
131
|
sendJson(res, 200, { prediction });
|
|
143
|
-
return;
|
|
144
132
|
}
|
|
145
133
|
//# sourceMappingURL=predictions.js.map
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
// /v1/processes routes.
|
|
2
|
-
import { PROCESS } from '../../objects/processes.js';
|
|
2
|
+
import { MAX_PROCESS_STEP_LEN, MAX_PROCESS_STEPS, PROCESS } from '../../objects/processes.js';
|
|
3
3
|
import { HttpError, sendJson } from '../../util/http-util.js';
|
|
4
4
|
import { buildContextWithAuth } from '../auth.js';
|
|
5
|
-
import { parseJsonBody } from '../validation.js';
|
|
5
|
+
import { MAX_SHORT_FIELD_LEN, parseJsonBody } from '../validation.js';
|
|
6
6
|
import { isJsonString } from '../../util/json.js';
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
//
|
|
10
|
-
// gate). Caps mirror src/objects/processes.ts MAX_PROCESS_STEPS / MAX_PROCESS_STEP_LEN.
|
|
7
|
+
import { saveFor } from '../../api/objects.js';
|
|
8
|
+
import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute } from './object-routes.js';
|
|
9
|
+
// HTTP-boundary validation for an untrusted process `steps` body; saveProcess re-validates and trims, this is the fail-fast 400 gate.
|
|
11
10
|
function validateProcessStepsBody(raw) {
|
|
12
11
|
if (raw === undefined || raw === null)
|
|
13
12
|
return [];
|
|
14
13
|
if (!Array.isArray(raw)) {
|
|
15
14
|
throw new HttpError(400, 'steps must be an array of strings');
|
|
16
15
|
}
|
|
17
|
-
if (raw.length >
|
|
18
|
-
throw new HttpError(400,
|
|
16
|
+
if (raw.length > MAX_PROCESS_STEPS) {
|
|
17
|
+
throw new HttpError(400, `steps exceeds ${MAX_PROCESS_STEPS}-step cap`);
|
|
19
18
|
}
|
|
20
19
|
for (const item of raw) {
|
|
21
20
|
if (!isJsonString(item)) {
|
|
@@ -24,8 +23,8 @@ function validateProcessStepsBody(raw) {
|
|
|
24
23
|
if (item.trim().length === 0) {
|
|
25
24
|
throw new HttpError(400, 'a step is empty');
|
|
26
25
|
}
|
|
27
|
-
if (item.length >
|
|
28
|
-
throw new HttpError(400,
|
|
26
|
+
if (item.length > MAX_PROCESS_STEP_LEN) {
|
|
27
|
+
throw new HttpError(400, `a step exceeds the ${MAX_PROCESS_STEP_LEN}-character cap`);
|
|
29
28
|
}
|
|
30
29
|
}
|
|
31
30
|
// SAFETY: every item in raw was confirmed to be a string in the loop above.
|
|
@@ -41,29 +40,20 @@ const processRoutes = {
|
|
|
41
40
|
if (steps.length === 0) {
|
|
42
41
|
throw new HttpError(400, 'steps is required (at least one step) for a supersession');
|
|
43
42
|
}
|
|
44
|
-
const changeSummary = optionalString(body, 'changeSummary',
|
|
45
|
-
const description = optionalString(body, 'description',
|
|
43
|
+
const changeSummary = optionalString(body, 'changeSummary', MAX_SHORT_FIELD_LEN);
|
|
44
|
+
const description = optionalString(body, 'description', MAX_SHORT_FIELD_LEN);
|
|
46
45
|
return (existing, id) => ({ processName: existing.processName, steps, description, changeSummary, supersedesProcessId: id });
|
|
47
46
|
},
|
|
48
47
|
};
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
// 5 routes: POST /v1/processes (new; body processName + steps[] + description),
|
|
52
|
-
// GET /v1/processes (list, status filter), GET /v1/processes/:id (show),
|
|
53
|
-
// POST /v1/processes/:id/supersede (active -> superseded by a new version; body
|
|
54
|
-
// steps[] + changeSummary + description; reuses the predecessor's name),
|
|
55
|
-
// POST /v1/processes/:id/close (active -> closed). Bearer-authed + tenant-scoped
|
|
56
|
-
// via buildContextWithAuth. status validated against VALID_PROCESS_STATES. DoS
|
|
57
|
-
// caps: processName/description/changeSummary 4096, steps 200x2000
|
|
58
|
-
// (validateProcessStepsBody). Mirrors /v1/decisions; the delta lifecycle is the
|
|
59
|
-
// decision supersede path.
|
|
48
|
+
// Routes: /v1/processes (create, list, show, supersede, close), mirroring /v1/decisions; supersede creates a new version that reuses the predecessor's name.
|
|
49
|
+
// DoS caps: processName/description/changeSummary MAX_SHORT_FIELD_LEN, steps MAX_PROCESS_STEPS x MAX_PROCESS_STEP_LEN (validateProcessStepsBody).
|
|
60
50
|
export async function handleCreateProcess(rr) {
|
|
61
51
|
const ctx = await buildContextWithAuth(rr.req, rr.opts);
|
|
62
52
|
const body = await parseJsonBody(rr.req, ctx);
|
|
63
|
-
const process = await saveFor(
|
|
64
|
-
processName: requiredString(body, 'processName', { max:
|
|
53
|
+
const process = await saveFor(ctx, PROCESS, {
|
|
54
|
+
processName: requiredString(body, 'processName', { max: MAX_SHORT_FIELD_LEN }),
|
|
65
55
|
steps: validateProcessStepsBody(body['steps']),
|
|
66
|
-
description: optionalString(body, 'description',
|
|
56
|
+
description: optionalString(body, 'description', MAX_SHORT_FIELD_LEN),
|
|
67
57
|
});
|
|
68
58
|
sendJson(rr.res, 201, { process });
|
|
69
59
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// /v1/project-briefs routes.
|
|
2
|
-
import { briefFromReceipts, MAX_REPO_LEN, PROJECT_BRIEF, refreshedBrief } from '../../objects/project-briefs.js';
|
|
2
|
+
import { briefFromReceipts, MAX_CHANGE_SUMMARY_LEN, MAX_REPO_LEN, PROJECT_BRIEF, refreshedBrief, } from '../../objects/project-briefs.js';
|
|
3
3
|
import { sendJson } from '../../util/http-util.js';
|
|
4
4
|
import { buildContextWithAuth } from '../auth.js';
|
|
5
5
|
import { parseJsonBody } from '../validation.js';
|
|
6
|
-
import {
|
|
6
|
+
import { objectsOf, saveFor } from '../../api/objects.js';
|
|
7
|
+
import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute, } from './object-routes.js';
|
|
7
8
|
const briefRoutes = {
|
|
8
9
|
noun: 'project brief',
|
|
9
10
|
field: 'brief',
|
|
@@ -12,24 +13,16 @@ const briefRoutes = {
|
|
|
12
13
|
filterParam: 'repo',
|
|
13
14
|
revise: (body) => {
|
|
14
15
|
const summary = requiredString(body, 'summary', { max: 8192 });
|
|
15
|
-
const changeSummary = optionalString(body, 'changeSummary',
|
|
16
|
+
const changeSummary = optionalString(body, 'changeSummary', MAX_CHANGE_SUMMARY_LEN);
|
|
16
17
|
return (existing, id) => ({ repo: existing.repo, summary, changeSummary, supersedesBriefId: id });
|
|
17
18
|
},
|
|
18
19
|
};
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
// 6 routes: POST /v1/project-briefs (new; body repo + summary), GET
|
|
22
|
-
// /v1/project-briefs (list; status + repo filter; shared parseListLimit), POST
|
|
23
|
-
// /v1/project-briefs/refresh (body {repo, dryRun?} -> auto-assemble the brief
|
|
24
|
-
// from the repo's receipts; dryRun returns {markdown} without writing; ordered
|
|
25
|
-
// before /:id), GET /v1/project-briefs/:id, POST /v1/project-briefs/:id/supersede,
|
|
26
|
-
// POST /v1/project-briefs/:id/close. DoS caps: repo 256, summary 8192,
|
|
27
|
-
// changeSummary 4096. The store validates + throws; the boundary maps validation
|
|
28
|
-
// -> 400, not-found -> 404, not-active -> 409. Mirrors /v1/skills.
|
|
20
|
+
// Routes: /v1/project-briefs (create, list, refresh, show, supersede, close), mirroring /v1/skills; /refresh is ordered before /:id.
|
|
21
|
+
// The store validates and throws; the boundary maps validation -> 400, not-found -> 404, not-active -> 409.
|
|
29
22
|
export async function handleCreateProjectBrief(rr) {
|
|
30
23
|
const ctx = await buildContextWithAuth(rr.req, rr.opts);
|
|
31
24
|
const body = await parseJsonBody(rr.req, ctx);
|
|
32
|
-
const brief = await saveFor(
|
|
25
|
+
const brief = await saveFor(ctx, PROJECT_BRIEF, {
|
|
33
26
|
repo: requiredString(body, 'repo', { max: MAX_REPO_LEN }),
|
|
34
27
|
summary: requiredString(body, 'summary', { max: 8192 }),
|
|
35
28
|
});
|
|
@@ -46,11 +39,11 @@ export async function handleRefreshProjectBrief(rr) {
|
|
|
46
39
|
const body = await parseJsonBody(req, ctx);
|
|
47
40
|
const repo = requiredString(body, 'repo', { max: MAX_REPO_LEN });
|
|
48
41
|
if (body['dryRun'] === true) {
|
|
49
|
-
const { markdown, receiptCount } = await briefFromReceipts(objectsOf(
|
|
42
|
+
const { markdown, receiptCount } = await briefFromReceipts(objectsOf(ctx), ctx.tenantId, repo);
|
|
50
43
|
sendJson(res, 200, { markdown, receiptCount });
|
|
51
44
|
return;
|
|
52
45
|
}
|
|
53
|
-
const brief = await refreshedBrief(objectsOf(
|
|
46
|
+
const brief = await refreshedBrief(objectsOf(ctx), { hippoRoot: opts.hippoRoot, tenantId: ctx.tenantId, actor: ctx.actor.subject }, repo);
|
|
54
47
|
sendJson(res, 200, { brief });
|
|
55
48
|
}
|
|
56
49
|
export function handleSupersedeProjectBrief(rr, match) {
|
|
@@ -3,11 +3,10 @@ import { dirname, resolve } from 'node:path';
|
|
|
3
3
|
import { assertCallerProject, resolveProjectIdentity } from '../../core/project-identity.js';
|
|
4
4
|
import { isSharedStore } from '../../core/config.js';
|
|
5
5
|
import { assembleCost, contextCost, drillCost } from '../../api/context-render.js';
|
|
6
|
-
import { storeFor } from '../../store/index.js';
|
|
7
|
-
import { biasHintEnabled } from '../../api/recall-history.js';
|
|
8
6
|
import { assemble, drillDown, getContext, recordTokens, retrieve } from '../../api/index.js';
|
|
7
|
+
import { RECALL_RECORDING } from '../../api/recall-finish.js';
|
|
9
8
|
import { httpParams, parseContextRequest, parseRecallRequest } from '../../api/recall-request.js';
|
|
10
|
-
import {
|
|
9
|
+
import { resetSessionRings } from '../../api/recall-record.js';
|
|
11
10
|
import { HttpError, sendJson } from '../../util/http-util.js';
|
|
12
11
|
import { buildContextWithAuth } from '../auth.js';
|
|
13
12
|
import { MAX_LIST_LIMIT, parseListLimit, validateIdSegment } from '../validation.js';
|
|
@@ -15,38 +14,21 @@ import { MAX_LIST_LIMIT, parseListLimit, validateIdSegment } from '../validation
|
|
|
15
14
|
export function __resetSessionRecallHistoryHttp() {
|
|
16
15
|
resetSessionRings('http');
|
|
17
16
|
}
|
|
18
|
-
// HTTP threads the ring through opts.recallHistory, so the hint retrieve() returns is the one the caller sees.
|
|
19
|
-
function recallHistoryFor(ctx, sessionId) {
|
|
20
|
-
return sessionId && biasHintEnabled('anchoring') ? peekSessionRing('http', ctx.tenantId, sessionId) : undefined;
|
|
21
|
-
}
|
|
22
17
|
// GET /v1/memories?q=...&limit=...&mode=...&scope=...&include_continuity=1
|
|
23
18
|
export async function handleRecallMemories({ req, res, opts, query }) {
|
|
24
19
|
const { opts: recallOpts, limit, mode, explain } = parseRecallRequest(httpParams(query));
|
|
25
|
-
const { query: q, includeContinuity, sessionId } = recallOpts;
|
|
26
20
|
const ctx = await buildContextWithAuth(req, opts);
|
|
27
|
-
const
|
|
28
|
-
// Written first in the recall's own write, so a recall that fails leaves no row.
|
|
29
|
-
const leadingAudit = sessionId ? [] : anchorSkippedRows({ tenantId: ctx.tenantId, actor: ctx.actor.subject }, q);
|
|
30
|
-
const result = await retrieve(ctx, { ...recallOpts, limit, mode, explain, recallHistory, leadingAudit });
|
|
31
|
-
// The ring is created only after recall succeeds, so a 400 cannot LRU-evict a live session.
|
|
32
|
-
const ring = sessionRing('http', ctx.tenantId, sessionId);
|
|
33
|
-
if (ring)
|
|
34
|
-
noteRecall(ring, q, result.results[0]?.id ?? null, result.anchoringHint?.memoryId);
|
|
35
|
-
// HTTP counts the rows it returns here; `retrieve` cannot count for every ranker, since MCP shows a different band and counts none.
|
|
36
|
-
await storeFor(ctx).bumpRecallStats(result.results.length);
|
|
21
|
+
const result = await retrieve(ctx, { ...recallOpts, limit, mode, explain, recordAs: RECALL_RECORDING.http });
|
|
37
22
|
// Continuity payloads should never be cached. The caller is asking for
|
|
38
23
|
// session-state-aware data; intermediaries must not reuse it across users.
|
|
39
|
-
if (includeContinuity) {
|
|
24
|
+
if (recallOpts.includeContinuity) {
|
|
40
25
|
res.setHeader('Cache-Control', 'no-store');
|
|
41
26
|
}
|
|
42
|
-
await recordTokens(ctx, 'http_recall', { items: result.results.length, tokens: result.tokens + (result.continuityTokens ?? 0), sessionId: sessionId ?? null });
|
|
43
27
|
sendJson(res, 200, result);
|
|
44
28
|
return;
|
|
45
29
|
}
|
|
46
|
-
// GET /v1/sessions/:id/assemble?budget=N&freshTail=N&summarizeOlder=0|1
|
|
47
|
-
//
|
|
48
|
-
// with fresh-tail raws + summary substitutions + bio-aware budget fit.
|
|
49
|
-
// Tenant scope from Bearer; default-deny on private rows.
|
|
30
|
+
// GET /v1/sessions/:id/assemble?budget=N&freshTail=N&summarizeOlder=0|1: ordered AssembledContextItem[] (fresh-tail raws, summary substitutions, bio-aware
|
|
31
|
+
// budget fit). Tenant scope from the Bearer; default-deny on private rows.
|
|
50
32
|
export async function handleAssembleSession({ req, res, opts, query }, assembleMatch) {
|
|
51
33
|
validateIdSegment(assembleMatch.id, 'session id');
|
|
52
34
|
const budgetRaw = query.get('budget');
|
|
@@ -82,12 +64,8 @@ export async function handleAssembleSession({ req, res, opts, query }, assembleM
|
|
|
82
64
|
sendJson(res, 200, result);
|
|
83
65
|
return;
|
|
84
66
|
}
|
|
85
|
-
// GET /v1/recall/drill/:id?limit=N&budget=N
|
|
86
|
-
//
|
|
87
|
-
// place of overflowed children (RecallResultItem.isSummary === true), the
|
|
88
|
-
// caller drills into the summary id to recover the originals. Tenant
|
|
89
|
-
// scoped via Bearer; default-deny on private scopes for both summary
|
|
90
|
-
// and children.
|
|
67
|
+
// GET /v1/recall/drill/:id?limit=N&budget=N: companion to /v1/memories; the caller drills into a level-2 summary (RecallResultItem.isSummary) to recover the
|
|
68
|
+
// originals. Tenant-scoped via Bearer; default-deny on private scopes for the summary and its children.
|
|
91
69
|
export async function handleDrillRecall({ req, res, opts, query }, drillMatch) {
|
|
92
70
|
validateIdSegment(drillMatch.id, 'summary id');
|
|
93
71
|
const limitRaw = query.get('limit');
|
|
@@ -145,11 +123,8 @@ function contextReader(hippoRoot, query) {
|
|
|
145
123
|
assertCallerProject({ name, aliases });
|
|
146
124
|
return { name, legacyName: name, aliases };
|
|
147
125
|
}
|
|
148
|
-
// GET /v1/context
|
|
149
|
-
//
|
|
150
|
-
// + recentEvents). No server-side rendering; clients render. Tenant-scoped
|
|
151
|
-
// via the Bearer. Pinned-only + '*' fallback skip the recall audit emit
|
|
152
|
-
// (matches cmdContext); real-query hybrid search emits one 'recall' row.
|
|
126
|
+
// GET /v1/context: a budget-bounded ContextResult JSON, rendered by clients, not the server; tenant-scoped via the Bearer.
|
|
127
|
+
// Pinned-only and '*' fallback skip the recall audit emit (as cmdContext does); a real-query hybrid search emits one 'recall' row.
|
|
153
128
|
export async function handleGetContext({ req, res, opts, query }) {
|
|
154
129
|
const parsed = parseContextRequest(httpParams(query));
|
|
155
130
|
const ctx = await buildContextWithAuth(req, opts);
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
import { MAX_SKILL_NAME_LEN, SKILL, skillsMarkdown } from '../../objects/skills.js';
|
|
3
3
|
import { sendJson } from '../../util/http-util.js';
|
|
4
4
|
import { buildContextWithAuth } from '../auth.js';
|
|
5
|
-
import { parseJsonBody } from '../validation.js';
|
|
6
|
-
import {
|
|
5
|
+
import { MAX_SHORT_FIELD_LEN, parseJsonBody } from '../validation.js';
|
|
6
|
+
import { objectsOf, saveFor } from '../../api/objects.js';
|
|
7
|
+
import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute, } from './object-routes.js';
|
|
7
8
|
const INSTRUCTIONS = { max: 8192, plural: true };
|
|
8
9
|
const skillRoutes = {
|
|
9
10
|
noun: 'skill',
|
|
@@ -13,26 +14,16 @@ const skillRoutes = {
|
|
|
13
14
|
revise: (body) => {
|
|
14
15
|
const instructions = requiredString(body, 'instructions', INSTRUCTIONS);
|
|
15
16
|
const trigger = optionalString(body, 'trigger', 1024);
|
|
16
|
-
const changeSummary = optionalString(body, 'changeSummary',
|
|
17
|
+
const changeSummary = optionalString(body, 'changeSummary', MAX_SHORT_FIELD_LEN);
|
|
17
18
|
return (existing, id) => ({ skillName: existing.skillName, instructions, trigger, changeSummary, supersedesSkillId: id });
|
|
18
19
|
},
|
|
19
20
|
};
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
// 6 routes: POST /v1/skills (new; body skillName + instructions + trigger?),
|
|
23
|
-
// GET /v1/skills (list, status filter; shared parseListLimit), GET
|
|
24
|
-
// /v1/skills/export (renders ACTIVE skills as an AGENTS.md/CLAUDE.md markdown
|
|
25
|
-
// block -> {markdown}; literal 'export' is non-numeric so the /:id (\d+) route
|
|
26
|
-
// cannot capture it, but it is ordered first regardless), GET /v1/skills/:id,
|
|
27
|
-
// POST /v1/skills/:id/supersede, POST /v1/skills/:id/close. DoS caps:
|
|
28
|
-
// skillName 256, instructions 8192, trigger 1024, changeSummary 4096. The store
|
|
29
|
-
// validates + throws; the boundary maps validation -> 400, not-found -> 404,
|
|
30
|
-
// not-active -> 409. Mirrors /v1/processes; "executable" = exportable
|
|
31
|
-
// instruction (no code exec).
|
|
21
|
+
// Routes: /v1/skills (create, list, export, show, supersede, close), mirroring /v1/processes; "executable" means exportable instruction (no code exec).
|
|
22
|
+
// GET /v1/skills/export renders ACTIVE skills as a markdown block for AGENTS.md or CLAUDE.md and is ordered before /:id.
|
|
32
23
|
export async function handleCreateSkill(rr) {
|
|
33
24
|
const ctx = await buildContextWithAuth(rr.req, rr.opts);
|
|
34
25
|
const body = await parseJsonBody(rr.req, ctx);
|
|
35
|
-
const skill = await saveFor(
|
|
26
|
+
const skill = await saveFor(ctx, SKILL, {
|
|
36
27
|
skillName: requiredString(body, 'skillName', { max: MAX_SKILL_NAME_LEN }),
|
|
37
28
|
instructions: requiredString(body, 'instructions', INSTRUCTIONS),
|
|
38
29
|
trigger: optionalString(body, 'trigger', 1024),
|
|
@@ -47,9 +38,8 @@ export function handleListSkills(rr) {
|
|
|
47
38
|
export async function handleExportSkills(rr) {
|
|
48
39
|
const { req, res, opts } = rr;
|
|
49
40
|
const ctx = await buildContextWithAuth(req, opts);
|
|
50
|
-
const markdown = await skillsMarkdown(objectsOf(
|
|
41
|
+
const markdown = await skillsMarkdown(objectsOf(ctx), ctx.tenantId);
|
|
51
42
|
sendJson(res, 200, { markdown });
|
|
52
|
-
return;
|
|
53
43
|
}
|
|
54
44
|
export function handleSupersedeSkill(rr, match) {
|
|
55
45
|
return supersedeRoute(skillRoutes, rr, match);
|
|
@@ -1,70 +1,26 @@
|
|
|
1
1
|
export interface ServerInfo {
|
|
2
|
-
/**
|
|
3
|
-
* Pidfile schema version (L3). Absent on pidfiles written before this
|
|
4
|
-
* field existed — detectServer treats a missing `schema` as legacy and
|
|
5
|
-
* still accepts the pidfile.
|
|
6
|
-
*/
|
|
2
|
+
/** Pidfile schema version; absent on pidfiles written before the field existed, which detectServer treats as legacy and still accepts. */
|
|
7
3
|
schema?: number;
|
|
8
4
|
pid: number;
|
|
9
5
|
port: number;
|
|
10
6
|
url: string;
|
|
11
7
|
started_at: string;
|
|
12
8
|
}
|
|
13
|
-
/**
|
|
14
|
-
*
|
|
15
|
-
* server is genuinely answering on the recorded url. Returns null on missing,
|
|
16
|
-
* malformed, or stale pidfiles, and best-effort unlinks the file in the
|
|
17
|
-
* stale/malformed cases.
|
|
18
|
-
*
|
|
19
|
-
* Liveness is proven in two steps. `process.kill(pid, 0)` rules out dead
|
|
20
|
-
* pids. But a pid can be reused by an unrelated process, so a GET /health
|
|
21
|
-
* then confirms the process that answers is *this* hippo server: its
|
|
22
|
-
* `started_at` must equal the pidfile's. A mismatch, non-200, malformed
|
|
23
|
-
* body, or timeout all mean the pidfile is stale.
|
|
24
|
-
*
|
|
25
|
-
* The /health probe runs only when a pidfile exists and the pid is live, so
|
|
26
|
-
* the common no-server path stays a single fast file existence check.
|
|
27
|
-
*/
|
|
9
|
+
/** Returns the pidfile's ServerInfo if a live hippo server answers on the recorded url, else null (best-effort unlinking of missing/stale/malformed pidfiles).
|
|
10
|
+
* `process.kill(pid, 0)` rules out dead pids; GET /health must then return the pidfile's `started_at` (pids get reused). Probes only if the pid is live. */
|
|
28
11
|
export declare function detectServer(hippoRoot: string): Promise<ServerInfo | null>;
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
* renames into place, which is atomic on POSIX and on NTFS via MoveFileEx.
|
|
32
|
-
*
|
|
33
|
-
* `startedAt` is supplied by the caller (`serve()`) rather than generated
|
|
34
|
-
* here, so the pidfile and the server's GET /health response carry the same
|
|
35
|
-
* timestamp — detectServer's liveness probe compares the two for equality.
|
|
36
|
-
*/
|
|
12
|
+
/** Atomically writes the pidfile (process-scoped temp file, then rename; atomic on POSIX and NTFS). `startedAt` comes from the caller (`serve()`) so the
|
|
13
|
+
* pidfile and GET /health carry the same timestamp, which detectServer's liveness probe compares. */
|
|
37
14
|
export declare function writePidfile(hippoRoot: string, opts: {
|
|
38
15
|
port: number;
|
|
39
16
|
url: string;
|
|
40
17
|
startedAt: string;
|
|
41
18
|
}): void;
|
|
42
|
-
/**
|
|
43
|
-
*
|
|
44
|
-
* caller can use this in shutdown paths without fear of throwing.
|
|
45
|
-
*
|
|
46
|
-
* Identity-blind: deletes whatever pidfile is on disk. A shutdown path that
|
|
47
|
-
* must not clobber a newer server's pidfile should use removePidfileIfOwned.
|
|
48
|
-
*/
|
|
19
|
+
/** Best-effort pidfile removal, silent on any error so shutdown paths can call it. Identity-blind: a shutdown that must not clobber a newer server's pidfile
|
|
20
|
+
* uses removePidfileIfOwned. */
|
|
49
21
|
export declare function removePidfile(hippoRoot: string): void;
|
|
50
|
-
/**
|
|
51
|
-
*
|
|
52
|
-
* Reads and parses the pidfile and unlinks it ONLY when both `pid` and
|
|
53
|
-
* `started_at` match `owner`. A pidfile rewritten by a newer server is left
|
|
54
|
-
* intact, so a shutting-down older server cannot orphan the newer one by
|
|
55
|
-
* deleting its pidfile out from under it.
|
|
56
|
-
*
|
|
57
|
-
* Best-effort and never throws: a missing, unreadable, malformed, or
|
|
58
|
-
* non-object pidfile (including a literal JSON `null`) is "not provably mine"
|
|
59
|
-
* and left alone — detectServer unlinks a malformed pidfile on its next
|
|
60
|
-
* probe, so it does not leak. Returns true iff a matching pidfile was removed.
|
|
61
|
-
*
|
|
62
|
-
* Residual TOCTOU: the pidfile could be rewritten between the read and the
|
|
63
|
-
* unlink. The window is microseconds and the shape is the same read-check-
|
|
64
|
-
* unlink detectServer already uses; this narrows the clobber from an
|
|
65
|
-
* unbounded window (any time between writePidfile and stop) to a negligible
|
|
66
|
-
* one.
|
|
67
|
-
*/
|
|
22
|
+
/** Removes the pidfile ONLY when both `pid` and `started_at` match `owner`, so an older shutting-down server cannot orphan a newer one; never throws.
|
|
23
|
+
* Anything unreadable or malformed is "not provably mine" and left alone (detectServer unlinks it). Returns true iff removed. */
|
|
68
24
|
export declare function removePidfileIfOwned(hippoRoot: string, owner: {
|
|
69
25
|
pid: number;
|
|
70
26
|
startedAt: string;
|