@jingyi0605/codingns 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/bin/codingns.mjs +47 -8
  2. package/dist/public/assets/{TerminalPage-Nq5sPc5c.js → TerminalPage-4p6EBqrR.js} +19 -19
  3. package/dist/public/assets/gemini-D4G1NbrE.png +0 -0
  4. package/dist/public/assets/index-CxeghocY.css +1 -0
  5. package/dist/public/assets/index-DXusStl0.js +108 -0
  6. package/dist/public/assets/kimi-BWNNSh7e.png +0 -0
  7. package/dist/public/index.html +2 -2
  8. package/dist/server/config/env.d.ts +7 -0
  9. package/dist/server/config/env.js +147 -1
  10. package/dist/server/config/env.js.map +1 -1
  11. package/dist/server/config/opencode-system-probe-helper-process.d.ts +24 -0
  12. package/dist/server/config/opencode-system-probe-helper-process.js +70 -5
  13. package/dist/server/config/opencode-system-probe-helper-process.js.map +1 -1
  14. package/dist/server/modules/auth/auth-service.d.ts +7 -1
  15. package/dist/server/modules/auth/auth-service.js +23 -3
  16. package/dist/server/modules/auth/auth-service.js.map +1 -1
  17. package/dist/server/modules/bootstrap/bootstrap-service.d.ts +3 -1
  18. package/dist/server/modules/bootstrap/bootstrap-service.js +7 -2
  19. package/dist/server/modules/bootstrap/bootstrap-service.js.map +1 -1
  20. package/dist/server/modules/butler/butler-action-context-service.d.ts +30 -0
  21. package/dist/server/modules/butler/butler-action-context-service.js +108 -0
  22. package/dist/server/modules/butler/butler-action-context-service.js.map +1 -0
  23. package/dist/server/modules/butler/butler-auth-service.d.ts +17 -0
  24. package/dist/server/modules/butler/butler-auth-service.js +91 -0
  25. package/dist/server/modules/butler/butler-auth-service.js.map +1 -0
  26. package/dist/server/modules/butler/butler-control-action-service.d.ts +65 -0
  27. package/dist/server/modules/butler/butler-control-action-service.js +296 -0
  28. package/dist/server/modules/butler/butler-control-action-service.js.map +1 -0
  29. package/dist/server/modules/butler/butler-control-session-service.d.ts +55 -0
  30. package/dist/server/modules/butler/butler-control-session-service.js +367 -0
  31. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -0
  32. package/dist/server/modules/butler/butler-controller.d.ts +367 -0
  33. package/dist/server/modules/butler/butler-controller.js +475 -0
  34. package/dist/server/modules/butler/butler-controller.js.map +1 -0
  35. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.d.ts +34 -0
  36. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js +77 -0
  37. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js.map +1 -0
  38. package/dist/server/modules/butler/butler-follow-up-scheduler.d.ts +23 -0
  39. package/dist/server/modules/butler/butler-follow-up-scheduler.js +57 -0
  40. package/dist/server/modules/butler/butler-follow-up-scheduler.js.map +1 -0
  41. package/dist/server/modules/butler/butler-follow-up-service.d.ts +86 -0
  42. package/dist/server/modules/butler/butler-follow-up-service.js +948 -0
  43. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -0
  44. package/dist/server/modules/butler/butler-inbox-service.d.ts +35 -0
  45. package/dist/server/modules/butler/butler-inbox-service.js +136 -0
  46. package/dist/server/modules/butler/butler-inbox-service.js.map +1 -0
  47. package/dist/server/modules/butler/butler-notification-service.d.ts +12 -0
  48. package/dist/server/modules/butler/butler-notification-service.js +45 -0
  49. package/dist/server/modules/butler/butler-notification-service.js.map +1 -0
  50. package/dist/server/modules/butler/butler-profile-service.d.ts +26 -0
  51. package/dist/server/modules/butler/butler-profile-service.js +529 -0
  52. package/dist/server/modules/butler/butler-profile-service.js.map +1 -0
  53. package/dist/server/modules/butler/butler-project-service.d.ts +48 -0
  54. package/dist/server/modules/butler/butler-project-service.js +253 -0
  55. package/dist/server/modules/butler/butler-project-service.js.map +1 -0
  56. package/dist/server/modules/butler/butler-session-service.d.ts +79 -0
  57. package/dist/server/modules/butler/butler-session-service.js +503 -0
  58. package/dist/server/modules/butler/butler-session-service.js.map +1 -0
  59. package/dist/server/modules/butler/butler-session-summary-service.d.ts +55 -0
  60. package/dist/server/modules/butler/butler-session-summary-service.js +382 -0
  61. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -0
  62. package/dist/server/modules/butler/context-aggregator.d.ts +187 -0
  63. package/dist/server/modules/butler/context-aggregator.js +807 -0
  64. package/dist/server/modules/butler/context-aggregator.js.map +1 -0
  65. package/dist/server/modules/butler/instruction-adapter.d.ts +28 -0
  66. package/dist/server/modules/butler/instruction-adapter.js +101 -0
  67. package/dist/server/modules/butler/instruction-adapter.js.map +1 -0
  68. package/dist/server/modules/butler/patrol-execution-service.d.ts +47 -0
  69. package/dist/server/modules/butler/patrol-execution-service.js +347 -0
  70. package/dist/server/modules/butler/patrol-execution-service.js.map +1 -0
  71. package/dist/server/modules/butler/patrol-plan-service.d.ts +54 -0
  72. package/dist/server/modules/butler/patrol-plan-service.js +272 -0
  73. package/dist/server/modules/butler/patrol-plan-service.js.map +1 -0
  74. package/dist/server/modules/butler/patrol-run-service.d.ts +60 -0
  75. package/dist/server/modules/butler/patrol-run-service.js +185 -0
  76. package/dist/server/modules/butler/patrol-run-service.js.map +1 -0
  77. package/dist/server/modules/butler/patrol-scheduler.d.ts +36 -0
  78. package/dist/server/modules/butler/patrol-scheduler.js +99 -0
  79. package/dist/server/modules/butler/patrol-scheduler.js.map +1 -0
  80. package/dist/server/modules/butler/project-memory-service.d.ts +30 -0
  81. package/dist/server/modules/butler/project-memory-service.js +103 -0
  82. package/dist/server/modules/butler/project-memory-service.js.map +1 -0
  83. package/dist/server/modules/butler/provider-adapter-registry.d.ts +61 -0
  84. package/dist/server/modules/butler/provider-adapter-registry.js +430 -0
  85. package/dist/server/modules/butler/provider-adapter-registry.js.map +1 -0
  86. package/dist/server/modules/butler/session-summary-instruction-adapter.d.ts +28 -0
  87. package/dist/server/modules/butler/session-summary-instruction-adapter.js +79 -0
  88. package/dist/server/modules/butler/session-summary-instruction-adapter.js.map +1 -0
  89. package/dist/server/modules/butler/session-summary-scheduler.d.ts +23 -0
  90. package/dist/server/modules/butler/session-summary-scheduler.js +57 -0
  91. package/dist/server/modules/butler/session-summary-scheduler.js.map +1 -0
  92. package/dist/server/modules/butler/verification-run-service.d.ts +73 -0
  93. package/dist/server/modules/butler/verification-run-service.js +633 -0
  94. package/dist/server/modules/butler/verification-run-service.js.map +1 -0
  95. package/dist/server/modules/demo/demo-cleanup-service.d.ts +41 -0
  96. package/dist/server/modules/demo/demo-cleanup-service.js +111 -0
  97. package/dist/server/modules/demo/demo-cleanup-service.js.map +1 -0
  98. package/dist/server/modules/preferences/profile-service.js +8 -2
  99. package/dist/server/modules/preferences/profile-service.js.map +1 -1
  100. package/dist/server/modules/sessions/claude-runtime-helper-process.js +1 -1
  101. package/dist/server/modules/sessions/claude-runtime-helper-process.js.map +1 -1
  102. package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +5 -1
  103. package/dist/server/modules/sessions/codex-app-server-helper-client.js +10 -2
  104. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
  105. package/dist/server/modules/sessions/session-controller.d.ts +3 -1
  106. package/dist/server/modules/sessions/session-controller.js +11 -2
  107. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  108. package/dist/server/modules/sessions/session-history-service.d.ts +14 -1
  109. package/dist/server/modules/sessions/session-history-service.js +291 -30
  110. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  111. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +25 -2
  112. package/dist/server/modules/sessions/session-live-runtime-service.js +526 -158
  113. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  114. package/dist/server/modules/sessions/session-provider-error-mapper.js +28 -0
  115. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  116. package/dist/server/modules/terminal/terminal-service.js +2 -2
  117. package/dist/server/modules/terminal/terminal-service.js.map +1 -1
  118. package/dist/server/modules/workbench/workbench-service.d.ts +7 -1
  119. package/dist/server/modules/workbench/workbench-service.js +31 -7
  120. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  121. package/dist/server/routes/butler.d.ts +3 -0
  122. package/dist/server/routes/butler.js +54 -0
  123. package/dist/server/routes/butler.js.map +1 -0
  124. package/dist/server/routes/sessions.d.ts +1 -0
  125. package/dist/server/routes/sessions.js +12 -3
  126. package/dist/server/routes/sessions.js.map +1 -1
  127. package/dist/server/server/create-server.d.ts +61 -0
  128. package/dist/server/server/create-server.js +180 -10
  129. package/dist/server/server/create-server.js.map +1 -1
  130. package/dist/server/storage/repositories/butler-control-event-repository.d.ts +8 -0
  131. package/dist/server/storage/repositories/butler-control-event-repository.js +78 -0
  132. package/dist/server/storage/repositories/butler-control-event-repository.js.map +1 -0
  133. package/dist/server/storage/repositories/butler-control-session-repository.d.ts +11 -0
  134. package/dist/server/storage/repositories/butler-control-session-repository.js +86 -0
  135. package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -0
  136. package/dist/server/storage/repositories/butler-follow-up-task-repository.d.ts +16 -0
  137. package/dist/server/storage/repositories/butler-follow-up-task-repository.js +252 -0
  138. package/dist/server/storage/repositories/butler-follow-up-task-repository.js.map +1 -0
  139. package/dist/server/storage/repositories/butler-inbox-item-repository.d.ts +15 -0
  140. package/dist/server/storage/repositories/butler-inbox-item-repository.js +111 -0
  141. package/dist/server/storage/repositories/butler-inbox-item-repository.js.map +1 -0
  142. package/dist/server/storage/repositories/butler-notification-archive-repository.d.ts +9 -0
  143. package/dist/server/storage/repositories/butler-notification-archive-repository.js +48 -0
  144. package/dist/server/storage/repositories/butler-notification-archive-repository.js.map +1 -0
  145. package/dist/server/storage/repositories/butler-profile-repository.d.ts +9 -0
  146. package/dist/server/storage/repositories/butler-profile-repository.js +86 -0
  147. package/dist/server/storage/repositories/butler-profile-repository.js.map +1 -0
  148. package/dist/server/storage/repositories/butler-project-repository.d.ts +14 -0
  149. package/dist/server/storage/repositories/butler-project-repository.js +140 -0
  150. package/dist/server/storage/repositories/butler-project-repository.js.map +1 -0
  151. package/dist/server/storage/repositories/butler-session-repository.d.ts +11 -0
  152. package/dist/server/storage/repositories/butler-session-repository.js +106 -0
  153. package/dist/server/storage/repositories/butler-session-repository.js.map +1 -0
  154. package/dist/server/storage/repositories/butler-session-summary-state-repository.d.ts +8 -0
  155. package/dist/server/storage/repositories/butler-session-summary-state-repository.js +62 -0
  156. package/dist/server/storage/repositories/butler-session-summary-state-repository.js.map +1 -0
  157. package/dist/server/storage/repositories/patrol-plan-repository.d.ts +27 -0
  158. package/dist/server/storage/repositories/patrol-plan-repository.js +119 -0
  159. package/dist/server/storage/repositories/patrol-plan-repository.js.map +1 -0
  160. package/dist/server/storage/repositories/patrol-run-repository.d.ts +28 -0
  161. package/dist/server/storage/repositories/patrol-run-repository.js +121 -0
  162. package/dist/server/storage/repositories/patrol-run-repository.js.map +1 -0
  163. package/dist/server/storage/repositories/project-memory-repository.d.ts +15 -0
  164. package/dist/server/storage/repositories/project-memory-repository.js +150 -0
  165. package/dist/server/storage/repositories/project-memory-repository.js.map +1 -0
  166. package/dist/server/storage/repositories/session-checkpoint-repository.d.ts +9 -0
  167. package/dist/server/storage/repositories/session-checkpoint-repository.js +72 -0
  168. package/dist/server/storage/repositories/session-checkpoint-repository.js.map +1 -0
  169. package/dist/server/storage/repositories/session-message-origin-repository.d.ts +10 -0
  170. package/dist/server/storage/repositories/session-message-origin-repository.js +93 -0
  171. package/dist/server/storage/repositories/session-message-origin-repository.js.map +1 -0
  172. package/dist/server/storage/repositories/verification-run-repository.d.ts +29 -0
  173. package/dist/server/storage/repositories/verification-run-repository.js +125 -0
  174. package/dist/server/storage/repositories/verification-run-repository.js.map +1 -0
  175. package/dist/server/storage/sqlite/client.js +39 -0
  176. package/dist/server/storage/sqlite/client.js.map +1 -1
  177. package/dist/server/storage/sqlite/schema.sql +324 -0
  178. package/dist/server/types/domain.d.ts +261 -1
  179. package/dist/server/ws/ws-server.d.ts +2 -1
  180. package/dist/server/ws/ws-server.js +2 -1
  181. package/dist/server/ws/ws-server.js.map +1 -1
  182. package/node_modules/@codingns/session-sync-core/dist/index.d.ts +4 -0
  183. package/node_modules/@codingns/session-sync-core/dist/index.js +4 -0
  184. package/node_modules/@codingns/session-sync-core/dist/index.js.map +1 -1
  185. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.d.ts +18 -0
  186. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.js +659 -0
  187. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.js.map +1 -0
  188. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.d.ts +11 -0
  189. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.js +72 -0
  190. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.js.map +1 -0
  191. package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +8 -0
  192. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +89 -0
  193. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -1
  194. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +4 -1
  195. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  196. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.d.ts +41 -0
  197. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +1086 -0
  198. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -0
  199. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.d.ts +29 -0
  200. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js +578 -0
  201. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js.map +1 -0
  202. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +2 -1
  203. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  204. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +30 -2
  205. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -1
  206. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.d.ts +2 -0
  207. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +43 -5
  208. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
  209. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +2 -0
  210. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +320 -69
  211. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  212. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.d.ts +21 -0
  213. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js +537 -0
  214. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js.map +1 -0
  215. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.d.ts +38 -0
  216. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.js +911 -0
  217. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.js.map +1 -0
  218. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.d.ts +6 -0
  219. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js +9 -0
  220. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js.map +1 -0
  221. package/node_modules/@codingns/session-sync-core/package.json +8 -0
  222. package/package.json +1 -1
  223. package/dist/public/assets/index-9hnprhO7.css +0 -1
  224. package/dist/public/assets/index-BTpmuKhG.js +0 -108
