@bytespell/shella 0.1.15 → 0.1.16

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 (119) hide show
  1. package/dist/bin/cli.js +49 -37
  2. package/dist/bin/cli.js.map +1 -1
  3. package/dist/index.js +49 -37
  4. package/dist/index.js.map +1 -1
  5. package/dist/public/assets/{_baseUniq-rFeuIcJP.js → _baseUniq-f4tIwaKc.js} +1 -1
  6. package/{public/assets/arc-Ciq1-gt2.js → dist/public/assets/arc-D1iSSrpp.js} +1 -1
  7. package/{public/assets/architectureDiagram-VXUJARFQ-DQOTLTYJ.js → dist/public/assets/architectureDiagram-VXUJARFQ-CHdfmBcb.js} +1 -1
  8. package/{public/assets/blockDiagram-VD42YOAC-DrkXLslH.js → dist/public/assets/blockDiagram-VD42YOAC-CDILmMuo.js} +1 -1
  9. package/dist/public/assets/{c4Diagram-YG6GDRKO-CGep4UQM.js → c4Diagram-YG6GDRKO-Dydypk5A.js} +1 -1
  10. package/dist/public/assets/channel-D1aQ_UAD.js +1 -0
  11. package/dist/public/assets/{chunk-4BX2VUAB-DXU1pWcl.js → chunk-4BX2VUAB-pytRVvgb.js} +1 -1
  12. package/dist/public/assets/{chunk-55IACEB6-Bx-cpVYk.js → chunk-55IACEB6-mTx67dww.js} +1 -1
  13. package/{public/assets/chunk-B4BG7PRW-DN5-a04I.js → dist/public/assets/chunk-B4BG7PRW-DIs9ZsPT.js} +1 -1
  14. package/{public/assets/chunk-DI55MBZ5-CO01g9LM.js → dist/public/assets/chunk-DI55MBZ5-CwCAlT8Y.js} +1 -1
  15. package/dist/public/assets/{chunk-FMBD7UC4-B2M8wU-E.js → chunk-FMBD7UC4-fw4fjyOD.js} +1 -1
  16. package/dist/public/assets/{chunk-QN33PNHL-ZWjnlJD9.js → chunk-QN33PNHL-ekuWea8u.js} +1 -1
  17. package/dist/public/assets/{chunk-QZHKN3VN-CB-E8xvs.js → chunk-QZHKN3VN-BSGUw7ld.js} +1 -1
  18. package/dist/public/assets/{chunk-TZMSLE5B-C7K7-xdt.js → chunk-TZMSLE5B-50g1JKhR.js} +1 -1
  19. package/dist/public/assets/classDiagram-2ON5EDUG-BMkQAOMr.js +1 -0
  20. package/dist/public/assets/classDiagram-v2-WZHVMYZB-BMkQAOMr.js +1 -0
  21. package/dist/public/assets/clone-Bx37Q1vf.js +1 -0
  22. package/dist/public/assets/{code-block-IT6T5CEO-oEJfzIXW.js → code-block-IT6T5CEO-EDiF0GqI.js} +1 -1
  23. package/dist/public/assets/{cose-bilkent-S5V4N54A-Byu8718_.js → cose-bilkent-S5V4N54A-CvgE8W2M.js} +1 -1
  24. package/dist/public/assets/{dagre-6UL2VRFP-C2C-oI3k.js → dagre-6UL2VRFP-DvyJ7HR7.js} +1 -1
  25. package/dist/public/assets/{diagram-PSM6KHXK-Bc_wpePT.js → diagram-PSM6KHXK-Cc83AcOz.js} +1 -1
  26. package/dist/public/assets/{diagram-QEK2KX5R-R_dh2lcc.js → diagram-QEK2KX5R-CU46ARD8.js} +1 -1
  27. package/dist/public/assets/{diagram-S2PKOQOG-CtO72gsq.js → diagram-S2PKOQOG-efhSiP_M.js} +1 -1
  28. package/{public/assets/erDiagram-Q2GNP2WA-NyJ20Tcw.js → dist/public/assets/erDiagram-Q2GNP2WA-B58mIFpU.js} +1 -1
  29. package/{public/assets/flowDiagram-NV44I4VS-Cd0USqQr.js → dist/public/assets/flowDiagram-NV44I4VS-1v9cp2YJ.js} +1 -1
  30. package/dist/public/assets/{ganttDiagram-JELNMOA3-CAanRDED.js → ganttDiagram-JELNMOA3-BcTkV6Gr.js} +1 -1
  31. package/dist/public/assets/{gitGraphDiagram-NY62KEGX-Cfsu6ghS.js → gitGraphDiagram-NY62KEGX-93GAGqcU.js} +1 -1
  32. package/dist/public/assets/{graph-QKFq9c4B.js → graph-6Tw3vSP1.js} +1 -1
  33. package/dist/public/assets/{index-CnzhCX95.js → index-DCoOU4Bo.js} +136 -136
  34. package/dist/public/assets/index-DX0UZrUM.css +1 -0
  35. package/dist/public/assets/index-N3b5RkIr.js +23 -0
  36. package/dist/public/assets/{infoDiagram-WHAUD3N6-Dj8jXmxi.js → infoDiagram-WHAUD3N6-C63G3GM1.js} +1 -1
  37. package/dist/public/assets/{journeyDiagram-XKPGCS4Q-CPgbzNru.js → journeyDiagram-XKPGCS4Q-COsqyKDn.js} +1 -1
  38. package/{public/assets/kanban-definition-3W4ZIXB7-WJ4DpsDz.js → dist/public/assets/kanban-definition-3W4ZIXB7-D8vQWdGC.js} +1 -1
  39. package/dist/public/assets/{layout-CYzA-TWJ.js → layout-DRyEo8lq.js} +1 -1
  40. package/dist/public/assets/{linear--TKGjpXE.js → linear-z45OTqjs.js} +1 -1
  41. package/dist/public/assets/{mermaid.core-Cf8Vm-zi.js → mermaid.core-BNfYzVuV.js} +5 -5
  42. package/dist/public/assets/{min-TcvkLLDD.js → min-CmiDBzIz.js} +1 -1
  43. package/dist/public/assets/{mindmap-definition-VGOIOE7T-Cn1Dyi7A.js → mindmap-definition-VGOIOE7T-DYRthb2s.js} +1 -1
  44. package/dist/public/assets/{pieDiagram-ADFJNKIX-D62bbfWm.js → pieDiagram-ADFJNKIX-Si1xn4yd.js} +1 -1
  45. package/{public/assets/quadrantDiagram-AYHSOK5B-8_KQ7LcH.js → dist/public/assets/quadrantDiagram-AYHSOK5B-BNniOxQC.js} +1 -1
  46. package/dist/public/assets/{requirementDiagram-UZGBJVZJ-Cux_-KLZ.js → requirementDiagram-UZGBJVZJ-BhnRM_zJ.js} +1 -1
  47. package/{public/assets/sankeyDiagram-TZEHDZUN-SGGXtbp5.js → dist/public/assets/sankeyDiagram-TZEHDZUN-DUUi1FUF.js} +1 -1
  48. package/{public/assets/sequenceDiagram-WL72ISMW-BmSoaDsd.js → dist/public/assets/sequenceDiagram-WL72ISMW-ntc5_wIp.js} +1 -1
  49. package/{public/assets/stateDiagram-FKZM4ZOC-laPJWPGD.js → dist/public/assets/stateDiagram-FKZM4ZOC-BFkPTNKj.js} +1 -1
  50. package/dist/public/assets/stateDiagram-v2-4FDKWEC3-D4GG1k4J.js +1 -0
  51. package/{public/assets/timeline-definition-IT6M3QCI-DnEEd3PS.js → dist/public/assets/timeline-definition-IT6M3QCI-B3ytx-Fa.js} +1 -1
  52. package/dist/public/assets/{treemap-KMMF4GRG-CEr_nAYt.js → treemap-KMMF4GRG-BO2CInCE.js} +1 -1
  53. package/{public/assets/xychartDiagram-PRI3JC2R-BA6uWNes.js → dist/public/assets/xychartDiagram-PRI3JC2R-CZhdEbYY.js} +1 -1
  54. package/dist/public/index.html +2 -2
  55. package/package.json +1 -1
  56. package/public/assets/{_baseUniq-rFeuIcJP.js → _baseUniq-f4tIwaKc.js} +1 -1
  57. package/{dist/public/assets/arc-Ciq1-gt2.js → public/assets/arc-D1iSSrpp.js} +1 -1
  58. package/{dist/public/assets/architectureDiagram-VXUJARFQ-DQOTLTYJ.js → public/assets/architectureDiagram-VXUJARFQ-CHdfmBcb.js} +1 -1
  59. package/{dist/public/assets/blockDiagram-VD42YOAC-DrkXLslH.js → public/assets/blockDiagram-VD42YOAC-CDILmMuo.js} +1 -1
  60. package/public/assets/{c4Diagram-YG6GDRKO-CGep4UQM.js → c4Diagram-YG6GDRKO-Dydypk5A.js} +1 -1
  61. package/public/assets/channel-D1aQ_UAD.js +1 -0
  62. package/public/assets/{chunk-4BX2VUAB-DXU1pWcl.js → chunk-4BX2VUAB-pytRVvgb.js} +1 -1
  63. package/public/assets/{chunk-55IACEB6-Bx-cpVYk.js → chunk-55IACEB6-mTx67dww.js} +1 -1
  64. package/{dist/public/assets/chunk-B4BG7PRW-DN5-a04I.js → public/assets/chunk-B4BG7PRW-DIs9ZsPT.js} +1 -1
  65. package/{dist/public/assets/chunk-DI55MBZ5-CO01g9LM.js → public/assets/chunk-DI55MBZ5-CwCAlT8Y.js} +1 -1
  66. package/public/assets/{chunk-FMBD7UC4-B2M8wU-E.js → chunk-FMBD7UC4-fw4fjyOD.js} +1 -1
  67. package/public/assets/{chunk-QN33PNHL-ZWjnlJD9.js → chunk-QN33PNHL-ekuWea8u.js} +1 -1
  68. package/public/assets/{chunk-QZHKN3VN-CB-E8xvs.js → chunk-QZHKN3VN-BSGUw7ld.js} +1 -1
  69. package/public/assets/{chunk-TZMSLE5B-C7K7-xdt.js → chunk-TZMSLE5B-50g1JKhR.js} +1 -1
  70. package/public/assets/classDiagram-2ON5EDUG-BMkQAOMr.js +1 -0
  71. package/public/assets/classDiagram-v2-WZHVMYZB-BMkQAOMr.js +1 -0
  72. package/public/assets/clone-Bx37Q1vf.js +1 -0
  73. package/public/assets/{code-block-IT6T5CEO-oEJfzIXW.js → code-block-IT6T5CEO-EDiF0GqI.js} +1 -1
  74. package/public/assets/{cose-bilkent-S5V4N54A-Byu8718_.js → cose-bilkent-S5V4N54A-CvgE8W2M.js} +1 -1
  75. package/public/assets/{dagre-6UL2VRFP-C2C-oI3k.js → dagre-6UL2VRFP-DvyJ7HR7.js} +1 -1
  76. package/public/assets/{diagram-PSM6KHXK-Bc_wpePT.js → diagram-PSM6KHXK-Cc83AcOz.js} +1 -1
  77. package/public/assets/{diagram-QEK2KX5R-R_dh2lcc.js → diagram-QEK2KX5R-CU46ARD8.js} +1 -1
  78. package/public/assets/{diagram-S2PKOQOG-CtO72gsq.js → diagram-S2PKOQOG-efhSiP_M.js} +1 -1
  79. package/{dist/public/assets/erDiagram-Q2GNP2WA-NyJ20Tcw.js → public/assets/erDiagram-Q2GNP2WA-B58mIFpU.js} +1 -1
  80. package/{dist/public/assets/flowDiagram-NV44I4VS-Cd0USqQr.js → public/assets/flowDiagram-NV44I4VS-1v9cp2YJ.js} +1 -1
  81. package/public/assets/{ganttDiagram-JELNMOA3-CAanRDED.js → ganttDiagram-JELNMOA3-BcTkV6Gr.js} +1 -1
  82. package/public/assets/{gitGraphDiagram-NY62KEGX-Cfsu6ghS.js → gitGraphDiagram-NY62KEGX-93GAGqcU.js} +1 -1
  83. package/public/assets/{graph-QKFq9c4B.js → graph-6Tw3vSP1.js} +1 -1
  84. package/public/assets/{index-CnzhCX95.js → index-DCoOU4Bo.js} +136 -136
  85. package/public/assets/index-DX0UZrUM.css +1 -0
  86. package/public/assets/index-N3b5RkIr.js +23 -0
  87. package/public/assets/{infoDiagram-WHAUD3N6-Dj8jXmxi.js → infoDiagram-WHAUD3N6-C63G3GM1.js} +1 -1
  88. package/public/assets/{journeyDiagram-XKPGCS4Q-CPgbzNru.js → journeyDiagram-XKPGCS4Q-COsqyKDn.js} +1 -1
  89. package/{dist/public/assets/kanban-definition-3W4ZIXB7-WJ4DpsDz.js → public/assets/kanban-definition-3W4ZIXB7-D8vQWdGC.js} +1 -1
  90. package/public/assets/{layout-CYzA-TWJ.js → layout-DRyEo8lq.js} +1 -1
  91. package/public/assets/{linear--TKGjpXE.js → linear-z45OTqjs.js} +1 -1
  92. package/public/assets/{mermaid.core-Cf8Vm-zi.js → mermaid.core-BNfYzVuV.js} +5 -5
  93. package/public/assets/{min-TcvkLLDD.js → min-CmiDBzIz.js} +1 -1
  94. package/public/assets/{mindmap-definition-VGOIOE7T-Cn1Dyi7A.js → mindmap-definition-VGOIOE7T-DYRthb2s.js} +1 -1
  95. package/public/assets/{pieDiagram-ADFJNKIX-D62bbfWm.js → pieDiagram-ADFJNKIX-Si1xn4yd.js} +1 -1
  96. package/{dist/public/assets/quadrantDiagram-AYHSOK5B-8_KQ7LcH.js → public/assets/quadrantDiagram-AYHSOK5B-BNniOxQC.js} +1 -1
  97. package/public/assets/{requirementDiagram-UZGBJVZJ-Cux_-KLZ.js → requirementDiagram-UZGBJVZJ-BhnRM_zJ.js} +1 -1
  98. package/{dist/public/assets/sankeyDiagram-TZEHDZUN-SGGXtbp5.js → public/assets/sankeyDiagram-TZEHDZUN-DUUi1FUF.js} +1 -1
  99. package/{dist/public/assets/sequenceDiagram-WL72ISMW-BmSoaDsd.js → public/assets/sequenceDiagram-WL72ISMW-ntc5_wIp.js} +1 -1
  100. package/{dist/public/assets/stateDiagram-FKZM4ZOC-laPJWPGD.js → public/assets/stateDiagram-FKZM4ZOC-BFkPTNKj.js} +1 -1
  101. package/public/assets/stateDiagram-v2-4FDKWEC3-D4GG1k4J.js +1 -0
  102. package/{dist/public/assets/timeline-definition-IT6M3QCI-DnEEd3PS.js → public/assets/timeline-definition-IT6M3QCI-B3ytx-Fa.js} +1 -1
  103. package/public/assets/{treemap-KMMF4GRG-CEr_nAYt.js → treemap-KMMF4GRG-BO2CInCE.js} +1 -1
  104. package/{dist/public/assets/xychartDiagram-PRI3JC2R-BA6uWNes.js → public/assets/xychartDiagram-PRI3JC2R-CZhdEbYY.js} +1 -1
  105. package/public/index.html +2 -2
  106. package/dist/public/assets/channel-EWtlBi79.js +0 -1
  107. package/dist/public/assets/classDiagram-2ON5EDUG-Bhl8gu7O.js +0 -1
  108. package/dist/public/assets/classDiagram-v2-WZHVMYZB-Bhl8gu7O.js +0 -1
  109. package/dist/public/assets/clone-DGIXUqRz.js +0 -1
  110. package/dist/public/assets/index-BVgUdnkK.js +0 -23
  111. package/dist/public/assets/index-DAuITrPV.css +0 -1
  112. package/dist/public/assets/stateDiagram-v2-4FDKWEC3-uyrwe5Bi.js +0 -1
  113. package/public/assets/channel-EWtlBi79.js +0 -1
  114. package/public/assets/classDiagram-2ON5EDUG-Bhl8gu7O.js +0 -1
  115. package/public/assets/classDiagram-v2-WZHVMYZB-Bhl8gu7O.js +0 -1
  116. package/public/assets/clone-DGIXUqRz.js +0 -1
  117. package/public/assets/index-BVgUdnkK.js +0 -23
  118. package/public/assets/index-DAuITrPV.css +0 -1
  119. package/public/assets/stateDiagram-v2-4FDKWEC3-uyrwe5Bi.js +0 -1
