@schlenkr/ragents 0.1.19 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/apps/server/src/host-api.json +6 -2
  2. package/apps/server/src/host-api.ts +3 -2
  3. package/apps/server/src/host-web.ts +3 -0
  4. package/apps/server/src/plugin-support/actor-programs/contract.ts +0 -3
  5. package/apps/server/src/plugin-support/removed-layout.ts +94 -0
  6. package/apps/server/src/ragents/engine.ts +2 -1
  7. package/apps/server/src/title-compactor.ts +5 -7
  8. package/apps/web/dist/assets/highlighted-body-KPVGNVTW-k67VKdbw.js +1 -0
  9. package/apps/web/dist/assets/main-CVjIz7BS.js +674 -0
  10. package/apps/web/dist/help/guide-clients.html +22 -42
  11. package/apps/web/dist/help/guide-clients.md +24 -45
  12. package/apps/web/dist/help/guide-functions.html +1 -1
  13. package/apps/web/dist/help/guide-functions.md +1 -1
  14. package/apps/web/dist/help/guide-getting-started.html +14 -22
  15. package/apps/web/dist/help/guide-getting-started.md +17 -24
  16. package/apps/web/dist/help/guide-ideas.html +1 -1
  17. package/apps/web/dist/help/guide-ideas.md +1 -1
  18. package/apps/web/dist/help/guide-plugins.html +1 -1
  19. package/apps/web/dist/help/guide-plugins.md +1 -1
  20. package/apps/web/dist/help/guide-programs.html +1 -1
  21. package/apps/web/dist/help/guide-programs.md +1 -1
  22. package/apps/web/dist/help/index.html +12 -79
  23. package/apps/web/dist/help/mini-app.css +8 -502
  24. package/apps/web/dist/host-web.json +28 -23
  25. package/apps/web/dist/index.html +2 -3
  26. package/apps/web/dist/run-panel.html +3 -4
  27. package/apps/web/src/Overview.tsx +4 -143
  28. package/apps/web/src/PluginChat.tsx +22 -116
  29. package/apps/web/src/PluginRegistry.tsx +4 -9
  30. package/apps/web/src/RunPreparationChat.tsx +4 -1
  31. package/apps/web/src/host-modules.ts +2 -0
  32. package/apps/web/src/main.tsx +23 -3
  33. package/apps/web/src/panel/RunLine.tsx +5 -2
  34. package/apps/web/src/panel/RunsPage.tsx +6 -6
  35. package/apps/web/src/panel/StartPage.tsx +6 -5
  36. package/apps/web/src/panel/contract.ts +3 -0
  37. package/apps/web/src/panel/page-props.ts +2 -0
  38. package/apps/web/src/run-apps.ts +34 -0
  39. package/apps/web/src/run-overview.ts +0 -27
  40. package/apps/web/src/run-panel/PanelContributions.tsx +41 -0
  41. package/apps/web/src/run-panel/RunPanelApp.tsx +172 -91
  42. package/apps/web/src/run-panel/RunPanelMenu.tsx +4 -3
  43. package/apps/web/src/run-panel/RunPanelWorkspace.tsx +8 -2
  44. package/apps/web/src/run-panel/clipboard.ts +17 -14
  45. package/apps/web/src/run-panel/host-contract.ts +8 -9
  46. package/apps/web/src/run-panel/host.ts +5 -31
  47. package/apps/web/src/run-panel/input-bridge.ts +15 -7
  48. package/bundles/ragents.activity/ragents-bundle.json +2 -2
  49. package/bundles/ragents.actor-programs/prompt.hbs +4 -5
  50. package/bundles/ragents.actor-programs/ragents-bundle.json +4 -14
  51. package/bundles/ragents.actor-programs/server/index.js +2 -14
  52. package/bundles/ragents.actor-programs/server/index.js.map +2 -2
  53. package/bundles/ragents.actor-programs/web/classes.json +1 -1
  54. package/bundles/ragents.actor-programs/web/index.js +1 -3
  55. package/bundles/ragents.actor-programs/web/index.js.map +4 -4
  56. package/bundles/ragents.ask/ragents-bundle.json +2 -2
  57. package/bundles/ragents.browser/ragents-bundle.json +2 -2
  58. package/bundles/ragents.documents/ragents-bundle.json +2 -2
  59. package/bundles/ragents.lsp-fsharp/ragents-bundle.json +2 -2
  60. package/bundles/ragents.lsp-roslyn/ragents-bundle.json +2 -2
  61. package/bundles/ragents.lsp-typescript/ragents-bundle.json +2 -2
  62. package/bundles/ragents.model-relay/ragents-bundle.json +2 -2
  63. package/bundles/ragents.orchestration/ragents-bundle.json +15 -41
  64. package/bundles/ragents.orchestration/server/index.js +10 -249
  65. package/bundles/ragents.orchestration/server/index.js.map +4 -4
  66. package/bundles/ragents.orchestration/web/chunks/chunk-KU7O6MEX.js +2 -0
  67. package/bundles/ragents.orchestration/web/chunks/chunk-KU7O6MEX.js.map +7 -0
  68. package/bundles/ragents.orchestration/web/classes.json +1 -1
  69. package/bundles/ragents.orchestration/web/exports/web/program-slot.js +1 -1
  70. package/bundles/ragents.orchestration/web/index.js +10 -18
  71. package/bundles/ragents.orchestration/web/index.js.map +4 -4
  72. package/bundles/ragents.overseer/ragents-bundle.json +3 -3
  73. package/bundles/ragents.overseer/server/index.js +0 -1
  74. package/bundles/ragents.overseer/server/index.js.map +2 -2
  75. package/bundles/ragents.processes/ragents-bundle.json +2 -2
  76. package/bundles/ragents.product/ragents-bundle.json +2 -2
  77. package/bundles/ragents.profile-distribution/ragents-bundle.json +2 -2
  78. package/bundles/ragents.reference/ragents-bundle.json +3 -3
  79. package/bundles/ragents.reference/run-scripts/balcony-wizard/RUN.md +1 -1
  80. package/bundles/ragents.reference/run-scripts/balcony-wizard/src/server.ts +1 -2
  81. package/bundles/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +6 -7
  82. package/bundles/ragents.reference/run-scripts/conversation-circle/RUN.md +3 -3
  83. package/bundles/ragents.reference/run-scripts/conversation-circle/src/server.ts +3 -13
  84. package/bundles/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
  85. package/bundles/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +1 -6
  86. package/bundles/ragents.reference/run-scripts/learning-afternoon/src/server.ts +1 -15
  87. package/bundles/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +1 -1
  88. package/bundles/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
  89. package/bundles/ragents.reference/run-scripts/quick-note/RUN.md +1 -1
  90. package/bundles/ragents.reference/run-scripts/quick-note/src/server.ts +1 -2
  91. package/bundles/ragents.reference/run-scripts/quick-note/tests/program.test.ts +0 -2
  92. package/bundles/ragents.reference/run-scripts/run-roster/RUN.md +2 -2
  93. package/bundles/ragents.reference/run-scripts/run-roster/src/server.ts +1 -2
  94. package/bundles/ragents.reference/run-scripts/run-roster/tests/program.test.ts +0 -2
  95. package/bundles/ragents.reference/run-scripts/shared-actor-list/src/server.ts +1 -1
  96. package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
  97. package/bundles/ragents.reference/run-scripts/word-game/src/contract.ts +1 -1
  98. package/bundles/ragents.reference/run-scripts/word-game/src/server.ts +0 -1
  99. package/bundles/ragents.reference/run-scripts/word-game/tests/program.test.ts +1 -2
  100. package/bundles/ragents.reference/skills/80-actor-text-analysis/SKILL.md +1 -1
  101. package/bundles/ragents.reference/skills/90-actor-notes/SKILL.md +1 -1
  102. package/bundles/ragents.todo/ragents-bundle.json +2 -2
  103. package/bundles/ragents.transcript/ragents-bundle.json +2 -2
  104. package/bundles/ragents.watch/ragents-bundle.json +2 -2
  105. package/bundles/ragents.workspace/ragents-bundle.json +2 -2
  106. package/package.json +8 -8
  107. package/packages/agent/dist/core/agent-settings.d.ts +1 -1
  108. package/packages/ai/dist/types.d.ts +2 -1
  109. package/packages/ragents/src/runtime/journal.ts +4 -0
  110. package/plugins/ragents.actor-programs/prompt.hbs +4 -5
  111. package/plugins/ragents.actor-programs/server/access-projections.ts +1 -1
  112. package/plugins/ragents.actor-programs/server/index.ts +0 -2
  113. package/plugins/ragents.actor-programs/server/runtime.ts +2 -10
  114. package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +5 -20
  115. package/plugins/ragents.actor-programs/web/AppsPanel.tsx +3 -79
  116. package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +0 -9
  117. package/plugins/ragents.actor-programs/web/api.ts +0 -20
  118. package/plugins/ragents.actor-programs/web/context.ts +0 -3
  119. package/plugins/ragents.actor-programs/web/index.tsx +0 -9
  120. package/plugins/ragents.orchestration/ragents-plugin.json +1 -2
  121. package/plugins/ragents.orchestration/server/index.ts +1 -11
  122. package/plugins/ragents.orchestration/web/ActorChat.tsx +1 -1
  123. package/plugins/ragents.orchestration/web/ActorChatControls.tsx +1 -1
  124. package/plugins/ragents.orchestration/web/FlowInspector.tsx +2 -4
  125. package/plugins/ragents.orchestration/web/InspectionPanel.tsx +21 -0
  126. package/plugins/ragents.orchestration/web/index.tsx +13 -9
  127. package/plugins/ragents.orchestration/web/program-slot.ts +0 -3
  128. package/plugins/ragents.orchestration/web/run-panel/AddresseeControl.tsx +15 -36
  129. package/plugins/ragents.orchestration/web/run-panel/RunPanel.tsx +76 -451
  130. package/plugins/ragents.orchestration/web/run-panel/run-panel-actors.ts +0 -27
  131. package/plugins/ragents.orchestration/web/run-panel/run-panel-state.ts +7 -40
  132. package/plugins/ragents.overseer/server/coordinator-prompt.ts +0 -1
  133. package/plugins/ragents.reference/examples.ts +1 -2
  134. package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +1 -1
  135. package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +1 -2
  136. package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +6 -7
  137. package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +3 -3
  138. package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +3 -13
  139. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
  140. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +1 -6
  141. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +1 -15
  142. package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +1 -1
  143. package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
  144. package/plugins/ragents.reference/run-scripts/quick-note/RUN.md +1 -1
  145. package/plugins/ragents.reference/run-scripts/quick-note/src/server.ts +1 -2
  146. package/plugins/ragents.reference/run-scripts/quick-note/tests/program.test.ts +0 -2
  147. package/plugins/ragents.reference/run-scripts/run-roster/RUN.md +2 -2
  148. package/plugins/ragents.reference/run-scripts/run-roster/src/server.ts +1 -2
  149. package/plugins/ragents.reference/run-scripts/run-roster/tests/program.test.ts +0 -2
  150. package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +1 -1
  151. package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
  152. package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +1 -1
  153. package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +0 -1
  154. package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +1 -2
  155. package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +1 -1
  156. package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +1 -1
  157. package/plugins/ragents.reference/walkthroughs.ts +13 -14
  158. package/apps/web/dist/assets/highlighted-body-KPVGNVTW-BwD4uYEe.js +0 -1
  159. package/apps/web/dist/assets/main-KBrc5Q77.js +0 -11
  160. package/apps/web/dist/assets/mermaid-HWGCJPDP-CSCkaArr.js +0 -608
  161. package/apps/web/dist/assets/runPanel-BjG5NBKm.js +0 -26
  162. package/apps/web/src/App.tsx +0 -318
  163. package/apps/web/src/SessionList.tsx +0 -157
  164. package/apps/web/src/SurfaceShortcuts.tsx +0 -60
  165. package/apps/web/src/WorkspacePanel.tsx +0 -309
  166. package/apps/web/src/run-panel.tsx +0 -52
  167. package/bundles/ragents.orchestration/server/chunks/chunk-QS3WJ3D7.js +0 -11
  168. package/bundles/ragents.orchestration/server/chunks/chunk-QS3WJ3D7.js.map +0 -7
  169. package/bundles/ragents.orchestration/server/exports/server/contract.js +0 -9
  170. package/bundles/ragents.orchestration/server/exports/server/contract.js.map +0 -7
  171. package/bundles/ragents.orchestration/surface.hbs +0 -39
  172. package/bundles/ragents.orchestration/web/chunks/chunk-CFMJD5ZI.js +0 -2
  173. package/bundles/ragents.orchestration/web/chunks/chunk-CFMJD5ZI.js.map +0 -7
  174. package/bundles/ragents.orchestration/web/chunks/chunk-HOBLI364.js +0 -2
  175. package/bundles/ragents.orchestration/web/chunks/chunk-HOBLI364.js.map +0 -7
  176. package/bundles/ragents.orchestration/web/chunks/chunk-UCIMT2R4.js +0 -2
  177. package/bundles/ragents.orchestration/web/chunks/chunk-UCIMT2R4.js.map +0 -7
  178. package/bundles/ragents.orchestration/web/chunks/chunk-XGPPQCZR.js +0 -2
  179. package/bundles/ragents.orchestration/web/chunks/chunk-XGPPQCZR.js.map +0 -7
  180. package/bundles/ragents.orchestration/web/exports/web/surface-entities.js +0 -2
  181. package/bundles/ragents.orchestration/web/exports/web/surface-entities.js.map +0 -7
  182. package/bundles/ragents.orchestration/web/exports/web/tile-docking.js +0 -2
  183. package/bundles/ragents.orchestration/web/exports/web/tile-docking.js.map +0 -7
  184. package/plugins/ragents.actor-programs/web/ExpandIcon.tsx +0 -5
  185. package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +0 -31
  186. package/plugins/ragents.orchestration/contract.ts +0 -51
  187. package/plugins/ragents.orchestration/server/contract.ts +0 -14
  188. package/plugins/ragents.orchestration/server/surface-tool.ts +0 -198
  189. package/plugins/ragents.orchestration/surface.hbs +0 -39
  190. package/plugins/ragents.orchestration/tiled-layout.ts +0 -55
  191. package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +0 -29
  192. package/plugins/ragents.orchestration/web/ActorShortcut.tsx +0 -74
  193. package/plugins/ragents.orchestration/web/ActorSurfaceControls.tsx +0 -130
  194. package/plugins/ragents.orchestration/web/ActorTile.tsx +0 -23
  195. package/plugins/ragents.orchestration/web/Center.tsx +0 -133
  196. package/plugins/ragents.orchestration/web/SurfaceTiles.tsx +0 -47
  197. package/plugins/ragents.orchestration/web/TiledSurface.tsx +0 -280
  198. package/plugins/ragents.orchestration/web/actor-header-settings.ts +0 -41
  199. package/plugins/ragents.orchestration/web/run-panel/RunPanelSettings.tsx +0 -50
  200. package/plugins/ragents.orchestration/web/run-panel/run-panel-settings.ts +0 -47
  201. package/plugins/ragents.orchestration/web/run-panel/sheet-status.ts +0 -30
  202. package/plugins/ragents.orchestration/web/surface-entities.ts +0 -21
  203. package/plugins/ragents.orchestration/web/surface-view-settings.ts +0 -42
  204. package/plugins/ragents.orchestration/web/tile-docking.ts +0 -105
  205. package/plugins/ragents.orchestration/web/tiled-view-settings.ts +0 -74
  206. /package/apps/web/dist/assets/{mermaid-HWGCJPDP-BPn4aV2r.css → main-BPn4aV2r.css} +0 -0
