@swirls/looms 0.0.2 → 0.2.0

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 (375) hide show
  1. package/CHANGELOG.md +24 -2
  2. package/dist/actor/cell.d.ts +9 -4
  3. package/dist/actor/cell.js +7 -11
  4. package/dist/actor/host.d.ts +7 -3
  5. package/dist/actor/host.js +57 -33
  6. package/dist/actor/index.d.ts +1 -1
  7. package/dist/actor/index.js +1 -1
  8. package/dist/actor/routing.d.ts +12 -1
  9. package/dist/actor/routing.js +57 -51
  10. package/dist/agent/agent-session.d.ts +5 -0
  11. package/dist/agent/agent-session.js +270 -0
  12. package/dist/agent/debugger/agent-chat.d.ts +2 -0
  13. package/dist/agent/debugger/agent-chat.js +176 -0
  14. package/dist/agent/debugger/index.d.ts +5 -0
  15. package/dist/agent/debugger/index.js +19 -0
  16. package/dist/agent/debugger/summarize.d.ts +2 -0
  17. package/dist/agent/debugger/summarize.js +51 -0
  18. package/dist/agent/debugger/token-usage.d.ts +3 -0
  19. package/dist/agent/debugger/token-usage.js +11 -0
  20. package/dist/agent/definitions-store.d.ts +2 -3
  21. package/dist/agent/definitions-store.js +2 -4
  22. package/dist/agent/definitions.d.ts +47 -29
  23. package/dist/agent/definitions.js +39 -12
  24. package/dist/agent/effects.d.ts +359 -2
  25. package/dist/agent/effects.js +60 -34
  26. package/dist/agent/events.d.ts +175 -19
  27. package/dist/agent/events.js +45 -10
  28. package/dist/agent/index.d.ts +1 -0
  29. package/dist/agent/index.js +1 -0
  30. package/dist/agent/llm.d.ts +11 -2
  31. package/dist/agent/llm.js +13 -3
  32. package/dist/agent/module.d.ts +812 -78
  33. package/dist/agent/module.js +16 -4
  34. package/dist/agent/scope.d.ts +174 -18
  35. package/dist/agent/signals.d.ts +26 -1
  36. package/dist/agent/signals.js +79 -0
  37. package/dist/agent/threads.d.ts +3 -33
  38. package/dist/agent/threads.js +20 -25
  39. package/dist/agent/tool-schema.d.ts +1 -17
  40. package/dist/agent/tool-schema.js +3 -43
  41. package/dist/agent/types.d.ts +49 -4
  42. package/dist/agent/types.js +5 -5
  43. package/dist/ai-vercel/index.d.ts +1 -0
  44. package/dist/ai-vercel/index.js +1 -0
  45. package/dist/ai-vercel/messages.js +22 -7
  46. package/dist/ai-vercel/vercel-evaluator.d.ts +36 -0
  47. package/dist/ai-vercel/vercel-evaluator.js +73 -0
  48. package/dist/ai-vercel/vercel-llm.js +64 -44
  49. package/dist/approval/debugger/approvals-view.d.ts +3 -0
  50. package/dist/approval/debugger/approvals-view.js +16 -0
  51. package/dist/approval/debugger/index.d.ts +4 -0
  52. package/dist/approval/debugger/index.js +11 -0
  53. package/dist/approval/debugger/summarize.d.ts +2 -0
  54. package/dist/approval/debugger/summarize.js +17 -0
  55. package/dist/approval/effects.d.ts +89 -0
  56. package/dist/approval/module.d.ts +179 -29
  57. package/dist/approval/projections.d.ts +0 -14
  58. package/dist/approval/projections.js +20 -3
  59. package/dist/approval/signals.d.ts +2 -0
  60. package/dist/approval/signals.js +18 -2
  61. package/dist/cli/cli.js +2 -0
  62. package/dist/cli/commands.js +12 -16
  63. package/dist/client/client.d.ts +1213 -18
  64. package/dist/client/client.js +120 -120
  65. package/dist/client/index.d.ts +1 -1
  66. package/dist/client/index.js +1 -1
  67. package/dist/client/sse.d.ts +13 -0
  68. package/dist/client/sse.js +38 -44
  69. package/dist/cloudflare/alarm-scheduler.d.ts +12 -2
  70. package/dist/cloudflare/alarm-scheduler.js +34 -7
  71. package/dist/cloudflare/durable-object.d.ts +10 -2
  72. package/dist/cloudflare/durable-object.js +59 -28
  73. package/dist/cloudflare/event-store.d.ts +7 -2
  74. package/dist/cloudflare/event-store.js +8 -7
  75. package/dist/cloudflare/index.d.ts +2 -2
  76. package/dist/cloudflare/index.js +2 -2
  77. package/dist/cloudflare/router.d.ts +1 -1
  78. package/dist/cloudflare/router.js +15 -16
  79. package/dist/core/catalog.d.ts +3 -3
  80. package/dist/core/catalog.js +2 -5
  81. package/dist/core/coalesce.js +5 -3
  82. package/dist/core/compose.d.ts +2 -1
  83. package/dist/core/compose.js +19 -2
  84. package/dist/core/debugger-host.d.ts +16 -0
  85. package/dist/core/debugger-host.js +1 -0
  86. package/dist/core/definition-store.d.ts +11 -0
  87. package/dist/core/definition-store.js +6 -0
  88. package/dist/core/effects.d.ts +127 -15
  89. package/dist/core/effects.js +89 -17
  90. package/dist/core/envelope.d.ts +27 -7
  91. package/dist/core/envelope.js +20 -6
  92. package/dist/core/event-codec.d.ts +4 -2
  93. package/dist/core/event-codec.js +10 -5
  94. package/dist/core/event-index.js +1 -3
  95. package/dist/core/fold.d.ts +3 -0
  96. package/dist/core/fold.js +171 -24
  97. package/dist/core/ids.d.ts +5 -0
  98. package/dist/core/ids.js +35 -2
  99. package/dist/core/index.d.ts +7 -1
  100. package/dist/core/index.js +6 -1
  101. package/dist/core/kind.d.ts +22 -0
  102. package/dist/core/kind.js +17 -0
  103. package/dist/core/limits.d.ts +34 -0
  104. package/dist/core/limits.js +46 -0
  105. package/dist/core/match.d.ts +1 -0
  106. package/dist/core/match.js +10 -1
  107. package/dist/core/module-scope.d.ts +22 -20
  108. package/dist/core/module-scope.js +38 -28
  109. package/dist/core/module.d.ts +18 -5
  110. package/dist/core/module.js +4 -0
  111. package/dist/core/projection.d.ts +13 -13
  112. package/dist/core/projection.js +9 -5
  113. package/dist/core/protocol.d.ts +68 -11
  114. package/dist/core/protocol.js +82 -11
  115. package/dist/core/published.d.ts +43 -0
  116. package/dist/core/published.js +44 -0
  117. package/dist/core/replay.d.ts +312 -3
  118. package/dist/core/replay.js +11 -1
  119. package/dist/core/schema.d.ts +11 -20
  120. package/dist/core/schema.js +63 -80
  121. package/dist/core/serialize.js +2 -4
  122. package/dist/core/snapshot-store.d.ts +6 -1
  123. package/dist/core/snapshot-store.js +15 -2
  124. package/dist/core/snapshots.d.ts +5 -1
  125. package/dist/core/snapshots.js +10 -15
  126. package/dist/core/sqlite-store.js +95 -11
  127. package/dist/core/state.d.ts +142 -4
  128. package/dist/core/state.js +78 -0
  129. package/dist/core/store.d.ts +38 -3
  130. package/dist/core/store.js +77 -22
  131. package/dist/core/thread.d.ts +10 -9
  132. package/dist/core/types.d.ts +5 -8
  133. package/dist/core/types.js +28 -24
  134. package/dist/core/validate-event.js +14 -4
  135. package/dist/core/worker-callback.d.ts +17 -0
  136. package/dist/core/worker-callback.js +1 -0
  137. package/dist/debugger/app/assets/index-B3Ah8WAE.css +2 -0
  138. package/dist/debugger/app/assets/index-Qb371t_O.js +22 -0
  139. package/dist/debugger/app/assets/rolldown-runtime-CbXtAM7H.js +1 -0
  140. package/dist/debugger/app/assets/routes-CjtEHgPQ.js +47 -0
  141. package/dist/debugger/app/index.html +14 -0
  142. package/dist/debugger/components/composer.d.ts +17 -0
  143. package/dist/debugger/components/composer.js +25 -0
  144. package/dist/debugger/components/debugger-split.d.ts +2 -1
  145. package/dist/debugger/components/debugger-split.js +2 -2
  146. package/dist/debugger/components/event-inspector.d.ts +2 -1
  147. package/dist/debugger/components/event-inspector.js +25 -16
  148. package/dist/debugger/components/event-stream.d.ts +2 -1
  149. package/dist/debugger/components/event-stream.js +14 -74
  150. package/dist/debugger/components/follow-list.d.ts +19 -0
  151. package/dist/debugger/components/follow-list.js +96 -0
  152. package/dist/debugger/components/json-tree.d.ts +11 -0
  153. package/dist/debugger/components/json-tree.js +120 -0
  154. package/dist/debugger/components/json-view.js +2 -2
  155. package/dist/debugger/components/run-tree.js +53 -20
  156. package/dist/debugger/components/status-dot.d.ts +4 -0
  157. package/dist/debugger/components/status-dot.js +6 -2
  158. package/dist/debugger/context.d.ts +14 -0
  159. package/dist/debugger/context.js +17 -0
  160. package/dist/debugger/contracts.d.ts +7 -4
  161. package/dist/debugger/events/builtin-families.d.ts +3 -0
  162. package/dist/debugger/events/builtin-families.js +9 -0
  163. package/dist/debugger/events/catalog.d.ts +3 -4
  164. package/dist/debugger/events/catalog.js +27 -17
  165. package/dist/debugger/events/protocol-summarize.d.ts +1 -2
  166. package/dist/debugger/events/protocol-summarize.js +42 -24
  167. package/dist/debugger/index.d.ts +20 -6
  168. package/dist/debugger/index.js +19 -5
  169. package/dist/debugger/lib/cn.d.ts +1 -0
  170. package/dist/debugger/lib/cn.js +3 -0
  171. package/dist/debugger/lib/event-meta.d.ts +2 -3
  172. package/dist/debugger/lib/event-meta.js +6 -12
  173. package/dist/debugger/lib/json.d.ts +25 -0
  174. package/dist/debugger/lib/json.js +87 -0
  175. package/dist/debugger/lib/payload.d.ts +7 -0
  176. package/dist/debugger/lib/payload.js +11 -0
  177. package/dist/debugger/lib/time.d.ts +3 -0
  178. package/dist/debugger/lib/time.js +24 -0
  179. package/dist/debugger/plugin.d.ts +36 -0
  180. package/dist/debugger/plugin.js +14 -0
  181. package/dist/debugger/server/index.d.ts +14 -0
  182. package/dist/debugger/server/index.js +114 -0
  183. package/dist/debugger/shell/debugger-shell.d.ts +15 -0
  184. package/dist/debugger/shell/debugger-shell.js +43 -0
  185. package/dist/debugger/shell/definition-key.d.ts +3 -0
  186. package/dist/debugger/shell/definition-key.js +4 -0
  187. package/dist/debugger/shell/events-pane.d.ts +12 -0
  188. package/dist/debugger/shell/events-pane.js +25 -0
  189. package/dist/debugger/shell/projections-panel.d.ts +4 -0
  190. package/dist/debugger/shell/projections-panel.js +59 -0
  191. package/dist/debugger/shell/run-controls.d.ts +4 -0
  192. package/dist/debugger/shell/run-controls.js +72 -0
  193. package/dist/debugger/shell/run-search.d.ts +6 -0
  194. package/dist/debugger/shell/run-search.js +102 -0
  195. package/dist/debugger/shell/run-type-menu.d.ts +6 -0
  196. package/dist/debugger/shell/run-type-menu.js +11 -0
  197. package/dist/debugger/shell/schema-form.d.ts +31 -0
  198. package/dist/debugger/shell/schema-form.js +117 -0
  199. package/dist/debugger/shell/start-form.d.ts +3 -0
  200. package/dist/debugger/shell/start-form.js +75 -0
  201. package/dist/debugger/shell/use-start-run.d.ts +14 -0
  202. package/dist/debugger/shell/use-start-run.js +32 -0
  203. package/dist/debugger/shell/workspace.d.ts +6 -0
  204. package/dist/debugger/shell/workspace.js +15 -0
  205. package/dist/debugger/styles.css +111 -27
  206. package/dist/debugger/ui/button.d.ts +24 -0
  207. package/dist/debugger/ui/button.js +24 -0
  208. package/dist/debugger/ui/command.d.ts +9 -0
  209. package/dist/debugger/ui/command.js +24 -0
  210. package/dist/debugger/ui/dropdown-menu.d.ts +13 -0
  211. package/dist/debugger/ui/dropdown-menu.js +37 -0
  212. package/dist/debugger/ui/panel.d.ts +14 -0
  213. package/dist/debugger/ui/panel.js +16 -0
  214. package/dist/debugger/ui/popover.d.ts +7 -0
  215. package/dist/debugger/ui/popover.js +17 -0
  216. package/dist/debugger/ui/resizable.d.ts +7 -0
  217. package/dist/debugger/ui/resizable.js +14 -0
  218. package/dist/debugger/ui/scroll-area.d.ts +2 -1
  219. package/dist/debugger/ui/scroll-area.js +5 -3
  220. package/dist/debugger/ui/select.d.ts +10 -0
  221. package/dist/debugger/ui/select.js +21 -0
  222. package/dist/debugger/ui/tabs.js +2 -2
  223. package/dist/debugger/ui/textarea.d.ts +3 -0
  224. package/dist/debugger/ui/textarea.js +7 -0
  225. package/dist/evaluator/definitions-store.d.ts +11 -0
  226. package/dist/evaluator/definitions-store.js +8 -0
  227. package/dist/evaluator/definitions.d.ts +18 -0
  228. package/dist/evaluator/definitions.js +4 -0
  229. package/dist/evaluator/effects.d.ts +226 -0
  230. package/dist/evaluator/effects.js +132 -0
  231. package/dist/evaluator/evaluator.d.ts +24 -0
  232. package/dist/evaluator/evaluator.js +67 -0
  233. package/dist/evaluator/events.d.ts +59 -0
  234. package/dist/evaluator/events.js +21 -0
  235. package/dist/evaluator/index.d.ts +11 -0
  236. package/dist/evaluator/index.js +11 -0
  237. package/dist/evaluator/module.d.ts +606 -0
  238. package/dist/evaluator/module.js +25 -0
  239. package/dist/evaluator/projections.d.ts +50 -0
  240. package/dist/evaluator/projections.js +20 -0
  241. package/dist/evaluator/scope.d.ts +59 -0
  242. package/dist/evaluator/scope.js +7 -0
  243. package/dist/evaluator/signals.d.ts +3 -0
  244. package/dist/evaluator/signals.js +17 -0
  245. package/dist/evaluator/threads.d.ts +62 -0
  246. package/dist/evaluator/threads.js +117 -0
  247. package/dist/evaluator/types.d.ts +125 -0
  248. package/dist/evaluator/types.js +51 -0
  249. package/dist/projectors/delivery.d.ts +83 -0
  250. package/dist/projectors/delivery.js +182 -0
  251. package/dist/projectors/index-model.d.ts +1 -1
  252. package/dist/projectors/index-model.js +4 -6
  253. package/dist/projectors/index.d.ts +2 -0
  254. package/dist/projectors/index.js +2 -0
  255. package/dist/projectors/memory.d.ts +1 -1
  256. package/dist/projectors/memory.js +10 -8
  257. package/dist/projectors/postgres.js +44 -58
  258. package/dist/projectors/projector.d.ts +17 -0
  259. package/dist/projectors/projector.js +26 -1
  260. package/dist/projectors/sqlite-delivery.d.ts +4 -0
  261. package/dist/projectors/sqlite-delivery.js +147 -0
  262. package/dist/projectors/sqlite.js +23 -23
  263. package/dist/projectors/with-projectors.d.ts +7 -2
  264. package/dist/projectors/with-projectors.js +27 -28
  265. package/dist/react/notify.js +11 -8
  266. package/dist/react/react.d.ts +2 -3
  267. package/dist/react/react.js +14 -30
  268. package/dist/react/sse.d.ts +1 -1
  269. package/dist/react/sse.js +1 -1
  270. package/dist/react/store.d.ts +3 -3
  271. package/dist/react/store.js +109 -119
  272. package/dist/runtime/cancellation.d.ts +16 -0
  273. package/dist/runtime/cancellation.js +129 -0
  274. package/dist/runtime/deadline-transition-planner.d.ts +31 -0
  275. package/dist/runtime/deadline-transition-planner.js +139 -0
  276. package/dist/runtime/dispatch-effect.d.ts +3 -2
  277. package/dist/runtime/dispatch-effect.js +7 -13
  278. package/dist/runtime/errors.d.ts +51 -0
  279. package/dist/runtime/errors.js +39 -0
  280. package/dist/runtime/{runtime-helpers.d.ts → helpers.d.ts} +24 -4
  281. package/dist/runtime/{runtime-helpers.js → helpers.js} +56 -19
  282. package/dist/runtime/index.d.ts +3 -3
  283. package/dist/runtime/index.js +3 -3
  284. package/dist/runtime/ingress.d.ts +15 -0
  285. package/dist/runtime/ingress.js +42 -0
  286. package/dist/runtime/local-effect-executor.d.ts +21 -0
  287. package/dist/runtime/local-effect-executor.js +137 -0
  288. package/dist/runtime/looms.d.ts +30 -4
  289. package/dist/runtime/looms.js +57 -37
  290. package/dist/runtime/observer.d.ts +45 -0
  291. package/dist/runtime/observer.js +11 -0
  292. package/dist/runtime/repository.d.ts +55 -0
  293. package/dist/runtime/repository.js +293 -0
  294. package/dist/runtime/retry-policy.d.ts +16 -0
  295. package/dist/runtime/retry-policy.js +29 -0
  296. package/dist/runtime/run-execution-context.d.ts +30 -0
  297. package/dist/runtime/run-execution-context.js +56 -0
  298. package/dist/runtime/run-start.d.ts +4 -0
  299. package/dist/runtime/run-start.js +44 -0
  300. package/dist/runtime/runtime.d.ts +6 -87
  301. package/dist/runtime/runtime.js +248 -470
  302. package/dist/runtime/server/auth.d.ts +41 -0
  303. package/dist/runtime/server/auth.js +45 -0
  304. package/dist/runtime/server/debugger-host.d.ts +11 -0
  305. package/dist/runtime/server/debugger-host.js +32 -0
  306. package/dist/runtime/server/fetch-handler.d.ts +18 -0
  307. package/dist/runtime/server/fetch-handler.js +62 -0
  308. package/dist/runtime/server/http.d.ts +38 -0
  309. package/dist/runtime/server/http.js +66 -0
  310. package/dist/runtime/server/route-table.d.ts +55 -0
  311. package/dist/runtime/server/route-table.js +74 -0
  312. package/dist/runtime/server/routes/definitions.d.ts +3 -0
  313. package/dist/runtime/server/routes/definitions.js +20 -0
  314. package/dist/runtime/server/routes/effects.d.ts +3 -0
  315. package/dist/runtime/server/routes/effects.js +59 -0
  316. package/dist/runtime/server/routes/operations.d.ts +3 -0
  317. package/dist/runtime/server/routes/operations.js +14 -0
  318. package/dist/runtime/server/routes/runs.d.ts +3 -0
  319. package/dist/runtime/server/routes/runs.js +199 -0
  320. package/dist/runtime/server.d.ts +4 -8
  321. package/dist/runtime/server.js +6 -211
  322. package/dist/runtime/sse.d.ts +2 -1
  323. package/dist/runtime/sse.js +24 -17
  324. package/dist/runtime/types.d.ts +117 -0
  325. package/dist/runtime/types.js +1 -0
  326. package/dist/runtime/wake-engine.d.ts +20 -0
  327. package/dist/runtime/wake-engine.js +311 -0
  328. package/dist/runtime/wake-scheduler.d.ts +3 -4
  329. package/dist/runtime/wake-scheduler.js +25 -31
  330. package/dist/runtime/worker-callbacks.d.ts +16 -0
  331. package/dist/runtime/worker-callbacks.js +167 -0
  332. package/dist/runtime/worker-effect-dispatch.d.ts +36 -0
  333. package/dist/runtime/worker-effect-dispatch.js +126 -0
  334. package/dist/s2/config.d.ts +1 -1
  335. package/dist/s2/config.js +1 -1
  336. package/dist/s2/lite.js +70 -82
  337. package/dist/s2/pagination.d.ts +15 -0
  338. package/dist/s2/pagination.js +36 -0
  339. package/dist/s2/projector.js +6 -5
  340. package/dist/s2/snapshot-store.js +188 -161
  341. package/dist/s2/store.d.ts +3 -21
  342. package/dist/s2/store.js +71 -165
  343. package/dist/testing/index.d.ts +15 -0
  344. package/dist/testing/index.js +53 -16
  345. package/dist/workflow/debugger/index.d.ts +4 -0
  346. package/dist/workflow/debugger/index.js +11 -0
  347. package/dist/workflow/debugger/nodes-view.d.ts +3 -0
  348. package/dist/workflow/debugger/nodes-view.js +13 -0
  349. package/dist/workflow/debugger/summarize.d.ts +2 -0
  350. package/dist/workflow/debugger/summarize.js +30 -0
  351. package/dist/workflow/definitions-store.d.ts +2 -3
  352. package/dist/workflow/definitions-store.js +2 -2
  353. package/dist/workflow/definitions.d.ts +78 -22
  354. package/dist/workflow/definitions.js +80 -14
  355. package/dist/workflow/effects.d.ts +453 -107
  356. package/dist/workflow/effects.js +214 -115
  357. package/dist/workflow/events.d.ts +149 -5
  358. package/dist/workflow/events.js +27 -5
  359. package/dist/workflow/graph.d.ts +56 -0
  360. package/dist/workflow/graph.js +207 -0
  361. package/dist/workflow/index.d.ts +1 -0
  362. package/dist/workflow/index.js +1 -0
  363. package/dist/workflow/module.d.ts +1047 -266
  364. package/dist/workflow/projections.d.ts +14 -12
  365. package/dist/workflow/projections.js +30 -8
  366. package/dist/workflow/scope.d.ts +146 -4
  367. package/dist/workflow/threads.d.ts +383 -155
  368. package/dist/workflow/threads.js +308 -110
  369. package/package.json +26 -2
  370. package/dist/debugger/events/domain-summarize.d.ts +0 -3
  371. package/dist/debugger/events/domain-summarize.js +0 -107
  372. package/dist/debugger/events/family.d.ts +0 -8
  373. package/dist/debugger/events/family.js +0 -44
  374. package/dist/runtime/events-api.d.ts +0 -4
  375. package/dist/runtime/events-api.js +0 -84
