dot-studio 0.0.1 → 0.0.3

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 (148) hide show
  1. package/README.md +20 -200
  2. package/client/assets/ActFrame-BYOBkLYW.js +1 -0
  3. package/client/assets/ActFrame-C_WEt6bv.css +1 -0
  4. package/client/assets/ActInspectorPanel-C3VlS7tB.js +1 -0
  5. package/client/assets/ActInspectorPanel-CE6s6GYv.css +1 -0
  6. package/client/assets/AssistantChat-BOyW0K79.js +1 -0
  7. package/client/assets/AssistantChat-DoVmHvMJ.css +1 -0
  8. package/client/assets/CanvasTerminalFrame-BC-79q9U.css +1 -0
  9. package/client/assets/CanvasTerminalFrame-DxKbexK6.js +4 -0
  10. package/client/assets/CanvasTrackingFrame-DumxhNwg.js +1 -0
  11. package/client/assets/CanvasTrackingFrame-G4rRrfne.css +1 -0
  12. package/client/assets/CanvasWindowFrame-ziJeVfHG.js +1 -0
  13. package/client/assets/DanceBundleEditorFrame-CH8VDUMK.js +1 -0
  14. package/client/assets/DanceBundleEditorFrame-DaLqMflT.css +1 -0
  15. package/client/assets/MarkdownEditorFrame-DVecIZpZ.css +1 -0
  16. package/client/assets/MarkdownEditorFrame-Dwpgs2GX.js +2 -0
  17. package/client/assets/MarkdownRenderer-Cz8A4AgP.js +1 -0
  18. package/client/assets/PublishModal-DUlHz0fT.js +1 -0
  19. package/client/assets/TodoDock-DcVf7zQG.js +1 -0
  20. package/client/assets/WorkspaceToolbar-CXYi_sMD.js +2 -0
  21. package/client/assets/WorkspaceToolbar-CiQvVocC.css +1 -0
  22. package/client/assets/chat-message-visibility-YwJ-AQno.js +11 -0
  23. package/client/assets/dnd-vendor-CIAZE2P2.js +5 -0
  24. package/client/assets/flow-vendor-BZV40eAE.css +1 -0
  25. package/client/assets/flow-vendor-C868rU-6.js +23 -0
  26. package/client/assets/icon-vendor-I2JVIi1s.js +501 -0
  27. package/client/assets/index-BMY4hrBP.js +3 -0
  28. package/client/assets/index-C-vnj9y3.js +1 -0
  29. package/client/assets/index-C9HTqfZw.css +1 -0
  30. package/client/assets/index-CWrv6O3o.js +64 -0
  31. package/client/assets/index-DMS12-Q2.js +8 -0
  32. package/client/assets/index-Dn7t_Y7G.js +1 -0
  33. package/client/assets/index-p-wk7iGH.css +1 -0
  34. package/client/assets/markdown-vendor-BSTcku12.css +10 -0
  35. package/client/assets/markdown-vendor-DnTJ9hmR.js +35 -0
  36. package/client/assets/participant-labels-Cf3qP3GB.js +1 -0
  37. package/client/assets/queries-Dm1jEHfc.js +1 -0
  38. package/client/assets/query-vendor-_taqgrbn.js +1 -0
  39. package/client/assets/react-vendor-DzpMUNDT.js +49 -0
  40. package/client/assets/settings-utils-l7KCS3Ev.js +1 -0
  41. package/client/assets/terminal-vendor-6GBZ9nXN.css +32 -0
  42. package/client/assets/terminal-vendor-D0xRnmbI.js +112 -0
  43. package/client/index.html +13 -3
  44. package/dist/cli.js +25 -3
  45. package/dist/server/app.js +72 -0
  46. package/dist/server/index.js +2 -62
  47. package/dist/server/lib/act-session-policy.js +31 -0
  48. package/dist/server/lib/chat-session.js +101 -0
  49. package/dist/server/lib/config.js +18 -4
  50. package/dist/server/lib/dot-authoring.js +171 -102
  51. package/dist/server/lib/dot-loader.js +9 -8
  52. package/dist/server/lib/dot-login.js +8 -190
  53. package/dist/server/lib/dot-source.js +11 -0
  54. package/dist/server/lib/model-catalog.js +74 -15
  55. package/dist/server/lib/opencode-auth.js +4 -1
  56. package/dist/server/lib/opencode-errors.js +70 -38
  57. package/dist/server/lib/opencode-sidecar.js +5 -2
  58. package/dist/server/lib/project-config.js +8 -0
  59. package/dist/server/lib/runtime-tools.js +46 -8
  60. package/dist/server/lib/safe-mode.js +410 -0
  61. package/dist/server/lib/session-execution.js +81 -0
  62. package/dist/server/lib/sse.js +22 -0
  63. package/dist/server/routes/act-runtime-threads.js +156 -0
  64. package/dist/server/routes/act-runtime-tools.js +157 -0
  65. package/dist/server/routes/act-runtime.js +7 -0
  66. package/dist/server/routes/adapter.js +32 -0
  67. package/dist/server/routes/assets-collection.js +16 -0
  68. package/dist/server/routes/assets-detail.js +38 -0
  69. package/dist/server/routes/assets.js +4 -158
  70. package/dist/server/routes/chat-messages.js +104 -0
  71. package/dist/server/routes/chat-sessions.js +104 -0
  72. package/dist/server/routes/chat-stream.js +15 -0
  73. package/dist/server/routes/chat.js +6 -353
  74. package/dist/server/routes/compile.js +5 -91
  75. package/dist/server/routes/dot-assets.js +77 -0
  76. package/dist/server/routes/dot-core.js +62 -0
  77. package/dist/server/routes/dot-performer.js +80 -0
  78. package/dist/server/routes/dot.js +6 -267
  79. package/dist/server/routes/drafts-collection.js +40 -0
  80. package/dist/server/routes/drafts-dance-bundle.js +113 -0
  81. package/dist/server/routes/drafts-item.js +86 -0
  82. package/dist/server/routes/drafts.js +9 -0
  83. package/dist/server/routes/health.js +18 -33
  84. package/dist/server/routes/opencode-core.js +120 -0
  85. package/dist/server/routes/opencode-file.js +67 -0
  86. package/dist/server/routes/opencode-mcp.js +74 -0
  87. package/dist/server/routes/opencode-provider.js +41 -0
  88. package/dist/server/routes/opencode.js +8 -418
  89. package/dist/server/routes/route-errors.js +10 -0
  90. package/dist/server/routes/safe-actions.js +60 -0
  91. package/dist/server/routes/safe-summary.js +20 -0
  92. package/dist/server/routes/safe.js +7 -0
  93. package/dist/server/routes/workspaces.js +47 -0
  94. package/dist/server/services/act-runtime/act-context-builder.js +81 -0
  95. package/dist/server/services/act-runtime/act-runtime-service.js +313 -0
  96. package/dist/server/services/act-runtime/act-runtime-utils.js +10 -0
  97. package/dist/server/services/act-runtime/act-tool-projection.js +26 -0
  98. package/dist/server/services/act-runtime/act-tools.js +151 -0
  99. package/dist/server/services/act-runtime/board-persistence.js +38 -0
  100. package/dist/server/services/act-runtime/event-logger.js +73 -0
  101. package/dist/server/services/act-runtime/event-router.js +102 -0
  102. package/dist/server/services/act-runtime/mailbox.js +149 -0
  103. package/dist/server/services/act-runtime/safety-guard.js +162 -0
  104. package/dist/server/services/act-runtime/session-queue.js +114 -0
  105. package/dist/server/services/act-runtime/thread-manager.js +351 -0
  106. package/dist/server/services/act-runtime/wake-cascade.js +306 -0
  107. package/dist/server/services/act-runtime/wake-evaluator.js +43 -0
  108. package/dist/server/services/act-runtime/wake-performer-resolver.js +68 -0
  109. package/dist/server/services/act-runtime/wake-prompt-builder.js +77 -0
  110. package/dist/server/services/adapter-view-service.js +6 -0
  111. package/dist/server/services/asset-service.js +366 -0
  112. package/dist/server/services/chat-event-stream-service.js +157 -0
  113. package/dist/server/services/chat-service.js +207 -0
  114. package/dist/server/services/chat-session-service.js +203 -0
  115. package/dist/server/services/compile-service.js +4 -0
  116. package/dist/server/services/dance-bundle-service.js +222 -0
  117. package/dist/server/services/dot-add-service.js +59 -0
  118. package/dist/server/services/dot-service.js +178 -0
  119. package/dist/server/services/draft-service.js +367 -0
  120. package/dist/server/services/opencode-projection/dance-compiler.js +164 -0
  121. package/dist/server/services/opencode-projection/performer-compiler.js +195 -0
  122. package/dist/server/services/opencode-projection/preview-service.js +31 -0
  123. package/dist/server/services/opencode-projection/projection-manifest.js +98 -0
  124. package/dist/server/services/opencode-projection/stage-projection-service.js +188 -0
  125. package/dist/server/services/opencode-service.js +338 -0
  126. package/dist/server/services/safe-service.js +33 -0
  127. package/dist/server/services/studio-assistant/assistant-service.js +172 -0
  128. package/dist/server/services/studio-service.js +69 -0
  129. package/dist/server/services/workspace-service.js +224 -0
  130. package/dist/server/terminal.js +57 -11
  131. package/dist/shared/act-types.js +4 -0
  132. package/dist/shared/adapter-view.js +1 -0
  133. package/dist/shared/asset-contracts.js +1 -0
  134. package/dist/shared/assistant-actions.js +1 -0
  135. package/dist/shared/chat-contracts.js +1 -0
  136. package/dist/shared/dot-contracts.js +1 -0
  137. package/dist/shared/dot-types.js +4 -0
  138. package/dist/shared/draft-contracts.js +2 -0
  139. package/dist/shared/model-types.js +2 -0
  140. package/dist/shared/performer-mcp-portability.js +10 -0
  141. package/dist/shared/safe-mode.js +1 -0
  142. package/dist/shared/session-metadata.js +4 -3
  143. package/package.json +7 -4
  144. package/client/assets/index-C2eIILoa.css +0 -41
  145. package/client/assets/index-DUPZ_Lw5.js +0 -616
  146. package/dist/server/lib/act-runtime.js +0 -1282
  147. package/dist/server/lib/prompt.js +0 -222
  148. package/dist/server/routes/stages.js +0 -137
package/README.md CHANGED
@@ -1,214 +1,34 @@
1
- <p align="center">
2
- <img src="https://img.shields.io/npm/v/dot-studio?style=flat-square&color=ff6b6b" alt="npm version" />
3
- <img src="https://img.shields.io/badge/node-%3E%3D20.19.0-brightgreen?style=flat-square" alt="node version" />
4
- <img src="https://img.shields.io/github/license/dance-of-tal/dance-of-tal?style=flat-square&color=blue" alt="license" />
5
- <img src="https://img.shields.io/badge/PRs-welcome-ff69b4?style=flat-square" alt="PRs welcome" />
6
- </p>
1
+ # Dance of Tal (DOT) Studio
7
2
 
8
- <h1 align="center">🎭 DOT Studio</h1>
3
+ > 🌍 **Public Open Source Repository**
4
+ > **Visual workspace for composing and running Dance of Tal on OpenCode.**
9
5
 
10
- <p align="center">
11
- <strong>The visual workspace for composing and orchestrating AI agents.</strong><br />
12
- Build Performers. Wire Act graphs. Watch them run — node by node.
13
- </p>
6
+ DOT Studio is a local interface and server combo designed for interactively drag-and-dropping Performers and Acts, debugging their memory, and observing autonomous workflows dynamically.
14
7
 
15
- <p align="center">
16
- <a href="https://danceoftal.com/docs/studio">Documentation</a> ·
17
- <a href="https://danceoftal.com">Website</a> ·
18
- <a href="https://github.com/dance-of-tal/dance-of-tal/issues">Report Bug</a> ·
19
- <a href="https://github.com/dance-of-tal/dance-of-tal/issues">Request Feature</a>
20
- </p>
8
+ ## Architecture
21
9
 
22
- ---
10
+ - **Frontend**: React 19, Vite, `@xyflow/react`, `zustand`, `@dnd-kit`.
11
+ - **Backend / Engine**: Node.js running Hono (`hono/node-server`), interfacing directly with `@opencode-ai/sdk`.
12
+ - **Contracts**: Depends closely on `dance-of-tal` to serialize and validate canonical asset URNs in the form `kind/@owner/stage/name`.
13
+ - **Workspace Persistence**: Saved local working directories are treated as Studio workspaces and are persisted through the workspace API and Studio config.
23
14
 
24
- ## Why DOT Studio?
15
+ ## Development Setup
25
16
 
