@openspecui/web 2.1.4 → 2.1.6

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 (66) hide show
  1. package/dist/assets/CanvasRenderer-DvQQ868U.js +1 -0
  2. package/dist/assets/WebGLRenderer-Btkopy84.js +1 -0
  3. package/dist/assets/WebGPURenderer-mbRLbuQ3.js +1 -0
  4. package/dist/assets/browserAll-BN5cmbzO.js +1 -0
  5. package/dist/assets/{dist-BTVRljcR.js → dist-BVuO0PNY.js} +1 -1
  6. package/dist/assets/{dist-DgX3giV5.js → dist-BcS7MN40.js} +1 -1
  7. package/dist/assets/{dist-CmBUS2pv.js → dist-Bqlcw5p5.js} +1 -1
  8. package/dist/assets/{dist-BrT5ZB4u.js → dist-CQFpUBQu.js} +1 -1
  9. package/dist/assets/dist-CWn3VEyl.js +1 -0
  10. package/dist/assets/{dist-D2RwSjME.js → dist-CxW4GGvi.js} +1 -1
  11. package/dist/assets/{dist-CzSFLuL_.js → dist-DH4wkw64.js} +1 -1
  12. package/dist/assets/{dist-2NaYosWh.js → dist-DHt45678.js} +1 -1
  13. package/dist/assets/{dist-C4xLUyJU.js → dist-DZNziC27.js} +1 -1
  14. package/dist/assets/dist-DgZXq45Q.js +1 -0
  15. package/dist/assets/{dist-CTInPrv9.js → dist-KeQ1cUcv.js} +1 -1
  16. package/dist/assets/dist-RktJObPI.js +1 -0
  17. package/dist/assets/{ghostty-web-D47FqPw6.js → ghostty-web-DhqZ931y.js} +1 -1
  18. package/dist/assets/index-XY2gI2Cr.js +1541 -0
  19. package/dist/assets/{init-2-IXz72e.js → init-CUcnIfzq.js} +1 -1
  20. package/dist/assets/trpc-Bc5K_hrC.js +1 -0
  21. package/dist/assets/webworkerAll-BeYSpTrq.js +1 -0
  22. package/dist/index.html +1 -1
  23. package/dist-ssg/client/.vite/ssr-manifest.json +18 -15
  24. package/dist-ssg/client/assets/CanvasRenderer-ywGP4ZX6.js +1 -0
  25. package/dist-ssg/client/assets/WebGLRenderer-BsdWGz4N.js +1 -0
  26. package/dist-ssg/client/assets/WebGPURenderer-BSYkgdvY.js +1 -0
  27. package/dist-ssg/client/assets/browserAll-DS5YyFWm.js +1 -0
  28. package/dist-ssg/client/assets/{dist-BQNvK_3l.js → dist--YumqERH.js} +1 -1
  29. package/dist-ssg/client/assets/{dist-Y4Qwa-SE.js → dist-87HDXNnV.js} +1 -1
  30. package/dist-ssg/client/assets/{dist-BEtm8eJw.js → dist-BE-gshiE.js} +1 -1
  31. package/dist-ssg/client/assets/{dist-BIEfJi38.js → dist-BH-T4fEM.js} +1 -1
  32. package/dist-ssg/client/assets/{dist-CvcfGJJo.js → dist-BNFBNMFf.js} +1 -1
  33. package/dist-ssg/client/assets/{dist-DsY2cCQF.js → dist-Ck3PZ8aD.js} +1 -1
  34. package/dist-ssg/client/assets/{dist-CLDI68tg.js → dist-CwbIrxYE.js} +1 -1
  35. package/dist-ssg/client/assets/dist-DYgVARNM.js +1 -0
  36. package/dist-ssg/client/assets/dist-Dn1x1A71.js +1 -0
  37. package/dist-ssg/client/assets/{dist-D19jF2Jl.js → dist-DnVDd8oU.js} +1 -1
  38. package/dist-ssg/client/assets/{dist-BJ3y0n4E.js → dist-_UrJdd33.js} +1 -1
  39. package/dist-ssg/client/assets/dist-qnR3ecSd.js +1 -0
  40. package/dist-ssg/client/assets/{ghostty-web-BgUruDpm.js → ghostty-web-BOpWV9Ks.js} +1 -1
  41. package/dist-ssg/client/assets/{index.ssg-B5w5GXyx.js → index.ssg-BbuG-6d1.js} +137 -137
  42. package/dist-ssg/client/assets/{init-ABBNgqUV.js → init-CVq3lseD.js} +1 -1
  43. package/dist-ssg/client/assets/trpc-DwwL__SQ.js +1 -0
  44. package/dist-ssg/client/assets/webworkerAll-B-z6-30P.js +1 -0
  45. package/dist-ssg/client/index.ssg.html +1 -1
  46. package/dist-ssg/server/entry-server.js +142 -60
  47. package/package.json +1 -1
  48. package/dist/assets/CanvasRenderer-KAAm7LZA.js +0 -1
  49. package/dist/assets/WebGLRenderer-B9M4OWqi.js +0 -1
  50. package/dist/assets/WebGPURenderer-DUl1R9TQ.js +0 -1
  51. package/dist/assets/browserAll-CPLObGbz.js +0 -1
  52. package/dist/assets/dist-BpNz0wXg.js +0 -1
  53. package/dist/assets/dist-BwEZ1BjI.js +0 -1
  54. package/dist/assets/dist-D_Mefl-e.js +0 -1
  55. package/dist/assets/index-DG_B7CJb.js +0 -1541
  56. package/dist/assets/trpc-Dmbg5-3U.js +0 -1
  57. package/dist/assets/webworkerAll-Cslz2r8a.js +0 -1
  58. package/dist-ssg/client/assets/CanvasRenderer-DbQke82i.js +0 -1
  59. package/dist-ssg/client/assets/WebGLRenderer-B_XIn5Vk.js +0 -1
  60. package/dist-ssg/client/assets/WebGPURenderer-DMiifBxH.js +0 -1
  61. package/dist-ssg/client/assets/browserAll-BOxleJX6.js +0 -1
  62. package/dist-ssg/client/assets/dist-DSG6al-A.js +0 -1
  63. package/dist-ssg/client/assets/dist-DauGZ96x.js +0 -1
  64. package/dist-ssg/client/assets/dist-Isiir4ba.js +0 -1
  65. package/dist-ssg/client/assets/trpc-D8iiQFhg.js +0 -1
  66. package/dist-ssg/client/assets/webworkerAll-DAj2DFII.js +0 -1
