@starlove/orbit 1.4.0 → 2.0.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 (329) hide show
  1. package/Dockerfile +10 -8
  2. package/README.md +146 -164
  3. package/dist/full/csp.txt +1 -0
  4. package/dist/full/fonts/JetBrains_Mono/JetBrainsMono-subset.woff2 +0 -0
  5. package/dist/full/fonts/JetBrains_Mono/README.txt +5 -0
  6. package/dist/full/fonts/Mona_Sans/MonaSans-subset.woff2 +0 -0
  7. package/{public/fonts/Open_Sans → dist/full/fonts/Mona_Sans}/OFL.txt +93 -93
  8. package/dist/full/fonts/Mona_Sans/README.txt +10 -0
  9. package/{public/fonts/JetBrains_Mono → dist/full/fonts/Newsreader}/OFL.txt +93 -93
  10. package/dist/full/fonts/Newsreader/README.txt +8 -0
  11. package/dist/full/fonts/Newsreader/newsreader.woff2 +0 -0
  12. package/dist/full/index.html +36 -653
  13. package/dist/full/js/app.BmuponPJ.js +32 -0
  14. package/dist/full/js/app.BmuponPJ.js.map +1 -0
  15. package/dist/full/js/chunk.1fJGQGbW.js +2 -0
  16. package/dist/full/js/chunk.1fJGQGbW.js.map +1 -0
  17. package/dist/full/js/chunk.5D7JO2zp.js +2 -0
  18. package/dist/full/js/chunk.5D7JO2zp.js.map +1 -0
  19. package/dist/full/js/chunk.BrNn_D79.js +2 -0
  20. package/dist/full/js/chunk.BrNn_D79.js.map +1 -0
  21. package/dist/full/js/chunk.CokJXIqM.js +2 -0
  22. package/dist/full/js/chunk.CokJXIqM.js.map +1 -0
  23. package/dist/full/js/chunk.D_Haqy6R.js +2 -0
  24. package/dist/full/js/chunk.D_Haqy6R.js.map +1 -0
  25. package/dist/full/js/chunk.RO0jsH6I.js +15 -0
  26. package/dist/full/js/chunk.RO0jsH6I.js.map +1 -0
  27. package/dist/full/js/chunk.dqWOEtBM.js +2 -0
  28. package/dist/full/js/chunk.dqWOEtBM.js.map +1 -0
  29. package/dist/full/js/warm.f260bbbc.js +15 -0
  30. package/dist/full/orbits-favicon.png +0 -0
  31. package/dist/full/orbits-logo-bg-wide.png +0 -0
  32. package/dist/full/orbits-logo-bg.png +0 -0
  33. package/dist/full/orbits-logo.png +0 -0
  34. package/dist/full/styles.2b154ffe.css +1 -0
  35. package/dist/full/vendor/starlove-ui/theme-init.js +66 -0
  36. package/dist/full/version.json +2 -2
  37. package/docs/AGENT_GUIDE.md +114 -0
  38. package/docs/UPDATING.md +249 -64
  39. package/lib/adapters/indexeddb/blobs.d.ts +3 -0
  40. package/lib/adapters/indexeddb/blobs.js +54 -0
  41. package/lib/adapters/indexeddb/database.d.ts +60 -0
  42. package/lib/adapters/indexeddb/database.js +126 -0
  43. package/lib/adapters/indexeddb/index.d.ts +5 -0
  44. package/lib/adapters/indexeddb/index.js +3 -0
  45. package/lib/adapters/indexeddb/locks.d.ts +14 -0
  46. package/lib/adapters/indexeddb/locks.js +40 -0
  47. package/lib/adapters/indexeddb/store.d.ts +40 -0
  48. package/lib/adapters/indexeddb/store.js +424 -0
  49. package/lib/adapters/indexeddb/tables.d.ts +43 -0
  50. package/lib/adapters/indexeddb/tables.js +127 -0
  51. package/lib/adapters/memory/blobs.d.ts +3 -0
  52. package/lib/adapters/memory/blobs.js +44 -0
  53. package/lib/adapters/memory/board.d.ts +41 -0
  54. package/lib/adapters/memory/board.js +521 -0
  55. package/lib/adapters/memory/index.d.ts +2 -0
  56. package/lib/adapters/memory/index.js +2 -0
  57. package/lib/adapters/memory/search.d.ts +6 -0
  58. package/lib/adapters/memory/search.js +30 -0
  59. package/lib/adapters/memory/store.d.ts +34 -0
  60. package/lib/adapters/memory/store.js +266 -0
  61. package/lib/adapters/sqlite/backups.d.ts +53 -0
  62. package/lib/adapters/sqlite/backups.js +232 -0
  63. package/lib/adapters/sqlite/blobs.d.ts +14 -0
  64. package/lib/adapters/sqlite/blobs.js +109 -0
  65. package/lib/adapters/sqlite/board.d.ts +77 -0
  66. package/lib/adapters/sqlite/board.js +328 -0
  67. package/lib/adapters/sqlite/database.d.ts +67 -0
  68. package/lib/adapters/sqlite/database.js +285 -0
  69. package/lib/adapters/sqlite/index.d.ts +3 -0
  70. package/lib/adapters/sqlite/index.js +2 -0
  71. package/lib/adapters/sqlite/lock.d.ts +11 -0
  72. package/lib/adapters/sqlite/lock.js +34 -0
  73. package/lib/adapters/sqlite/records.d.ts +54 -0
  74. package/lib/adapters/sqlite/records.js +546 -0
  75. package/lib/adapters/sqlite/schema.d.ts +54 -0
  76. package/lib/adapters/sqlite/schema.js +276 -0
  77. package/lib/adapters/sqlite/store.d.ts +39 -0
  78. package/lib/adapters/sqlite/store.js +385 -0
  79. package/lib/browser/in-page.d.ts +31 -0
  80. package/lib/browser/in-page.js +46 -0
  81. package/lib/browser/old-preview.d.ts +13 -0
  82. package/lib/browser/old-preview.js +80 -0
  83. package/lib/browser/preview-board.d.ts +8 -0
  84. package/lib/browser/preview-board.js +69 -0
  85. package/lib/cli/main.d.ts +7 -0
  86. package/lib/cli/main.js +343 -0
  87. package/lib/cli/orbit.d.ts +8 -0
  88. package/lib/cli/orbit.js +25 -0
  89. package/lib/client/http.d.ts +38 -0
  90. package/lib/client/http.js +334 -0
  91. package/lib/client/local.d.ts +26 -0
  92. package/lib/client/local.js +190 -0
  93. package/lib/client/object-url.d.ts +8 -0
  94. package/lib/client/object-url.js +21 -0
  95. package/lib/client/types.d.ts +268 -0
  96. package/lib/client/types.js +8 -0
  97. package/lib/commands/agent-tools.d.ts +31 -0
  98. package/lib/commands/agent-tools.js +100 -0
  99. package/lib/commands/index.d.ts +56 -0
  100. package/lib/commands/index.js +298 -0
  101. package/lib/commands/parse.d.ts +73 -0
  102. package/lib/commands/parse.js +231 -0
  103. package/lib/commands/present.d.ts +134 -0
  104. package/lib/commands/present.js +198 -0
  105. package/lib/commands/session.d.ts +85 -0
  106. package/lib/commands/session.js +138 -0
  107. package/lib/commands/verbs.d.ts +35 -0
  108. package/lib/commands/verbs.js +842 -0
  109. package/lib/core/actors.d.ts +18 -0
  110. package/lib/core/actors.js +45 -0
  111. package/lib/core/agent.d.ts +128 -0
  112. package/lib/core/agent.js +323 -0
  113. package/lib/core/boards.d.ts +113 -0
  114. package/lib/core/boards.js +288 -0
  115. package/lib/core/bootstrap.d.ts +47 -0
  116. package/lib/core/bootstrap.js +100 -0
  117. package/lib/core/bytes.d.ts +10 -0
  118. package/lib/core/bytes.js +52 -0
  119. package/lib/core/card-paths.d.ts +25 -0
  120. package/lib/core/card-paths.js +44 -0
  121. package/lib/core/context.d.ts +60 -0
  122. package/lib/core/context.js +42 -0
  123. package/lib/core/cross-board.d.ts +81 -0
  124. package/lib/core/cross-board.js +228 -0
  125. package/lib/core/describe.d.ts +21 -0
  126. package/lib/core/describe.js +81 -0
  127. package/lib/core/errors.d.ts +159 -0
  128. package/lib/core/errors.js +160 -0
  129. package/lib/core/files.d.ts +79 -0
  130. package/lib/core/files.js +262 -0
  131. package/lib/core/history.d.ts +20 -0
  132. package/lib/core/history.js +53 -0
  133. package/lib/core/image-types.d.ts +16 -0
  134. package/lib/core/image-types.js +36 -0
  135. package/lib/core/model.d.ts +263 -0
  136. package/lib/core/model.js +34 -0
  137. package/lib/core/nebula-link.d.ts +14 -0
  138. package/lib/core/nebula-link.js +39 -0
  139. package/lib/core/relations.d.ts +58 -0
  140. package/lib/core/relations.js +112 -0
  141. package/lib/core/search.d.ts +38 -0
  142. package/lib/core/search.js +92 -0
  143. package/lib/core/sessions.d.ts +44 -0
  144. package/lib/core/sessions.js +158 -0
  145. package/lib/core/snapshot-schema.d.ts +295 -0
  146. package/lib/core/snapshot-schema.js +82 -0
  147. package/lib/core/snapshots.d.ts +75 -0
  148. package/lib/core/snapshots.js +409 -0
  149. package/lib/core/states.d.ts +25 -0
  150. package/lib/core/states.js +126 -0
  151. package/lib/core/text.d.ts +40 -0
  152. package/lib/core/text.js +113 -0
  153. package/lib/core/tickets.d.ts +69 -0
  154. package/lib/core/tickets.js +311 -0
  155. package/lib/core/trello.d.ts +17 -0
  156. package/lib/core/trello.js +269 -0
  157. package/lib/core/verdicts.d.ts +28 -0
  158. package/lib/core/verdicts.js +92 -0
  159. package/lib/core/views.d.ts +95 -0
  160. package/lib/core/views.js +186 -0
  161. package/lib/http/app.d.ts +46 -0
  162. package/lib/http/app.js +491 -0
  163. package/lib/mcp-server.d.ts +10 -0
  164. package/lib/mcp-server.js +120 -0
  165. package/lib/node/assets.d.ts +7 -0
  166. package/lib/node/assets.js +68 -0
  167. package/lib/node/data-folder.d.ts +21 -0
  168. package/lib/node/data-folder.js +34 -0
  169. package/lib/node/env.d.ts +38 -0
  170. package/lib/node/env.js +49 -0
  171. package/lib/node/host-check.d.ts +24 -0
  172. package/lib/node/host-check.js +53 -0
  173. package/lib/node/host-services.d.ts +9 -0
  174. package/lib/node/host-services.js +150 -0
  175. package/lib/node/local.d.ts +22 -0
  176. package/lib/node/local.js +61 -0
  177. package/lib/node/migrate.d.ts +53 -0
  178. package/lib/node/migrate.js +635 -0
  179. package/lib/node/package.d.ts +7 -0
  180. package/lib/node/package.js +14 -0
  181. package/lib/node/repo-board.d.ts +49 -0
  182. package/lib/node/repo-board.js +245 -0
  183. package/lib/node/serve.d.ts +8 -0
  184. package/lib/node/serve.js +106 -0
  185. package/lib/orbit.d.ts +47 -0
  186. package/lib/orbit.js +44 -0
  187. package/lib/quiet-sqlite-warning.d.ts +1 -0
  188. package/lib/quiet-sqlite-warning.js +18 -0
  189. package/lib/store/blob-path.d.ts +6 -0
  190. package/lib/store/blob-path.js +12 -0
  191. package/lib/store/conformance.d.ts +52 -0
  192. package/lib/store/conformance.js +1449 -0
  193. package/lib/store/search-words.d.ts +10 -0
  194. package/lib/store/search-words.js +19 -0
  195. package/lib/store/types.d.ts +452 -0
  196. package/lib/store/types.js +34 -0
  197. package/llms.txt +63 -0
  198. package/package.json +109 -25
  199. package/src/cli/orbit.js +11 -658
  200. package/src/mcp-server.js +16 -876
  201. package/SKILL-ORBIT.md +0 -151
  202. package/build.mjs +0 -210
  203. package/dist/full/js/app.62905fcb.js +0 -952
  204. package/dist/full/js/app.62905fcb.js.map +0 -7
  205. package/dist/full/styles.4e60d824.css +0 -1
  206. package/docs/AGENT_PROTOCOL.md +0 -424
  207. package/docs/MCP_SETUP.md +0 -54
  208. package/docs/ORBIT_DISPATCH.md +0 -280
  209. package/docs/SS-Orbit-Dark.png +0 -0
  210. package/docs/SS-Orbit-Light.png +0 -0
  211. package/docs/mcp-client.example.json +0 -13
  212. package/docs/setup/orbit-init-wizard.md +0 -174
  213. package/public/apple-touch-icon.png +0 -0
  214. package/public/cursors/live_arrow.cur +0 -0
  215. package/public/cursors/live_link.cur +0 -0
  216. package/public/cursors/live_move.cur +0 -0
  217. package/public/cursors/live_select.cur +0 -0
  218. package/public/cursors/live_unavail.cur +0 -0
  219. package/public/favicon-32x32.png +0 -0
  220. package/public/fonts/Chakra_Petch/ChakraPetch-Bold.ttf +0 -0
  221. package/public/fonts/Chakra_Petch/ChakraPetch-BoldItalic.ttf +0 -0
  222. package/public/fonts/Chakra_Petch/ChakraPetch-Italic.ttf +0 -0
  223. package/public/fonts/Chakra_Petch/ChakraPetch-Light.ttf +0 -0
  224. package/public/fonts/Chakra_Petch/ChakraPetch-LightItalic.ttf +0 -0
  225. package/public/fonts/Chakra_Petch/ChakraPetch-Medium.ttf +0 -0
  226. package/public/fonts/Chakra_Petch/ChakraPetch-MediumItalic.ttf +0 -0
  227. package/public/fonts/Chakra_Petch/ChakraPetch-Regular.ttf +0 -0
  228. package/public/fonts/Chakra_Petch/ChakraPetch-SemiBold.ttf +0 -0
  229. package/public/fonts/Chakra_Petch/ChakraPetch-SemiBoldItalic.ttf +0 -0
  230. package/public/fonts/Chakra_Petch/OFL.txt +0 -93
  231. package/public/fonts/Inter/Inter-Italic-VariableFont_opsz,wght.ttf +0 -0
  232. package/public/fonts/Inter/Inter-VariableFont_opsz,wght.ttf +0 -0
  233. package/public/fonts/Inter/OFL.txt +0 -93
  234. package/public/fonts/Inter/README.txt +0 -118
  235. package/public/fonts/JetBrains_Mono/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
  236. package/public/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf +0 -0
  237. package/public/fonts/JetBrains_Mono/README.txt +0 -79
  238. package/public/fonts/OpenRing-Regular.ttf +0 -0
  239. package/public/fonts/Open_Sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  240. package/public/fonts/Open_Sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
  241. package/public/fonts/Open_Sans/README.txt +0 -100
  242. package/public/fonts/Orbitron/OFL.txt +0 -93
  243. package/public/fonts/Orbitron/Orbitron-VariableFont_wght.ttf +0 -0
  244. package/public/fonts/Orbitron/README.txt +0 -68
  245. package/public/fonts/Rajdhani/OFL.txt +0 -93
  246. package/public/fonts/Rajdhani/Rajdhani-Bold.ttf +0 -0
  247. package/public/fonts/Rajdhani/Rajdhani-Light.ttf +0 -0
  248. package/public/fonts/Rajdhani/Rajdhani-Medium.ttf +0 -0
  249. package/public/fonts/Rajdhani/Rajdhani-Regular.ttf +0 -0
  250. package/public/fonts/Rajdhani/Rajdhani-SemiBold.ttf +0 -0
  251. package/public/fonts/runescape-uf.ttf +0 -0
  252. package/public/index.html +0 -769
  253. package/public/js/actor-labels.js +0 -65
  254. package/public/js/api.js +0 -39
  255. package/public/js/app.js +0 -45
  256. package/public/js/artifact-drawer.js +0 -79
  257. package/public/js/board-export.js +0 -161
  258. package/public/js/board-menu.js +0 -374
  259. package/public/js/card-actions.js +0 -545
  260. package/public/js/config.js +0 -20
  261. package/public/js/create-card.js +0 -190
  262. package/public/js/dom.js +0 -19
  263. package/public/js/drawer.js +0 -273
  264. package/public/js/font-preference.js +0 -229
  265. package/public/js/format.js +0 -433
  266. package/public/js/help-menu.js +0 -31
  267. package/public/js/icons.js +0 -16
  268. package/public/js/kanban.js +0 -694
  269. package/public/js/local-backend.js +0 -1015
  270. package/public/js/main.js +0 -161
  271. package/public/js/modal.js +0 -33
  272. package/public/js/motion-preference.js +0 -64
  273. package/public/js/panel.js +0 -58
  274. package/public/js/router.js +0 -134
  275. package/public/js/search.js +0 -56
  276. package/public/js/settings-tabs.js +0 -7
  277. package/public/js/settings.js +0 -1634
  278. package/public/js/sse.js +0 -159
  279. package/public/js/starscape.js +0 -332
  280. package/public/js/state.js +0 -129
  281. package/public/js/text-editing.js +0 -128
  282. package/public/js/theme-preference.js +0 -95
  283. package/public/js/ticket-detail.js +0 -1516
  284. package/public/js/ticket-typeahead.js +0 -49
  285. package/public/js/toast.js +0 -89
  286. package/public/js/topbar-notes.js +0 -155
  287. package/public/js/transport.js +0 -22
  288. package/public/js/typeahead.js +0 -206
  289. package/public/js/unread.js +0 -121
  290. package/public/js/update-check.js +0 -58
  291. package/public/js/url-routes.js +0 -94
  292. package/public/orbits-favicon.png +0 -0
  293. package/public/orbits-logo-bg-wide.png +0 -0
  294. package/public/orbits-logo-bg.png +0 -0
  295. package/public/orbits-logo.png +0 -0
  296. package/public/styles.css +0 -7709
  297. package/src/core/agent.js +0 -387
  298. package/src/core/agents-md.js +0 -109
  299. package/src/core/artifacts.js +0 -149
  300. package/src/core/attachments.js +0 -238
  301. package/src/core/auth.js +0 -85
  302. package/src/core/backups.js +0 -142
  303. package/src/core/board.js +0 -148
  304. package/src/core/boards.js +0 -409
  305. package/src/core/bootstrap.js +0 -170
  306. package/src/core/css-bundle.js +0 -30
  307. package/src/core/db.js +0 -315
  308. package/src/core/delete-board.js +0 -163
  309. package/src/core/dispatch.js +0 -1007
  310. package/src/core/events.js +0 -314
  311. package/src/core/http.js +0 -115
  312. package/src/core/migrate.js +0 -198
  313. package/src/core/paths.js +0 -55
  314. package/src/core/provision-repo-board.js +0 -119
  315. package/src/core/queries.js +0 -246
  316. package/src/core/registry.js +0 -211
  317. package/src/core/relations.js +0 -163
  318. package/src/core/review-verdicts.js +0 -138
  319. package/src/core/router.js +0 -556
  320. package/src/core/search.js +0 -183
  321. package/src/core/seed.js +0 -234
  322. package/src/core/snapshots.js +0 -692
  323. package/src/core/states.js +0 -167
  324. package/src/core/system-picker.js +0 -109
  325. package/src/core/tickets.js +0 -400
  326. package/src/core/util.js +0 -106
  327. package/src/core/version-check.js +0 -154
  328. package/src/mcp/orbit-client.js +0 -287
  329. package/src/server.js +0 -115
