hippo-memory 1.70.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 +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- 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/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- 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 +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- 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 +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- 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 +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- 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.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- 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.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- 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.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- 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 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +49 -40
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- 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 +3 -2
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +24 -44
- 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 +4 -3
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- 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 +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +24 -53
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +16 -19
- 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 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- 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.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- 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.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +24 -60
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- 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.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- 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 +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- 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/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +11 -63
- package/dist/store/summaries.js +37 -148
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- 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 +35 -6
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- 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 +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- 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/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- package/extensions/openclaw-plugin/index.ts +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/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
package/dist/cli/card.js
CHANGED
|
@@ -1,13 +1,28 @@
|
|
|
1
1
|
// The `hippo card` verb (the agent work board); main() loads it lazily from the command table.
|
|
2
|
-
import
|
|
2
|
+
import * as cardsApi from '../api/cards.js';
|
|
3
|
+
import { cliApiContext } from './api-context.js';
|
|
3
4
|
import { isHandoffOutcome } from '../core/handoff.js';
|
|
4
5
|
import { isCardStatus } from '../core/card.js';
|
|
5
|
-
import { loadCardDetail } from '../store/card-detail.js';
|
|
6
|
-
import { resolveTenantId } from '../store/tenant.js';
|
|
7
6
|
import { printError } from './output.js';
|
|
8
7
|
import { stringFlagOrExit } from './flag-values.js';
|
|
9
8
|
import { requireInit } from './shared.js';
|
|
10
9
|
import { errorMessage } from '../util/log.js';
|
|
10
|
+
import { CliExit } from './exit.js';
|
|
11
|
+
// Each subcommand's usage line, written once so the repeated checks cannot drift.
|
|
12
|
+
const CARD_USAGE = {
|
|
13
|
+
create: 'hippo card create --title "..." [--repo <name>] [--contract <text>] [--budget <n>] [--depends-on <id>...]',
|
|
14
|
+
show: 'hippo card show <id> [--json]',
|
|
15
|
+
claim: 'hippo card claim <id> --runtime <name> [--session <id>]',
|
|
16
|
+
heartbeat: 'hippo card heartbeat <id> --run <n>',
|
|
17
|
+
review: 'hippo card review <id> [--run <n>]',
|
|
18
|
+
complete: 'hippo card complete <id> --outcome <success|failure|partial> [--run <n>]',
|
|
19
|
+
reclaim: 'hippo card reclaim (sweeps every expired lease; use hippo card block <id> for one card)',
|
|
20
|
+
comment: 'hippo card comment <id> --body "..." [--author <name>]',
|
|
21
|
+
};
|
|
22
|
+
function usageError(sub) {
|
|
23
|
+
printError(`Usage: ${CARD_USAGE[sub]}`);
|
|
24
|
+
return new CliExit(1);
|
|
25
|
+
}
|
|
11
26
|
// Mirrors ARCHIVE_REASON_REQUIRED so the block message can't drift from its usage line.
|
|
12
27
|
const CARD_BLOCK_REASON_REQUIRED = 'hippo card block <id> requires --reason "<why>" (recorded as a comment).';
|
|
13
28
|
function printCard(detail) {
|
|
@@ -59,14 +74,15 @@ function cardRunFlag(flags) {
|
|
|
59
74
|
const n = Number(raw);
|
|
60
75
|
if (!/^\d+$/.test(raw) || !Number.isSafeInteger(n) || n <= 0) {
|
|
61
76
|
printError(`Invalid --run: "${raw}" (expected a positive integer).`);
|
|
62
|
-
|
|
77
|
+
throw new CliExit(1);
|
|
63
78
|
}
|
|
64
79
|
return n;
|
|
65
80
|
}
|
|
66
81
|
// Reads after the store already refused, so this only explains the refusal, never changes it.
|
|
67
82
|
function cardRefusal(hippoRoot, tenantId, id) {
|
|
68
|
-
const
|
|
69
|
-
const
|
|
83
|
+
const ctx = cliApiContext(hippoRoot, tenantId);
|
|
84
|
+
const card = cardsApi.cardLoad(ctx, id);
|
|
85
|
+
const liveRun = cardsApi.cardRuns(ctx, id).find((r) => !r.ended);
|
|
70
86
|
return `status ${card?.status ?? 'unknown'}, live run ${liveRun?.id ?? 'none'}`;
|
|
71
87
|
}
|
|
72
88
|
const CARD_SUBCOMMAND_FLAGS = {
|
|
@@ -82,13 +98,12 @@ const CARD_SUBCOMMAND_FLAGS = {
|
|
|
82
98
|
comment: ['body', 'author'],
|
|
83
99
|
};
|
|
84
100
|
/** Runs `hippo card <subcommand>`: rejects flags the subcommand never reads, then hands off to its handler. */
|
|
85
|
-
export function
|
|
101
|
+
export function handleCard({ hippoRoot, tenantId, args, flags }) {
|
|
86
102
|
requireInit(hippoRoot);
|
|
87
|
-
const tenantId = resolveTenantId({});
|
|
88
103
|
const subcommand = args[0] ?? '';
|
|
89
104
|
if (!Object.hasOwn(CARD_SUBCOMMAND_FLAGS, subcommand)) {
|
|
90
105
|
printError('Usage: hippo card <create|show|list|claim|heartbeat|block|review|complete|reclaim|comment>');
|
|
91
|
-
|
|
106
|
+
throw new CliExit(1);
|
|
92
107
|
}
|
|
93
108
|
// SAFETY: hasOwn, unlike `in`, skips inherited keys such as constructor, so subcommand is a real key.
|
|
94
109
|
const known = subcommand;
|
|
@@ -97,7 +112,7 @@ export function cmdCard(hippoRoot, args, flags) {
|
|
|
97
112
|
if (!allowedFlags.includes(key)) {
|
|
98
113
|
const valid = allowedFlags.length > 0 ? allowedFlags.map((f) => `--${f}`).join(', ') : '(none)';
|
|
99
114
|
printError(`Unknown flag --${key} for hippo card ${subcommand}. Valid flags: ${valid}`);
|
|
100
|
-
|
|
115
|
+
throw new CliExit(1);
|
|
101
116
|
}
|
|
102
117
|
}
|
|
103
118
|
CARD_HANDLERS[known](hippoRoot, tenantId, args, flags);
|
|
@@ -105,8 +120,7 @@ export function cmdCard(hippoRoot, args, flags) {
|
|
|
105
120
|
function cardCreate(hippoRoot, tenantId, _args, flags) {
|
|
106
121
|
const title = stringFlagOrExit(flags, 'title') ?? '';
|
|
107
122
|
if (!title) {
|
|
108
|
-
|
|
109
|
-
process.exit(1);
|
|
123
|
+
throw usageError('create');
|
|
110
124
|
}
|
|
111
125
|
const repo = stringFlagOrExit(flags, 'repo') || undefined;
|
|
112
126
|
const contract = stringFlagOrExit(flags, 'contract') || undefined;
|
|
@@ -115,36 +129,35 @@ function cardCreate(hippoRoot, tenantId, _args, flags) {
|
|
|
115
129
|
if (budgetRaw !== undefined) {
|
|
116
130
|
if (!/^\d+$/.test(budgetRaw)) {
|
|
117
131
|
printError(`Invalid budget: "${budgetRaw}" (expected a positive integer)`);
|
|
118
|
-
|
|
132
|
+
throw new CliExit(1);
|
|
119
133
|
}
|
|
120
134
|
budget = Number(budgetRaw);
|
|
121
135
|
}
|
|
122
136
|
const dependsOnFlag = flags['depends-on'];
|
|
123
137
|
if (dependsOnFlag === true) {
|
|
124
138
|
printError('--depends-on requires a value');
|
|
125
|
-
|
|
139
|
+
throw new CliExit(1);
|
|
126
140
|
}
|
|
127
141
|
const dependsOn = Array.isArray(dependsOnFlag) ? dependsOnFlag : [];
|
|
128
142
|
let card;
|
|
129
143
|
try {
|
|
130
|
-
card =
|
|
144
|
+
card = cardsApi.cardCreate(cliApiContext(hippoRoot, tenantId), { title, repo, contract, budget, dependsOn });
|
|
131
145
|
}
|
|
132
146
|
catch (error) {
|
|
133
147
|
printError(errorMessage(error));
|
|
134
|
-
|
|
148
|
+
throw new CliExit(1);
|
|
135
149
|
}
|
|
136
150
|
console.log(`Created card ${card.id} (status: ${card.status})`);
|
|
137
151
|
}
|
|
138
152
|
function cardShow(hippoRoot, tenantId, args, flags) {
|
|
139
153
|
const id = args[1];
|
|
140
154
|
if (!id) {
|
|
141
|
-
|
|
142
|
-
process.exit(1);
|
|
155
|
+
throw usageError('show');
|
|
143
156
|
}
|
|
144
|
-
const detail =
|
|
157
|
+
const detail = cardsApi.cardDetail(cliApiContext(hippoRoot, tenantId), id);
|
|
145
158
|
if (!detail) {
|
|
146
159
|
printError(`No card found with id ${id}.`);
|
|
147
|
-
|
|
160
|
+
throw new CliExit(1);
|
|
148
161
|
}
|
|
149
162
|
if (flags['json']) {
|
|
150
163
|
console.log(JSON.stringify(detail, null, 2));
|
|
@@ -156,9 +169,9 @@ function cardList(hippoRoot, tenantId, _args, flags) {
|
|
|
156
169
|
const status = stringFlagOrExit(flags, 'status');
|
|
157
170
|
if (status !== undefined && !isCardStatus(status)) {
|
|
158
171
|
printError(`Invalid status: "${status}".`);
|
|
159
|
-
|
|
172
|
+
throw new CliExit(1);
|
|
160
173
|
}
|
|
161
|
-
const cards =
|
|
174
|
+
const cards = cardsApi.cardList(cliApiContext(hippoRoot, tenantId), { status });
|
|
162
175
|
if (flags['json']) {
|
|
163
176
|
console.log(JSON.stringify({ cards }, null, 2));
|
|
164
177
|
return;
|
|
@@ -175,21 +188,20 @@ function cardClaim(hippoRoot, tenantId, args, flags) {
|
|
|
175
188
|
const id = args[1];
|
|
176
189
|
const runtime = stringFlagOrExit(flags, 'runtime') ?? '';
|
|
177
190
|
if (!id || !runtime) {
|
|
178
|
-
|
|
179
|
-
process.exit(1);
|
|
191
|
+
throw usageError('claim');
|
|
180
192
|
}
|
|
181
193
|
const sessionId = stringFlagOrExit(flags, 'session') || undefined;
|
|
182
194
|
let card;
|
|
183
195
|
try {
|
|
184
|
-
card =
|
|
196
|
+
card = cardsApi.cardClaim(cliApiContext(hippoRoot, tenantId), id, runtime, sessionId);
|
|
185
197
|
}
|
|
186
198
|
catch (error) {
|
|
187
199
|
printError(errorMessage(error));
|
|
188
|
-
|
|
200
|
+
throw new CliExit(1);
|
|
189
201
|
}
|
|
190
202
|
if (!card) {
|
|
191
203
|
printError(`Could not claim card ${id} (not ready/blocked, or already claimed).`);
|
|
192
|
-
|
|
204
|
+
throw new CliExit(1);
|
|
193
205
|
}
|
|
194
206
|
console.log(`Claimed card ${card.id} for ${runtime} (run ${card.runId}, lease until ${card.leaseUntil})`);
|
|
195
207
|
}
|
|
@@ -197,20 +209,19 @@ function cardHeartbeat(hippoRoot, tenantId, args, flags) {
|
|
|
197
209
|
const id = args[1];
|
|
198
210
|
const runId = cardRunFlag(flags);
|
|
199
211
|
if (!id || runId === undefined) {
|
|
200
|
-
|
|
201
|
-
process.exit(1);
|
|
212
|
+
throw usageError('heartbeat');
|
|
202
213
|
}
|
|
203
214
|
let card;
|
|
204
215
|
try {
|
|
205
|
-
card =
|
|
216
|
+
card = cardsApi.cardHeartbeat(cliApiContext(hippoRoot, tenantId), id, runId);
|
|
206
217
|
}
|
|
207
218
|
catch (error) {
|
|
208
219
|
printError(errorMessage(error));
|
|
209
|
-
|
|
220
|
+
throw new CliExit(1);
|
|
210
221
|
}
|
|
211
222
|
if (!card) {
|
|
212
223
|
printError(`Could not heartbeat card ${id} (${cardRefusal(hippoRoot, tenantId, id)}).`);
|
|
213
|
-
|
|
224
|
+
throw new CliExit(1);
|
|
214
225
|
}
|
|
215
226
|
console.log(`Heartbeat card ${card.id}: lease until ${card.leaseUntil}`);
|
|
216
227
|
}
|
|
@@ -219,43 +230,42 @@ function cardBlock(hippoRoot, tenantId, args, flags) {
|
|
|
219
230
|
const reason = stringFlagOrExit(flags, 'reason') ?? '';
|
|
220
231
|
if (!id || !reason) {
|
|
221
232
|
printError(CARD_BLOCK_REASON_REQUIRED);
|
|
222
|
-
|
|
233
|
+
throw new CliExit(1);
|
|
223
234
|
}
|
|
224
235
|
const runId = cardRunFlag(flags);
|
|
225
236
|
let card;
|
|
226
237
|
try {
|
|
227
|
-
card =
|
|
238
|
+
card = cardsApi.cardBlock(cliApiContext(hippoRoot, tenantId), id, reason, runId);
|
|
228
239
|
}
|
|
229
240
|
catch (error) {
|
|
230
241
|
printError(errorMessage(error));
|
|
231
|
-
|
|
242
|
+
throw new CliExit(1);
|
|
232
243
|
}
|
|
233
244
|
if (!card) {
|
|
234
245
|
const why = runId === undefined ? 'not running' : cardRefusal(hippoRoot, tenantId, id);
|
|
235
246
|
printError(`Could not block card ${id} (${why}).`);
|
|
236
|
-
|
|
247
|
+
throw new CliExit(1);
|
|
237
248
|
}
|
|
238
249
|
console.log(`Blocked card ${card.id}`);
|
|
239
250
|
}
|
|
240
251
|
function cardReview(hippoRoot, tenantId, args, flags) {
|
|
241
252
|
const id = args[1];
|
|
242
253
|
if (!id) {
|
|
243
|
-
|
|
244
|
-
process.exit(1);
|
|
254
|
+
throw usageError('review');
|
|
245
255
|
}
|
|
246
256
|
const runId = cardRunFlag(flags);
|
|
247
257
|
let card;
|
|
248
258
|
try {
|
|
249
|
-
card =
|
|
259
|
+
card = cardsApi.cardReview(cliApiContext(hippoRoot, tenantId), id, runId);
|
|
250
260
|
}
|
|
251
261
|
catch (error) {
|
|
252
262
|
printError(errorMessage(error));
|
|
253
|
-
|
|
263
|
+
throw new CliExit(1);
|
|
254
264
|
}
|
|
255
265
|
if (!card) {
|
|
256
266
|
const why = runId === undefined ? 'not running' : cardRefusal(hippoRoot, tenantId, id);
|
|
257
267
|
printError(`Could not move card ${id} to review (${why}).`);
|
|
258
|
-
|
|
268
|
+
throw new CliExit(1);
|
|
259
269
|
}
|
|
260
270
|
console.log(`Card ${card.id} moved to review`);
|
|
261
271
|
}
|
|
@@ -263,22 +273,21 @@ function cardComplete(hippoRoot, tenantId, args, flags) {
|
|
|
263
273
|
const id = args[1];
|
|
264
274
|
const outcomeRaw = flags['outcome'];
|
|
265
275
|
if (!id || !isHandoffOutcome(outcomeRaw)) {
|
|
266
|
-
|
|
267
|
-
process.exit(1);
|
|
276
|
+
throw usageError('complete');
|
|
268
277
|
}
|
|
269
278
|
const runId = cardRunFlag(flags);
|
|
270
279
|
let result;
|
|
271
280
|
try {
|
|
272
|
-
result =
|
|
281
|
+
result = cardsApi.cardComplete(cliApiContext(hippoRoot, tenantId), id, outcomeRaw, runId);
|
|
273
282
|
}
|
|
274
283
|
catch (error) {
|
|
275
284
|
printError(errorMessage(error));
|
|
276
|
-
|
|
285
|
+
throw new CliExit(1);
|
|
277
286
|
}
|
|
278
287
|
if (!result) {
|
|
279
288
|
const why = runId === undefined ? 'not in review' : cardRefusal(hippoRoot, tenantId, id);
|
|
280
289
|
printError(`Could not complete card ${id} (${why}).`);
|
|
281
|
-
|
|
290
|
+
throw new CliExit(1);
|
|
282
291
|
}
|
|
283
292
|
console.log(`Completed card ${result.card.id} (status: ${result.card.status})`);
|
|
284
293
|
if (result.promotedChildren.length > 0) {
|
|
@@ -287,10 +296,9 @@ function cardComplete(hippoRoot, tenantId, args, flags) {
|
|
|
287
296
|
}
|
|
288
297
|
function cardReclaim(hippoRoot, tenantId, args) {
|
|
289
298
|
if (args.length > 1) {
|
|
290
|
-
|
|
291
|
-
process.exit(1);
|
|
299
|
+
throw usageError('reclaim');
|
|
292
300
|
}
|
|
293
|
-
const ids =
|
|
301
|
+
const ids = cardsApi.cardReclaimExpired(cliApiContext(hippoRoot, tenantId));
|
|
294
302
|
if (ids.length === 0) {
|
|
295
303
|
console.log('No expired leases.');
|
|
296
304
|
return;
|
|
@@ -302,22 +310,21 @@ function cardReclaim(hippoRoot, tenantId, args) {
|
|
|
302
310
|
function cardComment(hippoRoot, tenantId, args, flags) {
|
|
303
311
|
const id = args[1];
|
|
304
312
|
if (!id) {
|
|
305
|
-
|
|
306
|
-
process.exit(1);
|
|
313
|
+
throw usageError('comment');
|
|
307
314
|
}
|
|
308
315
|
// Only show and comment look the card up directly; claim/heartbeat/block/review/complete throw from the store instead.
|
|
309
|
-
const
|
|
316
|
+
const ctx = cliApiContext(hippoRoot, tenantId);
|
|
317
|
+
const card = cardsApi.cardLoad(ctx, id);
|
|
310
318
|
if (!card) {
|
|
311
319
|
printError(`No card found with id ${id}.`);
|
|
312
|
-
|
|
320
|
+
throw new CliExit(1);
|
|
313
321
|
}
|
|
314
322
|
const body = stringFlagOrExit(flags, 'body') ?? '';
|
|
315
323
|
if (!body) {
|
|
316
|
-
|
|
317
|
-
process.exit(1);
|
|
324
|
+
throw usageError('comment');
|
|
318
325
|
}
|
|
319
326
|
const author = stringFlagOrExit(flags, 'author') || 'cli';
|
|
320
|
-
const comment =
|
|
327
|
+
const comment = cardsApi.cardComment(ctx, id, author, body);
|
|
321
328
|
console.log(`Added comment ${comment.id} to card ${id}`);
|
|
322
329
|
}
|
|
323
330
|
const CARD_HANDLERS = {
|
package/dist/cli/client.d.ts
CHANGED
|
@@ -1,26 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Only the writes the CLI routes (remember, forget, archive, promote), which are
|
|
5
|
-
* also all HIPPO_REQUIRE_SERVER covers; every other command opens the store
|
|
6
|
-
* directly. Each call returns the same shape that api.ts would.
|
|
7
|
-
*
|
|
8
|
-
* Errors from the server (4xx/5xx) are mapped back into thrown Errors with
|
|
9
|
-
* the server's `error` message preserved verbatim so existing CLI handlers
|
|
10
|
-
* that match on substrings (e.g. "not found", "already superseded") still
|
|
11
|
-
* work unchanged.
|
|
12
|
-
*
|
|
13
|
-
* Network errors (ECONNREFUSED on a stale pidfile, etc.) propagate as the
|
|
14
|
-
* native fetch failure so the caller can detect them and self-heal.
|
|
15
|
-
*/
|
|
1
|
+
/** HTTP client wrapper for `hippo serve`: only the routed writes (remember, forget, archive, promote); every other command opens the store directly.
|
|
2
|
+
* Server errors rethrow with the message verbatim so CLI substring matches still work; network errors propagate as the native fetch failure. */
|
|
16
3
|
import type { RememberOpts, RememberResult } from '../api/index.js';
|
|
17
|
-
/** An error the server answered with, not one the transport raised
|
|
18
|
-
*
|
|
19
|
-
* quotes the caller's own id or content back verbatim. */
|
|
4
|
+
/** An error the server answered with, not one the transport raised: the refused-connection classifier sniffs message text,
|
|
5
|
+
* and a server message quotes the caller's own id or content back verbatim. */
|
|
20
6
|
export declare class HttpResponseError extends Error {
|
|
21
7
|
readonly status: number;
|
|
22
8
|
constructor(message: string, status: number);
|
|
23
9
|
}
|
|
10
|
+
/** A 2xx reply that is not the JSON object the route promises: another process may now own the pidfile's port. */
|
|
11
|
+
export declare class MalformedReplyError extends Error {
|
|
12
|
+
readonly route: string;
|
|
13
|
+
constructor(route: string, detail: string);
|
|
14
|
+
}
|
|
24
15
|
export declare function remember(serverUrl: string, apiKey: string | undefined, opts: RememberOpts): Promise<RememberResult>;
|
|
25
16
|
export declare function forget(serverUrl: string, apiKey: string | undefined, id: string): Promise<{
|
|
26
17
|
ok: true;
|
|
@@ -35,14 +26,8 @@ export declare function archiveRaw(serverUrl: string, apiKey: string | undefined
|
|
|
35
26
|
ok: true;
|
|
36
27
|
archivedAt: string;
|
|
37
28
|
}>;
|
|
38
|
-
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* 'never-sent' means the connection never opened, so the caller may safely
|
|
42
|
-
* replay the call locally. 'delivery-unknown' means the socket broke with the
|
|
43
|
-
* request already on the wire: the server may have committed it, so replaying a
|
|
44
|
-
* write would store it twice. 'none' means this was not a transport failure.
|
|
45
|
-
*/
|
|
29
|
+
/** 'never-sent': connection never opened, safe to replay locally. 'delivery-unknown': the request was on the wire and may have
|
|
30
|
+
* committed, so never replay a write. 'none': not a transport failure. */
|
|
46
31
|
export type TransportFailure = 'none' | 'never-sent' | 'delivery-unknown';
|
|
47
|
-
export declare function classifyTransportFailure(err:
|
|
32
|
+
export declare function classifyTransportFailure(err: Error): TransportFailure;
|
|
48
33
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/cli/client.js
CHANGED
|
@@ -1,28 +1,20 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Only the writes the CLI routes (remember, forget, archive, promote), which are
|
|
5
|
-
* also all HIPPO_REQUIRE_SERVER covers; every other command opens the store
|
|
6
|
-
* directly. Each call returns the same shape that api.ts would.
|
|
7
|
-
*
|
|
8
|
-
* Errors from the server (4xx/5xx) are mapped back into thrown Errors with
|
|
9
|
-
* the server's `error` message preserved verbatim so existing CLI handlers
|
|
10
|
-
* that match on substrings (e.g. "not found", "already superseded") still
|
|
11
|
-
* work unchanged.
|
|
12
|
-
*
|
|
13
|
-
* Network errors (ECONNREFUSED on a stale pidfile, etc.) propagate as the
|
|
14
|
-
* native fetch failure so the caller can detect them and self-heal.
|
|
15
|
-
*/
|
|
1
|
+
/** HTTP client wrapper for `hippo serve`: only the routed writes (remember, forget, archive, promote); every other command opens the store directly.
|
|
2
|
+
* Server errors rethrow with the message verbatim so CLI substring matches still work; network errors propagate as the native fetch failure. */
|
|
16
3
|
import { fetchWithRetry } from '../util/http-retry.js';
|
|
4
|
+
import { readCappedJson } from '../util/capped-json.js';
|
|
5
|
+
import { isJsonObject, isJsonString } from '../util/json.js';
|
|
17
6
|
/** A write the local server has not answered in this long is stuck; the caller treats it as delivery-unknown. */
|
|
18
7
|
const SERVER_TIMEOUT_MS = 30_000;
|
|
19
8
|
/** Five tries at the server's 1 s Retry-After keeps the roughly 5 s wait the CLI had before the server answered busy with 503. */
|
|
20
9
|
const STORE_BUSY_ATTEMPTS = 5;
|
|
10
|
+
/** Every routed write answers with a few short fields; the pidfile's port may now be another process, so cap what it sends. */
|
|
11
|
+
const MAX_REPLY_BYTES = 1024 * 1024;
|
|
21
12
|
/** The server sets Retry-After on a 503 only for a held write lock (server.ts replyFor); the auth-provider 503 has none. */
|
|
22
13
|
function isStoreBusy(res) {
|
|
23
14
|
return res.status === 503 && res.headers.has('retry-after');
|
|
24
15
|
}
|
|
25
|
-
/** Replaying is safe because each routed write commits in one transaction and anything after it is best-effort, so a busy 503 means
|
|
16
|
+
/** Replaying is safe because each routed write commits in one transaction and anything after it is best-effort, so a busy 503 means
|
|
17
|
+
* nothing landed; a sleep is safe too, as a re-run finishes a partial one. */
|
|
26
18
|
function sendWrite(url, init) {
|
|
27
19
|
return fetchWithRetry(url, init, { timeoutMs: SERVER_TIMEOUT_MS, attempts: STORE_BUSY_ATTEMPTS, retryOn: isStoreBusy });
|
|
28
20
|
}
|
|
@@ -34,12 +26,8 @@ function buildHeaders(apiKey, withBody) {
|
|
|
34
26
|
headers['authorization'] = `Bearer ${apiKey}`;
|
|
35
27
|
return headers;
|
|
36
28
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
/** An error the server answered with, not one the transport raised. The
|
|
41
|
-
* refused-connection classifier sniffs message text, and a server message
|
|
42
|
-
* quotes the caller's own id or content back verbatim. */
|
|
29
|
+
/** An error the server answered with, not one the transport raised: the refused-connection classifier sniffs message text,
|
|
30
|
+
* and a server message quotes the caller's own id or content back verbatim. */
|
|
43
31
|
export class HttpResponseError extends Error {
|
|
44
32
|
status;
|
|
45
33
|
constructor(message, status) {
|
|
@@ -48,25 +36,41 @@ export class HttpResponseError extends Error {
|
|
|
48
36
|
this.name = 'HttpResponseError';
|
|
49
37
|
}
|
|
50
38
|
}
|
|
51
|
-
/**
|
|
52
|
-
*
|
|
53
|
-
* intact so cli.ts handlers can match on the same substrings ("not found",
|
|
54
|
-
* "already superseded", "Unknown key_id") whether the call went through
|
|
55
|
-
* api.ts or client.ts.
|
|
56
|
-
*/
|
|
39
|
+
/** Throw an Error carrying the server's message verbatim, so cli.ts handlers can match the same substrings
|
|
40
|
+
* ("not found", "already superseded") as on the direct path. */
|
|
57
41
|
async function throwForStatus(res) {
|
|
58
42
|
let message = `${res.status} ${res.statusText}`;
|
|
59
43
|
try {
|
|
60
|
-
const body = await res
|
|
61
|
-
if (body &&
|
|
44
|
+
const body = await readCappedJson(res, MAX_REPLY_BYTES);
|
|
45
|
+
if (isJsonObject(body) && isJsonString(body.error) && body.error.length > 0) {
|
|
62
46
|
message = body.error;
|
|
63
47
|
}
|
|
64
48
|
}
|
|
65
49
|
catch {
|
|
66
|
-
// body wasn't JSON; fall back to status line.
|
|
50
|
+
// body wasn't JSON or ran past the cap; fall back to status line.
|
|
67
51
|
}
|
|
68
52
|
throw new HttpResponseError(message, res.status);
|
|
69
53
|
}
|
|
54
|
+
/** A 2xx reply that is not the JSON object the route promises: another process may now own the pidfile's port. */
|
|
55
|
+
export class MalformedReplyError extends Error {
|
|
56
|
+
route;
|
|
57
|
+
constructor(route, detail) {
|
|
58
|
+
super(`the hippo server's reply to ${route} was not the expected JSON object (${detail})`);
|
|
59
|
+
this.route = route;
|
|
60
|
+
this.name = 'MalformedReplyError';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** A 2xx reply's body, read under the cap; it must be a JSON object, and `guard` narrows it further where the shape is known. */
|
|
64
|
+
async function readReply(res, route, guard) {
|
|
65
|
+
const body = await readCappedJson(res, MAX_REPLY_BYTES);
|
|
66
|
+
if (!isJsonObject(body))
|
|
67
|
+
throw new MalformedReplyError(route, body === null ? 'null' : Array.isArray(body) ? 'array' : 'a scalar');
|
|
68
|
+
if (guard && !guard(body))
|
|
69
|
+
throw new MalformedReplyError(route, 'unexpected fields');
|
|
70
|
+
const reply = body;
|
|
71
|
+
// SAFETY: the reply comes from hippo's own server, whose route returns this api result as JSON.
|
|
72
|
+
return reply;
|
|
73
|
+
}
|
|
70
74
|
export async function remember(serverUrl, apiKey, opts) {
|
|
71
75
|
const res = await sendWrite(`${serverUrl}/v1/memories`, {
|
|
72
76
|
method: 'POST',
|
|
@@ -75,8 +79,7 @@ export async function remember(serverUrl, apiKey, opts) {
|
|
|
75
79
|
});
|
|
76
80
|
if (!res.ok)
|
|
77
81
|
await throwForStatus(res);
|
|
78
|
-
|
|
79
|
-
return result;
|
|
82
|
+
return readReply(res, 'POST /v1/memories');
|
|
80
83
|
}
|
|
81
84
|
export async function forget(serverUrl, apiKey, id) {
|
|
82
85
|
const res = await sendWrite(`${serverUrl}/v1/memories/${encodeURIComponent(id)}`, {
|
|
@@ -85,8 +88,7 @@ export async function forget(serverUrl, apiKey, id) {
|
|
|
85
88
|
});
|
|
86
89
|
if (!res.ok)
|
|
87
90
|
await throwForStatus(res);
|
|
88
|
-
|
|
89
|
-
return result;
|
|
91
|
+
return readReply(res, 'DELETE /v1/memories/:id', (b) => isJsonString(b.id));
|
|
90
92
|
}
|
|
91
93
|
export async function promote(serverUrl, apiKey, id) {
|
|
92
94
|
const res = await sendWrite(`${serverUrl}/v1/memories/${encodeURIComponent(id)}/promote`, {
|
|
@@ -95,8 +97,7 @@ export async function promote(serverUrl, apiKey, id) {
|
|
|
95
97
|
});
|
|
96
98
|
if (!res.ok)
|
|
97
99
|
await throwForStatus(res);
|
|
98
|
-
|
|
99
|
-
return result;
|
|
100
|
+
return readReply(res, 'POST /v1/memories/:id/promote', (b) => isJsonString(b.sourceId) && isJsonString(b.globalId));
|
|
100
101
|
}
|
|
101
102
|
export async function archiveRaw(serverUrl, apiKey, id, reason) {
|
|
102
103
|
const res = await sendWrite(`${serverUrl}/v1/memories/${encodeURIComponent(id)}/archive`, {
|
|
@@ -106,18 +107,14 @@ export async function archiveRaw(serverUrl, apiKey, id, reason) {
|
|
|
106
107
|
});
|
|
107
108
|
if (!res.ok)
|
|
108
109
|
await throwForStatus(res);
|
|
109
|
-
|
|
110
|
-
return result;
|
|
110
|
+
return readReply(res, 'POST /v1/memories/:id/archive', (b) => isJsonString(b.archivedAt));
|
|
111
111
|
}
|
|
112
112
|
function hasObjectCause(e) {
|
|
113
|
-
// Node's fs/net system errors (ECONNREFUSED, ECONNRESET) attach the syscall
|
|
114
|
-
//
|
|
115
|
-
// validate the code value before it is used for anything.
|
|
113
|
+
// Node's fs/net system errors (ECONNREFUSED, ECONNRESET) attach the syscall code on a non-null object `cause`;
|
|
114
|
+
// the strict-equality checks below validate it before use.
|
|
116
115
|
return typeof e.cause === 'object' && e.cause !== null;
|
|
117
116
|
}
|
|
118
117
|
export function classifyTransportFailure(err) {
|
|
119
|
-
if (!(err instanceof Error))
|
|
120
|
-
return 'none';
|
|
121
118
|
// The server answered, so the transport worked, whatever the message says.
|
|
122
119
|
if (err instanceof HttpResponseError)
|
|
123
120
|
return 'none';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// The payload gate for `hippo compact-resume`.
|
|
2
|
-
import { isSubagentPayload } from '../
|
|
2
|
+
import { isSubagentPayload } from '../util/hook-payload.js';
|
|
3
|
+
import { isJsonObject, isJsonString } from '../util/json.js';
|
|
3
4
|
/** Fail-closed read of the SessionStart payload: only a manual run or a main-session `source: 'compact'` payload may print. */
|
|
4
5
|
export function readCompactResumePayload(stdinText, stdinTimedOut) {
|
|
5
6
|
// An older Claude Code that ignores `matcher: 'compact'` runs this on every SessionStart, so a parsed payload with any other source stays silent.
|
|
@@ -18,7 +19,7 @@ export function readCompactResumePayload(stdinText, stdinTimedOut) {
|
|
|
18
19
|
// Malformed JSON is handled as a null payload by the fail-closed check below.
|
|
19
20
|
payload = null;
|
|
20
21
|
}
|
|
21
|
-
if (!payload
|
|
22
|
+
if (!isJsonObject(payload)) {
|
|
22
23
|
// Fail closed on malformed non-empty stdin; only a TTY/no-stdin manual run, which never reaches here, prints.
|
|
23
24
|
suppressOutput = true;
|
|
24
25
|
}
|
|
@@ -29,7 +30,7 @@ export function readCompactResumePayload(stdinText, stdinTimedOut) {
|
|
|
29
30
|
if (payload.source !== 'compact' || isSubagentPayload(stdinText)) {
|
|
30
31
|
suppressOutput = true;
|
|
31
32
|
}
|
|
32
|
-
if (
|
|
33
|
+
if (isJsonString(payload.session_id)) {
|
|
33
34
|
payloadSessionId = payload.session_id;
|
|
34
35
|
}
|
|
35
36
|
}
|
package/dist/cli/context.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
export declare function
|
|
3
|
-
export declare function handleContext({ hippoRoot, args, flags }: CommandContext): Promise<void>;
|
|
1
|
+
import { type CommandContext } from './flag-values.js';
|
|
2
|
+
export declare function handleContext({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
|
|
4
3
|
//# sourceMappingURL=context.d.ts.map
|
package/dist/cli/context.js
CHANGED
|
@@ -1,23 +1,27 @@
|
|
|
1
1
|
// The `hippo context` verb, which the per-prompt hook also runs; main() loads it lazily from the command table.
|
|
2
|
-
import { isSubagentPayload } from '../
|
|
2
|
+
import { isSubagentPayload } from '../util/hook-payload.js';
|
|
3
3
|
import { estimateTokens } from '../util/token-text.js';
|
|
4
4
|
import { autoDetectContext } from '../api/context-auto.js';
|
|
5
|
-
import { detectScope } from '../
|
|
5
|
+
import { detectScope } from '../core/active-scope.js';
|
|
6
6
|
import { bookLedgerTurn } from '../api/ledger-db.js';
|
|
7
7
|
import { readHookStdin } from './stdin.js';
|
|
8
|
+
import { isJsonObject, isJsonString } from '../util/json.js';
|
|
8
9
|
import * as api from '../api/index.js';
|
|
9
|
-
import {
|
|
10
|
+
import { DEFAULT_CONTEXT_BUDGET } from '../api/context.js';
|
|
11
|
+
import { cliApiContext } from './api-context.js';
|
|
10
12
|
import { renderAmbientSummary } from '../core/ambient.js';
|
|
11
13
|
import { contextBlockLines, contextCost, crossProjectLines, settleTokens } from '../api/context-render.js';
|
|
12
|
-
import { additionalContextOutput, flushDeliveryRecorder, hasContextData, sessionStartEnvelope, toRenderItems, } from '../api/prompt-hook.js';
|
|
14
|
+
import { additionalContextOutput, flushDeliveryRecorder, hasContextData, startDeliveryRecorder, sessionStartEnvelope, toRenderItems, } from '../api/prompt-hook.js';
|
|
13
15
|
import { parseLimitFlag, parseCountFlag, parseBudgetFlag, flagIsTrue } from './flag-values.js';
|
|
14
16
|
import { requireInit } from './shared.js';
|
|
15
17
|
import { printActiveTaskSnapshot, printSessionEvents, printHandoff, captureConsole } from './print.js';
|
|
16
|
-
import { hostSessionId, hookStoreRoot, hookRuntime, payloadCwdRoot, runHookWithStores, inPilotHoldout
|
|
17
|
-
|
|
18
|
-
const rec =
|
|
18
|
+
import { hostSessionId, hookStoreRoot, hookRuntime, payloadCwdRoot, runHookWithStores, inPilotHoldout } from './hook-runtime.js';
|
|
19
|
+
async function cmdContext(hippoRoot, tenantId, args, flags, stdinText) {
|
|
20
|
+
const rec = startDeliveryRecorder(cliApiContext(hippoRoot, tenantId), {
|
|
21
|
+
stdinText, runtime: hookRuntime(flags), eventType: flagIsTrue(flags, 'pinned-only') ? undefined : 'context', envSessionId: hostSessionId(),
|
|
22
|
+
});
|
|
19
23
|
// No try/finally: a render throw keeps its own exit code and writes no event.
|
|
20
|
-
await renderContext(hippoRoot, args, flags, stdinText, rec);
|
|
24
|
+
await renderContext(hippoRoot, tenantId, args, flags, stdinText, rec);
|
|
21
25
|
flushDeliveryRecorder(rec);
|
|
22
26
|
}
|
|
23
27
|
/** The hook payload's session id and raw prompt; a malformed or empty payload yields neither. */
|
|
@@ -26,11 +30,12 @@ function readHookPayload(stdinText) {
|
|
|
26
30
|
let prompt;
|
|
27
31
|
if (stdinText && stdinText.trim() !== '') {
|
|
28
32
|
try {
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
33
|
+
const payload = JSON.parse(stdinText.trim());
|
|
34
|
+
const sid = isJsonObject(payload) ? payload['session_id'] : undefined;
|
|
35
|
+
const raw = isJsonObject(payload) ? payload['prompt'] : undefined;
|
|
36
|
+
if (isJsonString(sid) && sid.trim() !== '')
|
|
32
37
|
sessionId = sid;
|
|
33
|
-
if (
|
|
38
|
+
if (isJsonString(raw))
|
|
34
39
|
prompt = raw;
|
|
35
40
|
}
|
|
36
41
|
catch {
|
|
@@ -39,7 +44,7 @@ function readHookPayload(stdinText) {
|
|
|
39
44
|
}
|
|
40
45
|
return { sessionId, prompt };
|
|
41
46
|
}
|
|
42
|
-
async function renderContext(hippoRoot, args, flags, stdinText, rec) {
|
|
47
|
+
async function renderContext(hippoRoot, resolvedTenant, args, flags, stdinText, rec) {
|
|
43
48
|
// --pinned-only fires on every prompt, even where no local .hippo exists, so it skips requireInit
|
|
44
49
|
// and api.getContext falls back to global-only.
|
|
45
50
|
const pinnedOnly = flagIsTrue(flags, 'pinned-only');
|
|
@@ -49,19 +54,18 @@ async function renderContext(hippoRoot, args, flags, stdinText, rec) {
|
|
|
49
54
|
const session = resolveContextSession(stdinText);
|
|
50
55
|
const { currentSessionId, ledgerSessionId, payloadSessionId } = session;
|
|
51
56
|
// The pilot arm is booked at the first hook call whatever the flags, so the holdout sees no budget or content branch.
|
|
52
|
-
const resolvedTenant = resolveTenantId({});
|
|
53
57
|
if (inPilotHoldout(hippoRoot, resolvedTenant, currentSessionId, payloadSessionId !== undefined)) {
|
|
54
58
|
rec?.disabled();
|
|
55
59
|
return;
|
|
56
60
|
}
|
|
57
|
-
const budget = parseBudgetFlag(flags['budget'],
|
|
61
|
+
const budget = parseBudgetFlag(flags['budget'], DEFAULT_CONTEXT_BUDGET);
|
|
58
62
|
if (budget <= 0) {
|
|
59
63
|
rec?.disabled();
|
|
60
64
|
return;
|
|
61
65
|
}
|
|
62
66
|
// --auto shells out to git, so it stays CLI-side; api.getContext stays host-agnostic and falls back to '*'.
|
|
63
67
|
const query = contextQuery(args, flags);
|
|
64
|
-
const ctx =
|
|
68
|
+
const ctx = cliApiContext(hippoRoot, resolvedTenant);
|
|
65
69
|
const format = String(flags['format'] ?? 'markdown');
|
|
66
70
|
const framing = String(flags['framing'] ?? 'observe');
|
|
67
71
|
const opts = buildContextOpts(flags, { query, budget, pinnedOnly, format, framing, session, rec });
|
|
@@ -195,10 +199,10 @@ function printCrossProjectSection(items) {
|
|
|
195
199
|
for (const line of crossProjectLines(items))
|
|
196
200
|
console.log(line);
|
|
197
201
|
}
|
|
198
|
-
export async function handleContext({ hippoRoot, args, flags }) {
|
|
202
|
+
export async function handleContext({ hippoRoot, tenantId, args, flags }) {
|
|
199
203
|
// Bounded, not a TTY guard: the hot stdin path and a manual run share this one command.
|
|
200
204
|
const { text: stdinText } = await readHookStdin();
|
|
201
205
|
const root = payloadCwdRoot(hippoRoot, stdinText, hookRuntime(flags));
|
|
202
|
-
await runHookWithStores(() => cmdContext(hookStoreRoot(root), args, flags, stdinText));
|
|
206
|
+
await runHookWithStores(() => cmdContext(hookStoreRoot(root), tenantId, args, flags, stdinText));
|
|
203
207
|
}
|
|
204
208
|
//# sourceMappingURL=context.js.map
|