@@ -1 +1 @@
1
- import{it as e}from"./Geometry-CNDxiJq_.js";import{a as t,i as n}from"./index.ssg-B5w5GXyx.js";e.add(n),e.add(t);
1
+ import{it as e}from"./Geometry-CNDxiJq_.js";import{a as t,i as n}from"./index.ssg-BbuG-6d1.js";e.add(n),e.add(t);
@@ -0,0 +1 @@
1
+ import{F as e}from"./index.ssg-BbuG-6d1.js";export{e as trpcClient};
@@ -0,0 +1 @@
1
+ import"./Geometry-CNDxiJq_.js";import"./index.ssg-BbuG-6d1.js";import"./init-CVq3lseD.js";
@@ -35,7 +35,7 @@
35
35
  document.head.append(preconnectApi, preconnectStatic, stylesheet)
36
36
  })()
37
37
  </script>
38
- <script type="module" crossorigin src="/assets/index.ssg-B5w5GXyx.js"></script>
38
+ <script type="module" crossorigin src="/assets/index.ssg-BbuG-6d1.js"></script>
39
39
  <link rel="modulepreload" crossorigin href="/assets/chunk-DECur_0Z.js">
40
40
  <link rel="modulepreload" crossorigin href="/assets/dist-QUHuPJsA.js">
41
41
  <link rel="modulepreload" crossorigin href="/assets/dist-BGaHY1kO.js">
@@ -27703,6 +27703,46 @@ function getHostedScopedStorageKey(baseKey, locationLike) {
27703
27703
  return state.hosted && state.sessionId ? `hosted-session:${state.sessionId}:${baseKey}` : baseKey;
27704
27704
  }
