@bud.sh/app 0.4.0 → 0.4.1

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 (56) hide show
  1. package/dist/client/assets/bud/design.js +1 -1
  2. package/dist/client/assets/{canvas-C8hyPWoT.js → canvas-DIKX_HCJ.js} +1 -1
  3. package/dist/client/assets/difference-worker-CwQNxTJL.js +8 -0
  4. package/dist/client/assets/files-BQ9O3Z8-.js +1 -0
  5. package/dist/client/assets/i18n-CL0jBP7Y.js +1 -0
  6. package/dist/client/assets/{index-Dpxjiok1.js → index-COvyj5zV.js} +2 -2
  7. package/dist/client/assets/{pages-B-_CKvDS.js → pages-BGl2Yuza.js} +1 -1
  8. package/dist/client/assets/{project-branches-DzXdaT9L.js → project-branches-DwKjCwZv.js} +1 -1
  9. package/dist/client/assets/{project-comments-CQkB2jbE.js → project-comments-Cdip2Y10.js} +1 -1
  10. package/dist/client/assets/{project-thread-links-BN7zL0AX.js → project-thread-links-BGIkGQeU.js} +1 -1
  11. package/dist/client/assets/{project-threads-CHGG-6fo.js → project-threads-DeKXNqeP.js} +5 -5
  12. package/dist/client/assets/{project-work-L5fYMSOu.js → project-work-B7PGQtV9.js} +1 -1
  13. package/dist/client/assets/task-design-DJp5yho1.js +23 -0
  14. package/dist/client/assets/{tasks-A2FKo3_h.js → tasks-BHXj727C.js} +1 -1
  15. package/dist/client/assets/{tasks-request-DGigNdyK.js → tasks-request-CsUB5__X.js} +1 -1
  16. package/dist/client/assets/{workspace-CvWmU2RK.js → workspace-CbO7RsI2.js} +2 -2
  17. package/dist/client/index.html +2 -2
  18. package/dist/hosted/assets/{canvas-MWtOwaWm.js → canvas-gWj_ocKK.js} +4 -4
  19. package/dist/hosted/assets/{comment-data-DsgJWq4n.js → comment-data-C-rNCB1n.js} +138 -11
  20. package/dist/hosted/assets/{files-Wvo11G2A.js → files-CAPvbavY.js} +3 -3
  21. package/dist/hosted/assets/{pages-BAmRFVtU.js → pages-DJiOvT-l.js} +3 -3
  22. package/dist/hosted/assets/{project-branches-BNloVosX.js → project-branches-BgrfdvtL.js} +1 -1
  23. package/dist/hosted/assets/{project-thread-links-BmY8HQXt.js → project-thread-links-B7uzThL9.js} +2 -2
  24. package/dist/hosted/assets/{screen-QmqmI2Aq.js → screen-D4D9nh4V.js} +1 -1
  25. package/dist/hosted/assets/{tasks-C8iWPrWg.js → tasks-C7aGLzBw.js} +4 -4
  26. package/dist/hosted/assets/{tasks-request-C89fN1dK.js → tasks-request-CikFdCgP.js} +1 -1
  27. package/dist/hosted/hosted.js +16 -8
  28. package/dist/node/design.js +126 -6
  29. package/dist/node-host/assets/{canvas-D_F8SIlm.js → canvas-kXzp80a5.js} +4 -4
  30. package/dist/node-host/assets/{comment-data-q_8INiZz.js → comment-data-CeuJbJKJ.js} +138 -11
  31. package/dist/node-host/assets/{files-xazOrNCX.js → files-0YIuvKzb.js} +3 -3
  32. package/dist/node-host/assets/{pages-D6VkmdfQ.js → pages-DOF22SyG.js} +3 -3
  33. package/dist/node-host/assets/{project-branches-C26hwmo3.js → project-branches-BeEwMBIw.js} +1 -1
  34. package/dist/node-host/assets/{project-thread-links-BOzjws5W.js → project-thread-links-Bs_MtfBC.js} +2 -2
  35. package/dist/node-host/assets/{screen-Dog-YByu.js → screen-DRTAKkn3.js} +1 -1
  36. package/dist/node-host/assets/{tasks-A1_bpb3_.js → tasks-BA_hcbj5.js} +4 -4
  37. package/dist/node-host/assets/{tasks-request-Bie1PpQP.js → tasks-request-Doc9y_20.js} +1 -1
  38. package/dist/node-host/node-host.js +16 -8
  39. package/dist/server/assets/{canvas-Dn4RYoU2.js → canvas-CiN6jNIZ.js} +4 -4
  40. package/dist/server/assets/{comment-data-B0OLHBGp.js → comment-data-9SqALQjT.js} +138 -11
  41. package/dist/server/assets/{files-C5Vilfe4.js → files-DBVqeLdL.js} +3 -3
  42. package/dist/server/assets/{listener-o1STuLju.js → listener-DGWKUc2o.js} +16 -8
  43. package/dist/server/assets/{pages-BNa0MHEc.js → pages-DJMLr6j9.js} +3 -3
  44. package/dist/server/assets/{project-branches-GtQYyOH5.js → project-branches-DbKEmiQT.js} +1 -1
  45. package/dist/server/assets/{project-thread-links-Nfz9NIny.js → project-thread-links-C0kV_Pcl.js} +2 -2
  46. package/dist/server/assets/{project-work-Cy_BpHwR.js → project-work-C0FN3w5Y.js} +2 -2
  47. package/dist/server/assets/{screen-BtcJmZwj.js → screen-BtvzEiIa.js} +1 -1
  48. package/dist/server/assets/{tasks-B82tHwyQ.js → tasks-DX71x8f9.js} +5 -5
  49. package/dist/server/assets/{tasks-request-BtJBlkxV.js → tasks-request-C3jk9Jyu.js} +1 -1
  50. package/dist/server/runtime.js +1 -1
  51. package/dist/server/server.js +1 -1
  52. package/package.json +1 -1
  53. package/dist/client/assets/difference-worker-BfF4_N3e.js +0 -8
  54. package/dist/client/assets/files-D_Tm7gCK.js +0 -1
  55. package/dist/client/assets/i18n-BtfXum8P.js +0 -1
  56. package/dist/client/assets/task-design-DYqcqq1b.js +0 -23
@@ -1,7 +1,7 @@
1
- import { Er as MAX_CANVAS_Y, Kt as pageRoutes, Qt as Spinner, Zt as Loader, _t as PagesWorkspace, hn as Text, in as IconButton, l as projectStore, ln as readPreference, pn as t, rn as Select, un as writePreference } from "./comment-data-q_8INiZz.js";
2
- import { n as createProjectComments, t as defineScreen } from "./screen-Dog-YByu.js";
1
+ import { Dr as MAX_CANVAS_Y, Kt as pageRoutes, Qt as Spinner, Zt as Loader, _t as PagesWorkspace, gn as Text, in as IconButton, l as projectStore, ln as readPreference, mn as t, rn as Select, un as writePreference } from "./comment-data-CeuJbJKJ.js";
2
+ import { n as createProjectComments, t as defineScreen } from "./screen-DRTAKkn3.js";
3
3
  import { n as workspaceTab, t as followWorkspaceTab } from "../node-host.js";
4
- import { n as createProjectPreviews, r as locatePreview, t as createProjectBranches } from "./project-branches-C26hwmo3.js";
4
+ import { n as createProjectPreviews, r as locatePreview, t as createProjectBranches } from "./project-branches-BeEwMBIw.js";
5
5
  import { array, number, object, optional, parseSafe, string } from "remix/data-schema";
6
6
  import { on, ref } from "remix/component";