package/dist/index.js CHANGED
@@ -105,6 +105,8 @@ var panes = sqliteTable("panes", {
105
105
  eventStream: text("event_stream", { mode: "json" }).$type(),
106
106
  /** Renderer ID (e.g., 'builtin:terminal', 'project:custom-viewer'). Null = use default. */
107
107
  rendererId: text("renderer_id"),
108
+ /** Pane state - initialized from initOptions, can be updated by renderers. */
109
+ state: text("state", { mode: "json" }).$type(),
108
110
  createdAt: integer("created_at", { mode: "timestamp_ms" }).notNull().default(sql`(unixepoch() * 1000)`)
109
111
  });
110
112
  var uiState = sqliteTable("ui_state", {
@@ -159,6 +161,7 @@ sqlite.exec(`
159
161
  content TEXT,
160
162
  event_stream TEXT,
161
163
  renderer_id TEXT,
164
+ state TEXT,
162
165
  created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
163
166
  );
164
167
 
@@ -201,6 +204,16 @@ try {
201
204
  }
202
205
  } catch (e) {
203
206
  }
207
+ try {
208
+ const tableInfo = sqlite.prepare(`PRAGMA table_info(panes)`).all();
209
+ const hasStateColumn = tableInfo.some((col) => col.name === "state");
210
+ if (!hasStateColumn) {
211
+ console.log("[db] Adding state column to panes...");
212
+ sqlite.exec(`ALTER TABLE panes ADD COLUMN state TEXT`);
213
+ console.log("[db] state column migration complete");
214
+ }
215
+ } catch (e) {
216
+ }
204
217
 
205
218
  // src/lib/configDiscovery.ts
206
219
  import { execSync } from "child_process";
@@ -671,18 +684,9 @@ async function listFilesFuzzy(workingDir, query, limit) {
671
684
 
672
685
  // src/amuxBridge.ts
673
686
  import { muxManager as muxManager2 } from "@bytespell/amux/streams/manager";
674
- import { isAcpEvent } from "@bytespell/amux/types";
675
687
  function getStreamStorageDir(streamId) {
676
688
  return path5.join(getDataDir(), "streams", streamId);
677
689
  }
678
- function generateTitleFromMessage(message) {
679
- const cleaned = message.replace(/@[\w./~-]+/g, "").replace(/\s+/g, " ").trim();
680
- const firstLine = cleaned.split("\n")[0] || cleaned;
681
- if (firstLine.length <= 50) return firstLine;
682
- const truncated = firstLine.slice(0, 50);
683
- const lastSpace = truncated.lastIndexOf(" ");
684
- return lastSpace > 20 ? truncated.slice(0, lastSpace) + "..." : truncated + "...";
685
- }
686
690
  function createAmuxBridge() {
687
691
  const bridge = {
688
692
  async getStreams(ids) {
@@ -713,15 +717,15 @@ function createAmuxBridge() {
713
717
  const id = params.id ?? randomUUID2();
714
718
  const now = /* @__PURE__ */ new Date();
715
719
  const config = db.select().from(streamConfigs).where(eq2(streamConfigs.id, configId)).get();
716
- const streamType = config?.driverType === "pty" ? "pty" : "acp";
717
- const initialTitle = streamType === "pty" ? params.directory.split("/").pop() || null : null;
720
+ const driver = config ? muxManager2.getDriver(config.driverType) : null;
721
+ const streamType = driver?.streamType ?? config?.driverType ?? "acp";
718
722
  db.insert(streams).values({
719
723
  id,
720
724
  directory: params.directory,
721
725
  streamConfigId: configId,
722
726
  streamType,
723
727
  driverState: null,
724
- title: initialTitle,
728
+ title: null,
725
729
  model: null,
726
730
  mode: null,
727
731
  createdAt: now
@@ -740,7 +744,14 @@ function createAmuxBridge() {
740
744
  db.delete(streams).where(eq2(streams.id, id)).run();
741
745
  },
742
746
  async getStreamConfigs() {
743
- return db.select().from(streamConfigs).all();
747
+ const configs = db.select().from(streamConfigs).all();
748
+ return configs.map((config) => {
749
+ const driver = muxManager2.getDriver(config.driverType);
750
+ return {
751
+ ...config,
752
+ streamType: driver?.streamType ?? config.driverType
753
+ };
754
+ });
744
755
  },
745
756
  async startStream(streamId) {
746
757
  const dbStream = db.select().from(streams).where(eq2(streams.id, streamId)).get();
@@ -748,13 +759,7 @@ function createAmuxBridge() {
748
759
  const dbConfig = db.select().from(streamConfigs).where(eq2(streamConfigs.id, dbStream.streamConfigId)).get();
749
760
  if (!dbConfig) throw new Error(`Stream config ${dbStream.streamConfigId} not found`);
750
761
  const storageDir = getStreamStorageDir(streamId);
751
- const emit = (event) => {
752
- if (isAcpEvent(event) && event.sessionUpdate === "session_info_update") {
753
- const title = event.title;
754
- if (title !== void 0) {
755
- db.update(streams).set({ title }).where(eq2(streams.id, streamId)).run();
756
- }
757
- }
762
+ const emit = (_event) => {
758
763
  };
759
764
  const handle = await muxManager2.startStream({
760
765
  streamId,
@@ -794,14 +799,6 @@ function createAmuxBridge() {
794
799
  await muxManager2.stopForStream(streamId);
795
800
  },
796
801
  async input(streamId, message) {
797
- const stream = db.select().from(streams).where(eq2(streams.id, streamId)).get();
798
- if (!stream) throw new Error(`Stream ${streamId} not found`);
799
- if (!stream.title) {
800
- const title = generateTitleFromMessage(message);
801
- if (title) {
802
- db.update(streams).set({ title }).where(eq2(streams.id, streamId)).run();
803
- }
804
- }
805
802
  await muxManager2.input(streamId, message);
806
803
  },
807
804
  async cancel(streamId) {
@@ -974,12 +971,11 @@ var amux;
974
971
  function setAmuxBridge(bridge) {
975
972
  amux = bridge;
976
973
  }
977
- function generateTitle(existingCount, directory) {
978
- const dirName = directory.split("/").pop();
979
- if (dirName && dirName !== "~" && dirName !== "") {
980
- return dirName;
981
- }
982
- return `Window ${existingCount + 1}`;
974
+ function getNextWindowNumber() {
975
+ const row = db.select().from(uiState).where(eq3(uiState.key, "window_counter")).get();
976
+ const next = (row ? parseInt(row.value, 10) : 0) + 1;
977
+ db.insert(uiState).values({ key: "window_counter", value: String(next) }).onConflictDoUpdate({ target: uiState.key, set: { value: String(next) } }).run();
978
+ return next;
983
979
  }
984
980
  var windowsRouter = router({
985
981
  /**
@@ -1053,11 +1049,10 @@ var windowsRouter = router({
1053
1049
  }
1054
1050
  const windowId = input.id ?? randomUUID3();
1055
1051
  const paneId = randomUUID3();
1056
- const existingCount = db.select().from(windows).all().length;
1057
1052
  const layout = createLeaf(paneId);
1058
1053
  db.insert(windows).values({
1059
1054
  id: windowId,
1060
- title: input.title || generateTitle(existingCount, directory),
1055
+ title: input.title || String(getNextWindowNumber()),
1061
1056
  hasCustomTitle: !!input.title,
1062
1057
  layout,
1063
1058
  activePaneId: paneId
@@ -1324,6 +1319,8 @@ var layoutRouter = router({
1324
1319
  streamConfigId: z2.string(),
1325
1320
  directory: z2.string().optional(),
1326
1321
  rendererId: z2.string().optional(),
1322
+ /** All initOptions from the form - stored as pane state */
1323
+ initOptions: z2.record(z2.string()).optional(),
1327
1324
  // Legacy alias
1328
1325
  agentConfigId: z2.string().optional()
1329
1326
  })).mutation(async ({ input }) => {
@@ -1343,7 +1340,8 @@ var layoutRouter = router({
1343
1340
  const eventStream = { type: stream.streamType, streamId: stream.id };
1344
1341
  db.update(panes).set({
1345
1342
  eventStream,
1346
- rendererId: input.rendererId ?? null
1343
+ rendererId: input.rendererId ?? null,
1344
+ state: input.initOptions ?? null
1347
1345
  }).where(eq4(panes.id, input.paneId)).run();
1348
1346
  await amux2.startStream(stream.id);
1349
1347
  return {
@@ -1370,6 +1368,20 @@ var layoutRouter = router({
1370
1368
  createdAt: stream.createdAt.toISOString()
1371
1369
  }
1372
1370
  };
1371
+ }),
1372
+ /**
1373
+ * Update pane state. Renderers can call this to update state during the pane lifecycle.
1374
+ */
1375
+ updatePaneState: publicProcedure.input(z2.object({
1376
+ paneId: z2.string(),
1377
+ state: z2.record(z2.string())
1378
+ })).mutation(async ({ input }) => {
1379
+ const pane = db.select().from(panes).where(eq4(panes.id, input.paneId)).get();
1380
+ if (!pane) {
1381
+ throw new Error(`Pane ${input.paneId} not found`);
1382
+ }
1383
+ db.update(panes).set({ state: input.state }).where(eq4(panes.id, input.paneId)).run();
1384
+ return { ok: true };
1373
1385
  })
1374
1386
  });
1375
1387