27705
27705
  //#endregion
27706
+ //#region src/lib/api-config.ts
27707
+ function isBrowser$1() {
27708
+ return typeof window !== "undefined" && typeof window.location !== "undefined";
27709
+ }
27710
+ function getHostedApiState() {
27711
+ if (!isBrowser$1()) return {
27712
+ hosted: false,
27713
+ apiBaseUrl: null,
27714
+ sessionId: null
27715
+ };
27716
+ return getHostedApiBootstrapState(window.location);
27717
+ }
27718
+ function getApiBaseUrl() {
27719
+ if (!isBrowser$1()) return "";
27720
+ return getHostedApiState().apiBaseUrl ?? "";
27721
+ }
27722
+ function buildWebSocketUrl(pathname) {
27723
+ if (!isBrowser$1()) return "";
27724
+ const baseUrl = getApiBaseUrl();
27725
+ if (baseUrl) {
27726
+ const url = new URL(baseUrl);
27727
+ return `${url.protocol === "https:" ? "wss:" : "ws:"}//${url.host}${pathname}`;
27728
+ }
27729
+ return `${window.location.protocol === "https:" ? "wss:" : "ws:"}//${window.location.host}${pathname}`;
27730
+ }
27731
+ function getWsUrl() {
27732
+ return buildWebSocketUrl("/trpc");
27733
+ }
27734
+ function getPtyWsUrl() {
27735
+ return buildWebSocketUrl("/ws/pty");
27736
+ }
27737
+ function getTrpcUrl() {
27738
+ const baseUrl = getApiBaseUrl();
27739
+ return baseUrl ? `${baseUrl}/trpc` : "/trpc";
27740
+ }
27741
+ function getHealthUrl() {
27742
+ const baseUrl = getApiBaseUrl();
27743
+ return baseUrl ? `${baseUrl}/api/health` : "/api/health";
27744
+ }
27745
+ //#endregion
27706
27746
  //#region src/lib/static-mode.ts
27707
27747
  var staticModeDetected = null;
