Manager and settings

Runtime, Workers, Plugins, Wire, and Settings — how AXIS chrome is split.

This page

Manager and settings

Five studio pages share one full-viewport overlay. Runtime is the active calculation context; Workers and Plugins are catalogs, not tabs inside it.

Studio Runtime: server engine, health, and backend endpoint Studio rail switching Runtime, Wire, Settings, Workers, Plugins

Abstract

SurfaceOpens fromMutates
RuntimeTopbar Studio · studio rail · ⌘K “Open Runtime”Active engine, endpoint, exec mode, probe of that backend
WorkersStudio rail · ⌘K “Open Workers” · Runtime cardProbe catalog; activate a backend (endpoint / engine)
PluginsStudio rail · ⌘K “Open Plugins” · hidden topbar testidRegistry membership, Use, URL install, script library
WireTopbar Studio → Wire rail · ⌘K “Open Architecture”Compose slots; Apply writes activePlugins
SettingsTopbar Studio → Settings rail · ⌘K “Open Settings”Appearance, chart, live, session keys, editor intel, theme

Active plugins live in store.activePlugins; per-plugin fields in store.pluginsConfig keyed by `${'{'}kind{'}'}:${'{'}id{'}'}`.

Conceptual model

Diagram

Rendering…

Plugin Manager

Catalog

Studio Plugins catalog: sources, streams, engines, storage with Use

Lists sources, streams, engines, storages from the unified registry.

ActionEffect
UsesetActivePlugin(kind, id) for that row’s kind
Capability badgesoffline, needsAuth, needsNetwork, needsProxy from plugin.capabilities
Built-in flagBuilt-ins resist casual unregister

Status bar shows active engine id and storage backend after changes.

Install (URL)

Studio Plugins Install: load an ES module URL or a same-origin example

Paste a module URL exporting a default plugin object (kind, id, name, contract methods). AXIS:

  1. Fetches and validates export
  2. Registers into the TypeScript registry
  3. Persists install record so restoreInstalledPlugins() reloads next visit

Security notes (operator-level): only https/http schemes suitable for module load; treat third-party URLs as code execution in your browser origin. See security tests under tests/security/.

Supported URL kinds: source, stream, engine, dataset, component. Example plugins ship in public/plugins/:

  • example-coingecko-source.js
  • example-tiny-pyne-engine.js
  • example-cf-do-stream.js

PYNE Agent (sister project — natural language → PYNE scripts) installs as a component from your deployed worker URL (or via Workers Manager → Install):

https://<pyne-agent-worker>/plugin/axis-pine-agent.js

See PYNE Agent and plugin reference. Works without the HOOX mesh.

Script Library tab

See Script library. The Plugins page hosts the panel so library and plugins share one studio surface.

Runtime vs Workers vs Plugins

One overlay (AppPage in src/ui/studio/) with a left rail. Switching rail pages does not close the overlay.

  • Runtimesrc/ui/runtime/RuntimePage.tsx — active engine, endpoint, exec mode.
  • Workerssrc/ui/workers/WorkersPage.tsx — backend inventory and probes.
  • Pluginssrc/ui/plugins/PluginsPage.tsx — catalog / install / library.

Workers

Studio Workers: backend inventory with pyne Pro API selected

Opens from the studio rail, ⌘K Open Workers, or a Runtime related card.

Sub-tabRole
OverviewHealth cards (distinct icon per worker) for pyne Pro API, AXIS Worker (prod + local wrangler), Pyodide, PWA service worker, optional PYNE Agent / pyne-worker
DetailUsage (when to pick this worker), probe latency, feature flags, Use-as-backend / preload / install actions
InstallWhen to use + step-by-step setup with copyable commands (make run, wrangler, plugin URL, …)
ConfigurePaste Backend URL, presets (:5002, :8787, workers.dev, axis.hoox.sh), activate Pyodide, install agent plugin

Catalog items (usage)

WorkerIcon intentWhen to use
pyne Pro APIserverPrimary Server calculation backend (Flask :5002). Best for compile/Numba and long history.
AXIS WorkerzapProduction edge data plane (on-chain proxy, scripts D1, optional /api/run). Default for On-Chain.
AXIS Worker (local)activityLocal wrangler :8787 while developing the Worker.
PyodidecpuIn-browser offline calc — no Backend URL; first load ~20–30s.
Service WorkerwifiPWA shell cache (auto in production; skipped in Vite dev). Not a calc engine.
PYNE AgentdownloadOptional NL → Pine plugin; scripts still run via your engine.
pyne-workersettingsOptional HOOX mesh edge evaluator; paste origin as Backend URL.

