Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(release): 7.3.0 #15069

Merged
merged 488 commits into from
May 28, 2024
Merged
Changes from 1 commit
Commits
Show all changes
488 commits
Select commit Hold shift + click to select a range
3385bf1
refactor(components): update parameter table stories (#14815)
koji Apr 8, 2024
88c3f2c
refactor(components): update Box stories (#14827)
koji Apr 8, 2024
1a5052c
Exec 372 hide performance metrics project behind ff (#14811)
DerekMaggio Apr 8, 2024
e620a8c
refactor(app): remove RTP feature flag (#14837)
koji Apr 8, 2024
2a717d7
feat(protocol-designer): update unused module alert to account for Mo…
jerader Apr 8, 2024
75acb05
feat(robot server): add a POST method on the analyses endpoint (#14828)
sanni-t Apr 8, 2024
3643bc7
feat(protocol-designer): temperature form multiple module support (#1…
jerader Apr 9, 2024
cc084a4
fix(shared-data): format rtp float and int choices to include suffix …
jerader Apr 9, 2024
19d88ce
fix(protocol-designer): magnetic form correct engage height ranges (#…
jerader Apr 9, 2024
1819b8c
feat(api): Pause when `pick_up_tip()` errors in a Python protocol (#1…
SyntaxColoring Apr 9, 2024
2cff9d2
feat(hardware-testing): liquid sense testing script (#14807)
ryanthecoder Apr 9, 2024
0c799fe
Add errored runs to abr tracking sheet (#14845)
rclarke0 Apr 9, 2024
f039897
App style 96 ch exit text (#14843)
y3rsh Apr 9, 2024
e345d32
fix(shared-data, app): fix runtime parameters range display (#14847)
koji Apr 9, 2024
2a82fef
style(app): Adjust desktop app "moveToWell" command text font size (#…
mjhuff Apr 9, 2024
3012568
refactor(app): switch ODD update modal progress bar with spinner (#14…
ncdiehl11 Apr 9, 2024
61b1371
fix(app): display app version again (#14844)
sfoster1 Apr 9, 2024
476149e
feat(protocol-designer): create container for all tipracks (#14848)
jerader Apr 9, 2024
57a8152
refactor(protocol-designer, components): infoItem to nicely accommoda…
jerader Apr 9, 2024
f81da99
fix(shared-data, app): fix small issues in app (#14851)
koji Apr 10, 2024
309b6c1
chore(release): merge changes from v7.2.2 into edge
y3rsh Apr 10, 2024
7544175
fix(discovery-client): fix import statement (#14856)
koji Apr 10, 2024
e423319
feat(opentrons-ai-client, opentrons-ai-server): add folders for opent…
koji Apr 10, 2024
8f50b08
fix(api): ensure the right mount is enabled for initial homing (#14822)
caila-marashaj Apr 10, 2024
a4bc700
fix(app-testing): snapshot failure capture (#14852)
github-actions[bot] Apr 10, 2024
a2c5a02
fix(app): fix rtp slideout issue (#14855)
koji Apr 11, 2024
4c83fc1
fix(app-shell-odd): fix typo in vite-config (#14864)
koji Apr 11, 2024
8bb14f4
feat(app): add input screen for ODD numerical runtime parameters (#14…
ncdiehl11 Apr 11, 2024
a81cc18
fix(shared-data): adapt 96 3.6 to new schema (#14869)
sfoster1 Apr 11, 2024
ee6ff25
chore(api,shared-data): Require Python >=3.10, not >=3.8 (#14867)
SyntaxColoring Apr 11, 2024
332355e
fix(protocol-designer): auto-generate trashBin for flex if no pipetti…
jerader Apr 11, 2024
9b45ea1
Module ramp rate to google sheet (#14868)
rclarke0 Apr 11, 2024
fa6066f
feat(protocol-designer): export and announcement modal for PD 8.1 (#1…
jerader Apr 11, 2024
9be2f8f
fix(app): remove unnecessary console.log (#14880)
koji Apr 11, 2024
044b37f
fix(protocol-designer, components): discarding vs delete step form bu…
jerader Apr 12, 2024
b358ebe
feat(robot-server): add runtime parameter definitions to run summary …
jbleon95 Apr 12, 2024
80222d9
feat(app): add generic run paused splash screen (#14873)
mjhuff Apr 12, 2024
fd6a5b2
fix(app): fix hepa/uv firmware copy (#14881)
mjhuff Apr 12, 2024
15782ad
refactor(protocol-engine): Rename stop() and pause() -> request_stop(…
SyntaxColoring Apr 12, 2024
aba93f1
feat(opentron-ai-client): add Side Panel component (#14886)
koji Apr 12, 2024
b0fb14f
fix(app): update software keyboard ref type (#14860)
koji Apr 12, 2024
485bf0e
feat(app, api-client, react-api-client): add api-client method for pr…
ncdiehl11 Apr 12, 2024
437e074
feat(system-server,robot-server,api): add ability to enable OEM Mode …
vegano1 Apr 12, 2024
f206b14
feat(api-client,app,react-api-client): implement ODD anonymous locali…
brenthagen Apr 12, 2024
efc6bd6
fix(api): raise an error if protocol's defined parameters have duplic…
jbleon95 Apr 12, 2024
f695e74
feat(robot-server): limit the maximum number of analyses stored per p…
sanni-t Apr 12, 2024
5c4c9fe
feat(system-server): add /system/oem_mode/upload_splash endpoint to c…
vegano1 Apr 12, 2024
f8621b8
refactor(protocol-designer): export modal to require app 7.3.0 or hig…
jerader Apr 12, 2024
40637dc
refactor(app): update Flex drop-tip modal copy (#14889)
mjhuff Apr 12, 2024
3142bc2
refactor(app): anonymize all app strings (#14884)
ecormany Apr 12, 2024
fa13e30
feat(performance-metrics): add RobotContextTracker (#14862)
DerekMaggio Apr 15, 2024
f0f3401
fix(app-testing): snapshot failure capture (#14897)
github-actions[bot] Apr 15, 2024
b8c08aa
refactor(robot-server): consolidate DB transactions, fix a max analys…
sanni-t Apr 15, 2024
9cae291
refactor(components): refactor StyledText stories (#14899)
koji Apr 15, 2024
6f35979
refactor(components): refactor location icon stories (#14896)
koji Apr 15, 2024
e5080a6
refactor(app): refactor externallink stories (#14895)
koji Apr 15, 2024
dc093fb
refactor(app): refactor banner component stories (#14894)
koji Apr 15, 2024
e6769f3
fix(shared-data): correctly apply loadname regex (#14887)
sfoster1 Apr 15, 2024
26e063b
feat(opentrons-ai-client): add prompt guide component (#14892)
koji Apr 15, 2024
611978c
refactor(robot-server): Delete unused models for maintenance runs, an…
SyntaxColoring Apr 15, 2024
5b84b34
feat(app): orchestration component for new quick transfer flow (#14808)
smb2268 Apr 15, 2024
bf69ad8
feat(app): push recent RTP run card click to protocol details (#14906)
ncdiehl11 Apr 15, 2024
4e895d4
feat(app, api, shared-data, robot-server): Add module fixtures to dec…
CaseyBatten Apr 15, 2024
55f798a
refactor(api): more clear error messages for type validation when cre…
jbleon95 Apr 15, 2024
8cc2fc7
fix(app): properly disable proceed button if no available robots (#14…
ncdiehl11 Apr 15, 2024
dfb572c
feat(app): factory mode desktop toggle (#14911)
brenthagen Apr 16, 2024
4687e0a
fix(app-testing): snapshot failure capture (#14913)
github-actions[bot] Apr 16, 2024
f7dd2fa
chore(internal release): notes (#14914)
y3rsh Apr 16, 2024
829aa79
refactor(protocol-designer): increased test coverage for ConnectedSte…
jerader Apr 16, 2024
df1d203
fix(app): disable 'Run a protocol' robot overflow menu item if robot …
ncdiehl11 Apr 16, 2024
59d4cc6
fix(protocol-designer): moveLabware newLocation error accounts for cu…
jerader Apr 16, 2024
9152f22
fix(app): Handle Unsafe Move to Plunger during Drop-Tip (#14910)
mjhuff Apr 16, 2024
1fb2e85
fix(app): set max height for desktop modal shell (#14915)
ncdiehl11 Apr 16, 2024
55d25bb
fix(protocol-designer): filter out module addressable areas from newL…
jerader Apr 16, 2024
071cc97
refactor(api,app): remove internal_only flag from enableOEMMode setti…
brenthagen Apr 16, 2024
d77bbb7
fix: fix timing function cross-platform bug (#14919)
DerekMaggio Apr 16, 2024
385d123
feat(app): add pipette selection screen to quick transfer flow (#14912)
smb2268 Apr 16, 2024
4abe652
fix(app): set default selected robot on slideout to first valid robot…
ncdiehl11 Apr 16, 2024
35e9fe7
refactor(api): only ignore stalls for downward portion of force picku…
caila-marashaj Apr 16, 2024
717993b
fix(app): fix various install and version issues (#14926)
sfoster1 Apr 16, 2024
2fadbf1
chore(release): [email protected] release notes (#14930)
y3rsh Apr 17, 2024
3f9cae7
feat(opentrons-ai-client): add ChatDisplay component (#14927)
koji Apr 17, 2024
e20c8e5
chore: add test workflow for opentrons-ai-client (#14923)
koji Apr 17, 2024
0fcbfb4
fix(robot-server): revert test-flex.json back to two pipettes (#14931)
smb2268 Apr 17, 2024
d4bc2da
fix(hardware): remove message ignored by filter spammy log (#14932)
vegano1 Apr 17, 2024
86e1d47
ci(components): fix github deploy action (#14935)
shlokamin Apr 17, 2024
aae8a10
feat(shared-data, api): add uiMaxFlowRate key to pipette definitions …
jerader Apr 17, 2024
0940e7c
chore(api): handle performance-metrics package not existing (#14922)
DerekMaggio Apr 17, 2024
4931d03
fix(opentrons-ai-client): apply GlobalStyle to the application (#14936)
koji Apr 17, 2024
105e8bb
fix(app): add optional description icon to dropdownMenu (#14934)
jerader Apr 17, 2024
f3e966a
fix(app): reset robot and protocol slideout states on close (#14939)
ncdiehl11 Apr 17, 2024
68aa208
ci(components): install udev before calling setup (#14937)
shlokamin Apr 17, 2024
c096931
fix(app): replace remark with react-markdown (#14942)
mjhuff Apr 17, 2024
0e79a40
feat(opentrons-ai-client): add ChatContainer component (#14921)
koji Apr 18, 2024
7d6100d
fix(hardware): remove can messenger `motor_enabled` listener (#14943)
ahiuchingau Apr 18, 2024
58973c6
fix(api): retract function should acquire motion lock (#14944)
ahiuchingau Apr 18, 2024
585f69e
feat(protocol-designer): edit multiple modules modal + row (#14933)
jerader Apr 18, 2024
1a4492b
fix(api): better error message for non-string variable names and min/…
jbleon95 Apr 18, 2024
6d91a56
fix(app): ensure ApplyHistoricOffsets renders on non-RTP protocols (#…
ncdiehl11 Apr 18, 2024
e877f3a
refactor(api): Delete unused action_dispatcher argument (#14954)
SyntaxColoring Apr 19, 2024
8fa37b3
docs(api): fix or remove broken links on Welcome page (#14957)
ecormany Apr 19, 2024
4418128
fix(api): Various E-stop fixes (#14929)
SyntaxColoring Apr 19, 2024
8e1794f
chore: remove downgrade npm (#14898)
koji Apr 19, 2024
15bfd98
refactor(api): Relocate module location validation to engine (#14960)
CaseyBatten Apr 19, 2024
b5a9115
chore: create test-data-generation project in monorepo (#14961)
DerekMaggio Apr 19, 2024
165956d
fix(api): add case correction to module_context.load_labware (#14964)
sanni-t Apr 19, 2024
229573f
fix(api): engage axis to enable the motor before attempting to move t…
vegano1 Apr 19, 2024
4cc69eb
fix(app): configure modules during calibration, shorten heater shaker…
b-cooper Apr 19, 2024
de2b1eb
feat(opentrons-ai-client): introduce react-markdown to chat display c…
koji Apr 22, 2024
0f07f97
fix(components): fix icon stories (#14969)
koji Apr 22, 2024
8776ed9
ci(shared-data): install dependencies in workflow (#14958)
shlokamin Apr 22, 2024
b42927a
feat(app): add tiprack selection step to quick transfer flow (#14950)
smb2268 Apr 22, 2024
58a1fc0
refactor(protocol-designer): tip position modal max values round down…
jerader Apr 22, 2024
26d55ec
fix(app, api-client): fix choose protocol slideout issue (#14949)
koji Apr 22, 2024
838e356
refactor(protocol-designer): assign module slot in createFileWizard i…
jerader Apr 22, 2024
ec73d82
refactor(components): refactor roundtab stories (#14956)
koji Apr 22, 2024
2532997
fix(app): prevent "run again" banner from rendering after navigating …
mjhuff Apr 22, 2024
d4f7f17
feat(hardware-testing): enable multi sensor processing in liquid prob…
ryanthecoder Apr 22, 2024
2d57126
feature(api, robot-server): Allow fixit commands to recover from an e…
TamarZanzouri Apr 22, 2024
737c58c
fix(robot-server): notify /runs when a non-current run is deleted (#1…
mjhuff Apr 22, 2024
433ef44
feat(api-client,app,react-api-client): upload splash logo from deskto…
brenthagen Apr 22, 2024
ff5e0c0
fix(api): remove homing patch fix for right mount when a 96-channel i…
ahiuchingau Apr 22, 2024
3b7058e
fix(app): add robotSerialNumber to proceedToRun event (#14976)
koji Apr 23, 2024
4794f55
feat(opentrons-ai-client) add input textbox to container (#14968)
koji Apr 23, 2024
cfefcbc
feat(api): add option to ignore different tip presence states (#14980)
caila-marashaj Apr 23, 2024
ce97b91
fix(app): fix infinitely re-rendering/never rendering firmware succes…
mjhuff Apr 23, 2024
daa51dd
fix(api): Filter out `air_gap()` calls as higher-order commands (#14985)
SyntaxColoring Apr 23, 2024
26929a2
fix(app): clone run with RTPs from HistoricalProtocolRun (#14959)
ncdiehl11 Apr 23, 2024
4c89730
feat(opentrons-ai-client): add prompt button (#14970)
koji Apr 23, 2024
446da56
feat(app): Only follow rear tip sensor during calibration setup (#14984)
caila-marashaj Apr 23, 2024
a9dcb20
chore(release): [email protected] release notes (#14988)
y3rsh Apr 23, 2024
5415917
fix(app): resolve module location conflicts through deck config durin…
b-cooper Apr 23, 2024
40db9c5
fix(opentrons-shared-data): fix performance module not being recogniz…
DerekMaggio Apr 24, 2024
f7a2f56
chore(release): [email protected] release notes (#14991)
y3rsh Apr 24, 2024
9b6fb78
fix(build): add workaround to fix github actions due to microsoft sig…
vegano1 Apr 24, 2024
1b1ec1b
feat(opentrons-ai-client): add style to container of Textarea (#14987)
koji Apr 24, 2024
aa3569b
fix(app-testing): snapshot failure capture (#14992)
github-actions[bot] Apr 24, 2024
9d75e1f
feat(shared-data, protocol-designer): return latest pipette model def…
jerader Apr 24, 2024
5683b33
fix(shared-data): remove sort from choices (#14996)
koji Apr 24, 2024
972c970
refactor(protocol-designer): tweak when module cards are disabled in …
jerader Apr 24, 2024
0493c5c
fix(app): specify component for markdown uls (#14997)
sfoster1 Apr 24, 2024
5f85719
chore(shared-data): Add pipette definition for P50S v3.6 (#14863)
andySigler Apr 24, 2024
77bc720
refactor(app): add RTP properties to protocol run event analytics (#1…
ncdiehl11 Apr 24, 2024
c7bd4bb
feat(api): add a reload-labware command (#14963)
sfoster1 Apr 24, 2024
04e00ad
refactor(protocol-designer): minimize and extend position and tuberac…
jerader Apr 25, 2024
bd1f8da
feat(step-generation, shared-data): pipette collision warnings (#14989)
jerader Apr 25, 2024
f6099c4
Correct HS Time Calculation and Print Statements (#15005)
rclarke0 Apr 25, 2024
ee6e9fe
fix(app): add robot serial number to BuildrootAnalyticsData (#15000)
koji Apr 25, 2024
b2644e5
refactor(monorepo): update lint-js command (#14977)
koji Apr 25, 2024
7bb202e
fix(app-shell,app): Send labware files and runtime parameters over US…
SyntaxColoring Apr 25, 2024
a153f52
fix(app): disable the factory mode complete and restart robot button …
brenthagen Apr 25, 2024
33f37ea
feat(robot-server): add deck_configuration notification publisher (#1…
mjhuff Apr 25, 2024
d5484f8
AUTH-73 feat(rtp): example RTP for testing (#14703)
y3rsh Apr 25, 2024
e53226a
feat(app): Add GET /deck_configuration notification support (#15007)
mjhuff Apr 25, 2024
cf9b6d2
feat(api): implement labware.set_offset in 2.18 (#14940)
sfoster1 Apr 25, 2024
4ea08cb
fix(app): check /instruments for 96 channel attachment (#15011)
smb2268 Apr 25, 2024
fab0bd2
fix(app): liquid detail fixed precision (#15013)
sfoster1 Apr 25, 2024
faff667
chore(mono): Enforce notification hooks in the app (#15010)
mjhuff Apr 25, 2024
264883a
feat(shared-data, api): return latest pipette version from pipetteNam…
jerader Apr 25, 2024
dcd2666
fix(api): skip command key hash generation only if command intent is …
sanni-t Apr 26, 2024
ff84cb1
chore(app-shell): no hard links when building the app locally (#15024)
mjhuff Apr 26, 2024
ce1e64a
refactor(performance-metrics): separate storage logic from tracker (#…
DerekMaggio Apr 26, 2024
39eafa2
feat(app): validate factory mode slideout input (#15025)
brenthagen Apr 26, 2024
97bf5f3
feat(app): create hooks to anonymize instrument display names (#14978)
brenthagen Apr 26, 2024
b2965a6
fix(app): fix ordering of gripper exit so success screen doesn't flas…
smb2268 Apr 26, 2024
471ec35
fix(app): ODD fixture removal, mag block with staging in deck map, ad…
b-cooper Apr 26, 2024
331eddc
fix(api): disallow hashing we using a fixit command (#15026)
TamarZanzouri Apr 26, 2024
35e4e10
fix(api): Raise cases for unsupported nozzle layouts (#15009)
CaseyBatten Apr 26, 2024
f213a44
feat(hardware-testing): update the post processing for multi sensor r…
ryanthecoder Apr 26, 2024
5d0c405
added script to read individual files (#15028)
rclarke0 Apr 26, 2024
da4e01e
feat(api): improve analysis cli (#15027)
sfoster1 Apr 26, 2024
e288df0
refactor(api): Use a dataclass, not a BaseModel, for PipetteNozleLayo…
SyntaxColoring Apr 29, 2024
a30f0f8
refactor(app): style desktop "Applied Labware Offset Data" buttons (#…
mjhuff Apr 29, 2024
114c9ba
fix(app,api,robot-server): remove old sim flag (#15018)
sfoster1 Apr 29, 2024
f0d880a
fix(api): pass the calibrated jaw max offset value when we resetting …
ahiuchingau Apr 29, 2024
0eb749f
fix(api): disengage Z motors during 96-channel pipettes bracket detac…
ahiuchingau Apr 29, 2024
aa4a835
fix(app-shell): monitor usb only once (#15047)
sfoster1 Apr 30, 2024
2ded69a
fix(app): add grey square for stale and error protocol map (#15016)
smb2268 Apr 30, 2024
e182bb9
refactor(api): Make sure command implementations return something com…
SyntaxColoring Apr 30, 2024
2f89575
fix(app,components): fix add a new case to info screen for labware (#…
koji Apr 30, 2024
6eb85a8
fix(app): fix Numerical keyboard switching issue (#15044)
koji Apr 30, 2024
117f26f
fix(api): preserve pre-v2.18 API tip drop alternating behavior (#15052)
jbleon95 Apr 30, 2024
c163426
fix(robot-server): initialize fw update status_cache so we dont hang …
vegano1 Apr 30, 2024
2e66d54
fix(app): mag block with staging area location conflict, handle no co…
b-cooper Apr 30, 2024
8084b9a
fix(app): activate input-field focus-visble (#15048)
koji Apr 30, 2024
65a5d0c
chore: release notes for 7.3.0 (#15045)
ecormany May 1, 2024
4eac5a2
fix(test): snapshot renaming (#15038)
y3rsh May 1, 2024
b73b082
fix(app): fix restore default values button behavior (#15017)
koji May 1, 2024
ccce785
fix(app): fix remove Parameters header if a protocl is non-RTP (#15036)
koji May 1, 2024
19facd0
fix(app): fix RoundTabs grid-gap in protocl details (#15037)
koji May 1, 2024
d929a2b
fix(app): remove unnecessary padding-top (#15039)
koji May 1, 2024
3ff6c7b
fix(app-testing): snapshot failure capture (#15058)
github-actions[bot] May 1, 2024
4635d72
refactor(app): generify MQTT Analytics (#15065)
mjhuff May 1, 2024
6e3c0d1
fix(api): stop-requested hanging on stop when awaiting-recovery (#15066)
TamarZanzouri May 1, 2024
b15af5e
feat(test-data-generation): first pass at generating deck configurati…
DerekMaggio May 1, 2024
044be7a
fix(api-client): sanitize file name thoroughly (#15062)
brenthagen May 1, 2024
1cea210
feat(app): anonymize pipette wizard flows (#15055)
brenthagen May 1, 2024
78ac8fc
fix(system-server): sanitize the filename in the upload_splash endpoi…
vegano1 May 1, 2024
f44872b
feat(robot-server, app): add a new endpoint for fast-fetching all run…
sanni-t May 1, 2024
3f10d09
feat(app): anonymize release notes (#15068)
brenthagen May 1, 2024
657d259
fix(app): fallback to current run command on ODD if run diverges from…
b-cooper May 1, 2024
1ed0740
fix(app): modify slideout restore value link layout (#15059)
koji May 2, 2024
2c5669b
fix(app): fix the arrow icon size in dropdown menu (#15042)
koji May 2, 2024
7aa5805
fix(app): remove unnecessary padding (#15067)
koji May 2, 2024
93d3180
fix(app): remove input field box-shadow on ODD (#15040)
koji May 3, 2024
8fef724
refactor(app): format <ul> in release notes (#15081)
mjhuff May 3, 2024
02a1a16
fix(app): modify the space between icon and banner outline (#15085)
koji May 3, 2024
0526f55
fix(app): disable module calibration if heating or cooling (#15054)
ncdiehl11 May 3, 2024
d6472ae
fix(app): fix input field behavior on blur (#15035)
koji May 3, 2024
dfd0f31
fix(app): fix tooltip behavior for disabled Restore default value on …
ncdiehl11 May 3, 2024
fe428d4
fix(app): fix list button styling (#15088)
koji May 3, 2024
a88f03b
fix(app): update specific analysis keys passed through CommandText wi…
ncdiehl11 May 6, 2024
ef946ef
fix(app): fix space in mini card (#15095)
koji May 6, 2024
9ae6051
fix(app, react-api-client): handle failed analysis for RTP protocol o…
ncdiehl11 May 7, 2024
59d0062
refactor(app): Update drop tip blowout copy (#15109)
mjhuff May 7, 2024
cfed247
fix(robot-server): clear ChangeNotifier's internal event immediately …
mjhuff May 7, 2024
f6bd225
fix(app): fix choose number input field behavior (#15099)
koji May 7, 2024
16b94b5
fix(app): update disabled style of ProtocolSetupStep description (#15…
ncdiehl11 May 7, 2024
ef7a0d8
fix(app): ensure terminal run preview shows detail for load liquid co…
ncdiehl11 May 8, 2024
49cdabc
chore(shared-data): fix deploy to npm github action (#15123)
shlokamin May 8, 2024
1be30f7
fix(app): Fix dropdown menu open direction issue (#15091)
koji May 8, 2024
31a0f3e
chore(robot-server): Fix failing ChangeNotifier test (#15136)
mjhuff May 8, 2024
2011402
fix(api): OT-2 attempting to connect modules via temporary ports (#15…
sanni-t May 8, 2024
7c410bf
fix(app): remove excess padding in TestShakeSlideout (#15142)
ncdiehl11 May 9, 2024
de2ada8
fix(app): fix background color on magnetic module slideout data (#15140)
ncdiehl11 May 9, 2024
0d94f74
fix(app): update InputField styling (#15114)
koji May 9, 2024
9207ef5
fix(app): remove padding from lpc flex box (#15152)
koji May 9, 2024
db21c14
fix(app): fix UpdateAppModal style (#15149)
ncdiehl11 May 9, 2024
a78ea71
fix(app): ensure liquids nested in labware on adapter in module show …
ncdiehl11 May 9, 2024
4a2f61f
refactor(app): refine file upload, input field components (#15097)
brenthagen May 9, 2024
146cf1f
fix(app): fix font size in lpc table (#15151)
koji May 9, 2024
d367217
fix(app): address Design QA comments for modules in deck config (#15150)
b-cooper May 9, 2024
21f917f
fix(app): fix password button rendering issue and update input field …
koji May 10, 2024
ed09d54
fix(app): fix scrollbar style on LPC results table on ODD (#15164)
ncdiehl11 May 10, 2024
0c40f7d
fix(api): Automatic tip tracking index out of range fix (#15135)
CaseyBatten May 10, 2024
0096c12
fix(shared-data) Update tip overlap values for Flex Pipettes (#15147)
Carlos-fernandez May 10, 2024
c7dd9f1
Revert "fix(shared-data) Update tip overlap values for Flex Pipettes …
sfoster1 May 14, 2024
ff46f3a
chore: add known issue for Windows USB labware offset data (#15185)
ecormany May 15, 2024
87bf426
fix(app): show InfoScreen under RunPreview for a run canceled before …
ncdiehl11 May 15, 2024
755a21b
refactor(react-api-client): fix react query key object hashing for us…
ncdiehl11 May 15, 2024
ecd6ab0
chore: add known issue for losing LPC offsets when swapping labware t…
ecormany May 16, 2024
97da85c
fix(app): wait for maintenance run deletion before closing flows (#15…
smb2268 May 16, 2024
737865d
fix(app): properly fall back to load order module matching on map vie…
b-cooper May 16, 2024
a84f58a
fix(app): disable exit button after successful pipette attach/detach …
ncdiehl11 May 16, 2024
76cbb52
fix(app): clear intervention modal if run is finishing (#15209)
ncdiehl11 May 16, 2024
bb1f1ce
refactor(app): make on device display deck configurator updates live …
b-cooper May 16, 2024
d83c4e6
fix(api): restore empty error blocks on cancelled runs (#15215)
sfoster1 May 17, 2024
4dfd608
fix(app): fix slot validation on ODD location conflict check to accou…
CaseyBatten May 21, 2024
21572f0
fix(app): instead filter magnetic blocks (not magnetic modules) out o…
b-cooper May 21, 2024
2afa859
fix(api): validation casing for mixed tip use between single and eigh…
CaseyBatten May 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat(robot server): add a POST method on the analyses endpoint (#14828)
Closes AUTH-255

# Overview

Adds a POST method to the existing `/protocols/{protocolId}/analyses`
endpoint in order to post a new analysis for an existing protocol.

This endpoint will take a request body with two optional fields:
- `runTimeParameterValues`
- `forceReAnalyze`

The new method can affect the analyses in three ways:
1. When the request is sent with `forceReAnalyze=True`, the server will
unconditionally start a new analysis for the protocol using any RTP data
sent along with it. It will return a 201 CREATED status and respond with
a list of analysis summaries of all the analyses (ordered oldest first),
including the newly started analysis.
2. When the request is sent without the `forceReAnalyze` field (or with
`forceReAnalyze=False`), then the server will check the last analysis of
the protocol
- if the RTP values used for it were **different** from the RTP values
sent with the current request, then the server will start a new analysis
using the new RTP values. It will return a 201 CREATED status and
respond with a list of analysis summaries of all the analyses, including
the newly started analysis.
- if the RTP values used for it were the **same** as the RTP values sent
with the current request, then the server will **NOT** start a new
analysis. It will return a 200 OK status, and simply return the existing
list of analysis summaries.

This request requires the last analysis of the protocol to have been
completed before handling this request. If the last analysis is pending,
it will return a 503 error.

# Test Plan

Test out the above three cases and anything else you can think might
affect the behavior.
It's pretty well tested in unit & integration tests and it is also the
same logic used for handling analyses from `POST /protocols`, so it is
expected to work well when used as tested in integration tests.

# Review requests

Usual review for code sanity check.

# Risk assessment

Low. New HTTP API not yet used anywhere.
sanni-t authored Apr 8, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit 75acb0559d029ac8c8835cb3cecf7e45b9b80dc6
14 changes: 13 additions & 1 deletion robot-server/robot_server/protocols/analysis_models.py
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@
# TODO(mc, 2021-08-25): add modules to simulation result
from enum import Enum

from opentrons.protocol_engine.types import RunTimeParameter
from opentrons.protocol_engine.types import RunTimeParameter, RunTimeParamValuesType
from opentrons_shared_data.robot.dev_types import RobotType
from pydantic import BaseModel, Field
from typing import List, Optional, Union, NamedTuple
@@ -40,6 +40,18 @@ class AnalysisResult(str, Enum):
NOT_OK = "not-ok"


class AnalysisRequest(BaseModel):
"""Model for analysis request body."""

runTimeParameterValues: RunTimeParamValuesType = Field(
default={},
description="Key-value pairs of run-time parameters defined in a protocol.",
)
forceReAnalyze: bool = Field(
False, description="Whether to force start a new analysis."
)


class AnalysisSummary(BaseModel):
"""Base model for an analysis of a protocol."""

166 changes: 135 additions & 31 deletions robot-server/robot_server/protocols/router.py
Original file line number Diff line number Diff line change
@@ -4,8 +4,9 @@
from textwrap import dedent
from datetime import datetime
from pathlib import Path
from typing import List, Optional, Union
from typing import List, Optional, Union, Tuple

from opentrons.protocol_engine.types import RunTimeParamValuesType
from opentrons_shared_data.robot import user_facing_robot_type
from typing_extensions import Literal

@@ -32,13 +33,14 @@
SimpleEmptyBody,
MultiBodyMeta,
PydanticResponse,
RequestModel,
)

from .protocol_auto_deleter import ProtocolAutoDeleter
from .protocol_models import Protocol, ProtocolFile, Metadata
from .protocol_analyzer import ProtocolAnalyzer
from .analysis_store import AnalysisStore, AnalysisNotFoundError, AnalysisIsPendingError
from .analysis_models import ProtocolAnalysis
from .analysis_models import ProtocolAnalysis, AnalysisRequest, AnalysisSummary
from .protocol_store import (
ProtocolStore,
ProtocolResource,
@@ -162,7 +164,7 @@ class ProtocolLinks(BaseModel):
status.HTTP_503_SERVICE_UNAVAILABLE: {"model": ErrorBody[LastAnalysisPending]},
},
)
async def create_protocol( # noqa: C901
async def create_protocol(
files: List[UploadFile] = File(...),
# use Form because request is multipart/form-data
# https://fastapi.tiangolo.com/tutorial/request-forms-and-files/
@@ -238,35 +240,18 @@ async def create_protocol( # noqa: C901

if cached_protocol_id is not None:
resource = protocol_store.get(protocol_id=cached_protocol_id)
analyses = analysis_store.get_summaries_by_protocol(
protocol_id=cached_protocol_id
)

try:
if (
# Unexpected situations, like powering off the robot after a protocol upload
# but before the analysis is complete, can leave the protocol resource
# without an associated analysis.
len(analyses) == 0
or
# The most recent analysis was done using different RTP values
not await analysis_store.matching_rtp_values_in_analysis(
analysis_summary=analyses[-1], new_rtp_values=parsed_rtp
)
):
# This protocol exists in database but needs to be (re)analyzed
task_runner.run(
protocol_analyzer.analyze,
protocol_resource=resource,
analysis_id=analysis_id,
run_time_param_values=parsed_rtp,
)
analyses.append(
analysis_store.add_pending(
protocol_id=cached_protocol_id,
analysis_id=analysis_id,
)
)
analysis_summaries, _ = await _start_new_analysis_if_necessary(
protocol_id=cached_protocol_id,
analysis_id=analysis_id,
rtp_values=parsed_rtp,
force_reanalyze=False,
protocol_store=protocol_store,
analysis_store=analysis_store,
protocol_analyzer=protocol_analyzer,
task_runner=task_runner,
)
except AnalysisIsPendingError as error:
raise LastAnalysisPending(detail=str(error)).as_error(
status.HTTP_503_SERVICE_UNAVAILABLE
@@ -278,7 +263,7 @@ async def create_protocol( # noqa: C901
protocolType=resource.source.config.protocol_type,
robotType=resource.source.robot_type,
metadata=Metadata.parse_obj(resource.source.metadata),
analysisSummaries=analyses,
analysisSummaries=analysis_summaries,
key=resource.protocol_key,
files=[
ProtocolFile(name=f.path.name, role=f.role)
@@ -357,6 +342,53 @@ async def create_protocol( # noqa: C901
)


async def _start_new_analysis_if_necessary(
protocol_id: str,
analysis_id: str,
force_reanalyze: bool,
rtp_values: RunTimeParamValuesType,
protocol_store: ProtocolStore,
analysis_store: AnalysisStore,
protocol_analyzer: ProtocolAnalyzer,
task_runner: TaskRunner,
) -> Tuple[List[AnalysisSummary], bool]:
"""Check RTP values and start a new analysis if necessary.

Returns a tuple of the latest list of analysis summaries (including any newly
started analysis) and whether a new analysis was started.
"""
resource = protocol_store.get(protocol_id=protocol_id)
analyses = analysis_store.get_summaries_by_protocol(protocol_id=protocol_id)
started_new_analysis = False
if (
force_reanalyze
or
# Unexpected situations, like powering off the robot after a protocol upload
# but before the analysis is complete, can leave the protocol resource
# without an associated analysis.
len(analyses) == 0
or
# The most recent analysis was done using different RTP values
not await analysis_store.matching_rtp_values_in_analysis(
analysis_summary=analyses[-1], new_rtp_values=rtp_values
)
):
task_runner.run(
protocol_analyzer.analyze,
protocol_resource=resource,
analysis_id=analysis_id,
run_time_param_values=rtp_values,
)
started_new_analysis = True
analyses.append(
analysis_store.add_pending(
protocol_id=protocol_id,
analysis_id=analysis_id,
)
)
return analyses, started_new_analysis


@PydanticResponse.wrap_route(
protocols_router.get,
path="/protocols",
@@ -519,6 +551,78 @@ async def delete_protocol_by_id(
)


@PydanticResponse.wrap_route(
protocols_router.post,
path="/protocols/{protocolId}/analyses",
summary="Analyze the protocol",
description=dedent(
"""
Generate an analysis for the protocol, based on last analysis and current request data.
"""
),
status_code=status.HTTP_201_CREATED,
responses={
status.HTTP_200_OK: {"model": SimpleMultiBody[AnalysisSummary]},
status.HTTP_201_CREATED: {"model": SimpleMultiBody[AnalysisSummary]},
status.HTTP_404_NOT_FOUND: {"model": ErrorBody[ProtocolNotFound]},
status.HTTP_503_SERVICE_UNAVAILABLE: {"model": ErrorBody[LastAnalysisPending]},
},
)
async def create_protocol_analysis(
protocolId: str,
request_body: Optional[RequestModel[AnalysisRequest]] = None,
protocol_store: ProtocolStore = Depends(get_protocol_store),
analysis_store: AnalysisStore = Depends(get_analysis_store),
protocol_analyzer: ProtocolAnalyzer = Depends(get_protocol_analyzer),
task_runner: TaskRunner = Depends(get_task_runner),
analysis_id: str = Depends(get_unique_id, use_cache=False),
) -> PydanticResponse[SimpleMultiBody[AnalysisSummary]]:
"""Start a new analysis for the given existing protocol.

Starts a new analysis for the protocol along with the provided run-time parameter
values (if any), and appends it to the existing analyses.

If the last analysis in the existing analyses used the same RTP values, then a new
analysis is not created.

If `forceAnalyze` is True, this will always start a new analysis.

Returns: List of analysis summaries available for the protocol, ordered as
most recently started analysis last.
"""
if not protocol_store.has(protocolId):
raise ProtocolNotFound(detail=f"Protocol {protocolId} not found").as_error(
status.HTTP_404_NOT_FOUND
)
try:
(
analysis_summaries,
started_new_analysis,
) = await _start_new_analysis_if_necessary(
protocol_id=protocolId,
analysis_id=analysis_id,
rtp_values=request_body.data.runTimeParameterValues if request_body else {},
force_reanalyze=request_body.data.forceReAnalyze if request_body else False,
protocol_store=protocol_store,
analysis_store=analysis_store,
protocol_analyzer=protocol_analyzer,
task_runner=task_runner,
)
except AnalysisIsPendingError as error:
raise LastAnalysisPending(detail=str(error)).as_error(
status.HTTP_503_SERVICE_UNAVAILABLE
) from error
return await PydanticResponse.create(
content=SimpleMultiBody.construct(
data=analysis_summaries,
meta=MultiBodyMeta(cursor=0, totalLength=len(analysis_summaries)),
),
status_code=status.HTTP_201_CREATED
if started_new_analysis
else status.HTTP_200_OK,
)


@PydanticResponse.wrap_route(
protocols_router.get,
path="/protocols/{protocolId}/analyses",
Original file line number Diff line number Diff line change
@@ -84,3 +84,22 @@ stages:
# We need to make sure we get the Content-Type right because FastAPI won't do it for us.
Content-Type: application/json
json: !force_format_include '{analysis_data}'


- name: Check that a new analysis is started with forceReAnalyze
request:
url: '{ot2_server_base_url}/protocols/{protocol_id}/analyses'
method: POST
json:
data:
forceReAnalyze: true
response:
strict:
- json:off
status_code: 201
json:
data:
- id: '{analysis_id}'
status: completed
- id: !anystr
status: pending
Original file line number Diff line number Diff line change
@@ -177,4 +177,25 @@ stages:
description: What pipette to use during the protocol.
commands:
# Check for this command's presence as a smoke test that the analysis isn't empty.
- commandType: loadPipette
- commandType: loadPipette

- name: Check that a new analysis is started for the protocol because of new RTP values
request:
url: '{ot2_server_base_url}/protocols/{protocol_id}/analyses'
method: POST
json:
data:
runTimeParameterValues:
sample_count: 2
response:
strict:
- json:off
status_code: 201
json:
data:
- id: '{analysis_id}'
status: completed
- id: '{analysis_id2}'
status: completed
- id: !anystr
status: pending
132 changes: 131 additions & 1 deletion robot-server/tests/protocols/test_protocols_router.py
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@
from fastapi import UploadFile
from pathlib import Path

from opentrons.protocol_engine.types import RunTimeParamValuesType
from opentrons.protocols.api_support.types import APIVersion

from opentrons.protocol_reader import (
@@ -23,7 +24,7 @@
)

from robot_server.errors.error_responses import ApiError
from robot_server.service.json_api import SimpleEmptyBody, MultiBodyMeta
from robot_server.service.json_api import SimpleEmptyBody, MultiBodyMeta, RequestModel
from robot_server.service.task_runner import TaskRunner
from robot_server.protocols.analysis_store import (
AnalysisStore,
@@ -38,6 +39,7 @@
CompletedAnalysis,
PendingAnalysis,
AnalysisResult,
AnalysisRequest,
)

from robot_server.protocols.protocol_models import (
@@ -56,6 +58,7 @@
from robot_server.protocols.router import (
ProtocolLinks,
create_protocol,
create_protocol_analysis,
get_protocols,
get_protocol_ids,
get_protocol_by_id,
@@ -1393,3 +1396,130 @@ async def test_get_protocol_analysis_as_document_analysis_not_found(

assert exc_info.value.status_code == 404
assert exc_info.value.content["errors"][0]["id"] == "AnalysisNotFound"


async def test_create_protocol_analyses_with_same_rtp_values(
decoy: Decoy,
protocol_store: ProtocolStore,
analysis_store: AnalysisStore,
protocol_analyzer: ProtocolAnalyzer,
task_runner: TaskRunner,
) -> None:
"""It should not start a new analysis for the new rtp values."""
rtp_values: RunTimeParamValuesType = {"vol": 123, "dry_run": True, "mount": "left"}
analysis_summaries = [
AnalysisSummary(
id="analysis-id",
status=AnalysisStatus.COMPLETED,
),
]
decoy.when(protocol_store.has(protocol_id="protocol-id")).then_return(True)
decoy.when(
analysis_store.get_summaries_by_protocol(protocol_id="protocol-id")
).then_return(analysis_summaries)
decoy.when(
await analysis_store.matching_rtp_values_in_analysis(
analysis_summaries[-1], rtp_values
)
).then_return(True)

result = await create_protocol_analysis(
protocolId="protocol-id",
request_body=RequestModel(
data=AnalysisRequest(runTimeParameterValues=rtp_values)
),
protocol_store=protocol_store,
analysis_store=analysis_store,
protocol_analyzer=protocol_analyzer,
task_runner=task_runner,
analysis_id="analysis-id-2",
)
assert result.content.data == analysis_summaries
assert result.status_code == 200


async def test_update_protocol_analyses_with_new_rtp_values(
decoy: Decoy,
protocol_store: ProtocolStore,
analysis_store: AnalysisStore,
protocol_analyzer: ProtocolAnalyzer,
task_runner: TaskRunner,
) -> None:
"""It should start a new analysis for the new rtp values."""
rtp_values: RunTimeParamValuesType = {"vol": 123, "dry_run": True, "mount": "left"}
analysis_summaries = [
AnalysisSummary(
id="analysis-id",
status=AnalysisStatus.COMPLETED,
),
]
decoy.when(protocol_store.has(protocol_id="protocol-id")).then_return(True)
decoy.when(
analysis_store.get_summaries_by_protocol(protocol_id="protocol-id")
).then_return(analysis_summaries)
decoy.when(
await analysis_store.matching_rtp_values_in_analysis(
analysis_summaries[-1], rtp_values
)
).then_return(False)
decoy.when(analysis_store.add_pending("protocol-id", "analysis-id-2")).then_return(
AnalysisSummary(id="analysis-id-2", status=AnalysisStatus.PENDING)
)
result = await create_protocol_analysis(
protocolId="protocol-id",
request_body=RequestModel(
data=AnalysisRequest(runTimeParameterValues=rtp_values)
),
protocol_store=protocol_store,
analysis_store=analysis_store,
protocol_analyzer=protocol_analyzer,
task_runner=task_runner,
analysis_id="analysis-id-2",
)
assert result.content.data == [
AnalysisSummary(id="analysis-id", status=AnalysisStatus.COMPLETED),
AnalysisSummary(id="analysis-id-2", status=AnalysisStatus.PENDING),
]
assert result.status_code == 201


async def test_update_protocol_analyses_with_forced_reanalysis(
decoy: Decoy,
protocol_store: ProtocolStore,
analysis_store: AnalysisStore,
protocol_analyzer: ProtocolAnalyzer,
task_runner: TaskRunner,
) -> None:
"""It should start a new analysis for the protocol, regardless of rtp values."""
analysis_summaries = [
AnalysisSummary(
id="analysis-id",
status=AnalysisStatus.COMPLETED,
),
]
decoy.when(protocol_store.has(protocol_id="protocol-id")).then_return(True)
decoy.when(
analysis_store.get_summaries_by_protocol(protocol_id="protocol-id")
).then_return(analysis_summaries)
decoy.when(
await analysis_store.matching_rtp_values_in_analysis(
analysis_summary=analysis_summaries[-1], new_rtp_values={}
)
).then_return(True)
decoy.when(analysis_store.add_pending("protocol-id", "analysis-id-2")).then_return(
AnalysisSummary(id="analysis-id-2", status=AnalysisStatus.PENDING)
)
result = await create_protocol_analysis(
protocolId="protocol-id",
request_body=RequestModel(data=AnalysisRequest(forceReAnalyze=True)),
protocol_store=protocol_store,
analysis_store=analysis_store,
protocol_analyzer=protocol_analyzer,
task_runner=task_runner,
analysis_id="analysis-id-2",
)
assert result.content.data == [
AnalysisSummary(id="analysis-id", status=AnalysisStatus.COMPLETED),
AnalysisSummary(id="analysis-id-2", status=AnalysisStatus.PENDING),
]
assert result.status_code == 201

Unchanged files with check annotations Beta

import { Mount } from '../pipettes'

Check warning on line 1 in api-client/src/calibration/types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`

Check warning on line 1 in api-client/src/calibration/types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`
export interface PipOffsetDeletionParams {
calType: 'pipetteOffset'
import { ModuleType } from '@opentrons/shared-data'

Check warning on line 1 in api-client/src/modules/api-types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`

Check warning on line 1 in api-client/src/modules/api-types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`
import type { Coordinates, ModuleModel } from '@opentrons/shared-data'
HeaterShakerModuleModel,
} from '@opentrons/shared-data'
import {

Check warning on line 8 in api-client/src/modules/types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`

Check warning on line 8 in api-client/src/modules/types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`
TEMPERATURE_MODULE_TYPE,
MAGNETIC_MODULE_TYPE,
THERMOCYCLER_MODULE_TYPE,
HEATERSHAKER_MODULE_TYPE,
} from '@opentrons/shared-data'
import * as ApiTypes from './api-types'

Check warning on line 15 in api-client/src/modules/types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`

Check warning on line 15 in api-client/src/modules/types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`
export * from './api-types'
// common types
units?: string
type?: string
}
interface PipetteQuirksField {

Check warning on line 62 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature

Check warning on line 62 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature
[quirkId: string]: boolean
}
interface QuirksField {
quirks?: PipetteQuirksField
}
export type PipetteSettingsFieldsMap = QuirksField & {

Check warning on line 69 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature

Check warning on line 69 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature
[fieldId: string]: PipetteSettingsField
}
export interface IndividualPipetteSettings {
fields: PipetteSettingsFieldsMap
}
type PipetteSettingsById = Partial<{ [id: string]: IndividualPipetteSettings }>

Check warning on line 77 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature

Check warning on line 77 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature
export type PipetteSettings = PipetteSettingsById
export interface PipetteSettingsUpdateFieldsMap {

Check warning on line 81 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature

Check warning on line 81 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature
[fieldId: string]: PipetteSettingsUpdateField
}
} | null
export interface UpdatePipetteSettingsData {
fields: { [fieldId: string]: PipetteSettingsUpdateField }

Check warning on line 90 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature

Check warning on line 90 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature
}
} from '../utils'
import { simpleAnalysisFileFixture } from '../__fixtures__'
import { RunTimeCommand } from '@opentrons/shared-data'

Check warning on line 17 in api-client/src/protocols/__tests__/utils.test.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`

Check warning on line 17 in api-client/src/protocols/__tests__/utils.test.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`
const mockRunTimeCommands: RunTimeCommand[] = simpleAnalysisFileFixture.commands as any
const mockLoadLiquidRunTimeCommands = [