@jingyi0605/codingns 0.1.4 → 0.2.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 (239) hide show
  1. package/dist/public/assets/{TerminalPage-4ulgBhv9.js → TerminalPage-BlbQuWi1.js} +1 -1
  2. package/dist/public/assets/gemini-D4G1NbrE.png +0 -0
  3. package/dist/public/assets/index-1VIm8lVL.css +1 -0
  4. package/dist/public/assets/index-Dti93O2S.js +109 -0
  5. package/dist/public/assets/kimi-BWNNSh7e.png +0 -0
  6. package/dist/public/index.html +2 -2
  7. package/dist/server/config/env.d.ts +7 -0
  8. package/dist/server/config/env.js +150 -1
  9. package/dist/server/config/env.js.map +1 -1
  10. package/dist/server/config/opencode-system-probe-helper-process.d.ts +24 -0
  11. package/dist/server/config/opencode-system-probe-helper-process.js +70 -5
  12. package/dist/server/config/opencode-system-probe-helper-process.js.map +1 -1
  13. package/dist/server/modules/butler/butler-action-context-service.d.ts +30 -0
  14. package/dist/server/modules/butler/butler-action-context-service.js +108 -0
  15. package/dist/server/modules/butler/butler-action-context-service.js.map +1 -0
  16. package/dist/server/modules/butler/butler-auth-service.d.ts +17 -0
  17. package/dist/server/modules/butler/butler-auth-service.js +91 -0
  18. package/dist/server/modules/butler/butler-auth-service.js.map +1 -0
  19. package/dist/server/modules/butler/butler-control-action-service.d.ts +65 -0
  20. package/dist/server/modules/butler/butler-control-action-service.js +296 -0
  21. package/dist/server/modules/butler/butler-control-action-service.js.map +1 -0
  22. package/dist/server/modules/butler/butler-control-session-service.d.ts +55 -0
  23. package/dist/server/modules/butler/butler-control-session-service.js +367 -0
  24. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -0
  25. package/dist/server/modules/butler/butler-controller.d.ts +367 -0
  26. package/dist/server/modules/butler/butler-controller.js +475 -0
  27. package/dist/server/modules/butler/butler-controller.js.map +1 -0
  28. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.d.ts +34 -0
  29. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js +77 -0
  30. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js.map +1 -0
  31. package/dist/server/modules/butler/butler-follow-up-scheduler.d.ts +23 -0
  32. package/dist/server/modules/butler/butler-follow-up-scheduler.js +57 -0
  33. package/dist/server/modules/butler/butler-follow-up-scheduler.js.map +1 -0
  34. package/dist/server/modules/butler/butler-follow-up-service.d.ts +86 -0
  35. package/dist/server/modules/butler/butler-follow-up-service.js +948 -0
  36. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -0
  37. package/dist/server/modules/butler/butler-inbox-service.d.ts +35 -0
  38. package/dist/server/modules/butler/butler-inbox-service.js +136 -0
  39. package/dist/server/modules/butler/butler-inbox-service.js.map +1 -0
  40. package/dist/server/modules/butler/butler-notification-service.d.ts +12 -0
  41. package/dist/server/modules/butler/butler-notification-service.js +45 -0
  42. package/dist/server/modules/butler/butler-notification-service.js.map +1 -0
  43. package/dist/server/modules/butler/butler-profile-service.d.ts +26 -0
  44. package/dist/server/modules/butler/butler-profile-service.js +529 -0
  45. package/dist/server/modules/butler/butler-profile-service.js.map +1 -0
  46. package/dist/server/modules/butler/butler-project-service.d.ts +48 -0
  47. package/dist/server/modules/butler/butler-project-service.js +253 -0
  48. package/dist/server/modules/butler/butler-project-service.js.map +1 -0
  49. package/dist/server/modules/butler/butler-session-service.d.ts +79 -0
  50. package/dist/server/modules/butler/butler-session-service.js +503 -0
  51. package/dist/server/modules/butler/butler-session-service.js.map +1 -0
  52. package/dist/server/modules/butler/butler-session-summary-service.d.ts +55 -0
  53. package/dist/server/modules/butler/butler-session-summary-service.js +382 -0
  54. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -0
  55. package/dist/server/modules/butler/context-aggregator.d.ts +187 -0
  56. package/dist/server/modules/butler/context-aggregator.js +807 -0
  57. package/dist/server/modules/butler/context-aggregator.js.map +1 -0
  58. package/dist/server/modules/butler/instruction-adapter.d.ts +28 -0
  59. package/dist/server/modules/butler/instruction-adapter.js +101 -0
  60. package/dist/server/modules/butler/instruction-adapter.js.map +1 -0
  61. package/dist/server/modules/butler/patrol-execution-service.d.ts +47 -0
  62. package/dist/server/modules/butler/patrol-execution-service.js +347 -0
  63. package/dist/server/modules/butler/patrol-execution-service.js.map +1 -0
  64. package/dist/server/modules/butler/patrol-plan-service.d.ts +54 -0
  65. package/dist/server/modules/butler/patrol-plan-service.js +272 -0
  66. package/dist/server/modules/butler/patrol-plan-service.js.map +1 -0
  67. package/dist/server/modules/butler/patrol-run-service.d.ts +60 -0
  68. package/dist/server/modules/butler/patrol-run-service.js +185 -0
  69. package/dist/server/modules/butler/patrol-run-service.js.map +1 -0
  70. package/dist/server/modules/butler/patrol-scheduler.d.ts +36 -0
  71. package/dist/server/modules/butler/patrol-scheduler.js +99 -0
  72. package/dist/server/modules/butler/patrol-scheduler.js.map +1 -0
  73. package/dist/server/modules/butler/project-memory-service.d.ts +30 -0
  74. package/dist/server/modules/butler/project-memory-service.js +103 -0
  75. package/dist/server/modules/butler/project-memory-service.js.map +1 -0
  76. package/dist/server/modules/butler/provider-adapter-registry.d.ts +61 -0
  77. package/dist/server/modules/butler/provider-adapter-registry.js +430 -0
  78. package/dist/server/modules/butler/provider-adapter-registry.js.map +1 -0
  79. package/dist/server/modules/butler/session-summary-instruction-adapter.d.ts +28 -0
  80. package/dist/server/modules/butler/session-summary-instruction-adapter.js +79 -0
  81. package/dist/server/modules/butler/session-summary-instruction-adapter.js.map +1 -0
  82. package/dist/server/modules/butler/session-summary-scheduler.d.ts +23 -0
  83. package/dist/server/modules/butler/session-summary-scheduler.js +57 -0
  84. package/dist/server/modules/butler/session-summary-scheduler.js.map +1 -0
  85. package/dist/server/modules/butler/verification-run-service.d.ts +73 -0
  86. package/dist/server/modules/butler/verification-run-service.js +633 -0
  87. package/dist/server/modules/butler/verification-run-service.js.map +1 -0
  88. package/dist/server/modules/file/file-controller.d.ts +12 -1
  89. package/dist/server/modules/file/file-controller.js +72 -1
  90. package/dist/server/modules/file/file-controller.js.map +1 -1
  91. package/dist/server/modules/file/file-preview-link-service.d.ts +22 -0
  92. package/dist/server/modules/file/file-preview-link-service.js +160 -0
  93. package/dist/server/modules/file/file-preview-link-service.js.map +1 -0
  94. package/dist/server/modules/preferences/profile-service.js +8 -2
  95. package/dist/server/modules/preferences/profile-service.js.map +1 -1
  96. package/dist/server/modules/sessions/claude-runtime-helper-process.js +1 -1
  97. package/dist/server/modules/sessions/claude-runtime-helper-process.js.map +1 -1
  98. package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +7 -2
  99. package/dist/server/modules/sessions/codex-app-server-helper-client.js +113 -2
  100. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
  101. package/dist/server/modules/sessions/codex-app-server-helper-process.js +106 -1
  102. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  103. package/dist/server/modules/sessions/session-controller.d.ts +24 -1
  104. package/dist/server/modules/sessions/session-controller.js +34 -3
  105. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  106. package/dist/server/modules/sessions/session-history-service.d.ts +47 -2
  107. package/dist/server/modules/sessions/session-history-service.js +881 -56
  108. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  109. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +30 -2
  110. package/dist/server/modules/sessions/session-live-runtime-service.js +584 -159
  111. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  112. package/dist/server/modules/sessions/session-provider-error-mapper.js +94 -0
  113. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  114. package/dist/server/modules/workbench/workbench-service.d.ts +7 -1
  115. package/dist/server/modules/workbench/workbench-service.js +31 -7
  116. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  117. package/dist/server/routes/butler.d.ts +3 -0
  118. package/dist/server/routes/butler.js +54 -0
  119. package/dist/server/routes/butler.js.map +1 -0
  120. package/dist/server/routes/files.js +2 -0
  121. package/dist/server/routes/files.js.map +1 -1
  122. package/dist/server/routes/sessions.js +1 -0
  123. package/dist/server/routes/sessions.js.map +1 -1
  124. package/dist/server/server/create-server.d.ts +65 -0
  125. package/dist/server/server/create-server.js +154 -5
  126. package/dist/server/server/create-server.js.map +1 -1
  127. package/dist/server/shared/utils/command-availability.d.ts +1 -0
  128. package/dist/server/shared/utils/command-availability.js +83 -0
  129. package/dist/server/shared/utils/command-availability.js.map +1 -0
  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-fork-repository.d.ts +8 -0
  170. package/dist/server/storage/repositories/session-fork-repository.js +69 -0
  171. package/dist/server/storage/repositories/session-fork-repository.js.map +1 -0
  172. package/dist/server/storage/repositories/session-index-repository.js +40 -2
  173. package/dist/server/storage/repositories/session-index-repository.js.map +1 -1
  174. package/dist/server/storage/repositories/session-message-origin-repository.d.ts +10 -0
  175. package/dist/server/storage/repositories/session-message-origin-repository.js +93 -0
  176. package/dist/server/storage/repositories/session-message-origin-repository.js.map +1 -0
  177. package/dist/server/storage/repositories/verification-run-repository.d.ts +29 -0
  178. package/dist/server/storage/repositories/verification-run-repository.js +125 -0
  179. package/dist/server/storage/repositories/verification-run-repository.js.map +1 -0
  180. package/dist/server/storage/sqlite/client.js +146 -0
  181. package/dist/server/storage/sqlite/client.js.map +1 -1
  182. package/dist/server/storage/sqlite/schema.sql +354 -0
  183. package/dist/server/types/domain.d.ts +286 -2
  184. package/dist/server/ws/ws-server.d.ts +2 -1
  185. package/dist/server/ws/ws-server.js +2 -1
  186. package/dist/server/ws/ws-server.js.map +1 -1
  187. package/node_modules/@codingns/session-sync-core/dist/index.d.ts +4 -0
  188. package/node_modules/@codingns/session-sync-core/dist/index.js +4 -0
  189. package/node_modules/@codingns/session-sync-core/dist/index.js.map +1 -1
  190. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.d.ts +18 -0
  191. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.js +659 -0
  192. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.js.map +1 -0
  193. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.d.ts +11 -0
  194. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.js +72 -0
  195. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.js.map +1 -0
  196. package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +8 -0
  197. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +89 -0
  198. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -1
  199. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +6 -1
  200. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +228 -7
  201. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  202. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +26 -1
  203. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +499 -3
  204. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  205. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.d.ts +41 -0
  206. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +1175 -0
  207. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -0
  208. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.d.ts +29 -0
  209. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js +578 -0
  210. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js.map +1 -0
  211. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +5 -1
  212. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +271 -4
  213. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  214. package/node_modules/@codingns/session-sync-core/dist/providers/utils.d.ts +1 -0
  215. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +147 -19
  216. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -1
  217. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.d.ts +2 -0
  218. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +43 -5
  219. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
  220. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +12 -0
  221. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +442 -71
  222. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  223. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.d.ts +21 -0
  224. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js +537 -0
  225. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js.map +1 -0
  226. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.d.ts +38 -0
  227. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.js +911 -0
  228. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.js.map +1 -0
  229. package/node_modules/@codingns/session-sync-core/dist/services.d.ts +2 -1
  230. package/node_modules/@codingns/session-sync-core/dist/services.js +55 -8
  231. package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -1
  232. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.d.ts +6 -0
  233. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js +9 -0
  234. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js.map +1 -0
  235. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +27 -0
  236. package/node_modules/@codingns/session-sync-core/package.json +8 -0
  237. package/package.json +1 -1
  238. package/dist/public/assets/index-C5lu52cQ.css +0 -1
  239. package/dist/public/assets/index-WpdUo_Vs.js +0 -108
