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
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
// Two fast replies would otherwise start two workers that both read the dedupe keys before either writes.
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { errorMessage, log as logger } from '../util/log.js';
|
|
5
|
+
import { homeDir } from '../util/agent-homes.js';
|
|
6
|
+
import { errorCode, errorMessage, log as logger } from '../util/log.js';
|
|
8
7
|
import { isObjectLike, isStringValue } from '../core/capture-contract.js';
|
|
9
8
|
import { SESSION_ID_RE } from './copilot-transcript.js';
|
|
10
|
-
import {
|
|
9
|
+
import { blockHash } from '../util/token-text.js';
|
|
11
10
|
/** Null for a missing id or one that could climb out of the sessions folder. */
|
|
12
11
|
function sessionStateFiles(sessionId) {
|
|
13
12
|
if (sessionId === null || !SESSION_ID_RE.test(sessionId))
|
|
@@ -79,10 +78,16 @@ function releaseSessionLock(lock) {
|
|
|
79
78
|
logger.debug(`session lock not removed: ${errorMessage(err)}`);
|
|
80
79
|
}
|
|
81
80
|
}
|
|
82
|
-
/** False when the
|
|
81
|
+
/** False when the request could not be queued; the caller then refuses the run, since an unlocked worker could race a live one. */
|
|
83
82
|
function queueRun(files, mode) {
|
|
84
83
|
try {
|
|
85
84
|
fs.mkdirSync(path.dirname(files.queued), { recursive: true });
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
logger.warn(`session worker: cannot create ${path.dirname(files.queued)}, so the ${mode} close is not run: ${errorMessage(err)}`);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
86
91
|
// A full close outranks a turn close: it overwrites a queued turn, and a turn never replaces a queued full close.
|
|
87
92
|
if (mode === 'full')
|
|
88
93
|
fs.writeFileSync(files.queued, 'full');
|
|
@@ -91,7 +96,10 @@ function queueRun(files, mode) {
|
|
|
91
96
|
return true;
|
|
92
97
|
}
|
|
93
98
|
catch (err) {
|
|
94
|
-
|
|
99
|
+
if (errorCode(err) === 'EEXIST')
|
|
100
|
+
return true;
|
|
101
|
+
logger.warn(`session worker: cannot queue the ${mode} close in ${files.queued}, so it is not run: ${errorMessage(err)}`);
|
|
102
|
+
return false;
|
|
95
103
|
}
|
|
96
104
|
}
|
|
97
105
|
/** Takes the queued request by renaming it, so one queued while this reads it lands in a fresh file. */
|
|
@@ -100,8 +108,10 @@ function takeQueued(queued) {
|
|
|
100
108
|
try {
|
|
101
109
|
fs.renameSync(queued, taken);
|
|
102
110
|
}
|
|
103
|
-
catch {
|
|
104
|
-
//
|
|
111
|
+
catch (err) {
|
|
112
|
+
// ENOENT means nothing is queued; any other refusal leaves the request queued for the next round, but is told.
|
|
113
|
+
if (errorCode(err) !== 'ENOENT')
|
|
114
|
+
logger.warn(`session worker: cannot take the queued request ${queued}: ${errorMessage(err)}`);
|
|
105
115
|
return null;
|
|
106
116
|
}
|
|
107
117
|
try {
|
|
@@ -114,8 +124,10 @@ function takeQueued(queued) {
|
|
|
114
124
|
/** Runs `work` unless a live worker holds this session, which then runs the request after its own so the last reply is never dropped. */
|
|
115
125
|
export async function runSessionWorker(sessionId, mode, work) {
|
|
116
126
|
const files = sessionStateFiles(sessionId);
|
|
117
|
-
if (files === null
|
|
127
|
+
if (files === null)
|
|
118
128
|
return work(mode);
|
|
129
|
+
if (!queueRun(files, mode))
|
|
130
|
+
return;
|
|
119
131
|
for (let take = takeSessionLock(files.lock); take !== 'held'; take = takeSessionLock(files.lock)) {
|
|
120
132
|
if (take === 'unusable')
|
|
121
133
|
return work(mode);
|
|
@@ -135,7 +147,7 @@ export async function runSessionWorker(sessionId, mode, work) {
|
|
|
135
147
|
}
|
|
136
148
|
}
|
|
137
149
|
function turnKey(turn) {
|
|
138
|
-
return
|
|
150
|
+
return blockHash(`${turn.role}\n${turn.text}`);
|
|
139
151
|
}
|
|
140
152
|
/** The cursor position after `turns`: how many there were and a hash of the last. */
|
|
141
153
|
export function turnPosition(turns) {
|
|
@@ -9,7 +9,8 @@ interface TranscriptLineFlags {
|
|
|
9
9
|
interface TranscriptMessage {
|
|
10
10
|
content?: unknown;
|
|
11
11
|
}
|
|
12
|
-
/** The human's words on a Claude Code user line, '' when none; VS Code stores prompts as text blocks, beside its own open-file, selection
|
|
12
|
+
/** The human's words on a Claude Code user line, '' when none; VS Code stores prompts as text blocks, beside its own open-file, selection
|
|
13
|
+
* and interrupt blocks. */
|
|
13
14
|
export declare function humanUserText(entry: TranscriptLineFlags, message: TranscriptMessage): string;
|
|
14
15
|
export interface SessionTurn {
|
|
15
16
|
role: 'user' | 'assistant';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { envHomeDir, processEnv } from '../util/env.js';
|
|
2
|
-
import { claudeConfigDir } from '../
|
|
2
|
+
import { claudeConfigDir } from '../util/agent-homes.js';
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import { isObjectLike, isStringValue, readSessionEnd } from '../core/capture-contract.js';
|
|
@@ -17,7 +17,8 @@ function isNonHumanUserLine(entry, content) {
|
|
|
17
17
|
return CLAUDE_CODE_COMMAND_PREFIXES.some((p) => head.startsWith(p));
|
|
18
18
|
}
|
|
19
19
|
const NON_HUMAN_BLOCK_PREFIXES = ['<ide_', '[Request interrupted by user'];
|
|
20
|
-
/** The human's words on a Claude Code user line, '' when none; VS Code stores prompts as text blocks, beside its own open-file, selection
|
|
20
|
+
/** The human's words on a Claude Code user line, '' when none; VS Code stores prompts as text blocks, beside its own open-file, selection
|
|
21
|
+
* and interrupt blocks. */
|
|
21
22
|
export function humanUserText(entry, message) {
|
|
22
23
|
const content = message.content;
|
|
23
24
|
let text = '';
|
|
@@ -82,6 +83,8 @@ function claudeCodeTurn(entry) {
|
|
|
82
83
|
}
|
|
83
84
|
return chunks.length > 0 ? { role: 'assistant', text: chunks.join('\n') } : null;
|
|
84
85
|
}
|
|
86
|
+
// Codex stores its own context as user messages: the AGENTS.md text, and one tagged block each for the environment and app state.
|
|
87
|
+
const CODEX_INJECTED_USER_TEXT = /^(?:# AGENTS\.md instructions\b|<([A-Za-z][\w-]*)(?:\s[^>]*)?>[\s\S]*<\/\1>$)/;
|
|
85
88
|
// Codex rollout transcript shape: response_item -> payload.message
|
|
86
89
|
function codexTurn(entry) {
|
|
87
90
|
if (entry.type !== 'response_item')
|
|
@@ -99,7 +102,7 @@ function codexTurn(entry) {
|
|
|
99
102
|
continue;
|
|
100
103
|
const blockType = 'type' in block ? block.type : undefined;
|
|
101
104
|
const blockText = 'text' in block ? block.text : undefined;
|
|
102
|
-
if (role === 'user' && blockType === 'input_text' && isStringValue(blockText) && blockText.trim()) {
|
|
105
|
+
if (role === 'user' && blockType === 'input_text' && isStringValue(blockText) && blockText.trim() && !CODEX_INJECTED_USER_TEXT.test(blockText.trim())) {
|
|
103
106
|
chunks.push(blockText.trim());
|
|
104
107
|
}
|
|
105
108
|
if (role === 'assistant' && blockType === 'output_text' && isStringValue(blockText) && blockText.trim()) {
|
|
@@ -11,8 +11,10 @@ export declare function fitWorkingState(state: WorkingState): WorkingState;
|
|
|
11
11
|
/** Each empty field falls back to `existing`'s, since a tool-heavy tail derives no task; null when all are empty, so blanks never replace a snapshot.
|
|
12
12
|
* Never across sessions: another session's task saved under this id would pass compact-resume's session check. */
|
|
13
13
|
export declare function mergeWorkingState(derived: WorkingState, existing: TaskSnapshot | null, sessionId: string | null): WorkingState | null;
|
|
14
|
-
/** Keeps the LAST maxChars behind a trim marker, aligned to a nearby line start: the summary runs oldest first, so a head cap would drop
|
|
14
|
+
/** Keeps the LAST maxChars behind a trim marker, aligned to a nearby line start: the summary runs oldest first, so a head cap would drop
|
|
15
|
+
* the newest working state. */
|
|
15
16
|
export declare function truncateKeepNewest(text: string, maxChars: number): string;
|
|
16
|
-
/** A session's task, summary and next step from its transcript tail, secrets scrubbed and capped, '' where none; null with a logged
|
|
17
|
+
/** A session's task, summary and next step from its transcript tail, secrets scrubbed and capped, '' where none; null with a logged
|
|
18
|
+
* reason when nothing is derivable. */
|
|
17
19
|
export declare function transcriptWorkingState(transcriptPath: string, log: (message: string) => void): Pick<TaskSnapshot, 'task' | 'summary' | 'next_step'> | null;
|
|
18
20
|
//# sourceMappingURL=working-state.d.ts.map
|
|
@@ -36,7 +36,8 @@ export function mergeWorkingState(derived, existing, sessionId) {
|
|
|
36
36
|
};
|
|
37
37
|
return merged.task || merged.summary || merged.next_step ? merged : null;
|
|
38
38
|
}
|
|
39
|
-
/** Keeps the LAST maxChars behind a trim marker, aligned to a nearby line start: the summary runs oldest first, so a head cap would drop
|
|
39
|
+
/** Keeps the LAST maxChars behind a trim marker, aligned to a nearby line start: the summary runs oldest first, so a head cap would drop
|
|
40
|
+
* the newest working state. */
|
|
40
41
|
export function truncateKeepNewest(text, maxChars) {
|
|
41
42
|
if (text.length <= maxChars)
|
|
42
43
|
return text;
|
|
@@ -123,7 +124,8 @@ function lastAssistantTextBlock(jsonl) {
|
|
|
123
124
|
}
|
|
124
125
|
return '';
|
|
125
126
|
}
|
|
126
|
-
/** A session's task, summary and next step from its transcript tail, secrets scrubbed and capped, '' where none; null with a logged
|
|
127
|
+
/** A session's task, summary and next step from its transcript tail, secrets scrubbed and capped, '' where none; null with a logged
|
|
128
|
+
* reason when nothing is derivable. */
|
|
127
129
|
export function transcriptWorkingState(transcriptPath, log) {
|
|
128
130
|
let tail = '';
|
|
129
131
|
let rawTask = '';
|
|
@@ -1,28 +1,3 @@
|
|
|
1
|
-
/** Audit log retention pruning: opt-in per tenant because retention floors (HIPAA, SOX, GDPR) apply.
|
|
2
|
-
* The audit_prune row is written after the DELETE, so a call never prunes its own record. */
|
|
3
|
-
export interface PruneAuditOpts {
|
|
4
|
-
/** Cutoff in days. Rows with `ts < (now - N days)` are deleted. */
|
|
5
|
-
olderThanDays: number;
|
|
6
|
-
/** Tenant scope. Required: prune is always tenant-scoped. */
|
|
7
|
-
tenantId: string;
|
|
8
|
-
/** When true, count matching rows but do NOT delete. Default false. */
|
|
9
|
-
dryRun?: boolean;
|
|
10
|
-
/** Actor recording the prune in the audit trail. Default 'cli'. */
|
|
11
|
-
actor?: string;
|
|
12
|
-
}
|
|
13
|
-
export interface PruneAuditResult {
|
|
14
|
-
/** ISO timestamp of the cutoff. Rows with ts strictly less than this were deleted. */
|
|
15
|
-
cutoff: string;
|
|
16
|
-
/** Number of audit_log rows deleted (or that would be deleted, if dryRun). */
|
|
17
|
-
count: number;
|
|
18
|
-
/** Echo back whether this was a dry run. */
|
|
19
|
-
dryRun: boolean;
|
|
20
|
-
}
|
|
21
|
-
/** Cutoff ISO timestamp for N days ago; exported so tests can pin "now" without mocking Date. */
|
|
22
|
-
export declare function computeCutoff(days: number, now?: Date): string;
|
|
23
|
-
/** Delete audit_log rows older than `olderThanDays` for `tenantId`, emitting an `audit_prune` event.
|
|
24
|
-
* Throws on non-positive days or a missing tenantId. */
|
|
25
|
-
export declare function pruneAuditLog(hippoRoot: string, opts: PruneAuditOpts): PruneAuditResult;
|
|
26
1
|
/** Parse `--older-than`: bare integer days (`30`) or with a `d` suffix (`30d`); throws on any other format. */
|
|
27
2
|
export declare function parseOlderThanFlag(raw: string): number;
|
|
28
3
|
//# sourceMappingURL=audit-prune.d.ts.map
|
package/dist/cli/audit-prune.js
CHANGED
|
@@ -1,30 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* The audit_prune row is written after the DELETE, so a call never prunes its own record. */
|
|
3
|
-
import { pruneAuditRows } from '../store/audit.js';
|
|
4
|
-
import { DAY_MS } from '../util/time.js';
|
|
5
|
-
/** Cutoff ISO timestamp for N days ago; exported so tests can pin "now" without mocking Date. */
|
|
6
|
-
export function computeCutoff(days, now = new Date()) {
|
|
7
|
-
const cutoff = new Date(now.getTime() - days * DAY_MS);
|
|
8
|
-
return cutoff.toISOString();
|
|
9
|
-
}
|
|
10
|
-
function isTenantIdString(value) {
|
|
11
|
-
return typeof value === 'string';
|
|
12
|
-
}
|
|
13
|
-
/** Delete audit_log rows older than `olderThanDays` for `tenantId`, emitting an `audit_prune` event.
|
|
14
|
-
* Throws on non-positive days or a missing tenantId. */
|
|
15
|
-
export function pruneAuditLog(hippoRoot, opts) {
|
|
16
|
-
if (!Number.isFinite(opts.olderThanDays) || opts.olderThanDays <= 0) {
|
|
17
|
-
throw new Error(`pruneAuditLog: olderThanDays must be a positive number, got ${opts.olderThanDays}`);
|
|
18
|
-
}
|
|
19
|
-
if (!opts.tenantId || !isTenantIdString(opts.tenantId)) {
|
|
20
|
-
throw new Error('pruneAuditLog: tenantId is required');
|
|
21
|
-
}
|
|
22
|
-
const dryRun = opts.dryRun === true;
|
|
23
|
-
const actor = opts.actor ?? 'cli';
|
|
24
|
-
const cutoff = computeCutoff(opts.olderThanDays);
|
|
25
|
-
const count = pruneAuditRows(hippoRoot, { tenantId: opts.tenantId, cutoff, actor, olderThanDays: opts.olderThanDays, dryRun });
|
|
26
|
-
return { cutoff, count, dryRun };
|
|
27
|
-
}
|
|
1
|
+
// The `--older-than` flag of `hippo audit prune`; the prune itself is api.pruneAuditLog.
|
|
28
2
|
/** Parse `--older-than`: bare integer days (`30`) or with a `d` suffix (`30d`); throws on any other format. */
|
|
29
3
|
export function parseOlderThanFlag(raw) {
|
|
30
4
|
const m = raw.match(/^(\d+)(d)?$/i);
|
package/dist/cli/audit.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
// `hippo audit`: list and prune the audit log.
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { truncateWithEllipsis } from '../util/ellipsize.js';
|
|
3
|
+
import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
|
|
4
|
+
import { AUDIT_OPS } from '../store/audit.js';
|
|
5
5
|
import * as api from '../api/index.js';
|
|
6
|
-
import {
|
|
6
|
+
import { parseOlderThanFlag } from './audit-prune.js';
|
|
7
7
|
import { printError } from './output.js';
|
|
8
8
|
import { cliApiContext } from './api-context.js';
|
|
9
9
|
import { boolFlag, flagIsTrue, isBooleanFlag, stringFlag } from './flag-values.js';
|
|
10
10
|
import { requireInit, resolveAuthRoot } from './shared.js';
|
|
11
|
-
import { repairAutomaticMemories } from '../store/quality-repair.js';
|
|
12
11
|
import { getGlobalRoot } from '../sharing/global-store.js';
|
|
13
12
|
import { errorMessage } from '../util/log.js';
|
|
14
13
|
import { CliExit } from './exit.js';
|
|
@@ -33,7 +32,7 @@ function readAuditOp(flags) {
|
|
|
33
32
|
}
|
|
34
33
|
function readAuditLimit(flags) {
|
|
35
34
|
const limitRaw = flags['limit'];
|
|
36
|
-
let limit =
|
|
35
|
+
let limit = DEFAULT_LIST_LIMIT;
|
|
37
36
|
if (limitRaw !== undefined && !isBooleanFlag(limitRaw)) {
|
|
38
37
|
const parsed = parseInt(String(limitRaw), 10);
|
|
39
38
|
if (!Number.isFinite(parsed)) {
|
|
@@ -73,7 +72,7 @@ async function cmdAuditList(hippoRoot, tenantId, flags) {
|
|
|
73
72
|
console.log(formatAuditRow(ev));
|
|
74
73
|
}
|
|
75
74
|
}
|
|
76
|
-
function cmdAuditPrune(hippoRoot, ctxTenantId, flags) {
|
|
75
|
+
async function cmdAuditPrune(hippoRoot, ctxTenantId, flags) {
|
|
77
76
|
const olderThanRaw = stringFlag(flags, 'older-than') ?? '';
|
|
78
77
|
if (!olderThanRaw) {
|
|
79
78
|
printError('Usage: hippo audit prune --older-than <Nd> [--dry-run] [--tenant <t>]');
|
|
@@ -90,7 +89,7 @@ function cmdAuditPrune(hippoRoot, ctxTenantId, flags) {
|
|
|
90
89
|
const tenantId = stringFlag(flags, 'tenant')?.trim() || ctxTenantId;
|
|
91
90
|
const dryRun = flagIsTrue(flags, 'dry-run');
|
|
92
91
|
const asJson = boolFlag(flags, 'json');
|
|
93
|
-
const result = pruneAuditLog(hippoRoot, { olderThanDays,
|
|
92
|
+
const result = await api.pruneAuditLog(cliApiContext(hippoRoot, tenantId), { olderThanDays, dryRun });
|
|
94
93
|
if (asJson) {
|
|
95
94
|
console.log(JSON.stringify(result));
|
|
96
95
|
return;
|
|
@@ -108,15 +107,15 @@ async function cmdAuditLog(hippoRoot, tenantId, args, flags) {
|
|
|
108
107
|
return;
|
|
109
108
|
}
|
|
110
109
|
if (sub === 'prune') {
|
|
111
|
-
cmdAuditPrune(hippoRoot, tenantId, flags);
|
|
110
|
+
await cmdAuditPrune(hippoRoot, tenantId, flags);
|
|
112
111
|
return;
|
|
113
112
|
}
|
|
114
113
|
printError(`Unknown audit subcommand: ${sub}. Expected: list | prune.`);
|
|
115
114
|
throw new CliExit(1);
|
|
116
115
|
}
|
|
117
|
-
function auditRepair(hippoRoot, tenantId, flags) {
|
|
116
|
+
async function auditRepair(hippoRoot, tenantId, flags) {
|
|
118
117
|
const apply = flagIsTrue(flags, 'apply') && flags['dry-run'] !== true;
|
|
119
|
-
const result =
|
|
118
|
+
const result = await api.repairMemoryQuality(cliApiContext(flags['global'] ? getGlobalRoot() : hippoRoot, tenantId), apply);
|
|
120
119
|
if (flags['json']) {
|
|
121
120
|
console.log(JSON.stringify(result));
|
|
122
121
|
return;
|
|
@@ -124,8 +123,10 @@ function auditRepair(hippoRoot, tenantId, flags) {
|
|
|
124
123
|
console.log(`Quality repair ${apply ? 'apply' : 'preview'}: ${result.issues.length} issue(s) across ${result.total} memories.`);
|
|
125
124
|
for (const issue of result.issues)
|
|
126
125
|
console.log(` [${issue.disposition}] ${issue.id}: ${issue.reason}${issue.protection ? ` (${issue.protection})` : ''}`);
|
|
127
|
-
for (const blocker of result.blockers)
|
|
128
|
-
console.log(` Blocked: ${blocker}. Repair never upgrades a store;
|
|
126
|
+
for (const blocker of result.blockers) {
|
|
127
|
+
console.log(` Blocked: ${blocker}. Repair never upgrades a store; ` +
|
|
128
|
+
'any other hippo command does, then run repair again.');
|
|
129
|
+
}
|
|
129
130
|
const restore = `hippo dormant restore <id>${flags['global'] ? ' --global' : ''}`;
|
|
130
131
|
if (result.backup)
|
|
131
132
|
console.log(`Backup: ${result.backup}\nMoved ${result.appliedIds.length} memories to dormant storage. Recovery: ${restore}.`);
|
|
@@ -136,7 +137,7 @@ function auditRepair(hippoRoot, tenantId, flags) {
|
|
|
136
137
|
if (!apply)
|
|
137
138
|
console.log('Preview only. Add --apply to move set-aside memories to dormant storage. Pin a review memory to keep it.');
|
|
138
139
|
}
|
|
139
|
-
function fixAuditErrors(hippoRoot, tenantId, result, flags) {
|
|
140
|
+
async function fixAuditErrors(hippoRoot, tenantId, result, flags) {
|
|
140
141
|
const errors = result.issues.filter(i => i.severity === 'error');
|
|
141
142
|
if (errors.length > 0 && flagIsTrue(flags, 'dry-run')) {
|
|
142
143
|
console.log(`\nWould remove ${errors.length} error-severity memories (dry run, nothing deleted).`);
|
|
@@ -144,7 +145,7 @@ function fixAuditErrors(hippoRoot, tenantId, result, flags) {
|
|
|
144
145
|
}
|
|
145
146
|
else if (errors.length > 0) {
|
|
146
147
|
const ctx = cliApiContext(hippoRoot, tenantId);
|
|
147
|
-
const removedCount = api.removeAuditErrors(ctx, 'audit --fix', errors).length;
|
|
148
|
+
const removedCount = (await api.removeAuditErrors(ctx, 'audit --fix', errors)).length;
|
|
148
149
|
console.log(`\nRemoved ${removedCount} error-severity memories.`);
|
|
149
150
|
console.log(`${result.issues.length - errors.length} warnings remain (review manually).`);
|
|
150
151
|
}
|
|
@@ -154,7 +155,7 @@ function fixAuditErrors(hippoRoot, tenantId, result, flags) {
|
|
|
154
155
|
}
|
|
155
156
|
export async function handleAudit({ hippoRoot, tenantId, args, flags }) {
|
|
156
157
|
if (args[0] === 'repair') {
|
|
157
|
-
auditRepair(hippoRoot, tenantId, flags);
|
|
158
|
+
await auditRepair(hippoRoot, tenantId, flags);
|
|
158
159
|
return;
|
|
159
160
|
}
|
|
160
161
|
// `audit list` and `audit prune` are the audit-log subcommands; other forms (no sub, --fix) keep the memory-quality auditor.
|
|
@@ -163,8 +164,7 @@ export async function handleAudit({ hippoRoot, tenantId, args, flags }) {
|
|
|
163
164
|
return;
|
|
164
165
|
}
|
|
165
166
|
requireInit(hippoRoot);
|
|
166
|
-
const
|
|
167
|
-
const result = auditMemories(entries, memoriesBackingObjects(hippoRoot));
|
|
167
|
+
const result = await api.auditMemoryQuality(cliApiContext(hippoRoot, tenantId));
|
|
168
168
|
const shouldFix = boolFlag(flags, 'fix');
|
|
169
169
|
if (result.issues.length === 0) {
|
|
170
170
|
console.log(`All ${result.total} memories passed quality checks.`);
|
|
@@ -174,10 +174,10 @@ export async function handleAudit({ hippoRoot, tenantId, args, flags }) {
|
|
|
174
174
|
for (const issue of result.issues) {
|
|
175
175
|
const icon = issue.severity === 'error' ? 'ERR' : 'WARN';
|
|
176
176
|
console.log(` [${icon}] ${issue.memoryId}: ${issue.reason}`);
|
|
177
|
-
console.log(` "${issue.content
|
|
177
|
+
console.log(` "${truncateWithEllipsis(issue.content, 80)}"`);
|
|
178
178
|
}
|
|
179
179
|
if (shouldFix) {
|
|
180
|
-
fixAuditErrors(hippoRoot, tenantId, result, flags);
|
|
180
|
+
await fixAuditErrors(hippoRoot, tenantId, result, flags);
|
|
181
181
|
}
|
|
182
182
|
else {
|
|
183
183
|
console.log(`\nRun with --fix to auto-remove error-severity issues.`);
|
package/dist/cli/auth.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type CommandContext } from './flag-values.js';
|
|
2
|
-
export declare function handleAuth({ hippoRoot, tenantId, args, flags }: CommandContext): void
|
|
2
|
+
export declare function handleAuth({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
|
|
3
3
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/cli/auth.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// `hippo auth`: create, list, revoke and scope API keys.
|
|
2
|
-
import { listApiKeys } from '../store/auth.js';
|
|
3
2
|
import * as api from '../api/index.js';
|
|
4
3
|
import { cliApiContext } from './api-context.js';
|
|
5
4
|
import { printError } from './output.js';
|
|
@@ -29,7 +28,7 @@ function noteMintDefaults(roleGiven, expiryGiven) {
|
|
|
29
28
|
if (notes.length > 0)
|
|
30
29
|
printError(`hippo auth create: ${notes.join('; ')}.`);
|
|
31
30
|
}
|
|
32
|
-
function cmdAuthCreate(hippoRoot, defaultTenantId, flags) {
|
|
31
|
+
async function cmdAuthCreate(hippoRoot, defaultTenantId, flags) {
|
|
33
32
|
const root = resolveAuthRoot(hippoRoot, flags);
|
|
34
33
|
const tenantFlag = stringFlag(flags, 'tenant');
|
|
35
34
|
const labelFlag = stringFlag(flags, 'label');
|
|
@@ -46,7 +45,7 @@ function cmdAuthCreate(hippoRoot, defaultTenantId, flags) {
|
|
|
46
45
|
const ctx = cliApiContext(root, tenantFlag ?? defaultTenantId);
|
|
47
46
|
let result;
|
|
48
47
|
try {
|
|
49
|
-
result = api.authCreate(ctx, { label: labelFlag, role, ttlDays, noExpiry: noExpiry || undefined });
|
|
48
|
+
result = await api.authCreate(ctx, { label: labelFlag, role, ttlDays, noExpiry: noExpiry || undefined });
|
|
50
49
|
}
|
|
51
50
|
catch (err) {
|
|
52
51
|
if (!(err instanceof api.BadRequestError))
|
|
@@ -81,11 +80,11 @@ function formatKeyRow(item) {
|
|
|
81
80
|
const revoked = item.revokedAt ?? '-';
|
|
82
81
|
return `${item.keyId} ${item.tenantId} ${item.role} ${label} ${created} ${expires} ${revoked}`;
|
|
83
82
|
}
|
|
84
|
-
function cmdAuthList(hippoRoot, flags) {
|
|
83
|
+
function cmdAuthList(hippoRoot, tenantId, flags) {
|
|
85
84
|
const root = resolveAuthRoot(hippoRoot, flags);
|
|
86
85
|
const includeRevoked = boolFlag(flags, 'all');
|
|
87
86
|
const asJson = boolFlag(flags, 'json');
|
|
88
|
-
const items =
|
|
87
|
+
const items = api.authListAllTenants(cliApiContext(root, tenantId), !includeRevoked);
|
|
89
88
|
if (asJson) {
|
|
90
89
|
console.log(JSON.stringify(items));
|
|
91
90
|
return;
|
|
@@ -100,20 +99,20 @@ function cmdAuthList(hippoRoot, flags) {
|
|
|
100
99
|
}
|
|
101
100
|
}
|
|
102
101
|
// The local CLI owns every tenant, so revoke and grant run in the key's own tenant.
|
|
103
|
-
function keyContext(root, tenantId, keyId) {
|
|
102
|
+
async function keyContext(root, tenantId, keyId) {
|
|
104
103
|
const hostCtx = cliApiContext(root, tenantId);
|
|
105
|
-
const keyTenant = api.authKeyTenant(hostCtx, keyId);
|
|
104
|
+
const keyTenant = await api.authKeyTenant(hostCtx, keyId);
|
|
106
105
|
if (keyTenant === undefined) {
|
|
107
106
|
printError(`Unknown key_id: ${keyId}`);
|
|
108
107
|
throw new CliExit(1);
|
|
109
108
|
}
|
|
110
109
|
return { ...hostCtx, tenantId: keyTenant };
|
|
111
110
|
}
|
|
112
|
-
function cmdAuthRevoke(hippoRoot, tenantId, keyId, flags) {
|
|
113
|
-
const ctx = keyContext(resolveAuthRoot(hippoRoot, flags), tenantId, keyId);
|
|
111
|
+
async function cmdAuthRevoke(hippoRoot, tenantId, keyId, flags) {
|
|
112
|
+
const ctx = await keyContext(resolveAuthRoot(hippoRoot, flags), tenantId, keyId);
|
|
114
113
|
let revokedAt;
|
|
115
114
|
try {
|
|
116
|
-
revokedAt = api.authRevoke(ctx, keyId).revokedAt;
|
|
115
|
+
revokedAt = (await api.authRevoke(ctx, keyId)).revokedAt;
|
|
117
116
|
}
|
|
118
117
|
catch (err) {
|
|
119
118
|
printError(`Error: ${errorMessage(err)}`);
|
|
@@ -126,8 +125,8 @@ function cmdAuthRevoke(hippoRoot, tenantId, keyId, flags) {
|
|
|
126
125
|
console.log(`Revoked ${keyId} at ${revokedAt}`);
|
|
127
126
|
}
|
|
128
127
|
/** `hippo auth grant|ungrant <key_id> <scope>`, routed through api so the tenant, restricted-scope and audit checks live in one place. */
|
|
129
|
-
function cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, grant, flags) {
|
|
130
|
-
const ctx = keyContext(resolveAuthRoot(hippoRoot, flags), tenantId, keyId);
|
|
128
|
+
async function cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, grant, flags) {
|
|
129
|
+
const ctx = await keyContext(resolveAuthRoot(hippoRoot, flags), tenantId, keyId);
|
|
131
130
|
try {
|
|
132
131
|
if (grant)
|
|
133
132
|
api.authGrant(ctx, keyId, scope);
|
|
@@ -144,7 +143,7 @@ function cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, grant, flags) {
|
|
|
144
143
|
}
|
|
145
144
|
console.log(grant ? `Granted ${keyId} read access to ${scope}` : `Removed ${keyId}'s grant on ${scope}`);
|
|
146
145
|
}
|
|
147
|
-
export function handleAuth({ hippoRoot, tenantId, args, flags }) {
|
|
146
|
+
export async function handleAuth({ hippoRoot, tenantId, args, flags }) {
|
|
148
147
|
const sub = args[0];
|
|
149
148
|
if (!sub) {
|
|
150
149
|
printError('Usage: hippo auth <create|list|revoke|grant|ungrant> [options]');
|
|
@@ -153,10 +152,10 @@ export function handleAuth({ hippoRoot, tenantId, args, flags }) {
|
|
|
153
152
|
const subArgs = args.slice(1);
|
|
154
153
|
switch (sub) {
|
|
155
154
|
case 'create':
|
|
156
|
-
cmdAuthCreate(hippoRoot, tenantId, flags);
|
|
155
|
+
await cmdAuthCreate(hippoRoot, tenantId, flags);
|
|
157
156
|
return;
|
|
158
157
|
case 'list':
|
|
159
|
-
cmdAuthList(hippoRoot, flags);
|
|
158
|
+
cmdAuthList(hippoRoot, tenantId, flags);
|
|
160
159
|
return;
|
|
161
160
|
case 'revoke': {
|
|
162
161
|
const keyId = subArgs[0];
|
|
@@ -164,7 +163,7 @@ export function handleAuth({ hippoRoot, tenantId, args, flags }) {
|
|
|
164
163
|
printError('Usage: hippo auth revoke <key_id>');
|
|
165
164
|
throw new CliExit(1);
|
|
166
165
|
}
|
|
167
|
-
cmdAuthRevoke(hippoRoot, tenantId, keyId, flags);
|
|
166
|
+
await cmdAuthRevoke(hippoRoot, tenantId, keyId, flags);
|
|
168
167
|
return;
|
|
169
168
|
}
|
|
170
169
|
case 'grant':
|
|
@@ -174,7 +173,7 @@ export function handleAuth({ hippoRoot, tenantId, args, flags }) {
|
|
|
174
173
|
printError(`Usage: hippo auth ${sub} <key_id> <scope>`);
|
|
175
174
|
throw new CliExit(1);
|
|
176
175
|
}
|
|
177
|
-
cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, sub === 'grant', flags);
|
|
176
|
+
await cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, sub === 'grant', flags);
|
|
178
177
|
return;
|
|
179
178
|
}
|
|
180
179
|
default:
|
package/dist/cli/briefs.d.ts
CHANGED
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function handleProjectBrief({ hippoRoot, tenantId, args, flags }: CommandContext): void;
|
|
3
|
-
export declare function handleGraph({ hippoRoot, tenantId, args, flags }: CommandContext): void;
|
|
4
|
-
export declare function handleCustomerNote({ hippoRoot, tenantId, args, flags }: CommandContext): void;
|
|
1
|
+
export declare const handleProjectBrief: (ctx: import("./flag-values.js").CommandContext) => void;
|
|
5
2
|
//# sourceMappingURL=briefs.d.ts.map
|