Skip to content

feat(registerApp): pass requiredPermissions to apps.json#1148

Merged
Rod-Christensen merged 2 commits into
developfrom
feat/hide-sysapps
Jun 8, 2026
Merged

feat(registerApp): pass requiredPermissions to apps.json#1148
Rod-Christensen merged 2 commits into
developfrom
feat/hide-sysapps

Conversation

@Rod-Christensen

@Rod-Christensen Rod-Christensen commented Jun 7, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Forwards the new requiredPermissions manifest field from app package.json through registerApp.js into apps.json entries
  • Enables server-side permission gating: apps declaring this field will only be visible to users who hold ALL listed sysPermission strings
  • No-op for apps without the field (backward compatible)
  • Addresses CodeRabbit review comments on code merged in feat(billing-4): profiler visualizations, waitlist gate, subscribe CTA, canvas edge refactor #1138: stale-response race guard in ProfilerView, explicit waitlist boolean check, empty-block cleanup, debug log removal, fragile handle parsing fixes

Test plan

  • Build an app with requiredPermissions: ["sys.admin"] in its manifest
  • Verify apps.json contains the field after ./builder <app>:build
  • Verify apps without the field still build and register correctly

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Profiler UI redesigned with tabbed visualization views—Flame Graph, Sunburst, Table, and Text—for comprehensive performance analysis
    • Added waitlist screen for users pending access approval
    • Integrated subscription checkout flow for pipeline editor
  • Improvements

    • Enhanced copy-to-clipboard feedback with success validation

@coderabbitai

coderabbitai Bot commented Jun 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 2022b531-0a96-470f-87bf-86f47b89d1c3

📥 Commits

Reviewing files that changed from the base of the PR and between 37f2212 and c773ddb.

📒 Files selected for processing (10)
  • apps/profiler-ui/src/views/ProfilerView.tsx
  • apps/profiler-ui/src/views/visualizations/ReportText.tsx
  • apps/shell-ui/src/components/layout/Shell.tsx
  • apps/vscode/src/providers/AccountProvider.ts
  • packages/ai/src/ai/common/cprofile_manager.py
  • packages/shared-ui/src/components/canvas/components/node/node-component/run-button/RunButton.tsx
  • packages/shared-ui/src/components/canvas/context/FlowGraphContext.tsx
  • packages/shared-ui/src/components/canvas/hooks/useTemplateInstantiator.ts
  • packages/shared-ui/src/components/canvas/util/graph.ts
  • scripts/lib/registerApp.js

📝 Walkthrough

Walkthrough

This PR enhances profiler reporting with concurrent fetch deduplication, gates auth flow via waitlist phase, refactors canvas edge-state synchronization for direct ReactFlow updates, integrates config-driven subscription flow in VS Code, adjusts cProfile tree analysis, and conditionally emits app permissions in manifests.

Changes

Profiler Report Fetching, Caching, and Copy Feedback

Layer / File(s) Summary
Report fetching with stale-response guard
apps/profiler-ui/src/views/ProfilerView.tsx
ProfilerView adds fetchIdRef counter and fetchReport callback that increments per request, captures the id, ignores stale responses by comparing ids, and clears only the corresponding stale state (report, treeData) on fetch failures.
ReportText copy-command success check
apps/profiler-ui/src/views/visualizations/ReportText.tsx
copyViaExecCommand captures the boolean return from document.execCommand and only sets copied feedback state when the command reports success.

Auth Bootstrap and Waitlist Access Flow

Layer / File(s) Summary
Waitlist phase, bootstrap routing, and transitions
apps/shell-ui/src/components/layout/Shell.tsx
RenderPhase enum adds waitlisted mode. Bootstrap conditionally routes to waitlist when identity indicates access is pending. Account updates auto-transition from waitlist to shell when access is granted. Logout clears rr:auth:pending storage and routes back to shell for non-session-locked apps.
Waitlist screen
apps/shell-ui/src/components/layout/Shell.tsx
Dedicated waitlist UI displays access-rolling-out message and "Back to Home" button that triggers logout.

