@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
@@ -8,7 +8,10 @@ export function createDatabaseClient(databasePath) {
8
8
  const db = new Database(databasePath);
9
9
  const schemaPath = new URL("./schema.sql", import.meta.url);
10
10
  const schema = fs.readFileSync(schemaPath, "utf8");
11
+ ensurePreSchemaCompatibility(db);
11
12
  db.exec(schema);
13
+ ensureAuthTokenDeviceColumns(db);
14
+ ensureAuthDeviceSchema(db);
12
15
  ensureAuthLoginAttemptSchema(db);
13
16
  ensureWorkspaceRemovalColumn(db);
14
17
  ensureWorkspaceSortOrderColumn(db);
@@ -32,20 +35,117 @@ export function createDatabaseClient(databasePath) {
32
35
  ensurePortLeaseSchema(db);
33
36
  ensureRuntimeBindingSchema(db);
34
37
  ensureAiFallbackEditSchema(db);
38
+ ensureInstanceTailscaleConfigSchema(db);
35
39
  ensureInstanceTailscaleStatusSchema(db);
40
+ ensureInstanceRelayTunnelConfigSchema(db);
36
41
  ensureTerminalCommandTemplateDebugSchema(db);
37
42
  ensureTerminalInstanceDebugSchema(db);
38
43
  ensureUserPreferenceProfileSchema(db);
39
44
  ensureButlerProfileSchema(db);
40
45
  ensureButlerControlSessionSchema(db);
46
+ ensureButlerControlTimerSchema(db);
47
+ ensureAssistantAutomationSchema(db);
48
+ ensureAssistantSandboxSchema(db);
41
49
  ensureButlerInboxSchema(db);
42
50
  ensureButlerFollowUpTaskSchema(db);
51
+ ensureVerificationRunSchema(db);
43
52
  ensureButlerSessionSummarySchema(db);
44
53
  return {
45
54
  db,
46
55
  close: () => db.close()
47
56
  };
48
57
  }
58
+ function ensurePreSchemaCompatibility(db) {
59
+ // 旧库还没有这些列时,schema.sql 里的索引会先炸掉,所以必须先补齐。
60
+ ensureAuthTokenDeviceColumns(db);
61
+ ensureManagedSkillScopeSchema(db);
62
+ }
63
+ function ensureAuthTokenDeviceColumns(db) {
64
+ if (!tableExists(db, "auth_tokens")) {
65
+ return;
66
+ }
67
+ const columns = db
68
+ .prepare("PRAGMA table_info(auth_tokens)")
69
+ .all();
70
+ const columnNames = new Set(columns.map((column) => column.name));
71
+ if (!columnNames.has("device_session_id")) {
72
+ db.exec("ALTER TABLE auth_tokens ADD COLUMN device_session_id TEXT");
73
+ }
74
+ if (!columnNames.has("caller_kind")) {
75
+ db.exec("ALTER TABLE auth_tokens ADD COLUMN caller_kind TEXT CHECK (caller_kind IN ('interactive_user', 'assistant_runtime'))");
76
+ }
77
+ db.exec("CREATE INDEX IF NOT EXISTS idx_auth_tokens_device_session_id ON auth_tokens(device_session_id)");
78
+ }
79
+ function tableExists(db, tableName) {
80
+ const row = db
81
+ .prepare(`SELECT name
82
+ FROM sqlite_master
83
+ WHERE type = 'table' AND name = ?`)
84
+ .get(tableName);
85
+ return row?.name === tableName;
86
+ }
87
+ function ensureAuthDeviceSchema(db) {
88
+ db.exec(`
89
+ CREATE TABLE IF NOT EXISTS auth_devices (
90
+ id TEXT PRIMARY KEY,
91
+ user_id TEXT NOT NULL,
92
+ client_type TEXT NOT NULL CHECK (client_type IN ('desktop', 'web', 'ios', 'android', 'unknown')),
93
+ client_instance_id TEXT,
94
+ display_name TEXT,
95
+ user_agent TEXT,
96
+ is_primary INTEGER NOT NULL DEFAULT 0 CHECK (is_primary IN (0, 1)),
97
+ last_source_address TEXT,
98
+ last_seen_at TEXT NOT NULL,
99
+ primary_set_at TEXT,
100
+ created_at TEXT NOT NULL,
101
+ updated_at TEXT NOT NULL,
102
+ FOREIGN KEY (user_id) REFERENCES auth_users(id)
103
+ );
104
+
105
+ CREATE INDEX IF NOT EXISTS idx_auth_devices_user_id
106
+ ON auth_devices(user_id, updated_at DESC);
107
+ CREATE INDEX IF NOT EXISTS idx_auth_devices_client_lookup
108
+ ON auth_devices(user_id, client_type, client_instance_id);
109
+
110
+ CREATE TABLE IF NOT EXISTS auth_device_sessions (
111
+ id TEXT PRIMARY KEY,
112
+ user_id TEXT NOT NULL,
113
+ device_id TEXT,
114
+ access_token_id TEXT,
115
+ refresh_token_id TEXT,
116
+ revoked_at TEXT,
117
+ created_at TEXT NOT NULL,
118
+ updated_at TEXT NOT NULL,
119
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
120
+ FOREIGN KEY (device_id) REFERENCES auth_devices(id)
121
+ );
122
+
123
+ CREATE INDEX IF NOT EXISTS idx_auth_device_sessions_user_id
124
+ ON auth_device_sessions(user_id, updated_at DESC);
125
+ CREATE INDEX IF NOT EXISTS idx_auth_device_sessions_device_id
126
+ ON auth_device_sessions(device_id, updated_at DESC);
127
+
128
+ CREATE TABLE IF NOT EXISTS auth_login_events (
129
+ id TEXT PRIMARY KEY,
130
+ user_id TEXT NOT NULL,
131
+ device_id TEXT,
132
+ client_type TEXT NOT NULL CHECK (client_type IN ('desktop', 'web', 'ios', 'android', 'unknown')),
133
+ source_address TEXT,
134
+ occurred_at TEXT NOT NULL,
135
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
136
+ FOREIGN KEY (device_id) REFERENCES auth_devices(id)
137
+ );
138
+
139
+ CREATE INDEX IF NOT EXISTS idx_auth_login_events_user_id
140
+ ON auth_login_events(user_id, occurred_at DESC);
141
+ `);
142
+ const authDeviceColumns = db
143
+ .prepare("PRAGMA table_info(auth_devices)")
144
+ .all();
145
+ if (!authDeviceColumns.some((column) => column.name === "user_agent")) {
146
+ db.exec("ALTER TABLE auth_devices ADD COLUMN user_agent TEXT");
147
+ }
148
+ }
49
149
  function ensureAuthLoginAttemptSchema(db) {
50
150
  const columns = db
51
151
  .prepare("PRAGMA table_info(auth_login_attempts)")
@@ -197,10 +297,99 @@ function ensureUserPreferenceProfileSchema(db) {
197
297
  const columns = db
198
298
  .prepare("PRAGMA table_info(user_preference_profiles)")
199
299
  .all();
200
- if (columns.length === 0 || columns.some((column) => column.name === "auto_theme")) {
300
+ if (columns.length === 0) {
201
301
  return;
202
302
  }
203
- db.exec("ALTER TABLE user_preference_profiles ADD COLUMN auto_theme INTEGER NOT NULL DEFAULT 0 CHECK (auto_theme IN (0, 1))");
303
+ const columnNames = new Set(columns.map((column) => column.name));
304
+ if (!columnNames.has("auto_theme")) {
305
+ db.exec("ALTER TABLE user_preference_profiles ADD COLUMN auto_theme INTEGER NOT NULL DEFAULT 0 CHECK (auto_theme IN (0, 1))");
306
+ }
307
+ if (!columnNames.has("debug_port_pools_json")) {
308
+ db.exec(`ALTER TABLE user_preference_profiles
309
+ ADD COLUMN debug_port_pools_json TEXT NOT NULL DEFAULT '{"start":43000,"end":47999}'`);
310
+ }
311
+ }
312
+ function ensureManagedSkillScopeSchema(db) {
313
+ if (!tableExists(db, "managed_skills")) {
314
+ return;
315
+ }
316
+ const columns = db
317
+ .prepare("PRAGMA table_info(managed_skills)")
318
+ .all();
319
+ const columnNames = new Set(columns.map((column) => column.name));
320
+ const tableSqlRow = db
321
+ .prepare(`SELECT sql
322
+ FROM sqlite_master
323
+ WHERE type = 'table'
324
+ AND name = 'managed_skills'`)
325
+ .get();
326
+ const tableSql = tableSqlRow?.sql ?? "";
327
+ const needsRebuild = !columnNames.has("scope")
328
+ || tableSql.includes("directory_name TEXT NOT NULL UNIQUE")
329
+ || !tableSql.includes("UNIQUE(scope, directory_name)");
330
+ if (!needsRebuild) {
331
+ return;
332
+ }
333
+ db.exec("DROP INDEX IF EXISTS idx_managed_skills_state");
334
+ db.exec("PRAGMA foreign_keys = OFF");
335
+ try {
336
+ db.exec("BEGIN");
337
+ db.exec(`
338
+ CREATE TABLE managed_skills__next (
339
+ id TEXT PRIMARY KEY,
340
+ name TEXT NOT NULL,
341
+ scope TEXT NOT NULL CHECK (scope IN ('workspace', 'assistant')),
342
+ directory_name TEXT NOT NULL,
343
+ source_type TEXT NOT NULL CHECK (source_type IN ('builtin', 'local-import', 'managed-copy')),
344
+ source_path TEXT,
345
+ content_hash TEXT NOT NULL,
346
+ managed_state TEXT NOT NULL CHECK (managed_state IN ('active', 'conflicted', 'missing')),
347
+ created_at TEXT NOT NULL,
348
+ updated_at TEXT NOT NULL,
349
+ UNIQUE(scope, directory_name)
350
+ );
351
+ `);
352
+ db.exec(`
353
+ INSERT INTO managed_skills__next (
354
+ id,
355
+ name,
356
+ scope,
357
+ directory_name,
358
+ source_type,
359
+ source_path,
360
+ content_hash,
361
+ managed_state,
362
+ created_at,
363
+ updated_at
364
+ )
365
+ SELECT
366
+ id,
367
+ name,
368
+ 'workspace',
369
+ directory_name,
370
+ source_type,
371
+ source_path,
372
+ content_hash,
373
+ managed_state,
374
+ created_at,
375
+ updated_at
376
+ FROM managed_skills;
377
+ `);
378
+ db.exec("DROP TABLE managed_skills");
379
+ db.exec("ALTER TABLE managed_skills__next RENAME TO managed_skills");
380
+ db.exec("COMMIT");
381
+ }
382
+ catch (error) {
383
+ db.exec("ROLLBACK");
384
+ throw error;
385
+ }
386
+ finally {
387
+ db.exec("PRAGMA foreign_keys = ON");
388
+ }
389
+ db.exec(`
390
+ CREATE INDEX IF NOT EXISTS idx_managed_skills_state
391
+ ON managed_skills(scope, managed_state, updated_at DESC);
392
+ `);
204
393
  }
205
394
  function ensureButlerControlSessionSchema(db) {
206
395
  const columns = db
@@ -219,6 +408,306 @@ function ensureButlerControlSessionSchema(db) {
219
408
  if (!columnNames.has("source_item_id")) {
220
409
  db.exec("ALTER TABLE butler_control_sessions ADD COLUMN source_item_id TEXT");
221
410
  }
411
+ if (!columnNames.has("model")) {
412
+ db.exec("ALTER TABLE butler_control_sessions ADD COLUMN model TEXT");
413
+ }
414
+ if (!columnNames.has("reasoning_level")) {
415
+ db.exec("ALTER TABLE butler_control_sessions ADD COLUMN reasoning_level TEXT");
416
+ }
417
+ if (!columnNames.has("permission_mode")) {
418
+ db.exec("ALTER TABLE butler_control_sessions ADD COLUMN permission_mode TEXT");
419
+ }
420
+ }
421
+ function ensureButlerControlTimerSchema(db) {
422
+ const columns = db
423
+ .prepare("PRAGMA table_info(butler_control_timers)")
424
+ .all();
425
+ if (columns.length > 0) {
426
+ return;
427
+ }
428
+ db.exec(`
429
+ CREATE TABLE IF NOT EXISTS butler_control_timers (
430
+ id TEXT PRIMARY KEY,
431
+ control_session_id TEXT NOT NULL,
432
+ session_id TEXT NOT NULL,
433
+ user_id TEXT NOT NULL,
434
+ project_id TEXT,
435
+ target_session_id TEXT,
436
+ title TEXT,
437
+ content TEXT NOT NULL,
438
+ due_at TEXT NOT NULL,
439
+ status TEXT NOT NULL CHECK (status IN ('active', 'completed', 'cancelled', 'failed')),
440
+ triggered_at TEXT,
441
+ last_error TEXT,
442
+ created_at TEXT NOT NULL,
443
+ updated_at TEXT NOT NULL,
444
+ cancelled_at TEXT,
445
+ FOREIGN KEY (control_session_id) REFERENCES butler_control_sessions(id) ON DELETE CASCADE,
446
+ FOREIGN KEY (session_id) REFERENCES session_bindings(session_id) ON DELETE CASCADE,
447
+ FOREIGN KEY (user_id) REFERENCES auth_users(id) ON DELETE CASCADE
448
+ );
449
+
450
+ CREATE INDEX IF NOT EXISTS idx_butler_control_timers_status_due_at
451
+ ON butler_control_timers(status, due_at ASC, updated_at ASC);
452
+ CREATE INDEX IF NOT EXISTS idx_butler_control_timers_session
453
+ ON butler_control_timers(control_session_id, status, updated_at DESC);
454
+ `);
455
+ }
456
+ function ensureAssistantAutomationSchema(db) {
457
+ const taskColumns = db
458
+ .prepare("PRAGMA table_info(assistant_automation_tasks)")
459
+ .all();
460
+ const runColumns = db
461
+ .prepare("PRAGMA table_info(assistant_automation_runs)")
462
+ .all();
463
+ if (taskColumns.length > 0 && runColumns.length > 0) {
464
+ return;
465
+ }
466
+ db.exec(`
467
+ CREATE TABLE IF NOT EXISTS assistant_automation_tasks (
468
+ id TEXT PRIMARY KEY,
469
+ user_id TEXT NOT NULL,
470
+ control_session_id TEXT NOT NULL,
471
+ project_id TEXT,
472
+ title TEXT,
473
+ trigger_type TEXT NOT NULL CHECK (trigger_type IN ('once', 'interval', 'cron', 'condition')),
474
+ trigger_config_json TEXT NOT NULL,
475
+ action_type TEXT NOT NULL CHECK (action_type IN ('send_control_message')),
476
+ action_config_json TEXT NOT NULL,
477
+ status TEXT NOT NULL CHECK (status IN ('active', 'paused', 'completed', 'cancelled', 'failed')),
478
+ next_run_at TEXT,
479
+ last_run_at TEXT,
480
+ last_run_summary TEXT,
481
+ last_error TEXT,
482
+ created_at TEXT NOT NULL,
483
+ updated_at TEXT NOT NULL,
484
+ cancelled_at TEXT,
485
+ FOREIGN KEY (control_session_id) REFERENCES butler_control_sessions(id) ON DELETE CASCADE,
486
+ FOREIGN KEY (user_id) REFERENCES auth_users(id) ON DELETE CASCADE
487
+ );
488
+
489
+ CREATE INDEX IF NOT EXISTS idx_assistant_automation_tasks_status_next_run_at
490
+ ON assistant_automation_tasks(status, next_run_at ASC, updated_at ASC);
491
+ CREATE INDEX IF NOT EXISTS idx_assistant_automation_tasks_session
492
+ ON assistant_automation_tasks(control_session_id, status, updated_at DESC);
493
+
494
+ CREATE TABLE IF NOT EXISTS assistant_automation_runs (
495
+ id TEXT PRIMARY KEY,
496
+ automation_id TEXT NOT NULL,
497
+ run_seq INTEGER NOT NULL,
498
+ trigger_type TEXT NOT NULL CHECK (trigger_type IN ('once', 'interval', 'cron', 'condition')),
499
+ trigger_snapshot_json TEXT NOT NULL,
500
+ action_type TEXT NOT NULL CHECK (action_type IN ('send_control_message')),
501
+ action_snapshot_json TEXT NOT NULL,
502
+ status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'succeeded', 'failed', 'cancelled', 'skipped')),
503
+ summary TEXT,
504
+ error TEXT,
505
+ scheduled_at TEXT NOT NULL,
506
+ started_at TEXT,
507
+ finished_at TEXT,
508
+ created_at TEXT NOT NULL,
509
+ FOREIGN KEY (automation_id) REFERENCES assistant_automation_tasks(id) ON DELETE CASCADE
510
+ );
511
+
512
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_assistant_automation_runs_seq
513
+ ON assistant_automation_runs(automation_id, run_seq);
514
+ CREATE INDEX IF NOT EXISTS idx_assistant_automation_runs_created_at
515
+ ON assistant_automation_runs(automation_id, created_at DESC);
516
+ `);
517
+ }
518
+ function ensureAssistantSandboxSchema(db) {
519
+ const columns = db
520
+ .prepare("PRAGMA table_info(assistant_sandboxes)")
521
+ .all();
522
+ if (columns.length > 0) {
523
+ const columnNames = new Set(columns.map((column) => column.name));
524
+ const tableSql = db
525
+ .prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'assistant_sandboxes'")
526
+ .get()?.sql ?? "";
527
+ const needsStatusConstraintRebuild = !tableSql.includes("'orphaned'");
528
+ if (needsStatusConstraintRebuild) {
529
+ const hasControlSessionId = columnNames.has("control_session_id");
530
+ const rebuild = db.transaction(() => {
531
+ db.exec("ALTER TABLE assistant_sandboxes RENAME TO assistant_sandboxes_legacy");
532
+ db.exec(`
533
+ CREATE TABLE assistant_sandboxes (
534
+ id TEXT PRIMARY KEY,
535
+ user_id TEXT NOT NULL,
536
+ workspace_id TEXT NOT NULL UNIQUE,
537
+ control_session_id TEXT,
538
+ title TEXT NOT NULL,
539
+ description TEXT,
540
+ source_kind TEXT NOT NULL CHECK (source_kind IN ('blank', 'clone')),
541
+ source_ref TEXT,
542
+ visibility TEXT NOT NULL CHECK (visibility IN ('assistant_only', 'pinned')),
543
+ status TEXT NOT NULL CHECK (status IN ('active', 'archived', 'expired', 'orphaned', 'deleted')),
544
+ purpose TEXT,
545
+ expires_at TEXT,
546
+ promoted_at TEXT,
547
+ created_at TEXT NOT NULL,
548
+ updated_at TEXT NOT NULL,
549
+ FOREIGN KEY (user_id) REFERENCES auth_users(id) ON DELETE CASCADE,
550
+ FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE,
551
+ FOREIGN KEY (control_session_id) REFERENCES butler_control_sessions(id) ON DELETE SET NULL
552
+ );
553
+ `);
554
+ db.exec(`
555
+ INSERT INTO assistant_sandboxes (
556
+ id,
557
+ user_id,
558
+ workspace_id,
559
+ control_session_id,
560
+ title,
561
+ description,
562
+ source_kind,
563
+ source_ref,
564
+ visibility,
565
+ status,
566
+ purpose,
567
+ expires_at,
568
+ promoted_at,
569
+ created_at,
570
+ updated_at
571
+ )
572
+ SELECT
573
+ id,
574
+ user_id,
575
+ workspace_id,
576
+ ${hasControlSessionId ? "control_session_id" : "NULL"},
577
+ title,
578
+ description,
579
+ source_kind,
580
+ source_ref,
581
+ visibility,
582
+ status,
583
+ purpose,
584
+ expires_at,
585
+ promoted_at,
586
+ created_at,
587
+ updated_at
588
+ FROM assistant_sandboxes_legacy;
589
+ `);
590
+ db.exec("DROP TABLE assistant_sandboxes_legacy");
591
+ });
592
+ rebuild();
593
+ }
594
+ else if (!columnNames.has("control_session_id")) {
595
+ db.exec("ALTER TABLE assistant_sandboxes ADD COLUMN control_session_id TEXT");
596
+ }
597
+ db.exec(`
598
+ CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_user_status
599
+ ON assistant_sandboxes(user_id, status, updated_at DESC);
600
+ CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_workspace
601
+ ON assistant_sandboxes(workspace_id, status, updated_at DESC);
602
+ CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_control_session
603
+ ON assistant_sandboxes(control_session_id, status, updated_at DESC);
604
+ `);
605
+ return;
606
+ }
607
+ db.exec(`
608
+ CREATE TABLE IF NOT EXISTS assistant_sandboxes (
609
+ id TEXT PRIMARY KEY,
610
+ user_id TEXT NOT NULL,
611
+ workspace_id TEXT NOT NULL UNIQUE,
612
+ control_session_id TEXT,
613
+ title TEXT NOT NULL,
614
+ description TEXT,
615
+ source_kind TEXT NOT NULL CHECK (source_kind IN ('blank', 'clone')),
616
+ source_ref TEXT,
617
+ visibility TEXT NOT NULL CHECK (visibility IN ('assistant_only', 'pinned')),
618
+ status TEXT NOT NULL CHECK (status IN ('active', 'archived', 'expired', 'orphaned', 'deleted')),
619
+ purpose TEXT,
620
+ expires_at TEXT,
621
+ promoted_at TEXT,
622
+ created_at TEXT NOT NULL,
623
+ updated_at TEXT NOT NULL,
624
+ FOREIGN KEY (user_id) REFERENCES auth_users(id) ON DELETE CASCADE,
625
+ FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE,
626
+ FOREIGN KEY (control_session_id) REFERENCES butler_control_sessions(id) ON DELETE SET NULL
627
+ );
628
+
629
+ CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_user_status
630
+ ON assistant_sandboxes(user_id, status, updated_at DESC);
631
+ CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_workspace
632
+ ON assistant_sandboxes(workspace_id, status, updated_at DESC);
633
+ CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_control_session
634
+ ON assistant_sandboxes(control_session_id, status, updated_at DESC);
635
+ `);
636
+ }
637
+ function ensureVerificationRunSchema(db) {
638
+ const verificationRunSql = readTableSql(db, "verification_runs");
639
+ if (!verificationRunSql.includes("status IN ('queued', 'running', 'passed', 'failed', 'skipped')")) {
640
+ return;
641
+ }
642
+ db.exec(`
643
+ PRAGMA foreign_keys = OFF;
644
+
645
+ CREATE TABLE verification_runs_next (
646
+ id TEXT PRIMARY KEY,
647
+ project_id TEXT NOT NULL,
648
+ butler_session_id TEXT,
649
+ source_patrol_run_id TEXT,
650
+ verification_type TEXT NOT NULL CHECK (
651
+ verification_type IN ('test', 'health', 'browser', 'visual', 'metric')
652
+ ),
653
+ status TEXT NOT NULL CHECK (
654
+ status IN ('queued', 'running', 'passed', 'failed', 'skipped', 'cancelled')
655
+ ),
656
+ target_ref TEXT,
657
+ spec_json TEXT NOT NULL,
658
+ artifact_refs_json TEXT NOT NULL,
659
+ result_json TEXT NOT NULL,
660
+ summary TEXT,
661
+ started_at TEXT,
662
+ finished_at TEXT,
663
+ created_at TEXT NOT NULL,
664
+ FOREIGN KEY (project_id) REFERENCES butler_projects(id) ON DELETE CASCADE,
665
+ FOREIGN KEY (butler_session_id) REFERENCES butler_sessions(id)
666
+ );
667
+
668
+ INSERT INTO verification_runs_next (
669
+ id,
670
+ project_id,
671
+ butler_session_id,
672
+ source_patrol_run_id,
673
+ verification_type,
674
+ status,
675
+ target_ref,
676
+ spec_json,
677
+ artifact_refs_json,
678
+ result_json,
679
+ summary,
680
+ started_at,
681
+ finished_at,
682
+ created_at
683
+ )
684
+ SELECT
685
+ id,
686
+ project_id,
687
+ butler_session_id,
688
+ source_patrol_run_id,
689
+ verification_type,
690
+ status,
691
+ target_ref,
692
+ spec_json,
693
+ artifact_refs_json,
694
+ result_json,
695
+ summary,
696
+ started_at,
697
+ finished_at,
698
+ created_at
699
+ FROM verification_runs;
700
+
701
+ DROP TABLE verification_runs;
702
+ ALTER TABLE verification_runs_next RENAME TO verification_runs;
703
+
704
+ CREATE INDEX IF NOT EXISTS idx_verification_runs_project_created_at
705
+ ON verification_runs(project_id, created_at DESC);
706
+ CREATE INDEX IF NOT EXISTS idx_verification_runs_project_status
707
+ ON verification_runs(project_id, status, created_at DESC);
708
+
709
+ PRAGMA foreign_keys = ON;
710
+ `);
222
711
  }
223
712
  function ensureButlerInboxSchema(db) {
224
713
  const columns = db
@@ -246,6 +735,15 @@ function ensureButlerFollowUpTaskSchema(db) {
246
735
  if (!columnNames.has("rounds_json")) {
247
736
  db.exec("ALTER TABLE butler_follow_up_tasks ADD COLUMN rounds_json TEXT NOT NULL DEFAULT '[]'");
248
737
  }
738
+ if (!columnNames.has("provider_id")) {
739
+ db.exec("ALTER TABLE butler_follow_up_tasks ADD COLUMN provider_id TEXT NOT NULL DEFAULT 'codex'");
740
+ }
741
+ if (!columnNames.has("assistant_butler_session_id")) {
742
+ db.exec("ALTER TABLE butler_follow_up_tasks ADD COLUMN assistant_butler_session_id TEXT NOT NULL DEFAULT ''");
743
+ }
744
+ if (!columnNames.has("assistant_session_id")) {
745
+ db.exec("ALTER TABLE butler_follow_up_tasks ADD COLUMN assistant_session_id TEXT NOT NULL DEFAULT ''");
746
+ }
249
747
  }
250
748
  function ensureButlerSessionSummarySchema(db) {
251
749
  const columns = db
@@ -265,6 +763,40 @@ function ensureInstanceTailscaleStatusSchema(db) {
265
763
  }
266
764
  db.exec("ALTER TABLE instance_tailscale_status ADD COLUMN account_name TEXT");
267
765
  }
766
+ function ensureInstanceTailscaleConfigSchema(db) {
767
+ const columns = db
768
+ .prepare("PRAGMA table_info(instance_tailscale_config)")
769
+ .all();
770
+ if (columns.length === 0 || columns.some((column) => column.name === "activated")) {
771
+ return;
772
+ }
773
+ db.exec("ALTER TABLE instance_tailscale_config ADD COLUMN activated INTEGER NOT NULL DEFAULT 0 CHECK (activated IN (0, 1))");
774
+ db.exec("UPDATE instance_tailscale_config SET activated = enabled");
775
+ }
776
+ function ensureInstanceRelayTunnelConfigSchema(db) {
777
+ const columns = db
778
+ .prepare("PRAGMA table_info(instance_relay_tunnel_config)")
779
+ .all();
780
+ if (columns.length === 0) {
781
+ return;
782
+ }
783
+ if (!columns.some((column) => column.name === "activated")) {
784
+ db.exec("ALTER TABLE instance_relay_tunnel_config ADD COLUMN activated INTEGER NOT NULL DEFAULT 0 CHECK (activated IN (0, 1))");
785
+ db.exec("UPDATE instance_relay_tunnel_config SET activated = enabled");
786
+ }
787
+ if (!columns.some((column) => column.name === "control_access_token_ciphertext")) {
788
+ db.exec("ALTER TABLE instance_relay_tunnel_config ADD COLUMN control_access_token_ciphertext TEXT");
789
+ }
790
+ if (!columns.some((column) => column.name === "control_account_email")) {
791
+ db.exec("ALTER TABLE instance_relay_tunnel_config ADD COLUMN control_account_email TEXT");
792
+ }
793
+ if (!columns.some((column) => column.name === "control_session_expires_at")) {
794
+ db.exec("ALTER TABLE instance_relay_tunnel_config ADD COLUMN control_session_expires_at TEXT");
795
+ }
796
+ if (!columns.some((column) => column.name === "local_target_source")) {
797
+ db.exec("ALTER TABLE instance_relay_tunnel_config ADD COLUMN local_target_source TEXT NOT NULL DEFAULT 'default' CHECK (local_target_source IN ('default', 'custom'))");
798
+ }
799
+ }
268
800
  function ensureSessionProviderSchema(db) {
269
801
  const bindingSql = readTableSql(db, "session_bindings");
270
802
  const indexSql = readTableSql(db, "session_indices");