@phenx-inc/ctlsurf 0.12.1 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/out/headless/index.mjs +25 -19
  2. package/out/headless/index.mjs.map +2 -2
  3. package/out/main/index.js +30 -18
  4. package/out/renderer/assets/{cssMode-D7r66wvO.js → cssMode-KhYyY-BM.js} +3 -3
  5. package/out/renderer/assets/{freemarker2-jSWJIjPG.js → freemarker2-BFsSgcWk.js} +1 -1
  6. package/out/renderer/assets/{handlebars-BnFyz5RH.js → handlebars-Be6_aBsm.js} +1 -1
  7. package/out/renderer/assets/{html-Bl5UFavp.js → html-G8mvsyfc.js} +1 -1
  8. package/out/renderer/assets/{htmlMode-D4VByBT6.js → htmlMode-Cfd5VCjw.js} +3 -3
  9. package/out/renderer/assets/{index-Cc_TqOCL.css → index-Bi_MjBqs.css} +116 -8
  10. package/out/renderer/assets/{index-DxhW1emk.js → index-MqgBcJzy.js} +259 -87
  11. package/out/renderer/assets/{javascript-CMN1OmwG.js → javascript-XyDWi6dC.js} +2 -2
  12. package/out/renderer/assets/{jsonMode-CJ5AYSPV.js → jsonMode-DZT5gBVW.js} +3 -3
  13. package/out/renderer/assets/{liquid-BGMIDTEm.js → liquid-BuajCNJ9.js} +1 -1
  14. package/out/renderer/assets/{lspLanguageFeatures-DGifVYB5.js → lspLanguageFeatures-BYkg2Yc-.js} +1 -1
  15. package/out/renderer/assets/{mdx-B2Z7R10Q.js → mdx-D0Qx2GMS.js} +1 -1
  16. package/out/renderer/assets/{python-LMDMSSdn.js → python-ChncNy6S.js} +1 -1
  17. package/out/renderer/assets/{razor-BZSrziPu.js → razor-C6MUtfaS.js} +1 -1
  18. package/out/renderer/assets/{tsMode-DF9m6_3n.js → tsMode-C2aMdzdU.js} +1 -1
  19. package/out/renderer/assets/{typescript-rZeCMf0a.js → typescript-CB71AtAT.js} +1 -1
  20. package/out/renderer/assets/{xml-fNSZ-7so.js → xml-tHS1Ec9w.js} +1 -1
  21. package/out/renderer/assets/{yaml-1wxIuvzh.js → yaml-CZcp5ueF.js} +1 -1
  22. package/out/renderer/index.html +2 -2
  23. package/package.json +1 -1
  24. package/src/main/index.ts +9 -0
  25. package/src/main/orchestrator.ts +1 -1
  26. package/src/main/ticketStore.ts +26 -20
  27. package/src/renderer/App.tsx +14 -2
  28. package/src/renderer/components/CtlsurfPanel.tsx +169 -35
  29. package/src/renderer/components/TerminalPanel.tsx +7 -21
  30. package/src/renderer/components/TicketPanel.tsx +80 -24
  31. package/src/renderer/styles.css +116 -8
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./cssMode-D7r66wvO.js","./lspLanguageFeatures-DGifVYB5.js","./htmlMode-D4VByBT6.js","./jsonMode-CJ5AYSPV.js","./javascript-CMN1OmwG.js","./typescript-rZeCMf0a.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./cssMode-KhYyY-BM.js","./lspLanguageFeatures-BYkg2Yc-.js","./htmlMode-Cfd5VCjw.js","./jsonMode-DZT5gBVW.js","./javascript-XyDWi6dC.js","./typescript-CB71AtAT.js"])))=>i.map(i=>d[i]);
2
2
  function getDefaultExportFromCjs(x) {
3
3
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
4
4
  }
@@ -18829,24 +18829,9 @@ function copySelectionAsEmailTable(terminal) {
18829
18829
  })
18830
18830
  );
18831
18831
  }
18832
- function openExternal(uri) {
18833
- const win = window.open();
18834
- if (win) {
18835
- try {
18836
- win.opener = null;
18837
- } catch {
18838
- }
18839
- win.location.href = uri;
18840
- }
18841
- }
18842
18832
  function handleTerminalLink(_event, uri) {
18843
- window.worker.getEmbedUrl(uri).then((embedUrl) => {
18844
- if (embedUrl) {
18845
- window.dispatchEvent(new CustomEvent("ctlsurf-open-url", { detail: { url: embedUrl } }));
18846
- } else {
18847
- openExternal(uri);
18848
- }
18849
- }).catch(() => openExternal(uri));
18833
+ const openInPanel = (url) => window.dispatchEvent(new CustomEvent("ctlsurf-open-url", { detail: { url } }));
18834
+ window.worker.getEmbedUrl(uri).then((embedUrl) => openInPanel(embedUrl || uri)).catch(() => openInPanel(uri));
18850
18835
  }