Canvas Edge Ownership and ReactFlow State Synchronization

Layer / File(s) Summary
FlowGraphContext edge-first state management
packages/shared-ui/src/components/canvas/context/FlowGraphContext.tsx
onEdgesChange forwards to ReactFlow and notifies host only on structural changes. onEdgeConnect directly appends new edges to state. addNode appends nodes directly and calls onContentUpdated. Node deletion filters connected edges and conditionally notifies. servicesJson revalidation updates formDataValid and recalculates unconfigured. Context value wrapped in useMemo with explicit dependencies.
RunButton debug logging removal
packages/shared-ui/src/components/canvas/components/node/node-component/run-button/RunButton.tsx
Removes console.log statements around click and pipeline invocation.

Graph Edge and Component Serialization

Layer / File(s) Summary
Graph utility edge derivation and parsing
packages/shared-ui/src/components/canvas/util/graph.ts
getEdgesFromNodes filters to nodes with data.control or data.input before deriving edges. getComponentFromNode with optional edges parses control-edge classType via regex replace and lane-edge lane via substring-after-first-dash.
Template instantiation with edge merging
packages/shared-ui/src/components/canvas/hooks/useTemplateInstantiator.ts
instantiateTemplate derives edges from newly created template nodes, merges with existing edges, and loads canvas. Post-ready payload computes components from nodes+edges, sets version to PIPELINE_SCHEMA_VERSION, increments docRevision, and removes viewport.

VS Code Config-Driven Subscription Flow

Layer / File(s) Summary
ConfigManager integration and subscribe handling
apps/vscode/src/providers/AccountProvider.ts
AccountProvider imports and initializes ConfigManager singleton. resolveClient selects client based on connection modes instead of displayName. billing:subscribe message case invokes handleSubscribe, which attempts to open untitled file with rocketride-pipeline language to trigger checkout; on failure, shows fallback instruction message.

Server Profiler and Manifest Updates

Layer / File(s) Summary
Tree root and min_pct calculation
packages/ai/src/ai/common/cprofile_manager.py
_build_tree normalizes min_pct threshold by summing cumulative times across functions instead of using max. Phantom-caller promotion now applies whenever phantom callers exist, not just when root_keys is empty.
App registration permissions metadata
scripts/lib/registerApp.js
registerApp conditionally includes requiredPermissions field in apps.json entry when present and non-empty.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested labels

module:ui, module:vscode

Suggested reviewers

  • jmaionchi
  • stepmikhaylov

Poem

🐰 Reports now race with grace so true,
Fetches dance without their dew,
Waitlist gates the door awhile,
Edges merge and sync with style,
Pipelines chart subscriptions bright!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately describes the main change: adding requiredPermissions field to apps.json via registerApp script.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/hide-sysapps

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented Jun 7, 2026

Copy link
Copy Markdown
🤖 Internal: Discord sync marker

Auto-managed by the Discord notification workflow. Stores the linked Discord message ID. Do not edit or delete.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 15

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/shared-ui/src/components/canvas/context/FlowGraphContext.tsx (1)

845-854: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Edge removal in onNodesDelete does not notify the host.

When nodes are deleted, onNodesDelete removes connected edges via setEdges, but unlike onEdgesChange, it never calls onContentUpdated. This creates a silent mutation where the host's project state diverges from the canvas.

