@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,78 +1,135 @@
|
|
|
1
|
+
import { presentAt } from "../../lib/present.js";
|
|
2
|
+
import { collapseWhitespace as collapseText, isAllDigits, isAllHex } from "../../lib/text.js";
|
|
1
3
|
import { requestText } from "./http.js";
|
|
2
4
|
const BASE_URL = "https://export.arxiv.org/api/query";
|
|
5
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- an Atom feed wraps text in CDATA sections; this keeps the text of each nearest opener/closer pair.
|
|
3
6
|
const stripCdata = (value) => value.replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g, "$1");
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
7
|
+
const NAMED_XML_ENTITIES = new Map([
|
|
8
|
+
["lt", "<"],
|
|
9
|
+
["gt", ">"],
|
|
10
|
+
["quot", '"'],
|
|
11
|
+
["apos", "'"],
|
|
12
|
+
["amp", "&"],
|
|
13
|
+
]);
|
|
14
|
+
function decodeEntity(body) {
|
|
15
|
+
const named = NAMED_XML_ENTITIES.get(body);
|
|
16
|
+
if (named !== undefined)
|
|
17
|
+
return named;
|
|
18
|
+
if (body.startsWith("#x")) {
|
|
19
|
+
const hexadecimal = body.slice(2);
|
|
20
|
+
return hexadecimal.length > 0 && isAllHex(hexadecimal) ? String.fromCodePoint(parseInt(hexadecimal, 16)) : undefined;
|
|
21
|
+
}
|
|
22
|
+
if (body.startsWith("#")) {
|
|
23
|
+
const decimal = body.slice(1);
|
|
24
|
+
return decimal.length > 0 && isAllDigits(decimal) ? String.fromCodePoint(parseInt(decimal, 10)) : undefined;
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
20
27
|
}
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Decode the XML entities the feed emits, in one pass.
|
|
30
|
+
*
|
|
31
|
+
* A single pass cannot re-decode its own output: `&lt;` yields `<`, never `<`.
|
|
32
|
+
* A body that names no entity — or a numeric body that is not well-formed — stays literal.
|
|
33
|
+
*/
|
|
34
|
+
function decodeXmlEntities(value) {
|
|
35
|
+
let out = "";
|
|
36
|
+
for (let i = 0; i < value.length;) {
|
|
37
|
+
if (value.charAt(i) !== "&") {
|
|
38
|
+
out += value.charAt(i);
|
|
39
|
+
i++;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const semicolon = value.indexOf(";", i);
|
|
43
|
+
const decoded = semicolon < 0 ? undefined : decodeEntity(value.slice(i + 1, semicolon));
|
|
44
|
+
if (decoded === undefined) {
|
|
45
|
+
out += "&";
|
|
46
|
+
i++;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
out += decoded;
|
|
50
|
+
i = semicolon + 1;
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
23
53
|
}
|
|
54
|
+
const collapseWhitespace = (value) => collapseText(decodeXmlEntities(stripCdata(value)));
|
|
24
55
|
function allMatches(entry, tag) {
|
|
56
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- an Atom tag's content is `<tag …>` up to the nearest `</tag>`; the expression is built per tag name, and a tag name is not data.
|
|
25
57
|
const expression = new RegExp(`<${tag}\\b[^>]*>([\\s\\S]*?)</${tag}>`, "g");
|
|
26
58
|
const values = [];
|
|
27
59
|
let match;
|
|
28
60
|
while ((match = expression.exec(entry)) !== null)
|
|
29
|
-
values.push(match
|
|
61
|
+
values.push(presentAt(match, 1, `the captured ${tag}`));
|
|
30
62
|
return values;
|
|
31
63
|
}
|
|
32
|
-
function
|
|
33
|
-
|
|
64
|
+
function firstMatch(entry, tag) {
|
|
65
|
+
return allMatches(entry, tag)[0];
|
|
66
|
+
}
|
|
67
|
+
function attributeValue(attributes, name) {
|
|
68
|
+
const marker = `${name}="`;
|
|
69
|
+
const start = attributes.indexOf(marker);
|
|
70
|
+
if (start < 0)
|
|
71
|
+
return undefined;
|
|
72
|
+
const valueStart = start + marker.length;
|
|
73
|
+
const end = attributes.indexOf('"', valueStart);
|
|
74
|
+
return end > valueStart ? attributes.slice(valueStart, end) : undefined;
|
|
75
|
+
}
|
|
76
|
+
function selfClosingAttributes(entry, tag) {
|
|
77
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- a self-closing Atom tag carries its attributes in the tag itself: `<tag … />`; the expression is built per tag name.
|
|
78
|
+
const expression = new RegExp(`<${tag}\\b([^>]*)/>`, "g");
|
|
79
|
+
const values = [];
|
|
34
80
|
let match;
|
|
35
|
-
while ((match = expression.exec(entry)) !== null)
|
|
36
|
-
|
|
81
|
+
while ((match = expression.exec(entry)) !== null)
|
|
82
|
+
values.push(presentAt(match, 1, `the attributes of ${tag}`));
|
|
83
|
+
return values;
|
|
84
|
+
}
|
|
85
|
+
function linkAttribute(entry, predicate) {
|
|
86
|
+
for (const attributes of selfClosingAttributes(entry, "link")) {
|
|
37
87
|
if (predicate(attributes))
|
|
38
|
-
return attributes
|
|
88
|
+
return attributeValue(attributes, "href");
|
|
39
89
|
}
|
|
40
90
|
return undefined;
|
|
41
91
|
}
|
|
42
92
|
function categoryTerms(entry) {
|
|
43
|
-
const expression = /<category\b([^>]*)\/>/g;
|
|
44
93
|
const terms = [];
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const term = match[1].match(/term="([^"]+)"/)?.[1];
|
|
94
|
+
for (const attributes of selfClosingAttributes(entry, "category")) {
|
|
95
|
+
const term = attributeValue(attributes, "term");
|
|
48
96
|
if (term !== undefined)
|
|
49
97
|
terms.push(term);
|
|
50
98
|
}
|
|
51
99
|
return terms;
|
|
52
100
|
}
|
|
101
|
+
function afterMarker(text, marker) {
|
|
102
|
+
const start = text.indexOf(marker);
|
|
103
|
+
if (start < 0)
|
|
104
|
+
return undefined;
|
|
105
|
+
const rest = text.slice(start + marker.length);
|
|
106
|
+
return rest.length > 0 ? rest : undefined;
|
|
107
|
+
}
|
|
108
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the Atom envelope probe: a `<feed` element opens the document; the word boundary keeps a longer element name from passing.
|
|
109
|
+
const ATOM_FEED_ELEMENT = /<feed\b/;
|
|
53
110
|
export function parseArxivAtom(xml) {
|
|
54
|
-
return
|
|
111
|
+
return allMatches(xml, "entry").flatMap((entry) => {
|
|
55
112
|
const rawId = firstMatch(entry, "id");
|
|
56
113
|
const title = firstMatch(entry, "title");
|
|
57
114
|
if (rawId === undefined || title === undefined)
|
|
58
115
|
return [];
|
|
59
|
-
const idMatch = rawId
|
|
116
|
+
const idMatch = afterMarker(rawId, "abs/");
|
|
60
117
|
const authors = allMatches(entry, "author")
|
|
61
118
|
.map((author) => firstMatch(author, "name"))
|
|
62
119
|
.filter((name) => name !== undefined)
|
|
63
120
|
.map(collapseWhitespace);
|
|
64
|
-
const htmlUrl = linkAttribute(entry, (attributes) =>
|
|
65
|
-
const pdfUrl = linkAttribute(entry, (attributes) =>
|
|
121
|
+
const htmlUrl = linkAttribute(entry, (attributes) => attributes.includes('rel="alternate"') && attributes.includes('type="text/html"'));
|
|
122
|
+
const pdfUrl = linkAttribute(entry, (attributes) => attributes.includes('title="pdf"'));
|
|
66
123
|
return [
|
|
67
124
|
{
|
|
68
|
-
id: idMatch
|
|
125
|
+
id: idMatch ?? collapseWhitespace(rawId),
|
|
69
126
|
title: collapseWhitespace(title),
|
|
70
127
|
abstract: collapseWhitespace(firstMatch(entry, "summary") ?? ""),
|
|
71
128
|
authors,
|
|
72
129
|
published: collapseWhitespace(firstMatch(entry, "published") ?? ""),
|
|
73
130
|
categories: categoryTerms(entry),
|
|
74
131
|
url: htmlUrl ?? collapseWhitespace(rawId),
|
|
75
|
-
|
|
132
|
+
pdfUrl,
|
|
76
133
|
},
|
|
77
134
|
];
|
|
78
135
|
});
|
|
@@ -82,7 +139,7 @@ export function createArxivSource(options = {}) {
|
|
|
82
139
|
const result = await requestText(`${BASE_URL}?${params}`, options, signal);
|
|
83
140
|
if (result.status !== "ok")
|
|
84
141
|
return result;
|
|
85
|
-
if (
|
|
142
|
+
if (!ATOM_FEED_ELEMENT.test(result.value))
|
|
86
143
|
return { status: "unavailable", detail: "response schema mismatch: missing Atom feed" };
|
|
87
144
|
return { status: "ok", value: parseArxivAtom(result.value) };
|
|
88
145
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export
|
|
2
|
+
export type SourceHttpOptions = {
|
|
3
3
|
readonly fetch?: typeof globalThis.fetch;
|
|
4
4
|
/**
|
|
5
5
|
* Admission gate wrapped around each network attempt — a rate limiter, a
|
|
@@ -13,7 +13,7 @@ export interface SourceHttpOptions {
|
|
|
13
13
|
/** Ceiling on any single retry wait, including one a server asks for via `Retry-After`. */
|
|
14
14
|
readonly maxRetryDelayMs?: number;
|
|
15
15
|
readonly sleep?: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
|
|
16
|
-
}
|
|
16
|
+
};
|
|
17
17
|
export type SourceHttpResult<T> = {
|
|
18
18
|
readonly status: "ok";
|
|
19
19
|
readonly value: T;
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
+
import { errorOf, errorMessageOf } from "../../lib/thrown.js";
|
|
2
|
+
import { textOf } from "../../lib/unknown-text.js";
|
|
3
|
+
import { setTimeout as timerSleep } from "node:timers/promises";
|
|
1
4
|
const RETRYABLE_STATUSES = new Set([429, 503]);
|
|
2
5
|
function cancellationReason(signal) {
|
|
3
|
-
return signal.reason
|
|
6
|
+
return errorOf(signal.reason) ?? new DOMException("The operation was aborted", "AbortError");
|
|
4
7
|
}
|
|
5
8
|
async function delay(ms, signal) {
|
|
6
|
-
if (signal
|
|
9
|
+
if (signal === undefined) {
|
|
10
|
+
await timerSleep(ms);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (signal.aborted)
|
|
14
|
+
throw cancellationReason(signal);
|
|
15
|
+
// The node wait's abort rejection is a fresh AbortError instead of the signal's
|
|
16
|
+
// reason under the Bun test runtime, so the catch restores this contract's reason.
|
|
17
|
+
await timerSleep(ms, undefined, { signal }).catch(() => {
|
|
7
18
|
throw cancellationReason(signal);
|
|
8
|
-
await new Promise((resolve, reject) => {
|
|
9
|
-
const onAbort = () => {
|
|
10
|
-
clearTimeout(timeout);
|
|
11
|
-
reject(cancellationReason(signal));
|
|
12
|
-
};
|
|
13
|
-
const timeout = setTimeout(() => {
|
|
14
|
-
signal?.removeEventListener("abort", onAbort);
|
|
15
|
-
resolve();
|
|
16
|
-
}, ms);
|
|
17
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
18
19
|
});
|
|
19
20
|
}
|
|
20
21
|
function retryAfterMilliseconds(response) {
|
|
@@ -66,7 +67,7 @@ async function request(url, options, signal, init) {
|
|
|
66
67
|
await sleep(backoff(attempt), signal);
|
|
67
68
|
continue;
|
|
68
69
|
}
|
|
69
|
-
return { status: "unavailable", detail: error
|
|
70
|
+
return { status: "unavailable", detail: errorMessageOf(error) ?? textOf(error) };
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
73
|
}
|
|
@@ -81,7 +82,7 @@ export async function requestJson(url, schema, options, signal, init = {}) {
|
|
|
81
82
|
return { status: "ok", value: parsed.data };
|
|
82
83
|
}
|
|
83
84
|
catch (error) {
|
|
84
|
-
return { status: "unavailable", detail: `invalid JSON response: ${error
|
|
85
|
+
return { status: "unavailable", detail: `invalid JSON response: ${errorMessageOf(error) ?? textOf(error)}` };
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
export async function requestText(url, options, signal, init = {}) {
|
|
@@ -92,6 +93,6 @@ export async function requestText(url, options, signal, init = {}) {
|
|
|
92
93
|
return { status: "ok", value: await response.value.text() };
|
|
93
94
|
}
|
|
94
95
|
catch (error) {
|
|
95
|
-
return { status: "unavailable", detail: `invalid text response: ${error
|
|
96
|
+
return { status: "unavailable", detail: `invalid text response: ${errorMessageOf(error) ?? textOf(error)}` };
|
|
96
97
|
}
|
|
97
98
|
}
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
import { type SourceHttpOptions, type SourceHttpResult } from "./http.js";
|
|
2
2
|
export declare const NCBI_BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils";
|
|
3
3
|
export declare const NCBI_IDCONV = "https://www.ncbi.nlm.nih.gov/pmc/utils/idconv/v1.0";
|
|
4
|
-
export
|
|
4
|
+
export type PubmedSourceOptions = SourceHttpOptions & {
|
|
5
5
|
readonly apiKey?: string;
|
|
6
|
-
}
|
|
7
|
-
export
|
|
6
|
+
};
|
|
7
|
+
export type PubmedSearchOptions = {
|
|
8
8
|
readonly maxResults?: number;
|
|
9
9
|
readonly sort?: "relevance" | "date";
|
|
10
10
|
readonly dateRange?: {
|
|
11
11
|
readonly from: string;
|
|
12
12
|
readonly to: string;
|
|
13
13
|
};
|
|
14
|
-
}
|
|
15
|
-
export
|
|
14
|
+
};
|
|
15
|
+
export type PubmedCitationFields = {
|
|
16
16
|
readonly venue?: string;
|
|
17
17
|
readonly year?: string | number;
|
|
18
18
|
readonly volume?: string;
|
|
19
19
|
readonly firstPage?: string;
|
|
20
20
|
readonly firstAuthor?: string;
|
|
21
21
|
readonly key: string;
|
|
22
|
-
}
|
|
23
|
-
export
|
|
22
|
+
};
|
|
23
|
+
export type PubMedSummary = {
|
|
24
24
|
pmid: string;
|
|
25
25
|
title: string;
|
|
26
26
|
journal: string;
|
|
27
27
|
year: string;
|
|
28
28
|
authors: string;
|
|
29
|
-
}
|
|
30
|
-
export
|
|
29
|
+
};
|
|
30
|
+
export type ArticleDetail = {
|
|
31
31
|
pmid: string;
|
|
32
32
|
title: string;
|
|
33
33
|
abstract: string;
|
|
@@ -37,16 +37,16 @@ export interface ArticleDetail {
|
|
|
37
37
|
doi: string;
|
|
38
38
|
meshTerms: string[];
|
|
39
39
|
pmcId: string | null;
|
|
40
|
-
}
|
|
41
|
-
export
|
|
40
|
+
};
|
|
41
|
+
export type ArticleSection = {
|
|
42
42
|
heading: string;
|
|
43
43
|
text: string;
|
|
44
|
-
}
|
|
45
|
-
export
|
|
44
|
+
};
|
|
45
|
+
export type FullTextResult = {
|
|
46
46
|
fullText: string;
|
|
47
47
|
sections: ArticleSection[];
|
|
48
|
-
}
|
|
49
|
-
export
|
|
48
|
+
};
|
|
49
|
+
export type PubmedSource = {
|
|
50
50
|
search(query: string, options?: PubmedSearchOptions, signal?: AbortSignal): Promise<SourceHttpResult<{
|
|
51
51
|
totalFound: number;
|
|
52
52
|
results: PubMedSummary[];
|
|
@@ -59,7 +59,7 @@ export interface PubmedSource {
|
|
|
59
59
|
notFound: string[];
|
|
60
60
|
}>>;
|
|
61
61
|
fetchFullText(pmcId: string, signal?: AbortSignal): Promise<SourceHttpResult<FullTextResult | null>>;
|
|
62
|
-
}
|
|
62
|
+
};
|
|
63
63
|
export declare function ncbiUrl(apiKey: string | undefined, base: string, params: Record<string, string | number | undefined>): string;
|
|
64
64
|
export declare function parseEsummary(xml: string): PubMedSummary[];
|
|
65
65
|
export declare function parseEfetch(xml: string): ArticleDetail[];
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import { textOf } from "../../lib/unknown-text.js";
|
|
1
2
|
import { XMLParser } from "fast-xml-parser";
|
|
2
3
|
import { z } from "zod";
|
|
3
4
|
import { requestJson, requestText } from "./http.js";
|
|
5
|
+
import { isAllDigits, splitLines } from "../../lib/text.js";
|
|
6
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the PubmedArticleSet envelope probe; the word boundary keeps a longer element name from passing.
|
|
7
|
+
const PUBMED_ARTICLE_SET_ELEMENT = /<PubmedArticleSet\b/;
|
|
4
8
|
export const NCBI_BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils";
|
|
5
9
|
export const NCBI_IDCONV = "https://www.ncbi.nlm.nih.gov/pmc/utils/idconv/v1.0";
|
|
6
10
|
const EsearchResponseSchema = z.object({
|
|
@@ -29,33 +33,63 @@ const xmlParser = new XMLParser({
|
|
|
29
33
|
// then crashes the year extraction in `parseEsummary`.
|
|
30
34
|
parseTagValue: false,
|
|
31
35
|
});
|
|
36
|
+
function isRecord(value) {
|
|
37
|
+
return typeof value === "object" && value !== null;
|
|
38
|
+
}
|
|
39
|
+
/** The string the record holds at `key`, or `undefined` when the key is absent or holds a non-string. The XML parser is configured with `parseTagValue: false`, so every text node arrives as a string. */
|
|
40
|
+
function stringField(record, key) {
|
|
41
|
+
const value = record[key];
|
|
42
|
+
return typeof value === "string" ? value : undefined;
|
|
43
|
+
}
|
|
44
|
+
function parseXmlRecord(xml) {
|
|
45
|
+
const parsed = xmlParser.parse(xml);
|
|
46
|
+
return isRecord(parsed) ? parsed : undefined;
|
|
47
|
+
}
|
|
48
|
+
function childRecord(value, key) {
|
|
49
|
+
if (!isRecord(value))
|
|
50
|
+
return undefined;
|
|
51
|
+
const child = value[key];
|
|
52
|
+
return isRecord(child) ? child : undefined;
|
|
53
|
+
}
|
|
54
|
+
function recordList(value) {
|
|
55
|
+
if (value === undefined)
|
|
56
|
+
return [];
|
|
57
|
+
if (Array.isArray(value))
|
|
58
|
+
return value.filter(isRecord);
|
|
59
|
+
return isRecord(value) ? [value] : [];
|
|
60
|
+
}
|
|
61
|
+
function isDocSumItem(value) {
|
|
62
|
+
return typeof value === "object" && value !== null;
|
|
63
|
+
}
|
|
64
|
+
function itemOf(value) {
|
|
65
|
+
if (value === undefined)
|
|
66
|
+
return [];
|
|
67
|
+
return (Array.isArray(value) ? value : [value]).filter(isDocSumItem);
|
|
68
|
+
}
|
|
32
69
|
function getItemValue(items, name) {
|
|
33
|
-
|
|
34
|
-
return "";
|
|
35
|
-
const item = (Array.isArray(items) ? items : [items]).find((candidate) => candidate["@_Name"] === name);
|
|
70
|
+
const item = itemOf(items).find((candidate) => candidate["@_Name"] === name);
|
|
36
71
|
return item?.["#text"] ?? "";
|
|
37
72
|
}
|
|
38
73
|
function getAuthorsFromDocSum(items) {
|
|
39
|
-
|
|
40
|
-
return "";
|
|
41
|
-
const authorList = (Array.isArray(items) ? items : [items]).find((item) => item["@_Name"] === "AuthorList");
|
|
74
|
+
const authorList = itemOf(items).find((item) => item["@_Name"] === "AuthorList");
|
|
42
75
|
if (authorList?.Item === undefined)
|
|
43
76
|
return "";
|
|
44
|
-
const names = (
|
|
77
|
+
const names = itemOf(authorList.Item)
|
|
78
|
+
.map((author) => author["#text"] ?? "")
|
|
79
|
+
.filter(Boolean);
|
|
45
80
|
if (names.length <= 3)
|
|
46
81
|
return names.join(", ");
|
|
47
|
-
return `${names[0]} et al.`;
|
|
82
|
+
return `${String(names[0])} et al.`;
|
|
48
83
|
}
|
|
49
84
|
export function parseEsummary(xml) {
|
|
50
|
-
const parsed =
|
|
51
|
-
const docSums = (parsed
|
|
85
|
+
const parsed = parseXmlRecord(xml);
|
|
86
|
+
const docSums = (childRecord(parsed, "eSummaryResult") ?? parsed)?.DocSum;
|
|
52
87
|
if (docSums === undefined)
|
|
53
88
|
return [];
|
|
54
|
-
|
|
55
|
-
return documents.map((document) => {
|
|
89
|
+
return recordList(docSums).map((document) => {
|
|
56
90
|
const publicationDate = getItemValue(document.Item, "PubDate");
|
|
57
91
|
return {
|
|
58
|
-
pmid:
|
|
92
|
+
pmid: textOf(document.Id ?? ""),
|
|
59
93
|
title: getItemValue(document.Item, "Title"),
|
|
60
94
|
journal: getItemValue(document.Item, "FullJournalName") || getItemValue(document.Item, "Source"),
|
|
61
95
|
year: publicationDate.slice(0, 4),
|
|
@@ -64,57 +98,56 @@ export function parseEsummary(xml) {
|
|
|
64
98
|
});
|
|
65
99
|
}
|
|
66
100
|
export function parseEfetch(xml) {
|
|
67
|
-
const articleSet =
|
|
101
|
+
const articleSet = childRecord(parseXmlRecord(xml), "PubmedArticleSet");
|
|
68
102
|
if (articleSet === undefined)
|
|
69
103
|
return [];
|
|
70
|
-
const entries =
|
|
71
|
-
? articleSet.PubmedArticle
|
|
72
|
-
: articleSet.PubmedArticle === undefined
|
|
73
|
-
? []
|
|
74
|
-
: [articleSet.PubmedArticle];
|
|
104
|
+
const entries = recordList(articleSet.PubmedArticle);
|
|
75
105
|
return entries.map((entry) => {
|
|
76
|
-
const
|
|
77
|
-
const
|
|
78
|
-
const articleData = citation?.Article;
|
|
106
|
+
const citation = childRecord(entry, "MedlineCitation");
|
|
107
|
+
const articleData = childRecord(citation, "Article");
|
|
79
108
|
const pmidValue = citation?.PMID;
|
|
80
|
-
const pmid =
|
|
81
|
-
const abstractValue = articleData
|
|
109
|
+
const pmid = isRecord(pmidValue) ? textOf(pmidValue["#text"] ?? "") : textOf(pmidValue ?? "");
|
|
110
|
+
const abstractValue = childRecord(articleData, "Abstract")?.AbstractText;
|
|
82
111
|
const abstract = (abstractValue === undefined ? [] : Array.isArray(abstractValue) ? abstractValue : [abstractValue])
|
|
83
112
|
.map((value) => {
|
|
84
113
|
if (typeof value === "string")
|
|
85
114
|
return value;
|
|
86
|
-
if (
|
|
115
|
+
if (!isRecord(value))
|
|
87
116
|
return String(value);
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
return object["@_Label"] === undefined ? text : `${String(object["@_Label"])}: ${text}`;
|
|
117
|
+
const text = textOf(value["#text"] ?? "");
|
|
118
|
+
return value["@_Label"] === undefined ? text : `${textOf(value["@_Label"])}: ${text}`;
|
|
91
119
|
})
|
|
92
120
|
.join("\n\n");
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
121
|
+
const authors = recordList(childRecord(articleData, "AuthorList")?.Author).map((author) => {
|
|
122
|
+
const collectiveName = stringField(author, "CollectiveName");
|
|
123
|
+
if (collectiveName !== undefined)
|
|
124
|
+
return collectiveName;
|
|
125
|
+
return [stringField(author, "ForeName") ?? stringField(author, "Initials"), stringField(author, "LastName")].filter(Boolean).join(" ");
|
|
126
|
+
});
|
|
127
|
+
const journalData = childRecord(articleData, "Journal");
|
|
128
|
+
const publicationDate = childRecord(childRecord(journalData, "JournalIssue"), "PubDate");
|
|
97
129
|
let doi = "";
|
|
98
|
-
const articleIds =
|
|
99
|
-
for (const id of
|
|
100
|
-
if (
|
|
101
|
-
doi =
|
|
130
|
+
const articleIds = childRecord(childRecord(childRecord(entry, "PubmedData"), "ArticleIdList"), "ArticleId");
|
|
131
|
+
for (const id of recordList(articleIds)) {
|
|
132
|
+
if (stringField(id, "@_IdType") === "doi") {
|
|
133
|
+
doi = stringField(id, "#text") ?? "";
|
|
102
134
|
}
|
|
103
135
|
}
|
|
104
|
-
const
|
|
105
|
-
const meshTerms = (meshValue === undefined ? [] : Array.isArray(meshValue) ? meshValue : [meshValue])
|
|
136
|
+
const meshTerms = recordList(childRecord(citation, "MeshHeadingList")?.MeshHeading)
|
|
106
137
|
.map((heading) => {
|
|
107
138
|
const descriptor = heading.DescriptorName;
|
|
108
|
-
|
|
139
|
+
if (typeof descriptor === "string")
|
|
140
|
+
return descriptor;
|
|
141
|
+
return isRecord(descriptor) ? textOf(descriptor["#text"] ?? "") : "";
|
|
109
142
|
})
|
|
110
143
|
.filter(Boolean);
|
|
111
144
|
return {
|
|
112
145
|
pmid,
|
|
113
|
-
title:
|
|
146
|
+
title: textOf(articleData?.ArticleTitle ?? ""),
|
|
114
147
|
abstract,
|
|
115
148
|
authors,
|
|
116
|
-
journal:
|
|
117
|
-
year:
|
|
149
|
+
journal: textOf(journalData?.Title ?? journalData?.ISOAbbreviation ?? ""),
|
|
150
|
+
year: textOf(publicationDate?.Year ?? ""),
|
|
118
151
|
doi,
|
|
119
152
|
meshTerms,
|
|
120
153
|
pmcId: null,
|
|
@@ -123,23 +156,24 @@ export function parseEfetch(xml) {
|
|
|
123
156
|
}
|
|
124
157
|
export function parseIdConvResponse(data) {
|
|
125
158
|
const result = new Map();
|
|
126
|
-
const
|
|
127
|
-
for (const record of records)
|
|
159
|
+
const parsed = IdConvResponseSchema.safeParse(data);
|
|
160
|
+
for (const record of parsed.success ? (parsed.data.records ?? []) : []) {
|
|
128
161
|
if (record.pmid !== undefined && record.pmcid !== undefined)
|
|
129
162
|
result.set(record.pmid, record.pmcid);
|
|
163
|
+
}
|
|
130
164
|
return result;
|
|
131
165
|
}
|
|
132
166
|
function flattenTextContent(node) {
|
|
133
167
|
if (typeof node === "string" || typeof node === "number")
|
|
134
168
|
return String(node);
|
|
135
|
-
if (node
|
|
169
|
+
if (!isRecord(node))
|
|
136
170
|
return "";
|
|
137
171
|
return Object.entries(node)
|
|
138
172
|
.flatMap(([key, value]) => {
|
|
139
173
|
if (key.startsWith("@_") || key === "fig" || key === "table-wrap" || key === "supplementary-material")
|
|
140
174
|
return [];
|
|
141
175
|
if (key === "#text")
|
|
142
|
-
return [
|
|
176
|
+
return [textOf(value)];
|
|
143
177
|
return Array.isArray(value) ? value.map(flattenTextContent) : [flattenTextContent(value)];
|
|
144
178
|
})
|
|
145
179
|
.filter(Boolean)
|
|
@@ -155,23 +189,22 @@ function extractParagraphs(container) {
|
|
|
155
189
|
.join("\n\n");
|
|
156
190
|
}
|
|
157
191
|
function extractSection(section, output) {
|
|
158
|
-
if (section
|
|
192
|
+
if (!isRecord(section))
|
|
159
193
|
return;
|
|
160
|
-
const
|
|
161
|
-
const text = extractParagraphs(object);
|
|
194
|
+
const text = extractParagraphs(section);
|
|
162
195
|
if (text)
|
|
163
|
-
output.push({ heading: typeof
|
|
164
|
-
const nested =
|
|
196
|
+
output.push({ heading: typeof section.title === "string" ? section.title : "", text });
|
|
197
|
+
const nested = section.sec;
|
|
165
198
|
for (const child of nested === undefined ? [] : Array.isArray(nested) ? nested : [nested])
|
|
166
199
|
extractSection(child, output);
|
|
167
200
|
}
|
|
168
201
|
export function parsePmcFullText(xml) {
|
|
169
|
-
const article =
|
|
170
|
-
const body = article
|
|
202
|
+
const article = childRecord(parseXmlRecord(xml), "pmc-articleset")?.article;
|
|
203
|
+
const body = childRecord(article, "body");
|
|
171
204
|
if (body === undefined)
|
|
172
205
|
return null;
|
|
173
206
|
const sections = [];
|
|
174
|
-
for (const section of
|
|
207
|
+
for (const section of recordList(body.sec))
|
|
175
208
|
extractSection(section, sections);
|
|
176
209
|
if (sections.length === 0) {
|
|
177
210
|
const text = extractParagraphs(body);
|
|
@@ -213,7 +246,7 @@ export function createPubmedSource(options = {}) {
|
|
|
213
246
|
const result = await requestText(url(`${NCBI_BASE}/efetch.fcgi`, { db: "pubmed", id: pmids.join(","), rettype: "xml", retmode: "xml" }), options, signal);
|
|
214
247
|
if (result.status !== "ok")
|
|
215
248
|
return result;
|
|
216
|
-
if (
|
|
249
|
+
if (!PUBMED_ARTICLE_SET_ELEMENT.test(result.value))
|
|
217
250
|
return { status: "unavailable", detail: "response schema mismatch: missing PubmedArticleSet" };
|
|
218
251
|
return { status: "ok", value: parseEfetch(result.value) };
|
|
219
252
|
}
|
|
@@ -238,12 +271,9 @@ export function createPubmedSource(options = {}) {
|
|
|
238
271
|
const result = await requestText(url(`${NCBI_BASE}/ecitmatch.cgi`, { db: "pubmed", rettype: "xml", bdata }), options, signal);
|
|
239
272
|
if (result.status !== "ok")
|
|
240
273
|
return result;
|
|
241
|
-
const pmids = result.value
|
|
242
|
-
.trim()
|
|
243
|
-
.split(/\r?\n/)
|
|
244
|
-
.flatMap((line) => {
|
|
274
|
+
const pmids = splitLines(result.value.trim()).flatMap((line) => {
|
|
245
275
|
const value = line.split("|").at(-1)?.trim();
|
|
246
|
-
return value !== undefined &&
|
|
276
|
+
return value !== undefined && value.length > 0 && isAllDigits(value) ? [value] : [];
|
|
247
277
|
});
|
|
248
278
|
return { status: "ok", value: pmids };
|
|
249
279
|
},
|
|
@@ -264,7 +294,12 @@ export function createPubmedSource(options = {}) {
|
|
|
264
294
|
return { status: "ok", value: { articles: articlesResult.value, notFound: pmids.filter((pmid) => !found.has(pmid)) } };
|
|
265
295
|
},
|
|
266
296
|
async fetchFullText(pmcId, signal) {
|
|
267
|
-
const result = await requestText(url(`${NCBI_BASE}/efetch.fcgi`, {
|
|
297
|
+
const result = await requestText(url(`${NCBI_BASE}/efetch.fcgi`, {
|
|
298
|
+
db: "pmc",
|
|
299
|
+
id: pmcId.slice(0, 3).toLowerCase() === "pmc" ? pmcId.slice(3) : pmcId,
|
|
300
|
+
rettype: "xml",
|
|
301
|
+
retmode: "xml",
|
|
302
|
+
}), options, signal);
|
|
268
303
|
return result.status === "ok" ? { status: "ok", value: parsePmcFullText(result.value) } : result;
|
|
269
304
|
},
|
|
270
305
|
};
|
|
@@ -33,7 +33,7 @@ export declare const SearchResponseSchema: z.ZodObject<{
|
|
|
33
33
|
externalIds: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>>;
|
|
34
34
|
}, z.core.$loose>>>;
|
|
35
35
|
}, z.core.$strip>;
|
|
36
|
-
export
|
|
36
|
+
export type SemanticScholarPaper = {
|
|
37
37
|
id: string;
|
|
38
38
|
title?: string;
|
|
39
39
|
abstract?: string;
|
|
@@ -43,16 +43,16 @@ export interface SemanticScholarPaper {
|
|
|
43
43
|
url?: string;
|
|
44
44
|
authors: string[];
|
|
45
45
|
externalIds?: Record<string, string>;
|
|
46
|
-
}
|
|
47
|
-
export
|
|
46
|
+
};
|
|
47
|
+
export type SemanticScholarSearchPaper = SemanticScholarPaper & {
|
|
48
48
|
title: string;
|
|
49
|
-
}
|
|
50
|
-
export
|
|
49
|
+
};
|
|
50
|
+
export type SemanticScholarSourceOptions = SourceHttpOptions & {
|
|
51
51
|
readonly apiKey?: string;
|
|
52
|
-
}
|
|
53
|
-
export
|
|
52
|
+
};
|
|
53
|
+
export type SemanticScholarSource = {
|
|
54
54
|
search(query: string, limit: number, signal?: AbortSignal): Promise<SourceHttpResult<SemanticScholarSearchPaper[]>>;
|
|
55
55
|
lookupIdentifier(identifier: string, signal?: AbortSignal): Promise<SourceHttpResult<SemanticScholarPaper>>;
|
|
56
|
-
}
|
|
56
|
+
};
|
|
57
57
|
export declare function parseSemanticScholarResponse(raw: unknown): SemanticScholarSearchPaper[];
|
|
58
58
|
export declare function createSemanticScholarSource(options?: SemanticScholarSourceOptions): SemanticScholarSource;
|