@openspecui/web 1.1.2 → 1.2.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 (57) hide show
  1. package/dist/assets/{BufferResource-ruI1lJIJ.js → BufferResource-DdnZHNU-.js} +1 -1
  2. package/dist/assets/{CanvasRenderer-CN4Y26ZH.js → CanvasRenderer-W0-8maEY.js} +1 -1
  3. package/{dist-ssg/client/assets/Filter-BTjr3eok.js → dist/assets/Filter-BCHzFO9X.js} +1 -1
  4. package/{dist-ssg/client/assets/RenderTargetSystem-CZa2ln2y.js → dist/assets/RenderTargetSystem-QYja7U1C.js} +1 -1
  5. package/dist/assets/{WebGLRenderer-BJQTLaSb.js → WebGLRenderer-CN6ngwpu.js} +1 -1
  6. package/{dist-ssg/client/assets/WebGPURenderer-BcNgCRe5.js → dist/assets/WebGPURenderer-CSfhxPBR.js} +1 -1
  7. package/{dist-ssg/client/assets/browserAll-ChJbTPze.js → dist/assets/browserAll-CChvoSPa.js} +1 -1
  8. package/dist/assets/{index-BX2oqbsU.js → index-8kjDfgtP.js} +1 -1
  9. package/dist/assets/index-BBa-UOW9.css +1 -0
  10. package/{dist-ssg/client/assets/index-7wPrcnqL.js → dist/assets/index-BPuO-i8p.js} +1 -1
  11. package/dist/assets/{index-ikUsdiVm.js → index-BTVg5Nau.js} +1 -1
  12. package/dist/assets/{index--L_QdP-6.js → index-BcA9ozYL.js} +184 -184
  13. package/{dist-ssg/client/assets/index-DVpS5GHp.js → dist/assets/index-CWB6CIXv.js} +1 -1
  14. package/dist/assets/{index-Y62s8n_r.js → index-Ca41ecb5.js} +1 -1
  15. package/dist/assets/{index-BbhkBFut.js → index-CoF0ewHZ.js} +1 -1
  16. package/{dist-ssg/client/assets/index-ySiN9oO6.js → dist/assets/index-D2pLblyv.js} +1 -1
  17. package/{dist-ssg/client/assets/index-Cenc0P-m.js → dist/assets/index-DS0kz2NM.js} +1 -1
  18. package/dist/assets/{index-CwjzVtxK.js → index-DSkiV8t7.js} +1 -1
  19. package/{dist-ssg/client/assets/index-Dw9lVmn9.js → dist/assets/index-DWh8uDpX.js} +1 -1
  20. package/dist/assets/{index-w-3qupYf.js → index-DXb6uuwe.js} +1 -1
  21. package/dist/assets/{index-CNeO03Fc.js → index-Do3bWt1y.js} +1 -1
  22. package/{dist-ssg/client/assets/index-C7mTgvb9.js → dist/assets/index-a4zt_8am.js} +1 -1
  23. package/dist/assets/{index-DrCDnKl4.js → index-fWg8Cn9O.js} +1 -1
  24. package/dist/assets/{index-DwoTlpGw.js → index-hysFimNk.js} +1 -1
  25. package/dist/assets/{webworkerAll-Bd8axVrm.js → webworkerAll-T10QBdIL.js} +1 -1
  26. package/dist/index.html +2 -2
  27. package/dist-ssg/client/.vite/ssr-manifest.json +197 -191
  28. package/dist-ssg/client/assets/{BufferResource-ruI1lJIJ.js → BufferResource-DdnZHNU-.js} +1 -1
  29. package/dist-ssg/client/assets/{CanvasRenderer-CN4Y26ZH.js → CanvasRenderer-W0-8maEY.js} +1 -1
  30. package/{dist/assets/Filter-BTjr3eok.js → dist-ssg/client/assets/Filter-BCHzFO9X.js} +1 -1
  31. package/{dist/assets/RenderTargetSystem-CZa2ln2y.js → dist-ssg/client/assets/RenderTargetSystem-QYja7U1C.js} +1 -1
  32. package/dist-ssg/client/assets/{WebGLRenderer-BJQTLaSb.js → WebGLRenderer-CN6ngwpu.js} +1 -1
  33. package/{dist/assets/WebGPURenderer-BcNgCRe5.js → dist-ssg/client/assets/WebGPURenderer-CSfhxPBR.js} +1 -1
  34. package/{dist/assets/browserAll-ChJbTPze.js → dist-ssg/client/assets/browserAll-CChvoSPa.js} +1 -1
  35. package/dist-ssg/client/assets/{index-BX2oqbsU.js → index-8kjDfgtP.js} +1 -1
  36. package/dist-ssg/client/assets/index-BBa-UOW9.css +1 -0
  37. package/{dist/assets/index-7wPrcnqL.js → dist-ssg/client/assets/index-BPuO-i8p.js} +1 -1
  38. package/dist-ssg/client/assets/{index-ikUsdiVm.js → index-BTVg5Nau.js} +1 -1
  39. package/dist-ssg/client/assets/{index--L_QdP-6.js → index-BcA9ozYL.js} +184 -184
  40. package/{dist/assets/index-DVpS5GHp.js → dist-ssg/client/assets/index-CWB6CIXv.js} +1 -1
  41. package/dist-ssg/client/assets/{index-Y62s8n_r.js → index-Ca41ecb5.js} +1 -1
  42. package/dist-ssg/client/assets/{index-BbhkBFut.js → index-CoF0ewHZ.js} +1 -1
  43. package/{dist/assets/index-ySiN9oO6.js → dist-ssg/client/assets/index-D2pLblyv.js} +1 -1
  44. package/{dist/assets/index-Cenc0P-m.js → dist-ssg/client/assets/index-DS0kz2NM.js} +1 -1
  45. package/dist-ssg/client/assets/{index-CwjzVtxK.js → index-DSkiV8t7.js} +1 -1
  46. package/{dist/assets/index-Dw9lVmn9.js → dist-ssg/client/assets/index-DWh8uDpX.js} +1 -1
  47. package/dist-ssg/client/assets/{index-w-3qupYf.js → index-DXb6uuwe.js} +1 -1
  48. package/dist-ssg/client/assets/{index-CNeO03Fc.js → index-Do3bWt1y.js} +1 -1
  49. package/{dist/assets/index-C7mTgvb9.js → dist-ssg/client/assets/index-a4zt_8am.js} +1 -1
  50. package/dist-ssg/client/assets/{index-DrCDnKl4.js → index-fWg8Cn9O.js} +1 -1
  51. package/dist-ssg/client/assets/{index-DwoTlpGw.js → index-hysFimNk.js} +1 -1
  52. package/dist-ssg/client/assets/{webworkerAll-Bd8axVrm.js → webworkerAll-T10QBdIL.js} +1 -1
  53. package/dist-ssg/client/index.html +2 -2
  54. package/dist-ssg/server/entry-server.js +176 -33
  55. package/package.json +4 -4
  56. package/dist/assets/index-BfjQi4qu.css +0 -1
  57. package/dist-ssg/client/assets/index-BfjQi4qu.css +0 -1
