@pixelbyte-software/pixcode 1.51.1 → 1.51.3

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 (320) hide show
  1. package/CODE_OF_CONDUCT.md +41 -41
  2. package/CONTRIBUTING.md +155 -155
  3. package/LICENSE +718 -718
  4. package/README.de.md +169 -169
  5. package/README.ja.md +167 -167
  6. package/README.ko.md +167 -167
  7. package/README.md +419 -419
  8. package/README.ru.md +169 -169
  9. package/README.tr.md +298 -298
  10. package/README.zh-CN.md +167 -167
  11. package/SECURITY.md +46 -46
  12. package/dist/api-automation.html +110 -110
  13. package/dist/api-docs.html +548 -548
  14. package/dist/assets/{index-DARIZgoD.js → index-17CwxHSZ.js} +185 -185
  15. package/dist/assets/index-B9N-gfOQ.css +32 -0
  16. package/dist/clear-cache.html +85 -85
  17. package/dist/convert-icons.md +52 -52
  18. package/dist/docs.html +308 -308
  19. package/dist/favicon.svg +8 -8
  20. package/dist/features.html +133 -133
  21. package/dist/generate-icons.js +48 -48
  22. package/dist/humans.txt +15 -15
  23. package/dist/icons/codex-white.svg +3 -3
  24. package/dist/icons/codex.svg +3 -3
  25. package/dist/icons/cursor-white.svg +11 -11
  26. package/dist/icons/icon-128x128.svg +9 -9
  27. package/dist/icons/icon-144x144.svg +9 -9
  28. package/dist/icons/icon-152x152.svg +9 -9
  29. package/dist/icons/icon-192x192.svg +9 -9
  30. package/dist/icons/icon-384x384.svg +9 -9
  31. package/dist/icons/icon-512x512.svg +9 -9
  32. package/dist/icons/icon-72x72.svg +9 -9
  33. package/dist/icons/icon-96x96.svg +9 -9
  34. package/dist/icons/icon-template.svg +9 -9
  35. package/dist/icons/qwen-logo.svg +14 -14
  36. package/dist/index.html +59 -59
  37. package/dist/landing.html +268 -268
  38. package/dist/llms-full.txt +119 -119
  39. package/dist/llms.txt +53 -53
  40. package/dist/logo.svg +12 -12
  41. package/dist/manifest.json +60 -60
  42. package/dist/openapi.yaml +1696 -1696
  43. package/dist/orchestration.html +125 -125
  44. package/dist/robots.txt +4 -4
  45. package/dist/site.css +692 -692
  46. package/dist/sitemap.xml +51 -51
  47. package/dist/sw.js +132 -132
  48. package/dist-server/server/cli.js +96 -96
  49. package/dist-server/server/daemon/manager.js +33 -33
  50. package/dist-server/server/daemon-manager.js +64 -64
  51. package/dist-server/server/index.js +125 -4
  52. package/dist-server/server/index.js.map +1 -1
  53. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.js +84 -0
  54. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.js.map +1 -0
  55. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.test.js +43 -0
  56. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.test.js.map +1 -0
  57. package/dist-server/server/modules/orchestration/hermes/hermes.routes.js +55 -1
  58. package/dist-server/server/modules/orchestration/hermes/hermes.routes.js.map +1 -1
  59. package/dist-server/server/modules/orchestration/index.js +1 -0
  60. package/dist-server/server/modules/orchestration/index.js.map +1 -1
  61. package/dist-server/server/routes/commands.js +25 -25
  62. package/dist-server/server/routes/git.js +17 -17
  63. package/dist-server/server/routes/live-view.js +46 -46
  64. package/dist-server/server/services/hermes-gateway.js +310 -0
  65. package/dist-server/server/services/hermes-gateway.js.map +1 -1
  66. package/dist-server/server/services/public-api-manifest.js +59 -51
  67. package/dist-server/server/services/public-api-manifest.js.map +1 -1
  68. package/package.json +222 -222
  69. package/scripts/fix-node-pty.js +67 -67
  70. package/scripts/github/create-v1.38-issues.mjs +351 -351
  71. package/scripts/github/create-vscode-workbench-issues.mjs +121 -121
  72. package/scripts/hermes/configure-pixcode-mcp.mjs +165 -163
  73. package/scripts/hermes/pixcode-mcp-server.mjs +1009 -958
  74. package/scripts/smoke/changes-panel-layout.mjs +48 -48
  75. package/scripts/smoke/chat-composer-fixed-layout.mjs +55 -55
  76. package/scripts/smoke/chat-message-timeline-order.mjs +41 -41
  77. package/scripts/smoke/chat-realtime-hydration.mjs +44 -44
  78. package/scripts/smoke/chat-session-provider-pools.mjs +35 -35
  79. package/scripts/smoke/chat-session-state.mjs +19 -19
  80. package/scripts/smoke/code-editor-theme.mjs +55 -55
  81. package/scripts/smoke/code-editor-vscode-engine.mjs +91 -91
  82. package/scripts/smoke/command-center-agent-writes.mjs +79 -79
  83. package/scripts/smoke/command-center-non-git.mjs +46 -46
  84. package/scripts/smoke/context-packet.mjs +43 -43
  85. package/scripts/smoke/control-room-ux-redesign.mjs +91 -91
  86. package/scripts/smoke/daemon-entrypoint.mjs +20 -20
  87. package/scripts/smoke/default-landing-routing.mjs +33 -33
  88. package/scripts/smoke/desktop-native-notifications.mjs +30 -30
  89. package/scripts/smoke/desktop-tray-icon.mjs +33 -33
  90. package/scripts/smoke/discord-release-workflow.mjs +24 -24
  91. package/scripts/smoke/git-install-update.mjs +255 -255
  92. package/scripts/smoke/handoff-artifact-protocol.mjs +50 -50
  93. package/scripts/smoke/hermes-api-install.mjs +56 -56
  94. package/scripts/smoke/hermes-gateway-persistence.mjs +104 -104
  95. package/scripts/smoke/hermes-mcp-pixcode-roundtrip.mjs +426 -367
  96. package/scripts/smoke/hermes-rest-chat-api.mjs +162 -162
  97. package/scripts/smoke/hermes-rest-chat-live.mjs +45 -45
  98. package/scripts/smoke/hermes-rest-codex-launch.mjs +209 -209
  99. package/scripts/smoke/hermes-rest-gateway.mjs +79 -70
  100. package/scripts/smoke/hermes-rest-live.mjs +42 -42
  101. package/scripts/smoke/hermes-roundtrip.mjs +167 -167
  102. package/scripts/smoke/hermes-settings-commands.mjs +349 -346
  103. package/scripts/smoke/hermes-smoke-launcher-guard.mjs +34 -34
  104. package/scripts/smoke/live-view-diagnostics.mjs +53 -53
  105. package/scripts/smoke/live-view-environment.mjs +92 -92
  106. package/scripts/smoke/live-view-integration.mjs +450 -450
  107. package/scripts/smoke/mac-desktop-runtime.mjs +37 -37
  108. package/scripts/smoke/mobile-tunnel-guidance.mjs +29 -29
  109. package/scripts/smoke/model-registry.mjs +36 -36
  110. package/scripts/smoke/multi-project-ui.mjs +45 -45
  111. package/scripts/smoke/multi-worker-slots.mjs +42 -42
  112. package/scripts/smoke/notification-center.mjs +87 -87
  113. package/scripts/smoke/notification-inapp-preference.mjs +23 -23
  114. package/scripts/smoke/notification-taxonomy.mjs +58 -58
  115. package/scripts/smoke/orchestration-api.mjs +172 -172
  116. package/scripts/smoke/orchestration-execution-dashboard.mjs +33 -33
  117. package/scripts/smoke/orchestration-live-run.mjs +176 -176
  118. package/scripts/smoke/orchestration-mobile-scroll.mjs +29 -29
  119. package/scripts/smoke/orchestration-model-sync.mjs +30 -30
  120. package/scripts/smoke/orchestration-permission-fallback.mjs +34 -34
  121. package/scripts/smoke/orchestration-runtime-guards.mjs +48 -48
  122. package/scripts/smoke/orchestration-user-facing-output.mjs +25 -25
  123. package/scripts/smoke/permission-policy.mjs +50 -50
  124. package/scripts/smoke/pixcode-workbench-1-48.mjs +167 -164
  125. package/scripts/smoke/provider-models-opencode-live.mjs +66 -66
  126. package/scripts/smoke/provider-rest-api.mjs +124 -124
  127. package/scripts/smoke/provider-selection-status.mjs +52 -52
  128. package/scripts/smoke/run-state-refresh.mjs +52 -52
  129. package/scripts/smoke/runtime-manager.mjs +99 -99
  130. package/scripts/smoke/shell-manual-disconnect.mjs +30 -30
  131. package/scripts/smoke/side-panel-editor-layout.mjs +34 -34
  132. package/scripts/smoke/static-root-routing.mjs +21 -21
  133. package/scripts/smoke/strict-handoff-compact.mjs +60 -60
  134. package/scripts/smoke/taskmaster-config.mjs +24 -24
  135. package/scripts/smoke/taskmaster-execution-telegram.mjs +3 -3
  136. package/scripts/smoke/taskmaster-onboarding.mjs +3 -3
  137. package/scripts/smoke/taskmaster-run-graph.mjs +3 -3
  138. package/scripts/smoke/telegram-control.mjs +242 -242
  139. package/scripts/smoke/tunnel-persistence.mjs +56 -56
  140. package/scripts/smoke/update-issue-progress.mjs +69 -69
  141. package/scripts/smoke/update-ux.mjs +55 -55
  142. package/scripts/smoke/v138-completion.mjs +132 -132
  143. package/scripts/smoke/v138-desktop-release-hardening.mjs +69 -69
  144. package/scripts/smoke/v138-diagnostics.mjs +63 -63
  145. package/scripts/smoke/v138-issue-planner.mjs +33 -33
  146. package/scripts/smoke/v143-remote-control.mjs +76 -76
  147. package/scripts/smoke/v144-production-loop.mjs +47 -47
  148. package/scripts/smoke/v145-platformization.mjs +46 -46
  149. package/scripts/smoke/v146-control-room-ui.mjs +150 -150
  150. package/scripts/smoke/version-modal-autoshow.mjs +29 -29
  151. package/scripts/smoke/vscode-workbench-layout.mjs +63 -63
  152. package/scripts/smoke/vscode-workbench-polish.mjs +461 -436
  153. package/scripts/smoke/workflow-fallback-replay.mjs +56 -56
  154. package/scripts/smoke/workflow-templates.mjs +43 -43
  155. package/scripts/smoke/workflow-trace-timeline.mjs +46 -46
  156. package/scripts/update-git-install.mjs +293 -293
  157. package/server/claude-sdk.js +920 -920
  158. package/server/cli.js +1039 -1039
  159. package/server/constants/config.js +4 -4
  160. package/server/cursor-cli.js +344 -344
  161. package/server/daemon/manager.js +563 -563
  162. package/server/daemon-manager.js +964 -964
  163. package/server/database/db.js +921 -921
  164. package/server/database/json-store.js +197 -197
  165. package/server/gemini-cli.js +550 -550
  166. package/server/gemini-response-handler.js +79 -79
  167. package/server/index.js +131 -3
  168. package/server/load-env.js +35 -35
  169. package/server/middleware/auth.js +175 -175
  170. package/server/modules/orchestration/a2a/adapter-registry.ts +108 -108
  171. package/server/modules/orchestration/a2a/adapters/abstract-a2a.adapter.ts +63 -63
  172. package/server/modules/orchestration/a2a/adapters/claude-code.adapter.ts +286 -286
  173. package/server/modules/orchestration/a2a/adapters/codex.adapter.ts +244 -244
  174. package/server/modules/orchestration/a2a/adapters/cursor.adapter.ts +249 -249
  175. package/server/modules/orchestration/a2a/adapters/gemini.adapter.ts +248 -248
  176. package/server/modules/orchestration/a2a/adapters/json-event.adapter.test.ts +60 -0
  177. package/server/modules/orchestration/a2a/adapters/json-event.adapter.ts +101 -0
  178. package/server/modules/orchestration/a2a/adapters/opencode.adapter.ts +248 -248
  179. package/server/modules/orchestration/a2a/adapters/qwen.adapter.ts +248 -248
  180. package/server/modules/orchestration/a2a/agent-card.ts +55 -55
  181. package/server/modules/orchestration/a2a/routes.ts +590 -590
  182. package/server/modules/orchestration/a2a/task-store.ts +178 -178
  183. package/server/modules/orchestration/a2a/types.ts +126 -126
  184. package/server/modules/orchestration/a2a/validator.ts +113 -113
  185. package/server/modules/orchestration/hermes/hermes.routes.ts +642 -583
  186. package/server/modules/orchestration/index.ts +101 -100
  187. package/server/modules/orchestration/preview/port-watcher.ts +112 -112
  188. package/server/modules/orchestration/preview/preview-proxy.ts +60 -60
  189. package/server/modules/orchestration/preview/types.ts +19 -19
  190. package/server/modules/orchestration/security/permission-policy.ts +401 -401
  191. package/server/modules/orchestration/tasks/orchestration-task-store.ts +41 -41
  192. package/server/modules/orchestration/tasks/orchestration-task.routes.ts +64 -64
  193. package/server/modules/orchestration/tasks/orchestration-task.service.ts +209 -209
  194. package/server/modules/orchestration/tasks/orchestration-task.types.ts +40 -40
  195. package/server/modules/orchestration/tasks/task-run-graph.ts +155 -155
  196. package/server/modules/orchestration/workflows/approval-queue.ts +106 -106
  197. package/server/modules/orchestration/workflows/built-in-workflows.ts +127 -127
  198. package/server/modules/orchestration/workflows/context-packet.ts +186 -186
  199. package/server/modules/orchestration/workflows/handoff-artifact.ts +175 -175
  200. package/server/modules/orchestration/workflows/workflow-fallback-policy.ts +161 -161
  201. package/server/modules/orchestration/workflows/workflow-replay.ts +254 -254
  202. package/server/modules/orchestration/workflows/workflow-runner.ts +2070 -2070
  203. package/server/modules/orchestration/workflows/workflow-store.ts +97 -97
  204. package/server/modules/orchestration/workflows/workflow-templates.ts +272 -272
  205. package/server/modules/orchestration/workflows/workflow-trace.ts +424 -424
  206. package/server/modules/orchestration/workflows/workflow.routes.ts +586 -586
  207. package/server/modules/orchestration/workflows/workflow.types.ts +111 -111
  208. package/server/modules/orchestration/workflows/workspace-target.ts +122 -122
  209. package/server/modules/orchestration/workspace/docker-workspace.ts +136 -136
  210. package/server/modules/orchestration/workspace/path-safety.ts +55 -55
  211. package/server/modules/orchestration/workspace/types.ts +52 -52
  212. package/server/modules/orchestration/workspace/workspace-manager.ts +102 -102
  213. package/server/modules/orchestration/workspace/worktree-workspace.ts +126 -126
  214. package/server/modules/providers/index.ts +2 -2
  215. package/server/modules/providers/list/claude/claude-auth.provider.ts +146 -146
  216. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -135
  217. package/server/modules/providers/list/claude/claude-sessions.provider.ts +306 -306
  218. package/server/modules/providers/list/claude/claude.provider.ts +15 -15
  219. package/server/modules/providers/list/codex/codex-auth.provider.ts +117 -117
  220. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -135
  221. package/server/modules/providers/list/codex/codex-sessions.provider.ts +319 -319
  222. package/server/modules/providers/list/codex/codex.provider.ts +15 -15
  223. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +147 -147
  224. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -108
  225. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +421 -421
  226. package/server/modules/providers/list/cursor/cursor.provider.ts +15 -15
  227. package/server/modules/providers/list/gemini/gemini-auth.provider.ts +173 -173
  228. package/server/modules/providers/list/gemini/gemini-mcp.provider.ts +110 -110
  229. package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +227 -227
  230. package/server/modules/providers/list/gemini/gemini.provider.ts +15 -15
  231. package/server/modules/providers/list/opencode/opencode-auth.provider.ts +131 -131
  232. package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +126 -126
  233. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +286 -286
  234. package/server/modules/providers/list/opencode/opencode.provider.ts +29 -29
  235. package/server/modules/providers/list/qwen/qwen-auth.provider.ts +146 -146
  236. package/server/modules/providers/list/qwen/qwen-mcp.provider.ts +114 -114
  237. package/server/modules/providers/list/qwen/qwen-sessions.provider.ts +265 -265
  238. package/server/modules/providers/list/qwen/qwen.provider.ts +21 -21
  239. package/server/modules/providers/provider.registry.ts +40 -40
  240. package/server/modules/providers/provider.routes.ts +944 -944
  241. package/server/modules/providers/services/mcp.service.ts +86 -86
  242. package/server/modules/providers/services/provider-auth.service.ts +26 -26
  243. package/server/modules/providers/services/sessions.service.ts +45 -45
  244. package/server/modules/providers/shared/base/abstract.provider.ts +20 -20
  245. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -151
  246. package/server/modules/providers/shared/provider-configs.ts +142 -142
  247. package/server/modules/providers/tests/mcp.test.ts +293 -293
  248. package/server/openai-codex.js +462 -462
  249. package/server/opencode-cli.js +491 -491
  250. package/server/opencode-response-handler.js +111 -111
  251. package/server/projects.js +3008 -3008
  252. package/server/qwen-code-cli.js +410 -410
  253. package/server/qwen-response-handler.js +73 -73
  254. package/server/routes/agent.js +1435 -1435
  255. package/server/routes/auth.js +159 -159
  256. package/server/routes/codex.js +20 -20
  257. package/server/routes/commands.js +570 -570
  258. package/server/routes/cursor.js +61 -61
  259. package/server/routes/diagnostics.js +41 -41
  260. package/server/routes/gemini.js +25 -25
  261. package/server/routes/git.js +1650 -1650
  262. package/server/routes/live-view.js +411 -411
  263. package/server/routes/mcp-utils.js +13 -13
  264. package/server/routes/messages.js +62 -62
  265. package/server/routes/network.js +125 -125
  266. package/server/routes/platformization.js +212 -212
  267. package/server/routes/plugins.js +320 -320
  268. package/server/routes/production-agent-loop.js +90 -90
  269. package/server/routes/projects.js +917 -917
  270. package/server/routes/public-api.js +34 -34
  271. package/server/routes/qwen.js +27 -27
  272. package/server/routes/remote.js +55 -55
  273. package/server/routes/settings.js +321 -321
  274. package/server/routes/telegram.js +140 -140
  275. package/server/routes/user.js +125 -125
  276. package/server/routes/webhooks.js +63 -63
  277. package/server/services/control-room.js +102 -102
  278. package/server/services/diagnostics.js +165 -165
  279. package/server/services/external-access.js +375 -375
  280. package/server/services/hermes-gateway.js +1562 -1247
  281. package/server/services/hermes-install-jobs.js +729 -729
  282. package/server/services/install-jobs.js +715 -715
  283. package/server/services/live-view.js +956 -956
  284. package/server/services/managed-runtimes.js +493 -493
  285. package/server/services/model-registry.js +144 -144
  286. package/server/services/notification-orchestrator.js +365 -365
  287. package/server/services/notification-taxonomy.js +204 -204
  288. package/server/services/platformization.js +815 -815
  289. package/server/services/production-agent-loop.js +248 -248
  290. package/server/services/provider-cli-versions.js +149 -149
  291. package/server/services/provider-credentials.js +189 -189
  292. package/server/services/provider-models.js +396 -396
  293. package/server/services/public-api-manifest.js +190 -182
  294. package/server/services/remote-connection.js +127 -127
  295. package/server/services/runtime-manager.js +323 -323
  296. package/server/services/startup-update.js +234 -234
  297. package/server/services/telegram/bot.js +331 -331
  298. package/server/services/telegram/control-center.js +979 -979
  299. package/server/services/telegram/telegram-http-client.js +151 -151
  300. package/server/services/telegram/translations.js +340 -340
  301. package/server/services/vapid-keys.js +36 -36
  302. package/server/services/webhooks.js +216 -216
  303. package/server/sessionManager.js +225 -225
  304. package/server/shared/interfaces.ts +54 -54
  305. package/server/shared/types.ts +172 -172
  306. package/server/shared/utils.ts +193 -193
  307. package/server/tsconfig.json +36 -36
  308. package/server/utils/colors.js +21 -21
  309. package/server/utils/commandParser.js +305 -305
  310. package/server/utils/frontmatter.js +18 -18
  311. package/server/utils/gitConfig.js +34 -34
  312. package/server/utils/plugin-loader.js +457 -457
  313. package/server/utils/plugin-process-manager.js +185 -185
  314. package/server/utils/port-access.js +209 -209
  315. package/server/utils/runtime-paths.js +37 -37
  316. package/server/utils/url-detection.js +71 -71
  317. package/server/vite-daemon.js +79 -79
  318. package/shared/modelConstants.js +161 -161
  319. package/shared/networkHosts.js +22 -22
  320. package/dist/assets/index-DMz0zv6T.css +0 -32
