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 petrinaut-core introduces the Actual mode contract (markings, firings, Brunch source metadata, recording JSON with strict Zod parsing), timeline construction/scrubbing helpers that feed the same The demo site splits the old monolithic app into local-storage vs Editor UI adds Reviewed by Cursor Bugbot for commit 1fbb19f. Bugbot is set up for automated code reviews on this repo. Configure here. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 4 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit b005c92. Configure here.
| ): BrunchEndpointResult => { | ||
| const params = new URLSearchParams(location.search); | ||
| const rawEndpoint = | ||
| params.get("brunch_endpoint") ?? params.get("sse") ?? undefined; |
There was a problem hiding this comment.
Empty brunch_endpoint blocks sse
Medium Severity
getBrunchEndpointFromLocation resolves brunch_endpoint with nullish coalescing, so an empty brunch_endpoint query value is treated as set and sse is never consulted. URLs like ?brunch_endpoint=&sse=<url> fail even when a valid sse endpoint is present.
Reviewed by Cursor Bugbot for commit b005c92. 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", | ||
| }); |


🌟 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