@jingyi0605/codingns 0.3.6 → 0.5.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 (369) hide show
  1. package/README.md +3 -0
  2. package/bin/codingns.mjs +913 -1
  3. package/dist/public/assets/AdaptiveButlerPage-B153lk5H.css +1 -0
  4. package/dist/public/assets/AdaptiveButlerPage-R-XZw7pd.js +3 -0
  5. package/dist/public/assets/App-DUAg5urj.css +1 -0
  6. package/dist/public/assets/App-DkvE5EyM.js +30 -0
  7. package/dist/public/assets/BootstrapPage-Vu5oEJ8z.js +1 -0
  8. package/dist/public/assets/ConversationPage-Cjpg6g0J.js +2 -0
  9. package/dist/public/assets/DesktopDetachPreviewPage-BgeEqbc5.js +1 -0
  10. package/dist/public/assets/DesktopWindowPage-1WelvxdH.js +2 -0
  11. package/dist/public/assets/FileContextPanel-D_ghXJuW.js +1 -0
  12. package/dist/public/assets/GitSidebar-D9f9Jxwr.js +6 -0
  13. package/dist/public/assets/MobileCreateSessionSheet-DLq5qPkx.js +1 -0
  14. package/dist/public/assets/MobileSheet-DLg-gX1t.js +1 -0
  15. package/dist/public/assets/MobileTopHeaderFrame-DArgZI7L.js +1 -0
  16. package/dist/public/assets/MobileWorkspaceSwitcherHeader-0ywJKfBQ.js +1 -0
  17. package/dist/public/assets/ServerSettingsModal-izoYMx9U.js +1 -0
  18. package/dist/public/assets/SessionIndexPage-C5aG8FIv.js +1 -0
  19. package/dist/public/assets/SettingsPage-HJIC-P-4.js +1 -0
  20. package/dist/public/assets/TerminalManagerPanel-DpyUTo9k.js +1 -0
  21. package/dist/public/assets/{TerminalPage-D00S4KM6.js → TerminalPage-CtKXIU0h.js} +19 -19
  22. package/dist/public/assets/TerminalRuntimeFallbackModal-CRhOQOsT.js +1 -0
  23. package/dist/public/assets/ToolFilesPage-DcYPsS-e.js +1 -0
  24. package/dist/public/assets/ToolGitPage-CsPl89ty.js +1 -0
  25. package/dist/public/assets/ToolProcessesPage-D0dvR8xK.js +1 -0
  26. package/dist/public/assets/ToolsHomePage-4fP-KRiv.js +1 -0
  27. package/dist/public/assets/WorkbenchLandingPage-kvlfyxRo.js +1 -0
  28. package/dist/public/assets/WorkbenchLayout-ByFw4eeu.js +3 -0
  29. package/dist/public/assets/WorkbenchModal-Ctob14VR.js +1 -0
  30. package/dist/public/assets/WorkbenchShellRoute-BUITtdAg.css +1 -0
  31. package/dist/public/assets/WorkbenchShellRoute-Kw7JEZI3.js +1 -0
  32. package/dist/public/assets/WorkspaceDebugDetailPage-Com5kEXJ.js +1 -0
  33. package/dist/public/assets/WorkspaceDetailPage-D0Lrx4Uz.js +1 -0
  34. package/dist/public/assets/WorkspaceHomePage-wR8d3aP9.js +1 -0
  35. package/dist/public/assets/butler-records-events-DgWCG364.js +1 -0
  36. package/dist/public/assets/default-session-permission-mode-CcGwR4Kk.js +1 -0
  37. package/dist/public/assets/event-DvH9tcej.js +1 -0
  38. package/dist/public/assets/file-tree-icon-UFVoVzhM.js +31 -0
  39. package/dist/public/assets/index-Byp9hJ0c.js +42 -0
  40. package/dist/public/assets/index-_52jxu4a.css +1 -0
  41. package/dist/public/assets/preferences-service-KIYeE2gk.js +1 -0
  42. package/dist/public/assets/session-runtime-machine-0KNSSPp5.js +17 -0
  43. package/dist/public/assets/styles-BWPBZvze.css +1 -0
  44. package/dist/public/assets/styles-CSUx5LGe.js +1 -0
  45. package/dist/public/assets/terminal-runtime-meta-AWXJpN4r.js +1 -0
  46. package/dist/public/assets/useRegisteredDebugTemplates-DBDRdptr.js +1 -0
  47. package/dist/public/assets/window-BWqRixxq.js +1 -0
  48. package/dist/public/index.html +2 -2
  49. package/dist/server/middlewares/auth-guard.d.ts +4 -0
  50. package/dist/server/middlewares/auth-guard.js +42 -4
  51. package/dist/server/middlewares/auth-guard.js.map +1 -1
  52. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +234 -0
  53. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +365 -0
  54. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  55. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +262 -2
  56. package/dist/server/modules/assistant-capability/assistant-capability-service.js +737 -3
  57. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  58. package/dist/server/modules/auth/auth-controller.d.ts +11 -1
  59. package/dist/server/modules/auth/auth-controller.js +61 -2
  60. package/dist/server/modules/auth/auth-controller.js.map +1 -1
  61. package/dist/server/modules/auth/auth-device-display-name.d.ts +10 -0
  62. package/dist/server/modules/auth/auth-device-display-name.js +190 -0
  63. package/dist/server/modules/auth/auth-device-display-name.js.map +1 -0
  64. package/dist/server/modules/auth/auth-service.d.ts +80 -5
  65. package/dist/server/modules/auth/auth-service.js +333 -23
  66. package/dist/server/modules/auth/auth-service.js.map +1 -1
  67. package/dist/server/modules/butler/assistant-automation-service.d.ts +112 -0
  68. package/dist/server/modules/butler/assistant-automation-service.js +832 -0
  69. package/dist/server/modules/butler/assistant-automation-service.js.map +1 -0
  70. package/dist/server/modules/butler/assistant-automation-trigger.d.ts +94 -0
  71. package/dist/server/modules/butler/assistant-automation-trigger.js +400 -0
  72. package/dist/server/modules/butler/assistant-automation-trigger.js.map +1 -0
  73. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.d.ts +32 -0
  74. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js +93 -0
  75. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js.map +1 -0
  76. package/dist/server/modules/butler/assistant-sandbox-service.d.ts +69 -0
  77. package/dist/server/modules/butler/assistant-sandbox-service.js +399 -0
  78. package/dist/server/modules/butler/assistant-sandbox-service.js.map +1 -0
  79. package/dist/server/modules/butler/butler-action-context-service.d.ts +4 -1
  80. package/dist/server/modules/butler/butler-action-context-service.js +8 -2
  81. package/dist/server/modules/butler/butler-action-context-service.js.map +1 -1
  82. package/dist/server/modules/butler/butler-auth-service.js +7 -2
  83. package/dist/server/modules/butler/butler-auth-service.js.map +1 -1
  84. package/dist/server/modules/butler/butler-control-session-service.d.ts +11 -1
  85. package/dist/server/modules/butler/butler-control-session-service.js +173 -40
  86. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  87. package/dist/server/modules/butler/butler-control-timer-scheduler.d.ts +32 -0
  88. package/dist/server/modules/butler/butler-control-timer-scheduler.js +93 -0
  89. package/dist/server/modules/butler/butler-control-timer-scheduler.js.map +1 -0
  90. package/dist/server/modules/butler/butler-control-timer-service.d.ts +42 -0
  91. package/dist/server/modules/butler/butler-control-timer-service.js +132 -0
  92. package/dist/server/modules/butler/butler-control-timer-service.js.map +1 -0
  93. package/dist/server/modules/butler/butler-controller.d.ts +42 -2
  94. package/dist/server/modules/butler/butler-controller.js +79 -12
  95. package/dist/server/modules/butler/butler-controller.js.map +1 -1
  96. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.d.ts +2 -1
  97. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js +27 -25
  98. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js.map +1 -1
  99. package/dist/server/modules/butler/butler-follow-up-service.d.ts +41 -5
  100. package/dist/server/modules/butler/butler-follow-up-service.js +568 -371
  101. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  102. package/dist/server/modules/butler/butler-inbox-analysis-service.d.ts +4 -1
  103. package/dist/server/modules/butler/butler-inbox-analysis-service.js +18 -4
  104. package/dist/server/modules/butler/butler-inbox-analysis-service.js.map +1 -1
  105. package/dist/server/modules/butler/butler-inbox-service.js +1 -0
  106. package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
  107. package/dist/server/modules/butler/butler-profile-service.js +2 -5
  108. package/dist/server/modules/butler/butler-profile-service.js.map +1 -1
  109. package/dist/server/modules/butler/butler-project-service.d.ts +3 -1
  110. package/dist/server/modules/butler/butler-project-service.js +7 -1
  111. package/dist/server/modules/butler/butler-project-service.js.map +1 -1
  112. package/dist/server/modules/butler/butler-session-service.d.ts +5 -1
  113. package/dist/server/modules/butler/butler-session-service.js +26 -1
  114. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  115. package/dist/server/modules/butler/butler-session-summary-service.js +2 -1
  116. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  117. package/dist/server/modules/butler/butler-workspace-context.d.ts +4 -1
  118. package/dist/server/modules/butler/butler-workspace-context.js +204 -58
  119. package/dist/server/modules/butler/butler-workspace-context.js.map +1 -1
  120. package/dist/server/modules/butler/patrol-execution-service.js +2 -1
  121. package/dist/server/modules/butler/patrol-execution-service.js.map +1 -1
  122. package/dist/server/modules/butler/provider-adapter-registry.d.ts +3 -0
  123. package/dist/server/modules/butler/provider-adapter-registry.js +18 -1
  124. package/dist/server/modules/butler/provider-adapter-registry.js.map +1 -1
  125. package/dist/server/modules/butler/verification-run-service.d.ts +9 -2
  126. package/dist/server/modules/butler/verification-run-service.js +188 -34
  127. package/dist/server/modules/butler/verification-run-service.js.map +1 -1
  128. package/dist/server/modules/debug-target/debug-target-controller.js +1 -1
  129. package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -1
  130. package/dist/server/modules/debug-target/debug-target-service.d.ts +7 -2
  131. package/dist/server/modules/debug-target/debug-target-service.js +563 -100
  132. package/dist/server/modules/debug-target/debug-target-service.js.map +1 -1
  133. package/dist/server/modules/git/git-command-helper-client.d.ts +1 -0
  134. package/dist/server/modules/git/git-command-helper-client.js +19 -26
  135. package/dist/server/modules/git/git-command-helper-client.js.map +1 -1
  136. package/dist/server/modules/git/git-command-runner.js +19 -1
  137. package/dist/server/modules/git/git-command-runner.js.map +1 -1
  138. package/dist/server/modules/preferences/profile-service.d.ts +3 -1
  139. package/dist/server/modules/preferences/profile-service.js +74 -3
  140. package/dist/server/modules/preferences/profile-service.js.map +1 -1
  141. package/dist/server/modules/provider/provider-controller.d.ts +1 -1
  142. package/dist/server/modules/provider/provider-controller.js.map +1 -1
  143. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +5 -3
  144. package/dist/server/modules/provider/provider-discovery-helper-client.js +129 -43
  145. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  146. package/dist/server/modules/provider/provider-discovery-helper-process.js +44 -0
  147. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  148. package/dist/server/modules/provider/provider-discovery-runtime.js +83 -3
  149. package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -1
  150. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.d.ts +10 -0
  151. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.js +48 -0
  152. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.js.map +1 -0
  153. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.d.ts +48 -0
  154. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.js +11 -0
  155. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.js.map +1 -0
  156. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.d.ts +74 -0
  157. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.js +302 -0
  158. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.js.map +1 -0
  159. package/dist/server/modules/relay-tunnel/relay-tunnel-controller.d.ts +33 -0
  160. package/dist/server/modules/relay-tunnel/relay-tunnel-controller.js +57 -0
  161. package/dist/server/modules/relay-tunnel/relay-tunnel-controller.js.map +1 -0
  162. package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.d.ts +9 -0
  163. package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.js +25 -0
  164. package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.js.map +1 -0
  165. package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.d.ts +18 -0
  166. package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.js +230 -0
  167. package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.js.map +1 -0
  168. package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.d.ts +41 -0
  169. package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.js +443 -0
  170. package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.js.map +1 -0
  171. package/dist/server/modules/relay-tunnel/relay-tunnel-service.d.ts +111 -0
  172. package/dist/server/modules/relay-tunnel/relay-tunnel-service.js +771 -0
  173. package/dist/server/modules/relay-tunnel/relay-tunnel-service.js.map +1 -0
  174. package/dist/server/modules/sessions/claude-runtime-helper-client.js +23 -1
  175. package/dist/server/modules/sessions/claude-runtime-helper-client.js.map +1 -1
  176. package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +2 -1
  177. package/dist/server/modules/sessions/codex-app-server-helper-client.js +78 -0
  178. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
  179. package/dist/server/modules/sessions/codex-app-server-helper-process.js +84 -2
  180. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  181. package/dist/server/modules/sessions/provider-session-delete-cli.d.ts +15 -0
  182. package/dist/server/modules/sessions/provider-session-delete-cli.js +148 -0
  183. package/dist/server/modules/sessions/provider-session-delete-cli.js.map +1 -0
  184. package/dist/server/modules/sessions/session-controller.d.ts +4 -1
  185. package/dist/server/modules/sessions/session-controller.js +4 -0
  186. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  187. package/dist/server/modules/sessions/session-history-service.d.ts +24 -1
  188. package/dist/server/modules/sessions/session-history-service.js +401 -42
  189. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  190. package/dist/server/modules/sessions/session-live-runtime-router-service.d.ts +25 -0
  191. package/dist/server/modules/sessions/session-live-runtime-router-service.js +42 -0
  192. package/dist/server/modules/sessions/session-live-runtime-router-service.js.map +1 -0
  193. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +6 -0
  194. package/dist/server/modules/sessions/session-live-runtime-service.js +130 -28
  195. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  196. package/dist/server/modules/sessions/session-message-attachment-service.d.ts +1 -0
  197. package/dist/server/modules/sessions/session-message-attachment-service.js +22 -0
  198. package/dist/server/modules/sessions/session-message-attachment-service.js.map +1 -1
  199. package/dist/server/modules/sessions/session-message-origin-utils.d.ts +12 -0
  200. package/dist/server/modules/sessions/session-message-origin-utils.js +45 -0
  201. package/dist/server/modules/sessions/session-message-origin-utils.js.map +1 -0
  202. package/dist/server/modules/sessions/session-permission-request-service.d.ts +1 -0
  203. package/dist/server/modules/sessions/session-permission-request-service.js +367 -5
  204. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
  205. package/dist/server/modules/sessions/session-provider-error-mapper.js +32 -0
  206. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  207. package/dist/server/modules/sessions/session-provider-usage-guard-service.d.ts +37 -0
  208. package/dist/server/modules/sessions/session-provider-usage-guard-service.js +179 -0
  209. package/dist/server/modules/sessions/session-provider-usage-guard-service.js.map +1 -0
  210. package/dist/server/modules/sessions/session-provider-usage-limit.d.ts +17 -0
  211. package/dist/server/modules/sessions/session-provider-usage-limit.js +465 -0
  212. package/dist/server/modules/sessions/session-provider-usage-limit.js.map +1 -0
  213. package/dist/server/modules/skills/assistant-runtime-skill-catalog.d.ts +8 -0
  214. package/dist/server/modules/skills/assistant-runtime-skill-catalog.js +26 -0
  215. package/dist/server/modules/skills/assistant-runtime-skill-catalog.js.map +1 -0
  216. package/dist/server/modules/skills/assistant-runtime-skill-cleanup.d.ts +9 -0
  217. package/dist/server/modules/skills/assistant-runtime-skill-cleanup.js +55 -0
  218. package/dist/server/modules/skills/assistant-runtime-skill-cleanup.js.map +1 -0
  219. package/dist/server/modules/skills/builtin-skill-service.js +1 -6
  220. package/dist/server/modules/skills/builtin-skill-service.js.map +1 -1
  221. package/dist/server/modules/skills/builtin-skills/codingns-assistant/SKILL.md +19 -12
  222. package/dist/server/modules/skills/builtin-skills/codingns-assistant/references/cli-workflow.md +9 -3
  223. package/dist/server/modules/skills/skill-controller.d.ts +2 -2
  224. package/dist/server/modules/skills/skill-controller.js +9 -1
  225. package/dist/server/modules/skills/skill-controller.js.map +1 -1
  226. package/dist/server/modules/skills/skill-manager-service.d.ts +26 -1
  227. package/dist/server/modules/skills/skill-manager-service.js +346 -90
  228. package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
  229. package/dist/server/modules/skills/skill-name-policy.d.ts +2 -0
  230. package/dist/server/modules/skills/skill-name-policy.js +10 -0
  231. package/dist/server/modules/skills/skill-name-policy.js.map +1 -0
  232. package/dist/server/modules/tailscale/tailscale-service.d.ts +2 -0
  233. package/dist/server/modules/tailscale/tailscale-service.js +21 -8
  234. package/dist/server/modules/tailscale/tailscale-service.js.map +1 -1
  235. package/dist/server/modules/tasks/task-helper-client.d.ts +5 -2
  236. package/dist/server/modules/tasks/task-helper-client.js +118 -38
  237. package/dist/server/modules/tasks/task-helper-client.js.map +1 -1
  238. package/dist/server/modules/tasks/task-helper-process.js +94 -3
  239. package/dist/server/modules/tasks/task-helper-process.js.map +1 -1
  240. package/dist/server/modules/tasks/task-types.d.ts +6 -0
  241. package/dist/server/modules/tasks/task-types.js +7 -1
  242. package/dist/server/modules/tasks/task-types.js.map +1 -1
  243. package/dist/server/modules/terminal/command-template-service.d.ts +9 -0
  244. package/dist/server/modules/terminal/command-template-service.js +87 -5
  245. package/dist/server/modules/terminal/command-template-service.js.map +1 -1
  246. package/dist/server/modules/terminal/template-reverse-proxy-service.js +71 -3
  247. package/dist/server/modules/terminal/template-reverse-proxy-service.js.map +1 -1
  248. package/dist/server/modules/terminal/terminal-controller.d.ts +3 -0
  249. package/dist/server/modules/terminal/terminal-controller.js +41 -0
  250. package/dist/server/modules/terminal/terminal-controller.js.map +1 -1
  251. package/dist/server/modules/workbench/workbench-service.d.ts +3 -0
  252. package/dist/server/modules/workbench/workbench-service.js +4 -3
  253. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  254. package/dist/server/modules/workbench/workspace-file-watcher.d.ts +14 -6
  255. package/dist/server/modules/workbench/workspace-file-watcher.js +267 -57
  256. package/dist/server/modules/workbench/workspace-file-watcher.js.map +1 -1
  257. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +2 -0
  258. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +32 -3
  259. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  260. package/dist/server/modules/worktree/worktree-manager.d.ts +9 -1
  261. package/dist/server/modules/worktree/worktree-manager.js +9 -1
  262. package/dist/server/modules/worktree/worktree-manager.js.map +1 -1
  263. package/dist/server/routes/assistant.js +49 -0
  264. package/dist/server/routes/assistant.js.map +1 -1
  265. package/dist/server/routes/auth.js +4 -0
  266. package/dist/server/routes/auth.js.map +1 -1
  267. package/dist/server/routes/butler.js +5 -0
  268. package/dist/server/routes/butler.js.map +1 -1
  269. package/dist/server/routes/sessions.js +1 -0
  270. package/dist/server/routes/sessions.js.map +1 -1
  271. package/dist/server/routes/system.d.ts +2 -1
  272. package/dist/server/routes/system.js +13 -1
  273. package/dist/server/routes/system.js.map +1 -1
  274. package/dist/server/server/create-server.d.ts +18 -0
  275. package/dist/server/server/create-server.js +113 -20
  276. package/dist/server/server/create-server.js.map +1 -1
  277. package/dist/server/shared/utils/tokens.d.ts +3 -1
  278. package/dist/server/shared/utils/tokens.js +9 -2
  279. package/dist/server/shared/utils/tokens.js.map +1 -1
  280. package/dist/server/storage/repositories/assistant-automation-run-repository.d.ts +12 -0
  281. package/dist/server/storage/repositories/assistant-automation-run-repository.js +139 -0
  282. package/dist/server/storage/repositories/assistant-automation-run-repository.js.map +1 -0
  283. package/dist/server/storage/repositories/assistant-automation-task-repository.d.ts +17 -0
  284. package/dist/server/storage/repositories/assistant-automation-task-repository.js +179 -0
  285. package/dist/server/storage/repositories/assistant-automation-task-repository.js.map +1 -0
  286. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.d.ts +18 -0
  287. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js +191 -0
  288. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js.map +1 -0
  289. package/dist/server/storage/repositories/auth-device-repository.d.ts +22 -0
  290. package/dist/server/storage/repositories/auth-device-repository.js +97 -0
  291. package/dist/server/storage/repositories/auth-device-repository.js.map +1 -0
  292. package/dist/server/storage/repositories/auth-device-session-repository.d.ts +17 -0
  293. package/dist/server/storage/repositories/auth-device-session-repository.js +82 -0
  294. package/dist/server/storage/repositories/auth-device-session-repository.js.map +1 -0
  295. package/dist/server/storage/repositories/auth-login-event-repository.d.ts +9 -0
  296. package/dist/server/storage/repositories/auth-login-event-repository.js +53 -0
  297. package/dist/server/storage/repositories/auth-login-event-repository.js.map +1 -0
  298. package/dist/server/storage/repositories/auth-token-repository.d.ts +4 -0
  299. package/dist/server/storage/repositories/auth-token-repository.js +58 -5
  300. package/dist/server/storage/repositories/auth-token-repository.js.map +1 -1
  301. package/dist/server/storage/repositories/butler-control-session-repository.js +27 -3
  302. package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
  303. package/dist/server/storage/repositories/butler-control-timer-repository.d.ts +15 -0
  304. package/dist/server/storage/repositories/butler-control-timer-repository.js +157 -0
  305. package/dist/server/storage/repositories/butler-control-timer-repository.js.map +1 -0
  306. package/dist/server/storage/repositories/butler-follow-up-task-repository.js +21 -3
  307. package/dist/server/storage/repositories/butler-follow-up-task-repository.js.map +1 -1
  308. package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.d.ts +8 -0
  309. package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.js +52 -0
  310. package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.js.map +1 -0
  311. package/dist/server/storage/repositories/instance-relay-tunnel-repository.d.ts +10 -0
  312. package/dist/server/storage/repositories/instance-relay-tunnel-repository.js +153 -0
  313. package/dist/server/storage/repositories/instance-relay-tunnel-repository.js.map +1 -0
  314. package/dist/server/storage/repositories/instance-tailscale-repository.js +6 -3
  315. package/dist/server/storage/repositories/instance-tailscale-repository.js.map +1 -1
  316. package/dist/server/storage/repositories/managed-skill-repository.d.ts +2 -1
  317. package/dist/server/storage/repositories/managed-skill-repository.js +14 -4
  318. package/dist/server/storage/repositories/managed-skill-repository.js.map +1 -1
  319. package/dist/server/storage/repositories/session-message-attachment-repository.d.ts +2 -0
  320. package/dist/server/storage/repositories/session-message-attachment-repository.js +24 -0
  321. package/dist/server/storage/repositories/session-message-attachment-repository.js.map +1 -1
  322. package/dist/server/storage/repositories/user-preference-profile-repository.js +6 -3
  323. package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -1
  324. package/dist/server/storage/sqlite/client.js +534 -2
  325. package/dist/server/storage/sqlite/client.js.map +1 -1
  326. package/dist/server/storage/sqlite/schema.sql +228 -4
  327. package/dist/server/types/domain.d.ts +170 -2
  328. package/dist/server/ws/workbench-ws-hub.d.ts +14 -8
  329. package/dist/server/ws/workbench-ws-hub.js +369 -209
  330. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  331. package/dist/server/ws/ws-auth-guard.js +1 -4
  332. package/dist/server/ws/ws-auth-guard.js.map +1 -1
  333. package/dist/server/ws/ws-server.d.ts +1 -1
  334. package/dist/server/ws/ws-server.js.map +1 -1
  335. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.d.ts +1 -0
  336. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js +80 -0
  337. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js.map +1 -0
  338. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +5 -1
  339. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +122 -4
  340. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  341. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +17 -1
  342. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +437 -51
  343. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  344. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.d.ts +7 -1
  345. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +240 -27
  346. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -1
  347. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.d.ts +5 -1
  348. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js +108 -2
  349. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js.map +1 -1
  350. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +3 -0
  351. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +101 -8
  352. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  353. package/node_modules/@codingns/session-sync-core/dist/providers/utils.d.ts +1 -0
  354. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +4 -1
  355. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -1
  356. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +44 -0
  357. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
  358. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +5 -1
  359. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +153 -60
  360. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  361. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +1 -0
  362. package/node_modules/@codingns/session-sync-core/dist/services.d.ts +1 -0
  363. package/node_modules/@codingns/session-sync-core/dist/services.js +24 -8
  364. package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -1
  365. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +6 -0
  366. package/package.json +1 -1
  367. package/scripts/postinstall.mjs +0 -33
  368. package/dist/public/assets/index-BlOinYqR.js +0 -122
  369. package/dist/public/assets/index-Dg_7g6lA.css +0 -1