Probes

  • Run once when the modal opens; Refresh re-runs.
  • Each worker has a hard wall-clock timeout (~5s) so a hung host cannot leave “Probing…” forever.
  • Pyodide probe uses HEAD (not a full pyodide.js download).
  • HTTP probes hit GET /health (JSON markers). Implementation: src/workers/*, src/ui/workers/WorkersPage.tsx. Operator CLI twin: AXIS CLI.

Hardened VPS note: production UFW typically allows only 22 + 443. Pro API binds 127.0.0.1:5002 — public :5002 probes correctly time out. On https://axis.hoox.sh, Workers Manager probes pyne Pro via same-origin https://axis.hoox.sh/health (nginx reverse-proxy), not loopback. See VPS demo.

Runtime (engine)

Engine, execution mode, Backend URL, Test, and Prefer WebSocket live on Runtime, not Settings. Storage is a Wire slot.

FieldBehavior
EngineRegistry engine list; labels via engineOptionLabel
Execution modeWhen the active engine exposes configSchema.mode (server): interpret | compile | auto. Stored in pluginsConfig.engine:<id>.mode and sent on each run (WS and REST).
Prefer WebSocket runServer engine: prefer /ws/run over REST when available
Backend URLShown when engine is server or has configSchema.endpoint
Test / ProbeGET health against endpoint; status message

Settings

Studio Settings General: appearance, chart labels, live stream, results

Product chrome only. Engine/endpoint/mode are on Runtime.

FieldBehavior
Default intervalUpdates store; may reload bars for current symbol
Watchlist refreshClamp 5–120 seconds
Chart themePreset picker (void / classic / mono / boutique dark & light) — see src/theme/presets.ts
History barsOne-shot Load depth (venue may clamp further)

Deep multi-page history and gap repair live in the Data Source Manager, not Settings.

Execution mode maps to PYNE Runtime.run(..., mode=…):

ModeBehavior
interpretFull AST interpreter
compileNumba/numpy compiled path (first run JITs; Flask is not prewarmed)
autoDefault on Server / Pyodide: try compile, fall back to interpret on failure

The Connection HUD engine chip shows the selected mode. Save persists via Solid store persist() into pynescript.axis.v1. Escape closes; Ctrl/Cmd+Enter saves.

Pyodide engines hide endpoint—calculation is same-origin assets, not Flask.

Interface surface (UI map)

ControlStore field
Engine selectactivePlugins.engine, flat engine
Storage selectactivePlugins.storage
Endpointendpoint
Source/stream topbaractivePlugins.*, source, live.streamId
Theme toggletheme + data-theme on <html>

Internals

PathRole
src/ui/studio/Full-page overlay kit (ax-*)
src/ui/runtime/RuntimePage.tsxActive engine / endpoint / mode
src/ui/plugins/PluginsPage.tsxCatalog / install / library
src/ui/workers/WorkersPage.tsxBackend inventory / probes
src/ui/settings/SettingsPage.tsxProduct chrome
src/ui/wire/WirePage.tsxCompose recipes
src/ui/plugin-badges.tsxCapability badges
src/plugins/registry.tsUnified registry
src/plugins/loader.tsURL load + restore (incl. component)
src/plugins/bootstrap.tsBuilt-ins

Invariants

  1. Settings never write script bodies—only layout/config.
  2. Catalog Use does not auto-Run; Load/Run remain explicit.
  3. Source change may re-default stream (defaultStreamForSource).
  4. API keys for cloud/git belong in pluginsConfig, not in git-committed defaults.

Worked examples

Point AXIS at local Worker

  1. Settings → Engine Server-Side → Endpoint http://127.0.0.1:8787
  2. Probe → OK
  3. Save → Run

Install example source

  1. Manager → Install → URL to .../plugins/example-coingecko-source.js (served origin)
  2. Catalog → Source appears → Use → Load

Failure modes

SymptomFix
Empty catalogBuilt-ins not registered—hard reload; check console
URL install failsCORS on plugin host; bad export; mixed content
Probe failsBackend down; wrong path; HTTPS mixed content
Settings not stickylocalStorage blocked / quota

See also