@bud.sh/app 0.5.1 → 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-Dn2pfmXf.js → index-DtISWZp9.js} +2 -2
  10. package/dist/client/assets/pages-BJ-tNJ4J.js +1 -0
  11. package/dist/client/assets/{project-branches-CMGRmrqr.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-ZbKDh78d.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-BPpc4Gd7.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-BYTOp1p7.js → canvas-AII16n9i.js} +97 -6
  22. package/dist/hosted/assets/{comment-data-Cn5y2VxV.js → comment-data-BXfMElfx.js} +1998 -381
  23. package/dist/hosted/assets/dist-BCSTeNf4.js +4785 -0
  24. package/dist/hosted/assets/{files-B1P2_24q.js → files-D_1yeAVO.js} +10 -5
  25. package/dist/hosted/assets/{pages-B0ZlVdci.js → pages-CN_SbKWA.js} +3 -3
  26. package/dist/hosted/assets/{project-branches-DlCWmfRo.js → project-branches-Bxp0DCwg.js} +1 -1
  27. package/dist/hosted/assets/{project-thread-links-BZXQ200n.js → project-thread-links-KqQoKBLE.js} +76 -4
  28. package/dist/{node-host/assets/screen-DapOVrga.js → hosted/assets/screen-DpAcDUKR.js} +25 -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 -8
  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-CkMK4hoN.js → node-host/assets/canvas-BeDoufy1.js} +97 -7
  49. package/dist/node-host/assets/{comment-data-yfWEdDQL.js → comment-data-DE2T9yTj.js} +1974 -355
  50. package/dist/node-host/assets/dist-BCSTeNf4.js +4785 -0
  51. package/dist/node-host/assets/{files-anHi-apm.js → files-Dl-PTS09.js} +11 -6
  52. package/dist/node-host/assets/{pages-CW4aF6dK.js → pages-DL2sk6_U.js} +3 -3
  53. package/dist/node-host/assets/{project-branches-D7rVCxQX.js → project-branches-DGp5ELct.js} +1 -1
  54. package/dist/{server/assets/project-thread-links-lLS_rq7c.js → node-host/assets/project-thread-links-CgBV3Jcm.js} +76 -5
  55. package/dist/{hosted/assets/screen-CfdC3NbR.js → node-host/assets/screen-B55yyVfb.js} +25 -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-DxmcFZCh.js → server/assets/canvas-CJWQ-jjv.js} +98 -6
  61. package/dist/server/assets/{comment-data-NLeHG89b.js → comment-data-Rg42ToTW.js} +1660 -26
  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-CRdl489E.js → files-CPJqKeMo.js} +12 -7
  65. package/dist/server/assets/{listener-BAYn9Q-u.js → listener-D61O6PzF.js} +708 -12
  66. package/dist/server/assets/{pages-DXVlJlBC.js → pages-KJY_Ba92.js} +4 -4
  67. package/dist/server/assets/{project-branches-CwTsf6WQ.js → project-branches-qG9ACZvo.js} +2 -2
  68. package/dist/{node-host/assets/project-thread-links-m-OLpsD9.js → server/assets/project-thread-links-CqK0lqCF.js} +77 -4
  69. package/dist/{node-host/assets/tasks-request-B0aeNocI.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-B1zH_1O3.js → screen-CBrHPFug.js} +26 -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-8GXJIuDK.js +0 -1
  98. package/dist/client/assets/difference-worker-C99ychYw.js +0 -8
  99. package/dist/client/assets/files-DkWt1l9H.js +0 -1
  100. package/dist/client/assets/i18n-hH_Ba5QO.js +0 -1
  101. package/dist/client/assets/index-tpHYVXma.css +0 -2
  102. package/dist/client/assets/pages-BVd6MQmu.js +0 -1
  103. package/dist/client/assets/project-comments-D1IIQwsW.js +0 -1
  104. package/dist/client/assets/project-thread-links-DKwe_SYb.js +0 -1
  105. package/dist/client/assets/project-work-D4DZqBCZ.js +0 -1
  106. package/dist/client/assets/tasks-Cn0VOZ9Z.js +0 -1
  107. package/dist/client/assets/tasks-request-BLyOzokZ.js +0 -1
  108. package/dist/client/assets/workspace-DGErsSg6.js +0 -2
  109. package/dist/hosted/assets/tasks-_yKh2Z6q.js +0 -649
  110. package/dist/hosted/assets/tasks-request-CFPLvLc7.js +0 -113
  111. package/dist/node-host/assets/tasks-BBK_CybR.js +0 -651
  112. package/dist/server/assets/project-work-CSZlCwH-.js +0 -88
  113. package/dist/server/assets/tasks-CGdz-uox.js +0 -652
  114. package/dist/server/assets/tasks-request-D2NBjCTl.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"
