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.js
CHANGED
|
@@ -1,39 +1,31 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// Hippo CLI entry point: parses argv and dispatches each verb through the table
|
|
2
|
+
// Hippo CLI entry point: parses argv and dispatches each verb through the table in cli/verbs.ts.
|
|
3
3
|
// `hippo help` prints the verb list from that table, so no list is kept here.
|
|
4
4
|
import { envSkipAutoIntegrations } from './util/env.js';
|
|
5
5
|
import * as path from 'path';
|
|
6
6
|
import * as fs from 'fs';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
8
|
import { repairCodexWrapperIfInstalled } from './hooks/codex-wrapper.js';
|
|
9
|
-
import { getHippoRoot } from './
|
|
9
|
+
import { getHippoRoot } from './core/project-identity.js';
|
|
10
10
|
import { resolveTenantId } from './store/tenant.js';
|
|
11
|
-
import {
|
|
11
|
+
import { printGitHubBackfillUsage } from './cli/github.js';
|
|
12
12
|
import { printError } from './cli/output.js';
|
|
13
13
|
import { errorFields, errorMessage, isLevelEnabled, log } from './util/log.js';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
14
|
+
import { STORE_BUSY_MESSAGE } from './store/port.js';
|
|
15
|
+
import { isStoreBusy } from './store/sqlite/busy.js';
|
|
16
|
+
import { flagIsTrue, isBooleanFlag, isStringFlag } from './cli/flag-values.js';
|
|
17
|
+
import { USAGE_HEADER, USAGE_EXAMPLES, printAuditPruneUsage, printSlackBackfillUsage, printSlackWorkspacesUsage } from './cli/usage.js';
|
|
18
|
+
import { flagKind, isKnownFlag, undeclaredFlags } from './cli/flags.js';
|
|
19
|
+
import { COMMANDS } from './cli/verbs.js';
|
|
18
20
|
import { CliExit } from './cli/exit.js';
|
|
19
21
|
// Helpers
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
// Commands that honour --dry-run. Any other command would ignore it and run for real.
|
|
25
|
-
const DRY_RUN_COMMANDS = new Set([
|
|
26
|
-
'audit', 'capture', 'dedup', 'forget', 'import', 'invalidate', 'refine', 'setup', 'sleep',
|
|
27
|
-
]);
|
|
28
|
-
// share and brief honour --dry-run in one form only; their other forms write for real.
|
|
29
|
-
function dryRunRefusal(command, args, flags) {
|
|
30
|
-
const isBrief = command === 'brief' || command === 'project-brief';
|
|
31
|
-
const onlyForm = command === 'share' ? 'share --auto' : isBrief ? `${command} refresh` : null;
|
|
32
|
-
const honoured = command === 'share' ? args[0] === '--auto' || boolFlag(flags, 'auto')
|
|
33
|
-
: isBrief ? args[0] === 'refresh' : DRY_RUN_COMMANDS.has(command);
|
|
22
|
+
// A command that does not honour --dry-run would ignore it and run for real.
|
|
23
|
+
function dryRunRefusal(command, spec, args, flags) {
|
|
24
|
+
const only = spec?.dryRun;
|
|
25
|
+
const honoured = only === undefined ? spec?.flags.switches?.includes('dry-run') : only !== false && only.honoured(args, flags);
|
|
34
26
|
if (honoured)
|
|
35
27
|
return null;
|
|
36
|
-
const where =
|
|
28
|
+
const where = only ? ` outside \`hippo ${command} ${only.form}\`` : '';
|
|
37
29
|
return `hippo ${command} has no --dry-run${where}, so it would run for real. Nothing was changed.`;
|
|
38
30
|
}
|
|
39
31
|
function pushRepeatableFlag(flags, key, value) {
|
|
@@ -115,9 +107,8 @@ export function parseArgs(argv) {
|
|
|
115
107
|
export function shouldAutoRepairCodexWrapper(currentCommand, flags) {
|
|
116
108
|
if (envSkipAutoIntegrations())
|
|
117
109
|
return false;
|
|
118
|
-
if (!
|
|
110
|
+
if (!COMMAND_INDEX.get(currentCommand)?.repairsCodexWrapper)
|
|
119
111
|
return false;
|
|
120
|
-
}
|
|
121
112
|
if (currentCommand === 'init' && flagIsTrue(flags, 'no-hooks'))
|
|
122
113
|
return false;
|
|
123
114
|
return true;
|
|
@@ -134,294 +125,10 @@ function maybeRepairCodexWrapper(currentCommand, flags) {
|
|
|
134
125
|
log.debug(`codex wrapper not repaired: ${errorMessage(err)}`);
|
|
135
126
|
}
|
|
136
127
|
}
|
|
137
|
-
|
|
138
|
-
/** Every verb main() dispatches, keyed by name; a verb without a VERB_FLAGS entry, or the reverse, fails to compile. */
|
|
139
|
-
export const VERB_HANDLERS = {
|
|
140
|
-
init: {
|
|
141
|
-
run: async (c) => { (await import('./cli/init.js')).handleInit(c); },
|
|
142
|
-
},
|
|
143
|
-
remember: {
|
|
144
|
-
run: async (c) => { await (await import('./cli/remember.js')).handleRemember(c); },
|
|
145
|
-
},
|
|
146
|
-
recall: {
|
|
147
|
-
run: async (c) => { await (await import('./cli/recall.js')).handleRecall(c); },
|
|
148
|
-
scoped: true,
|
|
149
|
-
},
|
|
150
|
-
drill: {
|
|
151
|
-
run: async (c) => { await (await import('./cli/dag.js')).handleDrill(c); },
|
|
152
|
-
scoped: true,
|
|
153
|
-
},
|
|
154
|
-
assemble: {
|
|
155
|
-
run: async (c) => { await (await import('./cli/dag.js')).handleAssemble(c); },
|
|
156
|
-
scoped: true,
|
|
157
|
-
},
|
|
158
|
-
supersede: {
|
|
159
|
-
run: async (c) => { await (await import('./cli/remember.js')).handleSupersede(c); },
|
|
160
|
-
},
|
|
161
|
-
explain: {
|
|
162
|
-
run: async (c) => { await (await import('./cli/explain.js')).handleExplain(c); },
|
|
163
|
-
scoped: true,
|
|
164
|
-
},
|
|
165
|
-
eval: {
|
|
166
|
-
run: async (c) => { await (await import('./cli/eval.js')).handleEval(c); },
|
|
167
|
-
},
|
|
168
|
-
trace: {
|
|
169
|
-
run: async (c) => { await (await import('./cli/remember.js')).handleTrace(c); },
|
|
170
|
-
},
|
|
171
|
-
refine: {
|
|
172
|
-
run: async (c) => { await (await import('./cli/maintenance.js')).handleRefine(c); },
|
|
173
|
-
},
|
|
174
|
-
sleep: {
|
|
175
|
-
run: async (c) => { await (await import('./cli/sleep.js')).handleSleep(c); },
|
|
176
|
-
scoped: true,
|
|
177
|
-
},
|
|
178
|
-
'last-sleep': {
|
|
179
|
-
run: async (c) => { (await import('./cli/last-sleep.js')).handleLastSleep(c); },
|
|
180
|
-
},
|
|
181
|
-
'session-end': {
|
|
182
|
-
run: async (c) => { await (await import('./cli/session-hooks.js')).handleSessionEnd(c); },
|
|
183
|
-
},
|
|
184
|
-
'__session-end-worker': {
|
|
185
|
-
run: async (c) => { await (await import('./cli/session-hooks.js')).handleSessionEndWorker(c); },
|
|
186
|
-
},
|
|
187
|
-
'pre-compact': {
|
|
188
|
-
run: async (c) => { await (await import('./cli/session-hooks.js')).handlePreCompact(c); },
|
|
189
|
-
},
|
|
190
|
-
'post-compact': {
|
|
191
|
-
run: async (c) => { await (await import('./cli/session-hooks.js')).handlePostCompact(c); },
|
|
192
|
-
},
|
|
193
|
-
'capture-error': {
|
|
194
|
-
run: async (c) => { await (await import('./cli/session-hooks.js')).handleCaptureError(c); },
|
|
195
|
-
},
|
|
196
|
-
'compact-resume': {
|
|
197
|
-
run: async (c) => { await (await import('./cli/session-hooks.js')).handleCompactResume(c); },
|
|
198
|
-
},
|
|
199
|
-
'codex-run': {
|
|
200
|
-
run: async (c) => { (await import('./cli/session-hooks.js')).handleCodexRun(c); },
|
|
201
|
-
},
|
|
202
|
-
'__codex-session-end-worker': {
|
|
203
|
-
run: async (c) => { await (await import('./cli/session-hooks.js')).handleCodexSessionEndWorker(c); },
|
|
204
|
-
},
|
|
205
|
-
dedup: {
|
|
206
|
-
run: async (c) => { (await import('./cli/maintenance.js')).handleDedup(c); },
|
|
207
|
-
},
|
|
208
|
-
dag: {
|
|
209
|
-
run: async (c) => { (await import('./cli/dag.js')).handleDag(c); },
|
|
210
|
-
},
|
|
211
|
-
auth: {
|
|
212
|
-
run: async (c) => { (await import('./cli/auth.js')).handleAuth(c); },
|
|
213
|
-
scoped: true,
|
|
214
|
-
},
|
|
215
|
-
goal: {
|
|
216
|
-
run: async (c) => { (await import('./cli/goals.js')).handleGoal(c); },
|
|
217
|
-
scoped: true,
|
|
218
|
-
},
|
|
219
|
-
slack: {
|
|
220
|
-
run: async (c) => { await (await import('./cli/slack.js')).handleSlack(c); },
|
|
221
|
-
},
|
|
222
|
-
github: {
|
|
223
|
-
run: async (c) => { await handleGitHub(c); },
|
|
224
|
-
},
|
|
225
|
-
audit: {
|
|
226
|
-
run: async (c) => { await (await import('./cli/audit.js')).handleAudit(c); },
|
|
227
|
-
scoped: true,
|
|
228
|
-
},
|
|
229
|
-
'correction-latency': {
|
|
230
|
-
run: async (c) => { await (await import('./cli/status.js')).handleCorrectionLatency(c); },
|
|
231
|
-
},
|
|
232
|
-
provenance: {
|
|
233
|
-
run: async (c) => { await (await import('./cli/status.js')).handleProvenance(c); },
|
|
234
|
-
},
|
|
235
|
-
status: {
|
|
236
|
-
run: async (c) => { (await import('./cli/status.js')).handleStatus(c); },
|
|
237
|
-
},
|
|
238
|
-
outcome: {
|
|
239
|
-
run: async (c) => { (await import('./cli/curate.js')).handleOutcome(c); },
|
|
240
|
-
scoped: true,
|
|
241
|
-
},
|
|
242
|
-
conflicts: {
|
|
243
|
-
run: async (c) => { (await import('./cli/curate.js')).handleConflicts(c); },
|
|
244
|
-
},
|
|
245
|
-
resolve: {
|
|
246
|
-
run: async (c) => { await (await import('./cli/curate.js')).handleResolve(c); },
|
|
247
|
-
},
|
|
248
|
-
reject: {
|
|
249
|
-
run: async (c) => { (await import('./cli/curate.js')).handleReject(c); },
|
|
250
|
-
},
|
|
251
|
-
rejections: {
|
|
252
|
-
run: async (c) => { (await import('./cli/curate.js')).handleRejections(c); },
|
|
253
|
-
},
|
|
254
|
-
unreject: {
|
|
255
|
-
run: async (c) => { (await import('./cli/curate.js')).handleUnreject(c); },
|
|
256
|
-
},
|
|
257
|
-
dormant: {
|
|
258
|
-
run: async (c) => { (await import('./cli/curate.js')).handleDormant(c); },
|
|
259
|
-
scoped: true,
|
|
260
|
-
},
|
|
261
|
-
projects: {
|
|
262
|
-
run: async (c) => { (await import('./cli/projects.js')).handleProjects(c); },
|
|
263
|
-
},
|
|
264
|
-
quarantine: {
|
|
265
|
-
run: async (c) => { await (await import('./cli/curate.js')).handleQuarantine(c); },
|
|
266
|
-
scoped: true,
|
|
267
|
-
},
|
|
268
|
-
tokens: {
|
|
269
|
-
run: async (c) => { (await import('./cli/status.js')).handleTokens(c); },
|
|
270
|
-
scoped: true,
|
|
271
|
-
},
|
|
272
|
-
failures: {
|
|
273
|
-
run: async (c) => { (await import('./cli/status.js')).handleFailures(c); },
|
|
274
|
-
scoped: true,
|
|
275
|
-
},
|
|
276
|
-
doctor: {
|
|
277
|
-
run: async (c) => { await (await import('./cli/status.js')).handleDoctor(c); },
|
|
278
|
-
},
|
|
279
|
-
'support-bundle': {
|
|
280
|
-
run: async (c) => { await (await import('./cli/status.js')).handleSupportBundle(c); },
|
|
281
|
-
},
|
|
282
|
-
snapshot: {
|
|
283
|
-
run: async (c) => { (await import('./cli/continuity.js')).handleSnapshot(c); },
|
|
284
|
-
},
|
|
285
|
-
session: {
|
|
286
|
-
run: async (c) => { (await import('./cli/continuity.js')).handleSession(c); },
|
|
287
|
-
},
|
|
288
|
-
handoff: {
|
|
289
|
-
run: async (c) => { (await import('./cli/continuity.js')).handleHandoff(c); },
|
|
290
|
-
},
|
|
291
|
-
card: {
|
|
292
|
-
run: async (c) => { (await import('./cli/card.js')).handleCard(c); },
|
|
293
|
-
},
|
|
294
|
-
predict: {
|
|
295
|
-
run: async (c) => { (await import('./cli/decisions.js')).handlePredict(c); },
|
|
296
|
-
},
|
|
297
|
-
current: {
|
|
298
|
-
run: async (c) => { (await import('./cli/continuity.js')).handleCurrent(c); },
|
|
299
|
-
},
|
|
300
|
-
forget: {
|
|
301
|
-
run: async (c) => { await (await import('./cli/curate.js')).handleForget(c); },
|
|
302
|
-
scoped: true,
|
|
303
|
-
},
|
|
304
|
-
inspect: {
|
|
305
|
-
run: async (c) => { await (await import('./cli/status.js')).handleInspect(c); },
|
|
306
|
-
},
|
|
307
|
-
context: {
|
|
308
|
-
run: async (c) => { await (await import('./cli/context.js')).handleContext(c); },
|
|
309
|
-
},
|
|
310
|
-
hook: {
|
|
311
|
-
run: async (c) => { (await import('./cli/setup.js')).handleHook(c); },
|
|
312
|
-
},
|
|
313
|
-
setup: {
|
|
314
|
-
run: async (c) => { (await import('./cli/setup.js')).handleSetup(c); },
|
|
315
|
-
},
|
|
316
|
-
'daily-runner': {
|
|
317
|
-
run: async (c) => { (await import('./cli/setup.js')).handleDailyRunner(c); },
|
|
318
|
-
},
|
|
319
|
-
embed: {
|
|
320
|
-
run: async (c) => { await (await import('./cli/maintenance.js')).handleEmbed(c); },
|
|
321
|
-
},
|
|
322
|
-
watch: {
|
|
323
|
-
run: async (c) => { await (await import('./cli/transfer.js')).handleWatch(c); },
|
|
324
|
-
},
|
|
325
|
-
learn: {
|
|
326
|
-
run: async (c) => { (await import('./cli/transfer.js')).handleLearn(c); },
|
|
327
|
-
scoped: true,
|
|
328
|
-
},
|
|
329
|
-
promote: {
|
|
330
|
-
run: async (c) => { await (await import('./cli/transfer.js')).handlePromote(c); },
|
|
331
|
-
scoped: true,
|
|
332
|
-
},
|
|
333
|
-
sync: {
|
|
334
|
-
run: async (c) => { (await import('./cli/transfer.js')).handleSync(c); },
|
|
335
|
-
},
|
|
336
|
-
share: {
|
|
337
|
-
run: async (c) => { await (await import('./cli/transfer.js')).handleShare(c); },
|
|
338
|
-
},
|
|
339
|
-
peers: {
|
|
340
|
-
run: async (c) => { await (await import('./cli/transfer.js')).handlePeers(c); },
|
|
341
|
-
},
|
|
342
|
-
import: {
|
|
343
|
-
run: async (c) => { (await import('./cli/transfer.js')).handleImport(c); },
|
|
344
|
-
},
|
|
345
|
-
export: {
|
|
346
|
-
run: async (c) => { await (await import('./cli/transfer.js')).handleExport(c); },
|
|
347
|
-
},
|
|
348
|
-
capture: {
|
|
349
|
-
run: async (c) => { await (await import('./cli/session-hooks.js')).handleCapture(c); },
|
|
350
|
-
},
|
|
351
|
-
dashboard: {
|
|
352
|
-
run: async (c) => { await (await import('./cli/serve.js')).handleDashboard(c); },
|
|
353
|
-
},
|
|
354
|
-
wm: {
|
|
355
|
-
run: async (c) => { (await import('./cli/continuity.js')).handleWm(c); },
|
|
356
|
-
},
|
|
357
|
-
mcp: {
|
|
358
|
-
run: async () => { await (await import('./cli/serve.js')).handleMcp(); },
|
|
359
|
-
},
|
|
360
|
-
serve: {
|
|
361
|
-
run: async (c) => { await (await import('./cli/serve.js')).handleServe(c); },
|
|
362
|
-
},
|
|
363
|
-
invalidate: {
|
|
364
|
-
run: async (c) => { await (await import('./cli/curate.js')).handleInvalidate(c); },
|
|
365
|
-
},
|
|
366
|
-
decide: {
|
|
367
|
-
run: async (c) => { await (await import('./cli/decisions.js')).handleDecide(c); },
|
|
368
|
-
},
|
|
369
|
-
incident: {
|
|
370
|
-
run: async (c) => { (await import('./cli/decisions.js')).handleIncident(c); },
|
|
371
|
-
},
|
|
372
|
-
process: {
|
|
373
|
-
run: async (c) => { (await import('./cli/playbooks.js')).handleProcess(c); },
|
|
374
|
-
},
|
|
375
|
-
policy: {
|
|
376
|
-
run: async (c) => { (await import('./cli/playbooks.js')).handlePolicy(c); },
|
|
377
|
-
},
|
|
378
|
-
skill: {
|
|
379
|
-
run: async (c) => { (await import('./cli/playbooks.js')).handleSkill(c); },
|
|
380
|
-
},
|
|
381
|
-
brief: {
|
|
382
|
-
run: async (c) => { (await import('./cli/briefs.js')).handleProjectBrief(c); },
|
|
383
|
-
aliases: ['project-brief'],
|
|
384
|
-
},
|
|
385
|
-
note: {
|
|
386
|
-
run: async (c) => { (await import('./cli/briefs.js')).handleCustomerNote(c); },
|
|
387
|
-
aliases: ['customer-note'],
|
|
388
|
-
},
|
|
389
|
-
graph: {
|
|
390
|
-
run: async (c) => { (await import('./cli/briefs.js')).handleGraph(c); },
|
|
391
|
-
},
|
|
392
|
-
};
|
|
393
|
-
const USAGE_BLOCKS = VERB_USAGE;
|
|
394
|
-
const FLAGS_BY_VERB = VERB_FLAGS;
|
|
395
|
-
function buildCommands() {
|
|
396
|
-
const specs = Object.entries(VERB_HANDLERS).map(([verb, handler]) => {
|
|
397
|
-
const spec = { ...handler, usage: USAGE_BLOCKS[verb] ?? [], flags: FLAGS_BY_VERB[verb] };
|
|
398
|
-
return [verb, spec];
|
|
399
|
-
});
|
|
400
|
-
// SAFETY: VERB_HANDLERS is checked above to have exactly the VerbName keys, so every key is present.
|
|
401
|
-
return Object.fromEntries(specs);
|
|
402
|
-
}
|
|
403
|
-
/** Every verb's handler, aliases, help blocks and flags, keyed by name. */
|
|
404
|
-
export const COMMANDS = buildCommands();
|
|
128
|
+
const ROWS = Object.values(COMMANDS);
|
|
405
129
|
const COMMAND_INDEX = new Map(Object.entries(COMMANDS).flatMap(([verb, spec]) => [verb, ...(spec.aliases ?? [])].map((name) => [name, spec])));
|
|
406
|
-
// The full listing order; a verb listed twice prints its next help block.
|
|
407
|
-
const USAGE_ORDER = [
|
|
408
|
-
'init', 'remember', 'supersede', 'recall', 'explain', 'trace', 'refine', 'eval', 'context', 'sleep',
|
|
409
|
-
'daily-runner', 'dedup', 'status', 'audit', 'github', 'slack', 'provenance', 'dag', 'drill', 'assemble',
|
|
410
|
-
'correction-latency', 'outcome', 'conflicts', 'resolve', 'reject', 'rejections', 'unreject', 'dormant',
|
|
411
|
-
'projects', 'quarantine', 'capture-error', 'doctor', 'support-bundle', 'tokens', 'failures', 'snapshot',
|
|
412
|
-
'session', 'handoff', 'card', 'current', 'forget', 'inspect', 'embed', 'watch', 'learn', 'promote',
|
|
413
|
-
'share', 'peers', 'sync', 'import', 'export', 'capture', 'setup', 'last-sleep', 'session-end',
|
|
414
|
-
'pre-compact', 'compact-resume', 'post-compact', 'codex-run', 'hook', 'predict', 'decide', 'incident',
|
|
415
|
-
'process', 'policy', 'skill', 'brief', 'note', 'graph', 'invalidate', 'wm', 'dashboard', 'mcp', 'serve',
|
|
416
|
-
'goal', 'auth', 'audit',
|
|
417
|
-
];
|
|
418
130
|
export function usageText() {
|
|
419
|
-
const
|
|
420
|
-
const blocks = USAGE_ORDER.map((verb) => {
|
|
421
|
-
const index = printed.get(verb) ?? 0;
|
|
422
|
-
printed.set(verb, index + 1);
|
|
423
|
-
return COMMANDS[verb].usage[index];
|
|
424
|
-
});
|
|
131
|
+
const blocks = [...ROWS.flatMap((row) => row.usage ?? []), ...ROWS.flatMap((row) => row.listedLast ?? [])];
|
|
425
132
|
return USAGE_HEADER + blocks.join('') + USAGE_EXAMPLES;
|
|
426
133
|
}
|
|
427
134
|
function printUsage() {
|
|
@@ -429,7 +136,8 @@ function printUsage() {
|
|
|
429
136
|
}
|
|
430
137
|
/** One verb's help blocks as `hippo <verb> --help` prints them, or null for a verb with none. */
|
|
431
138
|
export function verbUsage(verb) {
|
|
432
|
-
const
|
|
139
|
+
const spec = COMMAND_INDEX.get(verb);
|
|
140
|
+
const usage = [...(spec?.usage ?? []), ...(spec?.listedLast ?? [])];
|
|
433
141
|
return usage.length > 0 ? usage.join('').slice(1) : null;
|
|
434
142
|
}
|
|
435
143
|
// These sub-commands have fuller usage text than their lines in usageText().
|
|
@@ -486,13 +194,14 @@ function rejectValuedSwitches(flags, declared) {
|
|
|
486
194
|
}
|
|
487
195
|
}
|
|
488
196
|
}
|
|
489
|
-
function checkUnknownFlags(command, flags,
|
|
197
|
+
function checkUnknownFlags(command, flags, spec) {
|
|
198
|
+
const declared = spec?.flags;
|
|
490
199
|
// card checks its flags per subcommand, with a stricter message.
|
|
491
200
|
if (command === 'card')
|
|
492
201
|
return;
|
|
493
202
|
const flagNames = (keys) => keys.map((key) => `--${key}`).join(', ');
|
|
494
203
|
const unknown = Object.keys(flags).filter((key) => !isKnownFlag(key));
|
|
495
|
-
if (unknown.length > 0 &&
|
|
204
|
+
if (unknown.length > 0 && spec?.destructive) {
|
|
496
205
|
printError(`Unknown flag ${flagNames(unknown)} for hippo ${command}. Nothing was changed.`);
|
|
497
206
|
throw new CliExit(2);
|
|
498
207
|
}
|
|
@@ -518,8 +227,8 @@ async function main(command, args, flags, hippoRoot) {
|
|
|
518
227
|
rejectEmptyScope(flags);
|
|
519
228
|
rejectNonNumericFlags(flags, spec?.flags);
|
|
520
229
|
rejectValuedSwitches(flags, spec?.flags);
|
|
521
|
-
checkUnknownFlags(command, flags, spec
|
|
522
|
-
const refusal = Object.hasOwn(flags, 'dry-run') ? dryRunRefusal(command, args, flags) : null;
|
|
230
|
+
checkUnknownFlags(command, flags, spec);
|
|
231
|
+
const refusal = Object.hasOwn(flags, 'dry-run') ? dryRunRefusal(command, spec, args, flags) : null;
|
|
523
232
|
if (refusal) {
|
|
524
233
|
printError(refusal);
|
|
525
234
|
throw new CliExit(2);
|
package/dist/connectors/dlq.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type HippoStore } from '../store/index.js';
|
|
2
2
|
import type { ConnectorDeadLetter } from '../store/port.js';
|
|
3
|
+
import type { JsonValue } from '../util/json.js';
|
|
3
4
|
declare const DEFAULT_BUCKET = "parse_error";
|
|
4
5
|
/** What a caller hands over to park one payload, whatever the connector. */
|
|
5
6
|
export interface ParkOpts<Bucket extends string> {
|
|
@@ -18,10 +19,14 @@ export interface ParkedRow<Bucket extends string> {
|
|
|
18
19
|
bucket: Bucket | typeof DEFAULT_BUCKET;
|
|
19
20
|
signature: string | null;
|
|
20
21
|
}
|
|
21
|
-
/** What one connector supplies: the tag that names its table to the store,
|
|
22
|
+
/** What one connector supplies: the tag that names its table to the store, its list, its one-row read and its retry bump.
|
|
23
|
+
* `Own` is the columns only its table has. */
|
|
22
24
|
export interface ConnectorDlq<Own, Bucket extends string, Item> {
|
|
23
25
|
readonly letter: (row: ParkedRow<Bucket> & Own) => ConnectorDeadLetter;
|
|
24
26
|
readonly list: (hippoRoot: string, tenantId: string, limit: number) => Item[];
|
|
27
|
+
readonly entry: (hippoRoot: string, id: number) => Item | null;
|
|
28
|
+
/** Adds one to `retry_count` and stamps `retried_at`. */
|
|
29
|
+
readonly bump: (hippoRoot: string, id: number) => void;
|
|
25
30
|
}
|
|
26
31
|
/** Parks on `store`, else on hippo.db under `hippoRoot`. */
|
|
27
32
|
export declare function parkInDlq<Own, Bucket extends string>(dlq: ConnectorDlq<Own, Bucket, unknown>, hippoRoot: string, opts: ParkOpts<Bucket> & NoInfer<Own>, store?: HippoStore): Promise<number>;
|
|
@@ -38,7 +43,38 @@ export interface ReplayResult {
|
|
|
38
43
|
retryCount: number;
|
|
39
44
|
reason?: string;
|
|
40
45
|
}
|
|
41
|
-
/**
|
|
42
|
-
|
|
46
|
+
/** The columns a replay reads from any connector's row. */
|
|
47
|
+
interface ParkedEntry {
|
|
48
|
+
readonly id: number;
|
|
49
|
+
readonly retryCount: number;
|
|
50
|
+
readonly rawPayload: string;
|
|
51
|
+
}
|
|
52
|
+
/** A row that cannot pass the signature gate: 'sig_missing' is not counted, since only --force can get it through. */
|
|
53
|
+
export interface SignatureRefusal {
|
|
54
|
+
readonly status: 'sig_missing' | 'sig_fail';
|
|
55
|
+
readonly reason: string;
|
|
56
|
+
}
|
|
57
|
+
/** What a connector's re-ingest of a parsed envelope reports. */
|
|
58
|
+
export type Reingest = {
|
|
59
|
+
readonly ok: true;
|
|
60
|
+
readonly status: ReplayStatus;
|
|
61
|
+
readonly memoryId: string | null;
|
|
62
|
+
readonly reason?: string;
|
|
63
|
+
} | {
|
|
64
|
+
readonly ok: false;
|
|
65
|
+
readonly status: ReplayStatus;
|
|
66
|
+
readonly reason: string;
|
|
67
|
+
};
|
|
68
|
+
/** The parts of a replay only the connector knows. */
|
|
69
|
+
export interface ReplaySteps<Item, Envelope extends JsonValue> {
|
|
70
|
+
readonly dlq: ConnectorDlq<never, never, Item>;
|
|
71
|
+
/** Skipped under --force. */
|
|
72
|
+
readonly refuseSignature: (row: Item) => SignatureRefusal | null;
|
|
73
|
+
readonly isEnvelope: (parsed: JsonValue) => parsed is Envelope;
|
|
74
|
+
readonly notEnvelope: string;
|
|
75
|
+
readonly reingest: (row: Item, envelope: Envelope) => Promise<Reingest>;
|
|
76
|
+
}
|
|
77
|
+
/** Re-runs a parked row under today's secret and routing; every attempt past the read is counted once, except a missing signature. */
|
|
78
|
+
export declare function replayParked<Item extends ParkedEntry, Envelope extends JsonValue>(steps: ReplaySteps<Item, Envelope>, hippoRoot: string, id: number, force: boolean): Promise<ReplayResult>;
|
|
43
79
|
export {};
|
|
44
80
|
//# sourceMappingURL=dlq.d.ts.map
|
package/dist/connectors/dlq.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
// The dead-letter queue every webhook connector parks into: one redaction, one unroutable sentinel, one set of defaults, one replay result.
|
|
2
|
+
import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
|
|
2
3
|
import { DLQ_REDACTED_NOTE, redactPayload } from '../util/secret-detect.js';
|
|
3
|
-
import { requireGroup
|
|
4
|
+
import { requireGroup } from '../store/index.js';
|
|
5
|
+
import { storeFor } from '../store/sqlite/store.js';
|
|
6
|
+
import { errorMessage } from '../util/log.js';
|
|
4
7
|
/** The tenant stored on a row no tenant was resolved for; the column is NOT NULL. */
|
|
5
8
|
const UNROUTABLE_TENANT = '__unroutable__';
|
|
6
9
|
const DEFAULT_BUCKET = 'parse_error';
|
|
7
|
-
const DEFAULT_LIST_LIMIT = 100;
|
|
8
10
|
/** Parks on `store`, else on hippo.db under `hippoRoot`. */
|
|
9
11
|
export async function parkInDlq(dlq, hippoRoot, opts, store) {
|
|
10
12
|
const rawPayload = redactPayload(opts.rawPayload);
|
|
@@ -23,8 +25,41 @@ export async function parkInDlq(dlq, hippoRoot, opts, store) {
|
|
|
23
25
|
export function listDlq(dlq, hippoRoot, opts) {
|
|
24
26
|
return dlq.list(hippoRoot, opts.tenantId, opts.limit ?? DEFAULT_LIST_LIMIT);
|
|
25
27
|
}
|
|
26
|
-
/** A replay that did not go through; `retryCount` is the row's count after any bump
|
|
27
|
-
|
|
28
|
+
/** A replay that did not go through; `retryCount` is the row's count after any bump made. */
|
|
29
|
+
function replayFailed(status, retryCount, reason) {
|
|
28
30
|
return { ok: false, status, memoryId: null, retryCount, reason };
|
|
29
31
|
}
|
|
32
|
+
/** A replay that failed after the row was read: counts it exactly once, then reports the new count. */
|
|
33
|
+
function failAndBump(dlq, hippoRoot, row, status, reason) {
|
|
34
|
+
dlq.bump(hippoRoot, row.id);
|
|
35
|
+
return replayFailed(status, row.retryCount + 1, reason);
|
|
36
|
+
}
|
|
37
|
+
/** Re-runs a parked row under today's secret and routing; every attempt past the read is counted once, except a missing signature. */
|
|
38
|
+
export async function replayParked(steps, hippoRoot, id, force) {
|
|
39
|
+
const row = steps.dlq.entry(hippoRoot, id);
|
|
40
|
+
if (!row)
|
|
41
|
+
return replayFailed('not_found', 0, `dlq id ${id} not found`);
|
|
42
|
+
const refusal = force ? null : steps.refuseSignature(row);
|
|
43
|
+
if (refusal?.status === 'sig_missing')
|
|
44
|
+
return replayFailed(refusal.status, row.retryCount, refusal.reason);
|
|
45
|
+
if (refusal)
|
|
46
|
+
return failAndBump(steps.dlq, hippoRoot, row, refusal.status, refusal.reason);
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = JSON.parse(row.rawPayload);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
return failAndBump(steps.dlq, hippoRoot, row, 'parse_error', `still unparseable: ${errorMessage(e)}`);
|
|
53
|
+
}
|
|
54
|
+
if (!steps.isEnvelope(parsed))
|
|
55
|
+
return failAndBump(steps.dlq, hippoRoot, row, 'unhandled', steps.notEnvelope);
|
|
56
|
+
const outcome = await steps.reingest(row, parsed);
|
|
57
|
+
if (!outcome.ok)
|
|
58
|
+
return failAndBump(steps.dlq, hippoRoot, row, outcome.status, outcome.reason);
|
|
59
|
+
steps.dlq.bump(hippoRoot, row.id);
|
|
60
|
+
const result = { ok: true, status: outcome.status, memoryId: outcome.memoryId, retryCount: row.retryCount + 1 };
|
|
61
|
+
if (outcome.reason !== undefined)
|
|
62
|
+
result.reason = outcome.reason;
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
30
65
|
//# sourceMappingURL=dlq.js.map
|
|
@@ -82,14 +82,23 @@ async function drainStream(ctx, url0, options) {
|
|
|
82
82
|
}
|
|
83
83
|
return { ingested, pages, maxUpdatedAt, drained: true };
|
|
84
84
|
}
|
|
85
|
+
// A reset hours away must fail the run for a later rerun; sleeping through it would hold the process for the whole window.
|
|
86
|
+
const MAX_RATE_LIMIT_ATTEMPTS = 5;
|
|
87
|
+
const MAX_RATE_LIMIT_WAIT_MS = 10 * 60 * 1000;
|
|
85
88
|
async function fetchPagePastRateLimit(options, url) {
|
|
86
89
|
const { fetcher, token, sleep } = options;
|
|
87
|
-
|
|
88
|
-
|
|
90
|
+
let waitedMs = 0;
|
|
91
|
+
for (let attempt = 1;; attempt++) {
|
|
89
92
|
const page = await fetcher({ url, token });
|
|
90
93
|
if (page.rateLimit.reason === 'none')
|
|
91
94
|
return page;
|
|
92
|
-
|
|
95
|
+
const waitMs = page.rateLimit.sleepSeconds * 1000;
|
|
96
|
+
if (attempt >= MAX_RATE_LIMIT_ATTEMPTS || waitedMs + waitMs > MAX_RATE_LIMIT_WAIT_MS) {
|
|
97
|
+
const resetAt = new Date(Date.now() + waitMs).toISOString();
|
|
98
|
+
throw new Error(`GitHub rate limit still active after ${attempt} attempts and ${Math.round(waitedMs / 1000)}s waited; resets at ${resetAt}`);
|
|
99
|
+
}
|
|
100
|
+
await sleep(waitMs);
|
|
101
|
+
waitedMs += waitMs;
|
|
93
102
|
}
|
|
94
103
|
}
|
|
95
104
|
function issueItemToEvent(item, repository) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { requireGroup
|
|
1
|
+
import { requireGroup } from '../../store/index.js';
|
|
2
|
+
import { storeFor } from '../../store/sqlite/store.js';
|
|
2
3
|
/** Handle `issue_comment.deleted` and `pull_request_review_comment.deleted`: archive ALL active raw rows for the artifact_ref in one write.
|
|
3
4
|
* Tenant and kind='raw' filtering are load-bearing: without them a deletion could archive another tenant's row or a distilled row. */
|
|
4
5
|
export async function handleCommentDeleted(ctx, input) {
|