@@ -1,63 +1,30 @@
1
1
  import { createLocalStorageSetting } from "@ragents/web/lib/local-storage-setting";
2
2
 
3
- /** The chosen view of the run panel: chat only, chat at the bottom as a sheet, or chat on the right if the run panel is wide enough. */
4
- export type RunPanelChatMode = "chat" | "bottom" | "side";
5
-
6
- /** How the chat relates to the mini-app: alone, next to it, or as a sheet above it. */
7
- export type ChatLayout = "full" | "side" | "floating";
8
-
9
- /** Personal state per run: mini-app, actor, chat position, side width and expanded sheet height. */
10
3
  export interface RunPanelState {
11
4
  element: string | null;
12
5
  actor: string | null;
13
- chat: RunPanelChatMode;
14
- chatWidth: number;
15
- sheetExpandedHeight: number | null;
16
6
  }
17
7
 
18
- export const CHAT_MIN_WIDTH = 280;
19
- export const CHAT_DEFAULT_WIDTH = 380;
20
- /** Next to the chat there is always room for a piece of mini-app. */
21
- export const STAGE_MIN_WIDTH = 300;
22
-
23
- export const DEFAULT_RUN_PANEL_STATE: RunPanelState = Object.freeze({ element: null, actor: null, chat: "side", chatWidth: CHAT_DEFAULT_WIDTH, sheetExpandedHeight: null });
24
-
25
- export const runPanelStorageKey = (runId: string) => `ragents.orchestration.run-panel:${runId}`;
8
+ export const DEFAULT_RUN_PANEL_STATE: RunPanelState = Object.freeze({ element: null, actor: null });
9
+ export const runPanelStorageKey = (runId: string) => `ragents.orchestration.run-navigation:${runId}`;
26
10
 
27
11
  const isTextOrNull = (value: unknown): value is string | null => value === null || typeof value === "string";
28
- /** Earlier states knew `auto`, `floating` and `docked` as well as a stage height; they are mapped to today's positions. */
29
- const chatModeOf = (value: unknown): RunPanelChatMode | undefined =>
30
- value === undefined || value === "side" || value === "auto" ? "side"
31
- : value === "chat" ? "chat"
32
- : value === "bottom" || value === "floating" || value === "docked" ? "bottom" : undefined;
33
12
 
