@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,55 @@
1
+ import type { ButlerControlSession, SessionListItem } from "../../types/domain.js";
2
+ import type { ButlerControlSessionRepository } from "../../storage/repositories/butler-control-session-repository.js";
3
+ import { type ButlerProfileService } from "./butler-profile-service.js";
4
+ import type { ButlerAuthService } from "./butler-auth-service.js";
5
+ import type { WorkspaceService } from "../workspace/workspace-service.js";
6
+ import type { SessionHistoryService } from "../sessions/session-history-service.js";
7
+ import type { SessionLiveRuntimeService } from "../sessions/session-live-runtime-service.js";
8
+ import type { ButlerContextAggregator } from "./context-aggregator.js";
9
+ export interface ButlerControlSessionView extends ButlerControlSession {
10
+ session: SessionListItem;
11
+ }
12
+ export interface StartButlerControlSessionInput {
13
+ content?: string;
14
+ clientRequestId?: string | null;
15
+ model?: string | null;
16
+ reasoningLevel?: string | null;
17
+ permissionMode?: string | null;
18
+ }
19
+ export interface SendButlerControlMessageInput extends StartButlerControlSessionInput {
20
+ content?: string;
21
+ }
22
+ export declare class ButlerControlSessionService {
23
+ private readonly butlerProfileService;
24
+ private readonly butlerControlSessionRepository;
25
+ private readonly workspaceService;
26
+ private readonly sessionHistoryService;
27
+ private readonly sessionLiveRuntimeService;
28
+ private readonly butlerContextAggregator;
29
+ private readonly butlerAuthService;
30
+ private readonly codexHomeDir;
31
+ private readonly sourceCodexHomeDir;
32
+ constructor(butlerProfileService: ButlerProfileService, butlerControlSessionRepository: ButlerControlSessionRepository, workspaceService: Pick<WorkspaceService, "importWorkspace">, sessionHistoryService: Pick<SessionHistoryService, "getSession" | "resumeSession">, sessionLiveRuntimeService: Pick<SessionLiveRuntimeService, "startLiveSession" | "sendLiveMessage">, butlerContextAggregator: Pick<ButlerContextAggregator, "resolvePromptContext">, butlerAuthService: Pick<ButlerAuthService, "ensureWorkspaceCredential" | "getCredentialFilePath">, codexHomeDir?: string | null, sourceCodexHomeDir?: string | null);
33
+ getCurrentSession(userId: string): ButlerControlSessionView | null;
34
+ resetCurrentSession(): void;
35
+ startSession(userId: string, input?: StartButlerControlSessionInput): Promise<ButlerControlSessionView>;
36
+ resumeCurrentSession(userId: string): Promise<ButlerControlSessionView & {
37
+ resumedAt: string;
38
+ provider: string;
39
+ providerSessionId: string;
40
+ }>;
41
+ sendMessage(userId: string, input: SendButlerControlMessageInput): Promise<{
42
+ controlSession: ButlerControlSessionView;
43
+ sessionId: string;
44
+ provider: string;
45
+ providerSessionId: string;
46
+ acceptedAt: string;
47
+ clientRequestId: string | null;
48
+ message: Awaited<ReturnType<SessionLiveRuntimeService["sendLiveMessage"]>>["message"];
49
+ }>;
50
+ private requireCurrentSession;
51
+ private toView;
52
+ private prepareWorkspace;
53
+ private syncWorkspaceContext;
54
+ private markFailed;
55
+ }
@@ -0,0 +1,367 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { AppError } from "../../shared/errors/app-error.js";
5
+ import { createId } from "../../shared/utils/id.js";
6
+ import { nowIso } from "../../shared/utils/time.js";
7
+ import { ensureButlerWorkspaceIsolation } from "./butler-profile-service.js";
8
+ export class ButlerControlSessionService {
9
+ butlerProfileService;
10
+ butlerControlSessionRepository;
11
+ workspaceService;
12
+ sessionHistoryService;
13
+ sessionLiveRuntimeService;
14
+ butlerContextAggregator;
15
+ butlerAuthService;
16
+ codexHomeDir;
17
+ sourceCodexHomeDir;
18
+ constructor(butlerProfileService, butlerControlSessionRepository, workspaceService, sessionHistoryService, sessionLiveRuntimeService, butlerContextAggregator, butlerAuthService, codexHomeDir = null, sourceCodexHomeDir = null) {
19
+ this.butlerProfileService = butlerProfileService;
20
+ this.butlerControlSessionRepository = butlerControlSessionRepository;
21
+ this.workspaceService = workspaceService;
22
+ this.sessionHistoryService = sessionHistoryService;
23
+ this.sessionLiveRuntimeService = sessionLiveRuntimeService;
24
+ this.butlerContextAggregator = butlerContextAggregator;
25
+ this.butlerAuthService = butlerAuthService;
26
+ this.codexHomeDir = codexHomeDir;
27
+ this.sourceCodexHomeDir = sourceCodexHomeDir;
28
+ }
29
+ getCurrentSession(userId) {
30
+ const profile = this.butlerProfileService.ensureInitialized();
31
+ const current = this.butlerControlSessionRepository.findLatestByProvider(profile.providerId);
32
+ if (!current) {
33
+ return null;
34
+ }
35
+ return this.toView(current, userId);
36
+ }
37
+ resetCurrentSession() {
38
+ const profile = this.butlerProfileService.ensureInitialized();
39
+ const current = this.butlerControlSessionRepository.findLatestByProvider(profile.providerId);
40
+ if (!current || current.status === "closed") {
41
+ return;
42
+ }
43
+ this.butlerControlSessionRepository.update({
44
+ ...current,
45
+ status: "closed",
46
+ updatedAt: nowIso()
47
+ });
48
+ }
49
+ async startSession(userId, input = {}) {
50
+ const profile = this.butlerProfileService.ensureInitialized();
51
+ const content = normalizeControlContent(input.content, "");
52
+ const promptContext = await this.butlerContextAggregator.resolvePromptContext(userId, input.content ?? null);
53
+ const workspace = this.prepareWorkspace(profile, promptContext, userId);
54
+ const current = this.butlerControlSessionRepository.findLatestByProvider(profile.providerId);
55
+ if (current && current.status !== "closed") {
56
+ this.butlerControlSessionRepository.update({
57
+ ...current,
58
+ status: "closed",
59
+ updatedAt: nowIso()
60
+ });
61
+ }
62
+ const started = await this.sessionLiveRuntimeService.startLiveSession({
63
+ workspaceId: workspace.id,
64
+ userId,
65
+ provider: profile.providerId,
66
+ content,
67
+ clientRequestId: normalizeNullableText(input.clientRequestId),
68
+ runtimeOptions: {
69
+ model: normalizeNullableText(input.model),
70
+ reasoningLevel: normalizeNullableText(input.reasoningLevel),
71
+ permissionMode: normalizeNullableText(input.permissionMode),
72
+ attachments: []
73
+ }
74
+ });
75
+ const timestamp = started.acceptedAt;
76
+ const created = this.butlerControlSessionRepository.create({
77
+ id: createId(),
78
+ providerId: profile.providerId,
79
+ sessionId: started.sessionId,
80
+ status: "running",
81
+ lastContextVersion: promptContext.version,
82
+ lastSummary: summarizeMessage(content),
83
+ createdAt: timestamp,
84
+ updatedAt: timestamp
85
+ });
86
+ return this.toView(created, userId);
87
+ }
88
+ async resumeCurrentSession(userId) {
89
+ const profile = this.butlerProfileService.ensureInitialized();
90
+ const current = this.requireCurrentSession(profile.providerId);
91
+ const promptContext = await this.butlerContextAggregator.resolvePromptContext(userId, null);
92
+ this.syncWorkspaceContext(profile, promptContext, userId);
93
+ try {
94
+ const resumed = await this.sessionHistoryService.resumeSession(current.sessionId);
95
+ const updated = this.butlerControlSessionRepository.update({
96
+ ...current,
97
+ status: "running",
98
+ lastContextVersion: promptContext.version,
99
+ updatedAt: resumed.resumedAt
100
+ });
101
+ return {
102
+ ...this.toView(updated, userId),
103
+ resumedAt: resumed.resumedAt,
104
+ provider: resumed.provider,
105
+ providerSessionId: resumed.providerSessionId
106
+ };
107
+ }
108
+ catch (error) {
109
+ this.markFailed(current, "控制会话续接失败");
110
+ throw error;
111
+ }
112
+ }
113
+ async sendMessage(userId, input) {
114
+ const profile = this.butlerProfileService.ensureInitialized();
115
+ const current = this.requireCurrentSession(profile.providerId);
116
+ const content = normalizeControlContent(input.content, "");
117
+ const promptContext = await this.butlerContextAggregator.resolvePromptContext(userId, content);
118
+ this.syncWorkspaceContext(profile, promptContext, userId);
119
+ try {
120
+ const result = await this.sessionLiveRuntimeService.sendLiveMessage({
121
+ sessionId: current.sessionId,
122
+ userId,
123
+ content,
124
+ clientRequestId: normalizeNullableText(input.clientRequestId),
125
+ runtimeOptions: {
126
+ model: normalizeNullableText(input.model),
127
+ reasoningLevel: normalizeNullableText(input.reasoningLevel),
128
+ permissionMode: normalizeNullableText(input.permissionMode),
129
+ attachments: []
130
+ }
131
+ });
132
+ const updated = this.butlerControlSessionRepository.update({
133
+ ...current,
134
+ status: "running",
135
+ lastContextVersion: promptContext.version,
136
+ lastSummary: summarizeMessage(content),
137
+ updatedAt: result.acceptedAt
138
+ });
139
+ return {
140
+ controlSession: this.toView(updated, userId),
141
+ sessionId: result.sessionId,
142
+ provider: result.provider,
143
+ providerSessionId: result.providerSessionId,
144
+ acceptedAt: result.acceptedAt,
145
+ clientRequestId: result.clientRequestId,
146
+ message: result.message
147
+ };
148
+ }
149
+ catch (error) {
150
+ this.markFailed(current, summarizeMessage(content));
151
+ throw error;
152
+ }
153
+ }
154
+ requireCurrentSession(providerId) {
155
+ const current = this.butlerControlSessionRepository.findLatestByProvider(providerId);
156
+ if (!current || current.status === "closed") {
157
+ throw new AppError({
158
+ statusCode: 404,
159
+ errorCode: "BUTLER_CONTROL_SESSION_NOT_FOUND",
160
+ detail: "当前 provider 下还没有可用的助手控制会话"
161
+ });
162
+ }
163
+ return current;
164
+ }
165
+ toView(record, userId) {
166
+ return {
167
+ ...record,
168
+ session: this.sessionHistoryService.getSession(record.sessionId, userId)
169
+ };
170
+ }
171
+ prepareWorkspace(profile, promptContext, userId) {
172
+ this.syncWorkspaceContext(profile, promptContext, userId);
173
+ return this.workspaceService.importWorkspace(profile.workspacePath, "代码助手");
174
+ }
175
+ syncWorkspaceContext(profile, promptContext, userId) {
176
+ fs.mkdirSync(profile.workspacePath, { recursive: true });
177
+ ensureButlerWorkspaceIsolation(profile.workspacePath);
178
+ const auth = this.butlerAuthService.ensureWorkspaceCredential(profile.workspacePath, userId);
179
+ writeInstructionFiles(profile, promptContext, auth, this.butlerAuthService.getCredentialFilePath(profile.workspacePath));
180
+ syncCodexInstructionConfig(profile, this.codexHomeDir, this.sourceCodexHomeDir);
181
+ }
182
+ markFailed(record, fallbackSummary) {
183
+ this.butlerControlSessionRepository.update({
184
+ ...record,
185
+ status: "failed",
186
+ lastSummary: record.lastSummary ?? fallbackSummary,
187
+ updatedAt: nowIso()
188
+ });
189
+ }
190
+ }
191
+ function writeInstructionFiles(profile, promptContext, auth, authFilePath) {
192
+ const rootAgentsPath = path.join(profile.workspacePath, "AGENTS.md");
193
+ writeFileIfChanged(rootAgentsPath, composeInstructionContent(profile, promptContext));
194
+ if (profile.agentsMode === "file" && profile.agentsFilePath) {
195
+ writeFileIfChanged(profile.agentsFilePath, composeInstructionContent(profile, promptContext));
196
+ }
197
+ if (profile.providerId === "claude-code") {
198
+ const claudeFilePath = path.join(profile.workspacePath, "CLAUDE.md");
199
+ writeFileIfChanged(claudeFilePath, composeInstructionContent(profile, promptContext));
200
+ }
201
+ writeFileIfChanged(path.join(profile.workspacePath, "BUTLER_CONTEXT.md"), `${promptContext.prompt.trim()}\n`);
202
+ writeFileIfChanged(path.join(profile.workspacePath, "BUTLER_API.md"), buildApiGuideContent(auth, authFilePath));
203
+ }
204
+ function syncCodexInstructionConfig(profile, codexHomeDir, sourceCodexHomeDir) {
205
+ if (profile.providerId !== "codex" || !codexHomeDir?.trim()) {
206
+ return;
207
+ }
208
+ const targetHomeDir = path.resolve(codexHomeDir);
209
+ const sourceHomeDir = resolveSourceCodexHomeDir(sourceCodexHomeDir, targetHomeDir);
210
+ const sourceConfigPath = path.join(sourceHomeDir, "config.toml");
211
+ const instructionFilePath = profile.agentsMode === "file" && profile.agentsFilePath
212
+ ? path.resolve(profile.agentsFilePath)
213
+ : path.join(profile.workspacePath, "AGENTS.md");
214
+ const sourceConfigContent = sourceHomeDir !== targetHomeDir && fs.existsSync(sourceConfigPath) && fs.statSync(sourceConfigPath).isFile()
215
+ ? fs.readFileSync(sourceConfigPath, "utf8")
216
+ : "";
217
+ const configContent = composeCodexConfigContent(sourceConfigContent, instructionFilePath);
218
+ fs.mkdirSync(targetHomeDir, { recursive: true });
219
+ removeFileIfExists(path.join(targetHomeDir, "AGENTS.md"));
220
+ removeFileIfExists(path.join(targetHomeDir, "AGENTS.override.md"));
221
+ // 助手需要独立规则,但不能因为独立 home 丢掉 Codex 登录态。
222
+ syncOptionalFile(path.join(sourceHomeDir, "auth.json"), path.join(targetHomeDir, "auth.json"));
223
+ writeFileIfChanged(path.join(targetHomeDir, "config.toml"), `${configContent}\n`);
224
+ }
225
+ function resolveSourceCodexHomeDir(sourceCodexHomeDir, targetHomeDir) {
226
+ const configuredSource = sourceCodexHomeDir?.trim();
227
+ if (configuredSource) {
228
+ const resolvedConfiguredSource = path.resolve(configuredSource);
229
+ if (resolvedConfiguredSource !== targetHomeDir) {
230
+ return resolvedConfiguredSource;
231
+ }
232
+ }
233
+ const fallbackHomeDir = path.resolve(path.join(os.homedir(), ".codex"));
234
+ if (fallbackHomeDir !== targetHomeDir) {
235
+ return fallbackHomeDir;
236
+ }
237
+ return targetHomeDir;
238
+ }
239
+ function composeCodexConfigContent(sourceConfigContent, instructionFilePath) {
240
+ const normalizedSource = sourceConfigContent
241
+ .split(/\r?\n/)
242
+ .filter((line) => {
243
+ const trimmed = line.trim();
244
+ return trimmed.length > 0 && !trimmed.startsWith("model_instructions_file");
245
+ })
246
+ .join("\n")
247
+ .trim();
248
+ return [
249
+ "# 代码助手专用 Codex 配置(系统自动生成)",
250
+ normalizedSource,
251
+ `model_instructions_file = ${toTomlString(instructionFilePath)}`
252
+ ]
253
+ .filter((part) => part.trim().length > 0)
254
+ .join("\n\n");
255
+ }
256
+ function writeFileIfChanged(filePath, content) {
257
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
258
+ if (fs.existsSync(filePath) && fs.readFileSync(filePath, "utf8") === content) {
259
+ return;
260
+ }
261
+ fs.writeFileSync(filePath, content, "utf8");
262
+ }
263
+ function composeInstructionContent(profile, promptContext) {
264
+ return `${profile.agentsContent.trim()}
265
+
266
+ ## 代码助手运行附加说明(系统自动生成)
267
+
268
+ - 当前工作目录是代码助手专用目录,只使用这里的助手规则,不回退到普通项目会话规则。
269
+ - 当前聚合后的平台摘要写在 \`BUTLER_CONTEXT.md\`,先看这里,不要把所有项目原始记录一股脑塞进回答。
270
+ - 当前摘要作用域是:${promptContext.scope === "project" ? `项目 ${promptContext.projectId}` : "全局总览"}。
271
+ - 如果你在跟进开发会话,且目标或上下文里提到了 spec,只能围绕 spec 明确写出的必做项推进,不能顺着建议项无限扩展开发范围。
272
+ - 如果当前没有 spec,就先从用户要求和会话现状里归纳一句核心任务,后续只围绕这个核心任务推进;不要把建议项、最佳实践、顺手优化当成必做项。
273
+ - 如果用户的问题里已经带了项目名、会话名、错误词或任务关键词,优先按 \`BUTLER_API.md\` 调 \`GET /api/butler/search?q=...\` 命中摘要,再决定要不要继续翻原始消息;如果用户明确点名历史会话或归档会话,记得加 \`includeArchived=true\`。
274
+ - 如果 \`BUTLER_CONTEXT.md\` 里的项目数或会话数是 0,不能直接下结论,必须先按 \`BUTLER_API.md\` 实查一次 \`GET /api/butler/overview\` 和 \`GET /api/butler/projects\`。
275
+ - 如果用户追问的细节超出当前摘要,先明确缺口,再要求宿主系统按 \`BUTLER_API.md\` 的说明补查具体项目、会话、巡视或验证信息。
276
+ - 如果用户追问会话内容,先定位 \`sessionId\`,再调用 \`GET /api/sessions/:sessionId/messages?direction=backward&limit=40\` 查看最近消息,不要只复述摘要。
277
+ - 不要编造不存在的项目状态;信息不足时直接说缺什么。
278
+ `;
279
+ }
280
+ function buildApiGuideContent(auth, authFilePath) {
281
+ return `# 代码助手内部补查接口
282
+
283
+ 这些接口由宿主系统提供,用于按需补查信息,不应该在每轮对话默认全量注入。
284
+
285
+ ## 固定认证方式
286
+
287
+ - Butler 专用凭证文件:\`${path.basename(authFilePath)}\`
288
+ - 凭证文件路径:\`${authFilePath}\`
289
+ - 当前 API 基地址:\`${auth.apiBaseUrl}\`
290
+ - 调内部接口时固定读取这个文件,不要每轮重新摸索认证方式。
291
+ - 请求头固定为:\`Authorization: Bearer <BUTLER_AUTH.json.accessToken>\`
292
+
293
+ ## 默认读取顺序
294
+
295
+ 1. 先读 \`BUTLER_CONTEXT.md\` 的当前摘要。
296
+ 2. 用户的问题里带了项目名、会话名、报错词、任务词时,先补查 \`GET /api/butler/search?q=...\`,优先命中摘要层;如果用户明确点名历史会话或归档会话,改用 \`GET /api/butler/search?q=...&includeArchived=true\`。
297
+ 3. 如果摘要里项目数或会话数是 0,先补查 \`GET /api/butler/overview\` 和 \`GET /api/butler/projects\`,确认不是旧摘要。
298
+ 4. 用户问全局情况时,补查 \`GET /api/butler/overview\`。
299
+ 5. 用户明确追问某个项目时,补查 \`GET /api/butler/projects/:projectId/context\`。
300
+ 6. 用户追问某个会话内容时,先拿到 \`sessionId\`,再补查 \`GET /api/sessions/:sessionId/messages?direction=backward&limit=40\`。
301
+ 7. 仍然不够时,再按既有 butler 细节接口查询项目、会话、记忆、巡视、验证对象。
302
+
303
+ ## 调用示例
304
+
305
+ \`\`\`bash
306
+ TOKEN="$(jq -r '.accessToken' "${authFilePath}")"
307
+ BASE_URL="$(jq -r '.apiBaseUrl' "${authFilePath}")"
308
+ curl -H "Authorization: Bearer ${"$"}TOKEN" "${"$"}BASE_URL/api/butler/overview"
309
+ \`\`\`
310
+
311
+ ## 可用接口
312
+
313
+ - \`GET /api/butler/overview\`:全局聚合总览,只返回摘要层和行动层。
314
+ - \`GET /api/butler/projects\`:当前 Butler 视图中的项目列表。
315
+ - \`GET /api/butler/context-snapshot\`:完整聚合快照,仍然只返回摘要字段,不返回全量原始正文。
316
+ - \`GET /api/butler/search?q=...\`:Butler 摘要优先检索入口,先按项目、会话、记忆、巡视、验证摘要做命中。
317
+ - \`GET /api/butler/search?q=...&includeArchived=true\`:当用户明确要查历史会话或归档会话时,扩展到归档摘要。
318
+ - \`GET /api/butler/projects/:projectId/context\`:单项目聚合上下文,用于回答项目级追问。
319
+ - \`GET /api/butler/projects/:projectId/sessions\`:项目会话列表。
320
+ - \`GET /api/butler/projects/:projectId/memories\`:项目记忆摘要列表。
321
+ - \`GET /api/butler/projects/:projectId/patrol-runs\`:项目巡视记录列表。
322
+ - \`GET /api/butler/projects/:projectId/verifications\`:项目验证记录列表。
323
+ - \`GET /api/sessions/:sessionId/messages?direction=backward&limit=40\`:读取某个真实会话最近几十条消息。
324
+ `;
325
+ }
326
+ function toTomlString(value) {
327
+ return `"${value.replaceAll("\\", "\\\\").replaceAll("\"", "\\\"")}"`;
328
+ }
329
+ function removeFileIfExists(filePath) {
330
+ if (!fs.existsSync(filePath)) {
331
+ return;
332
+ }
333
+ if (fs.statSync(filePath).isFile()) {
334
+ fs.rmSync(filePath, { force: true });
335
+ }
336
+ }
337
+ function syncOptionalFile(sourcePath, targetPath) {
338
+ if (!fs.existsSync(sourcePath) || !fs.statSync(sourcePath).isFile()) {
339
+ removeFileIfExists(targetPath);
340
+ return;
341
+ }
342
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
343
+ if (fs.existsSync(targetPath) && fs.readFileSync(targetPath).equals(fs.readFileSync(sourcePath))) {
344
+ return;
345
+ }
346
+ fs.copyFileSync(sourcePath, targetPath);
347
+ }
348
+ function normalizeControlContent(value, fallback) {
349
+ const normalized = value?.trim() ?? fallback.trim();
350
+ if (!normalized) {
351
+ throw new AppError({
352
+ statusCode: 400,
353
+ errorCode: "INVALID_INPUT",
354
+ detail: "发送控制会话消息必须提供 content",
355
+ field: "content"
356
+ });
357
+ }
358
+ return normalized;
359
+ }
360
+ function normalizeNullableText(value) {
361
+ const normalized = value?.trim();
362
+ return normalized ? normalized : null;
363
+ }
364
+ function summarizeMessage(content) {
365
+ return content.length > 120 ? `${content.slice(0, 117)}...` : content;
366
+ }
367
+ //# sourceMappingURL=butler-control-session-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"butler-control-session-service.js","sourceRoot":"","sources":["../../../../src/modules/butler/butler-control-session-service.ts"],"names":[],"mappings":"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"}