@@ -221,22 +221,22 @@ function buildDaemonServiceUnit({ appRoot, serverPort, databasePath, nodeExecPat
221
221
  nodeExecPath,
222
222
  cliEntry,
223
223
  });
224
- return `[Unit]
225
- Description=Pixcode Server
226
- After=network.target
227
-
228
- [Service]
229
- Type=simple
230
- WorkingDirectory=${appRoot}
231
- ExecStart=${execStart}
232
- Environment=HOST=0.0.0.0
233
- Environment=CI=true
234
- Environment=PIXCODE_DAEMON_MANAGED=1
235
- Restart=always
236
- RestartSec=2
237
-
238
- [Install]
239
- WantedBy=default.target
224
+ return `[Unit]
225
+ Description=Pixcode Server
226
+ After=network.target
227
+
228
+ [Service]
229
+ Type=simple
230
+ WorkingDirectory=${appRoot}
231
+ ExecStart=${execStart}
232
+ Environment=HOST=0.0.0.0
233
+ Environment=CI=true
234
+ Environment=PIXCODE_DAEMON_MANAGED=1
235
+ Restart=always
236
+ RestartSec=2
237
+
238
+ [Install]
239
+ WantedBy=default.target
240
240
  `;
241
241
  }
242
242
  function resolveFrontendDaemonEntry(appRoot, cliEntry) {
@@ -277,22 +277,22 @@ function buildFrontendDaemonServiceUnit({ appRoot, frontendPort, nodeExecPath, c
277
277
  nodeExecPath,
278
278
  cliEntry,
279
279
  });
280
- return `[Unit]
281
- Description=Pixcode Frontend (Vite Dev Server)
282
- After=network.target
283
-
284
- [Service]
285
- Type=simple
286
- WorkingDirectory=${appRoot}
287
- ExecStart=${execStart}
288
- Environment=HOST=0.0.0.0
289
- Environment=CI=true
290
- Environment=PIXCODE_DAEMON_MANAGED=1
291
- Restart=always
292
- RestartSec=2
293
-
294
- [Install]
295
- WantedBy=default.target
280
+ return `[Unit]
281
+ Description=Pixcode Frontend (Vite Dev Server)
282
+ After=network.target
283
+
284
+ [Service]
285
+ Type=simple
286
+ WorkingDirectory=${appRoot}
287
+ ExecStart=${execStart}
288
+ Environment=HOST=0.0.0.0
289
+ Environment=CI=true
290
+ Environment=PIXCODE_DAEMON_MANAGED=1
291
+ Restart=always
292
+ RestartSec=2
293
+
294
+ [Install]
295
+ WantedBy=default.target
296
296
  `;