18851
18836
  const _terminals = /* @__PURE__ */ new Map();
18852
18837
  function isAtBottom(terminal) {
@@ -20322,49 +20307,170 @@ function SpeakControls({ remote = false }) {
20322
20307
  error && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "speak-error", children: error })
20323
20308
  ] });
20324
20309
  }
20310
+ function displayUrl(raw) {
20311
+ try {
20312
+ const u = new URL(raw);
20313
+ u.searchParams.delete("_code");
20314
+ u.searchParams.delete("embed");
20315
+ return u.toString();
20316
+ } catch {
20317
+ return raw;
20318
+ }
20319
+ }
20325
20320
  function CtlsurfPanel({ navigate }) {
20326
20321
  const webviewRef = reactExports.useRef(null);
20327
- const [url, setUrl] = reactExports.useState(null);
20322
+ const [src, setSrc] = reactExports.useState(null);
20323
+ const [address, setAddress] = reactExports.useState("");
20324
+ const [loading, setLoading] = reactExports.useState(false);
20325
+ const [nav, setNav] = reactExports.useState({ back: false, forward: false });
20328
20326
  const [key, setKey] = reactExports.useState(0);
20329
- const loadUrl = async () => {
20327
+ const hasSrcRef = reactExports.useRef(false);
20328
+ const readyRef = reactExports.useRef(false);
20329
+ const pendingRef = reactExports.useRef(null);
20330
+ const resolve2 = reactExports.useCallback(async (raw) => {
20331
+ try {
20332
+ return await window.worker.getEmbedUrl(raw) || raw;
20333
+ } catch {
20334
+ return raw;
20335
+ }
20336
+ }, []);
20337
+ const load = reactExports.useCallback((url) => {
20338
+ if (!url) return;
20339
+ setAddress(displayUrl(url));
20340
+ if (!hasSrcRef.current) {
20341
+ hasSrcRef.current = true;
20342
+ setSrc(url);
20343
+ return;
20344
+ }
20345
+ const wv = webviewRef.current;
20346
+ if (wv && readyRef.current) wv.loadURL(url);
20347
+ else pendingRef.current = url;
20348
+ }, []);
20349
+ const loadProject = reactExports.useCallback(async () => {
20330
20350
  try {
20331
20351
  const info = await window.worker.getWebviewInfo();
20332
- setUrl(info.pageUrl || info.frontendUrl);
20352
+ load(info.pageUrl || info.frontendUrl);
20333
20353
  } catch (err) {
20334
20354
  console.error("[ctlsurf] Failed to get webview info:", err);
20335
- setUrl("https://app.ctlsurf.com");
20355
+ load("https://app.ctlsurf.com");
20336
20356
  }
20337
- };
20357
+ }, [load]);
20338
20358
  reactExports.useEffect(() => {
20339
- if (!navigate?.url) loadUrl();
20359
+ if (!navigate?.url) loadProject();
20340
20360
  }, []);
20341
20361
  reactExports.useEffect(() => {
20342
- if (navigate?.url) {
20343
- setUrl(navigate.url);
20344
- setKey((k2) => k2 + 1);
20345
- }
20362
+ if (navigate?.url) resolve2(navigate.url).then(load);
20346
20363
  }, [navigate?.n]);
20347
20364
  reactExports.useEffect(() => {
20348
20365
  const unsub = window.worker.onCwdChanged(() => {
20349
- setUrl(null);
20366
+ hasSrcRef.current = false;
20367
+ readyRef.current = false;
20368
+ pendingRef.current = null;
20369
+ setSrc(null);
20350
20370
  setKey((k2) => k2 + 1);
20351
- loadUrl();
20371
+ loadProject();
20352
20372
  });
20353
20373
  return unsub;
20354
- }, []);
20355
- if (!url) {
20356
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ctlsurf-panel", style: { display: "flex", alignItems: "center", justifyContent: "center" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "#565f89", fontSize: "13px" }, children: "Loading ctlsurf..." }) });
20357
- }
20358
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ctlsurf-panel", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
20359
- "webview",
20360
- {
20361
- ref: webviewRef,
20362
- src: url,
20363
- style: { width: "100%", height: "100%" },
20364
- allowpopups: "true"
20365
- },
20366
- key
20367
- ) });
20374
+ }, [loadProject]);
20375
+ reactExports.useEffect(() => {
20376
+ const wv = webviewRef.current;
20377
+ if (!wv) return;
20378
+ const syncNav = () => setNav({ back: wv.canGoBack?.() ?? false, forward: wv.canGoForward?.() ?? false });
20379
+ const onReady = () => {
20380
+ readyRef.current = true;
20381
+ if (pendingRef.current) {
20382
+ wv.loadURL(pendingRef.current);
20383
+ pendingRef.current = null;
20384
+ }
20385
+ syncNav();
20386
+ };
20387
+ const onNavigate = (e) => {
20388
+ const url = e.url;
20389
+ if (url) setAddress(displayUrl(url));
20390
+ syncNav();
20391
+ };
20392
+ const onStart = () => setLoading(true);
20393
+ const onStop = () => {
20394
+ setLoading(false);
20395
+ syncNav();
20396
+ };
20397
+ wv.addEventListener("dom-ready", onReady);
20398
+ wv.addEventListener("did-navigate", onNavigate);
20399
+ wv.addEventListener("did-navigate-in-page", onNavigate);
20400
+ wv.addEventListener("did-start-loading", onStart);
20401
+ wv.addEventListener("did-stop-loading", onStop);
20402
+ return () => {
20403
+ wv.removeEventListener("dom-ready", onReady);
20404
+ wv.removeEventListener("did-navigate", onNavigate);
20405
+ wv.removeEventListener("did-navigate-in-page", onNavigate);
20406
+ wv.removeEventListener("did-start-loading", onStart);
20407
+ wv.removeEventListener("did-stop-loading", onStop);
20408
+ };
20409
+ }, [src, key]);
20410
+ const onSubmit = (e) => {
20411
+ e.preventDefault();
20412
+ let target = address.trim();
20413
+ if (!target) return;
20414
+ if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(target)) target = "https://" + target;
20415
+ resolve2(target).then(load);
20416
+ };
20417
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ctlsurf-panel", children: [
20418
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ctlsurf-addressbar", children: [
20419
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
20420
+ "button",
20421
+ {
20422
+ type: "button",
20423
+ className: "ctlsurf-nav-btn",
20424
+ title: "Back",
20425
+ disabled: !nav.back,
20426
+ onClick: () => webviewRef.current?.goBack?.(),
20427
+ children: "‹"
20428
+ }
20429
+ ),
20430
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
20431
+ "button",
20432
+ {
20433
+ type: "button",
20434
+ className: "ctlsurf-nav-btn",
20435
+ title: "Forward",
20436
+ disabled: !nav.forward,
20437
+ onClick: () => webviewRef.current?.goForward?.(),
20438
+ children: "›"
20439
+ }
20440
+ ),
20441
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
20442
+ "button",
20443
+ {
20444
+ type: "button",
20445
+ className: "ctlsurf-nav-btn",
20446
+ title: loading ? "Stop" : "Reload",
20447
+ onClick: () => loading ? webviewRef.current?.stop?.() : webviewRef.current?.reload?.(),
20448
+ children: loading ? "×" : "⟳"
20449
+ }
20450
+ ),
20451
+ /* @__PURE__ */ jsxRuntimeExports.jsx("form", { className: "ctlsurf-address-form", onSubmit, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
20452
+ "input",
20453
+ {
20454
+ className: "ctlsurf-address-input",
20455
+ value: address,
20456
+ spellCheck: false,
20457
+ placeholder: "Enter a URL",
20458
+ onChange: (e) => setAddress(e.target.value),
20459
+ onFocus: (e) => e.currentTarget.select()
20460
+ }
20461
+ ) })
20462
+ ] }),
20463
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ctlsurf-webview-host", children: src ? /* @__PURE__ */ jsxRuntimeExports.jsx(
20464
+ "webview",
20465
+ {
20466
+ ref: webviewRef,
20467
+ src,
20468
+ style: { width: "100%", height: "100%" },
20469
+ allowpopups: "true"
20470
+ },
20471
+ key
20472
+ ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ctlsurf-webview-loading", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "#565f89", fontSize: "13px" }, children: "Loading ctlsurf..." }) }) })
20473
+ ] });
20368
20474
  }