34
13
  export function parseRunPanelState(raw: string | null): RunPanelState {
35
14
  if (raw === null) return DEFAULT_RUN_PANEL_STATE;
36
15
  const value: unknown = JSON.parse(raw);
37
16
  if (!value || typeof value !== "object" || Array.isArray(value)
38
- || Object.keys(value).some((key) => !["element", "stageHeight", "actor", "chat", "chatWidth", "sheetExpandedHeight", "sheetPeekExtra"].includes(key))
17
+ || Object.keys(value).some((key) => !["element", "actor"].includes(key))
39
18
  || !("element" in value) || !isTextOrNull(value.element)
40
- || !("actor" in value) || !isTextOrNull(value.actor)
41
- || chatModeOf("chat" in value ? value.chat : undefined) === undefined
42
- || ("chatWidth" in value && (typeof value.chatWidth !== "number" || !Number.isFinite(value.chatWidth) || value.chatWidth < CHAT_MIN_WIDTH))
43
- || ("sheetExpandedHeight" in value && value.sheetExpandedHeight !== null && (typeof value.sheetExpandedHeight !== "number" || !Number.isFinite(value.sheetExpandedHeight) || value.sheetExpandedHeight <= 0))
44
- || ("sheetPeekExtra" in value && (typeof value.sheetPeekExtra !== "number" || !Number.isFinite(value.sheetPeekExtra) || value.sheetPeekExtra < 0))) {
45
- throw new Error("The stored panel state is invalid.");
19
+ || !("actor" in value) || !isTextOrNull(value.actor)) {
20
+ throw new Error("The stored panel navigation is invalid.");
46
21
  }
47
- const stored = value as { element: string | null; actor: string | null; chat?: unknown; chatWidth?: number; sheetExpandedHeight?: number | null };
48
- return { element: stored.element, actor: stored.actor, chat: chatModeOf(stored.chat) ?? "side", chatWidth: stored.chatWidth ?? CHAT_DEFAULT_WIDTH, sheetExpandedHeight: stored.sheetExpandedHeight ?? null };
22
+ return { element: value.element, actor: value.actor };
49
23
  }
50
24
 
51
- /** Without a mini-app and in the "Chat only" view the chat fills the run panel; otherwise it sits on the right if there is room, and at the bottom if not. */
52
- export const chatLayoutFor = ({ chat, hasElement, narrow }: { chat: RunPanelChatMode; hasElement: boolean; narrow: boolean }): ChatLayout =>
53
- !hasElement || chat === "chat" ? "full" : !narrow && chat === "side" ? "side" : "floating";
54
-
55
- export const clampChatWidth = (width: number, available: number): number =>
56
- Math.max(CHAT_MIN_WIDTH, Math.min(Math.round(width), Math.max(CHAT_MIN_WIDTH, available - STAGE_MIN_WIDTH)));
57
-
58
25
  const setting = createLocalStorageSetting({
59
26
  changeEvent: "ragents-run-panel-change",
60
- matchesKey: (key) => key.startsWith("ragents.orchestration.run-panel:"),
27
+ matchesKey: (key) => key.startsWith("ragents.orchestration.run-navigation:"),
61
28
  parse: parseRunPanelState,
62
29
  serialize: JSON.stringify,
63
30
  });
@@ -1,7 +1,6 @@
1
1
  export const coordinatorPrompt = `You coordinate tasks in RAgents.
2
2
  New runs may start with a domain task. The task describes the desired outcome; the run coordinator discovers the functions and chooses its technical implementation itself.
3
3
  For existing runs, check the type of the primary actor in the run view. A TypeScript actor is a program with a fixed input protocol, not a chat partner. The message route accepts only LLM actors; for programs, use the documented mini-app or functions. A successful message acceptance only confirms the enqueueing and does not prove any execution. Claim a restart or a completion only when the result shows it.
4
- The surface of a run consists of tiles. Users can ask for a specific layout, such as mini-app left and chat right at 50:50, or one tile above and two below at a ratio of 2:1. Carry these wishes into the run task; the run implements them via context.functions.canvas_layout_replace with a nested root. For existing runs, pass the layout task on to the LLM coordinator. Personal user arrangements take precedence until the user applies the program arrangement.
5
4
  Answer in the user's language with the necessary details. Refer to runs by their titles. Use simple hyphens and normal quotation marks.`;
6
5
 
7
6
  export const preparationPrompt = `${coordinatorPrompt}
@@ -5,7 +5,7 @@ export const referenceConcepts = [
5
5
  { id: "fifo", label: "Input queue" },
6
6
  { id: "stop", label: "Stopping actors" },
7
7
  { id: "artifacts", label: "Artifacts and access" },
8
- { id: "tiles", label: "Surface", entryKind: "walkthrough" },
8
+ { id: "app-navigation", label: "App navigation", entryKind: "walkthrough" },
9
9
  { id: "actor-views", label: "Mini-apps" },
10
10
  { id: "actor-state", label: "Actor state" },
11
11
  { id: "llm-actor-view", label: "LLM actor with view" },
@@ -20,7 +20,6 @@ export const referenceConcepts = [
20
20
  { id: "run-scripts", label: "Run scripts", entryKind: "script" },
21
21
  { id: "skills", label: "Skills", entryKind: "skill" },
22
22
  { id: "actor-functions", label: "Actor functions" },
23
- { id: "view-placement", label: "Automatic view placement" },
24
23
  { id: "view-visibility", label: "View visibility" },
25
24
  { id: "global-coordinator", label: "Global coordinator", entryKind: "walkthrough" },
26
25
  { id: "conversation-reset", label: "Conversation reset", entryKind: "walkthrough" },
@@ -8,7 +8,7 @@ tags: Run scripts, Use case, Concept demo, Mini-apps, LLM actor with view, Contr
8
8
 
9
9
  The TypeScript setup creates a balcony advisor with the role `standard` and explicitly
10
10
  without tools. The bundled program `actors/balcony-app/` binds a standalone mini-app to
11
- this actor. The surface shows only its tile instead of a chat tile; no coordinator
11
+ this actor. The app is available beside Chat; no coordinator
12
12
  is created for this run. The advisor becomes the primary actor and keeps its own
13
13
  interview prompt.
14
14
 
@@ -4,7 +4,7 @@ import { Type } from "typebox";
4
4
  const contract = {
5
5
  state: Type.Object({ built: Type.Optional(Type.Boolean()) }, { additionalProperties: false }),
6
6
  functions: {},
7
- input: { capabilities: ["model_list", "agent_spawn", "actor_program_activate", "canvas_layout_replace", "run_configure"] },
7
+ input: { capabilities: ["model_list", "agent_spawn", "actor_program_activate", "run_configure"] },
8
8
  } as const;
9
9
 
10
10
  const prompt = `You conduct a balcony interview in a standalone app. The user sees your current question or, at the end, your recommendation. You have no tools and answer as normal text.
@@ -25,7 +25,6 @@ export default defineActor(contract, {
25
25
  handle: "balcony-advisor", displayName: "Balcony advisor", prompt, profile: profile.name, tools: [],
26
26
  });
27
27
  await context.functions.actor_program_activate({ name: "balcony-app", actor: `@${advisor.handle}` });
28
- await context.functions.canvas_layout_replace({ root: { entity: `app:@${advisor.handle}/main` } });
29
28
  await context.functions.run_configure({ title: "Your balcony", primaryActor: `@${advisor.handle}` });
30
29
  context.state.replace({ built: true });
31
30
  },