@@ -36129,7 +36129,7 @@ const DEFAULT_MAIN_TABS = [
36129
36129
  "/settings"
36130
36130
  ];
36131
36131
  const DEFAULT_BOTTOM_TABS = isStaticMode() ? [] : ["/terminal"];
36132
- const POP_ROUTES = ["/search"];
36132
+ const POP_ROUTES = ["/search", "/opsx-new"];
36133
36133
  const KV_KEY$1 = "nav-layout";
36134
36134
  const LS_KEY = "nav-layout";
36135
36135
  const PERSIST_DEBOUNCE = 300;
@@ -106798,9 +106798,19 @@ function ChangeList() {
106798
106798
  );
106799
106799
  }),
106800
106800
  statuses?.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-muted-foreground p-4 text-center", children: [
106801
- "No active changes. Use ",
106802
- /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "/opsx:new" }),
106803
- " to create one."
106801
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "No active changes." }),
106802
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
106803
+ "button",
106804
+ {
106805
+ type: "button",
106806
+ onClick: () => navController.activatePop("/opsx-new"),
106807
+ className: "text-primary mt-2 inline-flex items-center gap-1 hover:underline",
106808
+ children: [
106809
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Sparkles, { className: "h-3.5 w-3.5" }),
106810
+ "/opsx:new"
106811
+ ]
106812
+ }
106813
+ )
106804
106814
  ] })
106805
106815
  ] })
106806
106816
  ] });
@@ -106817,7 +106827,7 @@ function ArtifactHeader({ artifact }) {
106817
106827
  const status = statusConfig[artifact.status];
106818
106828
  const StatusIcon = status.icon;
106819
106829
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
106820
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-border flex flex-wrap items-center justify-between gap-3 rounded-md border bg-card px-4 py-3", children: [
106830
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-border bg-card flex flex-wrap items-center justify-between gap-3 rounded-md border px-4 py-3", children: [
106821
106831
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
106822
106832
  /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "text-muted-foreground h-4 w-4" }),
106823
106833
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium", children: artifact.id }),
@@ -106838,7 +106848,10 @@ function ArtifactHeader({ artifact }) {
106838
106848
  ] });
106839
106849
  }
106840
106850
  function SingleFileContent({ changeId, artifact }) {
106841
- const { data: content2, isLoading } = useOpsxArtifactOutputSubscription(changeId, artifact.outputPath);
106851
+ const { data: content2, isLoading } = useOpsxArtifactOutputSubscription(
106852
+ changeId,
106853
+ artifact.outputPath
106854
+ );
106842
106855
  if (isLoading) {
106843
106856
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground flex h-full items-center justify-center text-sm", children: "Loading output..." });
106844
106857
  }
@@ -106847,19 +106860,22 @@ function SingleFileContent({ changeId, artifact }) {
106847
106860
  }
106848
106861
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-muted-foreground flex h-full items-center justify-center rounded-md border border-dashed p-6 text-sm", children: [
106849
106862
  "Not yet generated. Use ",
106850
- /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "Continue" }),
106863
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { className: "mx-2", children: "Continue" }),
106851
106864
  " to generate this artifact."
106852
106865
  ] });
106853
106866
  }
106854
106867
  function GlobContent({ changeId, artifact }) {
106855
- const { data: files, isLoading } = useOpsxGlobArtifactFilesSubscription(changeId, artifact.outputPath);
106868
+ const { data: files, isLoading } = useOpsxGlobArtifactFilesSubscription(
106869
+ changeId,
106870
+ artifact.outputPath
106871
+ );
106856
106872
  if (isLoading) {
106857
106873
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-[400px] items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "text-muted-foreground h-6 w-6 animate-spin" }) });
106858
106874
  }
106859
106875
  if (!files?.length) {
106860
106876
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-muted-foreground flex h-full items-center justify-center rounded-md border border-dashed p-6 text-sm", children: [
106861
106877
  "Not yet generated. Use ",
106862
- /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "Continue" }),
106878
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { className: "mx-2", children: "Continue" }),
106863
106879
  " to generate this artifact."
106864
106880
  ] });
106865
106881
  }
@@ -109891,6 +109907,59 @@ ZodTuple.create = (schemas, params) => {
109891
109907
  ...processCreateParams(params)
109892
109908
  });
109893
109909
  };
