@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
@@ -1,5 +1,7 @@
1
1
  import { createId } from "../../shared/utils/id.js";
2
+ import { AppError } from "../../shared/errors/app-error.js";
2
3
  import { nowIso } from "../../shared/utils/time.js";
4
+ import { recordButlerProxyMessageOrigin } from "../sessions/session-message-origin-utils.js";
3
5
  const ASSISTANT_CAPABILITIES = [
4
6
  {
5
7
  name: "capabilities.list",
@@ -25,6 +27,18 @@ const ASSISTANT_CAPABILITIES = [
25
27
  enabled: true,
26
28
  summary: "列出指定项目下可操作的会话"
27
29
  },
30
+ {
31
+ name: "projects.sessions.start",
32
+ mode: "proxy_execute",
33
+ enabled: true,
34
+ summary: "按当前助手配置为项目新建真实会话"
35
+ },
36
+ {
37
+ name: "sessions.start",
38
+ mode: "proxy_execute",
39
+ enabled: true,
40
+ summary: "按 project/workspace/sandbox 目标新建真实会话;未指定目标时自动创建沙箱"
41
+ },
28
42
  {
29
43
  name: "sessions.get",
30
44
  mode: "read",
@@ -55,6 +69,138 @@ const ASSISTANT_CAPABILITIES = [
55
69
  enabled: true,
56
70
  summary: "从指定会话或消息点 fork 新会话"
57
71
  },
72
+ {
73
+ name: "sessions.delete",
74
+ mode: "proxy_execute",
75
+ enabled: true,
76
+ summary: "删除指定真实会话"
77
+ },
78
+ {
79
+ name: "automations.list",
80
+ mode: "read",
81
+ enabled: true,
82
+ summary: "列出当前助手自动化任务"
83
+ },
84
+ {
85
+ name: "automations.get",
86
+ mode: "read",
87
+ enabled: true,
88
+ summary: "读取单个助手自动化任务详情"
89
+ },
90
+ {
91
+ name: "automations.create",
92
+ mode: "proxy_execute",
93
+ enabled: true,
94
+ summary: "创建正式助手自动化任务"
95
+ },
96
+ {
97
+ name: "automations.cancel",
98
+ mode: "proxy_execute",
99
+ enabled: true,
100
+ summary: "取消助手自动化任务"
101
+ },
102
+ {
103
+ name: "automations.runs.list",
104
+ mode: "read",
105
+ enabled: true,
106
+ summary: "读取助手自动化执行记录"
107
+ },
108
+ {
109
+ name: "follow-ups.list",
110
+ mode: "read",
111
+ enabled: true,
112
+ summary: "列出当前助手可见的会话跟进任务"
113
+ },
114
+ {
115
+ name: "follow-ups.get",
116
+ mode: "read",
117
+ enabled: true,
118
+ summary: "读取单个会话跟进任务详情"
119
+ },
120
+ {
121
+ name: "follow-ups.create",
122
+ mode: "proxy_execute",
123
+ enabled: true,
124
+ summary: "创建新的会话跟进任务"
125
+ },
126
+ {
127
+ name: "follow-ups.continue",
128
+ mode: "proxy_execute",
129
+ enabled: true,
130
+ summary: "回写继续推进结论并安排下一轮跟进"
131
+ },
132
+ {
133
+ name: "follow-ups.waiting-user",
134
+ mode: "proxy_execute",
135
+ enabled: true,
136
+ summary: "回写需要等待用户决策的跟进结论"
137
+ },
138
+ {
139
+ name: "follow-ups.complete",
140
+ mode: "proxy_execute",
141
+ enabled: true,
142
+ summary: "回写跟进任务已完成"
143
+ },
144
+ {
145
+ name: "follow-ups.fail",
146
+ mode: "proxy_execute",
147
+ enabled: true,
148
+ summary: "回写跟进任务失败"
149
+ },
150
+ {
151
+ name: "sandboxes.list",
152
+ mode: "read",
153
+ enabled: true,
154
+ summary: "列出当前助手沙箱"
155
+ },
156
+ {
157
+ name: "sandboxes.create",
158
+ mode: "proxy_execute",
159
+ enabled: true,
160
+ summary: "创建新的助手沙箱"
161
+ },
162
+ {
163
+ name: "sandboxes.promote",
164
+ mode: "proxy_execute",
165
+ enabled: true,
166
+ summary: "保留或晋升助手沙箱"
167
+ },
168
+ {
169
+ name: "sandboxes.expire",
170
+ mode: "proxy_execute",
171
+ enabled: true,
172
+ summary: "标记助手沙箱过期"
173
+ },
174
+ {
175
+ name: "sandboxes.remove",
176
+ mode: "proxy_execute",
177
+ enabled: true,
178
+ summary: "清理助手沙箱"
179
+ },
180
+ {
181
+ name: "timers.list",
182
+ mode: "read",
183
+ enabled: true,
184
+ summary: "列出当前助手会话相关的计时器"
185
+ },
186
+ {
187
+ name: "timers.get",
188
+ mode: "read",
189
+ enabled: true,
190
+ summary: "读取单个助手计时器详情"
191
+ },
192
+ {
193
+ name: "timers.create",
194
+ mode: "proxy_execute",
195
+ enabled: true,
196
+ summary: "创建助手控制会话的定时继续任务"
197
+ },
198
+ {
199
+ name: "timers.cancel",
200
+ mode: "proxy_execute",
201
+ enabled: true,
202
+ summary: "取消助手控制会话计时器"
203
+ },
58
204
  {
59
205
  name: "terminals.list",
60
206
  mode: "read",
@@ -221,6 +367,10 @@ const ASSISTANT_CAPABILITIES = [
221
367
  export class AssistantCapabilityService {
222
368
  butlerProjectService;
223
369
  butlerSessionService;
370
+ butlerControlSessionService;
371
+ assistantAutomationService;
372
+ assistantSandboxService;
373
+ butlerControlTimerService;
224
374
  sessionHistoryService;
225
375
  sessionLiveRuntimeService;
226
376
  terminalService;
@@ -230,9 +380,15 @@ export class AssistantCapabilityService {
230
380
  worktreeSyncService;
231
381
  worktreeMergeService;
232
382
  worktreeCleanupService;
233
- constructor(butlerProjectService, butlerSessionService, sessionHistoryService, sessionLiveRuntimeService, terminalService, debugTargetService, workspaceService, worktreeManager, worktreeSyncService, worktreeMergeService, worktreeCleanupService) {
383
+ sessionMessageOriginRepository;
384
+ butlerFollowUpService;
385
+ constructor(butlerProjectService, butlerSessionService, butlerControlSessionService, assistantAutomationService, assistantSandboxService, butlerControlTimerService, sessionHistoryService, sessionLiveRuntimeService, terminalService, debugTargetService, workspaceService, worktreeManager, worktreeSyncService, worktreeMergeService, worktreeCleanupService, sessionMessageOriginRepository = null, butlerFollowUpService = null) {
234
386
  this.butlerProjectService = butlerProjectService;
235
387
  this.butlerSessionService = butlerSessionService;
388
+ this.butlerControlSessionService = butlerControlSessionService;
389
+ this.assistantAutomationService = assistantAutomationService;
390
+ this.assistantSandboxService = assistantSandboxService;
391
+ this.butlerControlTimerService = butlerControlTimerService;
236
392
  this.sessionHistoryService = sessionHistoryService;
237
393
  this.sessionLiveRuntimeService = sessionLiveRuntimeService;
238
394
  this.terminalService = terminalService;
@@ -242,6 +398,8 @@ export class AssistantCapabilityService {
242
398
  this.worktreeSyncService = worktreeSyncService;
243
399
  this.worktreeMergeService = worktreeMergeService;
244
400
  this.worktreeCleanupService = worktreeCleanupService;
401
+ this.sessionMessageOriginRepository = sessionMessageOriginRepository;
402
+ this.butlerFollowUpService = butlerFollowUpService;
245
403
  }
246
404
  listCapabilities() {
247
405
  return this.createReceipt("capabilities.list", {
@@ -289,6 +447,72 @@ export class AssistantCapabilityService {
289
447
  items
290
448
  });
291
449
  }
450
+ async startProjectSession(input) {
451
+ const config = this.resolveSessionLaunchConfig(input);
452
+ const session = await this.butlerSessionService.startSession(input.projectId, {
453
+ role: "adhoc",
454
+ ownershipMode: "managed",
455
+ content: input.content.trim(),
456
+ providerId: config.providerId,
457
+ model: config.model,
458
+ reasoningLevel: config.reasoningLevel,
459
+ permissionMode: config.permissionMode
460
+ }, input.userId);
461
+ return this.createReceipt("projects.sessions.start", {
462
+ kind: "project",
463
+ id: input.projectId
464
+ }, {
465
+ session
466
+ });
467
+ }
468
+ async startSession(input) {
469
+ const config = this.resolveSessionLaunchConfig(input);
470
+ const currentControlSession = this.butlerControlSessionService.getCurrentSession(input.userId);
471
+ const target = input.target
472
+ ? this.resolveAssistantSessionTarget(input.target, input.userId)
473
+ : await this.createAutomaticSandboxTarget(input, currentControlSession);
474
+ if (target.kind === "project") {
475
+ const session = await this.butlerSessionService.startSession(target.id, {
476
+ role: "adhoc",
477
+ ownershipMode: "managed",
478
+ content: input.content.trim(),
479
+ providerId: config.providerId,
480
+ model: config.model,
481
+ reasoningLevel: config.reasoningLevel,
482
+ permissionMode: config.permissionMode
483
+ }, input.userId);
484
+ return this.createReceipt("sessions.start", {
485
+ kind: "project",
486
+ id: target.id
487
+ }, {
488
+ session,
489
+ target
490
+ });
491
+ }
492
+ const session = await this.sessionLiveRuntimeService.startLiveSession({
493
+ workspaceId: target.workspaceId,
494
+ userId: input.userId,
495
+ provider: config.providerId,
496
+ content: input.content.trim(),
497
+ clientRequestId: null,
498
+ runtimeOptions: {
499
+ model: config.model,
500
+ reasoningLevel: config.reasoningLevel,
501
+ permissionMode: config.permissionMode,
502
+ attachments: []
503
+ }
504
+ });
505
+ if (target.kind === "sandbox") {
506
+ this.assistantSandboxService.markSandboxUsedByControlSession(target.id, input.userId, currentControlSession?.id ?? null);
507
+ }
508
+ return this.createReceipt("sessions.start", {
509
+ kind: target.kind,
510
+ id: target.id
511
+ }, {
512
+ session,
513
+ target
514
+ });
515
+ }
292
516
  getSession(sessionId, userId) {
293
517
  const session = this.sessionHistoryService.getSession(sessionId, userId);
294
518
  return this.createReceipt("sessions.get", {
@@ -317,11 +541,19 @@ export class AssistantCapabilityService {
317
541
  });
318
542
  }
319
543
  async sendSessionMessage(input) {
544
+ const requestedAt = nowIso();
545
+ const clientRequestId = recordButlerProxyMessageOrigin(this.sessionMessageOriginRepository, {
546
+ sessionId: input.sessionId,
547
+ clientRequestId: input.clientRequestId?.trim() || null,
548
+ content: input.content,
549
+ createdAt: requestedAt,
550
+ fallbackKey: `assistant-send:${input.sessionId}:${requestedAt}`
551
+ });
320
552
  const result = await this.sessionLiveRuntimeService.sendLiveMessage({
321
553
  sessionId: input.sessionId,
322
554
  userId: input.userId,
323
555
  content: input.content,
324
- clientRequestId: input.clientRequestId?.trim() || null,
556
+ clientRequestId,
325
557
  runtimeOptions: {
326
558
  model: input.model?.trim() || null,
327
559
  reasoningLevel: input.reasoningLevel?.trim() || null,
@@ -329,6 +561,14 @@ export class AssistantCapabilityService {
329
561
  attachments: []
330
562
  }
331
563
  });
564
+ recordButlerProxyMessageOrigin(this.sessionMessageOriginRepository, {
565
+ sessionId: input.sessionId,
566
+ clientRequestId,
567
+ messageId: result.message?.messageId ?? null,
568
+ content: input.content,
569
+ createdAt: result.acceptedAt,
570
+ fallbackKey: `assistant-send:${input.sessionId}:${result.acceptedAt}`
571
+ });
332
572
  return this.createReceipt("sessions.message.send", {
333
573
  kind: "session",
334
574
  id: input.sessionId
@@ -352,6 +592,341 @@ export class AssistantCapabilityService {
352
592
  session
353
593
  });
354
594
  }
595
+ async deleteSession(sessionId, userId) {
596
+ await this.sessionHistoryService.deleteSession(sessionId, userId);
597
+ return this.createReceipt("sessions.delete", {
598
+ kind: "session",
599
+ id: sessionId
600
+ }, {
601
+ sessionId,
602
+ deleted: true
603
+ });
604
+ }
605
+ listTimers(input) {
606
+ const items = this.butlerControlTimerService.listTimers({
607
+ userId: input.userId,
608
+ statuses: input.status ? [input.status] : undefined,
609
+ controlSessionId: input.controlSessionId ?? null,
610
+ limit: input.limit ?? undefined
611
+ });
612
+ return this.createReceipt("timers.list", {
613
+ kind: "none",
614
+ id: null
615
+ }, {
616
+ items
617
+ });
618
+ }
619
+ listAutomations(input) {
620
+ const items = this.assistantAutomationService.listTasks({
621
+ userId: input.userId,
622
+ statuses: input.status ? [input.status] : undefined,
623
+ controlSessionId: input.controlSessionId ?? null
624
+ });
625
+ return this.createReceipt("automations.list", {
626
+ kind: "none",
627
+ id: null
628
+ }, {
629
+ items
630
+ });
631
+ }
632
+ getAutomation(automationId, userId) {
633
+ const automation = this.assistantAutomationService.getTask(automationId, userId);
634
+ return this.createReceipt("automations.get", {
635
+ kind: "automation",
636
+ id: automationId
637
+ }, {
638
+ automation
639
+ });
640
+ }
641
+ createAutomation(input) {
642
+ const triggerType = input.triggerType ?? "once";
643
+ const automation = this.assistantAutomationService.createTask({
644
+ userId: input.userId,
645
+ controlSessionId: input.controlSessionId,
646
+ projectId: input.projectId,
647
+ title: input.title,
648
+ trigger: buildAssistantAutomationTriggerInput(triggerType, input),
649
+ action: {
650
+ type: "send_control_message",
651
+ content: input.content,
652
+ includeTriggerContext: input.includeTriggerContext ?? triggerType === "condition",
653
+ targetSessionId: input.targetSessionId ?? null
654
+ }
655
+ });
656
+ return this.createReceipt("automations.create", {
657
+ kind: "automation",
658
+ id: automation.id
659
+ }, {
660
+ automation
661
+ });
662
+ }
663
+ updateAutomation(input) {
664
+ const automation = this.assistantAutomationService.updateTask({
665
+ taskId: input.automationId,
666
+ userId: input.userId,
667
+ title: input.title,
668
+ content: input.content,
669
+ includeTriggerContext: input.includeTriggerContext,
670
+ dueAt: input.dueAt,
671
+ everySeconds: input.everySeconds,
672
+ everyMinutes: input.everyMinutes,
673
+ everyHours: input.everyHours,
674
+ stopAt: input.stopAt,
675
+ cronMinute: input.cronMinute,
676
+ cronHour: input.cronHour,
677
+ cronDaysOfWeek: input.cronDaysOfWeek,
678
+ pollIntervalSeconds: input.pollIntervalSeconds,
679
+ expiresAt: input.expiresAt,
680
+ maxChecks: input.maxChecks
681
+ });
682
+ return this.createReceipt("automations.update", {
683
+ kind: "automation",
684
+ id: input.automationId
685
+ }, {
686
+ automation
687
+ });
688
+ }
689
+ cancelAutomation(automationId, userId) {
690
+ const automation = this.assistantAutomationService.cancelTask(automationId, userId);
691
+ return this.createReceipt("automations.cancel", {
692
+ kind: "automation",
693
+ id: automationId
694
+ }, {
695
+ automation
696
+ });
697
+ }
698
+ skipAutomationWait(automationId, userId) {
699
+ const automation = this.assistantAutomationService.skipCurrentWait(automationId, userId);
700
+ return this.createReceipt("automations.wait.skip", {
701
+ kind: "automation",
702
+ id: automationId
703
+ }, {
704
+ automation
705
+ });
706
+ }
707
+ listAutomationRuns(automationId, userId) {
708
+ const items = this.assistantAutomationService.listRuns(automationId, userId);
709
+ return this.createReceipt("automations.runs.list", {
710
+ kind: "automation",
711
+ id: automationId
712
+ }, {
713
+ items
714
+ });
715
+ }
716
+ listRecentAutomationRuns(input) {
717
+ const items = this.assistantAutomationService.listRecentRuns({
718
+ userId: input.userId,
719
+ controlSessionId: input.controlSessionId ?? null,
720
+ limit: input.limit ?? undefined
721
+ });
722
+ return this.createReceipt("automations.runs.recent", {
723
+ kind: "none",
724
+ id: null
725
+ }, {
726
+ items
727
+ });
728
+ }
729
+ listFollowUps(input) {
730
+ const service = this.requireFollowUpService();
731
+ const items = service.listTasks({
732
+ statuses: input.status ? [input.status] : undefined,
733
+ projectId: input.projectId ?? undefined,
734
+ sessionId: input.sessionId ?? undefined,
735
+ limit: input.limit ?? undefined
736
+ });
737
+ return this.createReceipt("follow-ups.list", {
738
+ kind: "none",
739
+ id: null
740
+ }, {
741
+ items
742
+ });
743
+ }
744
+ getFollowUp(taskId) {
745
+ const service = this.requireFollowUpService();
746
+ const task = service.getTask(taskId);
747
+ return this.createReceipt("follow-ups.get", {
748
+ kind: "follow_up",
749
+ id: taskId
750
+ }, {
751
+ task
752
+ });
753
+ }
754
+ async createFollowUp(input) {
755
+ const service = this.requireFollowUpService();
756
+ const providerId = input.providerId ?? this.butlerControlSessionService.getCurrentSession(input.userId)?.providerId;
757
+ if (!providerId) {
758
+ throw new AppError({
759
+ statusCode: 409,
760
+ errorCode: "ASSISTANT_CONTROL_SESSION_NOT_FOUND",
761
+ detail: "当前没有可用的助手控制会话,无法继承默认 provider"
762
+ });
763
+ }
764
+ const task = await service.createTask({
765
+ projectId: input.projectId,
766
+ butlerSessionId: input.butlerSessionId,
767
+ providerId,
768
+ objective: input.objective,
769
+ completionCriteria: input.completionCriteria ?? undefined,
770
+ maxAutoContinueCount: input.maxAutoContinueCount ?? undefined,
771
+ checkIntervalSeconds: input.checkIntervalSeconds ?? undefined
772
+ }, input.userId);
773
+ return this.createReceipt("follow-ups.create", {
774
+ kind: "follow_up",
775
+ id: task.id
776
+ }, {
777
+ task
778
+ });
779
+ }
780
+ async continueFollowUp(input) {
781
+ const service = this.requireFollowUpService();
782
+ const task = await service.continueTask(input.taskId, {
783
+ summary: input.summary,
784
+ continuePrompt: input.continuePrompt
785
+ }, input.userId);
786
+ return this.createReceipt("follow-ups.continue", {
787
+ kind: "follow_up",
788
+ id: input.taskId
789
+ }, {
790
+ task
791
+ });
792
+ }
793
+ async markFollowUpWaitingUser(input) {
794
+ const service = this.requireFollowUpService();
795
+ const task = await service.markTaskWaitingUser(input.taskId, {
796
+ summary: input.summary,
797
+ waitingReason: input.waitingReason
798
+ }, input.userId);
799
+ return this.createReceipt("follow-ups.waiting-user", {
800
+ kind: "follow_up",
801
+ id: input.taskId
802
+ }, {
803
+ task
804
+ });
805
+ }
806
+ async completeFollowUp(input) {
807
+ const service = this.requireFollowUpService();
808
+ const task = await service.completeTask(input.taskId, {
809
+ summary: input.summary
810
+ }, input.userId);
811
+ return this.createReceipt("follow-ups.complete", {
812
+ kind: "follow_up",
813
+ id: input.taskId
814
+ }, {
815
+ task
816
+ });
817
+ }
818
+ async failFollowUp(input) {
819
+ const service = this.requireFollowUpService();
820
+ const task = await service.failTask(input.taskId, {
821
+ summary: input.summary,
822
+ reason: input.reason ?? null
823
+ }, input.userId);
824
+ return this.createReceipt("follow-ups.fail", {
825
+ kind: "follow_up",
826
+ id: input.taskId
827
+ }, {
828
+ task
829
+ });
830
+ }
831
+ listSandboxes(input) {
832
+ const items = this.assistantSandboxService.listSandboxes({
833
+ userId: input.userId,
834
+ controlSessionId: input.controlSessionId ?? null,
835
+ statuses: input.status ? [input.status] : undefined
836
+ });
837
+ return this.createReceipt("sandboxes.list", {
838
+ kind: "none",
839
+ id: null
840
+ }, {
841
+ items
842
+ });
843
+ }
844
+ async createSandbox(input) {
845
+ const currentControlSession = this.butlerControlSessionService.getCurrentSession(input.userId);
846
+ const sandbox = await this.assistantSandboxService.createSandbox({
847
+ userId: input.userId,
848
+ controlSessionId: currentControlSession?.id ?? null,
849
+ title: input.title,
850
+ description: input.description,
851
+ purpose: input.purpose,
852
+ expiresAt: input.expiresAt,
853
+ source: input.sourceKind === "clone"
854
+ ? {
855
+ kind: "clone",
856
+ repositoryUrl: requireAssistantRepositoryUrl(input.repositoryUrl),
857
+ directoryName: input.directoryName,
858
+ auth: input.auth
859
+ }
860
+ : {
861
+ kind: "blank",
862
+ directoryName: input.directoryName
863
+ }
864
+ });
865
+ return this.createReceipt("sandboxes.create", {
866
+ kind: "sandbox",
867
+ id: sandbox.id
868
+ }, {
869
+ sandbox
870
+ });
871
+ }
872
+ promoteSandbox(input) {
873
+ const sandbox = this.assistantSandboxService.promoteSandbox(input.sandboxId, input.userId, {
874
+ mode: input.mode,
875
+ projectName: input.projectName,
876
+ defaultProvider: input.defaultProvider
877
+ });
878
+ return this.createReceipt("sandboxes.promote", {
879
+ kind: "sandbox",
880
+ id: input.sandboxId
881
+ }, {
882
+ sandbox
883
+ });
884
+ }
885
+ expireSandbox(sandboxId, userId) {
886
+ const sandbox = this.assistantSandboxService.expireSandbox(sandboxId, userId);
887
+ return this.createReceipt("sandboxes.expire", {
888
+ kind: "sandbox",
889
+ id: sandboxId
890
+ }, {
891
+ sandbox
892
+ });
893
+ }
894
+ removeSandbox(sandboxId, userId) {
895
+ const sandbox = this.assistantSandboxService.removeSandbox(sandboxId, userId);
896
+ return this.createReceipt("sandboxes.remove", {
897
+ kind: "sandbox",
898
+ id: sandboxId
899
+ }, {
900
+ sandbox
901
+ });
902
+ }
903
+ getTimer(timerId, userId) {
904
+ const timer = this.butlerControlTimerService.getTimer(timerId, userId);
905
+ return this.createReceipt("timers.get", {
906
+ kind: "timer",
907
+ id: timerId
908
+ }, {
909
+ timer
910
+ });
911
+ }
912
+ createTimer(input) {
913
+ const timer = this.butlerControlTimerService.createTimer(input);
914
+ return this.createReceipt("timers.create", {
915
+ kind: "timer",
916
+ id: timer.id
917
+ }, {
918
+ timer
919
+ });
920
+ }
921
+ cancelTimer(timerId, userId) {
922
+ const timer = this.butlerControlTimerService.cancelTimer(timerId, userId);
923
+ return this.createReceipt("timers.cancel", {
924
+ kind: "timer",
925
+ id: timerId
926
+ }, {
927
+ timer
928
+ });
929
+ }
355
930
  async listTerminals(input) {
356
931
  const workspaceId = input.projectId?.trim()
357
932
  ? this.butlerProjectService.getById(input.projectId).workspaceId
@@ -430,7 +1005,7 @@ export class AssistantCapabilityService {
430
1005
  });
431
1006
  }
432
1007
  async createDebugLaunchPlan(input) {
433
- const plan = await this.debugTargetService.createLaunchPlan(input.targetId, input.portRequests);
1008
+ const plan = await this.debugTargetService.createLaunchPlan(input.targetId, input.portRequests, input.userId);
434
1009
  return this.createReceipt("debug-targets.launch-plan.create", {
435
1010
  kind: "debug_target",
436
1011
  id: input.targetId
@@ -630,5 +1205,164 @@ export class AssistantCapabilityService {
630
1205
  payload
631
1206
  };
632
1207
  }
1208
+ requireFollowUpService() {
1209
+ if (this.butlerFollowUpService) {
1210
+ return this.butlerFollowUpService;
1211
+ }
1212
+ throw new AppError({
1213
+ statusCode: 503,
1214
+ errorCode: "ASSISTANT_FOLLOW_UP_CAPABILITY_UNAVAILABLE",
1215
+ detail: "当前实例没有启用会话跟进能力"
1216
+ });
1217
+ }
1218
+ resolveSessionLaunchConfig(input) {
1219
+ const controlSession = this.butlerControlSessionService.getCurrentSession(input.userId);
1220
+ const providerId = input.providerId?.trim()
1221
+ ?? controlSession?.providerId
1222
+ ?? undefined;
1223
+ if (!providerId) {
1224
+ throw new AppError({
1225
+ statusCode: 409,
1226
+ errorCode: "ASSISTANT_CONTROL_SESSION_NOT_FOUND",
1227
+ detail: "当前没有可用的助手控制会话,无法继承默认 provider"
1228
+ });
1229
+ }
1230
+ return {
1231
+ providerId,
1232
+ model: normalizeAssistantText(input.model) ?? controlSession?.model ?? null,
1233
+ reasoningLevel: normalizeAssistantText(input.reasoningLevel) ?? controlSession?.reasoningLevel ?? null,
1234
+ permissionMode: normalizeAssistantText(input.permissionMode) ?? controlSession?.permissionMode ?? null
1235
+ };
1236
+ }
1237
+ resolveAssistantSessionTarget(target, userId) {
1238
+ if (target.kind === "project") {
1239
+ const project = this.butlerProjectService.getById(target.projectId);
1240
+ return {
1241
+ kind: "project",
1242
+ id: project.id,
1243
+ workspaceId: project.workspaceId
1244
+ };
1245
+ }
1246
+ if (target.kind === "workspace") {
1247
+ return {
1248
+ kind: "workspace",
1249
+ id: target.workspaceId,
1250
+ workspaceId: target.workspaceId
1251
+ };
1252
+ }
1253
+ return {
1254
+ kind: "sandbox",
1255
+ id: target.sandboxId,
1256
+ workspaceId: this.assistantSandboxService.resolveWorkspaceId(target.sandboxId, userId)
1257
+ };
1258
+ }
1259
+ async createAutomaticSandboxTarget(input, controlSession) {
1260
+ const sandbox = await this.assistantSandboxService.createSandbox({
1261
+ userId: input.userId,
1262
+ controlSessionId: controlSession?.id ?? null,
1263
+ title: inferAutomaticSandboxTitle(controlSession, input.content),
1264
+ purpose: "当前任务未指定工作区,系统自动创建",
1265
+ source: {
1266
+ kind: "blank"
1267
+ }
1268
+ });
1269
+ return {
1270
+ kind: "sandbox",
1271
+ id: sandbox.id,
1272
+ workspaceId: sandbox.workspaceId
1273
+ };
1274
+ }
1275
+ }
1276
+ function normalizeAssistantText(value) {
1277
+ const normalized = value?.trim();
1278
+ return normalized ? normalized : null;
1279
+ }
1280
+ function inferAutomaticSandboxTitle(controlSession, content) {
1281
+ return normalizeAssistantText(controlSession?.title)
1282
+ ?? normalizeAssistantText(controlSession?.lastSummary)
1283
+ ?? summarizeAssistantText(content)
1284
+ ?? "助手临时沙箱";
1285
+ }
1286
+ function summarizeAssistantText(content) {
1287
+ const normalized = normalizeAssistantText(content);
1288
+ if (!normalized) {
1289
+ return null;
1290
+ }
1291
+ return normalized.length > 48 ? `${normalized.slice(0, 45)}...` : normalized;
1292
+ }
1293
+ function buildAssistantAutomationTriggerInput(triggerType, input) {
1294
+ switch (triggerType) {
1295
+ case "once":
1296
+ return {
1297
+ type: "once",
1298
+ dueAt: input.dueAt ?? null,
1299
+ afterSeconds: input.afterSeconds ?? null
1300
+ };
1301
+ case "interval":
1302
+ return {
1303
+ type: "interval",
1304
+ seconds: input.everySeconds ?? null,
1305
+ minutes: input.everyMinutes ?? null,
1306
+ hours: input.everyHours ?? null,
1307
+ stopAt: input.stopAt ?? null
1308
+ };
1309
+ case "cron":
1310
+ return {
1311
+ type: "cron",
1312
+ minute: input.cronMinute ?? null,
1313
+ hour: input.cronHour ?? null,
1314
+ daysOfWeek: input.cronDaysOfWeek ?? null,
1315
+ stopAt: input.stopAt ?? null
1316
+ };
1317
+ case "condition": {
1318
+ const conditionKind = input.conditionKind;
1319
+ if (conditionKind === "git.remote_tag_changed") {
1320
+ return {
1321
+ type: "condition",
1322
+ conditionKind,
1323
+ repositoryUrl: input.repositoryUrl ?? null,
1324
+ pollIntervalSeconds: input.pollIntervalSeconds ?? null,
1325
+ expiresAt: input.expiresAt ?? null,
1326
+ maxChecks: input.maxChecks ?? null
1327
+ };
1328
+ }
1329
+ return {
1330
+ type: "condition",
1331
+ conditionKind: requireAssistantConditionKind(conditionKind),
1332
+ sessionId: input.conditionSessionId ?? null,
1333
+ pollIntervalSeconds: input.pollIntervalSeconds ?? null,
1334
+ expiresAt: input.expiresAt ?? null,
1335
+ maxChecks: input.maxChecks ?? null
1336
+ };
1337
+ }
1338
+ default:
1339
+ return assertNeverAssistantAutomationTriggerType(triggerType);
1340
+ }
1341
+ }
1342
+ function requireAssistantRepositoryUrl(value) {
1343
+ const normalized = normalizeAssistantText(value);
1344
+ if (!normalized) {
1345
+ throw new AppError({
1346
+ statusCode: 400,
1347
+ errorCode: "INVALID_INPUT",
1348
+ detail: "clone 沙箱必须提供 repositoryUrl",
1349
+ field: "repositoryUrl"
1350
+ });
1351
+ }
1352
+ return normalized;
1353
+ }
1354
+ function requireAssistantConditionKind(value) {
1355
+ if (value === "git.remote_tag_changed" || value === "session.runtime_idle") {
1356
+ return value;
1357
+ }
1358
+ throw new AppError({
1359
+ statusCode: 400,
1360
+ errorCode: "INVALID_INPUT",
1361
+ detail: "condition 自动化必须提供 conditionKind",
1362
+ field: "conditionKind"
1363
+ });
1364
+ }
1365
+ function assertNeverAssistantAutomationTriggerType(value) {
1366
+ throw new Error(`Unexpected assistant automation triggerType: ${String(value)}`);
633
1367
  }
634
1368
  //# sourceMappingURL=assistant-capability-service.js.map