@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,99 @@
1
+ import { nowIso } from "../../shared/utils/time.js";
2
+ const DEFAULT_INTERVAL_MS = 30_000;
3
+ const DEFAULT_STALE_TIMEOUT_MS = 20 * 60_000;
4
+ const MAX_PLANS_PER_TICK = 50;
5
+ /**
6
+ * 巡视计划后台调度器。
7
+ *
8
+ * 第一版只做两件事:
9
+ * 1. 周期扫描已到期的计划
10
+ * 2. 为到期计划登记一条巡视运行记录,并推进下一次触发时间
11
+ */
12
+ export class PatrolScheduler {
13
+ patrolPlanService;
14
+ patrolRunService;
15
+ patrolExecutionService;
16
+ intervalMs;
17
+ staleTimeoutMs;
18
+ logger;
19
+ now;
20
+ timer = null;
21
+ ticking = false;
22
+ constructor(patrolPlanService, patrolRunService, patrolExecutionService, options = {}) {
23
+ this.patrolPlanService = patrolPlanService;
24
+ this.patrolRunService = patrolRunService;
25
+ this.patrolExecutionService = patrolExecutionService;
26
+ this.intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;
27
+ this.staleTimeoutMs = options.staleTimeoutMs ?? DEFAULT_STALE_TIMEOUT_MS;
28
+ this.logger = options.logger ?? console;
29
+ this.now = options.now ?? nowIso;
30
+ }
31
+ start() {
32
+ if (this.timer) {
33
+ return;
34
+ }
35
+ void this.tick();
36
+ this.timer = setInterval(() => {
37
+ void this.tick();
38
+ }, this.intervalMs);
39
+ this.timer.unref?.();
40
+ }
41
+ async dispose() {
42
+ if (this.timer) {
43
+ clearInterval(this.timer);
44
+ this.timer = null;
45
+ }
46
+ while (this.ticking) {
47
+ await new Promise((resolve) => setTimeout(resolve, 10));
48
+ }
49
+ }
50
+ async runOnce() {
51
+ await this.tick();
52
+ }
53
+ async tick() {
54
+ if (this.ticking) {
55
+ return;
56
+ }
57
+ this.ticking = true;
58
+ try {
59
+ const referenceAt = this.now();
60
+ const plans = this.patrolPlanService.listDuePlans(referenceAt, MAX_PLANS_PER_TICK);
61
+ for (const plan of plans) {
62
+ try {
63
+ const expiredRuns = this.patrolRunService.expireStaleRunningRuns(plan.projectId, {
64
+ referenceAt,
65
+ staleTimeoutMs: this.staleTimeoutMs,
66
+ summary: "巡视执行超过调度容忍时长,系统已自动终止并标记失败"
67
+ });
68
+ if (expiredRuns.length > 0) {
69
+ this.logger.error("[patrol-scheduler] stale runs reclaimed", {
70
+ projectId: plan.projectId,
71
+ runIds: expiredRuns.map((run) => run.id)
72
+ });
73
+ }
74
+ if (this.patrolRunService.hasRunningRun(plan.projectId)) {
75
+ continue;
76
+ }
77
+ const run = this.patrolRunService.startRun(plan.projectId, {
78
+ planId: plan.id,
79
+ triggeredBy: "scheduler",
80
+ triggerRef: `patrol-scheduler:${referenceAt}`
81
+ });
82
+ await this.patrolExecutionService.executeQueuedRun(run.id);
83
+ this.patrolPlanService.markPlanScheduled(plan.projectId, plan.id, referenceAt);
84
+ }
85
+ catch (error) {
86
+ this.logger.error("[patrol-scheduler] tick plan failed", {
87
+ planId: plan.id,
88
+ projectId: plan.projectId,
89
+ error: error instanceof Error ? error.message : String(error)
90
+ });
91
+ }
92
+ }
93
+ }
94
+ finally {
95
+ this.ticking = false;
96
+ }
97
+ }
98
+ }
99
+ //# sourceMappingURL=patrol-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patrol-scheduler.js","sourceRoot":"","sources":["../../../../src/modules/butler/patrol-scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ButlerProjectRepository } from "../../storage/repositories/butler-project-repository.js";
2
+ import type { ProjectMemory, ProjectMemoryStatus, ProjectMemoryType } from "../../types/domain.js";
3
+ import type { ProjectMemoryRepository } from "../../storage/repositories/project-memory-repository.js";
4
+ interface InputMemory {
5
+ title?: string;
6
+ scopePath?: string | null;
7
+ content?: string;
8
+ tags?: string[];
9
+ confidence?: number;
10
+ status?: ProjectMemoryStatus;
11
+ memoryType?: ProjectMemoryType;
12
+ evidence?: Record<string, unknown>;
13
+ }
14
+ export declare class ProjectMemoryService {
15
+ private readonly projectRepository;
16
+ private readonly memoryRepository;
17
+ constructor(projectRepository: ButlerProjectRepository, memoryRepository: ProjectMemoryRepository);
18
+ listMemories(projectId: string, filters?: {
19
+ status?: ProjectMemoryStatus;
20
+ memoryType?: ProjectMemoryType;
21
+ scopePath?: string;
22
+ query?: string;
23
+ }): ProjectMemory[];
24
+ createMemory(projectId: string, input: InputMemory): ProjectMemory;
25
+ updateMemory(projectId: string, memoryId: string, input: InputMemory): ProjectMemory;
26
+ private ensureProject;
27
+ private requireText;
28
+ private normalizeConfidence;
29
+ }
30
+ export {};
@@ -0,0 +1,103 @@
1
+ import { AppError } from "../../shared/errors/app-error.js";
2
+ import { createId } from "../../shared/utils/id.js";
3
+ import { nowIso } from "../../shared/utils/time.js";
4
+ export class ProjectMemoryService {
5
+ projectRepository;
6
+ memoryRepository;
7
+ constructor(projectRepository, memoryRepository) {
8
+ this.projectRepository = projectRepository;
9
+ this.memoryRepository = memoryRepository;
10
+ }
11
+ listMemories(projectId, filters) {
12
+ this.ensureProject(projectId);
13
+ return this.memoryRepository.listByProject(projectId, filters);
14
+ }
15
+ createMemory(projectId, input) {
16
+ const project = this.ensureProject(projectId);
17
+ const title = this.requireText(input.title, "title");
18
+ const content = this.requireText(input.content, "content");
19
+ const confidence = this.normalizeConfidence(input.confidence);
20
+ const record = {
21
+ id: createId(),
22
+ projectId: project.id,
23
+ sourceButlerSessionId: null,
24
+ sourceCheckpointId: null,
25
+ memoryType: input.memoryType ?? "note",
26
+ title,
27
+ scopePath: input.scopePath ?? null,
28
+ content,
29
+ tags: input.tags ?? [],
30
+ confidence,
31
+ status: input.status ?? "candidate",
32
+ evidence: input.evidence ?? {},
33
+ supersededBy: null,
34
+ createdAt: nowIso(),
35
+ updatedAt: nowIso()
36
+ };
37
+ return this.memoryRepository.create(record);
38
+ }
39
+ updateMemory(projectId, memoryId, input) {
40
+ this.ensureProject(projectId);
41
+ const memory = this.memoryRepository.findById(memoryId);
42
+ if (!memory) {
43
+ throw new AppError({ statusCode: 404, errorCode: "MEMORY_NOT_FOUND", detail: "记忆不存在" });
44
+ }
45
+ if (memory.projectId !== projectId) {
46
+ throw new AppError({
47
+ statusCode: 404,
48
+ errorCode: "MEMORY_NOT_FOUND",
49
+ detail: "当前项目下不存在该记忆"
50
+ });
51
+ }
52
+ if (input.title) {
53
+ memory.title = this.requireText(input.title, "title");
54
+ }
55
+ if (input.content) {
56
+ memory.content = this.requireText(input.content, "content");
57
+ }
58
+ if (input.scopePath !== undefined) {
59
+ memory.scopePath = input.scopePath;
60
+ }
61
+ memory.tags = input.tags ?? memory.tags;
62
+ memory.confidence = this.normalizeConfidence(input.confidence, memory.confidence);
63
+ memory.status = input.status ?? memory.status;
64
+ memory.memoryType = input.memoryType ?? memory.memoryType;
65
+ memory.evidence = input.evidence ?? memory.evidence;
66
+ memory.updatedAt = nowIso();
67
+ return this.memoryRepository.update(memory);
68
+ }
69
+ ensureProject(projectId) {
70
+ const project = this.projectRepository.findById(projectId);
71
+ if (!project) {
72
+ throw new AppError({ statusCode: 404, errorCode: "BUTLER_PROJECT_NOT_FOUND", detail: "项目不存在" });
73
+ }
74
+ return project;
75
+ }
76
+ requireText(value, field) {
77
+ const normalized = value?.trim();
78
+ if (!normalized) {
79
+ throw new AppError({
80
+ statusCode: 400,
81
+ errorCode: "INVALID_INPUT",
82
+ detail: `${field} 不能为空`,
83
+ field
84
+ });
85
+ }
86
+ return normalized;
87
+ }
88
+ normalizeConfidence(value, fallback = 0.5) {
89
+ if (value === undefined) {
90
+ return fallback;
91
+ }
92
+ if (Number.isNaN(value) || value < 0 || value > 1) {
93
+ throw new AppError({
94
+ statusCode: 400,
95
+ errorCode: "INVALID_INPUT",
96
+ detail: "confidence 必须在 0 到 1 之间",
97
+ field: "confidence"
98
+ });
99
+ }
100
+ return value;
101
+ }
102
+ }
103
+ //# sourceMappingURL=project-memory-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-memory-service.js","sourceRoot":"","sources":["../../../../src/modules/butler/project-memory-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { SessionHistoryService } from "../sessions/session-history-service.js";
2
+ import type { SessionLiveRuntimeService } from "../sessions/session-live-runtime-service.js";
3
+ export interface PatrolStructuredOutput {
4
+ summary: string | null;
5
+ riskLevel: "low" | "medium" | "high" | null;
6
+ suggestions: string[];
7
+ progressState: "unknown" | "working" | "blocked" | "done";
8
+ riskFlags: string[];
9
+ nextActions: string[];
10
+ rawJson: string | null;
11
+ }
12
+ export interface StartPatrolSessionInput {
13
+ workspaceId: string;
14
+ userId: string;
15
+ providerId: "codex" | "claude-code";
16
+ prompt: string;
17
+ model: string | null;
18
+ reasoningLevel: string | null;
19
+ permissionMode: string | null;
20
+ }
21
+ export interface PatrolSessionLaunchResult {
22
+ sessionId: string;
23
+ provider: string;
24
+ providerSessionId: string;
25
+ acceptedAt: string;
26
+ }
27
+ export interface PatrolSessionResult {
28
+ assistantMessages: string[];
29
+ latestAssistantMessage: string | null;
30
+ structured: PatrolStructuredOutput;
31
+ }
32
+ export interface PatrolProviderAdapter {
33
+ readonly providerId: "codex" | "claude-code";
34
+ startPatrolSession(input: StartPatrolSessionInput): Promise<PatrolSessionLaunchResult>;
35
+ waitForSessionTerminal(sessionId: string): Promise<void>;
36
+ readPatrolResult(sessionId: string): Promise<PatrolSessionResult>;
37
+ }
38
+ export declare class ProviderAdapterRegistry {
39
+ private readonly adapters;
40
+ constructor(adapters: PatrolProviderAdapter[]);
41
+ get(providerId: "codex" | "claude-code"): PatrolProviderAdapter;
42
+ }
43
+ interface RuntimePatrolProviderAdapterOptions {
44
+ waitTimeoutMs?: number;
45
+ waitPollIntervalMs?: number;
46
+ }
47
+ export declare class RuntimePatrolProviderAdapter implements PatrolProviderAdapter {
48
+ readonly providerId: "codex" | "claude-code";
49
+ private readonly sessionLiveRuntimeService;
50
+ private readonly sessionHistoryService;
51
+ private readonly waitTimeoutMs;
52
+ private readonly waitPollIntervalMs;
53
+ private readonly sessionOwnerBySessionId;
54
+ constructor(providerId: "codex" | "claude-code", sessionLiveRuntimeService: SessionLiveRuntimeService, sessionHistoryService: SessionHistoryService, options?: RuntimePatrolProviderAdapterOptions);
55
+ startPatrolSession(input: StartPatrolSessionInput): Promise<PatrolSessionLaunchResult>;
56
+ waitForSessionTerminal(sessionId: string): Promise<void>;
57
+ readPatrolResult(sessionId: string): Promise<PatrolSessionResult>;
58
+ private waitForTerminalWithSubscription;
59
+ private readRuntimeState;
60
+ }
61
+ export {};