7
7
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { Dr as parseElementAnchor, S as writeRows, ai as parsePreview, b as plainRow, c as previewKey, l as projectStore, oi as parsePreviewBranch, pn as t, ui as parsePreviewPins, v as projectLive, y as routes } from "./comment-data-q_8INiZz.js";
1
+ import { Or as parseElementAnchor, S as writeRows, b as plainRow, c as previewKey, di as parsePreviewPins, l as projectStore, mn as t, oi as parsePreview, si as parsePreviewBranch, v as projectLive, y as routes } from "./comment-data-CeuJbJKJ.js";
2
2
  import { array, boolean, enum_, nullable, number, object, parseSafe, string } from "remix/data-schema";
3
3
  //#region app/client/project-previews.ts
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { C as ThreadTaskLinks, Dn as parseThreadLinkInput, Dt as taskHref, Ir as parseWorkItemRef, Or as parseWorkWorkspace, Sn as parseThread, Wr as valueByRole, _ as requestComments, in as IconButton, pn as t, w as ThreadTaskPicker, y as routes } from "./comment-data-q_8INiZz.js";
2
- import { n as requestTasks } from "./tasks-request-Bie1PpQP.js";
1
+ import { C as ThreadTaskLinks, Cn as parseThread, Dt as taskHref, Gr as valueByRole, Lr as parseWorkItemRef, On as parseThreadLinkInput, _ as requestComments, in as IconButton, kr as parseWorkWorkspace, mn as t, w as ThreadTaskPicker, y as routes } from "./comment-data-CeuJbJKJ.js";
2
+ import { n as requestTasks } from "./tasks-request-Doc9y_20.js";
3
3
  import { on, ref } from "remix/component";
4
4
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
5
5
  //#region app/client/project-task-picker.tsx
@@ -1,4 +1,4 @@
1
- import { Sn as parseThread, Tn as parseThreadId, _ as requestComments, a as saveThreads, b as plainRow, cn as toast, g as CommentsRequestError, i as saveThread, kn as parseThreadSnapshot, l as projectStore, n as unavailableComments, o as threadMatches, pn as t, wn as parseThreadFilter, x as writeOptimistically, y as routes } from "./comment-data-q_8INiZz.js";
1
+ import { An as parseThreadSnapshot, Cn as parseThread, En as parseThreadId, Tn as parseThreadFilter, _ as requestComments, a as saveThreads, b as plainRow, cn as toast, g as CommentsRequestError, i as saveThread, l as projectStore, mn as t, n as unavailableComments, o as threadMatches, x as writeOptimistically, y as routes } from "./comment-data-CeuJbJKJ.js";
2
2
  //#region ../work/src/lib/predict.ts
