@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/bin/cli.js CHANGED
@@ -112,6 +112,8 @@ var panes = sqliteTable("panes", {
112
112
  eventStream: text("event_stream", { mode: "json" }).$type(),
113
113
  /** Renderer ID (e.g., 'builtin:terminal', 'project:custom-viewer'). Null = use default. */
114
114
  rendererId: text("renderer_id"),
115
+ /** Pane state - initialized from initOptions, can be updated by renderers. */
116
+ state: text("state", { mode: "json" }).$type(),
115
117
  createdAt: integer("created_at", { mode: "timestamp_ms" }).notNull().default(sql`(unixepoch() * 1000)`)
116
118
  });
117
119
  var uiState = sqliteTable("ui_state", {
@@ -166,6 +168,7 @@ sqlite.exec(`
166
168
  content TEXT,
167
169
  event_stream TEXT,
168
170
  renderer_id TEXT,
171
+ state TEXT,
169
172
  created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
170
173
  );
171
174
 
@@ -208,6 +211,16 @@ try {
208
211
  }
209
212
  } catch (e) {
210
213
  }
214
+ try {
215
+ const tableInfo = sqlite.prepare(`PRAGMA table_info(panes)`).all();
216
+ const hasStateColumn = tableInfo.some((col) => col.name === "state");
217
+ if (!hasStateColumn) {
218
+ console.log("[db] Adding state column to panes...");
219
+ sqlite.exec(`ALTER TABLE panes ADD COLUMN state TEXT`);
220
+ console.log("[db] state column migration complete");
221
+ }
222
+ } catch (e) {
223
+ }
211
224
 
212
225
  // src/lib/configDiscovery.ts
213
226
  import { execSync } from "child_process";
@@ -678,18 +691,9 @@ async function listFilesFuzzy(workingDir, query, limit) {
678
691
 
679
692
  // src/amuxBridge.ts
680
693
  import { muxManager as muxManager2 } from "@bytespell/amux/streams/manager";
681
- import { isAcpEvent } from "@bytespell/amux/types";
682
694
  function getStreamStorageDir(streamId) {
683
695
  return path5.join(getDataDir(), "streams", streamId);
684
696
  }
685
- function generateTitleFromMessage(message) {
686
- const cleaned = message.replace(/@[\w./~-]+/g, "").replace(/\s+/g, " ").trim();
687
- const firstLine = cleaned.split("\n")[0] || cleaned;
688
- if (firstLine.length <= 50) return firstLine;
689
- const truncated = firstLine.slice(0, 50);
690
- const lastSpace = truncated.lastIndexOf(" ");
691
- return lastSpace > 20 ? truncated.slice(0, lastSpace) + "..." : truncated + "...";
692
- }
693
697
  function createAmuxBridge() {
694
698
  const bridge = {
695
699
  async getStreams(ids) {
@@ -720,15 +724,15 @@ function createAmuxBridge() {
720
724
  const id = params.id ?? randomUUID2();
721
725
  const now = /* @__PURE__ */ new Date();
722
726
  const config = db.select().from(streamConfigs).where(eq2(streamConfigs.id, configId)).get();
723
- const streamType = config?.driverType === "pty" ? "pty" : "acp";
724
- const initialTitle = streamType === "pty" ? params.directory.split("/").pop() || null : null;
727
+ const driver = config ? muxManager2.getDriver(config.driverType) : null;
728
+ const streamType = driver?.streamType ?? config?.driverType ?? "acp";
725
729
  db.insert(streams).values({
726
730
  id,
727
731
  directory: params.directory,
728
732
  streamConfigId: configId,
729
733
  streamType,
730
734
  driverState: null,
731
- title: initialTitle,
735
+ title: null,
732
736
  model: null,
733
737
  mode: null,
734
738
  createdAt: now
@@ -747,7 +751,14 @@ function createAmuxBridge() {
747
751
  db.delete(streams).where(eq2(streams.id, id)).run();
748
752
  },
749
753
  async getStreamConfigs() {
750
- return db.select().from(streamConfigs).all();
754
+ const configs = db.select().from(streamConfigs).all();
755
+ return configs.map((config) => {
756
+ const driver = muxManager2.getDriver(config.driverType);
757
+ return {
758
+ ...config,
759
+ streamType: driver?.streamType ?? config.driverType
760
+ };
761
+ });
751
762
  },
752
763
  async startStream(streamId) {
753
764
  const dbStream = db.select().from(streams).where(eq2(streams.id, streamId)).get();
@@ -755,13 +766,7 @@ function createAmuxBridge() {
755
766
  const dbConfig = db.select().from(streamConfigs).where(eq2(streamConfigs.id, dbStream.streamConfigId)).get();
756
767
  if (!dbConfig) throw new Error(`Stream config ${dbStream.streamConfigId} not found`);
757
768
  const storageDir = getStreamStorageDir(streamId);
758
- const emit = (event) => {
759
- if (isAcpEvent(event) && event.sessionUpdate === "session_info_update") {
760
- const title = event.title;
761
- if (title !== void 0) {
762
- db.update(streams).set({ title }).where(eq2(streams.id, streamId)).run();
763
- }
764
- }
769
+ const emit = (_event) => {
765
770
  };
766
771
  const handle = await muxManager2.startStream({
767
772
  streamId,
@@ -801,14 +806,6 @@ function createAmuxBridge() {
801
806
  await muxManager2.stopForStream(streamId);
802
807
  },
803
808
  async input(streamId, message) {
804
- const stream = db.select().from(streams).where(eq2(streams.id, streamId)).get();
805
- if (!stream) throw new Error(`Stream ${streamId} not found`);
806
- if (!stream.title) {
807
- const title = generateTitleFromMessage(message);
808
- if (title) {
809
- db.update(streams).set({ title }).where(eq2(streams.id, streamId)).run();
810
- }
811
- }
812
809
  await muxManager2.input(streamId, message);
813
810
  },
814
811
  async cancel(streamId) {
@@ -981,12 +978,11 @@ var amux;
981
978
  function setAmuxBridge(bridge) {
982
979
  amux = bridge;
983
980
  }
984
- function generateTitle(existingCount, directory) {
985
- const dirName = directory.split("/").pop();
986
- if (dirName && dirName !== "~" && dirName !== "") {
987
- return dirName;
988
- }
989
- return `Window ${existingCount + 1}`;
981
+ function getNextWindowNumber() {
982
+ const row = db.select().from(uiState).where(eq3(uiState.key, "window_counter")).get();
983
+ const next = (row ? parseInt(row.value, 10) : 0) + 1;
984
+ db.insert(uiState).values({ key: "window_counter", value: String(next) }).onConflictDoUpdate({ target: uiState.key, set: { value: String(next) } }).run();
985
+ return next;
990
986
  }
991
987
  var windowsRouter = router({
992
988
  /**
@@ -1060,11 +1056,10 @@ var windowsRouter = router({
1060
1056
  }
1061
1057
  const windowId = input.id ?? randomUUID3();
1062
1058
  const paneId = randomUUID3();
1063
- const existingCount = db.select().from(windows).all().length;
1064
1059
  const layout = createLeaf(paneId);
1065
1060
  db.insert(windows).values({
1066
1061
  id: windowId,
1067
- title: input.title || generateTitle(existingCount, directory),
1062
+ title: input.title || String(getNextWindowNumber()),
1068
1063
  hasCustomTitle: !!input.title,
1069
1064
  layout,
1070
1065
  activePaneId: paneId
@@ -1331,6 +1326,8 @@ var layoutRouter = router({
1331
1326
  streamConfigId: z2.string(),
1332
1327
  directory: z2.string().optional(),
1333
1328
  rendererId: z2.string().optional(),
1329
+ /** All initOptions from the form - stored as pane state */
1330
+ initOptions: z2.record(z2.string()).optional(),
1334
1331
  // Legacy alias
1335
1332
  agentConfigId: z2.string().optional()
1336
1333
  })).mutation(async ({ input }) => {
@@ -1350,7 +1347,8 @@ var layoutRouter = router({
1350
1347
  const eventStream = { type: stream.streamType, streamId: stream.id };
1351
1348
  db.update(panes).set({
1352
1349
  eventStream,
1353
- rendererId: input.rendererId ?? null
1350
+ rendererId: input.rendererId ?? null,
1351
+ state: input.initOptions ?? null
1354
1352
  }).where(eq4(panes.id, input.paneId)).run();
1355
1353
  await amux2.startStream(stream.id);
1356
1354
  return {
@@ -1377,6 +1375,20 @@ var layoutRouter = router({
1377
1375
  createdAt: stream.createdAt.toISOString()
1378
1376
  }
1379
1377
  };
1378
+ }),
1379
+ /**
1380
+ * Update pane state. Renderers can call this to update state during the pane lifecycle.
1381
+ */
1382
+ updatePaneState: publicProcedure.input(z2.object({
1383
+ paneId: z2.string(),
1384
+ state: z2.record(z2.string())
1385
+ })).mutation(async ({ input }) => {
1386
+ const pane = db.select().from(panes).where(eq4(panes.id, input.paneId)).get();
1387
+ if (!pane) {
1388
+ throw new Error(`Pane ${input.paneId} not found`);
1389
+ }
1390
+ db.update(panes).set({ state: input.state }).where(eq4(panes.id, input.paneId)).run();
1391
+ return { ok: true };
1380
1392
  })
1381
1393
  });
1382
1394