@@ -0,0 +1,31 @@
1
+ import { type JsonValue } from '@swirls/looms/core';
2
+ export interface FormField {
3
+ readonly name: string;
4
+ readonly label: string;
5
+ readonly type: 'string' | 'number' | 'boolean';
6
+ readonly defaultValue: string;
7
+ }
8
+ /** How a definition's input is edited: one text box, flat scalar fields, or raw JSON. */
9
+ export type InputForm = {
10
+ readonly kind: 'text';
11
+ } | {
12
+ readonly kind: 'fields';
13
+ readonly fields: readonly FormField[];
14
+ } | {
15
+ readonly kind: 'json';
16
+ };
17
+ export interface FormValues {
18
+ /** Field values by name, for the `fields` form. */
19
+ readonly fields: Readonly<Record<string, string>>;
20
+ /** Text for the `text` form, or JSON source for the `json` form. */
21
+ readonly source: string;
22
+ }
23
+ /** Flat object fields, or undefined when the schema needs the raw JSON editor. */
24
+ export declare function formFields(schema: JsonValue | undefined): readonly FormField[] | undefined;
25
+ export declare function inputForm(schema: JsonValue | undefined): InputForm;
26
+ export declare function initialValues(form: InputForm): FormValues;
27
+ export declare function valuesToInput(fields: readonly FormField[], values: Readonly<Record<string, string>>): JsonValue;
28
+ /** Input for the form's current values. Throws when the JSON source does not parse. */
29
+ export declare function formInput(form: InputForm, values: FormValues): JsonValue;
30
+ /** Input carrying a single chat message, when the form has exactly one string to put it in. */
31
+ export declare function messageInput(form: InputForm, message: string): JsonValue | undefined;
@@ -0,0 +1,117 @@
1
+ import { Predicate } from 'effect';
2
+ import { cleanUndefined, isJsonNumber, isJsonObject, isJsonString, } from '@swirls/looms/core';
3
+ function fieldType(value) {
4
+ if (value === 'string') {
5
+ return 'string';
6
+ }
7
+ if (value === 'number' || value === 'integer') {
8
+ return 'number';
9
+ }
10
+ if (value === 'boolean') {
11
+ return 'boolean';
12
+ }
13
+ return undefined;
14
+ }
15
+ /** Flat object fields, or undefined when the schema needs the raw JSON editor. */
16
+ export function formFields(schema) {
17
+ if (!isJsonObject(schema) || schema.type !== 'object' || !isJsonObject(schema.properties)) {
18
+ return undefined;
19
+ }
20
+ const fields = [];
21
+ for (const [name, property] of Object.entries(schema.properties)) {
22
+ if (!isJsonObject(property) || !isJsonString(property.type)) {
23
+ return undefined;
24
+ }
25
+ const type = fieldType(property.type);
26
+ if (!type) {
27
+ return undefined;
28
+ }
29
+ const fallback = property.default;
30
+ const defaultValue = isJsonString(fallback) || isJsonNumber(fallback) || Predicate.isBoolean(fallback)
31
+ ? String(fallback)
32
+ : '';
33
+ fields.push({
34
+ name,
35
+ label: isJsonString(property.title) ? property.title : name,
36
+ type,
37
+ defaultValue,
38
+ });
39
+ }
40
+ return fields;
41
+ }
42
+ export function inputForm(schema) {
43
+ if (isJsonObject(schema) && schema.type === 'string') {
44
+ return { kind: 'text' };
45
+ }
46
+ const fields = formFields(schema);
47
+ return fields ? { kind: 'fields', fields } : { kind: 'json' };
48
+ }
49
+ export function initialValues(form) {
50
+ switch (form.kind) {
51
+ case 'text':
52
+ return { fields: {}, source: '' };
53
+ case 'fields':
54
+ return {
55
+ fields: Object.fromEntries(form.fields.map((field) => [field.name, field.defaultValue])),
56
+ source: '',
57
+ };
58
+ case 'json':
59
+ return { fields: {}, source: '{}' };
60
+ default: {
61
+ const exhaustive = form;
62
+ return exhaustive;
63
+ }
64
+ }
65
+ }
66
+ export function valuesToInput(fields, values) {
67
+ const input = {};
68
+ for (const field of fields) {
69
+ const raw = values[field.name] ?? field.defaultValue;
70
+ if (field.type === 'number') {
71
+ const parsed = Number(raw);
72
+ input[field.name] = Number.isFinite(parsed) ? parsed : 0;
73
+ continue;
74
+ }
75
+ if (field.type === 'boolean') {
76
+ input[field.name] = raw === 'true';
77
+ continue;
78
+ }
79
+ input[field.name] = raw;
80
+ }
81
+ return input;
82
+ }
83
+ /** Input for the form's current values. Throws when the JSON source does not parse. */
84
+ export function formInput(form, values) {
85
+ switch (form.kind) {
86
+ case 'text':
87
+ return values.source;
88
+ case 'fields':
89
+ return valuesToInput(form.fields, values.fields);
90
+ case 'json':
91
+ return cleanUndefined(JSON.parse(values.source));
92
+ default: {
93
+ const exhaustive = form;
94
+ return exhaustive;
95
+ }
96
+ }
97
+ }
98
+ /** Input carrying a single chat message, when the form has exactly one string to put it in. */
99
+ export function messageInput(form, message) {
100
+ switch (form.kind) {
101
+ case 'text':
102
+ return message;
103
+ case 'fields': {
104
+ const strings = form.fields.filter((field) => field.type === 'string');
105
+ const [only] = strings;
106
+ return strings.length === 1 && only
107
+ ? valuesToInput(form.fields, { [only.name]: message })
108
+ : undefined;
109
+ }
110
+ case 'json':
111
+ return undefined;
112
+ default: {
113
+ const exhaustive = form;
114
+ return exhaustive;
115
+ }
116
+ }
117
+ }
@@ -0,0 +1,3 @@
1
+ import type { WorkspaceContext } from '../plugin';
2
+ /** Starts a run from a form built from the definition's input schema, then shows its result. */
3
+ export declare function StartForm(context: WorkspaceContext): import("react").JSX.Element;
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Play } from 'lucide-react';
3
+ import { useState } from 'react';
4
+ import { isJsonObject, isJsonString } from '@swirls/looms/core';
5
+ import { useRunEvents, useRunStore, useRunSummary, useThreadTree } from '@swirls/looms/react';
6
+ import { JsonTree } from '../components/json-tree.js';
7
+ import { StatusBadge } from '../components/status-dot.js';
8
+ import { Button } from '../ui/button.js';
9
+ import { Checkbox } from '../ui/checkbox.js';
10
+ import { Input } from '../ui/input.js';
11
+ import { ScrollArea } from '../ui/scroll-area.js';
12
+ import { Textarea } from '../ui/textarea.js';
13
+ import { formInput, initialValues, inputForm, } from './schema-form.js';
14
+ import { useStartRun } from './use-start-run.js';
15
+ function RunResult({ runId }) {
16
+ const store = useRunStore(runId);
17
+ const summary = useRunSummary(store);
18
+ const tree = useThreadTree(store);
19
+ const events = useRunEvents(store);
20
+ const rootThreadId = tree.root?.threadId;
21
+ const completed = events.find((event) => event.type === 'runtime.thread.completed' && event.threadId === rootThreadId);
22
+ const failed = events.find((event) => event.type === 'runtime.thread.failed' && event.threadId === rootThreadId);
23
+ const output = completed && isJsonObject(completed.payload) ? completed.payload.output : undefined;
24
+ const failure = failed && isJsonObject(failed.payload) ? failed.payload.error : undefined;
25
+ return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-xs", children: "Status" }), _jsx(StatusBadge, { status: summary.status })] }), output !== undefined ? (_jsxs("section", { className: "border-border bg-card rounded-lg border p-3", children: [_jsx("h3", { className: "text-muted-foreground mb-1.5 text-[11px] font-medium", children: "Output" }), _jsx(JsonTree, { value: output, defaultExpandDepth: 2 })] })) : null, isJsonString(failure) ? (_jsx("p", { className: "text-status-failed bg-status-failed/10 rounded-md px-3 py-2 text-xs", children: failure })) : null] }));
26
+ }
27
+ function FieldInput({ field, value, onChange, }) {
28
+ switch (field.type) {
29
+ case 'boolean':
30
+ return (_jsx(Checkbox, { checked: value === 'true', onCheckedChange: (checked) => onChange(String(checked === true)) }));
31
+ case 'number':
32
+ return (_jsx(Input, { type: "number", className: "h-8 font-mono text-xs", value: value, onChange: (event) => onChange(event.target.value) }));
33
+ case 'string':
34
+ return (_jsx(Input, { className: "h-8 text-[13px]", value: value, onChange: (event) => onChange(event.target.value) }));
35
+ default: {
36
+ const exhaustive = field.type;
37
+ return exhaustive;
38
+ }
39
+ }
40
+ }
41
+ function InputFields({ form, values, onChange, }) {
42
+ switch (form.kind) {
43
+ case 'text':
44
+ return (_jsx(Textarea, { className: "max-h-64 min-h-20", value: values.source, onChange: (event) => onChange({ ...values, source: event.target.value }), "aria-label": "Input" }));
45
+ case 'fields':
46
+ return form.fields.map((field) => (_jsxs("label", { className: field.type === 'boolean' ? 'flex items-center gap-2 text-xs' : 'grid gap-1.5 text-xs', children: [_jsx("span", { className: "text-foreground font-medium", children: field.label }), _jsx(FieldInput, { field: field, value: values.fields[field.name] ?? '', onChange: (value) => onChange({ ...values, fields: { ...values.fields, [field.name]: value } }) })] }, field.name)));
47
+ case 'json':
48
+ return (_jsx(Textarea, { className: "max-h-80 min-h-28 font-mono text-xs", value: values.source, onChange: (event) => onChange({ ...values, source: event.target.value }), "aria-label": "JSON input", spellCheck: false }));
49
+ default: {
50
+ const exhaustive = form;
51
+ return exhaustive;
52
+ }
53
+ }
54
+ }
55
+ /** Starts a run from a form built from the definition's input schema, then shows its result. */
56
+ export function StartForm(context) {
57
+ const form = inputForm(context.definition.inputSchema);
58
+ const [values, setValues] = useState(() => initialValues(form));
59
+ const { start, fail, pending, error } = useStartRun(context);
60
+ function submit() {
61
+ let input;
62
+ try {
63
+ input = formInput(form, values);
64
+ }
65
+ catch (cause) {
66
+ fail(cause);
67
+ return;
68
+ }
69
+ start(input);
70
+ }
71
+ return (_jsx(ScrollArea, { className: "h-full", children: _jsxs("div", { className: "p-4", children: [context.runId ? (_jsx(RunResult, { runId: context.runId })) : (_jsxs("form", { className: "grid gap-4", onSubmit: (event) => {
72
+ event.preventDefault();
73
+ submit();
74
+ }, children: [_jsxs("div", { children: [_jsx("p", { className: "text-[13px] font-medium", children: "Input" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Fields come from the definition's input schema." })] }), _jsx(InputFields, { form: form, values: values, onChange: setValues }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs(Button, { type: "submit", size: "sm", disabled: pending, children: [_jsx(Play, {}), "Start run"] }), error ? _jsx("p", { className: "text-status-failed min-w-0 text-[11px]", children: error }) : null] })] })), context.runId && error ? (_jsx("p", { className: "text-status-failed mt-3 text-[11px]", children: error })) : null] }) }));
75
+ }
@@ -0,0 +1,14 @@
1
+ import { type JsonValue } from '@swirls/looms/core';
2
+ import type { WorkspaceContext } from '../plugin';
3
+ export interface StartedRun {
4
+ readonly runId: string;
5
+ readonly threadId: string;
6
+ }
7
+ export interface StartRun {
8
+ /** Starts a run of the workspace definition, then runs `after` once the start is accepted. */
9
+ readonly start: <T>(input: JsonValue, after?: (started: StartedRun) => Promise<T>) => void;
10
+ readonly fail: (cause: unknown) => void;
11
+ readonly pending: boolean;
12
+ readonly error: string | null;
13
+ }
14
+ export declare function useStartRun({ definition, onStarted }: WorkspaceContext): StartRun;
@@ -0,0 +1,32 @@
1
+ import { useState } from 'react';
2
+ import { createRunId } from '@swirls/looms/core';
3
+ import { useDebugger } from '../context.js';
4
+ import { errorMessage } from '../lib/cn.js';
5
+ export function useStartRun({ definition, onStarted }) {
6
+ const { client } = useDebugger();
7
+ const [pending, setPending] = useState(false);
8
+ const [error, setError] = useState(null);
9
+ function start(input, after) {
10
+ const runId = createRunId();
11
+ setPending(true);
12
+ setError(null);
13
+ onStarted(runId);
14
+ client
15
+ .startRun({
16
+ kind: definition.kind,
17
+ definitionName: definition.name,
18
+ definitionVersion: definition.version,
19
+ input,
20
+ runId,
21
+ })
22
+ .then((result) => after?.({ runId: result.runId, threadId: result.threadId }))
23
+ .catch((cause) => setError(errorMessage(cause)))
24
+ .finally(() => setPending(false));
25
+ }
26
+ return {
27
+ start,
28
+ fail: (cause) => setError(errorMessage(cause)),
29
+ pending,
30
+ error,
31
+ };
32
+ }
@@ -0,0 +1,6 @@
1
+ import type { PublishedDefinition } from '@swirls/looms/core';
2
+ export declare function Workspace({ definition, runId, onStarted, }: {
3
+ definition: PublishedDefinition | undefined;
4
+ runId?: string;
5
+ onStarted: (runId: string) => void;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { MousePointerClick } from 'lucide-react';
3
+ import { useDebugger } from '../context.js';
4
+ import { workspaceFor } from '../plugin.js';
5
+ import { EmptyState, PanelHeader } from '../ui/panel.js';
6
+ import { definitionKey } from './definition-key.js';
7
+ import { StartForm } from './start-form.js';
8
+ export function Workspace({ definition, runId, onStarted, }) {
9
+ const { plugins } = useDebugger();
10
+ if (!definition) {
11
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(PanelHeader, {}), _jsx(EmptyState, { icon: _jsx(MousePointerClick, {}), title: "Pick a run type", children: "Choose one from the run type menu to start a run, or press \u2318K to open a past run." })] }));
12
+ }
13
+ const View = workspaceFor(plugins, definition)?.component ?? StartForm;
14
+ return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [_jsx(PanelHeader, { children: _jsxs("h2", { className: "flex min-w-0 items-baseline gap-2", children: [_jsx("span", { className: "shrink-0 text-[13px] font-medium", children: definition.name }), definition.description ? (_jsx("span", { className: "text-muted-foreground truncate text-xs", title: definition.description, children: definition.description })) : null] }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: _jsx(View, { definition: definition, runId: runId, onStarted: onStarted }, definitionKey(definition)) })] }));
15
+ }
@@ -1,31 +1,129 @@
1
- @source "./**/*.{ts,tsx}";
1
+ @source "./**/*.js";
2
+ @source "../agent/debugger/**/*.js";
3
+ @source "../workflow/debugger/**/*.js";
4
+ @source "../approval/debugger/**/*.js";
2
5
 
3
6
  @theme inline {
7
+ --color-background: var(--background);
8
+ --color-foreground: var(--foreground);
9
+ --color-card: var(--card);
10
+ --color-card-foreground: var(--card-foreground);
11
+ --color-primary: var(--primary);
12
+ --color-primary-foreground: var(--primary-foreground);
13
+ --color-secondary: var(--secondary);
14
+ --color-secondary-foreground: var(--secondary-foreground);
15
+ --color-muted: var(--muted);
16
+ --color-muted-foreground: var(--muted-foreground);
17
+ --color-accent: var(--accent);
18
+ --color-accent-foreground: var(--accent-foreground);
19
+ --color-destructive: var(--destructive);
20
+ --color-border: var(--border);
21
+ --color-input: var(--input);
22
+ --color-ring: var(--ring);
23
+ --color-sidebar: var(--sidebar);
24
+ --color-sidebar-foreground: var(--sidebar-foreground);
4
25
  --color-status-running: var(--status-running);
5
26
  --color-status-waiting: var(--status-waiting);
6
27
  --color-status-completed: var(--status-completed);
7
28
  --color-status-failed: var(--status-failed);
8
29
  --color-status-cancelled: var(--status-cancelled);
9
- --color-family-runtime: var(--family-runtime);
10
- --color-family-agent: var(--family-agent);
11
- --color-family-workflow: var(--family-workflow);
12
- --color-family-approval: var(--family-approval);
13
- --color-family-payments: var(--family-payments);
14
- --color-family-wait: var(--family-wait);
30
+ --color-json-key: var(--json-key);
31
+ --color-json-string: var(--json-string);
32
+ --color-json-number: var(--json-number);
33
+ --color-json-boolean: var(--json-boolean);
34
+ --color-json-null: var(--json-null);
35
+ --ease-snappy: var(--debugger-ease);
36
+ }
37
+
38
+ /* Layered so a host's own unlayered :root theme (for example shadcn/ui) takes precedence. */
39
+ @layer base {
40
+ :root {
41
+ --background: oklch(0.16 0.005 260);
42
+ --foreground: oklch(0.93 0.01 260);
43
+ --card: oklch(0.19 0.006 260);
44
+ --card-foreground: oklch(0.93 0.01 260);
45
+ --primary: oklch(0.93 0.01 260);
46
+ --primary-foreground: oklch(0.2 0.006 260);
47
+ --secondary: oklch(0.24 0.008 260);
48
+ --secondary-foreground: oklch(0.93 0.01 260);
49
+ --muted: oklch(0.24 0.008 260);
50
+ --muted-foreground: oklch(0.68 0.015 260);
51
+ --accent: oklch(0.26 0.01 260);
52
+ --accent-foreground: oklch(0.95 0.01 260);
53
+ --destructive: oklch(0.65 0.18 25);
54
+ --border: oklch(1 0 0 / 10%);
55
+ --input: oklch(1 0 0 / 12%);
56
+ --ring: oklch(0.55 0.02 260);
57
+ --sidebar: oklch(0.18 0.006 260);
58
+ --sidebar-foreground: oklch(0.93 0.01 260);
59
+ }
60
+
61
+ :where(.looms-debugger, .debugger-pop),
62
+ :where(.looms-debugger, .debugger-pop) *,
63
+ :where(.looms-debugger, .debugger-pop) ::before,
64
+ :where(.looms-debugger, .debugger-pop) ::after {
65
+ border-color: var(--color-border);
66
+ }
15
67
  }
16
68
 
17
69
  :root {
70
+ --debugger-ease: cubic-bezier(0.23, 1, 0.32, 1);
18
71
  --status-running: oklch(0.74 0.12 240);
19
72
  --status-waiting: oklch(0.8 0.14 85);
20
73
  --status-completed: oklch(0.76 0.13 155);
21
74
  --status-failed: oklch(0.68 0.18 25);
22
75
  --status-cancelled: oklch(0.62 0.01 260);
23
- --family-runtime: oklch(0.76 0.13 155);
24
- --family-agent: oklch(0.74 0.12 240);
25
- --family-workflow: oklch(0.76 0.12 300);
26
- --family-approval: oklch(0.8 0.14 85);
27
- --family-payments: oklch(0.78 0.1 175);
28
- --family-wait: oklch(0.8 0.14 85);
76
+ --json-key: oklch(0.8 0.06 280);
77
+ --json-string: oklch(0.8 0.1 150);
78
+ --json-number: oklch(0.8 0.1 230);
79
+ --json-boolean: oklch(0.82 0.11 70);
80
+ --json-null: oklch(0.6 0.01 260);
81
+ }
82
+
83
+ @keyframes debugger-pop-in {
84
+ from {
85
+ opacity: 0;
86
+ transform: scale(0.97);
87
+ }
88
+ }
89
+
90
+ @keyframes debugger-fade-in {
91
+ from {
92
+ opacity: 0;
93
+ }
94
+ }
95
+
96
+ /* Anchored overlays grow from their trigger; keyboard-opened ones appear instantly. */
97
+ .debugger-pop {
98
+ transform-origin: var(--radix-popper-transform-origin);
99
+ animation: debugger-pop-in 150ms var(--debugger-ease);
100
+ }
101
+
102
+ .debugger-pop[data-instant] {
103
+ animation: none;
104
+ }
105
+
106
+ .debugger-float-in {
107
+ transition:
108
+ opacity 150ms var(--debugger-ease),
109
+ transform 150ms var(--debugger-ease),
110
+ scale 150ms var(--debugger-ease),
111
+ background-color 150ms var(--debugger-ease);
112
+
113
+ @starting-style {
114
+ opacity: 0;
115
+ transform: translateY(4px);
116
+ }
117
+ }
118
+
119
+ @media (prefers-reduced-motion: reduce) {
120
+ .debugger-pop {
121
+ animation-name: debugger-fade-in;
122
+ }
123
+
124
+ .debugger-float-in {
125
+ transition-property: opacity;
126
+ }
29
127
  }
30
128
 
31
129
  .debugger-event-stream {
@@ -55,17 +153,3 @@
55
153
  display: inline;
56
154
  }
57
155
  }
58
-
59
- @container (max-width: 22rem) {
60
- .debugger-follow-label {
61
- position: absolute;
62
- width: 1px;
63
- height: 1px;
64
- padding: 0;
65
- margin: -1px;
66
- overflow: hidden;
67
- clip: rect(0, 0, 0, 0);
68
- white-space: nowrap;
69
- border: 0;
70
- }
71
- }
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+ declare const variants: {
3
+ readonly default: 'bg-primary text-primary-foreground hover:bg-primary/90';
4
+ readonly secondary: 'bg-secondary text-secondary-foreground hover:bg-accent';
5
+ readonly outline: 'border-input hover:bg-accent hover:text-accent-foreground border bg-transparent';
6
+ readonly ghost: 'text-muted-foreground hover:bg-accent hover:text-foreground';
7
+ readonly destructive: 'text-muted-foreground hover:bg-status-failed/15 hover:text-status-failed';
8
+ };
9
+ declare const sizes: {
10
+ readonly xs: 'h-6 gap-1 rounded-sm px-2 text-[11px] [&_svg]:size-3';
11
+ readonly sm: 'h-7 gap-1.5 rounded-md px-2.5 text-xs [&_svg]:size-3.5';
12
+ readonly default: 'h-8 gap-1.5 rounded-md px-3 text-xs [&_svg]:size-3.5';
13
+ readonly 'icon-xs': 'size-6 rounded-sm [&_svg]:size-3';
14
+ readonly 'icon-sm': 'size-7 rounded-md [&_svg]:size-3.5';
15
+ readonly icon: 'size-8 rounded-md [&_svg]:size-4';
16
+ };
17
+ export type ButtonVariant = keyof typeof variants;
18
+ export type ButtonSize = keyof typeof sizes;
19
+ declare function Button({ className, variant, size, asChild, ...props }: React.ComponentProps<'button'> & {
20
+ variant?: ButtonVariant;
21
+ size?: ButtonSize;
22
+ asChild?: boolean;
23
+ }): React.JSX.Element;
24
+ export { Button };
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Slot } from 'radix-ui';
3
+ import * as React from 'react';
4
+ import { cn } from '../lib/cn.js';
5
+ const variants = {
6
+ default: 'bg-primary text-primary-foreground hover:bg-primary/90',
7
+ secondary: 'bg-secondary text-secondary-foreground hover:bg-accent',
8
+ outline: 'border-input hover:bg-accent hover:text-accent-foreground border bg-transparent',
9
+ ghost: 'text-muted-foreground hover:bg-accent hover:text-foreground',
10
+ destructive: 'text-muted-foreground hover:bg-status-failed/15 hover:text-status-failed',
11
+ };
12
+ const sizes = {
13
+ xs: 'h-6 gap-1 rounded-sm px-2 text-[11px] [&_svg]:size-3',
14
+ sm: 'h-7 gap-1.5 rounded-md px-2.5 text-xs [&_svg]:size-3.5',
15
+ default: 'h-8 gap-1.5 rounded-md px-3 text-xs [&_svg]:size-3.5',
16
+ 'icon-xs': 'size-6 rounded-sm [&_svg]:size-3',
17
+ 'icon-sm': 'size-7 rounded-md [&_svg]:size-3.5',
18
+ icon: 'size-8 rounded-md [&_svg]:size-4',
19
+ };
20
+ function Button({ className, variant = 'default', size = 'default', asChild = false, ...props }) {
21
+ const Comp = asChild ? Slot.Root : 'button';
22
+ return (_jsx(Comp, { "data-slot": "button", type: asChild ? undefined : (props.type ?? 'button'), className: cn('focus-visible:ring-ring/50 ease-snappy inline-flex shrink-0 items-center justify-center font-medium whitespace-nowrap outline-none select-none focus-visible:ring-[3px] active:scale-[0.97] disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0', 'transition-[transform,background-color,color,opacity] duration-150', variants[variant], sizes[size], className), ...props }));
23
+ }
24
+ export { Button };
@@ -0,0 +1,9 @@
1
+ import { Command as CommandPrimitive } from 'cmdk';
2
+ import * as React from 'react';
3
+ declare function Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>): React.JSX.Element;
4
+ declare function CommandInput({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Input>): React.JSX.Element;
5
+ declare function CommandList({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.List>): React.JSX.Element;
6
+ declare function CommandEmpty({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Empty>): React.JSX.Element;
7
+ declare function CommandGroup({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Group>): React.JSX.Element;
8
+ declare function CommandItem({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Item>): React.JSX.Element;
9
+ export { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList };
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Command as CommandPrimitive } from 'cmdk';
3
+ import { Search } from 'lucide-react';
4
+ import * as React from 'react';
5
+ import { cn } from '../lib/cn.js';
6
+ function Command({ className, ...props }) {
7
+ return (_jsx(CommandPrimitive, { "data-slot": "command", className: cn('flex size-full flex-col overflow-hidden', className), ...props }));
8
+ }
9
+ function CommandInput({ className, ...props }) {
10
+ return (_jsxs("div", { "data-slot": "command-input-wrapper", className: "border-border flex h-10 items-center gap-2 border-b px-3", children: [_jsx(Search, { className: "text-muted-foreground size-3.5 shrink-0", "aria-hidden": true }), _jsx(CommandPrimitive.Input, { "data-slot": "command-input", className: cn('placeholder:text-muted-foreground flex h-full w-full bg-transparent text-[13px] outline-none disabled:cursor-not-allowed disabled:opacity-50', className), ...props })] }));
11
+ }
12
+ function CommandList({ className, ...props }) {
13
+ return (_jsx(CommandPrimitive.List, { "data-slot": "command-list", className: cn('max-h-80 scroll-py-1 overflow-x-hidden overflow-y-auto overscroll-contain p-1', className), ...props }));
14
+ }
15
+ function CommandEmpty({ className, ...props }) {
16
+ return (_jsx(CommandPrimitive.Empty, { "data-slot": "command-empty", className: cn('text-muted-foreground py-8 text-center text-xs', className), ...props }));
17
+ }
18
+ function CommandGroup({ className, ...props }) {
19
+ return (_jsx(CommandPrimitive.Group, { "data-slot": "command-group", className: cn('[&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:pt-2 [&_[cmdk-group-heading]]:pb-1 [&_[cmdk-group-heading]]:text-[11px] [&_[cmdk-group-heading]]:font-medium', className), ...props }));
20
+ }
21
+ function CommandItem({ className, ...props }) {
22
+ return (_jsx(CommandPrimitive.Item, { "data-slot": "command-item", className: cn('data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-xs outline-none select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50', className), ...props }));
23
+ }
24
+ export { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList };
@@ -0,0 +1,13 @@
1
+ import { DropdownMenu as DropdownMenuPrimitive } from 'radix-ui';
2
+ import * as React from 'react';
3
+ declare function DropdownMenu(props: React.ComponentProps<typeof DropdownMenuPrimitive.Root>): React.JSX.Element;
4
+ declare function DropdownMenuTrigger(props: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>): React.JSX.Element;
5
+ declare function DropdownMenuContent({ className, sideOffset, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>): React.JSX.Element;
6
+ declare function DropdownMenuGroup(props: React.ComponentProps<typeof DropdownMenuPrimitive.Group>): React.JSX.Element;
7
+ declare function DropdownMenuLabel({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Label>): React.JSX.Element;
8
+ declare function DropdownMenuItem({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Item>): React.JSX.Element;
9
+ declare function DropdownMenuCheckboxItem({ className, children, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>): React.JSX.Element;
10
+ declare function DropdownMenuRadioGroup(props: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>): React.JSX.Element;
11
+ declare function DropdownMenuRadioItem({ className, children, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>): React.JSX.Element;
12
+ declare function DropdownMenuSeparator({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>): React.JSX.Element;
13
+ export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger, };
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Check } from 'lucide-react';
3
+ import { DropdownMenu as DropdownMenuPrimitive } from 'radix-ui';
4
+ import * as React from 'react';
5
+ import { cn } from '../lib/cn.js';
6
+ const itemClass = 'focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-xs outline-none select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:size-3.5 [&_svg]:shrink-0';
7
+ function DropdownMenu(props) {
8
+ return _jsx(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
9
+ }
10
+ function DropdownMenuTrigger(props) {
11
+ return _jsx(DropdownMenuPrimitive.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
12
+ }
13
+ function DropdownMenuContent({ className, sideOffset = 6, ...props }) {
14
+ return (_jsx(DropdownMenuPrimitive.Portal, { children: _jsx(DropdownMenuPrimitive.Content, { "data-slot": "dropdown-menu-content", sideOffset: sideOffset, className: cn('debugger-pop bg-card text-card-foreground border-border z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-40 overflow-x-hidden overflow-y-auto overscroll-contain rounded-lg border p-1 shadow-xl shadow-black/30', className), ...props }) }));
15
+ }
16
+ function DropdownMenuGroup(props) {
17
+ return _jsx(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
18
+ }
19
+ function DropdownMenuLabel({ className, ...props }) {
20
+ return (_jsx(DropdownMenuPrimitive.Label, { "data-slot": "dropdown-menu-label", className: cn('text-muted-foreground px-2 pt-2 pb-1 text-[11px] font-medium', className), ...props }));
21
+ }
22
+ function DropdownMenuItem({ className, ...props }) {
23
+ return (_jsx(DropdownMenuPrimitive.Item, { "data-slot": "dropdown-menu-item", className: cn(itemClass, className), ...props }));
24
+ }
25
+ function DropdownMenuCheckboxItem({ className, children, ...props }) {
26
+ return (_jsxs(DropdownMenuPrimitive.CheckboxItem, { "data-slot": "dropdown-menu-checkbox-item", className: cn(itemClass, 'pl-7', className), ...props, children: [_jsx("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: _jsx(DropdownMenuPrimitive.ItemIndicator, { children: _jsx(Check, {}) }) }), children] }));
27
+ }
28
+ function DropdownMenuRadioGroup(props) {
29
+ return _jsx(DropdownMenuPrimitive.RadioGroup, { "data-slot": "dropdown-menu-radio-group", ...props });
30
+ }
31
+ function DropdownMenuRadioItem({ className, children, ...props }) {
32
+ return (_jsxs(DropdownMenuPrimitive.RadioItem, { "data-slot": "dropdown-menu-radio-item", className: cn(itemClass, 'pl-7', className), ...props, children: [_jsx("span", { className: "absolute top-2 left-2 flex size-3.5 items-center justify-center", children: _jsx(DropdownMenuPrimitive.ItemIndicator, { children: _jsx(Check, {}) }) }), children] }));
33
+ }
34
+ function DropdownMenuSeparator({ className, ...props }) {
35
+ return (_jsx(DropdownMenuPrimitive.Separator, { "data-slot": "dropdown-menu-separator", className: cn('bg-border -mx-1 my-1 h-px', className), ...props }));
36
+ }
37
+ export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger, };
@@ -0,0 +1,14 @@
1
+ import type { ComponentProps, ReactNode } from 'react';
2
+ /** Every panel header shares this height so the columns read as one surface. */
3
+ declare function PanelHeader({ className, ...props }: ComponentProps<'div'>): import("react").JSX.Element;
4
+ declare function PanelTitle({ className, children, meta, ...props }: ComponentProps<'h2'> & {
5
+ meta?: ReactNode;
6
+ }): import("react").JSX.Element;
7
+ declare function EmptyState({ icon, title, children, className, }: {
8
+ icon?: ReactNode;
9
+ title: string;
10
+ children?: ReactNode;
11
+ className?: string;
12
+ }): import("react").JSX.Element;
13
+ declare function Kbd({ className, ...props }: ComponentProps<'kbd'>): import("react").JSX.Element;
14
+ export { EmptyState, Kbd, PanelHeader, PanelTitle };
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../lib/cn.js';
3
+ /** Every panel header shares this height so the columns read as one surface. */
4
+ function PanelHeader({ className, ...props }) {
5
+ return (_jsx("div", { "data-slot": "panel-header", className: cn('border-border flex h-10 shrink-0 items-center gap-2 border-b px-3', className), ...props }));
6
+ }
7
+ function PanelTitle({ className, children, meta, ...props }) {
8
+ return (_jsxs("h2", { "data-slot": "panel-title", className: cn('flex min-w-0 items-baseline gap-2 text-[13px] font-medium', className), ...props, children: [_jsx("span", { className: "truncate", children: children }), meta !== undefined && meta !== null ? (_jsx("span", { className: "text-muted-foreground shrink-0 font-mono text-[11px] font-normal tabular-nums", children: meta })) : null] }));
9
+ }
10
+ function EmptyState({ icon, title, children, className, }) {
11
+ return (_jsxs("div", { className: cn('flex h-full min-h-32 flex-col items-center justify-center gap-2 px-6 text-center', className), children: [icon ? (_jsx("div", { className: "text-muted-foreground/70 border-border bg-card mb-1 flex size-8 items-center justify-center rounded-lg border [&_svg]:size-4", children: icon })) : null, _jsx("p", { className: "text-foreground text-[13px] font-medium", children: title }), children ? (_jsx("p", { className: "text-muted-foreground max-w-60 text-xs leading-relaxed", children: children })) : null] }));
12
+ }
13
+ function Kbd({ className, ...props }) {
14
+ return (_jsx("kbd", { "data-slot": "kbd", className: cn('border-border bg-background/60 text-muted-foreground pointer-events-none inline-flex h-5 min-w-5 items-center justify-center rounded border px-1 font-sans text-[10px] font-medium', className), ...props }));
15
+ }
16
+ export { EmptyState, Kbd, PanelHeader, PanelTitle };