hippo-memory 1.60.0 → 1.62.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 +29 -54
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.d.ts +1 -1
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.d.ts +3 -1
- package/dist/agent-memories/claude-code.js +54 -10
- 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.d.ts +3 -3
- package/dist/agent-memories/sync.js +22 -9
- package/dist/agent-memories/types.d.ts +0 -2
- 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 +153 -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-select.d.ts +49 -0
- package/dist/api/context-select.js +344 -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 +378 -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 +126 -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 +192 -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 +499 -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 +256 -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 +453 -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 +376 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +457 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +556 -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 +156 -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 +190 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +573 -0
- package/dist/cli/projects.js +9 -6
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +582 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +485 -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 +647 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +397 -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 +409 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +424 -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.d.ts +0 -2
- package/dist/compaction-record.js +7 -5
- 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 +83 -72
- package/dist/dag.js +225 -188
- 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 +102 -83
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +4 -1
- package/dist/doctor.js +14 -10
- 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 +117 -86
- 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 +52 -43
- 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 +93 -74
- 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 +94 -76
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +142 -113
- package/dist/project-identity.js +3 -2
- package/dist/project-merge.d.ts +12 -4
- package/dist/project-merge.js +132 -45
- 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 +12 -1
- package/dist/shared.js +33 -27
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +88 -70
- 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 +260 -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
|
@@ -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
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
// Read models over a snapshot: overview, project, memory page, search, and the fresh single-memory detail.
|
|
2
|
+
import { calculateStrength } from './memory.js';
|
|
3
|
+
import { listMemoryConflicts } from './store/conflicts.js';
|
|
4
|
+
import { readEntry } from './store/entry-reads.js';
|
|
5
|
+
import { BANDS, DAY_MS, LAYERS, isLiveMemory, memoryFacts, projectIdentity, } from './dashboard-snapshot.js';
|
|
6
|
+
const SERIES_DAYS = 90;
|
|
7
|
+
/** The server words each delta for this range; the client re-slices the series for 7d and 90d. */
|
|
8
|
+
const DELTA_DAYS = 30;
|
|
9
|
+
const POINTS_MAX = 4_000;
|
|
10
|
+
const GRID_COLS = 64;
|
|
11
|
+
const GRID_ROWS = 32;
|
|
12
|
+
const NAME_MATCHES = 3;
|
|
13
|
+
function round1(value) {
|
|
14
|
+
return Math.round(value * 10) / 10;
|
|
15
|
+
}
|
|
16
|
+
function round3(value) {
|
|
17
|
+
return Math.round(value * 1000) / 1000;
|
|
18
|
+
}
|
|
19
|
+
/** Cumulative counts at 91 daily points, oldest first: point 0 is the base at the window start, point 90 is now. */
|
|
20
|
+
function cumulativeSeries(times, nowMs) {
|
|
21
|
+
const days = Array.from({ length: SERIES_DAYS + 1 }, () => 0);
|
|
22
|
+
let base = 0;
|
|
23
|
+
for (const t of times) {
|
|
24
|
+
const ago = Math.floor((nowMs - t) / DAY_MS);
|
|
25
|
+
if (ago >= SERIES_DAYS)
|
|
26
|
+
base++;
|
|
27
|
+
else
|
|
28
|
+
days[SERIES_DAYS - Math.max(0, ago)]++;
|
|
29
|
+
}
|
|
30
|
+
let running = base;
|
|
31
|
+
return days.map((n) => (running += n));
|
|
32
|
+
}
|
|
33
|
+
function addedWithin(series) {
|
|
34
|
+
return series[SERIES_DAYS] - series[SERIES_DAYS - DELTA_DAYS];
|
|
35
|
+
}
|
|
36
|
+
function pct(share) {
|
|
37
|
+
return `${(share * 100).toFixed(1)}%`;
|
|
38
|
+
}
|
|
39
|
+
function plural(n, one, many) {
|
|
40
|
+
return `${n} ${n === 1 ? one : many}`;
|
|
41
|
+
}
|
|
42
|
+
/** Named projects by size, then Global, then Unassigned, as the treemap orders them. */
|
|
43
|
+
function orderedProjects(snap) {
|
|
44
|
+
const rank = (p) => (p.summary.kind === 'project' ? 0 : p.summary.kind === 'global' ? 1 : 2);
|
|
45
|
+
return [...snap.projects].sort((a, b) => rank(a) - rank(b) || b.summary.live - a.summary.live || (a.summary.name < b.summary.name ? -1 : 1));
|
|
46
|
+
}
|
|
47
|
+
function buildKpis(snap, projects) {
|
|
48
|
+
const total = snap.facts.length;
|
|
49
|
+
const named = projects.filter((p) => p.summary.kind === 'project');
|
|
50
|
+
const totalSeries = cumulativeSeries(snap.facts.map((f) => f.createdMs), snap.nowMs);
|
|
51
|
+
const projectSeries = cumulativeSeries(named.map((p) => p.firstCreatedMs), snap.nowMs);
|
|
52
|
+
const atRisk = projects.reduce((sum, p) => sum + p.summary.atRisk, 0);
|
|
53
|
+
const weakNow = snap.facts.reduce((sum, f) => sum + (f.strength < 0.2 ? 1 : 0), 0);
|
|
54
|
+
const withConflicts = projects.filter((p) => p.summary.openConflicts > 0).length;
|
|
55
|
+
const embedded = snap.embeddingCoverage === null ? 0 : Math.round(snap.embeddingCoverage * total);
|
|
56
|
+
return [
|
|
57
|
+
{
|
|
58
|
+
id: 'total', label: 'Total memories', value: total, series: totalSeries,
|
|
59
|
+
delta: `+${addedWithin(totalSeries)} created in the last ${DELTA_DAYS}d`,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'projects', label: 'Projects', value: named.length, series: projectSeries,
|
|
63
|
+
delta: `+${addedWithin(projectSeries)} new in ${DELTA_DAYS}d`,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'atRiskShare', label: 'At-risk share, 30d', value: total > 0 ? atRisk / total : 0, series: null,
|
|
67
|
+
delta: `${pct(total > 0 ? weakNow / total : 0)} now at strength under 0.2`,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'openConflicts', label: 'Open conflicts', value: snap.openConflicts, series: null,
|
|
71
|
+
delta: `in ${plural(withConflicts, 'project', 'projects')}`,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'embeddingCoverage', label: 'Embedding coverage', value: snap.embeddingCoverage ?? 0, series: null,
|
|
75
|
+
delta: snap.embeddingCoverage === null ? 'no vector table yet' : `${total - embedded} not embedded`,
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
function topKeys(projects, count, score) {
|
|
80
|
+
return projects
|
|
81
|
+
.filter((p) => score(p) > 0)
|
|
82
|
+
.sort((a, b) => score(b) - score(a) || b.summary.live - a.summary.live || (a.summary.key < b.summary.key ? -1 : 1))
|
|
83
|
+
.slice(0, count)
|
|
84
|
+
.map((p) => p.summary.key);
|
|
85
|
+
}
|
|
86
|
+
/** The overview of one snapshot, built once and reused until the snapshot is replaced. */
|
|
87
|
+
export function buildOverview(snap) {
|
|
88
|
+
if (snap.memo.overview !== null)
|
|
89
|
+
return snap.memo.overview;
|
|
90
|
+
const ordered = orderedProjects(snap);
|
|
91
|
+
const overview = {
|
|
92
|
+
snapshotId: snap.id,
|
|
93
|
+
generatedAt: new Date(snap.nowMs).toISOString(),
|
|
94
|
+
total: snap.facts.length,
|
|
95
|
+
excluded: snap.excluded,
|
|
96
|
+
embeddingCoverage: snap.embeddingCoverage,
|
|
97
|
+
kpis: buildKpis(snap, ordered),
|
|
98
|
+
projects: ordered.map((p) => p.summary),
|
|
99
|
+
mostAtRisk: topKeys(ordered, 5, (p) => p.summary.atRisk),
|
|
100
|
+
mostConflicts: topKeys(ordered, 4, (p) => p.summary.openConflicts),
|
|
101
|
+
};
|
|
102
|
+
snap.memo.overview = overview;
|
|
103
|
+
return overview;
|
|
104
|
+
}
|
|
105
|
+
function buildScatter(snap, project) {
|
|
106
|
+
const cached = snap.memo.scatter.get(project.summary.key);
|
|
107
|
+
if (cached)
|
|
108
|
+
return cached;
|
|
109
|
+
let maxAge = 0;
|
|
110
|
+
for (const i of project.members)
|
|
111
|
+
maxAge = Math.max(maxAge, snap.facts[i].ageDays);
|
|
112
|
+
const maxAgeDays = Math.max(1, Math.ceil(maxAge));
|
|
113
|
+
let scatter;
|
|
114
|
+
if (project.members.length <= POINTS_MAX) {
|
|
115
|
+
const points = [];
|
|
116
|
+
const ids = [];
|
|
117
|
+
for (const i of project.members) {
|
|
118
|
+
const f = snap.facts[i];
|
|
119
|
+
points.push([round1(f.ageDays), round3(f.strength), f.layer, f.band]);
|
|
120
|
+
ids.push(f.id);
|
|
121
|
+
}
|
|
122
|
+
scatter = { mode: 'points', maxAgeDays, points, ids };
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const cells = [[], [], [], []];
|
|
126
|
+
for (const layer of cells)
|
|
127
|
+
for (let k = 0; k < GRID_COLS * GRID_ROWS; k++)
|
|
128
|
+
layer.push(0);
|
|
129
|
+
const maxLog = Math.log10(maxAgeDays + 1);
|
|
130
|
+
for (const i of project.members) {
|
|
131
|
+
const f = snap.facts[i];
|
|
132
|
+
const col = Math.min(GRID_COLS - 1, Math.floor((Math.log10(f.ageDays + 1) / maxLog) * GRID_COLS));
|
|
133
|
+
const row = Math.min(GRID_ROWS - 1, Math.floor(f.strength * GRID_ROWS));
|
|
134
|
+
cells[f.layer][row * GRID_COLS + col]++;
|
|
135
|
+
}
|
|
136
|
+
scatter = { mode: 'grid', maxAgeDays, cols: GRID_COLS, rows: GRID_ROWS, cells };
|
|
137
|
+
}
|
|
138
|
+
snap.memo.scatter.set(project.summary.key, scatter);
|
|
139
|
+
return scatter;
|
|
140
|
+
}
|
|
141
|
+
/** Summary and scatter for one project key, or null when the key is unknown. */
|
|
142
|
+
export function buildProjectDetail(snap, key) {
|
|
143
|
+
const project = snap.byKey.get(key);
|
|
144
|
+
if (!project)
|
|
145
|
+
return null;
|
|
146
|
+
return { snapshotId: snap.id, summary: project.summary, scatter: buildScatter(snap, project) };
|
|
147
|
+
}
|
|
148
|
+
function numericSort(sort) {
|
|
149
|
+
switch (sort) {
|
|
150
|
+
case 'layer': return (f) => f.layer;
|
|
151
|
+
case 'strength': return (f) => f.strength;
|
|
152
|
+
case 'retrievals': return (f) => f.retrievals;
|
|
153
|
+
case 'last': return (f) => f.lastRetrievedDays;
|
|
154
|
+
case 'age': return (f) => f.ageDays;
|
|
155
|
+
case 'confidence': return (f) => f.confidenceRank;
|
|
156
|
+
case 'content':
|
|
157
|
+
case 'scope': return null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function comparator(facts, sort, dir) {
|
|
161
|
+
const sign = dir === 'asc' ? 1 : -1;
|
|
162
|
+
const tie = (a, b) => (facts[a].id < facts[b].id ? -1 : facts[a].id > facts[b].id ? 1 : 0);
|
|
163
|
+
const num = numericSort(sort);
|
|
164
|
+
if (num)
|
|
165
|
+
return (a, b) => (num(facts[a]) - num(facts[b])) * sign || tie(a, b);
|
|
166
|
+
// Content and scope compare precomputed strings with `<`; localeCompare per pair is far slower at 50k rows.
|
|
167
|
+
const text = sort === 'content' ? (f) => f.lower : (f) => f.scope ?? '';
|
|
168
|
+
return (a, b) => {
|
|
169
|
+
const x = text(facts[a]);
|
|
170
|
+
const y = text(facts[b]);
|
|
171
|
+
return (x < y ? -sign : x > y ? sign : 0) || tie(a, b);
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function sortedMembers(snap, project, sort, dir) {
|
|
175
|
+
const key = `${project.summary.key}|${sort}|${dir}`;
|
|
176
|
+
const hit = snap.memo.sorted.get(key);
|
|
177
|
+
if (hit)
|
|
178
|
+
return hit;
|
|
179
|
+
const sorted = Int32Array.from(project.members).sort(comparator(snap.facts, sort, dir));
|
|
180
|
+
snap.memo.sorted.set(key, sorted);
|
|
181
|
+
return sorted;
|
|
182
|
+
}
|
|
183
|
+
function bucket(value) {
|
|
184
|
+
return value >= 0.5 ? 0 : value >= 0.2 ? 1 : 2;
|
|
185
|
+
}
|
|
186
|
+
function filterMembers(snap, sorted, query) {
|
|
187
|
+
const layerOn = [false, false, false, false];
|
|
188
|
+
for (const l of query.layers)
|
|
189
|
+
layerOn[l] = true;
|
|
190
|
+
const { brush, q } = query;
|
|
191
|
+
const kept = new Int32Array(sorted.length);
|
|
192
|
+
let n = 0;
|
|
193
|
+
const counts = { all: 0, risk: 0, pinned: 0, conflict: 0 };
|
|
194
|
+
const decay = { now: [0, 0, 0], in7d: [0, 0, 0], in30d: [0, 0, 0], pinned: 0 };
|
|
195
|
+
for (const i of sorted) {
|
|
196
|
+
const f = snap.facts[i];
|
|
197
|
+
if (!layerOn[f.layer])
|
|
198
|
+
continue;
|
|
199
|
+
if (f.ageDays < brush.amin || f.ageDays > brush.amax || f.strength < brush.smin || f.strength > brush.smax)
|
|
200
|
+
continue;
|
|
201
|
+
if (q !== null && !f.lower.includes(q) && !f.tagsLower.includes(q))
|
|
202
|
+
continue;
|
|
203
|
+
kept[n++] = i;
|
|
204
|
+
decay.now[bucket(f.strength)]++;
|
|
205
|
+
decay.in7d[bucket(f.strength7d)]++;
|
|
206
|
+
decay.in30d[bucket(f.strength30d)]++;
|
|
207
|
+
if (f.pinned) {
|
|
208
|
+
decay.pinned++;
|
|
209
|
+
counts.pinned++;
|
|
210
|
+
}
|
|
211
|
+
if (f.band === 3)
|
|
212
|
+
counts.risk++;
|
|
213
|
+
if (f.inConflict)
|
|
214
|
+
counts.conflict++;
|
|
215
|
+
counts.all++;
|
|
216
|
+
}
|
|
217
|
+
return { idx: kept.subarray(0, n), counts, decay, byChip: new Map() };
|
|
218
|
+
}
|
|
219
|
+
function filteredSet(snap, project, query) {
|
|
220
|
+
const { brush } = query;
|
|
221
|
+
const key = [
|
|
222
|
+
project.summary.key, query.sort, query.dir, query.layers.join(''),
|
|
223
|
+
brush.amin, brush.amax, brush.smin, brush.smax, query.q ?? '',
|
|
224
|
+
].join('|');
|
|
225
|
+
const hit = snap.memo.filtered.get(key);
|
|
226
|
+
if (hit)
|
|
227
|
+
return hit;
|
|
228
|
+
const set = filterMembers(snap, sortedMembers(snap, project, query.sort, query.dir), query);
|
|
229
|
+
snap.memo.filtered.set(key, set);
|
|
230
|
+
return set;
|
|
231
|
+
}
|
|
232
|
+
function chipMembers(snap, set, chip) {
|
|
233
|
+
if (chip === 'all')
|
|
234
|
+
return set.idx;
|
|
235
|
+
const hit = set.byChip.get(chip);
|
|
236
|
+
if (hit)
|
|
237
|
+
return hit;
|
|
238
|
+
const pick = (f) => (chip === 'risk' ? f.band === 3 : chip === 'pinned' ? f.pinned : f.inConflict);
|
|
239
|
+
const out = set.idx.filter((i) => pick(snap.facts[i]));
|
|
240
|
+
set.byChip.set(chip, out);
|
|
241
|
+
return out;
|
|
242
|
+
}
|
|
243
|
+
function toRow(f) {
|
|
244
|
+
return {
|
|
245
|
+
id: f.id,
|
|
246
|
+
content: f.head,
|
|
247
|
+
truncated: f.truncated,
|
|
248
|
+
layer: LAYERS[f.layer],
|
|
249
|
+
band: BANDS[f.band],
|
|
250
|
+
strength: round3(f.strength),
|
|
251
|
+
retrievals: f.retrievals,
|
|
252
|
+
lastRetrievedDays: round1(f.lastRetrievedDays),
|
|
253
|
+
ageDays: round1(f.ageDays),
|
|
254
|
+
confidence: f.confidence,
|
|
255
|
+
scope: f.scope,
|
|
256
|
+
pinned: f.pinned,
|
|
257
|
+
wrong: f.wrong,
|
|
258
|
+
inConflict: f.inConflict,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/** One page of a project's memories under the query's sort and filters, or null when the key is unknown. */
|
|
262
|
+
export function buildMemoryPage(snap, key, query) {
|
|
263
|
+
const project = snap.byKey.get(key);
|
|
264
|
+
if (!project)
|
|
265
|
+
return null;
|
|
266
|
+
const set = filteredSet(snap, project, query);
|
|
267
|
+
const shown = chipMembers(snap, set, query.chip);
|
|
268
|
+
const rows = [];
|
|
269
|
+
for (let k = query.offset; k < Math.min(shown.length, query.offset + query.limit); k++) {
|
|
270
|
+
rows.push(toRow(snap.facts[shown[k]]));
|
|
271
|
+
}
|
|
272
|
+
const decay = set.decay;
|
|
273
|
+
return { snapshotId: snap.id, total: shown.length, offset: query.offset, limit: query.limit, counts: set.counts, decay, rows };
|
|
274
|
+
}
|
|
275
|
+
/** Substring search over content and tags across every project; it reads the snapshot and never touches recall. */
|
|
276
|
+
export function buildSearch(snap, text) {
|
|
277
|
+
const needle = text.toLowerCase();
|
|
278
|
+
const perProject = Array.from({ length: snap.projects.length }, () => 0);
|
|
279
|
+
let total = 0;
|
|
280
|
+
for (const f of snap.facts) {
|
|
281
|
+
if (f.lower.includes(needle) || f.tagsLower.includes(needle)) {
|
|
282
|
+
perProject[f.project]++;
|
|
283
|
+
total++;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
const hits = {};
|
|
287
|
+
snap.projects.forEach((p, i) => {
|
|
288
|
+
if (perProject[i] > 0)
|
|
289
|
+
hits[p.summary.key] = perProject[i];
|
|
290
|
+
});
|
|
291
|
+
const nameMatches = snap.projects
|
|
292
|
+
.filter((p) => p.summary.name.toLowerCase().includes(needle))
|
|
293
|
+
.sort((a, b) => b.summary.live - a.summary.live)
|
|
294
|
+
.slice(0, NAME_MATCHES)
|
|
295
|
+
.map((p) => ({ key: p.summary.key, name: p.summary.name, live: p.summary.live }));
|
|
296
|
+
return { snapshotId: snap.id, q: text, total, hits, nameMatches };
|
|
297
|
+
}
|
|
298
|
+
function openConflictsOf(hippoRoot, tenantId, entry, nowMs) {
|
|
299
|
+
const out = [];
|
|
300
|
+
for (const c of listMemoryConflicts(hippoRoot, 'open', tenantId)) {
|
|
301
|
+
if (c.memory_a_id !== entry.id && c.memory_b_id !== entry.id)
|
|
302
|
+
continue;
|
|
303
|
+
const otherId = c.memory_a_id === entry.id ? c.memory_b_id : c.memory_a_id;
|
|
304
|
+
const other = readEntry(hippoRoot, otherId, tenantId);
|
|
305
|
+
if (!other || !isLiveMemory(other))
|
|
306
|
+
continue;
|
|
307
|
+
out.push({
|
|
308
|
+
id: c.id,
|
|
309
|
+
reason: c.reason,
|
|
310
|
+
score: c.score,
|
|
311
|
+
other: {
|
|
312
|
+
id: other.id,
|
|
313
|
+
content: other.content,
|
|
314
|
+
strength: round3(calculateStrength(other, new Date(nowMs))),
|
|
315
|
+
retrievals: other.retrieval_count,
|
|
316
|
+
},
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
return out;
|
|
320
|
+
}
|
|
321
|
+
/** Full detail read fresh from the store, never from the snapshot, so the drawer is current inside the coalescing window. */
|
|
322
|
+
export function buildMemoryDetail(hippoRoot, tenantId, entry, snapshotId, nowMs, embedded) {
|
|
323
|
+
const f = memoryFacts(entry, nowMs);
|
|
324
|
+
const project = projectIdentity(entry.origin_project);
|
|
325
|
+
return {
|
|
326
|
+
snapshotId,
|
|
327
|
+
id: entry.id,
|
|
328
|
+
content: entry.content,
|
|
329
|
+
layer: LAYERS[f.layer],
|
|
330
|
+
band: BANDS[f.band],
|
|
331
|
+
tags: entry.tags,
|
|
332
|
+
strength: round3(f.strength),
|
|
333
|
+
strength7d: round3(f.strength7d),
|
|
334
|
+
strength30d: round3(f.strength30d),
|
|
335
|
+
halfLifeDays: entry.half_life_days,
|
|
336
|
+
retrievals: entry.retrieval_count,
|
|
337
|
+
lastRetrieved: entry.last_retrieved,
|
|
338
|
+
created: entry.created,
|
|
339
|
+
ageDays: round1(f.ageDays),
|
|
340
|
+
schemaFit: entry.schema_fit,
|
|
341
|
+
valence: entry.emotional_valence,
|
|
342
|
+
confidence: f.confidence,
|
|
343
|
+
agedOut: f.agedOut,
|
|
344
|
+
pinned: entry.pinned,
|
|
345
|
+
wrong: f.wrong,
|
|
346
|
+
projectKey: project.key,
|
|
347
|
+
projectName: project.name,
|
|
348
|
+
scope: entry.scope,
|
|
349
|
+
tenant: entry.tenantId,
|
|
350
|
+
kind: entry.kind,
|
|
351
|
+
embedded,
|
|
352
|
+
conflicts: openConflictsOf(hippoRoot, tenantId, entry, nowMs),
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=dashboard-queries.js.map
|