Consider notifying the host after filtering edges:

 	const onNodesDelete = useCallback(
 		(deletedNodes: FlowNode[]) => {
 			// Remove all edges connected to any of the deleted nodes in one pass
 			const connected = getConnectedEdges(deletedNodes, edges);
 			const connectedSet = new Set(connected.map((e) => e.id));
 			const remaining = edges.filter((e) => !connectedSet.has(e.id));
 			setEdges(remaining);
+			if (connected.length > 0) {
+				onContentUpdated();
+			}
 		},
-		[edges, setEdges]
+		[edges, setEdges, onContentUpdated]
 	);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/shared-ui/src/components/canvas/context/FlowGraphContext.tsx` around
lines 845 - 854, onNodesDelete currently filters out edges connected to deleted
nodes using getConnectedEdges and setEdges but never notifies the host; update
onNodesDelete (the function that calls getConnectedEdges, creates connectedSet
and calls setEdges) to call onContentUpdated after updating edges so the host
receives the new project state (pass the new edges/content payload the same way
onEdgesChange does). Ensure you reference the same edge list produced in
remaining and invoke onContentUpdated with that updated state immediately after
setEdges to avoid a silent divergence.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/profiler-ui/src/views/ProfilerView.tsx`:
- Around line 292-293: fetchReport suffers a stale-response race: an earlier
network response can arrive after state was cleared/target changed and overwrite
the UI; fix by associating each fetchReport call with a unique token or
AbortController (e.g., increment a requestId or create an AbortController in the
scope where fetchReport is called), store the current token on the component (or
ref), pass it into fetchReport, and before applying any setState in fetchReport
verify the token matches the current token (or that the request was not aborted)
and that the selected target/session still matches; apply the same guard pattern
to all locations invoking fetchReport (and any other async handlers referenced
by statusIntervalRef / tasksIntervalRef) so only the latest response can update
the tree/report.

In `@apps/profiler-ui/src/views/visualizations/ReportText.tsx`:
- Around line 101-104: The fallback copy path in ReportText.tsx uses
document.execCommand('copy') but ignores its boolean return value, causing
setCopied(true) even on failure; update the copy logic in the ReportText
component to check the result of document.execCommand('copy') and only call
setCopied(true) (and remove the textarea) when it returns true, otherwise handle
failure by not setting copied and attempting a navigator.clipboard.writeText
fallback (with proper try/catch) or setting an error state so the UI does not
display "Copied!" erroneously.

In `@apps/shell-ui/src/components/layout/Shell.tsx`:
- Around line 246-251: The code treats a missing ConnectResult.waitlisted as
false and can wrongly exit waitlist mode; update the conditional inside the
mountedRef.current block (where setIdentity(result) is called and renderPhase is
checked) to only transition out of 'waitlisted' when waitlisted is explicitly
false (e.g., check result.waitlisted === false or presence + false) rather than
using !result.waitlisted so partial/omitted updates don't flip the user out of
waitlist; keep the existing checks for renderPhase and use
setRenderPhase('shell') only when the explicit boolean indicates removal from
the waitlist.

In `@apps/vscode/src/providers/AccountProvider.ts`:
- Around line 860-883: The fallback message in handleSubscribe is inconsistent
with the attempted action (it opens a new untitled pipeline file via
vscode.commands.executeCommand('workbench.action.files.newUntitledFile', {
languageId: 'rocketride-pipeline' })); update the fallback shown in the catch
block to instruct the user to create/open a new pipeline file or open a new
untitled .rrpipe pipeline file (mirror the "new untitled file" action) so the
message accurately reflects what the code tried to do.

In `@packages/ai/src/ai/common/cprofile_manager.py`:
- Around line 349-359: The min_pct threshold uses the max of per-entry cumtime
causing hotspots to dominate; in the cprofile_manager logic replace the max
aggregation with a sum of ct across stats_data (i.e., compute total_time =
sum(ct for each entry)) and keep total_calls as the sum of nc so min_time =
total_time * (min_pct/100.0) is based on the full tree time; update the same
pattern found in the later block that computes min_time (the second occurrence
around the other aggregation) to use summed ct instead of max to ensure pruning
and reported totals are relative to the entire tree.
- Around line 390-399: The code currently only promotes phantom callers to roots
when root_keys is empty; change the logic so phantom-callers are always promoted
(or merged) into root_keys instead of being dropped when normal roots exist:
compute phantom_callers as set(children_map.keys()) - set(stats_data.keys()),
build promoted by collecting child_key from children_map entries (same loop
using children_map and _c_cc/_c_nc/_c_tt/_c_ct), then set root_keys =
list(set(root_keys) | promoted) (or extend root_keys with promoted while
avoiding duplicates) so phantom-rooted branches are preserved alongside normal
roots.

