@jingyi0605/codingns 0.2.0 → 0.3.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 (328) hide show
  1. package/README.md +44 -0
  2. package/bin/codingns.mjs +918 -55
  3. package/dist/public/assets/{TerminalPage-BlbQuWi1.js → TerminalPage-Dfw1QUqW.js} +19 -19
  4. package/dist/public/assets/index-DR2rPNi7.css +1 -0
  5. package/dist/public/assets/index-DTOruahn.js +114 -0
  6. package/dist/public/index.html +2 -2
  7. package/dist/server/config/env.d.ts +3 -0
  8. package/dist/server/config/env.js +35 -3
  9. package/dist/server/config/env.js.map +1 -1
  10. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +89 -0
  11. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +138 -0
  12. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -0
  13. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +115 -0
  14. package/dist/server/modules/assistant-capability/assistant-capability-service.js +241 -0
  15. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -0
  16. package/dist/server/modules/butler/butler-control-session-service.d.ts +3 -1
  17. package/dist/server/modules/butler/butler-control-session-service.js +96 -33
  18. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  19. package/dist/server/modules/butler/butler-follow-up-scheduler.d.ts +9 -0
  20. package/dist/server/modules/butler/butler-follow-up-scheduler.js +47 -11
  21. package/dist/server/modules/butler/butler-follow-up-scheduler.js.map +1 -1
  22. package/dist/server/modules/butler/butler-follow-up-service.d.ts +7 -1
  23. package/dist/server/modules/butler/butler-follow-up-service.js +10 -0
  24. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  25. package/dist/server/modules/butler/butler-session-service.d.ts +3 -1
  26. package/dist/server/modules/butler/butler-session-service.js +82 -16
  27. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  28. package/dist/server/modules/butler/butler-session-summary-service.d.ts +8 -1
  29. package/dist/server/modules/butler/butler-session-summary-service.js +34 -7
  30. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  31. package/dist/server/modules/butler/context-aggregator.js +44 -13
  32. package/dist/server/modules/butler/context-aggregator.js.map +1 -1
  33. package/dist/server/modules/butler/patrol-scheduler.d.ts +9 -0
  34. package/dist/server/modules/butler/patrol-scheduler.js +63 -9
  35. package/dist/server/modules/butler/patrol-scheduler.js.map +1 -1
  36. package/dist/server/modules/butler/session-summary-scheduler.d.ts +9 -0
  37. package/dist/server/modules/butler/session-summary-scheduler.js +47 -11
  38. package/dist/server/modules/butler/session-summary-scheduler.js.map +1 -1
  39. package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.d.ts +38 -0
  40. package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.js +99 -0
  41. package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.js.map +1 -0
  42. package/dist/server/modules/debug-target/debug-target-controller.d.ts +70 -0
  43. package/dist/server/modules/debug-target/debug-target-controller.js +113 -0
  44. package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -0
  45. package/dist/server/modules/debug-target/debug-target-service.d.ts +105 -0
  46. package/dist/server/modules/debug-target/debug-target-service.js +1644 -0
  47. package/dist/server/modules/debug-target/debug-target-service.js.map +1 -0
  48. package/dist/server/modules/debug-target/framework-compatibility-matrix.d.ts +4 -0
  49. package/dist/server/modules/debug-target/framework-compatibility-matrix.js +45 -0
  50. package/dist/server/modules/debug-target/framework-compatibility-matrix.js.map +1 -0
  51. package/dist/server/modules/debug-target/launch-adapter-registry.d.ts +25 -0
  52. package/dist/server/modules/debug-target/launch-adapter-registry.js +445 -0
  53. package/dist/server/modules/debug-target/launch-adapter-registry.js.map +1 -0
  54. package/dist/server/modules/file/file-constants.d.ts +1 -0
  55. package/dist/server/modules/file/file-constants.js +1 -0
  56. package/dist/server/modules/file/file-constants.js.map +1 -1
  57. package/dist/server/modules/file/file-content-service.d.ts +2 -1
  58. package/dist/server/modules/file/file-content-service.js +53 -0
  59. package/dist/server/modules/file/file-content-service.js.map +1 -1
  60. package/dist/server/modules/file/file-controller.js +12 -3
  61. package/dist/server/modules/file/file-controller.js.map +1 -1
  62. package/dist/server/modules/file/file-preview-link-service.js +6 -37
  63. package/dist/server/modules/file/file-preview-link-service.js.map +1 -1
  64. package/dist/server/modules/file/file-preview-service.d.ts +6 -12
  65. package/dist/server/modules/file/file-preview-service.js +114 -28
  66. package/dist/server/modules/file/file-preview-service.js.map +1 -1
  67. package/dist/server/modules/file/file-preview-types.d.ts +37 -0
  68. package/dist/server/modules/file/file-preview-types.js +84 -0
  69. package/dist/server/modules/file/file-preview-types.js.map +1 -0
  70. package/dist/server/modules/git/commit-orchestrator.d.ts +4 -1
  71. package/dist/server/modules/git/commit-orchestrator.js +18 -1
  72. package/dist/server/modules/git/commit-orchestrator.js.map +1 -1
  73. package/dist/server/modules/git/git-auth.d.ts +25 -0
  74. package/dist/server/modules/git/git-auth.js +88 -0
  75. package/dist/server/modules/git/git-auth.js.map +1 -0
  76. package/dist/server/modules/git/git-controller.d.ts +12 -0
  77. package/dist/server/modules/git/git-controller.js +18 -1
  78. package/dist/server/modules/git/git-controller.js.map +1 -1
  79. package/dist/server/modules/git/git-read-service.d.ts +3 -1
  80. package/dist/server/modules/git/git-read-service.js +119 -2
  81. package/dist/server/modules/git/git-read-service.js.map +1 -1
  82. package/dist/server/modules/git/git-remote-credential-service.d.ts +9 -0
  83. package/dist/server/modules/git/git-remote-credential-service.js +76 -0
  84. package/dist/server/modules/git/git-remote-credential-service.js.map +1 -0
  85. package/dist/server/modules/git/git-write-service.d.ts +5 -2
  86. package/dist/server/modules/git/git-write-service.js +33 -17
  87. package/dist/server/modules/git/git-write-service.js.map +1 -1
  88. package/dist/server/modules/git/types.d.ts +26 -0
  89. package/dist/server/modules/git/workspace-repo-guard.js +3 -2
  90. package/dist/server/modules/git/workspace-repo-guard.js.map +1 -1
  91. package/dist/server/modules/provider/codex-model-options.d.ts +3 -1
  92. package/dist/server/modules/provider/codex-model-options.js +4 -1
  93. package/dist/server/modules/provider/codex-model-options.js.map +1 -1
  94. package/dist/server/modules/provider/opencode-model-options.d.ts +3 -1
  95. package/dist/server/modules/provider/opencode-model-options.js +5 -1
  96. package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
  97. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +24 -0
  98. package/dist/server/modules/provider/provider-discovery-helper-client.js +14 -0
  99. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  100. package/dist/server/modules/provider/provider-discovery-helper-process.js +54 -0
  101. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  102. package/dist/server/modules/sessions/session-activity-authority-service.js +13 -1
  103. package/dist/server/modules/sessions/session-activity-authority-service.js.map +1 -1
  104. package/dist/server/modules/sessions/session-activity-inspector.js +21 -5
  105. package/dist/server/modules/sessions/session-activity-inspector.js.map +1 -1
  106. package/dist/server/modules/sessions/session-controller.d.ts +5 -0
  107. package/dist/server/modules/sessions/session-controller.js +16 -0
  108. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  109. package/dist/server/modules/sessions/session-history-service.d.ts +27 -7
  110. package/dist/server/modules/sessions/session-history-service.js +439 -81
  111. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  112. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +2 -1
  113. package/dist/server/modules/sessions/session-live-runtime-service.js +12 -0
  114. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  115. package/dist/server/modules/skills/skill-controller.d.ts +23 -0
  116. package/dist/server/modules/skills/skill-controller.js +35 -0
  117. package/dist/server/modules/skills/skill-controller.js.map +1 -0
  118. package/dist/server/modules/skills/skill-manager-service.d.ts +86 -0
  119. package/dist/server/modules/skills/skill-manager-service.js +557 -0
  120. package/dist/server/modules/skills/skill-manager-service.js.map +1 -0
  121. package/dist/server/modules/skills/skill-reconciler.d.ts +21 -0
  122. package/dist/server/modules/skills/skill-reconciler.js +99 -0
  123. package/dist/server/modules/skills/skill-reconciler.js.map +1 -0
  124. package/dist/server/modules/skills/skill-sync-planner.d.ts +8 -0
  125. package/dist/server/modules/skills/skill-sync-planner.js +20 -0
  126. package/dist/server/modules/skills/skill-sync-planner.js.map +1 -0
  127. package/dist/server/modules/skills/skill-target-adapter.d.ts +34 -0
  128. package/dist/server/modules/skills/skill-target-adapter.js +65 -0
  129. package/dist/server/modules/skills/skill-target-adapter.js.map +1 -0
  130. package/dist/server/modules/tailscale/tailscale-controller.d.ts +15 -0
  131. package/dist/server/modules/tailscale/tailscale-controller.js +33 -0
  132. package/dist/server/modules/tailscale/tailscale-controller.js.map +1 -0
  133. package/dist/server/modules/tailscale/tailscale-helper-client.d.ts +41 -0
  134. package/dist/server/modules/tailscale/tailscale-helper-client.js +135 -0
  135. package/dist/server/modules/tailscale/tailscale-helper-client.js.map +1 -0
  136. package/dist/server/modules/tailscale/tailscale-helper-process.d.ts +1 -0
  137. package/dist/server/modules/tailscale/tailscale-helper-process.js +327 -0
  138. package/dist/server/modules/tailscale/tailscale-helper-process.js.map +1 -0
  139. package/dist/server/modules/tailscale/tailscale-manager.d.ts +41 -0
  140. package/dist/server/modules/tailscale/tailscale-manager.js +259 -0
  141. package/dist/server/modules/tailscale/tailscale-manager.js.map +1 -0
  142. package/dist/server/modules/tailscale/tailscale-service.d.ts +43 -0
  143. package/dist/server/modules/tailscale/tailscale-service.js +201 -0
  144. package/dist/server/modules/tailscale/tailscale-service.js.map +1 -0
  145. package/dist/server/modules/tasks/event-loop-monitor.d.ts +21 -0
  146. package/dist/server/modules/tasks/event-loop-monitor.js +64 -0
  147. package/dist/server/modules/tasks/event-loop-monitor.js.map +1 -0
  148. package/dist/server/modules/tasks/observability-controller.d.ts +30 -0
  149. package/dist/server/modules/tasks/observability-controller.js +44 -0
  150. package/dist/server/modules/tasks/observability-controller.js.map +1 -0
  151. package/dist/server/modules/tasks/observability-service.d.ts +32 -0
  152. package/dist/server/modules/tasks/observability-service.js +104 -0
  153. package/dist/server/modules/tasks/observability-service.js.map +1 -0
  154. package/dist/server/modules/tasks/scheduler-metrics.d.ts +41 -0
  155. package/dist/server/modules/tasks/scheduler-metrics.js +92 -0
  156. package/dist/server/modules/tasks/scheduler-metrics.js.map +1 -0
  157. package/dist/server/modules/tasks/task-activity-log.d.ts +39 -0
  158. package/dist/server/modules/tasks/task-activity-log.js +43 -0
  159. package/dist/server/modules/tasks/task-activity-log.js.map +1 -0
  160. package/dist/server/modules/tasks/task-helper-client.d.ts +11 -0
  161. package/dist/server/modules/tasks/task-helper-client.js +132 -0
  162. package/dist/server/modules/tasks/task-helper-client.js.map +1 -0
  163. package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +16 -0
  164. package/dist/server/modules/tasks/task-helper-process-handlers.js +14 -0
  165. package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -0
  166. package/dist/server/modules/tasks/task-helper-process.d.ts +1 -0
  167. package/dist/server/modules/tasks/task-helper-process.js +49 -0
  168. package/dist/server/modules/tasks/task-helper-process.js.map +1 -0
  169. package/dist/server/modules/tasks/task-lane-executors.d.ts +2 -0
  170. package/dist/server/modules/tasks/task-lane-executors.js +15 -0
  171. package/dist/server/modules/tasks/task-lane-executors.js.map +1 -0
  172. package/dist/server/modules/tasks/task-manager.d.ts +15 -0
  173. package/dist/server/modules/tasks/task-manager.js +36 -0
  174. package/dist/server/modules/tasks/task-manager.js.map +1 -0
  175. package/dist/server/modules/tasks/task-metrics.d.ts +9 -0
  176. package/dist/server/modules/tasks/task-metrics.js +81 -0
  177. package/dist/server/modules/tasks/task-metrics.js.map +1 -0
  178. package/dist/server/modules/tasks/task-registry.d.ts +7 -0
  179. package/dist/server/modules/tasks/task-registry.js +21 -0
  180. package/dist/server/modules/tasks/task-registry.js.map +1 -0
  181. package/dist/server/modules/tasks/task-scheduler.d.ts +31 -0
  182. package/dist/server/modules/tasks/task-scheduler.js +473 -0
  183. package/dist/server/modules/tasks/task-scheduler.js.map +1 -0
  184. package/dist/server/modules/tasks/task-types.d.ts +106 -0
  185. package/dist/server/modules/tasks/task-types.js +23 -0
  186. package/dist/server/modules/tasks/task-types.js.map +1 -0
  187. package/dist/server/modules/terminal/command-template-service.d.ts +4 -0
  188. package/dist/server/modules/terminal/command-template-service.js +5 -3
  189. package/dist/server/modules/terminal/command-template-service.js.map +1 -1
  190. package/dist/server/modules/terminal/runtime/terminal-log-spooler.d.ts +7 -3
  191. package/dist/server/modules/terminal/runtime/terminal-log-spooler.js +95 -15
  192. package/dist/server/modules/terminal/runtime/terminal-log-spooler.js.map +1 -1
  193. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.d.ts +21 -0
  194. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js +144 -0
  195. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js.map +1 -0
  196. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.d.ts +1 -0
  197. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js +187 -0
  198. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js.map +1 -0
  199. package/dist/server/modules/terminal/terminal-service.d.ts +12 -0
  200. package/dist/server/modules/terminal/terminal-service.js +34 -17
  201. package/dist/server/modules/terminal/terminal-service.js.map +1 -1
  202. package/dist/server/modules/workbench/workbench-service.d.ts +23 -2
  203. package/dist/server/modules/workbench/workbench-service.js +126 -15
  204. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  205. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +5 -1
  206. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +88 -19
  207. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  208. package/dist/server/modules/workspace/workspace-code-composition.d.ts +2 -0
  209. package/dist/server/modules/workspace/workspace-code-composition.js +154 -0
  210. package/dist/server/modules/workspace/workspace-code-composition.js.map +1 -0
  211. package/dist/server/modules/workspace/workspace-controller.d.ts +14 -0
  212. package/dist/server/modules/workspace/workspace-controller.js +19 -0
  213. package/dist/server/modules/workspace/workspace-controller.js.map +1 -1
  214. package/dist/server/modules/workspace/workspace-service.d.ts +21 -14
  215. package/dist/server/modules/workspace/workspace-service.js +183 -234
  216. package/dist/server/modules/workspace/workspace-service.js.map +1 -1
  217. package/dist/server/modules/worktree/worktree-cleanup-service.d.ts +35 -0
  218. package/dist/server/modules/worktree/worktree-cleanup-service.js +210 -0
  219. package/dist/server/modules/worktree/worktree-cleanup-service.js.map +1 -0
  220. package/dist/server/modules/worktree/worktree-controller.d.ts +44 -0
  221. package/dist/server/modules/worktree/worktree-controller.js +40 -0
  222. package/dist/server/modules/worktree/worktree-controller.js.map +1 -0
  223. package/dist/server/modules/worktree/worktree-manager.d.ts +34 -0
  224. package/dist/server/modules/worktree/worktree-manager.js +292 -0
  225. package/dist/server/modules/worktree/worktree-manager.js.map +1 -0
  226. package/dist/server/modules/worktree/worktree-merge-service.d.ts +52 -0
  227. package/dist/server/modules/worktree/worktree-merge-service.js +293 -0
  228. package/dist/server/modules/worktree/worktree-merge-service.js.map +1 -0
  229. package/dist/server/modules/worktree/worktree-sync-service.d.ts +23 -0
  230. package/dist/server/modules/worktree/worktree-sync-service.js +166 -0
  231. package/dist/server/modules/worktree/worktree-sync-service.js.map +1 -0
  232. package/dist/server/routes/assistant.d.ts +3 -0
  233. package/dist/server/routes/assistant.js +15 -0
  234. package/dist/server/routes/assistant.js.map +1 -0
  235. package/dist/server/routes/debug-targets.d.ts +3 -0
  236. package/dist/server/routes/debug-targets.js +15 -0
  237. package/dist/server/routes/debug-targets.js.map +1 -0
  238. package/dist/server/routes/git.js +2 -0
  239. package/dist/server/routes/git.js.map +1 -1
  240. package/dist/server/routes/observability.d.ts +3 -0
  241. package/dist/server/routes/observability.js +7 -0
  242. package/dist/server/routes/observability.js.map +1 -0
  243. package/dist/server/routes/skills.d.ts +3 -0
  244. package/dist/server/routes/skills.js +7 -0
  245. package/dist/server/routes/skills.js.map +1 -0
  246. package/dist/server/routes/system.d.ts +3 -0
  247. package/dist/server/routes/system.js +9 -0
  248. package/dist/server/routes/system.js.map +1 -0
  249. package/dist/server/routes/workspaces.js +2 -0
  250. package/dist/server/routes/workspaces.js.map +1 -1
  251. package/dist/server/routes/worktrees.d.ts +3 -0
  252. package/dist/server/routes/worktrees.js +8 -0
  253. package/dist/server/routes/worktrees.js.map +1 -0
  254. package/dist/server/server/create-server.d.ts +46 -0
  255. package/dist/server/server/create-server.js +141 -12
  256. package/dist/server/server/create-server.js.map +1 -1
  257. package/dist/server/shared/utils/command-availability.d.ts +1 -0
  258. package/dist/server/shared/utils/command-availability.js +26 -3
  259. package/dist/server/shared/utils/command-availability.js.map +1 -1
  260. package/dist/server/shared/utils/secret-box.d.ts +2 -0
  261. package/dist/server/shared/utils/secret-box.js +29 -0
  262. package/dist/server/shared/utils/secret-box.js.map +1 -0
  263. package/dist/server/shared/utils/terminal-debug-log.js +5 -3
  264. package/dist/server/shared/utils/terminal-debug-log.js.map +1 -1
  265. package/dist/server/storage/repositories/ai-fallback-edit-repository.d.ts +11 -0
  266. package/dist/server/storage/repositories/ai-fallback-edit-repository.js +118 -0
  267. package/dist/server/storage/repositories/ai-fallback-edit-repository.js.map +1 -0
  268. package/dist/server/storage/repositories/debug-runtime-session-repository.d.ts +11 -0
  269. package/dist/server/storage/repositories/debug-runtime-session-repository.js +100 -0
  270. package/dist/server/storage/repositories/debug-runtime-session-repository.js.map +1 -0
  271. package/dist/server/storage/repositories/debug-service-repository.d.ts +9 -0
  272. package/dist/server/storage/repositories/debug-service-repository.js +99 -0
  273. package/dist/server/storage/repositories/debug-service-repository.js.map +1 -0
  274. package/dist/server/storage/repositories/debug-target-repository.d.ts +11 -0
  275. package/dist/server/storage/repositories/debug-target-repository.js +100 -0
  276. package/dist/server/storage/repositories/debug-target-repository.js.map +1 -0
  277. package/dist/server/storage/repositories/framework-analysis-result-repository.d.ts +9 -0
  278. package/dist/server/storage/repositories/framework-analysis-result-repository.js +98 -0
  279. package/dist/server/storage/repositories/framework-analysis-result-repository.js.map +1 -0
  280. package/dist/server/storage/repositories/git-remote-credential-repository.d.ts +9 -0
  281. package/dist/server/storage/repositories/git-remote-credential-repository.js +51 -0
  282. package/dist/server/storage/repositories/git-remote-credential-repository.js.map +1 -0
  283. package/dist/server/storage/repositories/instance-tailscale-repository.d.ts +10 -0
  284. package/dist/server/storage/repositories/instance-tailscale-repository.js +112 -0
  285. package/dist/server/storage/repositories/instance-tailscale-repository.js.map +1 -0
  286. package/dist/server/storage/repositories/managed-skill-repository.d.ts +11 -0
  287. package/dist/server/storage/repositories/managed-skill-repository.js +102 -0
  288. package/dist/server/storage/repositories/managed-skill-repository.js.map +1 -0
  289. package/dist/server/storage/repositories/port-lease-repository.d.ts +12 -0
  290. package/dist/server/storage/repositories/port-lease-repository.js +124 -0
  291. package/dist/server/storage/repositories/port-lease-repository.js.map +1 -0
  292. package/dist/server/storage/repositories/runtime-binding-repository.d.ts +10 -0
  293. package/dist/server/storage/repositories/runtime-binding-repository.js +89 -0
  294. package/dist/server/storage/repositories/runtime-binding-repository.js.map +1 -0
  295. package/dist/server/storage/repositories/skill-target-binding-repository.d.ts +10 -0
  296. package/dist/server/storage/repositories/skill-target-binding-repository.js +77 -0
  297. package/dist/server/storage/repositories/skill-target-binding-repository.js.map +1 -0
  298. package/dist/server/storage/repositories/terminal-command-template-repository.js +77 -4
  299. package/dist/server/storage/repositories/terminal-command-template-repository.js.map +1 -1
  300. package/dist/server/storage/repositories/terminal-instance-repository.js +89 -7
  301. package/dist/server/storage/repositories/terminal-instance-repository.js.map +1 -1
  302. package/dist/server/storage/repositories/workspace-navigation-state-repository.d.ts +9 -0
  303. package/dist/server/storage/repositories/workspace-navigation-state-repository.js +49 -0
  304. package/dist/server/storage/repositories/workspace-navigation-state-repository.js.map +1 -0
  305. package/dist/server/storage/repositories/workspace-repository.d.ts +7 -1
  306. package/dist/server/storage/repositories/workspace-repository.js +32 -8
  307. package/dist/server/storage/repositories/workspace-repository.js.map +1 -1
  308. package/dist/server/storage/repositories/workspace-worktree-repository.d.ts +13 -0
  309. package/dist/server/storage/repositories/workspace-worktree-repository.js +158 -0
  310. package/dist/server/storage/repositories/workspace-worktree-repository.js.map +1 -0
  311. package/dist/server/storage/sqlite/client.js +311 -0
  312. package/dist/server/storage/sqlite/client.js.map +1 -1
  313. package/dist/server/storage/sqlite/schema.sql +303 -0
  314. package/dist/server/types/domain.d.ts +303 -0
  315. package/dist/server/ws/workbench-ws-hub.js +33 -9
  316. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  317. package/dist/server/ws/ws-server.js +4 -4
  318. package/dist/server/ws/ws-server.js.map +1 -1
  319. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +18 -6
  320. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  321. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +14 -2
  322. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  323. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +25 -1
  324. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  325. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +6 -0
  326. package/package.json +1 -1
  327. package/dist/public/assets/index-1VIm8lVL.css +0 -1
  328. package/dist/public/assets/index-Dti93O2S.js +0 -109
