@jingyi0605/codingns 0.1.5 → 0.2.5

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 (299) hide show
  1. package/README.md +44 -0
  2. package/bin/codingns.mjs +640 -53
  3. package/dist/public/assets/{TerminalPage-4p6EBqrR.js → TerminalPage-BkjqU9NG.js} +19 -19
  4. package/dist/public/assets/index-C6U8-9jg.css +1 -0
  5. package/dist/public/assets/index-CKSumuV2.js +109 -0
  6. package/dist/public/index.html +2 -2
  7. package/dist/server/config/env.d.ts +2 -0
  8. package/dist/server/config/env.js +8 -1
  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.js +69 -30
  17. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  18. package/dist/server/modules/butler/butler-follow-up-scheduler.d.ts +9 -0
  19. package/dist/server/modules/butler/butler-follow-up-scheduler.js +47 -11
  20. package/dist/server/modules/butler/butler-follow-up-scheduler.js.map +1 -1
  21. package/dist/server/modules/butler/butler-follow-up-service.d.ts +7 -1
  22. package/dist/server/modules/butler/butler-follow-up-service.js +10 -0
  23. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  24. package/dist/server/modules/butler/butler-session-service.d.ts +2 -1
  25. package/dist/server/modules/butler/butler-session-service.js +10 -1
  26. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  27. package/dist/server/modules/butler/butler-session-summary-service.d.ts +8 -1
  28. package/dist/server/modules/butler/butler-session-summary-service.js +34 -7
  29. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  30. package/dist/server/modules/butler/context-aggregator.js +44 -13
  31. package/dist/server/modules/butler/context-aggregator.js.map +1 -1
  32. package/dist/server/modules/butler/patrol-scheduler.d.ts +9 -0
  33. package/dist/server/modules/butler/patrol-scheduler.js +63 -9
  34. package/dist/server/modules/butler/patrol-scheduler.js.map +1 -1
  35. package/dist/server/modules/butler/session-summary-scheduler.d.ts +9 -0
  36. package/dist/server/modules/butler/session-summary-scheduler.js +47 -11
  37. package/dist/server/modules/butler/session-summary-scheduler.js.map +1 -1
  38. package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.d.ts +38 -0
  39. package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.js +99 -0
  40. package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.js.map +1 -0
  41. package/dist/server/modules/debug-target/debug-target-controller.d.ts +70 -0
  42. package/dist/server/modules/debug-target/debug-target-controller.js +113 -0
  43. package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -0
  44. package/dist/server/modules/debug-target/debug-target-service.d.ts +102 -0
  45. package/dist/server/modules/debug-target/debug-target-service.js +1484 -0
  46. package/dist/server/modules/debug-target/debug-target-service.js.map +1 -0
  47. package/dist/server/modules/debug-target/framework-compatibility-matrix.d.ts +4 -0
  48. package/dist/server/modules/debug-target/framework-compatibility-matrix.js +45 -0
  49. package/dist/server/modules/debug-target/framework-compatibility-matrix.js.map +1 -0
  50. package/dist/server/modules/debug-target/launch-adapter-registry.d.ts +25 -0
  51. package/dist/server/modules/debug-target/launch-adapter-registry.js +445 -0
  52. package/dist/server/modules/debug-target/launch-adapter-registry.js.map +1 -0
  53. package/dist/server/modules/file/file-content-service.d.ts +2 -1
  54. package/dist/server/modules/file/file-content-service.js +53 -0
  55. package/dist/server/modules/file/file-content-service.js.map +1 -1
  56. package/dist/server/modules/file/file-controller.d.ts +12 -1
  57. package/dist/server/modules/file/file-controller.js +72 -1
  58. package/dist/server/modules/file/file-controller.js.map +1 -1
  59. package/dist/server/modules/file/file-preview-link-service.d.ts +22 -0
  60. package/dist/server/modules/file/file-preview-link-service.js +160 -0
  61. package/dist/server/modules/file/file-preview-link-service.js.map +1 -0
  62. package/dist/server/modules/git/commit-orchestrator.d.ts +4 -1
  63. package/dist/server/modules/git/commit-orchestrator.js +18 -1
  64. package/dist/server/modules/git/commit-orchestrator.js.map +1 -1
  65. package/dist/server/modules/git/git-auth.d.ts +25 -0
  66. package/dist/server/modules/git/git-auth.js +88 -0
  67. package/dist/server/modules/git/git-auth.js.map +1 -0
  68. package/dist/server/modules/git/git-controller.d.ts +6 -0
  69. package/dist/server/modules/git/git-controller.js +5 -1
  70. package/dist/server/modules/git/git-controller.js.map +1 -1
  71. package/dist/server/modules/git/git-read-service.d.ts +2 -1
  72. package/dist/server/modules/git/git-read-service.js +19 -2
  73. package/dist/server/modules/git/git-read-service.js.map +1 -1
  74. package/dist/server/modules/git/git-remote-credential-service.d.ts +9 -0
  75. package/dist/server/modules/git/git-remote-credential-service.js +76 -0
  76. package/dist/server/modules/git/git-remote-credential-service.js.map +1 -0
  77. package/dist/server/modules/git/git-write-service.d.ts +5 -2
  78. package/dist/server/modules/git/git-write-service.js +33 -17
  79. package/dist/server/modules/git/git-write-service.js.map +1 -1
  80. package/dist/server/modules/git/types.d.ts +3 -0
  81. package/dist/server/modules/git/workspace-repo-guard.js +3 -2
  82. package/dist/server/modules/git/workspace-repo-guard.js.map +1 -1
  83. package/dist/server/modules/provider/codex-model-options.d.ts +3 -1
  84. package/dist/server/modules/provider/codex-model-options.js +4 -1
  85. package/dist/server/modules/provider/codex-model-options.js.map +1 -1
  86. package/dist/server/modules/provider/opencode-model-options.d.ts +3 -1
  87. package/dist/server/modules/provider/opencode-model-options.js +5 -1
  88. package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
  89. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +24 -0
  90. package/dist/server/modules/provider/provider-discovery-helper-client.js +14 -0
  91. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  92. package/dist/server/modules/provider/provider-discovery-helper-process.js +54 -0
  93. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  94. package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +2 -1
  95. package/dist/server/modules/sessions/codex-app-server-helper-client.js +103 -0
  96. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
  97. package/dist/server/modules/sessions/codex-app-server-helper-process.js +106 -1
  98. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  99. package/dist/server/modules/sessions/session-controller.d.ts +26 -0
  100. package/dist/server/modules/sessions/session-controller.js +39 -1
  101. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  102. package/dist/server/modules/sessions/session-history-service.d.ts +51 -5
  103. package/dist/server/modules/sessions/session-history-service.js +906 -59
  104. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  105. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +5 -0
  106. package/dist/server/modules/sessions/session-live-runtime-service.js +59 -2
  107. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  108. package/dist/server/modules/sessions/session-provider-error-mapper.js +66 -0
  109. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  110. package/dist/server/modules/tasks/event-loop-monitor.d.ts +21 -0
  111. package/dist/server/modules/tasks/event-loop-monitor.js +64 -0
  112. package/dist/server/modules/tasks/event-loop-monitor.js.map +1 -0
  113. package/dist/server/modules/tasks/observability-controller.d.ts +30 -0
  114. package/dist/server/modules/tasks/observability-controller.js +44 -0
  115. package/dist/server/modules/tasks/observability-controller.js.map +1 -0
  116. package/dist/server/modules/tasks/observability-service.d.ts +32 -0
  117. package/dist/server/modules/tasks/observability-service.js +104 -0
  118. package/dist/server/modules/tasks/observability-service.js.map +1 -0
  119. package/dist/server/modules/tasks/scheduler-metrics.d.ts +41 -0
  120. package/dist/server/modules/tasks/scheduler-metrics.js +92 -0
  121. package/dist/server/modules/tasks/scheduler-metrics.js.map +1 -0
  122. package/dist/server/modules/tasks/task-activity-log.d.ts +39 -0
  123. package/dist/server/modules/tasks/task-activity-log.js +43 -0
  124. package/dist/server/modules/tasks/task-activity-log.js.map +1 -0
  125. package/dist/server/modules/tasks/task-helper-client.d.ts +11 -0
  126. package/dist/server/modules/tasks/task-helper-client.js +132 -0
  127. package/dist/server/modules/tasks/task-helper-client.js.map +1 -0
  128. package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +16 -0
  129. package/dist/server/modules/tasks/task-helper-process-handlers.js +14 -0
  130. package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -0
  131. package/dist/server/modules/tasks/task-helper-process.d.ts +1 -0
  132. package/dist/server/modules/tasks/task-helper-process.js +49 -0
  133. package/dist/server/modules/tasks/task-helper-process.js.map +1 -0
  134. package/dist/server/modules/tasks/task-lane-executors.d.ts +2 -0
  135. package/dist/server/modules/tasks/task-lane-executors.js +15 -0
  136. package/dist/server/modules/tasks/task-lane-executors.js.map +1 -0
  137. package/dist/server/modules/tasks/task-manager.d.ts +15 -0
  138. package/dist/server/modules/tasks/task-manager.js +36 -0
  139. package/dist/server/modules/tasks/task-manager.js.map +1 -0
  140. package/dist/server/modules/tasks/task-metrics.d.ts +9 -0
  141. package/dist/server/modules/tasks/task-metrics.js +81 -0
  142. package/dist/server/modules/tasks/task-metrics.js.map +1 -0
  143. package/dist/server/modules/tasks/task-registry.d.ts +7 -0
  144. package/dist/server/modules/tasks/task-registry.js +21 -0
  145. package/dist/server/modules/tasks/task-registry.js.map +1 -0
  146. package/dist/server/modules/tasks/task-scheduler.d.ts +31 -0
  147. package/dist/server/modules/tasks/task-scheduler.js +473 -0
  148. package/dist/server/modules/tasks/task-scheduler.js.map +1 -0
  149. package/dist/server/modules/tasks/task-types.d.ts +106 -0
  150. package/dist/server/modules/tasks/task-types.js +23 -0
  151. package/dist/server/modules/tasks/task-types.js.map +1 -0
  152. package/dist/server/modules/terminal/command-template-service.d.ts +4 -0
  153. package/dist/server/modules/terminal/command-template-service.js +5 -3
  154. package/dist/server/modules/terminal/command-template-service.js.map +1 -1
  155. package/dist/server/modules/terminal/runtime/terminal-log-spooler.d.ts +7 -3
  156. package/dist/server/modules/terminal/runtime/terminal-log-spooler.js +95 -15
  157. package/dist/server/modules/terminal/runtime/terminal-log-spooler.js.map +1 -1
  158. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.d.ts +21 -0
  159. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js +144 -0
  160. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js.map +1 -0
  161. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.d.ts +1 -0
  162. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js +187 -0
  163. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js.map +1 -0
  164. package/dist/server/modules/terminal/terminal-service.d.ts +12 -0
  165. package/dist/server/modules/terminal/terminal-service.js +34 -17
  166. package/dist/server/modules/terminal/terminal-service.js.map +1 -1
  167. package/dist/server/modules/workbench/workbench-service.d.ts +23 -2
  168. package/dist/server/modules/workbench/workbench-service.js +126 -15
  169. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  170. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +5 -1
  171. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +88 -19
  172. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  173. package/dist/server/modules/workspace/workspace-code-composition.d.ts +2 -0
  174. package/dist/server/modules/workspace/workspace-code-composition.js +154 -0
  175. package/dist/server/modules/workspace/workspace-code-composition.js.map +1 -0
  176. package/dist/server/modules/workspace/workspace-controller.d.ts +14 -0
  177. package/dist/server/modules/workspace/workspace-controller.js +19 -0
  178. package/dist/server/modules/workspace/workspace-controller.js.map +1 -1
  179. package/dist/server/modules/workspace/workspace-service.d.ts +21 -14
  180. package/dist/server/modules/workspace/workspace-service.js +183 -234
  181. package/dist/server/modules/workspace/workspace-service.js.map +1 -1
  182. package/dist/server/modules/worktree/worktree-cleanup-service.d.ts +35 -0
  183. package/dist/server/modules/worktree/worktree-cleanup-service.js +210 -0
  184. package/dist/server/modules/worktree/worktree-cleanup-service.js.map +1 -0
  185. package/dist/server/modules/worktree/worktree-controller.d.ts +44 -0
  186. package/dist/server/modules/worktree/worktree-controller.js +40 -0
  187. package/dist/server/modules/worktree/worktree-controller.js.map +1 -0
  188. package/dist/server/modules/worktree/worktree-manager.d.ts +34 -0
  189. package/dist/server/modules/worktree/worktree-manager.js +292 -0
  190. package/dist/server/modules/worktree/worktree-manager.js.map +1 -0
  191. package/dist/server/modules/worktree/worktree-merge-service.d.ts +52 -0
  192. package/dist/server/modules/worktree/worktree-merge-service.js +293 -0
  193. package/dist/server/modules/worktree/worktree-merge-service.js.map +1 -0
  194. package/dist/server/modules/worktree/worktree-sync-service.d.ts +23 -0
  195. package/dist/server/modules/worktree/worktree-sync-service.js +166 -0
  196. package/dist/server/modules/worktree/worktree-sync-service.js.map +1 -0
  197. package/dist/server/routes/assistant.d.ts +3 -0
  198. package/dist/server/routes/assistant.js +15 -0
  199. package/dist/server/routes/assistant.js.map +1 -0
  200. package/dist/server/routes/debug-targets.d.ts +3 -0
  201. package/dist/server/routes/debug-targets.js +15 -0
  202. package/dist/server/routes/debug-targets.js.map +1 -0
  203. package/dist/server/routes/files.js +2 -0
  204. package/dist/server/routes/files.js.map +1 -1
  205. package/dist/server/routes/git.js +1 -0
  206. package/dist/server/routes/git.js.map +1 -1
  207. package/dist/server/routes/observability.d.ts +3 -0
  208. package/dist/server/routes/observability.js +7 -0
  209. package/dist/server/routes/observability.js.map +1 -0
  210. package/dist/server/routes/sessions.js +1 -0
  211. package/dist/server/routes/sessions.js.map +1 -1
  212. package/dist/server/routes/workspaces.js +2 -0
  213. package/dist/server/routes/workspaces.js.map +1 -1
  214. package/dist/server/routes/worktrees.d.ts +3 -0
  215. package/dist/server/routes/worktrees.js +8 -0
  216. package/dist/server/routes/worktrees.js.map +1 -0
  217. package/dist/server/server/create-server.d.ts +38 -0
  218. package/dist/server/server/create-server.js +106 -11
  219. package/dist/server/server/create-server.js.map +1 -1
  220. package/dist/server/shared/utils/command-availability.d.ts +1 -0
  221. package/dist/server/shared/utils/command-availability.js +83 -0
  222. package/dist/server/shared/utils/command-availability.js.map +1 -0
  223. package/dist/server/shared/utils/secret-box.d.ts +2 -0
  224. package/dist/server/shared/utils/secret-box.js +29 -0
  225. package/dist/server/shared/utils/secret-box.js.map +1 -0
  226. package/dist/server/shared/utils/terminal-debug-log.js +5 -3
  227. package/dist/server/shared/utils/terminal-debug-log.js.map +1 -1
  228. package/dist/server/storage/repositories/ai-fallback-edit-repository.d.ts +11 -0
  229. package/dist/server/storage/repositories/ai-fallback-edit-repository.js +118 -0
  230. package/dist/server/storage/repositories/ai-fallback-edit-repository.js.map +1 -0
  231. package/dist/server/storage/repositories/debug-runtime-session-repository.d.ts +11 -0
  232. package/dist/server/storage/repositories/debug-runtime-session-repository.js +100 -0
  233. package/dist/server/storage/repositories/debug-runtime-session-repository.js.map +1 -0
  234. package/dist/server/storage/repositories/debug-service-repository.d.ts +9 -0
  235. package/dist/server/storage/repositories/debug-service-repository.js +99 -0
  236. package/dist/server/storage/repositories/debug-service-repository.js.map +1 -0
  237. package/dist/server/storage/repositories/debug-target-repository.d.ts +11 -0
  238. package/dist/server/storage/repositories/debug-target-repository.js +100 -0
  239. package/dist/server/storage/repositories/debug-target-repository.js.map +1 -0
  240. package/dist/server/storage/repositories/framework-analysis-result-repository.d.ts +9 -0
  241. package/dist/server/storage/repositories/framework-analysis-result-repository.js +98 -0
  242. package/dist/server/storage/repositories/framework-analysis-result-repository.js.map +1 -0
  243. package/dist/server/storage/repositories/git-remote-credential-repository.d.ts +9 -0
  244. package/dist/server/storage/repositories/git-remote-credential-repository.js +51 -0
  245. package/dist/server/storage/repositories/git-remote-credential-repository.js.map +1 -0
  246. package/dist/server/storage/repositories/port-lease-repository.d.ts +12 -0
  247. package/dist/server/storage/repositories/port-lease-repository.js +124 -0
  248. package/dist/server/storage/repositories/port-lease-repository.js.map +1 -0
  249. package/dist/server/storage/repositories/runtime-binding-repository.d.ts +10 -0
  250. package/dist/server/storage/repositories/runtime-binding-repository.js +89 -0
  251. package/dist/server/storage/repositories/runtime-binding-repository.js.map +1 -0
  252. package/dist/server/storage/repositories/session-fork-repository.d.ts +8 -0
  253. package/dist/server/storage/repositories/session-fork-repository.js +69 -0
  254. package/dist/server/storage/repositories/session-fork-repository.js.map +1 -0
  255. package/dist/server/storage/repositories/session-index-repository.js +40 -2
  256. package/dist/server/storage/repositories/session-index-repository.js.map +1 -1
  257. package/dist/server/storage/repositories/terminal-command-template-repository.js +77 -4
  258. package/dist/server/storage/repositories/terminal-command-template-repository.js.map +1 -1
  259. package/dist/server/storage/repositories/terminal-instance-repository.js +89 -7
  260. package/dist/server/storage/repositories/terminal-instance-repository.js.map +1 -1
  261. package/dist/server/storage/repositories/workspace-navigation-state-repository.d.ts +9 -0
  262. package/dist/server/storage/repositories/workspace-navigation-state-repository.js +49 -0
  263. package/dist/server/storage/repositories/workspace-navigation-state-repository.js.map +1 -0
  264. package/dist/server/storage/repositories/workspace-repository.d.ts +7 -1
  265. package/dist/server/storage/repositories/workspace-repository.js +32 -8
  266. package/dist/server/storage/repositories/workspace-repository.js.map +1 -1
  267. package/dist/server/storage/repositories/workspace-worktree-repository.d.ts +13 -0
  268. package/dist/server/storage/repositories/workspace-worktree-repository.js +158 -0
  269. package/dist/server/storage/repositories/workspace-worktree-repository.js.map +1 -0
  270. package/dist/server/storage/sqlite/client.js +408 -0
  271. package/dist/server/storage/sqlite/client.js.map +1 -1
  272. package/dist/server/storage/sqlite/schema.sql +268 -0
  273. package/dist/server/types/domain.d.ts +256 -1
  274. package/dist/server/ws/workbench-ws-hub.js +33 -9
  275. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  276. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +6 -1
  277. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +240 -7
  278. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  279. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +26 -1
  280. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +507 -2
  281. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  282. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +94 -5
  283. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -1
  284. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +5 -1
  285. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +293 -3
  286. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  287. package/node_modules/@codingns/session-sync-core/dist/providers/utils.d.ts +1 -0
  288. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +117 -17
  289. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -1
  290. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +10 -0
  291. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +128 -8
  292. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  293. package/node_modules/@codingns/session-sync-core/dist/services.d.ts +2 -1
  294. package/node_modules/@codingns/session-sync-core/dist/services.js +55 -8
  295. package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -1
  296. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +33 -0
  297. package/package.json +1 -1
  298. package/dist/public/assets/index-CxeghocY.css +0 -1
  299. package/dist/public/assets/index-DXusStl0.js +0 -108