In
`@packages/shared-ui/src/components/canvas/components/node/node-component/run-button/RunButton.tsx`:
- Line 76: Remove the debug console.log statements in the RunButton component:
delete the console.log calls that print `[RunButton] clicked nodeId=${nodeId}
isRunning=${isRunning} isSubscribed=${isSubscribed}
onRunPipeline=${!!onRunPipeline}` (and the similar one at line 86) inside the
RunButton.tsx event handlers; if runtime diagnostics are required, replace them
with the project's logging utility (use the shared logger) or conditional
debug-level logging rather than console.log, keeping the logic in
onClick/onRunPipeline handlers and preserving nodeId, isRunning, isSubscribed,
and onRunPipeline usage.

In `@packages/shared-ui/src/components/canvas/context/FlowGraphContext.tsx`:
- Around line 1095-1102: The useMemo dependency array includes stable references
that can be removed to reduce verbosity: remove canvasRef, setTempNode,
setEditingNodeId, setQuickAddState, and setConfigSnackbar from the dependency
list inside the useMemo that builds the flow graph context (the dependency array
that currently lists canvasRef, nodes, edges, nodeMap, setNodes, setEdges,
onNodesChange, onEdgesChange, onEdgeConnect, isValidConnection, onDragOver,
onDrop, onNodeDragStop, addNode, updateNode, deleteNode, onNodesDelete,
tempNode, setTempNode, focusOnNode, editingNodeId, setEditingNodeId,
onContentUpdated, loadData, loadCanvas, isFlowReady, quickAddState,
setQuickAddState, configSnackbar, setConfigSnackbar); keep only the actual
changing values (nodes, edges, nodeMap, tempNode, editingNodeId, quickAddState,
configSnackbar and the callback refs that may change) and leave stable
refs/setters out.
- Around line 689-694: In FlowGraphContext.tsx remove the no-op iteration that
causes the ESLint no-empty error: delete the for (const n of nodes) { const nd =
n.data as any; if (nd.input?.length || nd.control?.length) { } } block (or
replace it with meaningful logging if you intended to keep the check); this
removes the empty loop over nodes and resolves the lint warning without changing
behavior elsewhere in the FlowGraphContext component.
- Around line 1016-1017: In FlowGraphContext.tsx remove the empty else branch
that remains at the end of the conditional (the bare "else { }" shown in the
diff) to satisfy ESLint no-empty; update the surrounding conditional in the
FlowGraphContext component (or the enclosing function where the if/else lives)
by deleting the else block entirely and, if needed, consolidate any remaining
logic into the if branch or add a meaningful fallback action instead of leaving
an empty block.
- Around line 565-567: The empty conditional block after computing removes
(const removes = changes.filter((c) => c.type === 'remove'); if (removes.length
> 0) { }) should be removed to satisfy ESLint no-empty; either delete the entire
if (removes.length > 0) { } statement or implement the intended handling for
removed changes inside the FlowGraphContext code path where changes and removes
are computed so the removes variable is used (refer to the removes and changes
identifiers to locate the spot).

In `@packages/shared-ui/src/components/canvas/hooks/useTemplateInstantiator.ts`:
- Line 104: Remove the debug console.log statements from the
useTemplateInstantiator hook: delete the console.log call that prints
"[TemplateInstantiator] post-ready: notifying host, nodes=..., edges=...,
components=..., docRevision=..." and the other debug console.log further down in
the same file; if telemetry is needed replace them with the project's logger
(e.g. processLogger.debug or similar) or remove entirely so no console.* calls
remain in useTemplateInstantiator.