@@ -0,0 +1,327 @@
1
+ import { spawn } from "node:child_process";
2
+ import path from "node:path";
3
+ import readline from "node:readline";
4
+ import { resolveAvailableCommandPath } from "../../shared/utils/command-availability.js";
5
+ import { resolveCommandLaunch } from "../../shared/utils/command-launch.js";
6
+ const stdinReader = readline.createInterface({
7
+ input: process.stdin,
8
+ crlfDelay: Infinity
9
+ });
10
+ stdinReader.on("line", (line) => {
11
+ void handleLine(line);
12
+ });
13
+ async function handleLine(line) {
14
+ let payload;
15
+ try {
16
+ payload = JSON.parse(line);
17
+ }
18
+ catch {
19
+ return;
20
+ }
21
+ try {
22
+ switch (payload.type) {
23
+ case "status":
24
+ emitResult(payload.id, await inspectStatus(payload.commandPath));
25
+ return;
26
+ case "enable":
27
+ emitResult(payload.id, await enableTailscale(payload.commandPath, payload.controlServerUrl, payload.hostname));
28
+ return;
29
+ case "login":
30
+ emitResult(payload.id, await loginTailscale(payload.commandPath, payload.controlServerUrl, payload.hostname));
31
+ return;
32
+ case "disable":
33
+ emitResult(payload.id, await disableTailscale(payload.commandPath));
34
+ return;
35
+ case "logout":
36
+ emitResult(payload.id, await logoutTailscale(payload.commandPath));
37
+ return;
38
+ }
39
+ }
40
+ catch (error) {
41
+ emitError(payload.id, error instanceof Error ? error.message : String(error));
42
+ }
43
+ }
44
+ function emitResult(id, result) {
45
+ process.stdout.write(`${JSON.stringify({
46
+ type: "result",
47
+ id,
48
+ ok: true,
49
+ result
50
+ })}\n`);
51
+ }
52
+ function emitError(id, error) {
53
+ process.stdout.write(`${JSON.stringify({
54
+ type: "result",
55
+ id,
56
+ ok: false,
57
+ error
58
+ })}\n`);
59
+ }
60
+ async function enableTailscale(commandPath, controlServerUrl, hostname) {
61
+ ensureCliAvailable(commandPath);
62
+ const current = await inspectStatus(commandPath);
63
+ if (current.backendState === "running") {
64
+ if (hostname) {
65
+ await runTailscaleCommand(commandPath, ["set", `--hostname=${hostname}`]);
66
+ return await inspectStatus(commandPath);
67
+ }
68
+ return current;
69
+ }
70
+ if (current.backendState === "needs_login") {
71
+ return await loginTailscale(commandPath, controlServerUrl, hostname);
72
+ }
73
+ const upArgs = ["up"];
74
+ if (controlServerUrl) {
75
+ upArgs.push(`--login-server=${controlServerUrl}`);
76
+ }
77
+ if (hostname) {
78
+ upArgs.push(`--hostname=${hostname}`);
79
+ }
80
+ const upResult = await runTailscaleCommand(commandPath, upArgs, {
81
+ captureLoginUrl: true
82
+ });
83
+ if (upResult.loginUrl) {
84
+ const snapshot = await inspectStatus(commandPath);
85
+ return {
86
+ ...snapshot,
87
+ backendState: "needs_login",
88
+ loginUrl: upResult.loginUrl
89
+ };
90
+ }
91
+ return await inspectStatus(commandPath);
92
+ }
93
+ async function loginTailscale(commandPath, controlServerUrl, hostname) {
94
+ ensureCliAvailable(commandPath);
95
+ const loginArgs = ["login"];
96
+ if (controlServerUrl) {
97
+ loginArgs.push(`--login-server=${controlServerUrl}`);
98
+ }
99
+ const loginResult = await runTailscaleCommand(commandPath, loginArgs, {
100
+ captureLoginUrl: true
101
+ });
102
+ const snapshot = await inspectStatus(commandPath);
103
+ if (hostname && snapshot.backendState === "running") {
104
+ await runTailscaleCommand(commandPath, ["set", `--hostname=${hostname}`]);
105
+ return await inspectStatus(commandPath);
106
+ }
107
+ if (loginResult.loginUrl) {
108
+ return {
109
+ ...snapshot,
110
+ backendState: "needs_login",
111
+ loginUrl: loginResult.loginUrl
112
+ };
113
+ }
114
+ return snapshot;
115
+ }
116
+ async function disableTailscale(commandPath) {
117
+ ensureCliAvailable(commandPath);
118
+ await runTailscaleCommand(commandPath, ["down"]);
119
+ return await inspectStatus(commandPath);
120
+ }
121
+ async function logoutTailscale(commandPath) {
122
+ ensureCliAvailable(commandPath);
123
+ await runTailscaleCommand(commandPath, ["logout"]);
124
+ return await inspectStatus(commandPath);
125
+ }
126
+ async function inspectStatus(commandPath) {
127
+ ensureCliAvailable(commandPath);
128
+ const result = await runTailscaleCommand(commandPath, ["status", "--json"], {
129
+ allowNonZeroExit: true
130
+ });
131
+ if (!result.stdout.trim()) {
132
+ return {
133
+ backendState: "stopped",
134
+ loginUrl: result.loginUrl,
135
+ hostname: null,
136
+ accountName: null,
137
+ tailnetFqdn: null,
138
+ tailnetIpv4: null,
139
+ tailnetIpv6: null,
140
+ lastError: result.exitCode === 0 ? null : (result.stderr.trim() || "TAILSCALE_STATUS_EMPTY")
141
+ };
142
+ }
143
+ let payload;
144
+ try {
145
+ payload = JSON.parse(result.stdout);
146
+ }
147
+ catch {
148
+ throw new Error("TAILSCALE_STATUS_JSON_INVALID");
149
+ }
150
+ const self = asRecord(payload.Self);
151
+ const ips = readIpList(self.TailscaleIPs) ?? readIpList(payload.TailscaleIPs) ?? [];
152
+ const backendState = normalizeBackendState(payload.BackendState);
153
+ const ipv4 = ips.find((item) => item.includes(".")) ?? null;
154
+ const ipv6 = ips.find((item) => item.includes(":")) ?? null;
155
+ return {
156
+ backendState,
157
+ loginUrl: result.loginUrl,
158
+ hostname: readOptionalString(self.HostName),
159
+ accountName: resolveAccountName(self),
160
+ tailnetFqdn: trimDnsName(readOptionalString(self.DNSName)),
161
+ tailnetIpv4: ipv4,
162
+ tailnetIpv6: ipv6,
163
+ lastError: backendState === "error"
164
+ ? (result.stderr.trim() || readOptionalString(payload.Health) || "TAILSCALE_BACKEND_ERROR")
165
+ : null
166
+ };
167
+ }
168
+ function ensureCliAvailable(commandPath) {
169
+ if (!resolveTailscaleCliPath(commandPath)) {
170
+ throw new Error("TAILSCALE_CLI_UNAVAILABLE");
171
+ }
172
+ }
173
+ async function runTailscaleCommand(commandPath, args, options = {}) {
174
+ const resolvedCommandPath = resolveTailscaleCliPath(commandPath);
175
+ if (!resolvedCommandPath) {
176
+ throw new Error("TAILSCALE_CLI_UNAVAILABLE");
177
+ }
178
+ const launch = resolveCommandLaunch(resolvedCommandPath, args);
179
+ return await new Promise((resolve, reject) => {
180
+ const child = spawn(launch.command, launch.args, {
181
+ env: process.env,
182
+ stdio: ["ignore", "pipe", "pipe"],
183
+ shell: launch.shell,
184
+ windowsHide: true
185
+ });
186
+ const stdoutChunks = [];
187
+ const stderrChunks = [];
188
+ let loginUrl = null;
189
+ let settled = false;
190
+ let killedAfterUrl = false;
191
+ let forceKillTimer = null;
192
+ const maybeCaptureLoginUrl = (content) => {
193
+ if (!options.captureLoginUrl || loginUrl) {
194
+ return;
195
+ }
196
+ const matched = content.match(/https?:\/\/[^\s"'<>]+/);
197
+ if (matched) {
198
+ loginUrl = matched[0];
199
+ if (!child.killed) {
200
+ killedAfterUrl = true;
201
+ child.kill("SIGTERM");
202
+ forceKillTimer = setTimeout(() => {
203
+ if (!settled && !child.killed) {
204
+ child.kill("SIGKILL");
205
+ }
206
+ }, 1000);
207
+ }
208
+ }
209
+ };
210
+ child.on("error", (error) => {
211
+ if (settled) {
212
+ return;
213
+ }
214
+ settled = true;
215
+ if (forceKillTimer) {
216
+ clearTimeout(forceKillTimer);
217
+ }
218
+ reject(error);
219
+ });
220
+ child.stdout.on("data", (chunk) => {
221
+ const content = chunk.toString("utf8");
222
+ stdoutChunks.push(content);
223
+ maybeCaptureLoginUrl(content);
224
+ });
225
+ child.stderr.on("data", (chunk) => {
226
+ const content = chunk.toString("utf8");
227
+ stderrChunks.push(content);
228
+ maybeCaptureLoginUrl(content);
229
+ });
230
+ child.on("close", (code) => {
231
+ if (settled) {
232
+ return;
233
+ }
234
+ settled = true;
235
+ if (forceKillTimer) {
236
+ clearTimeout(forceKillTimer);
237
+ }
238
+ const stdout = stdoutChunks.join("");
239
+ const stderr = stderrChunks.join("");
240
+ const success = code === 0 || killedAfterUrl || options.allowNonZeroExit;
241
+ if (!success) {
242
+ reject(new Error(stderr.trim() || stdout.trim() || `TAILSCALE_EXIT_${code ?? "null"}`));
243
+ return;
244
+ }
245
+ resolve({
246
+ stdout,
247
+ stderr,
248
+ exitCode: code,
249
+ loginUrl
250
+ });
251
+ });
252
+ });
253
+ }
254
+ function resolveTailscaleCliPath(commandPath) {
255
+ return resolveAvailableCommandPath(commandPath, listTailscaleFallbackCandidates());
256
+ }
257
+ function listTailscaleFallbackCandidates() {
258
+ if (process.platform === "win32") {
259
+ return [
260
+ "tailscale.exe",
261
+ path.join("C:\\", "Program Files", "Tailscale", "tailscale.exe"),
262
+ path.join("C:\\", "Program Files (x86)", "Tailscale", "tailscale.exe")
263
+ ];
264
+ }
265
+ if (process.platform === "darwin") {
266
+ return [
267
+ "/opt/homebrew/bin/tailscale",
268
+ "/usr/local/bin/tailscale",
269
+ "/usr/bin/tailscale",
270
+ "/Applications/Tailscale.app/Contents/MacOS/Tailscale",
271
+ path.join(process.env.HOME ?? "", ".local", "bin", "tailscale")
272
+ ];
273
+ }
274
+ return [
275
+ "/usr/local/bin/tailscale",
276
+ "/usr/bin/tailscale",
277
+ "/snap/bin/tailscale",
278
+ path.join(process.env.HOME ?? "", ".local", "bin", "tailscale")
279
+ ];
280
+ }
281
+ function normalizeBackendState(value) {
282
+ const normalized = readOptionalString(value)?.toLowerCase();
283
+ switch (normalized) {
284
+ case "running":
285
+ return "running";
286
+ case "needslogin":
287
+ return "needs_login";
288
+ case "starting":
289
+ return "starting";
290
+ case "stopped":
291
+ case "nodaemon":
292
+ return "stopped";
293
+ default:
294
+ return normalized ? "error" : "stopped";
295
+ }
296
+ }
297
+ function readIpList(value) {
298
+ if (!Array.isArray(value)) {
299
+ return null;
300
+ }
301
+ return value.filter((item) => typeof item === "string");
302
+ }
303
+ function asRecord(value) {
304
+ return value && typeof value === "object" && !Array.isArray(value)
305
+ ? value
306
+ : {};
307
+ }
308
+ function readOptionalString(value) {
309
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
310
+ }
311
+ function trimDnsName(value) {
312
+ if (!value) {
313
+ return null;
314
+ }
315
+ return value.endsWith(".") ? value.slice(0, -1) : value;
316
+ }
317
+ function resolveAccountName(self) {
318
+ const userProfile = asRecord(self.UserProfile);
319
+ // 这里只能展示用户真实账号字段,不能把 tailnet 名称伪装成账号名。
320
+ return (trimOptionalText(userProfile.LoginName)
321
+ ?? trimOptionalText(userProfile.DisplayName)
322
+ ?? null);
323
+ }
324
+ function trimOptionalText(value) {
325
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
326
+ }
327
+ //# sourceMappingURL=tailscale-helper-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailscale-helper-process.js","sourceRoot":"","sources":["../../../../src/modules/tailscale/tailscale-helper-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { EventEmitter } from "node:events";
2
+ import type { BootstrapStateRepository } from "../../storage/repositories/bootstrap-state-repository.js";
3
+ import type { InstanceTailscaleRepository } from "../../storage/repositories/instance-tailscale-repository.js";
4
+ import type { InstanceTailscaleConfig, InstanceTailscaleStatus } from "../../types/domain.js";
5
+ import type { TailscaleHelperClient } from "./tailscale-helper-client.js";
6
+ export declare class TailscaleManager extends EventEmitter {
7
+ private readonly bootstrapStateRepository;
8
+ private readonly repository;
9
+ private readonly helperClient;
10
+ private readonly options;
11
+ private currentStatus;
12
+ constructor(bootstrapStateRepository: BootstrapStateRepository, repository: InstanceTailscaleRepository, helperClient: TailscaleHelperClient, options: {
13
+ commandPath: string;
14
+ webUiPort: number;
15
+ });
16
+ getStatus(config: InstanceTailscaleConfig): Promise<InstanceTailscaleStatus>;
17
+ restore(config: InstanceTailscaleConfig): Promise<InstanceTailscaleStatus>;
18
+ syncConfig(config: InstanceTailscaleConfig): Promise<InstanceTailscaleStatus | null>;
19
+ enable(config: InstanceTailscaleConfig): Promise<InstanceTailscaleStatus>;
20
+ disable(config: InstanceTailscaleConfig): Promise<InstanceTailscaleStatus>;
21
+ requestLogin(config: InstanceTailscaleConfig): Promise<InstanceTailscaleStatus>;
22
+ logout(config: InstanceTailscaleConfig): Promise<InstanceTailscaleStatus>;
23
+ recordRunning(config: InstanceTailscaleConfig, details?: {
24
+ loginUrl?: string | null;
25
+ accountName?: string | null;
26
+ tailnetFqdn?: string | null;
27
+ tailnetIpv4?: string | null;
28
+ tailnetIpv6?: string | null;
29
+ reachableBaseUrl?: string | null;
30
+ lastError?: string | null;
31
+ }): InstanceTailscaleStatus;
32
+ recordNeedsLogin(config: InstanceTailscaleConfig, loginUrl: string | null, accountName?: string | null): InstanceTailscaleStatus;
33
+ recordError(config: InstanceTailscaleConfig, detail: string): InstanceTailscaleStatus;
34
+ private reconcileHelperSnapshot;
35
+ private recordHelperFailure;
36
+ getStatusSync(config: InstanceTailscaleConfig): InstanceTailscaleStatus;
37
+ private transition;
38
+ private resolveEffectiveStatus;
39
+ private isInitialized;
40
+ private persistStatus;
41
+ }
@@ -0,0 +1,259 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { AppError } from "../../shared/errors/app-error.js";
3
+ import { nowIso } from "../../shared/utils/time.js";
4
+ export class TailscaleManager extends EventEmitter {
5
+ bootstrapStateRepository;
6
+ repository;
7
+ helperClient;
8
+ options;
9
+ currentStatus;
10
+ constructor(bootstrapStateRepository, repository, helperClient, options) {
11
+ super();
12
+ this.bootstrapStateRepository = bootstrapStateRepository;
13
+ this.repository = repository;
14
+ this.helperClient = helperClient;
15
+ this.options = options;
16
+ this.currentStatus = this.repository.findStatus();
17
+ }
18
+ async getStatus(config) {
19
+ if (!config.enabled) {
20
+ const resolved = this.resolveEffectiveStatus(config);
21
+ this.currentStatus = resolved;
22
+ return resolved;
23
+ }
24
+ if (!this.isInitialized()) {
25
+ const resolved = this.resolveEffectiveStatus(config);
26
+ this.currentStatus = resolved;
27
+ return resolved;
28
+ }
29
+ try {
30
+ const snapshot = await this.helperClient.inspectStatus({
31
+ commandPath: this.options.commandPath
32
+ });
33
+ return this.reconcileHelperSnapshot(config, snapshot);
34
+ }
35
+ catch (error) {
36
+ return this.recordHelperFailure(config, error);
37
+ }
38
+ }
39
+ async restore(config) {
40
+ if (!config.enabled) {
41
+ return this.transition(config, "disabled");
42
+ }
43
+ if (!this.isInitialized()) {
44
+ return this.transition(config, "blocked_uninitialized");
45
+ }
46
+ return await this.enable(config);
47
+ }
48
+ async syncConfig(config) {
49
+ if (!config.enabled) {
50
+ const resolved = this.resolveEffectiveStatus(config);
51
+ this.currentStatus = resolved;
52
+ return null;
53
+ }
54
+ return await this.getStatus(config);
55
+ }
56
+ async enable(config) {
57
+ if (!this.isInitialized()) {
58
+ return this.transition(config, "blocked_uninitialized");
59
+ }
60
+ this.transition(config, "starting");
61
+ try {
62
+ const snapshot = await this.helperClient.enable({
63
+ commandPath: this.options.commandPath,
64
+ controlServerUrl: config.controlServerUrl,
65
+ hostname: config.hostname
66
+ });
67
+ return this.reconcileHelperSnapshot(config, snapshot);
68
+ }
69
+ catch (error) {
70
+ return this.recordHelperFailure(config, error);
71
+ }
72
+ }
73
+ async disable(config) {
74
+ const current = this.resolveEffectiveStatus(config);
75
+ if (current.phase !== "disabled") {
76
+ this.transition(config, "stopping");
77
+ }
78
+ try {
79
+ await this.helperClient.disable({
80
+ commandPath: this.options.commandPath
81
+ });
82
+ }
83
+ catch (error) {
84
+ return this.recordHelperFailure(config, error);
85
+ }
86
+ return this.transition(config, "disabled");
87
+ }
88
+ async requestLogin(config) {
89
+ if (!config.enabled) {
90
+ throw new AppError({
91
+ statusCode: 409,
92
+ errorCode: "TAILSCALE_NOT_ENABLED",
93
+ detail: "当前实例尚未启用 Tailscale"
94
+ });
95
+ }
96
+ if (!this.isInitialized()) {
97
+ return this.transition(config, "blocked_uninitialized");
98
+ }
99
+ try {
100
+ const snapshot = await this.helperClient.login({
101
+ commandPath: this.options.commandPath,
102
+ controlServerUrl: config.controlServerUrl,
103
+ hostname: config.hostname
104
+ });
105
+ return this.reconcileHelperSnapshot(config, snapshot);
106
+ }
107
+ catch (error) {
108
+ return this.recordHelperFailure(config, error);
109
+ }
110
+ }
111
+ async logout(config) {
112
+ if (!config.enabled) {
113
+ return this.transition(config, "disabled");
114
+ }
115
+ try {
116
+ const snapshot = await this.helperClient.logout({
117
+ commandPath: this.options.commandPath
118
+ });
119
+ return this.reconcileHelperSnapshot(config, snapshot);
120
+ }
121
+ catch (error) {
122
+ return this.recordHelperFailure(config, error);
123
+ }
124
+ }
125
+ recordRunning(config, details = {}) {
126
+ return this.transition(config, "running", details);
127
+ }
128
+ recordNeedsLogin(config, loginUrl, accountName = null) {
129
+ return this.transition(config, "needs_login", { loginUrl, accountName, lastError: null });
130
+ }
131
+ recordError(config, detail) {
132
+ return this.transition(config, "error", {
133
+ lastError: detail,
134
+ loginUrl: null
135
+ });
136
+ }
137
+ reconcileHelperSnapshot(config, snapshot) {
138
+ switch (snapshot.backendState) {
139
+ case "running":
140
+ return this.recordRunning(config, {
141
+ loginUrl: null,
142
+ accountName: snapshot.accountName,
143
+ tailnetFqdn: snapshot.tailnetFqdn,
144
+ tailnetIpv4: snapshot.tailnetIpv4,
145
+ tailnetIpv6: snapshot.tailnetIpv6,
146
+ reachableBaseUrl: buildReachableBaseUrl(snapshot, this.options.webUiPort),
147
+ lastError: null
148
+ });
149
+ case "starting":
150
+ return this.transition(config, "starting");
151
+ case "needs_login":
152
+ return this.recordNeedsLogin(config, snapshot.loginUrl, snapshot.accountName);
153
+ case "stopped":
154
+ return this.recordError(config, snapshot.lastError ?? "Tailscale 当前未连接到 tailnet");
155
+ case "error":
156
+ default:
157
+ return this.recordError(config, snapshot.lastError ?? "Tailscale 状态检查失败");
158
+ }
159
+ }
160
+ recordHelperFailure(config, error) {
161
+ const detail = normalizeTailscaleErrorDetail(error instanceof Error ? error.message : String(error));
162
+ return this.recordError(config, detail);
163
+ }
164
+ getStatusSync(config) {
165
+ const resolved = this.resolveEffectiveStatus(config);
166
+ this.currentStatus = resolved;
167
+ return resolved;
168
+ }
169
+ transition(config, nextPhase, overrides = {}) {
170
+ const current = this.resolveEffectiveStatus(config);
171
+ if (!isAllowedTransition(current.phase, nextPhase)) {
172
+ throw new AppError({
173
+ statusCode: 409,
174
+ errorCode: "TAILSCALE_INVALID_PHASE_TRANSITION",
175
+ detail: `Tailscale 状态不允许从 ${current.phase} 切换到 ${nextPhase}`
176
+ });
177
+ }
178
+ const next = buildStatusFromPhase(nextPhase, config, nowIso(), current, overrides);
179
+ this.persistStatus(next);
180
+ return next;
181
+ }
182
+ resolveEffectiveStatus(config) {
183
+ const persisted = this.currentStatus ?? this.repository.findStatus();
184
+ if (!config.enabled) {
185
+ return buildStatusFromPhase("disabled", config, persisted?.observedAt ?? null, persisted);
186
+ }
187
+ if (!this.isInitialized()) {
188
+ return buildStatusFromPhase("blocked_uninitialized", config, persisted?.observedAt ?? null, persisted);
189
+ }
190
+ if (!persisted || persisted.phase === "disabled" || persisted.phase === "blocked_uninitialized") {
191
+ return buildStatusFromPhase("needs_login", config, persisted?.observedAt ?? null, persisted);
192
+ }
193
+ return {
194
+ ...persisted,
195
+ controlServerUrl: config.controlServerUrl,
196
+ hostname: config.hostname
197
+ };
198
+ }
199
+ isInitialized() {
200
+ return this.bootstrapStateRepository.getState().initialized;
201
+ }
202
+ persistStatus(status) {
203
+ this.repository.upsertStatus(status);
204
+ this.currentStatus = status;
205
+ this.emit("status", status);
206
+ }
207
+ }
208
+ function buildStatusFromPhase(phase, config, observedAt, previous, overrides = {}) {
209
+ const keepAddressPayload = phase === "running";
210
+ const keepAccountPayload = phase !== "disabled" && phase !== "blocked_uninitialized";
211
+ return {
212
+ phase,
213
+ connected: phase === "running",
214
+ loginUrl: overrides.loginUrl ?? (phase === "needs_login" ? previous?.loginUrl ?? null : null),
215
+ controlServerUrl: config.controlServerUrl,
216
+ hostname: config.hostname,
217
+ accountName: Object.hasOwn(overrides, "accountName")
218
+ ? (overrides.accountName ?? null)
219
+ : (keepAccountPayload ? previous?.accountName ?? null : null),
220
+ tailnetFqdn: overrides.tailnetFqdn ?? (keepAddressPayload ? previous?.tailnetFqdn ?? null : null),
221
+ tailnetIpv4: overrides.tailnetIpv4 ?? (keepAddressPayload ? previous?.tailnetIpv4 ?? null : null),
222
+ tailnetIpv6: overrides.tailnetIpv6 ?? (keepAddressPayload ? previous?.tailnetIpv6 ?? null : null),
223
+ reachableBaseUrl: overrides.reachableBaseUrl ?? (keepAddressPayload ? previous?.reachableBaseUrl ?? null : null),
224
+ lastError: overrides.lastError ?? (phase === "error" ? previous?.lastError ?? null : null),
225
+ observedAt
226
+ };
227
+ }
228
+ function isAllowedTransition(from, to) {
229
+ if (from === to) {
230
+ return true;
231
+ }
232
+ const allowedTransitions = {
233
+ disabled: ["starting", "blocked_uninitialized"],
234
+ blocked_uninitialized: ["disabled", "starting", "error"],
235
+ starting: ["needs_login", "running", "stopping", "error", "disabled"],
236
+ needs_login: ["starting", "running", "stopping", "disabled", "error", "blocked_uninitialized"],
237
+ running: ["stopping", "error", "needs_login", "disabled"],
238
+ stopping: ["disabled", "error"],
239
+ error: ["starting", "needs_login", "disabled", "blocked_uninitialized", "running"]
240
+ };
241
+ return allowedTransitions[from].includes(to);
242
+ }
243
+ function buildReachableBaseUrl(snapshot, port) {
244
+ const host = snapshot.tailnetFqdn
245
+ ?? snapshot.tailnetIpv4
246
+ ?? (snapshot.tailnetIpv6 ? `[${snapshot.tailnetIpv6}]` : null);
247
+ if (!host) {
248
+ return null;
249
+ }
250
+ const suffix = port === 80 ? "" : `:${port}`;
251
+ return `http://${host}${suffix}`;
252
+ }
253
+ function normalizeTailscaleErrorDetail(detail) {
254
+ if (detail === "TAILSCALE_CLI_UNAVAILABLE") {
255
+ return "未发现 Tailscale CLI。请先安装 Tailscale,或通过 CODINGNS_TAILSCALE_COMMAND 指定命令路径。";
256
+ }
257
+ return detail;
258
+ }
259
+ //# sourceMappingURL=tailscale-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailscale-manager.js","sourceRoot":"","sources":["../../../../src/modules/tailscale/tailscale-manager.ts"],"names":[],"mappings":"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"}