@phenx-inc/ctlsurf 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/bin/ctlsurf-worker.js +173 -0
  2. package/electron-vite.config.ts +34 -0
  3. package/out/headless/index.mjs +1364 -0
  4. package/out/headless/index.mjs.map +7 -0
  5. package/out/main/index.js +1131 -0
  6. package/out/preload/index.js +67 -0
  7. package/out/renderer/assets/abap-D5KwWAsZ.js +1399 -0
  8. package/out/renderer/assets/apex-DVGUZ64i.js +331 -0
  9. package/out/renderer/assets/azcli-BEAhqcuE.js +69 -0
  10. package/out/renderer/assets/bat-Bqkp9Cfu.js +101 -0
  11. package/out/renderer/assets/bicep-DIlfshcM.js +110 -0
  12. package/out/renderer/assets/cameligo-CLaaYNMV.js +175 -0
  13. package/out/renderer/assets/clojure-fcgFaMHx.js +762 -0
  14. package/out/renderer/assets/codicon-ngg6Pgfi.ttf +0 -0
  15. package/out/renderer/assets/coffee-CzJ5oEdj.js +233 -0
  16. package/out/renderer/assets/cpp-CcN6f0ik.js +390 -0
  17. package/out/renderer/assets/csharp-BJeIuvde.js +327 -0
  18. package/out/renderer/assets/csp-D_3BK2Wp.js +54 -0
  19. package/out/renderer/assets/css-i3rI3_64.js +186 -0
  20. package/out/renderer/assets/css.worker-umuuUiIb.js +53567 -0
  21. package/out/renderer/assets/cssMode-DL0XItGB.js +208 -0
  22. package/out/renderer/assets/cypher-D0--_GAN.js +264 -0
  23. package/out/renderer/assets/dart-vLMHv35g.js +282 -0
  24. package/out/renderer/assets/dockerfile--oxj0cAH.js +131 -0
  25. package/out/renderer/assets/ecl-CeuUgzaZ.js +457 -0
  26. package/out/renderer/assets/editor.worker-CNgWLVu7.js +13695 -0
  27. package/out/renderer/assets/elixir-eLfY1jWH.js +570 -0
  28. package/out/renderer/assets/flow9-ZSTChSMd.js +143 -0
  29. package/out/renderer/assets/freemarker2-CrOEuDcF.js +995 -0
  30. package/out/renderer/assets/fsharp-D2uoxuLH.js +218 -0
  31. package/out/renderer/assets/go-brnMpFrj.js +219 -0
  32. package/out/renderer/assets/graphql-BeiGgjIU.js +152 -0
  33. package/out/renderer/assets/handlebars-D4QYaBof.js +414 -0
  34. package/out/renderer/assets/hcl-CrX1Es2W.js +184 -0
  35. package/out/renderer/assets/html-B2Dqk2ai.js +303 -0
  36. package/out/renderer/assets/html.worker-BT47iy49.js +29777 -0
  37. package/out/renderer/assets/htmlMode-CdZ0Prhd.js +224 -0
  38. package/out/renderer/assets/index-CJ6RsQWP.css +8108 -0
  39. package/out/renderer/assets/index-pZmE1QXB.js +211777 -0
  40. package/out/renderer/assets/ini-BcQysCTb.js +72 -0
  41. package/out/renderer/assets/java-Dt3iMn2o.js +233 -0
  42. package/out/renderer/assets/javascript-CK8zNQXj.js +72 -0
  43. package/out/renderer/assets/json.worker-D4JVmXIe.js +21424 -0
  44. package/out/renderer/assets/jsonMode-Cewaellc.js +931 -0
  45. package/out/renderer/assets/julia-Cm3ItYL_.js +512 -0
  46. package/out/renderer/assets/kotlin-Ddo1SjA5.js +253 -0
  47. package/out/renderer/assets/less-B7Qaxw-O.js +162 -0
  48. package/out/renderer/assets/lexon-C1U0m2n9.js +158 -0
  49. package/out/renderer/assets/liquid-Bd3GPNs2.js +235 -0
  50. package/out/renderer/assets/lspLanguageFeatures-DSDH7BnA.js +1841 -0
  51. package/out/renderer/assets/lua-hNsuGJkO.js +163 -0
  52. package/out/renderer/assets/m3-6ko6q9-_.js +211 -0
  53. package/out/renderer/assets/markdown-B0YTnTxW.js +230 -0
  54. package/out/renderer/assets/mdx-CCPVCrXC.js +159 -0
  55. package/out/renderer/assets/mips-CJm71dS3.js +199 -0
  56. package/out/renderer/assets/msdax-BBeIktCY.js +376 -0
  57. package/out/renderer/assets/mysql-BWiizXSn.js +879 -0
  58. package/out/renderer/assets/objective-c-B1L1C5EC.js +184 -0
  59. package/out/renderer/assets/pascal-DMQyD4Xk.js +252 -0
  60. package/out/renderer/assets/pascaligo-VA_LQ1oU.js +165 -0
  61. package/out/renderer/assets/perl-DC0Z0tlO.js +627 -0
  62. package/out/renderer/assets/pgsql-DaSGFTLp.js +852 -0
  63. package/out/renderer/assets/php-Bkx1qpkQ.js +501 -0
  64. package/out/renderer/assets/pla-DEV89yYj.js +138 -0
  65. package/out/renderer/assets/postiats-CVVurEnu.js +908 -0
  66. package/out/renderer/assets/powerquery-BQ_t1ZiQ.js +891 -0
  67. package/out/renderer/assets/powershell-BXiKvz7Z.js +240 -0
  68. package/out/renderer/assets/protobuf-CndvAUGu.js +421 -0
  69. package/out/renderer/assets/pug-BxCXwerb.js +403 -0
  70. package/out/renderer/assets/python-34jOtlcC.js +295 -0
  71. package/out/renderer/assets/qsharp-BWK6YLKm.js +302 -0
  72. package/out/renderer/assets/r-CtqYUQ6l.js +244 -0
  73. package/out/renderer/assets/razor-DXRw694z.js +545 -0
  74. package/out/renderer/assets/redis-O7gSt3oh.js +303 -0
  75. package/out/renderer/assets/redshift-CvYMMYZY.js +810 -0
  76. package/out/renderer/assets/restructuredtext-B-KQCVu_.js +175 -0
  77. package/out/renderer/assets/ruby-DCd4DmAr.js +512 -0
  78. package/out/renderer/assets/rust-B1c0VCeq.js +344 -0
  79. package/out/renderer/assets/sb-Chfc_wZF.js +116 -0
  80. package/out/renderer/assets/scala-DbVzH-3O.js +371 -0
  81. package/out/renderer/assets/scheme-D7PxodDG.js +109 -0
  82. package/out/renderer/assets/scss-B42qMyAu.js +261 -0
  83. package/out/renderer/assets/shell-vZEubQ82.js +222 -0
  84. package/out/renderer/assets/solidity-yHOxYChb.js +1368 -0
  85. package/out/renderer/assets/sophia-D7pU0Y1d.js +200 -0
  86. package/out/renderer/assets/sparql-DxuVdnRl.js +202 -0
  87. package/out/renderer/assets/sql-BAGepFCR.js +854 -0
  88. package/out/renderer/assets/st-C-b0Dh53.js +417 -0
  89. package/out/renderer/assets/swift-BmOZGynf.js +313 -0
  90. package/out/renderer/assets/systemverilog-BOC0OOdC.js +577 -0
  91. package/out/renderer/assets/tcl-Bb4GCwBr.js +233 -0
  92. package/out/renderer/assets/ts.worker-C7hW3aY-.js +225330 -0
  93. package/out/renderer/assets/tsMode-CmND5_wB.js +1265 -0
  94. package/out/renderer/assets/twig-DvgEGWAV.js +393 -0
  95. package/out/renderer/assets/typescript-BNNI0Euv.js +337 -0
  96. package/out/renderer/assets/typespec-R77Ln7Jb.js +128 -0
  97. package/out/renderer/assets/vb-Bm6ESA0Q.js +373 -0
  98. package/out/renderer/assets/wgsl-_KPae5vw.js +454 -0
  99. package/out/renderer/assets/xml-CgdndrNB.js +89 -0
  100. package/out/renderer/assets/yaml-DNWPIf1s.js +200 -0
  101. package/out/renderer/index.html +13 -0
  102. package/package.json +67 -0
  103. package/resources/icon.icns +0 -0
  104. package/resources/icon.ico +0 -0
  105. package/resources/icon.png +0 -0
  106. package/src/main/agents.ts +46 -0
  107. package/src/main/bridge.ts +180 -0
  108. package/src/main/ctlsurfApi.ts +142 -0
  109. package/src/main/detectMode.ts +17 -0
  110. package/src/main/headless.ts +182 -0
  111. package/src/main/index.ts +300 -0
  112. package/src/main/orchestrator.ts +404 -0
  113. package/src/main/pty.ts +65 -0
  114. package/src/main/settingsDir.ts +17 -0
  115. package/src/main/tui.ts +366 -0
  116. package/src/main/workerWs.ts +312 -0
  117. package/src/preload/index.ts +114 -0
  118. package/src/renderer/App.tsx +275 -0
  119. package/src/renderer/components/CtlsurfPanel.tsx +49 -0
  120. package/src/renderer/components/EditorPanel.tsx +232 -0
  121. package/src/renderer/components/MultiSplitPane.tsx +251 -0
  122. package/src/renderer/components/PaneLayout.tsx +419 -0
  123. package/src/renderer/components/SettingsDialog.tsx +204 -0
  124. package/src/renderer/components/SplitPane.tsx +82 -0
  125. package/src/renderer/components/StatusBar.tsx +73 -0
  126. package/src/renderer/components/TerminalPanel.tsx +140 -0
  127. package/src/renderer/index.html +12 -0
  128. package/src/renderer/main.tsx +10 -0
  129. package/src/renderer/styles.css +722 -0
  130. package/tsconfig.json +8 -0
  131. package/tsconfig.main.json +15 -0
  132. package/tsconfig.preload.json +14 -0
  133. package/tsconfig.renderer.json +15 -0
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * ctlsurf launcher
5
+ *
6
+ * Subcommands:
7
+ * ctlsurf update — pull latest and rebuild
8
+ * ctlsurf doctor — check all dependencies
9
+ * ctlsurf version — print version
10
+ *
11
+ * Modes (auto-detected or forced):
12
+ * ctlsurf --terminal — terminal TUI mode
13
+ * ctlsurf --desktop — Electron GUI mode
14
+ */
15
+
16
+ const { execFileSync, execSync } = require('child_process')
17
+ const path = require('path')
18
+ const fs = require('fs')
19
+
20
+ const ROOT = path.resolve(__dirname, '..')
21
+ const args = process.argv.slice(2)
22
+ const subcommand = args[0]
23
+
24
+ // ─── Subcommands ──────────────────────────────────
25
+
26
+ if (subcommand === 'version' || args.includes('--version') || args.includes('-v')) {
27
+ try {
28
+ const pkg = require(path.join(ROOT, 'package.json'))
29
+ console.log(`ctlsurf v${pkg.version}`)
30
+ } catch {
31
+ console.log('ctlsurf (unknown version)')
32
+ }
33
+ process.exit(0)
34
+ }
35
+
36
+ if (subcommand === 'update') {
37
+ const G = '\x1b[32m'
38
+ const Y = '\x1b[33m'
39
+ const B = '\x1b[34m'
40
+ const D = '\x1b[90m'
41
+ const R = '\x1b[0m'
42
+
43
+ console.log(`\n${B} ctlsurf update${R}\n`)
44
+
45
+ try {
46
+ console.log(`${D}Updating via npm...${R}`)
47
+ execSync('npm update -g @phenx-inc/ctlsurf', { stdio: 'inherit' })
48
+
49
+ // Re-read version after update
50
+ let ver = '?'
51
+ try { ver = require(path.join(ROOT, 'package.json')).version } catch {}
52
+ console.log(`\n${G}✓${R} ctlsurf v${ver}\n`)
53
+ } catch (err) {
54
+ console.error(`\n${Y}!${R} Update failed: ${err.message}\n`)
55
+ process.exit(1)
56
+ }
57
+ process.exit(0)
58
+ }
59
+
60
+ if (subcommand === 'doctor') {
61
+ const G = '\x1b[32m'
62
+ const Y = '\x1b[33m'
63
+ const R = '\x1b[0m'
64
+ const D = '\x1b[90m'
65
+ const B = '\x1b[34m'
66
+
67
+ console.log(`\n${B} ctlsurf doctor${R}\n`)
68
+
69
+ function check(name, cmd, required, fix) {
70
+ try {
71
+ const out = execSync(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim()
72
+ const ver = out.split('\n')[0]
73
+ console.log(` ${G}✓${R} ${name} ${D}${ver}${R}`)
74
+ return true
75
+ } catch {
76
+ if (required) {
77
+ console.log(` ${Y}✗${R} ${name} ${Y}(required)${R}`)
78
+ } else {
79
+ console.log(` ${Y}✗${R} ${name} ${D}(optional)${R}`)
80
+ }
81
+ if (fix) console.log(` ${D}Install: ${fix}${R}`)
82
+ return false
83
+ }
84
+ }
85
+
86
+ // Required
87
+ check('Node.js', 'node --version', true)
88
+ check('npm', 'npm --version', true)
89
+ check('git', 'git --version', true)
90
+
91
+ // node-pty native addon
92
+ try {
93
+ require(path.join(ROOT, 'node_modules/node-pty'))
94
+ console.log(` ${G}✓${R} node-pty ${D}(native addon loaded)${R}`)
95
+ } catch {
96
+ console.log(` ${Y}✗${R} node-pty ${Y}(native addon failed to load)${R}`)
97
+ console.log(` ${D}Run: cd ${ROOT} && npm install --omit=dev${R}`)
98
+ }
99
+
100
+ console.log('')
101
+
102
+ // Coding agents
103
+ check('Claude Code', 'claude --version', false, 'npm install -g @anthropic-ai/claude-code')
104
+ check('Codex CLI', 'codex --version', false, 'npm install -g @openai/codex')
105
+
106
+ console.log('')
107
+
108
+ // Desktop
109
+ try {
110
+ require.resolve('electron')
111
+ console.log(` ${G}✓${R} Electron ${D}(desktop mode available)${R}`)
112
+ } catch {
113
+ console.log(` ${D}-${R} Electron ${D}(not installed — desktop mode unavailable)${R}`)
114
+ console.log(` ${D}Install: cd ${ROOT} && npm install${R}`)
115
+ }
116
+
117
+ // Build status
118
+ const headlessBuilt = fs.existsSync(path.join(ROOT, 'out/headless/index.mjs'))
119
+ const desktopBuilt = fs.existsSync(path.join(ROOT, 'out/main/index.js'))
120
+ console.log('')
121
+ console.log(` ${headlessBuilt ? G + '✓' : Y + '✗'}${R} Terminal build ${D}(out/headless/index.mjs)${R}`)
122
+ console.log(` ${desktopBuilt ? G + '✓' : D + '-'}${R} Desktop build ${D}(out/main/index.js)${R}`)
123
+
124
+ console.log('')
125
+ process.exit(0)
126
+ }
127
+
128
+ // ─── Mode detection ───────────────────────────────
129
+
130
+ function detectMode(argv) {
131
+ if (argv.includes('--terminal')) return 'terminal'
132
+ if (argv.includes('--desktop')) return 'desktop'
133
+ if (process.env.SSH_CONNECTION || process.env.SSH_TTY) return 'terminal'
134
+ if (process.env.container || process.env.DOCKER_CONTAINER) return 'terminal'
135
+ if (process.platform === 'linux') {
136
+ if (!process.env.DISPLAY && !process.env.WAYLAND_DISPLAY) return 'terminal'
137
+ }
138
+ return 'desktop'
139
+ }
140
+
141
+ const mode = detectMode(args)
142
+
143
+ if (mode === 'desktop') {
144
+ let electronPath
145
+ try {
146
+ electronPath = require('electron')
147
+ } catch {
148
+ console.error('[ctlsurf] Electron not found, falling back to terminal mode')
149
+ runTerminal()
150
+ process.exit(0)
151
+ }
152
+
153
+ try {
154
+ execFileSync(String(electronPath), [ROOT, ...args], { stdio: 'inherit' })
155
+ } catch (err) {
156
+ process.exit(err.status || 0)
157
+ }
158
+ } else {
159
+ runTerminal()
160
+ }
161
+
162
+ function runTerminal() {
163
+ const terminalPath = path.join(ROOT, 'out/headless/index.mjs')
164
+ if (!fs.existsSync(terminalPath)) {
165
+ console.error('[ctlsurf] Terminal build not found. Run: npm run build:headless')
166
+ process.exit(1)
167
+ }
168
+ try {
169
+ execFileSync(process.execPath, [terminalPath, ...args], { stdio: 'inherit' })
170
+ } catch (err) {
171
+ process.exit(err.status || 0)
172
+ }
173
+ }
@@ -0,0 +1,34 @@
1
+ import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
2
+ import react from '@vitejs/plugin-react'
3
+
4
+ export default defineConfig({
5
+ main: {
6
+ plugins: [externalizeDepsPlugin({
7
+ exclude: []
8
+ })],
9
+ build: {
10
+ lib: {
11
+ entry: 'src/main/index.ts'
12
+ },
13
+ rollupOptions: {
14
+ external: [
15
+ 'electron',
16
+ 'node-pty',
17
+ /^node:/
18
+ ]
19
+ }
20
+ },
21
+ resolve: {
22
+ conditions: ['node']
23
+ }
24
+ },
25
+ preload: {
26
+ plugins: [externalizeDepsPlugin()]
27
+ },
28
+ renderer: {
29
+ plugins: [react()],
30
+ worker: {
31
+ format: 'es'
32
+ }
33
+ }
34
+ })