109910
+ class ZodRecord extends ZodType {
109911
+ get keySchema() {
109912
+ return this._def.keyType;
109913
+ }
109914
+ get valueSchema() {
109915
+ return this._def.valueType;
109916
+ }
109917
+ _parse(input) {
109918
+ const { status, ctx } = this._processInputParams(input);
109919
+ if (ctx.parsedType !== ZodParsedType.object) {
109920
+ addIssueToContext(ctx, {
109921
+ code: ZodIssueCode.invalid_type,
109922
+ expected: ZodParsedType.object,
109923
+ received: ctx.parsedType
109924
+ });
109925
+ return INVALID;
109926
+ }
109927
+ const pairs2 = [];
109928
+ const keyType = this._def.keyType;
109929
+ const valueType = this._def.valueType;
109930
+ for (const key2 in ctx.data) {
109931
+ pairs2.push({
109932
+ key: keyType._parse(new ParseInputLazyPath(ctx, key2, ctx.path, key2)),
109933
+ value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key2], ctx.path, key2)),
109934
+ alwaysSet: key2 in ctx.data
109935
+ });
109936
+ }
109937
+ if (ctx.common.async) {
109938
+ return ParseStatus.mergeObjectAsync(status, pairs2);
109939
+ } else {
109940
+ return ParseStatus.mergeObjectSync(status, pairs2);
109941
+ }
109942
+ }
109943
+ get element() {
109944
+ return this._def.valueType;
109945
+ }
109946
+ static create(first, second, third) {
109947
+ if (second instanceof ZodType) {
109948
+ return new ZodRecord({
109949
+ keyType: first,
109950
+ valueType: second,
109951
+ typeName: ZodFirstPartyTypeKind.ZodRecord,
109952
+ ...processCreateParams(third)
109953
+ });
109954
+ }
109955
+ return new ZodRecord({
109956
+ keyType: ZodString.create(),
109957
+ valueType: first,
109958
+ typeName: ZodFirstPartyTypeKind.ZodRecord,
109959
+ ...processCreateParams(second)
109960
+ });
109961
+ }
109962
+ }
109894
109963
  class ZodMap extends ZodType {
109895
109964
  get keySchema() {
109896
109965
  return this._def.keyType;
@@ -110635,10 +110704,11 @@ const booleanType = ZodBoolean.create;
110635
110704
  ZodNever.create;
110636
110705
  const arrayType = ZodArray.create;
110637
110706
  const objectType = ZodObject.create;
110638
- ZodUnion.create;
110707
+ const unionType = ZodUnion.create;
110639
110708
  const discriminatedUnionType = ZodDiscriminatedUnion.create;
110640
110709
  ZodIntersection.create;
110641
110710
  ZodTuple.create;
110711
+ const recordType = ZodRecord.create;
110642
110712
  const literalType = ZodLiteral.create;
110643
110713
  const enumType = ZodEnum.create;
110644
110714
  ZodPromise.create;
@@ -110646,6 +110716,7 @@ ZodOptional.create;
110646
110716
  ZodNullable.create;
110647
110717
  const PositiveInt = numberType().int().positive();
110648
110718
  const PtyPlatformSchema = enumType(["windows", "macos", "common"]);
110719
+ const CloseCallbackUrlSchema = unionType([stringType(), recordType(stringType())]);
110649
110720
  const PtySessionInfoSchema = objectType({
110650
110721
  id: stringType().min(1),
110651
110722
  title: stringType(),
@@ -110653,7 +110724,9 @@ const PtySessionInfoSchema = objectType({
110653
110724
  args: arrayType(stringType()),
110654
110725
  platform: PtyPlatformSchema,
110655
110726
  isExited: booleanType(),
110656
- exitCode: numberType().int().nullable()
110727
+ exitCode: numberType().int().nullable(),
110728
+ closeTip: stringType().optional(),
110729
+ closeCallbackUrl: CloseCallbackUrlSchema.optional()
110657
110730
  });
110658
110731
  const PtyCreateMessageSchema = objectType({
110659
110732
  type: literalType("create"),
@@ -110661,7 +110734,9 @@ const PtyCreateMessageSchema = objectType({
110661
110734
  cols: PositiveInt.optional(),
110662
110735
  rows: PositiveInt.optional(),
110663
110736
  command: stringType().min(1).optional(),
110664
- args: arrayType(stringType()).optional()
110737
+ args: arrayType(stringType()).optional(),
110738
+ closeTip: stringType().optional(),
110739
+ closeCallbackUrl: CloseCallbackUrlSchema.optional()
110665
110740
  });
110666
110741
  const PtyInputMessageSchema = objectType({
110667
110742
  type: literalType("input"),
@@ -148138,6 +148213,8 @@ class TerminalController {
148138
148213
  command: opts?.command,
148139
148214
  args: opts?.args,
148140
148215
  isDedicated: opts?.isDedicated ?? false,
148216
+ closeTip: opts?.closeTip,
148217
+ closeCallbackUrl: opts?.closeCallbackUrl,
148141
148218
  restored: false,
148142
148219
  serverSessionId: null,
148143
148220
  platform: DEFAULT_PTY_PLATFORM
@@ -148160,13 +148237,17 @@ class TerminalController {
148160
148237
  cols: instance.terminal.cols || 80,
148161
148238
  rows: instance.terminal.rows || 24,
148162
148239
  command: opts?.command,
148163
- args: opts?.args
148240
+ args: opts?.args,
148241
+ closeTip: opts?.closeTip,
148242
+ closeCallbackUrl: opts?.closeCallbackUrl
148164
148243
  });
148165
148244
  } else {
148166
148245
  this.pendingCreates.push({
148167
148246
  requestId: id2,
148168
148247
  command: opts?.command,
148169
148248
  args: opts?.args,
148249
+ closeTip: opts?.closeTip,
148250
+ closeCallbackUrl: opts?.closeCallbackUrl,
148170
148251
  cols: instance.terminal.cols || 80,
148171
148252
  rows: instance.terminal.rows || 24
148172
148253
  });
@@ -148235,6 +148316,8 @@ class TerminalController {
148235
148316
  exitCode: null,
148236
148317
  command: opts.command,
148237
148318
  args: opts.args,
148319
+ closeTip: opts.closeTip,
148320
+ closeCallbackUrl: opts.closeCallbackUrl,
148238
148321
  mountedContainer: null,
148239
148322
  resizeObserver: null,
148240
148323
  hasOpened: false,
@@ -148244,9 +148327,10 @@ class TerminalController {
148244
148327
  platform: opts.platform
148245
148328
  };
148246
148329
  }
148247
- closeSession(id2) {
148330
+ closeSession(id2, opts) {
148248
148331
  const instance = this.instances.get(id2);
148249
148332
  if (!instance) return;
148333
+ const shouldTriggerCloseCallback = opts?.triggerCloseCallback !== false;
148250
148334
  if (instance.mountedContainer) {
148251
148335
  this.unmount(id2);
148252
148336
  }
@@ -148265,12 +148349,15 @@ class TerminalController {
148265
148349
  }
148266
148350
  }
148267
148351
  instance.terminal.dispose();
148352
+ if (shouldTriggerCloseCallback) {
148353
+ this.runCloseCallback(instance);
148354
+ }
148268
148355
  this.instances.delete(id2);
148269
148356
  this.notify();
148270
148357
  }
148271
148358
  closeAll() {
148272
148359
  for (const id2 of [...this.instances.keys()]) {
148273
- this.closeSession(id2);
148360
+ this.closeSession(id2, { triggerCloseCallback: false });
148274
148361
  }
148275
148362
  }
148276
148363
  // --- DOM mount/unmount ---
@@ -148468,10 +148555,11 @@ class TerminalController {
148468
148555
  if (!instance) return;
148469
148556
  instance.isExited = true;
148470
148557
  instance.exitCode = msg.exitCode;
148471
- if (instance.isDedicated) {
148558
+ if (instance.closeTip || instance.isDedicated) {
148559
+ const tip = instance.closeTip ?? "Press any key to close (equivalent to close action).";
148472
148560
  instance.terminal.write(
148473
148561
  `\r
148474
- \x1B[90m[Process exited with code ${msg.exitCode}. Press any key to close (equivalent to close action).]\x1B[0m`
148562
+ \x1B[90m[Process exited with code ${msg.exitCode}. ${tip}]\x1B[0m`
148475
148563
  );
148476
148564
  }
148477
148565
  this.notify();
@@ -148547,6 +148635,8 @@ class TerminalController {
148547
148635
  outputActive: inst.lastOutputTime > 0 && Date.now() - inst.lastOutputTime < OUTPUT_IDLE_THRESHOLD,
148548
148636
  command: inst.command,
148549
148637
  args: inst.args,
148638
+ closeTip: inst.closeTip,
148639
+ closeCallbackUrl: inst.closeCallbackUrl,
148550
148640
  platform: inst.platform
148551
148641
  });
148552
148642
  }
@@ -148588,7 +148678,9 @@ class TerminalController {
148588
148678
  cols: pending.cols,
148589
148679
  rows: pending.rows,
148590
148680
  command: pending.command,
148591
- args: pending.args
148681
+ args: pending.args,
148682
+ closeTip: pending.closeTip,
148683
+ closeCallbackUrl: pending.closeCallbackUrl
148592
148684
  });
148593
148685
  }
148594
148686
  this.pendingCreates = [];
@@ -148671,6 +148763,8 @@ class TerminalController {
148671
148763
  command: serverSession.command,
148672
148764
  args: serverSession.args,
148673
148765
  isDedicated: false,
148766
+ closeTip: serverSession.closeTip,
148767
+ closeCallbackUrl: serverSession.closeCallbackUrl,
148674
148768
  restored: true,
148675
148769
  serverSessionId: serverSession.id,
148676
148770
  platform: serverSession.platform ?? DEFAULT_PTY_PLATFORM
@@ -148693,6 +148787,8 @@ class TerminalController {
148693
148787
  } else if (!instance.serverSessionId) {
148694
148788
  instance.serverSessionId = serverSession.id;
148695
148789
  }
148790
+ instance.closeTip = serverSession.closeTip;
148791
+ instance.closeCallbackUrl = serverSession.closeCallbackUrl;
148696
148792
  instance.platform = serverSession.platform ?? DEFAULT_PTY_PLATFORM;
148697
148793
  instance.inputPanelAddon.setPlatform(instance.platform);
148698
148794
  this.serverToLocalSessionId.set(serverSession.id, instance.id);
@@ -148716,12 +148812,45 @@ class TerminalController {
148716
148812
  get discoveredSessions() {
148717
148813
  return this.hasDiscoveredSessions;
148718
148814
  }
148815
+ runCloseCallback(instance) {
148816
+ if (!instance.isExited) return;
148817
+ const callbackUrl = resolveCloseCallbackUrl(instance.closeCallbackUrl, instance.exitCode);
148818
+ if (!callbackUrl) return;
148819
+ navigateCloseCallback(callbackUrl);
148820
+ }
148719
148821
  wsSend(msg) {
148720
148822
  if (this.ws?.readyState === WebSocket.OPEN) {
148721
148823
  this.ws.send(JSON.stringify(msg));
148722
148824
  }
148723
148825
  }
148724
148826
  }
148827
+ function resolveCloseCallbackUrl(raw2, exitCode) {
148828
+ if (!raw2) return null;
148829
+ if (typeof raw2 === "string") {
148830
+ const trimmed = raw2.trim();
148831
+ return trimmed.length > 0 ? trimmed : null;
148832
+ }
148833
+ const exact = raw2[exitCode == null ? "null" : String(exitCode)];
148834
+ if (typeof exact === "string" && exact.trim().length > 0) return exact.trim();
148835
+ const fallback = raw2["*"];
148836
+ if (typeof fallback === "string" && fallback.trim().length > 0) return fallback.trim();
148837
+ return null;
148838
+ }
148839
+ function navigateCloseCallback(rawUrl) {
148840
+ let parsed;
148841
+ try {
148842
+ parsed = new URL(rawUrl, window.location.origin);
148843
+ } catch {
148844
+ return;
148845
+ }
148846
+ if (parsed.origin === window.location.origin) {
148847
+ const href = `${parsed.pathname}${parsed.search}${parsed.hash}`;
148848
+ const targetArea = navController.getAreaForPath(parsed.pathname);
148849
+ navController.push(targetArea, href, null);
148850
+ return;
148851
+ }
148852
+ window.open(parsed.toString(), "_blank", "noopener,noreferrer");
148853
+ }
148725
148854
  const terminalController = new TerminalController();
148726
148855
  const TerminalContext = reactExports.createContext(null);
148727
148856
  function useTerminalContext() {
@@ -150198,7 +150327,6 @@ function Config() {
150198
150327
  }
150199
150328
  function Dashboard() {
150200
150329
  const { data: statuses, isLoading, error } = useOpsxStatusListSubscription();
150201
- const { createDedicatedSession } = useTerminalContext();
150202
150330
  const summary = reactExports.useMemo(() => {
150203
150331
  const totalChanges = statuses?.length ?? 0;
150204
150332
  const totalArtifacts = statuses?.reduce((count2, status) => count2 + status.artifacts.length, 0) ?? 0;
@@ -150209,15 +150337,8 @@ function Dashboard() {
150209
150337
  return { totalChanges, totalArtifacts, doneArtifacts };
150210
150338
  }, [statuses]);
150211
150339
  const runNewChange = reactExports.useCallback(() => {
150212
- const name2 = window.prompt("Change name (kebab-case):");
150213
- if (!name2) return;
150214
- const schema2 = window.prompt("Schema (optional):");
150215
- const args = ["new", "change", name2.trim()];
150216
- if (schema2) {
150217
- args.push("--schema", schema2.trim());
150218
- }
150219
- createDedicatedSession("openspec", args);
150220
- }, [createDedicatedSession]);
150340
+ navController.activatePop("/opsx-new");
150341
+ }, []);
150221
150342
  if (isLoading && !statuses) {
150222
150343
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "route-loading animate-pulse", children: "Loading dashboard..." });
150223
150344
  }
@@ -150250,13 +150371,35 @@ function Dashboard() {
150250
150371
  ] }),
150251
150372
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-3", children: [
150252
150373
  /* @__PURE__ */ jsxRuntimeExports.jsx(StatCard, { label: "Active Changes", value: summary.totalChanges }),
150253
- /* @__PURE__ */ jsxRuntimeExports.jsx(StatCard, { label: "Artifacts Complete", value: `${summary.doneArtifacts}/${summary.totalArtifacts}` }),
150254
- /* @__PURE__ */ jsxRuntimeExports.jsx(StatCard, { label: "Completion", value: summary.totalArtifacts > 0 ? `${Math.round(summary.doneArtifacts / summary.totalArtifacts * 100)}%` : "0%" })
150374
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
150375
+ StatCard,
150376
+ {
150377
+ label: "Artifacts Complete",
150378
+ value: `${summary.doneArtifacts}/${summary.totalArtifacts}`
150379
+ }
150380
+ ),
150381
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
150382
+ StatCard,
150383
+ {
150384
+ label: "Completion",
150385
+ value: summary.totalArtifacts > 0 ? `${Math.round(summary.doneArtifacts / summary.totalArtifacts * 100)}%` : "0%"
150386
+ }
150387
+ )
150255
150388
  ] }),
150256
150389
  !hasChanges && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-border text-muted-foreground rounded-md border border-dashed p-6 text-center text-sm", children: [
150257
- "No active changes yet. Use ",
150258
- /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "/opsx:new" }),
150259
- " to create your first change."
150390
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "No active changes yet." }),
150391
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
150392
+ "button",
150393
+ {
150394
+ type: "button",
150395
+ onClick: runNewChange,
150396
+ className: "text-primary mt-2 inline-flex items-center gap-1 hover:underline",
150397
+ children: [
150398
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Sparkles, { className: "h-3.5 w-3.5" }),
150399
+ "/opsx:new"
150400
+ ]
150401
+ }
150402
+ )
150260
150403
  ] }),
150261
150404
  hasChanges && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-border divide-border divide-y rounded-lg border", children: statuses?.map((status) => {
150262
150405
  const done = status.artifacts.filter((a2) => a2.status === "done").length;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openspecui/web",
3
- "version": "1.1.2",
3
+ "version": "1.2.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "openspecui-ssg": "./dist-ssg/ssg-cli.mjs"
@@ -61,9 +61,9 @@
61
61
  "vitest": "^4.0.18",
62
62
  "yaml": "^2.8.0",
63
63
  "yargs": "^18.0.0",
64
- "@openspecui/search": "1.1.0",
65
- "@openspecui/server": "1.1.2",
66
- "xterm-input-panel": "1.0.0"
64
+ "@openspecui/server": "1.2.0",
65
+ "xterm-input-panel": "1.0.0",
66
+ "@openspecui/search": "1.1.0"
67
67
  },
68
68
  "scripts": {
69
69
  "dev": "vite --host=0.0.0.0",
@@ -1 +0,0 @@
1
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-serif:var(--font-serif);--font-mono:var(--font-mono);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-cyan-300:oklch(86.5% .127 207.078);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-700:oklch(50% .134 242.749);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-700:oklch(51.4% .222 16.935);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-900:oklch(21% .006 285.885);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--shadow-2xs:var(--shadow-2xs);--shadow-xs:var(--shadow-xs);--shadow-sm:var(--shadow-sm);--shadow-md:var(--shadow-md);--shadow-lg:var(--shadow-lg);--shadow-xl:var(--shadow-xl);--shadow-2xl:var(--shadow-2xl);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--shadow:var(--shadow);--color-primary:var(--primary);--color-muted-foreground:var(--muted-foreground);--font-nav:var(--font-nav)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);corner-shape:bevel}html,body{overscroll-behavior-y:none}body{background-color:var(--background);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:var(--font-mono)}.font-nav{font-family:var(--font-nav)}button{cursor:pointer}.markdown-content{color:var(--foreground);line-height:1.7}.markdown-content h1{margin-top:1.5rem;margin-bottom:.75rem;font-size:1.5rem;font-weight:700}.markdown-content h2{margin-top:1.25rem;margin-bottom:.5rem;font-size:1.25rem;font-weight:600}.markdown-content h3{margin-top:1rem;margin-bottom:.5rem;font-size:1.125rem;font-weight:600}.markdown-content h4{margin-top:.85rem;margin-bottom:.4rem;font-size:1rem;font-weight:600}.markdown-content h5{margin-top:.75rem;margin-bottom:.35rem;font-size:.95rem;font-weight:600}.markdown-content h6{text-transform:uppercase;letter-spacing:.02em;color:var(--muted-foreground);margin-top:.6rem;margin-bottom:.3rem;font-size:.9rem;font-weight:600}:where(.markdown-content,.markdown-section)>:first-child:is(h1,h2,h3,h4,h5,h6){margin-top:0}.markdown-content p{margin-bottom:.75rem}.markdown-content ul,.markdown-content ol{margin-bottom:.75rem;padding-left:1.5rem}.markdown-content ul{list-style-type:disc}.markdown-content ol{list-style-type:decimal}.markdown-content li{margin-bottom:.25rem}.markdown-content a{color:var(--primary);text-decoration:underline}.markdown-content a:hover{opacity:.8}.markdown-content blockquote{border-left:3px solid var(--border);color:var(--muted-foreground);margin:1rem 0;padding-left:1rem}.markdown-content hr{border:none;border-top:1px solid var(--border);margin:1.5rem 0}.markdown-content table{border-collapse:collapse;width:100%;margin:1rem 0}.markdown-content th,.markdown-content td{border:1px solid var(--border);text-align:left;padding:.5rem .75rem}.markdown-content th{background:var(--muted);font-weight:600}.markdown-content strong{font-weight:600}}@layer components;@layer utilities{.\@container\/app{container:app/inline-size}.\@container{container-type:inline-size}.\@container-\[size\]{container-type:size}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.-top-0\.25{top:calc(var(--spacing)*-.25)}.top-0{top:calc(var(--spacing)*0)}.top-0\.5{top:calc(var(--spacing)*.5)}.top-1\/2{top:50%}.right-4{right:calc(var(--spacing)*4)}.-bottom-0\.25{bottom:calc(var(--spacing)*-.25)}.left-0\.5{left:calc(var(--spacing)*.5)}.left-3{left:calc(var(--spacing)*3)}.left-4{left:calc(var(--spacing)*4)}.z-2{z-index:2}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-m-2{margin:calc(var(--spacing)*-2)}.m-0{margin:calc(var(--spacing)*0)}.m-auto{margin:auto}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.-mr-1{margin-right:calc(var(--spacing)*-1)}.-mr-1\.5{margin-right:calc(var(--spacing)*-1.5)}.mr-1{margin-right:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.-ml-1\.5{margin-left:calc(var(--spacing)*-1.5)}.-ml-2\.5{margin-left:calc(var(--spacing)*-2.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-0\.5{height:calc(var(--spacing)*.5)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-30{height:calc(var(--spacing)*30)}.h-\[220px\]{height:220px}.h-\[400px\]{height:400px}.h-dvh{height:100dvh}.h-full{height:100%}.max-h-\[70vh\]{max-height:70vh}.max-h-\[calc\(100cqh-3rem\)\]{max-height:calc(100cqh - 3rem)}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-80{min-height:calc(var(--spacing)*80)}.min-h-\[2rem\]{min-height:2rem}.w-2{width:calc(var(--spacing)*2)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-11{width:calc(var(--spacing)*11)}.w-12{width:calc(var(--spacing)*12)}.w-64{width:calc(var(--spacing)*64)}.w-\[120px\]{width:120px}.w-\[420px\]{width:420px}.w-\[calc\(100\%-0\.5rem\)\]{width:calc(100% - .5rem)}.w-full{width:100%}.w-screen{width:100vw}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[80vw\]{max-width:80vw}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[min\(96vw\,1280px\)\]{max-width:min(96vw,1280px)}.max-w-none{max-width:none}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[180px\]{min-width:180px}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-0\.5{--tw-translate-y:calc(var(--spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0\.5{--tw-translate-y:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.content-center{align-content:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--border)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-\[var\(--openspec-dialog-radius\,0\.75rem\)\]{border-radius:var(--openspec-dialog-radius,.75rem)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-500\/50{border-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/50{border-color:color-mix(in oklab,var(--color-amber-500)50%,transparent)}}.border-border,.border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,var(--border)50%,transparent)}}.border-current{border-color:currentColor}.border-destructive\/40{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/40{border-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.border-destructive\/50{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/50{border-color:color-mix(in oklab,var(--destructive)50%,transparent)}}.border-emerald-200{border-color:var(--color-emerald-200)}.border-green-500{border-color:var(--color-green-500)}.border-green-500\/50{border-color:#00c75880}@supports (color:color-mix(in lab,red,red)){.border-green-500\/50{border-color:color-mix(in oklab,var(--color-green-500)50%,transparent)}}.border-input{border-color:var(--input)}.border-muted{border-color:var(--muted)}.border-primary{border-color:var(--primary)}.border-red-500{border-color:var(--color-red-500)}.border-red-500\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.border-red-500\/40{border-color:color-mix(in oklab,var(--color-red-500)40%,transparent)}}.border-red-500\/60{border-color:#fb2c3699}@supports (color:color-mix(in lab,red,red)){.border-red-500\/60{border-color:color-mix(in oklab,var(--color-red-500)60%,transparent)}}.border-rose-200{border-color:var(--color-rose-200)}.border-sky-200{border-color:var(--color-sky-200)}.border-transparent{border-color:#0000}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-400\/35{background-color:#fcbb0059}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/35{background-color:color-mix(in oklab,var(--color-amber-400)35%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-background,.bg-background\/80{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--background)80%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive,.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive)10%,transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.bg-green-500\/50{background-color:#00c75880}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/50{background-color:color-mix(in oklab,var(--color-green-500)50%,transparent)}}.bg-muted{background-color:var(--muted)}.bg-muted-foreground\/30{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/30{background-color:color-mix(in oklab,var(--muted-foreground)30%,transparent)}}.bg-muted\/20{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,var(--muted)20%,transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--muted)30%,transparent)}}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,var(--muted)40%,transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--muted)50%,transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--primary)10%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/5{background-color:color-mix(in oklab,var(--color-red-500)5%,transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-sky-100{background-color:var(--color-sky-100)}.bg-terminal{background-color:var(--terminal)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-zinc-400{background-color:var(--color-zinc-400)}.bg-zinc-900{background-color:var(--color-zinc-900)}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-\[1px\]{padding-inline:1px}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-\[env\(safe-area-inset-top\)\]{padding-top:env(safe-area-inset-top)}.pt-\[max\(0\.5rem\,env\(safe-area-inset-top\)\)\]{padding-top:max(.5rem,env(safe-area-inset-top))}.pt-\[max\(0\.75rem\,env\(safe-area-inset-top\)\)\]{padding-top:max(.75rem,env(safe-area-inset-top))}.pr-3{padding-right:calc(var(--spacing)*3)}.pb-\[max\(1rem\,env\(safe-area-inset-bottom\)\)\]{padding-bottom:max(1rem,env(safe-area-inset-bottom))}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-9{padding-left:calc(var(--spacing)*9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-nav{font-family:var(--font-nav)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.03em\]{--tw-tracking:.03em;letter-spacing:.03em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-200{color:var(--color-amber-200)}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-blue-200{color:var(--color-blue-200)}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-cyan-300{color:var(--color-cyan-300)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground{color:var(--foreground)}.text-fuchsia-300{color:var(--color-fuchsia-300)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-inherit{color:inherit}.text-muted-foreground,.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,var(--muted-foreground)50%,transparent)}}.text-muted-foreground\/80{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,var(--muted-foreground)80%,transparent)}}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-rose-700{color:var(--color-rose-700)}.text-sky-300{color:var(--color-sky-300)}.text-sky-500{color:var(--color-sky-500)}.text-sky-700{color:var(--color-sky-700)}.text-terminal-foreground{color:var(--terminal-foreground)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600{color:var(--color-yellow-600)}.text-zinc-100{color:var(--color-zinc-100)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.accent-primary{accent-color:var(--primary)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-100{opacity:1}.shadow-lg{--tw-shadow:var(--shadow-lg);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:var(--shadow-xl);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.\[zoom\:0\.86\]{zoom:.86}.\[zoom\:0\.92\]{zoom:.92}@media(hover:hover){.group-hover\:bg-muted-foreground\/60:is(:where(.group):hover *){background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.group-hover\:bg-muted-foreground\/60:is(:where(.group):hover *){background-color:color-mix(in oklab,var(--muted-foreground)60%,transparent)}}.group-hover\:text-foreground:is(:where(.group):hover *){color:var(--foreground)}.group-hover\:text-primary:is(:where(.group):hover *){color:var(--primary)}.group-hover\:opacity-40:is(:where(.group):hover *){opacity:.4}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\:\[animation-play-state\:paused\]\!:is(:where(.group):hover *){animation-play-state:paused!important}}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.backdrop\:bg-black\/20::backdrop{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.backdrop\:bg-black\/20::backdrop{background-color:color-mix(in oklab,var(--color-black)20%,transparent)}}@media(hover:hover){.hover\:bg-background\/50:hover{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/50:hover{background-color:color-mix(in oklab,var(--background)50%,transparent)}}.hover\:bg-destructive\/10:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab,var(--destructive)10%,transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted)50%,transparent)}}.hover\:bg-muted\/60:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/60:hover{background-color:color-mix(in oklab,var(--muted)60%,transparent)}}.hover\:bg-muted\/80:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/80:hover{background-color:color-mix(in oklab,var(--muted)80%,transparent)}}.hover\:bg-primary\/80:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab,var(--primary)80%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-primary:focus{--tw-ring-color:var(--primary)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:p-4{padding:calc(var(--spacing)*4)}.sm\:pt-3{padding-top:calc(var(--spacing)*3)}.sm\:pt-5{padding-top:calc(var(--spacing)*5)}}@media(min-width:48rem){.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64rem){.lg\:grid-cols-\[280px_1fr\]{grid-template-columns:280px 1fr}}.\[\&_pre\]\:m-0 pre{margin:calc(var(--spacing)*0)}.\[\&_pre\]\:bg-transparent pre{background-color:#0000}.\[\&_pre\]\:p-4 pre{padding:calc(var(--spacing)*4)}.\[\&\.active\]\:bg-primary.active{background-color:var(--primary)}.\[\&\.active\]\:text-primary.active{color:var(--primary)}.\[\&\.active\]\:text-primary-foreground.active{color:var(--primary-foreground)}button:hover>.\[button\:hover\>\&\]\:opacity-100{opacity:1}}:root{--background:oklch(100% 0 0);--foreground:oklch(0% 0 0);--terminal:oklch(20% 0 0);--terminal-foreground:oklch(100% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(0% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(0% 0 0);--primary:oklch(64.89% .237 26.9728);--primary-foreground:oklch(100% 0 0);--secondary:oklch(96.8% .211 109.769);--secondary-foreground:oklch(0% 0 0);--muted:oklch(95.51% 0 0);--muted-foreground:oklch(32.11% 0 0);--accent:oklch(56.35% .2408 260.818);--accent-foreground:oklch(100% 0 0);--destructive:oklch(0% 0 0);--destructive-foreground:oklch(100% 0 0);--border:oklch(0% 0 0);--input:oklch(0% 0 0);--ring:oklch(64.89% .237 26.9728);--chart-1:oklch(64.89% .237 26.9728);--chart-2:oklch(96.8% .211 109.769);--chart-3:oklch(56.35% .2408 260.818);--chart-4:oklch(73.23% .2492 142.495);--chart-5:oklch(59.31% .2726 328.363);--sidebar:oklch(95.51% 0 0);--sidebar-foreground:oklch(0% 0 0);--sidebar-primary:oklch(64.89% .237 26.9728);--sidebar-primary-foreground:oklch(100% 0 0);--sidebar-accent:oklch(56.35% .2408 260.818);--sidebar-accent-foreground:oklch(100% 0 0);--sidebar-border:oklch(0% 0 0);--sidebar-ring:oklch(64.89% .237 26.9728);--font-sans:"JetBrains Mono",SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;--font-serif:ui-serif,Georgia,Cambria,"Times New Roman",Times,serif;--font-mono:"JetBrains Mono",SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;--font-nav:"Share Tech Mono","JetBrains Mono",SFMono-Regular,monospace;--radius:0px;--shadow-x:4px;--shadow-y:4px;--shadow-blur:0px;--shadow-spread:0px;--shadow-opacity:1;--shadow-color:#000;--shadow-2xs:4px 4px 0px 0px #00000080;--shadow-xs:4px 4px 0px 0px #00000080;--shadow-sm:4px 4px 0px 0px #000,4px 1px 2px -1px #000;--shadow:4px 4px 0px 0px #000,4px 1px 2px -1px #000;--shadow-md:4px 4px 0px 0px #000,4px 2px 4px -1px #000;--shadow-lg:4px 4px 0px 0px #000,4px 4px 6px -1px #000;--shadow-xl:4px 4px 0px 0px #000,4px 8px 10px -1px #000;--shadow-2xl:4px 4px 0px 0px #000;--tracking-normal:0em;--spacing:.25rem}.dark{--background:oklch(0% 0 0);--foreground:oklch(100% 0 0);--terminal:oklch(20% 0 0);--terminal-foreground:oklch(100% 0 0);--card:oklch(32.11% 0 0);--card-foreground:oklch(100% 0 0);--popover:oklch(32.11% 0 0);--popover-foreground:oklch(100% 0 0);--primary:oklch(70.44% .1872 23.1858);--primary-foreground:oklch(0% 0 0);--secondary:oklch(96.91% .2005 109.623);--secondary-foreground:oklch(0% 0 0);--muted:oklch(21.78% 0 0);--muted-foreground:oklch(84.52% 0 0);--accent:oklch(67.55% .1765 252.259);--accent-foreground:oklch(0% 0 0);--destructive:oklch(100% 0 0);--destructive-foreground:oklch(0% 0 0);--border:oklch(100% 0 0);--input:oklch(100% 0 0);--ring:oklch(70.44% .1872 23.1858);--chart-1:oklch(70.44% .1872 23.1858);--chart-2:oklch(96.91% .2005 109.623);--chart-3:oklch(67.55% .1765 252.259);--chart-4:oklch(73.95% .2268 142.85);--chart-5:oklch(61.31% .2458 328.071);--sidebar:oklch(0% 0 0);--sidebar-foreground:oklch(100% 0 0);--sidebar-primary:oklch(70.44% .1872 23.1858);--sidebar-primary-foreground:oklch(0% 0 0);--sidebar-accent:oklch(67.55% .1765 252.259);--sidebar-accent-foreground:oklch(0% 0 0);--sidebar-border:oklch(100% 0 0);--sidebar-ring:oklch(70.44% .1872 23.1858);--font-sans:"JetBrains Mono",SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;--font-serif:ui-serif,Georgia,Cambria,"Times New Roman",Times,serif;--font-mono:"JetBrains Mono",SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;--font-nav:"Share Tech Mono","JetBrains Mono",SFMono-Regular,monospace;--radius:0px;--shadow-x:4px;--shadow-y:4px;--shadow-blur:0px;--shadow-spread:0px;--shadow-opacity:1;--shadow-color:#000;--shadow-2xs:4px 4px 0px 0px #00000080;--shadow-xs:4px 4px 0px 0px #00000080;--shadow-sm:4px 4px 0px 0px #000,4px 1px 2px -1px #000;--shadow:4px 4px 0px 0px #000,4px 1px 2px -1px #000;--shadow-md:4px 4px 0px 0px #000,4px 2px 4px -1px #000;--shadow-lg:4px 4px 0px 0px #000,4px 4px 6px -1px #000;--shadow-xl:4px 4px 0px 0px #000,4px 8px 10px -1px #000;--shadow-2xl:4px 4px 0px 0px #000}.view-transition-route{view-transition-name:route;contain:paint;position:relative}.route-loading{view-transition-name:none}@keyframes route-fade-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes route-fade-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(12px)}}::view-transition-old(route){animation:.26s cubic-bezier(.22,.61,.36,1) forwards route-fade-out}::view-transition-new(route){animation:.32s cubic-bezier(.22,.61,.36,1) forwards route-fade-in}@media(prefers-reduced-motion:reduce){::view-transition-old(route){animation:none}::view-transition-new(route){animation:none}}.scrollbar-thin{scrollbar-width:thin}.scrollbar-track-transparent{scrollbar-color:currentColor transparent}@supports (color:color-mix(in lab,red,red)){.scrollbar-track-transparent{scrollbar-color:color-mix(in srgb,currentColor,transparent 70%)transparent}}.scrollbar-none{scrollbar-width:none}.shiki-wrapper{border:1px solid var(--border)}.shiki,.shiki span{color:var(--shiki-light)!important;background-color:var(--shiki-light-bg)!important}.dark .shiki,.dark .shiki span{color:var(--shiki-dark)!important;background-color:var(--shiki-dark-bg)!important}@keyframes terminal-breathing{0%,to{background-color:#9e9e9e}50%{background-color:#00bcd4;background-color:oklch(73% .13 210.82)}}.animate-terminal-breathing{animation:1.5s ease-in-out infinite terminal-breathing}.xterm .xterm-scrollable-element,.xterm .xterm-scrollable-element.xterm-mac{background-color:var(--terminal)!important}.terminal-shimmer{color:#0000;background-image:linear-gradient(90deg,#a1a1aa,#fafafa,#a1a1aa);background-size:200% 100%;-webkit-background-clip:text;animation:1.8s linear infinite terminal-shimmer}@keyframes terminal-shimmer{0%{background-position:-120% 0}to{background-position:120% 0}}.app-layout{flex-direction:column;display:flex}.app-body{flex-direction:column;flex:1;min-height:0;display:flex}.desktop-sidebar,.desktop-status{display:none}.mobile-header,.mobile-tabbar{display:flex}.main-content{flex:1;min-height:0;overflow:auto}.bottom-area{min-width:0;display:block}@container app (min-width:768px){.app-layout{flex-direction:row}.app-body{min-width:0}.desktop-sidebar,.desktop-status{display:flex}.mobile-header,.mobile-tabbar{display:none}.bottom-area{display:block}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes slide-in-from-left{0%{transform:translate(-100%)}to{transform:translate(0)}}.animate-in{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:both}.fade-in{animation-name:fade-in}.slide-in-from-left{animation-name:slide-in-from-left}.duration-200{animation-duration:.2s}@keyframes marquee-scroll{0%{transform:translate(0)}to{transform:translate(calc(-100% - var(--marquee-gap,20px)))}}.animate-marquee{animation:marquee-scroll var(--marquee-duration,10s)linear infinite}.animate-marquee:after{content:attr(data-content);left:calc(100% + var(--marquee-gap,20px));white-space:nowrap;position:absolute;top:0}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{overflow-y:scroll;cursor:default;position:absolute;inset:0}.xterm:not(.allow-transparency) .xterm-viewport{background-color:#000}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;inset:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.xterm-scrollbar{cursor:default}.xterm .xterm-scrollable-element>.xterm-scrollbar>.xterm-scra{cursor:pointer;background-color:var(--vscode-scrollbarSliderBackground, rgba(100, 100, 100, .4));mask-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 11'><path d='M2.5 8.5 L5.5 2.5 L8.5 8.5 Z' fill='black'/></svg>");-webkit-mask-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 11'><path d='M2.5 8.5 L5.5 2.5 L8.5 8.5 Z' fill='black'/></svg>");mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-position:center center;-webkit-mask-position:center center;mask-size:100% 100%;-webkit-mask-size:100% 100%}.xterm .xterm-scrollable-element>.xterm-scrollbar>.xterm-scra.xterm-arrow-down{transform:rotate(180deg)}.xterm .xterm-scrollable-element>.xterm-visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.xterm-invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.xterm-invisible.xterm-fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.xterm-shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.xterm-shadow.xterm-shadow-top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.xterm-shadow.xterm-shadow-left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.xterm-shadow.xterm-shadow-top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.xterm-shadow.xterm-shadow-top.xterm-shadow-left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}