20369
20475
  function _arrayLikeToArray(r, a) {
20370
20476
  (null == a || a > r.length) && (a = r.length);
@@ -207916,7 +208022,7 @@ const lessDefaults = new LanguageServiceDefaultsImpl$3(
207916
208022
  modeConfigurationDefault$2
207917
208023
  );
207918
208024
  function getMode$3() {
207919
- return __vitePreload(() => import("./cssMode-D7r66wvO.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
208025
+ return __vitePreload(() => import("./cssMode-KhYyY-BM.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
207920
208026
  }
207921
208027
  languages.onLanguage("less", () => {
207922
208028
  getMode$3().then((mode2) => mode2.setupMode(lessDefaults));
@@ -208021,7 +208127,7 @@ const razorLanguageService = registerHTMLLanguageService(
208021
208127
  );
208022
208128
  const razorDefaults = razorLanguageService.defaults;
208023
208129
  function getMode$2() {
208024
- return __vitePreload(() => import("./htmlMode-D4VByBT6.js"), true ? __vite__mapDeps([2,1]) : void 0, import.meta.url);
208130
+ return __vitePreload(() => import("./htmlMode-Cfd5VCjw.js"), true ? __vite__mapDeps([2,1]) : void 0, import.meta.url);
208025
208131
  }
208026
208132
  function registerHTMLLanguageService(languageId, options = optionsDefault, modeConfiguration = getConfigurationDefault(languageId)) {
208027
208133
  const defaults = new LanguageServiceDefaultsImpl$2(languageId, options, modeConfiguration);
@@ -208105,7 +208211,7 @@ const jsonDefaults = new LanguageServiceDefaultsImpl$1(
208105
208211
  );
208106
208212
  const getWorker$1 = () => getMode$1().then((mode2) => mode2.getWorker());
208107
208213
  function getMode$1() {
208108
- return __vitePreload(() => import("./jsonMode-CJ5AYSPV.js"), true ? __vite__mapDeps([3,1]) : void 0, import.meta.url);
208214
+ return __vitePreload(() => import("./jsonMode-DZT5gBVW.js"), true ? __vite__mapDeps([3,1]) : void 0, import.meta.url);
208109
208215
  }
208110
208216
  languages.register({
208111
208217
  id: "json",
@@ -208351,7 +208457,7 @@ const getJavaScriptWorker = () => {
208351
208457
  return getMode().then((mode) => mode.getJavaScriptWorker());
208352
208458
  };
208353
208459
  function getMode() {
208354
- return __vitePreload(() => import("./tsMode-DF9m6_3n.js"), true ? [] : void 0, import.meta.url);
208460
+ return __vitePreload(() => import("./tsMode-C2aMdzdU.js"), true ? [] : void 0, import.meta.url);
208355
208461
  }
208356
208462
  languages.onLanguage("typescript", () => {
208357
208463
  return getMode().then((mode) => mode.setupTypeScript(typescriptDefaults));
@@ -208546,49 +208652,49 @@ registerLanguage({
208546
208652
  extensions: [".ftl", ".ftlh", ".ftlx"],
208547
208653
  aliases: ["FreeMarker2", "Apache FreeMarker2"],
208548
208654
  loader: () => {
208549
- return __vitePreload(() => import("./freemarker2-jSWJIjPG.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
208655
+ return __vitePreload(() => import("./freemarker2-BFsSgcWk.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
208550
208656
  }
208551
208657
  });
208552
208658
  registerLanguage({
208553
208659
  id: "freemarker2.tag-angle.interpolation-dollar",
208554
208660
  aliases: ["FreeMarker2 (Angle/Dollar)", "Apache FreeMarker2 (Angle/Dollar)"],
208555
208661
  loader: () => {
208556
- return __vitePreload(() => import("./freemarker2-jSWJIjPG.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationDollar);
208662
+ return __vitePreload(() => import("./freemarker2-BFsSgcWk.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationDollar);
208557
208663
  }
208558
208664
  });
208559
208665
  registerLanguage({
208560
208666
  id: "freemarker2.tag-bracket.interpolation-dollar",
208561
208667
  aliases: ["FreeMarker2 (Bracket/Dollar)", "Apache FreeMarker2 (Bracket/Dollar)"],
208562
208668
  loader: () => {
208563
- return __vitePreload(() => import("./freemarker2-jSWJIjPG.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationDollar);
208669
+ return __vitePreload(() => import("./freemarker2-BFsSgcWk.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationDollar);
208564
208670
  }
208565
208671
  });
208566
208672
  registerLanguage({
208567
208673
  id: "freemarker2.tag-angle.interpolation-bracket",
208568
208674
  aliases: ["FreeMarker2 (Angle/Bracket)", "Apache FreeMarker2 (Angle/Bracket)"],
208569
208675
  loader: () => {
208570
- return __vitePreload(() => import("./freemarker2-jSWJIjPG.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationBracket);
208676
+ return __vitePreload(() => import("./freemarker2-BFsSgcWk.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationBracket);
208571
208677
  }
208572
208678
  });
208573
208679
  registerLanguage({
208574
208680
  id: "freemarker2.tag-bracket.interpolation-bracket",
208575
208681
  aliases: ["FreeMarker2 (Bracket/Bracket)", "Apache FreeMarker2 (Bracket/Bracket)"],
208576
208682
  loader: () => {
208577
- return __vitePreload(() => import("./freemarker2-jSWJIjPG.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationBracket);
208683
+ return __vitePreload(() => import("./freemarker2-BFsSgcWk.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationBracket);
208578
208684
  }
208579
208685
  });
208580
208686
  registerLanguage({
208581
208687
  id: "freemarker2.tag-auto.interpolation-dollar",
208582
208688
  aliases: ["FreeMarker2 (Auto/Dollar)", "Apache FreeMarker2 (Auto/Dollar)"],
208583
208689
  loader: () => {
208584
- return __vitePreload(() => import("./freemarker2-jSWJIjPG.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
208690
+ return __vitePreload(() => import("./freemarker2-BFsSgcWk.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
208585
208691
  }
208586
208692
  });
208587
208693
  registerLanguage({
208588
208694
  id: "freemarker2.tag-auto.interpolation-bracket",
208589
208695
  aliases: ["FreeMarker2 (Auto/Bracket)", "Apache FreeMarker2 (Auto/Bracket)"],
208590
208696
  loader: () => {
208591
- return __vitePreload(() => import("./freemarker2-jSWJIjPG.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationBracket);
208697
+ return __vitePreload(() => import("./freemarker2-BFsSgcWk.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationBracket);
208592
208698
  }
208593
208699
  });
208594
208700
  registerLanguage({
@@ -208609,7 +208715,7 @@ registerLanguage({
208609
208715
  extensions: [".handlebars", ".hbs"],
208610
208716
  aliases: ["Handlebars", "handlebars", "hbs"],
208611
208717
  mimetypes: ["text/x-handlebars-template"],
208612
- loader: () => __vitePreload(() => import("./handlebars-BnFyz5RH.js"), true ? [] : void 0, import.meta.url)
208718
+ loader: () => __vitePreload(() => import("./handlebars-Be6_aBsm.js"), true ? [] : void 0, import.meta.url)
208613
208719
  });
208614
208720
  registerLanguage({
208615
208721
  id: "hcl",
@@ -208622,7 +208728,7 @@ registerLanguage({
208622
208728
  extensions: [".html", ".htm", ".shtml", ".xhtml", ".mdoc", ".jsp", ".asp", ".aspx", ".jshtm"],
208623
208729
  aliases: ["HTML", "htm", "html", "xhtml"],
208624
208730
  mimetypes: ["text/html", "text/x-jshtm", "text/template", "text/ng-template"],
208625
- loader: () => __vitePreload(() => import("./html-Bl5UFavp.js"), true ? [] : void 0, import.meta.url)
208731
+ loader: () => __vitePreload(() => import("./html-G8mvsyfc.js"), true ? [] : void 0, import.meta.url)
208626
208732
  });
208627
208733
  registerLanguage({
208628
208734
  id: "ini",
@@ -208645,7 +208751,7 @@ registerLanguage({
208645
208751
  filenames: ["jakefile"],
208646
208752
  aliases: ["JavaScript", "javascript", "js"],
208647
208753
  mimetypes: ["text/javascript"],
208648
- loader: () => __vitePreload(() => import("./javascript-CMN1OmwG.js"), true ? __vite__mapDeps([4,5]) : void 0, import.meta.url)
208754
+ loader: () => __vitePreload(() => import("./javascript-XyDWi6dC.js"), true ? __vite__mapDeps([4,5]) : void 0, import.meta.url)
208649
208755
  });
208650
208756
  registerLanguage({
208651
208757
  id: "julia",
@@ -208684,7 +208790,7 @@ registerLanguage({
208684
208790
  extensions: [".liquid", ".html.liquid"],
208685
208791
  aliases: ["Liquid", "liquid"],
208686
208792
  mimetypes: ["application/liquid"],
208687
- loader: () => __vitePreload(() => import("./liquid-BGMIDTEm.js"), true ? [] : void 0, import.meta.url)
208793
+ loader: () => __vitePreload(() => import("./liquid-BuajCNJ9.js"), true ? [] : void 0, import.meta.url)
208688
208794
  });
208689
208795
  registerLanguage({
208690
208796
  id: "m3",
@@ -208702,7 +208808,7 @@ registerLanguage({
208702
208808
  id: "mdx",
208703
208809
  extensions: [".mdx"],
208704
208810
  aliases: ["MDX", "mdx"],
208705
- loader: () => __vitePreload(() => import("./mdx-B2Z7R10Q.js"), true ? [] : void 0, import.meta.url)
208811
+ loader: () => __vitePreload(() => import("./mdx-D0Qx2GMS.js"), true ? [] : void 0, import.meta.url)
208706
208812
  });
208707
208813
  registerLanguage({
208708
208814
  id: "mips",
@@ -208801,7 +208907,7 @@ registerLanguage({
208801
208907
  extensions: [".py", ".rpy", ".pyw", ".cpy", ".gyp", ".gypi"],
208802
208908
  aliases: ["Python", "py"],
208803
208909
  firstLine: "^#!/.*\\bpython[0-9.-]*\\b",
208804
- loader: () => __vitePreload(() => import("./python-LMDMSSdn.js"), true ? [] : void 0, import.meta.url)
208910
+ loader: () => __vitePreload(() => import("./python-ChncNy6S.js"), true ? [] : void 0, import.meta.url)
208805
208911
  });
208806
208912
  registerLanguage({
208807
208913
  id: "qsharp",
@@ -208820,7 +208926,7 @@ registerLanguage({
208820
208926
  extensions: [".cshtml"],
208821
208927
  aliases: ["Razor", "razor"],
208822
208928
  mimetypes: ["text/x-cshtml"],
208823
- loader: () => __vitePreload(() => import("./razor-BZSrziPu.js"), true ? [] : void 0, import.meta.url)
208929
+ loader: () => __vitePreload(() => import("./razor-C6MUtfaS.js"), true ? [] : void 0, import.meta.url)
208824
208930
  });
208825
208931
  registerLanguage({
208826
208932
  id: "redis",
@@ -208953,7 +209059,7 @@ registerLanguage({
208953
209059
  aliases: ["TypeScript", "ts", "typescript"],
208954
209060
  mimetypes: ["text/typescript"],
208955
209061
  loader: () => {
208956
- return __vitePreload(() => import("./typescript-rZeCMf0a.js"), true ? [] : void 0, import.meta.url);
209062
+ return __vitePreload(() => import("./typescript-CB71AtAT.js"), true ? [] : void 0, import.meta.url);
208957
209063
  }
208958
209064
  });
208959
209065
  registerLanguage({
@@ -208998,14 +209104,14 @@ registerLanguage({
208998
209104
  firstLine: "(\\<\\?xml.*)|(\\<svg)|(\\<\\!doctype\\s+svg)",
208999
209105
  aliases: ["XML", "xml"],
209000
209106
  mimetypes: ["text/xml", "application/xml", "application/xaml+xml", "application/xml-dtd"],
209001
- loader: () => __vitePreload(() => import("./xml-fNSZ-7so.js"), true ? [] : void 0, import.meta.url)
209107
+ loader: () => __vitePreload(() => import("./xml-tHS1Ec9w.js"), true ? [] : void 0, import.meta.url)
209002
209108
  });
209003
209109
  registerLanguage({
209004
209110
  id: "yaml",
209005
209111
  extensions: [".yaml", ".yml"],
209006
209112
  aliases: ["YAML", "yaml", "YML", "yml"],
209007
209113
  mimetypes: ["application/x-yaml", "text/x-yaml"],
209008
- loader: () => __vitePreload(() => import("./yaml-1wxIuvzh.js"), true ? [] : void 0, import.meta.url)
209114
+ loader: () => __vitePreload(() => import("./yaml-CZcp5ueF.js"), true ? [] : void 0, import.meta.url)
209009
209115
  });
209010
209116
  var __defProp = Object.defineProperty;
209011
209117
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -213518,6 +213624,47 @@ function TagIcon({ size: size2 = 16 }) {
213518
213624
  }
213519
213625
  );
213520
213626
  }
213627
+ function SendIcon({ size: size2 = 15 }) {
213628
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
213629
+ "svg",
213630
+ {
213631
+ viewBox: "0 0 24 24",
213632
+ width: size2,
213633
+ height: size2,
213634
+ fill: "none",
213635
+ stroke: "currentColor",
213636
+ strokeWidth: "2",
213637
+ strokeLinecap: "round",
213638
+ strokeLinejoin: "round",
213639
+ "aria-hidden": "true",
213640
+ children: [
213641
+ /* @__PURE__ */ jsxRuntimeExports.jsx("line", { x1: "22", y1: "2", x2: "11", y2: "13" }),
213642
+ /* @__PURE__ */ jsxRuntimeExports.jsx("polygon", { points: "22 2 15 22 11 13 2 9 22 2" })
213643
+ ]
213644
+ }
213645
+ );
213646
+ }
213647
+ function ticketPrompt(t, refs) {
213648
+ const lines = [
213649
+ "Please work on this ticket:",
213650
+ `Title: ${t.title || "Untitled"}`,
213651
+ `Priority: ${t.priority}`
213652
+ ];
213653
+ const desc = t.description?.trim();
213654
+ if (desc) lines.push("", desc);
213655
+ lines.push(
213656
+ "",
213657
+ "ctlsurf references (use the ctlsurf MCP tools to read details or update status):",
213658
+ `- Ticket row ID: ${t.id}`
213659
+ );
213660
+ if (refs) {
213661
+ lines.push(
213662
+ `- Tickets datastore block ID: ${refs.blockId}`,
213663
+ `- Agent Datastore page ID: ${refs.pageId}`
213664
+ );
213665
+ }
213666
+ return lines.join("\n");
213667
+ }
213521
213668
  function Segmented({ options, value, onChange }) {
213522
213669
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ticket-segmented", children: options.map((o) => {
213523
213670
  const active = o.value === value;
@@ -213537,33 +213684,47 @@ function Segmented({ options, value, onChange }) {
213537
213684
  );
213538
213685
  }) });
213539
213686
  }
213540
- function TicketCard({ ticket, onClick }) {
213541
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "ticket-card", onClick, children: [
213542
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ticket-card-bar", style: { background: colorOf(STATUS_OPTIONS, ticket.status) } }),
213543
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ticket-card-main", children: [
213544
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ticket-card-title", children: ticket.title || "Untitled" }),
213545
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ticket-card-meta", children: [
213546
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ticket-card-status", style: { color: colorOf(STATUS_OPTIONS, ticket.status) }, children: [
213547
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ticket-seg-dot", style: { background: colorOf(STATUS_OPTIONS, ticket.status) } }),
213548
- ticket.status
213549
- ] }),
213550
- ticket.created && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ticket-card-date", children: formatDate(ticket.created) })
213551
- ] })
213687
+ function TicketCard({ ticket, onClick, onSend }) {
213688
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ticket-card", children: [
213689
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "ticket-card-open", onClick, title: "Edit ticket", children: [
213690
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ticket-card-bar", style: { background: colorOf(STATUS_OPTIONS, ticket.status) } }),
213691
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ticket-card-main", children: [
213692
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ticket-card-title", children: ticket.title || "Untitled" }),
213693
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ticket-card-meta", children: [
213694
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ticket-card-status", style: { color: colorOf(STATUS_OPTIONS, ticket.status) }, children: [
213695
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ticket-seg-dot", style: { background: colorOf(STATUS_OPTIONS, ticket.status) } }),
213696
+ ticket.status
213697
+ ] }),
213698
+ ticket.created && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ticket-card-date", children: formatDate(ticket.created) })
213699
+ ] })
213700
+ ] }),
213701
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
213702
+ "span",
213703
+ {
213704
+ className: "ticket-card-pri",
213705
+ style: { color: colorOf(PRIORITY_OPTIONS, ticket.priority), borderColor: `${colorOf(PRIORITY_OPTIONS, ticket.priority)}66` },
213706
+ children: ticket.priority
213707
+ }
213708
+ )
213552
213709
  ] }),
213553
213710
  /* @__PURE__ */ jsxRuntimeExports.jsx(
213554
- "span",
213711
+ "button",
213555
213712
  {
213556
- className: "ticket-card-pri",
213557
- style: { color: colorOf(PRIORITY_OPTIONS, ticket.priority), borderColor: `${colorOf(PRIORITY_OPTIONS, ticket.priority)}66` },
213558
- children: ticket.priority
213713
+ type: "button",
213714
+ className: "ticket-card-send",
213715
+ onClick: onSend,
213716
+ title: "Send to coding terminal",
213717
+ "aria-label": "Send ticket to coding terminal",
213718
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(SendIcon, {})
213559
213719
  }
213560
213720
  )
213561
213721
  ] });
213562
213722
  }
213563
- function TicketPane() {
213723
+ function TicketPane({ onSendToTerminal }) {
213564
213724
  const [project, setProject] = reactExports.useState(null);
213565
213725
  const [view, setView] = reactExports.useState("list");
213566
213726
  const [tickets, setTickets] = reactExports.useState([]);
213727
+ const [refs, setRefs] = reactExports.useState(null);
213567
213728
  const [listLoading, setListLoading] = reactExports.useState(false);
213568
213729
  const [listError, setListError] = reactExports.useState(null);
213569
213730
  const [showDone, setShowDone] = reactExports.useState(false);
@@ -213578,13 +213739,17 @@ function TicketPane() {
213578
213739
  setListError(null);
213579
213740
  try {
213580
213741
  const r = await window.worker.listTickets();
213581
- if (r?.ok) setTickets(r.tickets || []);
213582
- else {
213742
+ if (r?.ok) {
213743
+ setTickets(r.tickets || []);
213744
+ setRefs(r.blockId && r.pageId ? { blockId: r.blockId, pageId: r.pageId } : null);
213745
+ } else {
213583
213746
  setTickets([]);
213747
+ setRefs(null);
213584
213748
  setListError(r?.error || "Failed to load tickets");
213585
213749
  }
213586
213750
  } catch (err) {
213587
213751
  setTickets([]);
213752
+ setRefs(null);
213588
213753
  setListError(err?.message || "Failed to load tickets");
213589
213754
  } finally {
213590
213755
  setListLoading(false);
@@ -213684,7 +213849,7 @@ function TicketPane() {
213684
213849
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ticket-empty-title", children: "No tickets yet" }),
213685
213850
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ticket-empty-hint", children: "Log the first one for this project." })
213686
213851
  ] }),
213687
- !listLoading && activeTickets.map((t) => /* @__PURE__ */ jsxRuntimeExports.jsx(TicketCard, { ticket: t, onClick: () => openEditForm(t) }, t.id)),
213852
+ !listLoading && activeTickets.map((t) => /* @__PURE__ */ jsxRuntimeExports.jsx(TicketCard, { ticket: t, onClick: () => openEditForm(t), onSend: () => onSendToTerminal(ticketPrompt(t, refs)) }, t.id)),
213688
213853
  !listLoading && activeTickets.length === 0 && doneTickets.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ticket-list-msg", children: "Nothing open — all caught up." }),
213689
213854
  !listLoading && doneTickets.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
213690
213855
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -213701,7 +213866,7 @@ function TicketPane() {
213701
213866
  ]
213702
213867
  }
213703
213868
  ),
213704
- showDone && doneTickets.map((t) => /* @__PURE__ */ jsxRuntimeExports.jsx(TicketCard, { ticket: t, onClick: () => openEditForm(t) }, t.id))
213869
+ showDone && doneTickets.map((t) => /* @__PURE__ */ jsxRuntimeExports.jsx(TicketCard, { ticket: t, onClick: () => openEditForm(t), onSend: () => onSendToTerminal(ticketPrompt(t, refs)) }, t.id))
213705
213870
  ] })
213706
213871
  ] }),
213707
213872
  tickets.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ticket-drawer-footer", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ticket-drawer-hint", children: doneTickets.length > 0 ? `${activeTickets.length} open · ${doneTickets.length} done` : `${tickets.length} ticket${tickets.length === 1 ? "" : "s"}` }) })
@@ -213897,6 +214062,13 @@ function App() {
213897
214062
  focusTerminal(activeTabId);
213898
214063
  setTimeout(() => window.worker.writePty(activeTabId, "\r"), 80);
213899
214064
  }, [activeTabId]);
214065
+ const handleSendToTerminal = reactExports.useCallback((text2) => {
214066
+ const trimmed = text2.trim();
214067
+ if (!trimmed) return;
214068
+ window.worker.writePty(activeTabId, trimmed);
214069
+ focusTerminal(activeTabId);
214070
+ setTimeout(() => window.worker.writePty(activeTabId, "\r"), 120);
214071
+ }, [activeTabId]);
213900
214072
  const cwdRef = reactExports.useRef(null);
213901
214073
  const handleSpawn = reactExports.useCallback(async (tabId, agent) => {
213902
214074
  setTabs((prev) => prev.map((t) => t.id === tabId ? { ...t, agentStatus: "active" } : t));
@@ -214109,7 +214281,7 @@ function App() {
214109
214281
  ] })
214110
214282
  },
214111
214283
  { id: "ctlsurf", label: "ctlsurf", content: /* @__PURE__ */ jsxRuntimeExports.jsx(CtlsurfPanel, { navigate: ctlsurfNav }) },
214112
- { id: "tickets", label: "Tickets", content: /* @__PURE__ */ jsxRuntimeExports.jsx(TicketPane, {}) }
214284
+ { id: "tickets", label: "Tickets", content: /* @__PURE__ */ jsxRuntimeExports.jsx(TicketPane, { onSendToTerminal: handleSendToTerminal }) }
214113
214285
  ];
214114
214286
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "app", children: [
214115
214287
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "titlebar", children: [
@@ -1,5 +1,5 @@
1
- import { conf as conf$1, language as language$1 } from "./typescript-rZeCMf0a.js";
2
- import "./index-DxhW1emk.js";
1
+ import { conf as conf$1, language as language$1 } from "./typescript-CB71AtAT.js";
2
+ import "./index-MqgBcJzy.js";
3
3
  const conf = conf$1;
4
4
  const language = {
5
5
  // Set defaultToken to invalid to see what you do not tokenize yet
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages, e as editor } from "./index-DxhW1emk.js";
2
- import { f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter, H as HoverAdapter, b as DocumentSymbolAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, S as SelectionRangeAdapter, e as DiagnosticsAdapter } from "./lspLanguageFeatures-DGifVYB5.js";
3
- import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-DGifVYB5.js";
1
+ import { c as createWebWorker, l as languages, e as editor } from "./index-MqgBcJzy.js";
2
+ import { f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter, H as HoverAdapter, b as DocumentSymbolAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, S as SelectionRangeAdapter, e as DiagnosticsAdapter } from "./lspLanguageFeatures-BYkg2Yc-.js";
3
+ import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-BYkg2Yc-.js";
4
4
  const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
5
5
  class WorkerManager {
6
6
  constructor(defaults) {
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-DxhW1emk.js";
1
+ import { l as languages } from "./index-MqgBcJzy.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { R as Range$1, l as languages, e as editor, U as Uri, M as MarkerSeverity } from "./index-DxhW1emk.js";
1
+ import { R as Range$1, l as languages, e as editor, U as Uri, M as MarkerSeverity } from "./index-MqgBcJzy.js";
2
2
  var DocumentUri;
3
3
  (function(DocumentUri2) {
4
4
  function is(value) {
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-DxhW1emk.js";
1
+ import { l as languages } from "./index-MqgBcJzy.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  blockComment: ["{/*", "*/}"]
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-DxhW1emk.js";
1
+ import { l as languages } from "./index-MqgBcJzy.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  lineComment: "#",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-DxhW1emk.js";
1
+ import { l as languages } from "./index-MqgBcJzy.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { c as createWebWorker, e as editor, U as Uri, a as MarkerTag, M as MarkerSeverity, l as languages, t as typescriptDefaults, R as Range } from "./index-DxhW1emk.js";
1
+ import { c as createWebWorker, e as editor, U as Uri, a as MarkerTag, M as MarkerSeverity, l as languages, t as typescriptDefaults, R as Range } from "./index-MqgBcJzy.js";
2
2
  class WorkerManager {
3
3
  constructor(_modeId, _defaults) {
4
4
  this._modeId = _modeId;