@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
@@ -0,0 +1,253 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { AppError } from "../../shared/errors/app-error.js";
4
+ import { createId } from "../../shared/utils/id.js";
5
+ import { nowIso } from "../../shared/utils/time.js";
6
+ export class ButlerProjectService {
7
+ butlerProjectRepository;
8
+ butlerSessionRepository;
9
+ workspaceRepository;
10
+ butlerProfileService;
11
+ constructor(butlerProjectRepository, butlerSessionRepository, workspaceRepository, butlerProfileService) {
12
+ this.butlerProjectRepository = butlerProjectRepository;
13
+ this.butlerSessionRepository = butlerSessionRepository;
14
+ this.workspaceRepository = workspaceRepository;
15
+ this.butlerProfileService = butlerProfileService;
16
+ }
17
+ list(input) {
18
+ this.syncManagedProjects();
19
+ return this.butlerProjectRepository.list(input);
20
+ }
21
+ create(input) {
22
+ const workspace = this.getWorkspaceOrThrow(input.workspaceId);
23
+ const name = requireNonEmptyText(input.name, "name", "项目名称不能为空");
24
+ const repoRoot = this.resolveRepoRootWithinWorkspace(workspace.path, input.repoRoot);
25
+ if (this.butlerProjectRepository.list({ workspaceId: workspace.id }).some((item) => item.repoRoot === repoRoot)) {
26
+ throw new AppError({
27
+ statusCode: 409,
28
+ errorCode: "BUTLER_PROJECT_EXISTS",
29
+ detail: "当前工作区下已存在相同仓库路径的代码助手项目",
30
+ field: "repoRoot"
31
+ });
32
+ }
33
+ const timestamp = nowIso();
34
+ return this.butlerProjectRepository.create({
35
+ id: createId(),
36
+ workspaceId: workspace.id,
37
+ name,
38
+ repoRoot,
39
+ defaultProvider: input.defaultProvider?.trim() || null,
40
+ instructionProfileId: null,
41
+ approvalMode: input.approvalMode ?? "controlled",
42
+ lifecycleStatus: "active",
43
+ riskLevel: "low",
44
+ config: input.config ?? {},
45
+ lastPatrolAt: null,
46
+ lastVerificationAt: null,
47
+ createdAt: timestamp,
48
+ updatedAt: timestamp,
49
+ archivedAt: null
50
+ });
51
+ }
52
+ getById(projectId) {
53
+ this.syncManagedProjects();
54
+ const project = this.butlerProjectRepository.findById(projectId);
55
+ if (!project) {
56
+ throw new AppError({
57
+ statusCode: 404,
58
+ errorCode: "BUTLER_PROJECT_NOT_FOUND",
59
+ detail: "代码助手项目不存在"
60
+ });
61
+ }
62
+ return project;
63
+ }
64
+ resolveWorkspaceActionProject(workspaceId) {
65
+ this.syncManagedProjects();
66
+ const projects = this.butlerProjectRepository.list({ workspaceId });
67
+ const activeProjects = projects.filter((project) => project.lifecycleStatus === "active");
68
+ const preferredProject = activeProjects.find(isWorkspaceAutoManagedProject)
69
+ ?? activeProjects[0]
70
+ ?? projects.find(isWorkspaceAutoManagedProject)
71
+ ?? projects[0]
72
+ ?? null;
73
+ if (!preferredProject) {
74
+ throw new AppError({
75
+ statusCode: 404,
76
+ errorCode: "BUTLER_PROJECT_NOT_FOUND",
77
+ detail: "当前工作区还没有可用的代码助手项目"
78
+ });
79
+ }
80
+ return preferredProject;
81
+ }
82
+ update(projectId, input) {
83
+ const current = this.getById(projectId);
84
+ const nextLifecycleStatus = input.lifecycleStatus ?? current.lifecycleStatus;
85
+ const nextArchivedAt = nextLifecycleStatus === "archived" ? current.archivedAt ?? nowIso() : null;
86
+ const updated = this.butlerProjectRepository.update({
87
+ ...current,
88
+ name: input.name?.trim() || current.name,
89
+ defaultProvider: input.defaultProvider === undefined
90
+ ? current.defaultProvider
91
+ : input.defaultProvider?.trim() || null,
92
+ approvalMode: input.approvalMode ?? current.approvalMode,
93
+ lifecycleStatus: nextLifecycleStatus,
94
+ riskLevel: input.riskLevel ?? current.riskLevel,
95
+ config: input.config ?? current.config,
96
+ archivedAt: nextArchivedAt,
97
+ updatedAt: nowIso()
98
+ });
99
+ if (!updated) {
100
+ throw new AppError({
101
+ statusCode: 500,
102
+ errorCode: "BUTLER_PROJECT_UPDATE_FAILED",
103
+ detail: "代码助手项目更新失败"
104
+ });
105
+ }
106
+ return updated;
107
+ }
108
+ getOverview(projectId) {
109
+ this.syncManagedProjects();
110
+ const project = this.getById(projectId);
111
+ const sessions = this.butlerSessionRepository.listByProject(project.id);
112
+ return {
113
+ project,
114
+ activeSessionCount: sessions.filter((session) => session.status === "running").length,
115
+ latestPatrolRun: null,
116
+ latestVerificationRun: null,
117
+ topRisks: [],
118
+ nextSuggestions: []
119
+ };
120
+ }
121
+ getWorkspaceOrThrow(workspaceId) {
122
+ const workspace = this.workspaceRepository.findById(workspaceId);
123
+ if (!workspace || workspace.removedAt) {
124
+ throw new AppError({
125
+ statusCode: 404,
126
+ errorCode: "WORKSPACE_NOT_FOUND",
127
+ detail: "工作区不存在"
128
+ });
129
+ }
130
+ return workspace;
131
+ }
132
+ syncManagedProjects() {
133
+ const profile = this.butlerProfileService?.getProfile() ?? null;
134
+ const butlerWorkspacePath = profile?.workspacePath ? path.resolve(profile.workspacePath) : null;
135
+ const activeWorkspaces = this.workspaceRepository.list().filter((workspace) => {
136
+ if (!butlerWorkspacePath) {
137
+ return true;
138
+ }
139
+ return !isPathInsideButlerWorkspace(workspace.path, butlerWorkspacePath);
140
+ });
141
+ const activeWorkspaceIds = new Set(activeWorkspaces.map((workspace) => workspace.id));
142
+ const projects = this.butlerProjectRepository.list();
143
+ for (const workspace of activeWorkspaces) {
144
+ const normalizedWorkspacePath = path.resolve(workspace.path);
145
+ if (butlerWorkspacePath && isPathInsideButlerWorkspace(normalizedWorkspacePath, butlerWorkspacePath)) {
146
+ continue;
147
+ }
148
+ const sameWorkspaceProjects = projects.filter((project) => project.workspaceId === workspace.id);
149
+ const autoProject = sameWorkspaceProjects.find(isWorkspaceAutoManagedProject) ?? null;
150
+ if (sameWorkspaceProjects.length === 0) {
151
+ const timestamp = nowIso();
152
+ this.butlerProjectRepository.create({
153
+ id: createId(),
154
+ workspaceId: workspace.id,
155
+ name: workspace.name,
156
+ repoRoot: workspace.repoRoot ?? workspace.path,
157
+ defaultProvider: null,
158
+ instructionProfileId: null,
159
+ approvalMode: "controlled",
160
+ lifecycleStatus: "active",
161
+ riskLevel: "low",
162
+ config: {
163
+ managedBy: "workspace-auto"
164
+ },
165
+ lastPatrolAt: null,
166
+ lastVerificationAt: null,
167
+ createdAt: timestamp,
168
+ updatedAt: timestamp,
169
+ archivedAt: null
170
+ });
171
+ continue;
172
+ }
173
+ if (!autoProject) {
174
+ continue;
175
+ }
176
+ const nextRepoRoot = workspace.repoRoot ?? workspace.path;
177
+ const shouldRestore = autoProject.lifecycleStatus !== "active" || autoProject.archivedAt !== null;
178
+ const shouldRefreshMeta = autoProject.name !== workspace.name || autoProject.repoRoot !== nextRepoRoot;
179
+ if (!shouldRestore && !shouldRefreshMeta) {
180
+ continue;
181
+ }
182
+ this.butlerProjectRepository.update({
183
+ ...autoProject,
184
+ name: workspace.name,
185
+ repoRoot: nextRepoRoot,
186
+ lifecycleStatus: "active",
187
+ archivedAt: null,
188
+ updatedAt: nowIso()
189
+ });
190
+ }
191
+ for (const project of projects) {
192
+ if (!isWorkspaceAutoManagedProject(project)) {
193
+ continue;
194
+ }
195
+ if (activeWorkspaceIds.has(project.workspaceId)) {
196
+ continue;
197
+ }
198
+ if (project.lifecycleStatus === "archived") {
199
+ continue;
200
+ }
201
+ this.butlerProjectRepository.update({
202
+ ...project,
203
+ lifecycleStatus: "archived",
204
+ archivedAt: project.archivedAt ?? nowIso(),
205
+ updatedAt: nowIso()
206
+ });
207
+ }
208
+ }
209
+ resolveRepoRootWithinWorkspace(workspacePath, repoRoot) {
210
+ const normalized = requireNonEmptyText(repoRoot, "repoRoot", "仓库路径不能为空");
211
+ const resolvedRepoRoot = path.resolve(normalized);
212
+ if (!fs.existsSync(resolvedRepoRoot) || !fs.statSync(resolvedRepoRoot).isDirectory()) {
213
+ throw new AppError({
214
+ statusCode: 400,
215
+ errorCode: "INVALID_INPUT",
216
+ detail: "仓库路径必须是已存在的目录",
217
+ field: "repoRoot"
218
+ });
219
+ }
220
+ const relative = path.relative(path.resolve(workspacePath), resolvedRepoRoot);
221
+ const isInsideWorkspace = relative === ""
222
+ || (!relative.startsWith("..") && !path.isAbsolute(relative));
223
+ if (!isInsideWorkspace) {
224
+ throw new AppError({
225
+ statusCode: 400,
226
+ errorCode: "INVALID_INPUT",
227
+ detail: "仓库路径必须位于工作区边界内",
228
+ field: "repoRoot"
229
+ });
230
+ }
231
+ return resolvedRepoRoot;
232
+ }
233
+ }
234
+ function isWorkspaceAutoManagedProject(project) {
235
+ return project.config.managedBy === "workspace-auto";
236
+ }
237
+ function isPathInsideButlerWorkspace(candidatePath, butlerWorkspacePath) {
238
+ const relative = path.relative(path.resolve(butlerWorkspacePath), path.resolve(candidatePath));
239
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
240
+ }
241
+ function requireNonEmptyText(value, field, detail) {
242
+ const normalized = value?.trim();
243
+ if (!normalized) {
244
+ throw new AppError({
245
+ statusCode: 400,
246
+ errorCode: "INVALID_INPUT",
247
+ detail,
248
+ field
249
+ });
250
+ }
251
+ return normalized;
252
+ }
253
+ //# sourceMappingURL=butler-project-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"butler-project-service.js","sourceRoot":"","sources":["../../../../src/modules/butler/butler-project-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import type { ButlerSessionOwnershipMode, ButlerSessionRole, ButlerSessionStatus, SessionRunningState } from "../../types/domain.js";
2
+ import type { ButlerProjectRepository } from "../../storage/repositories/butler-project-repository.js";
3
+ import type { ButlerSessionRepository } from "../../storage/repositories/butler-session-repository.js";
4
+ import type { SessionBindingRepository } from "../../storage/repositories/session-binding-repository.js";
5
+ import type { SessionCheckpointRepository } from "../../storage/repositories/session-checkpoint-repository.js";
6
+ import type { SessionIndexRepository } from "../../storage/repositories/session-index-repository.js";
7
+ import type { SessionStateRepository } from "../../storage/repositories/session-state-repository.js";
8
+ import type { SessionLiveRuntimeService } from "../sessions/session-live-runtime-service.js";
9
+ import type { SessionHistoryService } from "../sessions/session-history-service.js";
10
+ export interface ButlerProjectSessionView {
11
+ id: string;
12
+ projectId: string;
13
+ sessionId: string;
14
+ provider: string | null;
15
+ title: string | null;
16
+ isArchived: boolean;
17
+ role: ButlerSessionRole;
18
+ ownershipMode: ButlerSessionOwnershipMode;
19
+ status: ButlerSessionStatus;
20
+ runningState: SessionRunningState | null;
21
+ lastSummary: string | null;
22
+ lastCheckpointAt: string | null;
23
+ createdAt: string;
24
+ updatedAt: string;
25
+ }
26
+ export interface ImportButlerSessionInput {
27
+ sessionId: string;
28
+ role?: ButlerSessionRole;
29
+ ownershipMode?: ButlerSessionOwnershipMode;
30
+ }
31
+ export interface CaptureButlerSessionSnapshotInput {
32
+ sourceKind?: "snapshot" | "manual";
33
+ }
34
+ export interface StartButlerSessionInput {
35
+ providerId?: "codex" | "claude-code";
36
+ role?: ButlerSessionRole;
37
+ ownershipMode?: ButlerSessionOwnershipMode;
38
+ content?: string;
39
+ model?: string | null;
40
+ reasoningLevel?: string | null;
41
+ permissionMode?: string | null;
42
+ }
43
+ export interface ResumeButlerSessionResult {
44
+ session: ButlerProjectSessionView;
45
+ resumedAt: string;
46
+ provider: string;
47
+ providerSessionId: string;
48
+ }
49
+ export interface ButlerSessionActionTarget {
50
+ workspaceId: string;
51
+ session: ButlerProjectSessionView;
52
+ }
53
+ export declare class ButlerSessionService {
54
+ private readonly butlerProjectRepository;
55
+ private readonly butlerSessionRepository;
56
+ private readonly sessionCheckpointRepository;
57
+ private readonly sessionBindingRepository;
58
+ private readonly sessionIndexRepository;
59
+ private readonly sessionStateRepository;
60
+ private readonly sessionLiveRuntimeService?;
61
+ private readonly sessionHistoryService?;
62
+ constructor(butlerProjectRepository: ButlerProjectRepository, butlerSessionRepository: ButlerSessionRepository, sessionCheckpointRepository: SessionCheckpointRepository, sessionBindingRepository: SessionBindingRepository, sessionIndexRepository: SessionIndexRepository, sessionStateRepository: SessionStateRepository, sessionLiveRuntimeService?: Pick<SessionLiveRuntimeService, "startLiveSession"> | undefined, sessionHistoryService?: Pick<SessionHistoryService, "discoverWorkspaceSessions" | "listWorkspaceSessions" | "resumeSession"> | undefined);
63
+ startSession(projectId: string, input: StartButlerSessionInput, userId: string): Promise<ButlerProjectSessionView>;
64
+ listByProject(projectId: string, userId: string, options?: {
65
+ includeArchived?: boolean;
66
+ }): ButlerProjectSessionView[];
67
+ importSession(projectId: string, input: ImportButlerSessionInput, userId: string): ButlerProjectSessionView;
68
+ ensureProjectSessionsSynced(projectId: string, userId: string, options?: {
69
+ includeArchived?: boolean;
70
+ force?: boolean;
71
+ }): Promise<void>;
72
+ captureSessionSnapshot(projectId: string, butlerSessionId: string, userId: string, input?: CaptureButlerSessionSnapshotInput): ButlerProjectSessionView;
73
+ resumeSession(projectId: string, butlerSessionId: string, userId: string): Promise<ResumeButlerSessionResult>;
74
+ getSessionWorkspaceId(sessionId: string): string;
75
+ resolveActionTarget(projectId: string, sessionId: string, userId: string): Promise<ButlerSessionActionTarget>;
76
+ private getProjectOrThrow;
77
+ private importWorkspaceSessions;
78
+ private createObservedSession;
79
+ }