@@ -1 +1 @@
1
- {"version":3,"file":"workbench-service.js","sourceRoot":"","sources":["../../../../src/modules/workbench/workbench-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIhE,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAW5C,MAAM,OAAO,gBAAgB;IAER;IACA;IAFnB,YACmB,mBAAwC,EACxC,qBAA4C;QAD5C,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,0BAAqB,GAArB,qBAAqB,CAAuB;IAC5D,CAAC;IAEJ,WAAW,CAAC,MAAc;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;QAEnD,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBACpC,SAAS;gBACT,QAAQ,EAAE,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC;aACjF,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,qBAAqB;QACnB,OAAO,IAAI,CAAC,mBAAmB;aAC5B,IAAI,EAAE;aACN,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAClB,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,CAChD,SAAS,CAAC,EAAE,EACZ,4BAA4B,CAC7B,CACF,CAAC;IACN,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;QAEnD,MAAM,OAAO,CAAC,GAAG,CACf,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAC3B,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE;YACzE,QAAQ,EAAE,4BAA4B;YACtC,gBAAgB,EAAE,UAAU;SAC7B,CAAC,CACH,CACF,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1C,cAAc,CACZ,4BAA4B,EAC5B,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EACtB;YACE,cAAc,EAAE,UAAU,CAAC,MAAM;YACjC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;SACtF,EACD;YACE,WAAW,EAAE,GAAG;SACjB,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAc;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;QAEnD,MAAM,OAAO,CAAC,GAAG,CACf,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAC3B,IAAI,CAAC,qBAAqB,CAAC,0BAA0B,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,CAC5E,CACF,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;CACF"}
1
+ {"version":3,"file":"workbench-service.js","sourceRoot":"","sources":["../../../../src/modules/workbench/workbench-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ import type { ButlerController } from "../modules/butler/butler-controller.js";
3
+ export declare function registerButlerRoutes(app: FastifyInstance, butlerController: ButlerController): Promise<void>;
@@ -0,0 +1,54 @@
1
+ export async function registerButlerRoutes(app, butlerController) {
2
+ app.get("/api/butler/profile", butlerController.getProfile);
3
+ app.post("/api/butler/profile/init", butlerController.initProfile);
4
+ app.patch("/api/butler/profile", butlerController.updateProfile);
5
+ app.get("/api/butler/control-session", butlerController.getCurrentControlSession);
6
+ app.get("/api/butler/control-session/events", butlerController.listControlSessionEvents);
7
+ app.post("/api/butler/control-session/reset", butlerController.resetControlSession);
8
+ app.post("/api/butler/control-session/start", butlerController.startControlSession);
9
+ app.post("/api/butler/control-session/resume", butlerController.resumeControlSession);
10
+ app.post("/api/butler/control-session/messages", butlerController.sendControlMessage);
11
+ app.get("/api/butler/overview", butlerController.getOverview);
12
+ app.get("/api/butler/follow-up-tasks", butlerController.listFollowUpTasks);
13
+ app.get("/api/butler/follow-up-tasks/:taskId", butlerController.getFollowUpTask);
14
+ app.post("/api/butler/follow-up-tasks", butlerController.createFollowUpTask);
15
+ app.post("/api/butler/follow-up-tasks/:taskId/cancel", butlerController.cancelFollowUpTask);
16
+ app.get("/api/butler/inbox", butlerController.listInboxItems);
17
+ app.post("/api/butler/inbox", butlerController.createInboxItem);
18
+ app.patch("/api/butler/inbox/:itemId", butlerController.updateInboxItem);
19
+ app.delete("/api/butler/inbox/:itemId", butlerController.deleteInboxItem);
20
+ app.get("/api/butler/notifications/archives", butlerController.listNotificationArchives);
21
+ app.patch("/api/butler/notifications/archives/:notificationId", butlerController.updateNotificationArchive);
22
+ app.get("/api/butler/context-snapshot", butlerController.getContextSnapshot);
23
+ app.get("/api/butler/search", butlerController.searchSummaries);
24
+ app.get("/api/butler/session-target", butlerController.getSessionTarget);
25
+ app.get("/api/butler/session-action-context", butlerController.getSessionActionContext);
26
+ app.post("/api/butler/actions/open-project", butlerController.openProjectAction);
27
+ app.post("/api/butler/actions/resume-session", butlerController.resumeProjectSessionAction);
28
+ app.post("/api/butler/actions/start-patrol", butlerController.startPatrolAction);
29
+ app.post("/api/butler/actions/start-verification", butlerController.startVerificationAction);
30
+ app.get("/api/butler/projects", butlerController.listProjects);
31
+ app.post("/api/butler/projects", butlerController.createProject);
32
+ app.get("/api/butler/projects/:projectId", butlerController.getProject);
33
+ app.patch("/api/butler/projects/:projectId", butlerController.updateProject);
34
+ app.get("/api/butler/projects/:projectId/context", butlerController.getProjectContext);
35
+ app.get("/api/butler/projects/:projectId/overview", butlerController.getProjectOverview);
36
+ app.get("/api/butler/projects/:projectId/sessions", butlerController.listProjectSessions);
37
+ app.post("/api/butler/projects/:projectId/sessions/start", butlerController.startProjectSession);
38
+ app.post("/api/butler/projects/:projectId/sessions/import", butlerController.importProjectSession);
39
+ app.post("/api/butler/projects/:projectId/sessions/:butlerSessionId/resume", butlerController.resumeProjectSession);
40
+ app.post("/api/butler/projects/:projectId/sessions/:butlerSessionId/snapshot", butlerController.captureProjectSessionSnapshot);
41
+ app.get("/api/butler/projects/:projectId/memories", butlerController.listProjectMemories);
42
+ app.post("/api/butler/projects/:projectId/memories", butlerController.createProjectMemory);
43
+ app.patch("/api/butler/projects/:projectId/memories/:memoryId", butlerController.updateProjectMemory);
44
+ app.get("/api/butler/projects/:projectId/patrol-plans", butlerController.listPatrolPlans);
45
+ app.post("/api/butler/projects/:projectId/patrol-plans", butlerController.createPatrolPlan);
46
+ app.patch("/api/butler/projects/:projectId/patrol-plans/:planId", butlerController.updatePatrolPlan);
47
+ app.get("/api/butler/projects/:projectId/patrol-runs", butlerController.listPatrolRuns);
48
+ app.post("/api/butler/projects/:projectId/patrol-runs/start", butlerController.startPatrolRun);
49
+ app.get("/api/butler/projects/:projectId/patrol-runs/:runId", butlerController.getPatrolRun);
50
+ app.get("/api/butler/projects/:projectId/verifications", butlerController.listVerificationRuns);
51
+ app.post("/api/butler/projects/:projectId/verifications", butlerController.startVerificationRun);
52
+ app.get("/api/butler/projects/:projectId/verifications/:verificationId", butlerController.getVerificationRun);
53
+ }
54
+ //# sourceMappingURL=butler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"butler.js","sourceRoot":"","sources":["../../../src/routes/butler.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAoB,EACpB,gBAAkC;IAElC,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC5D,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACnE,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACjE,GAAG,CAAC,GAAG,CAAC,6BAA6B,EAAE,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;IAClF,GAAG,CAAC,GAAG,CAAC,oCAAoC,EAAE,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;IACzF,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IACpF,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IACpF,GAAG,CAAC,IAAI,CAAC,oCAAoC,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IACtF,GAAG,CAAC,IAAI,CAAC,sCAAsC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IACtF,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,6BAA6B,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAC3E,GAAG,CAAC,GAAG,CAAC,qCAAqC,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACjF,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAC7E,GAAG,CAAC,IAAI,CAAC,4CAA4C,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAC5F,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC9D,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAChE,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACzE,GAAG,CAAC,MAAM,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC1E,GAAG,CAAC,GAAG,CAAC,oCAAoC,EAAE,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;IACzF,GAAG,CAAC,KAAK,CAAC,oDAAoD,EAAE,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;IAC5G,GAAG,CAAC,GAAG,CAAC,8BAA8B,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAC7E,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAChE,GAAG,CAAC,GAAG,CAAC,4BAA4B,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACzE,GAAG,CAAC,GAAG,CAAC,oCAAoC,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;IACxF,GAAG,CAAC,IAAI,CAAC,kCAAkC,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IACjF,GAAG,CAAC,IAAI,CAAC,oCAAoC,EAAE,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;IAC5F,GAAG,CAAC,IAAI,CAAC,kCAAkC,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IACjF,GAAG,CAAC,IAAI,CAAC,wCAAwC,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;IAC7F,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC/D,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACjE,GAAG,CAAC,GAAG,CAAC,iCAAiC,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxE,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAC7E,GAAG,CAAC,GAAG,CAAC,yCAAyC,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IACvF,GAAG,CAAC,GAAG,CAAC,0CAA0C,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IACzF,GAAG,CAAC,GAAG,CAAC,0CAA0C,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAC1F,GAAG,CAAC,IAAI,CAAC,gDAAgD,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IACjG,GAAG,CAAC,IAAI,CAAC,iDAAiD,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IACnG,GAAG,CAAC,IAAI,CACN,kEAAkE,EAClE,gBAAgB,CAAC,oBAAoB,CACtC,CAAC;IACF,GAAG,CAAC,IAAI,CACN,oEAAoE,EACpE,gBAAgB,CAAC,6BAA6B,CAC/C,CAAC;IACF,GAAG,CAAC,GAAG,CAAC,0CAA0C,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAC1F,GAAG,CAAC,IAAI,CAAC,0CAA0C,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAC3F,GAAG,CAAC,KAAK,CAAC,oDAAoD,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IACtG,GAAG,CAAC,GAAG,CAAC,8CAA8C,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC1F,GAAG,CAAC,IAAI,CAAC,8CAA8C,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAC5F,GAAG,CAAC,KAAK,CAAC,sDAAsD,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACrG,GAAG,CAAC,GAAG,CAAC,6CAA6C,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACxF,GAAG,CAAC,IAAI,CAAC,mDAAmD,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC/F,GAAG,CAAC,GAAG,CAAC,oDAAoD,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC7F,GAAG,CAAC,GAAG,CAAC,+CAA+C,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IAChG,GAAG,CAAC,IAAI,CAAC,+CAA+C,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IACjG,GAAG,CAAC,GAAG,CACL,+DAA+D,EAC/D,gBAAgB,CAAC,kBAAkB,CACpC,CAAC;AACJ,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import type { FastifyInstance } from "fastify";
2
2
  import type { SessionController } from "../modules/sessions/session-controller.js";
3
+ export declare const SESSION_MESSAGE_BODY_LIMIT_BYTES: number;
3
4
  export declare function registerSessionRoutes(app: FastifyInstance, sessionController: SessionController): Promise<void>;
@@ -1,3 +1,6 @@
1
+ // 会话图片附件当前通过 JSON + base64 直接提交,Fastify 默认 1MB bodyLimit
2
+ // 对首条/追加/排队消息都过小,合法图片会在进入 controller 前就被 413 拦掉。
3
+ export const SESSION_MESSAGE_BODY_LIMIT_BYTES = 64 * 1024 * 1024;
1
4
  export async function registerSessionRoutes(app, sessionController) {
2
5
  app.get("/api/sessions", sessionController.list);
3
6
  app.get("/api/sessions/:sessionId", sessionController.getDetail);
@@ -12,15 +15,21 @@ export async function registerSessionRoutes(app, sessionController) {
12
15
  app.patch("/api/sessions/:sessionId/archive", sessionController.updateArchiveState);
13
16
  app.patch("/api/sessions/:sessionId/favorite", sessionController.updateFavoriteState);
14
17
  app.post("/api/sessions/:sessionId/messages", sessionController.sendMessage);
15
- app.post("/api/sessions/:sessionId/messages/live", sessionController.sendLiveMessage);
18
+ app.post("/api/sessions/:sessionId/messages/live", {
19
+ bodyLimit: SESSION_MESSAGE_BODY_LIMIT_BYTES
20
+ }, sessionController.sendLiveMessage);
16
21
  app.post("/api/sessions/:sessionId/permission-requests/:requestId/reply", sessionController.replyPermissionRequest);
17
- app.post("/api/sessions/:sessionId/queue", sessionController.enqueueLiveMessage);
22
+ app.post("/api/sessions/:sessionId/queue", {
23
+ bodyLimit: SESSION_MESSAGE_BODY_LIMIT_BYTES
24
+ }, sessionController.enqueueLiveMessage);
18
25
  app.post("/api/sessions/:sessionId/queue/:queueItemId/steer", sessionController.steerQueuedMessage);
19
26
  app.post("/api/sessions/:sessionId/interrupt", sessionController.interrupt);
20
27
  app.post("/api/sessions/:sessionId/seen", sessionController.markSeen);
21
28
  app.post("/api/sessions/:sessionId/resume", sessionController.resume);
22
29
  app.post("/api/sessions/start", sessionController.start);
23
- app.post("/api/sessions/start-live", sessionController.startLive);
30
+ app.post("/api/sessions/start-live", {
31
+ bodyLimit: SESSION_MESSAGE_BODY_LIMIT_BYTES
32
+ }, sessionController.startLive);
24
33
  app.delete("/api/sessions/:sessionId/queue/:queueItemId", sessionController.deleteQueuedMessage);
25
34
  }
26
35
  //# sourceMappingURL=sessions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/routes/sessions.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAoB,EACpB,iBAAoC;IAEpC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjD,GAAG,CAAC,GAAG,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACjE,GAAG,CAAC,GAAG,CAAC,wCAAwC,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACrF,GAAG,CAAC,GAAG,CAAC,mCAAmC,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC7E,GAAG,CAAC,GAAG,CAAC,4DAA4D,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACxG,GAAG,CAAC,GAAG,CAAC,uCAAuC,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACpF,GAAG,CAAC,GAAG,CAAC,8CAA8C,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;IAClG,GAAG,CAAC,GAAG,CAAC,gCAAgC,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACvE,GAAG,CAAC,GAAG,CAAC,kCAAkC,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC1E,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC3E,GAAG,CAAC,KAAK,CAAC,kCAAkC,EAAE,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IACpF,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;IACtF,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC7E,GAAG,CAAC,IAAI,CAAC,wCAAwC,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACtF,GAAG,CAAC,IAAI,CACN,+DAA+D,EAC/D,iBAAiB,CAAC,sBAAsB,CACzC,CAAC;IACF,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IACjF,GAAG,CAAC,IAAI,CAAC,mDAAmD,EAAE,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IACpG,GAAG,CAAC,IAAI,CAAC,oCAAoC,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC5E,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACtE,GAAG,CAAC,IAAI,CAAC,iCAAiC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACtE,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzD,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAClE,GAAG,CAAC,MAAM,CAAC,6CAA6C,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;AACnG,CAAC"}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/routes/sessions.ts"],"names":[],"mappings":"AAIA,yDAAyD;AACzD,iDAAiD;AACjD,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAoB,EACpB,iBAAoC;IAEpC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjD,GAAG,CAAC,GAAG,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACjE,GAAG,CAAC,GAAG,CAAC,wCAAwC,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACrF,GAAG,CAAC,GAAG,CAAC,mCAAmC,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC7E,GAAG,CAAC,GAAG,CAAC,4DAA4D,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACxG,GAAG,CAAC,GAAG,CAAC,uCAAuC,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACpF,GAAG,CAAC,GAAG,CAAC,8CAA8C,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;IAClG,GAAG,CAAC,GAAG,CAAC,gCAAgC,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACvE,GAAG,CAAC,GAAG,CAAC,kCAAkC,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC1E,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC3E,GAAG,CAAC,KAAK,CAAC,kCAAkC,EAAE,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IACpF,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;IACtF,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC7E,GAAG,CAAC,IAAI,CACN,wCAAwC,EACxC;QACE,SAAS,EAAE,gCAAgC;KAC5C,EACD,iBAAiB,CAAC,eAAe,CAClC,CAAC;IACF,GAAG,CAAC,IAAI,CACN,+DAA+D,EAC/D,iBAAiB,CAAC,sBAAsB,CACzC,CAAC;IACF,GAAG,CAAC,IAAI,CACN,gCAAgC,EAChC;QACE,SAAS,EAAE,gCAAgC;KAC5C,EACD,iBAAiB,CAAC,kBAAkB,CACrC,CAAC;IACF,GAAG,CAAC,IAAI,CAAC,mDAAmD,EAAE,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IACpG,GAAG,CAAC,IAAI,CAAC,oCAAoC,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC5E,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACtE,GAAG,CAAC,IAAI,CAAC,iCAAiC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACtE,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzD,GAAG,CAAC,IAAI,CACN,0BAA0B,EAC1B;QACE,SAAS,EAAE,gCAAgC;KAC5C,EACD,iBAAiB,CAAC,SAAS,CAC5B,CAAC;IACF,GAAG,CAAC,MAAM,CAAC,6CAA6C,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;AACnG,CAAC"}
@@ -2,6 +2,21 @@ import Fastify from "fastify";
2
2
  import type { HostConfig } from "../config/env.js";
3
3
  import { AuthService } from "../modules/auth/auth-service.js";
4
4
  import { BootstrapService } from "../modules/bootstrap/bootstrap-service.js";
5
+ import { ButlerControlSessionService } from "../modules/butler/butler-control-session-service.js";
6
+ import { ButlerControlActionService } from "../modules/butler/butler-control-action-service.js";
7
+ import { ButlerActionContextService } from "../modules/butler/butler-action-context-service.js";
8
+ import { ButlerFollowUpScheduler } from "../modules/butler/butler-follow-up-scheduler.js";
9
+ import { ButlerFollowUpService } from "../modules/butler/butler-follow-up-service.js";
10
+ import { ButlerProfileService } from "../modules/butler/butler-profile-service.js";
11
+ import { ButlerProjectService } from "../modules/butler/butler-project-service.js";
12
+ import { ButlerSessionService } from "../modules/butler/butler-session-service.js";
13
+ import { ButlerSessionSummaryService } from "../modules/butler/butler-session-summary-service.js";
14
+ import { PatrolPlanService } from "../modules/butler/patrol-plan-service.js";
15
+ import { PatrolRunService } from "../modules/butler/patrol-run-service.js";
16
+ import { PatrolScheduler } from "../modules/butler/patrol-scheduler.js";
17
+ import { ProjectMemoryService } from "../modules/butler/project-memory-service.js";
18
+ import { SessionSummaryScheduler } from "../modules/butler/session-summary-scheduler.js";
19
+ import { VerificationRunService } from "../modules/butler/verification-run-service.js";
5
20
  import { ClientService } from "../modules/client/client-service.js";
6
21
  import { FileContentService } from "../modules/file/file-content-service.js";
7
22
  import { FileContextService } from "../modules/file/file-context-service.js";
@@ -26,13 +41,28 @@ import { WorkspaceService } from "../modules/workspace/workspace-service.js";
26
41
  import { AuthTokenRepository } from "../storage/repositories/auth-token-repository.js";
27
42
  import { AuthUserRepository } from "../storage/repositories/auth-user-repository.js";
28
43
  import { BootstrapStateRepository } from "../storage/repositories/bootstrap-state-repository.js";
44
+ import { ButlerControlSessionRepository } from "../storage/repositories/butler-control-session-repository.js";
45
+ import { ButlerControlEventRepository } from "../storage/repositories/butler-control-event-repository.js";
46
+ import { ButlerFollowUpTaskRepository } from "../storage/repositories/butler-follow-up-task-repository.js";
47
+ import { ButlerInboxItemRepository } from "../storage/repositories/butler-inbox-item-repository.js";
48
+ import { ButlerNotificationArchiveRepository } from "../storage/repositories/butler-notification-archive-repository.js";
49
+ import { ButlerProfileRepository } from "../storage/repositories/butler-profile-repository.js";
50
+ import { ButlerProjectRepository } from "../storage/repositories/butler-project-repository.js";
51
+ import { ButlerSessionRepository } from "../storage/repositories/butler-session-repository.js";
52
+ import { ButlerSessionSummaryStateRepository } from "../storage/repositories/butler-session-summary-state-repository.js";
53
+ import { PatrolPlanRepository } from "../storage/repositories/patrol-plan-repository.js";
54
+ import { PatrolRunRepository } from "../storage/repositories/patrol-run-repository.js";
55
+ import { ProjectMemoryRepository } from "../storage/repositories/project-memory-repository.js";
56
+ import { VerificationRunRepository } from "../storage/repositories/verification-run-repository.js";
29
57
  import { CommitRuleProfileRepository } from "../storage/repositories/commit-rule-profile-repository.js";
30
58
  import { FileContextBindingRepository } from "../storage/repositories/file-context-binding-repository.js";
31
59
  import { RecentFileRepository } from "../storage/repositories/recent-file-repository.js";
32
60
  import { SessionBindingRepository } from "../storage/repositories/session-binding-repository.js";
33
61
  import { SessionChangedFileRepository } from "../storage/repositories/session-changed-file-repository.js";
34
62
  import { SessionIndexRepository } from "../storage/repositories/session-index-repository.js";
63
+ import { SessionCheckpointRepository } from "../storage/repositories/session-checkpoint-repository.js";
35
64
  import { SessionMessageAttachmentRepository } from "../storage/repositories/session-message-attachment-repository.js";
65
+ import { SessionMessageOriginRepository } from "../storage/repositories/session-message-origin-repository.js";
36
66
  import { SessionSendQueueRepository } from "../storage/repositories/session-send-queue-repository.js";
37
67
  import { SessionStateRepository } from "../storage/repositories/session-state-repository.js";
38
68
  import { SessionStatusSnapshotRepository } from "../storage/repositories/session-status-snapshot-repository.js";
@@ -56,13 +86,28 @@ export declare function createServer(config: HostConfig): {
56
86
  authUserRepository: AuthUserRepository;
57
87
  authTokenRepository: AuthTokenRepository;
58
88
  workspaceRepository: WorkspaceRepository;
89
+ butlerControlSessionRepository: ButlerControlSessionRepository;
90
+ butlerControlEventRepository: ButlerControlEventRepository;
91
+ butlerFollowUpTaskRepository: ButlerFollowUpTaskRepository;
92
+ butlerInboxItemRepository: ButlerInboxItemRepository;
93
+ butlerNotificationArchiveRepository: ButlerNotificationArchiveRepository;
94
+ butlerProfileRepository: ButlerProfileRepository;
95
+ butlerProjectRepository: ButlerProjectRepository;
96
+ butlerSessionRepository: ButlerSessionRepository;
97
+ butlerSessionSummaryStateRepository: ButlerSessionSummaryStateRepository;
98
+ projectMemoryRepository: ProjectMemoryRepository;
99
+ patrolPlanRepository: PatrolPlanRepository;
100
+ patrolRunRepository: PatrolRunRepository;
101
+ verificationRunRepository: VerificationRunRepository;
59
102
  commitRuleProfileRepository: CommitRuleProfileRepository;
60
103
  recentFileRepository: RecentFileRepository;
61
104
  fileContextBindingRepository: FileContextBindingRepository;
62
105
  sessionBindingRepository: SessionBindingRepository;
63
106
  sessionChangedFileRepository: SessionChangedFileRepository;
107
+ sessionCheckpointRepository: SessionCheckpointRepository;
64
108
  sessionIndexRepository: SessionIndexRepository;
65
109
  sessionMessageAttachmentRepository: SessionMessageAttachmentRepository;
110
+ sessionMessageOriginRepository: SessionMessageOriginRepository;
66
111
  sessionSendQueueRepository: SessionSendQueueRepository;
67
112
  sessionStateRepository: SessionStateRepository;
68
113
  sessionStatusSnapshotRepository: SessionStatusSnapshotRepository;
@@ -80,6 +125,22 @@ export declare function createServer(config: HostConfig): {
80
125
  authService: AuthService;
81
126
  workspaceService: WorkspaceService;
82
127
  workbenchService: WorkbenchService;
128
+ butlerProfileService: ButlerProfileService;
129
+ butlerSessionLiveRuntimeService: SessionLiveRuntimeService;
130
+ butlerControlSessionService: ButlerControlSessionService;
131
+ butlerControlActionService: ButlerControlActionService;
132
+ butlerFollowUpService: ButlerFollowUpService;
133
+ butlerActionContextService: ButlerActionContextService;
134
+ butlerProjectService: ButlerProjectService;
135
+ butlerSessionService: ButlerSessionService;
136
+ projectMemoryService: ProjectMemoryService;
137
+ patrolPlanService: PatrolPlanService;
138
+ patrolRunService: PatrolRunService;
139
+ verificationRunService: VerificationRunService;
140
+ patrolScheduler: PatrolScheduler;
141
+ butlerSessionSummaryService: ButlerSessionSummaryService;
142
+ sessionSummaryScheduler: SessionSummaryScheduler;
143
+ butlerFollowUpScheduler: ButlerFollowUpScheduler;
83
144
  workspacePanelSnapshotService: WorkspacePanelSnapshotService;
84
145
  fileTreeService: FileTreeService;
85
146
  fileSearchService: FileSearchService;
@@ -5,6 +5,31 @@ import { AuthController } from "../modules/auth/auth-controller.js";
5
5
  import { AuthService } from "../modules/auth/auth-service.js";
6
6
  import { BootstrapController } from "../modules/bootstrap/bootstrap-controller.js";
7
7
  import { BootstrapService } from "../modules/bootstrap/bootstrap-service.js";
8
+ import { ButlerControlSessionService } from "../modules/butler/butler-control-session-service.js";
9
+ import { ButlerControlActionService } from "../modules/butler/butler-control-action-service.js";
10
+ import { ButlerController } from "../modules/butler/butler-controller.js";
11
+ import { ButlerActionContextService } from "../modules/butler/butler-action-context-service.js";
12
+ import { ButlerContextAggregator } from "../modules/butler/context-aggregator.js";
13
+ import { ButlerAuthService } from "../modules/butler/butler-auth-service.js";
14
+ import { ButlerFollowUpEvaluationInstructionAdapter } from "../modules/butler/butler-follow-up-evaluation-instruction-adapter.js";
15
+ import { ButlerFollowUpScheduler } from "../modules/butler/butler-follow-up-scheduler.js";
16
+ import { ButlerFollowUpService } from "../modules/butler/butler-follow-up-service.js";
17
+ import { ButlerInboxService } from "../modules/butler/butler-inbox-service.js";
18
+ import { ButlerNotificationService } from "../modules/butler/butler-notification-service.js";
19
+ import { ButlerProfileService } from "../modules/butler/butler-profile-service.js";
20
+ import { ButlerProjectService } from "../modules/butler/butler-project-service.js";
21
+ import { ButlerSessionService } from "../modules/butler/butler-session-service.js";
22
+ import { ButlerSessionSummaryService } from "../modules/butler/butler-session-summary-service.js";
23
+ import { InstructionAdapter } from "../modules/butler/instruction-adapter.js";
24
+ import { PatrolPlanService } from "../modules/butler/patrol-plan-service.js";
25
+ import { PatrolExecutionService } from "../modules/butler/patrol-execution-service.js";
26
+ import { ProviderAdapterRegistry, RuntimePatrolProviderAdapter } from "../modules/butler/provider-adapter-registry.js";
27
+ import { PatrolRunService } from "../modules/butler/patrol-run-service.js";
28
+ import { PatrolScheduler } from "../modules/butler/patrol-scheduler.js";
29
+ import { ProjectMemoryService } from "../modules/butler/project-memory-service.js";
30
+ import { SessionSummaryInstructionAdapter } from "../modules/butler/session-summary-instruction-adapter.js";
31
+ import { SessionSummaryScheduler } from "../modules/butler/session-summary-scheduler.js";
32
+ import { VerificationRunService } from "../modules/butler/verification-run-service.js";
8
33
  import { ClientController } from "../modules/client/client-controller.js";
9
34
  import { ClientService } from "../modules/client/client-service.js";
10
35
  import { FileAccessGuard } from "../modules/file/file-access-guard.js";
@@ -48,6 +73,7 @@ import { WorkspaceFileWatcher } from "../modules/workbench/workspace-file-watche
48
73
  import { WorkspaceController } from "../modules/workspace/workspace-controller.js";
49
74
  import { WorkspaceService } from "../modules/workspace/workspace-service.js";
50
75
  import { registerAuthRoutes } from "../routes/auth.js";
76
+ import { registerButlerRoutes } from "../routes/butler.js";
51
77
  import { registerClientRoutes } from "../routes/client.js";
52
78
  import { registerFileRoutes } from "../routes/files.js";
53
79
  import { registerGitRoutes } from "../routes/git.js";
@@ -60,18 +86,34 @@ import { registerSessionRoutes } from "../routes/sessions.js";
60
86
  import { registerTerminalRoutes } from "../routes/terminals.js";
61
87
  import { registerWorkbenchRoutes } from "../routes/workbench.js";
62
88
  import { registerWorkspaceRoutes } from "../routes/workspaces.js";
89
+ import { DemoCleanupService, DemoOnlineTracker } from "../modules/demo/demo-cleanup-service.js";
63
90
  import { setErrorHandler } from "../shared/http/error-handler.js";
64
91
  import { startTerminalDebugEventLoopLagMonitor } from "../shared/utils/terminal-debug-log.js";
65
92
  import { AuthTokenRepository } from "../storage/repositories/auth-token-repository.js";
66
93
  import { AuthUserRepository } from "../storage/repositories/auth-user-repository.js";
67
94
  import { BootstrapStateRepository } from "../storage/repositories/bootstrap-state-repository.js";
95
+ import { ButlerControlSessionRepository } from "../storage/repositories/butler-control-session-repository.js";
96
+ import { ButlerControlEventRepository } from "../storage/repositories/butler-control-event-repository.js";
97
+ import { ButlerFollowUpTaskRepository } from "../storage/repositories/butler-follow-up-task-repository.js";
98
+ import { ButlerInboxItemRepository } from "../storage/repositories/butler-inbox-item-repository.js";
99
+ import { ButlerNotificationArchiveRepository } from "../storage/repositories/butler-notification-archive-repository.js";
100
+ import { ButlerProfileRepository } from "../storage/repositories/butler-profile-repository.js";
101
+ import { ButlerProjectRepository } from "../storage/repositories/butler-project-repository.js";
102
+ import { ButlerSessionRepository } from "../storage/repositories/butler-session-repository.js";
103
+ import { ButlerSessionSummaryStateRepository } from "../storage/repositories/butler-session-summary-state-repository.js";
104
+ import { PatrolPlanRepository } from "../storage/repositories/patrol-plan-repository.js";
105
+ import { PatrolRunRepository } from "../storage/repositories/patrol-run-repository.js";
106
+ import { ProjectMemoryRepository } from "../storage/repositories/project-memory-repository.js";
107
+ import { VerificationRunRepository } from "../storage/repositories/verification-run-repository.js";
68
108
  import { CommitRuleProfileRepository } from "../storage/repositories/commit-rule-profile-repository.js";
69
109
  import { FileContextBindingRepository } from "../storage/repositories/file-context-binding-repository.js";
70
110
  import { RecentFileRepository } from "../storage/repositories/recent-file-repository.js";
71
111
  import { SessionBindingRepository } from "../storage/repositories/session-binding-repository.js";
72
112
  import { SessionChangedFileRepository } from "../storage/repositories/session-changed-file-repository.js";
73
113
  import { SessionIndexRepository } from "../storage/repositories/session-index-repository.js";
114
+ import { SessionCheckpointRepository } from "../storage/repositories/session-checkpoint-repository.js";
74
115
  import { SessionMessageAttachmentRepository } from "../storage/repositories/session-message-attachment-repository.js";
116
+ import { SessionMessageOriginRepository } from "../storage/repositories/session-message-origin-repository.js";
75
117
  import { SessionSendQueueRepository } from "../storage/repositories/session-send-queue-repository.js";
76
118
  import { SessionStateRepository } from "../storage/repositories/session-state-repository.js";
77
119
  import { SessionStatusSnapshotRepository } from "../storage/repositories/session-status-snapshot-repository.js";
@@ -90,6 +132,10 @@ import { createWsServer } from "../ws/ws-server.js";
90
132
  import { WsAuthGuard } from "../ws/ws-auth-guard.js";
91
133
  import { registerStaticWebRoutes } from "./static-web.js";
92
134
  export function createServer(config) {
135
+ // Demo 模式下覆盖 token TTL 为 15 分钟
136
+ const effectiveConfig = config.demoMode
137
+ ? { ...config, accessTokenTtlSeconds: 900, refreshTokenTtlSeconds: 900 }
138
+ : config;
93
139
  const app = Fastify({
94
140
  logger: false
95
141
  });
@@ -100,13 +146,28 @@ export function createServer(config) {
100
146
  authUserRepository: new AuthUserRepository(database.db),
101
147
  authTokenRepository: new AuthTokenRepository(database.db),
102
148
  workspaceRepository: new WorkspaceRepository(database.db),
149
+ butlerControlSessionRepository: new ButlerControlSessionRepository(database.db),
150
+ butlerControlEventRepository: new ButlerControlEventRepository(database.db),
151
+ butlerFollowUpTaskRepository: new ButlerFollowUpTaskRepository(database.db),
152
+ butlerInboxItemRepository: new ButlerInboxItemRepository(database.db),
153
+ butlerNotificationArchiveRepository: new ButlerNotificationArchiveRepository(database.db),
154
+ butlerProfileRepository: new ButlerProfileRepository(database.db),
155
+ butlerProjectRepository: new ButlerProjectRepository(database.db),
156
+ butlerSessionRepository: new ButlerSessionRepository(database.db),
157
+ butlerSessionSummaryStateRepository: new ButlerSessionSummaryStateRepository(database.db),
158
+ projectMemoryRepository: new ProjectMemoryRepository(database.db),
159
+ patrolPlanRepository: new PatrolPlanRepository(database.db),
160
+ patrolRunRepository: new PatrolRunRepository(database.db),
161
+ verificationRunRepository: new VerificationRunRepository(database.db),
103
162
  commitRuleProfileRepository: new CommitRuleProfileRepository(database.db),
104
163
  recentFileRepository: new RecentFileRepository(database.db),
105
164
  fileContextBindingRepository: new FileContextBindingRepository(database.db),
106
165
  sessionBindingRepository: new SessionBindingRepository(database.db),
107
166
  sessionChangedFileRepository: new SessionChangedFileRepository(database.db),
167
+ sessionCheckpointRepository: new SessionCheckpointRepository(database.db),
108
168
  sessionIndexRepository: new SessionIndexRepository(database.db),
109
169
  sessionMessageAttachmentRepository: new SessionMessageAttachmentRepository(database.db),
170
+ sessionMessageOriginRepository: new SessionMessageOriginRepository(database.db),
110
171
  sessionSendQueueRepository: new SessionSendQueueRepository(database.db),
111
172
  sessionStateRepository: new SessionStateRepository(database.db),
112
173
  sessionStatusSnapshotRepository: new SessionStatusSnapshotRepository(database.db),
@@ -118,9 +179,19 @@ export function createServer(config) {
118
179
  terminalRuntimeSessionRepository: new TerminalRuntimeSessionRepository(database.db),
119
180
  terminalCommandTemplateRepository: new TerminalCommandTemplateRepository(database.db)
120
181
  };
121
- const bootstrapService = new BootstrapService(database.db, repositories.bootstrapStateRepository, repositories.authUserRepository);
182
+ const bootstrapService = new BootstrapService(database.db, repositories.bootstrapStateRepository, repositories.authUserRepository, config.demoMode);
122
183
  const clientService = new ClientService(config);
123
- const authService = new AuthService(repositories.bootstrapStateRepository, repositories.authUserRepository, repositories.authTokenRepository, config);
184
+ // Demo 模式服务
185
+ const demoCleanupService = config.demoMode
186
+ ? new DemoCleanupService(database.db, config.databasePath)
187
+ : undefined;
188
+ const demoOnlineTracker = config.demoMode
189
+ ? new DemoOnlineTracker()
190
+ : undefined;
191
+ const demoServices = (demoCleanupService && demoOnlineTracker)
192
+ ? { cleanupService: demoCleanupService, onlineTracker: demoOnlineTracker }
193
+ : undefined;
194
+ const authService = new AuthService(repositories.bootstrapStateRepository, repositories.authUserRepository, repositories.authTokenRepository, effectiveConfig, demoServices);
124
195
  const gitCommandRunner = new GitCommandRunner({
125
196
  preferHelperProcess: !process.env.VITEST
126
197
  });
@@ -144,9 +215,69 @@ export function createServer(config) {
144
215
  const sessionMessageAttachmentService = new SessionMessageAttachmentService(repositories.sessionMessageAttachmentRepository, config);
145
216
  const sessionChangedFileService = new SessionChangedFileService(repositories.sessionChangedFileRepository);
146
217
  const sessionActivityAuthorityService = new SessionActivityAuthorityService();
147
- const sessionHistoryService = new SessionHistoryService(database.db, repositories.workspaceRepository, repositories.sessionBindingRepository, sessionChangedFileService, repositories.sessionIndexRepository, sessionMessageAttachmentService, repositories.sessionStateRepository, repositories.sessionStatusSnapshotRepository, config, sessionActivityAuthorityService);
218
+ const sessionHistoryService = new SessionHistoryService(database.db, repositories.workspaceRepository, repositories.sessionBindingRepository, sessionChangedFileService, repositories.sessionIndexRepository, sessionMessageAttachmentService, repositories.sessionStateRepository, repositories.sessionStatusSnapshotRepository, config, sessionActivityAuthorityService, repositories.sessionMessageOriginRepository);
148
219
  const sessionLiveRuntimeService = new SessionLiveRuntimeService(sessionHistoryService, sessionMessageAttachmentService, workspaceService, sessionChangedFileService, repositories.sessionBindingRepository, repositories.authUserRepository, repositories.sessionSendQueueRepository, repositories.sessionIndexRepository, repositories.sessionStateRepository, repositories.sessionStatusSnapshotRepository, config, sessionActivityAuthorityService);
149
- const workbenchService = new WorkbenchService(repositories.workspaceRepository, sessionHistoryService);
220
+ const butlerProfileService = new ButlerProfileService(repositories.butlerProfileRepository, repositories.butlerProjectRepository, path.dirname(config.databasePath));
221
+ const butlerRuntimeRootDir = path.join(path.dirname(config.databasePath), "butler-runtime");
222
+ const butlerRuntimeConfig = {
223
+ ...config,
224
+ codexHomeDir: path.join(butlerRuntimeRootDir, "codex-home"),
225
+ claudeCodeHomeDir: path.join(butlerRuntimeRootDir, "claude-home")
226
+ };
227
+ const butlerSummaryRuntimeConfig = {
228
+ ...config,
229
+ codexHomeDir: path.join(butlerRuntimeRootDir, "summary-codex-home"),
230
+ claudeCodeHomeDir: path.join(butlerRuntimeRootDir, "summary-claude-home")
231
+ };
232
+ const butlerFollowUpRuntimeConfig = {
233
+ ...config,
234
+ codexHomeDir: path.join(butlerRuntimeRootDir, "follow-up-codex-home"),
235
+ claudeCodeHomeDir: path.join(butlerRuntimeRootDir, "follow-up-claude-home")
236
+ };
237
+ const butlerSessionLiveRuntimeService = new SessionLiveRuntimeService(sessionHistoryService, sessionMessageAttachmentService, workspaceService, sessionChangedFileService, repositories.sessionBindingRepository, repositories.authUserRepository, repositories.sessionSendQueueRepository, repositories.sessionIndexRepository, repositories.sessionStateRepository, repositories.sessionStatusSnapshotRepository, butlerRuntimeConfig, sessionActivityAuthorityService);
238
+ const butlerSummarySessionLiveRuntimeService = new SessionLiveRuntimeService(sessionHistoryService, sessionMessageAttachmentService, workspaceService, sessionChangedFileService, repositories.sessionBindingRepository, repositories.authUserRepository, repositories.sessionSendQueueRepository, repositories.sessionIndexRepository, repositories.sessionStateRepository, repositories.sessionStatusSnapshotRepository, butlerSummaryRuntimeConfig, sessionActivityAuthorityService);
239
+ const butlerFollowUpSessionLiveRuntimeService = new SessionLiveRuntimeService(sessionHistoryService, sessionMessageAttachmentService, workspaceService, sessionChangedFileService, repositories.sessionBindingRepository, repositories.authUserRepository, repositories.sessionSendQueueRepository, repositories.sessionIndexRepository, repositories.sessionStateRepository, repositories.sessionStatusSnapshotRepository, butlerFollowUpRuntimeConfig, sessionActivityAuthorityService);
240
+ const workbenchService = new WorkbenchService(repositories.workspaceRepository, sessionHistoryService, butlerProfileService, repositories.butlerControlSessionRepository);
241
+ const butlerProjectService = new ButlerProjectService(repositories.butlerProjectRepository, repositories.butlerSessionRepository, repositories.workspaceRepository, butlerProfileService);
242
+ const butlerInboxService = new ButlerInboxService(repositories.butlerProjectRepository, repositories.butlerInboxItemRepository);
243
+ const butlerNotificationService = new ButlerNotificationService(repositories.butlerNotificationArchiveRepository);
244
+ const butlerSessionService = new ButlerSessionService(repositories.butlerProjectRepository, repositories.butlerSessionRepository, repositories.sessionCheckpointRepository, repositories.sessionBindingRepository, repositories.sessionIndexRepository, repositories.sessionStateRepository, sessionLiveRuntimeService, sessionHistoryService);
245
+ const projectMemoryService = new ProjectMemoryService(repositories.butlerProjectRepository, repositories.projectMemoryRepository);
246
+ const patrolPlanService = new PatrolPlanService(repositories.butlerProjectRepository, repositories.patrolPlanRepository);
247
+ const patrolRunService = new PatrolRunService(repositories.butlerProjectRepository, repositories.patrolPlanRepository, repositories.patrolRunRepository);
248
+ const instructionAdapter = new InstructionAdapter();
249
+ const providerAdapterRegistry = new ProviderAdapterRegistry([
250
+ new RuntimePatrolProviderAdapter("codex", sessionLiveRuntimeService, sessionHistoryService),
251
+ new RuntimePatrolProviderAdapter("claude-code", sessionLiveRuntimeService, sessionHistoryService)
252
+ ]);
253
+ const summaryProviderAdapterRegistry = new ProviderAdapterRegistry([
254
+ new RuntimePatrolProviderAdapter("codex", butlerSummarySessionLiveRuntimeService, sessionHistoryService),
255
+ new RuntimePatrolProviderAdapter("claude-code", butlerSummarySessionLiveRuntimeService, sessionHistoryService)
256
+ ]);
257
+ const followUpProviderAdapterRegistry = new ProviderAdapterRegistry([
258
+ new RuntimePatrolProviderAdapter("codex", butlerFollowUpSessionLiveRuntimeService, sessionHistoryService),
259
+ new RuntimePatrolProviderAdapter("claude-code", butlerFollowUpSessionLiveRuntimeService, sessionHistoryService)
260
+ ]);
261
+ const patrolExecutionService = new PatrolExecutionService(repositories.butlerProjectRepository, repositories.butlerSessionRepository, repositories.sessionCheckpointRepository, repositories.patrolPlanRepository, patrolRunService, repositories.projectMemoryRepository, repositories.sessionChangedFileRepository, repositories.authUserRepository, providerAdapterRegistry, instructionAdapter);
262
+ const patrolScheduler = new PatrolScheduler(patrolPlanService, patrolRunService, patrolExecutionService);
263
+ const sessionSummaryInstructionAdapter = new SessionSummaryInstructionAdapter();
264
+ const butlerFollowUpEvaluationInstructionAdapter = new ButlerFollowUpEvaluationInstructionAdapter();
265
+ const verificationRunService = new VerificationRunService(repositories.butlerProjectRepository, repositories.butlerSessionRepository, repositories.sessionCheckpointRepository, repositories.verificationRunRepository);
266
+ const butlerContextAggregator = new ButlerContextAggregator(butlerProfileService, butlerProjectService, butlerSessionService, butlerInboxService, projectMemoryService, patrolRunService, verificationRunService, repositories.sessionCheckpointRepository);
267
+ const butlerAuthService = new ButlerAuthService(repositories.authTokenRepository, config);
268
+ const butlerSessionSummaryService = new ButlerSessionSummaryService(butlerProfileService, butlerProjectService, butlerSessionService, repositories.butlerSessionRepository, repositories.butlerSessionSummaryStateRepository, repositories.sessionCheckpointRepository, repositories.sessionIndexRepository, repositories.authUserRepository, workspaceService, sessionHistoryService, summaryProviderAdapterRegistry, sessionSummaryInstructionAdapter, {
269
+ summaryCodexHomeDir: butlerSummaryRuntimeConfig.codexHomeDir,
270
+ sourceCodexHomeDir: config.codexHomeDir
271
+ });
272
+ const butlerFollowUpService = new ButlerFollowUpService(butlerProfileService, butlerProjectService, butlerSessionService, repositories.butlerFollowUpTaskRepository, sessionHistoryService, repositories.sessionIndexRepository, sessionLiveRuntimeService, workspaceService, followUpProviderAdapterRegistry, butlerFollowUpEvaluationInstructionAdapter, butlerFollowUpRuntimeConfig.codexHomeDir, config.codexHomeDir, repositories.sessionMessageOriginRepository);
273
+ const butlerActionContextService = new ButlerActionContextService(butlerProjectService, butlerSessionService, butlerFollowUpService);
274
+ const sessionSummaryScheduler = new SessionSummaryScheduler(butlerSessionSummaryService);
275
+ const butlerFollowUpScheduler = new ButlerFollowUpScheduler(butlerFollowUpService);
276
+ const butlerFollowUpTerminalSubscription = sessionLiveRuntimeService.registerTerminalStateListener(async (event) => {
277
+ await butlerFollowUpService.handleSessionTerminal(event.sessionId, event.timestamp);
278
+ });
279
+ const butlerControlSessionService = new ButlerControlSessionService(butlerProfileService, repositories.butlerControlSessionRepository, workspaceService, sessionHistoryService, butlerSessionLiveRuntimeService, butlerContextAggregator, butlerAuthService, butlerRuntimeConfig.codexHomeDir, config.codexHomeDir);
280
+ const butlerControlActionService = new ButlerControlActionService(butlerProfileService, repositories.butlerControlSessionRepository, repositories.butlerControlEventRepository, butlerProjectService, butlerSessionService, patrolRunService, patrolExecutionService, verificationRunService, butlerContextAggregator);
150
281
  const fileContextService = new FileContextService(sessionHistoryService, repositories.fileContextBindingRepository);
151
282
  const terminalService = new TerminalService(database.db, repositories.terminalInstanceRepository, repositories.terminalRuntimeSessionRepository, workspaceService, config.terminalIdleTimeoutSeconds, {
152
283
  terminalLogRootDir: path.join(path.dirname(config.databasePath), "terminal-logs"),
@@ -162,7 +293,8 @@ export function createServer(config) {
162
293
  const authController = new AuthController(authService);
163
294
  const workspaceController = new WorkspaceController(workspaceService);
164
295
  const workbenchController = new WorkbenchController(workbenchService);
165
- const sessionController = new SessionController(sessionHistoryService, sessionLiveRuntimeService);
296
+ const butlerController = new ButlerController(butlerProfileService, butlerControlSessionService, butlerControlActionService, butlerContextAggregator, butlerFollowUpService, butlerInboxService, butlerNotificationService, butlerProjectService, butlerSessionService, projectMemoryService, patrolPlanService, patrolRunService, patrolExecutionService, verificationRunService, butlerActionContextService);
297
+ const sessionController = new SessionController(sessionHistoryService, sessionLiveRuntimeService, repositories.butlerControlSessionRepository);
166
298
  const providerController = new ProviderController(sessionHistoryService, sessionLiveRuntimeService, config);
167
299
  const quickPhraseController = new QuickPhraseController(quickPhraseService);
168
300
  const profileController = new ProfileController(preferenceProfileService);
@@ -170,12 +302,12 @@ export function createServer(config) {
170
302
  const fileContextController = new FileContextController(fileContentService, fileContextService);
171
303
  const gitController = new GitController(gitReadService, gitWriteService, commitOrchestrator);
172
304
  const terminalController = new TerminalController(terminalService, commandTemplateService);
173
- const wsHandle = createWsServer(app.server, new WsAuthGuard(authService), sessionHistoryService, sessionLiveRuntimeService, new TerminalWsHub(terminalService), new WorkbenchWsHub(workbenchService, workspacePanelSnapshotService, fileWatcher));
305
+ const wsHandle = createWsServer(app.server, new WsAuthGuard(authService), sessionHistoryService, sessionLiveRuntimeService, new TerminalWsHub(terminalService), new WorkbenchWsHub(workbenchService, workspacePanelSnapshotService, fileWatcher), butlerActionContextService);
174
306
  app.server.on("upgrade", (request, socket, head) => {
175
307
  templateReverseProxyService.handleWebSocketUpgrade(request, socket, head);
176
308
  });
177
309
  app.addHook("onRequest", async (request, reply) => {
178
- applyCorsHeaders(request.headers.origin, reply);
310
+ applyCorsHeaders(request.headers.origin, reply, config.demoMode);
179
311
  if (request.method === "OPTIONS") {
180
312
  reply.code(204).send();
181
313
  return reply;
@@ -183,12 +315,20 @@ export function createServer(config) {
183
315
  });
184
316
  app.addHook("onRequest", createAuthGuard(authService));
185
317
  app.setErrorHandler(setErrorHandler);
318
+ // Demo 模式:自动创建演示用户
319
+ if (config.demoMode) {
320
+ const status = bootstrapService.getStatus();
321
+ if (!status.initialized) {
322
+ bootstrapService.setup({ username: "demo", password: "codingns" });
323
+ }
324
+ }
186
325
  void registerPublicRoutes(app, bootstrapController);
187
326
  void registerProxyRoutes(app, templateReverseProxyService);
188
327
  void registerAuthRoutes(app, authController);
189
328
  void registerClientRoutes(app, clientController);
190
329
  void registerWorkspaceRoutes(app, workspaceController);
191
330
  void registerWorkbenchRoutes(app, workbenchController);
331
+ void registerButlerRoutes(app, butlerController);
192
332
  void registerSessionRoutes(app, sessionController);
193
333
  void registerPreferenceRoutes(app, quickPhraseController, profileController);
194
334
  void registerFileRoutes(app, fileController);
@@ -196,12 +336,22 @@ export function createServer(config) {
196
336
  void registerTerminalRoutes(app, terminalController);
197
337
  void registerProviderRoutes(app, providerController);
198
338
  void registerGitRoutes(app, gitController);
339
+ patrolScheduler.start();
340
+ sessionSummaryScheduler.start();
341
+ butlerFollowUpScheduler.start();
199
342
  if (config.webUiDir) {
200
343
  registerStaticWebRoutes(app, config.webUiDir);
201
344
  }
202
345
  app.addHook("onClose", async () => {
203
346
  stopTerminalDebugEventLoopLagMonitor();
347
+ butlerFollowUpTerminalSubscription.close();
348
+ await patrolScheduler.dispose();
349
+ await sessionSummaryScheduler.dispose();
350
+ await butlerFollowUpScheduler.dispose();
204
351
  await terminalService.dispose();
352
+ await butlerFollowUpSessionLiveRuntimeService.dispose();
353
+ await butlerSummarySessionLiveRuntimeService.dispose();
354
+ await butlerSessionLiveRuntimeService.dispose();
205
355
  await sessionLiveRuntimeService.dispose();
206
356
  await wsHandle.close();
207
357
  gitCommandRunner.dispose();
@@ -219,6 +369,22 @@ export function createServer(config) {
219
369
  authService,
220
370
  workspaceService,
221
371
  workbenchService,
372
+ butlerProfileService,
373
+ butlerSessionLiveRuntimeService,
374
+ butlerControlSessionService,
375
+ butlerControlActionService,
376
+ butlerFollowUpService,
377
+ butlerActionContextService,
378
+ butlerProjectService,
379
+ butlerSessionService,
380
+ projectMemoryService,
381
+ patrolPlanService,
382
+ patrolRunService,
383
+ verificationRunService,
384
+ patrolScheduler,
385
+ butlerSessionSummaryService,
386
+ sessionSummaryScheduler,
387
+ butlerFollowUpScheduler,
222
388
  workspacePanelSnapshotService,
223
389
  fileTreeService,
224
390
  fileSearchService,
@@ -242,8 +408,8 @@ export function createServer(config) {
242
408
  startWs: () => wsHandle
243
409
  };
244
410
  }
245
- function applyCorsHeaders(origin, reply) {
246
- const allowedOrigin = resolveAllowedCorsOrigin(origin);
411
+ function applyCorsHeaders(origin, reply, demoMode) {
412
+ const allowedOrigin = resolveAllowedCorsOrigin(origin, demoMode);
247
413
  if (!allowedOrigin) {
248
414
  return;
249
415
  }
@@ -253,10 +419,14 @@ function applyCorsHeaders(origin, reply) {
253
419
  reply.header("Access-Control-Allow-Headers", "Authorization, Content-Type");
254
420
  reply.header("Access-Control-Allow-Methods", "GET,POST,PUT,PATCH,DELETE,OPTIONS");
255
421
  }
256
- function resolveAllowedCorsOrigin(origin) {
422
+ function resolveAllowedCorsOrigin(origin, demoMode) {
257
423
  if (!origin) {
258
424
  return null;
259
425
  }
426
+ // Demo 模式:放行所有来源
427
+ if (demoMode) {
428
+ return origin;
429
+ }
260
430
  try {
261
431
  const parsed = new URL(origin);
262
432
  const hostname = parsed.hostname.toLowerCase();