3
3
  /**
4
4
  * How a new task shows until its adapter confirms it: the requested values, and the creation
@@ -1,8 +1,8 @@
1
- import { $t as Button, B as TaskWorkspace, C as ThreadTaskLinks, Dt as taskHref, Et as selectedTask, Jt as CommentThreadDetail, Lr as parseWorkMutationResult, Ot as taskRole, Pr as parseWorkDetail, S as writeRows, T as ItemDiscussion, Tt as readConversationLocation, Vr as parseWorkSyncResult, Xt as CommentComposer, Yt as CommentThreadItem, b as plainRow, cn as toast, h as storedWorkspace, hn as Text, kr as parseSectionData, l as projectStore, nt as CommentThreadHeading, pn as t, qt as taskRoutes, x as writeOptimistically, xt as conversationLabel, y as routes } from "./comment-data-q_8INiZz.js";
2
- import { a as predictWorkAction, i as loadItemComments, n as createProjectComments, o as predictWorkCreate, s as predictWorkUpdate, t as defineScreen } from "./screen-Dog-YByu.js";
3
- import { n as requestTasks, t as TaskRequestError } from "./tasks-request-Bie1PpQP.js";
1
+ import { $t as Button, Ar as parseSectionData, B as TaskWorkspace, C as ThreadTaskLinks, Dt as taskHref, Et as selectedTask, Fr as parseWorkDetail, Hr as parseWorkSyncResult, Jt as CommentThreadDetail, Ot as taskRole, Rr as parseWorkMutationResult, S as writeRows, T as ItemDiscussion, Tt as readConversationLocation, Xt as CommentComposer, Yt as CommentThreadItem, b as plainRow, cn as toast, gn as Text, h as storedWorkspace, l as projectStore, mn as t, nt as CommentThreadHeading, qt as taskRoutes, x as writeOptimistically, xt as conversationLabel, y as routes } from "./comment-data-CeuJbJKJ.js";
2
+ import { a as predictWorkAction, i as loadItemComments, n as createProjectComments, o as predictWorkCreate, s as predictWorkUpdate, t as defineScreen } from "./screen-DRTAKkn3.js";
3
+ import { n as requestTasks, t as TaskRequestError } from "./tasks-request-Doc9y_20.js";
4
4
  import { r as projectWork } from "../node-host.js";
5
- import { n as ProjectTaskPicker, t as ProjectThreadLinks } from "./project-thread-links-BOzjws5W.js";
5
+ import { n as ProjectTaskPicker, t as ProjectThreadLinks } from "./project-thread-links-Bs_MtfBC.js";
6
6
  import { on, ref } from "remix/component";
7
7
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
8
8
  //#region app/client/task-discussion.tsx
@@ -1,4 +1,4 @@
1
- import { Ir as parseWorkItemRef, Rr as parseWorkQuery, pn as t, y as routes } from "./comment-data-q_8INiZz.js";
1
+ import { Lr as parseWorkItemRef, mn as t, y as routes, zr as parseWorkQuery } from "./comment-data-CeuJbJKJ.js";
2
2
  import { createMultiMatcher } from "remix/route-pattern/match";
3
3
  //#region app/client/tasks-request.ts
4
4
  var reads = createMultiMatcher();
@@ -1,5 +1,5 @@
1
- import { $r as parseWork, $t as Button, An as parseThreadStatus, Ar as parseWorkActionInput, Br as parseWorkSync, Cn as parseThreadCapabilities, Ct as legacyConversationHref, Dn as parseThreadLinkInput, Dr as parseElementAnchor, Dt as taskHref, En as parseThreadInput, Er as MAX_CANVAS_Y, Et as selectedTask, Fr as parseWorkItem, G as mergeThreads, Gr as parseMessage, Gt as fileRoutes, Hr as parseWorkUpdate, Ir as parseWorkItemRef, J as conversationId, Jr as parseWorkSchema, K as stableJson, Kr as parseMessageAuthor, Kt as pageRoutes, Lr as parseWorkMutationResult, Mr as parseWorkConnection, Nr as parseWorkCreate, On as parseThreadReplyInput, Or as parseWorkWorkspace, Pr as parseWorkDetail, Q as text$6, Qr as nonempty$1, Rr as parseWorkQuery, S as writeRows, Sn as parseThread, Tn as parseThreadId, Tt as readConversationLocation, Ur as parseWorkValue, V as parseTaskDesign, Vr as parseWorkSyncResult, W as CommentMergeError, Wr as valueByRole, X as parseCommentThread, Xr as WorkValidationError, Y as object$2, Yr as statusCategory, Z as revision$2, Zr as identifier$3, Zt as Loader, _ as requestComments, _n as RESYNC, an as LiveStatus, at as FieldCardHeader, b as plainRow, bn as MAX_THREADS, ci as parsePreviewHash, ct as initialShellTabs, d as saveWorkspace, di as parsePreviewViewport, dn as isLocale, dt as readTabsCookie, ei as record$2, fn as locale, ft as stepShellTab, gt as visitShellTab, hn as Text, ht as tabsCookieValue, ii as PREVIEW_TILE_HEIGHT, it as FieldCardContent, jn as parseThreadStatusInput, jr as parseWorkActivity, jt as legacyFileHref, kn as parseThreadSnapshot, kr as parseSectionData, l as projectStore, li as parsePreviewId, ln as readPreference, lt as openShellTab, mn as useLocaleSource, mt as tabsCookieName, n as unavailableComments, ni as MAX_PREVIEW_HEIGHT, nn as ShellTabBar, oi as parsePreviewBranch, ot as activeTab, pn as t, pt as tabHref, q as parseCommentInput$1, qr as fieldByRole, qt as taskRoutes, r as followThreads, ri as PREVIEW_THUMBNAIL_WIDTHS, rt as FieldCard, si as parsePreviewCapture, sn as AppShell, st as closeShellTab, t as commentsUnavailable, ti as strict$2, ui as parsePreviewPins, un as writePreference, ut as parseShellTabs, v as projectLive, vn as parseLiveId, wn as parseThreadFilter, xn as parseAnchor, y as routes, yn as parseWorkChange, yt as conversationDestination, zr as parseWorkSnapshot } from "./assets/comment-data-q_8INiZz.js";
2
- import { n as requestTasks } from "./assets/tasks-request-Bie1PpQP.js";
1
+ import { $r as nonempty$1, $t as Button, An as parseThreadSnapshot, Ar as parseSectionData, Br as parseWorkSnapshot, Cn as parseThread, Ct as legacyConversationHref, Dn as parseThreadInput, Dr as MAX_CANVAS_Y, Dt as taskHref, En as parseThreadId, Et as selectedTask, Fr as parseWorkDetail, G as mergeThreads, Gr as valueByRole, Gt as fileRoutes, Hr as parseWorkSyncResult, Ir as parseWorkItem, J as conversationId, Jr as fieldByRole, K as stableJson, Kr as parseMessage, Kt as pageRoutes, Lr as parseWorkItemRef, Mn as parseThreadStatusInput, Mr as parseWorkActivity, Nr as parseWorkConnection, On as parseThreadLinkInput, Or as parseElementAnchor, Pr as parseWorkCreate, Q as text$6, Qr as identifier$3, Rr as parseWorkMutationResult, S as writeRows, Sn as parseAnchor, Tn as parseThreadFilter, Tt as readConversationLocation, Ur as parseWorkUpdate, V as parseTaskDesign, Vr as parseWorkSync, W as CommentMergeError, Wr as parseWorkValue, X as parseCommentThread, Xr as statusCategory, Y as object$2, Yr as parseWorkSchema, Z as revision$2, Zr as WorkValidationError, Zt as Loader, _ as requestComments, ai as PREVIEW_TILE_HEIGHT, an as LiveStatus, at as FieldCardHeader, b as plainRow, bn as parseWorkChange, ci as parsePreviewCapture, ct as initialShellTabs, d as saveWorkspace, di as parsePreviewPins, dn as hasMessage, dt as readTabsCookie, ei as parseWork, fi as parsePreviewViewport, fn as isLocale, ft as stepShellTab, gn as Text, gt as visitShellTab, hn as useLocaleSource, ht as tabsCookieValue, ii as PREVIEW_THUMBNAIL_WIDTHS, it as FieldCardContent, jn as parseThreadStatus, jr as parseWorkActionInput, jt as legacyFileHref, kn as parseThreadReplyInput, kr as parseWorkWorkspace, l as projectStore, li as parsePreviewHash, ln as readPreference, lt as openShellTab, mn as t, mt as tabsCookieName, n as unavailableComments, ni as strict$2, nn as ShellTabBar, ot as activeTab, pn as locale, pt as tabHref, q as parseCommentInput$1, qr as parseMessageAuthor, qt as taskRoutes, r as followThreads, ri as MAX_PREVIEW_HEIGHT, rt as FieldCard, si as parsePreviewBranch, sn as AppShell, st as closeShellTab, t as commentsUnavailable, ti as record$2, ui as parsePreviewId, un as writePreference, ut as parseShellTabs, v as projectLive, vn as RESYNC, wn as parseThreadCapabilities, xn as MAX_THREADS, y as routes, yn as parseLiveId, yt as conversationDestination, zr as parseWorkQuery } from "./assets/comment-data-CeuJbJKJ.js";
2
+ import { n as requestTasks } from "./assets/tasks-request-Doc9y_20.js";
3
3
  import { access, mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, stat, symlink, writeFile } from "node:fs/promises";
4
4
  import * as Path from "node:path";
5
5
  import { dirname, extname, isAbsolute, join, relative, resolve, sep } from "node:path";
@@ -37473,10 +37473,10 @@ function ProjectLiveStatus(handle) {
37473
37473
  //#endregion
37474
37474
  //#region app/client/screens.ts
37475
37475
  var builtIns = {
37476
- "bud:pages": () => import("./assets/pages-D6VkmdfQ.js"),
37477
- "bud:canvas": () => import("./assets/canvas-D_F8SIlm.js"),
37478
- "bud:tasks": () => import("./assets/tasks-A1_bpb3_.js"),
37479
- "bud:files": () => import("./assets/files-xazOrNCX.js")
37476
+ "bud:pages": () => import("./assets/pages-DOF22SyG.js"),
37477
+ "bud:canvas": () => import("./assets/canvas-kXzp80a5.js"),
37478
+ "bud:tasks": () => import("./assets/tasks-BA_hcbj5.js"),
37479
+ "bud:files": () => import("./assets/files-0YIuvKzb.js")
37480
37480
  };
37481
37481
  /**
37482
37482
  * Imports a screen module: a built-in by its key, any other by the URL the server gave it.
@@ -38049,6 +38049,11 @@ var builtInRoutes = {
38049
38049
  "bud:tasks": taskRoutes,
38050
38050
  "bud:files": fileRoutes
38051
38051
  };
38052
+ function screenName(screen) {
38053
+ let builtIn = defaultScreens.find((candidate) => candidate.module === screen.module);
38054
+ let key = `screens.${builtIn?.id}`;
38055
+ return builtIn && screen.label === builtIn.label && hasMessage(key) ? t(key) : screen.label;
38056
+ }
38052
38057
  /**
38053
38058
  * Connects the route contract to application responses.
38054
38059
  * @param template - The development or production HTML shell.
@@ -38089,7 +38094,10 @@ function createAppController(template, project, runtime) {
38089
38094
  let module = await prepare(screen, request.signal);
38090
38095
  let taskDesign = project && (screen.module === "bud:tasks" || conversation !== void 0 && screens.some((target) => target.module === "bud:tasks")) && project.config.designs.tasks !== "bud:beads" && runtime ? await runtime.runPromise(ScreenModules.use((modules) => modules.module(taskDesignModuleId)), { signal: request.signal }) : void 0;
38091
38096
  let content = await renderToString(/* @__PURE__ */ jsx(WorkspacePage, {
38092
- screens: items,
38097
+ screens: items.map((item, index) => ({
38098
+ ...item,
38099
+ label: screenName(screens[index])
38100
+ })),
38093
38101
  active: screen.id,
38094
38102
  module,
38095
38103
  taskDesign,
@@ -38116,7 +38124,7 @@ function createAppController(template, project, runtime) {
38116
38124
  ...patterns ? { routes: patterns } : {}
38117
38125
  }
38118
38126
  }));
38119
- let title = (conversation ? "Discussion" : screen.label).replace(/[&<>]/g, (character) => `&#${character.charCodeAt(0)};`);
38127
+ let title = (conversation ? t("app.controller.discussion") : screenName(screen)).replace(/[&<>]/g, (character) => `&#${character.charCodeAt(0)};`);
38120
38128
  let logo = project?.config.logo;
38121
38129
  let shell = logo ? withLogoIcons(template, logo, (theme) => routes.logo.href({ theme })) : template;
38122
38130
  return new Response(shell.replace("<html lang=\"en\"", () => `<html lang="${locale()}"`).replace("<title>bud.sh</title>", () => `<title>${title} · bud.sh</title>`).replace("</head>", () => project ? `${themeStyle(project.config.theme)}</head>` : "</head>").replace("<!--app-html-->", () => content), { headers: { "Content-Type": "text/html; charset=utf-8" } });
@@ -1,8 +1,8 @@
1
1
  import { kn as Icon } from "./events-6z5v7Uca.js";