In `@packages/shared-ui/src/components/canvas/util/graph.ts`:
- Around line 244-246: The variable nodesWithConnections is computed but never
used; update the loop in the same scope so it iterates over nodesWithConnections
instead of nodes (or remove the unused filter if unnecessary) to avoid dead code
and ensure only nodes with data.control or data.input are processed—look for the
const nodesWithConnections = nodes.filter(...) and the subsequent for (const
node of nodes) loop in graph.ts and change the loop to for (const node of
nodesWithConnections) or delete the filter if not needed.
- Around line 328-331: The classType extraction for invoke edges is fragile
because edge.sourceHandle.split('.').at(1) truncates any dots inside the class
name; update the parsing in the block where edge.sourceHandle is checked (the
branch using edge.sourceHandle?.startsWith('invoke-source') and the control.push
call) to take everything after the first dot instead of only the second segment
— e.g. remove the prefix up to the first '.' and treat the remainder as
classType (or use split('.').slice(1).join('.') behavior) before pushing {
classType, from: edge.source }.
- Around line 332-336: The current extraction of the lane uses
edge.sourceHandle?.split('-')?.at(1), which discards any additional '-'
characters in the lane name; change the logic that computes lane (the variable
used before input.push({ lane, from: edge.source })) to preserve everything
after the first '-' (e.g. find the first '-' with indexOf and take substring
from that point +1, or split and join the remainder with slice(1).join('-')) so
multi-dash lane identifiers are not truncated.

---

Outside diff comments:
In `@packages/shared-ui/src/components/canvas/context/FlowGraphContext.tsx`:
- Around line 845-854: onNodesDelete currently filters out edges connected to
deleted nodes using getConnectedEdges and setEdges but never notifies the host;
update onNodesDelete (the function that calls getConnectedEdges, creates
connectedSet and calls setEdges) to call onContentUpdated after updating edges
so the host receives the new project state (pass the new edges/content payload
the same way onEdgesChange does). Ensure you reference the same edge list
produced in remaining and invoke onContentUpdated with that updated state
immediately after setEdges to avoid a silent divergence.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: c913d9c8-4b6d-40e0-979e-e052db246a11

📥 Commits

Reviewing files that changed from the base of the PR and between efecb7e and 37f2212.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml, !pnpm-lock.yaml
📒 Files selected for processing (35)
  • apps/profiler-ui/package.json
  • apps/profiler-ui/src/views/ProfilerView.tsx
  • apps/profiler-ui/src/views/visualizations/FlameGraph.tsx
  • apps/profiler-ui/src/views/visualizations/ReportText.tsx
  • apps/profiler-ui/src/views/visualizations/StatsTable.tsx
  • apps/profiler-ui/src/views/visualizations/SunburstChart.tsx
  • apps/profiler-ui/src/views/visualizations/types.ts
  • apps/shell-ui/src/components/layout/Shell.tsx
  • apps/shell-ui/src/connection/connection.ts
  • apps/shell-ui/src/lib/appLoader.ts
  • apps/vscode/src/providers/AccountProvider.ts
  • apps/vscode/src/providers/SettingsProvider.ts
  • apps/vscode/src/providers/SidebarProvider.ts
  • apps/vscode/src/providers/views/Account/AccountWebview.tsx
  • apps/vscode/src/providers/views/Settings/SettingsWebview.tsx
  • apps/vscode/src/providers/views/Sidebar/SidebarWebview.tsx
  • packages/ai/src/ai/account/models.py
  • packages/ai/src/ai/common/cprofile_manager.py
  • packages/ai/src/ai/modules/task/commands/cmd_account.py
  • packages/ai/src/ai/modules/task/commands/cmd_cprofile.py
  • packages/ai/src/ai/web/server.py
  • packages/client-python/src/rocketride/mixins/cprofile.py
  • packages/client-python/src/rocketride/types/client.py
  • packages/client-typescript/src/client/client.ts
  • packages/client-typescript/src/client/types/client.ts
  • packages/client-typescript/src/client/types/cprofile.ts
  • packages/shared-ui/src/components/canvas/components/edge/FlowEdge.tsx
  • packages/shared-ui/src/components/canvas/components/node/node-component/run-button/RunButton.tsx
  • packages/shared-ui/src/components/canvas/context/FlowGraphContext.tsx
  • packages/shared-ui/src/components/canvas/context/FlowProjectContext.tsx
  • packages/shared-ui/src/components/canvas/hooks/useTemplateInstantiator.ts
  • packages/shared-ui/src/components/canvas/util/graph.ts
  • packages/shared-ui/src/modules/account/AccountView.tsx
  • packages/shared-ui/src/modules/account/components/BillingPanel.tsx
  • scripts/lib/registerApp.js
