@inflexa-ai/harness 0.45.1 → 0.46.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 +6 -3
- package/dist/agents/conversation-agent.d.ts +9 -3
- package/dist/agents/conversation-agent.js +34 -33
- package/dist/agents/report-session-agent.d.ts +15 -15
- package/dist/agents/report-session-agent.js +23 -15
- package/dist/agents/sandbox/index.d.ts +1 -1
- package/dist/agents/sandbox/index.js +1 -1
- package/dist/agents/sandbox/shared.d.ts +12 -14
- package/dist/agents/sandbox/shared.js +18 -12
- package/dist/agents/sandbox/types.d.ts +4 -4
- package/dist/agents/sandbox/validate-skills.d.ts +2 -2
- package/dist/agents/sandbox/validate-skills.js +3 -1
- package/dist/agents/sandbox-catalog.d.ts +2 -2
- package/dist/agents/sandbox-catalog.js +3 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/chat-turn-workflow.d.ts +114 -0
- package/dist/app/chat-turn-workflow.js +307 -0
- package/dist/app/chat-turn.d.ts +85 -57
- package/dist/app/chat-turn.js +123 -100
- package/dist/app/data-profile-orientation.js +10 -8
- package/dist/app/data-profile-view.d.ts +4 -4
- package/dist/app/data-profile-view.js +9 -8
- package/dist/app/in-process-turn.d.ts +42 -0
- package/dist/app/in-process-turn.js +139 -0
- package/dist/app/message-assembly.d.ts +10 -4
- package/dist/app/message-assembly.js +13 -8
- package/dist/app/report-session-runtime.d.ts +4 -4
- package/dist/app/report-session-runtime.js +36 -21
- package/dist/app/spawn-report-session.d.ts +33 -28
- package/dist/app/spawn-report-session.js +25 -40
- package/dist/app/synthesize-run.d.ts +22 -16
- package/dist/app/synthesize-run.js +41 -35
- package/dist/app/work.d.ts +96 -0
- package/dist/app/work.js +147 -0
- package/dist/auth/local-auth-context.d.ts +1 -3
- package/dist/auth/local-auth-context.js +1 -3
- package/dist/auth/local-run-authorizer.d.ts +1 -1
- package/dist/auth/local-run-authorizer.js +5 -3
- package/dist/auth/types.d.ts +26 -26
- package/dist/billing/cached-resolver.d.ts +4 -4
- package/dist/billing/run-charge.d.ts +5 -8
- package/dist/billing/run-charge.js +2 -2
- package/dist/billing/usage-recorder.d.ts +9 -9
- package/dist/citations/aggregate.js +1 -1
- package/dist/citations/clients/arxiv.d.ts +2 -2
- package/dist/citations/clients/arxiv.js +12 -4
- package/dist/citations/clients/common.js +4 -2
- package/dist/citations/clients/crossref.d.ts +2 -2
- package/dist/citations/clients/crossref.js +37 -37
- package/dist/citations/clients/doi-registry.js +15 -16
- package/dist/citations/clients/pubmed.d.ts +2 -2
- package/dist/citations/clients/pubmed.js +20 -13
- package/dist/citations/clients/semantic-scholar.d.ts +2 -2
- package/dist/citations/clients/semantic-scholar.js +9 -9
- package/dist/citations/compare.js +2 -2
- package/dist/citations/match.d.ts +2 -2
- package/dist/citations/match.js +12 -7
- package/dist/citations/normalize.js +35 -26
- package/dist/citations/plan.js +6 -2
- package/dist/citations/resolve.d.ts +6 -6
- package/dist/citations/resolve.js +34 -25
- package/dist/citations/types.d.ts +77 -77
- package/dist/config/environment-stores.d.ts +6 -6
- package/dist/config/resource-limits.js +1 -3
- package/dist/contracts/analogy-report.d.ts +7 -7
- package/dist/contracts/analogy-report.js +2 -2
- package/dist/contracts/chat-events.d.ts +38 -24
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +64 -41
- package/dist/contracts/chat-parts.d.ts +130 -67
- package/dist/contracts/chat-parts.js +1 -0
- package/dist/contracts/content-url.js +16 -2
- package/dist/contracts/data-profile.d.ts +38 -38
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/message.d.ts +6 -6
- package/dist/contracts/organ-system.d.ts +11 -11
- package/dist/contracts/part-registry.d.ts +5 -4
- package/dist/contracts/part-registry.js +5 -0
- package/dist/contracts/profile-vocabulary.d.ts +11 -10
- package/dist/contracts/profile-vocabulary.js +10 -3
- package/dist/contracts/report-blocks.d.ts +329 -329
- package/dist/contracts/report-reference.d.ts +105 -81
- package/dist/contracts/report-reference.js +30 -13
- package/dist/contracts/schemas/chat-events.d.ts +30 -16
- package/dist/contracts/schemas/chat-events.js +15 -6
- package/dist/contracts/schemas/chat-parts.d.ts +175 -102
- package/dist/contracts/schemas/chat-parts.js +33 -7
- package/dist/contracts/severity.d.ts +1 -1
- package/dist/contracts/structure-source.d.ts +3 -3
- package/dist/contracts/structure-source.js +6 -2
- package/dist/contracts/subagent-activity.d.ts +2 -2
- package/dist/contracts/subagent-activity.js +5 -3
- package/dist/contracts/usage.d.ts +2 -2
- package/dist/data/safety-panel-schema.d.ts +25 -25
- package/dist/data/safety-panel-schema.js +13 -4
- package/dist/execution/artifact-metadata.d.ts +23 -15
- package/dist/execution/artifact-metadata.js +33 -10
- package/dist/execution/artifact-record.d.ts +2 -2
- package/dist/execution/artifact-registration.d.ts +5 -5
- package/dist/execution/artifact-registry.d.ts +8 -8
- package/dist/execution/dbos-run-launcher.d.ts +24 -4
- package/dist/execution/dbos-run-launcher.js +58 -4
- package/dist/execution/dbos-workflow-purger.d.ts +5 -6
- package/dist/execution/dbos-workflow-purger.js +8 -7
- package/dist/execution/input-signature.d.ts +2 -2
- package/dist/execution/post-step-pipeline.d.ts +9 -9
- package/dist/execution/post-step-pipeline.js +1 -1
- package/dist/execution/post-step.js +2 -2
- package/dist/execution/reconcile-manifest.d.ts +4 -4
- package/dist/execution/reconcile-manifest.js +3 -2
- package/dist/execution/run-authorizer.d.ts +46 -37
- package/dist/execution/run-authorizer.js +8 -8
- package/dist/execution/run-canceler.d.ts +7 -7
- package/dist/execution/run-canceler.js +14 -7
- package/dist/execution/run-end-record.d.ts +2 -3
- package/dist/execution/run-event-parts.d.ts +0 -8
- package/dist/execution/run-event-parts.js +29 -24
- package/dist/execution/run-event-stream.d.ts +8 -8
- package/dist/execution/run-event-stream.js +3 -4
- package/dist/execution/run-launcher.d.ts +4 -4
- package/dist/execution/run-synthesis.d.ts +49 -48
- package/dist/execution/run-synthesis.js +96 -255
- package/dist/execution/staged-input.d.ts +2 -2
- package/dist/execution/step-summary.d.ts +6 -6
- package/dist/execution/step-summary.js +4 -8
- package/dist/execution/topo-sort.js +4 -3
- package/dist/execution/workflow-purger.d.ts +2 -2
- package/dist/index.d.ts +17 -20
- package/dist/index.js +25 -36
- package/dist/input-sanitization.js +9 -2
- package/dist/input-scan/clustering.d.ts +6 -6
- package/dist/input-scan/clustering.js +11 -5
- package/dist/input-scan/companions.js +3 -2
- package/dist/input-scan/detect-sets.d.ts +2 -2
- package/dist/input-scan/detect-sets.js +25 -21
- package/dist/input-scan/enrich.d.ts +6 -6
- package/dist/input-scan/enrich.js +29 -12
- package/dist/input-scan/formats.d.ts +2 -2
- package/dist/input-scan/formats.js +8 -2
- package/dist/input-scan/markers.d.ts +2 -2
- package/dist/input-scan/markers.js +14 -5
- package/dist/input-scan/menu.d.ts +10 -10
- package/dist/input-scan/menu.js +0 -0
- package/dist/input-scan/quarantine.d.ts +2 -2
- package/dist/input-scan/quarantine.js +23 -18
- package/dist/input-scan/readout-budget.d.ts +2 -2
- package/dist/input-scan/readout-budget.js +1 -1
- package/dist/input-scan/readout.d.ts +2 -2
- package/dist/input-scan/readout.js +47 -34
- package/dist/input-scan/scan.d.ts +2 -2
- package/dist/input-scan/scan.js +7 -5
- package/dist/input-scan/set-types.d.ts +28 -28
- package/dist/input-scan/shapes.d.ts +4 -4
- package/dist/input-scan/shapes.js +0 -0
- package/dist/input-scan/templates.d.ts +10 -10
- package/dist/input-scan/templates.js +30 -22
- package/dist/input-scan/tokens.d.ts +6 -4
- package/dist/input-scan/tokens.js +100 -38
- package/dist/input-scan/types.d.ts +22 -22
- package/dist/lib/async-utils.d.ts +3 -7
- package/dist/lib/async-utils.js +5 -9
- package/dist/lib/cache.js +1 -1
- package/dist/lib/chrome.d.ts +46 -6
- package/dist/lib/console-logger.js +2 -2
- package/dist/lib/db-result.d.ts +22 -6
- package/dist/lib/db-result.js +9 -13
- package/dist/lib/eyes.d.ts +4 -4
- package/dist/lib/eyes.js +1 -1
- package/dist/lib/fs-helpers.js +18 -6
- package/dist/lib/fs-result.d.ts +1 -0
- package/dist/lib/fs-result.js +5 -6
- package/dist/lib/hooks.d.ts +23 -7
- package/dist/lib/hooks.js +17 -3
- package/dist/lib/host-concurrency.js +3 -2
- package/dist/lib/logger.d.ts +2 -2
- package/dist/lib/logger.js +2 -1
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/null-proto.d.ts +6 -0
- package/dist/lib/null-proto.js +17 -0
- package/dist/lib/otel-spans.d.ts +1 -1
- package/dist/lib/otel-spans.js +9 -5
- package/dist/lib/otel.d.ts +4 -2
- package/dist/lib/otel.js +10 -2
- package/dist/lib/page-capture.d.ts +8 -8
- package/dist/lib/page-capture.js +9 -4
- package/dist/lib/parse-json.d.ts +5 -0
- package/dist/lib/parse-json.js +12 -0
- package/dist/lib/present.d.ts +12 -0
- package/dist/lib/present.js +39 -0
- package/dist/lib/rate-limit.d.ts +4 -4
- package/dist/lib/rate-limit.js +12 -13
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
- package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
- package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
- package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
- package/dist/lib/regulatory-corpus.d.ts +10 -10
- package/dist/lib/regulatory-corpus.js +3 -1
- package/dist/lib/result.d.ts +10 -11
- package/dist/lib/result.js +15 -13
- package/dist/lib/storage.d.ts +2 -2
- package/dist/lib/test/async-iterable.d.ts +9 -0
- package/dist/lib/test/async-iterable.js +28 -0
- package/dist/lib/test/request-url.d.ts +5 -0
- package/dist/lib/test/request-url.js +7 -0
- package/dist/lib/test/result-assert.d.ts +12 -0
- package/dist/lib/test/result-assert.js +17 -0
- package/dist/lib/test/text-shapes.d.ts +24 -0
- package/dist/lib/test/text-shapes.js +63 -0
- package/dist/lib/text.d.ts +22 -0
- package/dist/lib/text.js +68 -0
- package/dist/lib/thrown.d.ts +18 -0
- package/dist/lib/thrown.js +30 -0
- package/dist/lib/unknown-array.d.ts +6 -0
- package/dist/lib/unknown-array.js +8 -0
- package/dist/lib/unknown-containers.d.ts +14 -0
- package/dist/lib/unknown-containers.js +17 -0
- package/dist/lib/unknown-text.d.ts +8 -0
- package/dist/lib/unknown-text.js +28 -0
- package/dist/lib/zod-issue-shape.d.ts +1 -1
- package/dist/lib/zod-issue-shape.js +31 -31
- package/dist/lib/zod-issues.d.ts +3 -3
- package/dist/lib/zod-issues.js +30 -17
- package/dist/literature/sources/arxiv.d.ts +6 -6
- package/dist/literature/sources/arxiv.js +92 -35
- package/dist/literature/sources/http.d.ts +2 -2
- package/dist/literature/sources/http.js +16 -15
- package/dist/literature/sources/pubmed.d.ts +16 -16
- package/dist/literature/sources/pubmed.js +96 -61
- package/dist/literature/sources/semantic-scholar.d.ts +8 -8
- package/dist/literature/sources/semantic-scholar.js +22 -13
- package/dist/loop/accounting.d.ts +63 -0
- package/dist/loop/accounting.js +141 -0
- package/dist/loop/call-policy.d.ts +73 -0
- package/dist/loop/call-policy.js +109 -0
- package/dist/loop/chat-stream.d.ts +62 -0
- package/dist/loop/chat-stream.js +237 -0
- package/dist/loop/compaction.d.ts +9 -9
- package/dist/loop/compaction.js +1 -1
- package/dist/loop/metrics.d.ts +12 -15
- package/dist/loop/metrics.js +14 -26
- package/dist/loop/run-loop.d.ts +233 -0
- package/dist/loop/run-loop.js +770 -0
- package/dist/loop/sub-agent.d.ts +61 -0
- package/dist/loop/sub-agent.js +161 -0
- package/dist/loop/tool-adapter.d.ts +98 -0
- package/dist/loop/tool-adapter.js +364 -0
- package/dist/loop/tool-detail.d.ts +1 -1
- package/dist/loop/tool-detail.js +6 -5
- package/dist/loop/tool-outcome.d.ts +1 -1
- package/dist/loop/tool-output.d.ts +4 -4
- package/dist/loop/tool-output.js +2 -2
- package/dist/loop/turn-credentials.d.ts +34 -0
- package/dist/loop/turn-credentials.js +73 -0
- package/dist/loop/types.d.ts +29 -38
- package/dist/loop/types.js +2 -7
- package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
- package/dist/memory/ai-sdk-message-storage.js +13 -11
- package/dist/memory/card-builders.d.ts +14 -14
- package/dist/memory/card-builders.js +19 -15
- package/dist/memory/conversation-display-recorder.d.ts +22 -4
- package/dist/memory/conversation-display-recorder.js +43 -24
- package/dist/memory/conversation-display-replay.js +3 -2
- package/dist/memory/conversation-display-storage.d.ts +15 -7
- package/dist/memory/conversation-display-storage.js +141 -36
- package/dist/memory/conversation-view.d.ts +4 -4
- package/dist/memory/conversation-view.js +5 -4
- package/dist/memory/count-tokens.js +10 -8
- package/dist/memory/derive-thread-title.d.ts +0 -13
- package/dist/memory/derive-thread-title.js +2 -1
- package/dist/memory/message-backfill.d.ts +12 -5
- package/dist/memory/message-backfill.js +5 -3
- package/dist/memory/thread-history.d.ts +36 -21
- package/dist/memory/thread-history.js +78 -54
- package/dist/memory/thread-store.d.ts +26 -17
- package/dist/memory/thread-store.js +15 -9
- package/dist/memory/tool-call-integrity.d.ts +2 -2
- package/dist/memory/tool-call-integrity.js +4 -3
- package/dist/memory/working-memory.d.ts +16 -12
- package/dist/memory/working-memory.js +72 -61
- package/dist/prompts/briefing.d.ts +12 -12
- package/dist/prompts/briefing.js +1 -1
- package/dist/prompts/synthesis-agent.d.ts +1 -1
- package/dist/prompts/synthesis-agent.js +6 -14
- package/dist/provenance/collector.d.ts +6 -6
- package/dist/provenance/collector.js +15 -8
- package/dist/provenance/exec-frame.d.ts +2 -2
- package/dist/provenance/exec-frame.js +6 -1
- package/dist/provenance/seam.d.ts +1 -4
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +283 -518
- package/dist/providers/embedding.d.ts +2 -2
- package/dist/providers/embedding.js +1 -1
- package/dist/providers/errors.d.ts +22 -2
- package/dist/providers/errors.js +98 -50
- package/dist/providers/prompt-cache.d.ts +8 -8
- package/dist/providers/prompt-cache.js +13 -11
- package/dist/providers/reasoning.d.ts +2 -2
- package/dist/providers/reasoning.js +2 -2
- package/dist/providers/types.d.ts +55 -94
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +25 -8
- package/dist/reference-data/receipt.d.ts +2 -2
- package/dist/report-model/assert-rules.js +1 -1
- package/dist/report-model/authoring-grammar.d.ts +211 -233
- package/dist/report-model/block-walk.d.ts +10 -10
- package/dist/report-model/block-walk.js +2 -0
- package/dist/report-model/draft-finish.d.ts +8 -8
- package/dist/report-model/draft-finish.js +1 -1
- package/dist/report-model/draft-hash.js +8 -7
- package/dist/report-model/draft-operations.d.ts +22 -10
- package/dist/report-model/draft-operations.js +48 -30
- package/dist/report-model/draft-read.d.ts +19 -7
- package/dist/report-model/draft-read.js +16 -6
- package/dist/report-model/draft.d.ts +844 -2
- package/dist/report-model/draft.js +3 -1
- package/dist/report-model/fixture-resolver.js +39 -16
- package/dist/report-model/pin-snapshot.d.ts +2 -2
- package/dist/report-model/pin-snapshot.js +15 -15
- package/dist/report-model/production-resolver.d.ts +18 -18
- package/dist/report-model/production-resolver.js +50 -42
- package/dist/report-model/reference-resolver.d.ts +26 -10
- package/dist/report-model/reference-resolver.js +68 -5
- package/dist/report-model/reference-stamp.js +30 -38
- package/dist/report-model/structural-validation.js +12 -4
- package/dist/report-model/validate.d.ts +7 -7
- package/dist/report-model/validate.js +6 -6
- package/dist/report-render/assets.d.ts +2 -2
- package/dist/report-render/assets.js +27 -3
- package/dist/report-render/chart-export.d.ts +10 -2
- package/dist/report-render/chart-export.js +37 -11
- package/dist/report-render/chart-presets.d.ts +8 -8
- package/dist/report-render/chart-presets.js +3 -3
- package/dist/report-render/chart-renderers.d.ts +23 -16
- package/dist/report-render/chart-renderers.js +74 -53
- package/dist/report-render/chart-toolbox.d.ts +2 -2
- package/dist/report-render/chart-toolbox.js +7 -6
- package/dist/report-render/chart.d.ts +15 -16
- package/dist/report-render/chart.js +369 -252
- package/dist/report-render/design.d.ts +36 -297
- package/dist/report-render/design.js +0 -12
- package/dist/report-render/figures/common.d.ts +12 -12
- package/dist/report-render/figures/common.js +42 -31
- package/dist/report-render/figures/dendrogram.d.ts +3 -3
- package/dist/report-render/figures/dendrogram.js +10 -10
- package/dist/report-render/figures/dense.js +15 -8
- package/dist/report-render/figures/dotplot.js +46 -33
- package/dist/report-render/figures/embedding.js +52 -43
- package/dist/report-render/figures/equal-units.d.ts +10 -10
- package/dist/report-render/figures/equal-units.js +27 -27
- package/dist/report-render/figures/forest.js +9 -7
- package/dist/report-render/figures/gsea.js +21 -11
- package/dist/report-render/figures/heatmap.js +13 -9
- package/dist/report-render/figures/index.d.ts +10 -10
- package/dist/report-render/figures/index.js +4 -2
- package/dist/report-render/figures/km.js +10 -9
- package/dist/report-render/figures/label-room.d.ts +12 -12
- package/dist/report-render/figures/label-room.js +7 -2
- package/dist/report-render/figures/locuszoom.d.ts +2 -2
- package/dist/report-render/figures/locuszoom.js +59 -31
- package/dist/report-render/figures/lollipop.js +3 -2
- package/dist/report-render/figures/ma.js +8 -4
- package/dist/report-render/figures/manhattan.d.ts +1 -2
- package/dist/report-render/figures/manhattan.js +52 -34
- package/dist/report-render/figures/oncoprint.js +4 -5
- package/dist/report-render/figures/pca.js +25 -11
- package/dist/report-render/figures/qq.js +20 -9
- package/dist/report-render/figures/roc.js +1 -1
- package/dist/report-render/figures/sankey.d.ts +2 -2
- package/dist/report-render/figures/sankey.js +11 -10
- package/dist/report-render/figures/upset.d.ts +6 -6
- package/dist/report-render/figures/upset.js +7 -4
- package/dist/report-render/figures/volcano.js +12 -10
- package/dist/report-render/hybrid-svg.d.ts +4 -4
- package/dist/report-render/hybrid-svg.js +7 -5
- package/dist/report-render/number-format.d.ts +4 -4
- package/dist/report-render/number-format.js +62 -27
- package/dist/report-render/page.js +2 -1
- package/dist/report-render/provenance-data.d.ts +2 -2
- package/dist/report-render/references.d.ts +4 -4
- package/dist/report-render/render.d.ts +2 -2
- package/dist/report-render/render.js +10 -11
- package/dist/report-render/script-json.js +1 -1
- package/dist/report-render/table-data.d.ts +6 -6
- package/dist/report-render/test/options.d.ts +49 -0
- package/dist/report-render/test/options.js +143 -0
- package/dist/report-render/test/page-function.d.ts +19 -0
- package/dist/report-render/test/page-function.js +33 -0
- package/dist/report-render/types.d.ts +10 -10
- package/dist/report-render/value-bridge.d.ts +4 -4
- package/dist/report-render/value-bridge.js +27 -14
- package/dist/report-render/views/chart-view.d.ts +2 -2
- package/dist/report-render/views/chart-view.js +2 -2
- package/dist/report-render/views/lineage.d.ts +6 -6
- package/dist/report-render/views/lineage.js +2 -0
- package/dist/report-render/views/page-view.d.ts +2 -2
- package/dist/report-render/views/page-view.js +1 -0
- package/dist/report-render/views/prose.js +25 -8
- package/dist/report-render/views/references-view.js +12 -1
- package/dist/report-render/views/values.js +1 -1
- package/dist/runtime/assemble.d.ts +53 -26
- package/dist/runtime/assemble.js +103 -56
- package/dist/runtime/boot.d.ts +8 -7
- package/dist/runtime/boot.js +1 -1
- package/dist/runtime/connection-budget.d.ts +6 -6
- package/dist/runtime/connection-budget.js +1 -1
- package/dist/runtime/dbos.d.ts +29 -19
- package/dist/runtime/dbos.js +35 -20
- package/dist/runtime/result-serialization.js +18 -5
- package/dist/runtime/shutdown.d.ts +2 -2
- package/dist/sandbox/client.d.ts +7 -3
- package/dist/sandbox/cpu-files.d.ts +2 -2
- package/dist/sandbox/cpu-files.js +21 -4
- package/dist/sandbox/create-sandbox.d.ts +7 -8
- package/dist/sandbox/create-sandbox.js +6 -12
- package/dist/sandbox/docker-client.d.ts +48 -3
- package/dist/sandbox/docker-client.js +10 -6
- package/dist/sandbox/estimate-data-profile-resources.js +2 -7
- package/dist/sandbox/exec-outcome.d.ts +2 -2
- package/dist/sandbox/exec-outcome.js +1 -1
- package/dist/sandbox/exec.d.ts +10 -6
- package/dist/sandbox/exec.js +27 -12
- package/dist/sandbox/execution-id.js +14 -6
- package/dist/sandbox/farm.d.ts +2 -2
- package/dist/sandbox/farm.js +22 -27
- package/dist/sandbox/identity.d.ts +7 -0
- package/dist/sandbox/identity.js +14 -3
- package/dist/sandbox/image-packages.js +15 -27
- package/dist/sandbox/k8s-client.d.ts +35 -8
- package/dist/sandbox/k8s-client.js +6 -5
- package/dist/sandbox/labels.js +1 -0
- package/dist/sandbox/liveness.js +3 -1
- package/dist/sandbox/mount-plan.d.ts +10 -10
- package/dist/sandbox/mount-plan.js +13 -14
- package/dist/sandbox/notification-sweep.d.ts +4 -4
- package/dist/sandbox/notification-sweep.js +4 -7
- package/dist/sandbox/package-identity.d.ts +6 -13
- package/dist/sandbox/package-identity.js +46 -28
- package/dist/sandbox/reaper.d.ts +10 -10
- package/dist/sandbox/reaper.js +4 -6
- package/dist/sandbox/sandbox-error.d.ts +2 -9
- package/dist/sandbox/sandbox-error.js +21 -8
- package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
- package/dist/sandbox/sandbox-step-translate.js +22 -8
- package/dist/sandbox/step-sandbox.d.ts +47 -0
- package/dist/sandbox/step-sandbox.js +53 -0
- package/dist/sandbox/types.d.ts +18 -19
- package/dist/sandbox/types.js +1 -1
- package/dist/schemas/artifact-manifest.d.ts +4 -4
- package/dist/schemas/data-profile-schemas.d.ts +343 -298
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +31 -31
- package/dist/schemas/run-synthesis.d.ts +95 -26
- package/dist/schemas/run-synthesis.js +3 -1
- package/dist/schemas/validate-plan.d.ts +4 -4
- package/dist/schemas/validate-plan.js +17 -5
- package/dist/schemas/workflow-state.d.ts +19 -19
- package/dist/schemas/workflow-state.js +2 -2
- package/dist/state/active-turns.d.ts +36 -0
- package/dist/state/active-turns.js +67 -0
- package/dist/state/analyses-metrics.d.ts +8 -8
- package/dist/state/analyses-metrics.js +4 -4
- package/dist/state/analyses.d.ts +0 -14
- package/dist/state/analyses.js +0 -32
- package/dist/state/artifacts.d.ts +32 -19
- package/dist/state/artifacts.js +28 -5
- package/dist/state/data-profile.d.ts +2 -2
- package/dist/state/db.d.ts +12 -2
- package/dist/state/db.js +5 -0
- package/dist/state/edit-intents.d.ts +4 -0
- package/dist/state/edit-intents.js +71 -0
- package/dist/state/index.d.ts +4 -4
- package/dist/state/index.js +2 -2
- package/dist/state/init.d.ts +2 -1
- package/dist/state/init.js +5 -2
- package/dist/state/migrations/20260927120000_baseline.js +3 -1
- package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
- package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
- package/dist/state/migrations/index.js +18 -0
- package/dist/state/paused-work.d.ts +52 -0
- package/dist/state/paused-work.js +105 -0
- package/dist/state/plans.d.ts +27 -8
- package/dist/state/plans.js +14 -11
- package/dist/state/purge-analysis.d.ts +6 -6
- package/dist/state/purge-analysis.js +10 -2
- package/dist/state/report-session-state.d.ts +43 -18
- package/dist/state/report-session-state.js +43 -4
- package/dist/state/report-versions.d.ts +16 -11
- package/dist/state/report-versions.js +5 -3
- package/dist/state/runs.d.ts +30 -19
- package/dist/state/runs.js +43 -51
- package/dist/state/schema.d.ts +18 -21
- package/dist/state/schema.js +4 -5
- package/dist/state/snapshot-parse.d.ts +2 -2
- package/dist/state/snapshot-parse.js +14 -8
- package/dist/state/step-executions.d.ts +20 -8
- package/dist/state/step-executions.js +6 -4
- package/dist/state/tool-outputs.d.ts +2 -2
- package/dist/state/tool-outputs.js +2 -1
- package/dist/state/vector-store.d.ts +16 -16
- package/dist/state/vector-store.js +11 -7
- package/dist/tasks/data-profile-absorb.d.ts +3 -3
- package/dist/tasks/data-profile-absorb.js +21 -16
- package/dist/tasks/data-profile-activity.d.ts +5 -5
- package/dist/tasks/data-profile-activity.js +5 -5
- package/dist/tasks/data-profile-index.d.ts +4 -4
- package/dist/tasks/data-profile-index.js +32 -17
- package/dist/tasks/data-profile-resolve.d.ts +8 -8
- package/dist/tasks/data-profile-resolve.js +88 -62
- package/dist/tasks/data-profile.d.ts +40 -31
- package/dist/tasks/data-profile.js +138 -95
- package/dist/tasks/extract-values.d.ts +26 -79
- package/dist/tasks/extract-values.js +48 -108
- package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
- package/dist/tasks/refresh-regulatory-corpus.js +12 -8
- package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
- package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
- package/dist/testing.d.ts +60 -0
- package/dist/testing.js +96 -0
- package/dist/tools/ad-hoc-router.d.ts +9 -9
- package/dist/tools/ad-hoc-router.js +65 -52
- package/dist/tools/analysis-invocation.d.ts +7 -0
- package/dist/tools/analysis-invocation.js +29 -5
- package/dist/tools/approval/contract.d.ts +8 -52
- package/dist/tools/approval/contract.js +7 -36
- package/dist/tools/approval/gateway.d.ts +27 -28
- package/dist/tools/approval/gateway.js +33 -130
- package/dist/tools/approval/queries.d.ts +6 -11
- package/dist/tools/approval/queries.js +43 -29
- package/dist/tools/approval/uuidv7.js +2 -2
- package/dist/tools/bio/chembl.d.ts +3 -3
- package/dist/tools/bio/chembl.js +10 -0
- package/dist/tools/bio/comptox.d.ts +25 -8
- package/dist/tools/bio/comptox.js +4 -2
- package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
- package/dist/tools/bio/drug-gene-interactions.js +11 -8
- package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
- package/dist/tools/bio/gene-disease-evidence.js +10 -6
- package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
- package/dist/tools/bio/keys.d.ts +2 -2
- package/dist/tools/bio/keys.js +3 -3
- package/dist/tools/bio/lookup-annotation.d.ts +5 -5
- package/dist/tools/bio/lookup-annotation.js +3 -0
- package/dist/tools/bio/opentargets.d.ts +1 -1
- package/dist/tools/bio/opentargets.js +6 -0
- package/dist/tools/bio/pubchem.d.ts +2 -2
- package/dist/tools/bio/pubchem.js +6 -0
- package/dist/tools/bio/pubmed.d.ts +26 -16
- package/dist/tools/bio/pubmed.js +9 -3
- package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
- package/dist/tools/bio/search-clinical-trials.js +5 -1
- package/dist/tools/bio/search-faers.d.ts +2 -2
- package/dist/tools/bio/search-faers.js +1 -1
- package/dist/tools/bio/search-gene.d.ts +2 -2
- package/dist/tools/bio/search-gene.js +1 -0
- package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
- package/dist/tools/bio/search-geo-datasets.js +5 -5
- package/dist/tools/bio/search-interactions.d.ts +1 -1
- package/dist/tools/bio/search-patents.d.ts +28 -22
- package/dist/tools/bio/search-patents.js +20 -17
- package/dist/tools/bio/search-protein.d.ts +2 -2
- package/dist/tools/bio/search-protein.js +1 -1
- package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
- package/dist/tools/bio/search-regulatory-approvals.js +21 -16
- package/dist/tools/bio/target-safety.d.ts +8 -8
- package/dist/tools/bio/target-safety.js +11 -6
- package/dist/tools/capability-data.d.ts +9 -5
- package/dist/tools/capability-data.js +2 -1
- package/dist/tools/define-tool.d.ts +55 -46
- package/dist/tools/define-tool.js +39 -27
- package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
- package/dist/tools/display/normalize-echart-spec.js +51 -27
- package/dist/tools/display/show-user.d.ts +2 -2
- package/dist/tools/display/show-user.js +1 -1
- package/dist/tools/execute-analysis.d.ts +19 -10
- package/dist/tools/execute-analysis.js +83 -62
- package/dist/tools/knowledge/check.d.ts +166 -44
- package/dist/tools/knowledge/check.js +5 -3
- package/dist/tools/knowledge/client.d.ts +31 -62
- package/dist/tools/knowledge/client.js +44 -27
- package/dist/tools/knowledge/environment.d.ts +6 -6
- package/dist/tools/knowledge/environment.js +18 -7
- package/dist/tools/knowledge/index.d.ts +2 -2
- package/dist/tools/knowledge/index.js +9 -9
- package/dist/tools/knowledge/local-slots.d.ts +4 -4
- package/dist/tools/knowledge/local-slots.js +11 -4
- package/dist/tools/knowledge/pin.d.ts +2 -2
- package/dist/tools/knowledge/recommend.d.ts +20 -45
- package/dist/tools/knowledge/recommend.js +27 -19
- package/dist/tools/knowledge/situation.d.ts +40 -40
- package/dist/tools/knowledge/situation.js +2 -9
- package/dist/tools/knowledge/skeleton.d.ts +4 -4
- package/dist/tools/knowledge/skeleton.js +10 -11
- package/dist/tools/knowledge/template.d.ts +20 -18
- package/dist/tools/knowledge/template.js +38 -32
- package/dist/tools/lib/alphafold-client.js +2 -1
- package/dist/tools/lib/amass-client.d.ts +28 -28
- package/dist/tools/lib/amass-client.js +20 -10
- package/dist/tools/lib/api-utils.d.ts +13 -3
- package/dist/tools/lib/api-utils.js +17 -3
- package/dist/tools/lib/bgee-client.d.ts +6 -6
- package/dist/tools/lib/bgee-client.js +16 -10
- package/dist/tools/lib/cbioportal-client.d.ts +4 -4
- package/dist/tools/lib/cbioportal-client.js +9 -8
- package/dist/tools/lib/chembl-client.d.ts +14 -14
- package/dist/tools/lib/chembl-client.js +11 -4
- package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
- package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
- package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
- package/dist/tools/lib/clinical-trials-client.js +10 -10
- package/dist/tools/lib/clinvar-client.d.ts +2 -2
- package/dist/tools/lib/clinvar-client.js +6 -6
- package/dist/tools/lib/ctx-ops.d.ts +23 -23
- package/dist/tools/lib/ctx-ops.js +13 -10
- package/dist/tools/lib/dgidb-client.d.ts +6 -6
- package/dist/tools/lib/dgidb-client.js +10 -12
- package/dist/tools/lib/disgenet-client.d.ts +4 -4
- package/dist/tools/lib/ema-client.d.ts +2 -2
- package/dist/tools/lib/ensembl-client.d.ts +4 -4
- package/dist/tools/lib/ensembl-client.js +5 -4
- package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
- package/dist/tools/lib/gwas-catalog-client.js +17 -17
- package/dist/tools/lib/html-text.d.ts +6 -0
- package/dist/tools/lib/html-text.js +9 -0
- package/dist/tools/lib/identifier-resolver.d.ts +4 -4
- package/dist/tools/lib/identifier-resolver.js +7 -3
- package/dist/tools/lib/impc-client.d.ts +8 -8
- package/dist/tools/lib/impc-client.js +46 -35
- package/dist/tools/lib/iuphar-client.d.ts +2 -2
- package/dist/tools/lib/iuphar-client.js +7 -16
- package/dist/tools/lib/monarch-client.d.ts +4 -4
- package/dist/tools/lib/openfda-client.d.ts +22 -22
- package/dist/tools/lib/openfda-client.js +23 -22
- package/dist/tools/lib/opentargets-client.d.ts +12 -12
- package/dist/tools/lib/pathway-client.d.ts +4 -4
- package/dist/tools/lib/pathway-client.js +15 -19
- package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
- package/dist/tools/lib/pharmgkb-client.js +1 -1
- package/dist/tools/lib/protein-family-modality.d.ts +2 -2
- package/dist/tools/lib/protein-family-modality.js +0 -2
- package/dist/tools/lib/protein-family-normalize.js +7 -0
- package/dist/tools/lib/pubchem-client.d.ts +2 -2
- package/dist/tools/lib/pubchem-client.js +1 -0
- package/dist/tools/lib/pubchem-ops.d.ts +4 -4
- package/dist/tools/lib/pubchem-ops.js +8 -0
- package/dist/tools/lib/pubmed-client.d.ts +9 -9
- package/dist/tools/lib/pubmed-client.js +1 -1
- package/dist/tools/lib/string-client.d.ts +6 -6
- package/dist/tools/lib/uniprot-client.d.ts +8 -8
- package/dist/tools/lib/uniprot-client.js +5 -1
- package/dist/tools/memory/update-working-memory.d.ts +16 -13
- package/dist/tools/memory/update-working-memory.js +21 -3
- package/dist/tools/read-tool-output.js +8 -2
- package/dist/tools/registry.d.ts +2 -2
- package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
- package/dist/tools/report-authoring/authoring-tools.js +128 -62
- package/dist/tools/report-session/derive-table.d.ts +19 -59
- package/dist/tools/report-session/derive-table.js +120 -122
- package/dist/tools/report-session/examine-page.d.ts +6 -6
- package/dist/tools/report-session/examine-page.js +14 -12
- package/dist/tools/report-session/list-artifacts.d.ts +6 -6
- package/dist/tools/report-session/list-artifacts.js +5 -5
- package/dist/tools/report-session/page-faults.d.ts +6 -6
- package/dist/tools/report-session/page-faults.js +3 -1
- package/dist/tools/report-session/preview-report.d.ts +4 -3
- package/dist/tools/report-session/preview-report.js +26 -7
- package/dist/tools/report-session/record-version.d.ts +9 -4
- package/dist/tools/report-session/record-version.js +16 -9
- package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
- package/dist/tools/research/generate-analogy-report.d.ts +14 -7
- package/dist/tools/research/generate-analogy-report.js +80 -76
- package/dist/tools/research/generate-plan.d.ts +16 -16
- package/dist/tools/research/generate-plan.js +410 -374
- package/dist/tools/research/guarded-address.js +3 -2
- package/dist/tools/research/inspect-data-profile.d.ts +27 -20
- package/dist/tools/research/inspect-data-profile.js +26 -25
- package/dist/tools/research/inspect-run.d.ts +54 -27
- package/dist/tools/research/inspect-run.js +50 -40
- package/dist/tools/research/literature-reviewer.d.ts +8 -7
- package/dist/tools/research/literature-reviewer.js +29 -28
- package/dist/tools/research/search-arxiv.d.ts +1 -1
- package/dist/tools/research/search-arxiv.js +1 -1
- package/dist/tools/research/search-github-repos.d.ts +10 -7
- package/dist/tools/research/search-github-repos.js +25 -22
- package/dist/tools/research/search-semantic-scholar.js +1 -1
- package/dist/tools/research/searxng-engine.d.ts +2 -2
- package/dist/tools/research/searxng-engine.js +6 -4
- package/dist/tools/research/web-fetch.d.ts +24 -21
- package/dist/tools/research/web-fetch.js +65 -74
- package/dist/tools/research/web-search.d.ts +26 -17
- package/dist/tools/research/web-search.js +26 -21
- package/dist/tools/sandbox/link-packages.d.ts +11 -7
- package/dist/tools/sandbox/link-packages.js +11 -8
- package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
- package/dist/tools/sandbox/list-available-packages.js +31 -25
- package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
- package/dist/tools/sandbox/list-available-refs.js +61 -36
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +23 -73
- package/dist/tools/sandbox/skills.d.ts +16 -12
- package/dist/tools/sandbox/skills.js +16 -12
- package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
- package/dist/tools/sandbox/submit-file-metadata.js +18 -21
- package/dist/tools/start-report-session.d.ts +13 -5
- package/dist/tools/start-report-session.js +35 -8
- package/dist/tools/terminal-text.d.ts +5 -2
- package/dist/tools/terminal-text.js +35 -3
- package/dist/tools/workspace/decision-record.d.ts +4 -4
- package/dist/tools/workspace/decision-record.js +23 -13
- package/dist/tools/workspace/edit-file.d.ts +59 -20
- package/dist/tools/workspace/edit-file.js +81 -16
- package/dist/tools/workspace/execute-command.d.ts +15 -13
- package/dist/tools/workspace/execute-command.js +11 -9
- package/dist/tools/workspace/file-stat.d.ts +6 -3
- package/dist/tools/workspace/grep.d.ts +10 -7
- package/dist/tools/workspace/grep.js +9 -3
- package/dist/tools/workspace/list-files.d.ts +6 -3
- package/dist/tools/workspace/mutator.d.ts +28 -15
- package/dist/tools/workspace/mutator.js +107 -53
- package/dist/tools/workspace/read-file.d.ts +8 -5
- package/dist/tools/workspace/result-bounds.d.ts +5 -5
- package/dist/tools/workspace/result-bounds.js +4 -2
- package/dist/tools/workspace/run-exec.d.ts +2 -2
- package/dist/tools/workspace/run-exec.js +3 -3
- package/dist/tools/workspace/scan-inputs.d.ts +8 -5
- package/dist/tools/workspace/scan-inputs.js +17 -5
- package/dist/tools/workspace/show-file.d.ts +1 -1
- package/dist/tools/workspace/show-file.js +2 -1
- package/dist/tools/workspace/show-plan.d.ts +8 -5
- package/dist/tools/workspace/show-plan.js +9 -8
- package/dist/tools/workspace/workspace-search.d.ts +41 -13
- package/dist/tools/workspace/workspace-search.js +27 -14
- package/dist/tools/workspace/write-file.d.ts +9 -7
- package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
- package/dist/workflows/execute-analysis-scheduler.js +6 -3
- package/dist/workflows/execute-analysis.d.ts +46 -62
- package/dist/workflows/execute-analysis.js +137 -219
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +38 -61
- package/dist/workflows/sandbox-step.js +99 -106
- package/dist/workflows/test/sql-writes.d.ts +21 -0
- package/dist/workflows/test/sql-writes.js +36 -0
- package/dist/workspace/filesystem.d.ts +6 -6
- package/dist/workspace/filesystem.js +10 -8
- package/dist/workspace/paths.d.ts +1 -1
- package/dist/workspace/paths.js +15 -4
- package/dist/workspace/search-config.d.ts +2 -2
- package/dist/workspace/search-config.js +1 -1
- package/package.json +21 -22
- package/dist/loop/call-guard.d.ts +0 -50
- package/dist/loop/call-guard.js +0 -90
- package/dist/loop/continue-agent.d.ts +0 -40
- package/dist/loop/continue-agent.js +0 -38
- package/dist/loop/genai-spans.d.ts +0 -47
- package/dist/loop/genai-spans.js +0 -134
- package/dist/loop/run-agent.d.ts +0 -245
- package/dist/loop/run-agent.js +0 -1124
- package/dist/loop/run-step.d.ts +0 -29
- package/dist/loop/run-step.js +0 -34
- package/dist/loop/run-to-terminal.d.ts +0 -66
- package/dist/loop/run-to-terminal.js +0 -93
- package/dist/loop/tool-mask.d.ts +0 -23
- package/dist/loop/tool-mask.js +0 -46
- package/dist/providers/streaming-chat.d.ts +0 -32
- package/dist/providers/streaming-chat.js +0 -91
- package/dist/tasks/derive-table-exec.d.ts +0 -54
- package/dist/tasks/derive-table-exec.js +0 -86
- package/dist/workflows/suspension.d.ts +0 -32
- package/dist/workflows/suspension.js +0 -38
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { CitationCandidateCluster, CitationInput, CitationRecord, NormalizedCitation } from "./types.js";
|
|
2
|
-
export
|
|
2
|
+
export type CitationMatchConfig = {
|
|
3
3
|
readonly minimumScore: number;
|
|
4
4
|
readonly separationMargin: number;
|
|
5
5
|
readonly clusterSimilarity: number;
|
|
6
6
|
readonly relatedVersionSimilarity: number;
|
|
7
|
-
}
|
|
7
|
+
};
|
|
8
8
|
export declare const DEFAULT_MATCH_CONFIG: CitationMatchConfig;
|
|
9
9
|
export declare function tokenSimilarity(left: string, right: string): number;
|
|
10
10
|
export declare function clusterCitationRecords(input: CitationInput, normalized: NormalizedCitation, records: readonly CitationRecord[], config?: CitationMatchConfig): CitationCandidateCluster[];
|
package/dist/citations/match.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { presentAt } from "../lib/present.js";
|
|
2
3
|
import { authorNamesMatch, normalizeAuthor, normalizeComparable } from "./normalize.js";
|
|
3
4
|
export const DEFAULT_MATCH_CONFIG = {
|
|
4
5
|
minimumScore: 0.72,
|
|
@@ -36,7 +37,11 @@ function authorSimilarity(left, right) {
|
|
|
36
37
|
return intersection / Math.min(a.length, b.length);
|
|
37
38
|
}
|
|
38
39
|
function identifierEntries(identifiers) {
|
|
39
|
-
|
|
40
|
+
// Object.entries types the values as `string`, but a record can carry a key set to
|
|
41
|
+
// `undefined` (the clients build `identifiers: { doi }` verbatim), so the entry value
|
|
42
|
+
// is widened to keep the skip of undefined values.
|
|
43
|
+
const entries = Object.entries(identifiers);
|
|
44
|
+
return entries.flatMap(([kind, value]) => (value === undefined ? [] : [`${kind}:${value.toLocaleLowerCase("en-US")}`]));
|
|
40
45
|
}
|
|
41
46
|
function sharesStrongIdentifier(left, right) {
|
|
42
47
|
const rightIds = new Set(identifierEntries(right.identifiers));
|
|
@@ -69,7 +74,7 @@ class UnionFind {
|
|
|
69
74
|
this.parent = Array.from({ length: size }, (_, index) => index);
|
|
70
75
|
}
|
|
71
76
|
find(index) {
|
|
72
|
-
const parent = this.parent
|
|
77
|
+
const parent = presentAt(this.parent, index, "the parent link");
|
|
73
78
|
if (parent === index)
|
|
74
79
|
return index;
|
|
75
80
|
const root = this.find(parent);
|
|
@@ -111,8 +116,8 @@ function containsId(cluster, key) {
|
|
|
111
116
|
function addRelatedVersions(clusters, config) {
|
|
112
117
|
for (let left = 0; left < clusters.length; left += 1) {
|
|
113
118
|
for (let right = left + 1; right < clusters.length; right += 1) {
|
|
114
|
-
const a = clusters
|
|
115
|
-
const b = clusters
|
|
119
|
+
const a = presentAt(clusters, left, "the left cluster");
|
|
120
|
+
const b = presentAt(clusters, right, "the right cluster");
|
|
116
121
|
const similarity = Math.max(...a.records.flatMap((one) => b.records.map((two) => recordSimilarity(one, two))));
|
|
117
122
|
if (similarity < config.relatedVersionSimilarity)
|
|
118
123
|
continue;
|
|
@@ -139,8 +144,8 @@ export function clusterCitationRecords(input, normalized, records, config = DEFA
|
|
|
139
144
|
const union = new UnionFind(records.length);
|
|
140
145
|
for (let left = 0; left < records.length; left += 1) {
|
|
141
146
|
for (let right = left + 1; right < records.length; right += 1) {
|
|
142
|
-
const a = records
|
|
143
|
-
const b = records
|
|
147
|
+
const a = presentAt(records, left, "the left record");
|
|
148
|
+
const b = presentAt(records, right, "the right record");
|
|
144
149
|
if (sharesStrongIdentifier(a, b))
|
|
145
150
|
union.union(left, right);
|
|
146
151
|
else if ((!hasStrongIdentifier(a) || !hasStrongIdentifier(b)) && recordSimilarity(a, b) >= config.clusterSimilarity)
|
|
@@ -150,7 +155,7 @@ export function clusterCitationRecords(input, normalized, records, config = DEFA
|
|
|
150
155
|
const grouped = new Map();
|
|
151
156
|
for (let index = 0; index < records.length; index += 1) {
|
|
152
157
|
const root = union.find(index);
|
|
153
|
-
grouped.set(root, [...(grouped.get(root) ?? []), records
|
|
158
|
+
grouped.set(root, [...(grouped.get(root) ?? []), presentAt(records, index, "the record")]);
|
|
154
159
|
}
|
|
155
160
|
const clusters = [...grouped.values()].map((members) => ({
|
|
156
161
|
id: stableClusterId(members),
|
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
import { CitationInputSchema } from "./types.js";
|
|
2
|
+
import { collapseWhitespace as collapseText, trimTrailingOf } from "../lib/text.js";
|
|
2
3
|
// Each registry defines its own identifier syntax, and each is matched here rather than parsed:
|
|
3
4
|
// a citation string is prose, so the identifier has to be found inside it, not read off a field.
|
|
4
5
|
// The DOI suffix is deliberately permissive — the registry allows nearly any character in it, so
|
|
5
6
|
// there is no delimiter to stop at, and `trimDoiPunctuation` walks back the sentence punctuation
|
|
6
7
|
// and brackets a greedy match swallows. PMID and arXiv anchor instead, having fixed shapes.
|
|
8
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the DOI suffix is deliberately permissive because the registry allows nearly any character in it.
|
|
7
9
|
const DOI_PATTERN = /(?:https?:\/\/(?:dx\.)?doi\.org\/|doi\s*:\s*)?(10\.\d{4,9}\/[^\s<>"']+)/i;
|
|
10
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- a PMID is a bounded digit run behind an optional `pmid:` prefix.
|
|
8
11
|
const PMID_PATTERN = /^(?:pmid\s*:\s*)?(\d{1,9})$/i;
|
|
12
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the two arXiv id shapes (new-style and old-style) behind their optional URL and `arxiv:` spellings.
|
|
9
13
|
const ARXIV_PATTERN = /^(?:https?:\/\/arxiv\.org\/(?:abs|pdf)\/|arxiv\s*:\s*)?((?:\d{4}\.\d{4,5}|[a-z-]+(?:\.[a-z-]+)?\/\d{7})(?:v\d+)?)(?:\.pdf)?$/i;
|
|
10
14
|
function collapseWhitespace(value) {
|
|
11
|
-
return value.normalize("NFKC")
|
|
15
|
+
return collapseText(value.normalize("NFKC"));
|
|
12
16
|
}
|
|
17
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- punctuation and symbols carry no citation identity; they fold to spaces before comparison.
|
|
18
|
+
const PUNCTUATION_AND_SYMBOLS = /[\p{P}\p{S}]+/gu;
|
|
13
19
|
export function normalizeComparable(value) {
|
|
14
|
-
return collapseWhitespace(value)
|
|
15
|
-
.toLocaleLowerCase("en-US")
|
|
16
|
-
.replace(/[\p{P}\p{S}]+/gu, " ")
|
|
17
|
-
.replace(/\s+/g, " ")
|
|
18
|
-
.trim();
|
|
20
|
+
return collapseText(collapseWhitespace(value).toLocaleLowerCase("en-US").replace(PUNCTUATION_AND_SYMBOLS, " "));
|
|
19
21
|
}
|
|
22
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- generational suffixes are noise in author comparison; the word boundaries keep the letters inside longer tokens.
|
|
23
|
+
const NAME_SUFFIX_WORDS = /\b(?:jr|sr|ii|iii|iv)\b/g;
|
|
20
24
|
export function normalizeAuthor(value) {
|
|
21
|
-
return normalizeComparable(value)
|
|
22
|
-
.replace(/\b(?:jr|sr|ii|iii|iv)\b/g, "")
|
|
23
|
-
.replace(/\s+/g, " ")
|
|
24
|
-
.trim();
|
|
25
|
+
return collapseText(normalizeComparable(value).replace(NAME_SUFFIX_WORDS, ""));
|
|
25
26
|
}
|
|
26
27
|
function authorEvidence(value) {
|
|
27
28
|
const tokens = normalizeAuthor(value).split(" ").filter(Boolean);
|
|
@@ -40,7 +41,7 @@ const SPELLED_OUT_MINIMUM = 3;
|
|
|
40
41
|
* contributes only the initial it would abbreviate to.
|
|
41
42
|
*/
|
|
42
43
|
function givenLetters(leftover, initials) {
|
|
43
|
-
return [...initials, ...leftover.flatMap((word) => (word.length < SPELLED_OUT_MINIMUM ?
|
|
44
|
+
return [...initials, ...leftover.flatMap((word) => (word.length < SPELLED_OUT_MINIMUM ? Array.from(word) : [word.charAt(0)]))].sort();
|
|
44
45
|
}
|
|
45
46
|
function containsLetters(available, required) {
|
|
46
47
|
const pool = [...available];
|
|
@@ -81,7 +82,7 @@ export function authorNamesMatch(left, right) {
|
|
|
81
82
|
return lettersA.length <= lettersB.length ? containsLetters(lettersB, lettersA) : containsLetters(lettersA, lettersB);
|
|
82
83
|
}
|
|
83
84
|
function trimDoiPunctuation(value) {
|
|
84
|
-
let result = value
|
|
85
|
+
let result = trimTrailingOf(value, ".,;");
|
|
85
86
|
const pairs = [
|
|
86
87
|
["(", ")"],
|
|
87
88
|
["[", "]"],
|
|
@@ -102,28 +103,36 @@ export function extractDoi(value) {
|
|
|
102
103
|
export function extractPmid(value) {
|
|
103
104
|
return collapseWhitespace(value).match(PMID_PATTERN)?.[1];
|
|
104
105
|
}
|
|
106
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- an arXiv id carries a version suffix (`v3`) that the registry lookup must not see.
|
|
107
|
+
const ARXIV_VERSION_SUFFIX = /v\d+$/i;
|
|
105
108
|
export function extractArxivId(value) {
|
|
106
109
|
const match = collapseWhitespace(value).match(ARXIV_PATTERN)?.[1];
|
|
107
|
-
return match?.toLocaleLowerCase("en-US").replace(
|
|
110
|
+
return match?.toLocaleLowerCase("en-US").replace(ARXIV_VERSION_SUFFIX, "");
|
|
108
111
|
}
|
|
112
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the phrase marks a personal communication; the boundaries keep partial words from matching.
|
|
113
|
+
const PERSONAL_COMMUNICATION = /\bpersonal communication\b/;
|
|
114
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the phrases that mark work with no registered record.
|
|
115
|
+
const UNPUBLISHED_WORK = /\bunpublished (?:data|work|manuscript)\b/;
|
|
116
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the phrases that mark work accepted but not yet registered.
|
|
117
|
+
const IN_PRESS = /\b(?:in press|forthcoming)\b/;
|
|
109
118
|
function classifyUnsupportedWork(value) {
|
|
110
119
|
const normalized = normalizeComparable(value);
|
|
111
|
-
if (
|
|
120
|
+
if (PERSONAL_COMMUNICATION.test(normalized))
|
|
112
121
|
return "personal_communication";
|
|
113
|
-
if (
|
|
122
|
+
if (UNPUBLISHED_WORK.test(normalized))
|
|
114
123
|
return "unpublished";
|
|
115
|
-
if (
|
|
124
|
+
if (IN_PRESS.test(normalized))
|
|
116
125
|
return "unregistered_in_press";
|
|
117
126
|
return undefined;
|
|
118
127
|
}
|
|
119
128
|
function normalizedSupplied(input) {
|
|
120
129
|
return {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
130
|
+
title: input.title === undefined ? undefined : normalizeComparable(input.title),
|
|
131
|
+
authors: input.authors?.map(normalizeAuthor).filter(Boolean),
|
|
132
|
+
year: input.year,
|
|
133
|
+
venue: input.venue === undefined ? undefined : normalizeComparable(input.venue),
|
|
134
|
+
volume: input.volume === undefined ? undefined : normalizeComparable(input.volume),
|
|
135
|
+
firstPage: input.firstPage === undefined ? undefined : normalizeComparable(input.firstPage),
|
|
127
136
|
};
|
|
128
137
|
}
|
|
129
138
|
export function normalizeCitation(unparsed) {
|
|
@@ -155,12 +164,12 @@ export function normalizeCitation(unparsed) {
|
|
|
155
164
|
query: normalizeComparable(citation),
|
|
156
165
|
kind,
|
|
157
166
|
identifiers: {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
167
|
+
doi: doi === undefined || !identified ? undefined : doi,
|
|
168
|
+
pmid: pmid === undefined || !identified ? undefined : pmid,
|
|
169
|
+
arxiv: arxiv === undefined || !identified ? undefined : arxiv,
|
|
161
170
|
},
|
|
162
171
|
supplied: normalizedSupplied(input),
|
|
163
|
-
|
|
172
|
+
unsupportedWorkKind,
|
|
164
173
|
};
|
|
165
174
|
}
|
|
166
175
|
/**
|
package/dist/citations/plan.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
const SOURCES = ["doi_registry", "crossref", "pubmed", "arxiv", "semantic_scholar"];
|
|
2
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the words "arxiv" or "preprint" anywhere in free prose flag a preprint; the boundaries keep them inside longer words out.
|
|
3
|
+
const ARXIV_PREPRINT_HINT = /\b(?:arxiv|preprint)\b/i;
|
|
4
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the same hint read off a venue string.
|
|
5
|
+
const ARXIV_VENUE_HINT = /\barxiv\b/i;
|
|
2
6
|
function item(source, applicable, operation, reason, candidateGeneration = false) {
|
|
3
7
|
return { source, applicable, operation: applicable ? operation : "none", candidateGeneration: applicable && candidateGeneration, reason };
|
|
4
8
|
}
|
|
@@ -9,11 +13,11 @@ function enoughForEcitMatch(input) {
|
|
|
9
13
|
return disambiguators >= 2;
|
|
10
14
|
}
|
|
11
15
|
function indicatesArxiv(input, normalized) {
|
|
12
|
-
return
|
|
16
|
+
return ARXIV_PREPRINT_HINT.test(input.citation) || ARXIV_VENUE_HINT.test(input.venue ?? "") || normalized.identifiers.arxiv !== undefined;
|
|
13
17
|
}
|
|
14
18
|
export function planCitationSources(input, normalized) {
|
|
15
19
|
if (normalized.unsupportedWorkKind !== undefined) {
|
|
16
|
-
return SOURCES.map((source) => item(source, false, "none", `unsupported work kind: ${normalized.unsupportedWorkKind}`));
|
|
20
|
+
return SOURCES.map((source) => item(source, false, "none", `unsupported work kind: ${String(normalized.unsupportedWorkKind)}`));
|
|
17
21
|
}
|
|
18
22
|
if (normalized.kind === "doi") {
|
|
19
23
|
return [
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type CitationMatchConfig } from "./match.js";
|
|
2
2
|
import { type RateLimitConfig, type RateLimitRuntime } from "../lib/rate-limit.js";
|
|
3
3
|
import { type CitationResolver, type CitationSource, type CitationSourceClient } from "./types.js";
|
|
4
|
-
export
|
|
4
|
+
export type CitationResolverSourceConfig = Partial<RateLimitConfig> & {
|
|
5
5
|
readonly enabled?: boolean;
|
|
6
|
-
}
|
|
7
|
-
export
|
|
6
|
+
};
|
|
7
|
+
export type CitationResolverConfig = {
|
|
8
8
|
readonly maxBatchSize?: number;
|
|
9
9
|
readonly timeoutMs?: number;
|
|
10
10
|
readonly cache?: {
|
|
@@ -20,9 +20,9 @@ export interface CitationResolverConfig {
|
|
|
20
20
|
};
|
|
21
21
|
readonly ncbiApiKey?: string;
|
|
22
22
|
readonly semanticScholarApiKey?: string;
|
|
23
|
-
}
|
|
24
|
-
export
|
|
23
|
+
};
|
|
24
|
+
export type CitationResolverDependencies = RateLimitRuntime & {
|
|
25
25
|
readonly fetch?: typeof globalThis.fetch;
|
|
26
26
|
readonly clients?: readonly CitationSourceClient[];
|
|
27
|
-
}
|
|
27
|
+
};
|
|
28
28
|
export declare function createCitationResolver(config?: CitationResolverConfig, deps?: CitationResolverDependencies): CitationResolver;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { errorMessageOf, errorOf } from "../lib/thrown.js";
|
|
2
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
1
3
|
import { aggregateCitationResolution } from "./aggregate.js";
|
|
2
4
|
import { BoundedTtlCache } from "../lib/cache.js";
|
|
3
5
|
import { createArxivCitationClient } from "./clients/arxiv.js";
|
|
@@ -10,6 +12,7 @@ import { DEFAULT_MATCH_CONFIG } from "./match.js";
|
|
|
10
12
|
import { citationLookupKey, normalizeCitation } from "./normalize.js";
|
|
11
13
|
import { planCitationSources } from "./plan.js";
|
|
12
14
|
import { createRateLimitSchedule } from "../lib/rate-limit.js";
|
|
15
|
+
import { presentAt, presentFind, presentFirst, presentGet } from "../lib/present.js";
|
|
13
16
|
import { CitationInputSchema, } from "./types.js";
|
|
14
17
|
const SOURCE_PLAN_VERSION = "citation-plan-v1";
|
|
15
18
|
const SOURCE_ORDER = ["doi_registry", "crossref", "pubmed", "arxiv", "semantic_scholar"];
|
|
@@ -21,16 +24,16 @@ const DEFAULT_RATE_LIMITS = {
|
|
|
21
24
|
semantic_scholar: { maxConcurrency: 1, requestsPerSecond: 1, maxRetries: 2, maxRetryDelayMs: 10_000 },
|
|
22
25
|
};
|
|
23
26
|
function mergedRateLimit(source, config) {
|
|
24
|
-
return { ...DEFAULT_RATE_LIMITS[source], ...
|
|
27
|
+
return { ...DEFAULT_RATE_LIMITS[source], ...config.sources?.[source] };
|
|
25
28
|
}
|
|
26
29
|
function createDefaultClients(config, deps) {
|
|
27
|
-
const runtime = {
|
|
30
|
+
const runtime = { now: deps.now, sleep: deps.sleep };
|
|
28
31
|
const http = (source) => {
|
|
29
32
|
const limits = mergedRateLimit(source, config);
|
|
30
33
|
return {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
fetch: deps.fetch,
|
|
35
|
+
timeoutMs: config.timeoutMs,
|
|
36
|
+
sleep: deps.sleep,
|
|
34
37
|
schedule: createRateLimitSchedule(limits, runtime),
|
|
35
38
|
maxRetries: limits.maxRetries,
|
|
36
39
|
maxRetryDelayMs: limits.maxRetryDelayMs,
|
|
@@ -40,17 +43,17 @@ function createDefaultClients(config, deps) {
|
|
|
40
43
|
createDoiRegistryClient(http("doi_registry")),
|
|
41
44
|
createCrossrefClient({
|
|
42
45
|
...http("crossref"),
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
mailto: config.crossref?.mailto,
|
|
47
|
+
userAgent: config.crossref?.userAgent,
|
|
45
48
|
}),
|
|
46
49
|
createPubmedCitationClient({
|
|
47
50
|
...http("pubmed"),
|
|
48
|
-
|
|
51
|
+
apiKey: config.ncbiApiKey,
|
|
49
52
|
}),
|
|
50
53
|
createArxivCitationClient(http("arxiv")),
|
|
51
54
|
createSemanticScholarCitationClient({
|
|
52
55
|
...http("semantic_scholar"),
|
|
53
|
-
|
|
56
|
+
apiKey: config.semanticScholarApiKey,
|
|
54
57
|
}),
|
|
55
58
|
];
|
|
56
59
|
}
|
|
@@ -60,7 +63,7 @@ function cacheable(outcomes) {
|
|
|
60
63
|
return outcomes.some((outcome) => outcome.records.length > 0) ? "positive" : "negative";
|
|
61
64
|
}
|
|
62
65
|
function abortReason(signal) {
|
|
63
|
-
return signal.reason
|
|
66
|
+
return errorOf(signal.reason) ?? new DOMException("The operation was aborted", "AbortError");
|
|
64
67
|
}
|
|
65
68
|
function withCallerSignal(promise, signal) {
|
|
66
69
|
if (signal === undefined)
|
|
@@ -75,6 +78,7 @@ function withCallerSignal(promise, signal) {
|
|
|
75
78
|
resolve(value);
|
|
76
79
|
}, (error) => {
|
|
77
80
|
signal.removeEventListener("abort", onAbort);
|
|
81
|
+
// oxlint-disable-next-line typescript/prefer-promise-reject-errors -- the rejection reason is the thrown value itself; the awaiter reads its identity, and a wrapper would erase it.
|
|
78
82
|
reject(error);
|
|
79
83
|
});
|
|
80
84
|
});
|
|
@@ -105,12 +109,14 @@ function registrationAgencyEvidence(outcome) {
|
|
|
105
109
|
*/
|
|
106
110
|
async function runSource(client, requests, signal) {
|
|
107
111
|
const unavailable = (request, detail) => sourceOutcome(client.source, request.plan.operation, "unavailable", 0, [], detail);
|
|
108
|
-
const describe = (error) => (error
|
|
112
|
+
const describe = (error) => errorMessageOf(error) ?? textOf(error);
|
|
109
113
|
if (client.resolveMany === undefined) {
|
|
110
114
|
const settled = await Promise.allSettled(requests.map((request) => client.resolve(request, signal)));
|
|
111
115
|
if (signal?.aborted)
|
|
112
116
|
throw abortReason(signal);
|
|
113
|
-
return settled.map((outcome, index) =>
|
|
117
|
+
return settled.map((outcome, index) => outcome.status === "fulfilled"
|
|
118
|
+
? outcome.value
|
|
119
|
+
: unavailable(presentAt(requests, index, "the request for the settled outcome"), describe(outcome.reason)));
|
|
114
120
|
}
|
|
115
121
|
try {
|
|
116
122
|
const resolved = await client.resolveMany(requests, signal);
|
|
@@ -134,7 +140,7 @@ export function createCitationResolver(config = {}, deps = {}) {
|
|
|
134
140
|
};
|
|
135
141
|
const cache = new BoundedTtlCache(cacheConfig.maximum, now);
|
|
136
142
|
const inFlight = new Map();
|
|
137
|
-
const matchConfig = { ...DEFAULT_MATCH_CONFIG, ...
|
|
143
|
+
const matchConfig = { ...DEFAULT_MATCH_CONFIG, ...config.match };
|
|
138
144
|
const maxBatchSize = config.maxBatchSize ?? 200;
|
|
139
145
|
const keyFor = (input) => `${SOURCE_PLAN_VERSION}:${citationLookupKey(input)}`;
|
|
140
146
|
async function resolveUncachedBatch(entries, signal) {
|
|
@@ -145,10 +151,11 @@ export function createCitationResolver(config = {}, deps = {}) {
|
|
|
145
151
|
const requests = [];
|
|
146
152
|
const requestIndices = [];
|
|
147
153
|
for (let index = 0; index < entries.length; index += 1) {
|
|
148
|
-
const entry = entries
|
|
149
|
-
const
|
|
154
|
+
const entry = presentAt(entries, index, "the pending citation entry");
|
|
155
|
+
const entryOutcomes = presentAt(outcomes, index, "the outcome map of the pending citation entry");
|
|
156
|
+
const plan = presentFind(entry.plans, (candidate) => candidate.source === source, `the plan for ${source}`);
|
|
150
157
|
if (!plan.applicable || sourceConfig?.enabled === false || client === undefined) {
|
|
151
|
-
|
|
158
|
+
entryOutcomes.set(source, sourceConfig?.enabled === false
|
|
152
159
|
? notApplicableOutcome({ ...plan, applicable: false, operation: "none", reason: "source disabled by resolver configuration" })
|
|
153
160
|
: client === undefined
|
|
154
161
|
? notApplicableOutcome({ ...plan, applicable: false, operation: "none", reason: "source client unavailable" })
|
|
@@ -159,7 +166,7 @@ export function createCitationResolver(config = {}, deps = {}) {
|
|
|
159
166
|
input: entry.input,
|
|
160
167
|
normalized: entry.normalized,
|
|
161
168
|
plan,
|
|
162
|
-
registrationAgency: registrationAgencyEvidence(
|
|
169
|
+
registrationAgency: registrationAgencyEvidence(entryOutcomes.get("doi_registry")),
|
|
163
170
|
});
|
|
164
171
|
requestIndices.push(index);
|
|
165
172
|
}
|
|
@@ -167,10 +174,12 @@ export function createCitationResolver(config = {}, deps = {}) {
|
|
|
167
174
|
continue;
|
|
168
175
|
const resolved = await runSource(client, requests, signal);
|
|
169
176
|
for (let requestIndex = 0; requestIndex < resolved.length; requestIndex += 1) {
|
|
170
|
-
|
|
177
|
+
const entryIndex = presentAt(requestIndices, requestIndex, "the entry index of the request");
|
|
178
|
+
presentAt(outcomes, entryIndex, "the outcome map of the pending citation entry").set(source, presentAt(resolved, requestIndex, "the resolved outcome"));
|
|
171
179
|
}
|
|
172
180
|
}
|
|
173
|
-
return entries.map((entry, index) => SOURCE_ORDER.map((source) => outcomes
|
|
181
|
+
return entries.map((entry, index) => SOURCE_ORDER.map((source) => presentAt(outcomes, index, "the outcome map of the pending citation entry").get(source) ??
|
|
182
|
+
notApplicableOutcome(presentFind(entry.plans, (plan) => plan.source === source, `the plan for ${source}`))));
|
|
174
183
|
}
|
|
175
184
|
async function resolveMany(inputs, options = {}) {
|
|
176
185
|
if (inputs.length > maxBatchSize)
|
|
@@ -200,15 +209,15 @@ export function createCitationResolver(config = {}, deps = {}) {
|
|
|
200
209
|
pending.set(key, running);
|
|
201
210
|
continue;
|
|
202
211
|
}
|
|
203
|
-
const input = firstByKey
|
|
212
|
+
const input = presentGet(firstByKey, key, "the first input for the lookup key");
|
|
204
213
|
const normalized = normalizeCitation(input);
|
|
205
214
|
uncached.push({ key, entry: { input, normalized, plans: planCitationSources(input, normalized) } });
|
|
206
215
|
}
|
|
207
216
|
if (uncached.length > 0) {
|
|
208
217
|
const batch = resolveUncachedBatch(uncached.map(({ entry }) => entry), options.signal);
|
|
209
218
|
for (let index = 0; index < uncached.length; index += 1) {
|
|
210
|
-
const { key } = uncached
|
|
211
|
-
const one = batch.then((results) => results
|
|
219
|
+
const { key } = presentAt(uncached, index, "the uncached entry");
|
|
220
|
+
const one = batch.then((results) => presentAt(results, index, "the outcome batch of the uncached entry"));
|
|
212
221
|
const tracked = one.then((outcomes) => {
|
|
213
222
|
const kind = cacheable(outcomes);
|
|
214
223
|
if (kind !== undefined)
|
|
@@ -225,14 +234,14 @@ export function createCitationResolver(config = {}, deps = {}) {
|
|
|
225
234
|
}
|
|
226
235
|
const outcomesByKey = new Map();
|
|
227
236
|
await Promise.all(uniqueOrder.map(async (key) => {
|
|
228
|
-
outcomesByKey.set(key, await withCallerSignal(pending
|
|
237
|
+
outcomesByKey.set(key, await withCallerSignal(presentGet(pending, key, "the pending promise for the lookup key"), options.signal));
|
|
229
238
|
}));
|
|
230
239
|
// Aggregated per input, never per shared lookup: comparisons and the
|
|
231
240
|
// verdict they drive belong to the caller's own supplied metadata.
|
|
232
|
-
return parsed.map((input) => aggregateCitationResolution(input, normalizeCitation(input), outcomesByKey
|
|
241
|
+
return parsed.map((input) => aggregateCitationResolution(input, normalizeCitation(input), presentGet(outcomesByKey, keyFor(input), "the outcomes for the lookup key"), matchConfig));
|
|
233
242
|
}
|
|
234
243
|
return {
|
|
235
|
-
resolveOne: async (input, options = {}) => (await resolveMany([input], options))
|
|
244
|
+
resolveOne: async (input, options = {}) => presentFirst(await resolveMany([input], options), "the single resolution"),
|
|
236
245
|
resolveMany,
|
|
237
246
|
};
|
|
238
247
|
}
|