2
- import { Bt as Button, Dn as Text, H as captureCanvasPoint, Rt as Loader, Sn as writePreference, Tn as t, V as CanvasWorkspace, W as BranchSidebar, fn as ToolbarSeparator, gn as IconButton, hn as Select, l as projectStore, pn as WorkspaceLayout, t as commentsUnavailable, ut as conversationHref, vn as Tooltip, xn as readPreference } from "./comment-data-B0OLHBGp.js";
3
- import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-BtcJmZwj.js";
4
- import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-GtQYyOH5.js";
5
- import { t as ProjectThreadLinks } from "./project-thread-links-Nfz9NIny.js";
2
+ import { Bt as Button, En as t, H as captureCanvasPoint, On as Text, Rt as Loader, Sn as writePreference, V as CanvasWorkspace, W as BranchSidebar, fn as ToolbarSeparator, gn as IconButton, hn as Select, l as projectStore, pn as WorkspaceLayout, t as commentsUnavailable, ut as conversationHref, vn as Tooltip, xn as readPreference } from "./comment-data-9SqALQjT.js";
3
+ import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-BtvzEiIa.js";
4
+ import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-DbKEmiQT.js";
5
+ import { t as ProjectThreadLinks } from "./project-thread-links-C0kV_Pcl.js";
6
6
  import { on, ref } from "remix/component";
7
7
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
8
8
  //#region app/client/preview-image.tsx
@@ -1342,6 +1342,10 @@ var de$1 = {
1342
1342
  text: "Dein Projekt nebeneinander.",
1343
1343
  source: "ae5c6a16"
1344
1344
  },
