hippo-memory 1.60.0 → 1.61.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/ablation.js +9 -27
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/gemini.js +1 -1
- package/dist/agent-memories/legacy.js +1 -1
- package/dist/agent-memories/source.js +1 -1
- package/dist/agent-memories/sync.js +8 -3
- package/dist/ambient-store.d.ts +14 -0
- package/dist/ambient-store.js +90 -0
- package/dist/ambient.d.ts +23 -0
- package/dist/ambient.js +72 -50
- package/dist/api/assemble.d.ts +93 -0
- package/dist/api/assemble.js +152 -0
- package/dist/api/audit.d.ts +17 -0
- package/dist/api/audit.js +23 -0
- package/dist/api/auth.d.ts +79 -0
- package/dist/api/auth.js +178 -0
- package/dist/api/context-types.d.ts +105 -0
- package/dist/api/context-types.js +3 -0
- package/dist/api/context.d.ts +31 -0
- package/dist/api/context.js +705 -0
- package/dist/api/dormant.d.ts +30 -0
- package/dist/api/dormant.js +140 -0
- package/dist/api/drill-down.d.ts +84 -0
- package/dist/api/drill-down.js +123 -0
- package/dist/api/forget.d.ts +57 -0
- package/dist/api/forget.js +87 -0
- package/dist/api/goals.d.ts +18 -0
- package/dist/api/goals.js +33 -0
- package/dist/api/learn.d.ts +31 -0
- package/dist/api/learn.js +88 -0
- package/dist/api/outcome.d.ts +61 -0
- package/dist/api/outcome.js +66 -0
- package/dist/api/promote.d.ts +54 -0
- package/dist/api/promote.js +203 -0
- package/dist/api/quarantine.d.ts +24 -0
- package/dist/api/quarantine.js +121 -0
- package/dist/api/recall-types.d.ts +390 -0
- package/dist/api/recall-types.js +3 -0
- package/dist/api/recall.d.ts +36 -0
- package/dist/api/recall.js +634 -0
- package/dist/api/remember.d.ts +35 -0
- package/dist/api/remember.js +43 -0
- package/dist/api/sleep.d.ts +136 -0
- package/dist/api/sleep.js +271 -0
- package/dist/api/tokens.d.ts +26 -0
- package/dist/api/tokens.js +60 -0
- package/dist/api/types.d.ts +56 -0
- package/dist/api/types.js +38 -0
- package/dist/api.d.ts +20 -1262
- package/dist/api.js +25 -2727
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +6 -3
- package/dist/auth.d.ts +45 -4
- package/dist/auth.js +125 -48
- package/dist/autolearn.js +2 -2
- package/dist/capture/command.d.ts +33 -0
- package/dist/capture/command.js +264 -0
- package/dist/capture/compact.d.ts +44 -0
- package/dist/capture/compact.js +354 -0
- package/dist/capture/extract.d.ts +21 -0
- package/dist/capture/extract.js +464 -0
- package/dist/capture/transcript.d.ts +40 -0
- package/dist/capture/transcript.js +193 -0
- package/dist/capture-error.js +2 -1
- package/dist/churn-git.js +4 -2
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.js +159 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.js +171 -0
- package/dist/cli/briefs.d.ts +4 -0
- package/dist/cli/briefs.js +435 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +333 -0
- package/dist/cli/context.d.ts +15 -0
- package/dist/cli/context.js +366 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +445 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +555 -0
- package/dist/cli/dag.d.ts +5 -0
- package/dist/cli/dag.js +177 -0
- package/dist/cli/decisions.d.ts +4 -0
- package/dist/cli/decisions.js +528 -0
- package/dist/cli/eval.d.ts +5 -0
- package/dist/cli/eval.js +213 -0
- package/dist/cli/explain.d.ts +4 -0
- package/dist/cli/explain.js +150 -0
- package/dist/cli/goals.d.ts +2 -0
- package/dist/cli/goals.js +196 -0
- package/dist/cli/hook-blocks.d.ts +18 -0
- package/dist/cli/hook-blocks.js +233 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +305 -0
- package/dist/cli/maintenance.d.ts +4 -0
- package/dist/cli/maintenance.js +179 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +556 -0
- package/dist/cli/projects.js +1 -1
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +597 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +442 -0
- package/dist/cli/serve.d.ts +5 -0
- package/dist/cli/serve.js +40 -0
- package/dist/cli/session-hooks.d.ts +29 -0
- package/dist/cli/session-hooks.js +637 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +376 -0
- package/dist/cli/shared.d.ts +15 -19
- package/dist/cli/shared.js +50 -341
- package/dist/cli/slack.d.ts +2 -0
- package/dist/cli/slack.js +171 -0
- package/dist/cli/status.d.ts +18 -0
- package/dist/cli/status.js +400 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +438 -0
- package/dist/cli/usage.d.ts +85 -0
- package/dist/cli/usage.js +741 -0
- package/dist/cli.d.ts +71 -120
- package/dist/cli.js +170 -8469
- package/dist/client.js +15 -8
- package/dist/compaction-record.js +6 -4
- package/dist/connectors/github/backfill.js +94 -87
- package/dist/connectors/github/cli-impl.js +4 -3
- package/dist/connectors/github/dlq.js +67 -54
- package/dist/connectors/github/ingest.js +34 -35
- package/dist/connectors/github/tenant-routing.js +3 -2
- package/dist/connectors/github/webhook.js +135 -216
- package/dist/connectors/slack/dlq.js +49 -61
- package/dist/connectors/slack/ingest.js +55 -48
- package/dist/connectors/slack/tenant-routing.js +4 -3
- package/dist/connectors/slack/webhook.js +72 -74
- package/dist/consolidate/conflicts.d.ts +10 -0
- package/dist/consolidate/conflicts.js +178 -0
- package/dist/consolidate/decay.d.ts +12 -0
- package/dist/consolidate/decay.js +145 -0
- package/dist/consolidate/llm-passes.d.ts +3 -0
- package/dist/consolidate/llm-passes.js +141 -0
- package/dist/consolidate/merge.d.ts +7 -0
- package/dist/consolidate/merge.js +251 -0
- package/dist/consolidate/physics-pass.d.ts +3 -0
- package/dist/consolidate/physics-pass.js +60 -0
- package/dist/consolidate/run.d.ts +69 -0
- package/dist/consolidate/run.js +76 -0
- package/dist/consolidate/sleep.d.ts +18 -0
- package/dist/consolidate/sleep.js +209 -0
- package/dist/consolidate/traces.d.ts +4 -0
- package/dist/consolidate/traces.js +178 -0
- package/dist/context-auto.js +7 -11
- package/dist/context-render.d.ts +1 -1
- package/dist/context-render.js +1 -1
- package/dist/customer-notes.d.ts +3 -0
- package/dist/customer-notes.js +6 -4
- package/dist/dag.js +6 -5
- package/dist/dashboard-actions.d.ts +20 -0
- package/dist/dashboard-actions.js +88 -0
- package/dist/dashboard-params.d.ts +45 -0
- package/dist/dashboard-params.js +127 -0
- package/dist/dashboard-queries.d.ts +15 -0
- package/dist/dashboard-queries.js +355 -0
- package/dist/dashboard-snapshot.d.ts +138 -0
- package/dist/dashboard-snapshot.js +308 -0
- package/dist/dashboard-types.d.ts +163 -0
- package/dist/dashboard-types.js +3 -0
- package/dist/dashboard.d.ts +6 -7
- package/dist/dashboard.js +228 -202
- package/dist/db/busy.d.ts +5 -0
- package/dist/db/busy.js +24 -0
- package/dist/db/continuity.d.ts +5 -0
- package/dist/db/continuity.js +145 -0
- package/dist/db/meta.d.ts +8 -0
- package/dist/db/meta.js +35 -0
- package/dist/db/migrate.d.ts +9 -0
- package/dist/db/migrate.js +138 -0
- package/dist/db/migrations/index.d.ts +5 -0
- package/dist/db/migrations/index.js +109 -0
- package/dist/db/migrations/types.d.ts +14 -0
- package/dist/db/migrations/types.js +2 -0
- package/dist/db/migrations/v01.d.ts +3 -0
- package/dist/db/migrations/v01.js +38 -0
- package/dist/db/migrations/v02.d.ts +3 -0
- package/dist/db/migrations/v02.js +21 -0
- package/dist/db/migrations/v03.d.ts +3 -0
- package/dist/db/migrations/v03.js +22 -0
- package/dist/db/migrations/v04.d.ts +3 -0
- package/dist/db/migrations/v04.js +28 -0
- package/dist/db/migrations/v05.d.ts +3 -0
- package/dist/db/migrations/v05.js +21 -0
- package/dist/db/migrations/v06.d.ts +3 -0
- package/dist/db/migrations/v06.js +25 -0
- package/dist/db/migrations/v07.d.ts +3 -0
- package/dist/db/migrations/v07.js +13 -0
- package/dist/db/migrations/v08.d.ts +3 -0
- package/dist/db/migrations/v08.js +8 -0
- package/dist/db/migrations/v09.d.ts +3 -0
- package/dist/db/migrations/v09.js +13 -0
- package/dist/db/migrations/v10.d.ts +3 -0
- package/dist/db/migrations/v10.js +17 -0
- package/dist/db/migrations/v11.d.ts +3 -0
- package/dist/db/migrations/v11.js +15 -0
- package/dist/db/migrations/v12.d.ts +3 -0
- package/dist/db/migrations/v12.js +11 -0
- package/dist/db/migrations/v13.d.ts +3 -0
- package/dist/db/migrations/v13.js +15 -0
- package/dist/db/migrations/v14.d.ts +3 -0
- package/dist/db/migrations/v14.js +66 -0
- package/dist/db/migrations/v15.d.ts +3 -0
- package/dist/db/migrations/v15.js +42 -0
- package/dist/db/migrations/v16.d.ts +3 -0
- package/dist/db/migrations/v16.js +61 -0
- package/dist/db/migrations/v17.d.ts +3 -0
- package/dist/db/migrations/v17.js +46 -0
- package/dist/db/migrations/v18.d.ts +3 -0
- package/dist/db/migrations/v18.js +60 -0
- package/dist/db/migrations/v19.d.ts +3 -0
- package/dist/db/migrations/v19.js +28 -0
- package/dist/db/migrations/v20.d.ts +3 -0
- package/dist/db/migrations/v20.js +42 -0
- package/dist/db/migrations/v21.d.ts +3 -0
- package/dist/db/migrations/v21.js +16 -0
- package/dist/db/migrations/v22.d.ts +3 -0
- package/dist/db/migrations/v22.js +82 -0
- package/dist/db/migrations/v23.d.ts +3 -0
- package/dist/db/migrations/v23.js +48 -0
- package/dist/db/migrations/v24.d.ts +3 -0
- package/dist/db/migrations/v24.js +72 -0
- package/dist/db/migrations/v25.d.ts +3 -0
- package/dist/db/migrations/v25.js +46 -0
- package/dist/db/migrations/v26.d.ts +3 -0
- package/dist/db/migrations/v26.js +23 -0
- package/dist/db/migrations/v27.d.ts +3 -0
- package/dist/db/migrations/v27.js +57 -0
- package/dist/db/migrations/v28.d.ts +3 -0
- package/dist/db/migrations/v28.js +38 -0
- package/dist/db/migrations/v29.d.ts +3 -0
- package/dist/db/migrations/v29.js +78 -0
- package/dist/db/migrations/v30.d.ts +3 -0
- package/dist/db/migrations/v30.js +92 -0
- package/dist/db/migrations/v31.d.ts +3 -0
- package/dist/db/migrations/v31.js +74 -0
- package/dist/db/migrations/v32.d.ts +3 -0
- package/dist/db/migrations/v32.js +102 -0
- package/dist/db/migrations/v33.d.ts +3 -0
- package/dist/db/migrations/v33.js +104 -0
- package/dist/db/migrations/v34.d.ts +3 -0
- package/dist/db/migrations/v34.js +93 -0
- package/dist/db/migrations/v35.d.ts +3 -0
- package/dist/db/migrations/v35.js +98 -0
- package/dist/db/migrations/v36.d.ts +3 -0
- package/dist/db/migrations/v36.js +98 -0
- package/dist/db/migrations/v37.d.ts +3 -0
- package/dist/db/migrations/v37.js +219 -0
- package/dist/db/migrations/v38.d.ts +3 -0
- package/dist/db/migrations/v38.js +277 -0
- package/dist/db/migrations/v39.d.ts +3 -0
- package/dist/db/migrations/v39.js +59 -0
- package/dist/db/migrations/v40.d.ts +3 -0
- package/dist/db/migrations/v40.js +74 -0
- package/dist/db/migrations/v41.d.ts +3 -0
- package/dist/db/migrations/v41.js +43 -0
- package/dist/db/migrations/v42.d.ts +3 -0
- package/dist/db/migrations/v42.js +41 -0
- package/dist/db/migrations/v43.d.ts +3 -0
- package/dist/db/migrations/v43.js +67 -0
- package/dist/db/migrations/v44.d.ts +3 -0
- package/dist/db/migrations/v44.js +28 -0
- package/dist/db/migrations/v45.d.ts +3 -0
- package/dist/db/migrations/v45.js +30 -0
- package/dist/db/migrations/v46.d.ts +3 -0
- package/dist/db/migrations/v46.js +25 -0
- package/dist/db/migrations/v47.d.ts +3 -0
- package/dist/db/migrations/v47.js +17 -0
- package/dist/db/migrations/v48.d.ts +3 -0
- package/dist/db/migrations/v48.js +10 -0
- package/dist/db/migrations/v49.d.ts +3 -0
- package/dist/db/migrations/v49.js +31 -0
- package/dist/db/migrations/v50.d.ts +3 -0
- package/dist/db/migrations/v50.js +67 -0
- package/dist/db/migrations/v51.d.ts +3 -0
- package/dist/db/migrations/v51.js +14 -0
- package/dist/db/migrations/v52.d.ts +3 -0
- package/dist/db/migrations/v52.js +7 -0
- package/dist/db/open.d.ts +23 -0
- package/dist/db/open.js +146 -0
- package/dist/db/sqlite.d.ts +21 -0
- package/dist/db/sqlite.js +8 -0
- package/dist/db/tables.d.ts +7 -0
- package/dist/db/tables.js +38 -0
- package/dist/db.d.ts +6 -46
- package/dist/db.js +5 -3049
- package/dist/decisions.d.ts +4 -1
- package/dist/decisions.js +9 -7
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +4 -1
- package/dist/doctor.js +3 -3
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +4 -3
- package/dist/embeddings.d.ts +9 -52
- package/dist/embeddings.js +43 -297
- package/dist/env.d.ts +75 -0
- package/dist/env.js +119 -0
- package/dist/eval-suite.js +1 -1
- package/dist/eval.js +2 -2
- package/dist/extract.js +1 -1
- package/dist/gated-write.js +3 -1
- package/dist/goals.d.ts +3 -1
- package/dist/goals.js +18 -0
- package/dist/graph/read.d.ts +73 -0
- package/dist/graph/read.js +325 -0
- package/dist/graph/rows.d.ts +45 -0
- package/dist/graph/rows.js +51 -0
- package/dist/graph/types.d.ts +83 -0
- package/dist/graph/types.js +11 -0
- package/dist/graph/write.d.ts +93 -0
- package/dist/{graph.js → graph/write.js} +6 -384
- package/dist/graph-extract.js +2 -1
- package/dist/graph-recall.d.ts +1 -1
- package/dist/graph-recall.js +2 -2
- package/dist/graph-stream.js +1 -1
- package/dist/graph-view.d.ts +1 -1
- package/dist/graph-view.js +1 -1
- package/dist/half-life-migration.d.ts +1 -1
- package/dist/half-life-migration.js +2 -1
- package/dist/hooks/codex-session.d.ts +8 -0
- package/dist/hooks/codex-session.js +76 -0
- package/dist/hooks/codex-wrapper.d.ts +55 -0
- package/dist/hooks/codex-wrapper.js +288 -0
- package/dist/hooks/json-hooks.d.ts +63 -0
- package/dist/hooks/json-hooks.js +356 -0
- package/dist/hooks/opencode.d.ts +50 -0
- package/dist/hooks/opencode.js +202 -0
- package/dist/hooks/shared.d.ts +54 -0
- package/dist/hooks/shared.js +77 -0
- package/dist/http-retry.d.ts +2 -0
- package/dist/http-retry.js +4 -3
- package/dist/http-util.d.ts +3 -0
- package/dist/http-util.js +10 -0
- package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
- package/dist/importers/core.js +141 -0
- package/dist/importers/markdown-parse.d.ts +41 -0
- package/dist/importers/markdown-parse.js +132 -0
- package/dist/importers/markdown.d.ts +3 -0
- package/dist/importers/markdown.js +92 -0
- package/dist/importers/sources.d.ts +7 -0
- package/dist/importers/sources.js +229 -0
- package/dist/importers/vault.d.ts +11 -0
- package/dist/importers/vault.js +352 -0
- package/dist/incidents.d.ts +3 -0
- package/dist/incidents.js +7 -5
- package/dist/index.d.ts +25 -6
- package/dist/index.js +23 -6
- package/dist/invalidation.js +2 -1
- package/dist/judgment.js +2 -1
- package/dist/keyset.d.ts +13 -0
- package/dist/keyset.js +8 -0
- package/dist/local-embedding.d.ts +13 -0
- package/dist/local-embedding.js +165 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +19 -1
- package/dist/mcp/admin-tools.d.ts +8 -0
- package/dist/mcp/admin-tools.js +116 -0
- package/dist/mcp/format.d.ts +27 -0
- package/dist/mcp/format.js +135 -0
- package/dist/mcp/memory-tools.d.ts +5 -0
- package/dist/mcp/memory-tools.js +83 -0
- package/dist/mcp/protocol.d.ts +83 -0
- package/dist/mcp/protocol.js +55 -0
- package/dist/mcp/recall-tools.d.ts +6 -0
- package/dist/mcp/recall-tools.js +320 -0
- package/dist/mcp/request.d.ts +10 -0
- package/dist/mcp/request.js +163 -0
- package/dist/mcp/server.d.ts +4 -75
- package/dist/mcp/server.js +7 -1190
- package/dist/mcp/session-state.d.ts +11 -0
- package/dist/mcp/session-state.js +28 -0
- package/dist/mcp/stdio.d.ts +8 -0
- package/dist/mcp/stdio.js +79 -0
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.js +247 -0
- package/dist/memory.d.ts +3 -0
- package/dist/memory.js +27 -1
- package/dist/multihop.d.ts +1 -1
- package/dist/multihop.js +2 -1
- package/dist/owner-validation.js +2 -1
- package/dist/physics-state.js +10 -7
- package/dist/policies.d.ts +3 -0
- package/dist/policies.js +8 -6
- package/dist/postinstall.js +3 -2
- package/dist/predictions/planning-fallacy.d.ts +100 -0
- package/dist/predictions/planning-fallacy.js +190 -0
- package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
- package/dist/predictions/store.js +434 -0
- package/dist/processes.d.ts +3 -0
- package/dist/processes.js +7 -5
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +7 -5
- package/dist/project-identity.js +3 -2
- package/dist/project-merge.js +3 -1
- package/dist/quarantine.d.ts +2 -1
- package/dist/quarantine.js +8 -5
- package/dist/raw-archive.js +1 -1
- package/dist/recall-history.js +3 -2
- package/dist/recall-pipeline.d.ts +2 -2
- package/dist/recall-pipeline.js +16 -8
- package/dist/recall-scope.js +1 -1
- package/dist/recall-trace.d.ts +1 -1
- package/dist/refine-llm.js +2 -1
- package/dist/reject-flow.js +6 -1
- package/dist/rerankers/clef.js +6 -5
- package/dist/rerankers/jev.d.ts +1 -1
- package/dist/rerankers/jev.js +4 -4
- package/dist/rerankers/llm.d.ts +4 -2
- package/dist/rerankers/llm.js +58 -38
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/salience.js +1 -1
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.js +26 -4
- package/dist/scope.js +4 -3
- package/dist/search/as-of.d.ts +10 -0
- package/dist/search/as-of.js +22 -0
- package/dist/search/bm25-search.d.ts +14 -0
- package/dist/search/bm25-search.js +43 -0
- package/dist/search/bm25.d.ts +15 -0
- package/dist/search/bm25.js +54 -0
- package/dist/search/boosts.d.ts +54 -0
- package/dist/search/boosts.js +94 -0
- package/dist/search/breakdown.d.ts +7 -0
- package/dist/search/breakdown.js +20 -0
- package/dist/search/explain.d.ts +25 -0
- package/dist/search/explain.js +31 -0
- package/dist/search/finalize.d.ts +8 -0
- package/dist/search/finalize.js +52 -0
- package/dist/search/fusion.d.ts +27 -0
- package/dist/search/fusion.js +42 -0
- package/dist/search/hybrid-score.d.ts +20 -0
- package/dist/search/hybrid-score.js +73 -0
- package/dist/search/hybrid.d.ts +46 -0
- package/dist/search/hybrid.js +64 -0
- package/dist/search/physics-search.d.ts +29 -0
- package/dist/search/physics-search.js +162 -0
- package/dist/search/rerank.d.ts +10 -0
- package/dist/search/rerank.js +72 -0
- package/dist/search/temporal.d.ts +15 -0
- package/dist/search/temporal.js +45 -0
- package/dist/search/types.d.ts +91 -0
- package/dist/search/types.js +2 -0
- package/dist/search/vector.d.ts +30 -0
- package/dist/search/vector.js +71 -0
- package/dist/secret-detect.d.ts +2 -0
- package/dist/secret-detect.js +2 -1
- package/dist/server/auth.d.ts +52 -0
- package/dist/server/auth.js +221 -0
- package/dist/server/client-ip.d.ts +25 -0
- package/dist/server/client-ip.js +92 -0
- package/dist/server/cursor.d.ts +23 -0
- package/dist/server/cursor.js +58 -0
- package/dist/server/lifecycle.d.ts +7 -0
- package/dist/server/lifecycle.js +29 -0
- package/dist/server/mcp-http.d.ts +5 -0
- package/dist/server/mcp-http.js +199 -0
- package/dist/server/request.d.ts +33 -0
- package/dist/server/request.js +103 -0
- package/dist/server/routes/admin.d.ts +9 -0
- package/dist/server/routes/admin.js +158 -0
- package/dist/server/routes/customer-notes.d.ts +7 -0
- package/dist/server/routes/customer-notes.js +112 -0
- package/dist/server/routes/decisions.d.ts +7 -0
- package/dist/server/routes/decisions.js +133 -0
- package/dist/server/routes/incidents.d.ts +7 -0
- package/dist/server/routes/incidents.js +126 -0
- package/dist/server/routes/memories.d.ts +10 -0
- package/dist/server/routes/memories.js +179 -0
- package/dist/server/routes/policies.d.ts +8 -0
- package/dist/server/routes/policies.js +151 -0
- package/dist/server/routes/predictions.d.ts +7 -0
- package/dist/server/routes/predictions.js +164 -0
- package/dist/server/routes/processes.d.ts +7 -0
- package/dist/server/routes/processes.js +161 -0
- package/dist/server/routes/project-briefs.d.ts +8 -0
- package/dist/server/routes/project-briefs.js +136 -0
- package/dist/server/routes/recall.d.ts +8 -0
- package/dist/server/routes/recall.js +340 -0
- package/dist/server/routes/skills.d.ts +8 -0
- package/dist/server/routes/skills.js +150 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/types.js +2 -0
- package/dist/server/validation.d.ts +14 -0
- package/dist/server/validation.js +91 -0
- package/dist/server.d.ts +7 -61
- package/dist/server.js +69 -2362
- package/dist/session-digest.d.ts +1 -1
- package/dist/session-digest.js +9 -2
- package/dist/shared.d.ts +3 -1
- package/dist/shared.js +26 -22
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +7 -5
- package/dist/stdin.js +2 -2
- package/dist/store/audit-event.d.ts +19 -0
- package/dist/store/audit-event.js +33 -0
- package/dist/store/candidates.d.ts +42 -0
- package/dist/store/candidates.js +152 -0
- package/dist/store/conflicts.d.ts +44 -0
- package/dist/store/conflicts.js +444 -0
- package/dist/store/delete-and-batch.d.ts +63 -0
- package/dist/store/delete-and-batch.js +310 -0
- package/dist/store/entry-reads.d.ts +92 -0
- package/dist/store/entry-reads.js +255 -0
- package/dist/store/entry-row.d.ts +67 -0
- package/dist/store/entry-row.js +208 -0
- package/dist/store/entry-writes.d.ts +46 -0
- package/dist/store/entry-writes.js +148 -0
- package/dist/store/handoffs.d.ts +26 -0
- package/dist/store/handoffs.js +184 -0
- package/dist/store/index-and-stats.d.ts +52 -0
- package/dist/store/index-and-stats.js +214 -0
- package/dist/store/markdown.d.ts +10 -0
- package/dist/store/markdown.js +108 -0
- package/dist/store/mirrors.d.ts +49 -0
- package/dist/store/mirrors.js +312 -0
- package/dist/store/open.d.ts +15 -0
- package/dist/store/open.js +223 -0
- package/dist/store/rows.d.ts +178 -0
- package/dist/store/rows.js +158 -0
- package/dist/store/search-rows.d.ts +86 -0
- package/dist/store/search-rows.js +254 -0
- package/dist/store/sessions.d.ts +83 -0
- package/dist/store/sessions.js +272 -0
- package/dist/store/summaries.d.ts +94 -0
- package/dist/store/summaries.js +377 -0
- package/dist/store/tenant-lookup.d.ts +12 -0
- package/dist/store/tenant-lookup.js +16 -0
- package/dist/store-cards.js +2 -1
- package/dist/summary-dirty.d.ts +4 -0
- package/dist/summary-dirty.js +32 -0
- package/dist/support-bundle.js +4 -3
- package/dist/tenant.js +2 -2
- package/dist/tokenize.d.ts +2 -0
- package/dist/tokenize.js +16 -0
- package/dist/transcript-tail.d.ts +7 -0
- package/dist/transcript-tail.js +48 -0
- package/dist/vector-store.d.ts +27 -0
- package/dist/vector-store.js +210 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/dist/working-memory.js +1 -1
- package/dist/yaml.js +36 -11
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist-ui/assets/index-DPN7cP19.js +33 -0
- package/dist-ui/assets/index-dFloKRVr.css +1 -0
- package/dist-ui/index.html +3 -25
- 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/capture.d.ts +0 -155
- package/dist/capture.js +0 -1295
- package/dist/consolidate.d.ts +0 -58
- package/dist/consolidate.js +0 -1124
- package/dist/graph.d.ts +0 -245
- package/dist/hooks.d.ts +0 -208
- package/dist/hooks.js +0 -1076
- package/dist/importers.js +0 -900
- package/dist/predictions.js +0 -620
- package/dist/search.d.ts +0 -320
- package/dist/search.js +0 -970
- package/dist/store.d.ts +0 -776
- package/dist/store.js +0 -3473
- package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
- package/dist-ui/assets/index-BhT8RvO6.js +0 -61
- package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
- package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
package/dist/dag.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createMemory, Layer } from './memory.js';
|
|
2
|
-
import { writeEntry
|
|
2
|
+
import { writeEntry } from './store/entry-writes.js';
|
|
3
|
+
import { loadAllDirtySummaries, loadChildrenOfSummary, applyRebuildResult, clearSummaryDirtyAfterBuild, } from './store/summaries.js';
|
|
3
4
|
import { RejectedValueError } from './rejection.js';
|
|
4
5
|
import { redactSecretsStrict } from './secret-detect.js';
|
|
5
6
|
import { fetchWithRetry, llmTimeoutMs } from './http-retry.js';
|
|
@@ -145,7 +146,7 @@ export async function buildDag(hippoRoot, facts, opts) {
|
|
|
145
146
|
// The tombstone check itself is tenant-scoped for free: writeEntry ->
|
|
146
147
|
// writeEntryDbOnly -> upsertEntryRow calls
|
|
147
148
|
// checkRejectionGuard(db, entry.tenantId ?? 'default', ...)
|
|
148
|
-
// (store.ts
|
|
149
|
+
// (store/entry-writes.ts), reading tenantId off the entry being written. Now
|
|
149
150
|
// that summaryEntry carries factTenant instead of the implicit
|
|
150
151
|
// 'default', the guard consults that tenant's tombstones — no
|
|
151
152
|
// separate check needed here (unlike consolidate.ts's merge pass,
|
|
@@ -170,7 +171,7 @@ export async function buildDag(hippoRoot, facts, opts) {
|
|
|
170
171
|
result.factsLinked++;
|
|
171
172
|
}
|
|
172
173
|
// v0.30 / E3 — cancel the cascade of dirty-marks fired by member
|
|
173
|
-
// writeEntry calls (E2 hook on writeEntryDbOnly
|
|
174
|
+
// writeEntry calls (E2 hook on writeEntryDbOnly in store/entry-writes.ts).
|
|
174
175
|
// The summary we just built IS fresh, no rebuild needed. Without this,
|
|
175
176
|
// E3 in the SAME sleep cycle would re-rebuild every new summary
|
|
176
177
|
// (2x LLM cost). plan-eng-r1 HIGH must-fix.
|
|
@@ -236,7 +237,7 @@ export async function rebuildDirtySummaries(hippoRoot, opts) {
|
|
|
236
237
|
result.zeroChildSkipped++;
|
|
237
238
|
// changed=false → race lost / row vanished; silently skip. `refused`
|
|
238
239
|
// is always false here — applyRebuildResult only checks the
|
|
239
|
-
// tombstone when bumpRebuildCount is true (store.ts
|
|
240
|
+
// tombstone when bumpRebuildCount is true (store/summaries.ts).
|
|
240
241
|
continue;
|
|
241
242
|
}
|
|
242
243
|
// Derive label from summary's existing entity tags (mirrors clusterFacts)
|
|
@@ -272,7 +273,7 @@ export async function rebuildDirtySummaries(hippoRoot, opts) {
|
|
|
272
273
|
catch (err) {
|
|
273
274
|
// Per-summary failure isolation — one throw doesn't abort the queue.
|
|
274
275
|
// independent-review MED #2 fold: log enough to triage in production
|
|
275
|
-
// (audit() wraps its own writes try/catch per store.ts
|
|
276
|
+
// (audit() wraps its own writes try/catch per store/audit-event.ts, so a
|
|
276
277
|
// throw here is exotic: SQLite I/O error, prepare failure, etc).
|
|
277
278
|
result.failed++;
|
|
278
279
|
log.error(`rebuildDirtySummaries: summary ${summary.id} (tenant ${summary.tenantId}) failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { MemoryEntry } from './memory.js';
|
|
2
|
+
import { type ActionBody } from './dashboard-params.js';
|
|
3
|
+
/** What an action hands the router: a status, a JSON body, and whether the store changed. */
|
|
4
|
+
export interface ActionResult {
|
|
5
|
+
status: number;
|
|
6
|
+
body: unknown;
|
|
7
|
+
/** True when a write committed, so the router drops the snapshot. */
|
|
8
|
+
changed: boolean;
|
|
9
|
+
/** The live entry an action acted on, so the router can build the detail after the cache is dropped. */
|
|
10
|
+
entry?: MemoryEntry;
|
|
11
|
+
}
|
|
12
|
+
/** Sets `pinned`; the audit row says `remember` with actor `dashboard`, the same op the old star toggle wrote. */
|
|
13
|
+
export declare function pinMemory(hippoRoot: string, tenantId: string, rawId: string, body: ActionBody): ActionResult;
|
|
14
|
+
/** Marks a memory wrong, the same signal as `hippo outcome --bad`. */
|
|
15
|
+
export declare function markWrong(hippoRoot: string, tenantId: string, rawId: string): ActionResult;
|
|
16
|
+
/** Deletes a memory like `hippo forget`; a raw receipt is append-only and answers 409 with the archive hint. */
|
|
17
|
+
export declare function forgetMemory(hippoRoot: string, tenantId: string, rawId: string): ActionResult;
|
|
18
|
+
/** Keeps one side of an open conflict and weakens the other; every refusal maps to its own status. */
|
|
19
|
+
export declare function resolveOpenConflict(hippoRoot: string, tenantId: string, conflictId: number, body: ActionBody): ActionResult;
|
|
20
|
+
//# sourceMappingURL=dashboard-actions.d.ts.map
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// The four dashboard writes, each a thin call into an existing store or api function; the router owns HTTP and the cache.
|
|
2
|
+
import * as api from './api.js';
|
|
3
|
+
import { NotFoundError } from './api-errors.js';
|
|
4
|
+
import { listMemoryConflicts, resolveConflict } from './store/conflicts.js';
|
|
5
|
+
import { readEntry } from './store/entry-reads.js';
|
|
6
|
+
import { writeEntry } from './store/entry-writes.js';
|
|
7
|
+
import { ParamError, parseMemoryId } from './dashboard-params.js';
|
|
8
|
+
import { isLiveMemory } from './dashboard-snapshot.js';
|
|
9
|
+
const ACTOR = 'dashboard';
|
|
10
|
+
function notFound() {
|
|
11
|
+
return { status: 404, body: { error: 'Not found' }, changed: false };
|
|
12
|
+
}
|
|
13
|
+
function liveEntry(hippoRoot, tenantId, id) {
|
|
14
|
+
const entry = readEntry(hippoRoot, id, tenantId);
|
|
15
|
+
return entry !== null && isLiveMemory(entry) ? entry : null;
|
|
16
|
+
}
|
|
17
|
+
/** Sets `pinned`; the audit row says `remember` with actor `dashboard`, the same op the old star toggle wrote. */
|
|
18
|
+
export function pinMemory(hippoRoot, tenantId, rawId, body) {
|
|
19
|
+
const id = parseMemoryId(rawId);
|
|
20
|
+
const { pinned } = body;
|
|
21
|
+
if (pinned === undefined)
|
|
22
|
+
throw new ParamError('pinned must be true or false');
|
|
23
|
+
const entry = liveEntry(hippoRoot, tenantId, id);
|
|
24
|
+
if (entry === null)
|
|
25
|
+
return notFound();
|
|
26
|
+
const next = { ...entry, pinned };
|
|
27
|
+
writeEntry(hippoRoot, next, { actor: ACTOR });
|
|
28
|
+
return { status: 200, body: null, changed: true, entry: next };
|
|
29
|
+
}
|
|
30
|
+
/** Marks a memory wrong, the same signal as `hippo outcome --bad`. */
|
|
31
|
+
export function markWrong(hippoRoot, tenantId, rawId) {
|
|
32
|
+
const id = parseMemoryId(rawId);
|
|
33
|
+
if (liveEntry(hippoRoot, tenantId, id) === null)
|
|
34
|
+
return notFound();
|
|
35
|
+
const ctx = { hippoRoot, tenantId, actor: api.adminActor(ACTOR) };
|
|
36
|
+
// outcome() answers `applied: 0` for a missing or other-tenant id instead of throwing.
|
|
37
|
+
if (api.outcome(ctx, [id], false).applied === 0)
|
|
38
|
+
return notFound();
|
|
39
|
+
const entry = readEntry(hippoRoot, id, tenantId);
|
|
40
|
+
return entry === null ? notFound() : { status: 200, body: null, changed: true, entry };
|
|
41
|
+
}
|
|
42
|
+
/** Deletes a memory like `hippo forget`; a raw receipt is append-only and answers 409 with the archive hint. */
|
|
43
|
+
export function forgetMemory(hippoRoot, tenantId, rawId) {
|
|
44
|
+
const id = parseMemoryId(rawId);
|
|
45
|
+
if (liveEntry(hippoRoot, tenantId, id) === null)
|
|
46
|
+
return notFound();
|
|
47
|
+
const ctx = { hippoRoot, tenantId, actor: api.adminActor(ACTOR) };
|
|
48
|
+
try {
|
|
49
|
+
const done = api.forget(ctx, id);
|
|
50
|
+
return { status: 200, body: done, changed: true };
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (err instanceof NotFoundError)
|
|
54
|
+
return notFound();
|
|
55
|
+
// Same match as cmdForget: the append-only trigger names itself in the message.
|
|
56
|
+
if (err instanceof Error && /append-only/i.test(err.message)) {
|
|
57
|
+
const error = `Cannot forget ${id}: it is a raw, append-only memory. Archive it instead: hippo forget ${id} --archive --reason "<why>"`;
|
|
58
|
+
return { status: 409, body: { error }, changed: false };
|
|
59
|
+
}
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Keeps one side of an open conflict and weakens the other; every refusal maps to its own status. */
|
|
64
|
+
export function resolveOpenConflict(hippoRoot, tenantId, conflictId, body) {
|
|
65
|
+
const { keep } = body;
|
|
66
|
+
if (keep === undefined)
|
|
67
|
+
throw new ParamError('keep must be a memory id');
|
|
68
|
+
parseMemoryId(keep);
|
|
69
|
+
const conflict = listMemoryConflicts(hippoRoot, '*', tenantId).find((c) => c.id === conflictId);
|
|
70
|
+
if (!conflict)
|
|
71
|
+
return notFound();
|
|
72
|
+
const already = () => ({ status: 409, body: { error: 'This conflict is already resolved' }, changed: false });
|
|
73
|
+
if (conflict.status !== 'open')
|
|
74
|
+
return already();
|
|
75
|
+
if (keep !== conflict.memory_a_id && keep !== conflict.memory_b_id) {
|
|
76
|
+
throw new ParamError('keep must be one of the two memories in the conflict');
|
|
77
|
+
}
|
|
78
|
+
if (liveEntry(hippoRoot, tenantId, conflict.memory_a_id) === null || liveEntry(hippoRoot, tenantId, conflict.memory_b_id) === null) {
|
|
79
|
+
return notFound();
|
|
80
|
+
}
|
|
81
|
+
const resolved = resolveConflict(hippoRoot, conflictId, keep, false, tenantId, { rejectedBy: ACTOR });
|
|
82
|
+
// Both guards passed above, so null here is a race with another resolver.
|
|
83
|
+
if (resolved === null)
|
|
84
|
+
return already();
|
|
85
|
+
const result = { ok: true, conflictId, keptId: keep, weakenedId: resolved.loserId };
|
|
86
|
+
return { status: 200, body: result, changed: true };
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=dashboard-actions.js.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type Chip } from './dashboard-snapshot.js';
|
|
2
|
+
/** A request field failed validation; the router answers 400 with this plain message. */
|
|
3
|
+
export declare class ParamError extends Error {
|
|
4
|
+
}
|
|
5
|
+
export declare const SORT_KEYS: readonly ["content", "layer", "strength", "retrievals", "last", "age", "confidence", "scope"];
|
|
6
|
+
export type SortKey = (typeof SORT_KEYS)[number];
|
|
7
|
+
export type SortDir = 'asc' | 'desc';
|
|
8
|
+
export declare const LIMIT_DEFAULT = 100;
|
|
9
|
+
export declare const LIMIT_MAX = 500;
|
|
10
|
+
export declare const SEARCH_MIN = 2;
|
|
11
|
+
export declare const SEARCH_MAX = 200;
|
|
12
|
+
export interface Brush {
|
|
13
|
+
amin: number;
|
|
14
|
+
amax: number;
|
|
15
|
+
smin: number;
|
|
16
|
+
smax: number;
|
|
17
|
+
}
|
|
18
|
+
export interface MemoryQuery {
|
|
19
|
+
offset: number;
|
|
20
|
+
limit: number;
|
|
21
|
+
sort: SortKey;
|
|
22
|
+
dir: SortDir;
|
|
23
|
+
chip: Chip;
|
|
24
|
+
/** Layer indices in wire order, ascending, no duplicates. */
|
|
25
|
+
layers: number[];
|
|
26
|
+
brush: Brush;
|
|
27
|
+
/** Lowercased search text, or null when none or shorter than the minimum. */
|
|
28
|
+
q: string | null;
|
|
29
|
+
}
|
|
30
|
+
/** Parses and validates the query of `GET /api/projects/:key/memories`. */
|
|
31
|
+
export declare function parseMemoryQuery(params: URLSearchParams): MemoryQuery;
|
|
32
|
+
/** Search text for `GET /api/search`: 2 to 200 characters after trim, returned as typed (trimmed). */
|
|
33
|
+
export declare function parseSearchText(params: URLSearchParams): string;
|
|
34
|
+
/** A memory id from a path segment. */
|
|
35
|
+
export declare function parseMemoryId(raw: string): string;
|
|
36
|
+
/** The only fields a dashboard POST reads; a field of the wrong type arrives as undefined. */
|
|
37
|
+
export interface ActionBody {
|
|
38
|
+
pinned?: boolean;
|
|
39
|
+
keep?: string;
|
|
40
|
+
}
|
|
41
|
+
/** Parses a POST body once at the boundary; an empty body is `{}` and invalid JSON is a 400. */
|
|
42
|
+
export declare function parseActionBody(text: string): ActionBody;
|
|
43
|
+
/** A conflict id from a path segment: a positive integer. */
|
|
44
|
+
export declare function parseConflictId(raw: string): number;
|
|
45
|
+
//# sourceMappingURL=dashboard-params.d.ts.map
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// One shared parser for every dashboard query and path field, so no route trusts `parseInt` or an unchecked id.
|
|
2
|
+
import { LAYERS } from './dashboard-snapshot.js';
|
|
3
|
+
/** A request field failed validation; the router answers 400 with this plain message. */
|
|
4
|
+
export class ParamError extends Error {
|
|
5
|
+
}
|
|
6
|
+
export const SORT_KEYS = ['content', 'layer', 'strength', 'retrievals', 'last', 'age', 'confidence', 'scope'];
|
|
7
|
+
const CHIPS = ['all', 'risk', 'pinned', 'conflict'];
|
|
8
|
+
const MEMORY_ID = /^[A-Za-z0-9_-]+$/;
|
|
9
|
+
const INTEGER = /^-?\d+$/;
|
|
10
|
+
export const LIMIT_DEFAULT = 100;
|
|
11
|
+
export const LIMIT_MAX = 500;
|
|
12
|
+
export const SEARCH_MIN = 2;
|
|
13
|
+
export const SEARCH_MAX = 200;
|
|
14
|
+
function integerParam(params, name, fallback, min, max) {
|
|
15
|
+
const raw = params.get(name);
|
|
16
|
+
if (raw === null)
|
|
17
|
+
return fallback;
|
|
18
|
+
const n = INTEGER.test(raw.trim()) ? Number(raw) : Number.NaN;
|
|
19
|
+
if (!Number.isInteger(n) || n < min || n > max) {
|
|
20
|
+
throw new ParamError(`${name} must be a whole number from ${min} to ${max}`);
|
|
21
|
+
}
|
|
22
|
+
return n;
|
|
23
|
+
}
|
|
24
|
+
function oneOf(params, name, allowed, fallback) {
|
|
25
|
+
const raw = params.get(name);
|
|
26
|
+
if (raw === null)
|
|
27
|
+
return fallback;
|
|
28
|
+
const hit = allowed.find((a) => a === raw);
|
|
29
|
+
if (hit === undefined)
|
|
30
|
+
throw new ParamError(`${name} must be one of ${allowed.join(', ')}`);
|
|
31
|
+
return hit;
|
|
32
|
+
}
|
|
33
|
+
function finiteParam(params, name) {
|
|
34
|
+
const raw = params.get(name);
|
|
35
|
+
if (raw === null)
|
|
36
|
+
return null;
|
|
37
|
+
const n = raw.trim() === '' ? Number.NaN : Number(raw);
|
|
38
|
+
if (!Number.isFinite(n))
|
|
39
|
+
throw new ParamError(`${name} must be a number`);
|
|
40
|
+
return n;
|
|
41
|
+
}
|
|
42
|
+
function layersParam(params) {
|
|
43
|
+
const raw = params.get('layers');
|
|
44
|
+
if (raw === null)
|
|
45
|
+
return LAYERS.map((_, i) => i);
|
|
46
|
+
const picked = new Set();
|
|
47
|
+
for (const part of raw.split(',')) {
|
|
48
|
+
const i = LAYERS.findIndex((l) => l === part.trim());
|
|
49
|
+
if (i === -1)
|
|
50
|
+
throw new ParamError(`layers must be a comma list of ${LAYERS.join(', ')}`);
|
|
51
|
+
picked.add(i);
|
|
52
|
+
}
|
|
53
|
+
return [...picked].sort((a, b) => a - b);
|
|
54
|
+
}
|
|
55
|
+
function rangeParam(params, lo, hi) {
|
|
56
|
+
const min = finiteParam(params, lo);
|
|
57
|
+
const max = finiteParam(params, hi);
|
|
58
|
+
if (min !== null && max !== null && min > max)
|
|
59
|
+
throw new ParamError(`${lo} must not exceed ${hi}`);
|
|
60
|
+
return [min ?? Number.NEGATIVE_INFINITY, max ?? Number.POSITIVE_INFINITY];
|
|
61
|
+
}
|
|
62
|
+
/** Search text for the memories route: shorter than the minimum means no filter; longer than the maximum is a 400. */
|
|
63
|
+
function optionalSearch(params) {
|
|
64
|
+
const raw = params.get('q');
|
|
65
|
+
if (raw === null)
|
|
66
|
+
return null;
|
|
67
|
+
const q = raw.trim();
|
|
68
|
+
if (q.length > SEARCH_MAX)
|
|
69
|
+
throw new ParamError(`q must be at most ${SEARCH_MAX} characters`);
|
|
70
|
+
return q.length < SEARCH_MIN ? null : q.toLowerCase();
|
|
71
|
+
}
|
|
72
|
+
/** Parses and validates the query of `GET /api/projects/:key/memories`. */
|
|
73
|
+
export function parseMemoryQuery(params) {
|
|
74
|
+
const [amin, amax] = rangeParam(params, 'amin', 'amax');
|
|
75
|
+
const [smin, smax] = rangeParam(params, 'smin', 'smax');
|
|
76
|
+
const sort = oneOf(params, 'sort', SORT_KEYS, 'strength');
|
|
77
|
+
return {
|
|
78
|
+
offset: integerParam(params, 'offset', 0, 0, Number.MAX_SAFE_INTEGER),
|
|
79
|
+
limit: integerParam(params, 'limit', LIMIT_DEFAULT, 1, LIMIT_MAX),
|
|
80
|
+
sort,
|
|
81
|
+
// Weakest first by default, like the mockup; retrievals starts with the most.
|
|
82
|
+
dir: oneOf(params, 'dir', ['asc', 'desc'], sort === 'retrievals' ? 'desc' : 'asc'),
|
|
83
|
+
chip: oneOf(params, 'chip', CHIPS, 'all'),
|
|
84
|
+
layers: layersParam(params),
|
|
85
|
+
brush: { amin, amax, smin, smax },
|
|
86
|
+
q: optionalSearch(params),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** Search text for `GET /api/search`: 2 to 200 characters after trim, returned as typed (trimmed). */
|
|
90
|
+
export function parseSearchText(params) {
|
|
91
|
+
const q = (params.get('q') ?? '').trim();
|
|
92
|
+
if (q.length < SEARCH_MIN || q.length > SEARCH_MAX) {
|
|
93
|
+
throw new ParamError(`q must be ${SEARCH_MIN} to ${SEARCH_MAX} characters`);
|
|
94
|
+
}
|
|
95
|
+
return q;
|
|
96
|
+
}
|
|
97
|
+
/** A memory id from a path segment. */
|
|
98
|
+
export function parseMemoryId(raw) {
|
|
99
|
+
if (!MEMORY_ID.test(raw))
|
|
100
|
+
throw new ParamError('Invalid memory id');
|
|
101
|
+
return raw;
|
|
102
|
+
}
|
|
103
|
+
/** Parses a POST body once at the boundary; an empty body is `{}` and invalid JSON is a 400. */
|
|
104
|
+
export function parseActionBody(text) {
|
|
105
|
+
let raw;
|
|
106
|
+
try {
|
|
107
|
+
raw = JSON.parse(text === '' ? '{}' : text);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
throw new ParamError('Body is not valid JSON');
|
|
111
|
+
}
|
|
112
|
+
const pinned = raw?.pinned;
|
|
113
|
+
const keep = raw?.keep;
|
|
114
|
+
// String(x) === x is true only for a string, which is the check without a typeof.
|
|
115
|
+
return {
|
|
116
|
+
pinned: pinned === true || pinned === false ? pinned : undefined,
|
|
117
|
+
keep: String(keep) === keep ? keep : undefined,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/** A conflict id from a path segment: a positive integer. */
|
|
121
|
+
export function parseConflictId(raw) {
|
|
122
|
+
const n = INTEGER.test(raw) ? Number(raw) : Number.NaN;
|
|
123
|
+
if (!Number.isSafeInteger(n) || n < 1)
|
|
124
|
+
throw new ParamError('Invalid conflict id');
|
|
125
|
+
return n;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=dashboard-params.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type MemoryEntry } from './memory.js';
|
|
2
|
+
import { type Snapshot } from './dashboard-snapshot.js';
|
|
3
|
+
import type { MemoryQuery } from './dashboard-params.js';
|
|
4
|
+
import type { MemoryDetail, MemoryPage, Overview, ProjectDetail, SearchResult } from './dashboard-types.js';
|
|
5
|
+
/** The overview of one snapshot, built once and reused until the snapshot is replaced. */
|
|
6
|
+
export declare function buildOverview(snap: Snapshot): Overview;
|
|
7
|
+
/** Summary and scatter for one project key, or null when the key is unknown. */
|
|
8
|
+
export declare function buildProjectDetail(snap: Snapshot, key: string): ProjectDetail | null;
|
|
9
|
+
/** One page of a project's memories under the query's sort and filters, or null when the key is unknown. */
|
|
10
|
+
export declare function buildMemoryPage(snap: Snapshot, key: string, query: MemoryQuery): MemoryPage | null;
|
|
11
|
+
/** Substring search over content and tags across every project; it reads the snapshot and never touches recall. */
|
|
12
|
+
export declare function buildSearch(snap: Snapshot, text: string): SearchResult;
|
|
13
|
+
/** Full detail read fresh from the store, never from the snapshot, so the drawer is current inside the coalescing window. */
|
|
14
|
+
export declare function buildMemoryDetail(hippoRoot: string, tenantId: string, entry: MemoryEntry, snapshotId: number, nowMs: number, embedded: boolean): MemoryDetail;
|
|
15
|
+
//# sourceMappingURL=dashboard-queries.d.ts.map
|