@bud.sh/app 0.5.0 → 0.6.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 (115) hide show
  1. package/README.md +41 -31
  2. package/dist/client/assets/bud/design.js +1 -1
  3. package/dist/client/assets/canvas-Bih9EdKJ.js +1 -0
  4. package/dist/client/assets/difference-worker-Bzg-rizy.js +8 -0
  5. package/dist/client/assets/dist-CdE5wBkg.js +5 -0
  6. package/dist/client/assets/files-1dLuoM2f.js +1 -0
  7. package/dist/client/assets/i18n-CkO6VFI0.js +1 -0
  8. package/dist/client/assets/index-Cn2mxroU.css +2 -0
  9. package/dist/client/assets/{index-ChANGtl-.js → index-DtISWZp9.js} +2 -2
  10. package/dist/client/assets/pages-BJ-tNJ4J.js +1 -0
  11. package/dist/client/assets/{project-branches-DO897zM6.js → project-branches-Ce3rXrkc.js} +1 -1
  12. package/dist/client/assets/project-comments-CPUONfs8.js +1 -0
  13. package/dist/client/assets/project-thread-links-C-TGkq59.js +1 -0
  14. package/dist/client/assets/{project-threads-Lay351p4.js → project-threads-Bv7IDBgi.js} +105 -105
  15. package/dist/client/assets/project-work-DAE9-olg.js +1 -0
  16. package/dist/client/assets/{task-design-Avb2RO4w.js → task-design-CwySIAOl.js} +3 -3
  17. package/dist/client/assets/tasks-KWsCLi_h.js +3 -0
  18. package/dist/client/assets/wasm-inline-DSUyFn1L.js +1 -0
  19. package/dist/client/assets/workspace-CVdcfaaB.js +2 -0
  20. package/dist/client/index.html +3 -3
  21. package/dist/hosted/assets/{canvas-V36732ER.js → canvas-AII16n9i.js} +97 -6
  22. package/dist/hosted/assets/{comment-data-CF2ZV_3k.js → comment-data-BXfMElfx.js} +2004 -402
  23. package/dist/hosted/assets/dist-BCSTeNf4.js +4785 -0
  24. package/dist/hosted/assets/{files-DjSCjfU7.js → files-D_1yeAVO.js} +10 -5
  25. package/dist/hosted/assets/{pages-BzjzeuPu.js → pages-CN_SbKWA.js} +3 -3
  26. package/dist/hosted/assets/{project-branches-BT97J9i7.js → project-branches-Bxp0DCwg.js} +1 -1
  27. package/dist/hosted/assets/{project-thread-links-BRLgByEe.js → project-thread-links-KqQoKBLE.js} +76 -4
  28. package/dist/{node-host/assets/screen-CZXWJEds.js → hosted/assets/screen-DpAcDUKR.js} +29 -1
  29. package/dist/hosted/assets/tasks-D66LlwxM.js +1423 -0
  30. package/dist/hosted/assets/wasm-inline-Dl9tqabx.js +4 -0
  31. package/dist/hosted/hosted.js +7885 -6219
  32. package/dist/node/assets/Stream-CAm1eJ2n.js +16604 -0
  33. package/dist/{server/assets/bridge-B_Blt55E.js → node/assets/bridge-DQSBYHmw.js} +124 -290
  34. package/dist/node/assets/config-9_jWwNBh.js +1067 -0
  35. package/dist/node/assets/load-config.server-CMVtRVmO.js +261 -0
  36. package/dist/node/assets/module-3GgtT4Xs.js +308 -0
  37. package/dist/node/assets/server-DTQFuoX2.js +846 -0
  38. package/dist/node/assets/src-D-kG1GxB.js +2 -0
  39. package/dist/node/assets/{src-CerrKjID.js → src-Dwe9APUx.js} +93 -3
  40. package/dist/node/assets/src-DysjfbM8.js +8592 -0
  41. package/dist/node/bridge.js +1 -845
  42. package/dist/node/cli.js +206 -0
  43. package/dist/node/design.js +811 -13
  44. package/dist/node/index.js +2 -739
  45. package/dist/node/plugins.js +5711 -0
  46. package/dist/node/server.js +1 -6746
  47. package/dist/node/vite.js +121 -0
  48. package/dist/{server/assets/canvas-Dc1mYCwQ.js → node-host/assets/canvas-BeDoufy1.js} +97 -7
  49. package/dist/node-host/assets/{comment-data-DyIZNpfG.js → comment-data-DE2T9yTj.js} +1980 -376
  50. package/dist/node-host/assets/dist-BCSTeNf4.js +4785 -0
  51. package/dist/node-host/assets/{files-Dh2TiQZq.js → files-Dl-PTS09.js} +11 -6
  52. package/dist/node-host/assets/{pages-BxpjbYhs.js → pages-DL2sk6_U.js} +3 -3
  53. package/dist/node-host/assets/{project-branches-B7HUGiVK.js → project-branches-DGp5ELct.js} +1 -1
  54. package/dist/{server/assets/project-thread-links-CBOpf6zk.js → node-host/assets/project-thread-links-CgBV3Jcm.js} +76 -5
  55. package/dist/{hosted/assets/screen-CKp2C7kx.js → node-host/assets/screen-B55yyVfb.js} +29 -1
  56. package/dist/node-host/assets/tasks-DZRNkoxe.js +1425 -0
  57. package/dist/node-host/assets/wasm-inline-Dl9tqabx.js +4 -0
  58. package/dist/node-host/node-host.js +6127 -4438
  59. package/dist/server/assets/{branch-previews-ClkoJ0lM.js → branch-previews-DedrpnVR.js} +1555 -673
  60. package/dist/{node-host/assets/canvas-TRUfxfL5.js → server/assets/canvas-CJWQ-jjv.js} +98 -6
  61. package/dist/server/assets/{comment-data-CsjukwAW.js → comment-data-Rg42ToTW.js} +1666 -47
  62. package/dist/server/assets/dist-BCSTeNf4.js +4785 -0
  63. package/dist/server/assets/{events-iHpLGr3k.js → events-BH_rAu7O.js} +155 -20
  64. package/dist/server/assets/{files-E9mSFeoc.js → files-CPJqKeMo.js} +12 -7
  65. package/dist/server/assets/{listener-DN5TyOjJ.js → listener-D61O6PzF.js} +708 -12
  66. package/dist/server/assets/{pages-BBBXyJWV.js → pages-KJY_Ba92.js} +4 -4
  67. package/dist/server/assets/{project-branches-B0YIK6Ur.js → project-branches-qG9ACZvo.js} +2 -2
  68. package/dist/{node-host/assets/project-thread-links-CauJF0Cz.js → server/assets/project-thread-links-CqK0lqCF.js} +77 -4
  69. package/dist/{node-host/assets/tasks-request-ZWmbc8fE.js → server/assets/project-work-DoIwxWMm.js} +87 -2
  70. package/dist/server/assets/run-BJ8r5jSh.js +572 -0
  71. package/dist/server/assets/{screen-BIQA2mr4.js → screen-CBrHPFug.js} +30 -2
  72. package/dist/server/assets/{server-DxK-UB_Z.js → server-Dkbp5stG.js} +1521 -793
  73. package/dist/server/assets/{services-BRrgXYlT.js → services-BTfig8A8.js} +234 -997
  74. package/dist/server/assets/tasks-Bgu5Lg9Y.js +1427 -0
  75. package/dist/server/assets/wasm-inline-Dl9tqabx.js +4 -0
  76. package/dist/server/capture.js +1 -2
  77. package/dist/server/migration.js +569 -12
  78. package/dist/server/runtime.js +7 -5
  79. package/dist/server/server.js +3 -3
  80. package/dist/types/assets/{config-DIC2cf_S.d.ts → config-CvcYmE2s.d.ts} +188 -50
  81. package/dist/types/assets/{contract-CAT-XFNq.d.ts → contract-B7yuuqSn.d.ts} +44 -2
  82. package/dist/types/assets/{items-CaVkByHk.d.ts → items-BQdaVksf.d.ts} +12 -1
  83. package/dist/types/assets/memory-state-BBW-FAVA.d.ts +236 -0
  84. package/dist/types/assets/picker-Be5Gx4WR.d.ts +9 -0
  85. package/dist/types/assets/{task-design-xJOhRNWh.d.ts → task-design-BDHKFHpp.d.ts} +3 -1
  86. package/dist/types/bridge.d.ts +1 -1
  87. package/dist/types/companion.d.ts +3 -3
  88. package/dist/types/design.d.ts +2 -2
  89. package/dist/types/hosted.d.ts +3 -3
  90. package/dist/types/index.d.ts +2 -2
  91. package/dist/types/node-host.d.ts +2 -2
  92. package/dist/types/plugins.d.ts +445 -0
  93. package/dist/types/screen.d.ts +2 -2
  94. package/dist/types/server.d.ts +2 -228
  95. package/dist/types/vite.d.ts +16 -0
  96. package/package.json +19 -3
  97. package/dist/client/assets/canvas-Cu6R6xxT.js +0 -1
  98. package/dist/client/assets/difference-worker-jfTSn-Tw.js +0 -8
  99. package/dist/client/assets/files-js6ElfkU.js +0 -1
  100. package/dist/client/assets/i18n-DxqFr2mi.js +0 -1
  101. package/dist/client/assets/index-CFFxP0gS.css +0 -2
  102. package/dist/client/assets/pages-6_lhiQmz.js +0 -1
  103. package/dist/client/assets/project-comments-DFFKVpia.js +0 -1
  104. package/dist/client/assets/project-thread-links-NLFWQRD2.js +0 -1
  105. package/dist/client/assets/project-work-du0Y-L5Y.js +0 -1
  106. package/dist/client/assets/tasks-CA-E8bbK.js +0 -1
  107. package/dist/client/assets/tasks-request-C55IeuiP.js +0 -1
  108. package/dist/client/assets/workspace-Cw5HvX5d.js +0 -2
  109. package/dist/hosted/assets/tasks-Dj7AyBJB.js +0 -649
  110. package/dist/hosted/assets/tasks-request-DZob623r.js +0 -113
  111. package/dist/node-host/assets/tasks-Bs1IOpeU.js +0 -651
  112. package/dist/server/assets/project-work-qSKFO5yj.js +0 -88
  113. package/dist/server/assets/tasks-CiXodsLN.js +0 -652
  114. package/dist/server/assets/tasks-request-DhwCzpRi.js +0 -115
  115. package/dist/types/assets/picker-D1Bw3ndx.d.ts +0 -14
@@ -1,5 +1,5 @@
1
1
  import { A as Registry$1, C as getFiletypeFromFileName, D as EncodedTokenMetadata, E as queueRender, N as __exportAll$1, O as FontStyle, T as dequeueRender, a as isSafari, b as getLineAnnotationName, g as isFullyTransparent, j as Theme, k as INITIAL, m as hoverWouldEraseText, n as cloneHunks, o as getLineAnnotationSource, r as isFirefox, t as cloneFileDiffMetadata, u as linesFromFileContents, w as isGutterUtilityPath } from "./cloneFileDiffMetadata-B-xwytg8.js";
2
- import { $ as cleanLastNewline, An as WorkSchemaSchema, Bn as Icon$1, Bt as FileDocumentSchema, Dt as parseReviewRevision, F as parseThreadId, Ft as parseFileSearchQuery, Ht as FileIndexSchema, J as resolveRegion, Mt as matchFileText, Nn as statusCategory, Nt as replacementEdits, O as ThreadCapabilitiesSchema, P as parseThreadFilter, Q as slideBlankBoundaryBlocksUp, T as parseThreadChange, U as resolveCodeAnchor, Vt as FileEntrySchema, X as diffWordsWithSpace, Xt as parseFilePath, Y as parseDiffFromFile, Z as diffChars, _ as taskRoutes, _n as parseWorkPatch, an as parseWorkWorkspace, bt as ReviewRepositorySchema, et as composeCacheKey, fn as parseWorkCreate, h as fileRoutes, hn as parseWorkItemRef, i as routes, in as parseElementAnchor, j as parseThread, jn as fieldByRole, k as ThreadSchema, m as conversationRoutes, n as parseLiveEvent, nt as getHunkSideStartBoundary, on as WorkConnectionSchema, pt as parseMutationIntent, q as normalizeDiffResolution, r as parseLiveId, rn as MAX_CANVAS_Y, sn as createWorkItemSchema, tt as getHunkSideEndBoundary, wn as valueByRole, z as parseThreadSnapshot, zt as orderFileEntries } from "./events-iHpLGr3k.js";
2
+ import { $ as composeCacheKey, An as fieldByRole, Bt as FileEntrySchema, Et as parseReviewRevision, H as resolveCodeAnchor, J as parseDiffFromFile, K as normalizeDiffResolution, Mn as statusCategory, Mt as replacementEdits, N as parseThreadFilter, O as ThreadCapabilitiesSchema, P as parseThreadId, Pt as parseFileSearchQuery, Q as cleanLastNewline, R as parseThreadSnapshot, Rt as orderFileEntries, Sn as valueByRole, T as parseThreadChange, Vt as FileIndexSchema, X as diffChars, Y as diffWordsWithSpace, Yt as parseFilePath, Z as slideBlankBoundaryBlocksUp, _ as taskRoutes, an as WorkConnectionSchema, dn as parseWorkCreate, et as getHunkSideEndBoundary, ft as parseMutationIntent, gn as parseWorkPatch, h as fileRoutes, i as routes, in as parseWorkWorkspace, j as parseThread, jt as matchFileText, k as ThreadSchema, kn as WorkSchemaSchema, m as conversationRoutes, mn as parseWorkItemRef, n as parseLiveEvent, nn as MAX_CANVAS_Y, on as createWorkItemSchema, q as resolveRegion, r as parseLiveId, rn as parseElementAnchor, tt as getHunkSideStartBoundary, yt as ReviewRepositorySchema, zn as Icon$1, zt as FileDocumentSchema } from "./events-BH_rAu7O.js";
3
3
  import { C as SPLIT_WITH_NEWLINES, T as UNSAFE_CSS_ATTRIBUTE, a as DEFAULT_CODE_VIEW_LAYOUT, b as HEADER_METADATA_SLOT_ID, c as DEFAULT_SMOOTH_SCROLL_SETTINGS, d as DEFAULT_VIRTUAL_FILE_METRICS, f as DIFFS_DEVELOPMENT_BUILD, g as EMPTY_RENDER_RANGE, h as DIFFS_TAG_NAME, i as DEFAULT_CODE_VIEW_FILE_METRICS, l as DEFAULT_THEMES, m as DIFFS_SCROLLBAR_MEASURE_ATTRIBUTE, n as CODE_VIEW_HEADER_ATTRIBUTE, o as DEFAULT_EXPANDED_REGION, p as DIFFS_SCROLLBAR_GUTTER_MEASURED_PROPERTY, r as CUSTOM_HEADER_SLOT_ID, s as DEFAULT_RENDER_RANGE, t as CODE_VIEW_FOOTER_ATTRIBUTE, u as DEFAULT_TOKENIZE_MAX_LENGTH, w as THEME_CSS_ATTRIBUTE, x as HEADER_PREFIX_SLOT_ID, y as HEADER_FILENAME_SUFFIX_SLOT_ID } from "./constants-C7Y3SJGj.js";
4
4
  import { a as PreviewIdSchema, i as PreviewHashSchema, o as PreviewSchema, s as PreviewThemeSchema } from "./parsers-CsiSkwTT.js";
5
5
  import { any, array, boolean, createSchema, fail, instanceof_, literal, nullable, number, object, parseSafe, string } from "remix/data-schema";