@@ -8,7 +8,7 @@ const input = { id: "start", content: JSON.stringify({ input: null, options: {}
8
8
  function setup(options: { missingProfile?: boolean; failActivation?: boolean } = {}) {
9
9
  const calls: { name: string; input: unknown }[] = [];
10
10
  const functions = Object.fromEntries([
11
- "model_list", "agent_spawn", "actor_program_activate", "canvas_layout_replace", "run_configure",
11
+ "model_list", "agent_spawn", "actor_program_activate", "run_configure",
12
12
  ].map((name) => [name, (value: unknown) => {
13
13
  calls.push({ name, input: value });
14
14
  if (name === "model_list") return { profiles: options.missingProfile ? [] : [{ name: "standard", driver: "agent", description: "Test profile", turnTimeoutMs: null, isolateWorkspace: false, provider: "test", model: "test" }], models: [] };
@@ -27,20 +27,19 @@ function setup(options: { missingProfile?: boolean; failActivation?: boolean } =
27
27
  return { calls, context };
28
28
  }
29
29
 
30
- test("sets up an advisor without tools and its own mini-app as the only tile", async () => {
30
+ test("sets up an advisor without tools and its own mini-app in the app catalog", async () => {
31
31
  const { calls, context } = setup();
32
32
  await program.onInput!(input, context);
33
- assert.deepEqual(calls.map((call) => call.name), ["model_list", "agent_spawn", "actor_program_activate", "canvas_layout_replace", "run_configure"]);
33
+ assert.deepEqual(calls.map((call) => call.name), ["model_list", "agent_spawn", "actor_program_activate", "run_configure"]);
34
34
  assert.deepEqual(calls.find((call) => call.name === "agent_spawn")?.input, {
35
35
  handle: "balcony-advisor", displayName: "Balcony advisor", profile: "standard", tools: [],
36
36
  prompt: (calls[1]!.input as { prompt: string }).prompt,
37
37
  });
38
38
  assert.deepEqual(calls[2]!.input, { name: "balcony-app", actor: "@balcony-advisor" });
39
- assert.deepEqual(calls[3]!.input, { root: { entity: "app:@balcony-advisor/main" } });
40
- assert.deepEqual(calls[4]!.input, { title: "Your balcony", primaryActor: "@balcony-advisor" });
39
+ assert.deepEqual(calls[3]!.input, { title: "Your balcony", primaryActor: "@balcony-advisor" });
41
40
  assert.deepEqual(context.state.read(), { built: true });
42
41
  await program.onInput!(input, context);
43
- assert.equal(calls.length, 5);
42
+ assert.equal(calls.length, 4);
44
43
  });
45
44
 
46
45
  test("a missing role builds no unusable advisor", async () => {
@@ -50,7 +49,7 @@ test("a missing role builds no unusable advisor", async () => {
50
49
  assert.deepEqual(context.state.read(), {});
51
50
  });
52
51
 
53
- test("a failed view activation sets neither surface nor success state", async () => {
52
+ test("a failed view activation neither configures the run nor marks setup complete", async () => {
54
53
  const options = { failActivation: true };
55
54
  const { calls, context } = setup(options);
56
55
  await assert.rejects(async () => program.onInput!(input, context), /View cannot be activated/);
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  title: Set up conversation circle
3
- description: "A prepared setup shows parameterization through a start guide and the arrangement of a conversation circle. The coordinator then leads the rounds."
3
+ description: "A prepared setup shows parameterization through a start guide and the participants of a conversation circle. The coordinator then leads the rounds."
4
4
  order: 120
5
5
  guide: ragents.reference.conversation-circle
6
6
  tags: Run scripts, Use case, Concept demo, Start guide, Agent teams
7
7
  ---
8
8
 
9
- A deterministic setup: the script sets up mira, jon, and ada as ordinary LLMs, splits
10
- the surface among them, and hands the briefing to the coordinator.
9
+ A deterministic setup: the script sets up mira, jon, and ada as ordinary LLMs and hands
10
+ the briefing to the coordinator.
11
11
  The card tests the model, this script tests the platform.
12
12
 
13
13
  The guide passes `{ "topic": "...", "rounds": 2 }`. `topic` contains 1 to 160 characters, `rounds` is an integer from 1 to 5. The start value `null` explicitly chooses the topic "Should city centers become car-free?" and two rounds. Other incomplete or invalid values are rejected before the setup. Topic and number of rounds control the display and the task, and the topic also controls the run title.
@@ -4,7 +4,7 @@ import { Type } from "typebox";
4
4
  const contract = {
5
5
  state: Type.Object({ built: Type.Optional(Type.Boolean()) }, { additionalProperties: false }),
6
6
  functions: {},
7
- input: { capabilities: ["model_list", "agent_spawn", "canvas_layout_replace", "actor_input", "run_configure"] },
7
+ input: { capabilities: ["model_list", "agent_spawn", "actor_input", "run_configure"] },
8
8
  } as const;
9
9
 
10
10
  type Start = { input: unknown };
@@ -57,22 +57,12 @@ export default defineActor(contract, {
57
57
  participants.push(`@${participant.handle}`);
58
58
  }
59
59
 
60
- await context.functions.canvas_layout_replace({
61
- root: {
62
- direction: "vertical",
63
- weights: [1, 1],
64
- children: [
65
- { entity: participants[0]! },
66
- { direction: "horizontal", weights: [1, 1], children: [{ entity: participants[1]! }, { entity: participants[2]! }] },
67
- ],
68
- },
69
- });
70
60
 
71
61
  await context.functions.actor_input({
72
62
  actor: "@coordinator",
73
- content: `The circle is ready: ${participants.join(", ")} are set up, the surface is split. Topic: "${topic}". `
63
+ content: `The circle is ready: ${participants.join(", ")} are set up. Topic: "${topic}". `
74
64
  + `Run exactly ${rounds} conversation rounds: in each round ${participants.join(", ")} in this order. `
75
- + "Each one receives the previous contributions. Do not change the surface. "
65
+ + "Each one receives the previous contributions. "
76
66
  + "At the end, summarize the conversation in three sentences.",
77
67
  });
78
68
 
@@ -2,7 +2,7 @@ import { createTestContext } from "@ragents/server/testing";
2
2
 
3
3
  export const setupContext = (profiles = [{ name: "coordinator", driver: "agent" }, { name: "standard", driver: "agent" }]) => {
4
4
  const calls: { name: string; input: unknown }[] = [];
5
- const functions = Object.fromEntries(["model_list", "agent_spawn", "run_configure", "actor_input", "canvas_layout_replace", "actor_program_activate"].map((name) => [name, (input: unknown) => {
5
+ const functions = Object.fromEntries(["model_list", "agent_spawn", "run_configure", "actor_input", "actor_program_activate"].map((name) => [name, (input: unknown) => {
6
6
  calls.push({ name, input });
7
7
  if (name === "agent_spawn") {
8
8
  const handle = (input as { handle: string }).handle;
@@ -3,16 +3,11 @@ import test from "node:test";
3
3
  import program from "../src/server.ts";
4
4
  import { setupContext, startInput } from "./helpers.ts";
5
5
 
6
- test("topic and number of rounds control participants, surface, and task", async () => {
6
+ test("topic and number of rounds control participants and task", async () => {
7
7
  const { calls, context } = setupContext();
8
8
  await program.onInput!(startInput({ topic: "Team breakfast", rounds: 3 }), context);
9
9
  assert.deepEqual(calls.filter((call) => call.name === "agent_spawn").map((call) => (call.input as { handle: string }).handle), ["mira", "jon", "ada"]);
10
10
  assert.deepEqual(calls.find((call) => call.name === "run_configure")?.input, { title: "Conversation circle: Team breakfast" });
11
- const layout = calls.find((call) => call.name === "canvas_layout_replace")?.input as { root: unknown };
12
- assert.deepEqual(layout.root, { direction: "vertical", weights: [1, 1], children: [
13
- { entity: "@mira" },
14
- { direction: "horizontal", weights: [1, 1], children: [{ entity: "@jon" }, { entity: "@ada" }] },
15
- ] });
16
11
  assert.match(JSON.stringify(calls.at(-1)), /exactly 3 conversation rounds/);
17
12
  assert.deepEqual(context.state.read(), { built: true });
18
13
  const completedCalls = calls.length;
@@ -32,19 +32,12 @@ const contract = {
32
32
  capabilities: ["actor_input"],
33
33
  },
34
34
  },
35
- input: { capabilities: ["model_list", "agent_spawn", "canvas_layout_replace", "run_configure", "actor_input", "event_subscribe", "event_unsubscribe", "event_query"] },
35
+ input: { capabilities: ["model_list", "agent_spawn", "run_configure", "actor_input", "event_subscribe", "event_unsubscribe", "event_query"] },
36
36
  } as const;
37
37
 
38
38
  const startMarker = "START_LEARNING_AFTERNOON";
39
39
 
40
40
 
41
- type Tile = { entity: string } | { direction: "vertical"; weights: [number, number]; children: [Tile, Tile] };
42
-
43
- function stackedTiles(entities: string[]): Tile {
44
- const [first, ...rest] = entities;
45
- return rest.length === 0 ? { entity: first! } : { direction: "vertical", weights: [1, rest.length], children: [{ entity: first! }, stackedTiles(rest)] };
46
- }
47
-
48
41
  function boardWith(helpers: HelperState[]): LearningState {
49
42
  const working = helpers.some((helper) => helper.status === "working");
50
43
  return { phase: working ? "working" : helpers.some((helper) => helper.status === "error") ? "error" : "complete", helpers };
@@ -72,13 +65,6 @@ export default defineActor(contract, {
72
65
  const actor = await context.functions.agent_spawn({ handle: `learning-${helper.id}`, displayName: helper.label, profile: profile.name, prompt, tools: [] });
73
66
  return { ...helper, actorId: actor.id };
74
67
  }));
75
- await context.functions.canvas_layout_replace({
76
- root: {
77
- direction: "horizontal",
78
- weights: [1, 1],
79
- children: [{ entity: `app:@${context.actor.handle}/main` }, stackedTiles(helpers.map((helper) => `@learning-${helper.id}`))],
80
- },
81
- });
82
68
  await context.functions.run_configure({ title: learningWorkflow.title, primaryActor: `@${context.actor.handle}` });
83
69
  context.state.replace({ board: { phase: "ready", helpers } });
84
70
  return;
@@ -19,7 +19,7 @@ function setup(options: { missingProfile?: boolean; failDispatch?: string; befor
19
19
  const calls: { name: string; input: unknown }[] = [];
20
20
  const history: CapabilityContracts["event_query"]["output"] = [];
21
21
  const functions = Object.fromEntries([
22
- "model_list", "agent_spawn", "canvas_layout_replace", "run_configure", "actor_input", "event_subscribe", "event_unsubscribe", "event_query",
22
+ "model_list", "agent_spawn", "run_configure", "actor_input", "event_subscribe", "event_unsubscribe", "event_query",
23
23
  ].map((name) => [name, async (input: unknown) => {
24
24
  calls.push({ name, input });
25
25
  if (name === "model_list") return { profiles: options.missingProfile ? [] : [{ name: "standard", driver: "agent", description: "Test profile", turnTimeoutMs: null, isolateWorkspace: false, provider: "test", model: "test" }], models: [] };
@@ -2,7 +2,7 @@ import { createTestContext } from "@ragents/server/testing";
2
2
 
3
3
  export const setupContext = (profiles = [{ name: "coordinator", driver: "agent" }, { name: "standard", driver: "agent" }]) => {
4
4
  const calls: { name: string; input: unknown }[] = [];
5
- const functions = Object.fromEntries(["model_list", "agent_spawn", "run_configure", "actor_input", "canvas_layout_replace", "actor_program_activate"].map((name) => [name, (input: unknown) => {
5
+ const functions = Object.fromEntries(["model_list", "agent_spawn", "run_configure", "actor_input", "actor_program_activate"].map((name) => [name, (input: unknown) => {
6
6
  calls.push({ name, input });
7
7
  if (name === "agent_spawn") {
8
8
  const handle = (input as { handle: string }).handle;
@@ -10,5 +10,5 @@ tags: Run scripts, Concept demo, TypeScript actors
10
10
 
11
11
  The start value `{ "text": "..." }` is the note; without one, the script notes when it was
12
12
  started. The script makes the shared notebook active with `actor_program_ensure`, sends it the
13
- note, places the notebook's view with `canvas_layout_place`, and ends the start with
13
+ note and ends the start with
14
14
  `context.finish`. Whether the roster check or this script comes first, the run has one notebook.
@@ -4,7 +4,7 @@ import { Type } from "typebox";
4
4
  const contract = {
5
5
  state: Type.Object({}, { additionalProperties: false }),
6
6
  functions: {},
7
- input: { capabilities: ["actor_program_ensure", "actor_input", "canvas_layout_place"] },
7
+ input: { capabilities: ["actor_program_ensure", "actor_input", ] },
8
8
  } as const;
9
9
 
10
10
  const noteOf = (input: unknown, now: string): string => {
@@ -23,7 +23,6 @@ export default defineActor(contract, {
23
23
  const note = noteOf(start.input, context.std.now());
24
24
  const notebook = await context.functions.actor_program_ensure({ name: "notebook" });
25
25
  await context.functions.actor_input({ actor: `@${notebook.handle}`, content: note });
26
- await context.functions.canvas_layout_place({ entity: "app:notebook/main" });
27
26
  context.finish({ note, notebook: notebook.status }, { summary: `Noted: ${note}` });
28
27
  },
29
28
  });
@@ -11,7 +11,6 @@ const note = (status: "active" | "installed" = "installed") => {
11
11
  const context = createTestContext<Record<string, never>>({ state: {}, functions: {
12
12
  actor_program_ensure: record("actor_program_ensure", { actorId: "id-notebook", handle: "notebook", status }),
13
13
  actor_input: record("actor_input", []),
14
- canvas_layout_place: record("canvas_layout_place", { placed: status === "installed" }),
15
14
  } });
16
15
  return { calls, context };
17
16
  };
@@ -22,7 +21,6 @@ test("sends the note to the shared notebook and reports it", async () => {
22
21
  assert.deepEqual(calls.map((call) => [call.name, call.input]), [
23
22
  ["actor_program_ensure", { name: "notebook" }],
24
23
  ["actor_input", { actor: "@notebook", content: "Ask about the budget" }],
25
- ["canvas_layout_place", { entity: "app:notebook/main" }],
26
24
  ]);
27
25
  assert.deepEqual(context.finished, [{ result: { note: "Ask about the budget", notebook: "installed" }, summary: "Noted: Ask about the budget" }]);
28
26
  });
@@ -11,9 +11,9 @@ tags: Run scripts, Concept demo, TypeScript actors
11
11
  The TypeScript program reads the participants with `actor_list` and ends each start with
12
12
  `context.finish`. The owner reads the summary in the chat; a coordinator that starts it through
13
13
  `run_script_start` receives summary and list as a message. Started inside a running run through the
14
- run menu, `ragents script`, or the coordinator, it changes neither the primary actor nor the tiles,
14
+ run menu, `ragents script`, or the coordinator, it preserves the primary actor,
15
15
  and a repeated start reuses the same actor. Started as a new run, it is the run's only participant.
16
16
 
17
17
  It shares the notebook with the quick note script: `shared-programs: notebook` copies the plugin's
18
18
  shared package into the run, `actor_program_ensure` makes it active once, and
19
- `canvas_layout_place` puts its view next to what is arranged.
19
+ Its visible view enters the app catalog automatically.
@@ -4,7 +4,7 @@ import { Type } from "typebox";
4
4
  const contract = {
5
5
  state: Type.Object({ reports: Type.Optional(Type.Number()) }, { additionalProperties: false }),
6
6
  functions: {},
7
- input: { capabilities: ["actor_list", "actor_program_ensure", "actor_input", "canvas_layout_place"] },
7
+ input: { capabilities: ["actor_list", "actor_program_ensure", "actor_input", ] },
8
8
  } as const;
9
9
 
10
10
  export default defineActor(contract, {
@@ -19,7 +19,6 @@ export default defineActor(contract, {
19
19
  const summary = handles.length === 0 ? "No other participants yet." : `${handles.length} participant${handles.length === 1 ? "" : "s"}: ${handles.join(", ")}.`;
20
20
  const notebook = await context.functions.actor_program_ensure({ name: "notebook" });
21
21
  await context.functions.actor_input({ actor: `@${notebook.handle}`, content: `Roster: ${summary}` });
22
- await context.functions.canvas_layout_place({ entity: "app:notebook/main" });
23
22
  context.state.replace({ reports: (context.state.read().reports ?? 0) + 1 });
24
23
  context.finish({ actors: others.map(({ handle, kind, lifecycle }) => ({ handle, kind, lifecycle })) }, { summary });
25
24
  },
@@ -14,7 +14,6 @@ const roster = (actors: ReturnType<typeof actor>[], state: { reports?: number }
14
14
  actor_list: record("actor_list", actors),
15
15
  actor_program_ensure: record("actor_program_ensure", { actorId: "id-notebook", handle: "notebook", status: "active" as const }),
16
16
  actor_input: record("actor_input", []),
17
- canvas_layout_place: record("canvas_layout_place", { placed: true }),
18
17
  } });
19
18
  return { calls, context };
20
19
  };
@@ -29,7 +28,6 @@ test("reports the other participants as result and summary and notes them in the
29
28
  assert.deepEqual(calls.slice(1).map((call) => [call.name, call.input]), [
30
29
  ["actor_program_ensure", { name: "notebook" }],
31
30
  ["actor_input", { actor: "@notebook", content: "Roster: 2 participants: @coordinator, @helper." }],
32
- ["canvas_layout_place", { entity: "app:notebook/main" }],
33
31
  ]);
34
32
  assert.deepEqual(context.state.read(), { reports: 1 });
35
33
  });
@@ -56,7 +56,7 @@ export default defineActor(contract, {
56
56
  await context.functions.actor_input({
57
57
  actor: "@coordinator",
58
58
  content: `The shared collection is called ${JSON.stringify(title)}. The run script has bound the program shared-list to @${helper.handle}. Its view is visible on the surface; the helper is currently adding the first entry with append_to_list. `
59
- + "Below under Actors, its name opens the inspector with chat and details. Its tile is hidden by default and can be turned on in the Actors list when needed. "
59
+ + "Use the addressee selector to inspect its owner with chat and details. Open the mini-app from the app catalog. "
60
60
  + "Explain to the user in three sentences how to use the visible list, how to open the helper, and that the view and the function share the same list state.",
61
61
  });
62
62
 
@@ -2,7 +2,7 @@ import { createTestContext } from "@ragents/server/testing";
2
2
 
3
3
  export const setupContext = (profiles = [{ name: "coordinator", driver: "agent" }, { name: "standard", driver: "agent" }], suffix = "") => {
4
4
  const calls: { name: string; input: unknown }[] = [];
5
- const functions = Object.fromEntries(["model_list", "agent_spawn", "run_configure", "actor_input", "canvas_layout_replace", "actor_program_activate"].map((name) => [name, (input: unknown) => {
5
+ const functions = Object.fromEntries(["model_list", "agent_spawn", "run_configure", "actor_input", "actor_program_activate"].map((name) => [name, (input: unknown) => {
6
6
  calls.push({ name, input });
7
7
  if (name === "agent_spawn") {
8
8
  const handle = (input as { handle: string }).handle + suffix;
@@ -19,5 +19,5 @@ export const contract = {
19
19
  capabilities: ["actor_input"],
20
20
  },
21
21
  },
22
- input: { capabilities: ["model_list", "agent_spawn", "canvas_layout_replace", "run_configure", "event_subscribe", "event_query", "actor_input"] },
22
+ input: { capabilities: ["model_list", "agent_spawn", "run_configure", "event_subscribe", "event_query", "actor_input"] },
23
23
  } as const;
@@ -37,7 +37,6 @@ export default defineActor(contract, {
37
37
  try {
38
38
  if (!state.status) {
39
39
  await context.functions.run_configure({ title: "Word game", primaryActor: context.actor.id });
40
- await context.functions.canvas_layout_replace({ root: { entity: `app:@${context.actor.handle}/main` } });
41
40
  const start = payloadOf(JSON.parse(input.content));
42
41
  if (start.input !== null || !start.options || typeof start.options !== "object" || Array.isArray(start.options)
43
42
  || Object.keys(start).some((key) => key !== "input" && key !== "options")) {
@@ -26,7 +26,6 @@ function fixture(initialState: WordGameState = {}) {
26
26
  return { id: `actor-${input.handle}`, handle: input.handle };
27
27
  },
28
28
  run_configure: async (input) => { calls.push({ name: "run_configure", input }); return null; },
29
- canvas_layout_replace: async (input) => { calls.push({ name: "canvas_layout_replace", input }); return null; },
30
29
  event_subscribe: async (input) => {
31
30
  calls.push({ name: "event_subscribe", input });
32
31
  return { subscriptionId: "subscription", sources: input.sourceActorIds ?? null };
@@ -190,7 +189,7 @@ test("a missing standard profile shows an error without creating participants",
190
189
  await program.onInput(firstInput, context);
191
190
  assert.equal(context.state.read().status, "error");
192
191
  assert.match(context.state.read().error!, /role standard is missing/);
193
- assert.deepEqual(calls.map((call) => call.name), ["run_configure", "canvas_layout_replace", "model_list"]);
192
+ assert.deepEqual(calls.map((call) => call.name), ["run_configure", "model_list"]);
194
193
  });
195
194
 
196
195
  test("a restored state keeps counting the pending task and rebuilds nothing", async () => {
@@ -6,7 +6,7 @@ title: "Count characters, words, and lines"
6
6
  description: "Shows how the chat and a mini-app use the same TypeScript function and the same call counter. Hiding keeps the actor state."
7
7
  category: "Mini-apps"
8
8
  order: 10
9
- tags: "Use case, Concept demo, TypeScript actors, Actor functions, Actor state, Mini-apps, Automatic view placement, View visibility"
9
+ tags: "Use case, Concept demo, TypeScript actors, Actor functions, Actor state, Mini-apps, View visibility"
10
10
  ---
11
11
 
12
12
  I would like a text analysis with a text field, a count button, and understandable errors. A TypeScript actor counts characters, words, lines, and its calls without AI. Check "The world is big." and "And beautiful." as two lines: 6 words. The interface shows the same call counter. Hide it and show it again; the state is kept. Use shared layout and form building blocks: input and result side by side, stacked when space is tight.
@@ -6,7 +6,7 @@ title: "Hide notes and find them again"
6
6
  description: "Shows an automatically placed mini-app with note selection. When hiding and showing it again, the actor and notes are kept."
7
7
  category: "Mini-apps"
8
8
  order: 90
9
- tags: "Use case, Concept demo, TypeScript actors, Actor functions, Actor state, Mini-apps, Automatic view placement, View visibility"
9
+ tags: "Use case, Concept demo, TypeScript actors, Actor functions, Actor state, Mini-apps, View visibility"
10
10
  ---
11
11
 
12
12
  I would like a TypeScript actor for my notes. Its interface with input and counter should appear on the surface by itself: a searchable list of titles on the left, the selected note on the right. Add a first note through its function. Hide the interface briefly and show it again without deleting the actor or resetting notes. Leave it open for entering my next idea.
@@ -2,25 +2,24 @@ export const referenceWalkthroughs = [
2
2
  {
3
3
  id: "mini-app-owner-inspector",
4
4
  title: "Open the helper behind a mini-app",
5
- description: "The mini-app stays visible as a tile; its owner is reachable even without a tile of its own.",
6
- tags: ["Use case", "Concept demo", "Surface"],
5
+ description: "The app and its owner's chat share one run.",
6
+ tags: ["Use case", "Concept demo", "App navigation"],
7
7
  steps: [
8
- "In the showcase profile, open Set up collection board and complete the guide. Expected: The list is a tile on the surface; its owner has no tile of its own.",
9
- "Open Actors in the header and choose the name of the list owner. Expected: Its chat and details open on the right without changing the tile layout.",
10
- "Drag the owner from the header onto the list tile and dock it on the right. Expected: Its tile appears next to the list; the mini-app stays usable and keeps its entries.",
11
- "Remove the new tile again with the cross in its title bar and use the app again. Expected: The actor and its functions keep working; its name stays reachable in the header.",
8
+ "In the showcase profile, open Set up collection board and complete the guide. Expected: The list is available as a mini-app.",
9
+ "Open Chat and use the addressee selector's inspection action for the list owner. Expected: Its chat and details are available in Inspection.",
10
+ "Open the list app again. Expected: The same app and its entries remain available.",
12
11
  ],
13
12
  },
14
13
  {
15
- id: "personal-tile-arrangement",
16
- title: "Split a conversation circle differently",
17
- description: "Tiles can be rearranged personally and reset to the program default.",
18
- tags: ["Use case", "Concept demo", "Surface"],
14
+ id: "switch-chat-and-apps",
15
+ title: "Switch between chat and apps",
16
+ description: "Browser tabs keep drafts; VS Code opens one editor per app.",
17
+ tags: ["Use case", "Concept demo", "App navigation"],
19
18
  steps: [
20
- "In the showcase profile, run the template Set up conversation circle and wait for the setup. Look at the layout set by the run.",
21
- "Grab a tile by its title bar and dock it at the top edge of another tile. Expected: The layout changes immediately; all conversation partners keep working.",
22
- "Move the divider between two tiles and reload the same run in the same browser. Expected: The personal layout is kept; the actors and the program arrangement are unchanged.",
23
- "Choose Apply program default in the status bar. Expected: The surface shows the run's layout again; the button disappears until there is another change of your own.",
19
+ "Create two mini-apps in one run. Expected: Both become available without changing the selected chat.",
20
+ "In the browser, type an unsent chat draft, open an app and enter local input, then switch to Chat and back. Expected: Exactly one view is visible and both drafts survive.",
21
+ "In VS Code, open an app twice, move its editor to another group and open it again from the panel. Expected: The same editor is focused in its current group.",
22
+ "Hide the selected browser app. Expected: Chat is selected; showing the app again does not change selection. Questions and news remain in chat.",
24
23
  ],
25
24
  },
26
25
  {
@@ -1 +0,0 @@
1
- import{r,S as d,E as p,j as E,c as f}from"./mermaid-HWGCJPDP-CSCkaArr.js";var j=({code:i,language:e,maxHeight:o,raw:a,className:u,startLine:m,lineNumbers:n,...h})=>{let{shikiTheme:l}=r.useContext(d),t=p(),[c,s]=r.useState(a);return r.useEffect(()=>{if(!t){s(a);return}let g=t.highlight({code:i,language:e,themes:l},x=>{s(x)});g&&s(g)},[i,e,l,t,a]),E.jsx(f,{className:u,language:e,lineNumbers:n,maxHeight:o,result:c,startLine:m,...h})};export{j as HighlightedCodeBlockBody};
@@ -1,11 +0,0 @@
1
- import{a as ue,r as s,j as e,D as fe,b as pe,d as ee,B as g,X as Le,M as Ie,C as xe,e as _e,f as Be,g as He,h as Ue,u as Fe,i as qe,k as Te,l as Ke,m as $e,A as We,n as Qe,o as Ve,U as Ge,P as Xe,W as Ye,R as Je,p as le,q as J,s as Ze,t as et,v as tt,w as st,x as nt,y as at,z as rt,Q as ot,F as it,G as lt}from"./mermaid-HWGCJPDP-CSCkaArr.js";/**
2
- * @license lucide-react v1.46.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const me={name:"circle-question-mark",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],aliases:["help-circle","circle-help"]};me.node;const ct=ue(me);/**
7
- * @license lucide-react v1.46.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */const he={name:"sparkles",size:24,node:[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],aliases:["stars"]};he.node;const dt=ue(he);function ut(n,r,a,u){if(!r||n.source!==r||n.origin!==a)return;const o=n.data;if(!(!o||typeof o!="object"||Array.isArray(o))&&"type"in o){if(o.type==="ragents:help-ready")return{type:"ready"};if(o.type==="ragents:start-sample"&&"entry"in o&&typeof o.entry=="string"&&u.includes(o.entry))return{type:"start",entry:o.entry}}}function ft({onClose:n,sampleEntries:r,onStartSample:a}){const u=s.useRef(null),o=s.useRef(null),p=s.useRef(void 0),m=s.useRef(!1);s.useEffect(()=>()=>{var i;return(i=p.current)==null?void 0:i.call(p)},[]),s.useEffect(()=>{var j;const i=(j=o.current)==null?void 0:j.contentWindow;if(!i)return;const l=()=>i.postMessage({type:"ragents:help-context",canStartSamples:r.length>0,entries:r},window.location.origin),h=k=>{const c=ut(k,i,window.location.origin,r);(c==null?void 0:c.type)==="ready"&&l(),(c==null?void 0:c.type)==="start"&&!m.current&&(m.current=!0,a(c.entry))};return window.addEventListener("message",h),l(),()=>window.removeEventListener("message",h)},[a,r]);const x=()=>{var k;(k=p.current)==null||k.call(p);const i=o.current,l=i==null?void 0:i.contentDocument,h=l==null?void 0:l.defaultView;if(!i||!l||!h)return;l.documentElement.dataset.helpEmbedded="true";for(const c of l.querySelectorAll("a[href]"))new URL(c.href).origin!==window.location.origin&&(c.target="_blank",c.rel="noopener noreferrer");const j=c=>{var v;if(!c.defaultPrevented){if(c.key==="Escape")c.preventDefault(),n();else if(c.key==="Tab"){const w=[...l.querySelectorAll("a[href], button, input, select, textarea, summary, [tabindex]")].filter(S=>S.tabIndex>=0&&!S.matches(":disabled")&&S.getClientRects().length>0),L=c.shiftKey?w[0]:w.at(-1);if(!w.length||l.activeElement===L||l.activeElement===l.body){if(!c.shiftKey&&l.activeElement===l.body&&w.length)return;c.preventDefault(),(v=u.current)==null||v.focus()}}}};h.addEventListener("keydown",j),p.current=()=>h.removeEventListener("keydown",j)};return e.jsx(fe,{open:!0,onOpenChange:i=>{i||n()},children:e.jsxs(pe,{className:"gap-0 p-0",initialFocus:u,scope:"page",showCloseButton:!1,size:"full",children:[e.jsx(ee,{className:"sr-only",children:"Help"}),e.jsx(g,{"aria-label":"Close help",className:"absolute top-3 right-4.5 z-1 rounded-full",onClick:n,ref:u,size:"icon",variant:"outline",children:e.jsx(Le,{})}),e.jsx("iframe",{className:"min-h-0 w-full min-w-0 flex-[1_1_0] bg-background",onLoad:x,ref:o,src:"/help/index.html",tabIndex:0,title:"RAgents: homepage and documentation"})]})})}const pt="button:not([disabled]), a[href], input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex='-1'])",ve="pointer-events-auto shadow-pop";function xt({onBusy:n,onClose:r,onOpen:a,open:u,panels:o,registry:p,runs:m}){const x=s.useRef(null);return s.useEffect(()=>{if(!u)return;const i=requestAnimationFrame(()=>{var h;const l=x.current;!l||l.contains(document.activeElement)||(h=l.querySelector(pt))==null||h.focus({preventScroll:!0})});return()=>cancelAnimationFrame(i)},[u]),e.jsxs(Ie,{className:"pointer-events-none flex h-[min(900px,100%)] w-[min(1440px,100%)] flex-col rounded-none bg-transparent p-0 ring-0",keepMounted:!0,onClose:r,open:u,scope:"workspace",size:"full",children:[e.jsx(ee,{className:"sr-only",children:"Overview"}),e.jsxs("div",{className:"flex min-h-0 min-w-0 flex-1 gap-4 max-[900px]:flex-col",id:"app-overview",ref:x,children:[o.map(({id:i,Panel:l})=>e.jsx(mt,{id:i,onBusy:n,onClose:r,onOpen:a,open:u,Panel:l,registry:p},i)),m&&e.jsx(ht,{...m})]})]})}function mt({id:n,onBusy:r,onClose:a,onOpen:u,open:o,Panel:p,registry:m}){const x=s.useCallback(i=>r(n,i),[n,r]);return s.useEffect(()=>()=>r(n,!1),[n,r]),e.jsx(xe,{className:`${ve} min-h-0 min-w-0 flex-1 gap-0 p-0`,children:e.jsx(p,{onBusy:x,onClose:a,onOpen:u,open:o,registry:m})})}function ht({activeId:n,canCreate:r,canDelete:a,onCreate:u,onDelete:o,onOpen:p,registry:m,sessions:x,seenRevisions:i,unreachable:l}){const[h,j]=s.useState(),[k,c]=s.useState(!1),[v,w]=s.useState(()=>new Set),[L,S]=s.useState(!1),[E,B]=s.useState(!1),H=()=>{c(!1),w(new Set)},b=f=>{w(O=>{const I=new Set(O);return I.delete(f)||I.add(f),I})},D=async f=>{B(!0),j(void 0);try{await o(f)}catch(O){j(O instanceof Error?O.message:String(O))}finally{B(!1)}},C=async()=>{await D(x.filter(f=>v.has(f.id)).map(f=>f.id)),S(!1),H()};return e.jsx("section",{"aria-labelledby":"overview-runs-title",className:"flex min-h-0 min-w-0 flex-1 flex-col max-[900px]:flex-[1_1_50%]",children:e.jsxs(xe,{className:`${ve} min-h-0 flex-1 gap-workspace-inset overflow-y-auto overscroll-contain pt-workspace-inset pr-6 pb-6 pl-6 max-[900px]:px-3 max-[900px]:pt-3.5 max-[900px]:pb-4`,children:[e.jsxs("header",{className:"flex flex-wrap items-center gap-x-3.5 gap-y-2.5",children:[e.jsxs("h2",{className:"text-[0.95rem] font-semibold",id:"overview-runs-title",children:["Runs ",e.jsx("span",{className:"ml-1 text-[0.8rem] font-medium tabular-nums text-muted-foreground",children:x.length})]}),l&&e.jsx("span",{className:"text-[0.72rem] font-medium text-destructive",role:"alert",children:"Server unreachable"}),a&&x.length>0&&e.jsx("div",{className:"ml-auto flex flex-wrap items-center gap-1",children:k?e.jsxs(e.Fragment,{children:[e.jsx(g,{onClick:()=>w(new Set(x.map(f=>f.id))),size:"sm",variant:"ghost",children:"All"}),e.jsx(g,{onClick:()=>w(new Set),size:"sm",variant:"ghost",children:"None"}),e.jsxs(g,{className:"ml-auto",disabled:v.size===0||E,onClick:()=>S(!0),size:"sm",variant:"destructive",children:["Delete (",v.size,")"]}),e.jsx(g,{onClick:H,size:"sm",variant:"ghost",children:"Done"})]}):e.jsx(g,{onClick:()=>c(!0),size:"sm",variant:"ghost",children:"Select"})})]}),h&&e.jsx("p",{className:"text-[0.72rem] font-medium text-destructive",role:"alert",children:h}),e.jsx("p",{className:"mb-5.5 text-[0.75rem] text-muted-foreground",children:"By last activity in the run. New activity has come in since you last viewed it."}),e.jsx(_e,{seenRevisions:i,activeId:n,onCreate:r?u:void 0,onDelete:a?f=>void D([f]):void 0,onSelect:p,onToggleSelected:b,registry:m,selectMode:k,selectedIds:v,sessions:x}),L&&e.jsx(fe,{open:!0,onOpenChange:f=>{!f&&!E&&S(!1)},children:e.jsxs(pe,{scope:"page",showCloseButton:!1,size:"small",children:[e.jsxs(Be,{children:[e.jsx(ee,{children:"Delete runs"}),e.jsx(He,{children:v.size===1?"One run will be permanently deleted.":`${v.size} runs will be permanently deleted.`})]}),e.jsxs(Ue,{children:[e.jsx(g,{disabled:E,onClick:()=>S(!1),variant:"outline",children:"Cancel"}),e.jsx(g,{disabled:E,onClick:()=>void C(),children:E?"Deleting ...":`Delete (${v.size})`})]})]})})]})})}const Z="flex min-h-0 min-w-0 flex-1 flex-col",vt="inline-flex w-header min-h-header items-center justify-center border-r border-border text-primary transition-colors duration-100 not-disabled:cursor-pointer hover:not-disabled:bg-accent focus-visible:outline-2 focus-visible:outline-ring/60 focus-visible:-outline-offset-3 aria-expanded:bg-primary aria-expanded:text-primary-foreground aria-pressed:bg-primary aria-pressed:text-primary-foreground disabled:opacity-45";function bt(){var ie;const n=Fe(),r=qe((ie=n.user)==null?void 0:ie.id),a=n.can("runs.read"),u=a&&n.can("runs.write"),o=n.can("runs.inspect"),p=a&&n.can("runs.delete"),m=Te(),x=s.useRef(null),i=s.useRef(null),[l,h]=s.useState(null),[j,k]=s.useState(null),[c,v]=s.useState(null),[w,L]=s.useState(null),[S,E]=s.useState(null),[B,H]=s.useState([]),[b,D]=s.useState(),[C,f]=s.useState(),[O,I]=s.useState(),[U,te]=s.useState(!1),[F,K]=s.useState(!1),[N,se]=s.useState(!1),[$,z]=s.useState(),[ge,we]=s.useState(!1),[ye,je]=s.useState(()=>new Set),[Se,ne]=s.useState(!1),_=s.useRef(void 0),W=s.useRef(!1),M=s.useCallback(()=>{if(!a)return Promise.resolve();if(_.current)return W.current=!0,_.current;const t=async()=>{do{W.current=!1;try{H(await et()),ne(!1)}catch{ne(!0)}}while(W.current)};return _.current=t().finally(()=>{_.current=void 0}),_.current},[a]);s.useEffect(()=>{if(!a||b)return;M();const t=Ke.subscribe($e.channels.runs,{},()=>void M()),d=setInterval(()=>void M(),5e3);return()=>{t(),clearInterval(d)}},[b,a,M]);const A=s.useCallback((t=!1)=>{var d;se(!1),t&&((d=x.current)==null||d.focus({preventScroll:!0}))},[]),Q=s.useCallback(()=>{z(void 0),we(!0),se(!0)},[]),V=s.useCallback(()=>{N?A(!0):Q()},[A,Q,N]);s.useEffect(()=>{const t=d=>{if(d.defaultPrevented||d.repeat||d.altKey||d.shiftKey||d.key.toLowerCase()!=="i"||d.metaKey===d.ctrlKey)return;const R=x.current;!R||R.closest("[inert]")||(d.preventDefault(),V())};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[V]);const G=s.useCallback((t,d)=>je(R=>{if(R.has(t)===d)return R;const P=new Set(R);return d?P.add(t):P.delete(t),P}),[]),ae=B,Ce=ae.find(t=>t.id===C),ke=s.useCallback(()=>{z(void 0),te(!0)},[]),Ne=s.useCallback(()=>K(!1),[]),Re=s.useCallback(()=>{te(!1),requestAnimationFrame(()=>{var t;return(t=i.current)==null?void 0:t.focus()})},[]),Ee=e.jsx(g,{"aria-label":"Open settings",onClick:ke,ref:i,size:"icon-lg",title:"Settings",variant:"ghost",children:e.jsx(tt,{})}),De=t=>{f(t),A(!0)},Oe=()=>{z(void 0),A(!0),D({id:crypto.randomUUID(),title:"New run",updatedAt:Date.now()})},ze=async t=>{const d=await Promise.allSettled(t.map(T=>st(T))),R=t.filter((T,Pe)=>d[Pe].status==="fulfilled");C!==void 0&&R.includes(C)&&f(void 0),await M();const P=d.find(T=>T.status==="rejected");if(P)throw P.reason};if(m.status==="loading")return e.jsx("div",{className:"m-auto p-6 text-muted-foreground",children:"Loading profile."});if(m.status==="failed")return e.jsx("div",{className:"flex h-full",children:e.jsx("main",{className:"relative z-1 flex min-h-0 min-w-0 flex-1 bg-[image:var(--surface-backdrop)]",children:e.jsxs("div",{className:Z,children:[e.jsx("header",{className:"flex min-h-[42px] flex-none items-center gap-3 border-b border-border-soft pr-0.5 pb-2 pl-2.5",children:e.jsx("div",{className:"flex min-w-0 flex-1 items-center gap-3 text-[0.82rem] font-semibold text-foreground",children:"Profile unavailable"})}),e.jsxs(We,{className:"m-auto max-w-[560px] gap-3 p-6",variant:"destructive",children:[e.jsx("p",{children:m.error}),e.jsx(g,{variant:"outline",onClick:()=>window.location.reload(),children:"Reload"})]})]})})});const y=m.registry,X=y.overviewPanels.filter(t=>t.readRight===void 0||n.can(t.readRight)),Y=X.filter(t=>(t.placement??"overview")==="overview"),Ae=X.filter(t=>t.placement==="toolbar"),q=a?X.find(t=>t.placement==="idle"):void 0,Me=a||Y.length>0,re=Y.some(t=>ye.has(t.id)),oe=Qe(a?C:void 0,N,O);return e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsxs("header",{className:"relative z-[80] flex h-header flex-none items-stretch border-b border-border bg-shell shadow-bar",children:[Me&&e.jsx("div",{className:"relative flex flex-none self-stretch",children:e.jsx("button",{"aria-controls":"app-overview","aria-expanded":N,"aria-haspopup":"dialog","aria-keyshortcuts":"Meta+I Control+I","aria-label":N?"Close overview":"Open overview",className:vt,onClick:V,ref:x,title:`Overview (Cmd+I / Ctrl+I)${re?": processing":""}`,type:"button",children:re?e.jsx(Ve,{"aria-hidden":!0,className:"size-[18px]"}):e.jsx(dt,{size:22})})}),Ae.map(({id:t,Panel:d})=>e.jsx(ce,{id:t,onBusy:G,onClose:()=>z(void 0),onOpen:()=>{!U&&!F&&!b&&(A(),z(t))},open:$===t,Panel:d,registry:y,userLocation:oe},t)),e.jsx("div",{"aria-label":"Run title bar",className:"flex min-w-0 flex-1 items-stretch overflow-x-auto no-scrollbar focus-visible:outline-2 focus-visible:outline-ring/60 focus-visible:-outline-offset-3 max-md:in-[header:has([data-slot=overseer-toolbar][data-open=true])]:flex-[0_1_0]",ref:h,role:"region",tabIndex:0}),e.jsx(Ge,{}),e.jsxs("div",{className:"flex min-w-0 flex-[0_1_auto] items-stretch bg-shell has-data-[workspace-state=expanded]:w-[var(--workspace-panel-width,560px)] has-data-[workspace-state=expanded]:border-l has-data-[workspace-state=expanded]:border-border",children:[e.jsx("div",{className:"flex min-w-0 flex-1 empty:hidden",ref:k}),e.jsxs("div",{className:"flex flex-none items-center gap-1.5 px-2 max-md:gap-0.5 max-md:px-1",children:[n.can("settings.read")&&Ee,o&&e.jsx(g,{"aria-haspopup":"dialog","aria-label":"Open help",onClick:()=>{z(void 0),K(!0)},size:"icon-lg",title:"Help",variant:"ghost",children:e.jsx(ct,{})})]})]})]}),e.jsx(Xe,{failures:m.failures}),e.jsx(Ye.Provider,{value:w,children:e.jsx("div",{className:"relative flex min-h-0 flex-1 flex-col",ref:L,children:e.jsxs(Je.Provider,{value:S,children:[e.jsxs("div",{className:"relative flex h-auto min-h-0 flex-1",ref:E,children:[e.jsx("main",{className:"relative z-1 flex min-h-0 min-w-0 flex-1 bg-[image:var(--surface-backdrop)] @container/chat-content",children:a&&C?e.jsx(le,{headerContainer:l,workspaceHeaderContainer:j,statusContainer:c,onLocationChange:I,onViewed:r.markViewed,viewing:!N&&!U&&!F&&!b&&!$,registry:y,session:Ce??{id:C,title:"New run",updatedAt:Date.now()}},C):q?e.jsx("div",{className:Z,children:e.jsx(ce,{id:q.id,onBusy:G,onClose:()=>{},onOpen:()=>{},open:!N&&!U&&!F&&!b&&!$,Panel:q.Panel,registry:y,userLocation:oe},q.id)}):e.jsx("div",{className:Z,children:e.jsx("div",{className:"m-auto text-center text-muted-foreground",children:a?u?"Open the overview at the top left to choose a run or start a new one.":"Open the overview at the top left to choose a run. You have read access.":"No runs are shared with this user account."})})}),ge&&e.jsx(xt,{onOpen:Q,onBusy:G,onClose:()=>A(!0),open:N,panels:Y,registry:y,runs:a?{activeId:C,canCreate:u&&(n.can("runs.create")||y.scriptEntries.some(t=>J(n,t.id))),canDelete:p,onCreate:Oe,onDelete:ze,onOpen:De,registry:y,sessions:ae,seenRevisions:r.revisions,unreachable:Se}:void 0}),b&&e.jsx(le,{onStarted:()=>{f(b.id),D(void 0),M()},registry:y,session:b,startDialog:{onClose:()=>D(void 0),initialEntryId:b.startEntryId}},b.id),U&&e.jsx(Ze,{onClose:Re,registry:y}),o&&F&&e.jsx(ft,{onClose:Ne,sampleEntries:y.scriptEntries.filter(t=>J(n,t.id)).map(t=>t.id),onStartSample:t=>{!J(n,t)||!y.scriptEntries.some(d=>d.id===t)||(K(!1),z(void 0),A(),D({id:crypto.randomUUID(),title:"New run",updatedAt:Date.now(),startEntryId:t}))}})]}),e.jsx("footer",{"aria-label":"Run status bar",className:"relative flex h-statusbar w-full flex-none items-stretch pl-3 before:pointer-events-none before:absolute before:inset-0 before:z-[2] before:border-t before:border-border before:bg-shell before:shadow-status before:backdrop-blur-[16px] before:content-['']",ref:v})]})})})]})}function ce({id:n,onBusy:r,Panel:a,...u}){const o=s.useCallback(p=>r(n,p),[n,r]);return s.useEffect(()=>()=>r(n,!1),[n,r]),e.jsx(a,{...u,onBusy:o})}nt();const be=document.getElementById("root");if(!be)throw new Error("Root element is missing");const de=at.createRoot(be);try{const n=rt(window);de.render(e.jsx(s.StrictMode,{children:e.jsx(ot,{children:e.jsx(it,{children:e.jsx(bt,{})})})}))}catch(n){de.render(e.jsxs(lt,{children:[e.jsx("h1",{className:"my-3 text-[1.5rem]",children:"The view could not be loaded"}),e.jsx("p",{className:"mb-6 leading-normal",role:"alert",children:n instanceof Error?n.message:String(n)}),e.jsx(g,{onClick:()=>window.location.reload(),variant:"outline",children:"Reload"})]}))}