27708
27748
  if (typeof window !== "undefined" && window.__OPENSPEC_STATIC_MODE__ === true && true) {
@@ -27770,12 +27810,12 @@ var POP_ROUTES = [
27770
27810
  "/opsx-verify",
27771
27811
  "/opsx-compose"
27772
27812
  ];
27773
- function getRemoteStorageKey() {
27774
- return getHostedScopedStorageKey("nav-layout", window.location);
27775
- }
27776
27813
  function getLocalStorageKey() {
27777
27814
  return getHostedScopedStorageKey("nav-layout", window.location);
27778
27815
  }
27816
+ function buildProjectScopedStorageKey(projectDir) {
27817
+ return getHostedScopedStorageKey(`nav-layout:${encodeURIComponent(projectDir)}`, window.location);
27818
+ }
27779
27819
  var PERSIST_DEBOUNCE = 300;
27780
27820
  function isTabId(value) {
27781
27821
  return ALL_TABS.includes(value);
@@ -27979,11 +28019,27 @@ function readLocalStorage() {
27979
28019
  return null;
27980
28020
  }
27981
28021
  }
27982
- function writeLocalStorage(layout) {
28022
+ function readLocalStorageByKey(key) {
28023
+ try {
28024
+ const raw = localStorage.getItem(key);
28025
+ if (!raw) return null;
28026
+ return parsePersistedLayout(JSON.parse(raw));
28027
+ } catch {
28028
+ return null;
28029
+ }
28030
+ }
28031
+ function writeLocalStorage(layout, key = getLocalStorageKey()) {
27983
28032
  try {
27984
- localStorage.setItem(getLocalStorageKey(), JSON.stringify(layout));
28033
+ localStorage.setItem(key, JSON.stringify(layout));
27985
28034
  } catch {}
27986
28035
  }
28036
+ function collapseProjectDetailLocation(location) {
28037
+ const tabId = pathToTabId(location.pathname);
28038
+ if (!tabId) return location;
28039
+ if (location.pathname === tabId) return location;
28040
+ if (tabId === "/changes" || tabId === "/specs" || tabId === "/archive") return parseHref(tabId, location.state);
28041
+ return location;
28042
+ }
27987
28043
  var carryActiveOnMovePlugin = ({ prevState, nextState, event }) => {
27988
28044
  if (event.type !== "MOVE_TAB") return nextState;
27989
28045
  const sourceArea = prevState.bottomTabs.includes(event.tabId) ? "bottom" : "main";
@@ -28303,6 +28359,7 @@ var NavController = class {
28303
28359
  persistTimer = null;
28304
28360
  kvUnsubscribe = null;
28305
28361
  initialized = false;
28362
+ storageKey = typeof window === "undefined" ? "nav-layout" : getHostedScopedStorageKey("nav-layout", window.location);
28306
28363
  constructor() {
28307
28364
  if (typeof window === "undefined") return;
28308
28365
  const local = isStaticMode() ? null : readLocalStorage();
@@ -28434,15 +28491,20 @@ var NavController = class {
28434
28491
  if (this.initialized || isStaticMode()) return;
28435
28492
  this.initialized = true;
28436
28493
  try {
28494
+ const scopedStorageKey = await this.resolveProjectScopedStorageKey();
28495
+ if (scopedStorageKey && scopedStorageKey !== this.storageKey) {
28496
+ this.storageKey = scopedStorageKey;
28497
+ this.rebindProjectScopedLayout(scopedStorageKey);
28498
+ }
28437
28499
  const { trpcClient } = await import("./assets/trpc-DtKUcEo0.js");
28438
- const remote = parsePersistedLayout(await trpcClient.kv.get.query({ key: getRemoteStorageKey() }));
28500
+ const remote = parsePersistedLayout(await trpcClient.kv.get.query({ key: this.storageKey }));
28439
28501
  if (remote) {
28440
28502
  if (remote.updatedAt > this.state.updatedAt) this.dispatch({
28441
28503
  type: "APPLY_LAYOUT",
28442
28504
  layout: remote
28443
28505
  });
28444
28506
  else if (this.state.updatedAt > remote.updatedAt) trpcClient.kv.set.mutate({
28445
- key: getRemoteStorageKey(),
28507
+ key: this.storageKey,
28446
28508
  value: {
28447
28509
  mainTabs: this.state.mainTabs,
28448
28510
  bottomTabs: this.state.bottomTabs,
@@ -28450,14 +28512,14 @@ var NavController = class {
28450
28512
  }
28451
28513
  }).catch(() => {});
28452
28514
  } else if (this.state.updatedAt > 0) trpcClient.kv.set.mutate({
28453
- key: getRemoteStorageKey(),
28515
+ key: this.storageKey,
28454
28516
  value: {
28455
28517
  mainTabs: this.state.mainTabs,
28456
28518
  bottomTabs: this.state.bottomTabs,
28457
28519
  updatedAt: this.state.updatedAt
28458
28520
  }
28459
28521
  }).catch(() => {});
28460
- const subscription = trpcClient.kv.subscribe.subscribe({ key: getRemoteStorageKey() }, { onData: (data) => {
28522
+ const subscription = trpcClient.kv.subscribe.subscribe({ key: this.storageKey }, { onData: (data) => {
28461
28523
  const incoming = parsePersistedLayout(data);
28462
28524
  if (!incoming) return;
28463
28525
  this.dispatch({
@@ -28521,7 +28583,7 @@ var NavController = class {
28521
28583
  mainTabs: this.state.mainTabs,
28522
28584
  bottomTabs: this.state.bottomTabs,
28523
28585
  updatedAt: this.state.updatedAt
28524
- });
28586
+ }, this.storageKey);
28525
28587
  }
28526
28588
  const effectiveUrlAction = transition.urlAction ?? (locationHrefChanged(prevState, this.state, "main") || locationHrefChanged(prevState, this.state, "bottom") || locationHrefChanged(prevState, this.state, "pop") ? "REPLACE" : void 0);
28527
28589
  if (effectiveUrlAction) this.syncToUrl(effectiveUrlAction);
@@ -28573,12 +28635,12 @@ var NavController = class {
28573
28635
  mainTabs: this.state.mainTabs,
28574
28636
  bottomTabs: this.state.bottomTabs,
28575
28637
  updatedAt: now
28576
- });
28638
+ }, this.storageKey);
28577
28639
  this.cancelPersistTimer();
28578
28640
  this.persistTimer = setTimeout(() => {
28579
28641
  this.persistTimer = null;
28580
28642
  import("./assets/trpc-DtKUcEo0.js").then(({ trpcClient }) => trpcClient.kv.set.mutate({
28581
- key: getRemoteStorageKey(),
28643
+ key: this.storageKey,
28582
28644
  value: {
28583
28645
  mainTabs: this.state.mainTabs,
28584
28646
  bottomTabs: this.state.bottomTabs,
@@ -28587,6 +28649,39 @@ var NavController = class {
28587
28649
  })).catch(() => {});
28588
28650
  }, PERSIST_DEBOUNCE);
28589
28651
  }
28652
+ async resolveProjectScopedStorageKey() {
28653
+ try {
28654
+ const response = await fetch(getHealthUrl());
28655
+ if (!response.ok) return null;
28656
+ const payload = await response.json();
28657
+ if (typeof payload.projectDir !== "string" || payload.projectDir.length === 0) return null;
28658
+ return buildProjectScopedStorageKey(payload.projectDir);
28659
+ } catch {
28660
+ return null;
28661
+ }
28662
+ }
28663
+ rebindProjectScopedLayout(storageKey) {
28664
+ const scopedLocal = readLocalStorageByKey(storageKey);
28665
+ if (scopedLocal) {
28666
+ const merged = mergeLayout(scopedLocal);
28667
+ this.state = normalizeState({
28668
+ ...this.state,
28669
+ mainTabs: merged.mainTabs,
28670
+ bottomTabs: merged.bottomTabs,
28671
+ updatedAt: scopedLocal.updatedAt
28672
+ });
28673
+ this.normalizeUrl();
28674
+ return;
28675
+ }
28676
+ this.state = normalizeState({
28677
+ ...this.state,
28678
+ mainLocation: collapseProjectDetailLocation(this.state.mainLocation),
28679
+ bottomLocation: collapseProjectDetailLocation(this.state.bottomLocation),
28680
+ updatedAt: 0
28681
+ });
28682
+ this.normalizeUrl();
28683
+ this.notifyListeners();
28684
+ }
28590
28685
  };
28591
28686
  var navController = new NavController();
28592
28687
  if (typeof window !== "undefined" && !isStaticMode()) navController.init();
@@ -32209,42 +32304,6 @@ function createTRPCOptionsProxy(opts) {
32209
32304
  });
32210
32305
  }
32211
32306
  //#endregion
32212
- //#region src/lib/api-config.ts
32213
- function isBrowser$1() {
32214
- return typeof window !== "undefined" && typeof window.location !== "undefined";
32215
- }
32216
- function getHostedApiState() {
32217
- if (!isBrowser$1()) return {
32218
- hosted: false,
32219
- apiBaseUrl: null,
32220
- sessionId: null
32221
- };
32222
- return getHostedApiBootstrapState(window.location);
32223
- }
32224
- function getApiBaseUrl() {
32225
- if (!isBrowser$1()) return "";
32226
- return getHostedApiState().apiBaseUrl ?? "";
32227
- }
32228
- function buildWebSocketUrl(pathname) {
32229
- if (!isBrowser$1()) return "";
32230
- const baseUrl = getApiBaseUrl();
32231
- if (baseUrl) {
32232
- const url = new URL(baseUrl);
32233
- return `${url.protocol === "https:" ? "wss:" : "ws:"}//${url.host}${pathname}`;
32234
- }
32235
- return `${window.location.protocol === "https:" ? "wss:" : "ws:"}//${window.location.host}${pathname}`;
32236
- }
32237
- function getWsUrl() {
32238
- return buildWebSocketUrl("/trpc");
32239
- }
32240
- function getPtyWsUrl() {
32241
- return buildWebSocketUrl("/ws/pty");
32242
- }
32243
- function getTrpcUrl() {
32244
- const baseUrl = getApiBaseUrl();
32245
- return baseUrl ? `${baseUrl}/trpc` : "/trpc";
32246
- }
32247
- //#endregion
32248
32307
  //#region src/lib/trpc.ts
32249
32308
  var isBrowser = typeof window !== "undefined";
32250
32309
  var queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 60 * 1e3 } } });
@@ -32472,6 +32531,15 @@ function PathMarquee({ children: path, maxWidth = 300, duration = 10, gap = 20,
32472
32531
  })]
32473
32532
  });