26
- Most AI tools bury agent behavior behind hidden prompts and opaque configs. DOT Studio makes agent composition **visible, editable, and reusable**.
27
-
28
- Website: [danceoftal.com](https://danceoftal.com)
29
-
30
- - 🎨 **Performers are workspace objects** — not hidden prompt presets
31
- - 🔀 **Acts are first-class graphs** — not ad-hoc routing conventions
32
- - 👁️ **Everything stays visible** — execution history, thread sessions, performer bindings
33
- - 🔌 **MCP assignment is explicit** — project-scoped and inspectable
34
-
35
- > **Not just a prettier chat shell.** Studio treats agent behavior as structured workspace state.
36
-
37
- ---
38
-
39
- ## ✨ Features
40
-
41
- <table>
42
- <tr>
43
- <td width="50%">
44
-
45
- ### 🎭 Performer Composer
46
-
47
- Connect **Tal** (identity layer) and **Dance** (skill context) assets, choose models, assign MCP servers, and preview the compiled prompt envelope — all on a visual canvas.
48
-
49
- </td>
50
- <td width="50%">
51
-
52
- ### 🔀 Act Editor
53
-
54
- Build multi-node AI workflows with **worker**, **orchestrator**, and **parallel** nodes. Set entry points, wire flow and branch edges, and inspect everything directly on the graph.
55
-
56
- </td>
57
- </tr>
58
- <tr>
59
- <td width="50%">
60
-
61
- ### 🧵 Thread Runner
62
-
63
- Execute acts and watch output unfold **node-by-node** in real time. Keep node sessions alive across a thread for iterative workflows.
64
-
65
- </td>
66
- <td width="50%">
67
-
68
- ### 📦 Draft & Publish
69
-
70
- Create Tal and Dance drafts on the canvas, save them locally, and publish through the DOT registry — without leaving Studio.
71
-
72
- </td>
73
- </tr>
74
- </table>
75
-
76
- ---
77
-
78
- ## 🧬 Core Concepts
79
-
80
- | Concept | Description |
81
- |:---|:---|
82
- | **Tal** | The always-on instruction layer — identity, rules, and baseline behavior |
83
- | **Dance** | Optional skill or capability context, loaded on demand |
84
- | **Performer** | A runnable composition of Tal + Dance + model + agent mode + MCP bindings |
85
- | **Act** | A directed workflow graph of worker, orchestrator, and parallel nodes |
86
- | **Stage** | The saved Studio workspace state for a project |
87
-
88
- ---
89
-
90
- ## 🚀 Quick Start
91
-
92
- ### One-liner
93
-
94
- ```bash
95
- npx dot-studio .
96
- ```
97
-
98
- ### Global install
99
-
100
- ```bash
101
- npm install -g dot-studio
102
- dot-studio .
103
- ```
104
-
105
- > **Flags:** `dot-studio [projectDir]` · `dot-studio --no-open [projectDir]` · `dot-studio --port 3005 [projectDir]`
106
- >
107
- > If no port is specified, DOT Studio starts from `3001` and automatically picks the next free port when that port is already in use.
108
- >
109
- > When you launch the published CLI interactively, it checks npm for a newer `dot-studio` version and asks whether to update before starting.
110
-
111
- ---
112
-
113
- ## 🛠️ Development
114
-
115
- ### Prerequisites
116
-
117
- - **Node.js** `≥ 20.19.0` (repo pins `22.22.1` via `.nvmrc`)
118
- - macOS or Linux recommended
119
-
120
- ### Setup
17
+ The workspace runs a vite frontend and a Node backend simultaneously, connecting to a locally spawned `opencode` server on port 4096.
121
18
 
122
19
  ```bash
20
+ # 1. Install dependencies
123
21
  npm install
124
- npm run dev:all
125
- ```
126
-
127
- This spins up three processes:
128
-
129
- | Service | URL |
130
- |:---|:---|
131
- | Vite (client) | `http://localhost:5173` |
132
- | Hono (API) | `http://localhost:3001` |
133
- | OpenCode (runtime) | `http://localhost:4096` |
134
-
135
- > The Vite dev server proxies `/api` and `/ws` — browser traffic stays same-origin.
136
-
137
- ### Commands
138
-
139
- ```bash
140
- npm run dev # Client only
141
- npm run server # API server only
142
- npm run type-check # Full type checking
143
- npm run build:all # Production build
144
- ```
145
-
146
- ### Packaging
147
-
148
- ```bash
149
- npm run type-check
150
- npm run pack:check
151
- npm pack
152
- ```
153
-
154
- Smoke test:
155
- ```bash
156
- npx dot-studio --no-open <projectDir>
157
- ```
158
-
159
- ---
160
-
161
- ## 🏗️ Architecture
162
22
 
23
+ # 2. Start the integrated dev environment (Vite + Hono Server + OpenCode)
24
+ npm run dev:all
163
25
  ```
164
- studio/
165
- ├── src/ # React app, canvas components, state slices
166
- ├── server/ # Hono routes, OpenCode integration, act runtime
167
- ├── shared/ # Cross-runtime helpers and metadata utilities
168
- ├── client/ # Built browser assets (generated)
169
- └── cli.ts # CLI entry point
170
- ```
171
-
172
- ### Runtime Boundaries
173
-
174
- ```mermaid
175
- graph LR
176
- A["🎨 Studio"] -->|stage state, UX, prompt assembly| B["📦 dance-of-tal"]
177
- A -->|model execution, sessions, tools| C["⚡ OpenCode"]
178
- B -->|asset formats, registry semantics| D["🌐 Registry"]
179
- ```
180
-
181
- > Studio is the **workspace layer** — it orchestrates UX and state, while OpenCode owns the actual model runtime.
182
-
183
- ---
184
-
185
- ## 🧰 Tech Stack
186
-
187
- | Layer | Technology |
188
- |:---|:---|
189
- | Frontend | React 19, Zustand, React Flow, Vite |
190
- | Backend | Hono, tsx |
191
- | Orchestration | XState |
192
- | AI Runtime | OpenCode SDK |
193
- | Asset System | dance-of-tal |
194
-
195
- ---
196
-
197
- ## 🤝 Contributing
198
-
199
- Contributions are welcome! Here's how to get started:
200
-
201
- 1. Fork the repo and create your branch from `main`
202
- 2. Run `npm run type-check` before pushing
203
- 3. Keep runtime behavior aligned with DOT asset semantics
204
- 4. Treat OpenCode as the execution authority — don't re-implement it in Studio
205
-
206
- ## 📄 License
207
26
 
208
- [MIT](./LICENSE) © [monarchjuno](https://github.com/monarchjuno)
27
+ ## Available Scripts
209
28
 
210
- ---
29
+ - `npm run dev:all` - Runs the client, the local backend orchestrator, and an OpenCode node.
30
+ - `npm run build` - Compiles the React client and the backend TS.
31
+ - `npm run pack:check` - Validates the bundle process.
211
32
 
212
- <p align="center">
213
- Built with 🎭 by the <a href="https://danceoftal.com">Dance of Tal</a> community
214
- </p>
33
+ ## Developers & Agents
34
+ Are you working on extending or modifying this code? Please read the internal `.agent/README.md` strict contract rules.
@@ -0,0 +1 @@
1
+ import{j as e,r}from"./react-vendor-DzpMUNDT.js";import{u as _e}from"./flow-vendor-C868rU-6.js";import{a as se,u as g,l as re,b as be,c as te,v as je,w as ge,x as ve,y as Ne,B as ye,z as Ce,J as ae,K as ke,F as Te,G as Ee,M as Ae}from"./index-CWrv6O3o.js";import{C as Se}from"./CanvasWindowFrame-ziJeVfHG.js";import{ab as ze,f as Pe,X as $e,P as G,E as Re,ag as Me,ah as ce,ai as Fe,af as De,aj as Le,ak as we,ad as Ke,al as Be,B as q,am as ne,a5 as qe,p as He,U as Ue,k as Ve,W as Y,a as Ie}from"./icon-vendor-I2JVIi1s.js";import{T as Qe,b as We,h as Oe,a as Ge,C as Ye}from"./chat-message-visibility-YwJ-AQno.js";import{r as Q}from"./participant-labels-Cf3qP3GB.js";import{u as Xe,T as Je,P as Ze,Q as es}from"./TodoDock-DcVf7zQG.js";import"./query-vendor-_taqgrbn.js";import"./dnd-vendor-CIAZE2P2.js";import"./markdown-vendor-DnTJ9hmR.js";import"./terminal-vendor-D0xRnmbI.js";import"./MarkdownRenderer-Cz8A4AgP.js";function ss(s){return s?s.runnable?s.issues.length>0?"act-frame__readiness-dot--warning":"act-frame__readiness-dot--ok":"act-frame__readiness-dot--error":""}function ts(s){if(!s)return"";if(!s.runnable){const n=s.issues.find(i=>i.severity==="error");return n?n.message:"Act is not runnable"}return s.issues.length>0?"Runnable with warnings":"Ready to run"}function as({focused:s,editing:n,readiness:i,onToggleFocus:h,onToggleEdit:E,onHide:k}){return e.jsxs("div",{className:"act-frame__header-actions",children:[!s&&i&&e.jsx("span",{className:`act-frame__readiness-dot ${ss(i)}`,title:ts(i)}),e.jsx("button",{className:`icon-btn act-frame__focus-btn ${s?"active":""}`,title:s?"Exit focus mode":"Focus mode",onClick:f=>{f.stopPropagation(),h()},children:s?e.jsx(ze,{size:11}):e.jsx(Pe,{size:11})}),!s&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:`icon-btn act-frame__edit-btn ${n?"active":""}`,title:n?"Exit edit mode":"Edit Act",onClick:f=>{f.stopPropagation(),E()},children:n?e.jsx($e,{size:11}):e.jsx(G,{size:11})}),e.jsx("button",{className:"icon-btn act-frame__close-btn",title:"Hide Act",onClick:f=>{f.stopPropagation(),k()},children:e.jsx(Re,{size:11})})]})]})}const W={all:"All",artifact:"Artifacts",fact:"Facts",task:"Tasks"},ns={open:"open",in_progress:"in progress",done:"done"};function is(s){return typeof s.key!="string"||typeof s.content!="string"?null:{id:typeof s.id=="string"?s.id:String(s.key),key:s.key,kind:["artifact","fact","task","note"].includes(s.kind)?s.kind:"note",author:typeof s.author=="string"?s.author:"unknown",content:s.content,version:typeof s.version=="number"?s.version:1,timestamp:typeof s.timestamp=="number"?s.timestamp:Date.now(),pinned:!!s.pinned,locked:!!s.locked,status:["open","in_progress","done"].includes(s.status)?s.status:void 0}}function rs(s,n){return{id:typeof s.id=="string"?s.id:`evt-${n}`,type:typeof s.type=="string"?s.type:"unknown",source:typeof s.source=="string"?s.source:"runtime",timestamp:typeof s.timestamp=="number"?s.timestamp:Date.now(),payload:s.payload&&typeof s.payload=="object"?s.payload:{}}}function O(s){const n=Math.max(0,Math.floor((Date.now()-s)/1e3));if(n<10)return"just now";if(n<60)return`${n}s ago`;const i=Math.floor(n/60);if(i<60)return`${i}m ago`;const h=Math.floor(i/60);return h<24?`${h}h ago`:`${Math.floor(h/24)}d ago`}function cs(s){const{type:n,source:i,payload:h}=s;switch(n){case"message.sent":return`${i} → ${h.to}${h.tag?` [${h.tag}]`:""}`;case"board.posted":case"board.updated":return`${i} updated "${h.key}"`;case"runtime.idle":return"Runtime idle";default:return`${i}: ${n}`}}function os(s){switch(s){case"message.sent":case"message.delivered":return e.jsx(Be,{size:9});case"board.posted":case"board.updated":return e.jsx(Ke,{size:9});case"runtime.idle":return e.jsx(we,{size:9});default:return e.jsx(Le,{size:9})}}function ls({actId:s,threadId:n}){const[i,h]=r.useState([]),[E,k]=r.useState([]),[f,D]=r.useState("all"),[z,L]=r.useState(new Set),[P,$]=r.useState(!1),[R,A]=r.useState(null),v=r.useCallback(async()=>{$(!0);try{const[a,p]=await Promise.all([se.actRuntime.readBoard(s,n),se.actRuntime.events(s,n,10)]);h((a.entries||[]).map(is).filter(c=>c!==null).sort((c,N)=>N.timestamp-c.timestamp)),k((p.events||[]).map((c,N)=>rs(c,N)).filter(c=>c!==null).slice(0,10)),A(Date.now())}catch(a){console.error("[ActBoardView] Failed to load board data",a)}finally{$(!1)}},[s,n]);r.useEffect(()=>{v()},[v]),r.useEffect(()=>{const a=setInterval(v,5e3);return()=>clearInterval(a)},[v]);const M=r.useMemo(()=>f==="all"?i:i.filter(a=>a.kind===f),[i,f]),l=r.useMemo(()=>{const a={all:i.length};for(const p of i)a[p.kind]=(a[p.kind]||0)+1;return a},[i]),d=r.useCallback(a=>{L(p=>{const c=new Set(p);return c.has(a)?c.delete(a):c.add(a),c})},[]);return e.jsxs("div",{className:"act-board",children:[e.jsxs("div",{className:"act-board__header",children:[e.jsx("div",{className:"act-board__tabs",role:"tablist","aria-label":"Board filters",children:Object.keys(W).map(a=>e.jsxs("button",{className:`act-board__tab ${f===a?"act-board__tab--active":""}`,onClick:()=>D(a),role:"tab","aria-selected":f===a,children:[e.jsx("span",{children:W[a]}),(l[a]||0)>0&&e.jsx("span",{className:"act-board__tab-count",children:l[a]})]},a))}),e.jsxs("div",{className:"act-board__toolbar",children:[R&&e.jsx("span",{className:"act-board__freshness",children:O(R)}),e.jsx("button",{className:"icon-btn act-board__refresh-btn",onClick:v,disabled:P,title:"Refresh",children:e.jsx(Me,{size:10,className:P?"spinning":""})})]})]}),M.length===0?e.jsxs("div",{className:"act-board__empty",children:[e.jsx(ce,{size:20,className:"act-board__empty-icon"}),e.jsx("span",{children:i.length===0?"No shared notes yet":`No ${W[f].toLowerCase()} found`}),e.jsx("span",{className:"act-board__empty-hint",children:"Participants can post shared notes using the update_shared_board tool during collaboration."})]}):e.jsx("div",{className:"act-board__cards scroll-area",children:M.map(a=>{const p=z.has(a.key),c=a.content.length>200;return e.jsxs("div",{className:"act-board__card",children:[e.jsxs("div",{className:"act-board__card-header",children:[e.jsx("span",{className:`act-board__badge act-board__badge--${a.kind}`,children:a.kind}),a.kind==="task"&&a.status&&e.jsxs("span",{className:"act-board__task-status",children:[e.jsx("span",{className:`act-board__task-dot act-board__task-dot--${a.status}`}),e.jsx("span",{className:`act-board__task-label--${a.status}`,children:ns[a.status]})]}),e.jsx("span",{className:"act-board__card-title",children:a.key}),e.jsx("span",{className:"act-board__card-author",children:a.author})]}),e.jsx("div",{className:`act-board__card-content ${p?"act-board__card-content--expanded":""}`,children:a.content}),c&&e.jsx("button",{className:"act-board__expand-btn",onClick:()=>d(a.key),children:p?"Show less":"Show more"}),e.jsxs("div",{className:"act-board__card-footer",children:[a.pinned&&e.jsx(Fe,{size:8,className:"act-board__pin"}),e.jsxs("span",{children:["v",a.version]}),e.jsx("span",{children:"·"}),e.jsx("span",{children:O(a.timestamp)})]})]},a.id)})}),E.length>0&&e.jsxs("div",{className:"act-board__activity",children:[e.jsxs("div",{className:"act-board__activity-header",children:[e.jsx(De,{size:9}),e.jsx("span",{children:"Recent Activity"})]}),e.jsx("div",{className:"act-board__activity-list scroll-area",children:E.map(a=>e.jsxs("div",{className:"act-board__activity-item",children:[e.jsx("span",{className:"act-board__activity-icon",children:os(a.type)}),e.jsx("span",{className:"act-board__activity-copy",children:cs(a)}),e.jsx("span",{className:"act-board__activity-time",children:O(a.timestamp)})]},a.id))})]})]})}const ds=[],us=[];function ie(s,n,i){return`act:${s}:thread:${n}:participant:${i}`}function hs({actId:s}){const{acts:n,performers:i,sendActMessage:h,abortChat:E,actThreads:k,activeThreadId:f,activeThreadParticipantKey:D,selectThreadParticipant:z,openActEditor:L,createThread:P,selectThread:$,loadThreads:R,respondToPermission:A,respondToQuestion:v,rejectQuestion:M}=g(),l=r.useMemo(()=>n.find(t=>t.id===s),[n,s]),[d,a]=r.useState(""),p=r.useRef(null),c=r.useRef(null),[N,S]=r.useState(!1),T=r.useMemo(()=>l?re(l,i):{runnable:!1,issues:[]},[l,i]),m=(k[s]||[]).find(t=>t.id===f)||null;r.useEffect(()=>{R(s)},[s,R]);const y=l?Object.keys(l.participants):[],K=!!m&&D===null,u=K?null:D||y[0]||null,o=u&&m?ie(s,m.id,u):null,F=g(t=>o?be(t,o):ds),b=g(t=>o?te(t,o):!1),j=g(t=>o?je(t,o):null),oe=g(t=>j?ge(t,j):us),J=g(t=>j?ve(t,j):null),le=g(t=>j?Ne(t,j):null),de=b||!!J,{isResponding:Z,permissionRequest:ee,questionRequest:H,handlePermissionDecide:ue,handleQuestionRespond:he,handleQuestionReject:me}=Xe({sessionId:j,permissionRequest:J,questionRequest:le,respondToPermission:A,respondToQuestion:v,rejectQuestion:M}),fe=r.useCallback(()=>{j&&g.setState(t=>{const x={...t.todos},_={...t.seTodos};return delete x[j],o&&delete x[o],delete _[j],{todos:x,seTodos:_}})},[j,o]),U=r.useMemo(()=>u?Q(l,u,i):null,[l,u,i]),V=r.useMemo(()=>{if(!l||!u)return null;const t=l.participants[u];if(!t)return null;const x=t.performerRef;return x.kind==="draft"?i.find(_=>{var C;return _.id===x.draftId||((C=_.meta)==null?void 0:C.derivedFrom)===`draft:${x.draftId}`})||null:i.find(_=>{var C;return((C=_.meta)==null?void 0:C.derivedFrom)===x.urn})||null},[l,u,i]),w=ye((V==null?void 0:V.model)||null),pe=r.useCallback(async()=>{if(!(!T.runnable||N)){S(!0);try{const t=await P(s);$(s,t)}finally{S(!1)}}},[T.runnable,N,P,s,$]),I=r.useCallback(async()=>{if(!d.trim()||b||!m||!u||!w)return;const t=d.trim();a(""),await h(s,m.id,u,t)},[d,b,m,u,w,h,s]),xe=r.useCallback(t=>{t.nativeEvent.isComposing||t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),I())},[I]);if(!l)return null;const B=y.length===0;return e.jsxs("div",{className:"act-chat",children:[m&&e.jsxs("div",{className:"act-chat__filters",children:[e.jsxs("button",{className:`act-chat__filter-tab ${K?"act-chat__filter-tab--active":""}`,onClick:()=>z(null),children:[e.jsx(ce,{size:10}),e.jsx("span",{children:"Board"})]}),y.length===1?e.jsxs("button",{className:`act-chat__filter-tab ${u===y[0]?"act-chat__filter-tab--active":""}`,onClick:()=>z(y[0]),children:[e.jsx(q,{size:10}),e.jsx("span",{children:Q(l,y[0],i)}),b&&u===y[0]&&e.jsx(ne,{size:6,className:"act-chat__loading-dot"})]}):y.map(t=>{const x=u===t,_=m?ie(s,m.id,t):null,C=_&&g.getState().chatKeyToSession[_]?te(g.getState(),_):!1;return e.jsxs("button",{className:`act-chat__filter-tab ${x?"act-chat__filter-tab--active":""}`,onClick:()=>z(t),children:[e.jsx(q,{size:10}),e.jsx("span",{children:Q(l,t,i)}),C&&e.jsx(ne,{size:5,className:"act-chat__loading-dot"})]},t)})]}),K&&m?e.jsx(ls,{actId:s,threadId:m.id}):e.jsx(Qe,{messages:F,loading:b,renderMessage:(t,x)=>{var _,C;return t.role==="user"&&!Oe(t)||t.role==="assistant"&&!Ge(t)?null:e.jsx("div",{className:`thread-msg thread-msg--${t.role}`,"data-scrollable":!0,children:t.role==="user"?e.jsx("div",{className:"user-input-box",children:e.jsx("span",{className:"user-input-text",children:t.content})}):t.role==="system"?e.jsxs("div",{className:`act-chat__system ${(_=t.metadata)!=null&&_.isWakeUp?"act-chat__system--wakeup":""}`,children:[((C=t.metadata)==null?void 0:C.isWakeUp)&&e.jsx(Y,{size:10}),t.content]}):e.jsx(Ye,{message:t})},t.id||x)},renderEmpty:()=>e.jsx("div",{className:"act-chat__empty",children:B?e.jsxs(e.Fragment,{children:[e.jsx(Ue,{size:20,className:"act-chat__empty-icon"}),e.jsx("strong",{children:"No participants bound"}),e.jsx("span",{children:"Enter edit mode to connect performers on the canvas."}),e.jsxs("button",{className:"act-chat__action-btn",onClick:()=>L(s,"act"),children:[e.jsx(G,{size:11})," Edit Act"]})]}):T.runnable?m?w?e.jsxs(e.Fragment,{children:[e.jsx(q,{size:20,className:"act-chat__empty-icon"}),e.jsxs("strong",{children:["Chat with ",U||u]}),e.jsx("span",{children:"Send a message below to start the conversation."})]}):e.jsxs(e.Fragment,{children:[e.jsx(q,{size:20,className:"act-chat__empty-icon"}),e.jsx("strong",{children:"Model not configured"}),e.jsxs("span",{children:["Set up a model for “",U||u,"” in the performer editor."]})]}):e.jsxs(e.Fragment,{children:[e.jsx(Y,{size:20,className:"act-chat__empty-icon"}),e.jsx("strong",{children:"Ready to run"}),e.jsx("span",{children:"Create a thread to start the act runtime."}),e.jsxs("button",{className:"act-chat__action-btn",onClick:()=>void pe(),disabled:N,children:[e.jsx(Ie,{size:11})," ",N?"Creating…":"Create Thread"]})]}):e.jsxs(e.Fragment,{children:[e.jsx(Ve,{size:20,className:"act-chat__empty-icon"}),e.jsx("strong",{children:"Act is not ready to run"}),e.jsx("div",{className:"act-chat__issues",children:T.issues.filter(t=>t.severity==="error").map((t,x)=>e.jsx("span",{className:"act-chat__issue-item",children:t.message},x))}),e.jsxs("button",{className:"act-chat__action-btn",onClick:()=>L(s,"act"),children:[e.jsx(G,{size:11})," Edit Act"]})]})}),renderLoading:()=>e.jsx("div",{className:"thread-msg thread-msg--assistant","data-scrollable":!0,children:e.jsx("div",{className:"assistant-body",children:e.jsx(We,{text:"Thinking",active:!0})})}),endRef:p,composer:e.jsxs(e.Fragment,{children:[e.jsx(Je,{todos:oe,isLive:de,onClear:fe}),e.jsxs("div",{className:"chat-input",children:[e.jsxs("div",{className:"chat-input__main",children:[e.jsx("textarea",{ref:c,value:d,onChange:t=>{a(t.target.value),t.target.style.height="0",t.target.style.height=`${t.target.scrollHeight}px`,t.target.style.overflowY=t.target.scrollHeight>102?"auto":"hidden"},onKeyDown:xe,placeholder:B?"Add performers first…":T.runnable?m?w?`Message ${U??u??"participant"}…`:"Configure a model for this performer…":"Create a thread to start…":"Resolve readiness issues first…",rows:1,disabled:B||!T.runnable||!m||!w||b,className:"text-input"}),b?e.jsx("button",{className:"send-btn abort",onClick:()=>o&&E(o),title:"Abort generation",children:e.jsx(qe,{size:12,fill:"currentColor"})}):e.jsx("button",{className:"send-btn",onClick:()=>void I(),disabled:!d.trim()||B||!T.runnable||!m||!w,children:e.jsx(He,{size:12})})]}),ee?e.jsx(Ze,{request:ee,responding:Z,onDecide:ue}):null,H?e.jsx(es,{request:H,responding:Z,onRespond:he,onReject:me},H.id):null]})]})})]})}function ms({actId:s}){return e.jsx(hs,{actId:s})}function As({data:s,id:n}){const{acts:i,performers:h,selectedActId:E,actEditorState:k,selectAct:f,openActEditor:D,closeActEditor:z,toggleActVisibility:L,activeThreadId:P,actThreads:$,focusedPerformerId:R,focusSnapshot:A,enterFocusMode:v,exitFocusMode:M}=g(),l=r.useRef(null),d=r.useMemo(()=>i.find(o=>o.id===n),[i,n]),a=r.useMemo(()=>d?re(d,h):{runnable:!1,issues:[]},[d,h]),p=E===n,c=(k==null?void 0:k.actId)===n,N=Ce(A,R),S=(A==null?void 0:A.type)==="act"&&N===n,T=s.width||(d==null?void 0:d.width)||ae,X=ke(d==null?void 0:d.height),{fitView:m}=_e();r.useEffect(()=>{const o=l.current;if(!o)return;const F=b=>{b.stopPropagation()};return o.addEventListener("wheel",F,{passive:!0}),()=>o.removeEventListener("wheel",F)},[]);const y=()=>f(n),K=()=>{if(c){z();return}D(n,"act")},u=r.useCallback(()=>{if(S){M(),Te(m);return}v(n,"act",Ee())},[v,M,n,S,m]);return d?e.jsx("div",{className:"act-frame-shell",children:e.jsx(Se,{className:`act-frame nowheel ${p?"act-frame--selected":""} ${c?"act-frame--editing":""} ${S?"canvas-frame--focused":""} act-frame--chat`,width:T,height:X,resizable:p,focused:S,minWidth:ae,minHeight:Ae,transformActive:p&&s.transformActive||!1,onActivateTransform:s.onActivateTransform,onDeactivateTransform:s.onDeactivateTransform,selected:p,headerStart:e.jsxs("div",{className:"act-frame__title",onClick:y,children:[e.jsx(Y,{size:12,className:"act-frame__icon"}),e.jsx("span",{className:"act-frame__name",children:d.name}),(()=>{const o=$[n]||[],F=o.findIndex(b=>b.id===P);return o.length>0&&F>=0?e.jsxs("span",{className:"act-frame__thread-chip",children:["#",F+1]}):null})()]}),headerEnd:e.jsx(as,{focused:S,editing:c,readiness:a,onToggleFocus:u,onToggleEdit:K,onHide:()=>L(n)}),bodyClassName:"nowheel nodrag",bodyRef:l,children:e.jsx(ms,{actId:n})})}):null}export{As as default};
@@ -0,0 +1 @@
1
+ .act-frame__header-actions{display:flex;align-items:center;gap:2px}.act-frame__readiness-dot{width:7px;height:7px;border-radius:50%;margin-right:4px;flex-shrink:0;background:var(--text-secondary, #888);transition:background .2s}.act-frame__readiness-dot--ok{background:#34d399}.act-frame__readiness-dot--warning{background:#fbbf24}.act-frame__readiness-dot--error{background:#f87171}.act-frame__focus-btn,.act-frame__edit-btn,.act-frame__close-btn{opacity:.5;transition:opacity .15s}.act-frame__focus-btn:hover,.act-frame__edit-btn:hover,.act-frame__close-btn:hover{opacity:1}.act-frame__edit-btn.active,.act-frame__focus-btn.active{opacity:1;color:var(--act-accent)}.act-frame__activity-btn{opacity:.5;transition:opacity .15s,color .15s}.act-frame__activity-btn:hover{opacity:1}.act-frame__activity-btn.active{opacity:1;color:var(--act-accent)}.act-board{display:flex;flex-direction:column;height:100%;overflow:hidden;background:var(--bg-panel)}.act-board__header{display:flex;flex-direction:column;align-items:stretch;gap:0;padding:0;border-bottom:1px solid var(--border-main);flex-shrink:0;background:var(--bg-panel)}.act-board__tabs{display:flex;flex-wrap:wrap;align-items:stretch;gap:0;min-width:0;padding:0 var(--space-2)}.act-board__tab{display:inline-flex;align-items:center;flex:0 0 auto;gap:3px;justify-content:center;padding:8px 10px 7px;font-size:var(--font-sm);font-weight:600;border:none;border-bottom:2px solid transparent;background:transparent;color:var(--text-muted);cursor:pointer;white-space:nowrap;transition:all .12s ease}.act-board__tab:hover{color:var(--text-primary)}.act-board__tab--active{color:var(--accent);border-bottom-color:var(--accent)}.act-board__tab-count{font-size:8px;min-width:14px;opacity:.72;flex-shrink:0}.act-board__toolbar{display:inline-flex;align-items:center;justify-content:flex-end;gap:var(--space-2);padding:6px var(--space-3);flex-shrink:0;white-space:nowrap;border-top:1px solid var(--border-light)}.act-board__refresh-btn{width:22px;height:22px}.act-board__freshness{font-size:var(--font-xs);color:var(--text-muted);opacity:.8;white-space:nowrap}.act-board__cards{flex:1;overflow-y:auto;padding:var(--space-3);display:flex;flex-direction:column;gap:var(--space-2);min-height:0}.act-board__card{background:var(--bg-card);border:1px solid var(--border-main);border-radius:var(--radius);padding:var(--space-3);transition:border-color .15s ease,background .15s ease;cursor:default}.act-board__card:hover{border-color:var(--border-main);background:color-mix(in srgb,var(--bg-hover) 38%,var(--bg-card))}.act-board__card-header{display:flex;align-items:center;gap:var(--space-1);margin-bottom:var(--space-1)}.act-board__card-title{font-size:var(--font-base);font-weight:600;color:var(--text-primary);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.act-board__card-author{font-size:var(--font-xs);color:var(--text-muted);white-space:nowrap;flex-shrink:0}.act-board__badge{display:inline-flex;align-items:center;justify-content:center;padding:2px 6px;font-size:8px;font-weight:600;border-radius:999px;letter-spacing:.3px;text-transform:uppercase;flex-shrink:0;border:1px solid transparent}.act-board__badge--artifact{background:var(--model-bg);color:var(--model-color);border-color:color-mix(in srgb,var(--model-color) 20%,transparent)}.act-board__badge--fact{background:color-mix(in srgb,var(--accent) 12%,transparent);color:var(--accent);border-color:color-mix(in srgb,var(--accent) 20%,transparent)}.act-board__badge--task{background:var(--status-warning-bg);color:var(--status-warning);border-color:color-mix(in srgb,var(--status-warning) 20%,transparent)}.act-board__badge--note{background:color-mix(in srgb,var(--text-muted) 15%,transparent);color:var(--text-secondary);border-color:color-mix(in srgb,var(--text-muted) 18%,transparent)}.act-board__task-status{display:inline-flex;align-items:center;gap:3px;font-size:8px;font-weight:500}.act-board__task-dot{width:5px;height:5px;border-radius:50%}.act-board__task-dot--open{background:var(--text-muted)}.act-board__task-dot--in_progress{background:var(--accent)}.act-board__task-dot--done{background:#22c55e}.act-board__task-label--open{color:var(--text-muted)}.act-board__task-label--in_progress{color:var(--accent)}.act-board__task-label--done{color:#22c55e}.act-board__card-content{font-size:var(--font-sm);color:var(--text-secondary);line-height:1.5;overflow:hidden;display:-webkit-box;line-clamp:3;-webkit-line-clamp:3;-webkit-box-orient:vertical}.act-board__card-content--expanded{line-clamp:unset;-webkit-line-clamp:unset;display:block;white-space:pre-wrap}.act-board__expand-btn{display:inline-flex;align-items:center;width:fit-content;font-size:var(--font-xs);color:var(--accent);background:none;border:none;cursor:pointer;padding:0;margin-top:2px}.act-board__expand-btn:hover{text-decoration:underline}.act-board__card-footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-2);margin-top:var(--space-1);font-size:8px;color:var(--text-muted)}.act-board__card-footer span{opacity:.7}.act-board__pin{color:var(--status-warning);opacity:.8}.act-board__activity{border-top:1px solid var(--border-main);flex-shrink:0;background:color-mix(in srgb,var(--bg-hover) 32%,var(--bg-panel))}.act-board__activity-list{max-height:124px;overflow-y:auto}.act-board__activity-header{display:flex;align-items:center;gap:var(--space-1);padding:6px var(--space-3);font-size:var(--font-xs);font-weight:600;color:var(--text-muted);border-bottom:1px solid var(--border-light)}.act-board__activity-item{display:flex;align-items:center;gap:var(--space-2);padding:5px var(--space-3);font-size:var(--font-xs);color:var(--text-secondary);line-height:1.4}.act-board__activity-item:hover{background:var(--bg-hover)}.act-board__activity-icon{flex-shrink:0;color:var(--text-muted)}.act-board__activity-copy{min-width:0;flex:1}.act-board__activity-time{margin-left:auto;font-size:8px;color:var(--text-muted);opacity:.6;flex-shrink:0}.act-board__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;gap:var(--space-2);padding:32px var(--space-6);color:var(--text-muted);font-size:var(--font-base);text-align:center}.act-board__empty-icon{opacity:.3}.act-board__empty-hint{font-size:var(--font-xs);max-width:200px;line-height:1.5}@media(max-width:720px){.act-board__toolbar{justify-content:space-between;flex-wrap:wrap}.act-board__card-header{flex-wrap:wrap}}.act-chat{display:flex;flex-direction:column;height:100%;overflow:hidden}.act-chat__filters{display:flex;gap:2px;padding:4px 8px;border-bottom:1px solid var(--border-main);background:var(--bg-hover);overflow-x:auto;flex-shrink:0}.act-chat__filter-tab{display:inline-flex;align-items:center;gap:3px;padding:2px 8px;font-size:10px;border:1px solid var(--border-main);border-radius:10px;background:var(--bg-panel);color:var(--text-secondary);cursor:pointer;white-space:nowrap;transition:all .15s ease}.act-chat__filter-tab:hover{background:var(--bg-selected);color:var(--text-primary)}.act-chat__filter-tab--active{background:var(--accent);color:#fff;border-color:var(--accent)}.act-chat__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:32px 16px;color:var(--text-secondary);font-size:11px;text-align:center}.act-chat__empty strong{font-size:12px;color:var(--text-primary);font-weight:600}.act-chat__empty-icon{opacity:.35;margin-bottom:4px}.act-chat__system{padding:4px 8px;font-size:10px;color:var(--text-secondary);font-style:italic;background:var(--bg-hover);border-radius:4px}.act-chat__composer{border-top:1px solid var(--border-main);padding:6px 8px;flex-shrink:0}.act-chat__entry-label{display:inline-flex;align-items:center;gap:3px;font-size:9px;color:var(--accent);padding:1px 6px;border-radius:8px;background:color-mix(in srgb,var(--accent) 12%,transparent);white-space:nowrap}.act-chat__input-row{display:flex;align-items:flex-end;gap:6px}.act-chat__input{flex:1;resize:none;border:1px solid var(--border-main);border-radius:6px;padding:6px 8px;font-size:11px;line-height:1.4;background:var(--bg-main);color:var(--text-primary);font-family:inherit;min-height:28px;max-height:80px;overflow-y:auto}.act-chat__input:focus{outline:none;border-color:var(--accent)}.act-chat__input:disabled{opacity:.5;cursor:not-allowed}.act-chat__send-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;border:none;background:var(--accent);color:#fff;cursor:pointer;flex-shrink:0;transition:opacity .15s}.act-chat__send-btn:disabled{opacity:.4;cursor:not-allowed}.act-chat__send-btn:hover:not(:disabled){opacity:.85}.act-chat__thread-bar{display:flex;align-items:center;gap:3px;padding:3px 8px;border-bottom:1px solid var(--border-main);overflow-x:auto;flex-shrink:0}.act-chat__thread-tab{display:inline-flex;align-items:center;gap:3px;padding:2px 7px;font-size:9px;border:1px solid var(--border-light);border-radius:8px;background:transparent;color:var(--text-muted);cursor:pointer;white-space:nowrap;transition:all .12s ease}.act-chat__thread-tab:hover{background:var(--bg-hover);color:var(--text-secondary)}.act-chat__thread-tab--active{background:color-mix(in srgb,var(--accent) 15%,transparent);border-color:color-mix(in srgb,var(--accent) 40%,var(--border-light));color:var(--accent)}.act-chat__thread-tab--add{border-style:dashed;opacity:.6}.act-chat__thread-tab--add:hover{opacity:1}.act-chat__create-btn{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;font-size:10px;border:1px dashed var(--border-main);border-radius:6px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:all .15s ease;margin-top:4px}.act-chat__create-btn:hover{background:var(--bg-hover);border-color:var(--accent);color:var(--text-primary)}.act-chat__system--wakeup{display:flex;align-items:flex-start;gap:4px;background:color-mix(in srgb,var(--accent) 8%,var(--bg-hover));border-left:2px solid var(--accent);color:var(--text-primary);font-style:normal}.act-chat__status-dot{display:inline-block;width:5px;height:5px;border-radius:50%;flex-shrink:0}.act-chat__status--active{background:var(--status-success, #22c55e);box-shadow:0 0 4px var(--status-success, #22c55e)}.act-chat__status--done{background:var(--text-muted, #6b7280)}.act-chat__status--idle{background:var(--status-warning)}.act-chat__performer-label{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;font-size:10px;color:var(--text-secondary)}.act-chat__loading-dot{color:var(--accent);animation:act-pulse 1.2s ease-in-out infinite;fill:currentColor}@keyframes act-pulse{0%,to{opacity:.3}50%{opacity:1}}.act-chat__action-btn{display:inline-flex;align-items:center;gap:4px;padding:5px 12px;margin-top:4px;font-size:11px;font-weight:500;border:1px solid var(--border-main);border-radius:6px;background:transparent;color:var(--text-primary);cursor:pointer;transition:all .15s ease}.act-chat__action-btn:hover{background:var(--bg-hover);border-color:var(--accent);color:var(--accent)}.act-chat__action-btn:disabled{opacity:.5;cursor:not-allowed}.act-chat__issues{display:flex;flex-direction:column;gap:3px;margin-top:2px}.act-chat__issue-item{font-size:10px;color:var(--status-danger, #ef4444);line-height:1.4}.act-frame{--act-accent: #f59e0b}.act-frame-shell{position:relative;width:100%;height:100%}.act-frame-shell--drop-over .canvas-frame{box-shadow:0 0 0 2px color-mix(in srgb,var(--act-accent) 65%,white)}.act-frame__title{display:flex;align-items:center;gap:6px;cursor:pointer;-webkit-user-select:none;user-select:none;min-width:0}.act-frame__icon{color:var(--act-accent);flex-shrink:0}.act-frame__name{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:30px}.act-frame__thread-chip{font-size:9px;font-weight:600;padding:1px 5px;border-radius:4px;background:color-mix(in srgb,var(--act-accent) 15%,transparent);color:var(--act-accent);white-space:nowrap;flex-shrink:0;max-width:80px;overflow:hidden;text-overflow:ellipsis}.act-frame__meta{display:flex;align-items:center;gap:4px;padding:4px 8px}.act-frame__badge{font-size:10px;padding:1px 6px;border-radius:3px;background:var(--bg-elevated);color:var(--text-secondary);white-space:nowrap}.act-frame__badge--mode{background:#f59e0b1f;color:var(--act-accent)}.act-frame__edit-body{flex:1;display:flex;flex-direction:column;padding:8px;overflow:auto;min-height:200px;background:repeating-linear-gradient(0deg,transparent,transparent 19px,var(--border-subtle, rgba(128, 128, 128, .06)) 19px,var(--border-subtle, rgba(128, 128, 128, .06)) 20px),repeating-linear-gradient(90deg,transparent,transparent 19px,var(--border-subtle, rgba(128, 128, 128, .06)) 19px,var(--border-subtle, rgba(128, 128, 128, .06)) 20px);border-radius:0 0 6px 6px}.act-frame__empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:var(--text-muted);font-size:11px;-webkit-user-select:none;user-select:none}.act-frame__empty-state svg{opacity:.3}.act-frame--editing{box-shadow:0 0 0 2px #f59e0b40}.act-frame--chat{box-shadow:0 0 0 1px #f59e0b26}.act-frame:not(.act-frame--selected){box-shadow:0 0 0 1px #f59e0b14;background:color-mix(in srgb,var(--bg-panel) 96%,var(--act-accent) 4%)}.act-frame__chat-btn{opacity:.5;transition:opacity .15s}.act-frame__chat-btn:hover{opacity:1}.act-frame__chat-btn.icon-btn--active{opacity:1;color:var(--act-accent)}.act-frame__handle{width:8px!important;height:8px!important;background:var(--bg-panel)!important;border:1.5px solid var(--act-accent)!important;border-radius:50%!important}.act-frame__handle:hover{background:var(--act-accent)!important}
@@ -0,0 +1 @@
1
+ import{r as p,j as e,b as V}from"./react-vendor-DzpMUNDT.js";import{u as N,l as P}from"./index-CWrv6O3o.js";import{r as f}from"./participant-labels-Cf3qP3GB.js";import{y as L,z as B,m as K,b as F,B as E,I as k,J as U,x as O,k as W,K as $,T as Q,N as q,X as G,o as H}from"./icon-vendor-I2JVIi1s.js";import"./query-vendor-_taqgrbn.js";import"./flow-vendor-C868rU-6.js";import"./dnd-vendor-CIAZE2P2.js";import"./markdown-vendor-DnTJ9hmR.js";import"./terminal-vendor-D0xRnmbI.js";function v({text:h}){const[l,n]=p.useState(!1),[m,_]=p.useState({top:0,left:0}),r=p.useRef(null),d=p.useCallback(()=>{if(!r.current)return;const s=r.current.getBoundingClientRect();_({top:s.bottom+6,left:Math.max(8,s.left+s.width/2-100)}),n(!0)},[]),u=p.useCallback(()=>n(!1),[]);return p.useEffect(()=>{if(!l)return;const s=()=>n(!1);return window.addEventListener("scroll",s,!0),()=>window.removeEventListener("scroll",s,!0)},[l]),e.jsxs(e.Fragment,{children:[e.jsx("span",{ref:r,className:"act-panel__tip-icon",onMouseEnter:d,onMouseLeave:u,children:e.jsx(L,{size:10})}),l&&V.createPortal(e.jsx("div",{className:"act-panel__tip-popup",style:{top:m.top,left:m.left},children:h}),document.body)]})}const J=[{key:"maxEvents",label:"Max Events",tooltip:"Total event limit for the thread. The runtime halts when this is exceeded.",defaultValue:500,unit:"events",min:10,max:5e3,step:10},{key:"maxMessagesPerPair",label:"Max Messages per Pair",tooltip:"Maximum messages between any two participants per thread. Prevents runaway conversations.",defaultValue:50,unit:"messages",min:5,max:500,step:5},{key:"maxBoardUpdatesPerKey",label:"Max Board Updates per Key",tooltip:"Maximum updates to a single shared board key. Prevents infinite update loops.",defaultValue:100,unit:"updates",min:5,max:500,step:5},{key:"quietWindowMs",label:"Idle Quiet Window",tooltip:"Seconds of inactivity before the runtime considers participants idle.",defaultValue:60,unit:"seconds",min:10,max:600,step:10,displayDivisor:1e3},{key:"loopDetectionThreshold",label:"Loop Detection",tooltip:"Number of rapid back-and-forth alternations that triggers a loop circuit-breaker.",defaultValue:5,unit:"alternations",min:2,max:50,step:1},{key:"threadTimeoutMs",label:"Thread Timeout",tooltip:"Maximum thread lifetime in minutes. The thread is interrupted after this duration.",defaultValue:30,unit:"minutes",min:1,max:120,step:1,displayDivisor:6e4}];function X({actId:h}){const l=N(a=>a.acts.find(i=>i.id===h)),n=N(a=>a.updateActSafety),[m,_]=p.useState(!1);if(!l)return null;const r=l.safety||{},d=p.useCallback((a,i,c)=>{const x=Math.max(c.min,Math.min(c.max,i)),o=c.displayDivisor?x*c.displayDivisor:x,j={...r,[a]:o},b=c.displayDivisor?c.defaultValue*c.displayDivisor:c.defaultValue;o===b&&delete j[a];const y=Object.keys(j).length>0;n(h,y?j:void 0)},[r,h,n]),u=a=>{const i=r[a.key];return i==null?a.defaultValue:a.displayDivisor?Math.round(i/a.displayDivisor):i},s=Object.keys(r).length>0;return e.jsxs("div",{className:"act-panel__section",children:[e.jsxs("label",{className:"act-panel__label",onClick:()=>_(!m),style:{cursor:"pointer",display:"flex",alignItems:"center",gap:4,userSelect:"none"},children:[e.jsx(B,{size:11}),"Safety",s&&e.jsx("span",{style:{opacity:.5,fontSize:"0.85em"},children:"(customized)"}),m?e.jsx(K,{size:11}):e.jsx(F,{size:11})]}),m&&e.jsxs("div",{className:"act-safety__fields",children:[J.map(a=>{const i=u(a);return e.jsxs("div",{className:"act-safety__field",children:[e.jsx("div",{className:"act-safety__field-header",children:e.jsxs("span",{className:"act-safety__field-label",children:[a.label,e.jsx(v,{text:a.tooltip})]})}),e.jsxs("div",{className:"act-safety__input-row",children:[e.jsx("input",{type:"number",className:"act-panel__input act-panel__input--number",min:a.min,max:a.max,step:a.step,value:i,onChange:c=>d(a.key,Number(c.target.value),a)}),e.jsx("span",{className:"act-safety__unit",children:a.unit})]})]},a.key)}),s&&e.jsx("button",{className:"act-safety__reset",onClick:()=>n(h,void 0),children:"Reset to defaults"})]})]})}function S(){var R,z,M;const{acts:h,performers:l,actEditorState:n,renameAct:m,updateActAuthoringMeta:_,updateActDescription:r,openActRelationEditor:d}=N(),u=N(t=>t.updateActRules),s=(n==null?void 0:n.actId)||null,a=h.find(t=>t.id===s);if(!a||!s)return null;const i=((R=a.meta)==null?void 0:R.authoring)||{},[c,x]=p.useState(a.name),[o,j]=p.useState(a.description||i.description||""),[b,y]=p.useState(""),A=Object.keys(a.participants);p.useEffect(()=>{var t,g;x(a.name),j(a.description||((g=(t=a.meta)==null?void 0:t.authoring)==null?void 0:g.description)||"")},[a.name,a.description,(M=(z=a.meta)==null?void 0:z.authoring)==null?void 0:M.description]);const D=()=>{c.trim()&&c!==a.name&&m(s,c.trim())},T=()=>{r(s,o),_(s,{...a.meta,authoring:{...i,description:o}})},C=p.useMemo(()=>P(a,l),[a,l]);return e.jsxs("div",{className:"act-panel__content",children:[e.jsxs("div",{className:"act-panel__section",children:[e.jsxs("label",{className:"act-panel__label",children:["Name",e.jsx(v,{text:"The Act name is visible to all participant agents. Use a clear, descriptive name so agents can understand the workflow context."})]}),e.jsx("input",{className:"act-panel__input",value:c,onChange:t=>x(t.target.value),onBlur:D,onKeyDown:t=>t.key==="Enter"&&D()})]}),e.jsxs("div",{className:"act-panel__section",children:[e.jsxs("label",{className:"act-panel__label",children:["Description",e.jsx(v,{text:"This description is injected into each participant agent's context. Write a clear purpose statement so agents understand what this workflow does and how they should collaborate."})]}),e.jsx("textarea",{className:"act-panel__textarea",value:o,onChange:t=>j(t.target.value),onBlur:T,placeholder:"Describe the workflow this Act performs",rows:3})]}),e.jsxs("div",{className:"act-panel__section",children:[e.jsx("label",{className:"act-panel__label",children:"Summary"}),e.jsxs("div",{className:"act-panel__stat-grid",children:[e.jsxs("div",{className:"act-panel__stat",children:[e.jsx(E,{size:12}),e.jsxs("span",{children:[A.length," participants"]})]}),e.jsxs("div",{className:"act-panel__stat",children:[e.jsx(k,{size:12}),e.jsxs("span",{children:[a.relations.length," relations"]})]})]})]}),e.jsxs("div",{className:"act-panel__section",children:[e.jsxs("label",{className:"act-panel__label",children:["Participants",e.jsx(v,{text:"Each participant is an agent in this workflow. Participant names are visible to other agents for messaging and collaboration."})]}),A.length>0?e.jsx("div",{className:"act-panel__list",children:A.map(t=>e.jsxs("div",{className:"act-panel__edge-link",children:[e.jsx("span",{className:"act-panel__edge-dir",children:"●"}),e.jsx("span",{className:"act-panel__edge-target",children:f(a,t,l)})]},t))}):e.jsx("div",{className:"act-panel__list",children:e.jsx("span",{className:"act-panel__empty",children:"No participants bound yet"})})]}),e.jsxs("div",{className:"act-panel__section",children:[e.jsxs("label",{className:"act-panel__label",children:["Relations",e.jsx(v,{text:"Relations define communication channels between participants. Agents use relation names and descriptions to decide how and when to send messages."})]}),a.relations.length>0?e.jsx("div",{className:"act-panel__list",children:a.relations.map(t=>e.jsxs("button",{className:"act-panel__edge-link",onClick:()=>d(s,t.id),title:"Edit relation",children:[e.jsx("span",{className:"act-panel__edge-dir",children:t.direction==="both"?"↔":"→"}),e.jsxs("span",{className:"act-panel__edge-target",children:[f(a,t.between[0],l)," · ",f(a,t.between[1],l)]}),e.jsx("span",{className:"act-panel__edge-badge",children:t.name||"relation"})]},t.id))}):e.jsx("span",{className:"act-panel__empty",children:"No relations yet"})]}),e.jsxs("div",{className:"act-panel__section",children:[e.jsxs("label",{className:"act-panel__label",children:["Act Rules",e.jsx(v,{text:"Global rules injected into every participant agent's context. Use these for cross-cutting constraints like 'All code must have tests' or 'Communicate in Korean'."})]}),e.jsx("div",{className:"act-panel__tags",children:(a.actRules||[]).map((t,g)=>e.jsxs("span",{className:"act-panel__tag",onClick:()=>{const w=(a.actRules||[]).filter((Z,I)=>I!==g);u(s,w)},children:[t," ×"]},g))}),e.jsx("div",{className:"act-panel__sub-input-row",children:e.jsx("input",{className:"act-panel__input act-panel__input--small",value:b,onChange:t=>y(t.target.value),onKeyDown:t=>{t.key==="Enter"&&b.trim()&&(u(s,[...a.actRules||[],b.trim()]),y(""))},placeholder:"Add rule (e.g. 'All code must have tests')"})})]}),C.issues.length>0&&e.jsxs("div",{className:"act-panel__section",children:[e.jsx("label",{className:"act-panel__label",children:C.runnable?e.jsxs(e.Fragment,{children:[e.jsx(U,{size:11})," Readiness"]}):e.jsxs(e.Fragment,{children:[e.jsx(O,{size:11})," Readiness"]})}),e.jsx("div",{className:"act-panel__validation",children:C.issues.map((t,g)=>e.jsxs("div",{className:`act-panel__validation-item act-panel__validation-item--${t.severity}`,onClick:()=>{var w;((w=t.focus)==null?void 0:w.mode)==="relation"&&t.focus.relationId&&d(s,t.focus.relationId)},style:{cursor:t.focus?"pointer":void 0},children:[t.severity==="error"?e.jsx(W,{size:10,style:{flexShrink:0}}):e.jsx("span",{className:"act-panel__validation-dot"}),t.message]},g))})]}),e.jsx(X,{actId:s}),i.tags&&i.tags.length>0&&e.jsxs("div",{className:"act-panel__section",children:[e.jsx("label",{className:"act-panel__label",children:"Tags"}),e.jsx("div",{className:"act-panel__tags",children:i.tags.map((t,g)=>e.jsx("span",{className:"act-panel__tag",children:t},g))})]})]})}function Y(){const{acts:h,performers:l,actEditorState:n,updateRelation:m,removeRelation:_,openActEditor:r}=N(),d=(n==null?void 0:n.actId)||null,u=(n==null?void 0:n.mode)==="relation"?n.relationId:null,s=h.find(o=>o.id===d),a=s==null?void 0:s.relations.find(o=>o.id===u),[i,c]=p.useState({});if(p.useEffect(()=>{a&&c({name:a.name,description:a.description,direction:a.direction})},[a]),!a||!s||!d||!u)return null;const x=(o,j)=>{c(b=>({...b,[o]:j})),m(d,u,{[o]:j})};return e.jsxs("div",{className:"act-panel__content",children:[e.jsxs("div",{className:"act-panel__item-header",children:[e.jsx("button",{className:"icon-btn",title:"Back to Act Config",onClick:()=>r(d,"act"),children:e.jsx($,{size:12})}),e.jsx(k,{size:14,className:"act-panel__item-icon"}),e.jsxs("span",{className:"act-panel__item-name act-panel__item-name--edge",children:[f(s,a.between[0],l)," ↔ ",f(s,a.between[1],l)]}),e.jsx("button",{className:"icon-btn act-panel__danger-btn",title:"Delete relation",onClick:()=>{_(d,u),r(d,"act")},children:e.jsx(Q,{size:12})})]}),e.jsxs("div",{className:"act-panel__section",children:[e.jsxs("label",{className:"act-panel__label",children:[e.jsx(q,{size:11})," Name",e.jsx(v,{text:"The relation name is used by agents to identify this communication channel. Use a clear, machine-readable name like 'code_review' or 'design_feedback'."})]}),e.jsx("input",{className:"act-panel__input",value:i.name||"",onChange:o=>x("name",o.target.value),placeholder:"communication_channel_name"})]}),e.jsxs("div",{className:"act-panel__section",children:[e.jsxs("label",{className:"act-panel__label",children:["Description",e.jsx(v,{text:"This description is injected into each participant's agent context. Write a clear purpose statement so agents understand when and how to use this communication channel."})]}),e.jsx("textarea",{className:"act-panel__textarea",value:i.description||"",onChange:o=>x("description",o.target.value),placeholder:"Describe the purpose of this relation so agents know when to use it.",rows:3})]}),e.jsxs("div",{className:"act-panel__section",children:[e.jsxs("label",{className:"act-panel__label",children:[e.jsx(k,{size:11})," Direction",e.jsx(v,{text:"'Both' allows messaging in either direction. 'One-way' restricts communication to the arrow direction only."})]}),e.jsxs("div",{className:"act-panel__toggle-group",children:[e.jsx("button",{className:`act-panel__toggle ${i.direction==="both"?"active":""}`,onClick:()=>x("direction","both"),children:"Both"}),e.jsx("button",{className:`act-panel__toggle ${i.direction==="one-way"?"active":""}`,onClick:()=>x("direction","one-way"),children:"One-way"})]})]})]})}function re(){const{acts:h,actEditorState:l,closeActEditor:n}=N();if(!l)return null;const m=h.find(s=>s.id===l.actId)||null,_=l.mode,r={act:{icon:e.jsx(H,{size:12}),label:"Act Config"},participant:{icon:e.jsx(E,{size:12}),label:"Participant Binding"},relation:{icon:e.jsx(k,{size:12}),label:"Relation"}},{icon:d,label:u}=r[_];return e.jsxs("div",{className:"act-panel",children:[e.jsxs("div",{className:"act-panel__header",children:[e.jsxs("div",{className:"act-panel__header-copy",children:[d,e.jsx("span",{children:u}),m?e.jsx("strong",{className:"act-panel__header-name",children:m.name}):null]}),e.jsx("button",{className:"icon-btn act-panel__close-btn",title:"Close Act Inspector",onClick:n,children:e.jsx(G,{size:12})})]}),_==="act"&&e.jsx(S,{}),_==="participant"&&e.jsx(S,{}),_==="relation"&&e.jsx(Y,{})]})}export{re as default};
@@ -0,0 +1 @@
1
+ .act-panel{position:absolute;top:60px;right:8px;z-index:50;width:280px;max-height:calc(100% - 64px);overflow-y:auto;background:var(--bg-panel);border:1px solid var(--border-main);border-radius:10px;box-shadow:var(--shadow-dropdown);font-size:12px}.act-panel::-webkit-scrollbar{width:4px}.act-panel::-webkit-scrollbar-thumb{background:var(--border-main);border-radius:2px}.act-panel__header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid var(--border-main);font-size:11px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.4px}.act-panel__header-copy{display:flex;align-items:center;gap:6px;min-width:0}.act-panel__header-name{color:var(--text-primary);font-size:11px;font-weight:600;text-transform:none;letter-spacing:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.act-panel__close-btn{opacity:.6;transition:opacity .15s,color .15s}.act-panel__close-btn:hover{opacity:1;color:var(--accent)}.act-panel__content{padding:4px 0}.act-panel__section{padding:8px 14px}.act-panel__section--half{flex:1;min-width:0}.act-panel__row{display:flex;gap:0}.act-panel__row .act-panel__section{padding:8px 14px}.act-panel__row .act-panel__section:first-child{padding-right:6px}.act-panel__row .act-panel__section:last-child{padding-left:6px}.act-panel__label{display:flex;align-items:center;gap:4px;font-size:10px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.3px;margin-bottom:5px}.act-panel__label--checkbox{cursor:pointer;font-size:12px;text-transform:none;font-weight:500;color:var(--text-primary)}.act-panel__label--checkbox input[type=checkbox]{margin-right:6px;accent-color:var(--accent)}.act-panel__hint{display:block;font-size:10px;color:var(--text-muted);margin-top:4px;font-style:italic}.act-panel__tip-icon{display:inline-flex;align-items:center;color:var(--text-muted);cursor:help;opacity:.6;transition:opacity .15s;margin-left:2px}.act-panel__tip-icon:hover{opacity:1;color:var(--accent)}.act-panel__tip-popup{position:fixed;z-index:9999;width:200px;padding:6px 10px;font-size:11px;font-weight:400;text-transform:none;letter-spacing:0;line-height:1.45;color:#fff;background:#1e1e1ef2;border-radius:6px;box-shadow:0 4px 12px #00000040;pointer-events:none;white-space:normal;word-wrap:break-word;animation:tipFadeIn .15s ease forwards}@keyframes tipFadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.act-panel__input{width:100%;box-sizing:border-box;padding:6px 8px;font-size:12px;background:var(--bg-hover);border:1px solid var(--border-main);border-radius:6px;color:var(--text-primary);outline:none;transition:border-color .15s;font-family:inherit}.act-panel__input:focus{border-color:var(--accent)}.act-panel__input--number{font-variant-numeric:tabular-nums}.act-panel__textarea{width:100%;box-sizing:border-box;padding:6px 8px;font-size:12px;background:var(--bg-hover);border:1px solid var(--border-main);border-radius:6px;color:var(--text-primary);outline:none;resize:vertical;font-family:inherit;transition:border-color .15s;min-height:52px}.act-panel__textarea:focus{border-color:var(--accent)}.act-panel__textarea::placeholder,.act-panel__input::placeholder{color:var(--text-muted)}.act-panel__empty{font-size:11px;color:var(--text-muted);font-style:italic}.act-safety__fields{display:flex;flex-direction:column;gap:10px}.act-safety__field{display:flex;flex-direction:column;gap:4px}.act-safety__field-header{display:flex;justify-content:space-between;align-items:baseline}.act-safety__field-label{display:flex;align-items:center;gap:3px;font-size:11px;color:var(--text-primary);font-weight:500}.act-safety__field-value{font-size:10px;color:var(--text-muted);font-variant-numeric:tabular-nums}.act-safety__input-row{display:flex;align-items:center;gap:6px}.act-safety__input-row .act-panel__input{width:100px;text-align:right}.act-safety__unit{font-size:10px;color:var(--text-muted);white-space:nowrap}.act-safety__slider{width:100%;height:4px;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:var(--border-main);border-radius:2px;outline:none;cursor:pointer}.act-safety__slider::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;border-radius:50%;background:var(--accent);cursor:pointer;transition:transform .1s}.act-safety__slider::-webkit-slider-thumb:hover{transform:scale(1.2)}.act-safety__range-labels{display:flex;justify-content:space-between;font-size:9px;color:var(--text-muted);opacity:.6}.act-safety__reset{margin-top:4px;padding:4px 8px;font-size:10px;background:none;border:1px solid var(--border-main);border-radius:4px;color:var(--text-muted);cursor:pointer;transition:border-color .15s,color .15s;align-self:flex-start}.act-safety__reset:hover{border-color:var(--accent);color:var(--text-primary)}.act-panel__item-header{display:flex;align-items:center;gap:6px;padding:10px 14px;border-bottom:1px solid color-mix(in srgb,var(--border-main) 50%,transparent)}.act-panel__item-icon{color:var(--accent);flex-shrink:0}.act-panel__item-name{flex:1;font-size:13px;font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.act-panel__item-name:hover{color:var(--accent)}.act-panel__item-name--edge{cursor:default;font-size:12px}.act-panel__item-name--edge:hover{color:var(--text-primary)}.act-panel__inline-edit{flex:1;font-size:13px;font-weight:600;padding:2px 4px;border:1px solid var(--accent);border-radius:4px;background:var(--bg-hover);color:var(--text-primary);outline:none;min-width:0}.act-panel__danger-btn{flex-shrink:0;opacity:.4;transition:all .15s}.act-panel__danger-btn:hover{opacity:1;color:var(--status-danger, #ef4444)!important}.act-panel__config-btn{width:100%;padding:6px 8px;font-size:11px;border:1px solid var(--border-main);border-radius:6px;background:var(--bg-hover);color:var(--text-primary);cursor:pointer;text-align:left;transition:border-color .15s}.act-panel__config-btn:hover{border-color:var(--accent)}.act-panel__config-row{display:flex;align-items:center;gap:4px}.act-panel__config-value{flex:1;font-size:11px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.act-panel__list{display:flex;flex-direction:column;gap:3px}.act-panel__list-item{display:flex;align-items:center;gap:4px;padding:4px 6px;background:var(--bg-hover);border-radius:5px;font-size:11px;color:var(--text-primary)}.act-panel__list-item span{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.act-panel__edge-link{display:flex;align-items:center;gap:4px;padding:5px 6px;background:var(--bg-hover);border-radius:5px;font-size:11px;cursor:pointer;transition:background .15s}.act-panel__edge-link:hover{background:color-mix(in srgb,var(--accent) 12%,var(--bg-hover))}.act-panel__edge-dir{color:var(--text-muted);font-size:10px;flex-shrink:0}.act-panel__edge-target{flex:1;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.act-panel__edge-badge{font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.3px;padding:1px 5px;border-radius:3px;flex-shrink:0}.act-panel__edge-badge--optional{background:color-mix(in srgb,var(--text-muted) 15%,transparent);color:var(--text-muted)}.act-panel__edge-badge--required{background:color-mix(in srgb,var(--accent) 20%,transparent);color:var(--accent)}.act-panel__toggle-group{display:flex;gap:2px;background:var(--bg-hover);border-radius:6px;padding:2px}.act-panel__toggle{flex:1;display:flex;align-items:center;justify-content:center;gap:4px;padding:5px 6px;font-size:11px;border-radius:5px;border:none;background:transparent;color:var(--text-muted);cursor:pointer;transition:all .15s ease;font-family:inherit}.act-panel__toggle:hover{color:var(--text-primary)}.act-panel__toggle.active{background:var(--accent);color:#fff;font-weight:600;box-shadow:0 1px 4px #00000026}.act-panel__stat-grid{display:flex;gap:8px}.act-panel__stat{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--text-muted);padding:4px 8px;background:var(--bg-hover);border-radius:5px}.act-panel__tags{display:flex;flex-wrap:wrap;gap:4px}.act-panel__tag{font-size:10px;padding:2px 6px;background:color-mix(in srgb,var(--accent) 12%,transparent);color:var(--accent);border-radius:3px;cursor:pointer;transition:opacity .12s ease}.act-panel__tag:hover{opacity:.7}.act-panel__validation{display:flex;flex-direction:column;gap:4px}.act-panel__validation-item{display:flex;align-items:flex-start;gap:6px;font-size:11px;line-height:1.4;padding:4px 6px;border-radius:4px}.act-panel__validation-item--error{background:color-mix(in srgb,var(--status-danger) 10%,transparent);color:var(--status-danger)}.act-panel__validation-item--warning{background:color-mix(in srgb,var(--status-warning) 10%,transparent);color:var(--status-warning)}.act-panel__validation-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0;margin-top:4px}.act-panel__validation-item--error .act-panel__validation-dot{background:var(--status-danger)}.act-panel__validation-item--warning .act-panel__validation-dot{background:var(--status-warning)}.act-panel__dance-toggle{display:flex;align-items:center;gap:5px;padding:5px 6px;font-size:11px;color:var(--text-muted);background:var(--bg-hover);border-radius:5px;cursor:pointer;transition:all .12s ease}.act-panel__dance-toggle:hover{background:color-mix(in srgb,var(--accent) 8%,var(--bg-hover));color:var(--text-primary)}.act-panel__dance-toggle.active{color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,var(--bg-hover))}.act-panel__dance-toggle input[type=checkbox]{accent-color:var(--accent);margin:0;width:12px;height:12px;cursor:pointer}.act-panel__dance-toggle span{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.act-panel__sub-field{margin-top:6px}.act-panel__sub-label{display:block;font-size:10px;color:var(--text-muted);margin-bottom:3px}.act-panel__sub-input-row{margin-top:3px}.act-panel__input--small{font-size:11px;padding:4px 6px}
@@ -0,0 +1 @@
1
+ import{r as h,j as n}from"./react-vendor-DzpMUNDT.js";import{a as w,u as y,b as ee,A as k,c as te,g as se,d as re,D as C}from"./index-CWrv6O3o.js";import{u as ae}from"./queries-Dm1jEHfc.js";import{T as ne,h as ce,a as ie,C as de}from"./chat-message-visibility-YwJ-AQno.js";import{n as L,a as oe,k as fe,o as le,p as ue,q as me}from"./icon-vendor-I2JVIi1s.js";import"./query-vendor-_taqgrbn.js";import"./flow-vendor-C868rU-6.js";import"./dnd-vendor-CIAZE2P2.js";import"./markdown-vendor-DnTJ9hmR.js";import"./terminal-vendor-D0xRnmbI.js";import"./MarkdownRenderer-Cz8A4AgP.js";function W(){return{performers:new Map,acts:new Map,drafts:new Map}}function d(){return y.getState()}function D(e){return(e==null?void 0:e.trim().toLowerCase())||null}function j(e,t){var s;const i=d();if(t.performerId&&i.performers.some(r=>r.id===t.performerId))return t.performerId;if(t.performerRef)return e.performers.get(t.performerRef)||null;if(t.performerName){const r=D(t.performerName);return((s=i.performers.find(c=>D(c.name)===r))==null?void 0:s.id)||null}return null}function x(e,t){var s;const i=d();if(t.actId&&i.acts.some(r=>r.id===t.actId))return t.actId;if(t.actRef)return e.acts.get(t.actRef)||null;if(t.actName){const r=D(t.actName);return((s=i.acts.find(c=>D(c.name)===r))==null?void 0:s.id)||null}return null}function I(e,t,i){if(i.draftId)return i.draftId;if(i.draftRef){const s=e.drafts.get(i.draftRef);return((s==null?void 0:s.kind)===t?s.id:null)||null}if(i.draftName){const s=d(),r=D(i.draftName),c=Object.values(s.drafts).find(f=>f.kind===t&&D(f.name)===r);return(c==null?void 0:c.id)||null}return null}function O(e,t,i){const s=d(),r=s.acts.find(f=>f.id===t);if(!r)return null;if(i.participantKey&&r.participants[i.participantKey])return i.participantKey;const c=j(e,i);return c?s.attachPerformerToAct(t,c):null}async function M(e,t,i){const s=await w.drafts.create({kind:e,name:t.name,content:t.content,...t.slug?{slug:t.slug}:{},...t.description?{description:t.description}:{},...t.tags?{tags:t.tags}:{}});return y.setState(r=>({drafts:{...r.drafts,[s.id]:s},workspaceDirty:!0})),t.ref&&i.drafts.set(t.ref,{kind:e,id:s.id}),t.openEditor&&d().openDraftEditor(s.id),s.id}async function pe(e,t){if(e.talUrn!==void 0)return e.talUrn?{kind:"registry",urn:e.talUrn}:null;if(e.talDraftId)return{kind:"draft",draftId:e.talDraftId};if(e.talDraftRef){const i=I(t,"tal",{draftRef:e.talDraftRef});return i?{kind:"draft",draftId:i}:null}if(e.talDraft)return{kind:"draft",draftId:await M("tal",e.talDraft,t)}}async function he(e,t,i){const s=d();for(const r of t.addDanceUrns||[])s.addPerformerDanceRef(e,{kind:"registry",urn:r});for(const r of t.addDanceDraftIds||[])s.addPerformerDanceRef(e,{kind:"draft",draftId:r});for(const r of t.addDanceDraftRefs||[]){const c=I(i,"dance",{draftRef:r});c&&s.addPerformerDanceRef(e,{kind:"draft",draftId:c})}for(const r of t.addDanceDrafts||[]){const c=await M("dance",r,i);d().addPerformerDanceRef(e,{kind:"draft",draftId:c})}}function ve(e,t){const i=d();for(const s of t.removeDanceUrns||[])i.removePerformerDance(e,s);for(const s of t.removeDanceDraftIds||[])i.removePerformerDance(e,s)}async function U(e,t,i){const s=d(),r=await pe(t,i);r!==void 0&&s.setPerformerTalRef(e,r),await he(e,t,i),ve(e,t),t.model!==void 0&&s.setPerformerModel(e,t.model);for(const c of t.addMcpServerNames||[])s.addPerformerMcp(e,{name:c,status:"connected",tools:[],resources:[]});for(const c of t.removeMcpServerNames||[])s.removePerformerMcp(e,c)}async function V(e,t,i){const s=d(),r=O(i,e,{participantKey:t.sourceParticipantKey,performerId:t.sourcePerformerId,performerRef:t.sourcePerformerRef,performerName:t.sourcePerformerName}),c=O(i,e,{participantKey:t.targetParticipantKey,performerId:t.targetPerformerId,performerRef:t.targetPerformerRef,performerName:t.targetPerformerName});if(!r||!c||r===c)return!1;const f=s.addRelation(e,[r,c],t.direction||"both");if(!f)return!1;const p={...t.name?{name:t.name}:{},...t.description?{description:t.description}:{}};return Object.keys(p).length>0&&d().updateRelation(e,f,p),!0}async function ge(e,t=W()){var i;try{switch(e.type){case"createTalDraft":return await M("tal",e,t),{success:!0};case"updateTalDraft":{const s=I(t,"tal",e);if(!s)return{success:!1};const r=await w.drafts.update("tal",s,{...e.name?{name:e.name}:{},...e.content?{content:e.content}:{},...e.description!==void 0?{description:e.description}:{},...e.tags?{tags:e.tags}:{}});return y.setState(c=>({drafts:{...c.drafts,[r.id]:r},workspaceDirty:!0})),{success:!0}}case"deleteTalDraft":{const s=I(t,"tal",e);return s?(await w.drafts.delete("tal",s),y.setState(r=>{const c={...r.drafts};return delete c[s],{drafts:c,workspaceDirty:!0}}),{success:!0}):{success:!1}}case"createDanceDraft":return await M("dance",e,t),{success:!0};case"updateDanceDraft":{const s=I(t,"dance",e);if(!s)return{success:!1};const r=await w.drafts.update("dance",s,{...e.name?{name:e.name}:{},...e.content?{content:e.content}:{},...e.description!==void 0?{description:e.description}:{},...e.tags?{tags:e.tags}:{}});return y.setState(c=>({drafts:{...c.drafts,[r.id]:r},workspaceDirty:!0})),{success:!0}}case"deleteDanceDraft":{const s=I(t,"dance",e);return s?(await w.drafts.delete("dance",s),y.setState(r=>{const c={...r.drafts};return delete c[s],{drafts:c,workspaceDirty:!0}}),{success:!0}):{success:!1}}case"createPerformer":{const s=d().addPerformer(e.name);return e.ref&&t.performers.set(e.ref,s),await U(s,e,t),{success:!0}}case"updatePerformer":{const s=j(t,e);return s?(e.name&&d().updatePerformerName(s,e.name),await U(s,e,t),{success:!0}):{success:!1}}case"deletePerformer":{const s=j(t,e);return s?(d().removePerformer(s),{success:!0}):{success:!1}}case"createAct":{const s=d().addAct(e.name);e.ref&&t.acts.set(e.ref,s),e.description&&d().updateActDescription(s,e.description);for(const r of e.participantPerformerIds||[])d().attachPerformerToAct(s,r);for(const r of e.participantPerformerRefs||[]){const c=t.performers.get(r);c&&d().attachPerformerToAct(s,c)}for(const r of e.participantPerformerNames||[]){const c=j(t,{performerName:r});c&&d().attachPerformerToAct(s,c)}for(const r of e.relations||[])await V(s,r,t);return{success:!0}}case"updateAct":{const s=x(t,e);return s?(e.name&&d().renameAct(s,e.name),e.description!==void 0&&d().updateActDescription(s,e.description),{success:!0}):{success:!1}}case"deleteAct":{const s=x(t,e);return s?(d().removeAct(s),{success:!0}):{success:!1}}case"attachPerformerToAct":{const s=x(t,e),r=j(t,e);return!s||!r?{success:!1}:(d().attachPerformerToAct(s,r),{success:!0})}case"detachParticipantFromAct":{const s=x(t,e);if(!s)return{success:!1};let r=e.participantKey;if(!r){const c=d(),f=c.acts.find(v=>v.id===s);if(!f)return{success:!1};const p=j(t,e);if(p&&(r=Object.keys(f.participants).find(v=>{var P,N,A,R;const g=f.participants[v];return g.performerRef.kind==="draft"&&(((N=(P=c.performers.find(u=>u.id===p))==null?void 0:P.meta)==null?void 0:N.derivedFrom)===g.performerRef.draftId||p===g.performerRef.draftId)||g.performerRef.kind==="registry"&&((R=(A=c.performers.find(u=>u.id===p))==null?void 0:A.meta)==null?void 0:R.derivedFrom)===g.performerRef.urn})||void 0,!r)){const v=(i=c.performers.find(g=>g.id===p))==null?void 0:i.name;v&&f.participants[v]&&(r=v)}}return r?(d().unbindPerformerFromAct(s,r),{success:!0}):{success:!1}}case"connectPerformers":{const s=x(t,e);return s?{success:await V(s,e,t)}:{success:!1}}case"updateRelation":{const s=x(t,e);if(!s)return{success:!1};const r={...e.name!==void 0?{name:e.name}:{},...e.description!==void 0?{description:e.description}:{},...e.direction!==void 0?{direction:e.direction}:{}};return d().updateRelation(s,e.relationId,r),{success:!0}}case"removeRelation":{const s=x(t,e);return s?(d().removeRelation(s,e.relationId),{success:!0}):{success:!1}}default:return{success:!1}}}catch(s){return console.error(`[Assistant] Failed to apply ${e.type}:`,s),{success:!1}}}async function ye(e){const t=W();let i=0,s=0;for(const r of e)(await ge(r,t)).success?i++:s++;return{applied:i,failed:s}}function Me(){var z;const{isAssistantOpen:e,assistantModel:t,appliedAssistantActionMessageIds:i,assistantActionResults:s,sendMessage:r,startNewSession:c,setAssistantModel:f,setAssistantAvailableModels:p,markAssistantActionsApplied:v,recordAssistantActionResult:g,initRealtimeEvents:P}=y(),N=y(a=>ee(a,k)),A=y(a=>te(a,k)),{data:R}=ae(),u=h.useMemo(()=>(R??[]).filter(a=>a.connected),[R]),X=u.length>0,[S,E]=h.useState(""),[b,q]=h.useState(320),T=h.useRef(null),_=h.useRef(!1);h.useEffect(()=>{!t&&u.length>0&&f({provider:u[0].provider,modelId:u[0].id})},[t,u,f]);const K=h.useMemo(()=>u.map(a=>({provider:a.provider,providerName:a.providerName,modelId:a.id,name:a.name||a.id})),[u]);h.useEffect(()=>{p(K)},[K,p]),h.useEffect(()=>{if(A)return;let a=!1;return(async()=>{for(const o of N){if(a||o.role!=="assistant"||i[o.id])continue;const l=se(o);if(l.length===0)continue;v(o.id);const m=await ye(l);if(a)return;g(o.id,m),m.failed>0&&re(m.applied>0?`Studio Assistant applied ${m.applied} change(s), but ${m.failed} action(s) could not be applied.`:"Studio Assistant suggested changes, but they could not be applied to the current stage.",m.applied>0?"warning":"error",{title:"Assistant action issue",dedupeKey:`assistant-actions:${o.id}`})}})(),()=>{a=!0}},[N,A,i,v,g]);const B=h.useCallback(a=>{a.preventDefault(),_.current=!0;const o=a.clientX,l=b,m=Z=>{_.current&&q(Math.min(520,Math.max(260,l+(o-Z.clientX))))},F=()=>{_.current=!1,document.removeEventListener("mousemove",m),document.removeEventListener("mouseup",F),document.body.style.cursor="",document.body.style.userSelect=""};document.addEventListener("mousemove",m),document.addEventListener("mouseup",F),document.body.style.cursor="col-resize",document.body.style.userSelect="none"},[b]);h.useEffect(()=>{var a;(a=T.current)==null||a.scrollIntoView({behavior:"smooth"})},[N]);const $=()=>{!S.trim()||!t||(P(),r(k,S),E(""))},G=()=>{c(k)},H=()=>{var a;(a=document.querySelector('[title="Settings"]'))==null||a.click()};if(!e)return null;const J=t?((z=u.find(a=>a.provider===t.provider&&a.id===t.modelId))==null?void 0:z.name)||t.modelId:null,Q=u.reduce((a,o)=>(a[o.providerName]||(a[o.providerName]=[]),a[o.providerName].push(o),a),{}),Y=a=>{const o=s[a];if(!o)return null;let l="assistant-action-status--success",m=`Applied ${o.applied} change${o.applied===1?"":"s"}`;return o.failed>0&&o.applied>0?(l="assistant-action-status--warning",m=`Applied ${o.applied}, failed ${o.failed}`):o.failed>0&&(l="assistant-action-status--error",m=`No changes applied (${o.failed} failed)`),n.jsx("div",{className:`assistant-action-status ${l}`,children:m})};return n.jsxs("div",{className:"assistant-panel",style:{width:b},children:[n.jsx("div",{className:"assistant-resize-handle",onMouseDown:B}),n.jsxs("div",{className:"assistant-header",children:[n.jsxs("div",{className:"assistant-header__title",children:[n.jsx("div",{className:"assistant-header__icon",children:n.jsx(L,{size:14})}),n.jsx("span",{children:"Studio Assistant"})]}),n.jsx("div",{className:"assistant-header__actions",children:n.jsx("button",{className:"assistant-sessions__new",onClick:G,title:"New session",children:n.jsx(oe,{size:13})})})]}),X?n.jsx(ne,{messages:N,loading:A,historyClassName:"assistant-content",endRef:T,renderEmpty:()=>n.jsxs("div",{className:"assistant-empty",children:[n.jsx(L,{size:48,className:"assistant-empty__icon"}),n.jsx("h3",{className:"assistant-empty__title",children:"How can I help you design?"}),n.jsx("p",{className:"assistant-empty__desc",children:"Ask me to add performers, acts, or explain how DOT Studio works."})]}),renderMessage:a=>a.role==="user"&&!ce(a)||a.role==="assistant"&&!ie(a)?null:n.jsx("div",{className:`thread-msg thread-msg--${a.role}`,"data-scrollable":!0,children:a.role==="user"?n.jsx("div",{className:"user-input-box",children:n.jsx("span",{className:"user-input-text",children:a.content})}):n.jsxs(n.Fragment,{children:[n.jsx(de,{message:a}),Y(a.id)]})},a.id),renderLoading:()=>n.jsx("div",{className:"thread-msg thread-msg--assistant","data-scrollable":!0,children:n.jsx("div",{className:"assistant-body",children:n.jsxs("div",{className:"loading-dots",children:[n.jsx("span",{}),n.jsx("span",{}),n.jsx("span",{})]})})}),composer:n.jsxs("div",{className:"assistant-footer",children:[n.jsxs("div",{className:"assistant-input-wrapper",children:[n.jsx("textarea",{value:S,onChange:a=>E(a.target.value),onKeyDown:a=>{a.nativeEvent.isComposing||a.key==="Enter"&&!a.shiftKey&&(a.preventDefault(),$())},placeholder:"Ask the assistant...",className:"assistant-input",rows:1}),n.jsx("button",{className:"assistant-submit",onClick:$,disabled:!S.trim(),title:"Send message",children:n.jsx(ue,{size:14})})]}),n.jsx("div",{className:"assistant-footer__model-row",children:n.jsx(C,{trigger:n.jsxs("button",{className:"assistant-model-pill",title:"Change model",children:[n.jsx("span",{className:"assistant-model-pill__label",children:J||"Select model"}),n.jsx(me,{size:10})]}),children:Object.entries(Q).map(([a,o])=>n.jsx(C.Group,{label:a,children:o.map(l=>n.jsx(C.Item,{active:(t==null?void 0:t.provider)===l.provider&&(t==null?void 0:t.modelId)===l.id,onClick:()=>f({provider:l.provider,modelId:l.id}),children:l.name},`${l.provider}:${l.id}`))},a))})})]})}):n.jsx("div",{className:"assistant-content",children:n.jsxs("div",{className:"assistant-empty",children:[n.jsx(fe,{size:40,className:"assistant-empty__icon assistant-empty__icon--warn"}),n.jsx("h3",{className:"assistant-empty__title",children:"Model not configured"}),n.jsx("p",{className:"assistant-empty__desc",children:"To use the Studio Assistant, configure at least one AI model provider first."}),n.jsxs("button",{className:"assistant-setup-btn",onClick:H,children:[n.jsx(le,{size:14}),n.jsx("span",{children:"Open Settings"})]})]})})]})}export{Me as AssistantChat};
@@ -0,0 +1 @@
1
+ .assistant-panel{display:flex;flex-direction:column;height:100%;width:320px;min-width:260px;max-width:520px;flex-shrink:0;background:var(--bg-main);border-left:1px solid var(--border-light);box-shadow:-4px 0 16px #0000000d;animation:slide-in-right .3s cubic-bezier(.16,1,.3,1);z-index:40;position:relative}.assistant-resize-handle{position:absolute;top:0;left:-2px;width:5px;height:100%;cursor:col-resize;z-index:50;background:transparent;transition:background .15s}.assistant-resize-handle:hover,.assistant-resize-handle:active{background:var(--accent);opacity:.5}@keyframes slide-in-right{0%{transform:translate(100%)}to{transform:translate(0)}}.assistant-header{display:flex;align-items:center;padding:10px 12px;border-bottom:1px solid var(--border-light);background:var(--bg-hover);flex-shrink:0}.assistant-header__title{display:flex;align-items:center;gap:8px;font-size:var(--font-md);font-weight:600;color:var(--text-primary)}.assistant-header__icon{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:var(--radius-sm);background:rgba(var(--primary-rgb),.1);color:var(--primary)}.assistant-sessions{display:flex;align-items:center;gap:2px;padding:4px 8px;border-bottom:1px solid var(--border-light);background:var(--bg-main);flex-shrink:0;overflow-x:auto}.assistant-sessions::-webkit-scrollbar{display:none}.assistant-sessions__list{display:flex;gap:2px;flex:1;min-width:0;overflow-x:auto}.assistant-sessions__list::-webkit-scrollbar{display:none}.assistant-sessions__tab{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:11px;font-weight:500;cursor:pointer;white-space:nowrap;transition:all .15s;flex-shrink:0}.assistant-sessions__tab:hover{background:var(--bg-hover);color:var(--text-secondary)}.assistant-sessions__tab.is-active{background:var(--bg-hover);color:var(--text-primary);font-weight:600}.assistant-sessions__tab-label{max-width:80px;overflow:hidden;text-overflow:ellipsis}.assistant-sessions__tab-close{display:none;align-items:center;justify-content:center;width:14px;height:14px;border-radius:3px;color:var(--text-muted);margin-left:2px;flex-shrink:0}.assistant-sessions__tab-close:hover{background:var(--bg-main);color:var(--text-primary)}.assistant-sessions__tab:hover .assistant-sessions__tab-close{display:flex}.assistant-sessions__new{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:1px dashed var(--border-main);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer;flex-shrink:0;transition:all .15s}.assistant-sessions__new:hover{border-color:var(--primary);color:var(--primary);background:rgba(var(--primary-rgb),.05)}.assistant-content{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:16px}.assistant-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;color:var(--text-muted);padding:20px}.assistant-empty__icon{color:var(--primary);opacity:.3;margin-bottom:16px}.assistant-empty__icon--warn{color:#f59e0b;opacity:.7}.assistant-empty__title{font-size:15px;font-weight:600;color:var(--text-primary);margin:0 0 4px}.assistant-action-status{margin-top:8px;display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border-radius:999px;font-size:11px;font-weight:600;line-height:1.2}.assistant-action-status--success{background:#22c55e1f;color:#15803d}.assistant-action-status--warning{background:#f59e0b24;color:#b45309}.assistant-action-status--error{background:#ef444424;color:#b91c1c}.assistant-empty__desc{font-size:var(--font-md);margin:0;max-width:200px;line-height:1.5}.assistant-setup-btn{display:inline-flex;align-items:center;gap:6px;margin-top:16px;padding:8px 16px;background:var(--primary);color:var(--primary-foreground, #ffffff);border:none;border-radius:var(--radius);font-size:var(--font-md);font-weight:600;cursor:pointer;transition:opacity .2s,transform .1s}.assistant-setup-btn:hover{opacity:.9}.assistant-setup-btn:active{transform:scale(.97)}.assistant-msg{display:flex;width:100%}.assistant-msg.is-user{justify-content:flex-end}.assistant-msg.is-assistant{justify-content:flex-start}.assistant-msg__avatar{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:rgba(var(--primary-rgb),.1);color:var(--primary);margin-right:8px;margin-top:2px;flex-shrink:0}.assistant-msg__bubble{max-width:85%;padding:10px 14px;border-radius:var(--radius-lg);font-size:var(--font-md);line-height:1.5;word-break:break-word}.assistant-msg.is-user .assistant-msg__bubble{background:var(--primary);color:var(--primary-foreground, #ffffff);border-bottom-right-radius:0}.assistant-msg.is-assistant .assistant-msg__bubble{background:var(--bg-hover);border:1px solid var(--border-light);color:var(--text-primary);border-bottom-left-radius:0}.assistant-msg__content{white-space:pre-wrap}.assistant-footer{padding:10px 12px;border-top:1px solid var(--border-light);background:var(--bg-main);flex-shrink:0}.assistant-input-wrapper{position:relative;display:flex;align-items:center}.assistant-input{width:100%;min-height:42px;max-height:150px;padding:10px 42px 10px 14px;background:var(--bg-hover);border:1px solid var(--border-main);border-radius:var(--radius-lg);font-size:var(--font-md);color:var(--text-primary);resize:none;transition:border-color .2s;font-family:inherit}.assistant-input:focus{outline:none;border-color:var(--primary)}.assistant-input::placeholder{color:var(--text-muted)}.assistant-submit{position:absolute;right:6px;bottom:6px;width:30px;height:30px;display:flex;align-items:center;justify-content:center;background:var(--primary);color:var(--primary-foreground, #ffffff);border:none;border-radius:var(--radius-sm);cursor:pointer;transition:opacity .2s,transform .1s}.assistant-submit:disabled{opacity:.5;cursor:not-allowed}.assistant-submit:active:not(:disabled){transform:scale(.95)}.assistant-footer__model-row{display:flex;align-items:center;margin-top:6px;padding-left:2px}.assistant-model-pill{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 8px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer;transition:all .15s;font-size:11px;font-weight:500}.assistant-model-pill:hover{background:var(--bg-hover);color:var(--text-secondary)}.assistant-model-pill__label{letter-spacing:.2px}.assistant-footer__model-row .dropdown-menu__panel{top:auto;bottom:calc(100% + 6px);max-height:320px;overflow-y:auto;animation:dropdown-in-up .12s ease-out}@keyframes dropdown-in-up{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}
@@ -0,0 +1 @@
1
+ .canvas-terminal-frame{display:flex;flex-direction:column;background:#000;border:1px solid rgba(255,255,255,.1);border-radius:var(--radius-lg);overflow:hidden;box-shadow:0 4px 24px #00000059;min-width:400px;min-height:250px}.canvas-terminal-frame:hover{border-color:#6366f14d}.canvas-terminal-frame__status{font-size:var(--font-xs);font-weight:500;padding:1px 6px;border-radius:var(--radius-sm);background:#4ade8026;color:#4ade80;flex-shrink:0}.canvas-terminal-frame__status--disconnected{background:#f8717126;color:#f87171}.canvas-terminal-frame__body{flex:1;padding:4px 8px;overflow:hidden}.canvas-terminal-frame__body .xterm{height:100%;font-kerning:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga" 0,"calt" 0;text-rendering:geometricPrecision}.canvas-terminal-frame__body .xterm-viewport{overflow-y:auto!important}.canvas-terminal-frame__resize{position:absolute;right:0;bottom:0;width:14px;height:14px;cursor:nwse-resize;opacity:0;transition:opacity .15s}.canvas-terminal-frame:hover .canvas-terminal-frame__resize{opacity:.5}.canvas-terminal-frame__resize:after{content:"";position:absolute;right:3px;bottom:3px;width:8px;height:8px;border-right:2px solid rgba(255,255,255,.25);border-bottom:2px solid rgba(255,255,255,.25);border-radius:0 0 2px}.canvas-terminal-frame__exited{position:absolute;top:32px;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:#000000e6;color:#6a6a8a;font-size:var(--font-md);gap:6px}
@@ -0,0 +1,4 @@
1
+ import{r as a,j as c}from"./react-vendor-DzpMUNDT.js";import{D as _,o as A,x as O}from"./terminal-vendor-D0xRnmbI.js";import{u as P}from"./index-CWrv6O3o.js";import{C as B}from"./CanvasWindowFrame-ziJeVfHG.js";import{l as R,X as D}from"./icon-vendor-I2JVIi1s.js";import"./query-vendor-_taqgrbn.js";import"./flow-vendor-C868rU-6.js";import"./dnd-vendor-CIAZE2P2.js";import"./markdown-vendor-DnTJ9hmR.js";const J={background:"#000000",foreground:"#e0e0e0",cursor:"#a78bfa",selectionBackground:"#6366f140",black:"#000000",red:"#f87171",green:"#4ade80",yellow:"#fbbf24",blue:"#60a5fa",magenta:"#c084fc",cyan:"#22d3ee",white:"#e0e0e0",brightBlack:"#4a4a6a",brightRed:"#fca5a5",brightGreen:"#86efac",brightYellow:"#fde68a",brightBlue:"#93c5fd",brightMagenta:"#d8b4fe",brightCyan:"#67e8f9",brightWhite:"#ffffff"},T="\x1B",F="\x07";function L(r){let i="";for(let t=0;t<r.length;t+=1){const f=r[t];if(f===T){const u=r[t+1];if(u==="]"){for(t+=2;t<r.length&&r[t]!==F;){if(r[t]===T&&r[t+1]==="\\"){t+=1;break}t+=1}continue}if(u==="["){for(t+=2;t<r.length&&!/[A-Za-z]/.test(r[t]);)t+=1;continue}t+=1;continue}f!=="\r"&&f!==`
2
+ `&&f.charCodeAt(0)<32||(i+=f)}return i}function $(r){const i=new URL("/ws/terminal",window.location.href);return i.protocol=i.protocol==="https:"?"wss:":"ws:",i.searchParams.set("action","create"),r&&i.searchParams.set("cwd",r),i.toString()}function K({data:r}){const{title:i,width:t,height:f,onClose:u,onSessionChange:g}=r,j=!!r.transformActive,z=r.onActivateTransform,v=r.onDeactivateTransform,b=a.useRef(null),n=a.useRef(null),d=a.useRef(null),o=a.useRef(null),w=a.useRef(!1),x=a.useRef(!1),[k,S]=a.useState(!1),[y,C]=a.useState(!1),E=P(e=>e.workingDir),N=a.useCallback(()=>{o.current&&(o.current.close(),o.current=null);const e=new WebSocket($(E));o.current=e,e.onopen=()=>{x.current=!1,n.current&&(n.current.clear(),n.current.reset())},e.onmessage=s=>{var l,h;try{const p=JSON.parse(s.data);switch(p.type){case"output":{if(!x.current){const m=L(p.data).replace(/[\r\n]/g,"").trim();if(!m||/\{"cursor":\d+\}/.test(m)||/^%+$/.test(m))break;x.current=!0}(l=n.current)==null||l.write(p.data);break}case"connected":S(!0),C(!1),g(p.id,!0),setTimeout(()=>{var m;(m=d.current)==null||m.fit(),n.current&&e.readyState===WebSocket.OPEN&&e.send(JSON.stringify({type:"resize",cols:n.current.cols,rows:n.current.rows}))},100);break;case"exit":S(!1),C(!0),g(null,!1),setTimeout(()=>{u()},1500);break;case"error":(h=n.current)==null||h.write(`\r
3
+ \x1B[31m${p.message}\x1B[0m\r
4
+ `);break}}catch{}},e.onclose=()=>{S(!1),g(null,!1)}},[E,g,u]);a.useEffect(()=>{if(!b.current||w.current)return;const e=new _({cursorBlink:!0,fontSize:13,fontFamily:'"Menlo", monospace',lineHeight:1.2,letterSpacing:0,theme:J,allowProposedApi:!0,allowTransparency:!1}),s=new A;e.loadAddon(s),e.open(b.current);try{e.loadAddon(new O)}catch(l){console.warn("[canvas-terminal] WebGL addon failed, falling back to canvas renderer",l)}return s.fit(),n.current=e,d.current=s,w.current=!0,e.onData(l=>{var h;((h=o.current)==null?void 0:h.readyState)===WebSocket.OPEN&&o.current.send(JSON.stringify({type:"input",data:l}))}),N(),()=>{}},[N]),a.useEffect(()=>{if(!d.current||!n.current)return;const e=setTimeout(()=>{var s,l;(s=d.current)==null||s.fit(),((l=o.current)==null?void 0:l.readyState)===WebSocket.OPEN&&n.current&&o.current.send(JSON.stringify({type:"resize",cols:n.current.cols,rows:n.current.rows}))},60);return()=>clearTimeout(e)},[t,f]),a.useEffect(()=>()=>{var e,s;(e=o.current)==null||e.close(),(s=n.current)==null||s.dispose(),w.current=!1},[]);const W=a.useCallback(()=>{setTimeout(()=>{var e,s;(e=d.current)==null||e.fit(),((s=o.current)==null?void 0:s.readyState)===WebSocket.OPEN&&n.current&&o.current.send(JSON.stringify({type:"resize",cols:n.current.cols,rows:n.current.rows}))},50)},[]);return c.jsxs(B,{className:"canvas-terminal-frame",width:t,height:f,transformActive:j,onActivateTransform:z,onDeactivateTransform:v,onResizeEnd:W,minWidth:400,minHeight:250,headerStart:c.jsxs(c.Fragment,{children:[c.jsx(R,{size:12}),c.jsx("span",{className:"canvas-frame__name",children:i}),c.jsx("span",{className:`canvas-terminal-frame__status ${k?"":"canvas-terminal-frame__status--disconnected"}`,children:y?"Exited":k?"Connected":"Connecting…"})]}),headerEnd:c.jsx("button",{className:"icon-btn",onClick:e=>{e.stopPropagation(),u()},title:"Close terminal",children:c.jsx(D,{size:12})}),children:[c.jsx("div",{className:"canvas-terminal-frame__body",ref:b}),y&&c.jsxs("div",{className:"canvas-terminal-frame__exited",children:[c.jsx(R,{size:14}),c.jsx("span",{children:"Process exited"})]})]})}export{K as default};
@@ -0,0 +1 @@
1
+ import{r,j as a}from"./react-vendor-DzpMUNDT.js";import{a as f}from"./index-CWrv6O3o.js";import{C as _}from"./CanvasWindowFrame-ziJeVfHG.js";import{ae as g,X as x,af as j}from"./icon-vendor-I2JVIi1s.js";import"./query-vendor-_taqgrbn.js";import"./flow-vendor-C868rU-6.js";import"./dnd-vendor-CIAZE2P2.js";import"./markdown-vendor-DnTJ9hmR.js";import"./terminal-vendor-D0xRnmbI.js";function b({data:t}){const{title:c,width:i,height:m,onClose:l}=t,o=!!t.transformActive,d=t.onActivateTransform,h=t.onDeactivateTransform,[e,n]=r.useState([]);return r.useEffect(()=>{const s=async()=>{try{const v=await f.file.status();n(v||[])}catch{n([])}};s();const p=setInterval(s,1e4);return()=>clearInterval(p)},[]),a.jsx(_,{className:"canvas-tracking-frame",width:i,height:m,transformActive:o,onActivateTransform:d,onDeactivateTransform:h,minWidth:360,minHeight:240,headerStart:a.jsxs(a.Fragment,{children:[a.jsx(j,{size:12}),a.jsx("span",{className:"canvas-frame__name",children:c}),a.jsx("span",{className:"canvas-tracking-frame__status",children:e.length===0?"Clean":`${e.length} file${e.length===1?"":"s"}`})]}),headerEnd:a.jsx("button",{className:"icon-btn",onClick:s=>{s.stopPropagation(),l()},title:"Close stage tracking",children:a.jsx(x,{size:12})}),bodyClassName:"scroll-area",children:e.length===0?a.jsx("div",{className:"canvas-tracking-frame__empty",children:"No uncommitted files detected."}):a.jsx("ul",{className:"canvas-tracking-frame__list",children:e.map(s=>a.jsxs("li",{className:"canvas-tracking-frame__item",children:[a.jsx(g,{size:12,className:`canvas-tracking-frame__icon canvas-tracking-frame__icon--${s.status}`}),a.jsxs("div",{className:"canvas-tracking-frame__info",children:[a.jsx("span",{className:"canvas-tracking-frame__path",title:s.path,children:s.path.split("/").pop()}),s.path.includes("/")?a.jsx("span",{className:"canvas-tracking-frame__dir",children:s.path.slice(0,s.path.lastIndexOf("/"))}):null]}),a.jsxs("div",{className:"canvas-tracking-frame__stats",children:[s.added>0?a.jsxs("span",{className:"canvas-tracking-frame__added",children:["+",s.added]}):null,s.removed>0?a.jsxs("span",{className:"canvas-tracking-frame__removed",children:["-",s.removed]}):null]})]},s.path))})})}export{b as default};
@@ -0,0 +1 @@
1
+ .canvas-tracking-frame{display:flex;flex-direction:column;border-radius:14px;overflow:hidden;border:1px solid var(--border-light);background:color-mix(in srgb,var(--bg-card) 94%,white 6%);box-shadow:0 12px 28px color-mix(in srgb,black 12%,transparent)}.canvas-tracking-frame__empty{display:flex;align-items:center;justify-content:center;min-height:120px;color:var(--text-secondary);font-size:var(--font-md)}.canvas-tracking-frame__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.canvas-tracking-frame__item{display:flex;align-items:flex-start;gap:10px;padding:8px 10px;border-radius:var(--radius-lg);border:1px solid color-mix(in srgb,var(--border-light) 85%,transparent);background:color-mix(in srgb,var(--bg-panel) 92%,transparent)}.canvas-tracking-frame__icon{margin-top:2px;color:var(--text-secondary);flex-shrink:0}.canvas-tracking-frame__icon--modified{color:#f59e0b}.canvas-tracking-frame__icon--added{color:#10b981}.canvas-tracking-frame__icon--deleted{color:#ef4444}.canvas-tracking-frame__info{display:flex;flex:1;min-width:0;flex-direction:column;gap:2px}.canvas-tracking-frame__path{font-size:var(--font-base);font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.canvas-tracking-frame__dir{font-size:var(--font-sm);color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.canvas-tracking-frame__stats{display:inline-flex;align-items:center;gap:8px;flex-shrink:0;font-size:var(--font-sm);font-weight:600}.canvas-tracking-frame__added{color:#10b981}.canvas-tracking-frame__removed{color:#ef4444}.canvas-tracking-frame__resize{position:absolute;right:0;bottom:0;width:14px;height:14px;cursor:nwse-resize}
@@ -0,0 +1 @@
1
+ import{j as a,r as t}from"./react-vendor-DzpMUNDT.js";import{N as S}from"./flow-vendor-C868rU-6.js";import"./index-CWrv6O3o.js";import{av as j}from"./icon-vendor-I2JVIi1s.js";function T({active:s=!1,interactive:r=!0,onToggle:e,stopPropagation:i=!1,title:l="Toggle resize handles"}){const o=`canvas-drag-handle${r?" canvas-drag-handle--interactive":""}${s?" canvas-drag-handle--active":""}`;return r?a.jsx("button",{type:"button",className:o,onPointerDown:n=>{if(i){n.preventDefault(),n.stopPropagation();return}e==null||e()},onClick:n=>{i&&(n.preventDefault(),n.stopPropagation())},title:l,"aria-label":l,children:a.jsx(j,{size:11,strokeWidth:1.8})}):a.jsx("span",{className:o,"aria-hidden":"true",children:a.jsx(j,{size:11,strokeWidth:1.8})})}function W(s){return s?!!s.closest(".canvas-drag-handle--interactive, .canvas-frame__header, .react-flow__resize-control, .canvas-resize-control"):!1}function K({active:s,onActivate:r,onDeactivate:e}){const[i,l]=t.useState(!1),o=t.useCallback(()=>{s?e==null||e():r==null||r()},[s,r,e]),n=t.useCallback(f=>{const h=f.target;W(h)||e==null||e()},[e]),c=t.useCallback(()=>{r==null||r(),l(!0)},[r]),d=t.useCallback(()=>{l(!1)},[]);return{isTransformChromeActive:s,showResizeChrome:s||i,toggleTransformChrome:o,handleFramePointerDownCapture:n,handleResizeStart:c,handleResizeEnd:d}}function q({className:s="",resizable:r=!0,focused:e=!1,minWidth:i=280,minHeight:l=220,transformActive:o=!1,onActivateTransform:n,onDeactivateTransform:c,onResizeStart:d,onResizeEnd:f,selected:h=!1,headerStart:w,headerEnd:b,bodyClassName:_="",bodyRef:z,children:g}){const p=t.useRef(null),{isTransformChromeActive:R,showResizeChrome:m,toggleTransformChrome:k,handleFramePointerDownCapture:N,handleResizeStart:y,handleResizeEnd:$}=K({active:o,onActivate:n,onDeactivate:c});t.useEffect(()=>{const u=p.current;if(!u)return;const v=C=>{(C.ctrlKey||C.metaKey)&&C.preventDefault()};return u.addEventListener("wheel",v,{passive:!1}),()=>u.removeEventListener("wheel",v)},[]);const x=h||m,P=()=>{$(),f==null||f()},E=()=>{y(),d==null||d()},F=r&&!e;return a.jsxs("div",{ref:p,className:`canvas-frame ${x?"canvas-frame--active":""} ${x&&!m?"canvas-frame--content-active":""} ${e?"canvas-frame--focused-fullscreen":""} ${s}`.trim(),style:{width:"100%",height:"100%",touchAction:"none"},onPointerDownCapture:N,children:[F&&a.jsx(S,{color:"#3b82f6",lineStyle:{borderWidth:1.5,borderColor:"#3b82f6"},isVisible:m,minWidth:i,minHeight:l,handleStyle:{width:8,height:8,background:"#3b82f6",border:"1.5px solid #2563eb",borderRadius:2},onResizeStart:E,onResizeEnd:P}),a.jsxs("div",{className:"canvas-frame__header",children:[!e&&a.jsx(T,{active:R,onToggle:k}),a.jsx("div",{className:"canvas-frame__header-start",children:w}),b?a.jsx("div",{className:"canvas-frame__header-end",children:b}):null]}),a.jsx("div",{ref:z,className:`canvas-frame__body ${_}`.trim(),children:g})]})}export{q as C};
@@ -0,0 +1 @@
1
+ import{r,j as t}from"./react-vendor-DzpMUNDT.js";import{b as pe}from"./query-vendor-_taqgrbn.js";import{u as b,a as k,I as V}from"./index-CWrv6O3o.js";import{c as he,q as Y}from"./queries-Dm1jEHfc.js";import{C as fe}from"./CanvasWindowFrame-ziJeVfHG.js";import{X as Z,aA as ge,aB as be,ac as ve,c as xe,Y as _e,ad as je,m as we,b as ye,F as Ne,a2 as ke}from"./icon-vendor-I2JVIi1s.js";import"./flow-vendor-C868rU-6.js";import"./dnd-vendor-CIAZE2P2.js";import"./markdown-vendor-DnTJ9hmR.js";import"./terminal-vendor-D0xRnmbI.js";function Ce(i){return i.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"untitled"}function Se(i=[],a=[]){return i.length!==a.length?!1:i.every((v,x)=>v===a[x])}function ee({entry:i,depth:a,activeFilePath:v,expandedDirs:x,onFileClick:T,onToggleDir:A}){var _;const m=i.type==="directory",p=x.has(i.path),B=!m&&i.path===v,E=a>0?` dance-bundle-editor__tree-item--indent-${Math.min(a,3)}`:"";return t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:`dance-bundle-editor__tree-item${m?" dance-bundle-editor__tree-item--dir":""}${B?" dance-bundle-editor__tree-item--active":""}${E}`,onClick:()=>m?A(i.path):T(i.path,i.name),children:[m?p?t.jsx(we,{size:12}):t.jsx(ye,{size:12}):null,m?t.jsx(Ne,{size:12}):t.jsx(ke,{size:12}),t.jsx("span",{children:i.name})]}),m&&p&&((_=i.children)==null?void 0:_.map(j=>t.jsx(ee,{entry:j,depth:a+1,activeFilePath:v,expandedDirs:x,onFileClick:T,onToggleDir:A},j.path)))]})}function Ke({id:i,data:a,selected:v}){const x=b(e=>e.drafts),T=b(e=>e.setPerformerTalRef),A=b(e=>e.addPerformerDanceRef),m=b(e=>e.replacePerformerDanceRef),p=b(e=>e.upsertDraft),B=b(e=>e.updateMarkdownEditorBaseline),E=b(e=>e.removeMarkdownEditor),{data:_}=he(),j=pe(),n=x[a.draftId],[G,te]=r.useState([]),[ne,se]=r.useState(new Set(["scripts","references","assets"])),[h,C]=r.useState([]),[S,I]=r.useState(null),[K,c]=r.useState(null),[M,L]=r.useState(null),[ae,D]=r.useState(!1),[F,q]=r.useState(""),[R,P]=r.useState(!1),Q=r.useRef(null),W=r.useRef(new Map),z=r.useCallback(async()=>{try{const e=await k.drafts.danceBundle.tree(a.draftId);te(e)}catch{}},[a.draftId]);r.useEffect(()=>{z()},[z]),r.useEffect(()=>{if(h.length===0&&n){const e=typeof n.content=="string"?n.content:"";C([{path:"SKILL.md",name:"SKILL.md",content:e,dirty:!1}]),I("SKILL.md")}},[n]);const f=a.baseline||null,d=typeof(n==null?void 0:n.name)=="string"?n.name:"",w=typeof(n==null?void 0:n.slug)=="string"&&n.slug.trim()?n.slug:Ce(d),g=typeof(n==null?void 0:n.description)=="string"?n.description:"",y=r.useMemo(()=>Array.isArray(n==null?void 0:n.tags)?n.tags:[],[n==null?void 0:n.tags]),N=typeof(n==null?void 0:n.content)=="string"?n.content:"",U=r.useMemo(()=>f?f.name!==d||(f.slug||"")!==w||(f.description||"")!==g||!Se(f.tags||[],y)||f.content!==N:!0,[f,N,g,d,w,y]),H=h.find(e=>e.path===S)||null,re=r.useCallback(async(e,s)=>{if(h.find(o=>o.path===e)){I(e);return}try{const o=await k.drafts.danceBundle.readFile(a.draftId,e);C(u=>[...u,{path:e,name:s,content:o.content,dirty:!1}]),I(e)}catch(o){c({tone:"error",message:`Failed to open ${s}: ${o instanceof Error?o.message:"unknown error"}`})}},[a.draftId,h]),ie=r.useCallback(e=>{C(s=>s.filter(l=>l.path!==e)),S===e&&I(()=>{const s=h.filter(l=>l.path!==e);return s.length>0?s[s.length-1].path:null})},[S,h]),le=r.useCallback(e=>{se(s=>{const l=new Set(s);return l.has(e)?l.delete(e):l.add(e),l})},[]),de=r.useCallback((e,s)=>{C(o=>o.map(u=>u.path===e?{...u,content:s,dirty:!0}:u)),e==="SKILL.md"&&n&&p({...n,content:s,updatedAt:Date.now()});const l=W.current.get(e);l&&clearTimeout(l),W.current.set(e,setTimeout(async()=>{W.current.delete(e);try{await k.drafts.danceBundle.writeFile(a.draftId,e,s),C(o=>o.map(u=>u.path===e?{...u,dirty:!1}:u))}catch{}},1500))},[a.draftId,n,p]),oe=r.useCallback(async()=>{if(F.trim())try{await k.drafts.danceBundle.createFile(a.draftId,F.trim(),R),D(!1),q(""),P(!1),await z()}catch(e){c({tone:"error",message:e instanceof Error?e.message:"Failed to create file"})}},[a.draftId,F,R,z]),O=e=>{const s=a.attachTarget;if(s!=null&&s.performerId){if(s.mode==="tal"){T(s.performerId,e.kind==="draft"?{kind:"draft",draftId:e.draftId}:{kind:"registry",urn:e.urn});return}if(s.mode==="dance-new"&&!s.targetRef){A(s.performerId,e.kind==="draft"?{kind:"draft",draftId:e.draftId}:{kind:"registry",urn:e.urn});return}s.targetRef&&m(s.performerId,s.targetRef,e.kind==="draft"?{kind:"draft",draftId:e.draftId}:{kind:"registry",urn:e.urn})}},X=e=>{B(i,{name:d,slug:w,description:g,tags:y,content:N}),p({id:a.draftId,kind:a.kind,name:d,slug:w,description:g,tags:y,content:N,derivedFrom:e||(n==null?void 0:n.derivedFrom)||void 0,updatedAt:Date.now()})},J=async()=>{await Promise.all([j.invalidateQueries({queryKey:Y.assets(a.workingDir)}),j.invalidateQueries({queryKey:Y.assetInventory(a.workingDir)}),j.invalidateQueries({queryKey:Y.assetKind(a.workingDir,a.kind)})])},ce=()=>{O({kind:"draft",draftId:a.draftId}),X((n==null?void 0:n.derivedFrom)||null),c({tone:"success",message:"Saved stage-local draft."})},ue=async()=>{try{L("local"),c(null);const e={description:g.trim()||d.trim()||"dance",tags:y,content:N},s=await k.dot.saveLocalAsset("dance",w.trim(),e,(_==null?void 0:_.username)||void 0);O({kind:"registry",urn:s.urn}),X(s.urn),await J(),c({tone:"success",message:s.existed?`Updated local dance asset at ${s.urn}.`:`Saved local dance asset at ${s.urn}.`})}catch(e){c({tone:"error",message:V(e,!1)})}finally{L(null)}},me=async()=>{try{L("publish"),c(null);const e={description:g.trim()||d.trim()||"dance",tags:y,content:N},s=await k.dot.publishAsset("dance",w.trim(),e,e.tags,!0);O({kind:"registry",urn:s.urn}),X(s.urn),await J(),c({tone:"success",message:s.published?`Published ${s.urn}.`:`${s.urn} already exists in the registry.`})}catch(e){c({tone:"error",message:V(e,!1)})}finally{L(null)}},$=e=>{e.stopPropagation()};return n?t.jsxs(fe,{className:"dance-bundle-editor",width:Number(a.width||720),height:Number(a.height||480),transformActive:!!a.transformActive,onActivateTransform:a.onActivateTransform,onDeactivateTransform:a.onDeactivateTransform,selected:!!v,minWidth:560,minHeight:340,headerStart:t.jsxs("div",{className:"dance-bundle-editor__title",children:[t.jsx(je,{size:13}),t.jsx("span",{children:"Dance Bundle Editor"}),U?t.jsx("span",{className:"dance-bundle-editor__dirty",children:"Unsaved"}):null]}),headerEnd:t.jsxs("div",{className:"dance-bundle-editor__actions",children:[t.jsx("button",{className:"icon-btn",onClick:ce,title:"Save draft",children:t.jsx(ve,{size:12})}),t.jsx("button",{className:"icon-btn",onClick:ue,title:"Save local asset",disabled:!U||!d.trim(),children:t.jsx(xe,{size:12})}),t.jsx("button",{className:"icon-btn",onClick:me,title:"Publish asset",disabled:!U||!d.trim(),children:t.jsx(_e,{size:12})}),t.jsx("button",{className:"icon-btn",onClick:()=>E(i),title:"Close editor",children:t.jsx(Z,{size:12})})]}),children:[t.jsx("div",{className:"dance-bundle-editor__meta nodrag nowheel",onPointerDownCapture:$,onClick:$,children:t.jsxs("div",{className:"dance-bundle-editor__meta-row",children:[t.jsxs("label",{className:"dance-bundle-editor__field",children:[t.jsx("span",{className:"dance-bundle-editor__field-label",children:"Name"}),t.jsx("input",{className:"text-input nodrag nowheel",value:d,onChange:e=>p({...n,name:e.target.value,updatedAt:Date.now()}),placeholder:"Enter asset name"})]}),t.jsxs("label",{className:"dance-bundle-editor__field",children:[t.jsx("span",{className:"dance-bundle-editor__field-label",children:"Description"}),t.jsx("input",{className:"text-input nodrag nowheel",value:g,onChange:e=>p({...n,description:e.target.value,updatedAt:Date.now()}),placeholder:"What this skill does"})]})]})}),t.jsxs("div",{className:"dance-bundle-editor__body",onPointerDownCapture:$,onClick:$,children:[t.jsxs("div",{className:"dance-bundle-editor__tree-pane nodrag nowheel",children:[t.jsxs("div",{className:"dance-bundle-editor__tree-header",children:[t.jsx("span",{className:"dance-bundle-editor__tree-label",children:"Files"}),t.jsxs("div",{className:"dance-bundle-editor__tree-actions",children:[t.jsx("button",{className:"icon-btn",title:"New file",onClick:()=>{D(!0),P(!1),setTimeout(()=>{var e;return(e=Q.current)==null?void 0:e.focus()},50)},children:t.jsx(ge,{size:11})}),t.jsx("button",{className:"icon-btn",title:"New folder",onClick:()=>{D(!0),P(!0),setTimeout(()=>{var e;return(e=Q.current)==null?void 0:e.focus()},50)},children:t.jsx(be,{size:11})})]})]}),t.jsx("div",{className:"dance-bundle-editor__tree-content",children:G.length===0?t.jsx("div",{className:"dance-bundle-editor__tree-empty",children:"Loading…"}):G.map(e=>t.jsx(ee,{entry:e,depth:0,activeFilePath:S,expandedDirs:ne,onFileClick:re,onToggleDir:le},e.path))}),ae&&t.jsx("div",{className:"dance-bundle-editor__new-file-input",children:t.jsx("input",{ref:Q,className:"nodrag nowheel",value:F,onChange:e=>q(e.target.value),onKeyDown:e=>{e.key==="Enter"&&oe(),e.key==="Escape"&&(D(!1),q(""))},onBlur:()=>{F.trim()||D(!1)},placeholder:R?"directory-name":"scripts/helper.ts"})})]}),t.jsxs("div",{className:"dance-bundle-editor__editor-pane",children:[t.jsx("div",{className:"dance-bundle-editor__tabs nodrag nowheel",children:h.map(e=>t.jsxs("div",{className:`dance-bundle-editor__tab${e.path===S?" dance-bundle-editor__tab--active":""}`,onClick:()=>I(e.path),children:[t.jsxs("span",{children:[e.name,e.dirty?" •":""]}),e.path!=="SKILL.md"&&t.jsx("button",{className:"dance-bundle-editor__tab-close",onClick:s=>{s.stopPropagation(),ie(e.path)},title:"Close tab",children:"×"})]},e.path))}),H?t.jsx("textarea",{className:"dance-bundle-editor__textarea nodrag nowheel",value:H.content,onChange:e=>de(H.path,e.target.value),spellCheck:!1,placeholder:"Write skill content here…"}):t.jsx("div",{className:"dance-bundle-editor__no-file",children:"Select a file from the tree to edit"})]})]}),K?t.jsx("div",{className:`dance-bundle-editor__status dance-bundle-editor__status--${K.tone}`,children:K.message}):null,M?t.jsx("div",{className:"dance-bundle-editor__status",children:M==="draft"?"Saving draft…":M==="local"?"Saving local asset…":"Publishing…"}):null]}):t.jsx("div",{className:"dance-bundle-editor dance-bundle-editor--missing",children:t.jsxs("div",{className:"dance-bundle-editor__title",children:[t.jsx("span",{children:"Missing draft"}),t.jsx("button",{className:"icon-btn",onClick:()=>E(i),title:"Close editor",children:t.jsx(Z,{size:12})})]})})}export{Ke as default};
@@ -0,0 +1 @@
1
+ .dance-bundle-editor{width:100%;height:100%;overflow:hidden}.dance-bundle-editor__title{display:flex;align-items:center;gap:8px;font-size:var(--font-md);font-weight:600}.dance-bundle-editor__dirty{padding:2px 6px;border-radius:999px;background:#f248221f;color:var(--tal-color);font-size:var(--font-sm);font-weight:600}.dance-bundle-editor__actions{display:flex;align-items:center;gap:4px}.dance-bundle-editor__meta{display:flex;flex-direction:column;gap:6px;padding:10px 12px;border-bottom:1px solid var(--border-main)}.dance-bundle-editor__meta-row{display:grid;grid-template-columns:1fr 1fr;gap:8px}.dance-bundle-editor__field{display:flex;flex-direction:column;gap:3px}.dance-bundle-editor__field-label{font-size:var(--font-xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted)}.dance-bundle-editor__body{display:grid;grid-template-columns:180px minmax(0,1fr);flex:1;min-height:0}.dance-bundle-editor__tree-pane{display:flex;flex-direction:column;min-height:0;overflow:auto;border-right:1px solid var(--border-main);background:var(--bg-panel)}.dance-bundle-editor__tree-header{display:flex;align-items:center;justify-content:space-between;padding:6px 10px 4px;border-bottom:1px solid var(--border-light);flex-shrink:0}.dance-bundle-editor__tree-label{font-size:var(--font-xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted)}.dance-bundle-editor__tree-actions{display:flex;gap:2px}.dance-bundle-editor__tree-content{flex:1;overflow:auto;padding:4px 0}.dance-bundle-editor__tree-item{display:flex;align-items:center;gap:4px;padding:3px 10px;cursor:pointer;font-size:var(--font-sm);color:var(--text-secondary);transition:background .1s;-webkit-user-select:none;user-select:none}.dance-bundle-editor__tree-item:hover{background:var(--bg-hover)}.dance-bundle-editor__tree-item--active{background:var(--bg-hover);color:var(--text-primary);font-weight:500}.dance-bundle-editor__tree-item--dir{font-weight:500;color:var(--text-muted)}.dance-bundle-editor__tree-item--indent-1{padding-left:22px}.dance-bundle-editor__tree-item--indent-2{padding-left:34px}.dance-bundle-editor__tree-item--indent-3{padding-left:46px}.dance-bundle-editor__tree-empty{padding:12px 10px;font-size:var(--font-sm);color:var(--text-muted);font-style:italic}.dance-bundle-editor__editor-pane{display:flex;flex-direction:column;min-height:0;overflow:hidden}.dance-bundle-editor__tabs{display:flex;align-items:stretch;gap:0;border-bottom:1px solid var(--border-main);background:var(--bg-panel);flex-shrink:0;overflow-x:auto}.dance-bundle-editor__tab{display:flex;align-items:center;gap:4px;padding:6px 12px;font-size:var(--font-sm);color:var(--text-muted);cursor:pointer;border:none;background:none;border-bottom:2px solid transparent;transition:color .1s,border-color .1s;white-space:nowrap}.dance-bundle-editor__tab:hover{color:var(--text-secondary)}.dance-bundle-editor__tab--active{color:var(--text-primary);border-bottom-color:var(--accent);font-weight:500}.dance-bundle-editor__tab-close{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;padding:0;border:none;border-radius:2px;background:transparent;color:var(--text-muted);font-size:var(--font-sm);cursor:pointer}.dance-bundle-editor__tab-close:hover{color:var(--tal-color);background:#f248221a}.dance-bundle-editor__textarea{width:100%;flex:1;resize:none;border:none;background:var(--bg-main);color:var(--text-main);padding:14px;font:12px/1.6 var(--font-mono, "SFMono-Regular", Consolas, monospace);outline:none;min-height:0}.dance-bundle-editor__no-file{display:flex;align-items:center;justify-content:center;flex:1;color:var(--text-muted);font-size:var(--font-md);font-style:italic}.dance-bundle-editor__status{padding:8px 12px;border-top:1px solid var(--border-main);font-size:var(--font-base);color:var(--text-secondary)}.dance-bundle-editor__status--error{color:var(--tal-color)}.dance-bundle-editor__status--success{color:var(--dance-color)}.dance-bundle-editor__new-file-input{display:flex;align-items:center;gap:4px;padding:3px 10px;border-top:1px solid var(--border-light)}.dance-bundle-editor__new-file-input input{flex:1;border:none;background:transparent;color:var(--text-primary);font-size:var(--font-sm);outline:none;padding:2px 0}
@@ -0,0 +1 @@
1
+ .markdown-editor-frame{width:100%;height:100%;overflow:hidden}.markdown-editor-frame .react-flow__resize-control{z-index:5}.markdown-editor-frame--missing{justify-content:center}.markdown-editor-frame__title{display:flex;align-items:center;gap:8px;font-size:var(--font-md);font-weight:600}.markdown-editor-frame__dirty{padding:2px 6px;border-radius:999px;background:#f248221f;color:var(--tal-color);font-size:var(--font-sm);font-weight:600}.markdown-editor-frame__actions{display:flex;align-items:center;gap:4px}.markdown-editor-frame__meta{display:flex;flex-direction:column;gap:6px;padding:10px 12px;border-bottom:1px solid var(--border-main)}.markdown-editor-frame__meta-row{display:grid;grid-template-columns:1fr 1fr;gap:8px}.markdown-editor-frame__field{display:flex;flex-direction:column;gap:3px}.markdown-editor-frame__field-label{font-size:var(--font-xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted)}.markdown-editor-frame__body{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);flex:1;min-height:0}.markdown-editor-frame__editor-pane,.markdown-editor-frame__preview-pane{display:flex;flex-direction:column;min-height:0;overflow:hidden}.markdown-editor-frame__editor-pane{border-right:1px solid var(--border-main)}.markdown-editor-frame__pane-label{display:block;padding:6px 14px 4px;font-size:var(--font-xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);border-bottom:1px solid var(--border-light);flex-shrink:0}.markdown-editor-frame__textarea{width:100%;flex:1;resize:none;border:none;background:var(--bg-main);color:var(--text-main);padding:14px;font:12px/1.6 var(--font-mono, "SFMono-Regular", Consolas, monospace);outline:none;min-height:0}.markdown-editor-frame__preview{overflow:auto;padding:14px;background:var(--bg-panel);flex:1;min-height:0}.markdown-editor-frame__preview-empty{color:var(--text-muted);font-size:var(--font-md);font-style:italic}.markdown-editor-frame__status{padding:8px 12px;border-top:1px solid var(--border-main);font-size:var(--font-base);color:var(--text-secondary)}.markdown-editor-frame__status--error{color:var(--tal-color)}.markdown-editor-frame__status--success{color:var(--dance-color)}.tags-input{display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:3px 6px;border:1px solid transparent;border-radius:var(--radius-sm);background:transparent;transition:border-color .1s,background .1s;cursor:text;min-height:26px}.tags-input:hover{border-color:var(--border-main)}.tags-input:focus-within{border-color:var(--accent);background:var(--bg-panel)}.tags-input__chip{display:inline-flex;align-items:center;gap:2px;padding:1px 6px;border-radius:var(--radius-sm);background:var(--bg-hover);color:var(--text-secondary);font-size:var(--font-sm);font-weight:500;line-height:1.4;white-space:nowrap;-webkit-user-select:none;user-select:none}.tags-input__remove{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;padding:0;border:none;border-radius:2px;background:transparent;color:var(--text-muted);font-size:var(--font-md);line-height:1;cursor:pointer;transition:color .1s,background .1s}.tags-input__remove:hover{color:var(--tal-color);background:#f248221a}.tags-input__field{flex:1 1 60px;min-width:60px;border:none;background:transparent;color:var(--text-primary);font-size:var(--font-base);outline:none;padding:2px 0}
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DanceBundleEditorFrame-CH8VDUMK.js","assets/react-vendor-DzpMUNDT.js","assets/query-vendor-_taqgrbn.js","assets/index-CWrv6O3o.js","assets/flow-vendor-C868rU-6.js","assets/flow-vendor-BZV40eAE.css","assets/dnd-vendor-CIAZE2P2.js","assets/icon-vendor-I2JVIi1s.js","assets/markdown-vendor-DnTJ9hmR.js","assets/markdown-vendor-BSTcku12.css","assets/terminal-vendor-D0xRnmbI.js","assets/terminal-vendor-6GBZ9nXN.css","assets/index-p-wk7iGH.css","assets/queries-Dm1jEHfc.js","assets/CanvasWindowFrame-ziJeVfHG.js","assets/DanceBundleEditorFrame-DaLqMflT.css"])))=>i.map(i=>d[i]);
2
+ import{_ as B,u as h,a as M,I as $}from"./index-CWrv6O3o.js";import{j as e,r as k}from"./react-vendor-DzpMUNDT.js";import{b as R}from"./query-vendor-_taqgrbn.js";import{M as W}from"./MarkdownRenderer-Cz8A4AgP.js";import{c as L,q as I}from"./queries-Dm1jEHfc.js";import{C as Q}from"./CanvasWindowFrame-ziJeVfHG.js";import{X as z,ac as U,c as H,Y as O,ad as V}from"./icon-vendor-I2JVIi1s.js";import"./flow-vendor-C868rU-6.js";import"./dnd-vendor-CIAZE2P2.js";import"./markdown-vendor-DnTJ9hmR.js";import"./terminal-vendor-D0xRnmbI.js";const X=k.lazy(()=>B(()=>import("./DanceBundleEditorFrame-CH8VDUMK.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])));function Y({tags:i,onChange:a}){const[o,d]=k.useState(""),_=()=>{const s=o.trim();s&&!i.includes(s)&&a([...i,s]),d("")},y=s=>{a(i.filter((v,j)=>j!==s))},N=s=>{s.key===","||s.key==="Enter"?(s.preventDefault(),_()):s.key==="Backspace"&&!o&&i.length>0&&y(i.length-1)};return e.jsxs("div",{className:"markdown-editor-frame__field",children:[e.jsx("span",{className:"markdown-editor-frame__field-label",children:"Tags"}),e.jsxs("div",{className:"tags-input nodrag nowheel",children:[i.map((s,v)=>e.jsxs("span",{className:"tags-input__chip",children:[s,e.jsx("button",{type:"button",className:"tags-input__remove",onClick:()=>y(v),"aria-label":`Remove ${s}`,children:"×"})]},`${s}-${v}`)),e.jsx("input",{className:"tags-input__field nodrag nowheel",value:o,onChange:s=>d(s.target.value),onKeyDown:N,onBlur:_,placeholder:i.length===0?"Type and press comma":""})]})]})}function G(i){return i.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"untitled"}function J(i=[],a=[]){return i.length!==a.length?!1:i.every((o,d)=>o===a[d])}function me(i){const{id:a,data:o,selected:d}=i;return o.kind==="dance"?e.jsx(k.Suspense,{fallback:null,children:e.jsx(X,{id:a,data:o,selected:d,type:"markdownEditor"})}):e.jsx(Z,{id:a,data:o,selected:d})}function Z({id:i,data:a,selected:o}){const d=h(r=>r.drafts),_=h(r=>r.setPerformerTalRef),y=h(r=>r.addPerformerDanceRef),N=h(r=>r.replacePerformerDanceRef),s=h(r=>r.upsertDraft),v=h(r=>r.updateMarkdownEditorBaseline),j=h(r=>r.removeMarkdownEditor),{data:b}=L(),D=R(),n=d[a.draftId],[C,m]=k.useState(null),[E,x]=k.useState(null),g=r=>{r.stopPropagation()},u=a.baseline||null,l=typeof(n==null?void 0:n.name)=="string"?n.name:"",w=typeof(n==null?void 0:n.slug)=="string"&&n.slug.trim()?n.slug:G(l),p=typeof(n==null?void 0:n.description)=="string"?n.description:"",f=k.useMemo(()=>Array.isArray(n==null?void 0:n.tags)?n.tags:[],[n==null?void 0:n.tags]),c=typeof(n==null?void 0:n.content)=="string"?n.content:"",S=k.useMemo(()=>u?u.name!==l||(u.slug||"")!==w||(u.description||"")!==p||!J(u.tags||[],f)||u.content!==c:!0,[u,c,p,l,w,f]),A=r=>{const t=a.attachTarget;if(t!=null&&t.performerId){if(t.mode==="tal"){_(t.performerId,r.kind==="draft"?{kind:"draft",draftId:r.draftId}:{kind:"registry",urn:r.urn});return}if(t.mode==="dance-new"&&!t.targetRef){y(t.performerId,r.kind==="draft"?{kind:"draft",draftId:r.draftId}:{kind:"registry",urn:r.urn});return}t.targetRef&&N(t.performerId,t.targetRef,r.kind==="draft"?{kind:"draft",draftId:r.draftId}:{kind:"registry",urn:r.urn})}},P=r=>{v(i,{name:l,slug:w,description:p,tags:f,content:c}),s({id:a.draftId,kind:a.kind,name:l,slug:w,description:p,tags:f,content:c,derivedFrom:r||(n==null?void 0:n.derivedFrom)||void 0,updatedAt:Date.now()})},T=async()=>{await Promise.all([D.invalidateQueries({queryKey:I.assets(a.workingDir)}),D.invalidateQueries({queryKey:I.assetInventory(a.workingDir)}),D.invalidateQueries({queryKey:I.assetKind(a.workingDir,a.kind)})])},q=()=>{A({kind:"draft",draftId:a.draftId}),P((n==null?void 0:n.derivedFrom)||null),m({tone:"success",message:"Saved stage-local draft."})},F=async()=>{try{x("local"),m(null);const r={description:p.trim()||l.trim()||a.kind,tags:f,content:c},t=await M.dot.saveLocalAsset(a.kind,w.trim(),r,(b==null?void 0:b.username)||void 0);A({kind:"registry",urn:t.urn}),P(t.urn),await T(),m({tone:"success",message:t.existed?`Updated local ${a.kind} asset at ${t.urn}.`:`Saved local ${a.kind} asset at ${t.urn}.`})}catch(r){m({tone:"error",message:$(r,!1)})}finally{x(null)}},K=async()=>{try{x("publish"),m(null);const r={description:p.trim()||l.trim()||a.kind,tags:f,content:c},t=await M.dot.publishAsset(a.kind,w.trim(),r,r.tags,!0);A({kind:"registry",urn:t.urn}),P(t.urn),await T(),m({tone:"success",message:t.published?`Published ${t.urn}.`:`${t.urn} already exists in the registry.`})}catch(r){m({tone:"error",message:$(r,!1)})}finally{x(null)}};return n?e.jsxs(Q,{className:"markdown-editor-frame",width:Number(a.width||560),height:Number(a.height||380),transformActive:!!a.transformActive,onActivateTransform:a.onActivateTransform,onDeactivateTransform:a.onDeactivateTransform,selected:!!o,minWidth:420,minHeight:280,headerStart:e.jsxs("div",{className:"markdown-editor-frame__title",children:[e.jsx(V,{size:13}),e.jsx("span",{children:a.kind==="tal"?"Tal Editor":"Dance Editor"}),S?e.jsx("span",{className:"markdown-editor-frame__dirty",children:"Unsaved"}):null]}),headerEnd:e.jsxs("div",{className:"markdown-editor-frame__actions",children:[e.jsx("button",{className:"icon-btn",onClick:q,title:"Save draft",children:e.jsx(U,{size:12})}),e.jsx("button",{className:"icon-btn",onClick:F,title:"Save local asset",disabled:!S||!l.trim(),children:e.jsx(H,{size:12})}),e.jsx("button",{className:"icon-btn",onClick:K,title:"Publish asset",disabled:!S||!l.trim(),children:e.jsx(O,{size:12})}),e.jsx("button",{className:"icon-btn",onClick:()=>j(i),title:"Close editor",children:e.jsx(z,{size:12})})]}),children:[e.jsxs("div",{className:"markdown-editor-frame__meta nodrag nowheel",onPointerDownCapture:g,onClick:g,children:[e.jsxs("div",{className:"markdown-editor-frame__meta-row",children:[e.jsxs("label",{className:"markdown-editor-frame__field",children:[e.jsx("span",{className:"markdown-editor-frame__field-label",children:"Name"}),e.jsx("input",{className:"text-input nodrag nowheel",value:l,onChange:r=>s({...n,name:r.target.value,updatedAt:Date.now()}),placeholder:"Enter asset name"})]}),e.jsx(Y,{tags:f,onChange:r=>s({...n,tags:r,updatedAt:Date.now()})})]}),e.jsxs("label",{className:"markdown-editor-frame__field",children:[e.jsx("span",{className:"markdown-editor-frame__field-label",children:"Description"}),e.jsx("input",{className:"text-input nodrag nowheel",value:p,onChange:r=>s({...n,description:r.target.value,updatedAt:Date.now()}),placeholder:"What this asset does"})]})]}),e.jsxs("div",{className:"markdown-editor-frame__body",onPointerDownCapture:g,onClick:g,children:[e.jsxs("div",{className:"markdown-editor-frame__editor-pane",children:[e.jsx("span",{className:"markdown-editor-frame__pane-label",children:"Markdown Editor"}),e.jsx("textarea",{className:"markdown-editor-frame__textarea nodrag nowheel",value:c,onChange:r=>s({...n,content:r.target.value,updatedAt:Date.now()}),spellCheck:!1,placeholder:a.kind==="tal"?"Write the agent persona, global rules, workflows, and core instructions here using Markdown…":"Write an optional skill or knowledge the agent can use, including when to apply it and how…"})]}),e.jsxs("div",{className:"markdown-editor-frame__preview-pane",children:[e.jsx("span",{className:"markdown-editor-frame__pane-label",children:"Markdown Preview"}),e.jsx("div",{className:"markdown-editor-frame__preview nowheel",onPointerDownCapture:g,onClick:g,children:c?e.jsx(W,{content:c}):e.jsx("span",{className:"markdown-editor-frame__preview-empty",children:"Preview will appear here as you type…"})})]})]}),C?e.jsx("div",{className:`markdown-editor-frame__status markdown-editor-frame__status--${C.tone}`,children:C.message}):null,E?e.jsx("div",{className:"markdown-editor-frame__status",children:E==="draft"?"Saving draft…":E==="local"?"Saving local asset…":"Publishing…"}):null]}):e.jsx("div",{className:"markdown-editor-frame markdown-editor-frame--missing",children:e.jsxs("div",{className:"markdown-editor-frame__header",children:[e.jsx("span",{children:"Missing draft"}),e.jsx("button",{className:"icon-btn",onClick:()=>j(i),title:"Close editor",children:e.jsx(z,{size:12})})]})})}export{me as default};
@@ -0,0 +1 @@
1
+ import{j as e,r as c}from"./react-vendor-DzpMUNDT.js";import{M as p,i as m,h as x}from"./markdown-vendor-DnTJ9hmR.js";import{m as g,b as u,C as k,a6 as j}from"./icon-vendor-I2JVIi1s.js";function l(n){return typeof n=="string"?n:typeof n=="number"?String(n):Array.isArray(n)?n.map(s=>l(s)).join(""):""}function f(n){const s=n.match(/^<think>([\s\S]*?)<\/think>\s*([\s\S]*)$/);return s?{thinking:s[1].trim(),response:s[2].trim()}:{thinking:null,response:n}}function C({text:n}){const[s,o]=c.useState(!1),r=c.useCallback(()=>{navigator.clipboard.writeText(n),o(!0),setTimeout(()=>o(!1),2e3)},[n]);return e.jsx("button",{className:"code-copy-btn",onClick:r,title:"Copy code",children:s?e.jsx(k,{size:12}):e.jsx(j,{size:12})})}function b({content:n}){const[s,o]=c.useState(!1);return e.jsxs("div",{className:"thinking-block",children:[e.jsxs("button",{className:"thinking-toggle",onClick:()=>o(!s),children:[s?e.jsx(g,{size:12}):e.jsx(u,{size:12}),e.jsx("span",{className:"thinking-label",children:"Thinking"}),!s&&e.jsxs("span",{className:"thinking-preview",children:[n.slice(0,60),"…"]})]}),s&&e.jsx("div",{className:"thinking-content",children:n})]})}function S({content:n}){const{thinking:s,response:o}=f(n);return e.jsxs("div",{className:"md-renderer",children:[s&&e.jsx(b,{content:s}),e.jsx(p,{remarkPlugins:[x],rehypePlugins:[m],components:{pre({children:r,...a}){const i=c.Children.toArray(r)[0],t=c.isValidElement(i)?i:null,d=l(t==null?void 0:t.props.children),h=((t==null?void 0:t.props.className)||"").replace(/language-/g,"").replace(/hljs\s*/g,"").trim();return e.jsxs("div",{className:"code-block-wrapper",children:[e.jsxs("div",{className:"code-block-header",children:[e.jsx("span",{className:"code-lang",children:h||"code"}),e.jsx(C,{text:String(d)})]}),e.jsx("pre",{...a,children:r})]})},code({className:r,children:a,...i}){return r?e.jsx("code",{className:r,...i,children:a}):e.jsx("code",{className:"inline-code",...i,children:a})},a({href:r,children:a,...i}){return e.jsx("a",{href:r,target:"_blank",rel:"noopener noreferrer",...i,children:a})}},children:o})]})}export{S as M};