diff --git a/docs/operator-apps.md b/docs/operator-apps.md index 9e0911b..5a5dd8f 100644 --- a/docs/operator-apps.md +++ b/docs/operator-apps.md @@ -82,10 +82,19 @@ An operator view is declared inside workflow metadata: } ``` -Supported widgets are `image`, `status`, `metrics`, `fields`, and `actions`. -Image, status, and metric widgets read live node output ports. Field widgets -update declared node parameters. Actions can update parameters, cook a declared -node output, or call a node's existing direct-control endpoint. +Supported widgets are `image`, `viewer`, `status`, `metrics`, `fields`, and +`actions`. Image, viewer, status, and metric widgets read live node output +ports. A `viewer` embeds an HTTP(S) URL produced by a trusted workflow node and +is intended for managed simulation, robot-scene, and other interactive browser +surfaces. Field widgets update declared node parameters. Actions can update +parameters, cook a declared node output, or call a node's existing +direct-control endpoint. + +Use `input: "file_path"` for a path that must exist on the App host. It keeps +the path editable and adds a **Browse…** button backed by Blacknode's filesystem +browser. Declare `extensions` to filter selectable files, and optionally set +`picker_title` and `button_label`. This is appropriate for robot descriptions, +scenes, datasets, checkpoints, and other host-side artifacts. Sections render in the central workspace by default. Set a section's optional `region` to `parameters` to place its fields and actions in the right-side diff --git a/docs/packages.md b/docs/packages.md index c4b5742..4ce5c89 100644 --- a/docs/packages.md +++ b/docs/packages.md @@ -316,7 +316,7 @@ blacknode-ros2/ __init__.py publish.py templates/ # optional workflow JSONs for the Templates tab - tests/ # optional pytest suite, run with the core suite + tests/ # optional package-specific test suite requirements.txt # optional pip dependencies README.md ``` @@ -604,10 +604,11 @@ Category colors come from a module-level `BLACKNODE_CATEGORIES = {"ROS 2": ## Tests -Running `pytest` from the Blacknode repo root collects `tests/` **and** -`packages/*/tests/` — every installed package is tested together with the -core. Keep package test filenames unique across packages (prefix them with -the package name, e.g. `test_ros2_topics.py`) so module names don't collide. +Running `pytest` from the Blacknode repo root collects the core `tests/` suite. +Extension packages are independently versioned repositories and may require +their own optional dependencies, environment setup, hardware, or managed +services. Run a package's test command from that package worktree as documented +in its `AGENTS.md`. Package tests can import the core (`blacknode.node`, test helpers) and the package's own modules via the stable alias: diff --git a/editor/src/components/LocalFilePicker.tsx b/editor/src/components/LocalFilePicker.tsx index c9902e2..bc9b748 100644 --- a/editor/src/components/LocalFilePicker.tsx +++ b/editor/src/components/LocalFilePicker.tsx @@ -76,7 +76,7 @@ export default function LocalFilePicker({
{title} - Select a local {extensions.join(', ')} scene + Select a local {extensions.join(', ')} file
@@ -118,7 +118,7 @@ export default function LocalFilePicker({ {loading &&
Opening folder…
} {!loading && error &&
{error}
} {!loading && !error && listing?.entries.length === 0 && ( -
No matching scene files or folders here.
+
No matching files or folders here.
)} {!loading && !error && listing?.entries.map(entry => (