32474
32533
  }
32534
+ function compareDashboardItemsByUpdatedAt(left, right) {
32535
+ return right.updatedAt - left.updatedAt || left.id.localeCompare(right.id);
32536
+ }
32537
+ function sortDashboardItemsByUpdatedAt(items) {
32538
+ return [...items].sort(compareDashboardItemsByUpdatedAt);
32539
+ }
32540
+ function selectRecentDashboardItems(items, limit = 10) {
32541
+ return sortDashboardItemsByUpdatedAt(items).slice(0, Math.max(0, Math.trunc(limit)));
32542
+ }
32475
32543
  //#endregion
32476
32544
  //#region ../core/src/opsx-display-path.ts
32477
32545
  var VIRTUAL_PROJECT_DIRNAME = "project";
@@ -39590,33 +39658,35 @@ async function getDashboardOverview() {
39590
39658
  }
39591
39659
  const trendPointLimit = Math.max(20, Math.min(500, Math.trunc(snapshot.config?.dashboard?.trendPointLimit ?? DASHBOARD_TREND_POINT_LIMIT)));
39592
39660
  const rightEdgeTs = snapshot.git?.latestCommitTs ?? null;
39593
- const specifications = snapshot.specs.map((spec) => ({
39661
+ const allSpecifications = snapshot.specs.map((spec) => ({
39594
39662
  id: spec.id,
39595
39663
  name: spec.name,
39596
39664
  requirements: spec.requirements.length,
39597
39665
  updatedAt: spec.updatedAt
39598
- })).sort((a, b) => b.requirements - a.requirements || b.updatedAt - a.updatedAt);
39599
- const activeChanges = snapshot.changes.map((change) => ({
39666
+ }));
39667
+ const specifications = selectRecentDashboardItems(allSpecifications);
39668
+ const allActiveChanges = snapshot.changes.map((change) => ({
39600
39669
  id: change.id,
39601
39670
  name: change.name,
39602
39671
  progress: change.progress,
39603
39672
  updatedAt: change.updatedAt
39604
- })).sort((a, b) => b.updatedAt - a.updatedAt);
39605
- const requirements = specifications.reduce((sum, spec) => sum + spec.requirements, 0);
39606
- const tasksTotal = activeChanges.reduce((sum, change) => sum + change.progress.total, 0);
39607
- const tasksCompleted = activeChanges.reduce((sum, change) => sum + change.progress.completed, 0);
39673
+ }));
39674
+ const activeChanges = selectRecentDashboardItems(allActiveChanges);
39675
+ const requirements = allSpecifications.reduce((sum, spec) => sum + spec.requirements, 0);
39676
+ const tasksTotal = allActiveChanges.reduce((sum, change) => sum + change.progress.total, 0);
39677
+ const tasksCompleted = allActiveChanges.reduce((sum, change) => sum + change.progress.completed, 0);
39608
39678
  const archivedTasksCompleted = snapshot.archives.reduce((sum, archive) => sum + archive.parsedTasks.length, 0);