@@ -0,0 +1,2 @@
1
+ import{C as e}from"./app.BmuponPJ.js";var t=Array.from({length:256},(e,t)=>{let n=t;for(let e=0;e<8;e+=1)n=n&1?3988292384^n>>>1:n>>>1;return n>>>0});function n(e){let n=4294967295;for(let r of e)n=(t[(n^r)&255]??0)^n>>>8;return(n^4294967295)>>>0}function r(e,t){e.push(t&255,t>>>8&255)}function i(e,t){e.push(t&255,t>>>8&255,t>>>16&255,t>>>24&255)}function a(e=new Date){return{time:(e.getHours()&31)<<11|(e.getMinutes()&63)<<5|Math.floor(e.getSeconds()/2)&31,date:(e.getFullYear()-1980&127)<<9|(e.getMonth()+1&15)<<5|e.getDate()&31}}function o(e){let t=new TextEncoder,o=[],s=[],c=0,l=a();e.forEach(e=>{let a=t.encode(e.name),u=t.encode(e.content),d=n(u),f=[];i(f,67324752),r(f,20),r(f,2048),r(f,0),r(f,l.time),r(f,l.date),i(f,d),i(f,u.length),i(f,u.length),r(f,a.length),r(f,0),o.push(new Uint8Array(f),a,u);let p=[];i(p,33639248),r(p,20),r(p,20),r(p,2048),r(p,0),r(p,l.time),r(p,l.date),i(p,d),i(p,u.length),i(p,u.length),r(p,a.length),r(p,0),r(p,0),r(p,0),r(p,0),i(p,0),i(p,c),s.push(new Uint8Array(p),a),c+=f.length+a.length+u.length});let u=c,d=s.reduce((e,t)=>e+t.length,0),f=[];return i(f,101010256),r(f,0),r(f,0),r(f,e.length),r(f,e.length),i(f,d),i(f,u),r(f,0),new Blob([...o,...s,new Uint8Array(f)],{type:`application/zip`})}function s(e,t){let n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e,document.body.append(r),r.click(),r.remove(),URL.revokeObjectURL(n)}function c(e,t){let n=(e?.slug||e?.name||e?.id||`board`).trim().toLowerCase().replace(/[^a-z0-9._-]+/g,`-`).replace(/^-+|-+$/g,``)||`board`,r=`${n}.orbit.json`,i=2;for(;t.has(r);)r=`${n}-${i}.orbit.json`,i+=1;return t.add(r),r}async function l(t,{includeAttachments:n=!1}={}){let r=t.board.getState().data?.boards??[];if(!r.length)return e.error(`No boards to export`),!1;let i=new Set,a=[];for(let e of r){let r=await t.client.boards.export(e.id,{include_attachments:n});a.push({name:c(e,i),content:JSON.stringify(r,null,2)})}return s(`orbit-boards-${new Date().toISOString().slice(0,10)}${n?`.with-images`:``}.zip`,o(a)),e.success(`Exported ${a.length} board${a.length===1?``:`s`}`),!0}function u(e){return l(e,{includeAttachments:!0})}async function d(e){if(typeof DecompressionStream>`u`)throw Error(`Compressed ZIP entries are not supported in this browser.`);let t=new Blob([e]).stream().pipeThrough(new DecompressionStream(`deflate-raw`));return new Uint8Array(await new Response(t).arrayBuffer())}function f(e,t=`snapshot`){if(e.trimStart().startsWith(`<`))throw Error(`${t} looks like HTML instead of JSON.`);try{let t=JSON.parse(e);if(!t?.board)throw Error(`snapshot_missing_board`);return t}catch(e){throw Error(`${t}: ${e instanceof Error?e.message:`invalid JSON`}`)}}async function p(e){let t=await e.arrayBuffer(),n=new DataView(t),r=new Uint8Array(t),i=new TextDecoder,a=[],o=0;for(;o+30<=r.length;){let e=n.getUint32(o,!0);if(e===33639248||e===101010256)break;if(e!==67324752)throw Error(`Invalid ZIP archive.`);let t=n.getUint16(o+6,!0),s=n.getUint16(o+8,!0),c=n.getUint32(o+18,!0),l=n.getUint16(o+26,!0),u=n.getUint16(o+28,!0),p=o+30,m=p+l+u,h=m+c;if(t&8)throw Error(`ZIP entries with data descriptors are not supported.`);if(h>r.length)throw Error(`Invalid ZIP archive.`);let g=i.decode(r.slice(p,p+l));if(!g.endsWith(`/`)){if(!g.toLowerCase().endsWith(`.orbit.json`))throw Error(`ZIP imports may contain only .orbit.json files.`);let e=r.slice(m,h),t=s===0?e:s===8?await d(e):null;if(!t)throw Error(`Unsupported ZIP compression method.`);a.push(f(i.decode(t),g))}o=h}if(!a.length)throw Error(`ZIP archive did not contain any .orbit.json snapshots.`);return a}async function m(e){let t=e.name.toLowerCase();if(t.endsWith(`.zip`))return p(e);if(t.endsWith(`.orbit.json`))return[f(await e.text(),e.name)];throw Error(`Choose a .zip archive or a single .orbit.json snapshot.`)}function h(e){let t=e.reduce((e,t)=>e+(t.images_kept_as_downloads||0),0),n=e.reduce((e,t)=>e+(t.cross_board_links_dropped||0),0),r=[t?`${String(t)} image${t===1?` is`:`s are`} kept as a file to download (SVG, or not an image Orbit shows)`:``,n?`${String(n)} link${n===1?``:`s`} to cards on other boards didn't come`:``].filter(Boolean);return r.length?`. ${r.join(`; `)}.`:``}export{m as i,l as n,h as r,u as t};
2
+ //# sourceMappingURL=chunk.1fJGQGbW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk.1fJGQGbW.js","names":["toast","crcTable","crc","index","bit","crc32","byte","bytes","writeUint16","value","writeUint32","zipDateTime","date","createZip","encoder","localParts","centralParts","offset","timestamp","files","nameBytes","file","dataBytes","checksum","localHeader","centralHeader","centralOffset","centralSize","sum","part","endHeader","downloadBlob","url","blob","anchor","filename","safeExportName","base","board","name","suffix","usedNames","exportAllBoards","boards","app","snapshot","includeAttachments","backUpAllBoards","inflateZipEntry","stream","parseSnapshotText","text","error","readZipSnapshots","buffer","view","decoder","snapshots","signature","flags","method","compressedSize","nameLength","extraLength","nameStart","dataStart","dataEnd","compressed","data","readImportSnapshots","importNotes","downloads","results","result","dropped","parts"],"sources":["../../../web/src/lib/board-export.ts"],"sourcesContent":["// Every board as one ZIP of `.orbit.json` snapshots, downloaded: the board\n// menu's Export All and Settings' \"Back up all boards\". And reading such an\n// archive (or one snapshot) back for Import.\n\nimport type { ImportResult } from \"../../../src/core/snapshots.ts\";\nimport type { OrbitApp } from \"../orbit/app.ts\";\nimport { toast } from \"../ui/toast.ts\";\n\nconst crcTable = Array.from({ length: 256 }, (_, index) => {\n let crc = index;\n for (let bit = 0; bit < 8; bit += 1) {\n crc = crc & 1 ? 0xedb88320 ^ (crc >>> 1) : crc >>> 1;\n }\n return crc >>> 0;\n});\n\nfunction crc32(bytes: Uint8Array): number {\n let crc = 0xffffffff;\n for (const byte of bytes) crc = (crcTable[(crc ^ byte) & 0xff] ?? 0) ^ (crc >>> 8);\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction writeUint16(bytes: number[], value: number): void {\n bytes.push(value & 0xff, (value >>> 8) & 0xff);\n}\n\nfunction writeUint32(bytes: number[], value: number): void {\n bytes.push(value & 0xff, (value >>> 8) & 0xff, (value >>> 16) & 0xff, (value >>> 24) & 0xff);\n}\n\nfunction zipDateTime(date = new Date()): { time: number; date: number } {\n return {\n time:\n ((date.getHours() & 0x1f) << 11) |\n ((date.getMinutes() & 0x3f) << 5) |\n (Math.floor(date.getSeconds() / 2) & 0x1f),\n date:\n (((date.getFullYear() - 1980) & 0x7f) << 9) |\n (((date.getMonth() + 1) & 0xf) << 5) |\n (date.getDate() & 0x1f)\n };\n}\n\nexport function createZip(files: { name: string; content: string }[]): Blob {\n const encoder = new TextEncoder();\n const localParts: Uint8Array<ArrayBuffer>[] = [];\n const centralParts: Uint8Array<ArrayBuffer>[] = [];\n let offset = 0;\n const timestamp = zipDateTime();\n\n files.forEach((file) => {\n const nameBytes = encoder.encode(file.name);\n const dataBytes = encoder.encode(file.content);\n const checksum = crc32(dataBytes);\n const localHeader: number[] = [];\n writeUint32(localHeader, 0x04034b50);\n writeUint16(localHeader, 20);\n writeUint16(localHeader, 0x0800);\n writeUint16(localHeader, 0);\n writeUint16(localHeader, timestamp.time);\n writeUint16(localHeader, timestamp.date);\n writeUint32(localHeader, checksum);\n writeUint32(localHeader, dataBytes.length);\n writeUint32(localHeader, dataBytes.length);\n writeUint16(localHeader, nameBytes.length);\n writeUint16(localHeader, 0);\n localParts.push(new Uint8Array(localHeader), nameBytes, dataBytes);\n\n const centralHeader: number[] = [];\n writeUint32(centralHeader, 0x02014b50);\n writeUint16(centralHeader, 20);\n writeUint16(centralHeader, 20);\n writeUint16(centralHeader, 0x0800);\n writeUint16(centralHeader, 0);\n writeUint16(centralHeader, timestamp.time);\n writeUint16(centralHeader, timestamp.date);\n writeUint32(centralHeader, checksum);\n writeUint32(centralHeader, dataBytes.length);\n writeUint32(centralHeader, dataBytes.length);\n writeUint16(centralHeader, nameBytes.length);\n writeUint16(centralHeader, 0);\n writeUint16(centralHeader, 0);\n writeUint16(centralHeader, 0);\n writeUint16(centralHeader, 0);\n writeUint32(centralHeader, 0);\n writeUint32(centralHeader, offset);\n centralParts.push(new Uint8Array(centralHeader), nameBytes);\n\n offset += localHeader.length + nameBytes.length + dataBytes.length;\n });\n\n const centralOffset = offset;\n const centralSize = centralParts.reduce((sum, part) => sum + part.length, 0);\n const endHeader: number[] = [];\n writeUint32(endHeader, 0x06054b50);\n writeUint16(endHeader, 0);\n writeUint16(endHeader, 0);\n writeUint16(endHeader, files.length);\n writeUint16(endHeader, files.length);\n writeUint32(endHeader, centralSize);\n writeUint32(endHeader, centralOffset);\n writeUint16(endHeader, 0);\n\n return new Blob([...localParts, ...centralParts, new Uint8Array(endHeader)], { type: \"application/zip\" });\n}\n\nexport function downloadBlob(filename: string, blob: Blob): void {\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n document.body.append(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(url);\n}\n\nexport function safeExportName(board: { slug?: string; name?: string; id?: string } | null | undefined, usedNames: Set<string>): string {\n const base = (board?.slug || board?.name || board?.id || \"board\")\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"board\";\n let name = `${base}.orbit.json`;\n let suffix = 2;\n while (usedNames.has(name)) {\n name = `${base}-${suffix}.orbit.json`;\n suffix += 1;\n }\n usedNames.add(name);\n return name;\n}\n\n/** Downloads every board as one ZIP; false when there are none. A failed export throws. */\nexport async function exportAllBoards(app: OrbitApp, { includeAttachments = false }: { includeAttachments?: boolean } = {}): Promise<boolean> {\n const boards = app.board.getState().data?.boards ?? [];\n if (!boards.length) {\n toast.error(\"No boards to export\");\n return false;\n }\n const usedNames = new Set<string>();\n const files: { name: string; content: string }[] = [];\n for (const board of boards) {\n const snapshot = await app.client.boards.export(board.id, { include_attachments: includeAttachments });\n files.push({ name: safeExportName(board, usedNames), content: JSON.stringify(snapshot, null, 2) });\n }\n const date = new Date().toISOString().slice(0, 10);\n downloadBlob(`orbit-boards-${date}${includeAttachments ? \".with-images\" : \"\"}.zip`, createZip(files));\n toast.success(`Exported ${files.length} board${files.length === 1 ? \"\" : \"s\"}`);\n return true;\n}\n\n/** Settings' \"Back up all boards\": every board with its images, so the ZIP restores them whole. */\nexport function backUpAllBoards(app: OrbitApp): Promise<boolean> {\n return exportAllBoards(app, { includeAttachments: true });\n}\n\nasync function inflateZipEntry(bytes: Uint8Array<ArrayBuffer>): Promise<Uint8Array<ArrayBuffer>> {\n if (typeof DecompressionStream === \"undefined\") throw new Error(\"Compressed ZIP entries are not supported in this browser.\");\n const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream(\"deflate-raw\"));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n}\n\nexport type Snapshot = Record<string, unknown> & { board: { id?: string; slug?: string; name?: string } };\n\nexport function parseSnapshotText(text: string, filename = \"snapshot\"): Snapshot {\n if (text.trimStart().startsWith(\"<\")) throw new Error(`${filename} looks like HTML instead of JSON.`);\n try {\n const snapshot = JSON.parse(text) as Partial<Snapshot> | null;\n if (!snapshot?.board) throw new Error(\"snapshot_missing_board\");\n return snapshot as Snapshot;\n } catch (error) {\n throw new Error(`${filename}: ${error instanceof Error ? error.message : \"invalid JSON\"}`);\n }\n}\n\nasync function readZipSnapshots(file: File): Promise<Snapshot[]> {\n const buffer = await file.arrayBuffer();\n const view = new DataView(buffer);\n const bytes = new Uint8Array(buffer);\n const decoder = new TextDecoder();\n const snapshots: Snapshot[] = [];\n let offset = 0;\n while (offset + 30 <= bytes.length) {\n const signature = view.getUint32(offset, true);\n if (signature === 0x02014b50 || signature === 0x06054b50) break;\n if (signature !== 0x04034b50) throw new Error(\"Invalid ZIP archive.\");\n const flags = view.getUint16(offset + 6, true);\n const method = view.getUint16(offset + 8, true);\n const compressedSize = view.getUint32(offset + 18, true);\n const nameLength = view.getUint16(offset + 26, true);\n const extraLength = view.getUint16(offset + 28, true);\n const nameStart = offset + 30;\n const dataStart = nameStart + nameLength + extraLength;\n const dataEnd = dataStart + compressedSize;\n if (flags & 0x0008) throw new Error(\"ZIP entries with data descriptors are not supported.\");\n if (dataEnd > bytes.length) throw new Error(\"Invalid ZIP archive.\");\n const name = decoder.decode(bytes.slice(nameStart, nameStart + nameLength));\n if (!name.endsWith(\"/\")) {\n if (!name.toLowerCase().endsWith(\".orbit.json\")) throw new Error(\"ZIP imports may contain only .orbit.json files.\");\n const compressed = bytes.slice(dataStart, dataEnd);\n const data = method === 0 ? compressed : method === 8 ? await inflateZipEntry(compressed) : null;\n if (!data) throw new Error(\"Unsupported ZIP compression method.\");\n snapshots.push(parseSnapshotText(decoder.decode(data), name));\n }\n offset = dataEnd;\n }\n if (!snapshots.length) throw new Error(\"ZIP archive did not contain any .orbit.json snapshots.\");\n return snapshots;\n}\n\n/** The snapshots in a chosen file: an Export All ZIP or one `.orbit.json`. */\nexport async function readImportSnapshots(file: File): Promise<Snapshot[]> {\n const name = file.name.toLowerCase();\n if (name.endsWith(\".zip\")) return readZipSnapshots(file);\n if (name.endsWith(\".orbit.json\")) return [parseSnapshotText(await file.text(), file.name)];\n throw new Error(\"Choose a .zip archive or a single .orbit.json snapshot.\");\n}\n\n/** What imports left out or changed, as one sentence to add to their message, or \"\" when nothing was. */\nexport function importNotes(results: readonly Pick<ImportResult, \"images_kept_as_downloads\" | \"cross_board_links_dropped\">[]): string {\n const downloads = results.reduce((sum, result) => sum + (result.images_kept_as_downloads || 0), 0);\n const dropped = results.reduce((sum, result) => sum + (result.cross_board_links_dropped || 0), 0);\n const parts = [\n downloads ? `${String(downloads)} image${downloads === 1 ? \" is\" : \"s are\"} kept as a file to download (SVG, or not an image Orbit shows)` : \"\",\n dropped ? `${String(dropped)} link${dropped === 1 ? \"\" : \"s\"} to cards on other boards didn't come` : \"\"\n ].filter(Boolean);\n return parts.length ? `. ${parts.join(\"; \")}.` : \"\";\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{n as e,t}from"./chunk.D_Haqy6R.js";import{H as n,M as r,P as i,U as a,W as o,_ as s,b as c,f as l,g as u,h as d,v as f,y as p,z as m}from"./app.BmuponPJ.js";var h=e(),g=t();function _(e){let t=(0,h.c)(55),{ticket:_,eyebrow:y,detach:b,archive:x,onOpen:S}=e,C=r(v),w=l(_.board_id??``,_.id),T;t[0]===_.type?T=t[1]:(T=i(_.type),t[0]=_.type,t[1]=T);let E=T,D;t[2]===_.priority?D=t[3]:(D=m(_.priority),t[2]=_.priority,t[3]=D);let O=`card card--detail type-${E} priority-${D}`,k=S?_.id:void 0,A;t[4]===S?A=t[5]:(A=S?e=>{e.target.closest(`button`)||S()}:void 0,t[4]=S,t[5]=A);let j;t[6]===w?j=t[7]:(j=(0,g.jsx)(c,{count:w}),t[6]=w,t[7]=j);let M;t[8]===y?M=t[9]:(M=y?(0,g.jsx)(`span`,{className:`card-eyebrow`,children:y}):null,t[8]=y,t[9]=M);let N;t[10]===_.title?N=t[11]:(N=(0,g.jsx)(`h3`,{children:_.title}),t[10]=_.title,t[11]=N);let P;t[12]===_?P=t[13]:(P=a(_),t[12]=_,t[13]=P);let F;t[14]===P?F=t[15]:(F=(0,g.jsx)(`span`,{className:`ticket-number`,children:P}),t[14]=P,t[15]=F);let I=`card-type-id type-pill-${E}`,L;t[16]===_.type?L=t[17]:(L=(0,g.jsx)(p,{type:_.type}),t[16]=_.type,t[17]=L);let R;t[18]===_.type?R=t[19]:(R=o(_.type).toUpperCase(),t[18]=_.type,t[19]=R);let z;t[20]===R?z=t[21]:(z=(0,g.jsx)(`span`,{className:`card-type-label`,children:R}),t[20]=R,t[21]=z);let B;t[22]!==I||t[23]!==L||t[24]!==z?(B=(0,g.jsxs)(`div`,{className:I,children:[L,z]}),t[22]=I,t[23]=L,t[24]=z,t[25]=B):B=t[25];let V;t[26]===_?V=t[27]:(V=n(_),t[26]=_,t[27]=V);let H=_.state_name||`State`,U;t[28]!==V||t[29]!==H?(U=(0,g.jsx)(`span`,{className:`detail-card-state`,"data-variant":V,children:H}),t[28]=V,t[29]=H,t[30]=U):U=t[30];let W;t[31]!==C||t[32]!==_.priority?(W=C?(0,g.jsx)(u,{priority:_.priority}):null,t[31]=C,t[32]=_.priority,t[33]=W):W=t[33];let G;t[34]===b?G=t[35]:(G=b?(0,g.jsx)(`button`,{type:`button`,className:`card-detach-btn`,"aria-label":b.label,title:b.label,onClick:b.onDetach,children:(0,g.jsx)(d,{})}):null,t[34]=b,t[35]=G);let K;t[36]!==x||t[37]!==b?(K=!b&&x?(0,g.jsxs)(`div`,{className:`card-archive-actions`,children:[(0,g.jsx)(`button`,{type:`button`,className:`card-archive-btn card-archive-btn--restore`,"aria-label":`Restore to board`,title:`Restore to board`,onClick:x.onRestore,children:(0,g.jsx)(s,{})}),(0,g.jsx)(`button`,{type:`button`,className:`card-archive-btn card-archive-btn--delete`,"aria-label":`Delete permanently`,title:`Delete permanently`,onClick:x.onDelete,children:(0,g.jsx)(f,{size:14})})]}):null,t[36]=x,t[37]=b,t[38]=K):K=t[38];let q;t[39]!==F||t[40]!==B||t[41]!==U||t[42]!==W||t[43]!==G||t[44]!==K?(q=(0,g.jsx)(`div`,{className:`card-meta`,children:(0,g.jsxs)(`div`,{className:`card-expand-trigger card-expand-trigger--static`,children:[F,B,U,W,G,K]})}),t[39]=F,t[40]=B,t[41]=U,t[42]=W,t[43]=G,t[44]=K,t[45]=q):q=t[45];let J;return t[46]!==q||t[47]!==O||t[48]!==k||t[49]!==A||t[50]!==j||t[51]!==M||t[52]!==N||t[53]!==E?(J=(0,g.jsxs)(`article`,{className:O,"data-variant":E,"data-open-ticket":k,onClick:A,children:[j,M,N,q]}),t[46]=q,t[47]=O,t[48]=k,t[49]=A,t[50]=j,t[51]=M,t[52]=N,t[53]=E,t[54]=J):J=t[54],J}function v(e){return e.showPriority}export{_ as t};
2
+ //# sourceMappingURL=chunk.5D7JO2zp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk.5D7JO2zp.js","names":["unread","eyebrow","type","_c","require_compiler_runtime","stateClassFor","useUi","canonicalTicketType","ticketLabel","typeLabel","RestoreIcon","UnreadDot","useUnreadCount","PriorityPill","CloseIcon","TrashIcon","TypeIcon","priorityKeyFor","import_compiler_runtime","import_jsx_runtime","require_jsx_runtime","DetailCard","$","t0","showPriority","_temp","unread","ticket","t1","type","t2","t3","t4","onOpen","t5","event","t6","t7","eyebrow","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","detach","t21","archive","t22","t23","s"],"sources":["../../../web/src/ui/DetailCard.tsx"],"sourcesContent":["// A card as the drawer and Settings list it: its title, number, type, lane\n// and priority, with one action (remove a link, or restore and delete an\n// archived card). Pressing it opens the card, unless `onOpen` is left out.\n\nimport { canonicalTicketType, priorityKeyFor, stateClassFor, ticketLabel, typeLabel } from \"../lib/format.ts\";\nimport { useUnreadCount } from \"../lib/unread.ts\";\nimport { useUi } from \"../orbit/context.tsx\";\nimport { CloseIcon, PriorityPill, RestoreIcon, TrashIcon, TypeIcon, UnreadDot } from \"./icons.tsx\";\n\nexport interface DetailCardTicket {\n id: string;\n board_id?: string;\n number: number;\n title: string;\n type: string;\n priority: number;\n state_name?: string | null;\n state_role?: string | null;\n}\n\ninterface DetailCardProps {\n ticket: DetailCardTicket;\n eyebrow?: string;\n /** A remove button: \"Remove from epic\", \"Remove parent epic\" or \"Remove relation\". */\n detach?: { label: \"Remove from epic\" | \"Remove parent epic\" | \"Remove relation\"; onDetach: () => void };\n /** Restore and delete buttons, for an archived card. */\n archive?: { onRestore: () => void; onDelete: () => void };\n onOpen?: () => void;\n}\n\nexport function DetailCard({ ticket, eyebrow, detach, archive, onOpen }: DetailCardProps) {\n const showPriority = useUi((s) => s.showPriority);\n const unread = useUnreadCount(ticket.board_id ?? \"\", ticket.id);\n const type = canonicalTicketType(ticket.type);\n return (\n <article\n className={`card card--detail type-${type} priority-${priorityKeyFor(ticket.priority)}`}\n data-variant={type}\n data-open-ticket={onOpen ? ticket.id : undefined}\n onClick={\n onOpen\n ? (event) => {\n if ((event.target as Element).closest(\"button\")) return;\n onOpen();\n }\n : undefined\n }\n >\n <UnreadDot count={unread} />\n {eyebrow ? <span className=\"card-eyebrow\">{eyebrow}</span> : null}\n <h3>{ticket.title}</h3>\n <div className=\"card-meta\">\n <div className=\"card-expand-trigger card-expand-trigger--static\">\n <span className=\"ticket-number\">{ticketLabel(ticket)}</span>\n <div className={`card-type-id type-pill-${type}`}>\n <TypeIcon type={ticket.type} />\n <span className=\"card-type-label\">{typeLabel(ticket.type).toUpperCase()}</span>\n </div>\n <span className=\"detail-card-state\" data-variant={stateClassFor(ticket)}>\n {ticket.state_name || \"State\"}\n </span>\n {showPriority ? <PriorityPill priority={ticket.priority} /> : null}\n {detach ? (\n <button type=\"button\" className=\"card-detach-btn\" aria-label={detach.label} title={detach.label} onClick={detach.onDetach}>\n <CloseIcon />\n </button>\n ) : null}\n {!detach && archive ? (\n <div className=\"card-archive-actions\">\n <button type=\"button\" className=\"card-archive-btn card-archive-btn--restore\" aria-label=\"Restore to board\" title=\"Restore to board\" onClick={archive.onRestore}>\n <RestoreIcon />\n </button>\n <button type=\"button\" className=\"card-archive-btn card-archive-btn--delete\" aria-label=\"Delete permanently\" title=\"Delete permanently\" onClick={archive.onDelete}>\n <TrashIcon size={14} />\n </button>\n </div>\n ) : null}\n </div>\n </div>\n </article>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t,r as n,t as r}from"./chunk.D_Haqy6R.js";import{A as i,B as a,C as o,D as s,E as c,F as l,G as u,H as d,L as f,O as p,P as m,R as h,T as g,U as _,a as v,d as y,h as b,i as x,j as S,k as C,m as w,o as T,r as E,s as D,tt as O,u as k,w as A,z as j}from"./app.BmuponPJ.js";import{t as M}from"./chunk.5D7JO2zp.js";var N=e(n(),1),P=t(),F=r(),I=e=>`mab_section_closed:${e}`;function L(e){try{return localStorage.getItem(I(e))===`1`}catch{return!1}}function R(e,t){try{t?localStorage.removeItem(I(e)):localStorage.setItem(I(e),`1`)}catch{}}function z(e){let t=(0,P.c)(11),n,r;t[0]===e?(n=t[1],r=t[2]):({section:r,...n}=e,t[0]=e,t[1]=n,t[2]=r);let i;t[3]===r?i=t[4]:(i=L(r),t[3]=r,t[4]=i);let a=!i,o;t[5]===r?o=t[6]:(o=e=>R(r,e),t[5]=r,t[6]=o);let s;return t[7]!==n||t[8]!==a||t[9]!==o?(s=(0,F.jsx)(B,{...n,open:a,onToggle:o}),t[7]=n,t[8]=a,t[9]=o,t[10]=s):s=t[10],s}function B(e){let t=(0,P.c)(17),{title:n,children:r,className:i,headExtra:a,attrs:o,open:s,onToggle:c}=e,l=s??!1,u=`settings-card settings-card--collapsible${i?` ${i}`:``}`,d;t[0]===c?d=t[1]:(d=c?e=>c(e.currentTarget.open):void 0,t[0]=c,t[1]=d);let f;t[2]===n?f=t[3]:(f=(0,F.jsx)(`h3`,{className:`settings-card-title`,children:n}),t[2]=n,t[3]=f);let p;t[4]===Symbol.for(`react.memo_cache_sentinel`)?(p=(0,F.jsx)(`svg`,{className:`settings-card-chevron`,viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:(0,F.jsx)(`path`,{d:`M6 9l6 6 6-6`})}),t[4]=p):p=t[4];let m;t[5]!==a||t[6]!==f?(m=(0,F.jsxs)(`summary`,{className:`settings-card-head`,children:[f,a,p]}),t[5]=a,t[6]=f,t[7]=m):m=t[7];let h;t[8]===r?h=t[9]:(h=(0,F.jsx)(`div`,{className:`settings-card-body`,children:r}),t[8]=r,t[9]=h);let g;return t[10]!==o||t[11]!==l||t[12]!==u||t[13]!==d||t[14]!==m||t[15]!==h?(g=(0,F.jsxs)(`details`,{className:u,open:l,onToggle:d,...o,children:[m,h]}),t[10]=o,t[11]=l,t[12]=u,t[13]=d,t[14]=m,t[15]=h,t[16]=g):g=t[16],g}var V=e=>`mab_ai_plan_open:${e}`;function H(e){try{return localStorage.getItem(V(e))===`1`}catch{return!1}}function ee(e,t){try{t?localStorage.setItem(V(e),`1`):localStorage.removeItem(V(e))}catch{}}function te(e){let t=(0,P.c)(23),{ticket:n,patch:r}=e,i;t[0]===n.id?i=t[1]:(i=H(n.id),t[0]=n.id,t[1]=i);let a,o;t[2]===n.id?(a=t[3],o=t[4]):(a=e=>ee(n.id,e),o={"data-ai-plan-toggle":``,"data-ticket-id":n.id},t[2]=n.id,t[3]=a,t[4]=o);let s;t[5]===Symbol.for(`react.memo_cache_sentinel`)?(s={field:`plan_artifact_path`,label:`Open full handoff`},t[5]=s):s=t[5];let c;t[6]!==r||t[7]!==n?(c=(0,F.jsx)(U,{ticket:n,field:`ai_plan`,label:`AI Plan`,placeholder:`What to do: `,artifact:s,patch:r}),t[6]=r,t[7]=n,t[8]=c):c=t[8];let l;t[9]===Symbol.for(`react.memo_cache_sentinel`)?(l={field:`implementation_artifact_path`,label:`Open full report`},t[9]=l):l=t[9];let u,d;t[10]!==r||t[11]!==n?(u=(0,F.jsx)(U,{ticket:n,field:`implementation_summary`,label:`Work Summary`,placeholder:`What was done: `,artifact:l,patch:r}),d=(0,F.jsx)(U,{ticket:n,field:`implementation_updates`,label:`Revisions`,placeholder:`Changes since initial implementation: `,patch:r}),t[10]=r,t[11]=n,t[12]=u,t[13]=d):(u=t[12],d=t[13]);let f;t[14]!==c||t[15]!==u||t[16]!==d?(f=(0,F.jsxs)(`div`,{className:`ai-fields-grid`,children:[c,u,d]}),t[14]=c,t[15]=u,t[16]=d,t[17]=f):f=t[17];let p;return t[18]!==i||t[19]!==a||t[20]!==o||t[21]!==f?(p=(0,F.jsx)(B,{title:`AI Plan / Implementation Record`,open:i,onToggle:a,attrs:o,children:f}),t[18]=i,t[19]=a,t[20]=o,t[21]=f,t[22]=p):p=t[22],p}async function ne(e,t,n,r){let i=window.prompt(`Local markdown/text path for ${n} (example: docs/test.md or ./docs/test.md)`,t||`docs/`);if(i===null)return;let a=l(i).trim(),s={};s[e]=a,await r(s)&&o.success(a?`Artifact path updated`:`Artifact path cleared`)}async function re(e,t,n,r,i,a){r&&await w(e,{ticketId:t,path:r,title:i})||await ne(n,r,i,a)}function U(e){let t=(0,P.c)(35),{ticket:n,field:r,label:a,placeholder:o,artifact:s,patch:c}=e,u=i(),d=n[r]||``,f=`Edit ${a}`,p;t[0]!==r||t[1]!==c?(p=async e=>{let t={};t[r]=l(e),await c(t)},t[0]=r,t[1]=c,t[2]=p):p=t[2];let m;t[3]!==r||t[4]!==f||t[5]!==p||t[6]!==d?(m={value:d,fieldName:r,multiline:!0,ariaLabel:f,onCommit:p},t[3]=r,t[4]=f,t[5]=p,t[6]=d,t[7]=m):m=t[7];let h=E(m),g;t[8]===d?g=t[9]:(g=d.trim(),t[8]=d,t[9]=g);let _=!!g,v;t[10]!==s||t[11]!==n?(v=s?(n[s.field]||``).trim():``,t[10]=s,t[11]=n,t[12]=v):v=t[12];let y=v,b;t[13]===a?b=t[14]:(b=(0,F.jsx)(`span`,{className:`inline-md-field-label`,children:a}),t[13]=a,t[14]=b);let x;t[15]!==u||t[16]!==s||t[17]!==a||t[18]!==c||t[19]!==y||t[20]!==n.id?(x=s?(0,F.jsx)(`button`,{type:`button`,className:`detail-action-btn`,"data-variant":`ghost`,"data-open-artifact":y,"data-artifact-field":s.field,"data-artifact-ticket-id":n.id,"data-artifact-title":a,onClick:e=>{e.stopPropagation(),re(u,n.id,s.field,y,a,c)},children:s.label}):null,t[15]=u,t[16]=s,t[17]=a,t[18]=c,t[19]=y,t[20]=n.id,t[21]=x):x=t[21];let S;t[22]!==b||t[23]!==x?(S=(0,F.jsxs)(`div`,{className:`inline-md-field-head`,children:[b,x]}),t[22]=b,t[23]=x,t[24]=S):S=t[24];let C;t[25]!==h||t[26]!==r||t[27]!==_||t[28]!==a||t[29]!==o||t[30]!==d?(C=h.editor??(0,F.jsx)(`div`,{className:`inline-md-field-body preserved-text-body editable-field ${_?``:`is-placeholder`}`,"data-edit-field":r,tabIndex:0,title:`Click to edit`,role:`button`,"aria-label":`Edit ${a}`,onClick:e=>{e.preventDefault(),h.start(e)},onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),h.start(e))},children:_?l(d):o}),t[25]=h,t[26]=r,t[27]=_,t[28]=a,t[29]=o,t[30]=d,t[31]=C):C=t[31];let w;return t[32]!==S||t[33]!==C?(w=(0,F.jsxs)(`div`,{className:`inline-md-field`,children:[S,C]}),t[32]=S,t[33]=C,t[34]=w):w=t[34],w}var ie=e(O(),1);function ae(e){let t=e||0;return t<1024?`${t} B`:t<1048576?`${(t/1024).toFixed(1)} KB`:`${(t/1048576).toFixed(1)} MB`}function W(e){return[...e??[]].filter(e=>e.type.startsWith(`image/`))}function G(e,t){return e instanceof Error&&e.message?e.message:t}function oe(e){let t=(0,P.c)(40),{ticketId:n,attachments:r,refresh:a}=e,s=i(),[c,l]=(0,N.useState)(!1),[u,d]=(0,N.useState)(null),f;t[0]!==s||t[1]!==a||t[2]!==n?(f=async e=>{if(!e.length)o.warning(`No image files found`);else{for(let t of e){let e=new Uint8Array(await t.arrayBuffer());await s.client.attachments.create(n,e,{mime_type:t.type||`application/octet-stream`,original_name:t.name||`image`},s.hint())}a(),o.success(e.length===1?`Image attached`:`${e.length} images attached`)}},t[0]=s,t[1]=a,t[2]=n,t[3]=f):f=t[3];let p=f,m;t[4]===p?m=t[5]:(m=e=>{let t=e.target instanceof Element?e.target:null;if(!t?.closest(`#drawerInner`)||t.closest(`input, textarea, [contenteditable='true']`))return;let n=W(e.clipboardData?.files);n.length&&(e.preventDefault(),p(n).catch(le))},t[4]=p,t[5]=m);let h=(0,N.useEffectEvent)(m),g;t[6]===h?g=t[7]:(g=()=>{let e=e=>h(e);return document.addEventListener(`paste`,e),()=>document.removeEventListener(`paste`,e)},t[6]=h,t[7]=g);let _;t[8]===Symbol.for(`react.memo_cache_sentinel`)?(_=[],t[8]=_):_=t[8],(0,N.useEffect)(g,_);let v;t[9]!==s||t[10]!==a||t[11]!==n?(v=async e=>{try{await s.call(()=>s.client.attachments.remove(n,e,s.hint()))}catch{return}a(),o.success(`Image removed`)},t[9]=s,t[10]=a,t[11]=n,t[12]=v):v=t[12];let y=v,b;t[13]===n?b=t[14]:(b={"data-attachment-section":``,"data-ticket-id":n},t[13]=n,t[14]=b);let x=`attachment-dropzone${c?` is-dragover`:``}`,S,C;t[15]===Symbol.for(`react.memo_cache_sentinel`)?(S=e=>{e.preventDefault(),l(!0)},C=()=>l(!1),t[15]=S,t[16]=C):(S=t[15],C=t[16]);let w;t[17]===p?w=t[18]:(w=e=>{e.preventDefault(),l(!1),p(W(e.dataTransfer.files)).catch(ce)},t[17]=p,t[18]=w);let T,E;t[19]===Symbol.for(`react.memo_cache_sentinel`)?(T=(0,F.jsx)(`strong`,{children:`Paste, drag, or upload images`}),E=(0,F.jsx)(`span`,{children:`PNG, JPG, GIF, WebP, or AVIF up to 10 MB each. SVG isn't taken: it can carry script.`}),t[19]=T,t[20]=E):(T=t[19],E=t[20]);let D;t[21]!==w||t[22]!==x?(D=(0,F.jsxs)(`div`,{className:x,"data-attachment-dropzone":``,tabIndex:0,onDragOver:S,onDragLeave:C,onDrop:w,children:[T,E]}),t[21]=w,t[22]=x,t[23]=D):D=t[23];let O;t[24]!==r||t[25]!==y||t[26]!==n?(O=r.length?(0,F.jsx)(`div`,{className:`attachment-grid`,children:r.map(e=>(0,F.jsx)(pe,{ticketId:n,attachment:e,onOpen:d,onRemove:()=>void y(e.id)},e.id))}):(0,F.jsx)(`p`,{className:`description attachment-empty-state`,children:`No images attached yet.`}),t[24]=r,t[25]=y,t[26]=n,t[27]=O):O=t[27];let k;t[28]===p?k=t[29]:(k=(0,F.jsxs)(`label`,{className:`attachment-upload-button detail-action-btn`,role:`button`,"data-variant":`ghost`,tabIndex:0,children:[`Upload`,(0,F.jsx)(`input`,{type:`file`,accept:`image/png,image/jpeg,image/gif,image/webp,image/avif`,multiple:!0,"data-attachment-input":``,onChange:e=>{let t=e.currentTarget;p(W(t.files)).then(()=>{t.value=``},se)}})]}),t[28]=p,t[29]=k);let A;t[30]!==D||t[31]!==O||t[32]!==k?(A=(0,F.jsxs)(`div`,{className:`settings-row`,children:[D,O,k]}),t[30]=D,t[31]=O,t[32]=k,t[33]=A):A=t[33];let j;t[34]===u?j=t[35]:(j=u?(0,F.jsx)(me,{src:u.src,title:u.title,onClose:()=>d(null)}):null,t[34]=u,t[35]=j);let M;return t[36]!==A||t[37]!==j||t[38]!==b?(M=(0,F.jsxs)(z,{section:`images`,title:`Images`,className:`attachments-panel`,attrs:b,children:[A,j]}),t[36]=A,t[37]=j,t[38]=b,t[39]=M):M=t[39],M}function se(e){return o.error(G(e,`Upload failed`))}function ce(e){return o.error(G(e,`Upload failed`))}function le(e){return o.error(G(e,`Paste upload failed`))}function ue(e,t,n){let r=(0,P.c)(6),a=i(),[o,s]=(0,N.useState)(``),c,l;return r[0]!==a||r[1]!==t||r[2]!==n||r[3]!==e?(c=()=>{if(n)return;let r=!1,i=fe;return a.client.attachments.url(e,t,a.hint()).then(e=>{r?e.release():(i=()=>e.release(),s(e.url))},de),()=>{r=!0,i()}},l=[a,e,t,n],r[0]=a,r[1]=t,r[2]=n,r[3]=e,r[4]=c,r[5]=l):(c=r[4],l=r[5]),(0,N.useEffect)(c,l),o}function de(){}function fe(){}function pe(e){let t=(0,P.c)(65),{ticketId:n,attachment:r,onOpen:i,onRemove:a}=e,o=ue(n,r.id,r.missing),s=r.original_name||`image`,c;t[0]===s?c=t[1]:(c=(0,F.jsx)(`strong`,{children:s}),t[0]=s,t[1]=c);let l;t[2]===r.size_bytes?l=t[3]:(l=ae(r.size_bytes),t[2]=r.size_bytes,t[3]=l);let u=`${l} · ${r.mime_type||`image`}`,d;t[4]===u?d=t[5]:(d=(0,F.jsx)(`span`,{children:u}),t[4]=u,t[5]=d);let f;t[6]!==c||t[7]!==d?(f=(0,F.jsxs)(`div`,{className:`attachment-card-meta`,children:[c,d]}),t[6]=c,t[7]=d,t[8]=f):f=t[8];let p=f;if(r.download_only&&!r.missing){let e;t[9]===s?e=t[10]:(e=(/\.([A-Za-z0-9]{1,8})$/.exec(s)?.[1]??``).toUpperCase(),t[9]=s,t[10]=e);let n=e,i=o||void 0,c=`Download ${s}`,l=n||`File`,u;t[11]===l?u=t[12]:(u=(0,F.jsx)(`span`,{children:l}),t[11]=l,t[12]=u);let d;t[13]===Symbol.for(`react.memo_cache_sentinel`)?(d=(0,F.jsx)(`small`,{children:`Download`}),t[13]=d):d=t[13];let f;t[14]!==r.id||t[15]!==s||t[16]!==u||t[17]!==i||t[18]!==c?(f=(0,F.jsxs)(`a`,{className:`attachment-file-thumb`,href:i,download:s,"data-download-attachment":r.id,"aria-label":c,children:[u,d]}),t[14]=r.id,t[15]=s,t[16]=u,t[17]=i,t[18]=c,t[19]=f):f=t[19];let p;t[20]===s?p=t[21]:(p=(0,F.jsx)(`strong`,{children:s}),t[20]=s,t[21]=p);let m;t[22]===r.size_bytes?m=t[23]:(m=ae(r.size_bytes),t[22]=r.size_bytes,t[23]=m);let h=`${m} · download only`,g;t[24]===h?g=t[25]:(g=(0,F.jsx)(`span`,{children:h}),t[24]=h,t[25]=g);let _;t[26]!==p||t[27]!==g?(_=(0,F.jsxs)(`div`,{className:`attachment-card-meta`,children:[p,g]}),t[26]=p,t[27]=g,t[28]=_):_=t[28];let v;t[29]===Symbol.for(`react.memo_cache_sentinel`)?(v=(0,F.jsx)(b,{}),t[29]=v):v=t[29];let y;t[30]!==r.id||t[31]!==a?(y=(0,F.jsx)(`button`,{type:`button`,className:`attachment-delete`,"data-delete-attachment":r.id,"aria-label":`Remove file`,onClick:a,children:v}),t[30]=r.id,t[31]=a,t[32]=y):y=t[32];let x;return t[33]!==f||t[34]!==_||t[35]!==y?(x=(0,F.jsxs)(`article`,{className:`attachment-card is-file`,children:[f,_,y]}),t[33]=f,t[34]=_,t[35]=y,t[36]=x):x=t[36],x}if(r.missing){let e;t[37]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,F.jsx)(`div`,{className:`attachment-missing-thumb`,children:`Missing`}),t[37]=e):e=t[37];let n;t[38]===Symbol.for(`react.memo_cache_sentinel`)?(n=(0,F.jsx)(b,{}),t[38]=n):n=t[38];let i;t[39]!==r.id||t[40]!==a?(i=(0,F.jsx)(`button`,{type:`button`,className:`attachment-delete`,"data-delete-attachment":r.id,"aria-label":`Remove missing image`,onClick:a,children:n}),t[39]=r.id,t[40]=a,t[41]=i):i=t[41];let o;return t[42]!==p||t[43]!==i?(o=(0,F.jsxs)(`article`,{className:`attachment-card is-missing`,children:[e,p,i]}),t[42]=p,t[43]=i,t[44]=o):o=t[44],o}let m;t[45]!==s||t[46]!==i||t[47]!==o?(m=()=>o?i({src:o,title:s}):void 0,t[45]=s,t[46]=i,t[47]=o,t[48]=m):m=t[48];let h=o||void 0,g;t[49]!==s||t[50]!==h?(g=(0,F.jsx)(`img`,{src:h,alt:s,loading:`lazy`}),t[49]=s,t[50]=h,t[51]=g):g=t[51];let _;t[52]!==s||t[53]!==o||t[54]!==m||t[55]!==g?(_=(0,F.jsx)(`button`,{type:`button`,className:`attachment-thumb-button`,"data-no-arc":``,"data-open-lightbox":o,"data-lightbox-title":s,onClick:m,children:g}),t[52]=s,t[53]=o,t[54]=m,t[55]=g,t[56]=_):_=t[56];let v;t[57]===Symbol.for(`react.memo_cache_sentinel`)?(v=(0,F.jsx)(b,{}),t[57]=v):v=t[57];let y;t[58]!==r.id||t[59]!==a?(y=(0,F.jsx)(`button`,{type:`button`,className:`attachment-delete`,"data-delete-attachment":r.id,"aria-label":`Remove image`,onClick:a,children:v}),t[58]=r.id,t[59]=a,t[60]=y):y=t[60];let x;return t[61]!==p||t[62]!==y||t[63]!==_?(x=(0,F.jsxs)(`article`,{className:`attachment-card`,children:[_,p,y]}),t[61]=p,t[62]=y,t[63]=_,t[64]=x):x=t[64],x}function me(e){let t=(0,P.c)(21),{src:n,title:r,onClose:i}=e,a=(0,N.useEffectEvent)(i),o;t[0]===a?o=t[1]:(o=()=>{let e=e=>{e.key===`Escape`&&(e.preventDefault(),a())};return document.addEventListener(`keydown`,e,!0),()=>document.removeEventListener(`keydown`,e,!0)},t[0]=a,t[1]=o);let s;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(s=[],t[2]=s):s=t[2],(0,N.useEffect)(o,s);let c;t[3]===i?c=t[4]:(c=e=>{e.target===e.currentTarget&&i()},t[3]=i,t[4]=c);let l;t[5]===Symbol.for(`react.memo_cache_sentinel`)?(l=(0,F.jsx)(b,{}),t[5]=l):l=t[5];let u;t[6]===i?u=t[7]:(u=(0,F.jsx)(`button`,{type:`button`,className:`attachment-lightbox-close`,"aria-label":`Close image`,onClick:i,children:l}),t[6]=i,t[7]=u);let d;t[8]!==n||t[9]!==r?(d=(0,F.jsx)(`img`,{src:n,alt:r}),t[8]=n,t[9]=r,t[10]=d):d=t[10];let f;t[11]===r?f=t[12]:(f=(0,F.jsx)(`p`,{children:r}),t[11]=r,t[12]=f);let p;t[13]!==u||t[14]!==d||t[15]!==f||t[16]!==r?(p=(0,F.jsxs)(`div`,{className:`attachment-lightbox-panel`,role:`dialog`,"aria-modal":`true`,"aria-label":r,children:[u,d,f]}),t[13]=u,t[14]=d,t[15]=f,t[16]=r,t[17]=p):p=t[17];let m;return t[18]!==c||t[19]!==p?(m=(0,ie.createPortal)((0,F.jsx)(`div`,{className:`attachment-lightbox`,onClick:c,children:p}),document.body),t[18]=c,t[19]=p,t[20]=m):m=t[20],m}function K(e){return typeof e==`object`&&!!e}function q(e){return typeof e==`string`?e:``}function J(e){return K(e)&&typeof e.id==`string`&&typeof e.number==`number`&&typeof e.title==`string`}function he(e){return K(e)&&typeof e.id==`string`&&typeof e.type==`string`&&J(e.other_ticket)}async function ge(e,t){let n=e.hint(),[r,i,a,o,s]=await Promise.all([e.client.tickets.context(t,void 0,n),e.client.tickets.history(t,n),e.client.comments.list(t,n),e.client.attachments.list(t,n).catch(()=>({attachments:[]})),e.client.tickets.relations(t,n)]);return{ticket:r.ticket,parent:J(r.parent_ticket)?r.parent_ticket:null,children:r.child_tickets.filter(J),relations:r.relations.filter(he),crossBoard:s.cross_board.flatMap(e=>e.other_ticket?[{id:e.id,holder_board_id:e.direction===`incoming`?e.other_board_id:r.ticket.board_id,type:e.type,direction:e.direction,blocking:e.blocking,board_slug:e.other_ticket.board_slug,other_ticket:e.other_ticket}]:[]),history:i,comments:a.comments,attachments:o.attachments}}function _e(e,t){return e?t?e.updated_at>t.updated_at?e:t:e:t}function Y(){let e=(0,P.c)(3),[t,n]=(0,N.useState)(``),r=(0,N.useRef)(null),i;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(i=()=>{n(``),r.current?.focus()},e[0]=i):i=e[0];let a=i,o;return e[1]===t?o=e[2]:(o={value:t,setValue:n,input:r,clear:a},e[1]=t,e[2]=o),o}function X(e,t,n,r){let i=T(e,t.filter(e=>e.id!==n));return i||o.warning(r),i??null}function Z(e){let t=(0,P.c)(8),{items:n,single:r}=e,a=r??!1,o=i();if(!n.length)return null;let s=a?`detail-card-grid detail-card-grid--single`:`detail-card-grid`,c;if(t[0]!==o||t[1]!==n){let e;t[3]===o?e=t[4]:(e=e=>(0,F.jsx)(M,{ticket:e.card,eyebrow:e.eyebrow,detach:e.detach,onOpen:e.onOpen??(()=>void o.openTicket(e.card.id))},e.key),t[3]=o,t[4]=e),c=n.map(e),t[0]=o,t[1]=n,t[2]=c}else c=t[2];let l;return t[5]!==s||t[6]!==c?(l=(0,F.jsx)(`div`,{className:s,children:c}),t[5]=s,t[6]=c,t[7]=l):l=t[7],l}function ve(e){let t=(0,P.c)(41),{ticket:n,cards:r,refresh:a}=e,s=i(),c=p(),l=Y(),u;if(t[0]!==n||t[1]!==c){let e;t[3]===n?e=t[4]:(e=e=>e.id!==n.id&&m(e.type)!==`epic`&&e.parent_ticket_id!==n.id,t[3]=n,t[4]=e),u=c.filter(e),t[0]=n,t[1]=c,t[2]=u}else u=t[2];let d=u,f;t[5]!==s||t[6]!==a?(f=async(e,t)=>{try{let n=await s.call(()=>s.client.tickets.update(e,{parent_ticket_id:t},s.hint()));return s.upsertTicket(n),a(),!0}catch{return!1}},t[5]=s,t[6]=a,t[7]=f):f=t[7];let h=f,g;t[8]!==l||t[9]!==h||t[10]!==n||t[11]!==c?(g=async e=>{if(e.preventDefault(),!l.value.trim())return;let t=X(l.value,c,n.id,`Pick a ticket from the suggestions`);t&&(m(t.type)===`epic`?o.warning(`Epics can't be nested inside an epic`):await h(t.id,n.id)&&(l.setValue(``),o.success(`Feature added to epic`)))},t[8]=l,t[9]=h,t[10]=n,t[11]=c,t[12]=g):g=t[12];let _=g,v;if(t[13]!==r||t[14]!==h){let e;t[16]===h?e=t[17]:(e=e=>({key:e.id,card:e,detach:{label:`Remove from epic`,onDetach:()=>void h(e.id,null).then(ye)}}),t[16]=h,t[17]=e),v=r.map(e),t[13]=r,t[14]=h,t[15]=v}else v=t[15];let y;t[18]===v?y=t[19]:(y=(0,F.jsx)(Z,{items:v}),t[18]=v,t[19]=y);let S=`related-add-row epic-child-form${l.value?` has-value`:``}`,C;t[20]===_?C=t[21]:(C=e=>void _(e),t[20]=_,t[21]=C);let w;t[22]!==d||t[23]!==l.input||t[24]!==l.setValue||t[25]!==l.value?(w=(0,F.jsx)(x,{inputRef:l.input,name:`target`,className:`related-add-input meta-inline-input`,placeholder:`Add feature to epic…`,"aria-label":`Add feature to epic`,autoComplete:`off`,value:l.value,onChange:l.setValue,items:d}),t[22]=d,t[23]=l.input,t[24]=l.setValue,t[25]=l.value,t[26]=w):w=t[26];let T;t[27]===Symbol.for(`react.memo_cache_sentinel`)?(T=(0,F.jsx)(b,{}),t[27]=T):T=t[27];let E;t[28]===l.clear?E=t[29]:(E=(0,F.jsx)(`button`,{type:`button`,className:`related-add-clear`,"data-epic-child-clear":``,"aria-label":`Clear`,tabIndex:-1,onClick:l.clear,children:T}),t[28]=l.clear,t[29]=E);let D;t[30]!==E||t[31]!==w?(D=(0,F.jsxs)(`div`,{className:`related-add-input-wrap`,children:[w,E]}),t[30]=E,t[31]=w,t[32]=D):D=t[32];let O;t[33]===Symbol.for(`react.memo_cache_sentinel`)?(O=(0,F.jsx)(`button`,{type:`submit`,className:`meta-add-btn detail-action-btn`,"data-variant":`ghost`,children:`Add`}),t[33]=O):O=t[33];let k;t[34]!==D||t[35]!==S||t[36]!==C?(k=(0,F.jsxs)(`form`,{id:`epicChildForm`,className:S,onSubmit:C,children:[D,O]}),t[34]=D,t[35]=S,t[36]=C,t[37]=k):k=t[37];let A;return t[38]!==k||t[39]!==y?(A=(0,F.jsx)(z,{section:`epic-children`,title:`Features inside this Epic`,children:(0,F.jsxs)(`div`,{className:`settings-row`,children:[y,k]})}),t[38]=k,t[39]=y,t[40]=A):A=t[40],A}function ye(e){return e?o.success(`Removed from epic`):void 0}function be(e){let t=(0,P.c)(23),{ticket:n,parent:r,refresh:a}=e,s=i(),c=p(),l=Y(),u;if(t[0]!==n||t[1]!==c){let e;t[3]===n?e=t[4]:(e=e=>e.type===`epic`&&e.id!==n.id,t[3]=n,t[4]=e),u=c.filter(e),t[0]=n,t[1]=c,t[2]=u}else u=t[2];let d=u,f;t[5]!==s||t[6]!==a||t[7]!==n?(f=async e=>{try{let t=await s.call(()=>s.client.tickets.update(n.id,{parent_ticket_id:e},s.hint()));return s.upsertTicket(t),a(),!0}catch{return!1}},t[5]=s,t[6]=a,t[7]=n,t[8]=f):f=t[8];let h=f,g;t[9]!==l||t[10]!==h||t[11]!==n||t[12]!==c?(g=async e=>{if(e.preventDefault(),!l.value.trim())return;let t=X(l.value,c,n.id,`Pick an epic from the suggestions`);t&&(m(t.type)===`epic`?await h(t.id)&&(l.setValue(``),o.success(`Parent epic set`)):o.warning(`Parent must be an epic`))},t[9]=l,t[10]=h,t[11]=n,t[12]=c,t[13]=g):g=t[13];let _=g,v;return t[14]!==d||t[15]!==l.clear||t[16]!==l.input||t[17]!==l.setValue||t[18]!==l.value||t[19]!==r||t[20]!==h||t[21]!==_?(v=(0,F.jsx)(z,{section:`epic`,title:`Epic`,children:(0,F.jsx)(`div`,{className:`settings-row`,children:r?(0,F.jsx)(Z,{single:!0,items:[{key:r.id,card:r,detach:{label:`Remove parent epic`,onDetach:()=>void h(null).then(xe)}}]}):(0,F.jsxs)(`form`,{id:`parentEpicForm`,className:`related-add-row parent-epic-form${l.value?` has-value`:``}`,onSubmit:e=>void _(e),children:[(0,F.jsxs)(`div`,{className:`related-add-input-wrap`,children:[(0,F.jsx)(x,{inputRef:l.input,name:`target`,className:`related-add-input meta-inline-input`,placeholder:`Set parent epic…`,"aria-label":`Set parent epic`,autoComplete:`off`,value:l.value,onChange:l.setValue,items:d}),(0,F.jsx)(`button`,{type:`button`,className:`related-add-clear`,"data-parent-epic-clear":``,"aria-label":`Clear`,tabIndex:-1,onClick:l.clear,children:(0,F.jsx)(b,{})})]}),(0,F.jsx)(`button`,{type:`submit`,className:`meta-add-btn detail-action-btn`,"data-variant":`ghost`,children:`Set`})]})})}),t[14]=d,t[15]=l.clear,t[16]=l.input,t[17]=l.setValue,t[18]=l.value,t[19]=r,t[20]=h,t[21]=_,t[22]=v):v=t[22],v}function xe(e){return e?o.success(`Parent epic removed`):void 0}var Se=[{value:`relates_to`,label:`relates to`},{value:`blocks`,label:`blocks`},{value:`blocked_by`,label:`blocked by`}];function Ce(e){return`${e.type===`relates_to`?`relates to`:e.direction===`incoming`?`blocks`:e.blocking?`blocked by`:`was blocked by`} · ${e.board_slug}`}function we(e,t){let n=/^\s*([a-z0-9][a-z0-9-]*)\s*#\s*(\d+)\s*$/i.exec(e);return!n?.[1]||!n[2]||n[1].toLowerCase()===t.toLowerCase()?null:{board:n[1].toLowerCase(),number:Number(n[2])}}function Te(e){let t=(0,P.c)(60),{ticket:n,relations:r,crossBoard:a,refresh:s}=e,c=i(),l=p(),u=Y(),[d,f]=(0,N.useState)(`relates_to`),m;if(t[0]!==r||t[1]!==n.id||t[2]!==n.parent_ticket_id||t[3]!==l){m=new Set(r.map(De)),n.parent_ticket_id&&m.add(n.parent_ticket_id);for(let e of l)e.parent_ticket_id===n.id&&m.add(e.id);t[0]=r,t[1]=n.id,t[2]=n.parent_ticket_id,t[3]=l,t[4]=m}else m=t[4];let h;if(t[5]!==m||t[6]!==n||t[7]!==l){let e;t[9]!==m||t[10]!==n?(e=e=>e.id!==n.id&&!m.has(e.id),t[9]=m,t[10]=n,t[11]=e):e=t[11],h=l.filter(e),t[5]=m,t[6]=n,t[7]=l,t[8]=h}else h=t[8];let g=h,_;t[12]!==c||t[13]!==u||t[14]!==d||t[15]!==s||t[16]!==n||t[17]!==l?(_=async e=>{if(e.preventDefault(),!u.value.trim())return;let t=we(u.value,n.board_slug);try{if(t){let e=await c.call(()=>c.client.tickets.lookup({board:t.board},{number:t.number}));await c.call(()=>c.client.relations.create({source_ticket_id:n.id,target_ticket_id:e.ticket.id,target_board:t.board,type:d,...c.hint()}))}else{let e=X(u.value,l,n.id,`Pick a ticket from the suggestions, or name another board's as board#3`);if(!e)return;await c.call(()=>c.client.relations.create({source_ticket_id:n.id,target_ticket_id:e.id,type:d,...c.hint()}))}}catch{return}u.setValue(``),f(`relates_to`),s()},t[12]=c,t[13]=u,t[14]=d,t[15]=s,t[16]=n,t[17]=l,t[18]=_):_=t[18];let v=_,y;t[19]!==c||t[20]!==s?(y=async(e,t)=>{try{await c.call(()=>c.client.relations.remove(e,t?{board_id:t}:c.hint()))}catch{return}s(),o.success(`Relation removed`)},t[19]=c,t[20]=s,t[21]=y):y=t[21];let S=y,C;if(t[22]!==S||t[23]!==r){let e;t[25]===S?e=t[26]:(e=e=>({key:e.id,card:e.other_ticket,eyebrow:`${e.type.replace(/_/g,` `)} ${e.direction===`incoming`?`from`:`to`}`,detach:{label:`Remove relation`,onDetach:()=>void S(e.id)}}),t[25]=S,t[26]=e),C=r.map(e),t[22]=S,t[23]=r,t[24]=C}else C=t[24];let w;t[27]===C?w=t[28]:(w=(0,F.jsx)(Z,{items:C}),t[27]=C,t[28]=w);let T;t[29]!==c||t[30]!==a||t[31]!==S?(T=a.length?(0,F.jsx)(Z,{items:a.map(e=>({key:`${e.holder_board_id}:${e.id}`,card:e.other_ticket,eyebrow:Ce(e),onOpen:()=>void c.navigate({boardSlug:e.board_slug,view:`ticket`,ticketId:e.other_ticket.id}),detach:{label:`Remove relation`,onDetach:()=>void S(e.id,e.holder_board_id)}}))}):null,t[29]=c,t[30]=a,t[31]=S,t[32]=T):T=t[32];let E=`related-add-row${u.value?` has-value`:``}`,D;t[33]===v?D=t[34]:(D=e=>void v(e),t[33]=v,t[34]=D);let O;t[35]!==g||t[36]!==u.input||t[37]!==u.setValue||t[38]!==u.value?(O=(0,F.jsx)(x,{inputRef:u.input,name:`target`,className:`related-add-input meta-inline-input`,placeholder:`Add related ticket, or board#3…`,"aria-label":`Add related ticket`,autoComplete:`off`,value:u.value,onChange:u.setValue,items:g}),t[35]=g,t[36]=u.input,t[37]=u.setValue,t[38]=u.value,t[39]=O):O=t[39];let k;t[40]===Symbol.for(`react.memo_cache_sentinel`)?(k=(0,F.jsx)(b,{}),t[40]=k):k=t[40];let A;t[41]===u.clear?A=t[42]:(A=(0,F.jsx)(`button`,{type:`button`,className:`related-add-clear`,"data-related-clear":``,"aria-label":`Clear`,tabIndex:-1,onClick:u.clear,children:k}),t[41]=u.clear,t[42]=A);let j;t[43]!==A||t[44]!==O?(j=(0,F.jsxs)(`div`,{className:`related-add-input-wrap`,children:[O,A]}),t[43]=A,t[44]=O,t[45]=j):j=t[45];let M,I;t[46]===Symbol.for(`react.memo_cache_sentinel`)?(M=e=>f(e.currentTarget.value),I=Se.map(Ee),t[46]=M,t[47]=I):(M=t[46],I=t[47]);let L;t[48]===d?L=t[49]:(L=(0,F.jsx)(`select`,{name:`type`,className:`related-add-type meta-inline`,"aria-label":`Relation type`,value:d,onChange:M,children:I}),t[48]=d,t[49]=L);let R;t[50]===Symbol.for(`react.memo_cache_sentinel`)?(R=(0,F.jsx)(`button`,{type:`submit`,className:`meta-add-btn detail-action-btn`,"data-variant":`ghost`,children:`Add`}),t[50]=R):R=t[50];let B;t[51]!==j||t[52]!==L||t[53]!==E||t[54]!==D?(B=(0,F.jsxs)(`form`,{id:`relatedAddForm`,className:E,onSubmit:D,children:[j,L,R]}),t[51]=j,t[52]=L,t[53]=E,t[54]=D,t[55]=B):B=t[55];let V;return t[56]!==B||t[57]!==w||t[58]!==T?(V=(0,F.jsx)(z,{section:`related`,title:`Related`,children:(0,F.jsxs)(`div`,{className:`settings-row`,children:[w,T,B]})}),t[56]=B,t[57]=w,t[58]=T,t[59]=V):V=t[59],V}function Ee(e){return(0,F.jsx)(`option`,{value:e.value,children:e.label},e.value)}function De(e){return e.other_ticket.id}var Oe=e=>({"--label-color":e});function ke(e){let t=(0,P.c)(37),{ticket:n,patch:r}=e,i=c(),[a,o]=(0,N.useState)(``),s,l,u,d,f,p,m,h,g;if(t[0]!==i||t[1]!==a||t[2]!==r||t[3]!==n.labels){let e=n.labels.map(Pe);u=i.filter(t=>!e.includes(t.name)),l=()=>{let t=a.trim();t&&(o(``),!e.includes(t)&&r({labels:[...e,t]}))},s=z,h=`labels`,g=`Labels`,m=`settings-row`,d=`label-pills-row`,f=``,p=n.labels.map(t=>(0,F.jsxs)(`span`,{className:`label-pill-removable`,style:Oe(t.color),children:[t.name,(0,F.jsx)(`button`,{type:`button`,className:`label-pill-remove`,"data-remove-label":t.name,title:`Remove label`,"aria-label":`Remove label`,onClick:()=>void r({labels:e.filter(e=>e!==t.name)}),children:(0,F.jsx)(b,{})})]},t.id)),t[0]=i,t[1]=a,t[2]=r,t[3]=n.labels,t[4]=s,t[5]=l,t[6]=u,t[7]=d,t[8]=f,t[9]=p,t[10]=m,t[11]=h,t[12]=g}else s=t[4],l=t[5],u=t[6],d=t[7],f=t[8],p=t[9],m=t[10],h=t[11],g=t[12];let _;t[13]!==d||t[14]!==f||t[15]!==p?(_=(0,F.jsx)(`div`,{className:d,"data-other-labels":f,children:p}),t[13]=d,t[14]=f,t[15]=p,t[16]=_):_=t[16];let y;t[17]===l?y=t[18]:(y=e=>{e.key===`Enter`&&(e.preventDefault(),l())},t[17]=l,t[18]=y);let x;t[19]!==u||t[20]!==a||t[21]!==y?(x=(0,F.jsx)(`div`,{className:`label-add-input-wrap`,children:(0,F.jsx)(v,{className:`label-add-input meta-inline-input`,"data-label-input":``,autoComplete:`off`,placeholder:`Add label…`,"aria-label":`Add label`,value:a,onChange:o,items:u,match:Ne,renderItem:Me,valueOf:je,keyOf:Ae,emptyText:`No matching labels`,onKeyDown:y})}),t[19]=u,t[20]=a,t[21]=y,t[22]=x):x=t[22];let S;t[23]===l?S=t[24]:(S=(0,F.jsx)(`button`,{type:`button`,className:`meta-add-btn detail-action-btn`,"data-variant":`ghost`,"data-label-add":``,onClick:l,children:`Add`}),t[23]=l,t[24]=S);let C;t[25]!==S||t[26]!==x?(C=(0,F.jsxs)(`div`,{className:`label-add-row`,children:[x,S]}),t[25]=S,t[26]=x,t[27]=C):C=t[27];let w;t[28]!==C||t[29]!==m||t[30]!==_?(w=(0,F.jsxs)(`div`,{className:m,children:[_,C]}),t[28]=C,t[29]=m,t[30]=_,t[31]=w):w=t[31];let T;return t[32]!==s||t[33]!==w||t[34]!==h||t[35]!==g?(T=(0,F.jsx)(s,{section:h,title:g,children:w}),t[32]=s,t[33]=w,t[34]=h,t[35]=g,t[36]=T):T=t[36],T}function Ae(e){return e.id}function je(e){return e.name}function Me(e){return(0,F.jsxs)(`span`,{className:`search-hit-main`,children:[(0,F.jsx)(`span`,{className:`typeahead-swatch`,style:Oe(e.color||`var(--muted)`)}),(0,F.jsx)(`strong`,{children:e.name})]})}function Ne(e,t){return e.name.toLowerCase().includes(t)}function Pe(e){return e.name}function Fe(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?String(e):``}function Ie(e){let t=Fe(e??``).trim();if(!t)return``;if(t.length>2048||/[\s\u0000-\u001f\u007f]/.test(t))return null;let n;try{n=new URL(t)}catch{return null}return n.protocol!==`https:`&&n.protocol!==`http:`||n.username||n.password||!n.hostname||n.href.length>2048?null:n.href}function Le(e){try{return decodeURIComponent(e)}catch{return e}}function Re(e){let t;try{t=new URL(e)}catch{return e}let n=t.pathname.split(`/`).filter(Boolean),r=n[0]===`p`?0:n[0]===`app`&&n[1]===`p`?1:-1;if(r!==-1&&n.length>r+1){let e=n.slice(r+2).map(Le);return e.length?e.slice(-2).join(` / `):`A Nebula project`}let i=n.length?Le(n[n.length-1]??``):``;return i?`${t.host} / ${i}`:t.host}var ze=`Paste a web link to a Nebula file or folder. It starts with https://`;function Be(e){let t=(0,P.c)(11),{nebulaUrl:n,patch:r}=e,i=Ie(n)||``,[a,s]=(0,N.useState)(null),c=(0,N.useRef)(null),l=(0,N.useRef)(!1),u=(0,N.useRef)(!1),d,f;t[0]===a?(d=t[1],f=t[2]):(d=()=>{!a&&u.current&&(u.current=!1,c.current?.querySelector(`[data-nebula-action="edit"]`)?.focus())},f=[a],t[0]=a,t[1]=d,t[2]=f),(0,N.useLayoutEffect)(d,f);let p=()=>{l.current=!0,s({draft:i,invalid:!1})},m;t[3]===Symbol.for(`react.memo_cache_sentinel`)?(m=()=>{u.current=!0,s(null)},t[3]=m):m=t[3];let h=m,g;t[4]===Symbol.for(`react.memo_cache_sentinel`)?(g=e=>{e&&l.current&&(l.current=!1,e.focus(),e.select())},t[4]=g):g=t[4];let _=g,v;t[5]===r?v=t[6]:(v=e=>r({nebula_url:e}),t[5]=r,t[6]=v);let y=v,x=async e=>{if(e.preventDefault(),!a)return;let t=Ie(a.draft);t===null?(s({...a,invalid:!0}),e.currentTarget.querySelector(`input`)?.focus()):(t!==i&&await y(t),h())},S=async()=>{let e=i;await y(``)&&o.info(`Nebula link removed.`,{duration:6e3,action:{label:`Undo`,onClick:()=>void y(e)}})},C;t[7]===Symbol.for(`react.memo_cache_sentinel`)?(C=e=>{e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),h())},t[7]=C):C=t[7];let w=C,T=`nebula-link${a?` is-editing`:``}`,E=a?(0,F.jsxs)(`form`,{className:`nebula-link-form`,noValidate:!0,onSubmit:e=>void x(e),children:[(0,F.jsx)(`span`,{className:`nebula-glyph`,"aria-hidden":`true`}),(0,F.jsx)(`input`,{ref:_,type:`url`,inputMode:`url`,autoComplete:`off`,spellCheck:!1,className:`nebula-link-input meta-inline-input`,placeholder:`https://nebula.starscape.app/app/p/...`,"aria-label":`Link to a Nebula file or folder`,"aria-describedby":`nebulaLinkError`,"aria-invalid":a.invalid?`true`:void 0,value:a.draft,onChange:e=>s({draft:e.currentTarget.value,invalid:!1}),onKeyDown:w}),(0,F.jsx)(`button`,{type:`submit`,className:`detail-action-btn nebula-link-save`,children:`Save`}),(0,F.jsx)(`button`,{type:`button`,className:`detail-action-btn`,"data-variant":`ghost`,"data-nebula-action":`cancel`,onClick:h,children:`Cancel`}),(0,F.jsx)(`p`,{className:`nebula-link-error`,id:`nebulaLinkError`,hidden:!a.invalid,children:a.invalid?ze:``})]}):i?(0,F.jsxs)(F.Fragment,{children:[(0,F.jsxs)(`a`,{className:`nebula-link-open`,href:i,target:`_blank`,rel:`noopener noreferrer`,title:i,children:[(0,F.jsx)(`span`,{className:`nebula-glyph`,"aria-hidden":`true`}),(0,F.jsxs)(`span`,{className:`nebula-link-text`,children:[(0,F.jsx)(`span`,{className:`nebula-link-label`,children:Re(i)}),` `,(0,F.jsx)(`span`,{className:`nebula-link-meta`,children:`Open in Nebula, in a new tab`})]}),(0,F.jsx)(`svg`,{className:`nebula-link-out`,viewBox:`0 0 24 24`,"aria-hidden":`true`,children:(0,F.jsx)(`path`,{d:`M8 16L16 8M10 8h6v6`})})]}),(0,F.jsx)(`button`,{type:`button`,className:`nebula-link-action`,"data-variant":`ghost`,"data-nebula-action":`edit`,title:`Change the Nebula link`,"aria-label":`Change the Nebula link`,onClick:p,children:`Change`}),(0,F.jsx)(`button`,{type:`button`,className:`nebula-link-action nebula-link-remove`,"data-variant":`ghost`,"data-nebula-action":`remove`,title:`Remove the Nebula link`,"aria-label":`Remove the Nebula link`,onClick:()=>void S(),children:(0,F.jsx)(b,{})})]}):(0,F.jsxs)(`button`,{type:`button`,className:`nebula-link-add`,"data-variant":`ghost`,"data-nebula-action":`edit`,onClick:p,children:[(0,F.jsx)(`span`,{className:`nebula-glyph`,"aria-hidden":`true`}),(0,F.jsx)(`span`,{children:`Link a Nebula file or folder`})]}),D;return t[8]!==T||t[9]!==E?(D=(0,F.jsx)(`div`,{ref:c,className:T,"data-nebula-link":``,children:E}),t[8]=T,t[9]=E,t[10]=D):D=t[10],D}var Q=new Set([`local`,`local-owner`,`owner`]),Ve=new Set([`agent`,`local-agent`,`orbit-agent`]),He=new Set([`agent_note`,`checkpoint`,`completion`]);function $(e){return typeof e==`string`?e.trim():``}function Ue(e){let t=$(e);return t?t.replace(/^@+/,``).replace(/[-_]+/g,` `).replace(/\s+/g,` `).trim().replace(/\b\w/g,e=>e.toUpperCase()):``}function We({actor:e,actorId:t}={}){let n=$(e),r=$(t),i=n.toLowerCase(),a=r.toLowerCase();return n&&!Q.has(i)&&!Ve.has(i)?Ue(n):r&&!Q.has(a)&&!Ve.has(a)?Ue(r):``}function Ge({actor:e,actorType:t,actorId:n}={}){let r=$(t).toLowerCase(),i=$(e),a=i.toLowerCase();if(r===`agent`){let e=We({actor:i,actorId:n});return e?`Agent · ${e}`:`Agent`}return!i||Q.has(a)?`You`:Ue(i)}function Ke(e={}){let t=$(e.kind).toLowerCase(),n=$(e.author);if(He.has(t)||t&&t!==`human_comment`){let e=We({actor:n});return e?`Agent · ${e}`:`Agent`}return Ge({actor:n,actorType:`human`})}function qe(e){let t=(0,P.c)(4),{history:n}=e,r;t[0]===n?r=t[1]:(r=n.length?n.map(Je):(0,F.jsx)(`p`,{className:`description`,children:`No status changes yet.`}),t[0]=n,t[1]=r);let i;return t[2]===r?i=t[3]:(i=(0,F.jsx)(z,{section:`status-history`,title:`Status History`,children:(0,F.jsx)(`div`,{className:`settings-row`,children:r})}),t[2]=r,t[3]=i),i}function Je(e){let t=K(e.body)?e.body:{},n=q(t.from)||`?`,r=q(t.to)||q(t.state)||q(t.next_state)||`?`,i=e.type===`agent_claimed`,a=Ge({actor:e.actor,actorType:q(t.actor_type)||(i?`agent`:`human`),actorId:i?t.agent_id:t.actor_id});return(0,F.jsx)(`div`,{className:`comment status-change`,children:(0,F.jsxs)(`div`,{className:`comment-meta`,children:[(0,F.jsx)(`span`,{className:`status-route`,children:`${n} → ${r}`}),` `,(0,F.jsx)(`span`,{children:`${a} · ${f(e.created_at)}`})]})},e.id)}function Ye(e){let t=(0,P.c)(26),{ticketId:n,comments:r,aiEnabled:a,refresh:s}=e,c=i(),[u,d]=(0,N.useState)(``),f;t[0]!==c||t[1]!==u||t[2]!==s||t[3]!==n?(f=async e=>{e.preventDefault();let t=u,r=l(t).trim();if(r){try{await c.call(()=>c.client.comments.create(n,{body:r},c.hint()))}catch{return}d(e=>e===t?``:e),s()}},t[0]=c,t[1]=u,t[2]=s,t[3]=n,t[4]=f):f=t[4];let p=f,m;t[5]!==c||t[6]!==s||t[7]!==n?(m=async e=>{let t=!e.omitted_for_ai;try{await c.call(()=>c.client.comments.update(n,e.id,{omitted_for_ai:t},c.hint()))}catch{return}o.info(t?`Comment omitted from AI context`:`Comment included in AI context`),s()},t[5]=c,t[6]=s,t[7]=n,t[8]=m):m=t[8];let h=m,g;t[9]!==a||t[10]!==r||t[11]!==h?(g=r.length?r.map(e=>(0,F.jsx)(Xe,{comment:e,aiEnabled:a,onToggleAi:()=>void h(e)},e.id)):(0,F.jsx)(`p`,{className:`description`,children:`No comments yet.`}),t[9]=a,t[10]=r,t[11]=h,t[12]=g):g=t[12];let _;t[13]===p?_=t[14]:(_=e=>void p(e),t[13]=p,t[14]=_);let v,y;t[15]===Symbol.for(`react.memo_cache_sentinel`)?(v=e=>d(e.currentTarget.value),y=e=>{D(e,d)},t[15]=v,t[16]=y):(v=t[15],y=t[16]);let b;t[17]===u?b=t[18]:(b=(0,F.jsx)(`textarea`,{name:`body`,placeholder:`Add a comment, decision, or instruction...`,required:!0,value:u,onChange:v,onKeyDown:y}),t[17]=u,t[18]=b);let x;t[19]===Symbol.for(`react.memo_cache_sentinel`)?(x=(0,F.jsx)(`button`,{type:`submit`,className:`detail-action-btn`,"data-variant":`ghost`,children:`Comment`}),t[19]=x):x=t[19];let S;t[20]!==_||t[21]!==b?(S=(0,F.jsxs)(`form`,{className:`comment-form`,id:`detailCommentForm`,onSubmit:_,children:[b,x]}),t[20]=_,t[21]=b,t[22]=S):S=t[22];let C;return t[23]!==g||t[24]!==S?(C=(0,F.jsx)(z,{section:`comments`,title:`Comments`,children:(0,F.jsxs)(`div`,{className:`settings-row`,children:[g,S]})}),t[23]=g,t[24]=S,t[25]=C):C=t[25],C}function Xe(e){let t=(0,P.c)(32),{comment:n,aiEnabled:r,onToggleAi:i}=e,a=!!n.omitted_for_ai,o;t[0]===n.kind?o=t[1]:(o=n.kind===`human_comment`?``:n.kind.replace(/_/g,` `),t[0]=n.kind,t[1]=o);let s=o,c=`comment ${n.kind===`checkpoint`?`checkpoint`:``} ${r&&a?`is-ai-omitted`:``}`,u;t[2]===n?u=t[3]:(u=Ke(n),t[2]=n,t[3]=u);let d;t[4]===u?d=t[5]:(d=(0,F.jsx)(`strong`,{children:u}),t[4]=u,t[5]=d);let p;t[6]===s?p=t[7]:(p=s?(0,F.jsx)(`span`,{className:`comment-kind-pill`,children:s}):null,t[6]=s,t[7]=p);let m;t[8]!==d||t[9]!==p?(m=(0,F.jsx)(`div`,{className:`comment-head`,children:(0,F.jsx)(`div`,{className:`comment-head-main`,children:(0,F.jsxs)(`div`,{className:`comment-head-title`,children:[d,` `,p]})})}),t[8]=d,t[9]=p,t[10]=m):m=t[10];let h;t[11]===n.body?h=t[12]:(h=l(n.body),t[11]=n.body,t[12]=h);let g;t[13]===h?g=t[14]:(g=(0,F.jsx)(`div`,{className:`comment-body preserved-text-body`,children:h}),t[13]=h,t[14]=g);let _;t[15]===n.created_at?_=t[16]:(_=f(n.created_at),t[15]=n.created_at,t[16]=_);let v;t[17]===_?v=t[18]:(v=(0,F.jsx)(`span`,{className:`comment-footer-meta`,children:_}),t[17]=_,t[18]=v);let y;t[19]!==r||t[20]!==n.id||t[21]!==a||t[22]!==i?(y=r?(0,F.jsx)(`button`,{type:`button`,className:`comment-ai-toggle detail-action-btn`,"data-variant":`ghost`,"data-comment-action":`toggle-ai-omission`,"data-comment-id":n.id,"data-omitted-for-ai":a?`true`:`false`,onClick:i,children:a?`AI Include`:`AI Ignore`}):null,t[19]=r,t[20]=n.id,t[21]=a,t[22]=i,t[23]=y):y=t[23];let b;t[24]!==v||t[25]!==y?(b=(0,F.jsxs)(`div`,{className:`comment-footer`,children:[v,` `,y]}),t[24]=v,t[25]=y,t[26]=b):b=t[26];let x;return t[27]!==b||t[28]!==c||t[29]!==m||t[30]!==g?(x=(0,F.jsxs)(`div`,{className:c,children:[m,g,b]}),t[27]=b,t[28]=c,t[29]=m,t[30]=g,t[31]=x):x=t[31],x}function Ze(e){let t=(0,P.c)(36),{ticketId:n}=e,r=i(),a=g(tt),s=S(n),[c,l]=(0,N.useState)(null),[u,d]=(0,N.useState)(0),f=(0,N.useRef)(!1),p;t[0]!==r||t[1]!==a||t[2]!==n?(p=()=>{if(!a)return;let e=!0;return r.call(()=>ge(r,n)).then(t=>{e&&(f.current=!0,l(t),y(t.ticket.board_id,t.ticket.id,t.ticket.updated_at))},()=>{e&&!f.current&&r.closeDrawer()}),()=>{e=!1}},t[0]=r,t[1]=a,t[2]=n,t[3]=p):p=t[3];let m;t[4]!==r||t[5]!==a||t[6]!==u||t[7]!==n?(m=[r,n,a,u],t[4]=r,t[5]=a,t[6]=u,t[7]=n,t[8]=m):m=t[8],(0,N.useEffect)(p,m);let h=c?.ticket,v;t[9]!==s||t[10]!==h?(v=_e(s,h),t[9]=s,t[10]=h,t[11]=v):v=t[11];let b=v,x;t[12]!==r||t[13]!==n?(x=async e=>{try{let t=await r.call(()=>r.client.tickets.update(n,e,r.hint()));return t.archived_at?d(et):r.upsertTicket(t),!0}catch{return!1}},t[12]=r,t[13]=n,t[14]=x):x=t[14];let C;t[15]===Symbol.for(`react.memo_cache_sentinel`)?(C=()=>d($e),t[15]=C):C=t[15];let w;t[16]===x?w=t[17]:(w={patch:x,refresh:C},t[16]=x,t[17]=w);let T=w,E;t[18]!==r||t[19]!==s?.title||t[20]!==b?.title||t[21]!==n?(E=async()=>{let e=s?.title||b?.title||`card`;try{await r.call(()=>r.client.tickets.archive(n,r.hint()))}catch{return}o.removed(`Archived: ${e}`),await r.load().catch(Qe),await r.navigate({view:`board`})},t[18]=r,t[19]=s?.title,t[20]=b?.title,t[21]=n,t[22]=E):E=t[22];let D=E,O;t[23]!==T||t[24]!==b?(O=b?(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(nt,{ticket:b,patch:T.patch}),(0,F.jsxs)(`div`,{className:`drawer-subtitle`,children:[(0,F.jsx)(`span`,{className:`ticket-number`,children:_(b)}),` `,(0,F.jsx)(at,{ticket:b,patch:T.patch})]})]}):null,t[23]=T,t[24]=b,t[25]=O):O=t[25];let A;t[26]===D?A=t[27]:(A=()=>void D(),t[26]=D,t[27]=A);let j;t[28]!==T||t[29]!==c||t[30]!==b?(j=b&&c?(0,F.jsx)(lt,{ticket:b,detail:c,actions:T}):null,t[28]=T,t[29]=c,t[30]=b,t[31]=j):j=t[31];let M;return t[32]!==A||t[33]!==j||t[34]!==O?(M=(0,F.jsx)(k,{titleBlock:O,onArchive:A,children:j}),t[32]=A,t[33]=j,t[34]=O,t[35]=M):M=t[35],M}function Qe(){}function $e(e){return e+1}function et(e){return e+1}function tt(e){return e.data}function nt(e){let t=(0,P.c)(11),{ticket:n,patch:r}=e,i=n.title||``,a;t[0]===r?a=t[1]:(a=async e=>{await r({title:e})},t[0]=r,t[1]=a);let o;t[2]!==i||t[3]!==a?(o={value:i,fieldName:`title`,multiline:!1,ariaLabel:`Edit ticket title`,emptyMessage:`Title cannot be empty`,onCommit:a},t[2]=i,t[3]=a,t[4]=o):o=t[4];let s=E(o);if(s.editor)return s.editor;if(!n.title.trim())return null;let c;t[5]===s?c=t[6]:(c=e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),s.start(e))},t[5]=s,t[6]=c);let l;return t[7]!==s.start||t[8]!==c||t[9]!==n.title?(l=(0,F.jsx)(`h2`,{className:`drawer-title drawer-title-text editable-field`,"data-edit-field":`title`,role:`button`,tabIndex:0,title:`Click or press Enter to edit ticket title`,"aria-label":`Edit ticket title`,onClick:s.start,onKeyDown:c,children:n.title}),t[7]=s.start,t[8]=c,t[9]=n.title,t[10]=l):l=t[10],l}var rt=[`epic`,`feature`,`task`,`bug`],it=[4,3,2,1,0];function at(e){let t=(0,P.c)(35),{ticket:n,patch:r}=e,i=C(),a=A(s(),i,n.state_id),[o,c]=(0,N.useState)(null),[l,u]=(0,N.useState)(null),[f,p]=(0,N.useState)(null),h;t[0]===r?h=t[1]:(h=(e,t,n)=>{e(t),r(n).then(()=>e(null))},t[0]=r,t[1]=h);let g=h,_=o??n.state_id,v=l??n.type,y;t[2]===v?y=t[3]:(y=m(v),t[2]=v,t[3]=y);let b=y,x=Number(f??n.priority),S;t[4]===_?S=t[5]:(S=e=>e.id===_,t[4]=_,t[5]=S);let w=d(a.find(S)),T;t[6]===g?T=t[7]:(T=e=>g(c,e.currentTarget.value,{state_id:e.currentTarget.value}),t[6]=g,t[7]=T);let E=a.map(ct),D;t[8]!==_||t[9]!==T||t[10]!==E||t[11]!==w?(D=(0,F.jsx)(`select`,{className:`detail-meta-badge detail-state-badge meta-select`,"data-variant":w,"data-meta-field":`state_id`,"aria-label":`Ticket state`,value:_,onChange:T,children:E}),t[8]=_,t[9]=T,t[10]=E,t[11]=w,t[12]=D):D=t[12];let O=`detail-meta-badge detail-type-badge type-pill-${b} meta-select`,k;t[13]!==g||t[14]!==u?(k=e=>g(u,e.currentTarget.value,{type:e.currentTarget.value}),t[13]=g,t[14]=u,t[15]=k):k=t[15];let M;t[16]===Symbol.for(`react.memo_cache_sentinel`)?(M=rt.map(st),t[16]=M):M=t[16];let I;t[17]!==O||t[18]!==k||t[19]!==b?(I=(0,F.jsx)(`select`,{className:O,"data-meta-field":`type`,"aria-label":`Ticket type`,value:b,onChange:k,children:M}),t[17]=O,t[18]=k,t[19]=b,t[20]=I):I=t[20];let L;t[21]===x?L=t[22]:(L=j(x),t[21]=x,t[22]=L);let R=String(x),z;t[23]!==g||t[24]!==p?(z=e=>g(p,e.currentTarget.value,{priority:Number(e.currentTarget.value)}),t[23]=g,t[24]=p,t[25]=z):z=t[25];let B;t[26]===Symbol.for(`react.memo_cache_sentinel`)?(B=it.map(ot),t[26]=B):B=t[26];let V;t[27]!==L||t[28]!==R||t[29]!==z?(V=(0,F.jsx)(`select`,{className:`detail-meta-badge detail-priority-badge priority-pill meta-select`,"data-variant":L,"data-meta-field":`priority`,"aria-label":`Ticket priority`,value:R,onChange:z,children:B}),t[27]=L,t[28]=R,t[29]=z,t[30]=V):V=t[30];let H;return t[31]!==D||t[32]!==I||t[33]!==V?(H=(0,F.jsxs)(`div`,{className:`detail-meta-badge-row`,"aria-label":`Ticket metadata controls`,children:[D,I,V]}),t[31]=D,t[32]=I,t[33]=V,t[34]=H):H=t[34],H}function ot(e){return(0,F.jsx)(`option`,{value:String(e),children:a(e)},e)}function st(e){return(0,F.jsx)(`option`,{value:e,children:u(e)},e)}function ct(e){return(0,F.jsx)(`option`,{value:e.id,children:e.name},e.id)}function lt(e){let t=(0,P.c)(56),{ticket:n,detail:r,actions:i}=e,a=C(),o;t[0]===n.type?o=t[1]:(o=m(n.type),t[0]=n.type,t[1]=o);let s=o===`epic`,c=a?.ai_enabled!==0,l;t[2]!==i.patch||t[3]!==n?(l=(0,F.jsx)(ut,{ticket:n,patch:i.patch}),t[2]=i.patch,t[3]=n,t[4]=l):l=t[4];let u=n.nebula_url||``,d;t[5]!==i.patch||t[6]!==u?(d=(0,F.jsx)(Be,{nebulaUrl:u,patch:i.patch}),t[5]=i.patch,t[6]=u,t[7]=d):d=t[7];let f;t[8]!==l||t[9]!==d?(f=(0,F.jsxs)(`div`,{className:`detail-head`,children:[l,d]}),t[8]=l,t[9]=d,t[10]=f):f=t[10];let p;t[11]!==i.patch||t[12]!==n?(p=(0,F.jsx)(ke,{ticket:n,patch:i.patch}),t[11]=i.patch,t[12]=n,t[13]=p):p=t[13];let h;t[14]!==i.refresh||t[15]!==r.children||t[16]!==s||t[17]!==n?(h=s?(0,F.jsx)(ve,{ticket:n,cards:r.children,refresh:i.refresh}):null,t[14]=i.refresh,t[15]=r.children,t[16]=s,t[17]=n,t[18]=h):h=t[18];let g;t[19]!==i.refresh||t[20]!==r.attachments||t[21]!==n.id?(g=(0,F.jsx)(oe,{ticketId:n.id,attachments:r.attachments,refresh:i.refresh}),t[19]=i.refresh,t[20]=r.attachments,t[21]=n.id,t[22]=g):g=t[22];let _;t[23]!==i.refresh||t[24]!==r.parent||t[25]!==s||t[26]!==n?(_=s?null:(0,F.jsx)(be,{ticket:n,parent:r.parent,refresh:i.refresh}),t[23]=i.refresh,t[24]=r.parent,t[25]=s,t[26]=n,t[27]=_):_=t[27];let v;t[28]!==i.refresh||t[29]!==r.crossBoard||t[30]!==r.relations||t[31]!==n?(v=(0,F.jsx)(Te,{ticket:n,relations:r.relations,crossBoard:r.crossBoard,refresh:i.refresh}),t[28]=i.refresh,t[29]=r.crossBoard,t[30]=r.relations,t[31]=n,t[32]=v):v=t[32];let y;t[33]!==i.patch||t[34]!==c||t[35]!==n?(y=c?(0,F.jsx)(te,{ticket:n,patch:i.patch}):null,t[33]=i.patch,t[34]=c,t[35]=n,t[36]=y):y=t[36];let b;t[37]===r.history?b=t[38]:(b=(0,F.jsx)(qe,{history:r.history}),t[37]=r.history,t[38]=b);let x;t[39]!==i.refresh||t[40]!==c||t[41]!==r.comments||t[42]!==n.id?(x=(0,F.jsx)(Ye,{ticketId:n.id,comments:r.comments,aiEnabled:c,refresh:i.refresh}),t[39]=i.refresh,t[40]=c,t[41]=r.comments,t[42]=n.id,t[43]=x):x=t[43];let S;t[44]!==v||t[45]!==y||t[46]!==b||t[47]!==x||t[48]!==p||t[49]!==h||t[50]!==g||t[51]!==_?(S=(0,F.jsxs)(`div`,{className:`settings-stack detail-section-stack`,children:[p,h,g,_,v,y,b,x]}),t[44]=v,t[45]=y,t[46]=b,t[47]=x,t[48]=p,t[49]=h,t[50]=g,t[51]=_,t[52]=S):S=t[52];let w;return t[53]!==S||t[54]!==f?(w=(0,F.jsxs)(F.Fragment,{children:[f,S]}),t[53]=S,t[54]=f,t[55]=w):w=t[55],w}function ut(e){let t=(0,P.c)(22),{ticket:n,patch:r}=e,i=n.description,a=(0,N.useRef)(null),o=(0,N.useRef)(!1),s;t[0]===r?s=t[1]:(s=async e=>{await r({description:l(e)})},t[0]=r,t[1]=s);let c;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(c=e=>{e||(o.current=document.activeElement?.getAttribute(`data-editing-field`)===`description`)},t[2]=c):c=t[2];let u;t[3]!==i||t[4]!==s?(u={value:i,fieldName:`description`,multiline:!0,ariaLabel:`Edit ticket description`,onCommit:s,onEditingChange:c},t[3]=i,t[4]=s,t[5]=u):u=t[5];let d=E(u),f,p;t[6]===d.editing?(f=t[7],p=t[8]):(f=()=>{!d.editing&&o.current&&(o.current=!1,a.current?.focus({preventScroll:!0}))},p=[d.editing],t[6]=d.editing,t[7]=f,t[8]=p),(0,N.useEffect)(f,p);let m=d.editing?`detail-description-bar is-editing`:`detail-description-bar`,g;t[9]===n.updated_at?g=t[10]:(g=h(n.updated_at),t[9]=n.updated_at,t[10]=g);let _;t[11]===g?_=t[12]:(_=(0,F.jsxs)(`p`,{className:`detail-updated`,title:`Last saved change`,children:[`Updated `,g]}),t[11]=g,t[12]=_);let v;t[13]!==m||t[14]!==_?(v=(0,F.jsx)(`div`,{className:m,children:_}),t[13]=m,t[14]=_,t[15]=v):v=t[15];let y;t[16]!==i||t[17]!==d?(y=d.editor??(0,F.jsx)(`div`,{ref:a,className:i?`description preserved-text-body editable-field detail-description-body`:`description editable-field detail-description-body is-placeholder`,"data-edit-field":`description`,tabIndex:0,role:`button`,"aria-label":`Edit ticket description`,title:`Click to edit`,onClick:e=>{e.preventDefault(),d.start(e)},onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),d.start(e))},children:i?l(i):`Add a description`}),t[16]=i,t[17]=d,t[18]=y):y=t[18];let b;return t[19]!==y||t[20]!==v?(b=(0,F.jsxs)(F.Fragment,{children:[v,y]}),t[19]=y,t[20]=v,t[21]=b):b=t[21],b}export{Ze as CardDetail};
2
+ //# sourceMappingURL=chunk.BrNn_D79.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk.BrNn_D79.js","names":["title","headExtra","children","open","_c","ticket","patch","label","path","field","event","_c","files","event","ticketId","attachment","setLightbox","error","release","gone","name","onRemove","meta","src","onClose","title","_c","useState","_temp","useEffectEvent","_temp2","_temp3","_temp4","_temp5","createPortal","event","candidates","t","kind","_c","useState","useRef","_temp","_temp2","_temp3","_temp4","label","draft","setDraft","candidates","add","_c","useState","_temp","_temp2","_temp3","_temp4","_temp5","event","placeField","keyDown","leave","href","startEdit","host","_c","useState","useRef","_Fragment","comment","aiEnabled","event","draft","kind","onToggleAi","_c","_temp","useState","current","ticket","detail","actions","n","stateId","event","type","p","value","s","aiEnabled","body","_c","useState","useRef","_Fragment","__toESM","require_compiler_runtime","require_react","require_jsx_runtime","useOrbit","priorityLabel","toast","useBoardStates","useBoardLabels","cleanText","typeLabelLong","stateClassFor","formatDate","useBoardTickets","canonicalTicketType","formatDateDetail","useBoard","ticketLabel","Typeahead","markRead","CloseIcon","TicketTypeahead","useTicket","useCurrentBoard","openArtifact","resolveTicketFromLabel","useInlineEdit","indentOnTab","require_react_dom","DrawerShell","selectableStates","priorityKeyFor","DetailCard","import_react","import_compiler_runtime","import_jsx_runtime","CLOSED_KEY","section","sectionClosed","saveSectionOpen","open","SectionPanel","$","rest","t0","t1","t2","t3","t4","TogglePanel","startOpen","className","onToggle","event","title","t5","headExtra","t6","children","t7","attrs","OPEN_KEY","ticketId","savedOpen","saveOpen","AiRecordPanel","ticket","patch","InlineTextField","t8","t9","t10","askForPath","answer","label","currentPath","next","body","field","openOrAsk","app","value","edit","hasValue","artifact","path","placeholder","event_0","event_1","import_react_dom","formatBytes","bytes","imageFiles","files","file","failure","error","fallback","AttachmentsPanel","dragOver","setDragOver","lightbox","setLightbox","refresh","upload","target","files_0","_temp$4","onPaste","paste","attachmentId","remove","event_2","_temp2$3","t11","t12","t13","t14","attachments","AttachmentCard","attachment","t15","input","event_3","_temp3$3","t16","t17","AttachmentLightbox","t18","error_1","error_0","useImageUrl","url","setUrl","missing","gone","release","_temp4$3","image","_temp5$2","src","name","meta","extension","t19","onRemove","t20","onOpen","close","onClose","onKey","isRecord","text","isCard","isRelation","readDetail","hint","context","history","comments","links","link","newerTicket","fromBoard","fromDetail","usePickField","setValue","clear","pickedTicket","tickets","t","selfId","unknown","CardGrid","one","single","items","item","EpicChildrenPanel","candidates","view","childId","parentId","setParent","submit","cards","card","_temp$3","done","ParentEpicPanel","parent","_temp2$2","RELATION_TYPES","crossEyebrow","otherBoardRef","match","boardSlug","RelatedPanel","kind","setKind","linked","relations","_temp3$2","t_0","elsewhere","other","relationId","holder","detach","relation","crossBoard","_temp4$2","option","r","labelColor","color","LabelsPanel","catalog","draft","setDraft","T0","add","names","_temp$2","label_0","label_1","n","_temp2$1","_temp3$1","_temp4$1","_temp5$1","label_5","label_4","label_3","label_2","query","asText","parseNebulaUrl","decoded","segment","nebulaLinkLabel","href","segments","at","parts","last","NEBULA_LINK_HELP","NebulaLink","nebulaUrl","editing","setEditing","host","focusField","focusRow","startEdit","leave","el","placeField","save","kept","was","keyDown","INTERNAL_LOCAL_NAMES","GENERIC_AGENT_NAMES","AGENT_COMMENT_KINDS","clean","humanizeIdentifier","raw","char","agentNameFrom","actor","id","actorId","lowerName","lowerId","formatActorLabel","type","actorType","agentName","formatCommentAuthor","comment","author","StatusHistoryPanel","_temp$1","from","to","claimed","by","CommentsPanel","sent","now","omit","toggleAi","aiEnabled","CommentRow","comment_0","omitted","onToggleAi","CardDetail","data","_temp","detail","setDetail","reads","setReads","loaded","current","_temp2","_temp3","actions","_temp4","archive","CardTitle","CardMeta","CardBody","n_0","s","TYPES","PRIORITIES","board","lanes","stateChoice","setStateChoice","typeChoice","setTypeChoice","priorityChoice","setPriorityChoice","show","choose","stateId","priority","_temp5","_temp6","t21","_temp7","t22","t23","p","value_0","s_0","isEpic","Description","description","refocus"],"sources":["../../../web/src/ui/Panel.tsx","../../../web/src/card/AiRecordPanel.tsx","../../../web/src/card/AttachmentsPanel.tsx","../../../web/src/card/detail.ts","../../../web/src/card/FamilyPanels.tsx","../../../web/src/card/LabelsPanel.tsx","../../../src/core/text.ts","../../../src/core/nebula-link.ts","../../../web/src/card/nebula-label.ts","../../../web/src/card/NebulaLink.tsx","../../../web/src/lib/actor-labels.ts","../../../web/src/card/RecordPanels.tsx","../../../web/src/card/CardDetail.tsx"],"sourcesContent":["// Panels: a bordered card with a tinted header strip and a padded body, the\n// look of Settings' sections and the card drawer's. The collapsible one is a\n// <details> whose header toggles it. They use the .settings-card classes.\n\nimport type { ReactNode } from \"react\";\n\ninterface PanelProps {\n title: string;\n children?: ReactNode;\n className?: string;\n /** Actions beside the title. */\n headExtra?: ReactNode;\n /** Extra attributes for the section (data-*, aria-*). */\n attrs?: Record<string, string>;\n}\n\nexport function Panel({ title, children, className, headExtra, attrs }: PanelProps) {\n return (\n <section className={className ? `settings-card ${className}` : \"settings-card\"} {...attrs}>\n <header className=\"settings-card-head\">\n <h3 className=\"settings-card-title\">{title}</h3>\n {headExtra}\n </header>\n <div className=\"settings-card-body\">{children}</div>\n </section>\n );\n}\n\nconst CLOSED_KEY = (section: string): string => `mab_section_closed:${section}`;\n\nfunction sectionClosed(section: string): boolean {\n try {\n return localStorage.getItem(CLOSED_KEY(section)) === \"1\";\n } catch {\n return false;\n }\n}\n\nfunction saveSectionOpen(section: string, open: boolean): void {\n try {\n if (open) localStorage.removeItem(CLOSED_KEY(section));\n else localStorage.setItem(CLOSED_KEY(section), \"1\");\n } catch {\n // Blocked storage: the section opens again next time.\n }\n}\n\n/** A panel that starts open and stays closed, on every card, once someone closes it. `section` names it. */\nexport function SectionPanel({ section, ...rest }: PanelProps & { section: string }) {\n return <TogglePanel {...rest} open={!sectionClosed(section)} onToggle={(open) => saveSectionOpen(section, open)} />;\n}\n\n/** `open` is how it starts; `onToggle` is told each time someone opens or closes it. */\nexport function TogglePanel({ title, children, className, headExtra, attrs, open: startOpen, onToggle }: PanelProps & { open?: boolean; onToggle?: (open: boolean) => void }) {\n const open = startOpen ?? false;\n return (\n <details\n className={`settings-card settings-card--collapsible${className ? ` ${className}` : \"\"}`}\n open={open}\n onToggle={onToggle ? (event) => onToggle(event.currentTarget.open) : undefined}\n {...attrs}\n >\n <summary className=\"settings-card-head\">\n <h3 className=\"settings-card-title\">{title}</h3>\n {headExtra}\n <svg className=\"settings-card-chevron\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </summary>\n <div className=\"settings-card-body\">{children}</div>\n </details>\n );\n}\n","// The card's AI Plan / Implementation Record: three long fields, each edited\n// in place on a click or Enter and saved on its own. The plan and the work\n// summary each link a fuller markdown file, opened in the artifact drawer\n// (or, with none linked or one that can't be read, asked for).\n\nimport type { KeyboardEvent, MouseEvent } from \"react\";\nimport { cleanText } from \"../lib/format.ts\";\nimport { useOrbit } from \"../orbit/context.tsx\";\nimport type { OrbitApp } from \"../orbit/app.ts\";\nimport { useInlineEdit } from \"../ui/InlineEdit.tsx\";\nimport { TogglePanel } from \"../ui/Panel.tsx\";\nimport { toast } from \"../ui/toast.ts\";\nimport { openArtifact } from \"./artifact.ts\";\nimport type { CardActions, CardTicket, TicketUpdate } from \"./detail.ts\";\n\nconst OPEN_KEY = (ticketId: string): string => `mab_ai_plan_open:${ticketId}`;\n\nfunction savedOpen(ticketId: string): boolean {\n try {\n return localStorage.getItem(OPEN_KEY(ticketId)) === \"1\";\n } catch {\n return false;\n }\n}\n\nfunction saveOpen(ticketId: string, open: boolean): void {\n try {\n if (open) localStorage.setItem(OPEN_KEY(ticketId), \"1\");\n else localStorage.removeItem(OPEN_KEY(ticketId));\n } catch {\n // Blocked storage: the panel opens closed next time.\n }\n}\n\ntype TextField = \"ai_plan\" | \"implementation_summary\" | \"implementation_updates\";\ntype PathField = \"plan_artifact_path\" | \"implementation_artifact_path\";\n\nexport function AiRecordPanel({ ticket, patch }: { ticket: CardTicket; patch: CardActions[\"patch\"] }) {\n return (\n <TogglePanel\n title=\"AI Plan / Implementation Record\"\n open={savedOpen(ticket.id)}\n onToggle={(open) => saveOpen(ticket.id, open)}\n attrs={{ \"data-ai-plan-toggle\": \"\", \"data-ticket-id\": ticket.id }}\n >\n <div className=\"ai-fields-grid\">\n <InlineTextField ticket={ticket} field=\"ai_plan\" label=\"AI Plan\" placeholder=\"What to do: \" artifact={{ field: \"plan_artifact_path\", label: \"Open full handoff\" }} patch={patch} />\n <InlineTextField ticket={ticket} field=\"implementation_summary\" label=\"Work Summary\" placeholder=\"What was done: \" artifact={{ field: \"implementation_artifact_path\", label: \"Open full report\" }} patch={patch} />\n <InlineTextField ticket={ticket} field=\"implementation_updates\" label=\"Revisions\" placeholder=\"Changes since initial implementation: \" patch={patch} />\n </div>\n </TogglePanel>\n );\n}\n\n/** Asks for a file's path (Cancel keeps it as it is) and saves it. */\nasync function askForPath(field: PathField, currentPath: string, label: string, patch: CardActions[\"patch\"]): Promise<void> {\n const answer = window.prompt(`Local markdown/text path for ${label} (example: docs/test.md or ./docs/test.md)`, currentPath || \"docs/\");\n if (answer === null) return;\n const next = cleanText(answer).trim();\n const body: TicketUpdate = {};\n body[field] = next;\n if (await patch(body)) toast.success(next ? \"Artifact path updated\" : \"Artifact path cleared\");\n}\n\nasync function openOrAsk(app: OrbitApp, ticketId: string, field: PathField, currentPath: string, label: string, patch: CardActions[\"patch\"]): Promise<void> {\n if (!currentPath) {\n await askForPath(field, currentPath, label, patch);\n return;\n }\n if (!(await openArtifact(app, { ticketId, path: currentPath, title: label }))) await askForPath(field, currentPath, label, patch);\n}\n\ninterface InlineTextFieldProps {\n ticket: CardTicket;\n field: TextField;\n label: string;\n placeholder: string;\n artifact?: { field: PathField; label: string };\n patch: CardActions[\"patch\"];\n}\n\n/** A long field shown as its text (or a prompt for it), edited in place. */\nfunction InlineTextField({ ticket, field, label, placeholder, artifact, patch }: InlineTextFieldProps) {\n const app = useOrbit();\n const value = ticket[field] || \"\";\n const edit = useInlineEdit({\n value,\n fieldName: field,\n multiline: true,\n ariaLabel: `Edit ${label}`,\n onCommit: async (next) => {\n const body: TicketUpdate = {};\n body[field] = cleanText(next);\n await patch(body);\n }\n });\n const hasValue = Boolean(value.trim());\n const path = artifact ? (ticket[artifact.field] || \"\").trim() : \"\";\n return (\n <div className=\"inline-md-field\">\n <div className=\"inline-md-field-head\">\n <span className=\"inline-md-field-label\">{label}</span>\n {artifact ? (\n <button\n type=\"button\"\n className=\"detail-action-btn\"\n data-variant=\"ghost\"\n data-open-artifact={path}\n data-artifact-field={artifact.field}\n data-artifact-ticket-id={ticket.id}\n data-artifact-title={label}\n onClick={(event) => {\n event.stopPropagation();\n void openOrAsk(app, ticket.id, artifact.field, path, label, patch);\n }}\n >\n {artifact.label}\n </button>\n ) : null}\n </div>\n {edit.editor ?? (\n <div\n className={`inline-md-field-body preserved-text-body editable-field ${hasValue ? \"\" : \"is-placeholder\"}`}\n data-edit-field={field}\n tabIndex={0}\n title=\"Click to edit\"\n role=\"button\"\n aria-label={`Edit ${label}`}\n onClick={(event: MouseEvent<HTMLElement>) => {\n event.preventDefault();\n edit.start(event);\n }}\n onKeyDown={(event: KeyboardEvent<HTMLElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n edit.start(event);\n }}\n >\n {hasValue ? cleanText(value) : placeholder}\n </div>\n )}\n </div>\n );\n}\n","// The card's Images panel: a drop zone, its images (each opens larger in a\n// lightbox, and can be removed), and an Upload button. An image pasted\n// anywhere in the drawer outside a text field is attached too. A file Orbit\n// won't show as an image (an SVG an import brought) is offered as a download\n// only, never drawn or opened in the app's origin.\n\nimport { useEffect, useEffectEvent, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { AttachmentView } from \"../../../src/core/files.ts\";\nimport { useOrbit } from \"../orbit/context.tsx\";\nimport { CloseIcon } from \"../ui/icons.tsx\";\nimport { SectionPanel } from \"../ui/Panel.tsx\";\nimport { toast } from \"../ui/toast.ts\";\nimport type { CardActions } from \"./detail.ts\";\n\nfunction formatBytes(value: number): string {\n const bytes = value || 0;\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction imageFiles(files: FileList | readonly File[] | null | undefined): File[] {\n return [...(files ?? [])].filter((file) => file.type.startsWith(\"image/\"));\n}\n\nfunction failure(error: unknown, fallback: string): string {\n return error instanceof Error && error.message ? error.message : fallback;\n}\n\ninterface Lightbox {\n src: string;\n title: string;\n}\n\nexport function AttachmentsPanel({ ticketId, attachments, refresh }: { ticketId: string; attachments: AttachmentView[]; refresh: CardActions[\"refresh\"] }) {\n const app = useOrbit();\n const [dragOver, setDragOver] = useState(false);\n const [lightbox, setLightbox] = useState<Lightbox | null>(null);\n\n /** Attaches the images among `files`, one by one; throws the first refusal. */\n const upload = async (files: File[]): Promise<void> => {\n if (!files.length) {\n toast.warning(\"No image files found\");\n return;\n }\n for (const file of files) {\n const bytes = new Uint8Array(await file.arrayBuffer());\n await app.client.attachments.create(ticketId, bytes, { mime_type: file.type || \"application/octet-stream\", original_name: file.name || \"image\" }, app.hint());\n }\n refresh();\n toast.success(files.length === 1 ? \"Image attached\" : `${files.length} images attached`);\n };\n\n const onPaste = useEffectEvent((event: ClipboardEvent) => {\n const target = event.target instanceof Element ? event.target : null;\n if (!target?.closest(\"#drawerInner\") || target.closest(\"input, textarea, [contenteditable='true']\")) return;\n const files = imageFiles(event.clipboardData?.files);\n if (!files.length) return;\n event.preventDefault();\n upload(files).catch((error: unknown) => toast.error(failure(error, \"Paste upload failed\")));\n });\n useEffect(() => {\n const paste = (event: ClipboardEvent): void => onPaste(event);\n document.addEventListener(\"paste\", paste);\n return () => document.removeEventListener(\"paste\", paste);\n }, []);\n\n const remove = async (attachmentId: string): Promise<void> => {\n try {\n await app.call(() => app.client.attachments.remove(ticketId, attachmentId, app.hint()));\n } catch {\n return;\n }\n refresh();\n toast.success(\"Image removed\");\n };\n\n return (\n <SectionPanel section=\"images\" title=\"Images\" className=\"attachments-panel\" attrs={{ \"data-attachment-section\": \"\", \"data-ticket-id\": ticketId }}>\n <div className=\"settings-row\">\n <div\n className={`attachment-dropzone${dragOver ? \" is-dragover\" : \"\"}`}\n data-attachment-dropzone=\"\"\n tabIndex={0}\n onDragOver={(event) => {\n event.preventDefault();\n setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(event) => {\n event.preventDefault();\n setDragOver(false);\n upload(imageFiles(event.dataTransfer.files)).catch((error: unknown) => toast.error(failure(error, \"Upload failed\")));\n }}\n >\n <strong>Paste, drag, or upload images</strong>\n <span>PNG, JPG, GIF, WebP, or AVIF up to 10 MB each. SVG isn't taken: it can carry script.</span>\n </div>\n {attachments.length ? (\n <div className=\"attachment-grid\">\n {attachments.map((attachment) => (\n <AttachmentCard key={attachment.id} ticketId={ticketId} attachment={attachment} onOpen={setLightbox} onRemove={() => void remove(attachment.id)} />\n ))}\n </div>\n ) : (\n <p className=\"description attachment-empty-state\">No images attached yet.</p>\n )}\n <label className=\"attachment-upload-button detail-action-btn\" role=\"button\" data-variant=\"ghost\" tabIndex={0}>\n Upload\n <input\n type=\"file\"\n accept=\"image/png,image/jpeg,image/gif,image/webp,image/avif\"\n multiple\n data-attachment-input=\"\"\n onChange={(event) => {\n const input = event.currentTarget;\n upload(imageFiles(input.files)).then(\n () => {\n input.value = \"\";\n },\n (error: unknown) => toast.error(failure(error, \"Upload failed\"))\n );\n }}\n />\n </label>\n </div>\n {lightbox ? <AttachmentLightbox src={lightbox.src} title={lightbox.title} onClose={() => setLightbox(null)} /> : null}\n </SectionPanel>\n );\n}\n\n/** An image's address while it's shown; released when it goes (the browser edition's are object URLs). */\nfunction useImageUrl(ticketId: string, attachmentId: string, missing: boolean): string {\n const app = useOrbit();\n const [url, setUrl] = useState(\"\");\n useEffect(() => {\n if (missing) return;\n let gone = false;\n let release = (): void => undefined;\n app.client.attachments.url(ticketId, attachmentId, app.hint()).then(\n (image) => {\n if (gone) {\n image.release();\n return;\n }\n release = () => image.release();\n setUrl(image.url);\n },\n () => undefined\n );\n return () => {\n gone = true;\n release();\n };\n }, [app, ticketId, attachmentId, missing]);\n return url;\n}\n\nfunction AttachmentCard({ ticketId, attachment, onOpen, onRemove }: { ticketId: string; attachment: AttachmentView; onOpen: (lightbox: Lightbox) => void; onRemove: () => void }) {\n const src = useImageUrl(ticketId, attachment.id, attachment.missing);\n const name = attachment.original_name || \"image\";\n const meta = (\n <div className=\"attachment-card-meta\">\n <strong>{name}</strong>\n <span>{`${formatBytes(attachment.size_bytes)} · ${attachment.mime_type || \"image\"}`}</span>\n </div>\n );\n if (attachment.download_only && !attachment.missing) {\n const extension = (/\\.([A-Za-z0-9]{1,8})$/.exec(name)?.[1] ?? \"\").toUpperCase();\n return (\n <article className=\"attachment-card is-file\">\n <a className=\"attachment-file-thumb\" href={src || undefined} download={name} data-download-attachment={attachment.id} aria-label={`Download ${name}`}>\n <span>{extension || \"File\"}</span>\n <small>Download</small>\n </a>\n <div className=\"attachment-card-meta\">\n <strong>{name}</strong>\n <span>{`${formatBytes(attachment.size_bytes)} · download only`}</span>\n </div>\n <button type=\"button\" className=\"attachment-delete\" data-delete-attachment={attachment.id} aria-label=\"Remove file\" onClick={onRemove}>\n <CloseIcon />\n </button>\n </article>\n );\n }\n if (attachment.missing) {\n return (\n <article className=\"attachment-card is-missing\">\n <div className=\"attachment-missing-thumb\">Missing</div>\n {meta}\n <button type=\"button\" className=\"attachment-delete\" data-delete-attachment={attachment.id} aria-label=\"Remove missing image\" onClick={onRemove}>\n <CloseIcon />\n </button>\n </article>\n );\n }\n return (\n <article className=\"attachment-card\">\n <button type=\"button\" className=\"attachment-thumb-button\" data-no-arc=\"\" data-open-lightbox={src} data-lightbox-title={name} onClick={() => (src ? onOpen({ src, title: name }) : undefined)}>\n <img src={src || undefined} alt={name} loading=\"lazy\" />\n </button>\n {meta}\n <button type=\"button\" className=\"attachment-delete\" data-delete-attachment={attachment.id} aria-label=\"Remove image\" onClick={onRemove}>\n <CloseIcon />\n </button>\n </article>\n );\n}\n\n/** An image at full size over the page; its close button, a click beside it or Escape closes it. */\nfunction AttachmentLightbox({ src, title, onClose }: Lightbox & { onClose: () => void }) {\n const close = useEffectEvent(onClose);\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key !== \"Escape\") return;\n // Marked handled, so the app's Escape doesn't close the card under it too.\n event.preventDefault();\n close();\n };\n document.addEventListener(\"keydown\", onKey, true);\n return () => document.removeEventListener(\"keydown\", onKey, true);\n }, []);\n return createPortal(\n <div\n className=\"attachment-lightbox\"\n onClick={(event) => {\n if (event.target === event.currentTarget) onClose();\n }}\n >\n <div className=\"attachment-lightbox-panel\" role=\"dialog\" aria-modal=\"true\" aria-label={title}>\n <button type=\"button\" className=\"attachment-lightbox-close\" aria-label=\"Close image\" onClick={onClose}>\n <CloseIcon />\n </button>\n <img src={src} alt={title} />\n <p>{title}</p>\n </div>\n </div>,\n document.body\n );\n}\n","// What the card's drawer reads, beyond the board: its context (epic,\n// sub-cards, relations), lane history, comments and images, read together.\n// The context's lists come typed loosely from the core, so each row is\n// checked here before the drawer draws it.\n\nimport type { HistoryEntry, TicketUpdate } from \"../../../src/core/tickets.ts\";\nimport type { AttachmentView } from \"../../../src/core/files.ts\";\nimport type { Comment } from \"../../../src/core/model.ts\";\nimport type { TicketView } from \"../../../src/core/views.ts\";\nimport type { OrbitApp } from \"../orbit/app.ts\";\nimport type { DetailCardTicket } from \"../ui/DetailCard.tsx\";\n\nexport type { TicketUpdate };\n\n/** The card as the drawer shows it: from the board, or from its own read, whichever is newer. */\nexport type CardTicket = TicketView & { labels: readonly { id: string; name: string; color: string }[] };\n\nexport interface RelationRow {\n id: string;\n type: string;\n direction: string;\n other_ticket: DetailCardTicket;\n}\n\n/** A link to a card on another board: the other card, and the board it is on. */\nexport interface CrossRow {\n id: string;\n /** The board the link lives on: this card's for its own links, the other card's for one into it. */\n holder_board_id: string;\n type: string;\n direction: string;\n blocking: boolean;\n board_slug: string;\n other_ticket: DetailCardTicket & { board_slug: string };\n}\n\nexport interface Detail {\n ticket: CardTicket;\n parent: DetailCardTicket | null;\n children: DetailCardTicket[];\n relations: RelationRow[];\n /** Links to cards on other boards; a link whose card is gone isn't listed. */\n crossBoard: CrossRow[];\n history: HistoryEntry[];\n comments: Comment[];\n attachments: AttachmentView[];\n}\n\n/** Writes the drawer's parts make, and how they ask for a fresh read. */\nexport interface CardActions {\n /** Changes the card; answers whether it was saved (a refusal is said in a toast). */\n patch: (body: TicketUpdate) => Promise<boolean>;\n /** Reads the drawer's parts again (after a write that isn't to the card itself). */\n refresh: () => void;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function text(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction isCard(value: unknown): value is DetailCardTicket {\n return isRecord(value) && typeof value.id === \"string\" && typeof value.number === \"number\" && typeof value.title === \"string\";\n}\n\nfunction isRelation(value: unknown): value is RelationRow {\n return isRecord(value) && typeof value.id === \"string\" && typeof value.type === \"string\" && isCard(value.other_ticket);\n}\n\nexport async function readDetail(app: OrbitApp, ticketId: string): Promise<Detail> {\n const hint = app.hint();\n const [context, history, comments, attachments, links] = await Promise.all([\n app.client.tickets.context(ticketId, undefined, hint),\n app.client.tickets.history(ticketId, hint),\n app.client.comments.list(ticketId, hint),\n // A card's images are a nicety: the card opens without them.\n app.client.attachments.list(ticketId, hint).catch(() => ({ attachments: [] })),\n app.client.tickets.relations(ticketId, hint)\n ]);\n return {\n ticket: context.ticket,\n parent: isCard(context.parent_ticket) ? context.parent_ticket : null,\n children: context.child_tickets.filter(isCard),\n relations: context.relations.filter(isRelation),\n crossBoard: links.cross_board.flatMap((link) => (link.other_ticket ? [{ id: link.id, holder_board_id: link.direction === \"incoming\" ? link.other_board_id : context.ticket.board_id, type: link.type, direction: link.direction, blocking: link.blocking, board_slug: link.other_ticket.board_slug, other_ticket: link.other_ticket }] : [])),\n history,\n comments: comments.comments,\n attachments: attachments.attachments\n };\n}\n\n/** The newer of the board's copy of the card and the drawer's own read; on a tie the drawer's, whose labels are its own. */\nexport function newerTicket(fromBoard: CardTicket | undefined, fromDetail: CardTicket | undefined): CardTicket | undefined {\n if (!fromBoard) return fromDetail;\n if (!fromDetail) return fromBoard;\n return fromBoard.updated_at > fromDetail.updated_at ? fromBoard : fromDetail;\n}\n","// A card's family on its drawer: an epic's features (and a field that pulls\n// one in), a card's epic (or a field that sets one), and its related cards\n// (and a field that links another). Each field is typed or picked from the\n// board's cards, and the related field also takes another board's card as\n// \"slug#n\"; the list of cards opens each one.\n\nimport { useRef, useState } from \"react\";\nimport type { SubmitEvent } from \"react\";\nimport { canonicalTicketType } from \"../lib/format.ts\";\nimport { useBoardTickets, useOrbit } from \"../orbit/context.tsx\";\nimport type { Ticket } from \"../orbit/stores.ts\";\nimport { DetailCard } from \"../ui/DetailCard.tsx\";\nimport type { DetailCardTicket } from \"../ui/DetailCard.tsx\";\nimport { CloseIcon } from \"../ui/icons.tsx\";\nimport { SectionPanel } from \"../ui/Panel.tsx\";\nimport { toast } from \"../ui/toast.ts\";\nimport { TicketTypeahead, resolveTicketFromLabel } from \"../ui/Typeahead.tsx\";\nimport type { CardActions, CardTicket, CrossRow, RelationRow } from \"./detail.ts\";\n\n/** A pick field's text, its input, and its Clear button's work. */\nfunction usePickField() {\n const [value, setValue] = useState(\"\");\n const input = useRef<HTMLInputElement>(null);\n const clear = (): void => {\n setValue(\"\");\n input.current?.focus();\n };\n return { value, setValue, input, clear };\n}\n\n/** The card a pick field names, among the board's other cards; a warning when it names none. */\nfunction pickedTicket(label: string, tickets: readonly Ticket[], selfId: string, unknown: string): Ticket | null {\n const target = resolveTicketFromLabel(label, tickets.filter((t) => t.id !== selfId));\n if (!target) toast.warning(unknown);\n return target ?? null;\n}\n\ninterface GridItem {\n key: string;\n card: DetailCardTicket;\n eyebrow?: string;\n detach: { label: \"Remove from epic\" | \"Remove parent epic\" | \"Remove relation\"; onDetach: () => void };\n /** Opens the card somewhere other than this board (another board's card). */\n onOpen?: () => void;\n}\n\nfunction CardGrid({ items, single: one }: { items: GridItem[]; single?: boolean }) {\n const single = one ?? false;\n const app = useOrbit();\n if (!items.length) return null;\n return (\n <div className={single ? \"detail-card-grid detail-card-grid--single\" : \"detail-card-grid\"}>\n {items.map((item) => (\n <DetailCard key={item.key} ticket={item.card} eyebrow={item.eyebrow} detach={item.detach} onOpen={item.onOpen ?? (() => void app.openTicket(item.card.id))} />\n ))}\n </div>\n );\n}\n\n/** An epic's features, and the field that pulls a card in (setting that card's epic to this one). */\nexport function EpicChildrenPanel({ ticket, cards, refresh }: { ticket: CardTicket; cards: DetailCardTicket[]; refresh: CardActions[\"refresh\"] }) {\n const app = useOrbit();\n const tickets = useBoardTickets();\n const field = usePickField();\n // Any card but an epic that isn't already in this one; a card in another epic moves here.\n const candidates = tickets.filter((t) => t.id !== ticket.id && canonicalTicketType(t.type) !== \"epic\" && t.parent_ticket_id !== ticket.id);\n\n const setParent = async (childId: string, parentId: string | null): Promise<boolean> => {\n try {\n const view = await app.call(() => app.client.tickets.update(childId, { parent_ticket_id: parentId }, app.hint()));\n app.upsertTicket(view);\n refresh();\n return true;\n } catch {\n return false;\n }\n };\n\n const submit = async (event: SubmitEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault();\n if (!field.value.trim()) return;\n const target = pickedTicket(field.value, tickets, ticket.id, \"Pick a ticket from the suggestions\");\n if (!target) return;\n if (canonicalTicketType(target.type) === \"epic\") {\n toast.warning(\"Epics can't be nested inside an epic\");\n return;\n }\n if (!(await setParent(target.id, ticket.id))) return;\n field.setValue(\"\");\n toast.success(\"Feature added to epic\");\n };\n\n return (\n <SectionPanel section=\"epic-children\" title=\"Features inside this Epic\">\n <div className=\"settings-row\">\n <CardGrid\n items={cards.map((card) => ({\n key: card.id,\n card,\n detach: { label: \"Remove from epic\", onDetach: () => void setParent(card.id, null).then((done) => (done ? toast.success(\"Removed from epic\") : undefined)) }\n }))}\n />\n <form id=\"epicChildForm\" className={`related-add-row epic-child-form${field.value ? \" has-value\" : \"\"}`} onSubmit={(event) => void submit(event)}>\n <div className=\"related-add-input-wrap\">\n <TicketTypeahead\n inputRef={field.input}\n name=\"target\"\n className=\"related-add-input meta-inline-input\"\n placeholder=\"Add feature to epic…\"\n aria-label=\"Add feature to epic\"\n autoComplete=\"off\"\n value={field.value}\n onChange={field.setValue}\n items={candidates}\n />\n <button type=\"button\" className=\"related-add-clear\" data-epic-child-clear=\"\" aria-label=\"Clear\" tabIndex={-1} onClick={field.clear}>\n <CloseIcon />\n </button>\n </div>\n <button type=\"submit\" className=\"meta-add-btn detail-action-btn\" data-variant=\"ghost\">\n Add\n </button>\n </form>\n </div>\n </SectionPanel>\n );\n}\n\n/** A card's epic, with a button that removes it; or, with none, the field that sets one. */\nexport function ParentEpicPanel({ ticket, parent, refresh }: { ticket: CardTicket; parent: DetailCardTicket | null; refresh: CardActions[\"refresh\"] }) {\n const app = useOrbit();\n const tickets = useBoardTickets();\n const field = usePickField();\n const candidates = tickets.filter((t) => t.type === \"epic\" && t.id !== ticket.id);\n\n const setParent = async (parentId: string | null): Promise<boolean> => {\n try {\n const view = await app.call(() => app.client.tickets.update(ticket.id, { parent_ticket_id: parentId }, app.hint()));\n app.upsertTicket(view);\n refresh();\n return true;\n } catch {\n return false;\n }\n };\n\n const submit = async (event: SubmitEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault();\n if (!field.value.trim()) return;\n const target = pickedTicket(field.value, tickets, ticket.id, \"Pick an epic from the suggestions\");\n if (!target) return;\n if (canonicalTicketType(target.type) !== \"epic\") {\n toast.warning(\"Parent must be an epic\");\n return;\n }\n if (!(await setParent(target.id))) return;\n field.setValue(\"\");\n toast.success(\"Parent epic set\");\n };\n\n return (\n <SectionPanel section=\"epic\" title=\"Epic\">\n <div className=\"settings-row\">\n {parent ? (\n <CardGrid\n single\n items={[\n {\n key: parent.id,\n card: parent,\n detach: { label: \"Remove parent epic\", onDetach: () => void setParent(null).then((done) => (done ? toast.success(\"Parent epic removed\") : undefined)) }\n }\n ]}\n />\n ) : (\n <form id=\"parentEpicForm\" className={`related-add-row parent-epic-form${field.value ? \" has-value\" : \"\"}`} onSubmit={(event) => void submit(event)}>\n <div className=\"related-add-input-wrap\">\n <TicketTypeahead\n inputRef={field.input}\n name=\"target\"\n className=\"related-add-input meta-inline-input\"\n placeholder=\"Set parent epic…\"\n aria-label=\"Set parent epic\"\n autoComplete=\"off\"\n value={field.value}\n onChange={field.setValue}\n items={candidates}\n />\n <button type=\"button\" className=\"related-add-clear\" data-parent-epic-clear=\"\" aria-label=\"Clear\" tabIndex={-1} onClick={field.clear}>\n <CloseIcon />\n </button>\n </div>\n <button type=\"submit\" className=\"meta-add-btn detail-action-btn\" data-variant=\"ghost\">\n Set\n </button>\n </form>\n )}\n </div>\n </SectionPanel>\n );\n}\n\nconst RELATION_TYPES = [\n { value: \"relates_to\", label: \"relates to\" },\n { value: \"blocks\", label: \"blocks\" },\n { value: \"blocked_by\", label: \"blocked by\" }\n] as const;\n\n/** What a link across boards says, from this card's side. */\nfunction crossEyebrow(link: CrossRow): string {\n const verb = link.type === \"relates_to\" ? \"relates to\" : link.direction === \"incoming\" ? \"blocks\" : link.blocking ? \"blocked by\" : \"was blocked by\";\n return `${verb} · ${link.board_slug}`;\n}\n\n/** Another board's card a related field names as \"slug#n\", or null when it names this board's. */\nfunction otherBoardRef(value: string, boardSlug: string): { board: string; number: number } | null {\n const match = /^\\s*([a-z0-9][a-z0-9-]*)\\s*#\\s*(\\d+)\\s*$/i.exec(value);\n if (!match?.[1] || !match[2] || match[1].toLowerCase() === boardSlug.toLowerCase()) return null;\n return { board: match[1].toLowerCase(), number: Number(match[2]) };\n}\n\n/** A card's relations, each removable, and the field that links another card. */\nexport function RelatedPanel({ ticket, relations, crossBoard, refresh }: { ticket: CardTicket; relations: RelationRow[]; crossBoard: CrossRow[]; refresh: CardActions[\"refresh\"] }) {\n const app = useOrbit();\n const tickets = useBoardTickets();\n const field = usePickField();\n const [kind, setKind] = useState<string>(\"relates_to\");\n // Any card but this one, those it's already linked to, its epic and its features.\n const linked = new Set(relations.map((r) => r.other_ticket.id));\n if (ticket.parent_ticket_id) linked.add(ticket.parent_ticket_id);\n for (const t of tickets) if (t.parent_ticket_id === ticket.id) linked.add(t.id);\n const candidates = tickets.filter((t) => t.id !== ticket.id && !linked.has(t.id));\n\n const submit = async (event: SubmitEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault();\n if (!field.value.trim()) return;\n const elsewhere = otherBoardRef(field.value, ticket.board_slug);\n try {\n if (elsewhere) {\n // Another board's card, by its board and number: blocks, is blocked by, or relates to this one.\n const other = await app.call(() => app.client.tickets.lookup({ board: elsewhere.board }, { number: elsewhere.number }));\n await app.call(() => app.client.relations.create({ source_ticket_id: ticket.id, target_ticket_id: other.ticket.id, target_board: elsewhere.board, type: kind, ...app.hint() }));\n } else {\n const target = pickedTicket(field.value, tickets, ticket.id, \"Pick a ticket from the suggestions, or name another board's as board#3\");\n if (!target) return;\n await app.call(() => app.client.relations.create({ source_ticket_id: ticket.id, target_ticket_id: target.id, type: kind, ...app.hint() }));\n }\n } catch {\n return;\n }\n field.setValue(\"\");\n setKind(\"relates_to\");\n refresh();\n };\n\n // A cross-board link is removed through the board it lives on (`holder`), never by its id alone.\n const detach = async (relationId: string, holder?: string): Promise<void> => {\n try {\n await app.call(() => app.client.relations.remove(relationId, holder ? { board_id: holder } : app.hint()));\n } catch {\n return;\n }\n refresh();\n toast.success(\"Relation removed\");\n };\n\n return (\n <SectionPanel section=\"related\" title=\"Related\">\n <div className=\"settings-row\">\n <CardGrid\n items={relations.map((relation) => ({\n key: relation.id,\n card: relation.other_ticket,\n eyebrow: `${relation.type.replace(/_/g, \" \")} ${relation.direction === \"incoming\" ? \"from\" : \"to\"}`,\n detach: { label: \"Remove relation\", onDetach: () => void detach(relation.id) }\n }))}\n />\n {crossBoard.length ? (\n <CardGrid\n items={crossBoard.map((link) => ({\n key: `${link.holder_board_id}:${link.id}`,\n card: link.other_ticket,\n eyebrow: crossEyebrow(link),\n onOpen: () => void app.navigate({ boardSlug: link.board_slug, view: \"ticket\", ticketId: link.other_ticket.id }),\n detach: { label: \"Remove relation\", onDetach: () => void detach(link.id, link.holder_board_id) }\n }))}\n />\n ) : null}\n <form id=\"relatedAddForm\" className={`related-add-row${field.value ? \" has-value\" : \"\"}`} onSubmit={(event) => void submit(event)}>\n <div className=\"related-add-input-wrap\">\n <TicketTypeahead\n inputRef={field.input}\n name=\"target\"\n className=\"related-add-input meta-inline-input\"\n placeholder=\"Add related ticket, or board#3…\"\n aria-label=\"Add related ticket\"\n autoComplete=\"off\"\n value={field.value}\n onChange={field.setValue}\n items={candidates}\n />\n <button type=\"button\" className=\"related-add-clear\" data-related-clear=\"\" aria-label=\"Clear\" tabIndex={-1} onClick={field.clear}>\n <CloseIcon />\n </button>\n </div>\n <select name=\"type\" className=\"related-add-type meta-inline\" aria-label=\"Relation type\" value={kind} onChange={(event) => setKind(event.currentTarget.value)}>\n {RELATION_TYPES.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <button type=\"submit\" className=\"meta-add-btn detail-action-btn\" data-variant=\"ghost\">\n Add\n </button>\n </form>\n </div>\n </SectionPanel>\n );\n}\n","// The card's Labels panel: its labels, each with a remove button, and a field\n// that adds one (typed, or picked from the board's other labels).\n\nimport { useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport { useBoardLabels } from \"../orbit/context.tsx\";\nimport { CloseIcon } from \"../ui/icons.tsx\";\nimport { SectionPanel } from \"../ui/Panel.tsx\";\nimport { Typeahead } from \"../ui/Typeahead.tsx\";\nimport type { CardActions, CardTicket } from \"./detail.ts\";\n\nconst labelColor = (color: string): CSSProperties => ({ \"--label-color\": color }) as CSSProperties;\n\nexport function LabelsPanel({ ticket, patch }: { ticket: CardTicket; patch: CardActions[\"patch\"] }) {\n const catalog = useBoardLabels();\n const [draft, setDraft] = useState(\"\");\n const names = ticket.labels.map((label) => label.name);\n const candidates = catalog.filter((label) => !names.includes(label.name));\n\n const add = (): void => {\n const name = draft.trim();\n if (!name) return;\n setDraft(\"\");\n if (names.includes(name)) return;\n void patch({ labels: [...names, name] });\n };\n\n return (\n <SectionPanel section=\"labels\" title=\"Labels\">\n <div className=\"settings-row\">\n <div className=\"label-pills-row\" data-other-labels=\"\">\n {ticket.labels.map((label) => (\n <span key={label.id} className=\"label-pill-removable\" style={labelColor(label.color)}>\n {label.name}\n <button type=\"button\" className=\"label-pill-remove\" data-remove-label={label.name} title=\"Remove label\" aria-label=\"Remove label\" onClick={() => void patch({ labels: names.filter((n) => n !== label.name) })}>\n <CloseIcon />\n </button>\n </span>\n ))}\n </div>\n <div className=\"label-add-row\">\n <div className=\"label-add-input-wrap\">\n <Typeahead\n className=\"label-add-input meta-inline-input\"\n data-label-input=\"\"\n autoComplete=\"off\"\n placeholder=\"Add label…\"\n aria-label=\"Add label\"\n value={draft}\n onChange={setDraft}\n items={candidates}\n match={(label, query) => label.name.toLowerCase().includes(query)}\n renderItem={(label) => (\n <span className=\"search-hit-main\">\n <span className=\"typeahead-swatch\" style={labelColor(label.color || \"var(--muted)\")} />\n <strong>{label.name}</strong>\n </span>\n )}\n valueOf={(label) => label.name}\n keyOf={(label) => label.id}\n emptyText=\"No matching labels\"\n onKeyDown={(event) => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n add();\n }}\n />\n </div>\n <button type=\"button\" className=\"meta-add-btn detail-action-btn\" data-variant=\"ghost\" data-label-add=\"\" onClick={add}>\n Add\n </button>\n </div>\n </div>\n </SectionPanel>\n );\n}\n","/**\n * The small rules every use case shares for what people and agents send:\n * names on one line, slugs, priorities and types read the way the API has\n * always read them, each refusal with its error code.\n */\n\nimport { OrbitError } from \"./errors.ts\";\nimport type { ErrorCode } from \"./errors.ts\";\nimport type { EntryType, LaneRole, Priority, TicketType } from \"./model.ts\";\n\n/**\n * What a field holds as text: a string as it is, a number or boolean written\n * out, anything else (an object, null, nothing) as \"\". Input is never\n * stringified as \"[object Object]\".\n */\nexport function asText(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") return String(value);\n return \"\";\n}\n\n/** A board slug: lowercase letters, digits and single dashes, at most 80 characters. */\nexport function slugify(value: unknown): string {\n return String(value)\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80);\n}\n\n/** True for a slug slugify leaves as it is. */\nexport function isSlug(value: unknown): value is string {\n return typeof value === \"string\" && value !== \"\" && slugify(value) === value;\n}\n\n/** A name as one clean line: line breaks and control characters become spaces. */\nexport function cleanName(value: unknown): string {\n return asText(value ?? \"\")\n \n .replace(/[\\u0000-\\u001f\\u007f-\\u009f\\u2028\\u2029]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\n/** A string with something in it, trimmed; otherwise `missing_<field>`. */\nexport function requiredString(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim() === \"\") throw new OrbitError(`missing_${field}` as ErrorCode);\n return value.trim();\n}\n\n/** A lane's name: required, and one clean line. */\nexport function laneNameOf(value: unknown): string {\n const name = cleanName(requiredString(value, \"name\"));\n if (!name) throw new OrbitError(\"missing_name\");\n return name;\n}\n\n/** 0 to 4, rounded; anything unreadable is med (2). */\nexport function normalizePriority(value: unknown): Priority {\n const number = Number(value ?? 2);\n if (!Number.isFinite(number)) return 2;\n return Math.max(0, Math.min(4, Math.round(number))) as Priority;\n}\n\nconst TICKET_TYPES: readonly TicketType[] = [\"epic\", \"feature\", \"task\", \"bug\"];\n\nexport function normalizeTicketType(value: unknown): TicketType {\n const type = asText(value || \"task\").toLowerCase().trim();\n if (!(TICKET_TYPES as readonly string[]).includes(type)) throw new OrbitError(\"invalid_ticket_type\");\n return type as TicketType;\n}\n\nexport function normalizeEntryType(value: unknown): EntryType {\n const type = asText(value || \"\").toLowerCase().trim();\n if (type !== \"decision\" && type !== \"lesson\") throw new OrbitError(\"invalid_project_entry_type\");\n return type;\n}\n\nconst ROLES: readonly LaneRole[] = [\"ai_ready\", \"in_progress\", \"review\", \"done\"];\n\n/** A lane's role in the agent flow, or null for none. */\nexport function normalizeStateRole(value: unknown): LaneRole | null {\n if (value === null || value === undefined || value === \"\") return null;\n const role = asText(value).toLowerCase().trim();\n if (!(ROLES as readonly string[]).includes(role)) throw new OrbitError(\"invalid_state_role\");\n return role as LaneRole;\n}\n\n/** `existing`, then a blank line, then `note`; just `existing` when the note is empty. */\nexport function appendNote(existing: string, note: unknown): string {\n const text = asText(note ?? \"\").trim();\n if (!text) return existing;\n return [existing.trim(), text].filter(Boolean).join(\"\\n\\n\");\n}\n\n/** At most `max` characters; `max` 0 means no cap. */\nexport function cap(value: unknown, max: number): string {\n const text = asText(value ?? \"\");\n return max && text.length > max ? text.slice(0, max) : text;\n}\n\n/** A whole number above zero, else `fallback`. */\nexport function positiveInt(value: unknown, fallback: number): number {\n const n = Number(value);\n return Number.isInteger(n) && n > 0 ? n : fallback;\n}\n\n/** A whole number from zero, else `fallback`. */\nexport function nonNegativeInt(value: unknown, fallback: number): number {\n const n = Number(value);\n return Number.isInteger(n) && n >= 0 ? n : fallback;\n}\n\n/** An optional string field, trimmed; \"\" when absent. */\nexport function optionalString(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n return asText(value).trim();\n}\n\n/** A field that is a string when given, else \"\" (the API's `body.x || \"\"`). */\nexport function textOr(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" && value !== \"\" ? value : value === undefined || value === null || value === \"\" ? fallback : asText(value);\n}\n","/**\n * A card's optional link to a Nebula file or folder. Orbit keeps the address\n * people paste when it is a plain web link: http or https, no user name or\n * password, no spaces or control characters, at most 2,048 characters. Any\n * host is allowed, since a Nebula can live on your own server or tailnet as\n * well as at nebula.starscape.app. An empty value clears the link.\n *\n * The web app imports it from here (web/src/card/).\n */\n\nimport { OrbitError } from \"./errors.ts\";\nimport { asText } from \"./text.ts\";\n\nexport const NEBULA_URL_MAX = 2048;\n\n/** The normalized link, \"\" for none, or null when Orbit wouldn't keep it. */\nexport function parseNebulaUrl(value: unknown): string | null {\n const text = asText(value ?? \"\").trim();\n if (!text) return \"\";\n \n if (text.length > NEBULA_URL_MAX || /[\\s\\u0000-\\u001f\\u007f]/.test(text)) return null;\n let url: URL;\n try {\n url = new URL(text);\n } catch {\n return null;\n }\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") return null;\n if (url.username || url.password || !url.hostname) return null;\n return url.href.length > NEBULA_URL_MAX ? null : url.href;\n}\n\n/** The link to store (\"\" clears it), or `invalid_nebula_url`. */\nexport function normalizeNebulaUrl(value: unknown): string {\n const kept = parseNebulaUrl(value);\n if (kept === null) throw new OrbitError(\"invalid_nebula_url\");\n return kept;\n}\n","// The words a card shows for its Nebula link. Whether a link is kept at all\n// is the core's rule (parseNebulaUrl in src/core/nebula-link.ts); this only\n// names where a kept link goes.\n\nfunction decoded(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n\n/**\n * Nebula's addresses are `/p/<project>/<path>` (also under `/app`), so the\n * last two parts of the path name the file and its folder (\"Guides /\n * Observing plan.md\"); a project alone, or any other address, shows where it\n * goes.\n */\nexport function nebulaLinkLabel(href: string): string {\n let url: URL;\n try {\n url = new URL(href);\n } catch {\n return href;\n }\n const segments = url.pathname.split(\"/\").filter(Boolean);\n const at = segments[0] === \"p\" ? 0 : segments[0] === \"app\" && segments[1] === \"p\" ? 1 : -1;\n if (at !== -1 && segments.length > at + 1) {\n const parts = segments.slice(at + 2).map(decoded);\n return parts.length ? parts.slice(-2).join(\" / \") : \"A Nebula project\";\n }\n const last = segments.length ? decoded(segments[segments.length - 1] ?? \"\") : \"\";\n return last ? `${url.host} / ${last}` : url.host;\n}\n","// A card's link to a Nebula file or folder. It opens in a new tab, so jumping\n// to Nebula never loses the board. The link is added or changed in a small\n// form in its place; a link Orbit wouldn't keep is refused in words, and\n// removing one offers Undo.\n\nimport { useLayoutEffect, useRef, useState } from \"react\";\nimport type { SubmitEvent, KeyboardEvent } from \"react\";\nimport { parseNebulaUrl } from \"../../../src/core/nebula-link.ts\";\nimport { CloseIcon } from \"../ui/icons.tsx\";\nimport { toast } from \"../ui/toast.ts\";\nimport type { CardActions } from \"./detail.ts\";\nimport { nebulaLinkLabel } from \"./nebula-label.ts\";\n\nconst NEBULA_LINK_HELP = \"Paste a web link to a Nebula file or folder. It starts with https://\";\n\ninterface Editing {\n draft: string;\n invalid: boolean;\n}\n\nexport function NebulaLink({ nebulaUrl, patch }: { nebulaUrl: string; patch: CardActions[\"patch\"] }) {\n const href = parseNebulaUrl(nebulaUrl) || \"\";\n const [editing, setEditing] = useState<Editing | null>(null);\n const host = useRef<HTMLDivElement>(null);\n // Focus goes to the field once when the form opens, and back to the row's button once it closes.\n const focusField = useRef(false);\n const focusRow = useRef(false);\n\n useLayoutEffect(() => {\n if (editing || !focusRow.current) return;\n focusRow.current = false;\n host.current?.querySelector<HTMLElement>('[data-nebula-action=\"edit\"]')?.focus();\n }, [editing]);\n\n const startEdit = (): void => {\n focusField.current = true;\n setEditing({ draft: href, invalid: false });\n };\n const leave = (): void => {\n focusRow.current = true;\n setEditing(null);\n };\n const placeField = (el: HTMLInputElement | null): void => {\n if (!el || !focusField.current) return;\n focusField.current = false;\n el.focus();\n el.select();\n };\n\n const save = (value: string): Promise<boolean> => patch({ nebula_url: value });\n\n const submit = async (event: SubmitEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault();\n if (!editing) return;\n const kept = parseNebulaUrl(editing.draft);\n if (kept === null) {\n setEditing({ ...editing, invalid: true });\n event.currentTarget.querySelector(\"input\")?.focus();\n return;\n }\n if (kept !== href) await save(kept);\n // Saved or refused (a refusal is said in a toast), the row comes back.\n leave();\n };\n\n const remove = async (): Promise<void> => {\n const was = href;\n if (await save(\"\")) toast.info(\"Nebula link removed.\", { duration: 6000, action: { label: \"Undo\", onClick: () => void save(was) } });\n };\n\n const keyDown = (event: KeyboardEvent<HTMLInputElement>): void => {\n if (event.key !== \"Escape\") return;\n // Escape leaves the form only, not the drawer around it.\n event.preventDefault();\n event.stopPropagation();\n leave();\n };\n\n return (\n <div ref={host} className={`nebula-link${editing ? \" is-editing\" : \"\"}`} data-nebula-link=\"\">\n {editing ? (\n <form className=\"nebula-link-form\" noValidate onSubmit={(event) => void submit(event)}>\n <span className=\"nebula-glyph\" aria-hidden=\"true\" />\n <input\n ref={placeField}\n type=\"url\"\n inputMode=\"url\"\n autoComplete=\"off\"\n spellCheck={false}\n className=\"nebula-link-input meta-inline-input\"\n placeholder=\"https://nebula.starscape.app/app/p/...\"\n aria-label=\"Link to a Nebula file or folder\"\n aria-describedby=\"nebulaLinkError\"\n aria-invalid={editing.invalid ? \"true\" : undefined}\n value={editing.draft}\n onChange={(event) => setEditing({ draft: event.currentTarget.value, invalid: false })}\n onKeyDown={keyDown}\n />\n <button type=\"submit\" className=\"detail-action-btn nebula-link-save\">\n Save\n </button>\n <button type=\"button\" className=\"detail-action-btn\" data-variant=\"ghost\" data-nebula-action=\"cancel\" onClick={leave}>\n Cancel\n </button>\n <p className=\"nebula-link-error\" id=\"nebulaLinkError\" hidden={!editing.invalid}>\n {editing.invalid ? NEBULA_LINK_HELP : \"\"}\n </p>\n </form>\n ) : href ? (\n <>\n <a className=\"nebula-link-open\" href={href} target=\"_blank\" rel=\"noopener noreferrer\" title={href}>\n <span className=\"nebula-glyph\" aria-hidden=\"true\" />\n <span className=\"nebula-link-text\">\n <span className=\"nebula-link-label\">{nebulaLinkLabel(href)}</span>{\" \"}\n <span className=\"nebula-link-meta\">Open in Nebula, in a new tab</span>\n </span>\n <svg className=\"nebula-link-out\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M8 16L16 8M10 8h6v6\" />\n </svg>\n </a>\n <button type=\"button\" className=\"nebula-link-action\" data-variant=\"ghost\" data-nebula-action=\"edit\" title=\"Change the Nebula link\" aria-label=\"Change the Nebula link\" onClick={startEdit}>\n Change\n </button>\n <button\n type=\"button\"\n className=\"nebula-link-action nebula-link-remove\"\n data-variant=\"ghost\"\n data-nebula-action=\"remove\"\n title=\"Remove the Nebula link\"\n aria-label=\"Remove the Nebula link\"\n onClick={() => void remove()}\n >\n <CloseIcon />\n </button>\n </>\n ) : (\n <button type=\"button\" className=\"nebula-link-add\" data-variant=\"ghost\" data-nebula-action=\"edit\" onClick={startEdit}>\n <span className=\"nebula-glyph\" aria-hidden=\"true\" />\n <span>Link a Nebula file or folder</span>\n </button>\n )}\n </div>\n );\n}\n","// Human-facing actor labels for ticket activity. The storage layer keeps\n// compact/internal identifiers such as \"local\" and \"local-agent\"; the drawer\n// should translate those into labels that explain who acted without exposing\n// implementation details or blaming agent actions on the current user.\n\nconst INTERNAL_LOCAL_NAMES = new Set([\"local\", \"local-owner\", \"owner\"]);\nconst GENERIC_AGENT_NAMES = new Set([\"agent\", \"local-agent\", \"orbit-agent\"]);\nconst AGENT_COMMENT_KINDS = new Set([\"agent_note\", \"checkpoint\", \"completion\"]);\n\nfunction clean(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction humanizeIdentifier(value: unknown): string {\n const raw = clean(value);\n if (!raw) return \"\";\n return raw\n .replace(/^@+/, \"\")\n .replace(/[-_]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nfunction agentNameFrom({ actor, actorId }: { actor?: unknown; actorId?: unknown } = {}): string {\n const name = clean(actor);\n const id = clean(actorId);\n const lowerName = name.toLowerCase();\n const lowerId = id.toLowerCase();\n\n if (name && !INTERNAL_LOCAL_NAMES.has(lowerName) && !GENERIC_AGENT_NAMES.has(lowerName)) {\n return humanizeIdentifier(name);\n }\n if (id && !INTERNAL_LOCAL_NAMES.has(lowerId) && !GENERIC_AGENT_NAMES.has(lowerId)) {\n return humanizeIdentifier(id);\n }\n return \"\";\n}\n\nexport function formatActorLabel({ actor, actorType, actorId }: { actor?: unknown; actorType?: unknown; actorId?: unknown } = {}): string {\n const type = clean(actorType).toLowerCase();\n const name = clean(actor);\n const lowerName = name.toLowerCase();\n\n if (type === \"agent\") {\n const agentName = agentNameFrom({ actor: name, actorId });\n return agentName ? `Agent · ${agentName}` : \"Agent\";\n }\n\n if (!name || INTERNAL_LOCAL_NAMES.has(lowerName)) return \"You\";\n return humanizeIdentifier(name);\n}\n\nexport function formatCommentAuthor(comment: { kind?: unknown; author?: unknown } = {}): string {\n const kind = clean(comment.kind).toLowerCase();\n const author = clean(comment.author);\n const isAgentKind = AGENT_COMMENT_KINDS.has(kind) || (kind && kind !== \"human_comment\");\n\n if (isAgentKind) {\n const agentName = agentNameFrom({ actor: author });\n return agentName ? `Agent · ${agentName}` : \"Agent\";\n }\n\n return formatActorLabel({ actor: author, actorType: \"human\" });\n}\n","// The card's record: its Status History (each move between lanes, who made\n// it and when) and its Comments, with the box that adds one. Agents' notes\n// can be kept out of what agents read (\"AI Ignore\") on a board with agents.\n\nimport { useState } from \"react\";\nimport type { SubmitEvent } from \"react\";\nimport type { Comment } from \"../../../src/core/model.ts\";\nimport type { HistoryEntry } from \"../../../src/core/tickets.ts\";\nimport { formatActorLabel, formatCommentAuthor } from \"../lib/actor-labels.ts\";\nimport { cleanText, formatDate } from \"../lib/format.ts\";\nimport { indentOnTab } from \"../lib/text-editing.ts\";\nimport { useOrbit } from \"../orbit/context.tsx\";\nimport { SectionPanel } from \"../ui/Panel.tsx\";\nimport { toast } from \"../ui/toast.ts\";\nimport { isRecord, text } from \"./detail.ts\";\nimport type { CardActions } from \"./detail.ts\";\n\nexport function StatusHistoryPanel({ history }: { history: HistoryEntry[] }) {\n return (\n <SectionPanel section=\"status-history\" title=\"Status History\">\n <div className=\"settings-row\">\n {history.length ? (\n history.map((event) => {\n const body = isRecord(event.body) ? event.body : {};\n const from = text(body.from) || \"?\";\n const to = text(body.to) || text(body.state) || text(body.next_state) || \"?\";\n // A take is always an agent's; its event names the agent's id as agent_id.\n const claimed = event.type === \"agent_claimed\";\n const by = formatActorLabel({ actor: event.actor, actorType: text(body.actor_type) || (claimed ? \"agent\" : \"human\"), actorId: claimed ? body.agent_id : body.actor_id });\n return (\n <div key={event.id} className=\"comment status-change\">\n <div className=\"comment-meta\">\n <span className=\"status-route\">{`${from} → ${to}`}</span>{\" \"}\n <span>{`${by} · ${formatDate(event.created_at)}`}</span>\n </div>\n </div>\n );\n })\n ) : (\n <p className=\"description\">No status changes yet.</p>\n )}\n </div>\n </SectionPanel>\n );\n}\n\nexport function CommentsPanel({ ticketId, comments, aiEnabled, refresh }: { ticketId: string; comments: Comment[]; aiEnabled: boolean; refresh: CardActions[\"refresh\"] }) {\n const app = useOrbit();\n // The comment being written: its own, so a live update to the card never touches it.\n const [draft, setDraft] = useState(\"\");\n\n const submit = async (event: SubmitEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault();\n const sent = draft;\n const body = cleanText(sent).trim();\n if (!body) return;\n try {\n await app.call(() => app.client.comments.create(ticketId, { body }, app.hint()));\n } catch {\n return;\n }\n // Words typed while it was sending stay.\n setDraft((now) => (now === sent ? \"\" : now));\n refresh();\n };\n\n const toggleAi = async (comment: Comment): Promise<void> => {\n const omit = !comment.omitted_for_ai;\n try {\n await app.call(() => app.client.comments.update(ticketId, comment.id, { omitted_for_ai: omit }, app.hint()));\n } catch {\n return;\n }\n toast.info(omit ? \"Comment omitted from AI context\" : \"Comment included in AI context\");\n refresh();\n };\n\n return (\n <SectionPanel section=\"comments\" title=\"Comments\">\n <div className=\"settings-row\">\n {comments.length ? comments.map((comment) => <CommentRow key={comment.id} comment={comment} aiEnabled={aiEnabled} onToggleAi={() => void toggleAi(comment)} />) : <p className=\"description\">No comments yet.</p>}\n <form className=\"comment-form\" id=\"detailCommentForm\" onSubmit={(event) => void submit(event)}>\n <textarea\n name=\"body\"\n placeholder=\"Add a comment, decision, or instruction...\"\n required\n value={draft}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={(event) => {\n indentOnTab(event, setDraft);\n }}\n />\n <button type=\"submit\" className=\"detail-action-btn\" data-variant=\"ghost\">\n Comment\n </button>\n </form>\n </div>\n </SectionPanel>\n );\n}\n\nfunction CommentRow({ comment, aiEnabled, onToggleAi }: { comment: Comment; aiEnabled: boolean; onToggleAi: () => void }) {\n const omitted = Boolean(comment.omitted_for_ai);\n const kind = comment.kind === \"human_comment\" ? \"\" : comment.kind.replace(/_/g, \" \");\n return (\n <div className={`comment ${comment.kind === \"checkpoint\" ? \"checkpoint\" : \"\"} ${aiEnabled && omitted ? \"is-ai-omitted\" : \"\"}`}>\n <div className=\"comment-head\">\n <div className=\"comment-head-main\">\n <div className=\"comment-head-title\">\n <strong>{formatCommentAuthor(comment)}</strong>{\" \"}\n {kind ? <span className=\"comment-kind-pill\">{kind}</span> : null}\n </div>\n </div>\n </div>\n <div className=\"comment-body preserved-text-body\">{cleanText(comment.body)}</div>\n <div className=\"comment-footer\">\n <span className=\"comment-footer-meta\">{formatDate(comment.created_at)}</span>{\" \"}\n {aiEnabled ? (\n <button\n type=\"button\"\n className=\"comment-ai-toggle detail-action-btn\"\n data-variant=\"ghost\"\n data-comment-action=\"toggle-ai-omission\"\n data-comment-id={comment.id}\n data-omitted-for-ai={omitted ? \"true\" : \"false\"}\n onClick={onToggleAi}\n >\n {omitted ? \"AI Include\" : \"AI Ignore\"}\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n","// A card's drawer: its title and lane, type and priority in the header, then\n// its description and Nebula link, and its panels (labels, family, images,\n// AI record, history, comments). The header's archive button archives it.\n//\n// The drawer reads the card's context, history, comments and images when it\n// opens and again whenever the board changes (a live update, or a write made\n// here). What someone is typing (a comment, an inline edit, a field) lives in\n// its own component's state, so a fresh read never touches it; elements keep\n// their keys, so focus stays where it was.\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { KeyboardEvent, MouseEvent } from \"react\";\nimport { DrawerShell } from \"../drawer/Drawer.tsx\";\nimport { canonicalTicketType, cleanText, formatDateDetail, priorityKeyFor, priorityLabel, stateClassFor, ticketLabel, typeLabelLong } from \"../lib/format.ts\";\nimport { markRead } from \"../lib/unread.ts\";\nimport { selectableStates, useBoard, useBoardStates, useCurrentBoard, useOrbit, useTicket } from \"../orbit/context.tsx\";\nimport { useInlineEdit } from \"../ui/InlineEdit.tsx\";\nimport { toast } from \"../ui/toast.ts\";\nimport { AiRecordPanel } from \"./AiRecordPanel.tsx\";\nimport { AttachmentsPanel } from \"./AttachmentsPanel.tsx\";\nimport { newerTicket, readDetail } from \"./detail.ts\";\nimport type { CardActions, CardTicket, Detail, TicketUpdate } from \"./detail.ts\";\nimport { EpicChildrenPanel, ParentEpicPanel, RelatedPanel } from \"./FamilyPanels.tsx\";\nimport { LabelsPanel } from \"./LabelsPanel.tsx\";\nimport { NebulaLink } from \"./NebulaLink.tsx\";\nimport { CommentsPanel, StatusHistoryPanel } from \"./RecordPanels.tsx\";\n\nexport function CardDetail({ ticketId }: { ticketId: string }) {\n const app = useOrbit();\n const data = useBoard((s) => s.data);\n const fromBoard = useTicket(ticketId);\n const [detail, setDetail] = useState<Detail | null>(null);\n // Bumped to read the drawer's parts again after a write that doesn't change the card itself.\n const [reads, setReads] = useState(0);\n const loaded = useRef(false);\n\n useEffect(() => {\n // The board comes first: until it's read, there's no board to ask about the card.\n if (!data) return;\n let current = true;\n app.call(() => readDetail(app, ticketId)).then(\n (next) => {\n if (!current) return;\n loaded.current = true;\n setDetail(next);\n // Open is read: the card's unread mark goes, on the board too.\n markRead(next.ticket.board_id, next.ticket.id, next.ticket.updated_at);\n },\n () => {\n // A card that can't be read at all (gone, or on no board here) closes; a failed re-read keeps what's shown.\n if (current && !loaded.current) void app.closeDrawer();\n }\n );\n return () => {\n current = false;\n };\n }, [app, ticketId, data, reads]);\n\n const ticket = newerTicket(fromBoard, detail?.ticket);\n\n const actions: CardActions = {\n patch: async (body: TicketUpdate) => {\n try {\n const view = await app.call(() => app.client.tickets.update(ticketId, body, app.hint()));\n // The board shows the change at once, and that reads the drawer again; an archived card isn't on the board.\n if (view.archived_at) setReads((n) => n + 1);\n else app.upsertTicket(view);\n return true;\n } catch {\n return false;\n }\n },\n refresh: () => setReads((n) => n + 1)\n };\n\n const archive = async (): Promise<void> => {\n const title = fromBoard?.title || ticket?.title || \"card\";\n try {\n await app.call(() => app.client.tickets.archive(ticketId, app.hint()));\n } catch {\n return;\n }\n toast.removed(`Archived: ${title}`);\n await app.load().catch(() => undefined);\n await app.navigate({ view: \"board\" });\n };\n\n return (\n <DrawerShell\n titleBlock={\n ticket ? (\n <>\n <CardTitle ticket={ticket} patch={actions.patch} />\n <div className=\"drawer-subtitle\">\n <span className=\"ticket-number\">{ticketLabel(ticket)}</span>{\" \"}\n <CardMeta ticket={ticket} patch={actions.patch} />\n </div>\n </>\n ) : null\n }\n onArchive={() => void archive()}\n >\n {ticket && detail ? <CardBody ticket={ticket} detail={detail} actions={actions} /> : null}\n </DrawerShell>\n );\n}\n\n/** The title, edited in place on a click, Enter or Space. */\nfunction CardTitle({ ticket, patch }: { ticket: CardTicket; patch: CardActions[\"patch\"] }) {\n const edit = useInlineEdit({\n value: ticket.title || \"\",\n fieldName: \"title\",\n multiline: false,\n ariaLabel: \"Edit ticket title\",\n emptyMessage: \"Title cannot be empty\",\n onCommit: async (next) => {\n await patch({ title: next });\n }\n });\n if (edit.editor) return edit.editor;\n if (!ticket.title.trim()) return null;\n return (\n <h2\n className=\"drawer-title drawer-title-text editable-field\"\n data-edit-field=\"title\"\n role=\"button\"\n tabIndex={0}\n title=\"Click or press Enter to edit ticket title\"\n aria-label=\"Edit ticket title\"\n onClick={edit.start}\n onKeyDown={(event: KeyboardEvent<HTMLElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n edit.start(event);\n }}\n >\n {ticket.title}\n </h2>\n );\n}\n\n// The type menu runs from the biggest to the smallest: Epic, Feature, Task, Bug.\nconst TYPES = [\"epic\", \"feature\", \"task\", \"bug\"] as const;\nconst PRIORITIES = [4, 3, 2, 1, 0] as const;\n\n/** The lane, type and priority menus under the title. */\nfunction CardMeta({ ticket, patch }: { ticket: CardTicket; patch: CardActions[\"patch\"] }) {\n const board = useCurrentBoard();\n const lanes = selectableStates(useBoardStates(), board, ticket.state_id);\n // A choice shows at once while it saves; the card's own value takes over once it's saved or refused.\n const [stateChoice, setStateChoice] = useState<string | null>(null);\n const [typeChoice, setTypeChoice] = useState<string | null>(null);\n const [priorityChoice, setPriorityChoice] = useState<string | null>(null);\n const choose = (show: (value: string | null) => void, value: string, body: TicketUpdate): void => {\n show(value);\n void patch(body).then(() => show(null));\n };\n const stateId = stateChoice ?? ticket.state_id;\n const type = canonicalTicketType(typeChoice ?? ticket.type);\n const priority = Number(priorityChoice ?? ticket.priority);\n return (\n <div className=\"detail-meta-badge-row\" aria-label=\"Ticket metadata controls\">\n <select\n className=\"detail-meta-badge detail-state-badge meta-select\"\n data-variant={stateClassFor(lanes.find((s) => s.id === stateId))}\n data-meta-field=\"state_id\"\n aria-label=\"Ticket state\"\n value={stateId}\n onChange={(event) => choose(setStateChoice, event.currentTarget.value, { state_id: event.currentTarget.value })}\n >\n {lanes.map((s) => (\n <option key={s.id} value={s.id}>\n {s.name}\n </option>\n ))}\n </select>\n <select\n className={`detail-meta-badge detail-type-badge type-pill-${type} meta-select`}\n data-meta-field=\"type\"\n aria-label=\"Ticket type\"\n value={type}\n onChange={(event) => choose(setTypeChoice, event.currentTarget.value, { type: event.currentTarget.value })}\n >\n {TYPES.map((value) => (\n <option key={value} value={value}>\n {typeLabelLong(value)}\n </option>\n ))}\n </select>\n <select\n className=\"detail-meta-badge detail-priority-badge priority-pill meta-select\"\n data-variant={priorityKeyFor(priority)}\n data-meta-field=\"priority\"\n aria-label=\"Ticket priority\"\n value={String(priority)}\n onChange={(event) => choose(setPriorityChoice, event.currentTarget.value, { priority: Number(event.currentTarget.value) })}\n >\n {PRIORITIES.map((p) => (\n <option key={p} value={String(p)}>\n {priorityLabel(p)}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\n/** The description, the Nebula link, and the panels. */\nfunction CardBody({ ticket, detail, actions }: { ticket: CardTicket; detail: Detail; actions: CardActions }) {\n const board = useCurrentBoard();\n const isEpic = canonicalTicketType(ticket.type) === \"epic\";\n const aiEnabled = board?.ai_enabled !== 0;\n return (\n <>\n <div className=\"detail-head\">\n <Description ticket={ticket} patch={actions.patch} />\n <NebulaLink nebulaUrl={ticket.nebula_url || \"\"} patch={actions.patch} />\n </div>\n\n <div className=\"settings-stack detail-section-stack\">\n <LabelsPanel ticket={ticket} patch={actions.patch} />\n {isEpic ? <EpicChildrenPanel ticket={ticket} cards={detail.children} refresh={actions.refresh} /> : null}\n <AttachmentsPanel ticketId={ticket.id} attachments={detail.attachments} refresh={actions.refresh} />\n {isEpic ? null : <ParentEpicPanel ticket={ticket} parent={detail.parent} refresh={actions.refresh} />}\n <RelatedPanel ticket={ticket} relations={detail.relations} crossBoard={detail.crossBoard} refresh={actions.refresh} />\n {aiEnabled ? <AiRecordPanel ticket={ticket} patch={actions.patch} /> : null}\n <StatusHistoryPanel history={detail.history} />\n <CommentsPanel ticketId={ticket.id} comments={detail.comments} aiEnabled={aiEnabled} refresh={actions.refresh} />\n </div>\n </>\n );\n}\n\n/**\n * When the card last changed, then its description: plain text a screen\n * reader reads as it is, edited in place from a click or Enter on the box\n * (Cmd or Ctrl+Enter saves, Escape cancels). Leaving the editor from the\n * keyboard puts focus back on the box.\n */\nfunction Description({ ticket, patch }: { ticket: CardTicket; patch: CardActions[\"patch\"] }) {\n const description = ticket.description;\n const body = useRef<HTMLDivElement>(null);\n const refocus = useRef(false);\n const edit = useInlineEdit({\n value: description,\n fieldName: \"description\",\n multiline: true,\n ariaLabel: \"Edit ticket description\",\n onCommit: async (next) => {\n await patch({ description: cleanText(next) });\n },\n onEditingChange: (editing) => {\n // Escape or Cmd+Enter leave with focus still in the editor; a blur has already moved it.\n if (!editing) refocus.current = document.activeElement?.getAttribute(\"data-editing-field\") === \"description\";\n }\n });\n useEffect(() => {\n if (edit.editing || !refocus.current) return;\n refocus.current = false;\n body.current?.focus({ preventScroll: true });\n }, [edit.editing]);\n return (\n <>\n <div className={edit.editing ? \"detail-description-bar is-editing\" : \"detail-description-bar\"}>\n <p className=\"detail-updated\" title=\"Last saved change\">\n Updated {formatDateDetail(ticket.updated_at)}\n </p>\n </div>\n {edit.editor ?? (\n <div\n ref={body}\n className={description ? \"description preserved-text-body editable-field detail-description-body\" : \"description editable-field detail-description-body is-placeholder\"}\n data-edit-field=\"description\"\n tabIndex={0}\n role=\"button\"\n aria-label=\"Edit ticket description\"\n title=\"Click to edit\"\n onClick={(event: MouseEvent<HTMLElement>) => {\n event.preventDefault();\n edit.start(event);\n }}\n onKeyDown={(event: KeyboardEvent<HTMLElement>) => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n edit.start(event);\n }}\n >\n {description ? cleanText(description) : \"Add a description\"}\n </div>\n )}\n </>\n );\n}\n"],"mappings":"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"}