package/bin/codingns.mjs CHANGED
@@ -7,6 +7,15 @@ import { fileURLToPath } from "node:url";
7
7
 
8
8
  const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
9
9
  const distRoot = path.join(packageRoot, "dist");
10
+ const ASSISTANT_REQUEST_SOURCE_HEADER = "X-CodingNS-Assistant-Source";
11
+ const ASSISTANT_CLI_REQUEST_SOURCE = "assistant-cli";
12
+ const PROVIDER_SESSION_DELETE_PROVIDERS = new Set([
13
+ "claude-code",
14
+ "codex",
15
+ "opencode",
16
+ "gemini",
17
+ "kimi"
18
+ ]);
10
19
 
11
20
  const [command, ...argv] = process.argv.slice(2);
12
21
 
@@ -21,6 +30,9 @@ switch (command) {
21
30
  case "assistant":
22
31
  await runAssistantCommand(argv);
23
32
  break;
33
+ case "provider-sessions":
34
+ await runProviderSessionsCommand(argv);
35
+ break;
24
36
  case "skills":
25
37
  await runSkillsCommand(argv);
26
38
  break;
@@ -139,6 +151,32 @@ async function runAssistantCommand(argv) {
139
151
  }));
140
152
  return;
141
153
  }
154
+ case "sessions:start": {
155
+ await printAssistantResponse(await requestAssistant({
156
+ method: "POST",
157
+ path: "/api/assistant/sessions/start",
158
+ argv: rest,
159
+ supportedOptions: [
160
+ "project",
161
+ "workspace",
162
+ "sandbox",
163
+ "message",
164
+ "provider",
165
+ "model",
166
+ "reasoning-level",
167
+ "permission-mode"
168
+ ],
169
+ helpTopic: "sessions.start"
170
+ }, (options) => ({
171
+ ...resolveAssistantSessionStartTarget(options.values),
172
+ content: requireOptionValue(options.values.message, "message"),
173
+ providerId: readOptionalTrimmedValue(options.values.provider),
174
+ model: readOptionalTrimmedValue(options.values.model),
175
+ reasoningLevel: readOptionalTrimmedValue(options.values["reasoning-level"]),
176
+ permissionMode: readOptionalTrimmedValue(options.values["permission-mode"])
177
+ })));
178
+ return;
179
+ }
142
180
  case "sessions:get": {
143
181
  const [sessionId, ...tail] = rest;
144
182
  await printAssistantResponse(await requestAssistant({
@@ -174,6 +212,16 @@ async function runAssistantCommand(argv) {
174
212
  }));
175
213
  return;
176
214
  }
215
+ case "sessions:delete": {
216
+ const [sessionId, ...tail] = rest;
217
+ await printAssistantResponse(await requestAssistant({
218
+ method: "DELETE",
219
+ path: `/api/assistant/sessions/${requirePositional(sessionId, "sessionId")}`,
220
+ argv: tail,
221
+ helpTopic: "sessions.delete"
222
+ }));
223
+ return;
224
+ }
177
225
  case "sessions:send": {
178
226
  const [sessionId, ...tail] = rest;
179
227
  await printAssistantResponse(await requestAssistant({
@@ -207,6 +255,341 @@ async function runAssistantCommand(argv) {
207
255
  })));
208
256
  return;
209
257
  }
258
+ case "automations:list":
259
+ await printAssistantResponse(await requestAssistant({
260
+ method: "GET",
261
+ path: "/api/assistant/automations",
262
+ argv: rest,
263
+ supportedOptions: ["status", "control-session-id"],
264
+ helpTopic: "automations.list"
265
+ }, (options) => ({
266
+ status: readOptionalTrimmedValue(options.values.status),
267
+ controlSessionId: readOptionalTrimmedValue(options.values["control-session-id"])
268
+ })));
269
+ return;
270
+ case "automations:get": {
271
+ const [automationId, ...tail] = rest;
272
+ await printAssistantResponse(await requestAssistant({
273
+ method: "GET",
274
+ path: `/api/assistant/automations/${requirePositional(automationId, "automationId")}`,
275
+ argv: tail,
276
+ helpTopic: "automations.get"
277
+ }));
278
+ return;
279
+ }
280
+ case "automations:create":
281
+ await printAssistantResponse(await requestAssistant({
282
+ method: "POST",
283
+ path: "/api/assistant/automations",
284
+ argv: rest,
285
+ supportedOptions: [
286
+ "message",
287
+ "trigger",
288
+ "title",
289
+ "due-at",
290
+ "after-seconds",
291
+ "every-seconds",
292
+ "every-minutes",
293
+ "every-hours",
294
+ "stop-at",
295
+ "cron-minute",
296
+ "cron-hour",
297
+ "cron-day-of-week",
298
+ "condition-kind",
299
+ "repository-url",
300
+ "poll-interval-seconds",
301
+ "expires-at",
302
+ "max-checks",
303
+ "condition-session-id",
304
+ "control-session-id",
305
+ "project-id",
306
+ "session-id"
307
+ ],
308
+ supportedFlags: ["include-trigger-context"],
309
+ repeatableOptions: ["cron-day-of-week"],
310
+ helpTopic: "automations.create"
311
+ }, (options) => ({
312
+ content: requireOptionValue(options.values.message, "message"),
313
+ triggerType: readOptionalTrimmedValue(options.values.trigger),
314
+ title: readOptionalTrimmedValue(options.values.title),
315
+ dueAt: readOptionalTrimmedValue(options.values["due-at"]),
316
+ afterSeconds: readOptionalTrimmedValue(options.values["after-seconds"]),
317
+ everySeconds: readOptionalTrimmedValue(options.values["every-seconds"]),
318
+ everyMinutes: readOptionalTrimmedValue(options.values["every-minutes"]),
319
+ everyHours: readOptionalTrimmedValue(options.values["every-hours"]),
320
+ stopAt: readOptionalTrimmedValue(options.values["stop-at"]),
321
+ cronMinute: readOptionalTrimmedValue(options.values["cron-minute"]),
322
+ cronHour: readOptionalTrimmedValue(options.values["cron-hour"]),
323
+ cronDaysOfWeek: readMultiOptionValues(options.values["cron-day-of-week"]),
324
+ conditionKind: readOptionalTrimmedValue(options.values["condition-kind"]),
325
+ repositoryUrl: readOptionalTrimmedValue(options.values["repository-url"]),
326
+ pollIntervalSeconds: readOptionalTrimmedValue(options.values["poll-interval-seconds"]),
327
+ expiresAt: readOptionalTrimmedValue(options.values["expires-at"]),
328
+ maxChecks: readOptionalTrimmedValue(options.values["max-checks"]),
329
+ conditionSessionId: readOptionalTrimmedValue(options.values["condition-session-id"]),
330
+ includeTriggerContext: options.flags["include-trigger-context"] === true,
331
+ controlSessionId: readOptionalTrimmedValue(options.values["control-session-id"]),
332
+ projectId: readOptionalTrimmedValue(options.values["project-id"]),
333
+ targetSessionId: readOptionalTrimmedValue(options.values["session-id"])
334
+ })));
335
+ return;
336
+ case "automations:cancel": {
337
+ const [automationId, ...tail] = rest;
338
+ await printAssistantResponse(await requestAssistant({
339
+ method: "POST",
340
+ path: `/api/assistant/automations/${requirePositional(automationId, "automationId")}/cancel`,
341
+ argv: tail,
342
+ helpTopic: "automations.cancel"
343
+ }));
344
+ return;
345
+ }
346
+ case "automations:runs": {
347
+ const [automationId, ...tail] = rest;
348
+ await printAssistantResponse(await requestAssistant({
349
+ method: "GET",
350
+ path: `/api/assistant/automations/${requirePositional(automationId, "automationId")}/runs`,
351
+ argv: tail,
352
+ helpTopic: "automations.runs"
353
+ }));
354
+ return;
355
+ }
356
+ case "sandboxes:list":
357
+ await printAssistantResponse(await requestAssistant({
358
+ method: "GET",
359
+ path: "/api/assistant/sandboxes",
360
+ argv: rest,
361
+ supportedOptions: ["status"],
362
+ helpTopic: "sandboxes.list"
363
+ }, (options) => ({
364
+ status: readOptionalTrimmedValue(options.values.status)
365
+ })));
366
+ return;
367
+ case "sandboxes:create":
368
+ await printAssistantResponse(await requestAssistant({
369
+ method: "POST",
370
+ path: "/api/assistant/sandboxes",
371
+ argv: rest,
372
+ supportedOptions: [
373
+ "title",
374
+ "description",
375
+ "purpose",
376
+ "expires-at",
377
+ "source-kind",
378
+ "repository-url",
379
+ "directory-name",
380
+ "auth-mode",
381
+ "username",
382
+ "password",
383
+ "auth-token"
384
+ ],
385
+ helpTopic: "sandboxes.create"
386
+ }, (options) => ({
387
+ title: readOptionalTrimmedValue(options.values.title),
388
+ description: readOptionalTrimmedValue(options.values.description),
389
+ purpose: readOptionalTrimmedValue(options.values.purpose),
390
+ expiresAt: readOptionalTrimmedValue(options.values["expires-at"]),
391
+ sourceKind: readOptionalTrimmedValue(options.values["source-kind"]),
392
+ repositoryUrl: readOptionalTrimmedValue(options.values["repository-url"]),
393
+ directoryName: readOptionalTrimmedValue(options.values["directory-name"]),
394
+ auth: buildWorkspaceCloneAuth(options.values)
395
+ })));
396
+ return;
397
+ case "sandboxes:promote": {
398
+ const [sandboxId, ...tail] = rest;
399
+ await printAssistantResponse(await requestAssistant({
400
+ method: "POST",
401
+ path: `/api/assistant/sandboxes/${requirePositional(sandboxId, "sandboxId")}/promote`,
402
+ argv: tail,
403
+ supportedOptions: ["mode", "project-name", "provider"],
404
+ helpTopic: "sandboxes.promote"
405
+ }, (options) => ({
406
+ mode: readOptionalTrimmedValue(options.values.mode),
407
+ projectName: readOptionalTrimmedValue(options.values["project-name"]),
408
+ defaultProvider: readOptionalTrimmedValue(options.values.provider)
409
+ })));
410
+ return;
411
+ }
412
+ case "sandboxes:expire": {
413
+ const [sandboxId, ...tail] = rest;
414
+ await printAssistantResponse(await requestAssistant({
415
+ method: "POST",
416
+ path: `/api/assistant/sandboxes/${requirePositional(sandboxId, "sandboxId")}/expire`,
417
+ argv: tail,
418
+ helpTopic: "sandboxes.expire"
419
+ }));
420
+ return;
421
+ }
422
+ case "sandboxes:remove": {
423
+ const [sandboxId, ...tail] = rest;
424
+ await printAssistantResponse(await requestAssistant({
425
+ method: "DELETE",
426
+ path: `/api/assistant/sandboxes/${requirePositional(sandboxId, "sandboxId")}`,
427
+ argv: tail,
428
+ helpTopic: "sandboxes.remove"
429
+ }));
430
+ return;
431
+ }
432
+ case "timers:list":
433
+ await printAssistantResponse(await requestAssistant({
434
+ method: "GET",
435
+ path: "/api/assistant/timers",
436
+ argv: rest,
437
+ supportedOptions: ["status", "control-session-id"],
438
+ helpTopic: "timers.list"
439
+ }, (options) => ({
440
+ status: readOptionalTrimmedValue(options.values.status),
441
+ controlSessionId: readOptionalTrimmedValue(options.values["control-session-id"])
442
+ })));
443
+ return;
444
+ case "timers:get": {
445
+ const [timerId, ...tail] = rest;
446
+ await printAssistantResponse(await requestAssistant({
447
+ method: "GET",
448
+ path: `/api/assistant/timers/${requirePositional(timerId, "timerId")}`,
449
+ argv: tail,
450
+ helpTopic: "timers.get"
451
+ }));
452
+ return;
453
+ }
454
+ case "timers:create":
455
+ await printAssistantResponse(await requestAssistant({
456
+ method: "POST",
457
+ path: "/api/assistant/timers",
458
+ argv: rest,
459
+ supportedOptions: [
460
+ "message",
461
+ "title",
462
+ "due-at",
463
+ "after-seconds",
464
+ "control-session-id",
465
+ "project-id",
466
+ "session-id"
467
+ ],
468
+ helpTopic: "timers.create"
469
+ }, (options) => ({
470
+ content: requireOptionValue(options.values.message, "message"),
471
+ title: readOptionalTrimmedValue(options.values.title),
472
+ dueAt: readOptionalTrimmedValue(options.values["due-at"]),
473
+ afterSeconds: readOptionalTrimmedValue(options.values["after-seconds"]),
474
+ controlSessionId: readOptionalTrimmedValue(options.values["control-session-id"]),
475
+ projectId: readOptionalTrimmedValue(options.values["project-id"]),
476
+ targetSessionId: readOptionalTrimmedValue(options.values["session-id"])
477
+ })));
478
+ return;
479
+ case "timers:cancel": {
480
+ const [timerId, ...tail] = rest;
481
+ await printAssistantResponse(await requestAssistant({
482
+ method: "POST",
483
+ path: `/api/assistant/timers/${requirePositional(timerId, "timerId")}/cancel`,
484
+ argv: tail,
485
+ helpTopic: "timers.cancel"
486
+ }));
487
+ return;
488
+ }
489
+ case "follow-ups:list":
490
+ await printAssistantResponse(await requestAssistant({
491
+ method: "GET",
492
+ path: "/api/assistant/follow-ups",
493
+ argv: rest,
494
+ supportedOptions: ["status", "project-id", "session-id", "limit"],
495
+ helpTopic: "follow-ups.list"
496
+ }, (options) => ({
497
+ status: readOptionalTrimmedValue(options.values.status),
498
+ projectId: readOptionalTrimmedValue(options.values["project-id"]),
499
+ sessionId: readOptionalTrimmedValue(options.values["session-id"]),
500
+ limit: readOptionalTrimmedValue(options.values.limit)
501
+ })));
502
+ return;
503
+ case "follow-ups:get": {
504
+ const [taskId, ...tail] = rest;
505
+ await printAssistantResponse(await requestAssistant({
506
+ method: "GET",
507
+ path: `/api/assistant/follow-ups/${requirePositional(taskId, "taskId")}`,
508
+ argv: tail,
509
+ helpTopic: "follow-ups.get"
510
+ }));
511
+ return;
512
+ }
513
+ case "follow-ups:create":
514
+ await printAssistantResponse(await requestAssistant({
515
+ method: "POST",
516
+ path: "/api/assistant/follow-ups",
517
+ argv: rest,
518
+ supportedOptions: [
519
+ "project-id",
520
+ "butler-session-id",
521
+ "provider",
522
+ "objective",
523
+ "completion-criteria",
524
+ "max-auto-continue-count",
525
+ "check-interval-seconds"
526
+ ],
527
+ helpTopic: "follow-ups.create"
528
+ }, (options) => ({
529
+ projectId: requireOptionValue(options.values["project-id"], "project-id"),
530
+ butlerSessionId: requireOptionValue(options.values["butler-session-id"], "butler-session-id"),
531
+ providerId: readOptionalTrimmedValue(options.values.provider),
532
+ objective: requireOptionValue(options.values.objective, "objective"),
533
+ completionCriteria: readOptionalTrimmedValue(options.values["completion-criteria"]),
534
+ maxAutoContinueCount: readOptionalTrimmedValue(options.values["max-auto-continue-count"]),
535
+ checkIntervalSeconds: readOptionalTrimmedValue(options.values["check-interval-seconds"])
536
+ })));
537
+ return;
538
+ case "follow-ups:continue": {
539
+ const [taskId, ...tail] = rest;
540
+ await printAssistantResponse(await requestAssistant({
541
+ method: "POST",
542
+ path: `/api/assistant/follow-ups/${requirePositional(taskId, "taskId")}/continue`,
543
+ argv: tail,
544
+ supportedOptions: ["summary", "continue-prompt"],
545
+ helpTopic: "follow-ups.continue"
546
+ }, (options) => ({
547
+ summary: requireOptionValue(options.values.summary, "summary"),
548
+ continuePrompt: requireOptionValue(options.values["continue-prompt"], "continue-prompt")
549
+ })));
550
+ return;
551
+ }
552
+ case "follow-ups:waiting-user": {
553
+ const [taskId, ...tail] = rest;
554
+ await printAssistantResponse(await requestAssistant({
555
+ method: "POST",
556
+ path: `/api/assistant/follow-ups/${requirePositional(taskId, "taskId")}/waiting-user`,
557
+ argv: tail,
558
+ supportedOptions: ["summary", "waiting-reason"],
559
+ helpTopic: "follow-ups.waiting-user"
560
+ }, (options) => ({
561
+ summary: requireOptionValue(options.values.summary, "summary"),
562
+ waitingReason: requireOptionValue(options.values["waiting-reason"], "waiting-reason")
563
+ })));
564
+ return;
565
+ }
566
+ case "follow-ups:complete": {
567
+ const [taskId, ...tail] = rest;
568
+ await printAssistantResponse(await requestAssistant({
569
+ method: "POST",
570
+ path: `/api/assistant/follow-ups/${requirePositional(taskId, "taskId")}/complete`,
571
+ argv: tail,
572
+ supportedOptions: ["summary"],
573
+ helpTopic: "follow-ups.complete"
574
+ }, (options) => ({
575
+ summary: requireOptionValue(options.values.summary, "summary")
576
+ })));
577
+ return;
578
+ }
579
+ case "follow-ups:fail": {
580
+ const [taskId, ...tail] = rest;
581
+ await printAssistantResponse(await requestAssistant({
582
+ method: "POST",
583
+ path: `/api/assistant/follow-ups/${requirePositional(taskId, "taskId")}/fail`,
584
+ argv: tail,
585
+ supportedOptions: ["summary", "reason"],
586
+ helpTopic: "follow-ups.fail"
587
+ }, (options) => ({
588
+ summary: requireOptionValue(options.values.summary, "summary"),
589
+ reason: readOptionalTrimmedValue(options.values.reason)
590
+ })));
591
+ return;
592
+ }
210
593
  case "terminals:list":
211
594
  await printAssistantResponse(await requestAssistant({
212
595
  method: "GET",
@@ -627,6 +1010,116 @@ async function runSkillsCommand(argv) {
627
1010
  }
628
1011
  }
629
1012
 
1013
+ async function runProviderSessionsCommand(argv) {
1014
+ const [action, ...rest] = argv;
1015
+
1016
+ if (!action || isHelpToken(action)) {
1017
+ printProviderSessionsHelpTopic(buildProviderSessionsHelpTopic(rest[0]), 0);
1018
+ }
1019
+
1020
+ if (rest.length > 0 && isHelpToken(rest[0])) {
1021
+ printProviderSessionsHelpTopic(buildProviderSessionsHelpTopic(action), 0);
1022
+ }
1023
+
1024
+ switch (action) {
1025
+ case "delete": {
1026
+ const options = parseArgs(rest, {
1027
+ supportedOptions: ["provider", "provider-session-id", "raw-store-ref"]
1028
+ });
1029
+
1030
+ if (options.help) {
1031
+ printProviderSessionsHelpTopic("provider-sessions.delete", 0);
1032
+ }
1033
+
1034
+ if (options.errors.length > 0) {
1035
+ for (const error of options.errors) {
1036
+ console.error(`[codingns] ${error}`);
1037
+ }
1038
+ printProviderSessionsHelpTopic("provider-sessions.delete", 1);
1039
+ }
1040
+
1041
+ const provider = requireOptionValue(options.values.provider, "provider");
1042
+ const providerSessionId = requireOptionValue(
1043
+ options.values["provider-session-id"],
1044
+ "provider-session-id"
1045
+ );
1046
+ const rawStoreRef = requireOptionValue(options.values["raw-store-ref"], "raw-store-ref");
1047
+
1048
+ if (!PROVIDER_SESSION_DELETE_PROVIDERS.has(provider)) {
1049
+ fail(
1050
+ `provider-sessions delete 仅支持 ${[...PROVIDER_SESSION_DELETE_PROVIDERS].join(", ")}`
1051
+ );
1052
+ }
1053
+
1054
+ const { SessionSyncService, ProviderRegistry } = await import("@codingns/session-sync-core");
1055
+ const {
1056
+ ClaudeCodeAdapter,
1057
+ CodexAdapter,
1058
+ GeminiAdapter,
1059
+ KimiAdapter,
1060
+ OpenCodeAdapter
1061
+ } = await import("@codingns/session-sync-core");
1062
+ const homeDir = os.homedir();
1063
+ const registry = new ProviderRegistry([
1064
+ new ClaudeCodeAdapter({
1065
+ homeDir: readStringOption(
1066
+ process.env.CODINGNS_CLAUDE_CODE_HOME,
1067
+ path.join(homeDir, ".claude")
1068
+ )
1069
+ }),
1070
+ new CodexAdapter({
1071
+ homeDir: readStringOption(
1072
+ process.env.CODINGNS_CODEX_HOME,
1073
+ path.join(homeDir, ".codex")
1074
+ )
1075
+ }),
1076
+ new GeminiAdapter({
1077
+ homeDir: readStringOption(
1078
+ process.env.CODINGNS_GEMINI_HOME,
1079
+ path.join(homeDir, ".gemini")
1080
+ ),
1081
+ commandPath: readStringOption(process.env.CODINGNS_GEMINI_COMMAND, "gemini")
1082
+ }),
1083
+ new KimiAdapter({
1084
+ homeDir: readStringOption(
1085
+ process.env.CODINGNS_KIMI_HOME,
1086
+ path.join(homeDir, ".kimi")
1087
+ ),
1088
+ defaultModel: readOptionalTrimmedValue(process.env.CODINGNS_KIMI_DEFAULT_MODEL)
1089
+ }),
1090
+ new OpenCodeAdapter({
1091
+ baseUrl: readOptionalTrimmedValue(process.env.CODINGNS_OPENCODE_BASE_URL) ?? undefined,
1092
+ dataDir:
1093
+ readOptionalTrimmedValue(process.env.CODINGNS_OPENCODE_DATA_DIR) ?? undefined,
1094
+ dbPath:
1095
+ readOptionalTrimmedValue(process.env.CODINGNS_OPENCODE_DB_PATH) ?? undefined
1096
+ })
1097
+ ]);
1098
+ const sessionSyncService = new SessionSyncService(registry);
1099
+
1100
+ try {
1101
+ await sessionSyncService.deleteSession(provider, providerSessionId, rawStoreRef);
1102
+ } catch (error) {
1103
+ console.error(
1104
+ JSON.stringify(normalizeProviderSessionDeleteFailure(error), null, 2)
1105
+ );
1106
+ process.exit(1);
1107
+ }
1108
+
1109
+ await printAssistantResponse({
1110
+ ok: true,
1111
+ provider,
1112
+ providerSessionId,
1113
+ rawStoreRef
1114
+ });
1115
+ return;
1116
+ }
1117
+ default:
1118
+ console.error(`[codingns] 不支持的 provider-sessions 子命令:${action}`);
1119
+ printProviderSessionsHelpTopic("provider-sessions", 1);
1120
+ }
1121
+ }
1122
+
630
1123
  async function requestAssistant(command, buildPayload) {
631
1124
  const options = parseArgs(command.argv, {
632
1125
  supportedOptions: [
@@ -670,6 +1163,7 @@ async function requestAssistant(command, buildPayload) {
670
1163
  method: command.method,
671
1164
  headers: {
672
1165
  Authorization: `Bearer ${accessToken}`,
1166
+ [ASSISTANT_REQUEST_SOURCE_HEADER]: ASSISTANT_CLI_REQUEST_SOURCE,
673
1167
  ...(usesJsonBody ? { "Content-Type": "application/json" } : {})
674
1168
  },
675
1169
  body: usesJsonBody ? JSON.stringify(payload ?? {}) : undefined
@@ -1154,6 +1648,7 @@ codingns 用法:
1154
1648
 
1155
1649
  codingns start [--host 0.0.0.0] [--port 3002] [--data-dir ~/.codingns] [--demo]
1156
1650
  codingns assistant <group> <action> [options]
1651
+ codingns provider-sessions <action> [options]
1157
1652
  codingns skills <action> [options]
1158
1653
 
1159
1654
  说明:
@@ -1173,6 +1668,7 @@ assistant 例子:
1173
1668
  codingns assistant debug-targets launch-plan <targetId> --port-request role=backend,cwd=apps/api,port=44001 --token <token>
1174
1669
  codingns assistant worktrees tree --root-workspace-id <id> --token <token>
1175
1670
  codingns assistant sessions send <sessionId> --message "继续修复类型错误" --token <token>
1671
+ codingns assistant follow-ups continue <taskId> --summary "目标还没完成" --continue-prompt "继续补齐剩余实现" --token <token>
1176
1672
  codingns assistant terminals send <terminalId> --input "npm test\\n" --token <token>
1177
1673
  codingns assistant terminals close <terminalId> --token <token>
1178
1674
 
@@ -1181,6 +1677,10 @@ skills 例子:
1181
1677
  codingns skills overview --token <token>
1182
1678
  codingns skills add --source ./my-skill --target codex --token <token>
1183
1679
  codingns skills sync <skillId> --target gemini --token <token>
1680
+
1681
+ provider-sessions 例子:
1682
+
1683
+ codingns provider-sessions delete --provider codex --provider-session-id <id> --raw-store-ref <ref>
1184
1684
  `.trim();
1185
1685
 
1186
1686
  if (exitCode === 0) {
@@ -1216,6 +1716,18 @@ function printSkillsHelpTopic(topic, exitCode) {
1216
1716
  process.exit(exitCode);
1217
1717
  }
1218
1718
 
1719
+ function printProviderSessionsHelpTopic(topic, exitCode) {
1720
+ const output = getProviderSessionsHelpText(topic);
1721
+
1722
+ if (exitCode === 0) {
1723
+ console.log(output);
1724
+ } else {
1725
+ console.error(output);
1726
+ }
1727
+
1728
+ process.exit(exitCode);
1729
+ }
1730
+
1219
1731
  function getAssistantHelpText(topic) {
1220
1732
  switch (topic) {
1221
1733
  case "capabilities":
@@ -1376,14 +1888,17 @@ codingns assistant sessions
1376
1888
 
1377
1889
  可用动作:
1378
1890
  list 列出指定项目下的会话
1891
+ start 按 project/workspace/sandbox 目标新建真实会话
1379
1892
  get 读取会话详情
1380
1893
  messages 读取消息窗口
1381
1894
  runtime 读取运行态
1895
+ delete 删除真实会话
1382
1896
  send 向真实项目会话发送消息
1383
1897
  fork 从会话或消息点 fork 新会话
1384
1898
 
1385
1899
  示例:
1386
1900
  codingns assistant sessions list --project <projectId> --token <token>
1901
+ codingns assistant sessions start --project <projectId> --message "继续处理这个问题" --token <token>
1387
1902
  codingns assistant sessions send <sessionId> --message "继续修复" --token <token>
1388
1903
  `.trim();
1389
1904
  case "sessions.list":
@@ -1395,6 +1910,16 @@ codingns assistant sessions list
1395
1910
 
1396
1911
  用法:
1397
1912
  codingns assistant sessions list --project <projectId> --token <token>
1913
+ `.trim();
1914
+ case "sessions.start":
1915
+ return `
1916
+ codingns assistant sessions start
1917
+
1918
+ 用途:
1919
+ 在指定 project/workspace/sandbox 目标下新建真实会话;如果不显式传 provider/model,会默认继承当前助手控制会话的配置。
1920
+
1921
+ 用法:
1922
+ codingns assistant sessions start (--project <projectId> | --workspace <workspaceId> | --sandbox <sandboxId>) --message "..." [--provider <provider>] [--model <model>] [--reasoning-level <level>] [--permission-mode <mode>] --token <token>
1398
1923
  `.trim();
1399
1924
  case "sessions.get":
1400
1925
  return `
@@ -1435,6 +1960,16 @@ codingns assistant sessions send
1435
1960
 
1436
1961
  用法:
1437
1962
  codingns assistant sessions send <sessionId> --message "..." [--client-request-id <id>] [--model <model>] [--reasoning-level <level>] [--permission-mode <mode>] --token <token>
1963
+ `.trim();
1964
+ case "sessions.delete":
1965
+ return `
1966
+ codingns assistant sessions delete
1967
+
1968
+ 用途:
1969
+ 删除指定真实会话;这会同时清理助手侧关联记录和工作区索引。
1970
+
1971
+ 用法:
1972
+ codingns assistant sessions delete <sessionId> --token <token>
1438
1973
  `.trim();
1439
1974
  case "sessions.fork":
1440
1975
  return `
@@ -1445,6 +1980,280 @@ codingns assistant sessions fork
1445
1980
 
1446
1981
  用法:
1447
1982
  codingns assistant sessions fork <sessionId> [--source-type session|message] [--message-id <id>] [--strategy auto|native-only|reconstruct-only] [--target-provider <provider>] --token <token>
1983
+ `.trim();
1984
+ case "sandboxes":
1985
+ return `
1986
+ codingns assistant sandboxes
1987
+
1988
+ 可用动作:
1989
+ list 列出当前助手沙箱
1990
+ create 创建新的临时沙箱工作区
1991
+ promote 把沙箱保留为 pinned,或晋升成正式项目
1992
+ expire 标记沙箱过期
1993
+ remove 清理沙箱
1994
+
1995
+ 示例:
1996
+ codingns assistant sandboxes list --status active --token <token>
1997
+ codingns assistant sandboxes create --title "CodingNS 临时沙箱" --source-kind clone --repository-url <url> --token <token>
1998
+ `.trim();
1999
+ case "sandboxes.list":
2000
+ return `
2001
+ codingns assistant sandboxes list
2002
+
2003
+ 用途:
2004
+ 列出当前用户可见的助手沙箱。
2005
+
2006
+ 用法:
2007
+ codingns assistant sandboxes list [--status active|archived|expired|deleted] --token <token>
2008
+ `.trim();
2009
+ case "sandboxes.create":
2010
+ return `
2011
+ codingns assistant sandboxes create
2012
+
2013
+ 用途:
2014
+ 创建新的临时沙箱工作区;默认空白沙箱,也可以直接 clone 仓库。
2015
+
2016
+ 用法:
2017
+ codingns assistant sandboxes create [--title <title>] [--description <text>] [--purpose <text>] [--expires-at <isoTime>] [--source-kind blank|clone] [--repository-url <url>] [--directory-name <name>] [--auth-mode none|basic|token] [--username <name>] [--password <password>] [--auth-token <token>] --token <token>
2018
+ `.trim();
2019
+ case "sandboxes.promote":
2020
+ return `
2021
+ codingns assistant sandboxes promote
2022
+
2023
+ 用途:
2024
+ 把沙箱保留为 pinned,或者直接晋升成正式项目。
2025
+
2026
+ 用法:
2027
+ codingns assistant sandboxes promote <sandboxId> [--mode pin|project] [--project-name <name>] [--provider <provider>] --token <token>
2028
+ `.trim();
2029
+ case "sandboxes.expire":
2030
+ return `
2031
+ codingns assistant sandboxes expire
2032
+
2033
+ 用途:
2034
+ 把指定沙箱标记为过期,后续不能再拿它启动会话。
2035
+
2036
+ 用法:
2037
+ codingns assistant sandboxes expire <sandboxId> --token <token>
2038
+ `.trim();
2039
+ case "sandboxes.remove":
2040
+ return `
2041
+ codingns assistant sandboxes remove
2042
+
2043
+ 用途:
2044
+ 删除指定沙箱并尝试清理对应工作区入口。
2045
+
2046
+ 用法:
2047
+ codingns assistant sandboxes remove <sandboxId> --token <token>
2048
+ `.trim();
2049
+ case "automations":
2050
+ return `
2051
+ codingns assistant automations
2052
+
2053
+ 可用动作:
2054
+ list 列出正式自动化任务
2055
+ get 读取单个自动化详情
2056
+ create 创建正式自动化任务
2057
+ cancel 取消自动化任务
2058
+ runs 查看自动化执行记录
2059
+
2060
+ 示例:
2061
+ codingns assistant automations create --after-seconds 3600 --message "1 小时后检查 codingns 新 tag" --session-id <sessionId> --project-id <projectId> --token <token>
2062
+ codingns assistant automations create --trigger interval --every-hours 1 --message "每小时检查一次" --token <token>
2063
+ codingns assistant automations create --trigger cron --cron-minute 30 --cron-hour 9 --cron-day-of-week 1 --cron-day-of-week 2 --message "工作日早上检查" --token <token>
2064
+ codingns assistant automations create --trigger condition --condition-kind git.remote_tag_changed --repository-url <url> --poll-interval-seconds 3600 --message "发现新 tag 后通知我" --include-trigger-context --token <token>
2065
+ codingns assistant automations list --status active --token <token>
2066
+ `.trim();
2067
+ case "automations.list":
2068
+ return `
2069
+ codingns assistant automations list
2070
+
2071
+ 用途:
2072
+ 查看当前助手控制会话下的正式自动化任务。
2073
+
2074
+ 用法:
2075
+ codingns assistant automations list [--status active|completed|cancelled|failed] [--control-session-id <id>] --token <token>
2076
+ `.trim();
2077
+ case "automations.get":
2078
+ return `
2079
+ codingns assistant automations get
2080
+
2081
+ 用途:
2082
+ 读取单个自动化任务详情。
2083
+
2084
+ 用法:
2085
+ codingns assistant automations get <automationId> --token <token>
2086
+ `.trim();
2087
+ case "automations.create":
2088
+ return `
2089
+ codingns assistant automations create
2090
+
2091
+ 用途:
2092
+ 创建正式自动化;支持 once / interval / cron / condition 四种触发器。
2093
+
2094
+ 用法:
2095
+ codingns assistant automations create --message "..." [--trigger once|interval|cron|condition] [--title <title>] [--due-at <isoTime> | --after-seconds <seconds>] [--every-seconds <n> | --every-minutes <n> | --every-hours <n>] [--stop-at <isoTime>] [--cron-minute <0-59>] [--cron-hour <0-23>] [--cron-day-of-week <0-6>] [--condition-kind git.remote_tag_changed|session.runtime_idle] [--repository-url <url>] [--condition-session-id <sessionId>] [--poll-interval-seconds <n>] [--expires-at <isoTime>] [--max-checks <n>] [--include-trigger-context] [--control-session-id <id>] [--project-id <projectId>] [--session-id <sessionId>] --token <token>
2096
+ `.trim();
2097
+ case "automations.cancel":
2098
+ return `
2099
+ codingns assistant automations cancel
2100
+
2101
+ 用途:
2102
+ 取消一个尚未执行的自动化任务。
2103
+
2104
+ 用法:
2105
+ codingns assistant automations cancel <automationId> --token <token>
2106
+ `.trim();
2107
+ case "automations.runs":
2108
+ return `
2109
+ codingns assistant automations runs
2110
+
2111
+ 用途:
2112
+ 查看某个自动化任务的执行记录。
2113
+
2114
+ 用法:
2115
+ codingns assistant automations runs <automationId> --token <token>
2116
+ `.trim();
2117
+ case "timers":
2118
+ return `
2119
+ codingns assistant timers
2120
+
2121
+ 可用动作:
2122
+ list 列出当前助手会话相关的计时器
2123
+ get 读取单个计时器详情
2124
+ create 创建到点后继续助手会话的计时器
2125
+ cancel 取消计时器
2126
+
2127
+ 示例:
2128
+ codingns assistant timers create --after-seconds 300 --message "5 分钟后检查真实会话最新回复" --session-id <sessionId> --project-id <projectId> --token <token>
2129
+ codingns assistant timers list --status active --token <token>
2130
+ `.trim();
2131
+ case "timers.list":
2132
+ return `
2133
+ codingns assistant timers list
2134
+
2135
+ 用途:
2136
+ 查看当前助手会话下仍在等待、已完成或已失败的计时器。
2137
+
2138
+ 用法:
2139
+ codingns assistant timers list [--status active|completed|cancelled|failed] [--control-session-id <id>] --token <token>
2140
+ `.trim();
2141
+ case "timers.get":
2142
+ return `
2143
+ codingns assistant timers get
2144
+
2145
+ 用途:
2146
+ 读取单个计时器详情,包括计划触发时间和最后错误。
2147
+
2148
+ 用法:
2149
+ codingns assistant timers get <timerId> --token <token>
2150
+ `.trim();
2151
+ case "timers.create":
2152
+ return `
2153
+ codingns assistant timers create
2154
+
2155
+ 用途:
2156
+ 创建一个一次性计时器;到期后系统会自动向同一个助手控制会话发送消息,继续工作。
2157
+
2158
+ 用法:
2159
+ codingns assistant timers create --message "..." [--title <title>] [--due-at <isoTime> | --after-seconds <seconds>] [--control-session-id <id>] [--project-id <projectId>] [--session-id <sessionId>] --token <token>
2160
+ `.trim();
2161
+ case "timers.cancel":
2162
+ return `
2163
+ codingns assistant timers cancel
2164
+
2165
+ 用途:
2166
+ 取消一个尚未触发的计时器。
2167
+
2168
+ 用法:
2169
+ codingns assistant timers cancel <timerId> --token <token>
2170
+ `.trim();
2171
+ case "follow-ups":
2172
+ return `
2173
+ codingns assistant follow-ups
2174
+
2175
+ 可用动作:
2176
+ list 列出跟进任务
2177
+ get 读取单个跟进任务
2178
+ create 创建新的跟进任务
2179
+ continue 回写继续推进结论
2180
+ waiting-user 回写等待用户结论
2181
+ complete 回写已完成结论
2182
+ fail 回写失败结论
2183
+
2184
+ 示例:
2185
+ codingns assistant follow-ups list --status active --token <token>
2186
+ codingns assistant follow-ups continue <taskId> --summary "目标还没做完" --continue-prompt "继续补齐剩余实现" --token <token>
2187
+ `.trim();
2188
+ case "follow-ups.list":
2189
+ return `
2190
+ codingns assistant follow-ups list
2191
+
2192
+ 用途:
2193
+ 查看当前用户可见的会话跟进任务。
2194
+
2195
+ 用法:
2196
+ codingns assistant follow-ups list [--status active|waiting_user|completed|failed|cancelled] [--project-id <projectId>] [--session-id <sessionId>] [--limit <n>] --token <token>
2197
+ `.trim();
2198
+ case "follow-ups.get":
2199
+ return `
2200
+ codingns assistant follow-ups get
2201
+
2202
+ 用途:
2203
+ 读取单个跟进任务详情和历史轮次。
2204
+
2205
+ 用法:
2206
+ codingns assistant follow-ups get <taskId> --token <token>
2207
+ `.trim();
2208
+ case "follow-ups.create":
2209
+ return `
2210
+ codingns assistant follow-ups create
2211
+
2212
+ 用途:
2213
+ 为指定 Butler 会话创建新的跟进任务。
2214
+
2215
+ 用法:
2216
+ codingns assistant follow-ups create --project-id <projectId> --butler-session-id <butlerSessionId> --objective "..." [--provider codex|claude-code] [--completion-criteria "..."] [--max-auto-continue-count <n>] [--check-interval-seconds <n>] --token <token>
2217
+ `.trim();
2218
+ case "follow-ups.continue":
2219
+ return `
2220
+ codingns assistant follow-ups continue
2221
+
2222
+ 用途:
2223
+ 回写“继续推进”结论,并安排下一轮自动跟进。
2224
+
2225
+ 用法:
2226
+ codingns assistant follow-ups continue <taskId> --summary "..." --continue-prompt "..." --token <token>
2227
+ `.trim();
2228
+ case "follow-ups.waiting-user":
2229
+ return `
2230
+ codingns assistant follow-ups waiting-user
2231
+
2232
+ 用途:
2233
+ 回写“需要等待用户”结论,并写明必须等待的原因。
2234
+
2235
+ 用法:
2236
+ codingns assistant follow-ups waiting-user <taskId> --summary "..." --waiting-reason "..." --token <token>
2237
+ `.trim();
2238
+ case "follow-ups.complete":
2239
+ return `
2240
+ codingns assistant follow-ups complete
2241
+
2242
+ 用途:
2243
+ 回写“任务已完成”结论,并结束当前跟进。
2244
+
2245
+ 用法:
2246
+ codingns assistant follow-ups complete <taskId> --summary "..." --token <token>
2247
+ `.trim();
2248
+ case "follow-ups.fail":
2249
+ return `
2250
+ codingns assistant follow-ups fail
2251
+
2252
+ 用途:
2253
+ 回写“任务失败”结论,并记录失败原因。
2254
+
2255
+ 用法:
2256
+ codingns assistant follow-ups fail <taskId> --summary "..." [--reason "..."] --token <token>
1448
2257
  `.trim();
1449
2258
  case "terminals":
1450
2259
  return `
@@ -1687,10 +2496,11 @@ codingns assistant worktrees cleanup
1687
2496
  return `
1688
2497
  codingns assistant 用法:
1689
2498
 
1690
- codingns assistant help [capabilities|projects|sessions|terminals|debug-targets|debug-runtimes|workspaces|worktrees] [action]
2499
+ codingns assistant help [capabilities|projects|sessions|sandboxes|automations|timers|follow-ups|terminals|debug-targets|debug-runtimes|workspaces|worktrees] [action]
1691
2500
  codingns assistant capabilities list [--base-url http://127.0.0.1:3002] --token <token>
1692
2501
  codingns assistant projects list [--workspace-id <id>] [--status active|paused|archived] [--risk-level low|medium|high] --token <token>
1693
2502
  codingns assistant projects get <projectId> [--base-url ...] --token <token>
2503
+ codingns assistant follow-ups continue <taskId> --summary "..." --continue-prompt "..." --token <token>
1694
2504
  codingns assistant debug-targets compatibility-matrix [--base-url ...] --token <token>
1695
2505
  codingns assistant debug-targets analyze --workspace-id <id> --root-path <path> [--command-hint <command>] [--command-hint <command>] [--base-url ...] --token <token>
1696
2506
  codingns assistant debug-targets framework-analysis <targetId> [--base-url ...] --token <token>
@@ -1710,11 +2520,27 @@ codingns assistant 用法:
1710
2520
  codingns assistant workspaces nav-state <workspaceId> [--collapsed true|false] [--background-color #RRGGBB|none] [--base-url ...] --token <token>
1711
2521
  codingns assistant workspaces remove <workspaceId> [--base-url ...] --token <token>
1712
2522
  codingns assistant sessions list --project <projectId> [--base-url ...] --token <token>
2523
+ codingns assistant sessions start (--project <projectId> | --workspace <workspaceId> | --sandbox <sandboxId>) --message "..." [--provider <provider>] [--model <model>] [--reasoning-level <level>] [--permission-mode <mode>] --token <token>
1713
2524
  codingns assistant sessions get <sessionId> [--base-url ...] --token <token>
1714
2525
  codingns assistant sessions messages <sessionId> [--cursor <cursor>] [--limit 40] [--direction forward|backward] --token <token>
1715
2526
  codingns assistant sessions runtime <sessionId> [--base-url ...] --token <token>
2527
+ codingns assistant sessions delete <sessionId> [--base-url ...] --token <token>
1716
2528
  codingns assistant sessions send <sessionId> --message "..." [--client-request-id <id>] [--model <model>] [--reasoning-level <level>] [--permission-mode <mode>] --token <token>
1717
2529
  codingns assistant sessions fork <sessionId> [--source-type session|message] [--message-id <id>] [--strategy auto|native-only|reconstruct-only] [--target-provider <provider>] --token <token>
2530
+ codingns assistant sandboxes list [--status active|archived|expired|deleted] [--base-url ...] --token <token>
2531
+ codingns assistant sandboxes create [--title <title>] [--description <text>] [--purpose <text>] [--expires-at <isoTime>] [--source-kind blank|clone] [--repository-url <url>] [--directory-name <name>] [--auth-mode none|basic|token] [--username <name>] [--password <password>] [--auth-token <token>] [--base-url ...] --token <token>
2532
+ codingns assistant sandboxes promote <sandboxId> [--mode pin|project] [--project-name <name>] [--provider <provider>] [--base-url ...] --token <token>
2533
+ codingns assistant sandboxes expire <sandboxId> [--base-url ...] --token <token>
2534
+ codingns assistant sandboxes remove <sandboxId> [--base-url ...] --token <token>
2535
+ codingns assistant automations list [--status active|completed|cancelled|failed] [--control-session-id <id>] --token <token>
2536
+ codingns assistant automations get <automationId> [--base-url ...] --token <token>
2537
+ codingns assistant automations create --message "..." [--trigger once|interval|cron|condition] [--title <title>] [--due-at <isoTime> | --after-seconds <seconds>] [--every-seconds <n> | --every-minutes <n> | --every-hours <n>] [--stop-at <isoTime>] [--cron-minute <0-59>] [--cron-hour <0-23>] [--cron-day-of-week <0-6>] [--condition-kind git.remote_tag_changed|session.runtime_idle] [--repository-url <url>] [--condition-session-id <sessionId>] [--poll-interval-seconds <n>] [--expires-at <isoTime>] [--max-checks <n>] [--include-trigger-context] [--control-session-id <id>] [--project-id <projectId>] [--session-id <sessionId>] --token <token>
2538
+ codingns assistant automations cancel <automationId> [--base-url ...] --token <token>
2539
+ codingns assistant automations runs <automationId> [--base-url ...] --token <token>
2540
+ codingns assistant timers list [--status active|completed|cancelled|failed] [--control-session-id <id>] --token <token>
2541
+ codingns assistant timers get <timerId> [--base-url ...] --token <token>
2542
+ codingns assistant timers create --message "..." [--title <title>] [--due-at <isoTime> | --after-seconds <seconds>] [--control-session-id <id>] [--project-id <projectId>] [--session-id <sessionId>] --token <token>
2543
+ codingns assistant timers cancel <timerId> [--base-url ...] --token <token>
1718
2544
  codingns assistant terminals list [--workspace-id <id> | --project-id <id>] --token <token>
1719
2545
  codingns assistant terminals history <terminalId> [--before-seq <n>] [--limit 20] --token <token>
1720
2546
  codingns assistant terminals send <terminalId> --input "npm test\\n" --token <token>
@@ -1734,6 +2560,39 @@ codingns assistant 用法:
1734
2560
  }
1735
2561
  }
1736
2562
 
2563
+ function getProviderSessionsHelpText(topic) {
2564
+ switch (topic) {
2565
+ case "provider-sessions.delete":
2566
+ return `
2567
+ codingns provider-sessions delete
2568
+
2569
+ 用途:
2570
+ 直接删除底层 provider 会话,不经过项目会话索引。适合给 Host 或脚本层做真实删除调用。
2571
+
2572
+ 用法:
2573
+ codingns provider-sessions delete --provider <claude-code|codex|opencode|gemini|kimi> --provider-session-id <id> --raw-store-ref <ref>
2574
+ `.trim();
2575
+ default:
2576
+ return `
2577
+ codingns provider-sessions 用法:
2578
+
2579
+ codingns provider-sessions delete --provider <claude-code|codex|opencode|gemini|kimi> --provider-session-id <id> --raw-store-ref <ref>
2580
+
2581
+ 环境变量:
2582
+
2583
+ CODINGNS_CLAUDE_CODE_HOME Claude Code 数据目录,默认 ~/.claude
2584
+ CODINGNS_CODEX_HOME Codex 数据目录,默认 ~/.codex
2585
+ CODINGNS_GEMINI_HOME Gemini 数据目录,默认 ~/.gemini
2586
+ CODINGNS_GEMINI_COMMAND Gemini CLI 路径,默认 gemini
2587
+ CODINGNS_KIMI_HOME Kimi 数据目录,默认 ~/.kimi
2588
+ CODINGNS_KIMI_DEFAULT_MODEL Kimi 默认模型,可选
2589
+ CODINGNS_OPENCODE_BASE_URL OpenCode server 地址,可选
2590
+ CODINGNS_OPENCODE_DATA_DIR OpenCode 数据目录,可选
2591
+ CODINGNS_OPENCODE_DB_PATH OpenCode sqlite 路径,可选
2592
+ `.trim();
2593
+ }
2594
+ }
2595
+
1737
2596
  function getSkillsHelpText(topic) {
1738
2597
  switch (topic) {
1739
2598
  case "skills.overview":
@@ -1806,6 +2665,23 @@ function buildAssistantHelpTopic(action, rest) {
1806
2665
  return `${action}.${rest[0]}`;
1807
2666
  }
1808
2667
 
2668
+ function resolveAssistantSessionStartTarget(values) {
2669
+ const projectId = readOptionalTrimmedValue(values.project);
2670
+ const workspaceId = readOptionalTrimmedValue(values.workspace);
2671
+ const sandboxId = readOptionalTrimmedValue(values.sandbox);
2672
+ const targets = [
2673
+ projectId ? { projectId } : null,
2674
+ workspaceId ? { workspaceId } : null,
2675
+ sandboxId ? { sandboxId } : null
2676
+ ].filter((item) => item !== null);
2677
+
2678
+ if (targets.length !== 1) {
2679
+ fail("sessions start 必须且只能提供 --project、--workspace、--sandbox 其中一个");
2680
+ }
2681
+
2682
+ return targets[0];
2683
+ }
2684
+
1809
2685
  function buildWorkspaceCloneAuth(values) {
1810
2686
  const authMode = readOptionalTrimmedValue(values["auth-mode"]);
1811
2687
 
@@ -1936,10 +2812,46 @@ function buildSkillsHelpTopic(action) {
1936
2812
  return `skills.${action}`;
1937
2813
  }
1938
2814
 
2815
+ function buildProviderSessionsHelpTopic(action) {
2816
+ if (!action || action === "--help" || action === "-h") {
2817
+ return "provider-sessions";
2818
+ }
2819
+
2820
+ return `provider-sessions.${action}`;
2821
+ }
2822
+
1939
2823
  function isHelpToken(value) {
1940
2824
  return value === "help" || value === "--help" || value === "-h";
1941
2825
  }
1942
2826
 
2827
+ function normalizeProviderSessionDeleteFailure(error) {
2828
+ const errorCode =
2829
+ error instanceof Error && typeof error.message === "string" && error.message.trim().length > 0
2830
+ ? error.message.trim()
2831
+ : "PROVIDER_DELETE_FAILED";
2832
+
2833
+ return {
2834
+ ok: false,
2835
+ errorCode,
2836
+ detail: describeProviderSessionDeleteFailure(errorCode)
2837
+ };
2838
+ }
2839
+
2840
+ function describeProviderSessionDeleteFailure(errorCode) {
2841
+ switch (errorCode) {
2842
+ case "PROVIDER_DELETE_NOT_SUPPORTED":
2843
+ return "当前 provider 还没有接入 CLI 删除能力";
2844
+ case "PROVIDER_SESSION_NOT_FOUND":
2845
+ return "provider 会话不存在或已经被删除";
2846
+ case "PROVIDER_SESSION_ID_REQUIRED":
2847
+ return "providerSessionId 不能为空";
2848
+ case "PROVIDER_NOT_SUPPORTED":
2849
+ return "当前 provider 不受支持";
2850
+ default:
2851
+ return errorCode;
2852
+ }
2853
+ }
2854
+
1943
2855
  function fail(message) {
1944
2856
  console.error(`[codingns] ${message}`);
1945
2857
  process.exit(1);