39609
39679
  const taskCompletionPercent = tasksTotal > 0 ? Math.round(tasksCompleted / tasksTotal * 100) : null;
39610
- const inProgressChanges = activeChanges.filter((change) => change.progress.total > 0 && change.progress.completed < change.progress.total).length;
39680
+ const inProgressChanges = allActiveChanges.filter((change) => change.progress.total > 0 && change.progress.completed < change.progress.total).length;
39611
39681
  const trends = buildStaticObjectiveTrends(snapshot, trendPointLimit, rightEdgeTs);
39612
- const hasObjectiveSpecificationTrend = trends.specifications.length > 0 || specifications.length === 0;
39682
+ const hasObjectiveSpecificationTrend = trends.specifications.length > 0 || allSpecifications.length === 0;
39613
39683
  const hasObjectiveRequirementTrend = trends.requirements.length > 0 || requirements === 0;
39614
39684
  const hasObjectiveCompletedTrend = trends.completedChanges.length > 0 || snapshot.archives.length === 0;
39615
39685
  return {
39616
39686
  summary: {
39617
- specifications: specifications.length,
39687
+ specifications: allSpecifications.length,
39618
39688
  requirements,
39619
- activeChanges: activeChanges.length,
39689
+ activeChanges: allActiveChanges.length,
39620
39690
  inProgressChanges,
39621
39691
  completedChanges: snapshot.archives.length,
39622
39692
  archivedTasksCompleted,
@@ -91277,10 +91347,22 @@ function ChangeView() {
91277
91347
  });
91278
91348
  const doneCount = status?.artifacts.filter((a) => a.status === "done").length ?? 0;
91279
91349
  const totalCount = status?.artifacts.length ?? 0;
91350
+ const isMissingChangeError = error?.message.includes(`Change '${changeId}' not found`) || error?.message.includes(`Change "${changeId}" not found`);
91280
91351
  if (isLoading && !status) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
91281
91352
  className: "route-loading animate-pulse",
91282
91353
  children: "Loading change status..."
91283
91354
  });