@@ -4431,6 +4618,114 @@ var de$1 = {
4431
4618
  text: "Tabs",
4432
4619
  source: "8ec4824d"
4433
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
+ },
4434
4729
  "tasks.taskActions.actionInProgress": {
4435
4730
  text: "Eine Aufgabenaktion läuft bereits.",
4436
4731
  source: "1ae83c01"
@@ -4617,6 +4912,14 @@ var de$1 = {
4617
4912
  text: "In Bearbeitung",
4618
4913
  source: "2948b425"
4619
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
+ },
4620
4923
  "tasks.taskData.label.open": {
4621
4924
  text: "Offen",
4622
4925
  source: "538b10e9"
@@ -4629,6 +4932,10 @@ var de$1 = {
4629
4932
  text: "Bereit",
4630
4933
  source: "0bca3294"
4631
4934
  },
4935
+ "tasks.taskData.label.ready_to_merge": {
4936
+ text: "Bereit zum Zusammenführen",
4937
+ source: "b0ea5dc5"
4938
+ },
4632
4939
  "tasks.taskData.label.task": {
4633
4940
  text: "Aufgabe",
4634
4941
  source: "76ef3d8c"
@@ -4960,6 +5267,160 @@ var de$1 = {
4960
5267
  text: "Unerledigter Eintrag",
4961
5268
  source: "eee80db8"
4962
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
+ },
4963
5424
  "tasks.taskSections.latestEvents": {
4964
5425
  text: {
4965
5426
  one: "Das neueste Ereignis wird angezeigt.",
@@ -5077,6 +5538,10 @@ var de$1 = {
5077
5538
  text: "Erstelle eine Aufgabe, um mit der Planung deiner Arbeit zu beginnen.",
5078
5539
  source: "7c21b645"
5079
5540
  },
5541
+ "tasks.taskWorkspace.fewerStatuses": {
5542
+ text: "Weniger Statuswerte anzeigen",
5543
+ source: "1de3f0ed"
5544
+ },
5080
5545
  "tasks.taskWorkspace.filterEpic": {
5081
5546
  text: "Epic filtern",
5082
5547
  source: "19c2ed58"
@@ -5145,6 +5610,17 @@ var de$1 = {
5145
5610
  text: "Noch kein {label}-Arbeitsbereich vorhanden",
5146
5611
  source: "233c23c9"
5147
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
+ },
5148
5624
  "tasks.taskWorkspace.priority": {
5149
5625
  text: "Priorität",
5150
5626
  source: "e68d9f29"
@@ -5216,6 +5692,13 @@ var de$1 = {
5216
5692
  text: "Deine lokalen Aufgabenänderungen teilen",
5217
5693
  source: "1dad116c"
5218
5694
  },
5695
+ "tasks.taskWorkspace.showTasks": {
5696
+ text: {
5697
+ one: "1 Aufgabe anzeigen",
5698
+ other: "{count} Aufgaben anzeigen"
5699
+ },
5700
+ source: "56258faa"
5701
+ },
5219
5702
  "tasks.taskWorkspace.showingCount": {
5220
5703
  text: "Zeigt {shown} von {total}",
5221
5704
  source: "e8675f4a"
@@ -5312,6 +5795,13 @@ var de$1 = {
5312
5795
  * and the thing (`canvas.zoomIn`); `pnpm translate` keeps the other languages in step.
5313
5796
  */
5314
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",
5315
5805
  "app.client.commentsRequest.emptyResponse": "The comments service returned an empty response.",
5316
5806
  "app.client.commentsRequest.invalidData": "The comments service returned invalid data.",
5317
5807
  "app.client.commentsRequest.invalidEndpoint": "Invalid comments endpoint.",
@@ -5334,6 +5824,20 @@ var en = {
5334
5824
  "app.client.differenceView.slideStatus": "{kind} · change {change} of {count} · {index} / {total}",
5335
5825
  "app.client.differenceView.slideshowLabel": "Differences slideshow",
5336
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.",
5337
5841
  "app.client.fileDrafts.deleteWithUnsavedDrafts": "Save or discard the unsaved drafts in this selection before deleting it.",
5338
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.",
5339
5843
  "app.client.fileDrafts.destinationHasDraft": "A destination has an unsaved draft. Save or discard it before moving files here.",
@@ -5445,6 +5949,7 @@ var en = {
5445
5949
  "app.client.projectComments.refreshBeforeTryingAgain": "The comment write could not be confirmed. Refresh before trying again.",
5446
5950
  "app.client.projectComments.reloadDiscussionBeforeSaving": "Reload this discussion before saving.",
5447
5951
  "app.client.projectComments.serviceReturnedAnotherDiscussion": "The comments service returned another discussion.",
5952
+ "app.client.projectComments.taskCreated": "Task created",
5448
5953
  "app.client.projectComments.waitForCurrentOperation": "Wait for the current comment operation to finish.",
5449
5954
  "app.client.projectDifferences.comparisonFailed": "The pictures could not be compared.",
5450
5955
  "app.client.projectFileReview.commentsUnavailable": "Comments are stored by your storage adapter. Beads: run bd init in this project.",
@@ -5499,15 +6004,20 @@ var en = {
5499
6004
  "app.client.projectPreviews.requestFailed": "Preview request failed ({status}).",
5500
6005
  "app.client.projectTaskPicker.adapterUnavailable": "The task adapter is unavailable.",
5501
6006
  "app.client.projectTaskPicker.loadFailed": "Could not load tasks.",
6007
+ "app.client.projectTasks.closeAgentView": "Close Agent view",
5502
6008
  "app.client.projectTasks.couldNotLoadTask": "Could not load this task.",
5503
6009
  "app.client.projectTasks.couldNotLoadTasks": "Could not load tasks.",
5504
6010
  "app.client.projectTasks.differentTaskRefresh": "The task service returned a different task. Refresh and try again.",
5505
6011
  "app.client.projectTasks.differentTaskRefreshRetry": "The task service returned a different task. Refresh before retrying.",
6012
+ "app.client.projectTasks.openAgentView": "Open Agent view",
5506
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.",
5507
6016
  "app.client.projectTasks.undidTaskChange": "Bud undid a task change",
5508
6017
  "app.client.projectTasks.writeNotConfirmed": "The write was not confirmed.",
5509
6018
  "app.client.projectThreadLinks.anotherDiscussion": "The service returned another discussion.",
5510
6019
  "app.client.projectThreadLinks.linkTasks": "Link tasks",
6020
+ "app.client.projectThreadLinks.makeTask": "Make task",
5511
6021
  "app.client.projectThreadLinks.reviewLinksBeforeSaving": "Review the latest links before saving.",
5512
6022
  "app.client.screenHost.couldNotOpen": "Could not open {label}.",
5513
6023
  "app.client.screenHost.didntOpen": "{label} didn't open",
@@ -5516,6 +6026,14 @@ var en = {
5516
6026
  "app.client.screenHost.loading": "Loading {label}…",
5517
6027
  "app.client.screenHost.noRouteMatches": "No screen route matches {href}.",
5518
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",
5519
6037
  "app.client.taskDiscussion.addContextPlaceholder": "Add context for your team…",
5520
6038
  "app.client.taskDiscussion.addTaskComment": "Add task comment",
5521
6039
  "app.client.taskDiscussion.cancel": "Cancel",
@@ -5545,6 +6063,7 @@ var en = {
5545
6063
  },
5546
6064
  "app.client.threadLinks.taskDiscussionNeedsLinkedTask": "A task discussion needs at least one linked task.",
5547
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",
5548
6067
  "app.client.workspace.connectProjectToOpenDiscussion": "Connect a project to open this discussion.",
5549
6068
  "app.client.workspace.couldNotOpenDiscussion": "Could not open this discussion.",
5550
6069
  "app.client.workspace.discussion": "Discussion",
@@ -5555,6 +6074,19 @@ var en = {
5555
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.",
5556
6075
  "app.client.workspace.yourProjectSideBySide": "Your project, side by side.",
5557
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",
5558
6090
  "appShell.mainNavigation": "Main navigation",
5559
6091
  "breadcrumb.navigationLabel": "Breadcrumb",
5560
6092
  "canvas.artboardCanvas.chooseCollectionPage": "Choose a {collection} page",
@@ -6412,6 +6944,33 @@ var en = {
6412
6944
  other: "{count} tabs"
6413
6945
  },
6414
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",
6415
6974
  "tasks.taskActions.actionInProgress": "A task action is already in progress.",
6416
6975
  "tasks.taskActions.actions": "Actions",
6417
6976
  "tasks.taskActions.changeNotConfirmed": "The change was not confirmed. Refresh before trying again.",
@@ -6463,9 +7022,12 @@ var en = {
6463
7022
  "tasks.taskData.label.feature": "Feature",
6464
7023
  "tasks.taskData.label.hooked": "Hooked",
6465
7024
  "tasks.taskData.label.in_progress": "In progress",
7025
+ "tasks.taskData.label.merged": "Merged",
7026
+ "tasks.taskData.label.needs_approval": "Needs approval",
6466
7027
  "tasks.taskData.label.open": "Open",
6467
7028
  "tasks.taskData.label.pinned": "Pinned",
6468
7029
  "tasks.taskData.label.ready": "Ready",
7030
+ "tasks.taskData.label.ready_to_merge": "Ready to merge",
6469
7031
  "tasks.taskData.label.task": "Task",
6470
7032
  "tasks.taskData.low": "Low",
6471
7033
  "tasks.taskData.noEpic": "No epic",
@@ -6551,6 +7113,49 @@ var en = {
6551
7113
  "tasks.taskMarkdown.completedItem": "Completed item",
6552
7114
  "tasks.taskMarkdown.image": "Image",
6553
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…",
6554
7159
  "tasks.taskSections.latestEvents": {
6555
7160
  one: "Showing the latest {count} event.",
6556
7161
  other: "Showing the latest {count} events."
@@ -6587,6 +7192,7 @@ var en = {
6587
7192
  "tasks.taskWorkspace.connectProject": "Connect a project",
6588
7193
  "tasks.taskWorkspace.createTask": "Create task",
6589
7194
  "tasks.taskWorkspace.createToPlan": "Create a task to start planning your work.",
7195
+ "tasks.taskWorkspace.fewerStatuses": "Show fewer statuses",
6590
7196
  "tasks.taskWorkspace.filterEpic": "Filter epic",
6591
7197
  "tasks.taskWorkspace.filterField": "Filter {field}",
6592
7198
  "tasks.taskWorkspace.filters": "Filters",
@@ -6604,6 +7210,11 @@ var en = {
6604
7210
  "tasks.taskWorkspace.noMatches": "No tasks match this view",
6605
7211
  "tasks.taskWorkspace.noRemote": "No {label} remote is configured",
6606
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",
6607
7218
  "tasks.taskWorkspace.priority": "Priority",
6608
7219
  "tasks.taskWorkspace.projectTasks": "Project tasks",
6609
7220
  "tasks.taskWorkspace.pullChanges": "Pull changes",
@@ -6624,6 +7235,10 @@ var en = {
6624
7235
  "tasks.taskWorkspace.searchPlaceholder": "Search tasks, IDs, labels…",
6625
7236
  "tasks.taskWorkspace.searchTasks": "Search tasks",
6626
7237
  "tasks.taskWorkspace.shareLocalChanges": "Share your local task changes",
7238
+ "tasks.taskWorkspace.showTasks": {
7239
+ one: "Show 1 task",
7240
+ other: "Show {count} tasks"
7241
+ },
6627
7242
  "tasks.taskWorkspace.showingCount": "Showing {shown} of {total}",
6628
7243
  "tasks.taskWorkspace.sortTasks": "Sort tasks",
6629
7244
  "tasks.taskWorkspace.startBud": "Start Bud from your web project to see its tasks.",
@@ -46674,6 +47289,7 @@ function taskFields(item, schema) {
46674
47289
  //#endregion
46675
47290
  //#region ../ui/src/lib/tasks/task-data.ts
46676
47291
  var taskMatcher = createMatcher(taskRoutes.show.pattern);
47292
+ var agentMatcher = createMatcher(taskRoutes.agent.pattern);
46677
47293
  var defaultTaskView = {
46678
47294
  query: "",
46679
47295
  fields: {},
@@ -46855,6 +47471,26 @@ function taskHref(id) {
46855
47471
  }
46856
47472
  }
46857
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
+ /**
46858
47494
  * Reads the typed task place, or one older query selection on the board URL.
46859
47495
  * @param location - The current location or legacy query link.
46860
47496
  * @returns The validated task ID, or null for the board or an invalid link.
@@ -46863,7 +47499,7 @@ function selectedTask(location) {
46863
47499
  try {
46864
47500
  let url = new URL(location, "http://bud.invalid/tasks");
46865
47501
  if (url.href.length > 32768) return null;
46866
- 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;
46867
47503
  return value ? parseWorkItemRef({ id: value }).id : null;
46868
47504
  } catch {
46869
47505
  return null;
@@ -61099,6 +61735,85 @@ function TaskEditor(handle) {
61099
61735
  };
61100
61736
  }
61101
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
61102
61817
  //#region ../ui/src/lib/tasks/task-card.tsx
61103
61818
  var statusTone = {
61104
61819
  backlog: "bg-violet-400",
@@ -61138,7 +61853,8 @@ function TaskCard(handle) {
61138
61853
  let issue = taskFields(item, schema);
61139
61854
  let linked = issue.dependencyCount ?? issue.dependencies.length;
61140
61855
  let dependents = issue.dependentCount ?? issue.dependents.length;
61141
- 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;
61142
61858
  let priority = /* @__PURE__ */ jsx(Text, {
61143
61859
  variant: "ui-caption",
61144
61860
  weight: "medium",
@@ -61147,6 +61863,7 @@ function TaskCard(handle) {
61147
61863
  children: typeof issue.priority === "number" ? `P${issue.priority}` : issue.priorityLabel
61148
61864
  });
61149
61865
  let meta = /* @__PURE__ */ jsxs(Fragment, { children: [
61866
+ run ? /* @__PURE__ */ jsx(TaskRunBadge, { run }) : null,
61150
61867
  ready ? /* @__PURE__ */ jsxs("span", {
61151
61868
  class: "flex items-center gap-1 text-emerald-600 dark:text-emerald-400",
61152
61869
  children: [/* @__PURE__ */ jsx(Icon$1, {
@@ -76823,6 +77540,7 @@ function TaskDetails(handle) {
76823
77540
  ]
76824
77541
  }),
76825
77542
  children: [
77543
+ handle.props.actions ?? null,
76826
77544
  /* @__PURE__ */ jsx(IconButton, {
76827
77545
  icon: "link",
76828
77546
  label: t$2("tasks.taskDetails.copyTaskLink"),
@@ -76848,13 +77566,13 @@ function TaskDetails(handle) {
76848
77566
  }),
76849
77567
  /* @__PURE__ */ jsxs("div", {
76850
77568
  "data-task-detail-scroll": "",
76851
- 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",
76852
77570
  "aria-busy": loading ? "true" : "false",
76853
77571
  mix: scrollFade("y"),
76854
77572
  children: [
76855
77573
  loading && !issue ? /* @__PURE__ */ jsx(Loader, { label: t$2("tasks.taskDetails.loadingTask") }) : null,
76856
77574
  error ? /* @__PURE__ */ jsx("div", {
76857
- class: "px-4 pb-6 md:px-6",
77575
+ class: "px-4 pb-6 @min-[40rem]/page:px-6",
76858
77576
  children: /* @__PURE__ */ jsxs(FieldCard, {
76859
77577
  class: "max-w-2xl",
76860
77578
  role: "alert",
@@ -76869,7 +77587,7 @@ function TaskDetails(handle) {
76869
77587
  })
76870
77588
  }) : null,
76871
77589
  issue && item && detail ? /* @__PURE__ */ jsxs("div", {
76872
- 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",
76873
77591
  children: [/* @__PURE__ */ jsxs("article", {
76874
77592
  class: "flex min-w-0 flex-col gap-8",
76875
77593
  children: [
@@ -76991,7 +77709,7 @@ function TaskDetails(handle) {
76991
77709
  })
76992
77710
  ]
76993
77711
  }), /* @__PURE__ */ jsxs("aside", {
76994
- 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",
76995
77713
  children: [/* @__PURE__ */ jsx(Properties, {
76996
77714
  ...context,
76997
77715
  item,
@@ -77176,6 +77894,8 @@ function TaskWorkspace(handle) {
77176
77894
  }
77177
77895
  return draft;
77178
77896
  }
77897
+ let expanded = /* @__PURE__ */ new Set();
77898
+ let allColumns = false;
77179
77899
  async function move(id, status) {
77180
77900
  let issue = handle.props.snapshot?.items.find((candidate) => candidate.id === id);
77181
77901
  if (!issue || !handle.props.operations || actionBusy || !handle.props.schema || taskRole(issue, handle.props.schema, "status") === status) return;
@@ -77268,7 +77988,12 @@ function TaskWorkspace(handle) {
77268
77988
  restore = null;
77269
77989
  handle.queueTask(() => scroll?.scrollTo(position));
77270
77990
  }
77271
- 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;
77272
77997
  let ready = new Set(snapshot?.items.filter((item) => item.ready).map((item) => item.id) ?? []);
77273
77998
  let activeFilters = [
77274
77999
  view.status,
@@ -77758,12 +78483,13 @@ function TaskWorkspace(handle) {
77758
78483
  class: "flex w-full min-w-0 flex-col gap-px p-1",
77759
78484
  children: group.issues.map(renderCard)
77760
78485
  })
77761
- })] }) : /* @__PURE__ */ jsx("div", {
78486
+ })] }) : /* @__PURE__ */ jsxs("div", {
77762
78487
  class: "flex items-start gap-3",
77763
- 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) => {
77764
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;
77765
78491
  return /* @__PURE__ */ jsx("section", {
77766
- 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"}`,
77767
78493
  "aria-label": t$2("tasks.taskWorkspace.statusColumn", { status: status.label }),
77768
78494
  mix: [on("dragover", (event) => {
77769
78495
  if (event.dataTransfer?.types.includes("application/x-bud-task") && !actionBusy && status.value) {
@@ -77782,10 +78508,29 @@ function TaskWorkspace(handle) {
77782
78508
  item: null,
77783
78509
  status,
77784
78510
  items: issues,
77785
- 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)
77786
78521
  })
77787
78522
  }, status.value);
77788
- })
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]
77789
78534
  })]
77790
78535
  }, group.id)) : null
77791
78536
  ]
@@ -77817,7 +78562,7 @@ function TaskWorkspace(handle) {
77817
78562
  }
77818
78563
  })
77819
78564
  }) : null,
77820
- selectedId && schema ? /* @__PURE__ */ createElement(Page, {
78565
+ selectedId && schema ? (handle.props.pageFrame ?? ((page) => page))(/* @__PURE__ */ createElement(Page, {
77821
78566
  ...context(detail?.item.id === selectedId ? detail.item : null),
77822
78567
  item: detail?.item.id === selectedId ? detail.item : null,
77823
78568
  design: handle.props.design,
@@ -77834,10 +78579,876 @@ function TaskWorkspace(handle) {
77834
78579
  loading: detailLoading,
77835
78580
  error: detailError,
77836
78581
  onSelect: select,
77837
- 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")
77838
79140
  }) : null
77839
79141
  ] })
77840
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
+ });
77841
79452
  };
77842
79453
  }
77843
79454
  //#endregion
@@ -83568,7 +85179,7 @@ function ItemDiscussion(handle) {
83568
85179
  */
83569
85180
  function ThreadTaskLinks(handle) {
83570
85181
  return () => {
83571
- let { itemIds, items, href, onEdit, busy } = handle.props;
85182
+ let { itemIds, items, href, onEdit, busy, schema, runs } = handle.props;
83572
85183
  if (!itemIds.length && !onEdit) return null;
83573
85184
  let names = new Map(items.map((item) => [item.id, item]));
83574
85185
  return /* @__PURE__ */ jsxs("div", {
@@ -83580,15 +85191,33 @@ function ThreadTaskLinks(handle) {
83580
85191
  href: href(id),
83581
85192
  title: item?.title ?? id,
83582
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",
83583
- children: [/* @__PURE__ */ jsx(Text, {
83584
- variant: "code",
83585
- class: "shrink-0",
83586
- children: id
83587
- }), item?.title ? /* @__PURE__ */ jsx(Text, {
83588
- variant: "ui-caption",
83589
- class: "truncate",
83590
- children: item.title
83591
- }) : 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
+ ]
83592
85221
  }, id);
83593
85222
  }), onEdit ? /* @__PURE__ */ jsx(IconButton, {
83594
85223
  icon: "tasks",
@@ -84135,6 +85764,11 @@ var endpoints = [
84135
85764
  write: true,
84136
85765
  list: false
84137
85766
  },
85767
+ {
85768
+ route: routes.comments.makeTask,
85769
+ write: true,
85770
+ list: false
85771
+ },
84138
85772
  {
84139
85773
  route: routes.comments.deleteMessage,
84140
85774
  write: true,
@@ -84768,4 +86402,4 @@ function unavailableComments(message = commentsUnavailable) {
84768
86402
  };
84769
86403
  }
84770
86404
  //#endregion
84771
- 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 };