1345
+ "app.controller.discussion": {
1346
+ text: "Diskussion",
1347
+ source: "52a76f71"
1348
+ },
1345
1349
  "appShell.mainNavigation": {
1346
1350
  text: "Hauptnavigation",
1347
1351
  source: "c5a8374a"
@@ -1964,10 +1968,6 @@ var de$1 = {
1964
1968
  text: "Eine Diskussion, gemeinsam für mehrere Aufgaben.",
1965
1969
  source: "f056484b"
1966
1970
  },
1967
- "counter.count": {
1968
- text: "Anzahl:",
1969
- source: "4dc7b9ea"
1970
- },
1971
1971
  "files.codeCommentAnnotation.moved": {
1972
1972
  text: "Verschoben",
1973
1973
  source: "82869bf0"
@@ -3446,6 +3446,10 @@ var de$1 = {
3446
3446
  source: "756213ca"
3447
3447
  },
3448
3448
  "files.fileReviewPanel.selection": {
3449
+ text: "{path} · {start}–{end}",
3450
+ source: "976a3281"
3451
+ },
3452
+ "files.fileReviewPanel.selectionOnSide": {
3449
3453
  text: "{path} · {side} {start}–{end}",
3450
3454
  source: "6445c0da"
3451
3455
  },
@@ -3457,6 +3461,14 @@ var de$1 = {
3457
3461
  text: "{path} · {side} {start}–{end} (Ende {endSide})",
3458
3462
  source: "4d409456"
3459
3463
  },
3464
+ "files.fileReviewPanel.sideNew": {
3465
+ text: "neu",
3466
+ source: "28999611"
3467
+ },
3468
+ "files.fileReviewPanel.sideOld": {
3469
+ text: "alt",
3470
+ source: "bd2b9bd6"
3471
+ },
3460
3472
  "files.fileReviewPanel.sourceFile": {
3461
3473
  text: "Quelldatei",
3462
3474
  source: "f52d16de"
@@ -4320,6 +4332,22 @@ var de$1 = {
4320
4332
  text: "Neu laden",
4321
4333
  source: "1a43a2ac"
4322
4334
  },
4335
+ "screens.canvas": {
4336
+ text: "Leinwand",
4337
+ source: "b2585091"
4338
+ },
4339
+ "screens.files": {
4340
+ text: "Dateien",
4341
+ source: "e71d1b30"
4342
+ },
4343
+ "screens.pages": {
4344
+ text: "Seiten",
4345
+ source: "7decab7f"
4346
+ },
4347
+ "screens.tasks": {
4348
+ text: "Aufgaben",
4349
+ source: "399e986d"
4350
+ },
4323
4351
  "select.noMatches": {
4324
4352
  text: "Keine Treffer",
4325
4353
  source: "d29421ef"
@@ -4517,6 +4545,66 @@ var de$1 = {
4517
4545
  text: "Hoch",
4518
4546
  source: "be0a061d"
4519
4547
  },
4548
+ "tasks.taskData.label.all": {
4549
+ text: "Alle",
4550
+ source: "75afe364"
4551
+ },
4552
+ "tasks.taskData.label.blocked": {
4553
+ text: "Blockiert",
4554
+ source: "e378ac53"
4555
+ },
4556
+ "tasks.taskData.label.bug": {
4557
+ text: "Fehler",
4558
+ source: "d8da8e15"
4559
+ },
4560
+ "tasks.taskData.label.chore": {
4561
+ text: "Routineaufgabe",
4562
+ source: "0f37a562"
4563
+ },
4564
+ "tasks.taskData.label.closed": {
4565
+ text: "Geschlossen",
4566
+ source: "3201cae5"
4567
+ },
4568
+ "tasks.taskData.label.decision": {
4569
+ text: "Entscheidung",
4570
+ source: "be93ff03"
4571
+ },
4572
+ "tasks.taskData.label.deferred": {
4573
+ text: "Zurückgestellt",
4574
+ source: "59a18aca"
4575
+ },
4576
+ "tasks.taskData.label.epic": {
4577
+ text: "Epic",
4578
+ source: "e75e9488"
4579
+ },
4580
+ "tasks.taskData.label.feature": {
4581
+ text: "Funktion",
4582
+ source: "fe9102dd"
4583
+ },
4584
+ "tasks.taskData.label.hooked": {
4585
+ text: "Verknüpft",
4586
+ source: "79750f9b"
4587
+ },
4588
+ "tasks.taskData.label.in_progress": {
4589
+ text: "In Bearbeitung",
4590
+ source: "2948b425"
4591
+ },
4592
+ "tasks.taskData.label.open": {
4593
+ text: "Offen",
4594
+ source: "538b10e9"
4595
+ },
4596
+ "tasks.taskData.label.pinned": {
4597
+ text: "Angeheftet",
4598
+ source: "6d0ba1af"
4599
+ },
4600
+ "tasks.taskData.label.ready": {
4601
+ text: "Bereit",
4602
+ source: "0bca3294"
4603
+ },
4604
+ "tasks.taskData.label.task": {
4605
+ text: "Aufgabe",
4606
+ source: "76ef3d8c"
4607
+ },
4520
4608
  "tasks.taskData.low": {
4521
4609
  text: "Niedrig",
4522
4610
  source: "b1dd9521"
@@ -5436,6 +5524,7 @@ var en = {
5436
5524
  "app.client.workspace.retry": "Retry",
5437
5525
  "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.",
5438
5526
  "app.client.workspace.yourProjectSideBySide": "Your project, side by side.",
5527
+ "app.controller.discussion": "Discussion",
5439
5528
  "appShell.mainNavigation": "Main navigation",
5440
5529
  "breadcrumb.navigationLabel": "Breadcrumb",
5441
5530
  "canvas.artboardCanvas.chooseCollectionPage": "Choose a {collection} page",
@@ -5614,7 +5703,6 @@ var en = {
5614
5703
  other: "{count} selected"
5615
5704
  },
5616
5705
  "comments.threadTaskLinks.sharedDiscussionSubtitle": "One discussion, shared across tasks.",
5617
- "counter.count": "Count:",
5618
5706
  "files.codeCommentAnnotation.moved": "Moved",
5619
5707
  "files.codeCommentAnnotation.openDiscussion": "Open code discussion: {body}",
5620
5708
  "files.editorCommands.addNextMatchingSelection": "Add next matching selection",
@@ -6027,9 +6115,12 @@ var en = {
6027
6115
  "files.fileReviewPanel.reviewUndo": "Review undo",
6028
6116
  "files.fileReviewPanel.searchContents": "Search contents",
6029
6117
  "files.fileReviewPanel.selectedFile": "Selected file",
6030
- "files.fileReviewPanel.selection": "{path} · {side} {start}–{end}",
6118
+ "files.fileReviewPanel.selection": "{path} · {start}–{end}",
6119
+ "files.fileReviewPanel.selectionOnSide": "{path} · {side} {start}–{end}",
6031
6120
  "files.fileReviewPanel.selectionStatus": " · {status}",
6032
6121
  "files.fileReviewPanel.selectionWithEndSide": "{path} · {side} {start}–{end} ({endSide} end)",
6122
+ "files.fileReviewPanel.sideNew": "new",
6123
+ "files.fileReviewPanel.sideOld": "old",
6033
6124
  "files.fileReviewPanel.sourceFile": "Source file",
6034
6125
  "files.fileReviewPanel.stageFile": "Stage file",
6035
6126
  "files.fileReviewPanel.stageSelectedLines": "Stage selected lines",
@@ -6266,6 +6357,10 @@ var en = {
6266
6357
  "pages.pagesWorkspace.pageList": "Page list",
6267
6358
  "pages.pagesWorkspace.pageStatus": "Page status",
6268
6359
  "pages.pagesWorkspace.reload": "Reload",
6360
+ "screens.canvas": "Canvas",
6361
+ "screens.files": "Files",
6362
+ "screens.pages": "Pages",
6363
+ "screens.tasks": "Tasks",
6269
6364
  "select.noMatches": "No matches",
6270
6365
  "select.optionsLabel": "{label} options",
6271
6366
  "select.searchLabel": "Search {label}",
@@ -6322,6 +6417,21 @@ var en = {
6322
6417
  "tasks.taskData.allTasks": "All tasks",
6323
6418
  "tasks.taskData.backlog": "Backlog",
6324
6419
  "tasks.taskData.high": "High",
6420
+ "tasks.taskData.label.all": "All",
6421
+ "tasks.taskData.label.blocked": "Blocked",
6422
+ "tasks.taskData.label.bug": "Bug",
6423
+ "tasks.taskData.label.chore": "Chore",
6424
+ "tasks.taskData.label.closed": "Closed",
6425
+ "tasks.taskData.label.decision": "Decision",
6426
+ "tasks.taskData.label.deferred": "Deferred",
6427
+ "tasks.taskData.label.epic": "Epic",
6428
+ "tasks.taskData.label.feature": "Feature",
6429
+ "tasks.taskData.label.hooked": "Hooked",
6430
+ "tasks.taskData.label.in_progress": "In progress",
6431
+ "tasks.taskData.label.open": "Open",
6432
+ "tasks.taskData.label.pinned": "Pinned",
6433
+ "tasks.taskData.label.ready": "Ready",
6434
+ "tasks.taskData.label.task": "Task",
6325
6435
  "tasks.taskData.low": "Low",
6326
6436
  "tasks.taskData.noEpic": "No epic",
6327
6437
  "tasks.taskData.noStatus": "No status",
@@ -6526,6 +6636,14 @@ function useLocaleSource(read) {
6526
6636
  source = read;
6527
6637
  }
6528
6638
  /**
6639
+ * Whether the English catalog has a message by this name, for text whose key is built from data.
6640
+ * @param key - A possible message key.
6641
+ * @returns Whether `t(key)` finds a message.
6642
+ */
6643
+ function hasMessage(key) {
6644
+ return Object.hasOwn(en, key);
6645
+ }
6646
+ /**
6529
6647
  * The language messages are shown in now.
6530
6648
  * @returns The request's locale on a server, or the page's.
6531
6649
  */
@@ -45575,6 +45693,8 @@ function parseTaskView(value) {
45575
45693
  * @returns The label.
45576
45694
  */
45577
45695
  function taskLabel(value) {
45696
+ let key = `tasks.taskData.label.${value}`;
45697
+ if (hasMessage(key)) return t$2(key);
45578
45698
  return value.replaceAll("_", " ").replaceAll("-", " ").replace(/^./, (letter) => letter.toUpperCase());
45579
45699
  }
45580
45700
  /**
@@ -77173,7 +77293,7 @@ function TaskWorkspace(handle) {
77173
77293
  start: /* @__PURE__ */ jsxs(Fragment, { children: [
77174
77294
  /* @__PURE__ */ jsxs("div", {
77175
77295
  class: "flex shrink-0 items-center gap-2 ps-2 pe-2",
77176
- children: [/* @__PURE__ */ jsx(Breadcrumb, { items: [{ label: "Tasks" }] }), snapshot?.connection.state === "ready" ? /* @__PURE__ */ jsxs(Text, {
77296
+ children: [/* @__PURE__ */ jsx(Breadcrumb, { items: [{ label: t$2("screens.tasks") }] }), snapshot?.connection.state === "ready" ? /* @__PURE__ */ jsxs(Text, {
77177
77297
  variant: "ui",
77178
77298
  tone: "muted",
77179
77299
  class: "truncate max-xl:hidden",
@@ -79563,6 +79683,9 @@ var codeStyle = {
79563
79683
  * the theme's colors on its shadow host in an earlier cascade layer than this CSS.
79564
79684
  */
79565
79685
  var editorSurfaceCSS = ":host{--diffs-dark-bg:var(--bud-editor);--diffs-light-bg:var(--bud-editor)}";
79686
+ function sideWord(side) {
79687
+ return side === "deletions" ? t$2("files.fileReviewPanel.sideOld") : t$2("files.fileReviewPanel.sideNew");
79688
+ }
79566
79689
  function formatSize(bytes) {
79567
79690
  return bytes < 1024 ? `${bytes} B` : bytes < 1048576 ? `${(bytes / 1024).toFixed(1)} KB` : `${(bytes / 1024 / 1024).toFixed(1)} MB`;
79568
79691
  }
@@ -80438,13 +80561,17 @@ function FileReviewPanel(handle) {
80438
80561
  title: selection ? selection.path : void 0,
80439
80562
  children: [selection ? selection.endSide && selection.endSide !== selection.side ? t$2("files.fileReviewPanel.selectionWithEndSide", {
80440
80563
  path: selection.path,
80441
- side: selection.side === "deletions" ? t$2("files.fileReviewPanel.old") : t$2("files.fileReviewPanel.new"),
80564
+ side: sideWord(selection.side),
80442
80565
  start: selection.start,
80443
80566
  end: selection.end,
80444
- endSide: selection.endSide === "deletions" ? t$2("files.fileReviewPanel.old") : t$2("files.fileReviewPanel.new")
80567
+ endSide: sideWord(selection.endSide)
80568
+ }) : selection.side ? t$2("files.fileReviewPanel.selectionOnSide", {
80569
+ path: selection.path,
80570
+ side: sideWord(selection.side),
80571
+ start: selection.start,
80572
+ end: selection.end
80445
80573
  }) : t$2("files.fileReviewPanel.selection", {
80446
80574
  path: selection.path,
80447
- side: selection.side === "deletions" ? t$2("files.fileReviewPanel.old") : t$2("files.fileReviewPanel.new"),
80448
80575
  start: selection.start,
80449
80576
  end: selection.end
80450
80577
  }) : status, selection && status ? t$2("files.fileReviewPanel.selectionStatus", { status }) : null]
@@ -84491,4 +84618,4 @@ function unavailableComments(message = commentsUnavailable) {
84491
84618
  };
84492
84619
  }
84493
84620
  //#endregion
84494
- export { openShellTab as $, areFileRenderOptionsEqual as $t, FileRecoveryDialog as A, fileHref as At, parseTaskDesign as B, Button as Bt, ThreadTaskPicker as C, isLocale as Cn, readReviewLocation as Ct, FileEditorPanel as D, Text as Dn, reviewHref as Dt, ReviewActionDialog as E, useLocaleSource 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, 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, t$2 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, locale 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 };
84621
+ 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 };
@@ -1,10 +1,10 @@
1
1
  import { C as getFiletypeFromFileName, P as __toESM, S as getCustomExtensionsVersion, x as getCustomExtensionsMap } from "./cloneFileDiffMetadata-B-xwytg8.js";
2
2
  import { Dt as parseFileSearchQuery, Ft as parseFileChange, Ht as parseFilePath, I as parseFileUpdate, It as parseFileDocument, Lt as parseFileIndex, Ot as parseFileSearchResult, P as createCodeAnchor, Q as parseReviewActionRecoveries, R as reviewConflictIdentity, Z as parseReviewActionPlan, bt as parseReviewSnapshot, ct as parseRecoveries, et as parseReviewActionResult, gt as parseReviewHistory, h as fileRoutes, i as routes, mt as parseReviewDiff, nt as parseFileSaveResult, ot as parseMutationPlan, rt as maxFileSaveBytes, st as parseMutationResult, tt as parseFileSaveRequest, vt as parseReviewRepository, xt as parseReviewSource } from "./events-6z5v7Uca.js";
3
- import { $t as areFileRenderOptionsEqual, A as FileRecoveryDialog, At as fileHref, Ct as readReviewLocation, D as FileEditorPanel, Dn as Text, Dt as reviewHref, E as ReviewActionDialog, Et as reviewContextKey, F as defaultFileDestination, G as ConversationSidebar, Gt as areDiffTargetsEqual, Ht as renderDiffWithHighlighter, I as fileActionIntent, Jt as WorkerPoolWorkerError, Kt as WorkerPoolTaskCanceledError, L as mutationFileView, M as FileReviewPanel, Mt as readFileLocation, N as codeThemes, Nt as reconcileFileView, O as defaultEditorPreferences, Ot as closeFileTab, P as FileWorkspace, Pt as rememberFile, Qt as renderFileWithHighlighter, R as remainingMutationIntent, Sn as writePreference, St as parseReviewSession, T as FileConflictPanel, Tn as t, Tt as reviewComparison, U as FileSearchPanel, Ut as areDiffRenderOptionsEqual, Vt as isDiffPlainText, Wt as areFilesEqual, Xt as markWorkerErrorReported, Yt as isHandledWorkerPoolError, Zt as isFilePlainText, an as attachResolvedThemes, bn as toast, bt as defaultReviewView, cn as getResolvedOrResolveLanguage, ct as codeCommentCounts, dn as ResolvedLanguages, en as hasResolvedThemes, f as storeDocument, ft as isCodeConversation, ht as readConversationLocation, in as validateResolvedThemeName, j as FileMutationDialog, jt as parseFileView, k as parseEditorPreferences, kt as defaultFileView, l as projectStore, ln as resolveLanguage, m as storedFiles, mt as locateCodeConversations, nn as getSharedHighlighter, on as themeResolver, p as storedDocument, qt as WorkerPoolTerminatedError, rn as prepareThemeResolution, s as applyFileUpdate, sn as getThemes, tn as areThemesEqual, u as saveFiles, un as areLanguagesAttached, ut as conversationHref, v as projectLive, wt as rememberReviewPosition, xn as readPreference, yt as defaultReviewPosition } from "./comment-data-B0OLHBGp.js";
3
+ import { $t as areFileRenderOptionsEqual, A as FileRecoveryDialog, At as fileHref, Ct as readReviewLocation, D as FileEditorPanel, Dt as reviewHref, E as ReviewActionDialog, En as t, Et as reviewContextKey, F as defaultFileDestination, G as ConversationSidebar, Gt as areDiffTargetsEqual, Ht as renderDiffWithHighlighter, I as fileActionIntent, Jt as WorkerPoolWorkerError, Kt as WorkerPoolTaskCanceledError, L as mutationFileView, M as FileReviewPanel, Mt as readFileLocation, N as codeThemes, Nt as reconcileFileView, O as defaultEditorPreferences, On as Text, Ot as closeFileTab, P as FileWorkspace, Pt as rememberFile, Qt as renderFileWithHighlighter, R as remainingMutationIntent, Sn as writePreference, St as parseReviewSession, T as FileConflictPanel, Tt as reviewComparison, U as FileSearchPanel, Ut as areDiffRenderOptionsEqual, Vt as isDiffPlainText, Wt as areFilesEqual, Xt as markWorkerErrorReported, Yt as isHandledWorkerPoolError, Zt as isFilePlainText, an as attachResolvedThemes, bn as toast, bt as defaultReviewView, cn as getResolvedOrResolveLanguage, ct as codeCommentCounts, dn as ResolvedLanguages, en as hasResolvedThemes, f as storeDocument, ft as isCodeConversation, ht as readConversationLocation, in as validateResolvedThemeName, j as FileMutationDialog, jt as parseFileView, k as parseEditorPreferences, kt as defaultFileView, l as projectStore, ln as resolveLanguage, m as storedFiles, mt as locateCodeConversations, nn as getSharedHighlighter, on as themeResolver, p as storedDocument, qt as WorkerPoolTerminatedError, rn as prepareThemeResolution, s as applyFileUpdate, sn as getThemes, tn as areThemesEqual, u as saveFiles, un as areLanguagesAttached, ut as conversationHref, v as projectLive, wt as rememberReviewPosition, xn as readPreference, yt as defaultReviewPosition } from "./comment-data-9SqALQjT.js";
4
4
  import { l as DEFAULT_THEMES } from "./constants-C7Y3SJGj.js";
5
- import { n as createProjectComments, t as defineScreen } from "./screen-BtcJmZwj.js";
5
+ import { n as createProjectComments, t as defineScreen } from "./screen-BtvzEiIa.js";
6
6
  import { t as require_lru } from "./lru-C4Rh6JYD.js";
7
- import { t as ProjectThreadLinks } from "./project-thread-links-Nfz9NIny.js";
7
+ import { t as ProjectThreadLinks } from "./project-thread-links-C0kV_Pcl.js";
8
8
  import { ref } from "remix/component";
9
9
  import { jsx, jsxs } from "remix/component/jsx-runtime";
10
10
  //#region ../../node_modules/.pnpm/@pierre+diffs@1.5.2_@shikijs+themes@4.5.0_react-dom@19.3.1_react@19.3.1__react@19.3.1/node_modules/@pierre/diffs/dist/highlighter/languages/getResolvedLanguages.js
@@ -1,9 +1,9 @@
1
1
  import { Dn as tryPromise, Dt as callback, Ft as fail$1, Gt as map, Kt as mapError, Lt as flatMap, Mn as void_, Nt as die, On as try_, Pt as ensuring, Sn as sync, St as andThen, Ut as gen, Zt as promise, g as resolveScreenRoutes, gn as scoped, gr as TaggedError, h as defaultScreens, qt as match, s as Previews, t as BranchPreviews, u as Git, v as themeStyle, vt as acquireRelease, y as LOGO_TYPES } from "./branch-previews-ClkoJ0lM.js";
2
2
  import { C as selected$1, I as WorkError, L as ScreenModules, O as AdapterRegistry, S as ready, T as LiveChannel, V as taskDesignModuleId, a as FileMutations, b as read, c as FileReview, f as Files, g as StoreActivity, h as ReviewActionError, m as FilesInputError, r as FileSaves, t as FileReviewActions, u as FileSearch, w as validate, x as readWorkspace, y as inspect } from "./server-CYvuOSBA.js";
3
3
  import { A as parseThreadReplyInput, D as parseThreadId, Dt as parseFileSearchQuery, E as parseThreadFilter, Ht as parseFilePath, N as parseThreadStatusInput, O as parseThreadInput, Rt as parseFileIndexQuery, St as parseReviewSourceQuery, X as parseReviewActionIntent, Xt as parseElementAnchor, Y as parseReviewActionApply, Yt as MAX_CANVAS_Y, _ as taskRoutes, _t as parseReviewHistoryQuery, an as parseWorkDetail, at as parseMutationIntent, cn as parseWorkMutationResult, en as parseSectionData, fn as parseWorkSync, g as pageRoutes, h as fileRoutes, ht as parseReviewDiffQuery, i as routes, in as parseWorkCreate, it as parseMutationApply, j as parseThreadSnapshot, k as parseThreadLinkInput, mn as parseWorkUpdate, pn as parseWorkSyncResult, pt as parseReviewComparison, rt as maxFileSaveBytes, sn as parseWorkItemRef, tn as parseWorkActionInput, tt as parseFileSaveRequest, un as parseWorkQuery, vn as parseMessageAuthor, w as parseThread } from "./events-6z5v7Uca.js";
4
- import { $ as openShellTab, B as parseTaskDesign, Bt as Button, Cn as isLocale, Dn as Text, En as useLocaleSource, J as FieldCardContent, Q as initialShellTabs, Rt as Loader, Sn as writePreference, Tn as t, X as activeTab, Y as FieldCardHeader, Z as closeShellTab, _ as requestComments, _n as LiveStatus, _t as taskHref, at as tabsCookieValue, et as parseShellTabs, gt as selectedTask, ht as readConversationLocation, it as tabsCookieName, lt as conversationDestination, mn as ShellTabBar, n as unavailableComments, nt as stepShellTab, ot as visitShellTab, pt as legacyConversationHref, q as FieldCard, r as followThreads, rt as tabHref, t as commentsUnavailable, tt as readTabsCookie, v as projectLive, wn as locale, xn as readPreference, xt as legacyFileHref, yn as AppShell } from "./comment-data-B0OLHBGp.js";
4
+ import { $ as openShellTab, B as parseTaskDesign, Bt as Button, Cn as hasMessage, Dn as useLocaleSource, En as t, J as FieldCardContent, On as Text, Q as initialShellTabs, Rt as Loader, Sn as writePreference, Tn as locale, X as activeTab, Y as FieldCardHeader, Z as closeShellTab, _ as requestComments, _n as LiveStatus, _t as taskHref, at as tabsCookieValue, et as parseShellTabs, gt as selectedTask, ht as readConversationLocation, it as tabsCookieName, lt as conversationDestination, mn as ShellTabBar, n as unavailableComments, nt as stepShellTab, ot as visitShellTab, pt as legacyConversationHref, q as FieldCard, r as followThreads, rt as tabHref, t as commentsUnavailable, tt as readTabsCookie, v as projectLive, wn as isLocale, xn as readPreference, xt as legacyFileHref, yn as AppShell } from "./comment-data-9SqALQjT.js";
5
5
  import { d as parsePreviewHash, f as parsePreviewId, l as parsePreviewBranch, m as parsePreviewViewport } from "./parsers-CsiSkwTT.js";
6
- import { t as projectWork } from "./project-work-Cy_BpHwR.js";
6
+ import { t as projectWork } from "./project-work-C0FN3w5Y.js";
7
7
  import { n as showWorkspaceTab } from "./workspace-tab-DAUjkJzZ.js";
8
8
  import { createHash } from "node:crypto";
9
9
  import { extname, isAbsolute, relative, resolve } from "node:path";
@@ -86,10 +86,10 @@ function ProjectLiveStatus(handle) {
86
86
  //#endregion
87
87
  //#region app/client/screens.ts
88
88
  var builtIns = {
89
- "bud:pages": () => import("./pages-BNa0MHEc.js"),
90
- "bud:canvas": () => import("./canvas-Dn4RYoU2.js"),
91
- "bud:tasks": () => import("./tasks-B82tHwyQ.js"),
92
- "bud:files": () => import("./files-C5Vilfe4.js")
89
+ "bud:pages": () => import("./pages-DJMLr6j9.js"),
90
+ "bud:canvas": () => import("./canvas-CiN6jNIZ.js"),
91
+ "bud:tasks": () => import("./tasks-DX71x8f9.js"),
92
+ "bud:files": () => import("./files-DBVqeLdL.js")
93
93
  };
94
94
  /**
95
95
  * Imports a screen module: a built-in by its key, any other by the URL the server gave it.
@@ -613,6 +613,11 @@ var builtInRoutes = {
613
613
  "bud:tasks": taskRoutes,
614
614
  "bud:files": fileRoutes
615
615
  };
616
+ function screenName(screen) {
617
+ let builtIn = defaultScreens.find((candidate) => candidate.module === screen.module);
618
+ let key = `screens.${builtIn?.id}`;
619
+ return builtIn && screen.label === builtIn.label && hasMessage(key) ? t(key) : screen.label;
620
+ }
616
621
  /**
617
622
  * Connects the route contract to application responses.
618
623
  * @param template - The development or production HTML shell.
@@ -653,7 +658,10 @@ function createAppController(template, project, runtime) {
653
658
  let module = await prepare(screen, request.signal);
654
659
  let taskDesign = project && (screen.module === "bud:tasks" || conversation !== void 0 && screens.some((target) => target.module === "bud:tasks")) && project.config.designs.tasks !== "bud:beads" && runtime ? await runtime.runPromise(ScreenModules.use((modules) => modules.module(taskDesignModuleId)), { signal: request.signal }) : void 0;
655
660
  let content = await renderToString(/* @__PURE__ */ jsx(WorkspacePage, {
656
- screens: items,
661
+ screens: items.map((item, index) => ({
662
+ ...item,
663
+ label: screenName(screens[index])
664
+ })),
657
665
  active: screen.id,
658
666
  module,
659
667
  taskDesign,
@@ -680,7 +688,7 @@ function createAppController(template, project, runtime) {
680
688
  ...patterns ? { routes: patterns } : {}
681
689
  }
682
690
  }));
683
- let title = (conversation ? "Discussion" : screen.label).replace(/[&<>]/g, (character) => `&#${character.charCodeAt(0)};`);
691
+ let title = (conversation ? t("app.controller.discussion") : screenName(screen)).replace(/[&<>]/g, (character) => `&#${character.charCodeAt(0)};`);
684
692
  let logo = project?.config.logo;
685
693
  let shell = logo ? withLogoIcons(template, logo, (theme) => routes.logo.href({ theme })) : template;
686
694
  return new Response(shell.replace("<html lang=\"en\"", () => `<html lang="${locale()}"`).replace("<title>bud.sh</title>", () => `<title>${title} · bud.sh</title>`).replace("</head>", () => project ? `${themeStyle(project.config.theme)}</head>` : "</head>").replace("<!--app-html-->", () => content), { headers: { "Content-Type": "text/html; charset=utf-8" } });
@@ -1,8 +1,8 @@
1
1
  import { Yt as MAX_CANVAS_Y, g as pageRoutes } from "./events-6z5v7Uca.js";
2
- import { Dn as Text, Rt as Loader, Sn as writePreference, Tn as t, gn as IconButton, hn as Select, l as projectStore, st as PagesWorkspace, xn as readPreference, zt as Spinner } from "./comment-data-B0OLHBGp.js";
3
- import { n as createProjectComments, t as defineScreen } from "./screen-BtcJmZwj.js";
2
+ import { En as t, On as Text, Rt as Loader, Sn as writePreference, gn as IconButton, hn as Select, l as projectStore, st as PagesWorkspace, xn as readPreference, zt as Spinner } from "./comment-data-9SqALQjT.js";
3
+ import { n as createProjectComments, t as defineScreen } from "./screen-BtvzEiIa.js";
4
4
  import { r as workspaceTab, t as followWorkspaceTab } from "./workspace-tab-DAUjkJzZ.js";
5
- import { n as createProjectPreviews, r as locatePreview, t as createProjectBranches } from "./project-branches-GtQYyOH5.js";
5
+ import { n as createProjectPreviews, r as locatePreview, t as createProjectBranches } from "./project-branches-DbKEmiQT.js";
6
6
  import { array, number, object, optional, parseSafe, string } from "remix/data-schema";
7
7
  import { on, ref } from "remix/component";
8
8
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
@@ -1,5 +1,5 @@
1
1
  import { Xt as parseElementAnchor, i as routes } from "./events-6z5v7Uca.js";
2
- import { Tn as t, c as previewKey, l as projectStore, v as projectLive, x as writeRows, y as plainRow } from "./comment-data-B0OLHBGp.js";
2
+ import { En as t, c as previewKey, l as projectStore, v as projectLive, x as writeRows, y as plainRow } from "./comment-data-9SqALQjT.js";
3
3
  import { c as parsePreview, l as parsePreviewBranch, p as parsePreviewPins } from "./parsers-CsiSkwTT.js";
4
4
  import { array, boolean, enum_, nullable, number, object, parseSafe, string } from "remix/data-schema";
5
5
  //#region app/client/project-previews.ts
@@ -1,6 +1,6 @@
1
1
  import { Zt as parseWorkWorkspace, gn as valueByRole, i as routes, k as parseThreadLinkInput, sn as parseWorkItemRef, w as parseThread } from "./events-6z5v7Uca.js";
2
- import { C as ThreadTaskPicker, S as ThreadTaskLinks, Tn as t, _ as requestComments, _t as taskHref, gn as IconButton } from "./comment-data-B0OLHBGp.js";
3
- import { n as requestTasks } from "./tasks-request-BtJBlkxV.js";
2
+ import { C as ThreadTaskPicker, En as t, S as ThreadTaskLinks, _ as requestComments, _t as taskHref, gn as IconButton } from "./comment-data-9SqALQjT.js";
3
+ import { n as requestTasks } from "./tasks-request-C3jk9Jyu.js";
4
4
  import { on, ref } from "remix/component";
5
5
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
6
6
  //#region app/client/project-task-picker.tsx
@@ -1,6 +1,6 @@
1
1
  import { Zt as parseWorkWorkspace, i as routes, y as parseWorkChange } from "./events-6z5v7Uca.js";
2
- import { d as saveWorkspace, l as projectStore, v as projectLive, x as writeRows, y as plainRow } from "./comment-data-B0OLHBGp.js";
3
- import { n as requestTasks } from "./tasks-request-BtJBlkxV.js";
2
+ import { d as saveWorkspace, l as projectStore, v as projectLive, x as writeRows, y as plainRow } from "./comment-data-9SqALQjT.js";
3
+ import { n as requestTasks } from "./tasks-request-C3jk9Jyu.js";
4
4
  //#region app/client/project-work.ts
5
5
  var syncs = /* @__PURE__ */ new Map();
6
6
  /**
@@ -1,5 +1,5 @@
1
1
  import { D as parseThreadId, E as parseThreadFilter, i as routes, j as parseThreadSnapshot, w as parseThread } from "./events-6z5v7Uca.js";
2
- import { Tn as t, _ as requestComments, a as saveThreads, b as writeOptimistically, bn as toast, g as CommentsRequestError, i as saveThread, l as projectStore, n as unavailableComments, o as threadMatches, y as plainRow } from "./comment-data-B0OLHBGp.js";
2
+ import { En as t, _ as requestComments, a as saveThreads, b as writeOptimistically, bn as toast, g as CommentsRequestError, i as saveThread, l as projectStore, n as unavailableComments, o as threadMatches, y as plainRow } from "./comment-data-9SqALQjT.js";
3
3
  //#region ../work/src/lib/predict.ts
4
4
  /**
5
5
  * How a new task shows until its adapter confirms it: the requested values, and the creation
@@ -1,9 +1,9 @@
1
1
  import { _ as taskRoutes, an as parseWorkDetail, cn as parseWorkMutationResult, en as parseSectionData, i as routes, pn as parseWorkSyncResult } from "./events-6z5v7Uca.js";
2
- import { Bt as Button, Dn as Text, Ft as CommentThreadDetail, It as CommentThreadItem, K as CommentThreadHeading, Lt as CommentComposer, S as ThreadTaskLinks, Tn as t, _t as taskHref, b as writeOptimistically, bn as toast, dt as conversationLabel, gt as selectedTask, h as storedWorkspace, ht as readConversationLocation, l as projectStore, vt as taskRole, w as ItemDiscussion, x as writeRows, y as plainRow, z as TaskWorkspace } from "./comment-data-B0OLHBGp.js";
3
- import { a as predictWorkAction, i as loadItemComments, n as createProjectComments, o as predictWorkCreate, s as predictWorkUpdate, t as defineScreen } from "./screen-BtcJmZwj.js";
4
- import { n as requestTasks, t as TaskRequestError } from "./tasks-request-BtJBlkxV.js";
5
- import { t as projectWork } from "./project-work-Cy_BpHwR.js";
6
- import { n as ProjectTaskPicker, t as ProjectThreadLinks } from "./project-thread-links-Nfz9NIny.js";
2
+ import { Bt as Button, En as t, Ft as CommentThreadDetail, It as CommentThreadItem, K as CommentThreadHeading, Lt as CommentComposer, On as Text, S as ThreadTaskLinks, _t as taskHref, b as writeOptimistically, bn as toast, dt as conversationLabel, gt as selectedTask, h as storedWorkspace, ht as readConversationLocation, l as projectStore, vt as taskRole, w as ItemDiscussion, x as writeRows, y as plainRow, z as TaskWorkspace } from "./comment-data-9SqALQjT.js";
3
+ import { a as predictWorkAction, i as loadItemComments, n as createProjectComments, o as predictWorkCreate, s as predictWorkUpdate, t as defineScreen } from "./screen-BtvzEiIa.js";
4
+ import { n as requestTasks, t as TaskRequestError } from "./tasks-request-C3jk9Jyu.js";
5
+ import { t as projectWork } from "./project-work-C0FN3w5Y.js";
6
+ import { n as ProjectTaskPicker, t as ProjectThreadLinks } from "./project-thread-links-C0kV_Pcl.js";
7
7
  import { on, ref } from "remix/component";
8
8
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
9
9
  //#region app/client/task-discussion.tsx
@@ -1,5 +1,5 @@
1
1
  import { i as routes, sn as parseWorkItemRef, un as parseWorkQuery } from "./events-6z5v7Uca.js";
2
- import { Tn as t } from "./comment-data-B0OLHBGp.js";
2
+ import { En as t } from "./comment-data-9SqALQjT.js";
3
3
  import { createMultiMatcher } from "remix/route-pattern/match";
4
4
  //#region app/client/tasks-request.ts
5
5
  var reads = createMultiMatcher();
@@ -1,6 +1,6 @@
1
1
  import { An as uninterruptible, Dn as tryPromise, Kt as mapError, Rn as effect, Ut as gen, Zt as promise, p as createProjectContext, qn as provideMerge, sn as runPromise, sr as Service, vt as acquireRelease, x as readText } from "./assets/branch-previews-ClkoJ0lM.js";
2
2
  import { B as sharedModules, H as make } from "./assets/server-CYvuOSBA.js";
3
- import { n as listen, r as createApp, t as ServerError } from "./assets/listener-o1STuLju.js";
3
+ import { n as listen, r as createApp, t as ServerError } from "./assets/listener-DGWKUc2o.js";
4
4
  import { t as applicationLayer } from "./assets/services-DK4fqrlF.js";
5
5
  import { fileURLToPath } from "node:url";
6
6
  //#region app/server/runtime.ts
@@ -1,6 +1,6 @@
1
1
  import { Kn as provide, Rn as effect, Ut as gen, b as nodeLayer, sr as Service, x as readText } from "./assets/branch-previews-ClkoJ0lM.js";
2
2
  import { H as make } from "./assets/server-CYvuOSBA.js";
3
- import { n as listen, r as createApp } from "./assets/listener-o1STuLju.js";
3
+ import { n as listen, r as createApp } from "./assets/listener-DGWKUc2o.js";
4
4
  import { fileURLToPath } from "node:url";
5
5
  //#region server.ts
6
6
  var Listener = class extends Service()("bud/StandaloneListener") {};