syntaur 0.25.0 → 0.26.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 (65) hide show
  1. package/dashboard/dist/assets/{_basePickBy-CN0iXrRl.js → _basePickBy-jPItyrQO.js} +1 -1
  2. package/dashboard/dist/assets/{_baseUniq-f5KgmPS-.js → _baseUniq-pEwUwurC.js} +1 -1
  3. package/dashboard/dist/assets/{arc-Is_GQHDi.js → arc-ZZtp507S.js} +1 -1
  4. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-GnMoIbkq.js → architectureDiagram-2XIMDMQ5-BNUerPqd.js} +1 -1
  5. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-C6FJCqER.js → blockDiagram-WCTKOSBZ-CQyovXFv.js} +1 -1
  6. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-CbzB6xiI.js → c4Diagram-IC4MRINW-wNQ6EHeF.js} +1 -1
  7. package/dashboard/dist/assets/channel-BYnzdl2x.js +1 -0
  8. package/dashboard/dist/assets/{chunk-4BX2VUAB-DfVhtiVZ.js → chunk-4BX2VUAB-ZaueC30R.js} +1 -1
  9. package/dashboard/dist/assets/{chunk-55IACEB6-yDuI8WJG.js → chunk-55IACEB6-BjsRB0t8.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-FMBD7UC4-ClMCd4y0.js → chunk-FMBD7UC4-BHuSr-Tl.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-JSJVCQXG-x0Ds2VxI.js → chunk-JSJVCQXG-SHNJA0es.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-KX2RTZJC-BtLBfEbM.js → chunk-KX2RTZJC-JXFPjeo4.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-NQ4KR5QH-BR_YJ2O0.js → chunk-NQ4KR5QH-BiJqWT0B.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-QZHKN3VN-CpJrMBfa.js → chunk-QZHKN3VN-DoXWBqP2.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-WL4C6EOR-COlZCEcU.js → chunk-WL4C6EOR-Dqtf_5it.js} +1 -1
  16. package/dashboard/dist/assets/classDiagram-VBA2DB6C-BnPZbM4g.js +1 -0
  17. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BnPZbM4g.js +1 -0
  18. package/dashboard/dist/assets/clone-DYNFxLr3.js +1 -0
  19. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-Be49cOHu.js → cose-bilkent-S5V4N54A-Cr6bkSKq.js} +1 -1
  20. package/dashboard/dist/assets/{dagre-KLK3FWXG-kMJYOzRh.js → dagre-KLK3FWXG-oXpXFuJQ.js} +1 -1
  21. package/dashboard/dist/assets/{diagram-E7M64L7V-16A5Ru0f.js → diagram-E7M64L7V-Bq_xdDbg.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-IFDJBPK2-BcnW30go.js → diagram-IFDJBPK2-N7Er4Dui.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-P4PSJMXO-H00u_5yZ.js → diagram-P4PSJMXO-BU0Zm2Fn.js} +1 -1
  24. package/dashboard/dist/assets/{erDiagram-INFDFZHY-DLJRqyow.js → erDiagram-INFDFZHY-BSgZb5me.js} +1 -1
  25. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-CMNpPp6k.js → flowDiagram-PKNHOUZH-Bn7pEu0U.js} +1 -1
  26. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-CM1TPA1M.js → ganttDiagram-A5KZAMGK-B8Xq9tyM.js} +1 -1
  27. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-CaZU57JT.js → gitGraphDiagram-K3NZZRJ6-BoLUjYDa.js} +1 -1
  28. package/dashboard/dist/assets/{graph-E2a2RZr0.js → graph-Pde_ni_y.js} +1 -1
  29. package/dashboard/dist/assets/index-7rNWNKq7.css +1 -0
  30. package/dashboard/dist/assets/{index-87em5uVQ.js → index-Nc9kfSW-.js} +122 -122
  31. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-DNNTGL3j.js → infoDiagram-LFFYTUFH-Brv2khjP.js} +1 -1
  32. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-CDOwhxyG.js → ishikawaDiagram-PHBUUO56-D5hxQ0Ke.js} +1 -1
  33. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-DfktCUGL.js → journeyDiagram-4ABVD52K-CUevv5jA.js} +1 -1
  34. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-Cef-JH0v.js → kanban-definition-K7BYSVSG-Cf6XyrAC.js} +1 -1
  35. package/dashboard/dist/assets/{layout-DX6aMfnc.js → layout-Bc8RP2w3.js} +1 -1
  36. package/dashboard/dist/assets/{linear-VHsqclP8.js → linear-Cd_XUbl7.js} +1 -1
  37. package/dashboard/dist/assets/{mermaid.core-SHnQ4DTm.js → mermaid.core-Bx8MuMEM.js} +4 -4
  38. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-B6rPgI2_.js → mindmap-definition-YRQLILUH-D_4Pl3Mu.js} +1 -1
  39. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-FeFYwJd1.js → pieDiagram-SKSYHLDU-DRVbjwxO.js} +1 -1
  40. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-C8ToaX6X.js → quadrantDiagram-337W2JSQ-BciLlBMH.js} +1 -1
  41. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-DcQFgBUh.js → requirementDiagram-Z7DCOOCP-Bprwe8Z2.js} +1 -1
  42. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-tg-fe8h0.js → sankeyDiagram-WA2Y5GQK-DI0t8Uiu.js} +1 -1
  43. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-DvK0Qr3p.js → sequenceDiagram-2WXFIKYE-CpCLCs5J.js} +1 -1
  44. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-CA0uNmJC.js → stateDiagram-RAJIS63D-V-1VCApT.js} +1 -1
  45. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-B6S2ctrX.js +1 -0
  46. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-BvSG2mgT.js → timeline-definition-YZTLITO2-DCAo6tA7.js} +1 -1
  47. package/dashboard/dist/assets/{treemap-KZPCXAKY-DKSXIxeb.js → treemap-KZPCXAKY-CKlbZ6Y_.js} +1 -1
  48. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-DbftUvFP.js → vennDiagram-LZ73GAT5-CJSijre_.js} +1 -1
  49. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-DewVggKf.js → xychartDiagram-JWTSCODW-DXd1BBmK.js} +1 -1
  50. package/dashboard/dist/index.html +2 -2
  51. package/dist/dashboard/server.js +190 -22
  52. package/dist/dashboard/server.js.map +1 -1
  53. package/dist/index.js +215 -23
  54. package/dist/index.js.map +1 -1
  55. package/dist/launch/index.d.ts +6 -0
  56. package/dist/launch/index.js +89 -3
  57. package/dist/launch/index.js.map +1 -1
  58. package/package.json +1 -1
  59. package/scripts/install-macos-url-handler.mjs +14 -1
  60. package/dashboard/dist/assets/channel-I1qzkKSE.js +0 -1
  61. package/dashboard/dist/assets/classDiagram-VBA2DB6C-Br3zoueH.js +0 -1
  62. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-Br3zoueH.js +0 -1
  63. package/dashboard/dist/assets/clone-BNiIx-eM.js +0 -1
  64. package/dashboard/dist/assets/index-3X9xvPGn.css +0 -1
  65. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-CiCui2CK.js +0 -1