@@ -0,0 +1,503 @@
1
+ import { AppError } from "../../shared/errors/app-error.js";
2
+ import { createId } from "../../shared/utils/id.js";
3
+ import { nowIso } from "../../shared/utils/time.js";
4
+ export class ButlerSessionService {
5
+ butlerProjectRepository;
6
+ butlerSessionRepository;
7
+ sessionCheckpointRepository;
8
+ sessionBindingRepository;
9
+ sessionIndexRepository;
10
+ sessionStateRepository;
11
+ sessionLiveRuntimeService;
12
+ sessionHistoryService;
13
+ constructor(butlerProjectRepository, butlerSessionRepository, sessionCheckpointRepository, sessionBindingRepository, sessionIndexRepository, sessionStateRepository, sessionLiveRuntimeService, sessionHistoryService) {
14
+ this.butlerProjectRepository = butlerProjectRepository;
15
+ this.butlerSessionRepository = butlerSessionRepository;
16
+ this.sessionCheckpointRepository = sessionCheckpointRepository;
17
+ this.sessionBindingRepository = sessionBindingRepository;
18
+ this.sessionIndexRepository = sessionIndexRepository;
19
+ this.sessionStateRepository = sessionStateRepository;
20
+ this.sessionLiveRuntimeService = sessionLiveRuntimeService;
21
+ this.sessionHistoryService = sessionHistoryService;
22
+ }
23
+ async startSession(projectId, input, userId) {
24
+ const project = this.getProjectOrThrow(projectId);
25
+ if (!this.sessionLiveRuntimeService) {
26
+ throw new AppError({
27
+ statusCode: 500,
28
+ errorCode: "BUTLER_SESSION_START_UNAVAILABLE",
29
+ detail: "当前环境未启用 butler 会话创建能力"
30
+ });
31
+ }
32
+ const providerId = input.providerId ?? resolveProviderId(project.defaultProvider);
33
+ const content = input.content?.trim() || "请先梳理当前项目状态,并给出下一步建议。";
34
+ const launch = await this.sessionLiveRuntimeService.startLiveSession({
35
+ workspaceId: project.workspaceId,
36
+ userId,
37
+ provider: providerId,
38
+ content,
39
+ clientRequestId: null,
40
+ runtimeOptions: {
41
+ model: normalizeNullableText(input.model),
42
+ reasoningLevel: normalizeNullableText(input.reasoningLevel),
43
+ permissionMode: normalizeNullableText(input.permissionMode)
44
+ ?? (project.approvalMode === "readonly" ? "default" : "acceptEdits")
45
+ }
46
+ });
47
+ const timestamp = launch.acceptedAt;
48
+ const created = this.butlerSessionRepository.create({
49
+ id: createId(),
50
+ projectId: project.id,
51
+ sessionId: launch.sessionId,
52
+ role: input.role ?? "adhoc",
53
+ ownershipMode: input.ownershipMode ?? "managed",
54
+ status: "running",
55
+ lastSummary: `已创建并启动托管会话,provider=${providerId}`,
56
+ lastCheckpointAt: timestamp,
57
+ createdAt: timestamp,
58
+ updatedAt: timestamp
59
+ });
60
+ this.sessionCheckpointRepository.create({
61
+ id: createId(),
62
+ butlerSessionId: created.id,
63
+ checkpointSeq: this.sessionCheckpointRepository.getLatestSeq(created.id) + 1,
64
+ sourceKind: "manual",
65
+ progressState: "working",
66
+ summary: created.lastSummary ?? "已创建并启动托管会话",
67
+ riskFlags: [],
68
+ nextActions: ["等待会话执行后继续采集快照"],
69
+ capturedAt: timestamp
70
+ });
71
+ return {
72
+ id: created.id,
73
+ projectId: created.projectId,
74
+ sessionId: created.sessionId,
75
+ provider: providerId,
76
+ title: null,
77
+ isArchived: false,
78
+ role: created.role,
79
+ ownershipMode: created.ownershipMode,
80
+ status: created.status,
81
+ runningState: "running",
82
+ lastSummary: created.lastSummary,
83
+ lastCheckpointAt: created.lastCheckpointAt,
84
+ createdAt: created.createdAt,
85
+ updatedAt: created.updatedAt
86
+ };
87
+ }
88
+ listByProject(projectId, userId, options) {
89
+ const project = this.getProjectOrThrow(projectId);
90
+ const includeArchived = options?.includeArchived ?? false;
91
+ return this.butlerSessionRepository.listByProject(project.id).flatMap((record) => {
92
+ const binding = this.sessionBindingRepository.findBySessionId(record.sessionId);
93
+ const index = this.sessionIndexRepository.findIndexRecordBySessionId(record.sessionId);
94
+ const state = this.sessionStateRepository.findBySessionAndUser(record.sessionId, userId);
95
+ const isArchived = index?.isArchived ?? false;
96
+ if (!includeArchived && isArchived) {
97
+ return [];
98
+ }
99
+ return [{
100
+ id: record.id,
101
+ projectId: record.projectId,
102
+ sessionId: record.sessionId,
103
+ provider: binding?.provider ?? null,
104
+ title: index?.title ?? null,
105
+ isArchived,
106
+ role: record.role,
107
+ ownershipMode: record.ownershipMode,
108
+ status: record.status,
109
+ runningState: state?.runningState ?? null,
110
+ lastSummary: record.lastSummary,
111
+ lastCheckpointAt: record.lastCheckpointAt,
112
+ createdAt: record.createdAt,
113
+ updatedAt: record.updatedAt
114
+ }];
115
+ });
116
+ }
117
+ importSession(projectId, input, userId) {
118
+ const project = this.getProjectOrThrow(projectId);
119
+ const sessionId = requireNonEmptyText(input.sessionId, "sessionId", "sessionId 不能为空");
120
+ const binding = this.sessionBindingRepository.findBySessionId(sessionId);
121
+ if (!binding) {
122
+ throw new AppError({
123
+ statusCode: 404,
124
+ errorCode: "SESSION_NOT_FOUND",
125
+ detail: "目标 session 不存在"
126
+ });
127
+ }
128
+ if (binding.workspaceId !== project.workspaceId) {
129
+ throw new AppError({
130
+ statusCode: 400,
131
+ errorCode: "INVALID_INPUT",
132
+ detail: "目标 session 不属于当前项目所在工作区",
133
+ field: "sessionId"
134
+ });
135
+ }
136
+ const existing = this.butlerSessionRepository.findBySessionId(sessionId);
137
+ if (existing) {
138
+ throw new AppError({
139
+ statusCode: 409,
140
+ errorCode: "BUTLER_SESSION_EXISTS",
141
+ detail: "该 session 已经被代码助手纳管",
142
+ field: "sessionId"
143
+ });
144
+ }
145
+ const state = this.sessionStateRepository.findBySessionAndUser(sessionId, userId);
146
+ const index = this.sessionIndexRepository.findIndexRecordBySessionId(sessionId);
147
+ const timestamp = nowIso();
148
+ const checkpointSummary = buildInitialCheckpointSummary(index?.title ?? null, state?.runningState ?? null);
149
+ const checkpointProgressState = mapCheckpointProgressState(state?.runningState ?? null);
150
+ const checkpointRiskFlags = buildCheckpointRiskFlags(state?.runningState ?? null);
151
+ const checkpointActions = buildCheckpointNextActions(checkpointProgressState);
152
+ const created = this.butlerSessionRepository.create({
153
+ id: createId(),
154
+ projectId: project.id,
155
+ sessionId,
156
+ role: input.role ?? "adhoc",
157
+ ownershipMode: input.ownershipMode ?? "observed",
158
+ status: mapButlerStatusFromRunningState(state?.runningState ?? null),
159
+ lastSummary: checkpointSummary,
160
+ lastCheckpointAt: timestamp,
161
+ createdAt: timestamp,
162
+ updatedAt: timestamp
163
+ });
164
+ const latestCheckpointSeq = this.sessionCheckpointRepository.getLatestSeq(created.id);
165
+ this.sessionCheckpointRepository.create({
166
+ id: createId(),
167
+ butlerSessionId: created.id,
168
+ checkpointSeq: latestCheckpointSeq + 1,
169
+ sourceKind: "manual",
170
+ progressState: checkpointProgressState,
171
+ summary: checkpointSummary,
172
+ riskFlags: checkpointRiskFlags,
173
+ nextActions: checkpointActions,
174
+ capturedAt: timestamp
175
+ });
176
+ return {
177
+ id: created.id,
178
+ projectId: created.projectId,
179
+ sessionId: created.sessionId,
180
+ provider: binding.provider,
181
+ title: index?.title ?? null,
182
+ isArchived: index?.isArchived ?? false,
183
+ role: created.role,
184
+ ownershipMode: created.ownershipMode,
185
+ status: created.status,
186
+ runningState: state?.runningState ?? null,
187
+ lastSummary: created.lastSummary,
188
+ lastCheckpointAt: created.lastCheckpointAt,
189
+ createdAt: created.createdAt,
190
+ updatedAt: created.updatedAt
191
+ };
192
+ }
193
+ async ensureProjectSessionsSynced(projectId, userId, options) {
194
+ const project = this.getProjectOrThrow(projectId);
195
+ if (!isWorkspaceAutoManagedProject(project) || !this.sessionHistoryService?.listWorkspaceSessions) {
196
+ return;
197
+ }
198
+ if (this.sessionHistoryService.discoverWorkspaceSessions) {
199
+ await this.sessionHistoryService.discoverWorkspaceSessions(project.workspaceId, userId, {
200
+ maxAgeMs: options?.force ? 0 : 15_000,
201
+ force: options?.force ?? false,
202
+ refreshStateMode: "inline"
203
+ });
204
+ }
205
+ this.importWorkspaceSessions(project, userId, options?.includeArchived ?? false);
206
+ }
207
+ captureSessionSnapshot(projectId, butlerSessionId, userId, input = {}) {
208
+ const project = this.getProjectOrThrow(projectId);
209
+ const record = this.butlerSessionRepository.findById(butlerSessionId);
210
+ if (!record || record.projectId !== project.id) {
211
+ throw new AppError({
212
+ statusCode: 404,
213
+ errorCode: "BUTLER_SESSION_NOT_FOUND",
214
+ detail: "当前项目下不存在该会话",
215
+ field: "butlerSessionId"
216
+ });
217
+ }
218
+ const binding = this.sessionBindingRepository.findBySessionId(record.sessionId);
219
+ const index = this.sessionIndexRepository.findIndexRecordBySessionId(record.sessionId);
220
+ const state = this.sessionStateRepository.findBySessionAndUser(record.sessionId, userId);
221
+ const timestamp = nowIso();
222
+ const progressState = mapCheckpointProgressState(state?.runningState ?? null);
223
+ const summary = buildSnapshotSummary(index?.title ?? null, state?.runningState ?? null, timestamp);
224
+ const riskFlags = buildCheckpointRiskFlags(state?.runningState ?? null);
225
+ const nextActions = buildCheckpointNextActions(progressState);
226
+ const checkpointSeq = this.sessionCheckpointRepository.getLatestSeq(record.id) + 1;
227
+ this.sessionCheckpointRepository.create({
228
+ id: createId(),
229
+ butlerSessionId: record.id,
230
+ checkpointSeq,
231
+ sourceKind: input.sourceKind ?? "snapshot",
232
+ progressState,
233
+ summary,
234
+ riskFlags,
235
+ nextActions,
236
+ capturedAt: timestamp
237
+ });
238
+ const updatedRecord = this.butlerSessionRepository.update({
239
+ ...record,
240
+ status: mapButlerStatusFromRunningState(state?.runningState ?? null),
241
+ lastSummary: summary,
242
+ lastCheckpointAt: timestamp,
243
+ updatedAt: timestamp
244
+ }) ?? {
245
+ ...record,
246
+ status: mapButlerStatusFromRunningState(state?.runningState ?? null),
247
+ lastSummary: summary,
248
+ lastCheckpointAt: timestamp,
249
+ updatedAt: timestamp
250
+ };
251
+ return {
252
+ id: updatedRecord.id,
253
+ projectId: updatedRecord.projectId,
254
+ sessionId: updatedRecord.sessionId,
255
+ provider: binding?.provider ?? null,
256
+ title: index?.title ?? null,
257
+ isArchived: index?.isArchived ?? false,
258
+ role: updatedRecord.role,
259
+ ownershipMode: updatedRecord.ownershipMode,
260
+ status: updatedRecord.status,
261
+ runningState: state?.runningState ?? null,
262
+ lastSummary: updatedRecord.lastSummary,
263
+ lastCheckpointAt: updatedRecord.lastCheckpointAt,
264
+ createdAt: updatedRecord.createdAt,
265
+ updatedAt: updatedRecord.updatedAt
266
+ };
267
+ }
268
+ async resumeSession(projectId, butlerSessionId, userId) {
269
+ const project = this.getProjectOrThrow(projectId);
270
+ const record = this.butlerSessionRepository.findById(butlerSessionId);
271
+ if (!record || record.projectId !== project.id) {
272
+ throw new AppError({
273
+ statusCode: 404,
274
+ errorCode: "BUTLER_SESSION_NOT_FOUND",
275
+ detail: "当前项目下不存在该会话",
276
+ field: "butlerSessionId"
277
+ });
278
+ }
279
+ if (!this.sessionHistoryService) {
280
+ throw new AppError({
281
+ statusCode: 500,
282
+ errorCode: "BUTLER_SESSION_RESUME_UNAVAILABLE",
283
+ detail: "当前环境未启用 butler 会话续接能力"
284
+ });
285
+ }
286
+ const resumed = await this.sessionHistoryService.resumeSession(record.sessionId);
287
+ const session = this.captureSessionSnapshot(projectId, butlerSessionId, userId, {
288
+ sourceKind: "manual"
289
+ });
290
+ return {
291
+ session,
292
+ resumedAt: resumed.resumedAt,
293
+ provider: resumed.provider,
294
+ providerSessionId: resumed.providerSessionId
295
+ };
296
+ }
297
+ getSessionWorkspaceId(sessionId) {
298
+ const binding = this.sessionBindingRepository.findBySessionId(sessionId);
299
+ if (!binding) {
300
+ throw new AppError({
301
+ statusCode: 404,
302
+ errorCode: "SESSION_NOT_FOUND",
303
+ detail: "目标 session 不存在",
304
+ field: "sessionId"
305
+ });
306
+ }
307
+ return binding.workspaceId;
308
+ }
309
+ async resolveActionTarget(projectId, sessionId, userId) {
310
+ const project = this.getProjectOrThrow(projectId);
311
+ const normalizedSessionId = requireNonEmptyText(sessionId, "sessionId", "sessionId 不能为空");
312
+ const workspaceId = this.getSessionWorkspaceId(normalizedSessionId);
313
+ if (workspaceId !== project.workspaceId) {
314
+ throw new AppError({
315
+ statusCode: 400,
316
+ errorCode: "INVALID_INPUT",
317
+ detail: "目标 session 不属于当前项目所在工作区",
318
+ field: "sessionId"
319
+ });
320
+ }
321
+ await this.ensureProjectSessionsSynced(project.id, userId, {
322
+ includeArchived: true,
323
+ force: true
324
+ });
325
+ const existing = this.listByProject(project.id, userId, {
326
+ includeArchived: true
327
+ }).find((item) => item.sessionId === normalizedSessionId);
328
+ if (existing) {
329
+ return {
330
+ workspaceId,
331
+ session: existing
332
+ };
333
+ }
334
+ return {
335
+ workspaceId,
336
+ session: this.importSession(project.id, {
337
+ sessionId: normalizedSessionId,
338
+ role: "adhoc",
339
+ ownershipMode: "observed"
340
+ }, userId)
341
+ };
342
+ }
343
+ getProjectOrThrow(projectId) {
344
+ const project = this.butlerProjectRepository.findById(projectId);
345
+ if (!project) {
346
+ throw new AppError({
347
+ statusCode: 404,
348
+ errorCode: "BUTLER_PROJECT_NOT_FOUND",
349
+ detail: "代码助手项目不存在"
350
+ });
351
+ }
352
+ return project;
353
+ }
354
+ importWorkspaceSessions(project, userId, includeArchived) {
355
+ if (!this.sessionHistoryService?.listWorkspaceSessions) {
356
+ return;
357
+ }
358
+ const existingSessionIds = new Set(this.butlerSessionRepository.listByProject(project.id).map((record) => record.sessionId));
359
+ const workspaceSessions = this.sessionHistoryService.listWorkspaceSessions(project.workspaceId, userId);
360
+ for (const session of workspaceSessions) {
361
+ if (session.isSubagent
362
+ || (!includeArchived && session.isArchived)
363
+ || existingSessionIds.has(session.sessionId)) {
364
+ continue;
365
+ }
366
+ this.createObservedSession(project, session, userId);
367
+ existingSessionIds.add(session.sessionId);
368
+ }
369
+ }
370
+ createObservedSession(project, session, userId) {
371
+ const state = this.sessionStateRepository.findBySessionAndUser(session.sessionId, userId);
372
+ const normalizedRunningState = normalizeRunningState(session.runningState ?? state?.runningState ?? null);
373
+ const timestamp = nowIso();
374
+ const checkpointSummary = buildInitialCheckpointSummary(session.title, normalizedRunningState);
375
+ const checkpointProgressState = mapCheckpointProgressState(normalizedRunningState);
376
+ const checkpointRiskFlags = buildCheckpointRiskFlags(normalizedRunningState);
377
+ const checkpointActions = buildCheckpointNextActions(checkpointProgressState);
378
+ const created = this.butlerSessionRepository.create({
379
+ id: createId(),
380
+ projectId: project.id,
381
+ sessionId: session.sessionId,
382
+ role: "adhoc",
383
+ ownershipMode: "observed",
384
+ status: mapButlerStatusFromRunningState(normalizedRunningState),
385
+ lastSummary: checkpointSummary,
386
+ lastCheckpointAt: timestamp,
387
+ createdAt: session.createdAt,
388
+ updatedAt: session.updatedAt
389
+ });
390
+ this.sessionCheckpointRepository.create({
391
+ id: createId(),
392
+ butlerSessionId: created.id,
393
+ checkpointSeq: this.sessionCheckpointRepository.getLatestSeq(created.id) + 1,
394
+ sourceKind: "snapshot",
395
+ progressState: checkpointProgressState,
396
+ summary: checkpointSummary,
397
+ riskFlags: checkpointRiskFlags,
398
+ nextActions: checkpointActions,
399
+ capturedAt: timestamp
400
+ });
401
+ }
402
+ }
403
+ function requireNonEmptyText(value, field, detail) {
404
+ const normalized = value?.trim();
405
+ if (!normalized) {
406
+ throw new AppError({
407
+ statusCode: 400,
408
+ errorCode: "INVALID_INPUT",
409
+ detail,
410
+ field
411
+ });
412
+ }
413
+ return normalized;
414
+ }
415
+ function mapButlerStatusFromRunningState(runningState) {
416
+ switch (runningState) {
417
+ case "starting":
418
+ case "running":
419
+ return "running";
420
+ case "failed":
421
+ return "failed";
422
+ case "interrupted":
423
+ return "blocked";
424
+ case "completed":
425
+ case "idle":
426
+ default:
427
+ return "idle";
428
+ }
429
+ }
430
+ function mapCheckpointProgressState(runningState) {
431
+ switch (runningState) {
432
+ case "starting":
433
+ case "running":
434
+ return "working";
435
+ case "failed":
436
+ case "interrupted":
437
+ return "blocked";
438
+ case "completed":
439
+ case "idle":
440
+ return "done";
441
+ default:
442
+ return "unknown";
443
+ }
444
+ }
445
+ function buildInitialCheckpointSummary(sessionTitle, runningState) {
446
+ const title = sessionTitle ?? "未命名会话";
447
+ const stateText = runningState ? `当前状态:${runningState}` : "当前状态未知";
448
+ return `已登记会话「${title}」,${stateText}`;
449
+ }
450
+ function buildSnapshotSummary(sessionTitle, runningState, capturedAt) {
451
+ const title = sessionTitle ?? "未命名会话";
452
+ const stateText = runningState ?? "unknown";
453
+ return `会话「${title}」状态快照:${stateText}(采集时间 ${capturedAt})`;
454
+ }
455
+ function buildCheckpointRiskFlags(runningState) {
456
+ if (runningState === "failed") {
457
+ return ["会话运行失败,需要排查 provider 错误"];
458
+ }
459
+ if (runningState === "interrupted") {
460
+ return ["会话被中断,结果可能不完整"];
461
+ }
462
+ return [];
463
+ }
464
+ function buildCheckpointNextActions(progressState) {
465
+ switch (progressState) {
466
+ case "working":
467
+ return ["等待会话执行结束后继续采样"];
468
+ case "blocked":
469
+ return ["检查失败原因并评估是否需要续接会话"];
470
+ case "done":
471
+ return ["按需触发巡视任务生成结构化总结"];
472
+ case "unknown":
473
+ default:
474
+ return ["补充会话上下文后重新采样"];
475
+ }
476
+ }
477
+ function resolveProviderId(defaultProvider) {
478
+ if (defaultProvider === "claude-code") {
479
+ return "claude-code";
480
+ }
481
+ return "codex";
482
+ }
483
+ function isWorkspaceAutoManagedProject(project) {
484
+ return project.config.managedBy === "workspace-auto";
485
+ }
486
+ function normalizeRunningState(runningState) {
487
+ switch (runningState) {
488
+ case "idle":
489
+ case "starting":
490
+ case "running":
491
+ case "completed":
492
+ case "interrupted":
493
+ case "failed":
494
+ return runningState;
495
+ default:
496
+ return null;
497
+ }
498
+ }
499
+ function normalizeNullableText(value) {
500
+ const normalized = value?.trim();
501
+ return normalized && normalized.length > 0 ? normalized : null;
502
+ }
503
+ //# sourceMappingURL=butler-session-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"butler-session-service.js","sourceRoot":"","sources":["../../../../src/modules/butler/butler-session-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { AuthUserRepository } from "../../storage/repositories/auth-user-repository.js";
2
+ import type { ButlerSessionRepository } from "../../storage/repositories/butler-session-repository.js";
3
+ import type { ButlerSessionSummaryStateRepository } from "../../storage/repositories/butler-session-summary-state-repository.js";
4
+ import type { SessionCheckpointRepository } from "../../storage/repositories/session-checkpoint-repository.js";
5
+ import type { SessionIndexRepository } from "../../storage/repositories/session-index-repository.js";
6
+ import type { ButlerProfileService } from "./butler-profile-service.js";
7
+ import type { ButlerProjectService } from "./butler-project-service.js";
8
+ import type { ButlerSessionService } from "./butler-session-service.js";
9
+ import { ProviderAdapterRegistry } from "./provider-adapter-registry.js";
10
+ import { SessionSummaryInstructionAdapter } from "./session-summary-instruction-adapter.js";
11
+ import type { WorkspaceService } from "../workspace/workspace-service.js";
12
+ import type { SessionHistoryService } from "../sessions/session-history-service.js";
13
+ interface ButlerSessionSummaryLogger {
14
+ error(message: string, detail?: unknown): void;
15
+ }
16
+ interface ButlerSessionSummaryServiceOptions {
17
+ debounceMs?: number;
18
+ recentMessageLimit?: number;
19
+ now?: () => string;
20
+ logger?: ButlerSessionSummaryLogger;
21
+ summaryCodexHomeDir?: string | null;
22
+ sourceCodexHomeDir?: string | null;
23
+ }
24
+ export declare class ButlerSessionSummaryService {
25
+ private readonly butlerProfileService;
26
+ private readonly butlerProjectService;
27
+ private readonly butlerSessionService;
28
+ private readonly butlerSessionRepository;
29
+ private readonly butlerSessionSummaryStateRepository;
30
+ private readonly sessionCheckpointRepository;
31
+ private readonly sessionIndexRepository;
32
+ private readonly authUserRepository;
33
+ private readonly workspaceService;
34
+ private readonly sessionHistoryService;
35
+ private readonly providerAdapterRegistry;
36
+ private readonly instructionAdapter;
37
+ private readonly debounceMs;
38
+ private readonly recentMessageLimit;
39
+ private readonly now;
40
+ private readonly logger;
41
+ private readonly summaryCodexHomeDir;
42
+ private readonly sourceCodexHomeDir;
43
+ private readonly inFlightButlerSessionIds;
44
+ constructor(butlerProfileService: Pick<ButlerProfileService, "getProfile">, butlerProjectService: Pick<ButlerProjectService, "list">, butlerSessionService: Pick<ButlerSessionService, "ensureProjectSessionsSynced" | "listByProject">, butlerSessionRepository: Pick<ButlerSessionRepository, "findById" | "update">, butlerSessionSummaryStateRepository: Pick<ButlerSessionSummaryStateRepository, "findByButlerSessionId" | "upsert">, sessionCheckpointRepository: Pick<SessionCheckpointRepository, "create" | "getLatestSeq">, sessionIndexRepository: Pick<SessionIndexRepository, "findIndexRecordBySessionId">, authUserRepository: Pick<AuthUserRepository, "listIds">, workspaceService: Pick<WorkspaceService, "importWorkspace">, sessionHistoryService: Pick<SessionHistoryService, "readSessionHistory">, providerAdapterRegistry: ProviderAdapterRegistry, instructionAdapter: SessionSummaryInstructionAdapter, options?: ButlerSessionSummaryServiceOptions);
45
+ runOnce(): Promise<void>;
46
+ private maybeSummarizeSession;
47
+ private scheduleSession;
48
+ private resolveDebounceMs;
49
+ private summarizeSession;
50
+ private persistSummary;
51
+ private resolveExecutorUserId;
52
+ private collectIncrementalHistory;
53
+ private syncSummaryInstructionFiles;
54
+ }
55
+ export {};