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/postinstall.js
CHANGED
|
@@ -3,15 +3,14 @@ import * as fs from 'node:fs';
|
|
|
3
3
|
import * as os from 'node:os';
|
|
4
4
|
import * as path from 'node:path';
|
|
5
5
|
import { detectRealCodexPath, isCodexWrapperInstalled, repairCodexWrapperIfInstalled } from './hooks/codex-wrapper.js';
|
|
6
|
-
import { claudeConfigDir } from './
|
|
6
|
+
import { claudeConfigDir } from './util/agent-homes.js';
|
|
7
7
|
import { errorMessage, log } from './util/log.js';
|
|
8
8
|
function main() {
|
|
9
9
|
if (envSkipPostinstall())
|
|
10
10
|
return;
|
|
11
11
|
try {
|
|
12
|
-
// Repair-only, for users who opted in (a Codex update can restore the real binary over our shim)
|
|
13
|
-
//
|
|
14
|
-
// hijacking, so first install is `hippo hook install codex` only.
|
|
12
|
+
// Repair-only, for users who opted in (a Codex update can restore the real binary over our shim): swapping the binary from postinstall
|
|
13
|
+
// is a consent violation that supply-chain scanners read as hijacking, so first install is `hippo hook install codex` only.
|
|
15
14
|
repairCodexWrapperIfInstalled();
|
|
16
15
|
}
|
|
17
16
|
catch (err) {
|
|
@@ -31,16 +30,8 @@ function main() {
|
|
|
31
30
|
// Never fail package install because the install hint could not be printed.
|
|
32
31
|
}
|
|
33
32
|
}
|
|
34
|
-
/**
|
|
35
|
-
*
|
|
36
|
-
* UserPromptSubmit hook is NOT yet installed, print a short message pointing
|
|
37
|
-
* the user at `hippo init`. No config writes. Silent otherwise.
|
|
38
|
-
*
|
|
39
|
-
* We avoid aggressively auto-patching ~/.claude/settings.json from a package
|
|
40
|
-
* postinstall — that's surprising, breaks the principle of least authority,
|
|
41
|
-
* and trips security scanners. A one-line visible prompt is the friendly
|
|
42
|
-
* middle ground.
|
|
43
|
-
*/
|
|
33
|
+
/** Read-only nudge: if Claude Code is detected and the Hippo UserPromptSubmit hook is not installed, point the user at `hippo init`.
|
|
34
|
+
* It never patches ~/.claude/settings.json from a package postinstall: surprising, against least authority, and trips security scanners. */
|
|
44
35
|
function printClaudeCodeNudge() {
|
|
45
36
|
const claudeDir = claudeConfigDir(os.homedir());
|
|
46
37
|
if (!fs.existsSync(claudeDir))
|
|
@@ -76,12 +67,8 @@ function printClaudeCodeNudge() {
|
|
|
76
67
|
line('To skip this message on future installs: export HIPPO_SKIP_POSTINSTALL=1');
|
|
77
68
|
line('');
|
|
78
69
|
}
|
|
79
|
-
/**
|
|
80
|
-
*
|
|
81
|
-
* wrapper is NOT installed, print the opt-in command. Mirrors the Claude Code
|
|
82
|
-
* nudge above — same least-authority reasoning: we tell the user what to run,
|
|
83
|
-
* we never swap their binary for them.
|
|
84
|
-
*/
|
|
70
|
+
/** Read-only nudge: if the Codex CLI is on PATH and the session-capture wrapper is not installed, print the opt-in command;
|
|
71
|
+
* same least-authority reasoning as the Claude Code nudge, we never swap the user's binary. */
|
|
85
72
|
function printCodexNudge() {
|
|
86
73
|
if (isCodexWrapperInstalled())
|
|
87
74
|
return;
|
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
import type { AppendAuditOpts } from '../store/audit.js';
|
|
2
2
|
import { type ForwardClaimMatch } from '../learn/forward-claim-detector.js';
|
|
3
3
|
import type { PlanningFallacyEvidence } from '../store/planning-fallacy-evidence.js';
|
|
4
|
-
/**
|
|
5
|
-
*
|
|
6
|
-
* agent's recall query carries a forward-prediction phrase AND the closest
|
|
7
|
-
* matching prediction class has closed historical data.
|
|
8
|
-
*
|
|
9
|
-
* The agent sees its track record at the moment of forecasting, anchoring
|
|
10
|
-
* on the outside view (Lovallo-Kahneman 2003) rather than the inside-view
|
|
11
|
-
* inside the planning fallacy.
|
|
12
|
-
*/
|
|
4
|
+
/** Surface delivered on `RecallResult.planningFallacyHint` when a recall query carries a forward-prediction phrase and the closest class has closed history,
|
|
5
|
+
* so the agent sees its own track record at the moment of forecasting. */
|
|
13
6
|
export interface PlanningFallacyHint {
|
|
14
7
|
classTag: string;
|
|
15
8
|
/** Verbatim PredictionBaserate.summary, e.g.
|
|
@@ -17,50 +10,34 @@ export interface PlanningFallacyHint {
|
|
|
17
10
|
baserateSummary: string;
|
|
18
11
|
/** Discriminator vs hypothetical future manual-override hints. */
|
|
19
12
|
source: 'j3.2-auto';
|
|
20
|
-
/** The regex match snippet that triggered detection
|
|
21
|
-
* see WHY the hint appeared and self-correct if detection misfires
|
|
22
|
-
* (e.g. "I wasn't predicting; ignore"). */
|
|
13
|
+
/** The regex match snippet that triggered detection, so the agent sees WHY the hint appeared and can self-correct if detection misfired. */
|
|
23
14
|
detectedPhrase: string;
|
|
24
15
|
nClosed: number;
|
|
25
16
|
/** Null only when every closed-row had estimate_value=0 (ratio undefined). */
|
|
26
17
|
meanRatio: number | null;
|
|
27
18
|
}
|
|
28
|
-
/**
|
|
29
|
-
*
|
|
30
|
-
* PlanningFallacyHint baserate was returned. Silence was the most common
|
|
31
|
-
* real-world failure: a natural-language query carries a
|
|
32
|
-
* forward-claim phrase but its non-stopword tokens don't overlap with
|
|
33
|
-
* any prediction class tag, so hippo emitted nothing despite
|
|
34
|
-
* the regex match. The watching variant surfaces the detection event
|
|
35
|
-
* + a one-line suggestion so the agent can either re-tag the prediction
|
|
36
|
-
* or pass the suggestion through to the user.
|
|
37
|
-
*/
|
|
19
|
+
/** "Watching" variant emitted when the forward-claim regex matched but no baserate hint was returned (no prediction class tag overlaps the query's tokens).
|
|
20
|
+
* It surfaces the detection plus a one-line suggestion so the agent can re-tag the prediction or pass the suggestion to the user. */
|
|
38
21
|
export interface PlanningFallacyWatching {
|
|
39
22
|
/** The forward-claim phrase the detector matched (verbatim regex match snippet). */
|
|
40
23
|
detectedPhrase: string;
|
|
41
|
-
/** Why hippo
|
|
42
|
-
*
|
|
43
|
-
* - 'tiebreak': >=2 classes tied at the same best score (silent on ambiguity). */
|
|
24
|
+
/** Why hippo could not produce a baserate hint despite the match: 'no_class_match' (no class scored >=1 on token overlap)
|
|
25
|
+
* or 'tiebreak' (>=2 classes tied at the best score; silent on ambiguity). */
|
|
44
26
|
reason: 'no_class_match' | 'tiebreak';
|
|
45
27
|
/** One-line agent-facing suggestion for how the user can give hippo
|
|
46
28
|
* enough signal to produce a baserate next time. */
|
|
47
29
|
suggestion: string;
|
|
48
30
|
}
|
|
49
|
-
/**
|
|
50
|
-
*
|
|
51
|
-
* available) OR `watching` (regex fired, no baserate), or NEITHER (mode=off,
|
|
52
|
-
* no queryText, no regex match, or nClosed=0 silent path). Never both.
|
|
53
|
-
*/
|
|
31
|
+
/** What `decidePlanningFallacy` hands to recall: EITHER `hint` (baserate available) OR `watching` (regex fired, no baserate), or NEITHER (mode=off,
|
|
32
|
+
* no queryText, no regex match, or nClosed=0). Never both. */
|
|
54
33
|
export interface PlanningFallacyOutput {
|
|
55
34
|
hint?: PlanningFallacyHint;
|
|
56
35
|
watching?: PlanningFallacyWatching;
|
|
57
36
|
}
|
|
58
37
|
export type AutodebiasMode = 'off' | 'regex';
|
|
59
38
|
export interface ComputePlanningFallacyHintOpts {
|
|
60
|
-
/** Override env
|
|
61
|
-
*
|
|
62
|
-
* reload). 'off' short-circuits to null BEFORE the regex gate so the
|
|
63
|
-
* AUTODEBIAS=off path pays zero work. */
|
|
39
|
+
/** Override env; undefined reads process.env.HIPPO_AUTODEBIAS per call (so tests can toggle it).
|
|
40
|
+
* 'off' short-circuits to null before the regex gate. */
|
|
64
41
|
mode?: AutodebiasMode;
|
|
65
42
|
}
|
|
66
43
|
/** The output a claim earns from its evidence, and the audit row that records the decision when there is one. */
|
package/dist/rerankers/clef.js
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { envClefEndpoint, envClefEndpointToken, envClefTimeoutMs, envCloudflareAccountId, envCloudflareApiToken } from '../util/env.js';
|
|
2
2
|
import { buildRelevanceRequest, JEV_DEFAULT_TOP_K, rankByScores } from './jev.js';
|
|
3
3
|
import { createOutageWarning } from './outage-warning.js';
|
|
4
|
-
import { rerankerPost } from './remote.js';
|
|
5
|
-
import {
|
|
4
|
+
import { rerankerPost, RERANKER_MAX_REPLY_BYTES } from './remote.js';
|
|
5
|
+
import { readCappedJson } from '../util/capped-json.js';
|
|
6
|
+
import { isJsonObject, isJsonString } from '../util/json.js';
|
|
6
7
|
import { errorMessage } from '../util/log.js';
|
|
7
8
|
const RAY_ID_MAX_CHARS = 64;
|
|
8
9
|
const CLEF_MODELS = ['clef-flash', 'clef'];
|
|
9
10
|
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
10
11
|
const MAX_TIMEOUT_MS = 120_000;
|
|
11
|
-
// 64 answers fit in a few KB; 1 MiB leaves room for a verbose envelope.
|
|
12
|
-
const MAX_REPLY_BYTES = 1024 * 1024;
|
|
13
12
|
// Workers AI rejects a request with more than 64 questions, one per candidate here.
|
|
14
13
|
const MAX_CANDIDATES = 64;
|
|
15
14
|
const ACCOUNT_ID = /^[0-9a-f]{32}$/i;
|
|
@@ -24,9 +23,6 @@ function isLoopback(hostname) {
|
|
|
24
23
|
function isNumber(v) {
|
|
25
24
|
return Number.isFinite(v);
|
|
26
25
|
}
|
|
27
|
-
function isString(v) {
|
|
28
|
-
return v !== undefined && v !== null && v.constructor === String;
|
|
29
|
-
}
|
|
30
26
|
function isRejection(v) {
|
|
31
27
|
return v.constructor === String;
|
|
32
28
|
}
|
|
@@ -84,7 +80,7 @@ export function parseClefReply(body, n, model, requireModel) {
|
|
|
84
80
|
if (!isJsonObject(reply))
|
|
85
81
|
return 'reply has no result object';
|
|
86
82
|
const actual = reply.model;
|
|
87
|
-
if (actual !== undefined && (!
|
|
83
|
+
if (actual !== undefined && (!isJsonString(actual) || actual.trim() !== model))
|
|
88
84
|
return 'reply names a different model';
|
|
89
85
|
if (actual === undefined && requireModel)
|
|
90
86
|
return 'reply does not name its model';
|
|
@@ -106,38 +102,11 @@ export function parseClefReply(body, n, model, requireModel) {
|
|
|
106
102
|
const usage = isJsonObject(reply.usage) ? reply.usage : {};
|
|
107
103
|
return {
|
|
108
104
|
scores,
|
|
109
|
-
actualModel:
|
|
105
|
+
actualModel: isJsonString(actual) ? actual.trim() : undefined,
|
|
110
106
|
inputTokens: isNumber(usage.input_tokens) ? usage.input_tokens : undefined,
|
|
111
107
|
outputTokens: isNumber(usage.output_tokens) ? usage.output_tokens : undefined,
|
|
112
108
|
};
|
|
113
109
|
}
|
|
114
|
-
// The timeout bounds time, not bytes: a hostile endpoint could stream a huge 2xx body into memory.
|
|
115
|
-
async function readCappedJson(resp) {
|
|
116
|
-
if (!resp.body)
|
|
117
|
-
throw new Error('reply has no body');
|
|
118
|
-
const reader = resp.body.getReader();
|
|
119
|
-
const decoder = new TextDecoder();
|
|
120
|
-
let raw = '';
|
|
121
|
-
let received = 0;
|
|
122
|
-
for (;;) {
|
|
123
|
-
const { done, value } = await reader.read();
|
|
124
|
-
if (done)
|
|
125
|
-
break;
|
|
126
|
-
received += value.byteLength;
|
|
127
|
-
if (received > MAX_REPLY_BYTES) {
|
|
128
|
-
await reader.cancel();
|
|
129
|
-
throw new Error(`reply over ${MAX_REPLY_BYTES} bytes`);
|
|
130
|
-
}
|
|
131
|
-
raw += decoder.decode(value, { stream: true });
|
|
132
|
-
}
|
|
133
|
-
raw += decoder.decode();
|
|
134
|
-
try {
|
|
135
|
-
return JSON.parse(raw);
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
throw new Error('reply is not JSON');
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
110
|
async function requestScores(model, query, head, route) {
|
|
142
111
|
const { state, questions } = buildRelevanceRequest(query, head);
|
|
143
112
|
// Strict parse: parseInt would read "15s" as 15 ms, and Node clamps a delay past 2^31-1 to 1 ms.
|
|
@@ -153,7 +122,7 @@ async function requestScores(model, query, head, route) {
|
|
|
153
122
|
await resp.body?.cancel();
|
|
154
123
|
throw new Error(`HTTP ${resp.status}${ray ? `, ray ${ray}` : ''}`);
|
|
155
124
|
}
|
|
156
|
-
const body = await readCappedJson(resp);
|
|
125
|
+
const body = await readCappedJson(resp, RERANKER_MAX_REPLY_BYTES);
|
|
157
126
|
const parsed = parseClefReply(body, head.length, model, route.backend === 'cloudflare');
|
|
158
127
|
if (isRejection(parsed))
|
|
159
128
|
throw new Error(parsed);
|
|
@@ -1,4 +1,33 @@
|
|
|
1
1
|
import type { RerankerFn } from './types.js';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
interface Tokenized {
|
|
3
|
+
readonly input_ids: object;
|
|
4
|
+
readonly attention_mask: object;
|
|
5
|
+
}
|
|
6
|
+
type TokenizerFn = (text: string, opts: {
|
|
7
|
+
text_pair: string;
|
|
8
|
+
padding: boolean;
|
|
9
|
+
truncation: boolean;
|
|
10
|
+
}) => Promise<Tokenized>;
|
|
11
|
+
type SeqClsModel = (inputs: Tokenized) => Promise<{
|
|
12
|
+
logits: {
|
|
13
|
+
data: ArrayLike<number>;
|
|
14
|
+
};
|
|
15
|
+
}>;
|
|
16
|
+
interface FromPretrained<T> {
|
|
17
|
+
from_pretrained: (model: string) => Promise<T>;
|
|
18
|
+
}
|
|
19
|
+
interface TransformersExports {
|
|
20
|
+
AutoTokenizer?: FromPretrained<TokenizerFn>;
|
|
21
|
+
AutoModelForSequenceClassification?: FromPretrained<SeqClsModel>;
|
|
22
|
+
}
|
|
23
|
+
interface TransformersModuleNamespace extends TransformersExports {
|
|
24
|
+
default?: TransformersExports;
|
|
25
|
+
}
|
|
26
|
+
type ImportModule = () => Promise<{
|
|
27
|
+
readonly name: string;
|
|
28
|
+
readonly mod: TransformersModuleNamespace;
|
|
29
|
+
} | null>;
|
|
30
|
+
/** Track 2 reranker: MS-MARCO MiniLM cross-encoder, identity fallback if the model will not load. Each instance owns its model and outage warning. */
|
|
31
|
+
export declare function createCrossEncoderReranker(importModule?: ImportModule): RerankerFn;
|
|
32
|
+
export {};
|
|
4
33
|
//# sourceMappingURL=cross-encoder.d.ts.map
|
|
@@ -1,110 +1,53 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';
|
|
2
|
-
import { pathToFileURL } from 'node:url';
|
|
3
1
|
import { createOutageWarning } from './outage-warning.js';
|
|
4
2
|
import { compareScoresDesc } from '../core/compare.js';
|
|
5
|
-
import {
|
|
3
|
+
import { createModelLoads, importTransformers, MODEL_LOAD_POLICY } from '../embeddings/transformers.js';
|
|
4
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
6
5
|
const DEFAULT_CROSS_ENCODER_TOP_K = 50;
|
|
7
6
|
const MODEL_NAME = 'Xenova/ms-marco-MiniLM-L-6-v2';
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
catch {
|
|
19
|
-
// import.meta.resolve is missing under some module runners (vitest's
|
|
20
|
-
// included); fall through to the require-based resolve there.
|
|
21
|
-
try {
|
|
22
|
-
return pathToFileURL(_require.resolve(name)).href;
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
// Try the legacy fallback only when the preferred package is not installed.
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return null;
|
|
7
|
+
async function importModelClasses(importModule) {
|
|
8
|
+
const imported = await importModule();
|
|
9
|
+
if (!imported)
|
|
10
|
+
throw new Error('no Transformers.js package is installed');
|
|
11
|
+
const { name, mod } = imported;
|
|
12
|
+
const tok = mod.AutoTokenizer ?? mod.default?.AutoTokenizer;
|
|
13
|
+
const seq = mod.AutoModelForSequenceClassification ?? mod.default?.AutoModelForSequenceClassification;
|
|
14
|
+
if (!tok || !seq)
|
|
15
|
+
throw new Error(`${name} exports no AutoTokenizer or AutoModelForSequenceClassification`);
|
|
16
|
+
return { AutoTokenizer: tok, AutoModelForSequenceClassification: seq };
|
|
30
17
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
18
|
+
// NOT the text-classification pipeline: this is a num_labels=1 regression head and that pipeline softmaxes a length-1 logit vector (always 1.0).
|
|
19
|
+
// Read the logit, then squash it.
|
|
20
|
+
async function buildPipeline(importModule) {
|
|
21
|
+
const mod = await importModelClasses(importModule);
|
|
22
|
+
const [tokenizer, model] = await Promise.all([
|
|
23
|
+
mod.AutoTokenizer.from_pretrained(MODEL_NAME),
|
|
24
|
+
mod.AutoModelForSequenceClassification.from_pretrained(MODEL_NAME),
|
|
25
|
+
]);
|
|
26
|
+
return async (query, candidate) => {
|
|
27
|
+
const inputs = await tokenizer(query, {
|
|
28
|
+
text_pair: candidate,
|
|
29
|
+
padding: true,
|
|
30
|
+
truncation: true,
|
|
31
|
+
});
|
|
32
|
+
const { logits } = await model(inputs);
|
|
33
|
+
const score = 1 / (1 + Math.exp(-Number(logits.data[0])));
|
|
34
|
+
// NaN would make the sort comparator a no-op; throwing hands this
|
|
35
|
+
// candidate to the per-candidate fallback instead.
|
|
36
|
+
if (!Number.isFinite(score))
|
|
37
|
+
throw new Error('cross-encoder returned a non-finite score');
|
|
38
|
+
return score;
|
|
39
|
+
};
|
|
47
40
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (!mod)
|
|
57
|
-
return null;
|
|
58
|
-
const [tokenizer, model] = await Promise.all([
|
|
59
|
-
mod.AutoTokenizer.from_pretrained(MODEL_NAME),
|
|
60
|
-
mod.AutoModelForSequenceClassification.from_pretrained(MODEL_NAME),
|
|
61
|
-
]);
|
|
62
|
-
return async (query, candidate) => {
|
|
63
|
-
const inputs = await tokenizer(query, {
|
|
64
|
-
text_pair: candidate,
|
|
65
|
-
padding: true,
|
|
66
|
-
truncation: true,
|
|
67
|
-
});
|
|
68
|
-
const { logits } = await model(inputs);
|
|
69
|
-
const score = 1 / (1 + Math.exp(-Number(logits.data[0])));
|
|
70
|
-
// NaN would make the sort comparator a no-op; throwing hands this
|
|
71
|
-
// candidate to the per-candidate fallback instead.
|
|
72
|
-
if (!Number.isFinite(score))
|
|
73
|
-
throw new Error('cross-encoder returned a non-finite score');
|
|
74
|
-
return score;
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
catch (err) {
|
|
78
|
-
log.debug(`cross-encoder: model load failed: ${errorMessage(err)}`);
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
// One shared in-flight load: two first calls must not fetch the model twice.
|
|
83
|
-
// A failed load clears the slot so a later call can try again.
|
|
84
|
-
function loadPipeline() {
|
|
85
|
-
pipelineLoading ??= buildPipeline().then((pipe) => {
|
|
86
|
-
if (!pipe)
|
|
87
|
-
pipelineLoading = null;
|
|
88
|
-
return pipe;
|
|
89
|
-
});
|
|
90
|
-
return pipelineLoading;
|
|
41
|
+
/** The head in its input order, scored as it came. */
|
|
42
|
+
function identityOrder(head) {
|
|
43
|
+
return head.map((r, i) => ({
|
|
44
|
+
...r,
|
|
45
|
+
rerankScore: r.score,
|
|
46
|
+
preRerankRank: r.preRerankRank ?? i + 1,
|
|
47
|
+
postRerankRank: i + 1,
|
|
48
|
+
}));
|
|
91
49
|
}
|
|
92
|
-
|
|
93
|
-
export const crossEncoderReranker = async (query, results, options) => {
|
|
94
|
-
const topK = options?.topK ?? DEFAULT_CROSS_ENCODER_TOP_K;
|
|
95
|
-
const head = results.slice(0, topK);
|
|
96
|
-
const pipe = await loadPipeline();
|
|
97
|
-
if (!pipe) {
|
|
98
|
-
// A silent identity fallback otherwise reads as a working reranker.
|
|
99
|
-
outage.failed('no Transformers.js backend, or model fetch blocked');
|
|
100
|
-
return head.map((r, i) => ({
|
|
101
|
-
...r,
|
|
102
|
-
rerankScore: r.score,
|
|
103
|
-
preRerankRank: r.preRerankRank ?? i + 1,
|
|
104
|
-
postRerankRank: i + 1,
|
|
105
|
-
}));
|
|
106
|
-
}
|
|
107
|
-
outage.answered();
|
|
50
|
+
async function scoreHead(pipe, query, head) {
|
|
108
51
|
const scored = await Promise.all(head.map(async (r, i) => {
|
|
109
52
|
let ceScore;
|
|
110
53
|
try {
|
|
@@ -127,5 +70,26 @@ export const crossEncoderReranker = async (query, results, options) => {
|
|
|
127
70
|
scored.sort((a, b) => compareScoresDesc(a.rerankScore, b.rerankScore));
|
|
128
71
|
scored.forEach((r, i) => (r.postRerankRank = i + 1));
|
|
129
72
|
return scored;
|
|
130
|
-
}
|
|
73
|
+
}
|
|
74
|
+
/** Track 2 reranker: MS-MARCO MiniLM cross-encoder, identity fallback if the model will not load. Each instance owns its model and outage warning. */
|
|
75
|
+
export function createCrossEncoderReranker(importModule = importTransformers) {
|
|
76
|
+
const outage = createOutageWarning('cross-encoder', 'falling back to identity ordering');
|
|
77
|
+
// The outage warning already says each failure, at most once per window, so the loads report nothing themselves.
|
|
78
|
+
const pipelines = createModelLoads(MODEL_LOAD_POLICY);
|
|
79
|
+
return async (query, results, options) => {
|
|
80
|
+
const head = results.slice(0, options?.topK ?? DEFAULT_CROSS_ENCODER_TOP_K);
|
|
81
|
+
let pipe;
|
|
82
|
+
try {
|
|
83
|
+
// One shared load per backoff window: two first calls fetch the model once, and a failure is not fetched again on every recall.
|
|
84
|
+
pipe = await pipelines.load(MODEL_NAME, () => buildPipeline(importModule));
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
// A silent identity fallback otherwise reads as a working reranker.
|
|
88
|
+
outage.failed(errorMessage(err), errorFields(err));
|
|
89
|
+
return identityOrder(head);
|
|
90
|
+
}
|
|
91
|
+
outage.answered();
|
|
92
|
+
return scoreHead(pipe, query, head);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
131
95
|
//# sourceMappingURL=cross-encoder.js.map
|
package/dist/rerankers/index.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { createClefReranker } from './clef.js';
|
|
2
|
-
import {
|
|
2
|
+
import { createCrossEncoderReranker } from './cross-encoder.js';
|
|
3
3
|
import { createJevReranker } from './jev.js';
|
|
4
4
|
import { createLlmReranker } from './llm.js';
|
|
5
|
-
// Each
|
|
5
|
+
// Each reranker is built once here, so its outage warning lasts the process; jev falls back to the same cross-encoder, so one model loads.
|
|
6
|
+
const crossEncoder = createCrossEncoderReranker();
|
|
6
7
|
const REGISTRY = {
|
|
7
8
|
clef: createClefReranker('clef'),
|
|
8
9
|
'clef-flash': createClefReranker('clef-flash'),
|
|
9
|
-
'cross-encoder':
|
|
10
|
-
jev: createJevReranker(
|
|
10
|
+
'cross-encoder': crossEncoder,
|
|
11
|
+
jev: createJevReranker(crossEncoder),
|
|
11
12
|
llm: createLlmReranker(),
|
|
12
13
|
};
|
|
13
14
|
function isRegisteredRerankerName(name) {
|
package/dist/rerankers/jev.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { truncateWithEllipsis } from '../util/ellipsize.js';
|
|
1
2
|
import { envJevModel, envJevTimeoutMs, envTypesafeApiKey } from '../util/env.js';
|
|
2
3
|
import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
3
4
|
import { createOutageWarning } from './outage-warning.js';
|
|
4
|
-
import { rerankerPost } from './remote.js';
|
|
5
|
+
import { rerankerPost, RERANKER_MAX_REPLY_BYTES } from './remote.js';
|
|
6
|
+
import { readCappedJson } from '../util/capped-json.js';
|
|
7
|
+
import { isJsonNumber, isJsonObject } from '../util/json.js';
|
|
5
8
|
import { compareScoresDesc } from '../core/compare.js';
|
|
6
9
|
import { errorMessage } from '../util/log.js';
|
|
7
10
|
const REQUEST_ID_MAX_CHARS = 64;
|
|
@@ -13,20 +16,19 @@ const TRUNCATE_CHARS = 1200;
|
|
|
13
16
|
const DEFAULT_MODEL = 'jev-1.13.0';
|
|
14
17
|
// The pool size the eval numbers were measured at.
|
|
15
18
|
export const JEV_DEFAULT_TOP_K = 40;
|
|
16
|
-
function truncate(s, n) {
|
|
17
|
-
return s.length <= n ? s : `${s.slice(0, n)}...`;
|
|
18
|
-
}
|
|
19
19
|
// Number.isFinite rejects a string or null without coercing it, which the
|
|
20
20
|
// declared type cannot promise about a third-party payload.
|
|
21
21
|
function isProbability(v) {
|
|
22
|
-
return v
|
|
22
|
+
return isJsonNumber(v) && Number.isFinite(v) && v >= 0 && v <= 1;
|
|
23
23
|
}
|
|
24
24
|
// A half-scored list ranks worse than the order it would replace, so one bad
|
|
25
25
|
// answer voids the whole response.
|
|
26
|
-
function parseScores(
|
|
26
|
+
function parseScores(body, n) {
|
|
27
|
+
const answers = isJsonObject(body) ? body.answers : undefined;
|
|
27
28
|
const out = [];
|
|
28
29
|
for (let i = 1; i <= n; i++) {
|
|
29
|
-
const
|
|
30
|
+
const answer = isJsonObject(answers) ? answers[`c${i}`] : undefined;
|
|
31
|
+
const v = isJsonObject(answer) ? answer.noul : undefined;
|
|
30
32
|
if (!isProbability(v))
|
|
31
33
|
return null;
|
|
32
34
|
out.push(v);
|
|
@@ -36,7 +38,7 @@ function parseScores(answers, n) {
|
|
|
36
38
|
/** Redacted query plus numbered, redacted, truncated candidates. Shared with CLEF so both arms see matched input. */
|
|
37
39
|
export function buildRelevanceRequest(query, head) {
|
|
38
40
|
// Strict: this text leaves the machine, so Bearer, Basic-auth and JWT shapes go too.
|
|
39
|
-
const lines = head.map((r, i) => `[${i + 1}] ${
|
|
41
|
+
const lines = head.map((r, i) => `[${i + 1}] ${truncateWithEllipsis(redactSecretsStrict(r.entry.content), TRUNCATE_CHARS)}`);
|
|
40
42
|
const state = `Query: ${redactSecretsStrict(query)}\n\nNumbered candidate memories from an AI coding agent's project store:\n\n${lines.join('\n\n')}`;
|
|
41
43
|
const questions = {};
|
|
42
44
|
for (let i = 1; i <= head.length; i++) {
|
|
@@ -67,8 +69,7 @@ async function requestScores(query, head) {
|
|
|
67
69
|
await resp.body?.cancel();
|
|
68
70
|
throw new Error(`HTTP ${resp.status}${requestId ? `, request ${requestId}` : ''}`);
|
|
69
71
|
}
|
|
70
|
-
const
|
|
71
|
-
const scores = parseScores(body.answers, head.length);
|
|
72
|
+
const scores = parseScores(await readCappedJson(resp, RERANKER_MAX_REPLY_BYTES), head.length);
|
|
72
73
|
if (!scores)
|
|
73
74
|
throw new Error('incomplete or out-of-range answers');
|
|
74
75
|
return scores;
|
package/dist/rerankers/llm.d.ts
CHANGED
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
import type { RerankerFn } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
* OpenAI-compatible endpoint. Gated on HIPPO_LLM_RERANKER_URL to prevent
|
|
5
|
-
* accidental cost.
|
|
6
|
-
*
|
|
7
|
-
* Skeleton only; full characterisation is deferred.
|
|
8
|
-
*
|
|
9
|
-
* Timeout: defaults to 30s for the whole call, retries included; overridable
|
|
10
|
-
* via HIPPO_LLM_RERANKER_TIMEOUT_MS. On timeout or any failure the reranker
|
|
11
|
-
* falls back to identity ordering; recall must not hang on a wedged endpoint.
|
|
12
|
-
*/
|
|
2
|
+
/** Track 3 reranker (skeleton): listwise LLM rerank on a customer-supplied OpenAI-compatible endpoint, gated on HIPPO_LLM_RERANKER_URL against accidental cost.
|
|
3
|
+
* Timeout is 30s for the whole call, retries included (HIPPO_LLM_RERANKER_TIMEOUT_MS); any failure falls back to identity ordering, so recall never hangs. */
|
|
13
4
|
export declare function createLlmReranker(): RerankerFn;
|
|
14
5
|
//# sourceMappingURL=llm.d.ts.map
|
package/dist/rerankers/llm.js
CHANGED
|
@@ -1,21 +1,14 @@
|
|
|
1
1
|
import { envLlmRerankerKey, envLlmRerankerModel, envLlmRerankerTimeoutMs, envLlmRerankerUrl } from '../util/env.js';
|
|
2
2
|
import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
3
3
|
import { createOutageWarning } from './outage-warning.js';
|
|
4
|
-
import { rerankerPost } from './remote.js';
|
|
4
|
+
import { rerankerPost, RERANKER_MAX_REPLY_BYTES } from './remote.js';
|
|
5
|
+
import { readCappedJson } from '../util/capped-json.js';
|
|
6
|
+
import { isJsonObject, isJsonString } from '../util/json.js';
|
|
5
7
|
import { errorMessage } from '../util/log.js';
|
|
6
8
|
const DEFAULT_LLM_RERANK_TOP_K = 20;
|
|
7
9
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
10
|
-
* OpenAI-compatible endpoint. Gated on HIPPO_LLM_RERANKER_URL to prevent
|
|
11
|
-
* accidental cost.
|
|
12
|
-
*
|
|
13
|
-
* Skeleton only; full characterisation is deferred.
|
|
14
|
-
*
|
|
15
|
-
* Timeout: defaults to 30s for the whole call, retries included; overridable
|
|
16
|
-
* via HIPPO_LLM_RERANKER_TIMEOUT_MS. On timeout or any failure the reranker
|
|
17
|
-
* falls back to identity ordering; recall must not hang on a wedged endpoint.
|
|
18
|
-
*/
|
|
10
|
+
/** Track 3 reranker (skeleton): listwise LLM rerank on a customer-supplied OpenAI-compatible endpoint, gated on HIPPO_LLM_RERANKER_URL against accidental cost.
|
|
11
|
+
* Timeout is 30s for the whole call, retries included (HIPPO_LLM_RERANKER_TIMEOUT_MS); any failure falls back to identity ordering, so recall never hangs. */
|
|
19
12
|
export function createLlmReranker() {
|
|
20
13
|
const outage = createOutageWarning('llm', 'keeping the input order');
|
|
21
14
|
return async (query, results, options) => {
|
|
@@ -42,6 +35,14 @@ export function createLlmReranker() {
|
|
|
42
35
|
}));
|
|
43
36
|
};
|
|
44
37
|
}
|
|
38
|
+
/** The first choice's message text, or '' when the reply has none. */
|
|
39
|
+
function replyText(body) {
|
|
40
|
+
const choices = isJsonObject(body) ? body.choices : undefined;
|
|
41
|
+
const choice = Array.isArray(choices) ? choices[0] : undefined;
|
|
42
|
+
const message = isJsonObject(choice) ? choice.message : undefined;
|
|
43
|
+
const content = isJsonObject(message) ? message.content : undefined;
|
|
44
|
+
return isJsonString(content) ? content : '';
|
|
45
|
+
}
|
|
45
46
|
/** One chat-completions call; rejects with the reason when the reply holds no usable permutation. */
|
|
46
47
|
async function requestPermutation(url, query, head) {
|
|
47
48
|
const key = envLlmRerankerKey();
|
|
@@ -69,8 +70,7 @@ async function requestPermutation(url, query, head) {
|
|
|
69
70
|
await resp.body?.cancel();
|
|
70
71
|
throw new Error(`HTTP ${resp.status}`);
|
|
71
72
|
}
|
|
72
|
-
const
|
|
73
|
-
const txt = j.choices?.[0]?.message?.content ?? '';
|
|
73
|
+
const txt = replyText(await readCappedJson(resp, RERANKER_MAX_REPLY_BYTES));
|
|
74
74
|
const m = txt.match(/\[\s*(\d+(?:\s*,\s*\d+)*)\s*\]/);
|
|
75
75
|
const parsed = m ? m[1].split(',').map((s) => parseInt(s.trim(), 10)) : [];
|
|
76
76
|
const isPermutation = parsed.length === head.length &&
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { type LogFields } from '../util/log.js';
|
|
1
2
|
export interface OutageWarning {
|
|
2
|
-
|
|
3
|
+
/** `fields` carries the error's class and stack onto the warning line. */
|
|
4
|
+
failed(reason: string, fields?: LogFields): void;
|
|
3
5
|
answered(): void;
|
|
4
6
|
}
|
|
5
|
-
/** Warns when `name` starts failing, at most every five minutes while it keeps failing,
|
|
7
|
+
/** Warns when `name` starts failing, at most every five minutes while it keeps failing,
|
|
8
|
+
* and once when it answers again. `fallback` says what recall does meanwhile. */
|
|
6
9
|
export declare function createOutageWarning(name: string, fallback: string): OutageWarning;
|
|
7
10
|
//# sourceMappingURL=outage-warning.d.ts.map
|
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
// One way for a reranker to report that it stopped working, without a line per recall.
|
|
2
|
+
import { MINUTE_MS } from '../util/time.js';
|
|
2
3
|
import { log } from '../util/log.js';
|
|
3
|
-
const REPEAT_MS = 5 *
|
|
4
|
-
/** Warns when `name` starts failing, at most every five minutes while it keeps failing,
|
|
4
|
+
const REPEAT_MS = 5 * MINUTE_MS;
|
|
5
|
+
/** Warns when `name` starts failing, at most every five minutes while it keeps failing,
|
|
6
|
+
* and once when it answers again. `fallback` says what recall does meanwhile. */
|
|
5
7
|
export function createOutageWarning(name, fallback) {
|
|
6
8
|
let failures = 0;
|
|
7
9
|
let unreported = 0;
|
|
8
10
|
let warnedAt = 0;
|
|
9
11
|
return {
|
|
10
|
-
failed(reason) {
|
|
12
|
+
failed(reason, fields) {
|
|
11
13
|
failures++;
|
|
12
14
|
if (failures > 1 && Date.now() - warnedAt < REPEAT_MS) {
|
|
13
15
|
unreported++;
|
|
14
16
|
return;
|
|
15
17
|
}
|
|
16
18
|
const skipped = unreported > 0 ? ` ${unreported} more calls failed since the last warning.` : '';
|
|
17
|
-
|
|
19
|
+
const repeat = `While it fails this repeats at most every ${REPEAT_MS / MINUTE_MS} minutes.`;
|
|
20
|
+
log.warn(`${name} reranker unavailable (${reason}); ${fallback}.${skipped} ${repeat}`, fields);
|
|
18
21
|
warnedAt = Date.now();
|
|
19
22
|
unreported = 0;
|
|
20
23
|
},
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export declare const RERANKER_MAX_REPLY_BYTES: number;
|
|
1
2
|
/** POST a scoring request. A dropped connection, 429 or 5xx is retried, since scoring changes nothing on the far side. */
|
|
2
3
|
export declare function rerankerPost(url: string, init: RequestInit, budgetMs: number): Promise<Response>;
|
|
3
4
|
//# sourceMappingURL=remote.d.ts.map
|
package/dist/rerankers/remote.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { fetchWithRetry } from '../util/http-retry.js';
|
|
3
3
|
// A Retry-After longer than this would outlast most budgets, so the answer is handed back and the reranker falls back.
|
|
4
4
|
const RETRY_WAIT_CAP_MS = 2_000;
|
|
5
|
+
// Every reranker reads its reply through this cap; the largest honest reply is a few KB, and 1 MiB leaves room for a verbose envelope.
|
|
6
|
+
export const RERANKER_MAX_REPLY_BYTES = 1024 * 1024;
|
|
5
7
|
/** POST a scoring request. A dropped connection, 429 or 5xx is retried, since scoring changes nothing on the far side. */
|
|
6
8
|
export async function rerankerPost(url, init, budgetMs) {
|
|
7
9
|
// The budget bounds the whole call, retries included, so recall never waits past the configured timeout.
|