@@ -1766,6 +1766,31 @@ var init_terminal_schema = __esm({
1766
1766
  }
1767
1767
  });
1768
1768
 
1769
+ // src/utils/workspace-visibility-schema.ts
1770
+ function normalizeHiddenList(input) {
1771
+ if (!Array.isArray(input)) return [];
1772
+ const seen = /* @__PURE__ */ new Set();
1773
+ const out = [];
1774
+ for (const raw of input) {
1775
+ if (typeof raw !== "string") continue;
1776
+ const name = raw.trim();
1777
+ if (name.length === 0) continue;
1778
+ if (name.length > MAX_WORKSPACE_NAME_LENGTH) continue;
1779
+ if (/[\r\n]/.test(name)) continue;
1780
+ if (seen.has(name)) continue;
1781
+ seen.add(name);
1782
+ out.push(name);
1783
+ }
1784
+ return out;
1785
+ }
1786
+ var MAX_WORKSPACE_NAME_LENGTH;
1787
+ var init_workspace_visibility_schema = __esm({
1788
+ "src/utils/workspace-visibility-schema.ts"() {
1789
+ "use strict";
1790
+ MAX_WORKSPACE_NAME_LENGTH = 256;
1791
+ }
1792
+ });
1793
+
1769
1794
  // src/utils/config.ts
