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,573 @@
|
|
|
1
|
+
// First-class object verbs for processes, policies and skills.
|
|
2
|
+
import { extractPathTags } from '../path-context.js';
|
|
3
|
+
import * as processesModule from '../processes.js';
|
|
4
|
+
import * as policiesModule from '../policies.js';
|
|
5
|
+
import * as skillsModule from '../skills.js';
|
|
6
|
+
import { resolveTenantId } from '../tenant.js';
|
|
7
|
+
import { printError } from './output.js';
|
|
8
|
+
import { requireInit } from './shared.js';
|
|
9
|
+
// Strict positive-integer id parse for the mutating process subcommands.
|
|
10
|
+
// parseInt alone accepts trailing junk ('1abc' -> 1), which would let
|
|
11
|
+
// `process close 1abc` / `supersede 1abc` silently hit the wrong row; require
|
|
12
|
+
// the whole arg to be digits. (Mirrors parsePositiveIncidentId; codex P2,
|
|
13
|
+
// 2026-05-29.)
|
|
14
|
+
function parsePositiveProcessId(idRaw) {
|
|
15
|
+
const s = String(idRaw ?? '').trim();
|
|
16
|
+
const id = parseInt(s, 10);
|
|
17
|
+
if (!/^\d+$/.test(s) || id <= 0) {
|
|
18
|
+
printError(`Invalid process id: "${idRaw}" (expected a positive integer).`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
return id;
|
|
22
|
+
}
|
|
23
|
+
// --step is a repeatable flag (collected into an array by parseArgs). A single
|
|
24
|
+
// --step yields a string; normalize both to string[]. A value-less --step errors.
|
|
25
|
+
function collectProcessSteps(stepRaw) {
|
|
26
|
+
if (Array.isArray(stepRaw))
|
|
27
|
+
return stepRaw;
|
|
28
|
+
if (typeof stepRaw === 'string')
|
|
29
|
+
return [stepRaw];
|
|
30
|
+
if (stepRaw === true) {
|
|
31
|
+
printError('--step requires a value, e.g. hippo process new "<name>" --step "do X".');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
function parseListLimit(flags) {
|
|
37
|
+
const limitRaw = flags['limit'];
|
|
38
|
+
const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
|
|
39
|
+
if (!Number.isFinite(limit) || limit <= 0) {
|
|
40
|
+
printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
return limit;
|
|
44
|
+
}
|
|
45
|
+
function processList(hippoRoot, tenantId, flags) {
|
|
46
|
+
const statusRaw = flags['status'];
|
|
47
|
+
const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
|
|
48
|
+
const limit = parseListLimit(flags);
|
|
49
|
+
let results;
|
|
50
|
+
if (status === 'all') {
|
|
51
|
+
results = processesModule.loadProcesses(hippoRoot, tenantId, { limit });
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
if (!processesModule.VALID_PROCESS_STATES.has(status)) {
|
|
55
|
+
printError(`Invalid --status: "${status}". Must be one of: active | superseded | closed | all.`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
results = processesModule.loadProcesses(hippoRoot, tenantId, {
|
|
59
|
+
status: status,
|
|
60
|
+
limit,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (results.length === 0) {
|
|
64
|
+
console.log('No processes.');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
console.log(`Found ${results.length} processes:\n`);
|
|
68
|
+
for (const proc of results) {
|
|
69
|
+
console.log(`#${proc.id} [${proc.status}] v${proc.version} steps=${proc.steps.length} memory=${proc.memoryId ?? '-'}`);
|
|
70
|
+
console.log(` ${proc.processName}`);
|
|
71
|
+
if (proc.changeSummary)
|
|
72
|
+
console.log(` change: ${proc.changeSummary}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function processGet(hippoRoot, tenantId, args) {
|
|
76
|
+
const idRaw = args[1];
|
|
77
|
+
if (!idRaw) {
|
|
78
|
+
printError('Usage: hippo process get <id>');
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
const id = parsePositiveProcessId(idRaw);
|
|
82
|
+
const proc = processesModule.loadProcessById(hippoRoot, tenantId, id);
|
|
83
|
+
if (!proc) {
|
|
84
|
+
printError(`Process ${id} not found.`);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
console.log(`Process #${proc.id}`);
|
|
88
|
+
console.log(` name: ${proc.processName}`);
|
|
89
|
+
console.log(` status: ${proc.status}`);
|
|
90
|
+
console.log(` version: ${proc.version}`);
|
|
91
|
+
if (proc.description)
|
|
92
|
+
console.log(` description: ${proc.description}`);
|
|
93
|
+
if (proc.steps.length > 0) {
|
|
94
|
+
console.log(` steps:`);
|
|
95
|
+
proc.steps.forEach((s, i) => console.log(` ${i + 1}. ${s}`));
|
|
96
|
+
}
|
|
97
|
+
if (proc.changeSummary)
|
|
98
|
+
console.log(` change_summary: ${proc.changeSummary}`);
|
|
99
|
+
if (proc.supersededBy !== null)
|
|
100
|
+
console.log(` superseded_by: #${proc.supersededBy}`);
|
|
101
|
+
if (proc.supersededAt)
|
|
102
|
+
console.log(` superseded_at: ${proc.supersededAt}`);
|
|
103
|
+
if (proc.closedAt)
|
|
104
|
+
console.log(` closed_at: ${proc.closedAt}`);
|
|
105
|
+
if (proc.memoryId)
|
|
106
|
+
console.log(` memory: ${proc.memoryId}`);
|
|
107
|
+
console.log(` created: ${proc.createdAt}`);
|
|
108
|
+
}
|
|
109
|
+
function processSupersede(hippoRoot, tenantId, args, flags) {
|
|
110
|
+
const idRaw = args[1];
|
|
111
|
+
if (!idRaw) {
|
|
112
|
+
printError('Usage: hippo process supersede <id> --step "<text>" [--step ...] [--change "<summary>"] [--description "<text>"]');
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
const id = parsePositiveProcessId(idRaw);
|
|
116
|
+
const steps = collectProcessSteps(flags['step']);
|
|
117
|
+
if (steps.length === 0) {
|
|
118
|
+
printError('hippo process supersede requires at least one --step "<text>" for the new version.');
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
// A supersession is a new version of the SAME process, so the new row reuses the predecessor's name (stable identity
|
|
122
|
+
// across versions). loadProcessById gives an early not-found before the write; saveProcess's in-SAVEPOINT preflight
|
|
123
|
+
// is the authoritative active-state check.
|
|
124
|
+
const existing = processesModule.loadProcessById(hippoRoot, tenantId, id);
|
|
125
|
+
if (!existing) {
|
|
126
|
+
printError(`Process ${id} not found.`);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
const changeRaw = flags['change'];
|
|
130
|
+
const changeSummary = typeof changeRaw === 'string' && changeRaw ? changeRaw : undefined;
|
|
131
|
+
const descRaw = flags['description'];
|
|
132
|
+
const description = typeof descRaw === 'string' && descRaw ? descRaw : undefined;
|
|
133
|
+
const procPathTags = extractPathTags(process.cwd());
|
|
134
|
+
const created = processesModule.saveProcess(hippoRoot, tenantId, {
|
|
135
|
+
processName: existing.processName,
|
|
136
|
+
steps,
|
|
137
|
+
description,
|
|
138
|
+
changeSummary,
|
|
139
|
+
supersedesProcessId: id,
|
|
140
|
+
extraTags: procPathTags,
|
|
141
|
+
});
|
|
142
|
+
console.log(`Process #${created.id} recorded (v${created.version}), superseding #${id}.`);
|
|
143
|
+
if (created.memoryId)
|
|
144
|
+
console.log(` memory: ${created.memoryId}`);
|
|
145
|
+
}
|
|
146
|
+
function processClose(hippoRoot, tenantId, args) {
|
|
147
|
+
const idRaw = args[1];
|
|
148
|
+
if (!idRaw) {
|
|
149
|
+
printError('Usage: hippo process close <id>');
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
const id = parsePositiveProcessId(idRaw);
|
|
153
|
+
const closed = processesModule.closeProcess(hippoRoot, tenantId, id);
|
|
154
|
+
console.log(`Process #${closed.id} closed.`);
|
|
155
|
+
}
|
|
156
|
+
export function cmdProcess(hippoRoot, args, flags) {
|
|
157
|
+
requireInit(hippoRoot);
|
|
158
|
+
const tenantId = resolveTenantId({});
|
|
159
|
+
const subcommand = args[0] ?? '';
|
|
160
|
+
if (subcommand === 'list')
|
|
161
|
+
return processList(hippoRoot, tenantId, flags);
|
|
162
|
+
if (subcommand === 'get')
|
|
163
|
+
return processGet(hippoRoot, tenantId, args);
|
|
164
|
+
if (subcommand === 'supersede')
|
|
165
|
+
return processSupersede(hippoRoot, tenantId, args, flags);
|
|
166
|
+
if (subcommand === 'close')
|
|
167
|
+
return processClose(hippoRoot, tenantId, args);
|
|
168
|
+
// Default subcommand: new (create). Accept both the documented
|
|
169
|
+
// `process new "<name>"` form and the bare `process "<name>"` form: for the
|
|
170
|
+
// `new` keyword the name is args[1], otherwise args[0] IS the name.
|
|
171
|
+
processCreate(hippoRoot, tenantId, subcommand === 'new' ? (args[1] ?? '') : subcommand, flags);
|
|
172
|
+
}
|
|
173
|
+
function processCreate(hippoRoot, tenantId, processName, flags) {
|
|
174
|
+
if (!processName) {
|
|
175
|
+
printError('Usage: hippo process new "<name>" --step "<text>" [--step ...] [--description "<text>"]');
|
|
176
|
+
printError(' hippo process list [--status active|superseded|closed|all] [--limit N]');
|
|
177
|
+
printError(' hippo process get <id>');
|
|
178
|
+
printError(' hippo process supersede <id> --step "<text>" [--change "<summary>"]');
|
|
179
|
+
printError(' hippo process close <id>');
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
const steps = collectProcessSteps(flags['step']);
|
|
183
|
+
const descRaw = flags['description'];
|
|
184
|
+
const description = typeof descRaw === 'string' && descRaw ? descRaw : undefined;
|
|
185
|
+
const procPathTags = extractPathTags(process.cwd());
|
|
186
|
+
const created = processesModule.saveProcess(hippoRoot, tenantId, {
|
|
187
|
+
processName,
|
|
188
|
+
steps,
|
|
189
|
+
description,
|
|
190
|
+
extraTags: procPathTags,
|
|
191
|
+
});
|
|
192
|
+
console.log(`Process recorded: #${created.id} (v${created.version}, ${created.steps.length} steps)`);
|
|
193
|
+
if (created.memoryId)
|
|
194
|
+
console.log(` memory: ${created.memoryId}`);
|
|
195
|
+
}
|
|
196
|
+
// Strict positive-integer id parse for the mutating policy subcommands (mirrors
|
|
197
|
+
// parsePositiveProcessId; codex P2 class - parseInt alone accepts '1abc' -> 1).
|
|
198
|
+
function parsePositivePolicyId(idRaw) {
|
|
199
|
+
const s = String(idRaw ?? '').trim();
|
|
200
|
+
const id = parseInt(s, 10);
|
|
201
|
+
if (!/^\d+$/.test(s) || id <= 0) {
|
|
202
|
+
printError(`Invalid policy id: "${idRaw}" (expected a positive integer).`);
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
return id;
|
|
206
|
+
}
|
|
207
|
+
function printPolicyRow(p) {
|
|
208
|
+
const range = p.validTo ? `${p.validFrom}..${p.validTo}` : `${p.validFrom}..(open)`;
|
|
209
|
+
console.log(`#${p.id} [${p.status}] v${p.version} ${range} memory=${p.memoryId ?? '-'}`);
|
|
210
|
+
console.log(` ${p.policyName}: ${p.policyText}`);
|
|
211
|
+
if (p.changeSummary)
|
|
212
|
+
console.log(` change: ${p.changeSummary}`);
|
|
213
|
+
}
|
|
214
|
+
function policyList(hippoRoot, tenantId, flags) {
|
|
215
|
+
const statusRaw = flags['status'];
|
|
216
|
+
const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
|
|
217
|
+
const limit = parseListLimit(flags);
|
|
218
|
+
let results;
|
|
219
|
+
if (status === 'all') {
|
|
220
|
+
results = policiesModule.loadPolicies(hippoRoot, tenantId, { limit });
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
if (!policiesModule.VALID_POLICY_STATES.has(status)) {
|
|
224
|
+
printError(`Invalid --status: "${status}". Must be one of: active | superseded | closed | all.`);
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
results = policiesModule.loadPolicies(hippoRoot, tenantId, {
|
|
228
|
+
status: status,
|
|
229
|
+
limit,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
if (results.length === 0) {
|
|
233
|
+
console.log('No policies.');
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
console.log(`Found ${results.length} policies:\n`);
|
|
237
|
+
for (const p of results)
|
|
238
|
+
printPolicyRow(p);
|
|
239
|
+
}
|
|
240
|
+
function policyAsOf(hippoRoot, tenantId, args, flags) {
|
|
241
|
+
const dateRaw = args[1];
|
|
242
|
+
if (!dateRaw) {
|
|
243
|
+
printError('Usage: hippo policy asof <iso-date> [--name "<policy>"]');
|
|
244
|
+
process.exit(1);
|
|
245
|
+
}
|
|
246
|
+
const nameRaw = flags['name'];
|
|
247
|
+
const name = typeof nameRaw === 'string' && nameRaw ? nameRaw : undefined;
|
|
248
|
+
let results;
|
|
249
|
+
try {
|
|
250
|
+
results = policiesModule.loadPoliciesAsOf(hippoRoot, tenantId, dateRaw, { name });
|
|
251
|
+
}
|
|
252
|
+
catch (e) {
|
|
253
|
+
printError(e.message);
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
if (results.length === 0) {
|
|
257
|
+
console.log(`No active policies in force at ${dateRaw}${name ? ` for "${name}"` : ''}.`);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
console.log(`Policies in force at ${dateRaw}:\n`);
|
|
261
|
+
for (const p of results)
|
|
262
|
+
printPolicyRow(p);
|
|
263
|
+
}
|
|
264
|
+
function policyGet(hippoRoot, tenantId, args) {
|
|
265
|
+
const idRaw = args[1];
|
|
266
|
+
if (!idRaw) {
|
|
267
|
+
printError('Usage: hippo policy get <id>');
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
const id = parsePositivePolicyId(idRaw);
|
|
271
|
+
const p = policiesModule.loadPolicyById(hippoRoot, tenantId, id);
|
|
272
|
+
if (!p) {
|
|
273
|
+
printError(`Policy ${id} not found.`);
|
|
274
|
+
process.exit(1);
|
|
275
|
+
}
|
|
276
|
+
console.log(`Policy #${p.id}`);
|
|
277
|
+
console.log(` name: ${p.policyName}`);
|
|
278
|
+
console.log(` text: ${p.policyText}`);
|
|
279
|
+
console.log(` status: ${p.status}`);
|
|
280
|
+
console.log(` version: ${p.version}`);
|
|
281
|
+
console.log(` valid_from: ${p.validFrom}`);
|
|
282
|
+
console.log(` valid_to: ${p.validTo ?? '(open-ended)'}`);
|
|
283
|
+
if (p.changeSummary)
|
|
284
|
+
console.log(` change_summary: ${p.changeSummary}`);
|
|
285
|
+
if (p.supersededBy !== null)
|
|
286
|
+
console.log(` superseded_by: #${p.supersededBy}`);
|
|
287
|
+
if (p.supersededAt)
|
|
288
|
+
console.log(` superseded_at: ${p.supersededAt}`);
|
|
289
|
+
if (p.closedAt)
|
|
290
|
+
console.log(` closed_at: ${p.closedAt}`);
|
|
291
|
+
if (p.memoryId)
|
|
292
|
+
console.log(` memory: ${p.memoryId}`);
|
|
293
|
+
console.log(` created: ${p.createdAt}`);
|
|
294
|
+
}
|
|
295
|
+
function policySupersede(hippoRoot, tenantId, args, flags) {
|
|
296
|
+
const idRaw = args[1];
|
|
297
|
+
if (!idRaw) {
|
|
298
|
+
printError('Usage: hippo policy supersede <id> --text "<rule>" [--from <iso>] [--to <iso>] [--change "<summary>"]');
|
|
299
|
+
process.exit(1);
|
|
300
|
+
}
|
|
301
|
+
const id = parsePositivePolicyId(idRaw);
|
|
302
|
+
const textRaw = flags['text'];
|
|
303
|
+
if (typeof textRaw !== 'string' || !textRaw.trim()) {
|
|
304
|
+
printError('hippo policy supersede requires --text "<rule>" for the new version.');
|
|
305
|
+
process.exit(1);
|
|
306
|
+
}
|
|
307
|
+
const existing = policiesModule.loadPolicyById(hippoRoot, tenantId, id);
|
|
308
|
+
if (!existing) {
|
|
309
|
+
printError(`Policy ${id} not found.`);
|
|
310
|
+
process.exit(1);
|
|
311
|
+
}
|
|
312
|
+
const fromRaw = flags['from'];
|
|
313
|
+
const toRaw = flags['to'];
|
|
314
|
+
const changeRaw = flags['change'];
|
|
315
|
+
try {
|
|
316
|
+
const created = policiesModule.savePolicy(hippoRoot, tenantId, {
|
|
317
|
+
policyName: existing.policyName,
|
|
318
|
+
policyText: textRaw,
|
|
319
|
+
validFrom: typeof fromRaw === 'string' && fromRaw ? fromRaw : undefined,
|
|
320
|
+
validTo: typeof toRaw === 'string' && toRaw ? toRaw : undefined,
|
|
321
|
+
changeSummary: typeof changeRaw === 'string' && changeRaw ? changeRaw : undefined,
|
|
322
|
+
supersedesPolicyId: id,
|
|
323
|
+
extraTags: extractPathTags(process.cwd()),
|
|
324
|
+
});
|
|
325
|
+
console.log(`Policy #${created.id} recorded (v${created.version}), superseding #${id}.`);
|
|
326
|
+
if (created.memoryId)
|
|
327
|
+
console.log(` memory: ${created.memoryId}`);
|
|
328
|
+
}
|
|
329
|
+
catch (e) {
|
|
330
|
+
printError(e.message);
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function policyClose(hippoRoot, tenantId, args) {
|
|
335
|
+
const idRaw = args[1];
|
|
336
|
+
if (!idRaw) {
|
|
337
|
+
printError('Usage: hippo policy close <id>');
|
|
338
|
+
process.exit(1);
|
|
339
|
+
}
|
|
340
|
+
const id = parsePositivePolicyId(idRaw);
|
|
341
|
+
const closed = policiesModule.closePolicy(hippoRoot, tenantId, id);
|
|
342
|
+
console.log(`Policy #${closed.id} closed.`);
|
|
343
|
+
}
|
|
344
|
+
export function cmdPolicy(hippoRoot, args, flags) {
|
|
345
|
+
requireInit(hippoRoot);
|
|
346
|
+
const tenantId = resolveTenantId({});
|
|
347
|
+
const subcommand = args[0] ?? '';
|
|
348
|
+
if (subcommand === 'list')
|
|
349
|
+
return policyList(hippoRoot, tenantId, flags);
|
|
350
|
+
if (subcommand === 'asof')
|
|
351
|
+
return policyAsOf(hippoRoot, tenantId, args, flags);
|
|
352
|
+
if (subcommand === 'get')
|
|
353
|
+
return policyGet(hippoRoot, tenantId, args);
|
|
354
|
+
if (subcommand === 'supersede')
|
|
355
|
+
return policySupersede(hippoRoot, tenantId, args, flags);
|
|
356
|
+
if (subcommand === 'close')
|
|
357
|
+
return policyClose(hippoRoot, tenantId, args);
|
|
358
|
+
policyCreate(hippoRoot, tenantId, args, flags);
|
|
359
|
+
}
|
|
360
|
+
function policyCreate(hippoRoot, tenantId, args, flags) {
|
|
361
|
+
const subcommand = args[0] ?? '';
|
|
362
|
+
// Default subcommand: new (create). Accept both `policy new "<name>"` and the
|
|
363
|
+
// bare `policy "<name>"` form: for the `new` keyword the name is args[1].
|
|
364
|
+
const policyName = subcommand === 'new' ? (args[1] ?? '') : subcommand;
|
|
365
|
+
const textRaw = flags['text'];
|
|
366
|
+
if (!policyName || typeof textRaw !== 'string' || !textRaw.trim()) {
|
|
367
|
+
printError('Usage: hippo policy new "<name>" --text "<rule>" [--from <iso>] [--to <iso>]');
|
|
368
|
+
printError(' hippo policy list [--status active|superseded|closed|all] [--limit N]');
|
|
369
|
+
printError(' hippo policy get <id>');
|
|
370
|
+
printError(' hippo policy asof <iso-date> [--name "<policy>"]');
|
|
371
|
+
printError(' hippo policy supersede <id> --text "<rule>" [--from] [--to] [--change "<summary>"]');
|
|
372
|
+
printError(' hippo policy close <id>');
|
|
373
|
+
process.exit(1);
|
|
374
|
+
}
|
|
375
|
+
const fromRaw = flags['from'];
|
|
376
|
+
const toRaw = flags['to'];
|
|
377
|
+
try {
|
|
378
|
+
const created = policiesModule.savePolicy(hippoRoot, tenantId, {
|
|
379
|
+
policyName,
|
|
380
|
+
policyText: textRaw,
|
|
381
|
+
validFrom: typeof fromRaw === 'string' && fromRaw ? fromRaw : undefined,
|
|
382
|
+
validTo: typeof toRaw === 'string' && toRaw ? toRaw : undefined,
|
|
383
|
+
extraTags: extractPathTags(process.cwd()),
|
|
384
|
+
});
|
|
385
|
+
const range = created.validTo ? `${created.validFrom}..${created.validTo}` : `${created.validFrom}..(open)`;
|
|
386
|
+
console.log(`Policy recorded: #${created.id} (v${created.version}, effective ${range})`);
|
|
387
|
+
if (created.memoryId)
|
|
388
|
+
console.log(` memory: ${created.memoryId}`);
|
|
389
|
+
}
|
|
390
|
+
catch (e) {
|
|
391
|
+
printError(e.message);
|
|
392
|
+
process.exit(1);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// Strict positive-integer id parse for the mutating skill subcommands (mirrors
|
|
396
|
+
// parsePositivePolicyId; codex P2 class - parseInt accepts '1abc' -> 1).
|
|
397
|
+
function parsePositiveSkillId(idRaw) {
|
|
398
|
+
const s = String(idRaw ?? '').trim();
|
|
399
|
+
const id = parseInt(s, 10);
|
|
400
|
+
if (!/^\d+$/.test(s) || id <= 0) {
|
|
401
|
+
printError(`Invalid skill id: "${idRaw}" (expected a positive integer).`);
|
|
402
|
+
process.exit(1);
|
|
403
|
+
}
|
|
404
|
+
return id;
|
|
405
|
+
}
|
|
406
|
+
function printSkillRow(s) {
|
|
407
|
+
const trig = s.trigger ? ` when="${s.trigger}"` : '';
|
|
408
|
+
console.log(`#${s.id} [${s.status}] v${s.version}${trig} memory=${s.memoryId ?? '-'}`);
|
|
409
|
+
console.log(` ${s.skillName}`);
|
|
410
|
+
if (s.changeSummary)
|
|
411
|
+
console.log(` change: ${s.changeSummary}`);
|
|
412
|
+
}
|
|
413
|
+
function skillList(hippoRoot, tenantId, flags) {
|
|
414
|
+
const statusRaw = flags['status'];
|
|
415
|
+
const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
|
|
416
|
+
const limit = parseListLimit(flags);
|
|
417
|
+
let results;
|
|
418
|
+
if (status === 'all') {
|
|
419
|
+
results = skillsModule.loadSkills(hippoRoot, tenantId, { limit });
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
if (!skillsModule.VALID_SKILL_STATES.has(status)) {
|
|
423
|
+
printError(`Invalid --status: "${status}". Must be one of: active | superseded | closed | all.`);
|
|
424
|
+
process.exit(1);
|
|
425
|
+
}
|
|
426
|
+
results = skillsModule.loadSkills(hippoRoot, tenantId, {
|
|
427
|
+
status: status,
|
|
428
|
+
limit,
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
if (results.length === 0) {
|
|
432
|
+
console.log('No skills.');
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
console.log(`Found ${results.length} skills:\n`);
|
|
436
|
+
for (const s of results)
|
|
437
|
+
printSkillRow(s);
|
|
438
|
+
}
|
|
439
|
+
function skillExport(hippoRoot, tenantId) {
|
|
440
|
+
const md = skillsModule.exportSkills(hippoRoot, tenantId);
|
|
441
|
+
if (!md) {
|
|
442
|
+
console.log('No active skills.');
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
console.log(md);
|
|
446
|
+
}
|
|
447
|
+
function skillGet(hippoRoot, tenantId, args) {
|
|
448
|
+
const idRaw = args[1];
|
|
449
|
+
if (!idRaw) {
|
|
450
|
+
printError('Usage: hippo skill get <id>');
|
|
451
|
+
process.exit(1);
|
|
452
|
+
}
|
|
453
|
+
const id = parsePositiveSkillId(idRaw);
|
|
454
|
+
const s = skillsModule.loadSkillById(hippoRoot, tenantId, id);
|
|
455
|
+
if (!s) {
|
|
456
|
+
printError(`Skill ${id} not found.`);
|
|
457
|
+
process.exit(1);
|
|
458
|
+
}
|
|
459
|
+
console.log(`Skill #${s.id}`);
|
|
460
|
+
console.log(` name: ${s.skillName}`);
|
|
461
|
+
console.log(` status: ${s.status}`);
|
|
462
|
+
console.log(` version: ${s.version}`);
|
|
463
|
+
if (s.trigger)
|
|
464
|
+
console.log(` when: ${s.trigger}`);
|
|
465
|
+
console.log(` instructions: ${s.instructions}`);
|
|
466
|
+
if (s.changeSummary)
|
|
467
|
+
console.log(` change_summary: ${s.changeSummary}`);
|
|
468
|
+
if (s.supersededBy !== null)
|
|
469
|
+
console.log(` superseded_by: #${s.supersededBy}`);
|
|
470
|
+
if (s.supersededAt)
|
|
471
|
+
console.log(` superseded_at: ${s.supersededAt}`);
|
|
472
|
+
if (s.closedAt)
|
|
473
|
+
console.log(` closed_at: ${s.closedAt}`);
|
|
474
|
+
if (s.memoryId)
|
|
475
|
+
console.log(` memory: ${s.memoryId}`);
|
|
476
|
+
console.log(` created: ${s.createdAt}`);
|
|
477
|
+
}
|
|
478
|
+
function skillSupersede(hippoRoot, tenantId, args, flags) {
|
|
479
|
+
const idRaw = args[1];
|
|
480
|
+
if (!idRaw) {
|
|
481
|
+
printError('Usage: hippo skill supersede <id> --instructions "<text>" [--trigger "<when>"] [--change "<summary>"]');
|
|
482
|
+
process.exit(1);
|
|
483
|
+
}
|
|
484
|
+
const id = parsePositiveSkillId(idRaw);
|
|
485
|
+
const instrRaw = flags['instructions'];
|
|
486
|
+
if (typeof instrRaw !== 'string' || !instrRaw.trim()) {
|
|
487
|
+
printError('hippo skill supersede requires --instructions "<text>" for the new version.');
|
|
488
|
+
process.exit(1);
|
|
489
|
+
}
|
|
490
|
+
const existing = skillsModule.loadSkillById(hippoRoot, tenantId, id);
|
|
491
|
+
if (!existing) {
|
|
492
|
+
printError(`Skill ${id} not found.`);
|
|
493
|
+
process.exit(1);
|
|
494
|
+
}
|
|
495
|
+
const trigRaw = flags['trigger'];
|
|
496
|
+
const changeRaw = flags['change'];
|
|
497
|
+
try {
|
|
498
|
+
const created = skillsModule.saveSkill(hippoRoot, tenantId, {
|
|
499
|
+
skillName: existing.skillName,
|
|
500
|
+
instructions: instrRaw,
|
|
501
|
+
trigger: typeof trigRaw === 'string' && trigRaw ? trigRaw : undefined,
|
|
502
|
+
changeSummary: typeof changeRaw === 'string' && changeRaw ? changeRaw : undefined,
|
|
503
|
+
supersedesSkillId: id,
|
|
504
|
+
extraTags: extractPathTags(process.cwd()),
|
|
505
|
+
});
|
|
506
|
+
console.log(`Skill #${created.id} recorded (v${created.version}), superseding #${id}.`);
|
|
507
|
+
if (created.memoryId)
|
|
508
|
+
console.log(` memory: ${created.memoryId}`);
|
|
509
|
+
}
|
|
510
|
+
catch (e) {
|
|
511
|
+
printError(e.message);
|
|
512
|
+
process.exit(1);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
function skillClose(hippoRoot, tenantId, args) {
|
|
516
|
+
const idRaw = args[1];
|
|
517
|
+
if (!idRaw) {
|
|
518
|
+
printError('Usage: hippo skill close <id>');
|
|
519
|
+
process.exit(1);
|
|
520
|
+
}
|
|
521
|
+
const id = parsePositiveSkillId(idRaw);
|
|
522
|
+
const closed = skillsModule.closeSkill(hippoRoot, tenantId, id);
|
|
523
|
+
console.log(`Skill #${closed.id} closed.`);
|
|
524
|
+
}
|
|
525
|
+
export function cmdSkill(hippoRoot, args, flags) {
|
|
526
|
+
requireInit(hippoRoot);
|
|
527
|
+
const tenantId = resolveTenantId({});
|
|
528
|
+
const subcommand = args[0] ?? '';
|
|
529
|
+
if (subcommand === 'list')
|
|
530
|
+
return skillList(hippoRoot, tenantId, flags);
|
|
531
|
+
if (subcommand === 'export')
|
|
532
|
+
return skillExport(hippoRoot, tenantId);
|
|
533
|
+
if (subcommand === 'get')
|
|
534
|
+
return skillGet(hippoRoot, tenantId, args);
|
|
535
|
+
if (subcommand === 'supersede')
|
|
536
|
+
return skillSupersede(hippoRoot, tenantId, args, flags);
|
|
537
|
+
if (subcommand === 'close')
|
|
538
|
+
return skillClose(hippoRoot, tenantId, args);
|
|
539
|
+
skillCreate(hippoRoot, tenantId, args, flags);
|
|
540
|
+
}
|
|
541
|
+
function skillCreate(hippoRoot, tenantId, args, flags) {
|
|
542
|
+
const subcommand = args[0] ?? '';
|
|
543
|
+
// Default subcommand: new (create). Accept both `skill new "<name>"` and the
|
|
544
|
+
// bare `skill "<name>"` form: for the `new` keyword the name is args[1].
|
|
545
|
+
const skillName = subcommand === 'new' ? (args[1] ?? '') : subcommand;
|
|
546
|
+
const instrRaw = flags['instructions'];
|
|
547
|
+
if (!skillName || typeof instrRaw !== 'string' || !instrRaw.trim()) {
|
|
548
|
+
printError('Usage: hippo skill new "<name>" --instructions "<text>" [--trigger "<when>"]');
|
|
549
|
+
printError(' hippo skill list [--status active|superseded|closed|all] [--limit N]');
|
|
550
|
+
printError(' hippo skill get <id>');
|
|
551
|
+
printError(' hippo skill export (render active skills as an AGENTS.md/CLAUDE.md block)');
|
|
552
|
+
printError(' hippo skill supersede <id> --instructions "<text>" [--trigger] [--change "<summary>"]');
|
|
553
|
+
printError(' hippo skill close <id>');
|
|
554
|
+
process.exit(1);
|
|
555
|
+
}
|
|
556
|
+
const trigRaw = flags['trigger'];
|
|
557
|
+
try {
|
|
558
|
+
const created = skillsModule.saveSkill(hippoRoot, tenantId, {
|
|
559
|
+
skillName,
|
|
560
|
+
instructions: instrRaw,
|
|
561
|
+
trigger: typeof trigRaw === 'string' && trigRaw ? trigRaw : undefined,
|
|
562
|
+
extraTags: extractPathTags(process.cwd()),
|
|
563
|
+
});
|
|
564
|
+
console.log(`Skill recorded: #${created.id} (v${created.version})`);
|
|
565
|
+
if (created.memoryId)
|
|
566
|
+
console.log(` memory: ${created.memoryId}`);
|
|
567
|
+
}
|
|
568
|
+
catch (e) {
|
|
569
|
+
printError(e.message);
|
|
570
|
+
process.exit(1);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
//# sourceMappingURL=playbooks.js.map
|
package/dist/cli/projects.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
// The `hippo projects` verb: list a store's project names, fold an old worktree name into its repo, repair
|
|
1
|
+
// The `hippo projects` verb: list a store's project names, fold an old worktree name into its repo, repair old tags in one pass.
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { execFileSync } from 'child_process';
|
|
4
4
|
import { closeHippoDb, openHippoDb } from '../db.js';
|
|
5
|
-
import { listProjects, mergeProjects,
|
|
5
|
+
import { listProjects, mergeProjects, repairProjects } from '../project-merge.js';
|
|
6
6
|
import { resolveTenantId } from '../tenant.js';
|
|
7
7
|
import { resolveAuthRoot } from './shared.js';
|
|
8
8
|
import { printError } from './output.js';
|
|
9
9
|
/** Old per-worktree project names of the repo at cwd, mapped to the repo's main checkout name; empty outside git. */
|
|
10
10
|
function worktreeNames() {
|
|
11
11
|
try {
|
|
12
|
-
const out = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], windowsHide: true });
|
|
12
|
+
const out = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf8', timeout: 10_000, stdio: ['ignore', 'pipe', 'ignore'], windowsHide: true });
|
|
13
13
|
const paths = out.split(/\r?\n/).filter((l) => l.startsWith('worktree ')).map((l) => path.basename(l.slice('worktree '.length)));
|
|
14
14
|
return new Map(paths.slice(1).map((name) => [name, paths[0]]));
|
|
15
15
|
}
|
|
@@ -64,13 +64,16 @@ export function cmdProjects(hippoRoot, args, flags) {
|
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
66
|
if (sub === 'repair') {
|
|
67
|
-
const r =
|
|
67
|
+
const r = repairProjects(db, root, { tenantId, dryRun: !apply });
|
|
68
68
|
if (flags['json']) {
|
|
69
69
|
console.log(JSON.stringify(r, null, 2));
|
|
70
70
|
return;
|
|
71
71
|
}
|
|
72
|
-
console.log(`${apply ? 'Repaired' : 'Dry run: would repair'}
|
|
73
|
-
console.log(` ${r.
|
|
72
|
+
console.log(`${apply ? 'Repaired' : 'Dry run: would repair'} ${root}:`);
|
|
73
|
+
console.log(` ${count(r.copies.length, 'imported note copy', 'imported note copies')} under the wrong project set aside (the note stays under its own, or user-global)`);
|
|
74
|
+
for (const f of r.folds)
|
|
75
|
+
console.log(` ${f.from} folded into ${f.into} (its sessions' folders resolve there now)`);
|
|
76
|
+
console.log(` sleep's user-global merged rows: ${r.toProject.length} re-tagged to their parents' project`);
|
|
74
77
|
console.log(` ${r.setAside.length} set aside (parents in two projects; sleep re-merges them per project)`);
|
|
75
78
|
console.log(` ${r.untraced.length} left as they are (no parent left to show which project; check them with hippo inspect <id>)`);
|
|
76
79
|
console.log(apply ? `Backup: ${r.backup}\nEvery id is in the audit log: hippo audit list --op project_repair` : 'Nothing written. Add --apply to run it.');
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type CliFlags, type CommandContext } from './shared.js';
|
|
2
|
+
/** Test-only: reset the module-level recall-history Map. Call from beforeEach. */
|
|
3
|
+
export declare function __resetSessionRecallHistoryCli(): void;
|
|
4
|
+
/** Runs `hippo recall`: parse, rank, load continuity, fit the printed block to the budget, audit, then write and print. */
|
|
5
|
+
export declare function cmdRecall(hippoRoot: string, query: string, flags: CliFlags): Promise<void>;
|
|
6
|
+
export declare function handleRecall({ hippoRoot, args, flags }: CommandContext): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=recall.d.ts.map
|