hippo-memory 1.71.0 → 1.72.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 +1 -1
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- 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 +1 -1
- package/dist/api/audit.d.ts +29 -1
- package/dist/api/audit.js +44 -5
- package/dist/api/auth.d.ts +7 -4
- package/dist/api/auth.js +12 -8
- 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-render.js +4 -3
- package/dist/api/context-select.js +9 -11
- package/dist/api/context.js +17 -8
- 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 +1 -1
- 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 +6 -2
- package/dist/api/forget.js +18 -7
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- 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 +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -6
- package/dist/api/ledger-db.js +4 -36
- package/dist/api/memories.d.ts +19 -1
- package/dist/api/memories.js +39 -0
- package/dist/api/objects.d.ts +1 -1
- package/dist/api/outcome.js +1 -1
- 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 +6 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.js +1 -1
- package/dist/api/prompt-hook.d.ts +15 -2
- package/dist/api/prompt-hook.js +44 -4
- package/dist/api/recall-cli.d.ts +3 -0
- package/dist/api/recall-cli.js +13 -4
- package/dist/api/recall-core.js +3 -3
- package/dist/api/recall-pipeline.js +6 -7
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall.d.ts +0 -3
- package/dist/api/recall.js +19 -44
- package/dist/api/remember-local.js +1 -1
- package/dist/api/remember.d.ts +2 -1
- package/dist/api/remember.js +3 -2
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +1 -1
- package/dist/api/sleep-run.js +13 -9
- 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 +1 -1
- package/dist/api/types.d.ts +2 -0
- 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 +4 -2
- package/dist/capture/compaction-spool.js +20 -6
- 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 +2 -1
- package/dist/capture/session-worker.js +3 -4
- 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 +13 -13
- package/dist/cli/auth.d.ts +1 -1
- package/dist/cli/auth.js +12 -13
- 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 +5 -0
- package/dist/cli/client.js +24 -8
- package/dist/cli/compact-resume-payload.js +1 -1
- package/dist/cli/context.d.ts +1 -1
- package/dist/cli/context.js +12 -12
- package/dist/cli/continuity.d.ts +1 -1
- package/dist/cli/continuity.js +36 -39
- package/dist/cli/curate.d.ts +1 -1
- package/dist/cli/curate.js +23 -27
- 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 +4 -281
- 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 +3 -5
- package/dist/cli/hook-runtime.js +7 -34
- 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/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- 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/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 +175 -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 +17 -17
- package/dist/cli/remember.js +12 -12
- package/dist/cli/scheduler.js +2 -1
- package/dist/cli/serve.js +3 -3
- package/dist/cli/session-hooks.d.ts +1 -1
- package/dist/cli/session-hooks.js +45 -115
- 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 +1 -1
- package/dist/cli/transfer.js +33 -31
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -695
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -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 +23 -313
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.js +12 -3
- package/dist/connectors/github/dlq.js +31 -73
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +3 -28
- package/dist/connectors/github/webhook.d.ts +2 -1
- package/dist/connectors/github/webhook.js +33 -2
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/dlq.js +49 -71
- package/dist/connectors/slack/ingest.d.ts +2 -6
- package/dist/connectors/slack/ingest.js +2 -27
- package/dist/connectors/slack/webhook.d.ts +2 -1
- package/dist/connectors/slack/webhook.js +2 -1
- package/dist/consolidate/conflicts.js +1 -1
- package/dist/consolidate/dag.js +15 -9
- package/dist/consolidate/dedupe.d.ts +7 -0
- package/dist/consolidate/dedupe.js +5 -3
- package/dist/consolidate/llm-passes.js +45 -19
- package/dist/consolidate/memory-value.js +2 -1
- package/dist/consolidate/merge.js +2 -2
- 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 +8 -5
- package/dist/consolidate/traces.js +3 -3
- 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 +7 -2
- 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 +2 -2
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory.d.ts +10 -4
- package/dist/core/memory.js +25 -18
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +1 -1
- package/dist/core/physics.js +6 -16
- 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 +10 -1
- package/dist/{store → core}/recall-scope.d.ts +1 -10
- package/dist/{store → core}/recall-scope.js +2 -19
- package/dist/db/busy.d.ts +2 -7
- package/dist/db/busy.js +21 -26
- package/dist/db/connect.d.ts +0 -1
- package/dist/db/connect.js +5 -6
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- 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.js +3 -3
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.js +17 -4
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +11 -8
- 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 +18 -15
- 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/eval/eval-suite.js +17 -11
- package/dist/eval/eval.js +1 -1
- package/dist/eval/judgment.js +11 -4
- 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 +4 -2
- 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 +1 -1
- package/dist/importers/sources.js +5 -4
- package/dist/importers/vault.js +7 -5
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/learn/autolearn.d.ts +10 -2
- package/dist/learn/autolearn.js +32 -12
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +6 -4
- package/dist/learn/forward-claim-detector.js +4 -2
- package/dist/learn/invalidation.js +10 -6
- 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.js +3 -1
- 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 +2 -1
- package/dist/mcp/stdio.js +24 -8
- 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 +63 -97
- 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 +9 -0
- package/dist/search/embed-memories.js +377 -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 +10 -13
- package/dist/server/auth.d.ts +2 -0
- package/dist/server/auth.js +17 -7
- package/dist/server/boot.js +7 -66
- package/dist/server/client-ip.d.ts +0 -2
- package/dist/server/client-ip.js +3 -2
- 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 -132
- 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 +15 -38
- 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/types.d.ts +22 -10
- package/dist/server/validation.d.ts +1 -2
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +5 -4
- package/dist/server.js +5 -4
- package/dist/sharing/global-store.js +2 -2
- 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 +1 -1
- package/dist/sharing/share.d.ts +2 -0
- package/dist/sharing/share.js +37 -34
- package/dist/store/ambient.js +5 -6
- 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 +42 -23
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/cards.js +1 -1
- 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 +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.js +7 -4
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +7 -9
- package/dist/store/connectors/github.js +30 -53
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +7 -6
- package/dist/store/delete-and-batch.d.ts +6 -0
- package/dist/store/delete-and-batch.js +36 -3
- package/dist/store/delivery-recorder.d.ts +10 -3
- package/dist/store/delivery-recorder.js +12 -5
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/dormant.d.ts +1 -1
- package/dist/store/dormant.js +3 -1
- package/dist/store/embeddings/index.d.ts +2 -12
- package/dist/store/embeddings/index.js +5 -374
- package/dist/store/entry-reads.d.ts +13 -4
- package/dist/store/entry-reads.js +47 -11
- package/dist/store/entry-writes.d.ts +5 -5
- package/dist/store/entry-writes.js +32 -12
- 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 +20 -18
- package/dist/store/graph-reads.js +4 -2
- package/dist/store/graph-writes.d.ts +6 -6
- package/dist/store/graph-writes.js +48 -71
- package/dist/store/handoffs.d.ts +1 -1
- package/dist/store/handoffs.js +6 -6
- package/dist/store/index-and-stats.js +2 -2
- 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 +10 -6
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +40 -53
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/port.d.ts +9 -3
- 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/quarantine.js +2 -1
- package/dist/store/recall-trace.d.ts +2 -0
- package/dist/store/recall-trace.js +18 -2
- package/dist/store/rejected-values.js +2 -1
- 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/rule-sql.d.ts +9 -0
- package/dist/store/rule-sql.js +21 -2
- package/dist/store/search-rows.js +9 -4
- 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 +3 -3
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- 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 +9 -0
- package/dist/store/sqlite/held-connection.js +41 -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 +1 -1
- package/dist/store/sqlite/store.js +14 -12
- package/dist/store/summaries.d.ts +3 -3
- package/dist/store/summaries.js +5 -4
- package/dist/store/token-ledger.d.ts +0 -7
- package/dist/store/token-ledger.js +0 -35
- package/dist/store/vector-index.js +3 -2
- 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 +3 -0
- package/dist/util/anthropic-messages.js +22 -5
- 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 +2 -1
- package/dist/util/env.js +2 -1
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -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 +3 -1
- package/dist/util/request-scope.js +11 -6
- package/dist/util/secret-detect.js +6 -1
- 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/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 +2 -2
- 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
|
@@ -1,14 +1,21 @@
|
|
|
1
|
-
// PostToolUseFailure for a caller on another machine: the lesson and its log row carry the caller's owner and project, and a retried
|
|
1
|
+
// PostToolUseFailure for a caller on another machine: the lesson and its log row carry the caller's owner and project, and a retried
|
|
2
|
+
// request id gets the first answer.
|
|
2
3
|
import { BadRequestError } from '../core/api-errors.js';
|
|
3
4
|
import { storeLesson } from './capture-error.js';
|
|
4
|
-
import {
|
|
5
|
+
import { recordFailureAt, requestOutcomeAt, settleFailureOutcomeAt } from '../store/failure-log-at.js';
|
|
5
6
|
import { errorMessage, log } from '../util/log.js';
|
|
6
7
|
import { scrubForSharing } from './share-scrub.js';
|
|
7
8
|
import { truncateCodePointSafe } from '../util/transcript-tail.js';
|
|
8
|
-
import { assertRequestId, bindCaller
|
|
9
|
+
import { assertRequestId, bindCaller } from './caller-session.js';
|
|
9
10
|
import { FAILURE_TEXT_MAX_CHARS, failureHash } from './failure-reading.js';
|
|
10
11
|
const SKIPS = { 'skipped-interrupt': true, 'skipped-routine': true, 'skipped-invalid': true };
|
|
11
|
-
const ROUTINE_RULES = {
|
|
12
|
+
const ROUTINE_RULES = {
|
|
13
|
+
declined: true,
|
|
14
|
+
'os-permission': true,
|
|
15
|
+
'no-match': true,
|
|
16
|
+
'search-tool': true,
|
|
17
|
+
'quiet-exit': true,
|
|
18
|
+
};
|
|
12
19
|
/** The shapes lessonFromFailure gives: text for a lesson or a routine skip, none for an interrupt or an unreadable payload, a rule only on a routine skip. */
|
|
13
20
|
function checkedFailure(req) {
|
|
14
21
|
assertRequestId(req.requestId);
|
|
@@ -35,7 +42,7 @@ function checkedFailure(req) {
|
|
|
35
42
|
export function captureFailureForCaller(ctx, req) {
|
|
36
43
|
const failure = checkedFailure(req);
|
|
37
44
|
const key = bindCaller(ctx, req.sessionId, req.project);
|
|
38
|
-
const earlier =
|
|
45
|
+
const earlier = requestOutcomeAt(ctx.hippoRoot, ctx.tenantId, req.requestId, req.sessionId);
|
|
39
46
|
// A retry after a lost reply gets the first answer and writes nothing; one whose store failed tries the store again.
|
|
40
47
|
if (earlier !== null && earlier !== 'store-failed')
|
|
41
48
|
return { outcome: earlier };
|
|
@@ -54,17 +61,15 @@ export function captureFailureForCaller(ctx, req) {
|
|
|
54
61
|
/** Runs after the outcome in its own try, so a log error never hides the store's error or its outcome. */
|
|
55
62
|
function logOutcome(ctx, req, key, outcome, retried) {
|
|
56
63
|
try {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
ownerSubject: key.owner, originProject: req.project.name, requestId: req.requestId,
|
|
67
|
-
});
|
|
64
|
+
// The request id allows one row, so a retry rewrites the first try's outcome.
|
|
65
|
+
if (retried) {
|
|
66
|
+
settleFailureOutcomeAt(ctx.hippoRoot, ctx.tenantId, req.requestId, outcome);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
recordFailureAt(ctx.hippoRoot, {
|
|
70
|
+
tenantId: ctx.tenantId, sessionId: req.sessionId, tool: req.tool, outcome, rule: req.rule,
|
|
71
|
+
sigHash: req.text?.trim() ? failureHash(req.text) : null, detailHash: req.detailHash,
|
|
72
|
+
ownerSubject: key.owner, originProject: req.project.name, requestId: req.requestId,
|
|
68
73
|
});
|
|
69
74
|
}
|
|
70
75
|
catch (err) {
|
|
@@ -22,7 +22,8 @@ export declare function payloadString(payload: JsonValue, key: 'session_id' | 't
|
|
|
22
22
|
export declare function failureSignature(text: string): string;
|
|
23
23
|
/** The hash the failure log stores for a lesson text or a detail; one function so every writer counts repeats alike. */
|
|
24
24
|
export declare function failureHash(text: string): string;
|
|
25
|
-
/** The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub` runs before the
|
|
25
|
+
/** The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub` runs before the
|
|
26
|
+
* cap, as a mask can be longer than what it hides. Pure. */
|
|
26
27
|
export declare function lessonFromFailure(payload: JsonValue, scrub?: (text: string) => string): FailureReading;
|
|
27
28
|
/** A failure as it may leave the machine: the capped lesson text and the detail's hash, never the untruncated detail. */
|
|
28
29
|
export interface FailureReport {
|
|
@@ -3,7 +3,7 @@ import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
|
3
3
|
import { scrubForSharing } from './share-scrub.js';
|
|
4
4
|
import { blockHash } from '../util/token-text.js';
|
|
5
5
|
import { truncateCodePointSafe } from '../util/transcript-tail.js';
|
|
6
|
-
import { isJsonObjectLiteral } from '../util/json.js';
|
|
6
|
+
import { isJsonObjectLiteral, isJsonString } from '../util/json.js';
|
|
7
7
|
const COMMAND_HEAD_WORDS = 2;
|
|
8
8
|
/** The longest lesson text a reading gives, so a check of a sent one imports it instead of copying it. */
|
|
9
9
|
export const FAILURE_TEXT_MAX_CHARS = 200;
|
|
@@ -19,15 +19,12 @@ const QUIET_EXIT_1 = /^\s*(?:grep|rg|egrep|fgrep|find|test|\[|diff|cmp|git diff|
|
|
|
19
19
|
// Claude Code's tool names, then the Copilot CLI's and VS Code's; tests/copilot-failure-reading.test.ts cites where each comes from.
|
|
20
20
|
const SEARCH_TOOLS = new Set(['Grep', 'Glob', 'grep', 'glob', 'rg', 'grep_search', 'file_search', 'semantic_search']);
|
|
21
21
|
const SHELL_TOOLS = new Set(['Bash', 'bash', 'powershell', 'run_in_terminal']);
|
|
22
|
-
function isString(v) {
|
|
23
|
-
return v !== undefined && v !== null && v.constructor === String;
|
|
24
|
-
}
|
|
25
22
|
/** A non-blank string field of the payload, or null. */
|
|
26
23
|
export function payloadString(payload, key) {
|
|
27
24
|
if (!isJsonObjectLiteral(payload))
|
|
28
25
|
return null;
|
|
29
26
|
const value = payload[key];
|
|
30
|
-
return
|
|
27
|
+
return isJsonString(value) && value.trim() !== '' ? value : null;
|
|
31
28
|
}
|
|
32
29
|
/** Normalised form used to spot repeats. The failure log keeps only its hash, so changing it breaks repeat counts. */
|
|
33
30
|
export function failureSignature(text) {
|
|
@@ -37,7 +34,8 @@ export function failureSignature(text) {
|
|
|
37
34
|
export function failureHash(text) {
|
|
38
35
|
return blockHash(failureSignature(text));
|
|
39
36
|
}
|
|
40
|
-
/** The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub` runs before the
|
|
37
|
+
/** The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub` runs before the
|
|
38
|
+
* cap, as a mask can be longer than what it hides. Pure. */
|
|
41
39
|
export function lessonFromFailure(payload, scrub = (text) => text) {
|
|
42
40
|
if (!isJsonObjectLiteral(payload))
|
|
43
41
|
return { skip: 'skipped-invalid', text: null, detail: null };
|
|
@@ -45,12 +43,12 @@ export function lessonFromFailure(payload, scrub = (text) => text) {
|
|
|
45
43
|
const p = payload;
|
|
46
44
|
if (p.is_interrupt === true)
|
|
47
45
|
return { skip: 'skipped-interrupt', text: null, detail: null };
|
|
48
|
-
if (!
|
|
46
|
+
if (!isJsonString(p.error) || p.error.trim().length < 12)
|
|
49
47
|
return { skip: 'skipped-invalid', text: null, detail: null };
|
|
50
|
-
const tool =
|
|
48
|
+
const tool = isJsonString(p.tool_name) ? p.tool_name : 'tool';
|
|
51
49
|
const error = redactSecretsStrict(p.error.replace(/\s+/g, ' ').trim());
|
|
52
50
|
const text = truncateCodePointSafe(scrub(`${tool}: ${error}`), FAILURE_TEXT_MAX_CHARS);
|
|
53
|
-
const command = isJsonObjectLiteral(p.tool_input) &&
|
|
51
|
+
const command = isJsonObjectLiteral(p.tool_input) && isJsonString(p.tool_input['command']) ? p.tool_input['command'].replace(LEADING_CD, '') : '';
|
|
54
52
|
const head = command.trim().split(/\s+/).slice(0, COMMAND_HEAD_WORDS).join(' ');
|
|
55
53
|
const detail = `${tool}${head ? ` ${head}` : ''}: ${error}`;
|
|
56
54
|
const routine = (rule) => ({ skip: 'skipped-routine', rule, text, detail });
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PRE_COMPACT_INSTRUCTION } from './compaction-record.js';
|
|
2
|
+
import { markSnapshotSavedAt, startCompactionAt } from '../store/compaction-caller.js';
|
|
2
3
|
import { errorMessage, log } from '../util/log.js';
|
|
3
4
|
import { loadActiveTaskSnapshot, saveActiveTaskSnapshot } from '../store/sessions.js';
|
|
4
|
-
import { assertTrigger, bindCaller, callerInHoldout, checkedWorkingState
|
|
5
|
+
import { assertTrigger, bindCaller, callerInHoldout, checkedWorkingState } from './caller-session.js';
|
|
5
6
|
import { mergeWorkingState } from './working-state.js';
|
|
6
7
|
/** A failed step is logged and the instruction still goes out, as the local hook prints it before any store work. */
|
|
7
8
|
function logged(what, fn) {
|
|
@@ -20,10 +21,10 @@ export function preCompactForCaller(ctx, req) {
|
|
|
20
21
|
if (callerInHoldout(ctx, req.sessionId))
|
|
21
22
|
return { stdout: '' };
|
|
22
23
|
const start = { sessionId: req.sessionId, originProject: req.project.name, trigger: req.trigger, cwd: null, transcriptPath: null };
|
|
23
|
-
const recordId = logged('compaction record not started', () =>
|
|
24
|
+
const recordId = logged('compaction record not started', () => startCompactionAt(ctx.hippoRoot, ctx.tenantId, start));
|
|
24
25
|
if (state !== null && saveOwnerSnapshot(ctx, req.sessionId, key, state) && recordId !== null) {
|
|
25
26
|
// Marked under ctx.tenantId, which the environment's tenant may not be.
|
|
26
|
-
logged('compaction record not marked with its snapshot', () =>
|
|
27
|
+
logged('compaction record not marked with its snapshot', () => markSnapshotSavedAt(ctx.hippoRoot, ctx.tenantId, recordId));
|
|
27
28
|
}
|
|
28
29
|
return { stdout: PRE_COMPACT_INSTRUCTION };
|
|
29
30
|
}
|
|
@@ -10,9 +10,9 @@ import { USER_SEGMENT } from '../util/home-path.js';
|
|
|
10
10
|
import { errorMessage } from '../util/log.js';
|
|
11
11
|
import { SESSION_DIGEST_TAG } from '../core/session-digest-row.js';
|
|
12
12
|
import { createMemory, Layer } from '../core/memory.js';
|
|
13
|
-
import { RejectedValueError } from '../
|
|
13
|
+
import { RejectedValueError } from '../core/api-errors.js';
|
|
14
14
|
import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
|
|
15
|
-
import { isInitialized } from '../
|
|
15
|
+
import { isInitialized } from '../core/project-identity.js';
|
|
16
16
|
import { writeEntry } from '../store/entry-writes.js';
|
|
17
17
|
import { loadLiveContentsBySourceAndTag } from '../store/entry-reads.js';
|
|
18
18
|
import { SNAPSHOT_AMBIENT_MAX_AGE_MS } from '../store/sessions.js';
|
|
@@ -336,7 +336,8 @@ const ANCHORS = [
|
|
|
336
336
|
/(?:^|\s)#\d+\b/,
|
|
337
337
|
];
|
|
338
338
|
/** Each marker states a cause or a choice, the part of a lesson that transfers. */
|
|
339
|
-
const MARKERS =
|
|
339
|
+
const MARKERS = new RegExp('\\b(?:because|caused by|due to|root cause|the (?:bug|issue|problem) was|fail(?:s|ed) when|so that|otherwise|' +
|
|
340
|
+
'instead of|rather than|switched to|decided|chose|must|never|always|do not)\\b', 'i');
|
|
340
341
|
const FENCE = /^\s*(`{3,}|~{3,})/;
|
|
341
342
|
const STRUCTURE_LINE = /^\s*(?:#{1,6}\s|\||>|([-*_])(?:\s*\1){2,}\s*$)/;
|
|
342
343
|
const PROTECTED = /`[^`\n]+`|\b(?:e\.g|i\.e)\./gi;
|
|
@@ -11,7 +11,8 @@ function checkedEvidence(evidence) {
|
|
|
11
11
|
const { gitRef = null, dirtyTree = null, testStatus = null } = evidence;
|
|
12
12
|
// `git rev-parse HEAD` gives 40 hex, or 64 in a SHA-256 repository.
|
|
13
13
|
if (gitRef !== null && !/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(gitRef))
|
|
14
|
-
throw new BadRequestError('evidence gitRef: 40 or 64 lowercase hex characters or
|
|
14
|
+
throw new BadRequestError('evidence gitRef: 40 or 64 lowercase hex characters or ' +
|
|
15
|
+
'null');
|
|
15
16
|
if (dirtyTree !== null && dirtyTree !== true && dirtyTree !== false)
|
|
16
17
|
throw new BadRequestError('evidence dirtyTree: true, false or null');
|
|
17
18
|
if (testStatus !== null && !TEST_STATUSES.has(testStatus))
|
|
@@ -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 { homeDir } from '../hooks/shared.js';
|
|
5
|
+
import { homeDir } from '../util/agent-homes.js';
|
|
7
6
|
import { 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))
|
|
@@ -135,7 +134,7 @@ export async function runSessionWorker(sessionId, mode, work) {
|
|
|
135
134
|
}
|
|
136
135
|
}
|
|
137
136
|
function turnKey(turn) {
|
|
138
|
-
return
|
|
137
|
+
return blockHash(`${turn.role}\n${turn.text}`);
|
|
139
138
|
}
|
|
140
139
|
/** The cursor position after `turns`: how many there were and a hash of the last. */
|
|
141
140
|
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)) {
|
|
@@ -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 = api.pruneAuditLog(cliApiContext(hippoRoot, tenantId), { olderThanDays, dryRun });
|
|
94
93
|
if (asJson) {
|
|
95
94
|
console.log(JSON.stringify(result));
|
|
96
95
|
return;
|
|
@@ -116,7 +115,7 @@ async function cmdAuditLog(hippoRoot, tenantId, args, flags) {
|
|
|
116
115
|
}
|
|
117
116
|
function auditRepair(hippoRoot, tenantId, flags) {
|
|
118
117
|
const apply = flagIsTrue(flags, 'apply') && flags['dry-run'] !== true;
|
|
119
|
-
const result =
|
|
118
|
+
const result = 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}.`);
|
|
@@ -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 = 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,7 +174,7 @@ 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
180
|
fixAuditErrors(hippoRoot, tenantId, result, flags);
|
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';
|
|
@@ -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,17 +99,17 @@ 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
115
|
revokedAt = api.authRevoke(ctx, keyId).revokedAt;
|
|
@@ -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]');
|
|
@@ -156,7 +155,7 @@ export function handleAuth({ hippoRoot, tenantId, args, flags }) {
|
|
|
156
155
|
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
|