💤 Files with no reviewable changes (1)
  • apps/shell-ui/src/lib/appLoader.ts

Comment thread apps/profiler-ui/src/views/ProfilerView.tsx
Comment thread apps/profiler-ui/src/views/visualizations/ReportText.tsx Outdated
Comment thread apps/shell-ui/src/components/layout/Shell.tsx
Comment thread apps/vscode/src/providers/AccountProvider.ts
Comment thread packages/ai/src/ai/common/cprofile_manager.py Outdated
Comment thread packages/shared-ui/src/components/canvas/hooks/useTemplateInstantiator.ts Outdated
Comment thread packages/shared-ui/src/components/canvas/util/graph.ts Outdated
Comment thread packages/shared-ui/src/components/canvas/util/graph.ts
Comment thread packages/shared-ui/src/components/canvas/util/graph.ts
Rod-Christensen added a commit that referenced this pull request Jun 8, 2026
- ProfilerView: guard fetchReport with fetchIdRef to prevent stale async
  responses from overwriting UI when target changes mid-flight
- ReportText: check execCommand('copy') return value before showing
  "Copied!" feedback
- Shell: use `result.waitlisted === false` instead of `!result.waitlisted`
  so omitted/undefined fields don't wrongly exit waitlist mode
- AccountProvider: align fallback message with the actual action (create
  or open a pipeline file, not specifically .rrpipe)
- cprofile_manager: use sum (not max) for total_time so min_pct threshold
  is relative to full tree; always promote phantom-caller roots instead
  of only when no normal roots exist
- RunButton, useTemplateInstantiator: remove debug console.log statements
- FlowGraphContext: remove empty blocks/iterations (ESLint no-empty),
  notify host via onContentUpdated in onNodesDelete, trim stable refs
  from useMemo dependency array
- graph.ts: iterate nodesWithConnections instead of unused filter; use
  robust parsing for classType (dots) and lane (dashes) in sourceHandle

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rod-Christensen and others added 2 commits June 8, 2026 11:46
Apps can now declare a requiredPermissions array in their appManifest.
The build-time registration script forwards this field into apps.json
entries so the server can persist it and enforce permission-based
visibility filtering at runtime.

Part of the server-side app permission filtering feature — apps that
declare requiredPermissions will only be returned to users who hold
ALL listed sysPermission strings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- ProfilerView: guard fetchReport with fetchIdRef to prevent stale async
  responses from overwriting UI when target changes mid-flight
- ReportText: check execCommand('copy') return value before showing
  "Copied!" feedback
- Shell: use `result.waitlisted === false` instead of `!result.waitlisted`
  so omitted/undefined fields don't wrongly exit waitlist mode
- AccountProvider: align fallback message with the actual action (create
  or open a pipeline file, not specifically .rrpipe)
- cprofile_manager: use sum (not max) for total_time so min_pct threshold
  is relative to full tree; always promote phantom-caller roots instead
  of only when no normal roots exist
- RunButton, useTemplateInstantiator: remove debug console.log statements
- FlowGraphContext: remove empty blocks/iterations (ESLint no-empty),
  notify host via onContentUpdated in onNodesDelete, trim stable refs
  from useMemo dependency array
- graph.ts: iterate nodesWithConnections instead of unused filter; use
  robust parsing for classType (dots) and lane (dashes) in sourceHandle

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Rod-Christensen Rod-Christensen merged commit c773ddb into develop Jun 8, 2026
19 of 20 checks passed
@Rod-Christensen Rod-Christensen deleted the feat/hide-sysapps branch June 8, 2026 18:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant