@hienlh/ppm 0.13.49 → 0.13.51

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 (133) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/assets/skills/ppm/SKILL.md +1 -1
  3. package/assets/skills/ppm/references/http-api.md +1 -1
  4. package/dist/web/assets/ai-settings-section-AuV6Lzz2.js +1 -2
  5. package/dist/web/assets/api-client-DIhJ5qVW.js +1 -2
  6. package/dist/web/assets/api-settings-C3T95dWg.js +1 -2
  7. package/dist/web/assets/arrow-up-Rcw6_KKu.js +1 -2
  8. package/dist/web/assets/{audio-preview-CQ-l5P8I.js → audio-preview-BQWWkcm0.js} +1 -2
  9. package/dist/web/assets/{chat-tab-DbuBr2ax.js → chat-tab-B-QMa-uT.js} +5 -6
  10. package/dist/web/assets/chevron-right-DnHIvvcy.js +1 -2
  11. package/dist/web/assets/code-DGBecc50.js +1 -2
  12. package/dist/web/assets/{code-editor-DEa0t62y.js → code-editor-DChspYxh.js} +3 -4
  13. package/dist/web/assets/{conflict-editor-D5H9urYy.js → conflict-editor-C1dZ8tsU.js} +2 -3
  14. package/dist/web/assets/createLucideIcon-BjHrJDVb.js +1 -2
  15. package/dist/web/assets/csv-parser-Dly5nqE1.js +1 -2
  16. package/dist/web/assets/csv-preview-B3Dyhgho.js +1 -2
  17. package/dist/web/assets/data-grid-overlay-editor-C1UUm7Ob.js +1 -2
  18. package/dist/web/assets/data-grid-types-D2cHE8hx.js +1 -2
  19. package/dist/web/assets/database-DOWH9-Vv.js +1 -2
  20. package/dist/web/assets/{database-viewer-CW60ytCl.js → database-viewer-2KW73oEG.js} +1 -2
  21. package/dist/web/assets/{diff-viewer-BfatMgWw.js → diff-viewer-BMla30lw.js} +2 -3
  22. package/dist/web/assets/dist-BoIkGNC8.js +1 -2
  23. package/dist/web/assets/dist-DVk8T0R5.js +1 -2
  24. package/dist/web/assets/esm-DCbn6xno.js +1 -2
  25. package/dist/web/assets/{extension-webview-DKSDoW_g.js → extension-webview-DpaCcCXq.js} +2 -3
  26. package/dist/web/assets/file-exclamation-point-BwzaQ50n.js +1 -2
  27. package/dist/web/assets/file-store-DOxcU_7s.js +1 -2
  28. package/dist/web/assets/{glide-data-grid-Bx48618B.js → glide-data-grid-D08bJMrD.js} +2 -3
  29. package/dist/web/assets/globe-B4Ilypbs.js +1 -2
  30. package/dist/web/assets/{image-preview-ClY2xl1B.js → image-preview-DVQkHkSo.js} +1 -2
  31. package/dist/web/assets/{index-DkQ6jVSH.js → index-U7GK_3ED.js} +4 -5
  32. package/dist/web/assets/input-_LFQwhzd.js +1 -2
  33. package/dist/web/assets/katex-C10ndCVt.js +1 -2
  34. package/dist/web/assets/keybindings-store-B9gpby19.js +1 -0
  35. package/dist/web/assets/lib-C2D8j3K3.js +1 -2
  36. package/dist/web/assets/{markdown-renderer-BmMmo0F-.js → markdown-renderer-B4_rx1aO.js} +2 -3
  37. package/dist/web/assets/notification-store-7WlicqzJ.js +1 -0
  38. package/dist/web/assets/number-overlay-editor-CyEqxXcg.js +1 -2
  39. package/dist/web/assets/{panel-store-Dy8-7E_g.js → panel-store-C8wwxBpn.js} +1 -2
  40. package/dist/web/assets/{pdf-preview-YylEP_Su.js → pdf-preview-D16LLBdq.js} +1 -2
  41. package/dist/web/assets/{port-forwarding-tab-COdo70kU.js → port-forwarding-tab-CoKoquJZ.js} +1 -2
  42. package/dist/web/assets/{postgres-viewer-3y9VshZZ.js → postgres-viewer-B45DfArf.js} +2 -3
  43. package/dist/web/assets/react-DMIOAtcX.js +1 -2
  44. package/dist/web/assets/refresh-cw-BjrAbUJe.js +1 -2
  45. package/dist/web/assets/scroll-area-BDi_FNzr.js +1 -2
  46. package/dist/web/assets/search-tM8K5zWU.js +1 -2
  47. package/dist/web/assets/settings-store-8FpQDjEA.js +1 -2
  48. package/dist/web/assets/{settings-tab-sYavdJk-.js → settings-tab-Dc8TBxJQ.js} +1 -1
  49. package/dist/web/assets/sparkles-CulWHe4c.js +1 -2
  50. package/dist/web/assets/{sql-query-editor-DlBYx1Ye.js → sql-query-editor-DMk0nmOO.js} +2 -3
  51. package/dist/web/assets/{sqlite-viewer-Bj8oPYho.js → sqlite-viewer-G81XimpL.js} +1 -2
  52. package/dist/web/assets/{tab-store-Dtg1_qL0.js → tab-store-CNas5Ny8.js} +1 -2
  53. package/dist/web/assets/table-BzjWcs87.js +1 -2
  54. package/dist/web/assets/{terminal-tab-B7ECmf95.js → terminal-tab-rslAfxoV.js} +2 -3
  55. package/dist/web/assets/text-wrap-DJz9Bgpa.js +1 -2
  56. package/dist/web/assets/use-blob-url-DB4nNruT.js +1 -2
  57. package/dist/web/assets/use-monaco-theme-DEI-tJAh.js +1 -2
  58. package/dist/web/assets/utils-CQux7CsO.js +1 -2
  59. package/dist/web/assets/vendor-markdown-0Mxgxy0L.js +1 -2
  60. package/dist/web/assets/vendor-mermaid-D2KKkqNs.js +1 -2
  61. package/dist/web/assets/vendor-ui-UXCWAcmi.js +1 -2
  62. package/dist/web/assets/vendor-xterm-D1P36hcr.js +1 -2
  63. package/dist/web/assets/{video-preview-CT78iZBo.js → video-preview-vjw8RpLK.js} +1 -2
  64. package/dist/web/assets/x-BPReZWnP.js +1 -2
  65. package/dist/web/index.html +3 -3
  66. package/dist/web/sw.js +1 -2
  67. package/package.json +1 -1
  68. package/src/web/components/chat/chat-tab.tsx +6 -4
  69. package/src/web/components/layout/tab-pool.tsx +1 -1
  70. package/src/web/hooks/use-chat.ts +7 -6
  71. package/src/web/stores/panel-store.ts +5 -0
  72. package/vite.config.ts +1 -1
  73. package/dist/web/assets/ai-settings-section-AuV6Lzz2.js.map +0 -1
  74. package/dist/web/assets/api-client-DIhJ5qVW.js.map +0 -1
  75. package/dist/web/assets/api-settings-C3T95dWg.js.map +0 -1
  76. package/dist/web/assets/arrow-up-Rcw6_KKu.js.map +0 -1
  77. package/dist/web/assets/audio-preview-CQ-l5P8I.js.map +0 -1
  78. package/dist/web/assets/chat-tab-DbuBr2ax.js.map +0 -1
  79. package/dist/web/assets/chevron-right-DnHIvvcy.js.map +0 -1
  80. package/dist/web/assets/code-DGBecc50.js.map +0 -1
  81. package/dist/web/assets/code-editor-DEa0t62y.js.map +0 -1
  82. package/dist/web/assets/conflict-editor-D5H9urYy.js.map +0 -1
  83. package/dist/web/assets/createLucideIcon-BjHrJDVb.js.map +0 -1
  84. package/dist/web/assets/csv-parser-Dly5nqE1.js.map +0 -1
  85. package/dist/web/assets/csv-preview-B3Dyhgho.js.map +0 -1
  86. package/dist/web/assets/data-grid-overlay-editor-C1UUm7Ob.js.map +0 -1
  87. package/dist/web/assets/data-grid-types-D2cHE8hx.js.map +0 -1
  88. package/dist/web/assets/database-DOWH9-Vv.js.map +0 -1
  89. package/dist/web/assets/database-viewer-CW60ytCl.js.map +0 -1
  90. package/dist/web/assets/diff-viewer-BfatMgWw.js.map +0 -1
  91. package/dist/web/assets/dist-BoIkGNC8.js.map +0 -1
  92. package/dist/web/assets/dist-DVk8T0R5.js.map +0 -1
  93. package/dist/web/assets/esm-DCbn6xno.js.map +0 -1
  94. package/dist/web/assets/extension-webview-DKSDoW_g.js.map +0 -1
  95. package/dist/web/assets/file-exclamation-point-BwzaQ50n.js.map +0 -1
  96. package/dist/web/assets/file-store-DOxcU_7s.js.map +0 -1
  97. package/dist/web/assets/glide-data-grid-Bx48618B.js.map +0 -1
  98. package/dist/web/assets/globe-B4Ilypbs.js.map +0 -1
  99. package/dist/web/assets/image-preview-ClY2xl1B.js.map +0 -1
  100. package/dist/web/assets/index-DkQ6jVSH.js.map +0 -1
  101. package/dist/web/assets/input-_LFQwhzd.js.map +0 -1
  102. package/dist/web/assets/katex-C10ndCVt.js.map +0 -1
  103. package/dist/web/assets/keybindings-store-DrAeg6Gw.js +0 -1
  104. package/dist/web/assets/lib-C2D8j3K3.js.map +0 -1
  105. package/dist/web/assets/markdown-renderer-BmMmo0F-.js.map +0 -1
  106. package/dist/web/assets/notification-store-Bukl8bKo.js +0 -1
  107. package/dist/web/assets/number-overlay-editor-CyEqxXcg.js.map +0 -1
  108. package/dist/web/assets/panel-store-Dy8-7E_g.js.map +0 -1
  109. package/dist/web/assets/pdf-preview-YylEP_Su.js.map +0 -1
  110. package/dist/web/assets/port-forwarding-tab-COdo70kU.js.map +0 -1
  111. package/dist/web/assets/postgres-viewer-3y9VshZZ.js.map +0 -1
  112. package/dist/web/assets/react-DMIOAtcX.js.map +0 -1
  113. package/dist/web/assets/refresh-cw-BjrAbUJe.js.map +0 -1
  114. package/dist/web/assets/scroll-area-BDi_FNzr.js.map +0 -1
  115. package/dist/web/assets/search-tM8K5zWU.js.map +0 -1
  116. package/dist/web/assets/settings-store-8FpQDjEA.js.map +0 -1
  117. package/dist/web/assets/sparkles-CulWHe4c.js.map +0 -1
  118. package/dist/web/assets/sql-query-editor-DlBYx1Ye.js.map +0 -1
  119. package/dist/web/assets/sqlite-viewer-Bj8oPYho.js.map +0 -1
  120. package/dist/web/assets/tab-store-Dtg1_qL0.js.map +0 -1
  121. package/dist/web/assets/table-BzjWcs87.js.map +0 -1
  122. package/dist/web/assets/terminal-tab-B7ECmf95.js.map +0 -1
  123. package/dist/web/assets/text-wrap-DJz9Bgpa.js.map +0 -1
  124. package/dist/web/assets/use-blob-url-DB4nNruT.js.map +0 -1
  125. package/dist/web/assets/use-monaco-theme-DEI-tJAh.js.map +0 -1
  126. package/dist/web/assets/utils-CQux7CsO.js.map +0 -1
  127. package/dist/web/assets/vendor-markdown-0Mxgxy0L.js.map +0 -1
  128. package/dist/web/assets/vendor-mermaid-D2KKkqNs.js.map +0 -1
  129. package/dist/web/assets/vendor-ui-UXCWAcmi.js.map +0 -1
  130. package/dist/web/assets/vendor-xterm-D1P36hcr.js.map +0 -1
  131. package/dist/web/assets/video-preview-CT78iZBo.js.map +0 -1
  132. package/dist/web/assets/x-BPReZWnP.js.map +0 -1
  133. package/dist/web/sw.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"sqlite-viewer-Bj8oPYho.js","names":[],"sources":["../../../src/web/components/sqlite/use-sqlite.ts","../../../src/web/components/sqlite/sqlite-table-list.tsx","../../../src/web/components/sqlite/sqlite-query-editor.tsx","../../../src/web/components/sqlite/sqlite-viewer.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { api, projectUrl } from \"@/lib/api-client\";\n\nexport interface TableInfo { name: string; rowCount: number }\nexport interface ColumnInfo { cid: number; name: string; type: string; notnull: boolean; pk: boolean; dflt_value: string | null; fk?: { table: string; column: string } | null }\nexport interface QueryResult { columns: string[]; rows: Record<string, unknown>[]; rowsAffected: number; changeType: \"select\" | \"modify\"; executionTimeMs?: number }\ninterface TableData { columns: string[]; rows: Record<string, unknown>[]; total: number; page: number; limit: number }\n\nexport function useSqlite(projectName: string, dbPath: string, connectionId?: number) {\n const [tables, setTables] = useState<TableInfo[]>([]);\n const [selectedTable, setSelectedTable] = useState<string | null>(null);\n const [tableData, setTableData] = useState<TableData | null>(null);\n const [schema, setSchema] = useState<ColumnInfo[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [page, setPage] = useState(1);\n const [queryResult, setQueryResult] = useState<QueryResult | null>(null);\n const [queryError, setQueryError] = useState<string | null>(null);\n const [queryLoading, setQueryLoading] = useState(false);\n\n // When connectionId present, use unified API; otherwise use project-scoped API\n const unifiedBase = connectionId ? `/api/db/connections/${connectionId}` : null;\n const base = unifiedBase ?? `${projectUrl(projectName)}/sqlite`;\n const qs = unifiedBase ? \"\" : `path=${encodeURIComponent(dbPath)}`;\n\n // Fetch tables on mount — use cache when connectionId (sidebar handles live sync)\n const fetchTables = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const qsPart = unifiedBase ? \"?cached=1\" : qs ? `?${qs}` : \"\";\n const data = await api.get<TableInfo[]>(`${base}/tables${qsPart}`);\n setTables(data);\n if (!unifiedBase && data.length > 0 && !selectedTable) setSelectedTable(data[0]!.name);\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n }, [base, qs, unifiedBase]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => { fetchTables(); }, [fetchTables]);\n\n // Fetch table data when selection or page changes\n const fetchTableData = useCallback(async () => {\n if (!selectedTable) return;\n setLoading(true);\n try {\n const qsPrefix = qs ? `${qs}&` : \"\";\n const [data, cols] = await Promise.all([\n api.get<TableData>(`${base}/data?${qsPrefix}table=${encodeURIComponent(selectedTable)}&page=${page}&limit=100`),\n api.get<ColumnInfo[]>(`${base}/schema?${qsPrefix}table=${encodeURIComponent(selectedTable)}`),\n ]);\n setTableData(data);\n setSchema(cols);\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n }, [base, qs, selectedTable, page]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => { fetchTableData(); }, [fetchTableData]);\n\n const selectTable = useCallback((name: string) => {\n setSelectedTable(name);\n setPage(1);\n setQueryResult(null);\n }, []);\n\n const executeQuery = useCallback(async (sql: string) => {\n setQueryLoading(true);\n setQueryError(null);\n try {\n const body = unifiedBase ? { sql } : { path: dbPath, sql };\n const result = await api.post<QueryResult>(`${base}/query`, body);\n setQueryResult(result);\n if (result.changeType === \"modify\") fetchTableData();\n } catch (e) {\n setQueryError((e as Error).message);\n } finally {\n setQueryLoading(false);\n }\n }, [base, unifiedBase, dbPath, fetchTableData]);\n\n const updateCell = useCallback(async (rowid: number, column: string, value: unknown) => {\n if (!selectedTable) return;\n try {\n if (unifiedBase) {\n await api.put(`${base}/cell`, { table: selectedTable, pkColumn: \"rowid\", pkValue: rowid, column, value });\n } else {\n await api.put(`${base}/cell`, { path: dbPath, table: selectedTable, rowid, column, value });\n }\n fetchTableData();\n } catch (e) {\n setError((e as Error).message);\n }\n }, [base, unifiedBase, dbPath, selectedTable, fetchTableData]);\n\n const deleteRow = useCallback(async (rowid: number) => {\n if (!selectedTable) return;\n try {\n if (unifiedBase) {\n await api.del(`${base}/row`, { table: selectedTable, pkColumn: \"rowid\", pkValue: rowid });\n } else {\n await api.del(`${base}/row`, { path: dbPath, table: selectedTable, rowid });\n }\n fetchTableData();\n fetchTables(); // refresh row counts\n } catch (e) {\n setError((e as Error).message);\n }\n }, [base, unifiedBase, dbPath, selectedTable, fetchTableData, fetchTables]);\n\n return {\n tables, selectedTable, selectTable, tableData, schema,\n loading, error, page, setPage,\n queryResult, queryError, queryLoading, executeQuery,\n updateCell, deleteRow, refreshTables: fetchTables, refreshData: fetchTableData,\n };\n}\n","import { Table, RefreshCw } from \"lucide-react\";\nimport type { TableInfo } from \"./use-sqlite\";\n\ninterface Props {\n tables: TableInfo[];\n selectedTable: string | null;\n onSelect: (name: string) => void;\n onRefresh: () => void;\n}\n\nexport function SqliteTableList({ tables, selectedTable, onSelect, onRefresh }: Props) {\n return (\n <div className=\"w-48 shrink-0 flex flex-col bg-background overflow-hidden\">\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border\">\n <span className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">Tables</span>\n <button\n type=\"button\"\n onClick={onRefresh}\n className=\"text-muted-foreground hover:text-foreground transition-colors\"\n title=\"Refresh tables\"\n >\n <RefreshCw className=\"size-3\" />\n </button>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {tables.map((t) => (\n <button\n key={t.name}\n type=\"button\"\n onClick={() => onSelect(t.name)}\n className={`w-full flex items-center gap-2 px-3 py-1.5 text-left text-xs transition-colors ${\n selectedTable === t.name\n ? \"bg-muted text-foreground\"\n : \"text-muted-foreground hover:bg-muted/50 hover:text-foreground\"\n }`}\n >\n <Table className=\"size-3 shrink-0\" />\n <span className=\"truncate flex-1\">{t.name}</span>\n <span className=\"text-[10px] opacity-60\">{t.rowCount}</span>\n </button>\n ))}\n {tables.length === 0 && (\n <p className=\"px-3 py-4 text-xs text-muted-foreground text-center\">No tables found</p>\n )}\n </div>\n </div>\n );\n}\n","import { SqlQueryEditor } from \"../database/sql-query-editor\";\n\ninterface Props {\n onExecute: (sql: string) => void;\n loading: boolean;\n}\n\nexport function SqliteQueryEditor({ onExecute, loading }: Props) {\n return <SqlQueryEditor onExecute={onExecute} loading={loading} />;\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Database, Loader2, AlertCircle } from \"lucide-react\";\nimport { useSqlite } from \"./use-sqlite\";\nimport { SqliteTableList } from \"./sqlite-table-list\";\nimport { GlideDataGrid } from \"../database/glide-data-grid\";\nimport { SqliteQueryEditor } from \"./sqlite-query-editor\";\n\ninterface SqliteViewerProps {\n metadata?: Record<string, unknown>;\n tabId?: string;\n}\n\nexport function SqliteViewer({ metadata }: SqliteViewerProps) {\n const filePath = metadata?.filePath as string | undefined;\n const projectName = metadata?.projectName as string | undefined;\n const connectionId = metadata?.connectionId as number | undefined;\n const initialTable = metadata?.tableName as string | undefined;\n const [queryPanelOpen, setQueryPanelOpen] = useState(false);\n\n // Connection-based mode: skip file selection requirement\n if (connectionId) {\n return (\n <SqliteViewerInner\n projectName=\"\"\n dbPath=\"\"\n connectionId={connectionId}\n connectionName={metadata?.connectionName as string | undefined}\n initialTable={initialTable}\n queryPanelOpen={queryPanelOpen}\n onToggleQueryPanel={() => setQueryPanelOpen((v) => !v)}\n hideTableList\n />\n );\n }\n\n if (!filePath || !projectName) {\n return (\n <div className=\"flex items-center justify-center h-full text-text-secondary text-sm\">\n <Database className=\"size-5 mr-2\" /> No database file selected.\n </div>\n );\n }\n\n return (\n <SqliteViewerInner\n projectName={projectName}\n dbPath={filePath}\n queryPanelOpen={queryPanelOpen}\n onToggleQueryPanel={() => setQueryPanelOpen((v) => !v)}\n />\n );\n}\n\nfunction SqliteViewerInner({\n projectName, dbPath, connectionId, connectionName, initialTable, queryPanelOpen, onToggleQueryPanel, hideTableList,\n}: {\n projectName: string; dbPath: string; connectionId?: number; connectionName?: string; initialTable?: string;\n queryPanelOpen: boolean; onToggleQueryPanel: () => void; hideTableList?: boolean;\n}) {\n const sqlite = useSqlite(projectName, dbPath, connectionId);\n\n // Jump to initial table from sidebar click\n const didInit = useRef(false);\n useEffect(() => {\n if (initialTable && !didInit.current && sqlite.tables.length > 0) {\n didInit.current = true;\n sqlite.selectTable(initialTable);\n }\n }, [initialTable, sqlite.tables]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (sqlite.error && sqlite.tables.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full gap-3 text-text-secondary\">\n <AlertCircle className=\"size-10 text-destructive\" />\n <p className=\"text-sm\">{sqlite.error}</p>\n </div>\n );\n }\n\n if (sqlite.loading && sqlite.tables.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-full gap-2 text-text-secondary\">\n <Loader2 className=\"size-5 animate-spin\" />\n <span className=\"text-sm\">Loading database...</span>\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full w-full overflow-hidden\">\n {/* Left sidebar — table list (hidden when opened from database sidebar) */}\n {!hideTableList && (\n <SqliteTableList\n tables={sqlite.tables}\n selectedTable={sqlite.selectedTable}\n onSelect={sqlite.selectTable}\n onRefresh={sqlite.refreshTables}\n />\n )}\n\n {/* Main content area */}\n <div className={`flex-1 flex flex-col overflow-hidden ${!hideTableList ? \"border-l border-border\" : \"\"}`}>\n {/* Toolbar */}\n <div className=\"flex items-center gap-2 px-3 py-1.5 border-b border-border bg-background shrink-0\">\n <Database className=\"size-3.5 text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground truncate\">{connectionName ?? dbPath}</span>\n <span className=\"text-xs text-muted-foreground\">\n {sqlite.selectedTable && `/ ${sqlite.selectedTable}`}\n </span>\n <div className=\"ml-auto\">\n <button\n type=\"button\"\n onClick={onToggleQueryPanel}\n className={`px-2 py-1 rounded text-xs transition-colors ${queryPanelOpen ? \"bg-muted text-foreground\" : \"text-muted-foreground hover:text-foreground\"}`}\n >\n SQL\n </button>\n </div>\n </div>\n\n {/* Data grid — adapter from sqlite rowid-based API to GlideDataGrid's pk-based API */}\n <div className={`flex-1 overflow-hidden ${queryPanelOpen ? \"max-h-[60%]\" : \"\"}`}>\n {sqlite.tableData ? (\n <GlideDataGrid\n columns={sqlite.tableData.columns}\n rows={sqlite.tableData.rows}\n total={sqlite.tableData.total}\n limit={sqlite.tableData.limit}\n schema={sqlite.schema.map((c) => ({ name: c.name, type: c.type, nullable: !c.notnull, pk: !!c.pk, defaultValue: c.dflt_value, fk: c.fk ?? null }))}\n loading={sqlite.loading}\n page={sqlite.page}\n onPageChange={sqlite.setPage}\n onCellUpdate={(_pkCol, pkVal, col, val) => sqlite.updateCell(pkVal as number, col, val)}\n onRowDelete={(_pkCol, pkVal) => sqlite.deleteRow(pkVal as number)}\n />\n ) : (\n <div className=\"flex items-center justify-center h-full text-xs text-muted-foreground\">\n {sqlite.loading ? <Loader2 className=\"size-4 animate-spin\" /> : \"Select a table\"}\n </div>\n )}\n </div>\n\n {/* Query editor (collapsible) */}\n {queryPanelOpen && (\n <div className=\"border-t border-border h-[40%] shrink-0\">\n <SqliteQueryEditor\n onExecute={sqlite.executeQuery}\n loading={sqlite.queryLoading}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tab-store-Dtg1_qL0.js","names":[],"sources":["../../../src/web/stores/tab-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { usePanelStore } from \"./panel-store\";\nimport { getNextUntitledNumber } from \"./panel-utils\";\n\nexport type TabType =\n | \"terminal\"\n | \"chat\"\n | \"editor\"\n | \"database\"\n | \"sqlite\"\n | \"postgres\"\n | \"git-diff\"\n | \"settings\"\n | \"ports\"\n | \"extension\"\n | \"extension-webview\"\n | \"conflict-editor\";\n\nexport interface Tab {\n id: string;\n type: TabType;\n title: string;\n projectId: string | null;\n metadata?: Record<string, unknown>;\n closable: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Facade store — delegates to panel-store, exposes focused panel's tabs\n// ---------------------------------------------------------------------------\ninterface TabStore {\n /** Tabs of the focused panel */\n tabs: Tab[];\n /** Active tab in focused panel */\n activeTabId: string | null;\n tabHistory: string[];\n currentProject: string | null;\n switchProject: (projectName: string) => void;\n openTab: (tab: Omit<Tab, \"id\">) => string;\n closeTab: (id: string) => void;\n setActiveTab: (id: string) => void;\n updateTab: (id: string, updates: Partial<Omit<Tab, \"id\">>) => void;\n openNewFile: () => string;\n}\n\nexport const useTabStore = create<TabStore>()(() => ({\n tabs: [],\n activeTabId: null,\n tabHistory: [],\n currentProject: null,\n\n switchProject: (projectName: string) => {\n usePanelStore.getState().switchProject(projectName);\n syncFromPanelStore();\n },\n\n openTab: (tabDef) => {\n const id = usePanelStore.getState().openTab(tabDef);\n syncFromPanelStore();\n return id;\n },\n\n closeTab: (id) => {\n usePanelStore.getState().closeTab(id);\n syncFromPanelStore();\n },\n\n setActiveTab: (id) => {\n usePanelStore.getState().setActiveTab(id);\n syncFromPanelStore();\n },\n\n updateTab: (id, updates) => {\n usePanelStore.getState().updateTab(id, updates);\n syncFromPanelStore();\n },\n\n openNewFile: () => {\n const ps = usePanelStore.getState();\n const num = getNextUntitledNumber(ps.panels);\n const id = ps.openTab({\n type: \"editor\",\n title: `Untitled-${num}`,\n projectId: null,\n metadata: { isUntitled: true, untitledNumber: num },\n closable: true,\n });\n syncFromPanelStore();\n return id;\n },\n}));\n\n// ---------------------------------------------------------------------------\n// Sync focused panel state → tab-store for backward compat\n// ---------------------------------------------------------------------------\nfunction syncFromPanelStore() {\n const ps = usePanelStore.getState();\n const focused = ps.panels[ps.focusedPanelId];\n useTabStore.setState({\n tabs: focused?.tabs ?? [],\n activeTabId: focused?.activeTabId ?? null,\n tabHistory: focused?.tabHistory ?? [],\n currentProject: ps.currentProject,\n });\n}\n\n// Subscribe to panel-store changes to keep tab-store in sync\nusePanelStore.subscribe(() => syncFromPanelStore());\n"],"mappings":"6FA6CA,IAAa,EAAc,GAAkB,MAAQ,CACnD,KAAM,EAAE,CACR,YAAa,KACb,WAAY,EAAE,CACd,eAAgB,KAEhB,cAAgB,GAAwB,CACtC,EAAc,UAAU,CAAC,cAAc,EAAY,CACnD,GAAoB,EAGtB,QAAU,GAAW,CACnB,IAAM,EAAK,EAAc,UAAU,CAAC,QAAQ,EAAO,CAEnD,OADA,GAAoB,CACb,GAGT,SAAW,GAAO,CAChB,EAAc,UAAU,CAAC,SAAS,EAAG,CACrC,GAAoB,EAGtB,aAAe,GAAO,CACpB,EAAc,UAAU,CAAC,aAAa,EAAG,CACzC,GAAoB,EAGtB,WAAY,EAAI,IAAY,CAC1B,EAAc,UAAU,CAAC,UAAU,EAAI,EAAQ,CAC/C,GAAoB,EAGtB,gBAAmB,CACjB,IAAM,EAAK,EAAc,UAAU,CAC7B,EAAM,EAAsB,EAAG,OAAO,CACtC,EAAK,EAAG,QAAQ,CACpB,KAAM,SACN,MAAO,YAAY,IACnB,UAAW,KACX,SAAU,CAAE,WAAY,GAAM,eAAgB,EAAK,CACnD,SAAU,GACX,CAAC,CAEF,OADA,GAAoB,CACb,GAEV,EAAE,CAKH,SAAS,GAAqB,CAC5B,IAAM,EAAK,EAAc,UAAU,CAC7B,EAAU,EAAG,OAAO,EAAG,gBAC7B,EAAY,SAAS,CACnB,KAAM,GAAS,MAAQ,EAAE,CACzB,YAAa,GAAS,aAAe,KACrC,WAAY,GAAS,YAAc,EAAE,CACrC,eAAgB,EAAG,eACpB,CAAC,CAIJ,EAAc,cAAgB,GAAoB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"table-BzjWcs87.js","names":[],"sources":["../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/table.js"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v18\", key: \"108xh3\" }],\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M3 9h18\", key: \"1pudct\" }],\n [\"path\", { d: \"M3 15h18\", key: \"5xshup\" }]\n];\nconst Table = createLucideIcon(\"table\", __iconNode);\n\nexport { __iconNode, Table as default };\n//# sourceMappingURL=table.js.map\n"],"x_google_ignoreList":[0],"mappings":"mDAeA,IAAM,EAAQ,EAAiB,QANZ,CACjB,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,SAAU,CAAC,CAC1C,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,SAAU,CAAC,CAC/E,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,SAAU,CAAC,CACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,SAAU,CAAC,CAC3C,CACkD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal-tab-B7ECmf95.js","names":[],"sources":["../../../src/web/hooks/use-terminal.ts","../../../src/web/components/terminal/terminal-tab.tsx"],"sourcesContent":["import { useEffect, useRef, useCallback, useState } from \"react\";\nimport { Terminal, type ITheme } from \"@xterm/xterm\";\nimport { FitAddon } from \"@xterm/addon-fit\";\nimport { WebLinksAddon } from \"@xterm/addon-web-links\";\nimport { useSettingsStore, type Theme } from \"@/stores/settings-store\";\n\nconst DARK_THEME: ITheme = {\n background: \"#0f1419\",\n foreground: \"#e5e7eb\",\n cursor: \"#e5e7eb\",\n selectionBackground: \"#3b82f640\",\n black: \"#1a1f2e\",\n red: \"#ef4444\",\n green: \"#10b981\",\n yellow: \"#f59e0b\",\n blue: \"#3b82f6\",\n magenta: \"#a855f7\",\n cyan: \"#06b6d4\",\n white: \"#e5e7eb\",\n brightBlack: \"#6b7280\",\n brightRed: \"#f87171\",\n brightGreen: \"#34d399\",\n brightYellow: \"#fbbf24\",\n brightBlue: \"#60a5fa\",\n brightMagenta: \"#c084fc\",\n brightCyan: \"#22d3ee\",\n brightWhite: \"#f9fafb\",\n};\n\nconst LIGHT_THEME: ITheme = {\n background: \"#ffffff\",\n foreground: \"#1a1f2e\",\n cursor: \"#1a1f2e\",\n selectionBackground: \"#2563eb30\",\n black: \"#1a1f2e\",\n red: \"#dc2626\",\n green: \"#059669\",\n yellow: \"#d97706\",\n blue: \"#2563eb\",\n magenta: \"#9333ea\",\n cyan: \"#0891b2\",\n white: \"#f8fafc\",\n brightBlack: \"#64748b\",\n brightRed: \"#ef4444\",\n brightGreen: \"#10b981\",\n brightYellow: \"#f59e0b\",\n brightBlue: \"#3b82f6\",\n brightMagenta: \"#a855f7\",\n brightCyan: \"#06b6d4\",\n brightWhite: \"#ffffff\",\n};\n\nfunction resolveTheme(theme: Theme): ITheme {\n if (theme === \"system\") {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? DARK_THEME : LIGHT_THEME;\n }\n return theme === \"light\" ? LIGHT_THEME : DARK_THEME;\n}\n\ninterface UseTerminalOptions {\n sessionId: string;\n projectName?: string;\n containerRef: React.RefObject<HTMLDivElement | null>;\n /** Stable tab ID for persisting session across reload */\n tabId?: string;\n}\n\ninterface UseTerminalReturn {\n connected: boolean;\n reconnecting: boolean;\n exited: boolean;\n sendData: (data: string) => void;\n getSelection: () => string;\n /** Read buffer from last command start to current cursor (for \"Send to Chat\"). */\n getLastCommandOutput: () => string;\n restart: () => void;\n}\n\nconst RESIZE_PREFIX = \"\\x01RESIZE:\";\n\nexport function useTerminal(\n options: UseTerminalOptions,\n): UseTerminalReturn {\n const { sessionId, containerRef } = options;\n const termRef = useRef<Terminal | null>(null);\n const fitRef = useRef<FitAddon | null>(null);\n const wsRef = useRef<WebSocket | null>(null);\n const reconnectTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const reconnectAttempts = useRef(0);\n const [connected, setConnected] = useState(false);\n const [reconnecting, setReconnecting] = useState(false);\n const [exited, setExited] = useState(false);\n // Restore persisted session ID from localStorage (survives page reload)\n const storageKey = options.tabId ? `ppm:terminal-session:${options.tabId}` : null;\n const initialSessionId = (() => {\n if (storageKey) {\n try { return localStorage.getItem(storageKey) ?? sessionId; } catch { /* */ }\n }\n return sessionId;\n })();\n const actualSessionId = useRef(initialSessionId);\n /** Absolute row where last command output starts (set when user presses Enter) */\n const commandStartRow = useRef(0);\n\n const sendData = useCallback((data: string) => {\n const ws = wsRef.current;\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(data);\n }\n }, []);\n\n const getSelection = useCallback(() => {\n return termRef.current?.getSelection() ?? \"\";\n }, []);\n\n const getLastCommandOutput = useCallback(() => {\n const term = termRef.current;\n if (!term) return \"\";\n const buf = term.buffer.active;\n const startRow = commandStartRow.current;\n const endRow = buf.baseY + buf.cursorY;\n const lines: string[] = [];\n for (let i = startRow; i <= endRow; i++) {\n const line = buf.getLine(i);\n if (line) lines.push(line.translateToString(true));\n }\n // Trim trailing empty lines\n while (lines.length > 0 && lines[lines.length - 1]!.trim() === \"\") lines.pop();\n return lines.join(\"\\n\");\n }, []);\n\n const sendResize = useCallback(() => {\n const term = termRef.current;\n const ws = wsRef.current;\n if (term && ws?.readyState === WebSocket.OPEN) {\n ws.send(`${RESIZE_PREFIX}${term.cols},${term.rows}`);\n }\n }, []);\n\n const restart = useCallback(() => {\n // Close existing WS, reset to \"new\" session, reconnect\n if (reconnectTimer.current) clearTimeout(reconnectTimer.current);\n wsRef.current?.close();\n wsRef.current = null;\n actualSessionId.current = \"new\";\n if (storageKey) { try { localStorage.removeItem(storageKey); } catch { /* */ } }\n reconnectAttempts.current = 0;\n setExited(false);\n setConnected(false);\n setReconnecting(false);\n // connectWs will be called after this via setTimeout to allow state to settle\n setTimeout(() => connectWs(), 0);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const connectWs = useCallback(() => {\n // Prevent duplicate connections (e.g. React StrictMode re-mount racing\n // with a scheduled reconnect from the previous mount's WS close event).\n if (reconnectTimer.current) {\n clearTimeout(reconnectTimer.current);\n reconnectTimer.current = null;\n }\n if (wsRef.current) {\n wsRef.current.onclose = null; // prevent triggering scheduleReconnect\n wsRef.current.close();\n wsRef.current = null;\n }\n\n const term = termRef.current;\n if (!term) return;\n\n const protocol = window.location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const projectName = options.projectName ?? \"\";\n // Use actual session ID from server on reconnect (not \"new\")\n const sid = actualSessionId.current;\n const path = `/ws/project/${encodeURIComponent(projectName)}/terminal/${sid}`;\n // In dev mode, connect directly to backend (port 8081) to bypass\n // Vite's dev proxy which has unreliable WebSocket upgrade handling.\n const url = import.meta.env.DEV\n ? `ws://${window.location.hostname}:8081${path}`\n : `${protocol}//${window.location.host}${path}`;\n\n const ws = new WebSocket(url);\n wsRef.current = ws;\n\n ws.onopen = () => {\n setConnected(true);\n setReconnecting(false);\n reconnectAttempts.current = 0;\n sendResize();\n };\n\n ws.onmessage = (event) => {\n if (typeof event.data === \"string\") {\n // Filter JSON control messages from terminal output\n if (event.data.startsWith(\"{\")) {\n try {\n const msg = JSON.parse(event.data);\n if (msg.type === \"session\" || msg.type === \"error\" || msg.type === \"exited\" || msg.type === \"ping\") {\n if (msg.type === \"session\" && msg.id) {\n actualSessionId.current = msg.id;\n // Persist to localStorage so reload reconnects to same PTY\n if (storageKey) {\n try { localStorage.setItem(storageKey, msg.id); } catch { /* */ }\n }\n }\n if (msg.type === \"error\") {\n term.write(`\\r\\n\\x1b[31mError: ${msg.message}\\x1b[0m\\r\\n`);\n }\n if (msg.type === \"exited\") {\n setExited(true);\n }\n return; // Don't write raw JSON to terminal\n }\n } catch {\n // Not JSON, write as terminal output\n }\n }\n term.write(event.data);\n }\n };\n\n ws.onclose = () => {\n setConnected(false);\n scheduleReconnect();\n };\n\n ws.onerror = () => {\n ws.close();\n };\n }, [sendResize]); // eslint-disable-line react-hooks/exhaustive-deps\n\n function scheduleReconnect() {\n const delay = Math.min(\n 1000 * Math.pow(2, reconnectAttempts.current),\n 30000,\n );\n reconnectAttempts.current++;\n setReconnecting(true);\n reconnectTimer.current = setTimeout(() => {\n connectWs();\n }, delay);\n }\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const term = new Terminal({\n cursorBlink: true,\n fontSize: 13,\n fontFamily: \"var(--font-mono)\",\n theme: resolveTheme(useSettingsStore.getState().theme),\n });\n\n const fitAddon = new FitAddon();\n const webLinksAddon = new WebLinksAddon();\n\n term.loadAddon(fitAddon);\n term.loadAddon(webLinksAddon);\n term.open(container);\n fitAddon.fit();\n\n termRef.current = term;\n fitRef.current = fitAddon;\n\n // Wire input to WS + track command boundaries\n term.onData((data) => {\n // When user presses Enter, mark next row as command output start\n if (data.includes(\"\\r\") || data.includes(\"\\n\")) {\n const buf = term.buffer.active;\n commandStartRow.current = buf.baseY + buf.cursorY + 1;\n }\n const ws = wsRef.current;\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(data);\n }\n });\n\n // Connect WS\n connectWs();\n\n // ResizeObserver for auto-fit\n const resizeObserver = new ResizeObserver(() => {\n try {\n fitAddon.fit();\n sendResize();\n } catch {\n // Ignore fit errors during teardown\n }\n });\n resizeObserver.observe(container);\n\n // React to theme changes\n let prevTheme = useSettingsStore.getState().theme;\n const unsubTheme = useSettingsStore.subscribe((state) => {\n if (state.theme !== prevTheme) {\n prevTheme = state.theme;\n term.options.theme = resolveTheme(state.theme);\n }\n });\n\n return () => {\n unsubTheme();\n resizeObserver.disconnect();\n if (reconnectTimer.current) clearTimeout(reconnectTimer.current);\n wsRef.current?.close();\n wsRef.current = null;\n term.dispose();\n termRef.current = null;\n fitRef.current = null;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return { connected, reconnecting, exited, sendData, getSelection, getLastCommandOutput, restart };\n}\n","import { useRef, useEffect, useState, useCallback, memo } from \"react\";\nimport { useTerminal } from \"@/hooks/use-terminal\";\nimport { cn } from \"@/lib/utils\";\nimport { Copy, ClipboardPaste, RotateCcw, MessageSquare } from \"lucide-react\";\nimport \"@xterm/xterm/css/xterm.css\";\nimport { toast } from \"sonner\";\n\nimport { usePanelStore } from \"@/stores/panel-store\";\n\ninterface TerminalTabProps {\n metadata?: Record<string, unknown>;\n tabId?: string;\n}\n\nconst MOBILE_KEYS = [\n { label: \"Tab\", value: \"\\t\" },\n { label: \"Esc\", value: \"\\x1b\" },\n { label: \"Ctrl\", value: null, isModifier: true },\n { label: \"\\u2191\", value: \"\\x1b[A\" },\n { label: \"\\u2193\", value: \"\\x1b[B\" },\n { label: \"\\u2190\", value: \"\\x1b[D\" },\n { label: \"\\u2192\", value: \"\\x1b[C\" },\n] as const;\n\nexport const TerminalTab = memo(function TerminalTab({ metadata, tabId }: TerminalTabProps) {\n const sessionId = (metadata?.sessionId as string) ?? \"new\";\n const projectName = metadata?.projectName as string | undefined;\n const containerRef = useRef<HTMLDivElement>(null);\n\n const { connected, reconnecting, exited, sendData, getSelection, getLastCommandOutput, restart } = useTerminal({ sessionId, projectName, containerRef, tabId });\n const [ctrlMode, setCtrlMode] = useState(false);\n const [viewportHeight, setViewportHeight] = useState<number | null>(null);\n\n // Adjust height when mobile keyboard opens\n useEffect(() => {\n const vv = window.visualViewport;\n if (!vv) return;\n\n function handleResize() {\n if (!vv) return;\n setViewportHeight(vv.height);\n }\n\n vv.addEventListener(\"resize\", handleResize);\n return () => vv.removeEventListener(\"resize\", handleResize);\n }, []);\n\n const focusTerminal = useCallback(() => {\n const termElement = containerRef.current?.querySelector(\n \".xterm-helper-textarea\",\n ) as HTMLTextAreaElement | null;\n termElement?.focus();\n }, []);\n\n const sendKey = useCallback(\n (value: string) => {\n focusTerminal();\n\n if (ctrlMode && value.length === 1) {\n // Ctrl+key: send char code 1-26 for a-z\n const code = value.toLowerCase().charCodeAt(0) - 96;\n if (code >= 1 && code <= 26) {\n sendData(String.fromCharCode(code));\n }\n setCtrlMode(false);\n return;\n }\n\n sendData(value);\n },\n [ctrlMode, sendData, focusTerminal],\n );\n\n const handleCopy = useCallback(async () => {\n const selection = getSelection();\n if (selection) {\n await navigator.clipboard.writeText(selection);\n }\n }, [getSelection]);\n\n const handlePaste = useCallback(async () => {\n try {\n const text = await navigator.clipboard.readText();\n if (text) {\n sendData(text);\n focusTerminal();\n }\n } catch {\n // Clipboard permission denied\n }\n }, [sendData, focusTerminal]);\n\n const handleSendToChat = useCallback(() => {\n const selection = getSelection();\n const text = selection || getLastCommandOutput();\n if (!text.trim()) return;\n const codeBlock = \"```bash\\n\" + text + \"\\n```\";\n const label = selection ? \"Terminal selection\" : \"Terminal output\";\n\n // Try to inject into an already-open chat tab as attachment chip\n let handled = false;\n const handler = () => { handled = true; };\n window.addEventListener(\"ppm:send-to-chat:ack\", handler, { once: true });\n window.dispatchEvent(new CustomEvent(\"ppm:send-to-chat\", { detail: { text: codeBlock, label, projectName } }));\n window.removeEventListener(\"ppm:send-to-chat:ack\", handler);\n\n if (handled) {\n toast.success(\"Sent to chat\", { duration: 1500 });\n } else {\n // No chat tab mounted — open a new one with the content as initialValue\n usePanelStore.getState().openTab({\n type: \"chat\",\n title: \"Chat\",\n projectId: null,\n metadata: { projectName, pendingMessage: codeBlock },\n closable: true,\n });\n }\n }, [getSelection, getLastCommandOutput, projectName]);\n\n const isMobile = typeof window !== \"undefined\" && \"ontouchstart\" in window;\n\n return (\n <div\n className=\"flex flex-col h-full\"\n style={viewportHeight ? { maxHeight: `${viewportHeight}px` } : undefined}\n >\n {/* Status bar */}\n <div className=\"flex items-center gap-2 px-3 py-1 bg-surface border-b border-border text-xs\">\n <span\n className={cn(\n \"size-2 rounded-full\",\n exited ? \"bg-error\" : connected ? \"bg-success\" : reconnecting ? \"bg-warning\" : \"bg-error\",\n )}\n />\n <span className=\"text-text-secondary\">\n {exited\n ? \"Process exited\"\n : connected\n ? \"Connected\"\n : reconnecting\n ? \"Reconnecting...\"\n : \"Disconnected\"}\n </span>\n {exited && (\n <button\n onClick={restart}\n className=\"flex items-center gap-1 px-1.5 py-0.5 rounded text-xs bg-surface-elevated text-text-primary hover:bg-primary hover:text-primary-foreground active:bg-primary active:text-primary-foreground transition-colors\"\n >\n <RotateCcw size={10} />\n Restart\n </button>\n )}\n <button\n onClick={handleSendToChat}\n title=\"Send to Chat\"\n className=\"flex items-center gap-1 px-1.5 py-0.5 rounded text-xs bg-surface-elevated text-text-primary hover:bg-primary hover:text-primary-foreground active:bg-primary active:text-primary-foreground transition-colors ml-auto\"\n >\n <MessageSquare size={10} />\n Chat\n </button>\n <span className=\"text-text-subtle font-mono\">{sessionId}</span>\n </div>\n\n {/* Terminal container */}\n <div ref={containerRef} className=\"flex-1 min-h-0 bg-background p-1\" />\n\n {/* Mobile toolbar */}\n {isMobile && (\n <div className=\"flex items-center gap-1 px-2 py-1.5 bg-surface border-t border-border overflow-x-auto\">\n <button\n onClick={handleCopy}\n className=\"px-2 py-1.5 rounded text-xs min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none\"\n >\n <Copy size={14} />\n </button>\n <button\n onClick={handlePaste}\n className=\"px-2 py-1.5 rounded text-xs min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none\"\n >\n <ClipboardPaste size={14} />\n </button>\n <button\n onClick={handleSendToChat}\n className=\"px-2 py-1.5 rounded text-xs min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none\"\n aria-label=\"Send to Chat\"\n >\n <MessageSquare size={14} />\n </button>\n <div className=\"w-px h-5 bg-border mx-0.5\" />\n {MOBILE_KEYS.map((key) => (\n <button\n key={key.label}\n onClick={() => {\n if (key.label === \"Ctrl\") {\n setCtrlMode(!ctrlMode);\n } else if (key.value) {\n sendKey(key.value);\n }\n }}\n className={cn(\n \"px-3 py-1.5 rounded text-xs font-mono min-w-[36px] min-h-[32px]\",\n \"bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground\",\n \"transition-colors select-none\",\n key.label === \"Ctrl\" && ctrlMode && \"bg-primary text-primary-foreground\",\n )}\n >\n {key.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n});\n"],"mappings":"2eAMM,EAAqB,CACzB,WAAY,UACZ,WAAY,UACZ,OAAQ,UACR,oBAAqB,YACrB,MAAO,UACP,IAAK,UACL,MAAO,UACP,OAAQ,UACR,KAAM,UACN,QAAS,UACT,KAAM,UACN,MAAO,UACP,YAAa,UACb,UAAW,UACX,YAAa,UACb,aAAc,UACd,WAAY,UACZ,cAAe,UACf,WAAY,UACZ,YAAa,UACd,CAEK,EAAsB,CAC1B,WAAY,UACZ,WAAY,UACZ,OAAQ,UACR,oBAAqB,YACrB,MAAO,UACP,IAAK,UACL,MAAO,UACP,OAAQ,UACR,KAAM,UACN,QAAS,UACT,KAAM,UACN,MAAO,UACP,YAAa,UACb,UAAW,UACX,YAAa,UACb,aAAc,UACd,WAAY,UACZ,cAAe,UACf,WAAY,UACZ,YAAa,UACd,CAED,SAAS,EAAa,EAAsB,CAI1C,OAHI,IAAU,SACL,OAAO,WAAW,+BAA+B,CAAC,QAAU,EAAa,EAE3E,IAAU,QAAU,EAAc,EAsB3C,IAAM,EAAgB,WAEtB,SAAgB,EACd,EACmB,CACnB,GAAM,CAAE,YAAW,gBAAiB,EAC9B,GAAA,EAAA,EAAA,QAAkC,KAAK,CACvC,GAAA,EAAA,EAAA,QAAiC,KAAK,CACtC,GAAA,EAAA,EAAA,QAAiC,KAAK,CACtC,GAAA,EAAA,EAAA,QAA8D,KAAK,CACnE,GAAA,EAAA,EAAA,QAA2B,EAAE,CAC7B,CAAC,EAAW,IAAA,EAAA,EAAA,UAAyB,GAAM,CAC3C,CAAC,EAAc,IAAA,EAAA,EAAA,UAA4B,GAAM,CACjD,CAAC,EAAQ,IAAA,EAAA,EAAA,UAAsB,GAAM,CAErC,EAAa,EAAQ,MAAQ,wBAAwB,EAAQ,QAAU,KAOvE,GAAA,EAAA,EAAA,aAN0B,CAC9B,GAAI,EACF,GAAI,CAAE,OAAO,aAAa,QAAQ,EAAW,EAAI,OAAmB,EAEtE,OAAO,KACL,CAC4C,CAE1C,GAAA,EAAA,EAAA,QAAyB,EAAE,CAE3B,GAAA,EAAA,EAAA,aAAwB,GAAiB,CAC7C,IAAM,EAAK,EAAM,QACb,GAAI,aAAe,UAAU,MAC/B,EAAG,KAAK,EAAK,EAEd,EAAE,CAAC,CAEA,GAAA,EAAA,EAAA,iBACG,EAAQ,SAAS,cAAc,EAAI,GACzC,EAAE,CAAC,CAEA,GAAA,EAAA,EAAA,iBAAyC,CAC7C,IAAM,EAAO,EAAQ,QACrB,GAAI,CAAC,EAAM,MAAO,GAClB,IAAM,EAAM,EAAK,OAAO,OAClB,EAAW,EAAgB,QAC3B,EAAS,EAAI,MAAQ,EAAI,QACzB,EAAkB,EAAE,CAC1B,IAAK,IAAI,EAAI,EAAU,GAAK,EAAQ,IAAK,CACvC,IAAM,EAAO,EAAI,QAAQ,EAAE,CACvB,GAAM,EAAM,KAAK,EAAK,kBAAkB,GAAK,CAAC,CAGpD,KAAO,EAAM,OAAS,GAAK,EAAM,EAAM,OAAS,GAAI,MAAM,GAAK,IAAI,EAAM,KAAK,CAC9E,OAAO,EAAM,KAAK;EAAK,EACtB,EAAE,CAAC,CAEA,GAAA,EAAA,EAAA,iBAA+B,CACnC,IAAM,EAAO,EAAQ,QACf,EAAK,EAAM,QACb,GAAQ,GAAI,aAAe,UAAU,MACvC,EAAG,KAAK,GAAG,IAAgB,EAAK,KAAK,GAAG,EAAK,OAAO,EAErD,EAAE,CAAC,CAEA,GAAA,EAAA,EAAA,iBAA4B,CAMhC,GAJI,EAAe,SAAS,aAAa,EAAe,QAAQ,CAChE,EAAM,SAAS,OAAO,CACtB,EAAM,QAAU,KAChB,EAAgB,QAAU,MACtB,EAAc,GAAI,CAAE,aAAa,WAAW,EAAW,MAAU,EACrE,EAAkB,QAAU,EAC5B,EAAU,GAAM,CAChB,EAAa,GAAM,CACnB,EAAgB,GAAM,CAEtB,eAAiB,GAAW,CAAE,EAAE,EAC/B,EAAE,CAAC,CAEA,GAAA,EAAA,EAAA,iBAA8B,CAGlC,AAEE,EAAe,WADf,aAAa,EAAe,QAAQ,CACX,MAE3B,AAGE,EAAM,WAFN,EAAM,QAAQ,QAAU,KACxB,EAAM,QAAQ,OAAO,CACL,MAGlB,IAAM,EAAO,EAAQ,QACrB,GAAI,CAAC,EAAM,OAEX,IAAM,EAAW,OAAO,SAAS,WAAa,SAAW,OAAS,MAC5D,EAAc,EAAQ,aAAe,GAErC,EAAM,EAAgB,QACtB,EAAO,eAAe,mBAAmB,EAAY,CAAC,YAAY,IAGlE,EAEF,GAAG,EAAS,IAAI,OAAO,SAAS,OAAO,IAErC,EAAK,IAAI,UAAU,EAAI,CAC7B,EAAM,QAAU,EAEhB,EAAG,WAAe,CAChB,EAAa,GAAK,CAClB,EAAgB,GAAM,CACtB,EAAkB,QAAU,EAC5B,GAAY,EAGd,EAAG,UAAa,GAAU,CACxB,GAAI,OAAO,EAAM,MAAS,SAAU,CAElC,GAAI,EAAM,KAAK,WAAW,IAAI,CAC5B,GAAI,CACF,IAAM,EAAM,KAAK,MAAM,EAAM,KAAK,CAClC,GAAI,EAAI,OAAS,WAAa,EAAI,OAAS,SAAW,EAAI,OAAS,UAAY,EAAI,OAAS,OAAQ,CAClG,GAAI,EAAI,OAAS,WAAa,EAAI,KAChC,EAAgB,QAAU,EAAI,GAE1B,GACF,GAAI,CAAE,aAAa,QAAQ,EAAY,EAAI,GAAG,MAAU,EAGxD,EAAI,OAAS,SACf,EAAK,MAAM,sBAAsB,EAAI,QAAQ,aAAa,CAExD,EAAI,OAAS,UACf,EAAU,GAAK,CAEjB,aAEI,EAIV,EAAK,MAAM,EAAM,KAAK,GAI1B,EAAG,YAAgB,CACjB,EAAa,GAAM,CACnB,GAAmB,EAGrB,EAAG,YAAgB,CACjB,EAAG,OAAO,GAEX,CAAC,EAAW,CAAC,CAEhB,SAAS,GAAoB,CAC3B,IAAM,EAAQ,KAAK,IACjB,IAAgB,GAAG,EAAkB,QACrC,IACD,CACD,EAAkB,UAClB,EAAgB,GAAK,CACrB,EAAe,QAAU,eAAiB,CACxC,GAAW,EACV,EAAM,CAyEX,OAtEA,EAAA,EAAA,eAAgB,CACd,IAAM,EAAY,EAAa,QAC/B,GAAI,CAAC,EAAW,OAEhB,IAAM,EAAO,IAAI,EAAS,CACxB,YAAa,GACb,SAAU,GACV,WAAY,mBACZ,MAAO,EAAa,EAAiB,UAAU,CAAC,MAAM,CACvD,CAAC,CAEI,EAAW,IAAI,EACf,EAAgB,IAAI,EAE1B,EAAK,UAAU,EAAS,CACxB,EAAK,UAAU,EAAc,CAC7B,EAAK,KAAK,EAAU,CACpB,EAAS,KAAK,CAEd,EAAQ,QAAU,EAClB,EAAO,QAAU,EAGjB,EAAK,OAAQ,GAAS,CAEpB,GAAI,EAAK,SAAS,KAAK,EAAI,EAAK,SAAS;EAAK,CAAE,CAC9C,IAAM,EAAM,EAAK,OAAO,OACxB,EAAgB,QAAU,EAAI,MAAQ,EAAI,QAAU,EAEtD,IAAM,EAAK,EAAM,QACb,GAAI,aAAe,UAAU,MAC/B,EAAG,KAAK,EAAK,EAEf,CAGF,GAAW,CAGX,IAAM,EAAiB,IAAI,mBAAqB,CAC9C,GAAI,CACF,EAAS,KAAK,CACd,GAAY,MACN,IAGR,CACF,EAAe,QAAQ,EAAU,CAGjC,IAAI,EAAY,EAAiB,UAAU,CAAC,MACtC,EAAa,EAAiB,UAAW,GAAU,CACnD,EAAM,QAAU,IAClB,EAAY,EAAM,MAClB,EAAK,QAAQ,MAAQ,EAAa,EAAM,MAAM,GAEhD,CAEF,UAAa,CACX,GAAY,CACZ,EAAe,YAAY,CACvB,EAAe,SAAS,aAAa,EAAe,QAAQ,CAChE,EAAM,SAAS,OAAO,CACtB,EAAM,QAAU,KAChB,EAAK,SAAS,CACd,EAAQ,QAAU,KAClB,EAAO,QAAU,OAElB,EAAE,CAAC,CAEC,CAAE,YAAW,eAAc,SAAQ,WAAU,eAAc,uBAAsB,UAAS,WC3S7F,EAAc,CAClB,CAAE,MAAO,MAAO,MAAO,IAAM,CAC7B,CAAE,MAAO,MAAO,MAAO,OAAQ,CAC/B,CAAE,MAAO,OAAQ,MAAO,KAAM,WAAY,GAAM,CAChD,CAAE,MAAO,IAAU,MAAO,SAAU,CACpC,CAAE,MAAO,IAAU,MAAO,SAAU,CACpC,CAAE,MAAO,IAAU,MAAO,SAAU,CACpC,CAAE,MAAO,IAAU,MAAO,SAAU,CACrC,CAEY,GAAA,EAAA,EAAA,MAAmB,SAAqB,CAAE,WAAU,SAA2B,CAC1F,IAAM,EAAa,GAAU,WAAwB,MAC/C,EAAc,GAAU,YACxB,GAAA,EAAA,EAAA,QAAsC,KAAK,CAE3C,CAAE,YAAW,eAAc,SAAQ,WAAU,eAAc,uBAAsB,WAAY,EAAY,CAAE,YAAW,cAAa,eAAc,QAAO,CAAC,CACzJ,CAAC,EAAU,IAAA,EAAA,EAAA,UAAwB,GAAM,CACzC,CAAC,EAAgB,IAAA,EAAA,EAAA,UAA6C,KAAK,EAGzE,EAAA,EAAA,eAAgB,CACd,IAAM,EAAK,OAAO,eAClB,GAAI,CAAC,EAAI,OAET,SAAS,GAAe,CACjB,GACL,EAAkB,EAAG,OAAO,CAI9B,OADA,EAAG,iBAAiB,SAAU,EAAa,KAC9B,EAAG,oBAAoB,SAAU,EAAa,EAC1D,EAAE,CAAC,CAEN,IAAM,GAAA,EAAA,EAAA,iBAAkC,EAClB,EAAa,SAAS,cACxC,yBACD,GACY,OAAO,EACnB,EAAE,CAAC,CAEA,GAAA,EAAA,EAAA,aACH,GAAkB,CAGjB,GAFA,GAAe,CAEX,GAAY,EAAM,SAAW,EAAG,CAElC,IAAM,EAAO,EAAM,aAAa,CAAC,WAAW,EAAE,CAAG,GAC7C,GAAQ,GAAK,GAAQ,IACvB,EAAS,OAAO,aAAa,EAAK,CAAC,CAErC,EAAY,GAAM,CAClB,OAGF,EAAS,EAAM,EAEjB,CAAC,EAAU,EAAU,EAAc,CACpC,CAEK,GAAA,EAAA,EAAA,aAAyB,SAAY,CACzC,IAAM,EAAY,GAAc,CAC5B,GACF,MAAM,UAAU,UAAU,UAAU,EAAU,EAE/C,CAAC,EAAa,CAAC,CAEZ,GAAA,EAAA,EAAA,aAA0B,SAAY,CAC1C,GAAI,CACF,IAAM,EAAO,MAAM,UAAU,UAAU,UAAU,CAC7C,IACF,EAAS,EAAK,CACd,GAAe,OAEX,IAGP,CAAC,EAAU,EAAc,CAAC,CAEvB,GAAA,EAAA,EAAA,iBAAqC,CACzC,IAAM,EAAY,GAAc,CAC1B,EAAO,GAAa,GAAsB,CAChD,GAAI,CAAC,EAAK,MAAM,CAAE,OAClB,IAAM,EAAY,YAAc,EAAO,QACjC,EAAQ,EAAY,qBAAuB,kBAG7C,EAAU,GACR,MAAgB,CAAE,EAAU,IAClC,OAAO,iBAAiB,uBAAwB,EAAS,CAAE,KAAM,GAAM,CAAC,CACxE,OAAO,cAAc,IAAI,YAAY,mBAAoB,CAAE,OAAQ,CAAE,KAAM,EAAW,QAAO,cAAa,CAAE,CAAC,CAAC,CAC9G,OAAO,oBAAoB,uBAAwB,EAAQ,CAEvD,EACF,EAAM,QAAQ,eAAgB,CAAE,SAAU,KAAM,CAAC,CAGjD,EAAc,UAAU,CAAC,QAAQ,CAC/B,KAAM,OACN,MAAO,OACP,UAAW,KACX,SAAU,CAAE,cAAa,eAAgB,EAAW,CACpD,SAAU,GACX,CAAC,EAEH,CAAC,EAAc,EAAsB,EAAY,CAAC,CAE/C,EAAW,OAAO,OAAW,KAAe,iBAAkB,OAEpE,OAAA,EAAA,EAAA,MACG,MAAD,CACE,UAAU,uBACV,MAAO,EAAiB,CAAE,UAAW,GAAG,EAAe,IAAK,CAAG,IAAA,YAFjE,YAKG,MAAD,CAAK,UAAU,uFAAf,WACG,OAAD,CACE,UAAW,EACT,sBACA,EAAS,WAAa,EAAY,aAAe,EAAe,aAAe,WAChF,CACD,CAAA,WACD,OAAD,CAAM,UAAU,+BACb,EACG,iBACA,EACE,YACA,EACE,kBACA,eACH,CAAA,CACN,IAAA,EAAA,EAAA,MACE,SAAD,CACE,QAAS,EACT,UAAU,yNAFZ,EAAA,EAAA,EAAA,KAIG,EAAD,CAAW,KAAM,GAAM,CAAA,CAAA,UAEhB,cAEV,SAAD,CACE,QAAS,EACT,MAAM,eACN,UAAU,iOAHZ,EAAA,EAAA,EAAA,KAKG,EAAD,CAAe,KAAM,GAAM,CAAA,CAAA,OAEpB,aACR,OAAD,CAAM,UAAU,sCAA8B,EAAiB,CAAA,CAC3D,aAGL,MAAD,CAAK,IAAK,EAAc,UAAU,mCAAqC,CAAA,CAGtE,IAAA,EAAA,EAAA,MACE,MAAD,CAAK,UAAU,iGAAf,WACG,SAAD,CACE,QAAS,EACT,UAAU,gMAET,EAAD,CAAM,KAAM,GAAM,CAAA,CACX,CAAA,WACR,SAAD,CACE,QAAS,EACT,UAAU,gMAET,EAAD,CAAgB,KAAM,GAAM,CAAA,CACrB,CAAA,WACR,SAAD,CACE,QAAS,EACT,UAAU,6KACV,aAAW,kCAEV,EAAD,CAAe,KAAM,GAAM,CAAA,CACpB,CAAA,WACR,MAAD,CAAK,UAAU,4BAA8B,CAAA,CAC5C,EAAY,IAAK,IAAA,EAAA,EAAA,KACf,SAAD,CAEE,YAAe,CACT,EAAI,QAAU,OAChB,EAAY,CAAC,EAAS,CACb,EAAI,OACb,EAAQ,EAAI,MAAM,EAGtB,UAAW,EACT,kEACA,yFACA,gCACA,EAAI,QAAU,QAAU,GAAY,qCACrC,UAEA,EAAI,MACE,CAhBF,EAAI,MAgBF,CACT,CACE,GAEJ,IAER"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"text-wrap-DJz9Bgpa.js","names":[],"sources":["../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/text-wrap.js"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m16 16-3 3 3 3\", key: \"117b85\" }],\n [\"path\", { d: \"M3 12h14.5a1 1 0 0 1 0 7H13\", key: \"18xa6z\" }],\n [\"path\", { d: \"M3 19h6\", key: \"1ygdsz\" }],\n [\"path\", { d: \"M3 5h18\", key: \"1u36vt\" }]\n];\nconst TextWrap = createLucideIcon(\"text-wrap\", __iconNode);\n\nexport { __iconNode, TextWrap as default };\n//# sourceMappingURL=text-wrap.js.map\n"],"x_google_ignoreList":[0],"mappings":"mDAeA,IAAM,EAAW,EAAiB,YANf,CACjB,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,SAAU,CAAC,CAChD,CAAC,OAAQ,CAAE,EAAG,8BAA+B,IAAK,SAAU,CAAC,CAC7D,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,SAAU,CAAC,CACzC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,SAAU,CAAC,CAC1C,CACyD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-blob-url-DB4nNruT.js","names":[],"sources":["../../../src/web/components/editor/use-blob-url.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { projectUrl, getAuthToken } from \"@/lib/api-client\";\n\n/** Shared hook: fetch a project file as a blob URL via /files/raw endpoint.\n * Detects absolute paths (external files) and uses /api/fs/raw instead. */\nexport function useBlobUrl(\n filePath: string,\n projectName: string,\n mimeOverride?: string,\n) {\n const [blobUrl, setBlobUrl] = useState<string | null>(null);\n const [error, setError] = useState(false);\n\n useEffect(() => {\n let revoke: string | undefined;\n const isExternal = /^(\\/|[A-Za-z]:[/\\\\])/.test(filePath);\n const url = isExternal\n ? `/api/fs/raw?path=${encodeURIComponent(filePath)}`\n : `${projectUrl(projectName)}/files/raw?path=${encodeURIComponent(filePath)}`;\n const token = getAuthToken();\n fetch(url, { headers: token ? { Authorization: `Bearer ${token}` } : {} })\n .then((r) => {\n if (!r.ok) throw new Error(\"Failed\");\n return r.blob();\n })\n .then((blob) => {\n const final = mimeOverride ? new Blob([blob], { type: mimeOverride }) : blob;\n const u = URL.createObjectURL(final);\n revoke = u;\n setBlobUrl(u);\n })\n .catch(() => setError(true));\n return () => {\n if (revoke) URL.revokeObjectURL(revoke);\n };\n }, [filePath, projectName, mimeOverride]);\n\n return { blobUrl, error };\n}\n"],"mappings":"mKAKA,SAAgB,EACd,EACA,EACA,EACA,CACA,GAAM,CAAC,EAAS,IAAA,EAAA,EAAA,UAAsC,KAAK,CACrD,CAAC,EAAO,IAAA,EAAA,EAAA,UAAqB,GAAM,CA0BzC,OAxBA,EAAA,EAAA,eAAgB,CACd,IAAI,EAEE,EADa,uBAAuB,KAAK,EAAS,CAEpD,oBAAoB,mBAAmB,EAAS,GAChD,GAAG,EAAW,EAAY,CAAC,kBAAkB,mBAAmB,EAAS,GACvE,EAAQ,GAAc,CAa5B,OAZA,MAAM,EAAK,CAAE,QAAS,EAAQ,CAAE,cAAe,UAAU,IAAS,CAAG,EAAE,CAAE,CAAC,CACvE,KAAM,GAAM,CACX,GAAI,CAAC,EAAE,GAAI,MAAU,MAAM,SAAS,CACpC,OAAO,EAAE,MAAM,EACf,CACD,KAAM,GAAS,CACd,IAAM,EAAQ,EAAe,IAAI,KAAK,CAAC,EAAK,CAAE,CAAE,KAAM,EAAc,CAAC,CAAG,EAClE,EAAI,IAAI,gBAAgB,EAAM,CACpC,EAAS,EACT,EAAW,EAAE,EACb,CACD,UAAY,EAAS,GAAK,CAAC,KACjB,CACP,GAAQ,IAAI,gBAAgB,EAAO,GAExC,CAAC,EAAU,EAAa,EAAa,CAAC,CAElC,CAAE,UAAS,QAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-monaco-theme-DEI-tJAh.js","names":["_defineProperty","ownKeys","_objectSpread2","compose","curry","isObject","throwError","errorHandler","validators","config","_objectSpread2","state","Se","Ne"],"sources":["../../../node_modules/.bun/@monaco-editor+loader@1.7.0/node_modules/@monaco-editor/loader/lib/es/_virtual/_rollupPluginBabelHelpers.js","../../../node_modules/.bun/state-local@1.0.7/node_modules/state-local/lib/es/state-local.js","../../../node_modules/.bun/@monaco-editor+loader@1.7.0/node_modules/@monaco-editor/loader/lib/es/config/index.js","../../../node_modules/.bun/@monaco-editor+loader@1.7.0/node_modules/@monaco-editor/loader/lib/es/utils/curry.js","../../../node_modules/.bun/@monaco-editor+loader@1.7.0/node_modules/@monaco-editor/loader/lib/es/utils/isObject.js","../../../node_modules/.bun/@monaco-editor+loader@1.7.0/node_modules/@monaco-editor/loader/lib/es/validators/index.js","../../../node_modules/.bun/@monaco-editor+loader@1.7.0/node_modules/@monaco-editor/loader/lib/es/utils/compose.js","../../../node_modules/.bun/@monaco-editor+loader@1.7.0/node_modules/@monaco-editor/loader/lib/es/utils/deepMerge.js","../../../node_modules/.bun/@monaco-editor+loader@1.7.0/node_modules/@monaco-editor/loader/lib/es/utils/makeCancelable.js","../../../node_modules/.bun/@monaco-editor+loader@1.7.0/node_modules/@monaco-editor/loader/lib/es/loader/index.js","../../../node_modules/.bun/@monaco-editor+react@4.7.0+a11a28bb6ed44998/node_modules/@monaco-editor/react/dist/index.mjs","../../../src/web/lib/use-monaco-theme.ts"],"sourcesContent":["function _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: true,\n configurable: true,\n writable: true\n }) : e[r] = t, e;\n}\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = true,\n o = false;\n try {\n if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = true, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), true).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nfunction _objectWithoutProperties(e, t) {\n if (null == e) return {};\n var o,\n r,\n i = _objectWithoutPropertiesLoose(e, t);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n }\n return i;\n}\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nfunction _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r);\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nexport { _arrayLikeToArray as arrayLikeToArray, _arrayWithHoles as arrayWithHoles, _defineProperty as defineProperty, _iterableToArrayLimit as iterableToArrayLimit, _nonIterableRest as nonIterableRest, _objectSpread2 as objectSpread2, _objectWithoutProperties as objectWithoutProperties, _objectWithoutPropertiesLoose as objectWithoutPropertiesLoose, _slicedToArray as slicedToArray, _toPrimitive as toPrimitive, _toPropertyKey as toPropertyKey, _unsupportedIterableToArray as unsupportedIterableToArray };\n","function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction compose() {\n for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {\n fns[_key] = arguments[_key];\n }\n\n return function (x) {\n return fns.reduceRight(function (y, f) {\n return f(y);\n }, x);\n };\n}\n\nfunction curry(fn) {\n return function curried() {\n var _this = this;\n\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return args.length >= fn.length ? fn.apply(this, args) : function () {\n for (var _len3 = arguments.length, nextArgs = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n nextArgs[_key3] = arguments[_key3];\n }\n\n return curried.apply(_this, [].concat(args, nextArgs));\n };\n };\n}\n\nfunction isObject(value) {\n return {}.toString.call(value).includes('Object');\n}\n\nfunction isEmpty(obj) {\n return !Object.keys(obj).length;\n}\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\n\nfunction hasOwnProperty(object, property) {\n return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nfunction validateChanges(initial, changes) {\n if (!isObject(changes)) errorHandler('changeType');\n if (Object.keys(changes).some(function (field) {\n return !hasOwnProperty(initial, field);\n })) errorHandler('changeField');\n return changes;\n}\n\nfunction validateSelector(selector) {\n if (!isFunction(selector)) errorHandler('selectorType');\n}\n\nfunction validateHandler(handler) {\n if (!(isFunction(handler) || isObject(handler))) errorHandler('handlerType');\n if (isObject(handler) && Object.values(handler).some(function (_handler) {\n return !isFunction(_handler);\n })) errorHandler('handlersType');\n}\n\nfunction validateInitial(initial) {\n if (!initial) errorHandler('initialIsRequired');\n if (!isObject(initial)) errorHandler('initialType');\n if (isEmpty(initial)) errorHandler('initialContent');\n}\n\nfunction throwError(errorMessages, type) {\n throw new Error(errorMessages[type] || errorMessages[\"default\"]);\n}\n\nvar errorMessages = {\n initialIsRequired: 'initial state is required',\n initialType: 'initial state should be an object',\n initialContent: 'initial state shouldn\\'t be an empty object',\n handlerType: 'handler should be an object or a function',\n handlersType: 'all handlers should be a functions',\n selectorType: 'selector should be a function',\n changeType: 'provided value of changes should be an object',\n changeField: 'it seams you want to change a field in the state which is not specified in the \"initial\" state',\n \"default\": 'an unknown error accured in `state-local` package'\n};\nvar errorHandler = curry(throwError)(errorMessages);\nvar validators = {\n changes: validateChanges,\n selector: validateSelector,\n handler: validateHandler,\n initial: validateInitial\n};\n\nfunction create(initial) {\n var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n validators.initial(initial);\n validators.handler(handler);\n var state = {\n current: initial\n };\n var didUpdate = curry(didStateUpdate)(state, handler);\n var update = curry(updateState)(state);\n var validate = curry(validators.changes)(initial);\n var getChanges = curry(extractChanges)(state);\n\n function getState() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (state) {\n return state;\n };\n validators.selector(selector);\n return selector(state.current);\n }\n\n function setState(causedChanges) {\n compose(didUpdate, update, validate, getChanges)(causedChanges);\n }\n\n return [getState, setState];\n}\n\nfunction extractChanges(state, causedChanges) {\n return isFunction(causedChanges) ? causedChanges(state.current) : causedChanges;\n}\n\nfunction updateState(state, changes) {\n state.current = _objectSpread2(_objectSpread2({}, state.current), changes);\n return changes;\n}\n\nfunction didStateUpdate(state, handler, changes) {\n isFunction(handler) ? handler(state.current) : Object.keys(changes).forEach(function (field) {\n var _handler$field;\n\n return (_handler$field = handler[field]) === null || _handler$field === void 0 ? void 0 : _handler$field.call(handler, state.current[field]);\n });\n return changes;\n}\n\nvar index = {\n create: create\n};\n\nexport default index;\n","var config = {\n paths: {\n vs: 'https://cdn.jsdelivr.net/npm/monaco-editor@0.55.1/min/vs'\n }\n};\n\nexport { config as default };\n","function curry(fn) {\n return function curried() {\n var _this = this;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return args.length >= fn.length ? fn.apply(this, args) : function () {\n for (var _len2 = arguments.length, nextArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n nextArgs[_key2] = arguments[_key2];\n }\n return curried.apply(_this, [].concat(args, nextArgs));\n };\n };\n}\n\nexport { curry as default };\n","function isObject(value) {\n return {}.toString.call(value).includes('Object');\n}\n\nexport { isObject as default };\n","import curry from '../utils/curry.js';\nimport isObject from '../utils/isObject.js';\n\n/**\n * validates the configuration object and informs about deprecation\n * @param {Object} config - the configuration object \n * @return {Object} config - the validated configuration object\n */\nfunction validateConfig(config) {\n if (!config) errorHandler('configIsRequired');\n if (!isObject(config)) errorHandler('configType');\n if (config.urls) {\n informAboutDeprecation();\n return {\n paths: {\n vs: config.urls.monacoBase\n }\n };\n }\n return config;\n}\n\n/**\n * logs deprecation message\n */\nfunction informAboutDeprecation() {\n console.warn(errorMessages.deprecation);\n}\nfunction throwError(errorMessages, type) {\n throw new Error(errorMessages[type] || errorMessages[\"default\"]);\n}\nvar errorMessages = {\n configIsRequired: 'the configuration object is required',\n configType: 'the configuration object should be an object',\n \"default\": 'an unknown error accured in `@monaco-editor/loader` package',\n deprecation: \"Deprecation warning!\\n You are using deprecated way of configuration.\\n\\n Instead of using\\n monaco.config({ urls: { monacoBase: '...' } })\\n use\\n monaco.config({ paths: { vs: '...' } })\\n\\n For more please check the link https://github.com/suren-atoyan/monaco-loader#config\\n \"\n};\nvar errorHandler = curry(throwError)(errorMessages);\nvar validators = {\n config: validateConfig\n};\n\nexport { validators as default, errorHandler, errorMessages };\n","var compose = function compose() {\n for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {\n fns[_key] = arguments[_key];\n }\n return function (x) {\n return fns.reduceRight(function (y, f) {\n return f(y);\n }, x);\n };\n};\n\nexport { compose as default };\n","import { objectSpread2 as _objectSpread2 } from '../_virtual/_rollupPluginBabelHelpers.js';\n\nfunction merge(target, source) {\n Object.keys(source).forEach(function (key) {\n if (source[key] instanceof Object) {\n if (target[key]) {\n Object.assign(source[key], merge(target[key], source[key]));\n }\n }\n });\n return _objectSpread2(_objectSpread2({}, target), source);\n}\n\nexport { merge as default };\n","// The source (has been changed) is https://github.com/facebook/react/issues/5465#issuecomment-157888325\n\nvar CANCELATION_MESSAGE = {\n type: 'cancelation',\n msg: 'operation is manually canceled'\n};\nfunction makeCancelable(promise) {\n var hasCanceled_ = false;\n var wrappedPromise = new Promise(function (resolve, reject) {\n promise.then(function (val) {\n return hasCanceled_ ? reject(CANCELATION_MESSAGE) : resolve(val);\n });\n promise[\"catch\"](reject);\n });\n return wrappedPromise.cancel = function () {\n return hasCanceled_ = true;\n }, wrappedPromise;\n}\n\nexport { CANCELATION_MESSAGE, makeCancelable as default };\n","import { slicedToArray as _slicedToArray, objectWithoutProperties as _objectWithoutProperties } from '../_virtual/_rollupPluginBabelHelpers.js';\nimport state from 'state-local';\nimport config$1 from '../config/index.js';\nimport validators from '../validators/index.js';\nimport compose from '../utils/compose.js';\nimport merge from '../utils/deepMerge.js';\nimport makeCancelable from '../utils/makeCancelable.js';\n\nvar _excluded = [\"monaco\"];\n\n/** the local state of the module */\nvar _state$create = state.create({\n config: config$1,\n isInitialized: false,\n resolve: null,\n reject: null,\n monaco: null\n }),\n _state$create2 = _slicedToArray(_state$create, 2),\n getState = _state$create2[0],\n setState = _state$create2[1];\n\n/**\n * set the loader configuration\n * @param {Object} config - the configuration object\n */\nfunction config(globalConfig) {\n var _validators$config = validators.config(globalConfig),\n monaco = _validators$config.monaco,\n config = _objectWithoutProperties(_validators$config, _excluded);\n setState(function (state) {\n return {\n config: merge(state.config, config),\n monaco: monaco\n };\n });\n}\n\n/**\n * handles the initialization of the monaco-editor\n * @return {Promise} - returns an instance of monaco (with a cancelable promise)\n */\nfunction init() {\n var state = getState(function (_ref) {\n var monaco = _ref.monaco,\n isInitialized = _ref.isInitialized,\n resolve = _ref.resolve;\n return {\n monaco: monaco,\n isInitialized: isInitialized,\n resolve: resolve\n };\n });\n if (!state.isInitialized) {\n setState({\n isInitialized: true\n });\n if (state.monaco) {\n state.resolve(state.monaco);\n return makeCancelable(wrapperPromise);\n }\n if (window.monaco && window.monaco.editor) {\n storeMonacoInstance(window.monaco);\n state.resolve(window.monaco);\n return makeCancelable(wrapperPromise);\n }\n compose(injectScripts, getMonacoLoaderScript)(configureLoader);\n }\n return makeCancelable(wrapperPromise);\n}\n\n/**\n * injects provided scripts into the document.body\n * @param {Object} script - an HTML script element\n * @return {Object} - the injected HTML script element\n */\nfunction injectScripts(script) {\n return document.body.appendChild(script);\n}\n\n/**\n * creates an HTML script element with/without provided src\n * @param {string} [src] - the source path of the script\n * @return {Object} - the created HTML script element\n */\nfunction createScript(src) {\n var script = document.createElement('script');\n return src && (script.src = src), script;\n}\n\n/**\n * creates an HTML script element with the monaco loader src\n * @return {Object} - the created HTML script element\n */\nfunction getMonacoLoaderScript(configureLoader) {\n var state = getState(function (_ref2) {\n var config = _ref2.config,\n reject = _ref2.reject;\n return {\n config: config,\n reject: reject\n };\n });\n var loaderScript = createScript(\"\".concat(state.config.paths.vs, \"/loader.js\"));\n loaderScript.onload = function () {\n return configureLoader();\n };\n loaderScript.onerror = state.reject;\n return loaderScript;\n}\n\n/**\n * configures the monaco loader\n */\nfunction configureLoader() {\n var state = getState(function (_ref3) {\n var config = _ref3.config,\n resolve = _ref3.resolve,\n reject = _ref3.reject;\n return {\n config: config,\n resolve: resolve,\n reject: reject\n };\n });\n var require = window.require;\n require.config(state.config);\n require(['vs/editor/editor.main'], function (loaded) {\n var monaco = loaded.m /* for 0.53 & 0.54 */ || loaded /* for other versions */;\n storeMonacoInstance(monaco);\n state.resolve(monaco);\n }, function (error) {\n state.reject(error);\n });\n}\n\n/**\n * store monaco instance in local state\n */\nfunction storeMonacoInstance(monaco) {\n if (!getState().monaco) {\n setState({\n monaco: monaco\n });\n }\n}\n\n/**\n * internal helper function\n * extracts stored monaco instance\n * @return {Object|null} - the monaco instance\n */\nfunction __getMonacoInstance() {\n return getState(function (_ref4) {\n var monaco = _ref4.monaco;\n return monaco;\n });\n}\nvar wrapperPromise = new Promise(function (resolve, reject) {\n return setState({\n resolve: resolve,\n reject: reject\n });\n});\nvar loader = {\n config: config,\n init: init,\n __getMonacoInstance: __getMonacoInstance\n};\n\nexport { loader as default };\n","import _t from\"@monaco-editor/loader\";import{memo as Te}from\"react\";import ke,{useState as re,useRef as S,useCallback as oe,useEffect as ne}from\"react\";import Se from\"@monaco-editor/loader\";import{memo as ye}from\"react\";import K from\"react\";var le={wrapper:{display:\"flex\",position:\"relative\",textAlign:\"initial\"},fullWidth:{width:\"100%\"},hide:{display:\"none\"}},v=le;import me from\"react\";var ae={container:{display:\"flex\",height:\"100%\",width:\"100%\",justifyContent:\"center\",alignItems:\"center\"}},Y=ae;function Me({children:e}){return me.createElement(\"div\",{style:Y.container},e)}var Z=Me;var $=Z;function Ee({width:e,height:r,isEditorReady:n,loading:t,_ref:a,className:m,wrapperProps:E}){return K.createElement(\"section\",{style:{...v.wrapper,width:e,height:r},...E},!n&&K.createElement($,null,t),K.createElement(\"div\",{ref:a,style:{...v.fullWidth,...!n&&v.hide},className:m}))}var ee=Ee;var H=ye(ee);import{useEffect as xe}from\"react\";function Ce(e){xe(e,[])}var k=Ce;import{useEffect as ge,useRef as Re}from\"react\";function he(e,r,n=!0){let t=Re(!0);ge(t.current||!n?()=>{t.current=!1}:e,r)}var l=he;function D(){}function h(e,r,n,t){return De(e,t)||be(e,r,n,t)}function De(e,r){return e.editor.getModel(te(e,r))}function be(e,r,n,t){return e.editor.createModel(r,n,t?te(e,t):void 0)}function te(e,r){return e.Uri.parse(r)}function Oe({original:e,modified:r,language:n,originalLanguage:t,modifiedLanguage:a,originalModelPath:m,modifiedModelPath:E,keepCurrentOriginalModel:g=!1,keepCurrentModifiedModel:N=!1,theme:x=\"light\",loading:P=\"Loading...\",options:y={},height:V=\"100%\",width:z=\"100%\",className:F,wrapperProps:j={},beforeMount:A=D,onMount:q=D}){let[M,O]=re(!1),[T,s]=re(!0),u=S(null),c=S(null),w=S(null),d=S(q),o=S(A),b=S(!1);k(()=>{let i=Se.init();return i.then(f=>(c.current=f)&&s(!1)).catch(f=>f?.type!==\"cancelation\"&&console.error(\"Monaco initialization: error:\",f)),()=>u.current?I():i.cancel()}),l(()=>{if(u.current&&c.current){let i=u.current.getOriginalEditor(),f=h(c.current,e||\"\",t||n||\"text\",m||\"\");f!==i.getModel()&&i.setModel(f)}},[m],M),l(()=>{if(u.current&&c.current){let i=u.current.getModifiedEditor(),f=h(c.current,r||\"\",a||n||\"text\",E||\"\");f!==i.getModel()&&i.setModel(f)}},[E],M),l(()=>{let i=u.current.getModifiedEditor();i.getOption(c.current.editor.EditorOption.readOnly)?i.setValue(r||\"\"):r!==i.getValue()&&(i.executeEdits(\"\",[{range:i.getModel().getFullModelRange(),text:r||\"\",forceMoveMarkers:!0}]),i.pushUndoStop())},[r],M),l(()=>{u.current?.getModel()?.original.setValue(e||\"\")},[e],M),l(()=>{let{original:i,modified:f}=u.current.getModel();c.current.editor.setModelLanguage(i,t||n||\"text\"),c.current.editor.setModelLanguage(f,a||n||\"text\")},[n,t,a],M),l(()=>{c.current?.editor.setTheme(x)},[x],M),l(()=>{u.current?.updateOptions(y)},[y],M);let L=oe(()=>{if(!c.current)return;o.current(c.current);let i=h(c.current,e||\"\",t||n||\"text\",m||\"\"),f=h(c.current,r||\"\",a||n||\"text\",E||\"\");u.current?.setModel({original:i,modified:f})},[n,r,a,e,t,m,E]),U=oe(()=>{!b.current&&w.current&&(u.current=c.current.editor.createDiffEditor(w.current,{automaticLayout:!0,...y}),L(),c.current?.editor.setTheme(x),O(!0),b.current=!0)},[y,x,L]);ne(()=>{M&&d.current(u.current,c.current)},[M]),ne(()=>{!T&&!M&&U()},[T,M,U]);function I(){let i=u.current?.getModel();g||i?.original?.dispose(),N||i?.modified?.dispose(),u.current?.dispose()}return ke.createElement(H,{width:z,height:V,isEditorReady:M,loading:P,_ref:w,className:F,wrapperProps:j})}var ie=Oe;var we=Te(ie);import{useState as Ie}from\"react\";import ce from\"@monaco-editor/loader\";function Pe(){let[e,r]=Ie(ce.__getMonacoInstance());return k(()=>{let n;return e||(n=ce.init(),n.then(t=>{r(t)})),()=>n?.cancel()}),e}var Le=Pe;import{memo as ze}from\"react\";import We,{useState as ue,useEffect as W,useRef as C,useCallback as _e}from\"react\";import Ne from\"@monaco-editor/loader\";import{useEffect as Ue,useRef as ve}from\"react\";function He(e){let r=ve();return Ue(()=>{r.current=e},[e]),r.current}var se=He;var _=new Map;function Ve({defaultValue:e,defaultLanguage:r,defaultPath:n,value:t,language:a,path:m,theme:E=\"light\",line:g,loading:N=\"Loading...\",options:x={},overrideServices:P={},saveViewState:y=!0,keepCurrentModel:V=!1,width:z=\"100%\",height:F=\"100%\",className:j,wrapperProps:A={},beforeMount:q=D,onMount:M=D,onChange:O,onValidate:T=D}){let[s,u]=ue(!1),[c,w]=ue(!0),d=C(null),o=C(null),b=C(null),L=C(M),U=C(q),I=C(),i=C(t),f=se(m),Q=C(!1),B=C(!1);k(()=>{let p=Ne.init();return p.then(R=>(d.current=R)&&w(!1)).catch(R=>R?.type!==\"cancelation\"&&console.error(\"Monaco initialization: error:\",R)),()=>o.current?pe():p.cancel()}),l(()=>{let p=h(d.current,e||t||\"\",r||a||\"\",m||n||\"\");p!==o.current?.getModel()&&(y&&_.set(f,o.current?.saveViewState()),o.current?.setModel(p),y&&o.current?.restoreViewState(_.get(m)))},[m],s),l(()=>{o.current?.updateOptions(x)},[x],s),l(()=>{!o.current||t===void 0||(o.current.getOption(d.current.editor.EditorOption.readOnly)?o.current.setValue(t):t!==o.current.getValue()&&(B.current=!0,o.current.executeEdits(\"\",[{range:o.current.getModel().getFullModelRange(),text:t,forceMoveMarkers:!0}]),o.current.pushUndoStop(),B.current=!1))},[t],s),l(()=>{let p=o.current?.getModel();p&&a&&d.current?.editor.setModelLanguage(p,a)},[a],s),l(()=>{g!==void 0&&o.current?.revealLine(g)},[g],s),l(()=>{d.current?.editor.setTheme(E)},[E],s);let X=_e(()=>{if(!(!b.current||!d.current)&&!Q.current){U.current(d.current);let p=m||n,R=h(d.current,t||e||\"\",r||a||\"\",p||\"\");o.current=d.current?.editor.create(b.current,{model:R,automaticLayout:!0,...x},P),y&&o.current.restoreViewState(_.get(p)),d.current.editor.setTheme(E),g!==void 0&&o.current.revealLine(g),u(!0),Q.current=!0}},[e,r,n,t,a,m,x,P,y,E,g]);W(()=>{s&&L.current(o.current,d.current)},[s]),W(()=>{!c&&!s&&X()},[c,s,X]),i.current=t,W(()=>{s&&O&&(I.current?.dispose(),I.current=o.current?.onDidChangeModelContent(p=>{B.current||O(o.current.getValue(),p)}))},[s,O]),W(()=>{if(s){let p=d.current.editor.onDidChangeMarkers(R=>{let G=o.current.getModel()?.uri;if(G&&R.find(J=>J.path===G.path)){let J=d.current.editor.getModelMarkers({resource:G});T?.(J)}});return()=>{p?.dispose()}}return()=>{}},[s,T]);function pe(){I.current?.dispose(),V?y&&_.set(m,o.current.saveViewState()):o.current.getModel()?.dispose(),o.current.dispose()}return We.createElement(H,{width:z,height:F,isEditorReady:s,loading:N,_ref:b,className:j,wrapperProps:A})}var fe=Ve;var de=ze(fe);var Ft=de;export{we as DiffEditor,de as Editor,Ft as default,_t as loader,Le as useMonaco};\n//# sourceMappingURL=index.mjs.map","import { useEffect, useState } from \"react\";\nimport { useSettingsStore } from \"@/stores/settings-store\";\n\n/** Resolves the current app theme to a Monaco editor theme name. */\nexport function useMonacoTheme(): string {\n const theme = useSettingsStore((s) => s.theme);\n\n const resolve = () => {\n if (theme === \"dark\") return \"vs-dark\";\n if (theme === \"light\") return \"light\";\n // system\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"vs-dark\" : \"light\";\n };\n\n const [monacoTheme, setMonacoTheme] = useState(resolve);\n\n useEffect(() => {\n setMonacoTheme(resolve());\n\n if (theme === \"system\") {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handler = () => setMonacoTheme(mq.matches ? \"vs-dark\" : \"light\");\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }\n }, [theme]);\n\n return monacoTheme;\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10],"mappings":"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"}