297
297
  }
298
298
  function normalizeState(value) {
@@ -489,38 +489,38 @@ function showDaemonHelp(c, context = {}) {
489
489
  const statusExample = buildDaemonCliCommand({ subcommand: 'status', mode: 'system' }, context);
490
490
  const doctorExample = buildDaemonCliCommand({ subcommand: 'doctor', mode: 'auto' }, context);
491
491
  const logsExample = buildDaemonCliCommand({ subcommand: 'logs', mode: 'system' }, context);
492
- console.log(`
493
- ${c.bright('Pixcode Daemon')} - Persistent Linux service manager
494
-
495
- Usage:
496
- ${usagePrefix} daemon [subcommand] [options]
497
-
498
- Subcommands:
499
- ${c.bright('install')} Install/update unit, reload daemon, enable and start now
500
- ${c.bright('start')} Start the service
501
- ${c.bright('stop')} Stop the service (temporary; auto-start remains enabled)
502
- ${c.bright('restart')} Restart the service
503
- ${c.bright('status')} Show active/enabled state
504
- ${c.bright('logs')} Show recent service logs
505
- ${c.bright('enable')} Enable auto-start at boot
506
- ${c.bright('disable')} Disable auto-start at boot
507
- ${c.bright('uninstall')} Stop, disable, and remove the service unit
508
- ${c.bright('doctor')} Run diagnostics (bus, linger, units, state, port, logs)
509
- ${c.bright('help')} Show this help
510
-
511
- Options:
512
- -p, --port <port> Set service server port (default: 3001)
513
- --frontend-port <port> Start a separate frontend Vite service on this port (legacy/dev)
514
- --single-port, --no-frontend
515
- Serve the built UI from the backend port only (default)
516
- -m, --mode <mode> Service mode: user | system | auto (default: system)
517
- --database-path <path> Set service database path
518
-
519
- Examples:
520
- $ ${installExample}
521
- $ ${statusExample}
522
- $ ${doctorExample}
523
- $ ${logsExample}
492
+ console.log(`
493
+ ${c.bright('Pixcode Daemon')} - Persistent Linux service manager
494
+
495
+ Usage:
496
+ ${usagePrefix} daemon [subcommand] [options]
497
+
498
+ Subcommands:
499
+ ${c.bright('install')} Install/update unit, reload daemon, enable and start now
500
+ ${c.bright('start')} Start the service
501
+ ${c.bright('stop')} Stop the service (temporary; auto-start remains enabled)
502
+ ${c.bright('restart')} Restart the service
503
+ ${c.bright('status')} Show active/enabled state
504
+ ${c.bright('logs')} Show recent service logs
505
+ ${c.bright('enable')} Enable auto-start at boot
506
+ ${c.bright('disable')} Disable auto-start at boot
507
+ ${c.bright('uninstall')} Stop, disable, and remove the service unit
508
+ ${c.bright('doctor')} Run diagnostics (bus, linger, units, state, port, logs)
509
+ ${c.bright('help')} Show this help
510
+
511
+ Options:
512
+ -p, --port <port> Set service server port (default: 3001)
513
+ --frontend-port <port> Start a separate frontend Vite service on this port (legacy/dev)
514
+ --single-port, --no-frontend
515
+ Serve the built UI from the backend port only (default)
516
+ -m, --mode <mode> Service mode: user | system | auto (default: system)
517
+ --database-path <path> Set service database path
518
+
519
+ Examples:
520
+ $ ${installExample}
521
+ $ ${statusExample}
522
+ $ ${doctorExample}
523
+ $ ${logsExample}
524
524
  `);
525
525
  }
526
526
  export function hasInstalledDaemonUnit() {
@@ -84,7 +84,7 @@ import productionAgentLoopRoutes from './routes/production-agent-loop.js';
84
84
  import platformizationRoutes from './routes/platformization.js';
85
85
  import liveViewRoutes, { createLiveViewPublicRouter } from './routes/live-view.js';
86
86
  import providerRoutes from './modules/providers/provider.routes.js';
87
- import { createHermesTaskRouter, adapterRegistry, ClaudeCodeA2AAdapter, CodexA2AAdapter, CursorA2AAdapter, GeminiA2AAdapter, OpenCodeA2AAdapter, QwenA2AAdapter, createPreviewProxyRouter, createOrchestrationTaskRouter, createHermesRouter, createWorkflowRouter, } from './modules/orchestration/index.js';
87
+ import { createHermesTaskRouter, adapterRegistry, ClaudeCodeA2AAdapter, CodexA2AAdapter, CursorA2AAdapter, GeminiA2AAdapter, OpenCodeA2AAdapter, QwenA2AAdapter, JsonEventA2AAdapter, createPreviewProxyRouter, createOrchestrationTaskRouter, createHermesRouter, createWorkflowRouter, } from './modules/orchestration/index.js';
88
88
  import networkRoutes from './routes/network.js';
89
89
  import telegramRoutes from './routes/telegram.js';
90
90
  import { restoreRequestedTunnel } from './services/external-access.js';
@@ -249,6 +249,109 @@ async function setupProjectsWatcher() {
249
249
  console.error('[ERROR] Failed to setup any provider watchers');
250
250
  }
251
251
  }
252
+ // ── Per-project workspace watchers (file explorer live refresh) ─────────────
253
+ // setupProjectsWatcher() above only watches provider metadata folders
254
+ // (~/.claude/projects etc.), so the file explorer never learned about changes
255
+ // inside the actual project working directory. These watchers are created on
256
+ // demand when a client sends `watch-project` over /ws and broadcast debounced
257
+ // `project_files_updated` events to subscribed clients only, letting the
258
+ // explorer refresh automatically without HTTP polling.
259
+ const WORKSPACE_WATCHER_DEBOUNCE_MS = 800;
260
+ const workspaceWatchers = new Map(); // projectName -> { watcher, subscribers, debounceTimer, pendingEvent, rootPath }
261
+ async function subscribeToWorkspace(ws, projectName) {
262
+ if (!projectName || typeof projectName !== 'string')
263
+ return;
264
+ const existing = workspaceWatchers.get(projectName);
265
+ if (existing) {
266
+ existing.subscribers.add(ws);
267
+ return;
268
+ }
269
+ let rootPath;
270
+ try {
271
+ rootPath = await extractProjectDirectory(projectName);
272
+ await fsPromises.access(rootPath);
273
+ }
274
+ catch (error) {
275
+ console.warn(`[watcher] Cannot watch workspace for ${projectName}:`, error.message);
276
+ return;
277
+ }
278
+ const entry = {
279
+ watcher: null,
280
+ subscribers: new Set([ws]),
281
+ debounceTimer: null,
282
+ pendingEvent: null,
283
+ rootPath,
284
+ };
285
+ workspaceWatchers.set(projectName, entry);
286
+ const broadcastFileUpdate = (eventType, filePath) => {
287
+ entry.pendingEvent = { eventType, filePath };
288
+ if (entry.debounceTimer) {
289
+ clearTimeout(entry.debounceTimer);
290
+ }
291
+ entry.debounceTimer = setTimeout(() => {
292
+ entry.debounceTimer = null;
293
+ const pending = entry.pendingEvent || {};
294
+ entry.pendingEvent = null;
295
+ const message = JSON.stringify({
296
+ type: 'project_files_updated',
297
+ projectName,
298
+ changeType: pending.eventType || 'change',
299
+ changedFile: pending.filePath ? path.relative(rootPath, pending.filePath) : null,
300
+ timestamp: new Date().toISOString(),
301
+ });
302
+ entry.subscribers.forEach((client) => {
303
+ if (client.readyState === WebSocket.OPEN) {
304
+ client.send(message);
305
+ }
306
+ });
307
+ }, WORKSPACE_WATCHER_DEBOUNCE_MS);
308
+ };
309
+ try {
310
+ const chokidar = (await import('chokidar')).default;
311
+ const watcher = chokidar.watch(rootPath, {
312
+ ignored: WATCHER_IGNORED_PATTERNS,
313
+ persistent: true,
314
+ ignoreInitial: true,
315
+ followSymlinks: false,
316
+ depth: 10,
317
+ awaitWriteFinish: {
318
+ stabilityThreshold: 500,
319
+ pollInterval: 250
320
+ }
321
+ });
322
+ watcher
323
+ .on('add', (filePath) => broadcastFileUpdate('add', filePath))
324
+ .on('change', (filePath) => broadcastFileUpdate('change', filePath))
325
+ .on('unlink', (filePath) => broadcastFileUpdate('unlink', filePath))
326
+ .on('addDir', (dirPath) => broadcastFileUpdate('addDir', dirPath))
327
+ .on('unlinkDir', (dirPath) => broadcastFileUpdate('unlinkDir', dirPath))
328
+ .on('error', (error) => {
329
+ console.error(`[ERROR] Workspace watcher error for ${projectName}:`, error);
330
+ });
331
+ entry.watcher = watcher;
332
+ }
333
+ catch (error) {
334
+ workspaceWatchers.delete(projectName);
335
+ console.error(`[ERROR] Failed to watch workspace for ${projectName}:`, error);
336
+ }
337
+ }
338
+ function unsubscribeFromWorkspace(ws, projectName = null) {
339
+ const entries = projectName
340
+ ? (workspaceWatchers.has(projectName) ? [[projectName, workspaceWatchers.get(projectName)]] : [])
341
+ : Array.from(workspaceWatchers.entries());
342
+ for (const [name, entry] of entries) {
343
+ entry.subscribers.delete(ws);
344
+ if (entry.subscribers.size === 0) {
345
+ if (entry.debounceTimer) {
346
+ clearTimeout(entry.debounceTimer);
347
+ }
348
+ workspaceWatchers.delete(name);
349
+ entry.watcher?.close().catch((error) => {
350
+ console.warn(`[watcher] Failed to close workspace watcher for ${name}:`, error?.message || error);
351
+ });
352
+ }
353
+ }
354
+ }
252
355
  const app = express();
253
356
  const server = http.createServer(app);
254
357
  const ptySessionsMap = new Map();
@@ -502,7 +605,9 @@ function buildProviderShellPermissionFlags(provider, permissionMode, skipPermiss
502
605
  if (mode === 'plan') {
503
606
  return ['--agent', 'plan'];
504
607
  }
505
- return bypass ? ['--dangerously-skip-permissions'] : [];
608
+ // OpenCode's interactive TUI rejects the headless run-only bypass
609
+ // option; passing it makes the CLI print help and exit before opening.
610
+ return [];
506
611
  }
507
612
  if (provider === 'claude') {
508
613
  return bypass ? ['--dangerously-skip-permissions'] : [];
@@ -824,6 +929,7 @@ adapterRegistry.register(new CursorA2AAdapter());
824
929
  adapterRegistry.register(new GeminiA2AAdapter());
825
930
  adapterRegistry.register(new QwenA2AAdapter());
826
931
  adapterRegistry.register(new OpenCodeA2AAdapter());
932
+ adapterRegistry.register(new JsonEventA2AAdapter());
827
933
  app.use('/hermes', createHermesTaskRouter());
828
934
  app.use('/preview', authenticateToken, createPreviewProxyRouter());
829
935
  app.use('/api/orchestration', authenticateToken, createOrchestrationTaskRouter());
@@ -1677,8 +1783,12 @@ app.get('/api/projects/:projectName/files', authenticateToken, async (req, res)
1677
1783
  }
1678
1784
  catch (error) {
1679
1785
  console.error('Error extracting project directory:', error);
1680
- // Fallback to simple dash replacement
1681
- actualPath = req.params.projectName.replace(/-/g, '/');
1786
+ // Do NOT fall back to projectName.replace(/-/g, '/') here: on Windows the
1787
+ // dash-encoded name ("C--Users-...") decodes to a garbage path ("C//Users/...")
1788
+ // that can never exist, so the old fallback just produced a confusing 404
1789
+ // with a fabricated path. extractProjectDirectory already handles the
1790
+ // POSIX-style decode internally; if it throws, the project is unknown.
1791
+ return res.status(404).json({ error: `Project not found: ${req.params.projectName}` });
1682
1792
  }
1683
1793
  // Check if path exists
1684
1794
  try {
@@ -2331,6 +2441,15 @@ function handleChatConnection(ws, request) {
2331
2441
  });
2332
2442
  }
2333
2443
  }
2444
+ else if (data.type === 'watch-project') {
2445
+ // Subscribe this client to live file-tree updates for a project
2446
+ // workspace. The server pushes debounced `project_files_updated`
2447
+ // events so the explorer refreshes without HTTP polling.
2448
+ await subscribeToWorkspace(ws, data.projectName);
2449
+ }
2450
+ else if (data.type === 'unwatch-project') {
2451
+ unsubscribeFromWorkspace(ws, data.projectName || null);
2452
+ }
2334
2453
  else if (data.type === 'get-active-sessions') {
2335
2454
  // Get all currently active sessions
2336
2455
  const activeSessions = {
@@ -2359,6 +2478,8 @@ function handleChatConnection(ws, request) {
2359
2478
  console.log('🔌 Chat client disconnected');
2360
2479
  // Remove from connected clients
2361
2480
  connectedClients.delete(ws);
2481
+ // Drop any workspace watcher subscriptions held by this socket
2482
+ unsubscribeFromWorkspace(ws);
2362
2483
  });
2363
2484
  }
2364
2485
  // Handle shell WebSocket connections