for large files sort uses a lot of memory (a user had a job with a file
of 45M lines and top showed 1TB of VIRT memory and the jon crashed a
37GB) and we need a way to limit this.
also parallel processing seems a nice to have
`format: fastq` is a string, but `YamlDataParameter.format` is a list.
The string form parses only via the `_split_format` before-validator; the
JSON Schema dumped from the model does not declare it, so schema
consumers reject what the prompt teaches. The prompt's own complete
example omits `format` entirely, so the two examples disagreed.
Also state `name`'s `min_length=5`. It was unstated, and short names
("BWA", "STAR") are exactly what a model reaches for.
Neither bites upstream, where `output_type=UserToolSourceAuthoringView`
constrains generation. Both bite consumers using the prompt unconstrained.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both onCreate and the save-as handler clear hasChanges before calling
routeToWorkflow, so the onSave() in there hits its early return and never
reaches the getVersions() call below it. onCreate got a compensating fetch
in b592a0f, but save-as didn't, so saving-as leaves you editing the new
workflow with the previous one's version list still in the dropdown.
id only ever changes in routeToWorkflow, so refreshing there covers both
paths and lets the onCreate copy go away.
`CopyStepAction` already stripped the cloned step's own `uuid`, but left the uuids on its `workflow_outputs` array untouched, since `cloneStepWithUniqueLabel` deep-clones the step with `structuredClone` and copies those output uuids verbatim. Saving a workflow after cloning a step with a workflow output would then fail with "Duplicate workflow output UUID '...' in request." the same way the original bug failed with duplicate step UUIDs. The fix strips `uuid` off each entry of the cloned step's `workflow_outputs`, mirroring how the step's own `uuid` is already handled.
Extended the existing "assigns a fresh id and uuid when cloning a step" regression test to also give the source step a `workflow_outputs` entry with a fixed uuid, and assert the clone's output uuid differs from the source's.
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Alireza Heidari <itisalirh@gmail.com>
rightPanelElement was never bound to an element, so scrollToTop was a no-op and the activeNodeId watcher existed only to call it. showCredentialsDropdown was written by the dropdown's show/hide handlers and read by nothing. Both predate this migration but there's no reason to carry them across.
The old saveWorkflow guarded the annotation write and never touched anything else on a partial response. onSave now assigns all three unconditionally, so a response missing name leaves the editor with an undefined title that also fails the next nameValidate. loadEditorData already guards every field this way.
An array literal in the template is rebuilt on every render, and ActivityBar runs a watchImmediate on that prop into setSpecialPanelActivityIds -- so it re-fired constantly on a component that re-renders whenever hasChanges or loadingWorkflow move. useSpecialWorkflowActivities used to hand back a computed array; this restores that.
The wrapper exists to silence the 'Vue 2 does not support reactive collection types' warning that vueuse's useMagicKeys triggers. Index.test.ts papers over it with suppressExpectedErrorMessages, but nothing else does, so importing from vueuse directly just puts the noise back in the console.
provideScopedWorkflowStores wraps a bare string in a fresh ref before providing it, so passing id.value meant the injected workflowId stopped tracking id. After routeToWorkflow swaps the temp uid for the real workflow id, children injecting workflowId still saw the old one. Both consumers unref once at setup so nothing breaks today, but the ref is what the old code passed and what the signature is for.
loadEditorData already substitutes reportDefault when the workflow has no report, so the extra fallback in the template only fires when the user has deliberately cleared the report -- which put the default template back on screen while the saved value stayed empty. The old binding was just report.markdown.
has_class returns a bool rather than asserting, so the fresh-load check in test_basics was silently checking nothing. The bootstrap-vue to GButton swap also renamed the class from disabled to g-disabled, which never got propagated to navigates_galaxy or framework -- both were still asserting on the old name, making them vacuously true. test_history_pages already had this right.
The TS migration dropped the UserToolPanel import while leaving the component in the template, so the user-defined tools sidebar rendered nothing -- script setup needs the explicit import and there's no global registration for it. onInsertTool also lost its third argument, but UserToolPanel still emits the tool uuid, so custom tools were being resolved by representation id with tool_version=latest instead. Put the import back and thread toolUuid through to insertStep again.
Creator was not checking for complete object equality for detecting changes, while we did not need to use the change stack for tags as they are set instantly via backend Services without a version patch.
If we switch to any other activity, the readme editor now closes; with 1 exception being the changes activity whose panel can still be used to track changes to the readme as well.
`CopyStepAction` deleted the cloned step's `id` so a fresh one would be assigned, but never did the same for `uuid`, so a cloned step kept its source's uuid verbatim and saving after cloning failed with "Duplicate step UUID '...' in request." The Options API `onClone` used to strip `uuid` at the call site, but that got dropped during the Composition API migration; moving the fix into `CopyStepAction` itself means any future caller of `copyStep` gets correct behavior automatically.
Added a regression test in `Index.test.ts` that adds a step with a fixed uuid to the step store, emits `onClone` from the `WorkflowGraph` stub, and asserts the resulting clone has a different id, uuid, and label than the source step.
Co-Authored-By: Claude <noreply@anthropic.com>
`Index.vue` was migrated from Options API to `<script setup>` + TypeScript in a prior commit, which broke most of the tests in `Index.test.ts`: internals like `wrapper.vm.annotation`, `wrapper.vm.saveAsName`, `wrapper.vm.onNavigate`, etc. are no longer exposed on the component instance, since `<script setup>` doesn't return a public API the way the old `setup()`/Options API component did.
Rewrote every test to drive the component through real, user-facing paths instead of reaching into internals: emitting events on child components (`WorkflowAttributes`, `ActivityBar`, `SaveChangesModal`, `WorkflowGraph`) rather than mutating refs directly, and reading state back through rendered props or the Pinia store rather than `vm` properties.
Also fixed some incidental issues found along the way: `vue-test-utils`' stub matching only works by a component's `.name`, but `<script setup>` SFCs compile with their inferred name on `__name` instead, so stubs for `ActivityBar`/`WorkflowGraph` were silently not matching until their `.name` was set explicitly in the test file; the shared mock workflow payload was missing `comments`/`tags`, which was silently making every test's initial workflow load fail before any assertions ran; and switched from a real `VueRouter` instance to mocking `vue-router/composables` directly, avoiding real navigation side effects like `NavigationDuplicated` errors. Split the flat `describe("Index", ...)` block into `"default mount"` and `"onNavigate"` sibling blocks so the `onNavigate` tests (which mount their own wrapper per test) don't also pay for the outer block's mount in `beforeEach`.
Co-Authored-By: Claude <noreply@anthropic.com>
Migrates the Workflow Editor component to use the script setup and typescript syntax for improved maintainability, readability and performance.
Replaces BootstrapVue components with their corresponding B-prefixed versions.
Co-authored-by: Ahmed Hamid Awan <qe66653@umbc.edu>
get_accessible is typed on HDAManager, so setting return_value on it through the
service's attribute is an attr-defined error; reach the mock through a cast
instead. The shared tee-streaming test case reads object_store_config, which
only its subclasses define, so declare it on the base.
_atomic_download named its temp file after the object it was downloading, so two
downloads of the same uncached object shared one temp path: the second's open()
truncated what the first was still writing, and whichever renamed first
published a corrupt object into the cache to be served as complete.
Give every download its own temp file instead. Concurrent downloads can no
longer interfere, and whichever finishes last publishes a complete copy. Temp
files left behind by a hard kill are reaped by the cache monitor like any other
cache file.
The currentChatId watcher awaits a chat history refresh before syncing the
route. When a new chat starts while that request is in flight, the resumed
handler still routes to the old exchange id, and the exchangeId watch then
re-fetches the conversation over the fresh one.
Bail out of the resumed handler when the id is no longer current.
The test waited for the parent invocation only, then read the subworkflow
invocation state once. The completion monitor can mark the parent completed
before it gets to the child, so the assertion sees 'scheduled' and fails.
Wait for the subworkflow invocation to complete on its own before asserting.
medyagh/setup-minikube runs 'sudo chmod 755 /etc/cni/net.d' for the none
driver but never creates the directory, and current ubuntu-latest images no
longer ship it, so every integration shard fails before checkout with
'chmod: cannot access /etc/cni/net.d: No such file or directory'.
Upstream fix is medyagh/setup-minikube#836, unmerged since 2026-07-30, and
the action is used unpinned, so pre-create the directory here instead.
Serving a dataset from a remote object store pulls the whole object into the
local cache before sending a single byte. For large datasets that trips proxy
time-to-first-byte timeouts (504s), and objects bigger than the cache cannot be
downloaded at all because _caching_allowed refuses to pull them.
Tee-streaming proxies the object's bytes straight to the client while writing
them into the cache on the way past, publishing the cache copy atomically once
the whole object has streamed. First byte is immediate, the cache is warmed for
free, and objects too big for the cache stream straight through without a cache
write.
ObjectStore grows get_data_stream(), dispatched like get_direct_download_url();
the tee itself lives in CachingConcreteObjectStore, so a backend only supplies a
raw chunk iterator (boto3, azure and cloud do; every other store keeps today's
pull). A stream that ends short of the object's remote size is rejected rather
than cached, and each concurrent stream writes its own temp file so they cannot
truncate each other's.
Only plain whole-file downloads stream: HEAD and Range requests need random
access, so they still get a cached file, as do previews, chunked display,
extra-files access and archive downloads. This is the internal-backend
complement to the presigned-URL redirect, which only helps object stores whose
URLs a client can reach directly.
SelectionDialog already fetches only the rows of the current page through the items provider, but GTable paginated them a second time, so every page after the first one was empty. With this change current-page and per-page are no longer passed to GTable when a provider is used.