@@ -436,6 +436,34 @@ function HeadlessButton(handle) {
436
436
  //#region ../ui/src/lib/i18n/de.ts
437
437
  /** Bud's interface text in German, by message key. */
438
438
  var de$1 = {
439
+ "app.client.agentPanel.agent": {
440
+ text: "Agent",
441
+ source: "f5a4f646"
442
+ },
443
+ "app.client.agentPanel.changesRefused": {
444
+ text: "Der Agent kann Änderungen gerade nicht entgegennehmen",
445
+ source: "bdb2edb4"
446
+ },
447
+ "app.client.agentPanel.changesSent": {
448
+ text: "An den Agenten gesendet",
449
+ source: "7f5e7626"
450
+ },
451
+ "app.client.agentPanel.devServer": {
452
+ text: "Dev-Server",
453
+ source: "27e53ed7"
454
+ },
455
+ "app.client.agentPanel.ended": {
456
+ text: "Die Sitzung wurde beendet. Wenn du dich wieder verbindest, startet sie erneut.",
457
+ source: "bf6ebbec"
458
+ },
459
+ "app.client.agentPanel.failed": {
460
+ text: "Die Factory hat nicht geantwortet.",
461
+ source: "3bd3ae7a"
462
+ },
463
+ "app.client.agentPanel.shell": {
464
+ text: "Shell",
465
+ source: "ba1969a1"
466
+ },
439
467
  "app.client.commentsRequest.emptyResponse": {
440
468
  text: "Der Kommentarservice hat eine leere Antwort zurückgegeben.",
441
469
  source: "c739d1f9"
@@ -524,6 +552,62 @@ var de$1 = {
524
552
  text: "Die Bilder konnten nicht verglichen werden.",
525
553
  source: "8fd04955"
526
554
  },
555
+ "app.client.factoryRun.discardAndMove": {
556
+ text: "Lauf verwerfen & verschieben",
557
+ source: "9b3e9067"
558
+ },
559
+ "app.client.factoryRun.failed": {
560
+ text: "Bud konnte die Factory nicht erreichen.",
561
+ source: "00cea450"
562
+ },
563
+ "app.client.factoryRun.keepRun": {
564
+ text: "Lauf behalten",
565
+ source: "88a5de36"
566
+ },
567
+ "app.client.factoryRun.moveQuestion": {
568
+ text: "Für {id} läuft ein Agent. Wenn du die Aufgabe nach {status} verschiebst, werden der Lauf und seine Sandbox verworfen. Es wurde nichts gepusht, daher geht die Arbeit des Agents verloren.",
569
+ source: "d0c22345"
570
+ },
571
+ "app.client.factoryRun.moveTitle": {
572
+ text: "Lauf des Agents verwerfen?",
573
+ source: "5ce9ffe3"
574
+ },
575
+ "app.client.factoryRun.noPreview": {
576
+ text: "Der Dev-Server des Runs ist nicht erreichbar.",
577
+ source: "6dd54cb3"
578
+ },
579
+ "app.client.factoryRun.previewFailed": {
580
+ text: "Die Live-Vorschau konnte nicht geöffnet werden",
581
+ source: "a96d281a"
582
+ },
583
+ "app.client.factoryRun.refused": {
584
+ text: "Der Run wurde nicht geändert",
585
+ source: "a5fc457d"
586
+ },
587
+ "app.client.factoryRun.statusesMissing": {
588
+ text: "Füge oben die Factory-Status hinzu, bevor du Aufgaben startest.",
589
+ source: "2a26077f"
590
+ },
591
+ "app.client.factorySetup.add": {
592
+ text: "Factory-Status hinzufügen",
593
+ source: "7992be24"
594
+ },
595
+ "app.client.factorySetup.added": {
596
+ text: "Factory-Status hinzugefügt",
597
+ source: "02f6f293"
598
+ },
599
+ "app.client.factorySetup.failed": {
600
+ text: "Factory-Status konnten nicht hinzugefügt werden",
601
+ source: "8500af1b"
602
+ },
603
+ "app.client.factorySetup.missing": {
604
+ text: "In deinem Aufgaben-Store braucht die Factory diese Status: {statuses}.",
605
+ source: "573be4b6"
606
+ },
607
+ "app.client.factorySetup.otherKind": {
608
+ text: "Dein Aufgaben-Store führt diese Factory-Status als anderen Statustyp: {statuses}. Ordne andere Status in factory.statuses zu.",
609
+ source: "1b96d5e4"
610
+ },
527
611
  "app.client.fileDrafts.deleteWithUnsavedDrafts": {
528
612
  text: "Speichere oder verwerfe die ungespeicherten Entwürfe in dieser Auswahl, bevor du sie löschst.",
529
613
  source: "1deabbed"
@@ -932,6 +1016,10 @@ var de$1 = {
932
1016
  text: "Der Kommentardienst hat eine andere Diskussion zurückgegeben.",
933
1017
  source: "c0151231"
934
1018
  },
1019
+ "app.client.projectComments.taskCreated": {
1020
+ text: "Aufgabe erstellt",
1021
+ source: "4e52cadc"
1022
+ },
935
1023
  "app.client.projectComments.waitForCurrentOperation": {
936
1024
  text: "Warte, bis der aktuelle Kommentarvorgang abgeschlossen ist.",
937
1025
  source: "3c6007dd"
@@ -1139,6 +1227,10 @@ var de$1 = {
1139
1227
  text: "Aufgaben konnten nicht geladen werden.",
1140
1228
  source: "b5dd285f"
1141
1229
  },
1230
+ "app.client.projectTasks.closeAgentView": {
1231
+ text: "Agent-Ansicht schliessen",
1232
+ source: "0d888f27"
1233
+ },
1142
1234
  "app.client.projectTasks.couldNotLoadTask": {
1143
1235
  text: "Diese Aufgabe konnte nicht geladen werden.",
1144
1236
  source: "370587a2"
@@ -1155,10 +1247,22 @@ var de$1 = {
1155
1247
  text: "Der Aufgabendienst hat eine andere Aufgabe zurückgegeben. Aktualisiere vor dem erneuten Versuch.",
1156
1248
  source: "91adeaa0"
1157
1249
  },
1250
+ "app.client.projectTasks.openAgentView": {
1251
+ text: "Agent-Ansicht öffnen",
1252
+ source: "99976d29"
1253
+ },
1158
1254
  "app.client.projectTasks.refreshBeforeChanges": {
1159
1255
  text: "Aktualisiere die Aufgaben, bevor du Änderungen vornimmst.",
1160
1256
  source: "9f4e6583"
1161
1257
  },
1258
+ "app.client.projectTasks.runKept": {
1259
+ text: "Die Aufgabe bleibt, wo sie ist, während der Agent läuft.",
1260
+ source: "ed653075"
1261
+ },
1262
+ "app.client.projectTasks.runPushing": {
1263
+ text: "Der Branch der Aufgabe wird gepusht. Verschiebe sie, sobald der Push abgeschlossen ist.",
1264
+ source: "c4f8b8c6"
1265
+ },
1162
1266
  "app.client.projectTasks.undidTaskChange": {
1163
1267
  text: "Bud hat eine Aufgabenänderung rückgängig gemacht",
1164
1268
  source: "7f50e04c"
@@ -1175,6 +1279,10 @@ var de$1 = {
1175
1279
  text: "Aufgaben verknüpfen",
1176
1280
  source: "b6640aab"
1177
1281
  },
1282
+ "app.client.projectThreadLinks.makeTask": {
1283
+ text: "Aufgabe erstellen",
1284
+ source: "f5eaf1d4"
1285
+ },
1178
1286
  "app.client.projectThreadLinks.reviewLinksBeforeSaving": {
1179
1287
  text: "Überprüfe die neuesten Verknüpfungen, bevor du speicherst.",
1180
1288
  source: "c567f897"
@@ -1207,6 +1315,38 @@ var de$1 = {
1207
1315
  text: "Erneut versuchen",
1208
1316
  source: "8036af59"
1209
1317
  },
1318
+ "app.client.taskContextBlock.branch": {
1319
+ text: "Branch",
1320
+ source: "a3e27665"
1321
+ },
1322
+ "app.client.taskContextBlock.code": {
1323
+ text: "Code",
1324
+ source: "795db914"
1325
+ },
1326
+ "app.client.taskContextBlock.context": {
1327
+ text: "Kontext",
1328
+ source: "bd317f1c"
1329
+ },
1330
+ "app.client.taskContextBlock.element": {
1331
+ text: "Element",
1332
+ source: "7d376697"
1333
+ },
1334
+ "app.client.taskContextBlock.page": {
1335
+ text: "Seite",
1336
+ source: "e83d9196"
1337
+ },
1338
+ "app.client.taskContextBlock.screenshot": {
1339
+ text: "Die Seite rund um den Kommentar, mit markierter Stelle",
1340
+ source: "a97331f6"
1341
+ },
1342
+ "app.client.taskContextBlock.source": {
1343
+ text: "Quelle",
1344
+ source: "61e2a3f8"
1345
+ },
1346
+ "app.client.taskContextBlock.viewport": {
1347
+ text: "Ansicht",
1348
+ source: "60b5afe3"
1349
+ },
1210
1350
  "app.client.taskDiscussion.addContextPlaceholder": {
1211
1351
  text: "Füge Kontext für dein Team hinzu…",
1212
1352
  source: "af3fe6ea"
@@ -1314,6 +1454,10 @@ var de$1 = {
1314
1454
  text: "Die Änderung der Aufgabenverknüpfung wurde nicht bestätigt. Überprüfe die neuesten Verknüpfungen, bevor du erneut speicherst.",
1315
1455
  source: "7616ef3c"
1316
1456
  },
1457
+ "app.client.workspace.agentView": {
1458
+ text: "{task} · Agent",
1459
+ source: "d5c33796"
1460
+ },
1317
1461
  "app.client.workspace.connectProjectToOpenDiscussion": {
1318
1462
  text: "Verbinde ein Projekt, um diese Diskussion zu öffnen.",
1319
1463
  source: "fc0ca04e"
@@ -1354,6 +1498,49 @@ var de$1 = {
1354
1498
  text: "Diskussion",
1355
1499
  source: "52a76f71"
1356
1500
  },
1501
+ "app.server.commentTask.discussion": {
1502
+ text: "Diskussion",
1503
+ source: "52a76f71"
1504
+ },
1505
+ "app.server.commentTask.element": {
1506
+ text: "Element",
1507
+ source: "7d376697"
1508
+ },
1509
+ "app.server.commentTask.linkedTasks": {
1510
+ text: "verknüpfte Aufgaben",
1511
+ source: "b827f1f2"
1512
+ },
1513
+ "app.server.commentTask.replies": {
1514
+ text: "Antworten",
1515
+ source: "43e07f5f"
1516
+ },
1517
+ "app.server.commentTask.replyCount": {
1518
+ text: {
1519
+ one: "{count} Antwort",
1520
+ other: "{count} Antworten"
1521
+ },
1522
+ source: "2b046207"
1523
+ },
1524
+ "app.server.commentTask.source": {
1525
+ text: "Quelle",
1526
+ source: "61e2a3f8"
1527
+ },
1528
+ "app.server.commentTask.title": {
1529
+ text: "Kommentar zu {place}",
1530
+ source: "553c8e8c"
1531
+ },
1532
+ "app.server.commentTask.uncommitted": {
1533
+ text: "nicht committet",
1534
+ source: "fa6d4090"
1535
+ },
1536
+ "app.server.commentTask.where": {
1537
+ text: "Wo",
1538
+ source: "91dad0f8"
1539
+ },
1540
+ "app.server.commentTask.workingTree": {
1541
+ text: "Working Tree",
1542
+ source: "7674e9c0"
1543
+ },
1357
1544
  "appShell.mainNavigation": {
1358
1545
  text: "Hauptnavigation",
1359
1546
  source: "c5a8374a"
@@ -1507,10 +1694,6 @@ var de$1 = {
1507
1694
  text: "Leinwand verschieben",
1508
1695
  source: "233eddf0"
1509
1696
  },
1510
- "canvas.canvasWorkspace.reload": {
1511
- text: "Neu laden",
1512
- source: "1a43a2ac"
1513
- },
1514
1697
  "canvas.canvasWorkspace.savingComments": {
1515
1698
  text: "Kommentare werden gespeichert",
1516
1699
  source: "1f15fbfb"
@@ -4435,6 +4618,114 @@ var de$1 = {
4435
4618
  text: "Tabs",
4436
4619
  source: "8ec4824d"
4437
4620
  },
4621
+ "tasks.agentBrowser.address": {
4622
+ text: "Vorschauadresse",
4623
+ source: "37f7f743"
4624
+ },
4625
+ "tasks.agentBrowser.asleep": {
4626
+ text: "Die Sandbox ist im Ruhezustand, um Kosten zu sparen.",
4627
+ source: "662bf5ad"
4628
+ },
4629
+ "tasks.agentBrowser.back": {
4630
+ text: "Zurück",
4631
+ source: "c2954bc2"
4632
+ },
4633
+ "tasks.agentBrowser.commentOnElement": {
4634
+ text: "Kommentiere ein Element für den Agenten",
4635
+ source: "0dd8635f"
4636
+ },
4637
+ "tasks.agentBrowser.forward": {
4638
+ text: "Vorwärts",
4639
+ source: "e50883ba"
4640
+ },
4641
+ "tasks.agentBrowser.newComment": {
4642
+ text: "Änderung für den Agenten",
4643
+ source: "4d74ba2c"
4644
+ },
4645
+ "tasks.agentBrowser.noPreview": {
4646
+ text: "Hier wird die Vorschau angezeigt, sobald die Sandbox des Laufs mit dem Dev-Server läuft.",
4647
+ source: "65d4e271"
4648
+ },
4649
+ "tasks.agentBrowser.openInNewWindow": {
4650
+ text: "Vorschau in einem neuen Fenster öffnen",
4651
+ source: "e0d3f63c"
4652
+ },
4653
+ "tasks.agentBrowser.preview": {
4654
+ text: "Live-Vorschau",
4655
+ source: "7e42b06f"
4656
+ },
4657
+ "tasks.agentBrowser.reload": {
4658
+ text: "Neu laden",
4659
+ source: "1a43a2ac"
4660
+ },
4661
+ "tasks.agentBrowser.status": {
4662
+ text: "Vorschau-Status",
4663
+ source: "94b339ff"
4664
+ },
4665
+ "tasks.agentBrowser.tryAgain": {
4666
+ text: "Erneut versuchen",
4667
+ source: "213e90fa"
4668
+ },
4669
+ "tasks.agentBrowser.wake": {
4670
+ text: "Aufwecken",
4671
+ source: "d0fedeca"
4672
+ },
4673
+ "tasks.agentBrowser.waking": {
4674
+ text: "Sandbox wird aufgeweckt…",
4675
+ source: "1f99ad40"
4676
+ },
4677
+ "tasks.agentTerminal.disconnected": {
4678
+ text: "Verbindung wird wiederhergestellt…",
4679
+ source: "2f039284"
4680
+ },
4681
+ "tasks.agentTerminal.sessions": {
4682
+ text: "Terminal-Sitzungen",
4683
+ source: "0257839a"
4684
+ },
4685
+ "tasks.agentTerminal.terminal": {
4686
+ text: "Terminal {name}",
4687
+ source: "99a8191c"
4688
+ },
4689
+ "tasks.agentView.agentPanes": {
4690
+ text: "Browser oder Terminal",
4691
+ source: "9c5631e4"
4692
+ },
4693
+ "tasks.agentView.browser": {
4694
+ text: "Browser",
4695
+ source: "8df5852f"
4696
+ },
4697
+ "tasks.agentView.browserAndTerminal": {
4698
+ text: "Browser & Terminal",
4699
+ source: "50b6394f"
4700
+ },
4701
+ "tasks.agentView.details": {
4702
+ text: "Details",
4703
+ source: "0ec24245"
4704
+ },
4705
+ "tasks.agentView.hideTerminal": {
4706
+ text: "Terminal ausblenden",
4707
+ source: "b355c54b"
4708
+ },
4709
+ "tasks.agentView.showTerminal": {
4710
+ text: "Terminal anzeigen",
4711
+ source: "93576794"
4712
+ },
4713
+ "tasks.agentView.terminal": {
4714
+ text: "Terminal",
4715
+ source: "93c562d1"
4716
+ },
4717
+ "tasks.agentView.terminalBelow": {
4718
+ text: "Terminal unter dem Browser",
4719
+ source: "8f840a73"
4720
+ },
4721
+ "tasks.agentView.terminalBeside": {
4722
+ text: "Terminal neben dem Browser",
4723
+ source: "9f744076"
4724
+ },
4725
+ "tasks.agentView.view": {
4726
+ text: "Agent-Ansicht",
4727
+ source: "498637bb"
4728
+ },
4438
4729
  "tasks.taskActions.actionInProgress": {
4439
4730
  text: "Eine Aufgabenaktion läuft bereits.",
4440
4731
  source: "1ae83c01"
@@ -4621,6 +4912,14 @@ var de$1 = {
4621
4912
  text: "In Bearbeitung",
4622
4913
  source: "2948b425"
4623
4914
  },
4915
+ "tasks.taskData.label.merged": {
4916
+ text: "Zusammengeführt",
4917
+ source: "28064199"
4918
+ },
4919
+ "tasks.taskData.label.needs_approval": {
4920
+ text: "Benötigt Freigabe",
4921
+ source: "ecf5c9c5"
4922
+ },
4624
4923
  "tasks.taskData.label.open": {
4625
4924
  text: "Offen",
4626
4925
  source: "538b10e9"
@@ -4633,6 +4932,10 @@ var de$1 = {
4633
4932
  text: "Bereit",
4634
4933
  source: "0bca3294"
4635
4934
  },
4935
+ "tasks.taskData.label.ready_to_merge": {
4936
+ text: "Bereit zum Zusammenführen",
4937
+ source: "b0ea5dc5"
4938
+ },
4636
4939
  "tasks.taskData.label.task": {
4637
4940
  text: "Aufgabe",
4638
4941
  source: "76ef3d8c"
@@ -4964,6 +5267,160 @@ var de$1 = {
4964
5267
  text: "Unerledigter Eintrag",
4965
5268
  source: "eee80db8"
4966
5269
  },
5270
+ "tasks.taskRunBadge.failed": {
5271
+ text: "Run fehlgeschlagen",
5272
+ source: "e2b5681f"
5273
+ },
5274
+ "tasks.taskRunBadge.merged": {
5275
+ text: "Zusammengeführt",
5276
+ source: "28064199"
5277
+ },
5278
+ "tasks.taskRunBadge.needsContext": {
5279
+ text: "Braucht Kontext",
5280
+ source: "18701779"
5281
+ },
5282
+ "tasks.taskRunBadge.pushed": {
5283
+ text: "Gepusht",
5284
+ source: "79d81944"
5285
+ },
5286
+ "tasks.taskRunBadge.pushing": {
5287
+ text: "Wird gepusht",
5288
+ source: "5dd372a3"
5289
+ },
5290
+ "tasks.taskRunBadge.review": {
5291
+ text: "Freigabe nötig",
5292
+ source: "ecf5c9c5"
5293
+ },
5294
+ "tasks.taskRunBadge.settingUp": {
5295
+ text: "Wird eingerichtet",
5296
+ source: "aee4ff74"
5297
+ },
5298
+ "tasks.taskRunBadge.working": {
5299
+ text: "Agent arbeitet",
5300
+ source: "102da6c1"
5301
+ },
5302
+ "tasks.taskRunPanel.activity": {
5303
+ text: "Aktivität des Agents",
5304
+ source: "3457114f"
5305
+ },
5306
+ "tasks.taskRunPanel.agent": {
5307
+ text: "Agent",
5308
+ source: "f5a4f646"
5309
+ },
5310
+ "tasks.taskRunPanel.answer": {
5311
+ text: "Dem Agenten antworten",
5312
+ source: "d2d2b425"
5313
+ },
5314
+ "tasks.taskRunPanel.answerPlaceholder": {
5315
+ text: "Was muss der Agent wissen?",
5316
+ source: "92f7895f"
5317
+ },
5318
+ "tasks.taskRunPanel.approve": {
5319
+ text: "Freigeben & pushen",
5320
+ source: "7110783c"
5321
+ },
5322
+ "tasks.taskRunPanel.asleep": {
5323
+ text: "Die Sandbox schläft, um Kosten zu sparen. Sie wacht auf, wenn du die Vorschau öffnest, Änderungen anforderst oder freigibst.",
5324
+ source: "110af9ad"
5325
+ },
5326
+ "tasks.taskRunPanel.cancel": {
5327
+ text: "Abbrechen",
5328
+ source: "35afca3b"
5329
+ },
5330
+ "tasks.taskRunPanel.changesPlaceholder": {
5331
+ text: "Was soll der Agent ändern?",
5332
+ source: "80c05411"
5333
+ },
5334
+ "tasks.taskRunPanel.confirmApprove": {
5335
+ text: "{branch} ins Repository pushen?",
5336
+ source: "2d1354f2"
5337
+ },
5338
+ "tasks.taskRunPanel.confirmDiscard": {
5339
+ text: "Diesen Run und seine Sandbox verwerfen? Es wurde nichts gepusht.",
5340
+ source: "6ac090ee"
5341
+ },
5342
+ "tasks.taskRunPanel.discard": {
5343
+ text: "Verwerfen",
5344
+ source: "1e706c21"
5345
+ },
5346
+ "tasks.taskRunPanel.failed": {
5347
+ text: "Der Run ist fehlgeschlagen.",
5348
+ source: "49b620f0"
5349
+ },
5350
+ "tasks.taskRunPanel.loading": {
5351
+ text: "Run wird geladen …",
5352
+ source: "331b7fa5"
5353
+ },
5354
+ "tasks.taskRunPanel.merged": {
5355
+ text: "{branch} ist zusammengeführt.",
5356
+ source: "e9b50ea9"
5357
+ },
5358
+ "tasks.taskRunPanel.minutes": {
5359
+ text: {
5360
+ one: "1 Min.",
5361
+ other: "{count} Min."
5362
+ },
5363
+ source: "f87c3e0b"
5364
+ },
5365
+ "tasks.taskRunPanel.needsContext": {
5366
+ text: "Der Agent braucht mehr Kontext, um fortzufahren.",
5367
+ source: "98437cea"
5368
+ },
5369
+ "tasks.taskRunPanel.preview": {
5370
+ text: "Live-Vorschau öffnen",
5371
+ source: "62e9491d"
5372
+ },
5373
+ "tasks.taskRunPanel.pushed": {
5374
+ text: "{branch} wurde bei {commit} gepusht.",
5375
+ source: "78703afe"
5376
+ },
5377
+ "tasks.taskRunPanel.pushing": {
5378
+ text: "{branch} wird gepusht …",
5379
+ source: "9b951555"
5380
+ },
5381
+ "tasks.taskRunPanel.requestChanges": {
5382
+ text: "Änderungen anfordern",
5383
+ source: "637e8883"
5384
+ },
5385
+ "tasks.taskRunPanel.retry": {
5386
+ text: "Erneut versuchen",
5387
+ source: "8036af59"
5388
+ },
5389
+ "tasks.taskRunPanel.review": {
5390
+ text: "Der Agent ist fertig und wartet auf deine Prüfung.",
5391
+ source: "7e509cde"
5392
+ },
5393
+ "tasks.taskRunPanel.seconds": {
5394
+ text: {
5395
+ one: "1 s",
5396
+ other: "{count} s"
5397
+ },
5398
+ source: "24364243"
5399
+ },
5400
+ "tasks.taskRunPanel.settingUp": {
5401
+ text: "Sandbox wird eingerichtet …",
5402
+ source: "be97ea8e"
5403
+ },
5404
+ "tasks.taskRunPanel.showOnCanvas": {
5405
+ text: "Auf der Leinwand anzeigen",
5406
+ source: "b076f243"
5407
+ },
5408
+ "tasks.taskRunPanel.start": {
5409
+ text: "Aufgabe starten",
5410
+ source: "dbc9a724"
5411
+ },
5412
+ "tasks.taskRunPanel.startAgain": {
5413
+ text: "Erneut starten",
5414
+ source: "9a468407"
5415
+ },
5416
+ "tasks.taskRunPanel.startHint": {
5417
+ text: "Ein Agent bearbeitet diese Aufgabe in einer Sandbox. Erst nach deiner Freigabe wird etwas gepusht.",
5418
+ source: "ccf1c6a4"
5419
+ },
5420
+ "tasks.taskRunPanel.working": {
5421
+ text: "Der Agent arbeitet …",
5422
+ source: "202318fe"
5423
+ },
4967
5424
  "tasks.taskSections.latestEvents": {
4968
5425
  text: {
4969
5426
  one: "Das neueste Ereignis wird angezeigt.",
@@ -5081,6 +5538,10 @@ var de$1 = {
5081
5538
  text: "Erstelle eine Aufgabe, um mit der Planung deiner Arbeit zu beginnen.",
5082
5539
  source: "7c21b645"
5083
5540
  },
5541
+ "tasks.taskWorkspace.fewerStatuses": {
5542
+ text: "Weniger Statuswerte anzeigen",
5543
+ source: "1de3f0ed"
5544
+ },
5084
5545
  "tasks.taskWorkspace.filterEpic": {
5085
5546
  text: "Epic filtern",
5086
5547
  source: "19c2ed58"
@@ -5149,6 +5610,17 @@ var de$1 = {
5149
5610
  text: "Noch kein {label}-Arbeitsbereich vorhanden",
5150
5611
  source: "233c23c9"
5151
5612
  },
5613
+ "tasks.taskWorkspace.otherStatuses": {
5614
+ text: {
5615
+ one: "+1 in einem anderen Status",
5616
+ other: "+{count} in anderen Statuswerten"
5617
+ },
5618
+ source: "6cae97c5"
5619
+ },
5620
+ "tasks.taskWorkspace.otherStatusesEmpty": {
5621
+ text: "Weitere Status",
5622
+ source: "d56d45a5"
5623
+ },
5152
5624
  "tasks.taskWorkspace.priority": {
5153
5625
  text: "Priorität",
5154
5626
  source: "e68d9f29"
@@ -5220,6 +5692,13 @@ var de$1 = {
5220
5692
  text: "Deine lokalen Aufgabenänderungen teilen",
5221
5693
  source: "1dad116c"
5222
5694
  },
5695
+ "tasks.taskWorkspace.showTasks": {
5696
+ text: {
5697
+ one: "1 Aufgabe anzeigen",
5698
+ other: "{count} Aufgaben anzeigen"
5699
+ },
5700
+ source: "56258faa"
5701
+ },
5223
5702
  "tasks.taskWorkspace.showingCount": {
5224
5703
  text: "Zeigt {shown} von {total}",
5225
5704
  source: "e8675f4a"
@@ -5316,6 +5795,13 @@ var de$1 = {
5316
5795
  * and the thing (`canvas.zoomIn`); `pnpm translate` keeps the other languages in step.
5317
5796
  */
5318
5797
  var en = {
5798
+ "app.client.agentPanel.agent": "Agent",
5799
+ "app.client.agentPanel.changesRefused": "The agent can’t take changes now",
5800
+ "app.client.agentPanel.changesSent": "Sent to the agent",
5801
+ "app.client.agentPanel.devServer": "Dev server",
5802
+ "app.client.agentPanel.ended": "The session ended. It starts again when you reconnect.",
5803
+ "app.client.agentPanel.failed": "The factory didn’t answer.",
5804
+ "app.client.agentPanel.shell": "Shell",
5319
5805
  "app.client.commentsRequest.emptyResponse": "The comments service returned an empty response.",
5320
5806
  "app.client.commentsRequest.invalidData": "The comments service returned invalid data.",
5321
5807
  "app.client.commentsRequest.invalidEndpoint": "Invalid comments endpoint.",
@@ -5338,6 +5824,20 @@ var en = {
5338
5824
  "app.client.differenceView.slideStatus": "{kind} · change {change} of {count} · {index} / {total}",
5339
5825
  "app.client.differenceView.slideshowLabel": "Differences slideshow",
5340
5826
  "app.client.differenceWorker.compareError": "The pictures could not be compared.",
5827
+ "app.client.factoryRun.discardAndMove": "Discard run & move",
5828
+ "app.client.factoryRun.failed": "Bud couldn’t reach the factory.",
5829
+ "app.client.factoryRun.keepRun": "Keep the run",
5830
+ "app.client.factoryRun.moveQuestion": "{id} has an agent run. Moving it to {status} discards the run and its sandbox; nothing was pushed, so the agent’s work is lost.",
5831
+ "app.client.factoryRun.moveTitle": "Discard the agent’s run?",
5832
+ "app.client.factoryRun.noPreview": "The run’s dev server isn’t up.",
5833
+ "app.client.factoryRun.previewFailed": "Couldn’t open the live preview",
5834
+ "app.client.factoryRun.refused": "The run didn’t change",
5835
+ "app.client.factoryRun.statusesMissing": "Add the factory statuses above before starting tasks.",
5836
+ "app.client.factorySetup.add": "Add factory statuses",
5837
+ "app.client.factorySetup.added": "Factory statuses added",
5838
+ "app.client.factorySetup.failed": "Couldn’t add the factory statuses",
5839
+ "app.client.factorySetup.missing": "The factory needs these statuses in your task store: {statuses}.",
5840
+ "app.client.factorySetup.otherKind": "Your task store has these factory statuses as another kind of status: {statuses}. Map other statuses in factory.statuses.",
5341
5841
  "app.client.fileDrafts.deleteWithUnsavedDrafts": "Save or discard the unsaved drafts in this selection before deleting it.",
5342
5842
  "app.client.fileDrafts.destinationDraftConflict": "The destination acquired an unsaved draft while the move was running. Both drafts remain available at their original paths; download or review them before continuing.",
5343
5843
  "app.client.fileDrafts.destinationHasDraft": "A destination has an unsaved draft. Save or discard it before moving files here.",
@@ -5449,6 +5949,7 @@ var en = {
5449
5949
  "app.client.projectComments.refreshBeforeTryingAgain": "The comment write could not be confirmed. Refresh before trying again.",
5450
5950
  "app.client.projectComments.reloadDiscussionBeforeSaving": "Reload this discussion before saving.",
5451
5951
  "app.client.projectComments.serviceReturnedAnotherDiscussion": "The comments service returned another discussion.",
5952
+ "app.client.projectComments.taskCreated": "Task created",
5452
5953
  "app.client.projectComments.waitForCurrentOperation": "Wait for the current comment operation to finish.",
5453
5954
  "app.client.projectDifferences.comparisonFailed": "The pictures could not be compared.",
5454
5955
  "app.client.projectFileReview.commentsUnavailable": "Comments are stored by your storage adapter. Beads: run bd init in this project.",
@@ -5503,15 +6004,20 @@ var en = {
5503
6004
  "app.client.projectPreviews.requestFailed": "Preview request failed ({status}).",
5504
6005
  "app.client.projectTaskPicker.adapterUnavailable": "The task adapter is unavailable.",
5505
6006
  "app.client.projectTaskPicker.loadFailed": "Could not load tasks.",
6007
+ "app.client.projectTasks.closeAgentView": "Close Agent view",
5506
6008
  "app.client.projectTasks.couldNotLoadTask": "Could not load this task.",
5507
6009
  "app.client.projectTasks.couldNotLoadTasks": "Could not load tasks.",
5508
6010
  "app.client.projectTasks.differentTaskRefresh": "The task service returned a different task. Refresh and try again.",
5509
6011
  "app.client.projectTasks.differentTaskRefreshRetry": "The task service returned a different task. Refresh before retrying.",
6012
+ "app.client.projectTasks.openAgentView": "Open Agent view",
5510
6013
  "app.client.projectTasks.refreshBeforeChanges": "Refresh tasks before making changes.",
6014
+ "app.client.projectTasks.runKept": "The task stays where it is while its agent runs.",
6015
+ "app.client.projectTasks.runPushing": "The task’s branch is being pushed; move it once the push is done.",
5511
6016
  "app.client.projectTasks.undidTaskChange": "Bud undid a task change",
5512
6017
  "app.client.projectTasks.writeNotConfirmed": "The write was not confirmed.",
5513
6018
  "app.client.projectThreadLinks.anotherDiscussion": "The service returned another discussion.",
5514
6019
  "app.client.projectThreadLinks.linkTasks": "Link tasks",
6020
+ "app.client.projectThreadLinks.makeTask": "Make task",
5515
6021
  "app.client.projectThreadLinks.reviewLinksBeforeSaving": "Review the latest links before saving.",
5516
6022
  "app.client.screenHost.couldNotOpen": "Could not open {label}.",
5517
6023
  "app.client.screenHost.didntOpen": "{label} didn't open",
@@ -5520,6 +6026,14 @@ var en = {
5520
6026
  "app.client.screenHost.loading": "Loading {label}…",
5521
6027
  "app.client.screenHost.noRouteMatches": "No screen route matches {href}.",
5522
6028
  "app.client.screenHost.retry": "Retry",
6029
+ "app.client.taskContextBlock.branch": "Branch",
6030
+ "app.client.taskContextBlock.code": "Code",
6031
+ "app.client.taskContextBlock.context": "Context",
6032
+ "app.client.taskContextBlock.element": "Element",
6033
+ "app.client.taskContextBlock.page": "Page",
6034
+ "app.client.taskContextBlock.screenshot": "The page around the comment, with its point marked",
6035
+ "app.client.taskContextBlock.source": "Source",
6036
+ "app.client.taskContextBlock.viewport": "Viewport",
5523
6037
  "app.client.taskDiscussion.addContextPlaceholder": "Add context for your team…",
5524
6038
  "app.client.taskDiscussion.addTaskComment": "Add task comment",
5525
6039
  "app.client.taskDiscussion.cancel": "Cancel",
@@ -5549,6 +6063,7 @@ var en = {
5549
6063
  },
5550
6064
  "app.client.threadLinks.taskDiscussionNeedsLinkedTask": "A task discussion needs at least one linked task.",
5551
6065
  "app.client.threadLinks.taskLinkChangeNotConfirmed": "The task link change was not confirmed. Review the latest links before saving again.",
6066
+ "app.client.workspace.agentView": "{task} · Agent",
5552
6067
  "app.client.workspace.connectProjectToOpenDiscussion": "Connect a project to open this discussion.",
5553
6068
  "app.client.workspace.couldNotOpenDiscussion": "Could not open this discussion.",
5554
6069
  "app.client.workspace.discussion": "Discussion",
@@ -5559,6 +6074,19 @@ var en = {
5559
6074
  "app.client.workspace.startProjectWithBudVitePlugin": "Start your project with the Bud Vite plugin, or run Bud from its directory. Its screens appear here when the companion connects.",
5560
6075
  "app.client.workspace.yourProjectSideBySide": "Your project, side by side.",
5561
6076
  "app.controller.discussion": "Discussion",
6077
+ "app.server.commentTask.discussion": "Discussion",
6078
+ "app.server.commentTask.element": "Element",
6079
+ "app.server.commentTask.linkedTasks": "linked tasks",
6080
+ "app.server.commentTask.replies": "Replies",
6081
+ "app.server.commentTask.replyCount": {
6082
+ one: "{count} reply",
6083
+ other: "{count} replies"
6084
+ },
6085
+ "app.server.commentTask.source": "Source",
6086
+ "app.server.commentTask.title": "Comment on {place}",
6087
+ "app.server.commentTask.uncommitted": "uncommitted",
6088
+ "app.server.commentTask.where": "Where",
6089
+ "app.server.commentTask.workingTree": "working tree",
5562
6090
  "appShell.mainNavigation": "Main navigation",
5563
6091
  "breadcrumb.navigationLabel": "Breadcrumb",
5564
6092
  "canvas.artboardCanvas.chooseCollectionPage": "Choose a {collection} page",
@@ -5604,7 +6132,6 @@ var en = {
5604
6132
  "canvas.canvasWorkspace.interactWithPages": "Interact with pages",
5605
6133
  "canvas.canvasWorkspace.newComment": "New comment",
5606
6134
  "canvas.canvasWorkspace.panCanvas": "Pan canvas",
5607
- "canvas.canvasWorkspace.reload": "Reload",
5608
6135
  "canvas.canvasWorkspace.savingComments": "Saving comments",
5609
6136
  "canvas.canvasWorkspace.showDarkPages": "Show dark pages",
5610
6137
  "canvas.canvasWorkspace.showFullPages": "Show full pages",
@@ -6417,6 +6944,33 @@ var en = {
6417
6944
  other: "{count} tabs"
6418
6945
  },
6419
6946
  "shellTabBar.tabsLabel": "Tabs",
6947
+ "tasks.agentBrowser.address": "Preview address",
6948
+ "tasks.agentBrowser.asleep": "The sandbox is asleep to save costs.",
6949
+ "tasks.agentBrowser.back": "Back",
6950
+ "tasks.agentBrowser.commentOnElement": "Comment on an element for the agent",
6951
+ "tasks.agentBrowser.forward": "Forward",
6952
+ "tasks.agentBrowser.newComment": "Change for the agent",
6953
+ "tasks.agentBrowser.noPreview": "The preview shows here while the run’s sandbox is up with its dev server.",
6954
+ "tasks.agentBrowser.openInNewWindow": "Open the preview in a new window",
6955
+ "tasks.agentBrowser.preview": "Live preview",
6956
+ "tasks.agentBrowser.reload": "Reload",
6957
+ "tasks.agentBrowser.status": "Preview status",
6958
+ "tasks.agentBrowser.tryAgain": "Try again",
6959
+ "tasks.agentBrowser.wake": "Wake it",
6960
+ "tasks.agentBrowser.waking": "Waking the sandbox…",
6961
+ "tasks.agentTerminal.disconnected": "Reconnecting…",
6962
+ "tasks.agentTerminal.sessions": "Terminal sessions",
6963
+ "tasks.agentTerminal.terminal": "{name} terminal",
6964
+ "tasks.agentView.agentPanes": "Browser or terminal",
6965
+ "tasks.agentView.browser": "Browser",
6966
+ "tasks.agentView.browserAndTerminal": "Browser & terminal",
6967
+ "tasks.agentView.details": "Details",
6968
+ "tasks.agentView.hideTerminal": "Hide terminal",
6969
+ "tasks.agentView.showTerminal": "Show terminal",
6970
+ "tasks.agentView.terminal": "Terminal",
6971
+ "tasks.agentView.terminalBelow": "Terminal below the browser",
6972
+ "tasks.agentView.terminalBeside": "Terminal beside the browser",
6973
+ "tasks.agentView.view": "Agent view",
6420
6974
  "tasks.taskActions.actionInProgress": "A task action is already in progress.",
6421
6975
  "tasks.taskActions.actions": "Actions",
6422
6976
  "tasks.taskActions.changeNotConfirmed": "The change was not confirmed. Refresh before trying again.",
@@ -6468,9 +7022,12 @@ var en = {
6468
7022
  "tasks.taskData.label.feature": "Feature",
6469
7023
  "tasks.taskData.label.hooked": "Hooked",
6470
7024
  "tasks.taskData.label.in_progress": "In progress",
7025
+ "tasks.taskData.label.merged": "Merged",
7026
+ "tasks.taskData.label.needs_approval": "Needs approval",
6471
7027
  "tasks.taskData.label.open": "Open",
6472
7028
  "tasks.taskData.label.pinned": "Pinned",
6473
7029
  "tasks.taskData.label.ready": "Ready",
7030
+ "tasks.taskData.label.ready_to_merge": "Ready to merge",
6474
7031
  "tasks.taskData.label.task": "Task",
6475
7032
  "tasks.taskData.low": "Low",
6476
7033
  "tasks.taskData.noEpic": "No epic",
@@ -6556,6 +7113,49 @@ var en = {
6556
7113
  "tasks.taskMarkdown.completedItem": "Completed item",
6557
7114
  "tasks.taskMarkdown.image": "Image",
6558
7115
  "tasks.taskMarkdown.incompleteItem": "Incomplete item",
7116
+ "tasks.taskRunBadge.failed": "Run failed",
7117
+ "tasks.taskRunBadge.merged": "Merged",
7118
+ "tasks.taskRunBadge.needsContext": "Needs context",
7119
+ "tasks.taskRunBadge.pushed": "Pushed",
7120
+ "tasks.taskRunBadge.pushing": "Pushing",
7121
+ "tasks.taskRunBadge.review": "Needs approval",
7122
+ "tasks.taskRunBadge.settingUp": "Setting up",
7123
+ "tasks.taskRunBadge.working": "Agent working",
7124
+ "tasks.taskRunPanel.activity": "Agent activity",
7125
+ "tasks.taskRunPanel.agent": "Agent",
7126
+ "tasks.taskRunPanel.answer": "Answer the agent",
7127
+ "tasks.taskRunPanel.answerPlaceholder": "What does the agent need to know?",
7128
+ "tasks.taskRunPanel.approve": "Approve & push",
7129
+ "tasks.taskRunPanel.asleep": "The sandbox sleeps to save cost. It wakes up when you open the preview, request changes or approve.",
7130
+ "tasks.taskRunPanel.cancel": "Cancel",
7131
+ "tasks.taskRunPanel.changesPlaceholder": "What should the agent change?",
7132
+ "tasks.taskRunPanel.confirmApprove": "Push {branch} to the repository?",
7133
+ "tasks.taskRunPanel.confirmDiscard": "Discard this run and its sandbox? Nothing was pushed.",
7134
+ "tasks.taskRunPanel.discard": "Discard",
7135
+ "tasks.taskRunPanel.failed": "The run failed.",
7136
+ "tasks.taskRunPanel.loading": "Loading the run…",
7137
+ "tasks.taskRunPanel.merged": "{branch} is merged.",
7138
+ "tasks.taskRunPanel.minutes": {
7139
+ one: "1 min",
7140
+ other: "{count} min"
7141
+ },
7142
+ "tasks.taskRunPanel.needsContext": "The agent needs more context to go on.",
7143
+ "tasks.taskRunPanel.preview": "Open live preview",
7144
+ "tasks.taskRunPanel.pushed": "Pushed {branch} at {commit}.",
7145
+ "tasks.taskRunPanel.pushing": "Pushing {branch}…",
7146
+ "tasks.taskRunPanel.requestChanges": "Request changes",
7147
+ "tasks.taskRunPanel.retry": "Retry",
7148
+ "tasks.taskRunPanel.review": "The agent is done and waits for your review.",
7149
+ "tasks.taskRunPanel.seconds": {
7150
+ one: "1 s",
7151
+ other: "{count} s"
7152
+ },
7153
+ "tasks.taskRunPanel.settingUp": "Setting up the sandbox…",
7154
+ "tasks.taskRunPanel.showOnCanvas": "Show on canvas",
7155
+ "tasks.taskRunPanel.start": "Start task",
7156
+ "tasks.taskRunPanel.startAgain": "Start again",
7157
+ "tasks.taskRunPanel.startHint": "An agent works on this task in a sandbox. Nothing is pushed until you approve.",
7158
+ "tasks.taskRunPanel.working": "The agent is working…",
6559
7159
  "tasks.taskSections.latestEvents": {
6560
7160
  one: "Showing the latest {count} event.",
6561
7161
  other: "Showing the latest {count} events."
@@ -6592,6 +7192,7 @@ var en = {
6592
7192
  "tasks.taskWorkspace.connectProject": "Connect a project",
6593
7193
  "tasks.taskWorkspace.createTask": "Create task",
6594
7194
  "tasks.taskWorkspace.createToPlan": "Create a task to start planning your work.",
7195
+ "tasks.taskWorkspace.fewerStatuses": "Show fewer statuses",
6595
7196
  "tasks.taskWorkspace.filterEpic": "Filter epic",
6596
7197
  "tasks.taskWorkspace.filterField": "Filter {field}",
6597
7198
  "tasks.taskWorkspace.filters": "Filters",
@@ -6609,6 +7210,11 @@ var en = {
6609
7210
  "tasks.taskWorkspace.noMatches": "No tasks match this view",
6610
7211
  "tasks.taskWorkspace.noRemote": "No {label} remote is configured",
6611
7212
  "tasks.taskWorkspace.noWorkspace": "No {label} workspace yet",
7213
+ "tasks.taskWorkspace.otherStatuses": {
7214
+ one: "+1 in other statuses",
7215
+ other: "+{count} in other statuses"
7216
+ },
7217
+ "tasks.taskWorkspace.otherStatusesEmpty": "Other statuses",
6612
7218
  "tasks.taskWorkspace.priority": "Priority",
6613
7219
  "tasks.taskWorkspace.projectTasks": "Project tasks",
6614
7220
  "tasks.taskWorkspace.pullChanges": "Pull changes",
@@ -6629,6 +7235,10 @@ var en = {
6629
7235
  "tasks.taskWorkspace.searchPlaceholder": "Search tasks, IDs, labels…",
6630
7236
  "tasks.taskWorkspace.searchTasks": "Search tasks",
6631
7237
  "tasks.taskWorkspace.shareLocalChanges": "Share your local task changes",
7238
+ "tasks.taskWorkspace.showTasks": {
7239
+ one: "Show 1 task",
7240
+ other: "Show {count} tasks"
7241
+ },
6632
7242
  "tasks.taskWorkspace.showingCount": "Showing {shown} of {total}",
6633
7243
  "tasks.taskWorkspace.sortTasks": "Sort tasks",
6634
7244
  "tasks.taskWorkspace.startBud": "Start Bud from your web project to see its tasks.",
@@ -46679,6 +47289,7 @@ function taskFields(item, schema) {
46679
47289
  //#endregion
46680
47290
  //#region ../ui/src/lib/tasks/task-data.ts
46681
47291
  var taskMatcher = createMatcher(taskRoutes.show.pattern);
47292
+ var agentMatcher = createMatcher(taskRoutes.agent.pattern);
46682
47293
  var defaultTaskView = {
46683
47294
  query: "",
46684
47295
  fields: {},
@@ -46860,6 +47471,26 @@ function taskHref(id) {
46860
47471
  }
46861
47472
  }
46862
47473
  /**
47474
+ * Builds the URL of a task's Agent view: its details beside its run's preview and terminal.
47475
+ * @param id - The task's id.
47476
+ * @returns The typed URL.
47477
+ */
47478
+ function taskAgentHref(id) {
47479
+ return taskRoutes.agent.href({ id: parseWorkItemRef({ id }).id });
47480
+ }
47481
+ /**
47482
+ * Whether a location is a task's Agent view.
47483
+ * @param location - The current location.
47484
+ * @returns True for `/tasks/:id/agent`.
47485
+ */
47486
+ function agentViewOpen(location) {
47487
+ try {
47488
+ return Boolean(agentMatcher.match(new URL(location, "http://bud.invalid/tasks")));
47489
+ } catch {
47490
+ return false;
47491
+ }
47492
+ }
47493
+ /**
46863
47494
  * Reads the typed task place, or one older query selection on the board URL.
46864
47495
  * @param location - The current location or legacy query link.
46865
47496
  * @returns The validated task ID, or null for the board or an invalid link.
@@ -46868,7 +47499,7 @@ function selectedTask(location) {
46868
47499
  try {
46869
47500
  let url = new URL(location, "http://bud.invalid/tasks");
46870
47501
  if (url.href.length > 32768) return null;
46871
- let value = url.pathname === taskRoutes.index.href() && url.searchParams.getAll("issue").length === 1 ? url.searchParams.get("issue") : taskMatcher.match(url)?.params.id;
47502
+ let value = url.pathname === taskRoutes.index.href() && url.searchParams.getAll("issue").length === 1 ? url.searchParams.get("issue") : (taskMatcher.match(url) ?? agentMatcher.match(url))?.params.id;
46872
47503
  return value ? parseWorkItemRef({ id: value }).id : null;
46873
47504
  } catch {
46874
47505
  return null;
@@ -60614,23 +61245,13 @@ function CanvasWorkspace(handle) {
60614
61245
  if (zoomLabel) zoomLabel.textContent = `${Math.round(scale * 100)}%`;
60615
61246
  }
60616
61247
  }),
60617
- handle.props.error || handle.props.commentsUnavailable || notice ? /* @__PURE__ */ jsxs("div", {
60618
- role: handle.props.error ? "alert" : "status",
60619
- class: `absolute top-3 left-3 max-w-[calc(100%-24px)] bud-overlay rounded-lg px-3 py-2 ${handle.props.error ? "text-red-500" : "text-muted"}`,
60620
- children: [/* @__PURE__ */ jsx(Text, {
61248
+ handle.props.commentsUnavailable || notice ? /* @__PURE__ */ jsx("div", {
61249
+ role: "status",
61250
+ class: "absolute top-3 left-3 max-w-[calc(100%-24px)] bud-overlay rounded-lg px-3 py-2 text-muted",
61251
+ children: /* @__PURE__ */ jsx(Text, {
60621
61252
  variant: "ui-caption",
60622
- children: handle.props.error || handle.props.commentsUnavailable || notice
60623
- }), handle.props.error ? /* @__PURE__ */ jsx("button", {
60624
- type: "button",
60625
- class: "ml-2 underline",
60626
- mix: on("click", () => {
60627
- handle.props.onReload?.();
60628
- }),
60629
- children: /* @__PURE__ */ jsx(Text, {
60630
- variant: "ui-caption",
60631
- children: t$2("canvas.canvasWorkspace.reload")
60632
- })
60633
- }) : null]
61253
+ children: handle.props.commentsUnavailable || notice
61254
+ })
60634
61255
  }) : null,
60635
61256
  panel && !handle.props.commentsUnavailable ? /* @__PURE__ */ jsx(ConversationSidebar, {
60636
61257
  threads: handle.props.snapshot.threads,
@@ -61114,6 +61735,85 @@ function TaskEditor(handle) {
61114
61735
  };
61115
61736
  }
61116
61737
  //#endregion
61738
+ //#region ../ui/src/lib/tasks/task-run-badge.tsx
61739
+ /**
61740
+ * What a factory run's badge says: busy states with a spinner, then review, a question for a
61741
+ * person, pushed or failed.
61742
+ * @param run - The run's state and error.
61743
+ * @returns Its tone, label and whether it spins, or null for a run that leaves no badge.
61744
+ */
61745
+ function taskRunBadge(run) {
61746
+ switch (run.state) {
61747
+ case "provisioning": return {
61748
+ tone: "busy",
61749
+ label: t$2("tasks.taskRunBadge.settingUp")
61750
+ };
61751
+ case "working":
61752
+ case "changes": return {
61753
+ tone: "busy",
61754
+ label: t$2("tasks.taskRunBadge.working")
61755
+ };
61756
+ case "review": return {
61757
+ tone: "review",
61758
+ label: t$2("tasks.taskRunBadge.review")
61759
+ };
61760
+ case "needs_context": return {
61761
+ tone: "question",
61762
+ label: t$2("tasks.taskRunBadge.needsContext")
61763
+ };
61764
+ case "approved":
61765
+ case "pushing": return {
61766
+ tone: "busy",
61767
+ label: t$2("tasks.taskRunBadge.pushing")
61768
+ };
61769
+ case "pushed": return {
61770
+ tone: "done",
61771
+ label: t$2("tasks.taskRunBadge.pushed")
61772
+ };
61773
+ case "merged": return {
61774
+ tone: "done",
61775
+ label: t$2("tasks.taskRunBadge.merged")
61776
+ };
61777
+ case "failed": return {
61778
+ tone: "failed",
61779
+ label: t$2("tasks.taskRunBadge.failed")
61780
+ };
61781
+ default: return null;
61782
+ }
61783
+ }
61784
+ var tones = {
61785
+ busy: "text-muted",
61786
+ review: "text-amber-600 dark:text-amber-400",
61787
+ question: "text-violet-600 dark:text-violet-400",
61788
+ done: "text-emerald-600 dark:text-emerald-400",
61789
+ failed: "text-red-600 dark:text-red-400"
61790
+ };
61791
+ /**
61792
+ * A task card's factory run badge: where the agent's run is, with a failed run's reason on hover.
61793
+ * @param handle - The run's summary.
61794
+ * @returns The badge render function; nothing for a run that leaves no badge.
61795
+ */
61796
+ function TaskRunBadge(handle) {
61797
+ return () => {
61798
+ let badge = taskRunBadge(handle.props.run);
61799
+ if (!badge) return null;
61800
+ return /* @__PURE__ */ jsxs("span", {
61801
+ class: `flex min-w-0 items-center gap-1 ${tones[badge.tone]}`,
61802
+ title: handle.props.run.error ?? void 0,
61803
+ "data-testid": "task-run-badge",
61804
+ "data-state": handle.props.run.state,
61805
+ children: [badge.tone === "busy" ? /* @__PURE__ */ jsx(Spinner, { size: 11 }) : /* @__PURE__ */ jsx(Icon$1, {
61806
+ name: badge.tone === "failed" ? "circle-alert" : handle.props.run.state === "merged" ? "circle-check" : badge.tone === "done" ? "push" : badge.tone === "question" ? "message" : "circle-dot",
61807
+ size: 12
61808
+ }), /* @__PURE__ */ jsx(Text, {
61809
+ variant: "ui-caption",
61810
+ class: "truncate",
61811
+ children: badge.label
61812
+ })]
61813
+ });
61814
+ };
61815
+ }
61816
+ //#endregion
61117
61817
  //#region ../ui/src/lib/tasks/task-card.tsx
61118
61818
  var statusTone = {
61119
61819
  backlog: "bg-violet-400",
@@ -61153,7 +61853,8 @@ function TaskCard(handle) {
61153
61853
  let issue = taskFields(item, schema);
61154
61854
  let linked = issue.dependencyCount ?? issue.dependencies.length;
61155
61855
  let dependents = issue.dependentCount ?? issue.dependents.length;
61156
- let hasMeta = ready || blocked || !!issue.assignee || !!issue.parentId || !!linked || !!dependents || !!issue.commentCount;
61856
+ let run = item.run && taskRunBadge(item.run) ? item.run : null;
61857
+ let hasMeta = !!run || ready || blocked || !!issue.assignee || !!issue.parentId || !!linked || !!dependents || !!issue.commentCount;
61157
61858
  let priority = /* @__PURE__ */ jsx(Text, {
61158
61859
  variant: "ui-caption",
61159
61860
  weight: "medium",
@@ -61162,6 +61863,7 @@ function TaskCard(handle) {
61162
61863
  children: typeof issue.priority === "number" ? `P${issue.priority}` : issue.priorityLabel
61163
61864
  });
61164
61865
  let meta = /* @__PURE__ */ jsxs(Fragment, { children: [
61866
+ run ? /* @__PURE__ */ jsx(TaskRunBadge, { run }) : null,
61165
61867
  ready ? /* @__PURE__ */ jsxs("span", {
61166
61868
  class: "flex items-center gap-1 text-emerald-600 dark:text-emerald-400",
61167
61869
  children: [/* @__PURE__ */ jsx(Icon$1, {
@@ -76838,6 +77540,7 @@ function TaskDetails(handle) {
76838
77540
  ]
76839
77541
  }),
76840
77542
  children: [
77543
+ handle.props.actions ?? null,
76841
77544
  /* @__PURE__ */ jsx(IconButton, {
76842
77545
  icon: "link",
76843
77546
  label: t$2("tasks.taskDetails.copyTaskLink"),
@@ -76863,13 +77566,13 @@ function TaskDetails(handle) {
76863
77566
  }),
76864
77567
  /* @__PURE__ */ jsxs("div", {
76865
77568
  "data-task-detail-scroll": "",
76866
- class: "flex min-h-0 flex-1 flex-col overflow-y-auto overscroll-contain",
77569
+ class: "@container/page flex min-h-0 flex-1 flex-col overflow-y-auto overscroll-contain",
76867
77570
  "aria-busy": loading ? "true" : "false",
76868
77571
  mix: scrollFade("y"),
76869
77572
  children: [
76870
77573
  loading && !issue ? /* @__PURE__ */ jsx(Loader, { label: t$2("tasks.taskDetails.loadingTask") }) : null,
76871
77574
  error ? /* @__PURE__ */ jsx("div", {
76872
- class: "px-4 pb-6 md:px-6",
77575
+ class: "px-4 pb-6 @min-[40rem]/page:px-6",
76873
77576
  children: /* @__PURE__ */ jsxs(FieldCard, {
76874
77577
  class: "max-w-2xl",
76875
77578
  role: "alert",
@@ -76884,7 +77587,7 @@ function TaskDetails(handle) {
76884
77587
  })
76885
77588
  }) : null,
76886
77589
  issue && item && detail ? /* @__PURE__ */ jsxs("div", {
76887
- class: "mx-auto grid w-full max-w-6xl gap-8 px-4 pt-6 pb-12 md:px-6 lg:grid-cols-[minmax(0,1fr)_18rem] lg:gap-12",
77590
+ class: "mx-auto grid w-full max-w-6xl gap-8 px-4 pt-6 pb-12 @min-[40rem]/page:px-6 @min-[56rem]/page:grid-cols-[minmax(0,1fr)_18rem] @min-[56rem]/page:gap-12",
76888
77591
  children: [/* @__PURE__ */ jsxs("article", {
76889
77592
  class: "flex min-w-0 flex-col gap-8",
76890
77593
  children: [
@@ -77006,7 +77709,7 @@ function TaskDetails(handle) {
77006
77709
  })
77007
77710
  ]
77008
77711
  }), /* @__PURE__ */ jsxs("aside", {
77009
- class: "flex min-w-0 flex-col gap-4 lg:sticky lg:top-6 lg:self-start",
77712
+ class: "flex min-w-0 flex-col gap-4 @min-[56rem]/page:sticky @min-[56rem]/page:top-6 @min-[56rem]/page:self-start",
77010
77713
  children: [/* @__PURE__ */ jsx(Properties, {
77011
77714
  ...context,
77012
77715
  item,
@@ -77191,6 +77894,8 @@ function TaskWorkspace(handle) {
77191
77894
  }
77192
77895
  return draft;
77193
77896
  }
77897
+ let expanded = /* @__PURE__ */ new Set();
77898
+ let allColumns = false;
77194
77899
  async function move(id, status) {
77195
77900
  let issue = handle.props.snapshot?.items.find((candidate) => candidate.id === id);
77196
77901
  if (!issue || !handle.props.operations || actionBusy || !handle.props.schema || taskRole(issue, handle.props.schema, "status") === status) return;
@@ -77283,7 +77988,12 @@ function TaskWorkspace(handle) {
77283
77988
  restore = null;
77284
77989
  handle.queueTask(() => scroll?.scrollTo(position));
77285
77990
  }
77286
- let statuses = schema ? taskStatuses(schema, snapshot?.items) : [];
77991
+ let allStatuses = schema ? taskStatuses(schema, snapshot?.items) : [];
77992
+ let columns = handle.props.columns;
77993
+ let arranged = columns ? [...columns.shown, ...columns.collapsed ?? []].flatMap((value) => allStatuses.filter((status) => status.value === value)) : allStatuses;
77994
+ let statuses = columns && !allColumns && !view.status ? arranged : allStatuses;
77995
+ let hiddenStatuses = allStatuses.filter((status) => !arranged.includes(status));
77996
+ let hiddenTasks = (snapshot?.items ?? []).filter((item) => hiddenStatuses.some((status) => status.value === taskRole(item, schema, "status"))).length;
77287
77997
  let ready = new Set(snapshot?.items.filter((item) => item.ready).map((item) => item.id) ?? []);
77288
77998
  let activeFilters = [
77289
77999
  view.status,
@@ -77773,12 +78483,13 @@ function TaskWorkspace(handle) {
77773
78483
  class: "flex w-full min-w-0 flex-col gap-px p-1",
77774
78484
  children: group.issues.map(renderCard)
77775
78485
  })
77776
- })] }) : /* @__PURE__ */ jsx("div", {
78486
+ })] }) : /* @__PURE__ */ jsxs("div", {
77777
78487
  class: "flex items-start gap-3",
77778
- children: statuses.filter((status) => !view.status || view.status === status.value).map((status) => {
78488
+ children: [statuses.filter((status) => !view.status || view.status === status.value).map((status) => {
77779
78489
  let issues = group.issues.filter((issue) => taskRole(issue, schema, "status") === status.value);
78490
+ let collapsedColumn = !!columns?.collapsed?.includes(status.value) && !expanded.has(status.value) && issues.length > 0;
77780
78491
  return /* @__PURE__ */ jsx("section", {
77781
- class: `flex flex-col gap-2 ${issues.length ? "min-w-60 max-w-sm flex-1 basis-0" : "w-32 shrink-0"}`,
78492
+ class: `flex flex-col gap-2 ${issues.length && !collapsedColumn ? "min-w-60 max-w-sm flex-1 basis-0" : "w-max min-w-32 max-w-48 shrink-0"}`,
77782
78493
  "aria-label": t$2("tasks.taskWorkspace.statusColumn", { status: status.label }),
77783
78494
  mix: [on("dragover", (event) => {
77784
78495
  if (event.dataTransfer?.types.includes("application/x-bud-task") && !actionBusy && status.value) {
@@ -77797,10 +78508,29 @@ function TaskWorkspace(handle) {
77797
78508
  item: null,
77798
78509
  status,
77799
78510
  items: issues,
77800
- children: issues.map(renderCard)
78511
+ children: collapsedColumn ? /* @__PURE__ */ jsx(Button, {
78512
+ variant: "ghost",
78513
+ size: "small",
78514
+ class: "justify-start",
78515
+ mix: on("click", () => {
78516
+ expanded.add(status.value);
78517
+ handle.update();
78518
+ }),
78519
+ children: t$2("tasks.taskWorkspace.showTasks", { count: issues.length })
78520
+ }) : issues.map(renderCard)
77801
78521
  })
77802
78522
  }, status.value);
77803
- })
78523
+ }), columns && !view.status && (hiddenStatuses.length || allColumns) ? /* @__PURE__ */ jsx(Button, {
78524
+ variant: "ghost",
78525
+ size: "small",
78526
+ class: "mt-1 shrink-0",
78527
+ "data-testid": "board-other-statuses",
78528
+ mix: on("click", () => {
78529
+ allColumns = !allColumns;
78530
+ handle.update();
78531
+ }),
78532
+ children: allColumns ? t$2("tasks.taskWorkspace.fewerStatuses") : hiddenTasks ? t$2("tasks.taskWorkspace.otherStatuses", { count: hiddenTasks }) : t$2("tasks.taskWorkspace.otherStatusesEmpty")
78533
+ }) : null]
77804
78534
  })]
77805
78535
  }, group.id)) : null
77806
78536
  ]
@@ -77832,7 +78562,7 @@ function TaskWorkspace(handle) {
77832
78562
  }
77833
78563
  })
77834
78564
  }) : null,
77835
- selectedId && schema ? /* @__PURE__ */ createElement(Page, {
78565
+ selectedId && schema ? (handle.props.pageFrame ?? ((page) => page))(/* @__PURE__ */ createElement(Page, {
77836
78566
  ...context(detail?.item.id === selectedId ? detail.item : null),
77837
78567
  item: detail?.item.id === selectedId ? detail.item : null,
77838
78568
  design: handle.props.design,
@@ -77849,10 +78579,876 @@ function TaskWorkspace(handle) {
77849
78579
  loading: detailLoading,
77850
78580
  error: detailError,
77851
78581
  onSelect: select,
77852
- onReload: onReloadDetail
78582
+ onReload: onReloadDetail,
78583
+ actions: handle.props.pageActions
78584
+ })) : null
78585
+ ] })
78586
+ });
78587
+ };
78588
+ }
78589
+ //#endregion
78590
+ //#region ../ui/src/lib/tasks/agent-terminal.tsx
78591
+ function Session(handle) {
78592
+ let state = "connecting";
78593
+ let term = null;
78594
+ let mount = ref((node, signal) => {
78595
+ (async () => {
78596
+ let { WTerm } = await import("./dist-BCSTeNf4.js");
78597
+ if (signal.aborted) return;
78598
+ let connection = null;
78599
+ let size = {
78600
+ cols: 0,
78601
+ rows: 0
78602
+ };
78603
+ let resizing;
78604
+ let pending = [];
78605
+ let instance = new WTerm(node, {
78606
+ cursorBlink: true,
78607
+ renderingPaused: !handle.props.active,
78608
+ onData: (data) => connection ? connection.input(data) : pending.push(data),
78609
+ onResize: (cols, rows) => {
78610
+ clearTimeout(resizing);
78611
+ resizing = setTimeout(() => {
78612
+ if (cols === size.cols && rows === size.rows) return;
78613
+ size = {
78614
+ cols,
78615
+ rows
78616
+ };
78617
+ connection?.resize(cols, rows);
78618
+ }, 150);
78619
+ }
78620
+ });
78621
+ await instance.init();
78622
+ if (signal.aborted) return instance.destroy();
78623
+ requestAnimationFrame(() => {
78624
+ if (!signal.aborted) instance.fit();
78625
+ });
78626
+ document.fonts?.ready.then(() => {
78627
+ if (!signal.aborted) instance.fit();
78628
+ });
78629
+ term = instance;
78630
+ signal.addEventListener("abort", () => instance.destroy(), { once: true });
78631
+ size = {
78632
+ cols: instance.cols,
78633
+ rows: instance.rows
78634
+ };
78635
+ connection = handle.props.connect(handle.props.tab.id, size, {
78636
+ write: (bytes) => instance.write(bytes),
78637
+ state: (next) => {
78638
+ state = next;
78639
+ if (!signal.aborted) handle.update();
78640
+ }
78641
+ }, signal);
78642
+ for (let data of pending.splice(0)) connection.input(data);
78643
+ if (handle.props.active) instance.focus();
78644
+ })();
78645
+ });
78646
+ let shown = false;
78647
+ return () => {
78648
+ let { active, tab } = handle.props;
78649
+ if (active !== shown) {
78650
+ shown = active;
78651
+ term?.setRenderingPaused(!active);
78652
+ if (active) handle.queueTask(() => {
78653
+ term?.fit();
78654
+ term?.focus();
78655
+ });
78656
+ }
78657
+ return /* @__PURE__ */ jsxs("div", {
78658
+ class: `absolute inset-0 ${active ? "" : "invisible"}`,
78659
+ "aria-hidden": active ? void 0 : "true",
78660
+ inert: active ? void 0 : true,
78661
+ "data-terminal-tab": tab.id,
78662
+ "data-terminal-state": state,
78663
+ children: [/* @__PURE__ */ jsx("div", {
78664
+ class: "bud-terminal absolute inset-0 overflow-hidden",
78665
+ "aria-label": t$2("tasks.agentTerminal.terminal", { name: tab.label }),
78666
+ mix: mount
78667
+ }), state === "closed" ? /* @__PURE__ */ jsx(Text, {
78668
+ variant: "ui-caption",
78669
+ tone: "muted",
78670
+ class: "bud-overlay pointer-events-none absolute right-3 bottom-3 rounded-lg px-2.5 py-1",
78671
+ children: t$2("tasks.agentTerminal.disconnected")
78672
+ }) : null]
78673
+ });
78674
+ };
78675
+ }
78676
+ /**
78677
+ * The terminal in Agent view, on @wterm/dom: one session per tab, kept while another tab shows so
78678
+ * its output stays, connected through the app's broker.
78679
+ * @param handle - The tabs, the shown one and how to connect a tab.
78680
+ * @returns The terminal's render function.
78681
+ */
78682
+ function AgentTerminal(handle) {
78683
+ let opened = /* @__PURE__ */ new Set();
78684
+ return () => {
78685
+ let { tabs, active, connect } = handle.props;
78686
+ opened.add(active);
78687
+ return /* @__PURE__ */ jsx("div", {
78688
+ class: "absolute inset-0",
78689
+ "data-testid": "agent-terminal",
78690
+ children: tabs.filter((tab) => opened.has(tab.id)).map((tab) => /* @__PURE__ */ jsx(Session, {
78691
+ tab,
78692
+ connect,
78693
+ active: tab.id === active
78694
+ }, tab.id))
78695
+ });
78696
+ };
78697
+ }
78698
+ //#endregion
78699
+ //#region ../ui/src/lib/tasks/agent-view.tsx
78700
+ var LAYOUT = "bud:agent-view";
78701
+ /**
78702
+ * Reads the person's Agent view layout.
78703
+ * @param value - The stored preference.
78704
+ * @returns The layout, with the terminal shown beside the browser by default.
78705
+ */
78706
+ function agentLayout(value) {
78707
+ let input = value ?? {};
78708
+ return {
78709
+ terminal: input.terminal !== false,
78710
+ placement: input.placement === "below" ? "below" : "right"
78711
+ };
78712
+ }
78713
+ function Segments(handle) {
78714
+ return () => /* @__PURE__ */ jsx("div", {
78715
+ role: "group",
78716
+ "aria-label": handle.props.label,
78717
+ class: `bud-segmented ${handle.props.class ?? ""}`,
78718
+ children: handle.props.options.map((option) => /* @__PURE__ */ jsxs("button", {
78719
+ type: "button",
78720
+ "aria-pressed": handle.props.value === option.id ? "true" : "false",
78721
+ "data-agent-pane": option.id,
78722
+ mix: on("click", () => handle.props.onChange(option.id)),
78723
+ children: [/* @__PURE__ */ jsx(Icon$1, {
78724
+ name: option.icon,
78725
+ size: 15
78726
+ }), /* @__PURE__ */ jsx(Text, {
78727
+ variant: "ui",
78728
+ class: "@max-[24rem]/agent:sr-only",
78729
+ children: option.label
78730
+ })]
78731
+ }, option.id))
78732
+ });
78733
+ }
78734
+ /**
78735
+ * Agent view: a task's details beside the browser on its run's preview and the terminal. It lays
78736
+ * itself out by the room it has (container queries), so it works in tabs and side panels too:
78737
+ * with little room a switch at the top picks details or the agent's panes, and in a narrow agent
78738
+ * column a switch in the browser's toolbar picks the browser or the terminal, unless the terminal
78739
+ * sits below the browser. The layout is remembered per person.
78740
+ * @param handle - The details, the browser and the terminal.
78741
+ * @returns The view's render function.
78742
+ */
78743
+ function AgentView(handle) {
78744
+ let layout = agentLayout(readPreference(LAYOUT));
78745
+ let panes = {
78746
+ main: "agent",
78747
+ agent: "browser"
78748
+ };
78749
+ let setLayout = (next) => {
78750
+ layout = {
78751
+ ...layout,
78752
+ ...next
78753
+ };
78754
+ writePreference(LAYOUT, layout);
78755
+ if (next.terminal) panes = {
78756
+ ...panes,
78757
+ agent: "terminal"
78758
+ };
78759
+ if (next.terminal === false) panes = {
78760
+ ...panes,
78761
+ agent: "browser"
78762
+ };
78763
+ handle.update();
78764
+ };
78765
+ let setPanes = (next) => {
78766
+ panes = {
78767
+ ...panes,
78768
+ ...next
78769
+ };
78770
+ handle.update();
78771
+ };
78772
+ return () => {
78773
+ let { details, browser, terminal } = handle.props;
78774
+ let shown = Boolean(terminal) && layout.terminal;
78775
+ let beside = shown && layout.placement === "right";
78776
+ let below = shown && layout.placement === "below";
78777
+ let switcher = beside ? /* @__PURE__ */ jsx(Segments, {
78778
+ label: t$2("tasks.agentView.agentPanes"),
78779
+ class: "@min-[52rem]/panes:hidden",
78780
+ value: panes.agent,
78781
+ options: [{
78782
+ id: "browser",
78783
+ label: t$2("tasks.agentView.browser"),
78784
+ icon: "browser"
78785
+ }, {
78786
+ id: "terminal",
78787
+ label: t$2("tasks.agentView.terminal"),
78788
+ icon: "terminal"
78789
+ }],
78790
+ onChange: (id) => setPanes({ agent: id })
78791
+ }) : null;
78792
+ let controls = terminal ? /* @__PURE__ */ jsxs(Fragment, { children: [shown ? /* @__PURE__ */ jsx(IconButton, {
78793
+ tooltip: true,
78794
+ class: "@max-[34rem]/panes:hidden",
78795
+ icon: layout.placement === "right" ? "panel-bottom" : "panel-right",
78796
+ label: layout.placement === "right" ? t$2("tasks.agentView.terminalBelow") : t$2("tasks.agentView.terminalBeside"),
78797
+ "data-testid": "agent-terminal-placement",
78798
+ mix: on("click", () => setLayout({ placement: layout.placement === "right" ? "below" : "right" }))
78799
+ }) : null, /* @__PURE__ */ jsx(IconButton, {
78800
+ tooltip: true,
78801
+ icon: "terminal",
78802
+ active: shown,
78803
+ label: shown ? t$2("tasks.agentView.hideTerminal") : t$2("tasks.agentView.showTerminal"),
78804
+ "data-testid": "agent-terminal-toggle",
78805
+ mix: on("click", () => setLayout({ terminal: !shown }))
78806
+ })] }) : null;
78807
+ let hideBrowser = beside && panes.agent === "terminal" ? "@max-[52rem]/panes:hidden" : "";
78808
+ let hideTerminal = beside && panes.agent === "browser" ? "@max-[52rem]/panes:hidden" : "";
78809
+ return /* @__PURE__ */ jsxs("div", {
78810
+ class: "@container/agent flex h-full min-h-0 flex-col",
78811
+ "data-testid": "agent-view",
78812
+ "data-terminal": shown ? layout.placement : "hidden",
78813
+ children: [/* @__PURE__ */ jsx("div", {
78814
+ class: "flex h-12 shrink-0 items-center gap-2 border-b border-line px-2 @min-[48rem]/agent:hidden",
78815
+ children: /* @__PURE__ */ jsx(Segments, {
78816
+ label: t$2("tasks.agentView.view"),
78817
+ value: panes.main,
78818
+ options: [{
78819
+ id: "details",
78820
+ label: t$2("tasks.agentView.details"),
78821
+ icon: "text"
78822
+ }, {
78823
+ id: "agent",
78824
+ label: terminal ? t$2("tasks.agentView.browserAndTerminal") : t$2("tasks.agentView.browser"),
78825
+ icon: "browser"
78826
+ }],
78827
+ onChange: (id) => setPanes({ main: id })
78828
+ })
78829
+ }), /* @__PURE__ */ jsxs("div", {
78830
+ class: "flex min-h-0 flex-1",
78831
+ children: [/* @__PURE__ */ jsx("div", {
78832
+ class: `flex min-h-0 w-full min-w-0 flex-col @min-[48rem]/agent:w-[clamp(20rem,34%,30rem)] @min-[48rem]/agent:shrink-0 @min-[48rem]/agent:border-e @min-[48rem]/agent:border-line ${panes.main === "agent" ? "@max-[48rem]/agent:hidden" : ""}`,
78833
+ "data-agent-region": "details",
78834
+ children: details
78835
+ }), /* @__PURE__ */ jsxs("div", {
78836
+ class: `@container/panes flex min-h-0 min-w-0 flex-1 bg-[var(--bud-editor)] ${below ? "flex-col" : ""} ${panes.main === "details" ? "@max-[48rem]/agent:hidden" : ""}`,
78837
+ "data-agent-region": "agent",
78838
+ children: [/* @__PURE__ */ jsxs("section", {
78839
+ "aria-label": t$2("tasks.agentView.browser"),
78840
+ class: `flex min-h-0 min-w-0 flex-col ${below ? "flex-[3]" : "flex-1"} ${hideBrowser}`,
78841
+ "data-agent-region": "browser",
78842
+ children: [
78843
+ /* @__PURE__ */ jsxs("div", {
78844
+ class: "bud-toolbar flex h-12 shrink-0 items-center gap-1.5 border-b border-line px-2",
78845
+ children: [
78846
+ switcher,
78847
+ /* @__PURE__ */ jsx("div", {
78848
+ class: "flex min-w-0 flex-1 items-center gap-1.5",
78849
+ children: browser.toolbar
78850
+ }),
78851
+ browser.actions,
78852
+ controls
78853
+ ]
78854
+ }),
78855
+ /* @__PURE__ */ jsx("div", {
78856
+ class: "relative min-h-0 flex-1",
78857
+ children: browser.content
78858
+ }),
78859
+ browser.status
78860
+ ]
78861
+ }), shown && terminal ? /* @__PURE__ */ jsxs("section", {
78862
+ "aria-label": t$2("tasks.agentView.terminal"),
78863
+ class: `flex min-h-0 min-w-0 flex-col bg-[var(--bud-editor)] ${below ? "flex-[2] border-t border-line" : "flex-1 @min-[52rem]/panes:max-w-[44rem] @min-[52rem]/panes:border-s @min-[52rem]/panes:border-line"} ${hideTerminal}`,
78864
+ "data-agent-region": "terminal",
78865
+ children: [/* @__PURE__ */ jsxs("div", {
78866
+ class: "bud-toolbar flex h-12 shrink-0 items-center gap-1.5 border-b border-line px-2",
78867
+ children: [
78868
+ beside ? /* @__PURE__ */ jsx("div", {
78869
+ class: "@min-[52rem]/panes:hidden",
78870
+ children: switcher
78871
+ }) : null,
78872
+ /* @__PURE__ */ jsx("div", {
78873
+ class: "flex min-w-0 flex-1 items-center overflow-x-auto [scrollbar-width:none]",
78874
+ children: terminal.tabs
78875
+ }),
78876
+ beside ? /* @__PURE__ */ jsx("div", {
78877
+ class: "flex items-center gap-1.5 @min-[52rem]/panes:hidden",
78878
+ children: controls
78879
+ }) : null
78880
+ ]
78881
+ }), /* @__PURE__ */ jsx("div", {
78882
+ class: "relative min-h-0 flex-1",
78883
+ children: terminal.content
78884
+ })]
78885
+ }) : null]
78886
+ })]
78887
+ })]
78888
+ });
78889
+ };
78890
+ }
78891
+ //#endregion
78892
+ //#region ../ui/src/lib/tasks/agent-browser.tsx
78893
+ /**
78894
+ * Agent view's browser on the run's live preview: a sandboxed frame on the preview's own origin,
78895
+ * never Bud's, followed through the dev bridge the project's pages carry, with back, forward,
78896
+ * reload and the address, and comments on picked elements that go to the agent as changes.
78897
+ * @param handle - The details, the preview, the terminal and their actions.
78898
+ * @returns The view's render function.
78899
+ */
78900
+ function AgentBrowser(handle) {
78901
+ let frame;
78902
+ let path = "/";
78903
+ let title = "";
78904
+ let src = null;
78905
+ let load = 0;
78906
+ let picking = null;
78907
+ let draft = null;
78908
+ let busy = false;
78909
+ let tab = null;
78910
+ let origin = () => {
78911
+ let preview = handle.props.preview;
78912
+ return preview.state === "ready" ? new URL(preview.url).origin : null;
78913
+ };
78914
+ let post = (type, data = {}) => {
78915
+ let target = origin();
78916
+ if (target) frame?.contentWindow?.postMessage({
78917
+ ...data,
78918
+ type
78919
+ }, target);
78920
+ };
78921
+ let update = () => {
78922
+ if (!handle.signal.aborted) handle.update();
78923
+ };
78924
+ let frameRef = ref((node, signal) => {
78925
+ frame = node;
78926
+ signal.addEventListener("abort", () => frame = void 0, { once: true });
78927
+ });
78928
+ let keepInside = ref((card, signal) => {
78929
+ let position = () => {
78930
+ if (!frame) return;
78931
+ card.style.setProperty("--pages-card-x", "0px");
78932
+ card.style.setProperty("--pages-card-y", "0px");
78933
+ let offset = canvasPopoverOffset(card.getBoundingClientRect(), frame.getBoundingClientRect());
78934
+ card.style.setProperty("--pages-card-x", `${offset.x}px`);
78935
+ card.style.setProperty("--pages-card-y", `${offset.y}px`);
78936
+ };
78937
+ let observer = new ResizeObserver(position);
78938
+ observer.observe(card);
78939
+ position();
78940
+ signal.addEventListener("abort", () => observer.disconnect(), { once: true });
78941
+ });
78942
+ let listen = ref((_node, signal) => {
78943
+ window.addEventListener("message", (event) => {
78944
+ if (!frame || event.source !== frame.contentWindow || event.origin !== origin()) return;
78945
+ let data = event.data;
78946
+ if (data?.type === "bud:location" && typeof data.path === "string") {
78947
+ path = data.path.startsWith("/") ? data.path.slice(0, 4096) : path;
78948
+ title = typeof data.title === "string" ? data.title.slice(0, 200) : "";
78949
+ update();
78950
+ } else if (data?.type === "bud:picked" && picking && data.id === picking) {
78951
+ picking = null;
78952
+ draft = readPagePick(data);
78953
+ update();
78954
+ }
78955
+ }, { signal });
78956
+ });
78957
+ let navigate = (to) => {
78958
+ let preview = handle.props.preview;
78959
+ if (preview.state !== "ready") return;
78960
+ let url = new URL(preview.url);
78961
+ let target = new URL(to, url);
78962
+ if (target.origin !== url.origin) return;
78963
+ for (let [key, value] of url.searchParams) if (!target.searchParams.has(key)) target.searchParams.set(key, value);
78964
+ src = target.href;
78965
+ load++;
78966
+ update();
78967
+ };
78968
+ return () => {
78969
+ let { preview, details, terminal, onComment } = handle.props;
78970
+ let ready = preview.state === "ready" ? preview : null;
78971
+ if (ready && src === null) src = ready.url;
78972
+ if (!ready) {
78973
+ src = null;
78974
+ picking = null;
78975
+ }
78976
+ let host = ready ? new URL(ready.url).host : "";
78977
+ let shownTab = terminal?.tabs.find((entry) => entry.id === tab)?.id ?? terminal?.tabs[0]?.id;
78978
+ let toolbar = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
78979
+ class: "flex shrink-0 items-center gap-0.5",
78980
+ children: [
78981
+ /* @__PURE__ */ jsx(IconButton, {
78982
+ tooltip: true,
78983
+ class: "@max-[34rem]/panes:hidden",
78984
+ icon: "arrow-left",
78985
+ label: t$2("tasks.agentBrowser.back"),
78986
+ disabled: !ready,
78987
+ mix: on("click", () => post("bud:back"))
78988
+ }),
78989
+ /* @__PURE__ */ jsx(IconButton, {
78990
+ tooltip: true,
78991
+ class: "@max-[34rem]/panes:hidden",
78992
+ icon: "arrow-right",
78993
+ label: t$2("tasks.agentBrowser.forward"),
78994
+ disabled: !ready,
78995
+ mix: on("click", () => post("bud:forward"))
78996
+ }),
78997
+ /* @__PURE__ */ jsx(IconButton, {
78998
+ tooltip: true,
78999
+ icon: "sync",
79000
+ label: t$2("tasks.agentBrowser.reload"),
79001
+ disabled: !ready,
79002
+ mix: on("click", () => navigate(path))
79003
+ })
79004
+ ]
79005
+ }), /* @__PURE__ */ jsx("form", {
79006
+ class: "flex min-w-0 flex-1 @max-[34rem]/panes:hidden",
79007
+ mix: on("submit", (event) => {
79008
+ event.preventDefault();
79009
+ let input = event.currentTarget.elements.namedItem("address");
79010
+ navigate(input.value.trim() || "/");
79011
+ }),
79012
+ children: /* @__PURE__ */ jsxs("label", {
79013
+ class: "bud-control bud-field flex h-control min-w-0 flex-1 items-center gap-2 rounded-lg px-2.5 text-muted",
79014
+ children: [/* @__PURE__ */ jsx(Icon$1, {
79015
+ name: "globe",
79016
+ size: 14,
79017
+ class: "shrink-0"
79018
+ }), /* @__PURE__ */ jsx("input", {
79019
+ name: "address",
79020
+ "aria-label": t$2("tasks.agentBrowser.address"),
79021
+ class: "h-full min-w-0 flex-1 bg-transparent pb-0.5 text-sm/5 text-ink outline-none",
79022
+ spellcheck: false,
79023
+ autocomplete: "off",
79024
+ disabled: !ready,
79025
+ value: ready ? path : ""
79026
+ })]
79027
+ })
79028
+ })] });
79029
+ let actions = /* @__PURE__ */ jsxs(Fragment, { children: [onComment ? /* @__PURE__ */ jsx(IconButton, {
79030
+ tooltip: true,
79031
+ icon: "crosshair",
79032
+ label: t$2("tasks.agentBrowser.commentOnElement"),
79033
+ active: Boolean(picking),
79034
+ disabled: !ready,
79035
+ "data-testid": "agent-browser-pick",
79036
+ mix: on("click", () => {
79037
+ if (picking) {
79038
+ post("bud:pick-cancel");
79039
+ picking = null;
79040
+ } else {
79041
+ draft = null;
79042
+ picking = crypto.randomUUID();
79043
+ post("bud:pick", { id: picking });
79044
+ }
79045
+ update();
79046
+ })
79047
+ }) : null, /* @__PURE__ */ jsx(IconButton, {
79048
+ tooltip: true,
79049
+ class: "@max-[34rem]/panes:hidden",
79050
+ icon: "external",
79051
+ label: t$2("tasks.agentBrowser.openInNewWindow"),
79052
+ disabled: !ready,
79053
+ mix: on("click", () => {
79054
+ if (src) window.open(src, "_blank", "noopener,noreferrer");
79055
+ })
79056
+ })] });
79057
+ let content = ready ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("iframe", {
79058
+ title: title || t$2("tasks.agentBrowser.preview"),
79059
+ src: src ?? ready.url,
79060
+ sandbox: "allow-scripts allow-same-origin allow-forms allow-popups allow-modals",
79061
+ referrerpolicy: "no-referrer",
79062
+ class: "absolute inset-0 size-full border-0 bg-white",
79063
+ "data-testid": "agent-browser-frame",
79064
+ mix: [frameRef, on("load", () => {
79065
+ post("bud:hello");
79066
+ if (picking) post("bud:pick", { id: picking });
79067
+ })]
79068
+ }, `${load}`), draft && onComment ? /* @__PURE__ */ jsx("div", {
79069
+ role: "dialog",
79070
+ "aria-label": t$2("tasks.agentBrowser.newComment"),
79071
+ class: `absolute z-10 ${draft.client ? "" : "top-3 right-3"}`,
79072
+ style: draft.client ? {
79073
+ left: `${draft.client.x}px`,
79074
+ top: `${draft.client.y}px`,
79075
+ transform: "translate(calc(12px + var(--pages-card-x, 0px)), calc(-8px + var(--pages-card-y, 0px)))"
79076
+ } : void 0,
79077
+ mix: [...draft.client ? [keepInside] : [], on("keydown", (event) => {
79078
+ if (event.key === "Escape") {
79079
+ draft = null;
79080
+ update();
79081
+ }
79082
+ })],
79083
+ children: /* @__PURE__ */ jsx(CommentComposerCard, {
79084
+ busy,
79085
+ heading: /* @__PURE__ */ jsxs("div", {
79086
+ class: "flex min-w-0 flex-col gap-1 px-1 pt-1",
79087
+ children: [/* @__PURE__ */ jsxs(Text, {
79088
+ variant: "ui-caption",
79089
+ tone: "muted",
79090
+ class: "truncate",
79091
+ children: [
79092
+ draft.path,
79093
+ " · ",
79094
+ draft.element?.label || draft.element?.tagName || ""
79095
+ ]
79096
+ }), draft.element?.source ? /* @__PURE__ */ jsx(ElementSourceLink, { source: draft.element.source }) : null]
79097
+ }),
79098
+ onCancel: () => {
79099
+ draft = null;
79100
+ update();
79101
+ },
79102
+ onSubmit: async (body) => {
79103
+ let pick = draft;
79104
+ busy = true;
79105
+ update();
79106
+ try {
79107
+ await onComment({
79108
+ body,
79109
+ path: pick.path,
79110
+ element: pick.element
79111
+ });
79112
+ draft = null;
79113
+ } finally {
79114
+ busy = false;
79115
+ update();
79116
+ }
79117
+ }
79118
+ })
79119
+ }, draft.client ? `${draft.client.x},${draft.client.y}` : "corner") : null] }) : /* @__PURE__ */ jsx("div", {
79120
+ class: "flex h-full flex-col items-center justify-center gap-3 p-6 text-center",
79121
+ children: preview.state === "waking" ? /* @__PURE__ */ jsx(Loader, { label: t$2("tasks.agentBrowser.waking") }) : /* @__PURE__ */ jsxs(Fragment, { children: [
79122
+ /* @__PURE__ */ jsx(Icon$1, {
79123
+ name: "browser",
79124
+ size: 20,
79125
+ class: "text-muted"
79126
+ }),
79127
+ /* @__PURE__ */ jsx(Text, {
79128
+ as: "p",
79129
+ variant: "ui",
79130
+ tone: "muted",
79131
+ class: "max-w-xs text-balance",
79132
+ children: preview.state === "asleep" ? t$2("tasks.agentBrowser.asleep") : preview.state === "failed" ? preview.message : t$2("tasks.agentBrowser.noPreview")
79133
+ }),
79134
+ preview.state === "asleep" || preview.state === "failed" ? /* @__PURE__ */ jsx(Button, {
79135
+ variant: "secondary",
79136
+ size: "small",
79137
+ "data-testid": "agent-browser-wake",
79138
+ mix: on("click", handle.props.onWake),
79139
+ children: preview.state === "asleep" ? t$2("tasks.agentBrowser.wake") : t$2("tasks.agentBrowser.tryAgain")
77853
79140
  }) : null
77854
79141
  ] })
77855
79142
  });
79143
+ let status = /* @__PURE__ */ jsxs("footer", {
79144
+ class: "flex h-9 shrink-0 items-center gap-3 overflow-hidden whitespace-nowrap border-t border-line ps-3 pe-2 text-muted",
79145
+ "aria-label": t$2("tasks.agentBrowser.status"),
79146
+ children: [/* @__PURE__ */ jsx(Text, {
79147
+ variant: "ui-caption",
79148
+ class: "truncate",
79149
+ children: ready ? title || path : ""
79150
+ }), /* @__PURE__ */ jsx(Text, {
79151
+ variant: "ui-caption",
79152
+ class: "ms-auto truncate",
79153
+ children: host
79154
+ })]
79155
+ });
79156
+ return /* @__PURE__ */ jsx("div", {
79157
+ class: "h-full min-h-0",
79158
+ mix: listen,
79159
+ children: /* @__PURE__ */ jsx(AgentView, {
79160
+ details,
79161
+ browser: {
79162
+ toolbar,
79163
+ actions,
79164
+ content,
79165
+ status
79166
+ },
79167
+ terminal: terminal ? {
79168
+ tabs: /* @__PURE__ */ jsx("div", {
79169
+ class: "bud-segmented",
79170
+ role: "group",
79171
+ "aria-label": t$2("tasks.agentTerminal.sessions"),
79172
+ children: terminal.tabs.map((entry) => /* @__PURE__ */ jsx("button", {
79173
+ type: "button",
79174
+ "aria-pressed": entry.id === shownTab ? "true" : "false",
79175
+ "data-terminal-select": entry.id,
79176
+ mix: on("click", () => {
79177
+ tab = entry.id;
79178
+ update();
79179
+ }),
79180
+ children: /* @__PURE__ */ jsx(Text, {
79181
+ variant: "ui",
79182
+ children: entry.label
79183
+ })
79184
+ }, entry.id))
79185
+ }),
79186
+ content: /* @__PURE__ */ jsx(AgentTerminal, {
79187
+ tabs: terminal.tabs,
79188
+ active: shownTab,
79189
+ connect: terminal.connect
79190
+ })
79191
+ } : null
79192
+ })
79193
+ });
79194
+ };
79195
+ }
79196
+ //#endregion
79197
+ //#region ../ui/src/lib/tasks/task-run-panel.tsx
79198
+ function elapsed(from, now) {
79199
+ let seconds = Math.max(0, Math.round((now - Date.parse(from)) / 1e3));
79200
+ if (seconds < 60) return t$2("tasks.taskRunPanel.seconds", { count: seconds });
79201
+ return t$2("tasks.taskRunPanel.minutes", { count: Math.round(seconds / 60) });
79202
+ }
79203
+ /**
79204
+ * The factory's run on a task, above its discussion: Start task, the agent's progress, its summary
79205
+ * with Request changes, Approve & push and Discard, a failure with Retry, and the pushed branch.
79206
+ * @param handle - The run, whether it can start, and the actions.
79207
+ * @returns The panel render function.
79208
+ */
79209
+ function TaskRunPanel(handle) {
79210
+ let acting = null;
79211
+ let confirming = null;
79212
+ let requesting = false;
79213
+ function update() {
79214
+ if (!handle.signal.aborted) handle.update();
79215
+ }
79216
+ async function act(name, action) {
79217
+ if (acting) return;
79218
+ acting = name;
79219
+ update();
79220
+ try {
79221
+ await action();
79222
+ } catch {} finally {
79223
+ acting = null;
79224
+ confirming = null;
79225
+ update();
79226
+ }
79227
+ }
79228
+ let button = (name, label, action, variant = "secondary") => /* @__PURE__ */ jsxs(Button, {
79229
+ variant,
79230
+ size: "small",
79231
+ disabled: acting !== null,
79232
+ "data-testid": `run-${name}`,
79233
+ mix: on("click", () => void act(name, action)),
79234
+ children: [acting === name ? /* @__PURE__ */ jsx(Spinner, { size: 12 }) : null, label]
79235
+ });
79236
+ let confirm = (kind, question, label) => /* @__PURE__ */ jsxs("div", {
79237
+ class: "flex min-w-0 flex-wrap items-center gap-2",
79238
+ role: "group",
79239
+ "aria-label": question,
79240
+ "data-testid": `run-confirm-${kind}`,
79241
+ children: [
79242
+ /* @__PURE__ */ jsx(Text, {
79243
+ variant: "ui-caption",
79244
+ tone: "muted",
79245
+ class: "me-auto",
79246
+ children: question
79247
+ }),
79248
+ /* @__PURE__ */ jsx(Button, {
79249
+ variant: "ghost",
79250
+ size: "small",
79251
+ disabled: acting !== null,
79252
+ mix: on("click", () => {
79253
+ confirming = null;
79254
+ update();
79255
+ }),
79256
+ children: t$2("tasks.taskRunPanel.cancel")
79257
+ }),
79258
+ button(`${kind}-confirmed`, label, kind === "approve" ? handle.props.onApprove : handle.props.onDiscard, "primary")
79259
+ ]
79260
+ });
79261
+ let ask = (kind, label, variant) => /* @__PURE__ */ jsx(Button, {
79262
+ variant,
79263
+ size: "small",
79264
+ disabled: acting !== null,
79265
+ "data-testid": `run-${kind}`,
79266
+ mix: on("click", () => {
79267
+ confirming = kind;
79268
+ requesting = false;
79269
+ update();
79270
+ }),
79271
+ children: label
79272
+ });
79273
+ return () => {
79274
+ let { run, blocked, preview, now = Date.now() } = handle.props;
79275
+ let state = run?.state;
79276
+ let fresh = !run || state === "discarded";
79277
+ let working = state === "provisioning" || state === "working" || state === "changes" || state === "approved";
79278
+ let line = (icon, text, tone = "") => /* @__PURE__ */ jsxs("div", {
79279
+ class: `flex min-w-0 items-center gap-2 ${tone}`,
79280
+ "data-testid": "run-state",
79281
+ children: [
79282
+ icon,
79283
+ /* @__PURE__ */ jsx(Text, {
79284
+ variant: "ui",
79285
+ class: "min-w-0 [overflow-wrap:anywhere]",
79286
+ children: text
79287
+ }),
79288
+ run && working ? /* @__PURE__ */ jsx(Text, {
79289
+ variant: "ui-caption",
79290
+ tone: "muted",
79291
+ class: "ms-auto shrink-0 tabular-nums",
79292
+ children: elapsed(run.activity.findLast((entry) => entry.kind === "status")?.at ?? run.createdAt, now)
79293
+ }) : null
79294
+ ]
79295
+ });
79296
+ let activity = (run?.activity ?? []).filter((entry) => entry.kind !== "status").slice(-6);
79297
+ return /* @__PURE__ */ jsxs("section", {
79298
+ class: "flex min-w-0 flex-col gap-3",
79299
+ "aria-label": t$2("tasks.taskRunPanel.agent"),
79300
+ "data-testid": "task-run-panel",
79301
+ "data-state": state ?? (run === null ? "none" : "loading"),
79302
+ children: [/* @__PURE__ */ jsxs("div", {
79303
+ class: "flex items-center gap-2",
79304
+ children: [/* @__PURE__ */ jsx(Text, {
79305
+ as: "h3",
79306
+ variant: "ui",
79307
+ weight: "medium",
79308
+ children: t$2("tasks.taskRunPanel.agent")
79309
+ }), run && !fresh ? /* @__PURE__ */ jsx(Text, {
79310
+ variant: "ui-caption",
79311
+ tone: "muted",
79312
+ class: "min-w-0 truncate font-mono",
79313
+ children: run.branch
79314
+ }) : null]
79315
+ }), /* @__PURE__ */ jsx("div", {
79316
+ class: "flex min-w-0 flex-col gap-3 rounded-lg bg-[var(--bud-card)] p-3 ring-1 ring-[var(--bud-card-border)]",
79317
+ children: run === void 0 ? line(/* @__PURE__ */ jsx(Spinner, { size: 14 }), t$2("tasks.taskRunPanel.loading"), "text-muted") : fresh ? /* @__PURE__ */ jsxs("div", {
79318
+ class: "flex min-w-0 flex-wrap items-center gap-3",
79319
+ children: [/* @__PURE__ */ jsx(Text, {
79320
+ variant: "ui-caption",
79321
+ tone: "muted",
79322
+ class: "min-w-0 flex-1",
79323
+ children: blocked ?? t$2("tasks.taskRunPanel.startHint")
79324
+ }), blocked ? null : button("start", t$2("tasks.taskRunPanel.start"), handle.props.onStart, "primary")]
79325
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [
79326
+ state === "provisioning" ? line(/* @__PURE__ */ jsx(Spinner, { size: 14 }), t$2("tasks.taskRunPanel.settingUp")) : state === "working" || state === "changes" ? line(/* @__PURE__ */ jsx(Spinner, { size: 14 }), t$2("tasks.taskRunPanel.working")) : state === "approved" || state === "pushing" ? line(/* @__PURE__ */ jsx(Spinner, { size: 14 }), t$2("tasks.taskRunPanel.pushing", { branch: run.branch })) : state === "review" ? line(/* @__PURE__ */ jsx(Icon$1, {
79327
+ name: "circle-dot",
79328
+ size: 14
79329
+ }), t$2("tasks.taskRunPanel.review"), "text-amber-600 dark:text-amber-400") : state === "needs_context" ? line(/* @__PURE__ */ jsx(Icon$1, {
79330
+ name: "message",
79331
+ size: 14
79332
+ }), t$2("tasks.taskRunPanel.needsContext"), "text-violet-600 dark:text-violet-400") : state === "merged" ? line(/* @__PURE__ */ jsx(Icon$1, {
79333
+ name: "circle-check",
79334
+ size: 14
79335
+ }), t$2("tasks.taskRunPanel.merged", { branch: run.branch }), "text-emerald-600 dark:text-emerald-400") : state === "pushed" ? line(/* @__PURE__ */ jsx(Icon$1, {
79336
+ name: "push",
79337
+ size: 14
79338
+ }), t$2("tasks.taskRunPanel.pushed", {
79339
+ branch: run.branch,
79340
+ commit: (run.pushed ?? "").slice(0, 7)
79341
+ }), "text-emerald-600 dark:text-emerald-400") : line(/* @__PURE__ */ jsx(Icon$1, {
79342
+ name: "circle-alert",
79343
+ size: 14
79344
+ }), run.error?.message ?? t$2("tasks.taskRunPanel.failed"), "text-red-600 dark:text-red-400"),
79345
+ run.asleep && (state === "review" || state === "needs_context" || state === "failed") ? /* @__PURE__ */ jsxs("div", {
79346
+ class: "flex min-w-0 items-center gap-2 text-muted",
79347
+ "data-testid": "run-asleep",
79348
+ children: [/* @__PURE__ */ jsx(Icon$1, {
79349
+ name: "moon",
79350
+ size: 13,
79351
+ class: "shrink-0"
79352
+ }), /* @__PURE__ */ jsx(Text, {
79353
+ variant: "ui-caption",
79354
+ tone: "muted",
79355
+ class: "min-w-0",
79356
+ children: t$2("tasks.taskRunPanel.asleep")
79357
+ })]
79358
+ }) : null,
79359
+ state === "needs_context" && run.question ? /* @__PURE__ */ jsx("div", {
79360
+ class: "min-w-0 rounded-md bg-[var(--bud-control)] px-3 py-2",
79361
+ "data-testid": "run-question",
79362
+ children: /* @__PURE__ */ jsx(TaskMarkdown, { children: run.question })
79363
+ }) : null,
79364
+ state === "review" && run.summary ? /* @__PURE__ */ jsx("div", {
79365
+ class: "min-w-0",
79366
+ "data-testid": "run-summary",
79367
+ children: /* @__PURE__ */ jsx(TaskMarkdown, { children: run.summary })
79368
+ }) : null,
79369
+ activity.length && state !== "pushed" && state !== "merged" ? /* @__PURE__ */ jsx("ol", {
79370
+ class: "flex min-w-0 flex-col gap-1",
79371
+ "aria-label": t$2("tasks.taskRunPanel.activity"),
79372
+ children: activity.map((entry, index) => /* @__PURE__ */ jsxs("li", {
79373
+ class: "flex min-w-0 items-baseline gap-2",
79374
+ children: [/* @__PURE__ */ jsx(Icon$1, {
79375
+ name: entry.kind === "tool" ? "code" : entry.kind === "error" ? "warning" : "circle",
79376
+ size: 11,
79377
+ class: "shrink-0 translate-y-px text-muted"
79378
+ }), /* @__PURE__ */ jsx(Text, {
79379
+ variant: "ui-caption",
79380
+ tone: "muted",
79381
+ class: "min-w-0 truncate font-mono",
79382
+ children: entry.text
79383
+ })]
79384
+ }, `${entry.at}-${index}`))
79385
+ }) : null,
79386
+ confirming === "approve" ? confirm("approve", t$2("tasks.taskRunPanel.confirmApprove", { branch: run.branch }), t$2("tasks.taskRunPanel.approve")) : confirming === "discard" ? confirm("discard", t$2("tasks.taskRunPanel.confirmDiscard"), t$2("tasks.taskRunPanel.discard")) : state === "needs_context" && handle.props.onAnswer ? /* @__PURE__ */ jsxs("div", {
79387
+ class: "flex min-w-0 flex-col gap-2",
79388
+ children: [/* @__PURE__ */ jsx(CommentComposer, {
79389
+ label: t$2("tasks.taskRunPanel.answer"),
79390
+ placeholder: t$2("tasks.taskRunPanel.answerPlaceholder"),
79391
+ busy: acting !== null,
79392
+ onSubmit: async (message) => {
79393
+ await handle.props.onAnswer(message);
79394
+ }
79395
+ }), /* @__PURE__ */ jsx("span", {
79396
+ class: "ms-auto",
79397
+ children: ask("discard", t$2("tasks.taskRunPanel.discard"), "ghost")
79398
+ })]
79399
+ }) : requesting && state === "review" ? /* @__PURE__ */ jsx(CommentComposer, {
79400
+ label: t$2("tasks.taskRunPanel.requestChanges"),
79401
+ placeholder: t$2("tasks.taskRunPanel.changesPlaceholder"),
79402
+ autoFocus: true,
79403
+ busy: acting !== null,
79404
+ onSubmit: async (message) => {
79405
+ await handle.props.onChanges(message);
79406
+ requesting = false;
79407
+ update();
79408
+ },
79409
+ footer: /* @__PURE__ */ jsx(Button, {
79410
+ variant: "ghost",
79411
+ size: "small",
79412
+ mix: on("click", () => {
79413
+ requesting = false;
79414
+ update();
79415
+ }),
79416
+ children: t$2("tasks.taskRunPanel.cancel")
79417
+ })
79418
+ }) : /* @__PURE__ */ jsxs("div", {
79419
+ class: "flex min-w-0 flex-wrap items-center gap-2",
79420
+ children: [
79421
+ state === "review" ? ask("approve", t$2("tasks.taskRunPanel.approve"), "primary") : null,
79422
+ state === "review" ? /* @__PURE__ */ jsx(Button, {
79423
+ variant: "secondary",
79424
+ size: "small",
79425
+ disabled: acting !== null,
79426
+ "data-testid": "run-changes",
79427
+ mix: on("click", () => {
79428
+ requesting = true;
79429
+ update();
79430
+ }),
79431
+ children: t$2("tasks.taskRunPanel.requestChanges")
79432
+ }) : null,
79433
+ state === "failed" && run.error?.retryable && run.failedIn ? button("retry", t$2("tasks.taskRunPanel.retry"), handle.props.onRetry, "primary") : null,
79434
+ preview && (state === "working" || state === "changes" || state === "review" || state === "needs_context") ? button("preview", t$2("tasks.taskRunPanel.preview"), handle.props.onPreview) : null,
79435
+ state === "pushed" && handle.props.onCanvas ? /* @__PURE__ */ jsx(Button, {
79436
+ variant: "secondary",
79437
+ size: "small",
79438
+ "data-testid": "run-canvas",
79439
+ mix: on("click", () => handle.props.onCanvas?.()),
79440
+ children: t$2("tasks.taskRunPanel.showOnCanvas")
79441
+ }) : null,
79442
+ state === "pushed" || state === "merged" ? button("start", t$2("tasks.taskRunPanel.startAgain"), handle.props.onStart, "ghost") : null,
79443
+ state !== "pushed" && state !== "merged" && state !== "pushing" && state !== "approved" ? /* @__PURE__ */ jsx("span", {
79444
+ class: "ms-auto",
79445
+ children: ask("discard", t$2("tasks.taskRunPanel.discard"), "ghost")
79446
+ }) : null
79447
+ ]
79448
+ })
79449
+ ] })
79450
+ })]
79451
+ });
77856
79452
  };
77857
79453
  }
77858
79454
  //#endregion
@@ -83583,7 +85179,7 @@ function ItemDiscussion(handle) {
83583
85179
  */
83584
85180
  function ThreadTaskLinks(handle) {
83585
85181
  return () => {
83586
- let { itemIds, items, href, onEdit, busy } = handle.props;
85182
+ let { itemIds, items, href, onEdit, busy, schema, runs } = handle.props;
83587
85183
  if (!itemIds.length && !onEdit) return null;
83588
85184
  let names = new Map(items.map((item) => [item.id, item]));
83589
85185
  return /* @__PURE__ */ jsxs("div", {
@@ -83595,15 +85191,33 @@ function ThreadTaskLinks(handle) {
83595
85191
  href: href(id),
83596
85192
  title: item?.title ?? id,
83597
85193
  class: "bud-interaction bud-control inline-flex min-h-6 max-w-full items-center gap-1.5 rounded-md px-2 py-0.5",
83598
- children: [/* @__PURE__ */ jsx(Text, {
83599
- variant: "code",
83600
- class: "shrink-0",
83601
- children: id
83602
- }), item?.title ? /* @__PURE__ */ jsx(Text, {
83603
- variant: "ui-caption",
83604
- class: "truncate",
83605
- children: item.title
83606
- }) : null]
85194
+ children: [
85195
+ /* @__PURE__ */ jsx(Text, {
85196
+ variant: "code",
85197
+ class: "shrink-0",
85198
+ children: id
85199
+ }),
85200
+ item?.title ? /* @__PURE__ */ jsx(Text, {
85201
+ variant: "ui-caption",
85202
+ class: "truncate",
85203
+ children: item.title
85204
+ }) : null,
85205
+ item?.status && schema ? /* @__PURE__ */ jsxs("span", {
85206
+ class: "flex shrink-0 items-center gap-1 text-muted",
85207
+ "data-task-status": true,
85208
+ children: [/* @__PURE__ */ jsx(StatusDot, {
85209
+ status: item.status,
85210
+ schema
85211
+ }), /* @__PURE__ */ jsx(Text, {
85212
+ variant: "ui-caption",
85213
+ children: schema.statuses.find((status) => status.value === item.status)?.label ?? taskLabel(item.status)
85214
+ })]
85215
+ }) : null,
85216
+ runs?.[id] && taskRunBadge(runs[id]) ? /* @__PURE__ */ jsx("span", {
85217
+ class: "shrink-0",
85218
+ children: /* @__PURE__ */ jsx(TaskRunBadge, { run: runs[id] })
85219
+ }) : null
85220
+ ]
83607
85221
  }, id);
83608
85222
  }), onEdit ? /* @__PURE__ */ jsx(IconButton, {
83609
85223
  icon: "tasks",
@@ -84150,6 +85764,11 @@ var endpoints = [
84150
85764
  write: true,
84151
85765
  list: false
84152
85766
  },
85767
+ {
85768
+ route: routes.comments.makeTask,
85769
+ write: true,
85770
+ list: false
85771
+ },
84153
85772
  {
84154
85773
  route: routes.comments.deleteMessage,
84155
85774
  write: true,
@@ -84783,4 +86402,4 @@ function unavailableComments(message = commentsUnavailable) {
84783
86402
  };
84784
86403
  }
84785
86404
  //#endregion
84786
- export { openShellTab as $, areFileRenderOptionsEqual as $t, FileRecoveryDialog as A, fileHref as At, parseTaskDesign as B, Button as Bt, ThreadTaskPicker as C, hasMessage as Cn, readReviewLocation as Ct, FileEditorPanel as D, useLocaleSource as Dn, reviewHref as Dt, ReviewActionDialog as E, t$2 as En, reviewContextKey as Et, defaultFileDestination as F, CommentThreadDetail as Ft, ConversationSidebar as G, areDiffTargetsEqual as Gt, captureCanvasPoint as H, renderDiffWithHighlighter as Ht, fileActionIntent as I, CommentThreadItem as It, FieldCardContent as J, WorkerPoolWorkerError as Jt, CommentThreadHeading as K, WorkerPoolTaskCanceledError as Kt, mutationFileView as L, CommentComposer as Lt, FileReviewPanel as M, readFileLocation as Mt, codeThemes as N, reconcileFileView as Nt, defaultEditorPreferences as O, Text as On, closeFileTab as Ot, FileWorkspace as P, rememberFile as Pt, initialShellTabs as Q, renderFileWithHighlighter as Qt, remainingMutationIntent as R, Loader as Rt, ThreadTaskLinks as S, writePreference as Sn, parseReviewSession as St, FileConflictPanel as T, locale as Tn, reviewComparison as Tt, FileSearchPanel as U, areDiffRenderOptionsEqual as Ut, CanvasWorkspace as V, isDiffPlainText as Vt, BranchSidebar as W, areFilesEqual as Wt, activeTab as X, markWorkerErrorReported as Xt, FieldCardHeader as Y, isHandledWorkerPoolError as Yt, closeShellTab as Z, isFilePlainText as Zt, requestComments as _, LiveStatus as _n, taskHref as _t, saveThreads as a, attachResolvedThemes as an, tabsCookieValue as at, writeOptimistically as b, toast as bn, defaultReviewView as bt, previewKey as c, getResolvedOrResolveLanguage as cn, codeCommentCounts as ct, saveWorkspace as d, ResolvedLanguages as dn, conversationLabel as dt, hasResolvedThemes as en, parseShellTabs as et, storeDocument as f, ToolbarSeparator as fn, isCodeConversation as ft, CommentsRequestError as g, IconButton as gn, selectedTask as gt, storedWorkspace as h, Select as hn, readConversationLocation as ht, saveThread as i, validateResolvedThemeName as in, tabsCookieName as it, FileMutationDialog as j, parseFileView as jt, parseEditorPreferences as k, defaultFileView as kt, projectStore as l, resolveLanguage as ln, conversationDestination as lt, storedFiles as m, ShellTabBar as mn, locateCodeConversations as mt, unavailableComments as n, getSharedHighlighter as nn, stepShellTab as nt, threadMatches as o, themeResolver as on, visitShellTab as ot, storedDocument as p, WorkspaceLayout as pn, legacyConversationHref as pt, FieldCard as q, WorkerPoolTerminatedError as qt, followThreads as r, prepareThemeResolution as rn, tabHref as rt, applyFileUpdate as s, getThemes as sn, PagesWorkspace as st, commentsUnavailable as t, areThemesEqual as tn, readTabsCookie as tt, saveFiles as u, areLanguagesAttached as un, conversationHref as ut, projectLive as v, Tooltip as vn, taskRole as vt, ItemDiscussion as w, isLocale as wn, rememberReviewPosition as wt, writeRows as x, readPreference as xn, legacyFileHref as xt, plainRow as y, AppShell as yn, defaultReviewPosition as yt, TaskWorkspace as z, Spinner as zt };
86405
+ export { Dialog as $, WorkerPoolTaskCanceledError as $t, FileRecoveryDialog as A, hasMessage as An, readReviewLocation as At, AgentBrowser as B, reconcileFileView as Bt, ThreadTaskPicker as C, IconButton as Cn, taskHref as Ct, FileEditorPanel as D, toast as Dn, defaultReviewView as Dt, ReviewActionDialog as E, AppShell as En, defaultReviewPosition as Et, defaultFileDestination as F, Text as Fn, closeFileTab as Ft, FileSearchPanel as G, Loader as Gt, parseTaskDesign as H, CommentThreadDetail as Ht, fileActionIntent as I, defaultFileView as It, CommentThreadHeading as J, isDiffPlainText as Jt, BranchSidebar as K, Spinner as Kt, mutationFileView as L, fileHref as Lt, FileReviewPanel as M, locale as Mn, reviewComparison as Mt, codeThemes as N, t$2 as Nn, reviewContextKey as Nt, defaultEditorPreferences as O, readPreference as On, legacyFileHref as Ot, FileWorkspace as P, useLocaleSource as Pn, reviewHref as Pt, FieldCardHeader as Q, areDiffTargetsEqual as Qt, remainingMutationIntent as R, parseFileView as Rt, ThreadTaskLinks as S, Select as Sn, taskAgentHref as St, FileConflictPanel as T, Tooltip as Tn, taskRole as Tt, CanvasWorkspace as U, CommentThreadItem as Ut, TaskWorkspace as V, rememberFile as Vt, captureCanvasPoint as W, CommentComposer as Wt, FieldCardContent as X, areDiffRenderOptionsEqual as Xt, FieldCard as Y, renderDiffWithHighlighter as Yt, FieldCardFooter as Z, areFilesEqual as Zt, requestComments as _, areLanguagesAttached as _n, legacyConversationHref as _t, saveThreads as a, renderFileWithHighlighter as an, readTabsCookie as at, writeOptimistically as b, WorkspaceLayout as bn, agentViewOpen as bt, previewKey as c, areThemesEqual as cn, tabsCookieName as ct, saveWorkspace as d, validateResolvedThemeName as dn, PagesWorkspace as dt, WorkerPoolTerminatedError as en, activeTab as et, storeDocument as f, attachResolvedThemes as fn, codeCommentCounts as ft, CommentsRequestError as g, resolveLanguage as gn, isCodeConversation as gt, storedWorkspace as h, getResolvedOrResolveLanguage as hn, conversationLabel as ht, saveThread as i, isFilePlainText as in, parseShellTabs as it, FileMutationDialog as j, isLocale as jn, rememberReviewPosition as jt, parseEditorPreferences as k, writePreference as kn, parseReviewSession as kt, projectStore as l, getSharedHighlighter as ln, tabsCookieValue as lt, storedFiles as m, getThemes as mn, conversationHref as mt, unavailableComments as n, isHandledWorkerPoolError as nn, initialShellTabs as nt, threadMatches as o, areFileRenderOptionsEqual as on, stepShellTab as ot, storedDocument as p, themeResolver as pn, conversationDestination as pt, ConversationSidebar as q, Button as qt, followThreads as r, markWorkerErrorReported as rn, openShellTab as rt, applyFileUpdate as s, hasResolvedThemes as sn, tabHref as st, commentsUnavailable as t, WorkerPoolWorkerError as tn, closeShellTab as tt, saveFiles as u, prepareThemeResolution as un, visitShellTab as ut, projectLive as v, ResolvedLanguages as vn, locateCodeConversations as vt, ItemDiscussion as w, LiveStatus as wn, taskLabel as wt, writeRows as x, ShellTabBar as xn, selectedTask as xt, plainRow as y, ToolbarSeparator as yn, readConversationLocation as yt, TaskRunPanel as z, readFileLocation as zt };