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,126 @@
|
|
|
1
|
+
// DAG drill-down from a summary to its children.
|
|
2
|
+
import { readEntry, loadChildrenOf } from '../store/entry-reads.js';
|
|
3
|
+
import { estimateTokens } from '../token-ledger.js';
|
|
4
|
+
import { passesScopeFilterForRecall } from '../recall-scope.js';
|
|
5
|
+
/**
|
|
6
|
+
* Walk one step down the DAG from a level-2 (or higher) summary to its direct
|
|
7
|
+
* children. Companion to `recall(... summarizeOverflow: true)` — when recall
|
|
8
|
+
* surfaces a summary with `substitutedFor: [...]`, the caller drills into the
|
|
9
|
+
* summary id to recover the original detail.
|
|
10
|
+
*
|
|
11
|
+
* Tenant scope: only summaries owned by `ctx.tenantId` are reachable. The same
|
|
12
|
+
* scope filter that recall applies is enforced on the children — a level-2
|
|
13
|
+
* summary in `slack:public:CGEN` cannot leak `slack:private:*` children even
|
|
14
|
+
* if the underlying DAG accidentally linked across scopes.
|
|
15
|
+
*
|
|
16
|
+
* Returns a discriminated `DrillDownOutcome`: `DrillDownResult` on success,
|
|
17
|
+
* or `{failure: '...'}` for `not_found` (covers genuinely-missing AND wrong-
|
|
18
|
+
* tenant, intentionally indistinguishable), `not_drillable` (id is a leaf
|
|
19
|
+
* row), or `scope_blocked` (caller has no scope grant for the row's scope).
|
|
20
|
+
*
|
|
21
|
+
* Pre-v1.6.4 returned null for all four cases. JS callers migrate via
|
|
22
|
+
* `'failure' in result` checks; HTTP route maps `not_drillable` to 422.
|
|
23
|
+
*/
|
|
24
|
+
export function drillDown(ctx, summaryId, opts = {}) {
|
|
25
|
+
const limit = opts.limit ?? 50;
|
|
26
|
+
// v0.30 / E5: depth defaults 1 (backward compat); hard cap 10 levels
|
|
27
|
+
// prevents pathological deep trees. CLI/HTTP/MCP reject invalid values.
|
|
28
|
+
const depth = Math.max(1, Math.min(Math.trunc(opts.depth ?? 1), 10));
|
|
29
|
+
const summary = readEntry(ctx.hippoRoot, summaryId, ctx.tenantId);
|
|
30
|
+
// No unscoped cross-tenant probe here — readEntry's null return covers
|
|
31
|
+
// both "doesn't exist" and "exists in another tenant" by design.
|
|
32
|
+
// Distinguishing them via an unscoped lookup would leak existence to
|
|
33
|
+
// unauthorised tenants. The two cases collapse into not_found.
|
|
34
|
+
if (!summary)
|
|
35
|
+
return { failure: 'not_found' };
|
|
36
|
+
if ((summary.dag_level ?? 0) < 2)
|
|
37
|
+
return { failure: 'not_drillable' };
|
|
38
|
+
if (!passesScopeFilterForRecall(summary.scope ?? null, undefined)) {
|
|
39
|
+
// codex round 3 P1: collapse to not_found. A distinguishable
|
|
40
|
+
// "scope_blocked" tells a no-scope caller "this row exists, just
|
|
41
|
+
// not for you" — same existence-leak the HTTP 404 collapse was
|
|
42
|
+
// already preventing. Match the HTTP behaviour at the API level.
|
|
43
|
+
return { failure: 'not_found' };
|
|
44
|
+
}
|
|
45
|
+
const { collected, level0DirectCount } = collectDescendants(ctx, summaryId, depth);
|
|
46
|
+
const summaryOut = {
|
|
47
|
+
id: summary.id,
|
|
48
|
+
content: summary.content,
|
|
49
|
+
// v0.30 / E5: the STORED direct-child count; the legacy fallback counts
|
|
50
|
+
// level-0 children, never the BFS-depth-N total (independent-review MED #4).
|
|
51
|
+
descendantCount: summary.descendant_count ?? level0DirectCount,
|
|
52
|
+
earliestAt: summary.earliest_at ?? null,
|
|
53
|
+
latestAt: summary.latest_at ?? null,
|
|
54
|
+
};
|
|
55
|
+
const all = collected.map((c) => ({
|
|
56
|
+
id: c.id,
|
|
57
|
+
content: c.content,
|
|
58
|
+
layer: c.layer,
|
|
59
|
+
dagLevel: c.dag_level ?? 0,
|
|
60
|
+
created: c.created,
|
|
61
|
+
}));
|
|
62
|
+
const { children, truncated } = capChildren(all, summaryOut, opts, limit);
|
|
63
|
+
return {
|
|
64
|
+
summary: summaryOut,
|
|
65
|
+
children,
|
|
66
|
+
// v0.30 / E5: totalChildren = BFS-collected count (depth-aware). For
|
|
67
|
+
// depth=1 this equals the eligible direct-children count (backward
|
|
68
|
+
// compat). For depth>1 it is the cumulative count across levels.
|
|
69
|
+
totalChildren: collected.length,
|
|
70
|
+
truncated,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// BFS with a visited set: dag_parent_id is not unique, so a misconfigured tree could emit a child twice past depth 1.
|
|
74
|
+
// The level-0 count is kept apart so a legacy summary's descendantCount fallback counts direct children only.
|
|
75
|
+
function collectDescendants(ctx, summaryId, depth) {
|
|
76
|
+
const collected = [];
|
|
77
|
+
const visited = new Set([summaryId]);
|
|
78
|
+
let frontier = [summaryId];
|
|
79
|
+
let level0DirectCount = 0;
|
|
80
|
+
for (let level = 0; level < depth; level++) {
|
|
81
|
+
const nextFrontier = [];
|
|
82
|
+
for (const parentId of frontier) {
|
|
83
|
+
const kids = loadChildrenOf(ctx.hippoRoot, parentId, ctx.tenantId);
|
|
84
|
+
const eligibleKids = kids.filter((c) => passesScopeFilterForRecall(c.scope ?? null, undefined));
|
|
85
|
+
for (const k of eligibleKids) {
|
|
86
|
+
if (visited.has(k.id))
|
|
87
|
+
continue;
|
|
88
|
+
visited.add(k.id);
|
|
89
|
+
collected.push(k);
|
|
90
|
+
nextFrontier.push(k.id);
|
|
91
|
+
if (level === 0)
|
|
92
|
+
level0DirectCount++;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (nextFrontier.length === 0)
|
|
96
|
+
break;
|
|
97
|
+
frontier = nextFrontier;
|
|
98
|
+
}
|
|
99
|
+
return { collected, level0DirectCount };
|
|
100
|
+
}
|
|
101
|
+
/** Global cumulative token budget first, then the `limit` cap. */
|
|
102
|
+
function capChildren(all, summaryOut, opts, limit) {
|
|
103
|
+
let children = all;
|
|
104
|
+
let truncated = false;
|
|
105
|
+
if (opts.budget !== undefined) {
|
|
106
|
+
const out = [];
|
|
107
|
+
let used = 0;
|
|
108
|
+
const room = opts.budget - (opts.cost?.fixed(summaryOut, all.length) ?? 0);
|
|
109
|
+
for (const c of all) {
|
|
110
|
+
const t = opts.cost ? opts.cost.child(c) : estimateTokens(c.content);
|
|
111
|
+
if (out.length > 0 && used + t > room) {
|
|
112
|
+
truncated = true;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
out.push(c);
|
|
116
|
+
used += t;
|
|
117
|
+
}
|
|
118
|
+
children = out;
|
|
119
|
+
}
|
|
120
|
+
if (children.length > limit) {
|
|
121
|
+
children = children.slice(0, limit);
|
|
122
|
+
truncated = true;
|
|
123
|
+
}
|
|
124
|
+
return { children, truncated };
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=drill-down.js.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { RejectedValueRow } from '../rejection.js';
|
|
2
|
+
import type { Context } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Delete a memory by id. `deleteEntry` threads ctx.actor.subject into its internal
|
|
5
|
+
* audit hook, so exactly one 'forget' event lands with the supplied actor.
|
|
6
|
+
*
|
|
7
|
+
* Tenant scope: deleteEntry looks up the row by id alone, so without an
|
|
8
|
+
* explicit tenant guard a Bearer for tenant A could delete tenant B's row
|
|
9
|
+
* by guessing or leaking the id. Pre-check the row's tenant_id and deny
|
|
10
|
+
* cross-tenant access with a not-found error (no info leak about whether
|
|
11
|
+
* the id exists in another tenant).
|
|
12
|
+
*/
|
|
13
|
+
export interface ForgetResult {
|
|
14
|
+
ok: true;
|
|
15
|
+
id: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function forget(ctx: Context, id: string): ForgetResult;
|
|
18
|
+
export interface RejectOpts {
|
|
19
|
+
/** By-id form: reject the CURRENT content of an existing memory. */
|
|
20
|
+
memoryId?: string;
|
|
21
|
+
/** Pre-emptive form: reject a value not currently stored (or already gone). */
|
|
22
|
+
value?: string;
|
|
23
|
+
/** Required — the tombstone stores no content; reason is its only identity. */
|
|
24
|
+
reason: string;
|
|
25
|
+
}
|
|
26
|
+
export interface RejectResult {
|
|
27
|
+
digest: string;
|
|
28
|
+
removedIds: string[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Reject a value: tombstone its normalized digest so a matching write is
|
|
32
|
+
* refused everywhere (remember/capture/import/sync) until `unreject`. Two
|
|
33
|
+
* forms — pass exactly one:
|
|
34
|
+
* - `memoryId`: reject the CURRENT content of an existing memory. Removes
|
|
35
|
+
* that row and every other live row in the tenant whose normalized
|
|
36
|
+
* digest matches (not just the id passed).
|
|
37
|
+
* - `value`: pre-emptive form — tombstone content that may not currently
|
|
38
|
+
* be stored (or is already gone). Zero removals.
|
|
39
|
+
*
|
|
40
|
+
* `reason` is required (the tombstone stores no content; reason is its
|
|
41
|
+
* only human-readable identity). Throws if the memory id is not found in
|
|
42
|
+
* `ctx.tenantId`, or if both/neither of `memoryId`/`value` are given.
|
|
43
|
+
*/
|
|
44
|
+
export declare function reject(ctx: Context, opts: RejectOpts): RejectResult;
|
|
45
|
+
/**
|
|
46
|
+
* Delete a tombstone by exact digest or unambiguous prefix, restoring the
|
|
47
|
+
* value's writability — the only v1 escape hatch (no per-write force flag).
|
|
48
|
+
* Throws if `digestOrPrefix` matches no tombstone, is blank, or matches
|
|
49
|
+
* more than one (use a longer prefix).
|
|
50
|
+
*/
|
|
51
|
+
export declare function unreject(ctx: Context, digestOrPrefix: string): {
|
|
52
|
+
ok: boolean;
|
|
53
|
+
digest: string;
|
|
54
|
+
};
|
|
55
|
+
/** List every rejected-value tombstone for `ctx.tenantId`, newest first. */
|
|
56
|
+
export declare function listRejections(ctx: Context): RejectedValueRow[];
|
|
57
|
+
//# sourceMappingURL=forget.d.ts.map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Forget a memory, and reject or unreject a value so it cannot be stored again.
|
|
2
|
+
import { openHippoDb, closeHippoDb } from '../db.js';
|
|
3
|
+
import { BadRequestError, NotFoundError } from '../api-errors.js';
|
|
4
|
+
import { deleteEntry } from '../store/delete-and-batch.js';
|
|
5
|
+
import { updateStatsUnlessBusy } from '../store/index-and-stats.js';
|
|
6
|
+
import { rejectValue, unrejectValue, listRejectionsForTenant } from '../reject-flow.js';
|
|
7
|
+
import { selectMemoryTenant } from '../store/tenant-lookup.js';
|
|
8
|
+
export function forget(ctx, id) {
|
|
9
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
10
|
+
try {
|
|
11
|
+
if (selectMemoryTenant(db, id) !== ctx.tenantId) {
|
|
12
|
+
throw new NotFoundError(`memory not found: ${id}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
closeHippoDb(db);
|
|
17
|
+
}
|
|
18
|
+
const removed = deleteEntry(ctx.hippoRoot, id, { actor: ctx.actor.subject });
|
|
19
|
+
if (!removed) {
|
|
20
|
+
throw new NotFoundError(`memory not found: ${id}`);
|
|
21
|
+
}
|
|
22
|
+
// Counted here, not in the CLI: both callers of this function (cmdForget and
|
|
23
|
+
// the HTTP route) are the two paths of one user command, so neither can miss
|
|
24
|
+
// it. api.remember cannot take the same move; see the server route.
|
|
25
|
+
updateStatsUnlessBusy(ctx.hippoRoot, { forgotten: 1 }, `removed ${id}`);
|
|
26
|
+
return { ok: true, id };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Reject a value: tombstone its normalized digest so a matching write is
|
|
30
|
+
* refused everywhere (remember/capture/import/sync) until `unreject`. Two
|
|
31
|
+
* forms — pass exactly one:
|
|
32
|
+
* - `memoryId`: reject the CURRENT content of an existing memory. Removes
|
|
33
|
+
* that row and every other live row in the tenant whose normalized
|
|
34
|
+
* digest matches (not just the id passed).
|
|
35
|
+
* - `value`: pre-emptive form — tombstone content that may not currently
|
|
36
|
+
* be stored (or is already gone). Zero removals.
|
|
37
|
+
*
|
|
38
|
+
* `reason` is required (the tombstone stores no content; reason is its
|
|
39
|
+
* only human-readable identity). Throws if the memory id is not found in
|
|
40
|
+
* `ctx.tenantId`, or if both/neither of `memoryId`/`value` are given.
|
|
41
|
+
*/
|
|
42
|
+
export function reject(ctx, opts) {
|
|
43
|
+
if (opts.memoryId !== undefined) {
|
|
44
|
+
// Tenant scope, same not-found-shaped denial as forget/promote above:
|
|
45
|
+
// rejectValue itself also tenant-checks the id, but pre-checking here
|
|
46
|
+
// keeps the error message consistent with the rest of this module.
|
|
47
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
48
|
+
try {
|
|
49
|
+
if (selectMemoryTenant(db, opts.memoryId) !== ctx.tenantId) {
|
|
50
|
+
throw new NotFoundError(`memory not found: ${opts.memoryId}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
closeHippoDb(db);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const result = rejectValue({
|
|
58
|
+
hippoRoot: ctx.hippoRoot,
|
|
59
|
+
tenantId: ctx.tenantId,
|
|
60
|
+
actor: ctx.actor.subject,
|
|
61
|
+
reason: opts.reason,
|
|
62
|
+
memoryId: opts.memoryId,
|
|
63
|
+
value: opts.value,
|
|
64
|
+
});
|
|
65
|
+
return { digest: result.digest, removedIds: result.removedIds };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Delete a tombstone by exact digest or unambiguous prefix, restoring the
|
|
69
|
+
* value's writability — the only v1 escape hatch (no per-write force flag).
|
|
70
|
+
* Throws if `digestOrPrefix` matches no tombstone, is blank, or matches
|
|
71
|
+
* more than one (use a longer prefix).
|
|
72
|
+
*/
|
|
73
|
+
export function unreject(ctx, digestOrPrefix) {
|
|
74
|
+
const outcome = unrejectValue(ctx.hippoRoot, ctx.tenantId, digestOrPrefix, ctx.actor.subject);
|
|
75
|
+
if (outcome.status === 'not_found') {
|
|
76
|
+
throw new NotFoundError(`no rejected value matches: ${digestOrPrefix}`);
|
|
77
|
+
}
|
|
78
|
+
if (outcome.status === 'ambiguous') {
|
|
79
|
+
throw new BadRequestError(`"${digestOrPrefix}" matches ${outcome.candidates.length} tombstones; use a longer prefix`);
|
|
80
|
+
}
|
|
81
|
+
return { ok: true, digest: outcome.digest };
|
|
82
|
+
}
|
|
83
|
+
/** List every rejected-value tombstone for `ctx.tenantId`, newest first. */
|
|
84
|
+
export function listRejections(ctx) {
|
|
85
|
+
return listRejectionsForTenant(ctx.hippoRoot, ctx.tenantId);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=forget.js.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type CompleteGoalOpts, type Goal, type PushGoalOpts } from '../goals.js';
|
|
2
|
+
import type { Context } from './types.js';
|
|
3
|
+
/** What a new goal carries; its tenant is always the caller's. */
|
|
4
|
+
export type GoalPushOpts = Omit<PushGoalOpts, 'tenantId'>;
|
|
5
|
+
/** Push a goal onto `sessionId`'s stack in the caller's tenant. */
|
|
6
|
+
export declare function goalPush(ctx: Context, opts: GoalPushOpts): Goal;
|
|
7
|
+
/** The caller's goals for `sessionId`: active ones, or every status when `all` is set. */
|
|
8
|
+
export declare function goalList(ctx: Context, opts: {
|
|
9
|
+
sessionId: string;
|
|
10
|
+
all: boolean;
|
|
11
|
+
}): Goal[];
|
|
12
|
+
/** Complete a goal by id; a no-op for an unknown or already completed goal. Host admin only. */
|
|
13
|
+
export declare function goalComplete(ctx: Context, goalId: string, opts: CompleteGoalOpts): void;
|
|
14
|
+
/** Suspend an active goal by id. Host admin only. */
|
|
15
|
+
export declare function goalSuspend(ctx: Context, goalId: string): void;
|
|
16
|
+
/** Resume a suspended goal by id, suspending the oldest active one past the depth cap. Host admin only. */
|
|
17
|
+
export declare function goalResume(ctx: Context, goalId: string): void;
|
|
18
|
+
//# sourceMappingURL=goals.d.ts.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// The per-session goal stack that recall boosts: push, list, complete, suspend and resume.
|
|
2
|
+
import { ForbiddenError } from '../api-errors.js';
|
|
3
|
+
import { completeGoal, getActiveGoals, getSessionGoals, pushGoal, resumeGoal, suspendGoal, } from '../goals.js';
|
|
4
|
+
/** Push a goal onto `sessionId`'s stack in the caller's tenant. */
|
|
5
|
+
export function goalPush(ctx, opts) {
|
|
6
|
+
return pushGoal(ctx.hippoRoot, { ...opts, tenantId: ctx.tenantId });
|
|
7
|
+
}
|
|
8
|
+
/** The caller's goals for `sessionId`: active ones, or every status when `all` is set. */
|
|
9
|
+
export function goalList(ctx, opts) {
|
|
10
|
+
const scope = { sessionId: opts.sessionId, tenantId: ctx.tenantId };
|
|
11
|
+
return opts.all ? getSessionGoals(ctx.hippoRoot, scope) : getActiveGoals(ctx.hippoRoot, scope);
|
|
12
|
+
}
|
|
13
|
+
/** Complete a goal by id; a no-op for an unknown or already completed goal. Host admin only. */
|
|
14
|
+
export function goalComplete(ctx, goalId, opts) {
|
|
15
|
+
requireHostAdmin(ctx);
|
|
16
|
+
completeGoal(ctx.hippoRoot, goalId, opts);
|
|
17
|
+
}
|
|
18
|
+
/** Suspend an active goal by id. Host admin only. */
|
|
19
|
+
export function goalSuspend(ctx, goalId) {
|
|
20
|
+
requireHostAdmin(ctx);
|
|
21
|
+
suspendGoal(ctx.hippoRoot, goalId);
|
|
22
|
+
}
|
|
23
|
+
/** Resume a suspended goal by id, suspending the oldest active one past the depth cap. Host admin only. */
|
|
24
|
+
export function goalResume(ctx, goalId) {
|
|
25
|
+
requireHostAdmin(ctx);
|
|
26
|
+
resumeGoal(ctx.hippoRoot, goalId);
|
|
27
|
+
}
|
|
28
|
+
// Goal ids are not tenant-scoped in the store, so acting on one by id is a cross-tenant power.
|
|
29
|
+
function requireHostAdmin(ctx) {
|
|
30
|
+
if (!ctx.actor.hostAdmin)
|
|
31
|
+
throw new ForbiddenError('Only the host admin can change a goal by id');
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=goals.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Context } from './types.js';
|
|
2
|
+
/** How a surface writes what it learns. */
|
|
3
|
+
export interface LearnProfile {
|
|
4
|
+
readonly tags: readonly string[];
|
|
5
|
+
readonly source: string;
|
|
6
|
+
/** Also invalidate what a migration subject supersedes, score schema fit, path-tag, count and embed each row. */
|
|
7
|
+
readonly full: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const CLI_LEARN: LearnProfile;
|
|
10
|
+
export declare const MCP_LEARN: LearnProfile;
|
|
11
|
+
export interface LearnOpts {
|
|
12
|
+
repoPath: string;
|
|
13
|
+
days: number;
|
|
14
|
+
profile: LearnProfile;
|
|
15
|
+
}
|
|
16
|
+
export interface LearnResult {
|
|
17
|
+
/** `no-commits`: an empty git log; `no-lessons`: a log with no lesson-shaped subject. */
|
|
18
|
+
status: 'not-a-repo' | 'no-commits' | 'no-lessons' | 'scanned';
|
|
19
|
+
added: number;
|
|
20
|
+
skipped: number;
|
|
21
|
+
rejected: number;
|
|
22
|
+
lowInfo: number;
|
|
23
|
+
/** Each lesson whose migration target weakened at least one memory, in scan order. */
|
|
24
|
+
invalidations: Array<{
|
|
25
|
+
from: string;
|
|
26
|
+
count: number;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
/** Learn from `repoPath`'s last `days` of commits into the caller's tenant. Host admin only. */
|
|
30
|
+
export declare function learn(ctx: Context, opts: LearnOpts): LearnResult;
|
|
31
|
+
//# sourceMappingURL=learn.d.ts.map
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Git auto-learn: fix/revert/bug commit subjects become memories. `hippo learn`, init, sleep and MCP hippo_learn share it.
|
|
2
|
+
import { ForbiddenError } from '../api-errors.js';
|
|
3
|
+
import { fetchGitLog, extractLessons, partitionLessons, isGitRepo } from '../autolearn.js';
|
|
4
|
+
import { loadConfig } from '../config.js';
|
|
5
|
+
import { embedMemory } from '../embeddings.js';
|
|
6
|
+
import { extractInvalidationTarget, invalidateMatching } from '../invalidation.js';
|
|
7
|
+
import { computeSchemaFit, createMemory, Layer } from '../memory.js';
|
|
8
|
+
import { extractPathTags } from '../path-context.js';
|
|
9
|
+
import { RejectedValueError } from '../rejection.js';
|
|
10
|
+
import { duplicateKey, longestWord, storedTextKeys } from '../same-text.js';
|
|
11
|
+
import { loadTextsHoldingWords } from '../store/candidates.js';
|
|
12
|
+
import { loadAllEntries } from '../store/entry-reads.js';
|
|
13
|
+
import { writeEntry } from '../store/entry-writes.js';
|
|
14
|
+
import { updateStats } from '../store/index-and-stats.js';
|
|
15
|
+
// SHORTCUT: two profiles keep each surface's rows as they were; fold MCP onto the CLI profile once it may invalidate.
|
|
16
|
+
export const CLI_LEARN = Object.freeze({ tags: Object.freeze(['error', 'git-learned']), source: 'git-learn', full: true });
|
|
17
|
+
export const MCP_LEARN = Object.freeze({ tags: Object.freeze(['git-learned']), source: 'git', full: false });
|
|
18
|
+
/** Learn from `repoPath`'s last `days` of commits into the caller's tenant. Host admin only. */
|
|
19
|
+
export function learn(ctx, opts) {
|
|
20
|
+
// It reads the host's own git history, which belongs to the host, not to the caller's tenant.
|
|
21
|
+
if (!ctx.actor.hostAdmin)
|
|
22
|
+
throw new ForbiddenError('hippo_learn requires a host admin');
|
|
23
|
+
const none = { added: 0, skipped: 0, rejected: 0, lowInfo: 0, invalidations: [] };
|
|
24
|
+
if (!isGitRepo(opts.repoPath))
|
|
25
|
+
return { status: 'not-a-repo', ...none };
|
|
26
|
+
const gitLog = fetchGitLog(opts.repoPath, opts.days);
|
|
27
|
+
if (!gitLog.trim())
|
|
28
|
+
return { status: 'no-commits', ...none };
|
|
29
|
+
const config = loadConfig(ctx.hippoRoot);
|
|
30
|
+
const parsed = extractLessons(gitLog, config.gitLearnPatterns);
|
|
31
|
+
if (parsed.length === 0)
|
|
32
|
+
return { status: 'no-lessons', ...none };
|
|
33
|
+
// The gate filters the loop input, so a dropped lesson neither stores nor invalidates; docs/decisions git-learn-gate-placement says why.
|
|
34
|
+
const { kept, dropped } = partitionLessons(parsed);
|
|
35
|
+
return { status: 'scanned', lowInfo: dropped.length, ...writeLessons(ctx, kept, opts, config) };
|
|
36
|
+
}
|
|
37
|
+
function writeLessons(ctx, lessons, opts, config) {
|
|
38
|
+
const { hippoRoot, tenantId } = ctx;
|
|
39
|
+
const { profile } = opts;
|
|
40
|
+
// Schema fit needs every row; without it, only rows holding a lesson's longest word can be its copy.
|
|
41
|
+
const existing = profile.full ? loadAllEntries(hippoRoot, tenantId) : undefined;
|
|
42
|
+
const keys = storedTextKeys(existing ?? loadTextsHoldingWords(hippoRoot, tenantId, lessons.map(longestWord)));
|
|
43
|
+
const pathTags = profile.full ? extractPathTags(opts.repoPath) : [];
|
|
44
|
+
const counts = { added: 0, skipped: 0, rejected: 0, invalidations: [] };
|
|
45
|
+
for (const lesson of lessons) {
|
|
46
|
+
if (keys.has(duplicateKey(lesson))) {
|
|
47
|
+
counts.skipped++;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const target = profile.full ? extractInvalidationTarget(lesson) : null;
|
|
51
|
+
if (target) {
|
|
52
|
+
const { invalidated } = invalidateMatching(hippoRoot, target, tenantId);
|
|
53
|
+
if (invalidated > 0)
|
|
54
|
+
counts.invalidations.push({ from: target.from, count: invalidated });
|
|
55
|
+
}
|
|
56
|
+
const entry = createMemory(lesson, {
|
|
57
|
+
layer: Layer.Episodic,
|
|
58
|
+
tags: [...profile.tags],
|
|
59
|
+
source: profile.source,
|
|
60
|
+
confidence: 'observed',
|
|
61
|
+
schema_fit: existing && computeSchemaFit(lesson, [...profile.tags], existing),
|
|
62
|
+
tenantId,
|
|
63
|
+
baseHalfLifeDays: config.defaultHalfLifeDays,
|
|
64
|
+
});
|
|
65
|
+
for (const tag of pathTags)
|
|
66
|
+
if (!entry.tags.includes(tag))
|
|
67
|
+
entry.tags.push(tag);
|
|
68
|
+
// A refused lesson must not abort the rest of the git-log scan.
|
|
69
|
+
try {
|
|
70
|
+
writeEntry(hippoRoot, entry, { actor: ctx.actor.subject });
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
if (err instanceof RejectedValueError) {
|
|
74
|
+
counts.rejected++;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
if (profile.full)
|
|
80
|
+
updateStats(hippoRoot, { remembered: 1 });
|
|
81
|
+
keys.add(duplicateKey(lesson));
|
|
82
|
+
if (profile.full)
|
|
83
|
+
void embedMemory(hippoRoot, entry);
|
|
84
|
+
counts.added++;
|
|
85
|
+
}
|
|
86
|
+
return counts;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=learn.js.map
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Context } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Apply a positive/negative outcome to a list of recently-recalled memory ids.
|
|
4
|
+
* Used by the MCP `hippo_outcome` tool and the HTTP `POST /v1/outcome` route.
|
|
5
|
+
* Tenant-scoped: ids that don't belong to ctx.tenantId are silently skipped
|
|
6
|
+
* (matches the prior MCP semantics — a stale id from another tenant doesn't
|
|
7
|
+
* crash the call). Each successful outcome emits one audit_log row with
|
|
8
|
+
* op='outcome' tagged with ctx.actor.subject.
|
|
9
|
+
*
|
|
10
|
+
* Returns `{applied, appliedIds}`. `appliedIds` is the tenant-filtered subset
|
|
11
|
+
* of input ids that actually had `applyOutcome` run on them (i.e. ids whose
|
|
12
|
+
* `readEntry(..., ctx.tenantId)` resolved). Callers that surface the id list
|
|
13
|
+
* over a multi-tenant boundary (HTTP /v1/outcome last-recall path, Python SDK)
|
|
14
|
+
* MUST return `appliedIds` instead of the raw input list — otherwise the
|
|
15
|
+
* non-applied (cross-tenant) ids leak to the caller. Added in v1.11.4 to
|
|
16
|
+
* close that disclosure path on POST /v1/outcome.
|
|
17
|
+
*
|
|
18
|
+
* `opts.traceId` (LC1, docs/plans/2026-08-02-lc1-recall-trace-persistence.md):
|
|
19
|
+
* OPTIONAL additive opt so a programmatic caller can link this outcome to
|
|
20
|
+
* the recall_traces row it judges. NOT applied unconditionally — an SDK
|
|
21
|
+
* caller passing explicit ids with no preceding CLI/context recall would
|
|
22
|
+
* otherwise get linked to a stale, unrelated trace. `outcomeForLastRecall`
|
|
23
|
+
* supplies this automatically from `last_trace_id`; every other caller
|
|
24
|
+
* (server.ts explicit-ids path, MCP hippo_outcome) omits it and gets no
|
|
25
|
+
* linkage, which is correct.
|
|
26
|
+
*/
|
|
27
|
+
export interface OutcomeResult {
|
|
28
|
+
applied: number;
|
|
29
|
+
appliedIds: string[];
|
|
30
|
+
}
|
|
31
|
+
export declare function outcome(ctx: Context, ids: ReadonlyArray<string>, good: boolean, opts?: {
|
|
32
|
+
traceId?: number;
|
|
33
|
+
}): OutcomeResult;
|
|
34
|
+
/**
|
|
35
|
+
* Apply an outcome to the ids most recently returned by `recall()`.
|
|
36
|
+
*
|
|
37
|
+
* Reads `loadIndex(ctx.hippoRoot).last_retrieval_ids` (per-hippoRoot local
|
|
38
|
+
* state; not tenant-scoped at the index layer) and forwards to `outcome()`,
|
|
39
|
+
* which DOES tenant-filter via `readEntry(..., ctx.tenantId)`. Cross-tenant
|
|
40
|
+
* ids in `last_retrieval_ids` are silently skipped, matching the MCP
|
|
41
|
+
* `hippo_outcome` semantics.
|
|
42
|
+
*
|
|
43
|
+
* **Tenant-safe response shape (v1.11.4 security fix):** the returned `ids`
|
|
44
|
+
* field contains ONLY the tenant-filtered subset that actually had outcomes
|
|
45
|
+
* applied (i.e. `appliedIds` from the inner `outcome()` call). Earlier
|
|
46
|
+
* versions returned the raw `last_retrieval_ids` regardless of tenant, which
|
|
47
|
+
* leaked cross-tenant memory IDs to the caller via POST /v1/outcome's
|
|
48
|
+
* no-body last-recall response. The fix is at this helper so all callers
|
|
49
|
+
* (CLI cmdOutcome, HTTP /v1/outcome, MCP `hippo_outcome` if added later)
|
|
50
|
+
* inherit the tenant-safe contract.
|
|
51
|
+
*
|
|
52
|
+
* Do NOT tighten `loadIndex` with `tenantId` inside this helper — doing so
|
|
53
|
+
* would break the (correct) cross-tenant-silent-skip behavior covered by
|
|
54
|
+
* the test in `tests/api-outcome-for-last-recall.test.ts`.
|
|
55
|
+
*/
|
|
56
|
+
export interface OutcomeForLastRecallResult {
|
|
57
|
+
applied: number;
|
|
58
|
+
ids: string[];
|
|
59
|
+
}
|
|
60
|
+
export declare function outcomeForLastRecall(ctx: Context, good: boolean): OutcomeForLastRecallResult;
|
|
61
|
+
//# sourceMappingURL=outcome.d.ts.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Outcome feedback on recalled memories.
|
|
2
|
+
import { openHippoDb, closeHippoDb } from '../db.js';
|
|
3
|
+
import { writeEntry } from '../store/entry-writes.js';
|
|
4
|
+
import { readEntry } from '../store/entry-reads.js';
|
|
5
|
+
import { loadIndex } from '../store/index-and-stats.js';
|
|
6
|
+
import { applyOutcome, CHURN_STALE_TAG } from '../memory.js';
|
|
7
|
+
import { appendAuditEvent } from '../audit.js';
|
|
8
|
+
import { recordTraceOutcome } from '../recall-trace.js';
|
|
9
|
+
export function outcome(ctx, ids, good, opts) {
|
|
10
|
+
const appliedIds = [];
|
|
11
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
12
|
+
try {
|
|
13
|
+
for (const id of ids) {
|
|
14
|
+
const entry = readEntry(ctx.hippoRoot, id, ctx.tenantId);
|
|
15
|
+
if (!entry)
|
|
16
|
+
continue;
|
|
17
|
+
let updated = applyOutcome(entry, good);
|
|
18
|
+
if (good && updated.tags.includes(CHURN_STALE_TAG)) { // FE2: a good outcome reconfirms the entry
|
|
19
|
+
updated = { ...updated, tags: updated.tags.filter((t) => t !== CHURN_STALE_TAG) };
|
|
20
|
+
}
|
|
21
|
+
writeEntry(ctx.hippoRoot, updated, { actor: ctx.actor.subject });
|
|
22
|
+
appendAuditEvent(db, {
|
|
23
|
+
tenantId: ctx.tenantId,
|
|
24
|
+
actor: ctx.actor.subject,
|
|
25
|
+
op: 'outcome',
|
|
26
|
+
targetId: id,
|
|
27
|
+
metadata: { good },
|
|
28
|
+
});
|
|
29
|
+
appliedIds.push(id);
|
|
30
|
+
}
|
|
31
|
+
// LC1: link the outcome to its trace, recording only the ids actually
|
|
32
|
+
// credited (post tenant-filtering, matches appliedIds). Lives in its own
|
|
33
|
+
// append-only table so audit_log pruning can never erase training data.
|
|
34
|
+
if (opts?.traceId !== undefined && appliedIds.length > 0) {
|
|
35
|
+
recordTraceOutcome(db, {
|
|
36
|
+
traceId: opts.traceId,
|
|
37
|
+
tenantId: ctx.tenantId,
|
|
38
|
+
outcome: good ? 'positive' : 'negative',
|
|
39
|
+
memoryIds: appliedIds,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
closeHippoDb(db);
|
|
45
|
+
}
|
|
46
|
+
return { applied: appliedIds.length, appliedIds };
|
|
47
|
+
}
|
|
48
|
+
export function outcomeForLastRecall(ctx, good) {
|
|
49
|
+
const idx = loadIndex(ctx.hippoRoot);
|
|
50
|
+
const ids = idx.last_retrieval_ids;
|
|
51
|
+
if (ids.length === 0)
|
|
52
|
+
return { applied: 0, ids: [] };
|
|
53
|
+
// LC1 F1(d) structural fix (docs/plans/2026-08-02-lc1-recall-trace-persistence.md):
|
|
54
|
+
// read the trace id from the SAME `loadIndex` snapshot already in hand
|
|
55
|
+
// (idx.last_trace_id) — a single-snapshot read, not a second DB round
|
|
56
|
+
// trip via a now-deleted readLastTraceId helper. The value is already
|
|
57
|
+
// strict-parsed by buildIndexFromDb's parseLastTraceId (store.ts): every
|
|
58
|
+
// consumer gets a clean positive-integer string or null, never a garbage
|
|
59
|
+
// value that could reach outcome() and INSERT trace_id=0/NaN. null on a
|
|
60
|
+
// fresh store / pre-v40 flow / api.recall-only usage — outcome() skips
|
|
61
|
+
// linkage silently when traceId is undefined.
|
|
62
|
+
const traceId = idx.last_trace_id !== null ? Number(idx.last_trace_id) : null;
|
|
63
|
+
const { applied, appliedIds } = outcome(ctx, ids, good, traceId !== null ? { traceId } : undefined);
|
|
64
|
+
return { applied, ids: appliedIds };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=outcome.js.map
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type DatabaseSyncLike } from '../db.js';
|
|
2
|
+
import type { Context } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Copy a local memory into the global store. Mirrors `cmdPromote` in cli.ts:
|
|
5
|
+
* the `writeEntry` inside `promoteToGlobal` emits a 'remember' on the global
|
|
6
|
+
* db; we add a 'promote' audit event on the global db so the user-facing
|
|
7
|
+
* intent stays distinct from the underlying upsert.
|
|
8
|
+
*
|
|
9
|
+
* Note: `promoteToGlobal` does not currently take a tenantId override — it
|
|
10
|
+
* reads the entry from the local root via `readEntry` (no tenant filter) and
|
|
11
|
+
* preserves the entry's existing tenantId on the global side. Task 4 may
|
|
12
|
+
* tighten this once writeEntry/readEntry thread tenant context.
|
|
13
|
+
*/
|
|
14
|
+
export interface PromoteResult {
|
|
15
|
+
ok: true;
|
|
16
|
+
sourceId: string;
|
|
17
|
+
globalId: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function promote(ctx: Context, id: string): PromoteResult;
|
|
20
|
+
/**
|
|
21
|
+
* Replace an old memory with new content, chaining old.superseded_by = new.id.
|
|
22
|
+
* Mirrors `cmdSupersede` in cli.ts (without flag-driven layer/tag/pin overrides
|
|
23
|
+
* — A1 keeps the API minimal; the CLI handler will continue to handle those
|
|
24
|
+
* flags and pass the resolved values once Task 4 lands).
|
|
25
|
+
*/
|
|
26
|
+
export interface SupersedeResult {
|
|
27
|
+
ok: true;
|
|
28
|
+
oldId: string;
|
|
29
|
+
newId: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function supersede(ctx: Context, oldId: string, newContent: string): SupersedeResult;
|
|
32
|
+
/**
|
|
33
|
+
* Archive a kind='raw' memory: snapshot into raw_archive, mark archived, delete.
|
|
34
|
+
*
|
|
35
|
+
* `archiveRawMemory` audits the operation internally (op='archive_raw') using the
|
|
36
|
+
* row's own tenant_id. We DO NOT emit a second audit event here to avoid double-
|
|
37
|
+
* emitting the archive_raw op (unlike Task 1 remember/forget where the underlying
|
|
38
|
+
* helpers hardcode actor='cli'). Instead we pass `ctx.actor.subject` through as `who`,
|
|
39
|
+
* and raw-archive.ts uses that for the audit row.
|
|
40
|
+
*/
|
|
41
|
+
export interface ArchiveRawOpts {
|
|
42
|
+
/**
|
|
43
|
+
* Connector idempotency hook (v0.39 commit 3). Runs inside the same
|
|
44
|
+
* SAVEPOINT as the archive — throwing rolls the archive back. Used by the
|
|
45
|
+
* Slack deletion connector to mark the deletion event seen atomically.
|
|
46
|
+
*/
|
|
47
|
+
afterArchive?: (db: DatabaseSyncLike, archivedMemoryId: string) => void;
|
|
48
|
+
}
|
|
49
|
+
export interface ArchiveRawResult {
|
|
50
|
+
ok: true;
|
|
51
|
+
archivedAt: string;
|
|
52
|
+
}
|
|
53
|
+
export declare function archiveRaw(ctx: Context, id: string, reason: string, opts?: ArchiveRawOpts): ArchiveRawResult;
|
|
54
|
+
//# sourceMappingURL=promote.d.ts.map
|