hippo-memory 1.71.0 → 2.0.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 +7 -5
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +11 -26
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/sync.js +8 -6
- package/dist/api/assemble.js +3 -2
- package/dist/api/audit.d.ts +30 -2
- package/dist/api/audit.js +48 -7
- package/dist/api/auth.d.ts +11 -9
- package/dist/api/auth.js +39 -40
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +7 -3
- package/dist/api/availability.js +2 -3
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-auto.js +4 -2
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +15 -29
- package/dist/api/context.js +29 -18
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/api/dormant.js +4 -2
- package/dist/api/drill-down.js +3 -2
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +7 -3
- package/dist/api/forget.js +24 -14
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.js +2 -1
- package/dist/api/index.d.ts +4 -2
- package/dist/api/index.js +4 -2
- package/dist/api/instruction-detect.js +5 -1
- package/dist/api/learn.d.ts +5 -1
- package/dist/api/learn.js +71 -44
- package/dist/api/ledger-db.d.ts +2 -6
- package/dist/api/ledger-db.js +4 -36
- package/dist/api/memories.d.ts +21 -1
- package/dist/api/memories.js +51 -1
- package/dist/api/objects.d.ts +1 -1
- package/dist/api/objects.js +2 -1
- package/dist/api/outcome.d.ts +5 -5
- package/dist/api/outcome.js +17 -16
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +3 -1
- package/dist/api/predictions.js +8 -1
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +3 -3
- package/dist/api/promote.js +26 -28
- package/dist/api/prompt-hook.d.ts +17 -2
- package/dist/api/prompt-hook.js +45 -4
- package/dist/api/quarantine.js +2 -1
- package/dist/api/recall-cli.d.ts +3 -0
- package/dist/api/recall-cli.js +13 -4
- package/dist/api/recall-core.js +10 -5
- package/dist/api/recall-pipeline.js +23 -24
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +3 -1
- package/dist/api/recall.d.ts +0 -3
- package/dist/api/recall.js +51 -73
- package/dist/api/remember-local.d.ts +5 -2
- package/dist/api/remember-local.js +15 -7
- package/dist/api/remember.d.ts +7 -3
- package/dist/api/remember.js +19 -16
- package/dist/api/session-end.d.ts +46 -0
- package/dist/api/session-end.js +131 -0
- package/dist/api/sleep-run.d.ts +1 -1
- package/dist/api/sleep-run.js +16 -11
- package/dist/api/sleep.js +4 -3
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.js +2 -2
- package/dist/api/types.d.ts +3 -7
- package/dist/api/types.js +6 -1
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.js +36 -95
- package/dist/capture/compact.js +10 -5
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +29 -426
- package/dist/capture/compaction-spool.d.ts +7 -7
- package/dist/capture/compaction-spool.js +60 -51
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.js +4 -3
- package/dist/capture/session-end-caller.js +3 -2
- package/dist/capture/session-worker.js +22 -10
- package/dist/capture/transcript.d.ts +2 -1
- package/dist/capture/transcript.js +6 -3
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/audit-prune.d.ts +0 -25
- package/dist/cli/audit-prune.js +1 -27
- package/dist/cli/audit.js +20 -20
- package/dist/cli/auth.d.ts +1 -1
- package/dist/cli/auth.js +16 -17
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +37 -292
- package/dist/cli/card.js +41 -33
- package/dist/cli/client.d.ts +6 -2
- package/dist/cli/client.js +37 -21
- package/dist/cli/compact-resume-payload.js +1 -1
- package/dist/cli/context.d.ts +1 -1
- package/dist/cli/context.js +13 -13
- package/dist/cli/continuity.d.ts +1 -1
- package/dist/cli/continuity.js +36 -39
- package/dist/cli/curate.d.ts +2 -2
- package/dist/cli/curate.js +32 -36
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +23 -8
- package/dist/cli/decisions.d.ts +0 -2
- package/dist/cli/decisions.js +7 -285
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +12 -13
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +21 -25
- package/dist/cli/flag-values.js +16 -6
- package/dist/cli/flags.d.ts +0 -289
- package/dist/cli/flags.js +3 -138
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +6 -6
- package/dist/cli/hook-runtime.js +9 -36
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +28 -19
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +11 -3
- package/dist/cli/last-sleep.js +1 -1
- package/dist/cli/maintenance.d.ts +3 -3
- package/dist/cli/maintenance.js +29 -30
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.d.ts +2 -2
- package/dist/cli/object-verbs.js +4 -4
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +126 -290
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +174 -0
- package/dist/cli/print.js +2 -1
- package/dist/cli/projects.js +30 -22
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +6 -5
- package/dist/cli/recall.js +13 -7
- package/dist/cli/refine-llm.js +18 -17
- package/dist/cli/remember.js +17 -17
- package/dist/cli/scheduler.js +2 -1
- package/dist/cli/serve.js +11 -6
- package/dist/cli/session-hooks.d.ts +1 -5
- package/dist/cli/session-hooks.js +89 -168
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +17 -10
- package/dist/cli/shared.d.ts +2 -6
- package/dist/cli/shared.js +9 -29
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.js +6 -37
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +32 -35
- package/dist/cli/transfer.d.ts +3 -3
- package/dist/cli/transfer.js +64 -43
- package/dist/cli/usage.d.ts +1 -80
- package/dist/cli/usage.js +2 -696
- package/dist/cli/verb-row.d.ts +34 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +234 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +236 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +257 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +314 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -272
- package/dist/cli.js +24 -315
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +39 -4
- package/dist/connectors/github/backfill.js +12 -3
- package/dist/connectors/github/deletion.js +2 -1
- package/dist/connectors/github/dlq.js +31 -73
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +5 -29
- package/dist/connectors/github/tenant-routing.js +2 -1
- package/dist/connectors/github/webhook.d.ts +2 -1
- package/dist/connectors/github/webhook.js +35 -2
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +29 -0
- package/dist/connectors/slack/deletion.js +2 -1
- package/dist/connectors/slack/dlq.js +49 -71
- package/dist/connectors/slack/ingest.d.ts +2 -6
- package/dist/connectors/slack/ingest.js +4 -28
- package/dist/connectors/slack/tenant-routing.js +2 -1
- package/dist/connectors/slack/webhook.d.ts +2 -1
- package/dist/connectors/slack/webhook.js +2 -1
- package/dist/consolidate/conflicts.js +2 -2
- package/dist/consolidate/dag.js +29 -18
- package/dist/consolidate/dedupe.d.ts +7 -0
- package/dist/consolidate/dedupe.js +6 -4
- package/dist/consolidate/llm-passes.js +45 -19
- package/dist/consolidate/memory-value.js +3 -2
- package/dist/consolidate/merge.js +8 -8
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +26 -6
- package/dist/consolidate/replay.js +11 -4
- package/dist/consolidate/sleep.js +9 -6
- package/dist/consolidate/traces.js +5 -5
- package/dist/core/ablation.d.ts +10 -0
- package/dist/core/ablation.js +12 -0
- package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
- package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
- package/dist/core/ambient.d.ts +4 -0
- package/dist/core/ambient.js +39 -18
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/card.js +3 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/config.d.ts +1 -1
- package/dist/core/config.js +22 -18
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/{store → core}/markdown.d.ts +1 -1
- package/dist/{store → core}/markdown.js +4 -4
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory.d.ts +14 -8
- package/dist/core/memory.js +35 -23
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +1 -1
- package/dist/core/physics.d.ts +3 -1
- package/dist/core/physics.js +23 -18
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +3 -0
- package/dist/core/project-identity.js +12 -2
- package/dist/{store → core}/recall-scope.d.ts +1 -10
- package/dist/{store → core}/recall-scope.js +2 -19
- package/dist/core/search-types.d.ts +1 -1
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +5 -5
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.js +1 -3
- package/dist/dashboard/dashboard.js +16 -5
- package/dist/db/busy.d.ts +2 -7
- package/dist/db/busy.js +21 -26
- package/dist/db/connect.d.ts +2 -2
- package/dist/db/connect.js +7 -7
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +14 -7
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v14.js +1 -0
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +0 -2
- package/dist/db/open.js +6 -10
- package/dist/db/physics-state.d.ts +0 -4
- package/dist/db/physics-state.js +7 -33
- package/dist/db/request-stores.d.ts +1 -0
- package/dist/db/request-stores.js +2 -1
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.js +19 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.js +18 -15
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
- package/dist/{store/embeddings → embeddings}/provider.js +19 -25
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/store-kit.d.ts +37 -0
- package/dist/entry/store-kit.js +25 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-suite.js +17 -11
- package/dist/eval/eval.js +1 -1
- package/dist/eval/judgment.js +12 -5
- package/dist/graph/extract.js +3 -3
- package/dist/graph/recall.js +1 -1
- package/dist/graph/view.js +13 -5
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +2 -1
- package/dist/hooks/json-hooks.js +10 -4
- package/dist/hooks/opencode.js +8 -5
- package/dist/hooks/shared.d.ts +0 -6
- package/dist/hooks/shared.js +4 -15
- package/dist/importers/core.js +4 -4
- package/dist/importers/sources.js +5 -4
- package/dist/importers/vault.d.ts +1 -1
- package/dist/importers/vault.js +25 -23
- package/dist/index.d.ts +5 -4
- package/dist/index.js +4 -3
- package/dist/learn/autolearn.d.ts +15 -3
- package/dist/learn/autolearn.js +38 -16
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +7 -5
- package/dist/learn/forward-claim-detector.js +4 -2
- package/dist/learn/invalidation.d.ts +2 -1
- package/dist/learn/invalidation.js +18 -9
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +27 -48
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.d.ts +1 -1
- package/dist/mcp/memory-tools.js +8 -9
- package/dist/mcp/protocol.d.ts +11 -7
- package/dist/mcp/protocol.js +25 -12
- package/dist/mcp/recall-tools.js +12 -9
- package/dist/mcp/request.js +22 -20
- package/dist/mcp/stdio.js +37 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +44 -21
- package/dist/objects/customer-notes.d.ts +2 -2
- package/dist/objects/decisions.d.ts +2 -2
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +2 -2
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +2 -2
- package/dist/objects/policies.js +2 -1
- package/dist/objects/processes.d.ts +2 -2
- package/dist/objects/project-briefs.d.ts +2 -2
- package/dist/objects/project-briefs.js +2 -3
- package/dist/objects/skills.d.ts +2 -2
- package/dist/postinstall.js +1 -1
- package/dist/rerankers/clef.js +3 -6
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +71 -98
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +2 -4
- package/dist/rerankers/outage-warning.d.ts +3 -1
- package/dist/rerankers/outage-warning.js +5 -3
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.js +1 -1
- package/dist/search/embed-memories.d.ts +12 -0
- package/dist/search/embed-memories.js +389 -0
- package/dist/search/engine.d.ts +8 -0
- package/dist/search/engine.js +10 -0
- package/dist/search/goal-boost.d.ts +1 -1
- package/dist/search/goal-boost.js +6 -3
- package/dist/search/hybrid.d.ts +9 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +22 -15
- package/dist/search/rerank.js +1 -1
- package/dist/search/vector.d.ts +8 -6
- package/dist/search/vector.js +14 -17
- package/dist/server/auth.d.ts +3 -1
- package/dist/server/auth.js +24 -15
- package/dist/server/boot.d.ts +2 -1
- package/dist/server/boot.js +34 -84
- package/dist/server/client-ip.d.ts +9 -6
- package/dist/server/client-ip.js +36 -17
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +1 -0
- package/dist/server/defaults.js +1 -0
- package/dist/server/mcp-http.js +16 -11
- package/dist/server/request.js +7 -2
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -133
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +13 -21
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +1 -2
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +2 -4
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +2 -5
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +19 -40
- package/dist/server/routes/object-routes.d.ts +6 -6
- package/dist/server/routes/object-routes.js +4 -7
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +2 -4
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +9 -13
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +1 -2
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +2 -4
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +6 -10
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +2 -4
- package/dist/server/server-detect.d.ts +7 -1
- package/dist/server/server-detect.js +36 -11
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +17 -11
- package/dist/server/tls.d.ts +7 -2
- package/dist/server/tls.js +17 -5
- package/dist/server/types.d.ts +29 -12
- package/dist/server/validation.d.ts +1 -2
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +4 -40
- package/dist/server.js +3 -29
- package/dist/sharing/global-store.d.ts +4 -5
- package/dist/sharing/global-store.js +8 -13
- package/dist/sharing/global-sync.js +38 -45
- package/dist/sharing/project-merge.d.ts +7 -14
- package/dist/sharing/project-merge.js +57 -121
- package/dist/sharing/search-both.js +10 -3
- package/dist/sharing/share.d.ts +2 -0
- package/dist/sharing/share.js +39 -38
- package/dist/store/ambient.js +7 -7
- package/dist/store/audit-event.d.ts +1 -1
- package/dist/store/audit.d.ts +0 -16
- package/dist/store/audit.js +4 -55
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +7 -3
- package/dist/store/candidates.d.ts +3 -2
- package/dist/store/candidates.js +59 -30
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/cards.js +6 -5
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +418 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +7 -1
- package/dist/store/conflicts.js +13 -9
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +33 -0
- package/dist/store/connectors/event-log.d.ts +13 -0
- package/dist/store/connectors/event-log.js +24 -0
- package/dist/store/connectors/github.d.ts +7 -9
- package/dist/store/connectors/github.js +35 -60
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +24 -57
- package/dist/store/dashboard-reads.js +8 -6
- package/dist/store/delete-and-batch.d.ts +6 -0
- package/dist/store/delete-and-batch.js +40 -6
- package/dist/store/delivery-recorder.d.ts +12 -5
- package/dist/store/delivery-recorder.js +13 -11
- package/dist/store/descendant-page.js +8 -4
- package/dist/store/dormant.d.ts +1 -1
- package/dist/store/dormant.js +10 -4
- package/dist/store/embeddings/index.d.ts +2 -12
- package/dist/store/embeddings/index.js +5 -374
- package/dist/store/entry-reads.d.ts +35 -4
- package/dist/store/entry-reads.js +86 -19
- package/dist/store/entry-row.js +9 -2
- package/dist/store/entry-writes.d.ts +15 -12
- package/dist/store/entry-writes.js +54 -22
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.js +22 -19
- package/dist/store/graph-reads.js +9 -6
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -6
- package/dist/store/graph-writes.js +48 -71
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +10 -4
- package/dist/store/handoffs.js +10 -9
- package/dist/store/index-and-stats.js +2 -2
- package/dist/store/index.d.ts +2 -2
- package/dist/store/index.js +1 -1
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.js +19 -10
- package/dist/store/open.d.ts +2 -5
- package/dist/store/open.js +42 -54
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/port.d.ts +68 -6
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +1 -2
- package/dist/store/predictions.js +3 -6
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/store/quality-repair.js +1 -1
- package/dist/store/quarantine.js +2 -1
- package/dist/store/recall-trace.d.ts +2 -0
- package/dist/store/recall-trace.js +20 -3
- package/dist/store/rejected-values.js +16 -10
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +0 -17
- package/dist/store/rejection.js +1 -21
- package/dist/store/rows.js +2 -2
- package/dist/store/rule-sql.d.ts +11 -0
- package/dist/store/rule-sql.js +31 -6
- package/dist/store/search-rows.d.ts +5 -5
- package/dist/store/search-rows.js +18 -16
- package/dist/store/sessions.js +4 -2
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +4 -7
- package/dist/store/sqlite/connector-writes-group.js +6 -4
- package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
- package/dist/store/sqlite/entry-writes-group.js +3 -3
- package/dist/store/sqlite/error-codec.js +4 -3
- package/dist/store/sqlite/executor.js +10 -4
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +11 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/last-recall-group.d.ts +13 -0
- package/dist/store/sqlite/last-recall-group.js +57 -0
- package/dist/store/sqlite/local.d.ts +0 -17
- package/dist/store/sqlite/local.js +0 -31
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +60 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +15 -7
- package/dist/store/sqlite/store.d.ts +1 -8
- package/dist/store/sqlite/store.js +13 -22
- package/dist/store/summaries.d.ts +10 -3
- package/dist/store/summaries.js +54 -11
- package/dist/store/token-ledger-rows.js +3 -2
- package/dist/store/token-ledger.d.ts +0 -7
- package/dist/store/token-ledger.js +0 -35
- package/dist/store/vector-index.js +8 -4
- package/dist/support-bundle.js +2 -3
- package/dist/trust/reject-flow.js +2 -2
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +6 -1
- package/dist/util/anthropic-messages.js +26 -7
- package/dist/util/atomic-write.d.ts +5 -2
- package/dist/util/atomic-write.js +12 -8
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +12 -2
- package/dist/util/env.js +12 -2
- package/dist/util/format.d.ts +5 -0
- package/dist/util/format.js +10 -0
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +6 -0
- package/dist/util/http-retry.js +43 -5
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +4 -0
- package/dist/util/log.js +9 -0
- package/dist/util/request-scope.d.ts +9 -3
- package/dist/util/request-scope.js +18 -9
- package/dist/util/secret-detect.js +6 -1
- package/dist/util/spawn-argv.d.ts +9 -0
- package/dist/util/spawn-argv.js +57 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +1 -1
- package/dist/util/version.js +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +4 -2
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -175
- /package/dist/{cli → api}/correction-latency.d.ts +0 -0
- /package/dist/{cli → api}/correction-latency.js +0 -0
- /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
- /package/dist/{cli → api}/provenance-coverage.js +0 -0
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
- /package/dist/{store → util}/yaml.d.ts +0 -0
- /package/dist/{store → util}/yaml.js +0 -0
package/dist/cli/briefs.js
CHANGED
|
@@ -1,41 +1,15 @@
|
|
|
1
|
-
//
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import { spawn } from 'child_process';
|
|
4
|
-
import { extractPathTags } from '../search/path-context.js';
|
|
1
|
+
// The project brief verbs: one repo's brief, versioned by supersession and refreshable from the repo's receipts.
|
|
5
2
|
import * as briefsModule from '../objects/project-briefs.js';
|
|
6
|
-
import
|
|
7
|
-
import { extractGraph } from '../graph/extract.js';
|
|
8
|
-
import { buildGraphModel, renderGraphHtml, renderGraphCanvas, DEFAULT_VIEW_LIMIT } from '../graph/view.js';
|
|
9
|
-
import { errorMessage, log } from '../util/log.js';
|
|
3
|
+
import { errorMessage } from '../util/log.js';
|
|
10
4
|
import { printError } from './output.js';
|
|
11
|
-
import {
|
|
12
|
-
import { requireInit } from './shared.js';
|
|
13
|
-
import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail } from './object-verbs.js';
|
|
5
|
+
import { boolFlag, stringFlag } from './flag-values.js';
|
|
14
6
|
import { CliExit } from './exit.js';
|
|
15
|
-
|
|
16
|
-
const NOTE = { cmd: 'note', noun: 'Customer note', idLabel: 'note' };
|
|
7
|
+
import { requiredText, versionedVerbs } from './versioned-verbs.js';
|
|
17
8
|
function printBriefRow(b) {
|
|
18
9
|
console.log(`#${b.id} [${b.status}] v${b.version} repo="${b.repo}" memory=${b.memoryId ?? '-'}`);
|
|
19
10
|
if (b.changeSummary)
|
|
20
11
|
console.log(` change: ${b.changeSummary}`);
|
|
21
12
|
}
|
|
22
|
-
function briefUsage() {
|
|
23
|
-
printError('Usage: hippo brief new "<repo>" --summary "<text>"');
|
|
24
|
-
printError(' hippo brief list [--status active|superseded|closed|all] [--repo "<repo>"] [--limit N]');
|
|
25
|
-
printError(' hippo brief get <id>');
|
|
26
|
-
printError(' hippo brief supersede <id> --summary "<text>" [--change "<summary>"]');
|
|
27
|
-
printError(' hippo brief close <id>');
|
|
28
|
-
printError(' hippo brief refresh "<repo>" [--dry-run] (auto-assemble the brief from the repo\'s receipts)');
|
|
29
|
-
}
|
|
30
|
-
function briefList(hippoRoot, tenantId, flags) {
|
|
31
|
-
const repo = stringFlag(flags, 'repo')?.trim() || undefined;
|
|
32
|
-
listObjects(flags, {
|
|
33
|
-
plural: 'project briefs',
|
|
34
|
-
states: briefsModule.VALID_BRIEF_STATES,
|
|
35
|
-
load: (opts) => briefsModule.loadProjectBriefs(hippoRoot, tenantId, { ...opts, repo }),
|
|
36
|
-
printRow: printBriefRow,
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
13
|
function briefRefresh(hippoRoot, tenantId, args, flags) {
|
|
40
14
|
const repoRaw = args[1];
|
|
41
15
|
if (!repoRaw) {
|
|
@@ -62,266 +36,37 @@ function briefRefresh(hippoRoot, tenantId, args, flags) {
|
|
|
62
36
|
throw new CliExit(1);
|
|
63
37
|
}
|
|
64
38
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
});
|
|
91
|
-
console.log(`
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
function briefClose(hippoRoot, tenantId, args) {
|
|
101
|
-
closeObject(args, BRIEF, (id) => briefsModule.closeProjectBrief(hippoRoot, tenantId, id));
|
|
102
|
-
}
|
|
103
|
-
function briefCreate(hippoRoot, tenantId, args, flags) {
|
|
104
|
-
const subcommand = args[0] ?? '';
|
|
105
|
-
// Default subcommand: new (create). Accept both `brief new "<repo>"` and the
|
|
106
|
-
// bare `brief "<repo>"` form: for the `new` keyword the repo is args[1].
|
|
107
|
-
const repo = subcommand === 'new' ? (args[1] ?? '') : subcommand;
|
|
108
|
-
const summaryRaw = stringFlag(flags, 'summary');
|
|
109
|
-
if (!repo || !summaryRaw?.trim()) {
|
|
110
|
-
briefUsage();
|
|
111
|
-
throw new CliExit(1);
|
|
112
|
-
}
|
|
113
|
-
try {
|
|
114
|
-
const created = briefsModule.saveProjectBrief(hippoRoot, tenantId, {
|
|
115
|
-
repo,
|
|
116
|
-
summary: summaryRaw,
|
|
117
|
-
extraTags: extractPathTags(process.cwd()),
|
|
118
|
-
});
|
|
119
|
-
console.log(`Project brief recorded: #${created.id} (v${created.version}) for repo "${created.repo}"`);
|
|
120
|
-
if (created.memoryId)
|
|
121
|
-
console.log(` memory: ${created.memoryId}`);
|
|
122
|
-
}
|
|
123
|
-
catch (e) {
|
|
124
|
-
printError(errorMessage(e));
|
|
125
|
-
throw new CliExit(1);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
export function handleProjectBrief({ hippoRoot, tenantId, args, flags }) {
|
|
129
|
-
requireInit(hippoRoot);
|
|
130
|
-
const subcommand = args[0] ?? '';
|
|
131
|
-
if (subcommand === 'list')
|
|
132
|
-
return briefList(hippoRoot, tenantId, flags);
|
|
133
|
-
if (subcommand === 'refresh')
|
|
134
|
-
return briefRefresh(hippoRoot, tenantId, args, flags);
|
|
135
|
-
if (subcommand === 'get')
|
|
136
|
-
return briefGet(hippoRoot, tenantId, args);
|
|
137
|
-
if (subcommand === 'supersede')
|
|
138
|
-
return briefSupersede(hippoRoot, tenantId, args, flags);
|
|
139
|
-
if (subcommand === 'close')
|
|
140
|
-
return briefClose(hippoRoot, tenantId, args);
|
|
141
|
-
briefCreate(hippoRoot, tenantId, args, flags);
|
|
142
|
-
}
|
|
143
|
-
function printNoteRow(n) {
|
|
144
|
-
console.log(`#${n.id} [${n.status}] v${n.version} customer="${n.customer}" memory=${n.memoryId ?? '-'}`);
|
|
145
|
-
if (n.changeSummary)
|
|
146
|
-
console.log(` change: ${n.changeSummary}`);
|
|
147
|
-
}
|
|
148
|
-
function noteUsage() {
|
|
149
|
-
printError('Usage: hippo note new "<customer>" --text "<note>"');
|
|
150
|
-
printError(' hippo note list [--status active|superseded|closed|all] [--customer "<id>"] [--limit N]');
|
|
151
|
-
printError(' hippo note get <id>');
|
|
152
|
-
printError(' hippo note supersede <id> --text "<note>" [--change "<summary>"]');
|
|
153
|
-
printError(' hippo note close <id>');
|
|
154
|
-
}
|
|
155
|
-
function graphExtract(hippoRoot, tenantId) {
|
|
156
|
-
const result = extractGraph(hippoRoot, tenantId);
|
|
157
|
-
const byType = Object.entries(result.byType)
|
|
158
|
-
.map(([t, n]) => `${t} ${n}`)
|
|
159
|
-
.join(', ');
|
|
160
|
-
const supersedes = result.relations - result.references;
|
|
161
|
-
console.log(`Graph extracted: ${result.entities} entities (${byType}) + ${result.relations} relations (${supersedes} supersedes, ${result.references} references).`);
|
|
162
|
-
if (result.truncated.length > 0) {
|
|
163
|
-
printError(`WARNING: under-extracted (hit the per-type cap): ${result.truncated.join(', ')}. The graph is incomplete for those types.`);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
function graphShow(hippoRoot, tenantId, entity, flags) {
|
|
167
|
-
const model = buildGraphModel(hippoRoot, tenantId, { entity, limit: DEFAULT_VIEW_LIMIT });
|
|
168
|
-
if (flags['json']) {
|
|
169
|
-
console.log(JSON.stringify(model, null, 2));
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
if (model.nodes.length === 0) {
|
|
173
|
-
console.log(entity ? `No entity named "${entity}".` : 'Graph is empty. Run `hippo graph extract` first.');
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
console.log(`Graph: ${model.nodes.length} entities, ${model.edges.length} relations${model.truncated ? ' (truncated)' : ''}`);
|
|
177
|
-
const byType = new Map();
|
|
178
|
-
for (const n of model.nodes) {
|
|
179
|
-
const arr = byType.get(n.type) ?? [];
|
|
180
|
-
arr.push({ id: n.id, name: n.name });
|
|
181
|
-
byType.set(n.type, arr);
|
|
182
|
-
}
|
|
183
|
-
for (const [type, ns] of byType) {
|
|
184
|
-
console.log(`\n${type} (${ns.length}):`);
|
|
185
|
-
for (const n of ns)
|
|
186
|
-
console.log(` [${n.id}] ${n.name}`);
|
|
187
|
-
}
|
|
188
|
-
if (model.edges.length > 0) {
|
|
189
|
-
const nameById = new Map(model.nodes.map((n) => [n.id, n.name]));
|
|
190
|
-
console.log('\nrelations:');
|
|
191
|
-
for (const e of model.edges) {
|
|
192
|
-
console.log(` ${nameById.get(e.from)} --${e.relType}--> ${nameById.get(e.to)}`);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
function openInBrowser(out) {
|
|
197
|
-
// Best-effort browser launch; never fail the command if it doesn't work.
|
|
198
|
-
try {
|
|
199
|
-
const [cmd, cmdArgs] = process.platform === 'win32'
|
|
200
|
-
? ['cmd', ['/c', 'start', '', out]]
|
|
201
|
-
: process.platform === 'darwin'
|
|
202
|
-
? ['open', [out]]
|
|
203
|
-
: ['xdg-open', [out]];
|
|
204
|
-
const child = spawn(cmd, cmdArgs, { detached: true, stdio: 'ignore', windowsHide: true });
|
|
205
|
-
// A missing launcher (e.g. xdg-open absent) emits 'error' asynchronously; unhandled, it would throw,
|
|
206
|
-
// so swallow it: the file is already written and its path printed above.
|
|
207
|
-
child.on('error', () => { });
|
|
208
|
-
child.unref();
|
|
209
|
-
}
|
|
210
|
-
catch (err) {
|
|
211
|
-
// The file is written and its path printed above, so a browser that will not start costs nothing.
|
|
212
|
-
log.debug(`browser not opened: ${errorMessage(err)}`);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
function graphView(hippoRoot, tenantId, entity, flags) {
|
|
216
|
-
const format = stringFlag(flags, 'format') ?? 'html';
|
|
217
|
-
if (format !== 'html' && format !== 'canvas') {
|
|
218
|
-
printError("graph view: --format must be 'html' or 'canvas'");
|
|
219
|
-
throw new CliExit(1);
|
|
220
|
-
}
|
|
221
|
-
const model = buildGraphModel(hippoRoot, tenantId, { entity, limit: DEFAULT_VIEW_LIMIT });
|
|
222
|
-
const content = format === 'canvas' ? renderGraphCanvas(model) : renderGraphHtml(model);
|
|
223
|
-
const defaultOut = format === 'canvas' ? 'hippo-graph.canvas' : 'hippo-graph.html';
|
|
224
|
-
const out = stringFlag(flags, 'out') ?? defaultOut;
|
|
225
|
-
fs.writeFileSync(out, content, 'utf8');
|
|
226
|
-
console.log(`Wrote ${model.nodes.length} entities + ${model.edges.length} relations to ${out}${model.truncated ? ' (truncated)' : ''}`);
|
|
227
|
-
if (flags['open'] && format === 'html')
|
|
228
|
-
openInBrowser(out);
|
|
229
|
-
}
|
|
230
|
-
export function handleGraph({ hippoRoot, tenantId, args, flags }) {
|
|
231
|
-
requireInit(hippoRoot);
|
|
232
|
-
const subcommand = args[0] ?? '';
|
|
233
|
-
if (subcommand === 'extract')
|
|
234
|
-
return graphExtract(hippoRoot, tenantId);
|
|
235
|
-
const entity = stringFlag(flags, 'entity');
|
|
236
|
-
if (subcommand === 'show')
|
|
237
|
-
return graphShow(hippoRoot, tenantId, entity, flags);
|
|
238
|
-
if (subcommand === 'view')
|
|
239
|
-
return graphView(hippoRoot, tenantId, entity, flags);
|
|
240
|
-
printError('Usage:\n' +
|
|
241
|
-
' hippo graph extract Rebuild the entity/relation graph from consolidated objects\n' +
|
|
242
|
-
' hippo graph show [--entity NAME] [--json] Inspect entities + their edges (text or JSON)\n' +
|
|
243
|
-
' hippo graph view [--out FILE] [--open] [--format html|canvas] [--entity NAME] Generate an interactive node-link diagram');
|
|
244
|
-
throw new CliExit(1);
|
|
245
|
-
}
|
|
246
|
-
function noteList(hippoRoot, tenantId, flags) {
|
|
247
|
-
const customer = stringFlag(flags, 'customer')?.trim() || undefined;
|
|
248
|
-
listObjects(flags, {
|
|
249
|
-
plural: 'customer notes',
|
|
250
|
-
states: customerNotesModule.VALID_NOTE_STATES,
|
|
251
|
-
load: (opts) => customerNotesModule.loadCustomerNotes(hippoRoot, tenantId, { ...opts, customer }),
|
|
252
|
-
printRow: printNoteRow,
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
function noteGet(hippoRoot, tenantId, args) {
|
|
256
|
-
const id = idArgOrExit(args, 'Usage: hippo note get <id>', NOTE.idLabel);
|
|
257
|
-
const n = foundOrExit(customerNotesModule.loadCustomerNoteById(hippoRoot, tenantId, id), NOTE.noun, id);
|
|
258
|
-
console.log(`Customer note #${n.id}`);
|
|
259
|
-
console.log(` customer: ${n.customer}`);
|
|
260
|
-
console.log(` status: ${n.status}`);
|
|
261
|
-
console.log(` version: ${n.version}`);
|
|
262
|
-
console.log(` note: ${n.note}`);
|
|
263
|
-
printLifecycleTail(n);
|
|
264
|
-
}
|
|
265
|
-
function noteSupersede(hippoRoot, tenantId, args, flags) {
|
|
266
|
-
const id = idArgOrExit(args, 'Usage: hippo note supersede <id> --text "<note>" [--change "<summary>"]', NOTE.idLabel);
|
|
267
|
-
const textRaw = stringFlag(flags, 'text');
|
|
268
|
-
if (!textRaw?.trim()) {
|
|
269
|
-
printError('hippo note supersede requires --text "<note>" for the new version.');
|
|
270
|
-
throw new CliExit(1);
|
|
271
|
-
}
|
|
272
|
-
const existing = foundOrExit(customerNotesModule.loadCustomerNoteById(hippoRoot, tenantId, id), NOTE.noun, id);
|
|
273
|
-
try {
|
|
274
|
-
const created = customerNotesModule.saveCustomerNote(hippoRoot, tenantId, {
|
|
275
|
-
customer: existing.customer,
|
|
276
|
-
note: textRaw,
|
|
277
|
-
changeSummary: nonEmptyStringFlag(flags, 'change'),
|
|
278
|
-
supersedesNoteId: id,
|
|
279
|
-
extraTags: extractPathTags(process.cwd()),
|
|
280
|
-
});
|
|
281
|
-
console.log(`Customer note #${created.id} recorded (v${created.version}), superseding #${id}.`);
|
|
282
|
-
if (created.memoryId)
|
|
283
|
-
console.log(` memory: ${created.memoryId}`);
|
|
284
|
-
}
|
|
285
|
-
catch (e) {
|
|
286
|
-
printError(errorMessage(e));
|
|
287
|
-
throw new CliExit(1);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
function noteClose(hippoRoot, tenantId, args) {
|
|
291
|
-
closeObject(args, NOTE, (id) => customerNotesModule.closeCustomerNote(hippoRoot, tenantId, id));
|
|
292
|
-
}
|
|
293
|
-
export function handleCustomerNote({ hippoRoot, tenantId, args, flags }) {
|
|
294
|
-
requireInit(hippoRoot);
|
|
295
|
-
const subcommand = args[0] ?? '';
|
|
296
|
-
if (subcommand === 'list')
|
|
297
|
-
return noteList(hippoRoot, tenantId, flags);
|
|
298
|
-
if (subcommand === 'get')
|
|
299
|
-
return noteGet(hippoRoot, tenantId, args);
|
|
300
|
-
if (subcommand === 'supersede')
|
|
301
|
-
return noteSupersede(hippoRoot, tenantId, args, flags);
|
|
302
|
-
if (subcommand === 'close')
|
|
303
|
-
return noteClose(hippoRoot, tenantId, args);
|
|
304
|
-
// Default subcommand: new (create). Accept both `note new "<customer>"` and the
|
|
305
|
-
// bare `note "<customer>"` form: for the `new` keyword the customer is args[1].
|
|
306
|
-
const customer = subcommand === 'new' ? (args[1] ?? '') : subcommand;
|
|
307
|
-
const textRaw = stringFlag(flags, 'text');
|
|
308
|
-
if (!customer || !textRaw?.trim()) {
|
|
309
|
-
noteUsage();
|
|
310
|
-
throw new CliExit(1);
|
|
311
|
-
}
|
|
312
|
-
try {
|
|
313
|
-
const created = customerNotesModule.saveCustomerNote(hippoRoot, tenantId, {
|
|
314
|
-
customer,
|
|
315
|
-
note: textRaw,
|
|
316
|
-
extraTags: extractPathTags(process.cwd()),
|
|
317
|
-
});
|
|
318
|
-
console.log(`Customer note recorded: #${created.id} (v${created.version}) for customer "${created.customer}"`);
|
|
319
|
-
if (created.memoryId)
|
|
320
|
-
console.log(` memory: ${created.memoryId}`);
|
|
321
|
-
}
|
|
322
|
-
catch (e) {
|
|
323
|
-
printError(errorMessage(e));
|
|
324
|
-
throw new CliExit(1);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
39
|
+
const briefKind = (hippoRoot, tenantId) => ({
|
|
40
|
+
names: { cmd: 'brief', noun: 'Project brief', idLabel: 'brief' },
|
|
41
|
+
plural: 'project briefs',
|
|
42
|
+
states: briefsModule.VALID_BRIEF_STATES,
|
|
43
|
+
usage: [
|
|
44
|
+
'Usage: hippo brief new "<repo>" --summary "<text>"',
|
|
45
|
+
' hippo brief list [--status active|superseded|closed|all] [--repo "<repo>"] [--limit N]',
|
|
46
|
+
' hippo brief get <id>',
|
|
47
|
+
' hippo brief supersede <id> --summary "<text>" [--change "<summary>"]',
|
|
48
|
+
' hippo brief close <id>',
|
|
49
|
+
' hippo brief refresh "<repo>" [--dry-run] (auto-assemble the brief from the repo\'s receipts)',
|
|
50
|
+
],
|
|
51
|
+
supersedeUsage: 'Usage: hippo brief supersede <id> --summary "<text>" [--change "<summary>"]',
|
|
52
|
+
bodyRequired: '--summary "<text>"',
|
|
53
|
+
body: (flags) => requiredText(flags, 'summary'),
|
|
54
|
+
keyOf: (b) => b.repo,
|
|
55
|
+
save: (repo, summary, extraTags, from) => briefsModule.saveProjectBrief(hippoRoot, tenantId, {
|
|
56
|
+
repo, summary, extraTags, changeSummary: from?.changeSummary, supersedesBriefId: from?.id,
|
|
57
|
+
}),
|
|
58
|
+
recorded: (b) => `Project brief recorded: #${b.id} (v${b.version}) for repo "${b.repo}"`,
|
|
59
|
+
list: (opts, flags) => briefsModule.loadProjectBriefs(hippoRoot, tenantId, { ...opts, repo: stringFlag(flags, 'repo')?.trim() || undefined }),
|
|
60
|
+
loadById: (id) => briefsModule.loadProjectBriefById(hippoRoot, tenantId, id),
|
|
61
|
+
close: (id) => briefsModule.closeProjectBrief(hippoRoot, tenantId, id),
|
|
62
|
+
printRow: printBriefRow,
|
|
63
|
+
printDetail: (b) => {
|
|
64
|
+
console.log(` repo: ${b.repo}`);
|
|
65
|
+
console.log(` status: ${b.status}`);
|
|
66
|
+
console.log(` version: ${b.version}`);
|
|
67
|
+
console.log(` summary: ${b.summary}`);
|
|
68
|
+
},
|
|
69
|
+
extra: { sub: 'refresh', run: (args, flags) => briefRefresh(hippoRoot, tenantId, args, flags) },
|
|
70
|
+
});
|
|
71
|
+
export const handleProjectBrief = versionedVerbs(briefKind);
|
|
327
72
|
//# sourceMappingURL=briefs.js.map
|
package/dist/cli/card.js
CHANGED
|
@@ -1,13 +1,28 @@
|
|
|
1
1
|
// The `hippo card` verb (the agent work board); main() loads it lazily from the command table.
|
|
2
|
-
import
|
|
2
|
+
import * as cardsApi from '../api/cards.js';
|
|
3
|
+
import { cliApiContext } from './api-context.js';
|
|
3
4
|
import { isHandoffOutcome } from '../core/handoff.js';
|
|
4
5
|
import { isCardStatus } from '../core/card.js';
|
|
5
|
-
import { loadCardDetail } from '../store/card-detail.js';
|
|
6
6
|
import { printError } from './output.js';
|
|
7
7
|
import { stringFlagOrExit } from './flag-values.js';
|
|
8
8
|
import { requireInit } from './shared.js';
|
|
9
9
|
import { errorMessage } from '../util/log.js';
|
|
10
10
|
import { CliExit } from './exit.js';
|
|
11
|
+
// Each subcommand's usage line, written once so the repeated checks cannot drift.
|
|
12
|
+
const CARD_USAGE = {
|
|
13
|
+
create: 'hippo card create --title "..." [--repo <name>] [--contract <text>] [--budget <n>] [--depends-on <id>...]',
|
|
14
|
+
show: 'hippo card show <id> [--json]',
|
|
15
|
+
claim: 'hippo card claim <id> --runtime <name> [--session <id>]',
|
|
16
|
+
heartbeat: 'hippo card heartbeat <id> --run <n>',
|
|
17
|
+
review: 'hippo card review <id> [--run <n>]',
|
|
18
|
+
complete: 'hippo card complete <id> --outcome <success|failure|partial> [--run <n>]',
|
|
19
|
+
reclaim: 'hippo card reclaim (sweeps every expired lease; use hippo card block <id> for one card)',
|
|
20
|
+
comment: 'hippo card comment <id> --body "..." [--author <name>]',
|
|
21
|
+
};
|
|
22
|
+
function usageError(sub) {
|
|
23
|
+
printError(`Usage: ${CARD_USAGE[sub]}`);
|
|
24
|
+
return new CliExit(1);
|
|
25
|
+
}
|
|
11
26
|
// Mirrors ARCHIVE_REASON_REQUIRED so the block message can't drift from its usage line.
|
|
12
27
|
const CARD_BLOCK_REASON_REQUIRED = 'hippo card block <id> requires --reason "<why>" (recorded as a comment).';
|
|
13
28
|
function printCard(detail) {
|
|
@@ -65,8 +80,9 @@ function cardRunFlag(flags) {
|
|
|
65
80
|
}
|
|
66
81
|
// Reads after the store already refused, so this only explains the refusal, never changes it.
|
|
67
82
|
function cardRefusal(hippoRoot, tenantId, id) {
|
|
68
|
-
const
|
|
69
|
-
const
|
|
83
|
+
const ctx = cliApiContext(hippoRoot, tenantId);
|
|
84
|
+
const card = cardsApi.cardLoad(ctx, id);
|
|
85
|
+
const liveRun = cardsApi.cardRuns(ctx, id).find((r) => !r.ended);
|
|
70
86
|
return `status ${card?.status ?? 'unknown'}, live run ${liveRun?.id ?? 'none'}`;
|
|
71
87
|
}
|
|
72
88
|
const CARD_SUBCOMMAND_FLAGS = {
|
|
@@ -104,8 +120,7 @@ export function handleCard({ hippoRoot, tenantId, args, flags }) {
|
|
|
104
120
|
function cardCreate(hippoRoot, tenantId, _args, flags) {
|
|
105
121
|
const title = stringFlagOrExit(flags, 'title') ?? '';
|
|
106
122
|
if (!title) {
|
|
107
|
-
|
|
108
|
-
throw new CliExit(1);
|
|
123
|
+
throw usageError('create');
|
|
109
124
|
}
|
|
110
125
|
const repo = stringFlagOrExit(flags, 'repo') || undefined;
|
|
111
126
|
const contract = stringFlagOrExit(flags, 'contract') || undefined;
|
|
@@ -126,7 +141,7 @@ function cardCreate(hippoRoot, tenantId, _args, flags) {
|
|
|
126
141
|
const dependsOn = Array.isArray(dependsOnFlag) ? dependsOnFlag : [];
|
|
127
142
|
let card;
|
|
128
143
|
try {
|
|
129
|
-
card =
|
|
144
|
+
card = cardsApi.cardCreate(cliApiContext(hippoRoot, tenantId), { title, repo, contract, budget, dependsOn });
|
|
130
145
|
}
|
|
131
146
|
catch (error) {
|
|
132
147
|
printError(errorMessage(error));
|
|
@@ -137,10 +152,9 @@ function cardCreate(hippoRoot, tenantId, _args, flags) {
|
|
|
137
152
|
function cardShow(hippoRoot, tenantId, args, flags) {
|
|
138
153
|
const id = args[1];
|
|
139
154
|
if (!id) {
|
|
140
|
-
|
|
141
|
-
throw new CliExit(1);
|
|
155
|
+
throw usageError('show');
|
|
142
156
|
}
|
|
143
|
-
const detail =
|
|
157
|
+
const detail = cardsApi.cardDetail(cliApiContext(hippoRoot, tenantId), id);
|
|
144
158
|
if (!detail) {
|
|
145
159
|
printError(`No card found with id ${id}.`);
|
|
146
160
|
throw new CliExit(1);
|
|
@@ -157,7 +171,7 @@ function cardList(hippoRoot, tenantId, _args, flags) {
|
|
|
157
171
|
printError(`Invalid status: "${status}".`);
|
|
158
172
|
throw new CliExit(1);
|
|
159
173
|
}
|
|
160
|
-
const cards =
|
|
174
|
+
const cards = cardsApi.cardList(cliApiContext(hippoRoot, tenantId), { status });
|
|
161
175
|
if (flags['json']) {
|
|
162
176
|
console.log(JSON.stringify({ cards }, null, 2));
|
|
163
177
|
return;
|
|
@@ -174,13 +188,12 @@ function cardClaim(hippoRoot, tenantId, args, flags) {
|
|
|
174
188
|
const id = args[1];
|
|
175
189
|
const runtime = stringFlagOrExit(flags, 'runtime') ?? '';
|
|
176
190
|
if (!id || !runtime) {
|
|
177
|
-
|
|
178
|
-
throw new CliExit(1);
|
|
191
|
+
throw usageError('claim');
|
|
179
192
|
}
|
|
180
193
|
const sessionId = stringFlagOrExit(flags, 'session') || undefined;
|
|
181
194
|
let card;
|
|
182
195
|
try {
|
|
183
|
-
card =
|
|
196
|
+
card = cardsApi.cardClaim(cliApiContext(hippoRoot, tenantId), id, runtime, sessionId);
|
|
184
197
|
}
|
|
185
198
|
catch (error) {
|
|
186
199
|
printError(errorMessage(error));
|
|
@@ -196,12 +209,11 @@ function cardHeartbeat(hippoRoot, tenantId, args, flags) {
|
|
|
196
209
|
const id = args[1];
|
|
197
210
|
const runId = cardRunFlag(flags);
|
|
198
211
|
if (!id || runId === undefined) {
|
|
199
|
-
|
|
200
|
-
throw new CliExit(1);
|
|
212
|
+
throw usageError('heartbeat');
|
|
201
213
|
}
|
|
202
214
|
let card;
|
|
203
215
|
try {
|
|
204
|
-
card =
|
|
216
|
+
card = cardsApi.cardHeartbeat(cliApiContext(hippoRoot, tenantId), id, runId);
|
|
205
217
|
}
|
|
206
218
|
catch (error) {
|
|
207
219
|
printError(errorMessage(error));
|
|
@@ -223,7 +235,7 @@ function cardBlock(hippoRoot, tenantId, args, flags) {
|
|
|
223
235
|
const runId = cardRunFlag(flags);
|
|
224
236
|
let card;
|
|
225
237
|
try {
|
|
226
|
-
card =
|
|
238
|
+
card = cardsApi.cardBlock(cliApiContext(hippoRoot, tenantId), id, reason, runId);
|
|
227
239
|
}
|
|
228
240
|
catch (error) {
|
|
229
241
|
printError(errorMessage(error));
|
|
@@ -239,13 +251,12 @@ function cardBlock(hippoRoot, tenantId, args, flags) {
|
|
|
239
251
|
function cardReview(hippoRoot, tenantId, args, flags) {
|
|
240
252
|
const id = args[1];
|
|
241
253
|
if (!id) {
|
|
242
|
-
|
|
243
|
-
throw new CliExit(1);
|
|
254
|
+
throw usageError('review');
|
|
244
255
|
}
|
|
245
256
|
const runId = cardRunFlag(flags);
|
|
246
257
|
let card;
|
|
247
258
|
try {
|
|
248
|
-
card =
|
|
259
|
+
card = cardsApi.cardReview(cliApiContext(hippoRoot, tenantId), id, runId);
|
|
249
260
|
}
|
|
250
261
|
catch (error) {
|
|
251
262
|
printError(errorMessage(error));
|
|
@@ -262,13 +273,12 @@ function cardComplete(hippoRoot, tenantId, args, flags) {
|
|
|
262
273
|
const id = args[1];
|
|
263
274
|
const outcomeRaw = flags['outcome'];
|
|
264
275
|
if (!id || !isHandoffOutcome(outcomeRaw)) {
|
|
265
|
-
|
|
266
|
-
throw new CliExit(1);
|
|
276
|
+
throw usageError('complete');
|
|
267
277
|
}
|
|
268
278
|
const runId = cardRunFlag(flags);
|
|
269
279
|
let result;
|
|
270
280
|
try {
|
|
271
|
-
result =
|
|
281
|
+
result = cardsApi.cardComplete(cliApiContext(hippoRoot, tenantId), id, outcomeRaw, runId);
|
|
272
282
|
}
|
|
273
283
|
catch (error) {
|
|
274
284
|
printError(errorMessage(error));
|
|
@@ -286,10 +296,9 @@ function cardComplete(hippoRoot, tenantId, args, flags) {
|
|
|
286
296
|
}
|
|
287
297
|
function cardReclaim(hippoRoot, tenantId, args) {
|
|
288
298
|
if (args.length > 1) {
|
|
289
|
-
|
|
290
|
-
throw new CliExit(1);
|
|
299
|
+
throw usageError('reclaim');
|
|
291
300
|
}
|
|
292
|
-
const ids =
|
|
301
|
+
const ids = cardsApi.cardReclaimExpired(cliApiContext(hippoRoot, tenantId));
|
|
293
302
|
if (ids.length === 0) {
|
|
294
303
|
console.log('No expired leases.');
|
|
295
304
|
return;
|
|
@@ -301,22 +310,21 @@ function cardReclaim(hippoRoot, tenantId, args) {
|
|
|
301
310
|
function cardComment(hippoRoot, tenantId, args, flags) {
|
|
302
311
|
const id = args[1];
|
|
303
312
|
if (!id) {
|
|
304
|
-
|
|
305
|
-
throw new CliExit(1);
|
|
313
|
+
throw usageError('comment');
|
|
306
314
|
}
|
|
307
315
|
// Only show and comment look the card up directly; claim/heartbeat/block/review/complete throw from the store instead.
|
|
308
|
-
const
|
|
316
|
+
const ctx = cliApiContext(hippoRoot, tenantId);
|
|
317
|
+
const card = cardsApi.cardLoad(ctx, id);
|
|
309
318
|
if (!card) {
|
|
310
319
|
printError(`No card found with id ${id}.`);
|
|
311
320
|
throw new CliExit(1);
|
|
312
321
|
}
|
|
313
322
|
const body = stringFlagOrExit(flags, 'body') ?? '';
|
|
314
323
|
if (!body) {
|
|
315
|
-
|
|
316
|
-
throw new CliExit(1);
|
|
324
|
+
throw usageError('comment');
|
|
317
325
|
}
|
|
318
326
|
const author = stringFlagOrExit(flags, 'author') || 'cli';
|
|
319
|
-
const comment =
|
|
327
|
+
const comment = cardsApi.cardComment(ctx, id, author, body);
|
|
320
328
|
console.log(`Added comment ${comment.id} to card ${id}`);
|
|
321
329
|
}
|
|
322
330
|
const CARD_HANDLERS = {
|
package/dist/cli/client.d.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
/** HTTP client wrapper for `hippo serve`: only the routed writes (remember, forget, archive, promote); every other command opens the store directly.
|
|
2
2
|
* Server errors rethrow with the message verbatim so CLI substring matches still work; network errors propagate as the native fetch failure. */
|
|
3
3
|
import type { RememberOpts, RememberResult } from '../api/index.js';
|
|
4
|
-
/** An error the server answered with, not one the transport raised
|
|
5
|
-
* and a server message quotes the caller's own id or content back verbatim. */
|
|
4
|
+
/** An error the server answered with, not one the transport raised, so the transport classifier can skip it by class. */
|
|
6
5
|
export declare class HttpResponseError extends Error {
|
|
7
6
|
readonly status: number;
|
|
8
7
|
constructor(message: string, status: number);
|
|
9
8
|
}
|
|
9
|
+
/** A 2xx reply that is not the JSON object the route promises: another process may now own the pidfile's port. */
|
|
10
|
+
export declare class MalformedReplyError extends Error {
|
|
11
|
+
readonly route: string;
|
|
12
|
+
constructor(route: string, detail: string);
|
|
13
|
+
}
|
|
10
14
|
export declare function remember(serverUrl: string, apiKey: string | undefined, opts: RememberOpts): Promise<RememberResult>;
|
|
11
15
|
export declare function forget(serverUrl: string, apiKey: string | undefined, id: string): Promise<{
|
|
12
16
|
ok: true;
|