FE-814: Petrinaut Brunch Actual Mode#8829
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
1 Skipped Deployment
|
PR SummaryMedium Risk Overview
Reviewed by Cursor Bugbot for commit 2b6eb5b. Bugbot is set up for automated code reviews on this repo. Configure here. |
| ok: true, | ||
| endpoint: normalizeEndpoint(endpoint), | ||
| runId: params.get("runId") ?? undefined, | ||
| }; |
There was a problem hiding this comment.
Fallback parses equals-prefixed URL
Medium Severity
When the brunch_endpoint query value is missing, the fallback path slices everything after the brunch_endpoint prefix and passes it to normalizeEndpoint. For a normal query string this includes a leading = and any following parameters, producing an invalid endpoint instead of only the URL value.
Reviewed by Cursor Bugbot for commit b005c92. Configure here.
There was a problem hiding this comment.
Pull request overview
This PR introduces Actual Mode to Petrinaut (including a Brunch-backed /brunch demo route) so the UI can render and scrub through a host-provided execution stream, while also adding extension/capability gating (colors/dynamics/stochasticity/parameters) and read input arcs across both the editor and simulation core.
Changes:
- Add Actual Mode context + timeline source and wire it into the editor UI (mode selector, bottom panel, timeline scrubbing).
- Introduce extension settings / handle capabilities and apply them end-to-end (sanitized SDCPN snapshots, conditional UI surfaces, simulation + experiments + LSP diagnostics).
- Add read input arc support across SDCPN types, parsing/clipboard, simulation semantics, editor rendering, docs, and tests.
Reviewed changes
Copilot reviewed 154 out of 161 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| libs/@hashintel/petrinaut/src/ui/views/shared/place-state-visualization.tsx | Use execution-frame hook for Actual/Simulation. |
| libs/@hashintel/petrinaut/src/ui/views/SDCPN/reactflow-types.ts | Extend arc/lambda typings (read/none). |
| libs/@hashintel/petrinaut/src/ui/views/SDCPN/hooks/use-sdcpn-to-react-flow.ts | ReactFlow nodes/arcs gated by extensions. |
| libs/@hashintel/petrinaut/src/ui/views/SDCPN/components/transition-node.tsx | Display subtitle for lambdaType “none”. |
| libs/@hashintel/petrinaut/src/ui/views/SDCPN/components/place-node.tsx | Use execution-frame hook for timelines. |
| libs/@hashintel/petrinaut/src/ui/views/SDCPN/components/classic-place-node.tsx | Use execution-frame hook for timelines. |
| libs/@hashintel/petrinaut/src/ui/views/SDCPN/components/arc.tsx | Render read arcs (dash + dot). |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/SimulateView/simulate-view.stories.tsx | Provide extensions in story context. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/SimulateView/scenarios/view-scenario-drawer.tsx | Gate scenario UI by extensions. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/SimulateView/scenarios/create-scenario-drawer.tsx | Gate scenario UI by extensions. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/SimulateView/scenarios/create-scenario-drawer.stories.tsx | Add default extensions to story stub. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/SimulateView/experiments/experiments-story-fixtures.tsx | Add default extensions to fixtures. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/PropertiesPanel/transition-properties/subviews/transition-results/subview.tsx | Show results only when kernel available. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/PropertiesPanel/transition-properties/subviews/transition-firing-time/subview.tsx | Gate lambda editor + effective type logic. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/PropertiesPanel/transition-properties/subviews/main.tsx | Surface arcType in transition arc rows. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/PropertiesPanel/transition-properties/main.tsx | Compute logic availability for subviews. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/PropertiesPanel/transition-properties/context.tsx | Provide logic availability via context. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/PropertiesPanel/properties-panel.stories.tsx | Add default extensions to story stub. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/PropertiesPanel/place-properties/main.tsx | Gate visualizer subview by extensions. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/PropertiesPanel/panel.tsx | Hide/disable panels when extensions off. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/PropertiesPanel/arc-properties/main.tsx | Add “read” arc type selector. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/LeftSideBar/subviews/types-list.tsx | Disable type actions when colors off. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/LeftSideBar/subviews/search-panel.tsx | Filter search items by extensions. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/LeftSideBar/subviews/parameters-list.tsx | Disable/hide parameters by extensions. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/LeftSideBar/subviews/entities-tree.tsx | Filter tree groups by extensions. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/LeftSideBar/subviews/differential-equations-list.tsx | Disable diff-eq actions by extensions. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/LeftSideBar/panel.tsx | Filter sidebar tabs by extensions. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/BottomPanel/subviews/simulation-timeline/use-streaming-data.ts | Generalize streaming to a frame source. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/BottomPanel/subviews/simulation-timeline/use-actual-timeline-source.ts | Provide Actual-mode timeline frame source. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/BottomPanel/subviews/simulation-timeline/types.ts | Add TimelineFrameSource interface. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/BottomPanel/subviews/simulation-timeline/main.tsx | Use source + scrub callback in chart. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/BottomPanel/subviews/simulation-timeline/index.ts | Export actual timeline subview. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/BottomPanel/subviews/simulation-timeline/header.tsx | Hide per-type view if colors disabled. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/BottomPanel/subviews/simulation-timeline/chart.tsx | Accept scrub callback (no PlaybackContext). |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/BottomPanel/subviews/simulation-timeline/actual.tsx | Add Actual Timeline subview UI. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/BottomPanel/subviews/simulation-timeline.tsx | Extension-aware timeline view selection. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/BottomPanel/subviews/simulation-settings.tsx | Hide parameters when extension disabled. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/BottomPanel/panel.tsx | Add Actual-only bottom panel subviews. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/ai-assistant-panel/types.ts | Include extensions in net-definition tool. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/ai-assistant-panel/tool-summaries.ts | Summarize typed input arcs for AI calls. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/ai-assistant-panel/tool-summaries.test.ts | Tests for read arc tool summary. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/ai-assistant-panel/petrinaut-docs-content.ts | Add Actual Mode docs to AI docs index. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/ai-assistant-panel/ai-assistant-contents.test.tsx | Update tests for extensions output. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/panels/ai-assistant-panel.tsx | Return extensions in getLatestNetDefinition. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/editor-view.tsx | Pass actualModeAvailable to top bar. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/components/TopBar/top-bar.tsx | Wire actualModeAvailable into ModeSelector. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/components/TopBar/mode-selector.tsx | Enable Actual mode when available. |
| libs/@hashintel/petrinaut/src/ui/views/Editor/components/BottomBar/bottom-bar.tsx | Reset cursor mode when leaving edit mode. |
| libs/@hashintel/petrinaut/src/ui/monaco/code-editor.stories.tsx | Add default extensions to story context. |
| libs/@hashintel/petrinaut/src/ui/constants/ui-subviews.ts | Register Actual-only subviews. |
| libs/@hashintel/petrinaut/src/ui/constants/ui-messages.ts | Add EXTENSION_UNAVAILABLE; update message. |
| libs/@hashintel/petrinaut/src/ui/components/arc-item.tsx | Display arc type badge in arc rows. |
| libs/@hashintel/petrinaut/src/react/state/use-selection-cleanup.ts | Gate selection IDs by extensions. |
| libs/@hashintel/petrinaut/src/react/state/use-read-only-reason.ts | Add read-only reason for Actual mode. |
| libs/@hashintel/petrinaut/src/react/state/use-is-read-only.ts | Update doc comment re handle read-only. |
| libs/@hashintel/petrinaut/src/react/state/sdcpn-context.ts | Add extensions to SDCPN context value. |
| libs/@hashintel/petrinaut/src/react/state/editor-provider.tsx | Default to Actual + open timeline when live. |
| libs/@hashintel/petrinaut/src/react/state/editor-context.ts | Add “actual” mode + actual-timeline tab. |
| libs/@hashintel/petrinaut/src/react/simulation/provider.tsx | Run simulation with extensions + param gating. |
| libs/@hashintel/petrinaut/src/react/sdcpn-provider.tsx | Filter selection item types by extensions. |
| libs/@hashintel/petrinaut/src/react/lsp/provider.tsx | Send extensions to LSP worker. |
| libs/@hashintel/petrinaut/src/react/index.ts | Export ActualModeContext + extension types. |
| libs/@hashintel/petrinaut/src/react/hooks/use-petrinaut-mutations.test.tsx | Add default extensions to test wrapper. |
| libs/@hashintel/petrinaut/src/react/hooks/use-petrinaut-commands.test.tsx | Add default extensions to test wrapper. |
| libs/@hashintel/petrinaut/src/react/hooks/use-default-parameter-values.ts | Return empty when parameters extension off. |
| libs/@hashintel/petrinaut/src/react/hooks/use-current-execution-frame.ts | New hook unifying sim/actual frames. |
| libs/@hashintel/petrinaut/src/react/hooks/index.ts | Export execution-frame hook. |
| libs/@hashintel/petrinaut/src/react/experiments/provider.tsx | Run experiments with extensions + param gating. |
| libs/@hashintel/petrinaut/src/react/experiments/provider.test.tsx | Add default extensions to test context. |
| libs/@hashintel/petrinaut/src/react/actual-mode-context.ts | New React ActualModeContext wrapper. |
| libs/@hashintel/petrinaut/src/main.ts | Export extension-related public types. |
| libs/@hashintel/petrinaut/docs/useful-patterns.md | Document read arcs usage pattern. |
| libs/@hashintel/petrinaut/docs/simulation.md | Document read arc + kernel semantics. |
| libs/@hashintel/petrinaut/docs/scenarios.md | Update docs anchor for global modes. |
| libs/@hashintel/petrinaut/docs/README.md | Add Actual mode + read arcs mentions. |
| libs/@hashintel/petrinaut/docs/petri-net-extensions.md | Document extension gating + read arcs. |
| libs/@hashintel/petrinaut/docs/experiments.md | Update docs anchor for global modes. |
| libs/@hashintel/petrinaut/docs/drawing-a-net.md | Add Actual mode + read arc semantics text. |
| libs/@hashintel/petrinaut/docs/ai-assistant.md | Mention extensions in read tools. |
| libs/@hashintel/petrinaut/docs/actual-mode.md | New Actual mode user guide page. |
| libs/@hashintel/petrinaut-core/src/types/sdcpn.ts | Add InputArcType incl. “read”. |
| libs/@hashintel/petrinaut-core/src/store/readable-store.ts | Add shared ReadableStore implementation. |
| libs/@hashintel/petrinaut-core/src/store/index.ts | Export ReadableStore helpers. |
| libs/@hashintel/petrinaut-core/src/simulation/worker/simulation.worker.ts | Pass extensions into engine build. |
| libs/@hashintel/petrinaut-core/src/simulation/worker/README.md | Document extensions in worker protocol. |
| libs/@hashintel/petrinaut-core/src/simulation/worker/messages.ts | Add extensions to init message. |
| libs/@hashintel/petrinaut-core/src/simulation/runtime/simulation.ts | Sanitize SDCPN per extensions; store import. |
| libs/@hashintel/petrinaut-core/src/simulation/README.md | Document extension-aware sanitization. |
| libs/@hashintel/petrinaut-core/src/simulation/monte-carlo/worker/monte-carlo.worker.ts | Pass extensions into MC simulator. |
| libs/@hashintel/petrinaut-core/src/simulation/monte-carlo/worker/messages.ts | Add extensions to MC init message. |
| libs/@hashintel/petrinaut-core/src/simulation/monte-carlo/types.ts | Thread extensions through MC config. |
| libs/@hashintel/petrinaut-core/src/simulation/monte-carlo/transition-effect.ts | Prevent consuming read-arc tokens. |
| libs/@hashintel/petrinaut-core/src/simulation/monte-carlo/runtime/experiment.ts | Thread extensions + store import. |
| libs/@hashintel/petrinaut-core/src/simulation/monte-carlo/run-state.ts | Pass extensions into engine build. |
| libs/@hashintel/petrinaut-core/src/simulation/monte-carlo/README.md | Document extension-aware MC sanitization. |
| libs/@hashintel/petrinaut-core/src/simulation/monte-carlo/monte-carlo-simulator.test.ts | Add read arc consumption test. |
| libs/@hashintel/petrinaut-core/src/simulation/monte-carlo/frame-operations.ts | Update comment for read arc enablement. |
| libs/@hashintel/petrinaut-core/src/simulation/engine/types.ts | Add extensions to SimulationInput; arcType type. |
| libs/@hashintel/petrinaut-core/src/simulation/engine/README.md | Document conditional lambda/kernel compilation. |
| libs/@hashintel/petrinaut-core/src/simulation/engine/execute-transitions.test.ts | Add read arc persistence test. |
| libs/@hashintel/petrinaut-core/src/simulation/engine/compute-possible-transition.ts | Do not remove read arc tokens. |
| libs/@hashintel/petrinaut-core/src/simulation/engine/compute-possible-transition.test.ts | Add read arc lambda/kernel input test. |
| libs/@hashintel/petrinaut-core/src/simulation/engine/check-transition-enablement.ts | Update structural enablement semantics. |
| libs/@hashintel/petrinaut-core/src/simulation/engine/check-transition-enablement.test.ts | Add structural enablement tests for read arcs. |
| libs/@hashintel/petrinaut-core/src/simulation/engine/build-simulation.ts | Sanitize SDCPN + gate compilation by extensions. |
| libs/@hashintel/petrinaut-core/src/simulation/authoring/user-code/compile-user-code.ts | Optionally omit Distribution runtime code. |
| libs/@hashintel/petrinaut-core/src/simulation/api.ts | Add extensions to SimulationConfig; store import. |
| libs/@hashintel/petrinaut-core/src/schemas/entity-schemas.ts | Add read arcs; document gated code surfaces. |
| libs/@hashintel/petrinaut-core/src/playback/playback.ts | Switch ReadableStore import to store module. |
| libs/@hashintel/petrinaut-core/src/lsp/worker/protocol.ts | Include extensions in LSP notifications. |
| libs/@hashintel/petrinaut-core/src/lsp/worker/language-server.worker.ts | Run diagnostics based on extensions. |
| libs/@hashintel/petrinaut-core/src/lsp/lib/create-sdcpn-language-service.ts | Generate virtual files with extensions. |
| libs/@hashintel/petrinaut-core/src/lsp/lib/create-sdcpn-language-service.test.ts | Ensure completions include read-arc tokens. |
| libs/@hashintel/petrinaut-core/src/lsp/lib/checker.ts | Skip diagnostics for unavailable code surfaces. |
| libs/@hashintel/petrinaut-core/src/lsp/lib/checker.test.ts | Tests for extension-aware checking. |
| libs/@hashintel/petrinaut-core/src/lsp/language-client.ts | Thread extensions through client notifications. |
| libs/@hashintel/petrinaut-core/src/instance.ts | Add capabilities/extensions; sanitize definition store. |
| libs/@hashintel/petrinaut-core/src/index.ts | Export actual-mode + extensions + store types. |
| libs/@hashintel/petrinaut-core/src/handle/types.ts | Add core handle types (capabilities/state/history). |
| libs/@hashintel/petrinaut-core/src/handle/json-doc-handle/index.ts | Re-export JSON handle factory from handle/. |
| libs/@hashintel/petrinaut-core/src/handle/index.ts | New handle barrel exports. |
| libs/@hashintel/petrinaut-core/src/file-format/types.ts | Default missing transition lambda/kernel fields. |
| libs/@hashintel/petrinaut-core/src/file-format/parse-sdcpn-file.test.ts | Tests for read arc + transition defaults. |
| libs/@hashintel/petrinaut-core/src/extensions.test.ts | Tests for extension sanitization/availability. |
| libs/@hashintel/petrinaut-core/src/default-codes.ts | Update default code docs re read arcs. |
| libs/@hashintel/petrinaut-core/src/commands.ts | Strip disabled extension data on paste. |
| libs/@hashintel/petrinaut-core/src/commands.test.ts | Tests for paste stripping by extensions. |
| libs/@hashintel/petrinaut-core/src/clipboard/types.ts | Preserve read arc types in clipboard. |
| libs/@hashintel/petrinaut-core/src/clipboard/serialize.test.ts | Tests for clipboard read arc preservation. |
| libs/@hashintel/petrinaut-core/src/ai.ts | Expose extensions in net-definition tool + docs. |
| libs/@hashintel/petrinaut-core/src/ai.test.ts | Tests for extensions + addArc schema. |
| libs/@hashintel/petrinaut-core/src/actions.test.ts | Tests for read arcs + disabled extensions. |
| libs/@hashintel/petrinaut-core/src/action-schemas.ts | Allow read arc type in mutation schemas. |
| apps/petrinaut-website/vercel.json | SPA rewrite for /brunch route. |
| apps/petrinaut-website/src/main/app/local-storage-demo/walkthrough/walkthrough-steps.tsx | New demo walkthrough steps content. |
| apps/petrinaut-website/src/main/app/local-storage-demo/use-local-storage-sdcpns.ts | Persist SDCPNs in local storage. |
| apps/petrinaut-website/src/main/app/local-storage-demo/use-local-storage-ai-messages.ts | Persist AI messages per net. |
| apps/petrinaut-website/src/main/app/brunch-demo/brunch-route.ts | Detect /brunch route for demo mode. |
| apps/petrinaut-website/src/main/app/brunch-demo/brunch-demo-app.tsx | New Brunch demo app wrapper. |
| apps/petrinaut-website/src/main.tsx | Switch entrypoint to DemoApp. |
| apps/petrinaut-website/package.json | Add brunch fixture script. |
| .changeset/read-arcs-editor.md | Changeset: editor support for read arcs. |
| .changeset/read-arcs-core.md | Changeset: core support for read arcs. |
| .changeset/petrinaut-sdcpn-capabilities.md | Changeset: extension/capabilities support. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| In Simulate mode the net structure becomes read-only -- you can still create, edit, and delete scenarios and metrics, but you cannot change places, transitions, arcs, types, or parameters. Switch back to Edit mode to modify the net. | ||
|
|
||
| Switching modes does not stop background experiments. The active-experiments indicator remains visible in the top bar from either mode. | ||
| In Actual mode the net is also read-only. It shows the Petri net supplied by the live source; streamed events are collected internally but are not shown in the timeline yet. |
| if ( | ||
| globalMode !== "actual" || | ||
| !actualMode.available || | ||
| !actualMode.initialState | ||
| ) { | ||
| return null; | ||
| } |
dab4ce0 to
1fbb19f
Compare
| import { diagnosticsSubView } from "../views/Editor/panels/BottomPanel/subviews/diagnostics"; | ||
| import { actualEventsSubView } from "../views/Editor/panels/BottomPanel/subviews/actual-events"; | ||
| import { simulationSettingsSubView } from "../views/Editor/panels/BottomPanel/subviews/simulation-settings"; | ||
| import { simulationTimelineSubView } from "../views/Editor/panels/BottomPanel/subviews/simulation-timeline"; |
| if (rawSearch.startsWith(prefix)) { | ||
| const endpoint = decodeURIComponent(rawSearch.slice(prefix.length)); | ||
| return { | ||
| ok: true, | ||
| endpoint: normalizeEndpoint(endpoint), | ||
| runId: params.get("runId") ?? undefined, | ||
| }; | ||
| } |
| const actualModeRecordingDefinitionSchema = z.custom<SDCPN>( | ||
| (value) => sdcpnSchema.safeParse(value).success, | ||
| { message: "Invalid SDCPN definition" }, | ||
| ); | ||
| export const actualModeRecordingSchema = z.object({ | ||
| version: z.literal(ACTUAL_MODE_RECORDING_VERSION), | ||
| exportedAt: z.string(), | ||
| title: z.string().nullable(), | ||
| source: actualModeSourceSchema.nullable(), | ||
| definition: actualModeRecordingDefinitionSchema, | ||
| initialState: actualModeMarkingSchema, | ||
| transitionFirings: z.array(actualModeTransitionFiringSchema), | ||
| }) satisfies z.ZodType<ActualModeRecording>; |
| In Simulate mode the net structure becomes read-only -- you can still create, edit, and delete scenarios and metrics, but you cannot change places, transitions, arcs, types, or parameters. Switch back to Edit mode to modify the net. | ||
|
|
||
| Switching modes does not stop background experiments. The active-experiments indicator remains visible in the top bar from either mode. | ||
| In Actual mode the net is also read-only. It shows the Petri net supplied by the live source; streamed events are collected internally but are not shown in the timeline yet. |
| let marking = initialState; | ||
|
|
||
| for (let index = 0; index <= transitionFiringIndex; index += 1) { | ||
| const firing = transitionFirings[index]; | ||
|
|
||
| if (firing) { | ||
| marking = applyActualModeTransitionFiring(marking, firing); | ||
| } | ||
| } |
| response.writeHead(200, { | ||
| "Access-Control-Allow-Origin": "*", | ||
| "Cache-Control": "no-cache", | ||
| Connection: "keep-alive", | ||
| "Content-Type": "text/event-stream", | ||
| }); |
| response.writeHead(200, { | ||
| "Access-Control-Allow-Origin": "*", | ||
| "Content-Type": "application/json", | ||
| }); |
| eventSource.addEventListener("initial_state", onInitialState); | ||
| eventSource.addEventListener("transition_firing", onTransitionFiring); | ||
| eventSource.addEventListener("terminal", onTerminal); | ||
| eventSource.addEventListener("error", onError); |
There was a problem hiding this comment.
SSE errors close live stream
Medium Severity
The Brunch EventSource error handler always calls setError, which closes the connection and sets status to error. Browsers fire that event during normal reconnect attempts after transient drops, so a brief network blip can permanently end Actual mode with “Unable to connect…” even while the stream could recover.
Reviewed by Cursor Bugbot for commit c47ff76. Configure here.
| const path = window.location.pathname.replace(/\/+$/u, "") || "/"; | ||
|
|
||
| return path === "/brunch"; | ||
| }; |
There was a problem hiding this comment.
Brunch subpaths load wrong app
Medium Severity
isBrunchDemoRoute only treats the pathname /brunch as the Brunch demo, but deployment adds a rewrite for /brunch/:path*. URLs such as /brunch/... still load the SPA yet DemoApp renders the local-storage shell instead of BrunchDemoApp, so Brunch Actual mode never starts on those paths.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit c47ff76. Configure here.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 4 total unresolved issues (including 3 from previous reviews).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 5711913. Configure here.
| title: actualMode.title, | ||
| transitionFirings, | ||
| }); | ||
| }; |
There was a problem hiding this comment.
Export enabled but handler no-ops
Medium Severity
The Events tab enables Export JSON when receivedEvents is non-empty, but the click handler returns unless both definition and initialState are set. That blocks the raw event export path in exportActualModeRecording, including while the definition is still normalizing or after a parse error left events recorded.
Reviewed by Cursor Bugbot for commit 5711913. Configure here.
| setCurrentFrameIndex, | ||
| }; | ||
|
|
||
| return <ActualModeContext value={contextValue}>{children}</ActualModeContext>; |
| const source: TimelineFrameSource = { | ||
| sourceId: "simulation", | ||
| totalFrames, | ||
| getFramesInRange, | ||
| }; |
| cancelled = true; | ||
| }; | ||
| }, [dt, getFramesInRange, totalFrames, seriesConfig, storeController]); | ||
| }, [seriesConfig, source, storeController]); |
| In Simulate mode the net structure becomes read-only -- you can still create, edit, and delete scenarios and metrics, but you cannot change places, transitions, arcs, types, or parameters. Switch back to Edit mode to modify the net. | ||
|
|
||
| Switching modes does not stop background experiments. The active-experiments indicator remains visible in the top bar from either mode. | ||
| In Actual mode the net is also read-only. It shows the Petri net supplied by the live source; streamed events are collected internally but are not shown in the timeline yet. |
| const timelinePoints = buildActualModeTimelinePoints({ | ||
| status: actualMode.status, | ||
| transitionFirings: actualMode.transitionFirings, | ||
| timelineStartedAtMs: actualMode.timelineStartedAtMs, | ||
| timelineNowMs: actualMode.timelineNowMs, | ||
| }); |
| "private": true, | ||
| "type": "module", | ||
| "scripts": { | ||
| "brunch:fixture": "node scripts/brunch-sse-fixture.ts", |


🌟 What is the purpose of this PR?
This PR adds a basic Actual Mode, that allows to view a Brunch plan execution directly from Petrinaut.
This is available via the
/brunchendpoint on the Petrinaut demo website, and will load the Petri Net model directly from Brunch.🔗 Related links
🚫 Blocked by
🔍 What does this change?
Pre-Merge Checklist 🚀
🚢 Has this modified a publishable library?
This PR:
📜 Does this require a change to the docs?
The changes in this PR:
🕸️ Does this require a change to the Turbo Graph?
The changes in this PR:
turbo.json's have been updated to reflect this🐾 Next steps
🛡 What tests cover this?
❓ How to test this?
📹 Demo