Skip to content

FE-814: Petrinaut Brunch Actual Mode#8829

Open
kube wants to merge 5 commits into
mainfrom
cf/fe-petrinaut-actual-brunch-integration
Open

FE-814: Petrinaut Brunch Actual Mode#8829
kube wants to merge 5 commits into
mainfrom
cf/fe-petrinaut-actual-brunch-integration

Conversation

@kube
Copy link
Copy Markdown
Collaborator

@kube kube commented Jun 4, 2026

🌟 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 /brunch endpoint 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 not modify any publishable blocks or libraries, or modifications do not need publishing
  • modifies an npm-publishable library and I have added a changeset file(s)
  • modifies a Cargo-publishable library and I have amended the version
  • modifies a Cargo-publishable library, but it is not yet ready to publish
  • modifies a block that will need publishing via GitHub action once merged
  • I am unsure / need advice

📜 Does this require a change to the docs?

The changes in this PR:

  • are internal and do not require a docs change
  • are in a state where docs changes are not yet required but will be
  • require changes to docs which are made as part of this PR
  • require changes to docs which are not made in this PR
    • Provide more detail here
  • I am unsure / need advice

🕸️ Does this require a change to the Turbo Graph?

The changes in this PR:

  • do not affect the execution graph
  • affected the execution graph, and the turbo.json's have been updated to reflect this
  • I am unsure / need advice

⚠️ Known issues

🐾 Next steps

🛡 What tests cover this?

❓ How to test this?

  1. Checkout the branch / view the deployment
  2. Try X
  3. Confirm that Y

📹 Demo

Copilot AI review requested due to automatic review settings June 4, 2026 21:46
@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 4, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
hash Error Error Jun 5, 2026 8:17pm
petrinaut Error Error Comment Jun 5, 2026 8:17pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
hashdotdesign-tokens Ignored Ignored Preview Jun 5, 2026 8:17pm

@cursor
Copy link
Copy Markdown

cursor Bot commented Jun 4, 2026

PR Summary

Medium Risk
Cross-cutting changes in core, React, and UI editor modes with experimental Brunch SSE payload handling; mitigated by read-only handles, strict recording validation, and focused demo routing.

Overview
Adds Actual as a host-driven global mode: when a live execution source is present, the top bar enables Actual and Petrinaut shows a read-only net with token counts driven by streamed transition events instead of local simulation.

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 SimulationFrameReader shape as simulation playback, plus unit tests.

The demo site splits the old monolithic app into local-storage vs /brunch routes (Vercel rewrites to SPA), wires BrunchActualModeProvider over EventSource (definition, initial_state, transition_firing), optional auto-layout, and a local brunch:fixture SSE server for development.

Editor UI adds ActualModeContext, Actual Timeline and Events bottom tabs (export recording), reuses the uPlot timeline via a generic frame source, hides edit/simulation/AI chrome in Actual mode, and routes canvas state through useCurrentExecutionFrame so places and arcs reflect the scrubbed live timeline.

Reviewed by Cursor Bugbot for commit 1fbb19f. Bugbot is set up for automated code reviews on this repo. Configure here.

@github-actions github-actions Bot added area/infra Relates to version control, CI, CD or IaC (area) area/libs Relates to first-party libraries/crates/packages (area) type/eng > frontend Owned by the @frontend team area/apps area/apps > hash.design Affects the `hash.design` design site (app) labels Jun 4, 2026
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 4 potential issues.

Fix All in Cursor

❌ 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;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit b005c92. Configure here.

ok: true,
endpoint: normalizeEndpoint(endpoint),
runId: params.get("runId") ?? undefined,
};
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit b005c92. Configure here.

Comment thread apps/petrinaut-website/scripts/brunch-sse-fixture.ts
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.
Comment on lines +33 to +39
if (
globalMode !== "actual" ||
!actualMode.available ||
!actualMode.initialState
) {
return null;
}
@kube kube force-pushed the cf/fe-petrinaut-actual-brunch-integration branch from dab4ce0 to 1fbb19f Compare June 5, 2026 20:16
Copilot AI review requested due to automatic review settings June 5, 2026 20:16
@github-actions github-actions Bot added area/deps Relates to third-party dependencies (area) and removed area/apps > hash.design Affects the `hash.design` design site (app) labels Jun 5, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 48 out of 56 changed files in this pull request and generated 5 comments.

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";
Comment on lines +183 to +190
if (rawSearch.startsWith(prefix)) {
const endpoint = decodeURIComponent(rawSearch.slice(prefix.length));
return {
ok: true,
endpoint: normalizeEndpoint(endpoint),
runId: params.get("runId") ?? undefined,
};
}
Comment on lines +226 to +238
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.
Comment on lines +187 to +195
let marking = initialState;

for (let index = 0; index <= transitionFiringIndex; index += 1) {
const firing = transitionFirings[index];

if (firing) {
marking = applyActualModeTransitionFiring(marking, firing);
}
}
Comment on lines +291 to +296
response.writeHead(200, {
"Access-Control-Allow-Origin": "*",
"Cache-Control": "no-cache",
Connection: "keep-alive",
"Content-Type": "text/event-stream",
});
Comment on lines +314 to +317
response.writeHead(200, {
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json",
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/apps area/deps Relates to third-party dependencies (area) area/infra Relates to version control, CI, CD or IaC (area) area/libs Relates to first-party libraries/crates/packages (area) type/eng > frontend Owned by the @frontend team

Development

Successfully merging this pull request may close these issues.

3 participants