91355
+ if (isMissingChangeError && !status) return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
91356
+ className: "flex flex-col gap-3 p-4",
91357
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
91358
+ className: "text-muted-foreground flex items-center gap-2 text-sm",
91359
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleAlert, { className: "h-4 w-4" }), "Change not found in the current project."]
91360
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
91361
+ to: "/changes",
91362
+ className: "text-primary hover:underline",
91363
+ children: "Back to Changes"
91364
+ }) })]
91365
+ });
91284
91366
  if (error && !status) return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
91285
91367
  className: "text-destructive flex items-center gap-2",
91286
91368
  children: [
@@ -136504,7 +136586,7 @@ function Dashboard() {
136504
136586
  renderExecutionSnapshot(),
136505
136587
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
136506
136588
  className: "grid gap-3 xl:grid-cols-2",
136507
- children: [renderSpecificationsSection(), renderActiveChangesSection()]
136589
+ children: [renderActiveChangesSection(), renderSpecificationsSection()]
136508
136590
  })
136509
136591
  ]
136510
136592
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openspecui/web",
3
- "version": "2.1.4",
3
+ "version": "2.1.6",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "openspecui-ssg": "./dist-ssg/ssg-cli.mjs"
@@ -1 +0,0 @@
1
- import"./Geometry-CNDxiJq_.js";import{r as e}from"./index-DG_B7CJb.js";export{e as CanvasRenderer};
@@ -1 +0,0 @@
1
- import"./Geometry-CNDxiJq_.js";import{n as e}from"./index-DG_B7CJb.js";export{e as WebGLRenderer};
@@ -1 +0,0 @@
1
- import"./Geometry-CNDxiJq_.js";import{t as e}from"./index-DG_B7CJb.js";export{e as WebGPURenderer};
@@ -1 +0,0 @@
1
- import{it as e,x as t}from"./Geometry-CNDxiJq_.js";import{c as n,l as r,o as i,s as a}from"./index-DG_B7CJb.js";import"./init-2-IXz72e.js";e.add(r),e.mixin(t,n),e.add(a),e.mixin(t,i);
@@ -1 +0,0 @@
1
- import"./dist-QUHuPJsA.js";import{T as e}from"./index-DG_B7CJb.js";export{e as css};
@@ -1 +0,0 @@
1
- import"./dist-QUHuPJsA.js";import{k as e}from"./index-DG_B7CJb.js";export{e as json};
@@ -1 +0,0 @@
1
- import"./dist-QUHuPJsA.js";import{u as e}from"./index-DG_B7CJb.js";export{e as yaml};