@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,529 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { AppError } from "../../shared/errors/app-error.js";
5
+ import { nowIso } from "../../shared/utils/time.js";
6
+ const BUTLER_PROFILE_ID = "default";
7
+ const DEFAULT_BUTLER_DISPLAY_NAME = "代码助手";
8
+ const DEFAULT_BUTLER_WORKSPACE_DIRNAME = "butler-workspace";
9
+ const SUPPORTED_PROVIDERS = ["codex"];
10
+ const PROVIDER_ERROR_DETAIL = "providerId 只允许为 codex";
11
+ const SUPPORTED_AGENTS_MODES = ["inline", "file"];
12
+ const SUPPORTED_PERSONA_TONES = ["direct", "steady", "friendly"];
13
+ const SUPPORTED_PERSONA_LANGUAGES = ["zh-CN", "en-US", "bilingual"];
14
+ const SUPPORTED_SUMMARY_STYLES = ["brief", "structured", "thorough"];
15
+ const SUPPORTED_RISK_PREFERENCES = ["conservative", "balanced", "proactive"];
16
+ const SUPPORTED_REPORT_PRIORITIES = ["risk", "blocker", "verification", "progress"];
17
+ const DEFAULT_SUMMARY_DEBOUNCE_SECONDS = 300;
18
+ const MIN_SUMMARY_DEBOUNCE_SECONDS = 60;
19
+ const MAX_SUMMARY_DEBOUNCE_SECONDS = 3_600;
20
+ export class ButlerProfileService {
21
+ butlerProfileRepository;
22
+ butlerProjectRepository;
23
+ dataRootDir;
24
+ constructor(butlerProfileRepository, butlerProjectRepository, dataRootDir = path.resolve("data", "host")) {
25
+ this.butlerProfileRepository = butlerProfileRepository;
26
+ this.butlerProjectRepository = butlerProjectRepository;
27
+ this.dataRootDir = dataRootDir;
28
+ }
29
+ getProfile() {
30
+ const profile = this.butlerProfileRepository.find();
31
+ return profile ? hydrateStoredProfile(profile) : null;
32
+ }
33
+ initProfile(input) {
34
+ if (this.butlerProfileRepository.find()) {
35
+ throw new AppError({
36
+ statusCode: 409,
37
+ errorCode: "BUTLER_PROFILE_ALREADY_INITIALIZED",
38
+ detail: "代码助手已经初始化,不能重复初始化"
39
+ });
40
+ }
41
+ const timestamp = nowIso();
42
+ const profile = buildButlerProfileRecord(input, timestamp, null, this.butlerProjectRepository, this.dataRootDir);
43
+ return this.butlerProfileRepository.create(profile);
44
+ }
45
+ updateProfile(input) {
46
+ const current = this.getProfile();
47
+ if (!current) {
48
+ throw new AppError({
49
+ statusCode: 409,
50
+ errorCode: "BUTLER_PROFILE_NOT_INITIALIZED",
51
+ detail: "代码助手尚未完成初始化"
52
+ });
53
+ }
54
+ const updated = buildButlerProfileRecord(input, current.initializedAt, current, this.butlerProjectRepository, this.dataRootDir);
55
+ return this.butlerProfileRepository.update(updated);
56
+ }
57
+ ensureInitialized() {
58
+ const profile = this.getProfile();
59
+ if (!profile) {
60
+ throw new AppError({
61
+ statusCode: 409,
62
+ errorCode: "BUTLER_PROFILE_NOT_INITIALIZED",
63
+ detail: "代码助手尚未完成初始化,不能启动控制会话"
64
+ });
65
+ }
66
+ return profile;
67
+ }
68
+ }
69
+ function buildButlerProfileRecord(input, initializedAt, current, butlerProjectRepository, dataRootDir) {
70
+ const displayName = input.displayName !== undefined
71
+ ? normalizeDisplayName(input.displayName)
72
+ : current?.displayName ?? DEFAULT_BUTLER_DISPLAY_NAME;
73
+ const workspacePath = input.workspacePath !== undefined
74
+ ? normalizeWorkspacePath(input.workspacePath, butlerProjectRepository)
75
+ : current?.workspacePath ?? resolveDefaultWorkspacePath(dataRootDir, butlerProjectRepository);
76
+ const providerId = input.providerId !== undefined
77
+ ? normalizeProviderId(input.providerId)
78
+ : current?.providerId ?? invalidField("providerId", PROVIDER_ERROR_DETAIL);
79
+ const agentsMode = input.agentsMode !== undefined
80
+ ? normalizeAgentsMode(input.agentsMode)
81
+ : current?.agentsMode ?? "inline";
82
+ const persona = input.persona !== undefined
83
+ ? normalizePersona(input.persona)
84
+ : current?.persona ?? createDefaultPersona();
85
+ const focus = input.focus !== undefined
86
+ ? normalizeFocus(input.focus)
87
+ : current?.focus ?? createDefaultFocus();
88
+ const generatedAgentsContent = buildGeneratedAgentsContent({
89
+ displayName,
90
+ providerId,
91
+ persona,
92
+ focus
93
+ });
94
+ const agentsConfig = resolveAgentsConfig(input, current, workspacePath, agentsMode, generatedAgentsContent);
95
+ return {
96
+ id: BUTLER_PROFILE_ID,
97
+ displayName,
98
+ providerId,
99
+ workspacePath,
100
+ agentsMode,
101
+ agentsFilePath: agentsConfig.agentsFilePath,
102
+ agentsContent: agentsConfig.agentsContent,
103
+ persona,
104
+ focus,
105
+ initializedAt,
106
+ updatedAt: nowIso()
107
+ };
108
+ }
109
+ function normalizeDisplayName(value) {
110
+ if (typeof value !== "string") {
111
+ throw invalidField("displayName", "displayName 必须是非空字符串");
112
+ }
113
+ const normalized = value.trim();
114
+ if (!normalized) {
115
+ throw invalidField("displayName", "displayName 必须是非空字符串");
116
+ }
117
+ return normalized;
118
+ }
119
+ function normalizeProviderId(value) {
120
+ if (typeof value !== "string") {
121
+ throw invalidField("providerId", PROVIDER_ERROR_DETAIL);
122
+ }
123
+ const normalized = value.trim();
124
+ if (!SUPPORTED_PROVIDERS.includes(normalized)) {
125
+ throw invalidField("providerId", PROVIDER_ERROR_DETAIL);
126
+ }
127
+ return normalized;
128
+ }
129
+ function hydrateStoredProviderId(value) {
130
+ if (value === "claude-code") {
131
+ return "codex";
132
+ }
133
+ return normalizeProviderId(value);
134
+ }
135
+ function normalizeWorkspacePath(value, butlerProjectRepository) {
136
+ if (typeof value !== "string") {
137
+ throw invalidField("workspacePath", "workspacePath 必须是绝对目录路径");
138
+ }
139
+ const normalized = value.trim();
140
+ if (!normalized) {
141
+ throw invalidField("workspacePath", "workspacePath 不能为空");
142
+ }
143
+ return finalizeWorkspacePath(normalized, butlerProjectRepository);
144
+ }
145
+ function resolveDefaultWorkspacePath(dataRootDir, butlerProjectRepository) {
146
+ return finalizeWorkspacePath(path.join(dataRootDir, DEFAULT_BUTLER_WORKSPACE_DIRNAME), butlerProjectRepository);
147
+ }
148
+ function finalizeWorkspacePath(targetPath, butlerProjectRepository) {
149
+ const resolved = path.resolve(targetPath);
150
+ if (!path.isAbsolute(resolved)) {
151
+ throw invalidField("workspacePath", "workspacePath 必须是绝对目录路径");
152
+ }
153
+ if (fs.existsSync(resolved) && !fs.statSync(resolved).isDirectory()) {
154
+ throw invalidField("workspacePath", "workspacePath 必须指向目录");
155
+ }
156
+ const duplicatedProject = butlerProjectRepository
157
+ .list()
158
+ .find((project) => path.resolve(project.repoRoot) === resolved);
159
+ if (duplicatedProject) {
160
+ throw invalidField("workspacePath", "workspacePath 不能直接复用某个项目仓库目录");
161
+ }
162
+ fs.mkdirSync(resolved, { recursive: true });
163
+ ensureButlerWorkspaceIsolation(resolved);
164
+ return resolved;
165
+ }
166
+ function normalizeAgentsMode(value) {
167
+ if (typeof value !== "string") {
168
+ throw invalidField("agentsMode", "agentsMode 只允许为 inline 或 file");
169
+ }
170
+ const normalized = value.trim();
171
+ if (!SUPPORTED_AGENTS_MODES.includes(normalized)) {
172
+ throw invalidField("agentsMode", "agentsMode 只允许为 inline 或 file");
173
+ }
174
+ return normalized;
175
+ }
176
+ function resolveAgentsConfig(input, current, workspacePath, agentsMode, generatedAgentsContent) {
177
+ const hasAgentsFilePath = Object.prototype.hasOwnProperty.call(input, "agentsFilePath");
178
+ const hasAgentsContent = Object.prototype.hasOwnProperty.call(input, "agentsContent");
179
+ const hasGeneratedSeedChange = current === null
180
+ || input.displayName !== undefined
181
+ || input.persona !== undefined
182
+ || input.focus !== undefined
183
+ || input.agentsMode !== undefined;
184
+ const nextAgentsFilePath = hasAgentsFilePath
185
+ ? normalizeOptionalFilePath(input.agentsFilePath, workspacePath)
186
+ : current?.agentsFilePath ?? path.join(workspacePath, "AGENTS.md");
187
+ const explicitAgentsContent = hasAgentsContent
188
+ ? normalizeOptionalContent(input.agentsContent)
189
+ : null;
190
+ if (agentsMode === "inline") {
191
+ const agentsContent = explicitAgentsContent
192
+ ?? (hasGeneratedSeedChange ? generatedAgentsContent : current?.agentsContent)
193
+ ?? generatedAgentsContent;
194
+ return {
195
+ agentsFilePath: null,
196
+ agentsContent
197
+ };
198
+ }
199
+ const agentsFilePath = nextAgentsFilePath ?? path.join(workspacePath, "AGENTS.md");
200
+ if (!isPathWithinWorkspace(workspacePath, agentsFilePath)) {
201
+ throw invalidField("agentsFilePath", "AGENTS.md 必须位于助手工作目录内");
202
+ }
203
+ if (explicitAgentsContent) {
204
+ writeAgentsFile(agentsFilePath, explicitAgentsContent);
205
+ return {
206
+ agentsFilePath,
207
+ agentsContent: explicitAgentsContent
208
+ };
209
+ }
210
+ if (fs.existsSync(agentsFilePath) && !hasGeneratedSeedChange) {
211
+ return {
212
+ agentsFilePath,
213
+ agentsContent: readAgentsFile(agentsFilePath)
214
+ };
215
+ }
216
+ writeAgentsFile(agentsFilePath, generatedAgentsContent);
217
+ return {
218
+ agentsFilePath,
219
+ agentsContent: generatedAgentsContent
220
+ };
221
+ }
222
+ function normalizeOptionalFilePath(value, workspacePath) {
223
+ if (value === null) {
224
+ return null;
225
+ }
226
+ if (value === undefined) {
227
+ return path.join(workspacePath, "AGENTS.md");
228
+ }
229
+ if (typeof value !== "string") {
230
+ throw invalidField("agentsFilePath", "agentsFilePath 必须是绝对文件路径");
231
+ }
232
+ const normalized = value.trim();
233
+ if (!normalized) {
234
+ return path.join(workspacePath, "AGENTS.md");
235
+ }
236
+ const resolved = path.resolve(normalized);
237
+ if (!path.isAbsolute(resolved)) {
238
+ throw invalidField("agentsFilePath", "agentsFilePath 必须是绝对文件路径");
239
+ }
240
+ return resolved;
241
+ }
242
+ function normalizeOptionalContent(value) {
243
+ if (value === null) {
244
+ return null;
245
+ }
246
+ if (typeof value !== "string") {
247
+ throw invalidField("agentsContent", "agentsContent 必须是字符串");
248
+ }
249
+ const normalized = value.trim();
250
+ return normalized || null;
251
+ }
252
+ function readAgentsFile(filePath) {
253
+ if (!fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) {
254
+ throw invalidField("agentsFilePath", "agentsFilePath 必须指向已存在的 AGENTS.md 文件");
255
+ }
256
+ const content = fs.readFileSync(filePath, "utf8").trim();
257
+ if (!content) {
258
+ throw invalidField("agentsFilePath", "AGENTS.md 文件内容不能为空");
259
+ }
260
+ return content;
261
+ }
262
+ function writeAgentsFile(filePath, content) {
263
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
264
+ fs.writeFileSync(filePath, `${content.trim()}\n`, "utf8");
265
+ }
266
+ export function ensureButlerWorkspaceIsolation(workspacePath) {
267
+ const resolvedWorkspacePath = path.resolve(workspacePath);
268
+ fs.mkdirSync(resolvedWorkspacePath, { recursive: true });
269
+ if (isSamePath(readGitTopLevel(resolvedWorkspacePath), resolvedWorkspacePath)) {
270
+ return;
271
+ }
272
+ try {
273
+ // 必须建立真实 git 边界,假 .git 目录挡不住上层仓库规则继承。
274
+ execFileSync("git", ["-C", resolvedWorkspacePath, "init", "-q"], {
275
+ stdio: "ignore"
276
+ });
277
+ }
278
+ catch (error) {
279
+ throw new AppError({
280
+ statusCode: 500,
281
+ errorCode: "BUTLER_WORKSPACE_ISOLATION_FAILED",
282
+ detail: error instanceof Error
283
+ ? `代码助手工作目录初始化独立 git 边界失败:${error.message}`
284
+ : "代码助手工作目录初始化独立 git 边界失败"
285
+ });
286
+ }
287
+ if (!isSamePath(readGitTopLevel(resolvedWorkspacePath), resolvedWorkspacePath)) {
288
+ throw new AppError({
289
+ statusCode: 500,
290
+ errorCode: "BUTLER_WORKSPACE_ISOLATION_FAILED",
291
+ detail: "代码助手工作目录未能建立独立 git 边界"
292
+ });
293
+ }
294
+ }
295
+ function readGitTopLevel(workspacePath) {
296
+ try {
297
+ const output = execFileSync("git", ["-C", workspacePath, "rev-parse", "--show-toplevel"], {
298
+ encoding: "utf8",
299
+ stdio: ["ignore", "pipe", "ignore"]
300
+ });
301
+ const normalized = output.trim();
302
+ return normalized ? path.resolve(normalized) : null;
303
+ }
304
+ catch {
305
+ return null;
306
+ }
307
+ }
308
+ function isSamePath(left, right) {
309
+ if (!left) {
310
+ return false;
311
+ }
312
+ try {
313
+ return fs.realpathSync.native(left) === fs.realpathSync.native(right);
314
+ }
315
+ catch {
316
+ return path.resolve(left) === path.resolve(right);
317
+ }
318
+ }
319
+ function normalizePersona(value) {
320
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
321
+ throw invalidField("persona", "persona 必须是对象");
322
+ }
323
+ const record = value;
324
+ const tone = normalizeEnumText(record.tone, "persona.tone", SUPPORTED_PERSONA_TONES);
325
+ const language = normalizeEnumText(record.language, "persona.language", SUPPORTED_PERSONA_LANGUAGES);
326
+ const summaryStyle = normalizeEnumText(record.summaryStyle, "persona.summaryStyle", SUPPORTED_SUMMARY_STYLES);
327
+ return {
328
+ ...record,
329
+ tone,
330
+ language,
331
+ summaryStyle
332
+ };
333
+ }
334
+ function normalizeFocus(value) {
335
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
336
+ throw invalidField("focus", "focus 必须是对象");
337
+ }
338
+ const record = value;
339
+ const projectIds = record.projectIds === undefined
340
+ ? []
341
+ : normalizeStringArray(record.projectIds, "focus.projectIds");
342
+ const riskPreference = normalizeEnumText(record.riskPreference, "focus.riskPreference", SUPPORTED_RISK_PREFERENCES);
343
+ const reportPriority = normalizePriorityArray(record.reportPriority);
344
+ const summaryDebounceSeconds = normalizeSummaryDebounceSeconds(record.summaryDebounceSeconds);
345
+ return {
346
+ ...record,
347
+ projectIds,
348
+ riskPreference,
349
+ reportPriority,
350
+ summaryDebounceSeconds
351
+ };
352
+ }
353
+ function createDefaultPersona() {
354
+ return {
355
+ tone: "direct",
356
+ language: "zh-CN",
357
+ summaryStyle: "brief"
358
+ };
359
+ }
360
+ function createDefaultFocus() {
361
+ return {
362
+ projectIds: [],
363
+ riskPreference: "conservative",
364
+ reportPriority: ["risk", "blocker", "verification"],
365
+ summaryDebounceSeconds: DEFAULT_SUMMARY_DEBOUNCE_SECONDS
366
+ };
367
+ }
368
+ function normalizeSummaryDebounceSeconds(value) {
369
+ if (value === undefined || value === null || value === "") {
370
+ return DEFAULT_SUMMARY_DEBOUNCE_SECONDS;
371
+ }
372
+ if (typeof value !== "number" || !Number.isFinite(value)) {
373
+ throw invalidField("focus.summaryDebounceSeconds", "focus.summaryDebounceSeconds 必须是整数秒数");
374
+ }
375
+ const normalized = Math.trunc(value);
376
+ if (normalized < MIN_SUMMARY_DEBOUNCE_SECONDS
377
+ || normalized > MAX_SUMMARY_DEBOUNCE_SECONDS) {
378
+ throw invalidField("focus.summaryDebounceSeconds", `focus.summaryDebounceSeconds 必须在 ${MIN_SUMMARY_DEBOUNCE_SECONDS} 到 ${MAX_SUMMARY_DEBOUNCE_SECONDS} 秒之间`);
379
+ }
380
+ return normalized;
381
+ }
382
+ function normalizeEnumText(value, field, supportedValues) {
383
+ if (typeof value !== "string") {
384
+ throw invalidField(field, `${field} 必须是受支持的字符串`);
385
+ }
386
+ const normalized = value.trim();
387
+ if (!supportedValues.includes(normalized)) {
388
+ throw invalidField(field, `${field} 必须是受支持的字符串`);
389
+ }
390
+ return normalized;
391
+ }
392
+ function normalizeStringArray(value, field) {
393
+ if (!Array.isArray(value)) {
394
+ throw invalidField(field, `${field} 必须是字符串数组`);
395
+ }
396
+ return value.map((item, index) => {
397
+ if (typeof item !== "string" || !item.trim()) {
398
+ throw invalidField(field, `${field}[${index}] 必须是非空字符串`);
399
+ }
400
+ return item.trim();
401
+ });
402
+ }
403
+ function normalizePriorityArray(value) {
404
+ if (!Array.isArray(value) || value.length === 0) {
405
+ throw invalidField("focus.reportPriority", "focus.reportPriority 至少要有一个优先级");
406
+ }
407
+ const normalized = value.map((item, index) => {
408
+ if (typeof item !== "string" || !item.trim()) {
409
+ throw invalidField("focus.reportPriority", `focus.reportPriority[${index}] 必须是非空字符串`);
410
+ }
411
+ const priority = item.trim();
412
+ if (!SUPPORTED_REPORT_PRIORITIES.includes(priority)) {
413
+ throw invalidField("focus.reportPriority", `不支持的汇报优先级:${priority}`);
414
+ }
415
+ return priority;
416
+ });
417
+ return Array.from(new Set(normalized));
418
+ }
419
+ function buildGeneratedAgentsContent(input) {
420
+ return [
421
+ "# AGENTS.md",
422
+ `你是代码助手「${input.displayName}」。`,
423
+ `在对话中,你必须以“${input.displayName}”作为自称,让用户知道这是独立的助手身份,不是普通项目会话。`,
424
+ "这套规则只服务于代码助手工作目录,不继承普通项目工作区的会话规则。",
425
+ "如果上层仓库、默认配置或普通项目会话规则和这里冲突,以这里的助手规则为准。",
426
+ "",
427
+ "## 回答要求",
428
+ "- 先给结论,再给证据,最后给下一步建议。",
429
+ "- 只基于当前对话需要的摘要信息回答;不够时明确说明缺口,并继续补查真实项目、会话、巡视、验证信息。",
430
+ "- 不要把无关项目的原始记录整批塞进回答,更不要编造状态。",
431
+ "- 会话跟进时,如果目标或上下文提到了 spec,只能围绕 spec 明确写出的必做项推进,不能顺着建议项无限扩展。",
432
+ "- 如果没有 spec,就先归纳当前核心任务,然后只围绕这一个核心任务推进;重构、优化、顺手补充都默认不是必做项。",
433
+ "",
434
+ "## 初始化偏好(系统自动生成)",
435
+ `- 当前 provider:${input.providerId}`,
436
+ `- 语气:${describeTone(input.persona.tone)}`,
437
+ `- 使用语言:${describeLanguage(input.persona.language)}`,
438
+ `- 总结风格:${describeSummaryStyle(input.persona.summaryStyle)}`,
439
+ `- 风险倾向:${describeRiskPreference(input.focus.riskPreference)}`,
440
+ `- 汇报优先级:${describeReportPriority(input.focus.reportPriority)}`,
441
+ `- 会话摘要防抖:${describeSummaryDebounceSeconds(input.focus.summaryDebounceSeconds)}`
442
+ ].join("\n");
443
+ }
444
+ function hydrateStoredProfile(profile) {
445
+ return {
446
+ ...profile,
447
+ providerId: hydrateStoredProviderId(profile.providerId),
448
+ persona: normalizePersona(profile.persona),
449
+ focus: normalizeFocus(profile.focus)
450
+ };
451
+ }
452
+ function describeTone(value) {
453
+ switch (value) {
454
+ case "friendly":
455
+ return "友好耐心,但不绕弯";
456
+ case "steady":
457
+ return "稳健克制,重点清楚";
458
+ case "direct":
459
+ default:
460
+ return "直接明确,不说空话";
461
+ }
462
+ }
463
+ function describeLanguage(value) {
464
+ switch (value) {
465
+ case "en-US":
466
+ return "优先英文";
467
+ case "bilingual":
468
+ return "中英双语,必要时先中文后英文";
469
+ case "zh-CN":
470
+ default:
471
+ return "优先简体中文";
472
+ }
473
+ }
474
+ function describeSummaryStyle(value) {
475
+ switch (value) {
476
+ case "thorough":
477
+ return "完整展开,适合复杂问题";
478
+ case "structured":
479
+ return "分段清晰,便于快速扫描";
480
+ case "brief":
481
+ default:
482
+ return "简明扼要,先说重点";
483
+ }
484
+ }
485
+ function describeRiskPreference(value) {
486
+ switch (value) {
487
+ case "proactive":
488
+ return "主动暴露潜在风险,宁可早提醒";
489
+ case "balanced":
490
+ return "平衡推进和风险控制";
491
+ case "conservative":
492
+ default:
493
+ return "保守稳妥,先避免误判和误操作";
494
+ }
495
+ }
496
+ function describeReportPriority(values) {
497
+ return values.map((value) => {
498
+ switch (value) {
499
+ case "blocker":
500
+ return "阻塞";
501
+ case "verification":
502
+ return "验证";
503
+ case "progress":
504
+ return "进展";
505
+ case "risk":
506
+ default:
507
+ return "风险";
508
+ }
509
+ }).join("、");
510
+ }
511
+ function describeSummaryDebounceSeconds(value) {
512
+ if (value % 60 === 0) {
513
+ return `${value / 60} 分钟`;
514
+ }
515
+ return `${value} 秒`;
516
+ }
517
+ function isPathWithinWorkspace(workspacePath, targetPath) {
518
+ const relative = path.relative(path.resolve(workspacePath), path.resolve(targetPath));
519
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
520
+ }
521
+ function invalidField(field, detail) {
522
+ throw new AppError({
523
+ statusCode: 400,
524
+ errorCode: "INVALID_INPUT",
525
+ detail,
526
+ field
527
+ });
528
+ }
529
+ //# sourceMappingURL=butler-profile-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"butler-profile-service.js","sourceRoot":"","sources":["../../../../src/modules/butler/butler-profile-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { ButlerProject } 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 { WorkspaceRepository } from "../../storage/repositories/workspace-repository.js";
5
+ import type { ButlerProfileService } from "./butler-profile-service.js";
6
+ export interface CreateButlerProjectInput {
7
+ workspaceId: string;
8
+ name: string;
9
+ repoRoot: string;
10
+ defaultProvider?: ButlerProject["defaultProvider"];
11
+ approvalMode?: ButlerProject["approvalMode"];
12
+ config?: Record<string, unknown>;
13
+ }
14
+ export interface UpdateButlerProjectInput {
15
+ name?: string;
16
+ defaultProvider?: ButlerProject["defaultProvider"];
17
+ approvalMode?: ButlerProject["approvalMode"];
18
+ lifecycleStatus?: ButlerProject["lifecycleStatus"];
19
+ riskLevel?: ButlerProject["riskLevel"];
20
+ config?: Record<string, unknown>;
21
+ }
22
+ export declare class ButlerProjectService {
23
+ private readonly butlerProjectRepository;
24
+ private readonly butlerSessionRepository;
25
+ private readonly workspaceRepository;
26
+ private readonly butlerProfileService?;
27
+ constructor(butlerProjectRepository: ButlerProjectRepository, butlerSessionRepository: ButlerSessionRepository, workspaceRepository: WorkspaceRepository, butlerProfileService?: Pick<ButlerProfileService, "getProfile"> | undefined);
28
+ list(input?: {
29
+ workspaceId?: string;
30
+ lifecycleStatus?: ButlerProject["lifecycleStatus"];
31
+ riskLevel?: ButlerProject["riskLevel"];
32
+ }): ButlerProject[];
33
+ create(input: CreateButlerProjectInput): ButlerProject;
34
+ getById(projectId: string): ButlerProject;
35
+ resolveWorkspaceActionProject(workspaceId: string): ButlerProject;
36
+ update(projectId: string, input: UpdateButlerProjectInput): ButlerProject;
37
+ getOverview(projectId: string): {
38
+ project: ButlerProject;
39
+ activeSessionCount: number;
40
+ latestPatrolRun: null;
41
+ latestVerificationRun: null;
42
+ topRisks: string[];
43
+ nextSuggestions: string[];
44
+ };
45
+ private getWorkspaceOrThrow;
46
+ private syncManagedProjects;
47
+ private resolveRepoRootWithinWorkspace;
48
+ }