1770
1795
  var config_exports = {};
1771
1796
  __export(config_exports, {
@@ -1781,6 +1806,7 @@ __export(config_exports, {
1781
1806
  deleteStatusConfig: () => deleteStatusConfig,
1782
1807
  deleteTerminalConfig: () => deleteTerminalConfig,
1783
1808
  deleteThemeConfig: () => deleteThemeConfig,
1809
+ deleteWorkspaceVisibilityConfig: () => deleteWorkspaceVisibilityConfig,
1784
1810
  getAgents: () => getAgents,
1785
1811
  getAssignmentTypes: () => getAssignmentTypes,
1786
1812
  getTerminal: () => getTerminal,
@@ -1797,7 +1823,8 @@ __export(config_exports, {
1797
1823
  writeHotkeyBindingsConfig: () => writeHotkeyBindingsConfig,
1798
1824
  writeStatusConfig: () => writeStatusConfig,
1799
1825
  writeTerminalConfig: () => writeTerminalConfig,
1800
- writeThemeConfig: () => writeThemeConfig
1826
+ writeThemeConfig: () => writeThemeConfig,
1827
+ writeWorkspaceVisibilityConfig: () => writeWorkspaceVisibilityConfig
1801
1828
  });
1802
1829
  import { readFile as readFile5 } from "fs/promises";
1803
1830
  import { spawnSync } from "child_process";
@@ -1898,7 +1925,10 @@ function cloneDefaultConfig() {
1898
1925
  },
1899
1926
  theme: DEFAULT_CONFIG.theme ? { ...DEFAULT_CONFIG.theme } : null,
1900
1927
  hotkeys: DEFAULT_CONFIG.hotkeys ? { bindings: { ...DEFAULT_CONFIG.hotkeys.bindings } } : null,
1901
- terminal: DEFAULT_CONFIG.terminal
1928
+ terminal: DEFAULT_CONFIG.terminal,
1929
+ workspaceVisibility: {
1930
+ hidden: [...DEFAULT_CONFIG.workspaceVisibility.hidden]
1931
+ }
1902
1932
  };
1903
1933
  }
1904
1934
  function parseFrontmatter(content) {
@@ -2230,6 +2260,93 @@ ${cleanedFm}
2230
2260
  ---${afterFrontmatter}`;
2231
2261
  await writeFileForce(configPath, newContent);
2232
2262
  }
2263
+ function serializeWorkspaceVisibilityConfig(cfg) {
2264
+ const hidden = normalizeHiddenList(cfg.hidden);
2265
+ if (hidden.length === 0) return null;
2266
+ const lines = ["workspaceVisibility:", " hidden:"];
2267
+ for (const name of hidden) {
2268
+ lines.push(` - ${JSON.stringify(name)}`);
2269
+ }
2270
+ return lines.join("\n");
2271
+ }
2272
+ function parseWorkspaceVisibilityConfig(fmBlock) {
2273
+ const blockStart = fmBlock.match(/^workspaceVisibility:\s*$/m);
2274
+ if (!blockStart) {
2275
+ return { hidden: [] };
2276
+ }
2277
+ const startIdx = fmBlock.indexOf(blockStart[0]) + blockStart[0].length;
2278
+ const remaining = fmBlock.slice(startIdx).split("\n");
2279
+ const hidden = [];
2280
+ let currentSection = null;
2281
+ for (const line of remaining) {
2282
+ const trimmed = line.trimStart();
2283
+ const indent = line.length - trimmed.length;
2284
+ if (indent === 0 && trimmed.length > 0) break;
2285
+ if (trimmed === "") continue;
2286
+ if (indent === 2 && trimmed.startsWith("hidden:")) {
2287
+ currentSection = "hidden";
2288
+ continue;
2289
+ }
2290
+ if (currentSection === "hidden" && indent >= 4 && trimmed.startsWith("- ")) {
2291
+ const rest = trimmed.slice(2).trim();
2292
+ if (rest.length === 0) continue;
2293
+ let name;
2294
+ if (rest.startsWith('"')) {
2295
+ try {
2296
+ name = JSON.parse(rest);
2297
+ } catch {
2298
+ name = rest.replace(/^["']|["']$/g, "");
2299
+ }
2300
+ } else {
2301
+ name = rest;
2302
+ }
2303
+ hidden.push(name);
2304
+ continue;
2305
+ }
2306
+ }
2307
+ return { hidden: normalizeHiddenList(hidden) };
2308
+ }
2309
+ async function writeWorkspaceVisibilityConfig(cfg) {
2310
+ const configPath = resolve6(syntaurRoot(), "config.md");
2311
+ const block = serializeWorkspaceVisibilityConfig(cfg);
2312
+ const existing = await fileExists(configPath) ? await readFile5(configPath, "utf-8") : renderConfig({ defaultProjectDir: defaultProjectDir() });
2313
+ const fmMatch = existing.match(/^(---\n)([\s\S]*?)\n(---)/);
2314
+ if (!fmMatch) {
2315
+ const bodyBlock = block ? `${block}
2316
+ ` : "";
2317
+ const content = `---
2318
+ version: "2.0"
2319
+ defaultProjectDir: ${defaultProjectDir()}
2320
+ ${bodyBlock}---
2321
+ ${existing}`;
2322
+ await writeFileForce(configPath, content);
2323
+ return;
2324
+ }
2325
+ const fmBlock = fmMatch[2];
2326
+ const afterFrontmatter = existing.slice(fmMatch[0].length);
2327
+ const cleanedFm = stripTopLevelBlock(fmBlock, "workspaceVisibility");
2328
+ const newFm = block ? `${cleanedFm}
2329
+ ${block}`.replace(/^\n+/, "") : cleanedFm;
2330
+ const normalizedFm = newFm.replace(/\n+$/, "");
2331
+ const newContent = `---
2332
+ ${normalizedFm}
2333
+ ---${afterFrontmatter}`;
2334
+ await writeFileForce(configPath, newContent);
2335
+ }
2336
+ async function deleteWorkspaceVisibilityConfig() {
2337
+ const configPath = resolve6(syntaurRoot(), "config.md");
2338
+ if (!await fileExists(configPath)) return;
2339
+ const existing = await readFile5(configPath, "utf-8");
2340
+ const fmMatch = existing.match(/^(---\n)([\s\S]*?)\n(---)/);
2341
+ if (!fmMatch) return;
2342
+ const fmBlock = fmMatch[2];
2343
+ const afterFrontmatter = existing.slice(fmMatch[0].length);
2344
+ const cleanedFm = stripTopLevelBlock(fmBlock, "workspaceVisibility");
2345
+ const newContent = `---
2346
+ ${cleanedFm}
2347
+ ---${afterFrontmatter}`;
2348
+ await writeFileForce(configPath, newContent);
2349
+ }
2233
2350
  function stripTopLevelScalar(fmBlock, key) {
2234
2351
  const lines = fmBlock.split("\n");
2235
2352
  const keyRegex = new RegExp(`^${key}:\\s*\\S`);
@@ -2946,7 +3063,8 @@ async function readConfig() {
2946
3063
  console.warn(`Warning: ${msg} \u2014 falling back to default`);
2947
3064
  return null;
2948
3065
  }
2949
- })()
3066
+ })(),
3067
+ workspaceVisibility: parseWorkspaceVisibilityConfig(fmBlock)
2950
3068
  };
2951
3069
  }
2952
3070
  function getAssignmentTypes(config) {
@@ -3020,6 +3138,7 @@ var init_config2 = __esm({
3020
3138
  init_hotkeysCatalog();
3021
3139
  init_agents_schema();
3022
3140
  init_terminal_schema();
3141
+ init_workspace_visibility_schema();
3023
3142
  DEFAULT_ASSIGNMENT_TYPES = {
3024
3143
  definitions: [
3025
3144
  { id: "feature", label: "Feature" },
@@ -3055,7 +3174,10 @@ var init_config2 = __esm({
3055
3174
  },
3056
3175
  theme: null,
3057
3176
  hotkeys: null,
3058
- terminal: null
3177
+ terminal: null,
3178
+ workspaceVisibility: {
3179
+ hidden: []
3180
+ }
3059
3181
  };
3060
3182
  AUTO_CREATE_WORKTREE_VALUES = ["skip", "ask", "always"];
3061
3183
  AgentConfigError = class extends Error {
@@ -11722,10 +11844,55 @@ function createTerminalConfigRouter() {
11722
11844
  return router;
11723
11845
  }
11724
11846
 
11847
+ // src/dashboard/api-workspace-visibility-config.ts
11848
+ init_config2();
11849
+ init_workspace_visibility_schema();
11850
+ import { Router as Router8 } from "express";
11851
+ function createWorkspaceVisibilityConfigRouter() {
11852
+ const router = Router8();
11853
+ router.get("/", async (_req, res) => {
11854
+ try {
11855
+ const config = await readConfig();
11856
+ const hidden = config.workspaceVisibility.hidden;
11857
+ res.json({ hidden, custom: hidden.length > 0 });
11858
+ } catch (error) {
11859
+ console.error("Error getting workspace-visibility config:", error);
11860
+ res.status(500).json({ error: "Failed to get workspace-visibility config" });
11861
+ }
11862
+ });
11863
+ router.post("/", async (req, res) => {
11864
+ try {
11865
+ const { hidden } = req.body ?? {};
11866
+ if (!Array.isArray(hidden) || hidden.some((h) => typeof h !== "string")) {
11867
+ res.status(400).json({
11868
+ error: "hidden must be an array of strings"
11869
+ });
11870
+ return;
11871
+ }
11872
+ const normalized = normalizeHiddenList(hidden);
11873
+ await writeWorkspaceVisibilityConfig({ hidden: normalized });
11874
+ res.json({ hidden: normalized, custom: normalized.length > 0 });
11875
+ } catch (error) {
11876
+ console.error("Error saving workspace-visibility config:", error);
11877
+ res.status(500).json({ error: "Failed to save workspace-visibility config" });
11878
+ }
11879
+ });
11880
+ router.delete("/", async (_req, res) => {
11881
+ try {
11882
+ await deleteWorkspaceVisibilityConfig();
11883
+ res.json({ hidden: [], custom: false });
11884
+ } catch (error) {
11885
+ console.error("Error resetting workspace-visibility config:", error);
11886
+ res.status(500).json({ error: "Failed to reset workspace-visibility config" });
11887
+ }
11888
+ });
11889
+ return router;
11890
+ }
11891
+
11725
11892
  // src/dashboard/api-status-config.ts
11726
11893
  init_config2();
11727
11894
  init_api();
11728
- import { Router as Router8 } from "express";
11895
+ import { Router as Router9 } from "express";
11729
11896
 
11730
11897
  // src/utils/status-config-resolution.ts
11731
11898
  init_frontmatter();
@@ -12087,7 +12254,7 @@ function mapResolutionErrorToHttp(err, applied) {
12087
12254
  }
12088
12255
  }
12089
12256
  function createStatusConfigRouter(projectsDir, assignmentsDir2) {
12090
- const router = Router8();
12257
+ const router = Router9();
12091
12258
  installRecordsInvalidation(router);
12092
12259
  router.get("/", async (_req, res) => {
12093
12260
  try {
@@ -12268,7 +12435,7 @@ function createStatusConfigRouter(projectsDir, assignmentsDir2) {
12268
12435
  }
12269
12436
 
12270
12437
  // src/dashboard/api-leases.ts
12271
- import { Router as Router9 } from "express";
12438
+ import { Router as Router10 } from "express";
12272
12439
 
12273
12440
  // src/db/leases-db.ts
12274
12441
  init_paths();
@@ -12450,7 +12617,7 @@ function forceReleaseLease(lease_id) {
12450
12617
 
12451
12618
  // src/dashboard/api-leases.ts
12452
12619
  function createLeasesRouter(broadcast) {
12453
- const router = Router9();
12620
+ const router = Router10();
12454
12621
  router.get("/", (_req, res) => {
12455
12622
  try {
12456
12623
  initLeasesDb();
@@ -12505,7 +12672,7 @@ function createLeasesRouter(broadcast) {
12505
12672
  }
12506
12673
 
12507
12674
  // src/dashboard/api-usage.ts
12508
- import { Router as Router10 } from "express";
12675
+ import { Router as Router11 } from "express";
12509
12676
 
12510
12677
  // src/db/usage-db.ts
12511
12678
  init_paths();
@@ -12662,7 +12829,7 @@ function listDaily(filter = {}) {
12662
12829
 
12663
12830
  // src/dashboard/api-usage.ts
12664
12831
  function createUsageRouter() {
12665
- const router = Router10();
12832
+ const router = Router11();
12666
12833
  router.get("/", (req, res) => {
12667
12834
  try {
12668
12835
  initUsageDb();
@@ -12825,7 +12992,7 @@ init_parser();
12825
12992
  init_slug();
12826
12993
  init_timestamp();
12827
12994
  init_fs();
12828
- import { Router as Router11 } from "express";
12995
+ import { Router as Router12 } from "express";
12829
12996
  import { resolve as resolve23 } from "path";
12830
12997
  import { readFile as readFile17 } from "fs/promises";
12831
12998
  init_playbooks();
@@ -12842,7 +13009,7 @@ function statusForPlaybookError(code) {
12842
13009
  }
12843
13010
  }
12844
13011
  function createPlaybooksRouter(playbooksDir2) {
12845
- const router = Router11();
13012
+ const router = Router12();
12846
13013
  router.get("/", async (_req, res) => {
12847
13014
  try {
12848
13015
  const playbooks = await listPlaybooks(playbooksDir2);
@@ -13006,7 +13173,7 @@ init_fs_migration();
13006
13173
  init_parser2();
13007
13174
  init_fs();
13008
13175
  init_paths();
13009
- import { Router as Router12 } from "express";
13176
+ import { Router as Router13 } from "express";
13010
13177
  import { readdir as readdir10 } from "fs/promises";
13011
13178
  import { resolve as resolvePath, dirname as dirname5 } from "path";
13012
13179
  import { rename as rename5, mkdir as mkdir2 } from "fs/promises";
@@ -13361,7 +13528,7 @@ function touchItem3(item) {
13361
13528
  item.updatedAt = now;
13362
13529
  }
13363
13530
  function createTodosRouter(todosDir2, broadcast, projectsDir) {
13364
- const router = Router12();
13531
+ const router = Router13();
13365
13532
  installRecordsInvalidation(router);
13366
13533
  function broadcastUpdate() {
13367
13534
  broadcast({ type: "todos-updated", timestamp: (/* @__PURE__ */ new Date()).toISOString() });
@@ -14106,7 +14273,7 @@ init_parser2();
14106
14273
  init_fs();
14107
14274
  init_paths();
14108
14275
  init_slug();
14109
- import { Router as Router13 } from "express";
14276
+ import { Router as Router14 } from "express";
14110
14277
  import { mkdir as mkdir3, readFile as readFile18, rename as rename6 } from "fs/promises";
14111
14278
  import { resolve as resolve25, dirname as dirname6 } from "path";
14112
14279
  init_api();
@@ -14157,7 +14324,7 @@ function notFound(res, slug) {
14157
14324
  res.status(404).json({ error: `Project "${slug}" not found` });
14158
14325
  }
14159
14326
  function createProjectTodosRouter(projectsDir, broadcast, workspaceTodosDir) {
14160
- const router = Router13({ mergeParams: true });
14327
+ const router = Router14({ mergeParams: true });
14161
14328
  installRecordsInvalidation(router);
14162
14329
  function broadcastUpdate(projectSlug) {
14163
14330
  broadcast({ type: "todos-updated", projectSlug, timestamp: (/* @__PURE__ */ new Date()).toISOString() });
@@ -14983,7 +15150,7 @@ workspace: ${slug}
14983
15150
  }
14984
15151
 
14985
15152
  // src/dashboard/api-bundles.ts
14986
- import { Router as Router14 } from "express";
15153
+ import { Router as Router15 } from "express";
14987
15154
  import { readdir as readdir11 } from "fs/promises";
14988
15155
 
14989
15156
  // src/todos/bundle-parser.ts
@@ -15094,7 +15261,7 @@ function annotate(bundle, items) {
15094
15261
  }
15095
15262
  function createBundlesRouter(todosDir2, broadcast) {
15096
15263
  void broadcast;
15097
- const router = Router14();
15264
+ const router = Router15();
15098
15265
  function validateWorkspace(req, res, next) {
15099
15266
  const workspace = getWorkspaceParam2(req.params.workspace);
15100
15267
  if (workspace && !WORKSPACE_REGEX3.test(workspace)) {
@@ -15160,7 +15327,7 @@ function createBundlesRouter(todosDir2, broadcast) {
15160
15327
  init_fs();
15161
15328
  init_paths();
15162
15329
  init_slug();
15163
- import { Router as Router15 } from "express";
15330
+ import { Router as Router16 } from "express";
15164
15331
  import { resolve as resolve26 } from "path";
15165
15332
  init_parser2();
15166
15333
  function deriveStatus2(bundle, items) {
@@ -15190,7 +15357,7 @@ function notFound2(res, slug) {
15190
15357
  }
15191
15358
  function createProjectBundlesRouter(projectsDir, broadcast) {
15192
15359
  void broadcast;
15193
- const router = Router15({ mergeParams: true });
15360
+ const router = Router16({ mergeParams: true });
15194
15361
  function validateProjectId(req, res, next) {
15195
15362
  const slug = getProjectIdParam2(req.params.projectId);
15196
15363
  if (!slug || !isValidSlug(slug)) {
@@ -15224,7 +15391,7 @@ function createProjectBundlesRouter(projectsDir, broadcast) {
15224
15391
  init_config2();
15225
15392
  init_api();
15226
15393
  init_scanner();
15227
- import { Router as Router16 } from "express";
15394
+ import { Router as Router17 } from "express";
15228
15395
 
15229
15396
  // src/utils/github-backup.ts
15230
15397
  init_paths();
@@ -15547,7 +15714,7 @@ async function getBackupStatus() {
15547
15714
 
15548
15715
  // src/dashboard/api-backup.ts
15549
15716
  function createBackupRouter() {
15550
- const router = Router16();
15717
+ const router = Router17();
15551
15718
  router.get("/", async (_req, res) => {
15552
15719
  try {
15553
15720
  const status = await getBackupStatus();
@@ -15970,6 +16137,7 @@ function createDashboardServer(options) {
15970
16137
  }
15971
16138
  });
15972
16139
  app.use("/api/config/terminal", createTerminalConfigRouter());
16140
+ app.use("/api/config/workspace-visibility", createWorkspaceVisibilityConfigRouter());
15973
16141
  app.get("/api/config/hotkeys", async (_req, res) => {
15974
16142
  try {
15975
16143
  const config = await readConfig();