package/bin/codingns.mjs CHANGED
@@ -14,61 +14,328 @@ if (!command || command === "help" || command === "--help" || command === "-h")
14
14
  printHelp(0);
15
15
  }
16
16
 
17
- if (command !== "start") {
18
- console.error(`[codingns] 不支持的命令:${command}`);
19
- printHelp(1);
17
+ switch (command) {
18
+ case "start":
19
+ await runStartCommand(argv);
20
+ break;
21
+ case "assistant":
22
+ await runAssistantCommand(argv);
23
+ break;
24
+ default:
25
+ console.error(`[codingns] 不支持的命令:${command}`);
26
+ printHelp(1);
20
27
  }
21
28
 
22
- const options = parseArgs(argv);
29
+ async function runStartCommand(argv) {
30
+ const options = parseArgs(argv, {
31
+ supportedOptions: ["host", "port", "data-dir"],
32
+ supportedFlags: ["demo"]
33
+ });
23
34
 
24
- if (options.help) {
25
- printHelp(0);
35
+ if (options.help) {
36
+ printHelp(0);
37
+ }
38
+
39
+ if (options.errors.length > 0) {
40
+ for (const error of options.errors) {
41
+ console.error(`[codingns] ${error}`);
42
+ }
43
+ printHelp(1);
44
+ }
45
+
46
+ const host = readStringOption(
47
+ options.values.host,
48
+ process.env.HOST,
49
+ process.env.CODINGNS_HOST,
50
+ "0.0.0.0"
51
+ );
52
+ const port = parsePort(
53
+ readStringOption(options.values.port, process.env.PORT, process.env.CODINGNS_PORT, "3002")
54
+ );
55
+ const dataDir = resolveDataDir(
56
+ readStringOption(
57
+ options.values["data-dir"],
58
+ process.env.CODINGNS_DATA_DIR,
59
+ path.join(os.homedir(), ".codingns")
60
+ )
61
+ );
62
+ const demoMode = options.flags.demo || process.env.DEMO_MODE === "true";
63
+
64
+ fs.mkdirSync(dataDir, { recursive: true });
65
+ fs.mkdirSync(path.join(dataDir, "releases"), { recursive: true });
66
+
67
+ const { startHost } = await import("../dist/server/server/start-host.js");
68
+
69
+ await startHost({
70
+ host,
71
+ port,
72
+ webUiDir: path.join(distRoot, "public"),
73
+ databasePath: path.join(dataDir, "host.sqlite"),
74
+ releaseManifestRoot: path.join(dataDir, "releases"),
75
+ serverUpdatePackageName: "@jingyi0605/codingns",
76
+ demoMode
77
+ });
78
+ }
79
+
80
+ async function runAssistantCommand(argv) {
81
+ const [group, action, ...rest] = argv;
82
+
83
+ if (!group || group === "help" || group === "--help" || group === "-h") {
84
+ const topic = buildAssistantHelpTopic(action, rest);
85
+ printAssistantHelpTopic(topic, 0);
86
+ }
87
+
88
+ if (!action || action === "help" || action === "--help" || action === "-h") {
89
+ printAssistantHelpTopic(group, 0);
90
+ }
91
+
92
+ if (rest.length > 0 && isHelpToken(rest[0])) {
93
+ printAssistantHelpTopic(`${group}.${action}`, 0);
94
+ }
95
+
96
+ switch (`${group}:${action ?? ""}`) {
97
+ case "capabilities:list":
98
+ await printAssistantResponse(await requestAssistant({
99
+ method: "GET",
100
+ path: "/api/assistant/capabilities",
101
+ argv: rest,
102
+ helpTopic: "capabilities.list"
103
+ }));
104
+ return;
105
+ case "projects:list":
106
+ await printAssistantResponse(await requestAssistant({
107
+ method: "GET",
108
+ path: "/api/assistant/projects",
109
+ argv: rest,
110
+ supportedOptions: ["workspace-id", "status", "risk-level"],
111
+ helpTopic: "projects.list"
112
+ }, (options) => ({
113
+ workspaceId: readOptionalTrimmedValue(options.values["workspace-id"]),
114
+ status: readOptionalTrimmedValue(options.values.status),
115
+ riskLevel: readOptionalTrimmedValue(options.values["risk-level"])
116
+ })));
117
+ return;
118
+ case "projects:get": {
119
+ const [projectId, ...tail] = rest;
120
+ await printAssistantResponse(await requestAssistant({
121
+ method: "GET",
122
+ path: `/api/assistant/projects/${requirePositional(projectId, "projectId")}`,
123
+ argv: tail,
124
+ helpTopic: "projects.get"
125
+ }));
126
+ return;
127
+ }
128
+ case "sessions:list": {
129
+ await printAssistantResponse(await requestAssistant({
130
+ method: "GET",
131
+ path: `/api/assistant/projects/${requireOptionPositional(rest, "--project", "projectId")}/sessions`,
132
+ argv: stripConsumedOption(rest, "--project"),
133
+ supportedOptions: [],
134
+ helpTopic: "sessions.list"
135
+ }));
136
+ return;
137
+ }
138
+ case "sessions:get": {
139
+ const [sessionId, ...tail] = rest;
140
+ await printAssistantResponse(await requestAssistant({
141
+ method: "GET",
142
+ path: `/api/assistant/sessions/${requirePositional(sessionId, "sessionId")}`,
143
+ argv: tail,
144
+ helpTopic: "sessions.get"
145
+ }));
146
+ return;
147
+ }
148
+ case "sessions:messages": {
149
+ const [sessionId, ...tail] = rest;
150
+ await printAssistantResponse(await requestAssistant({
151
+ method: "GET",
152
+ path: `/api/assistant/sessions/${requirePositional(sessionId, "sessionId")}/messages`,
153
+ argv: tail,
154
+ supportedOptions: ["cursor", "limit", "direction"],
155
+ helpTopic: "sessions.messages"
156
+ }, (options) => ({
157
+ cursor: readOptionalTrimmedValue(options.values.cursor),
158
+ limit: readOptionalTrimmedValue(options.values.limit),
159
+ direction: readOptionalTrimmedValue(options.values.direction)
160
+ })));
161
+ return;
162
+ }
163
+ case "sessions:runtime": {
164
+ const [sessionId, ...tail] = rest;
165
+ await printAssistantResponse(await requestAssistant({
166
+ method: "GET",
167
+ path: `/api/assistant/sessions/${requirePositional(sessionId, "sessionId")}/runtime`,
168
+ argv: tail,
169
+ helpTopic: "sessions.runtime"
170
+ }));
171
+ return;
172
+ }
173
+ case "sessions:send": {
174
+ const [sessionId, ...tail] = rest;
175
+ await printAssistantResponse(await requestAssistant({
176
+ method: "POST",
177
+ path: `/api/assistant/sessions/${requirePositional(sessionId, "sessionId")}/messages`,
178
+ argv: tail,
179
+ supportedOptions: ["message", "client-request-id", "model", "reasoning-level", "permission-mode"],
180
+ helpTopic: "sessions.send"
181
+ }, (options) => ({
182
+ content: requireOptionValue(options.values.message, "message"),
183
+ clientRequestId: readOptionalTrimmedValue(options.values["client-request-id"]),
184
+ model: readOptionalTrimmedValue(options.values.model),
185
+ reasoningLevel: readOptionalTrimmedValue(options.values["reasoning-level"]),
186
+ permissionMode: readOptionalTrimmedValue(options.values["permission-mode"])
187
+ })));
188
+ return;
189
+ }
190
+ case "sessions:fork": {
191
+ const [sessionId, ...tail] = rest;
192
+ await printAssistantResponse(await requestAssistant({
193
+ method: "POST",
194
+ path: `/api/assistant/sessions/${requirePositional(sessionId, "sessionId")}/forks`,
195
+ argv: tail,
196
+ supportedOptions: ["source-type", "message-id", "strategy", "target-provider"],
197
+ helpTopic: "sessions.fork"
198
+ }, (options) => ({
199
+ sourceType: readOptionalTrimmedValue(options.values["source-type"]),
200
+ sourceMessageId: readOptionalTrimmedValue(options.values["message-id"]),
201
+ strategy: readOptionalTrimmedValue(options.values.strategy),
202
+ targetProvider: readOptionalTrimmedValue(options.values["target-provider"])
203
+ })));
204
+ return;
205
+ }
206
+ case "terminals:list":
207
+ await printAssistantResponse(await requestAssistant({
208
+ method: "GET",
209
+ path: "/api/assistant/terminals",
210
+ argv: rest,
211
+ supportedOptions: ["workspace-id", "project-id"],
212
+ helpTopic: "terminals.list"
213
+ }, (options) => ({
214
+ workspaceId: readOptionalTrimmedValue(options.values["workspace-id"]),
215
+ projectId: readOptionalTrimmedValue(options.values["project-id"])
216
+ })));
217
+ return;
218
+ case "terminals:history": {
219
+ const [terminalId, ...tail] = rest;
220
+ await printAssistantResponse(await requestAssistant({
221
+ method: "GET",
222
+ path: `/api/assistant/terminals/${requirePositional(terminalId, "terminalId")}/history`,
223
+ argv: tail,
224
+ supportedOptions: ["before-seq", "limit"],
225
+ helpTopic: "terminals.history"
226
+ }, (options) => ({
227
+ beforeSeq: readOptionalTrimmedValue(options.values["before-seq"]),
228
+ limit: readOptionalTrimmedValue(options.values.limit)
229
+ })));
230
+ return;
231
+ }
232
+ case "terminals:send": {
233
+ const [terminalId, ...tail] = rest;
234
+ await printAssistantResponse(await requestAssistant({
235
+ method: "POST",
236
+ path: `/api/assistant/terminals/${requirePositional(terminalId, "terminalId")}/input`,
237
+ argv: tail,
238
+ supportedOptions: ["input"],
239
+ helpTopic: "terminals.send"
240
+ }, (options) => ({
241
+ content: requireOptionValue(options.values.input, "input")
242
+ })));
243
+ return;
244
+ }
245
+ default:
246
+ console.error(`[codingns] 不支持的 assistant 子命令:${group}${action ? ` ${action}` : ""}`);
247
+ printAssistantHelpTopic("assistant", 1);
248
+ }
26
249
  }
27
250
 
28
- if (options.errors.length > 0) {
29
- for (const error of options.errors) {
30
- console.error(`[codingns] ${error}`);
31
- }
32
- printHelp(1);
33
- }
34
-
35
- const host = readStringOption(
36
- options.values.host,
37
- process.env.HOST,
38
- process.env.CODINGNS_HOST,
39
- "0.0.0.0"
40
- );
41
- const port = parsePort(
42
- readStringOption(options.values.port, process.env.PORT, process.env.CODINGNS_PORT, "3002")
43
- );
44
- const dataDir = resolveDataDir(
45
- readStringOption(
46
- options.values["data-dir"],
47
- process.env.CODINGNS_DATA_DIR,
48
- path.join(os.homedir(), ".codingns")
49
- )
50
- );
51
- const demoMode = options.flags.demo || process.env.DEMO_MODE === "true";
52
-
53
- fs.mkdirSync(dataDir, { recursive: true });
54
- fs.mkdirSync(path.join(dataDir, "releases"), { recursive: true });
55
-
56
- const { startHost } = await import("../dist/server/server/start-host.js");
57
-
58
- await startHost({
59
- host,
60
- port,
61
- webUiDir: path.join(distRoot, "public"),
62
- databasePath: path.join(dataDir, "host.sqlite"),
63
- releaseManifestRoot: path.join(dataDir, "releases"),
64
- serverUpdatePackageName: "@jingyi0605/codingns",
65
- demoMode
66
- });
67
-
68
- function parseArgs(argv) {
251
+ async function requestAssistant(command, buildPayload) {
252
+ const options = parseArgs(command.argv, {
253
+ supportedOptions: [
254
+ "base-url",
255
+ "token",
256
+ ...(command.supportedOptions ?? [])
257
+ ]
258
+ });
259
+
260
+ if (options.help) {
261
+ printAssistantHelpTopic(command.helpTopic ?? "assistant", 0);
262
+ }
263
+
264
+ if (options.errors.length > 0) {
265
+ for (const error of options.errors) {
266
+ console.error(`[codingns] ${error}`);
267
+ }
268
+ printAssistantHelpTopic(command.helpTopic ?? "assistant", 1);
269
+ }
270
+
271
+ const baseUrl = resolveAssistantBaseUrl(options.values["base-url"]);
272
+ const accessToken = resolveAssistantAccessToken(options.values.token);
273
+ const url = new URL(command.path, appendTrailingSlash(baseUrl));
274
+ const payload = buildPayload ? buildPayload(options) : null;
275
+
276
+ if (command.method === "GET" && payload) {
277
+ for (const [key, value] of Object.entries(payload)) {
278
+ if (typeof value === "string" && value.length > 0) {
279
+ url.searchParams.set(key, value);
280
+ }
281
+ }
282
+ }
283
+
284
+ let response;
285
+
286
+ try {
287
+ response = await fetch(url, {
288
+ method: command.method,
289
+ headers: {
290
+ Authorization: `Bearer ${accessToken}`,
291
+ ...(command.method === "POST" ? { "Content-Type": "application/json" } : {})
292
+ },
293
+ body: command.method === "POST" ? JSON.stringify(payload ?? {}) : undefined
294
+ });
295
+ } catch (error) {
296
+ const message = error instanceof Error ? error.message : "未知网络错误";
297
+ console.error(JSON.stringify({
298
+ ok: false,
299
+ detail: `助手能力请求失败:${message}`,
300
+ target: url.toString()
301
+ }, null, 2));
302
+ process.exit(1);
303
+ }
304
+
305
+ const rawBody = await response.text();
306
+ const responseBody = tryParseJson(rawBody);
307
+
308
+ if (!response.ok) {
309
+ const detail = typeof responseBody?.detail === "string"
310
+ ? responseBody.detail
311
+ : `HTTP ${response.status}`;
312
+ console.error(JSON.stringify({
313
+ ok: false,
314
+ status: response.status,
315
+ detail,
316
+ body: responseBody ?? rawBody
317
+ }, null, 2));
318
+ process.exit(1);
319
+ }
320
+
321
+ return responseBody ?? rawBody;
322
+ }
323
+
324
+ async function printAssistantResponse(payload) {
325
+ if (typeof payload === "string") {
326
+ console.log(payload);
327
+ return;
328
+ }
329
+
330
+ console.log(JSON.stringify(payload, null, 2));
331
+ }
332
+
333
+ function parseArgs(argv, input = {}) {
69
334
  const values = {};
70
335
  const flags = {};
71
336
  const errors = [];
337
+ const supportedOptions = new Set(input.supportedOptions ?? []);
338
+ const supportedFlags = new Set(input.supportedFlags ?? []);
72
339
  let index = 0;
73
340
 
74
341
  while (index < argv.length) {
@@ -98,13 +365,13 @@ function parseArgs(argv) {
98
365
  }
99
366
 
100
367
  // 布尔标志(不需要值)
101
- if (isSupportedFlag(rawName)) {
368
+ if (supportedFlags.has(rawName)) {
102
369
  flags[rawName] = true;
103
370
  index += 1;
104
371
  continue;
105
372
  }
106
373
 
107
- if (!isSupportedOption(rawName)) {
374
+ if (!supportedOptions.has(rawName)) {
108
375
  errors.push(`不支持的参数:${token}`);
109
376
  index += 1;
110
377
  continue;
@@ -136,12 +403,33 @@ function parseArgs(argv) {
136
403
  };
137
404
  }
138
405
 
139
- function isSupportedOption(name) {
140
- return name === "host" || name === "port" || name === "data-dir";
406
+ function resolveAssistantBaseUrl(input) {
407
+ const baseUrl = readStringOption(
408
+ input,
409
+ process.env.CODINGNS_BASE_URL,
410
+ process.env.CODINGNS_SERVER_BASE_URL,
411
+ "http://127.0.0.1:3002"
412
+ );
413
+
414
+ try {
415
+ return new URL(baseUrl).toString();
416
+ } catch {
417
+ fail(`助手调用 baseUrl 非法:${baseUrl}`);
418
+ }
141
419
  }
142
420
 
143
- function isSupportedFlag(name) {
144
- return name === "demo";
421
+ function resolveAssistantAccessToken(input) {
422
+ const accessToken = readStringOption(
423
+ input,
424
+ process.env.CODINGNS_ACCESS_TOKEN,
425
+ process.env.CODINGNS_TOKEN
426
+ );
427
+
428
+ if (!accessToken) {
429
+ fail("缺少助手调用 access token,请传 --token 或设置 CODINGNS_ACCESS_TOKEN");
430
+ }
431
+
432
+ return accessToken;
145
433
  }
146
434
 
147
435
  function readStringOption(...values) {
@@ -154,6 +442,79 @@ function readStringOption(...values) {
154
442
  return "";
155
443
  }
156
444
 
445
+ function readOptionalTrimmedValue(value) {
446
+ const normalized = typeof value === "string" ? value.trim() : "";
447
+ return normalized.length > 0 ? normalized : null;
448
+ }
449
+
450
+ function requireOptionValue(value, field) {
451
+ const normalized = readOptionalTrimmedValue(value);
452
+
453
+ if (!normalized) {
454
+ fail(`参数 --${field} 不能为空`);
455
+ }
456
+
457
+ return normalized;
458
+ }
459
+
460
+ function requirePositional(value, field) {
461
+ const normalized = typeof value === "string" ? value.trim() : "";
462
+
463
+ if (!normalized) {
464
+ fail(`缺少位置参数:${field}`);
465
+ }
466
+
467
+ return normalized;
468
+ }
469
+
470
+ function requireOptionPositional(argv, optionName, field) {
471
+ const index = argv.findIndex((token) => token === optionName || token.startsWith(`${optionName}=`));
472
+
473
+ if (index < 0) {
474
+ fail(`缺少必要参数:${optionName}`);
475
+ }
476
+
477
+ const token = argv[index];
478
+
479
+ if (token.includes("=")) {
480
+ return requirePositional(token.split("=", 2)[1], field);
481
+ }
482
+
483
+ return requirePositional(argv[index + 1], field);
484
+ }
485
+
486
+ function stripConsumedOption(argv, optionName) {
487
+ const index = argv.findIndex((token) => token === optionName || token.startsWith(`${optionName}=`));
488
+
489
+ if (index < 0) {
490
+ return argv;
491
+ }
492
+
493
+ const token = argv[index];
494
+
495
+ if (token.includes("=")) {
496
+ return argv.filter((_, currentIndex) => currentIndex !== index);
497
+ }
498
+
499
+ return argv.filter((_, currentIndex) => currentIndex !== index && currentIndex !== index + 1);
500
+ }
501
+
502
+ function appendTrailingSlash(value) {
503
+ return value.endsWith("/") ? value : `${value}/`;
504
+ }
505
+
506
+ function tryParseJson(input) {
507
+ if (!input) {
508
+ return null;
509
+ }
510
+
511
+ try {
512
+ return JSON.parse(input);
513
+ } catch {
514
+ return null;
515
+ }
516
+ }
517
+
157
518
  function parsePort(input) {
158
519
  const port = Number.parseInt(input, 10);
159
520
 
@@ -187,6 +548,7 @@ function printHelp(exitCode) {
187
548
  codingns 用法:
188
549
 
189
550
  codingns start [--host 0.0.0.0] [--port 3002] [--data-dir ~/.codingns] [--demo]
551
+ codingns assistant <group> <action> [options]
190
552
 
191
553
  说明:
192
554
 
@@ -195,6 +557,13 @@ codingns 用法:
195
557
  --data-dir 数据目录,默认 ~/.codingns
196
558
  --demo 以演示模式启动(自动创建 demo 账户、15 分钟会话超时、开放 CORS)
197
559
  --help 显示帮助
560
+
561
+ assistant 例子:
562
+
563
+ codingns assistant capabilities list --token <token>
564
+ codingns assistant projects list --status active --token <token>
565
+ codingns assistant sessions send <sessionId> --message "继续修复类型错误" --token <token>
566
+ codingns assistant terminals send <terminalId> --input "npm test\\n" --token <token>
198
567
  `.trim();
199
568
 
200
569
  if (exitCode === 0) {
@@ -206,6 +575,224 @@ codingns 用法:
206
575
  process.exit(exitCode);
207
576
  }
208
577
 
578
+ function printAssistantHelpTopic(topic, exitCode) {
579
+ const output = getAssistantHelpText(topic);
580
+
581
+ if (exitCode === 0) {
582
+ console.log(output);
583
+ } else {
584
+ console.error(output);
585
+ }
586
+
587
+ process.exit(exitCode);
588
+ }
589
+
590
+ function getAssistantHelpText(topic) {
591
+ switch (topic) {
592
+ case "capabilities":
593
+ case "capabilities.list":
594
+ return `
595
+ codingns assistant capabilities
596
+
597
+ 用途:
598
+ 查看当前 Host 开放了哪些助手能力,以及版本和限制。
599
+
600
+ 用法:
601
+ codingns assistant capabilities list [--base-url http://127.0.0.1:3002] --token <token>
602
+ `.trim();
603
+ case "projects":
604
+ return `
605
+ codingns assistant projects
606
+
607
+ 可用动作:
608
+ list 列出托管项目
609
+ get 读取单个项目详情
610
+
611
+ 示例:
612
+ codingns assistant projects list --status active --token <token>
613
+ codingns assistant projects get <projectId> --token <token>
614
+ `.trim();
615
+ case "projects.list":
616
+ return `
617
+ codingns assistant projects list
618
+
619
+ 用途:
620
+ 按工作区、生命周期、风险等级筛选托管项目。
621
+
622
+ 用法:
623
+ codingns assistant projects list [--workspace-id <id>] [--status active|paused|archived] [--risk-level low|medium|high] --token <token>
624
+ `.trim();
625
+ case "projects.get":
626
+ return `
627
+ codingns assistant projects get
628
+
629
+ 用途:
630
+ 读取项目详情、概况,以及该项目下可操作会话。
631
+
632
+ 用法:
633
+ codingns assistant projects get <projectId> --token <token>
634
+ `.trim();
635
+ case "sessions":
636
+ return `
637
+ codingns assistant sessions
638
+
639
+ 可用动作:
640
+ list 列出指定项目下的会话
641
+ get 读取会话详情
642
+ messages 读取消息窗口
643
+ runtime 读取运行态
644
+ send 向真实项目会话发送消息
645
+ fork 从会话或消息点 fork 新会话
646
+
647
+ 示例:
648
+ codingns assistant sessions list --project <projectId> --token <token>
649
+ codingns assistant sessions send <sessionId> --message "继续修复" --token <token>
650
+ `.trim();
651
+ case "sessions.list":
652
+ return `
653
+ codingns assistant sessions list
654
+
655
+ 用途:
656
+ 列出指定项目下当前可操作的真实会话。
657
+
658
+ 用法:
659
+ codingns assistant sessions list --project <projectId> --token <token>
660
+ `.trim();
661
+ case "sessions.get":
662
+ return `
663
+ codingns assistant sessions get
664
+
665
+ 用途:
666
+ 读取会话详情,包括当前状态和可继续操作的引用。
667
+
668
+ 用法:
669
+ codingns assistant sessions get <sessionId> --token <token>
670
+ `.trim();
671
+ case "sessions.messages":
672
+ return `
673
+ codingns assistant sessions messages
674
+
675
+ 用途:
676
+ 分页读取某个会话的消息窗口。
677
+
678
+ 用法:
679
+ codingns assistant sessions messages <sessionId> [--cursor <cursor>] [--limit 40] [--direction forward|backward] --token <token>
680
+ `.trim();
681
+ case "sessions.runtime":
682
+ return `
683
+ codingns assistant sessions runtime
684
+
685
+ 用途:
686
+ 读取会话当前运行态,用来判断能否继续发送或是否还在执行。
687
+
688
+ 用法:
689
+ codingns assistant sessions runtime <sessionId> --token <token>
690
+ `.trim();
691
+ case "sessions.send":
692
+ return `
693
+ codingns assistant sessions send
694
+
695
+ 用途:
696
+ 向真实项目会话发送消息,推进开发,但不直接改本地代码。
697
+
698
+ 用法:
699
+ codingns assistant sessions send <sessionId> --message "..." [--client-request-id <id>] [--model <model>] [--reasoning-level <level>] [--permission-mode <mode>] --token <token>
700
+ `.trim();
701
+ case "sessions.fork":
702
+ return `
703
+ codingns assistant sessions fork
704
+
705
+ 用途:
706
+ 从现有会话或消息点 fork 一个新分支会话。
707
+
708
+ 用法:
709
+ codingns assistant sessions fork <sessionId> [--source-type session|message] [--message-id <id>] [--strategy auto|native-only|reconstruct-only] [--target-provider <provider>] --token <token>
710
+ `.trim();
711
+ case "terminals":
712
+ return `
713
+ codingns assistant terminals
714
+
715
+ 可用动作:
716
+ list 列出项目或工作区下的终端
717
+ history 读取终端历史输出
718
+ send 向受控终端发送输入
719
+
720
+ 示例:
721
+ codingns assistant terminals list --project-id <projectId> --token <token>
722
+ codingns assistant terminals send <terminalId> --input "npm test\\n" --token <token>
723
+ `.trim();
724
+ case "terminals.list":
725
+ return `
726
+ codingns assistant terminals list
727
+
728
+ 用途:
729
+ 列出指定项目或工作区下的受控终端。
730
+
731
+ 用法:
732
+ codingns assistant terminals list [--workspace-id <id> | --project-id <id>] --token <token>
733
+ `.trim();
734
+ case "terminals.history":
735
+ return `
736
+ codingns assistant terminals history
737
+
738
+ 用途:
739
+ 分页读取终端历史输出。
740
+
741
+ 用法:
742
+ codingns assistant terminals history <terminalId> [--before-seq <n>] [--limit 20] --token <token>
743
+ `.trim();
744
+ case "terminals.send":
745
+ return `
746
+ codingns assistant terminals send
747
+
748
+ 用途:
749
+ 向受控终端发送输入,比如测试命令或构建命令。
750
+
751
+ 用法:
752
+ codingns assistant terminals send <terminalId> --input "npm test\\n" --token <token>
753
+ `.trim();
754
+ default:
755
+ return `
756
+ codingns assistant 用法:
757
+
758
+ codingns assistant help [capabilities|projects|sessions|terminals] [action]
759
+ codingns assistant capabilities list [--base-url http://127.0.0.1:3002] --token <token>
760
+ codingns assistant projects list [--workspace-id <id>] [--status active|paused|archived] [--risk-level low|medium|high] --token <token>
761
+ codingns assistant projects get <projectId> [--base-url ...] --token <token>
762
+ codingns assistant sessions list --project <projectId> [--base-url ...] --token <token>
763
+ codingns assistant sessions get <sessionId> [--base-url ...] --token <token>
764
+ codingns assistant sessions messages <sessionId> [--cursor <cursor>] [--limit 40] [--direction forward|backward] --token <token>
765
+ codingns assistant sessions runtime <sessionId> [--base-url ...] --token <token>
766
+ codingns assistant sessions send <sessionId> --message "..." [--client-request-id <id>] [--model <model>] [--reasoning-level <level>] [--permission-mode <mode>] --token <token>
767
+ codingns assistant sessions fork <sessionId> [--source-type session|message] [--message-id <id>] [--strategy auto|native-only|reconstruct-only] [--target-provider <provider>] --token <token>
768
+ codingns assistant terminals list [--workspace-id <id> | --project-id <id>] --token <token>
769
+ codingns assistant terminals history <terminalId> [--before-seq <n>] [--limit 20] --token <token>
770
+ codingns assistant terminals send <terminalId> --input "npm test\\n" --token <token>
771
+
772
+ 环境变量:
773
+
774
+ CODINGNS_BASE_URL 默认 Host 地址,未传时默认 http://127.0.0.1:3002
775
+ CODINGNS_ACCESS_TOKEN 默认 Bearer token
776
+ `.trim();
777
+ }
778
+ }
779
+
780
+ function buildAssistantHelpTopic(action, rest) {
781
+ if (!action || action === "--help" || action === "-h") {
782
+ return "assistant";
783
+ }
784
+
785
+ if (rest.length === 0) {
786
+ return action;
787
+ }
788
+
789
+ return `${action}.${rest[0]}`;
790
+ }
791
+
792
+ function isHelpToken(value) {
793
+ return value === "help" || value === "--help" || value === "-h";
794
+ }
795
+
209
796
  function fail(message) {
210
797
  console.error(`[codingns] ${message}`);
211
798
  process.exit(1);