@jingyi0605/codingns 0.3.0 → 0.3.6

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 (261) hide show
  1. package/README.md +13 -0
  2. package/bin/codingns.mjs +880 -9
  3. package/dist/public/assets/{TerminalPage-Dfw1QUqW.js → TerminalPage-D00S4KM6.js} +19 -19
  4. package/dist/public/assets/index-BlOinYqR.js +122 -0
  5. package/dist/public/assets/index-Dg_7g6lA.css +1 -0
  6. package/dist/public/index.html +2 -2
  7. package/dist/server/config/env.d.ts +2 -0
  8. package/dist/server/config/env.js +35 -0
  9. package/dist/server/config/env.js.map +1 -1
  10. package/dist/server/config/opencode-base-url-resolver.d.ts +7 -0
  11. package/dist/server/config/opencode-base-url-resolver.js +48 -11
  12. package/dist/server/config/opencode-base-url-resolver.js.map +1 -1
  13. package/dist/server/config/opencode-system-probe-helper-client.d.ts +4 -0
  14. package/dist/server/config/opencode-system-probe-helper-client.js +29 -0
  15. package/dist/server/config/opencode-system-probe-helper-client.js.map +1 -1
  16. package/dist/server/config/opencode-system-probe-helper-process.d.ts +12 -0
  17. package/dist/server/config/opencode-system-probe-helper-process.js +34 -7
  18. package/dist/server/config/opencode-system-probe-helper-process.js.map +1 -1
  19. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +144 -0
  20. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +242 -1
  21. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  22. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +133 -2
  23. package/dist/server/modules/assistant-capability/assistant-capability-service.js +395 -2
  24. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  25. package/dist/server/modules/auth/auth-service.d.ts +18 -1
  26. package/dist/server/modules/auth/auth-service.js +168 -7
  27. package/dist/server/modules/auth/auth-service.js.map +1 -1
  28. package/dist/server/modules/butler/butler-codex-model-policy.d.ts +1 -0
  29. package/dist/server/modules/butler/butler-codex-model-policy.js +36 -0
  30. package/dist/server/modules/butler/butler-codex-model-policy.js.map +1 -0
  31. package/dist/server/modules/butler/butler-control-session-service.d.ts +13 -1
  32. package/dist/server/modules/butler/butler-control-session-service.js +55 -231
  33. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  34. package/dist/server/modules/butler/butler-controller.d.ts +17 -0
  35. package/dist/server/modules/butler/butler-controller.js +20 -1
  36. package/dist/server/modules/butler/butler-controller.js.map +1 -1
  37. package/dist/server/modules/butler/butler-follow-up-service.js +7 -3
  38. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  39. package/dist/server/modules/butler/butler-inbox-analysis-service.d.ts +36 -0
  40. package/dist/server/modules/butler/butler-inbox-analysis-service.js +375 -0
  41. package/dist/server/modules/butler/butler-inbox-analysis-service.js.map +1 -0
  42. package/dist/server/modules/butler/butler-inbox-instruction-adapter.d.ts +23 -0
  43. package/dist/server/modules/butler/butler-inbox-instruction-adapter.js +97 -0
  44. package/dist/server/modules/butler/butler-inbox-instruction-adapter.js.map +1 -0
  45. package/dist/server/modules/butler/butler-inbox-service.d.ts +39 -2
  46. package/dist/server/modules/butler/butler-inbox-service.js +392 -2
  47. package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
  48. package/dist/server/modules/butler/butler-session-service.d.ts +8 -0
  49. package/dist/server/modules/butler/butler-session-service.js +205 -53
  50. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  51. package/dist/server/modules/butler/butler-session-summary-service.d.ts +1 -0
  52. package/dist/server/modules/butler/butler-session-summary-service.js +48 -23
  53. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  54. package/dist/server/modules/butler/butler-workspace-context.d.ts +13 -0
  55. package/dist/server/modules/butler/butler-workspace-context.js +234 -0
  56. package/dist/server/modules/butler/butler-workspace-context.js.map +1 -0
  57. package/dist/server/modules/client/client-controller.d.ts +6 -0
  58. package/dist/server/modules/client/client-controller.js +30 -8
  59. package/dist/server/modules/client/client-controller.js.map +1 -1
  60. package/dist/server/modules/client/client-service.d.ts +22 -10
  61. package/dist/server/modules/client/client-service.js +77 -100
  62. package/dist/server/modules/client/client-service.js.map +1 -1
  63. package/dist/server/modules/client/npm-global-package-service.d.ts +21 -0
  64. package/dist/server/modules/client/npm-global-package-service.js +210 -0
  65. package/dist/server/modules/client/npm-global-package-service.js.map +1 -0
  66. package/dist/server/modules/client/service-update-task-service.d.ts +15 -0
  67. package/dist/server/modules/client/service-update-task-service.js +147 -0
  68. package/dist/server/modules/client/service-update-task-service.js.map +1 -0
  69. package/dist/server/modules/client/service-update-types.d.ts +30 -0
  70. package/dist/server/modules/client/service-update-types.js +2 -0
  71. package/dist/server/modules/client/service-update-types.js.map +1 -0
  72. package/dist/server/modules/debug-target/debug-target-controller.d.ts +13 -0
  73. package/dist/server/modules/debug-target/debug-target-controller.js +77 -2
  74. package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -1
  75. package/dist/server/modules/debug-target/debug-target-service.d.ts +11 -2
  76. package/dist/server/modules/debug-target/debug-target-service.js +138 -3
  77. package/dist/server/modules/debug-target/debug-target-service.js.map +1 -1
  78. package/dist/server/modules/git/git-command-helper-client.d.ts +2 -0
  79. package/dist/server/modules/git/git-command-helper-client.js +52 -3
  80. package/dist/server/modules/git/git-command-helper-client.js.map +1 -1
  81. package/dist/server/modules/git/git-command-helper-process.js +62 -9
  82. package/dist/server/modules/git/git-command-helper-process.js.map +1 -1
  83. package/dist/server/modules/git/git-command-runner.d.ts +1 -0
  84. package/dist/server/modules/git/git-command-runner.js +25 -0
  85. package/dist/server/modules/git/git-command-runner.js.map +1 -1
  86. package/dist/server/modules/git/git-controller.js +8 -7
  87. package/dist/server/modules/git/git-controller.js.map +1 -1
  88. package/dist/server/modules/git/git-read-service.d.ts +7 -7
  89. package/dist/server/modules/git/git-read-service.js +41 -24
  90. package/dist/server/modules/git/git-read-service.js.map +1 -1
  91. package/dist/server/modules/model-switch/cc-switch-adapter.d.ts +36 -0
  92. package/dist/server/modules/model-switch/cc-switch-adapter.js +321 -0
  93. package/dist/server/modules/model-switch/cc-switch-adapter.js.map +1 -0
  94. package/dist/server/modules/model-switch/model-switch-controller.d.ts +11 -0
  95. package/dist/server/modules/model-switch/model-switch-controller.js +30 -0
  96. package/dist/server/modules/model-switch/model-switch-controller.js.map +1 -0
  97. package/dist/server/modules/model-switch/model-switch-service.d.ts +16 -0
  98. package/dist/server/modules/model-switch/model-switch-service.js +29 -0
  99. package/dist/server/modules/model-switch/model-switch-service.js.map +1 -0
  100. package/dist/server/modules/preferences/profile-service.d.ts +1 -0
  101. package/dist/server/modules/preferences/profile-service.js +9 -0
  102. package/dist/server/modules/preferences/profile-service.js.map +1 -1
  103. package/dist/server/modules/provider/codex-model-options.js +2 -3
  104. package/dist/server/modules/provider/codex-model-options.js.map +1 -1
  105. package/dist/server/modules/provider/opencode-model-options.js +2 -3
  106. package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
  107. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +9 -4
  108. package/dist/server/modules/provider/provider-discovery-helper-client.js +87 -11
  109. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  110. package/dist/server/modules/provider/provider-discovery-helper-process.js +52 -47
  111. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  112. package/dist/server/modules/provider/provider-discovery-runtime.d.ts +4 -0
  113. package/dist/server/modules/provider/provider-discovery-runtime.js +65 -0
  114. package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -0
  115. package/dist/server/modules/sessions/codex-app-server-helper-process.js +3 -0
  116. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  117. package/dist/server/modules/sessions/session-activity-authority-service.d.ts +3 -1
  118. package/dist/server/modules/sessions/session-activity-authority-service.js +3 -0
  119. package/dist/server/modules/sessions/session-activity-authority-service.js.map +1 -1
  120. package/dist/server/modules/sessions/session-activity-inspector.d.ts +1 -1
  121. package/dist/server/modules/sessions/session-activity-inspector.js +43 -16
  122. package/dist/server/modules/sessions/session-activity-inspector.js.map +1 -1
  123. package/dist/server/modules/sessions/session-controller.d.ts +3 -3
  124. package/dist/server/modules/sessions/session-controller.js +3 -3
  125. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  126. package/dist/server/modules/sessions/session-history-service.d.ts +8 -2
  127. package/dist/server/modules/sessions/session-history-service.js +473 -65
  128. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  129. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +9 -3
  130. package/dist/server/modules/sessions/session-live-runtime-service.js +114 -34
  131. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  132. package/dist/server/modules/sessions/session-message-attachment-service.d.ts +8 -8
  133. package/dist/server/modules/sessions/session-message-attachment-service.js +25 -34
  134. package/dist/server/modules/sessions/session-message-attachment-service.js.map +1 -1
  135. package/dist/server/modules/sessions/session-provider-error-mapper.js +7 -0
  136. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  137. package/dist/server/modules/skills/builtin-skill-service.d.ts +12 -0
  138. package/dist/server/modules/skills/builtin-skill-service.js +49 -0
  139. package/dist/server/modules/skills/builtin-skill-service.js.map +1 -0
  140. package/dist/server/modules/skills/builtin-skills/codingns-assistant/SKILL.md +75 -0
  141. package/dist/server/modules/skills/builtin-skills/codingns-assistant/agents/openai.yaml +4 -0
  142. package/dist/server/modules/skills/builtin-skills/codingns-assistant/references/cli-workflow.md +130 -0
  143. package/dist/server/modules/skills/skill-manager-service.d.ts +7 -0
  144. package/dist/server/modules/skills/skill-manager-service.js +98 -0
  145. package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
  146. package/dist/server/modules/tailscale/tailscale-helper-client.d.ts +1 -0
  147. package/dist/server/modules/tailscale/tailscale-helper-client.js +12 -0
  148. package/dist/server/modules/tailscale/tailscale-helper-client.js.map +1 -1
  149. package/dist/server/modules/tailscale/tailscale-manager.js +5 -1
  150. package/dist/server/modules/tailscale/tailscale-manager.js.map +1 -1
  151. package/dist/server/modules/tasks/task-helper-client.d.ts +5 -0
  152. package/dist/server/modules/tasks/task-helper-client.js +45 -0
  153. package/dist/server/modules/tasks/task-helper-client.js.map +1 -1
  154. package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +10 -3
  155. package/dist/server/modules/tasks/task-helper-process-handlers.js +7 -5
  156. package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -1
  157. package/dist/server/modules/tasks/task-helper-process.js +11 -1
  158. package/dist/server/modules/tasks/task-helper-process.js.map +1 -1
  159. package/dist/server/modules/tasks/task-lane-executors.js +5 -2
  160. package/dist/server/modules/tasks/task-lane-executors.js.map +1 -1
  161. package/dist/server/modules/tasks/task-types.d.ts +3 -0
  162. package/dist/server/modules/tasks/task-types.js +4 -1
  163. package/dist/server/modules/tasks/task-types.js.map +1 -1
  164. package/dist/server/modules/terminal/command-template-service.d.ts +2 -2
  165. package/dist/server/modules/terminal/command-template-service.js +14 -5
  166. package/dist/server/modules/terminal/command-template-service.js.map +1 -1
  167. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js +1 -1
  168. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js.map +1 -1
  169. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js +160 -11
  170. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js.map +1 -1
  171. package/dist/server/modules/terminal/template-port-runtime.d.ts +13 -2
  172. package/dist/server/modules/terminal/template-port-runtime.js +266 -44
  173. package/dist/server/modules/terminal/template-port-runtime.js.map +1 -1
  174. package/dist/server/modules/terminal/terminal-service.d.ts +4 -0
  175. package/dist/server/modules/terminal/terminal-service.js +65 -4
  176. package/dist/server/modules/terminal/terminal-service.js.map +1 -1
  177. package/dist/server/modules/workbench/workbench-service.js +3 -3
  178. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  179. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +1 -0
  180. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +118 -39
  181. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  182. package/dist/server/modules/workspace/workspace-code-composition.d.ts +1 -0
  183. package/dist/server/modules/workspace/workspace-code-composition.js +277 -2
  184. package/dist/server/modules/workspace/workspace-code-composition.js.map +1 -1
  185. package/dist/server/modules/workspace/workspace-service.js +54 -17
  186. package/dist/server/modules/workspace/workspace-service.js.map +1 -1
  187. package/dist/server/modules/worktree/worktree-cleanup-service.d.ts +1 -1
  188. package/dist/server/modules/worktree/worktree-cleanup-service.js +22 -17
  189. package/dist/server/modules/worktree/worktree-cleanup-service.js.map +1 -1
  190. package/dist/server/modules/worktree/worktree-controller.js +6 -5
  191. package/dist/server/modules/worktree/worktree-controller.js.map +1 -1
  192. package/dist/server/modules/worktree/worktree-manager.d.ts +1 -1
  193. package/dist/server/modules/worktree/worktree-manager.js +26 -19
  194. package/dist/server/modules/worktree/worktree-manager.js.map +1 -1
  195. package/dist/server/modules/worktree/worktree-merge-service.d.ts +2 -2
  196. package/dist/server/modules/worktree/worktree-merge-service.js +34 -27
  197. package/dist/server/modules/worktree/worktree-merge-service.js.map +1 -1
  198. package/dist/server/modules/worktree/worktree-sync-service.d.ts +1 -1
  199. package/dist/server/modules/worktree/worktree-sync-service.js +5 -3
  200. package/dist/server/modules/worktree/worktree-sync-service.js.map +1 -1
  201. package/dist/server/routes/assistant.js +24 -0
  202. package/dist/server/routes/assistant.js.map +1 -1
  203. package/dist/server/routes/butler.js +4 -0
  204. package/dist/server/routes/butler.js.map +1 -1
  205. package/dist/server/routes/client.js +2 -0
  206. package/dist/server/routes/client.js.map +1 -1
  207. package/dist/server/routes/sessions.js +1 -1
  208. package/dist/server/routes/sessions.js.map +1 -1
  209. package/dist/server/routes/system.d.ts +2 -1
  210. package/dist/server/routes/system.js +3 -1
  211. package/dist/server/routes/system.js.map +1 -1
  212. package/dist/server/server/create-server.d.ts +4 -0
  213. package/dist/server/server/create-server.js +67 -8
  214. package/dist/server/server/create-server.js.map +1 -1
  215. package/dist/server/shared/errors/app-error.d.ts +2 -0
  216. package/dist/server/shared/errors/app-error.js +2 -0
  217. package/dist/server/shared/errors/app-error.js.map +1 -1
  218. package/dist/server/shared/http/error-handler.d.ts +2 -1
  219. package/dist/server/shared/http/error-handler.js +3 -2
  220. package/dist/server/shared/http/error-handler.js.map +1 -1
  221. package/dist/server/shared/http/request-abort.d.ts +2 -0
  222. package/dist/server/shared/http/request-abort.js +38 -0
  223. package/dist/server/shared/http/request-abort.js.map +1 -0
  224. package/dist/server/storage/repositories/auth-login-attempt-repository.d.ts +9 -0
  225. package/dist/server/storage/repositories/auth-login-attempt-repository.js +59 -0
  226. package/dist/server/storage/repositories/auth-login-attempt-repository.js.map +1 -0
  227. package/dist/server/storage/repositories/butler-control-session-repository.d.ts +3 -0
  228. package/dist/server/storage/repositories/butler-control-session-repository.js +80 -4
  229. package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
  230. package/dist/server/storage/repositories/butler-inbox-item-repository.js +54 -3
  231. package/dist/server/storage/repositories/butler-inbox-item-repository.js.map +1 -1
  232. package/dist/server/storage/repositories/terminal-instance-repository.js +1 -1
  233. package/dist/server/storage/repositories/terminal-instance-repository.js.map +1 -1
  234. package/dist/server/storage/repositories/user-preference-profile-repository.js +6 -3
  235. package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -1
  236. package/dist/server/storage/sqlite/client.js +127 -0
  237. package/dist/server/storage/sqlite/client.js.map +1 -1
  238. package/dist/server/storage/sqlite/schema.sql +19 -1
  239. package/dist/server/types/domain.d.ts +37 -1
  240. package/dist/server/ws/workbench-ws-hub.d.ts +1 -0
  241. package/dist/server/ws/workbench-ws-hub.js +25 -3
  242. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  243. package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +23 -0
  244. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +162 -0
  245. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -1
  246. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +1 -0
  247. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +89 -33
  248. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  249. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +18 -2
  250. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
  251. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +3 -1
  252. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +238 -53
  253. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  254. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js +1 -0
  255. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +1 -1
  256. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +6 -2
  257. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +1 -1
  258. package/package.json +1 -1
  259. package/scripts/postinstall.mjs +33 -0
  260. package/dist/public/assets/index-DR2rPNi7.css +0 -1
  261. package/dist/public/assets/index-DTOruahn.js +0 -114
@@ -1,5 +1,6 @@
1
1
  import type { HostConfig } from "../../config/env.js";
2
2
  import type { DemoCleanupService, DemoOnlineTracker } from "../demo/demo-cleanup-service.js";
3
+ import type { AuthLoginAttemptRepository } from "../../storage/repositories/auth-login-attempt-repository.js";
3
4
  import type { AuthTokenRepository } from "../../storage/repositories/auth-token-repository.js";
4
5
  import type { AuthUserRepository } from "../../storage/repositories/auth-user-repository.js";
5
6
  import type { BootstrapStateRepository } from "../../storage/repositories/bootstrap-state-repository.js";
@@ -15,6 +16,8 @@ export interface AuthContext {
15
16
  export interface LoginInput {
16
17
  username: string;
17
18
  password: string;
19
+ captchaId?: string;
20
+ captchaCode?: string;
18
21
  }
19
22
  export interface RefreshInput {
20
23
  refreshToken: string;
@@ -32,10 +35,11 @@ export declare class AuthService {
32
35
  private readonly bootstrapStateRepository;
33
36
  private readonly authUserRepository;
34
37
  private readonly authTokenRepository;
38
+ private readonly authLoginAttemptRepository;
35
39
  private readonly config;
36
40
  private readonly demoCleanupService?;
37
41
  private readonly demoOnlineTracker?;
38
- constructor(bootstrapStateRepository: BootstrapStateRepository, authUserRepository: AuthUserRepository, authTokenRepository: AuthTokenRepository, config: HostConfig, demoServices?: {
42
+ constructor(bootstrapStateRepository: BootstrapStateRepository, authUserRepository: AuthUserRepository, authTokenRepository: AuthTokenRepository, authLoginAttemptRepository: AuthLoginAttemptRepository, config: HostConfig, demoServices?: {
39
43
  cleanupService: DemoCleanupService;
40
44
  onlineTracker: DemoOnlineTracker;
41
45
  });
@@ -47,4 +51,17 @@ export declare class AuthService {
47
51
  authenticateAccessToken(accessToken: string): AuthenticatedUser;
48
52
  ensureInitialized(): void;
49
53
  private issueTokenPair;
54
+ private normalizeUsername;
55
+ private normalizeCaptchaCode;
56
+ private readLoginAttempt;
57
+ private ensureCaptchaSatisfied;
58
+ private recordFailedLogin;
59
+ private rotateCaptchaChallenge;
60
+ private toCaptchaChallenge;
61
+ private createInvalidCredentialsError;
62
+ private createCaptchaError;
63
+ private isCaptchaRequired;
64
+ private createCaptchaCode;
65
+ private buildCaptchaImageDataUrl;
66
+ private buildCaptchaSvg;
50
67
  }
@@ -1,33 +1,47 @@
1
+ import { randomInt } from "node:crypto";
1
2
  import { AppError } from "../../shared/errors/app-error.js";
2
3
  import { hashToken, verifyPassword } from "../../shared/utils/hash.js";
3
4
  import { createId } from "../../shared/utils/id.js";
4
5
  import { addSeconds, nowIso } from "../../shared/utils/time.js";
5
6
  import { createOpaqueToken } from "../../shared/utils/tokens.js";
7
+ const LOGIN_CAPTCHA_THRESHOLD = 3;
8
+ const LOGIN_CAPTCHA_LENGTH = 4;
9
+ const LOGIN_CAPTCHA_TTL_SECONDS = 5 * 60;
10
+ const LOGIN_CAPTCHA_CHARS = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
11
+ const LOGIN_CAPTCHA_WIDTH = 136;
12
+ const LOGIN_CAPTCHA_HEIGHT = 48;
6
13
  export class AuthService {
7
14
  bootstrapStateRepository;
8
15
  authUserRepository;
9
16
  authTokenRepository;
17
+ authLoginAttemptRepository;
10
18
  config;
11
19
  demoCleanupService;
12
20
  demoOnlineTracker;
13
- constructor(bootstrapStateRepository, authUserRepository, authTokenRepository, config, demoServices) {
21
+ constructor(bootstrapStateRepository, authUserRepository, authTokenRepository, authLoginAttemptRepository, config, demoServices) {
14
22
  this.bootstrapStateRepository = bootstrapStateRepository;
15
23
  this.authUserRepository = authUserRepository;
16
24
  this.authTokenRepository = authTokenRepository;
25
+ this.authLoginAttemptRepository = authLoginAttemptRepository;
17
26
  this.config = config;
18
27
  this.demoCleanupService = demoServices?.cleanupService;
19
28
  this.demoOnlineTracker = demoServices?.onlineTracker;
20
29
  }
21
30
  login(input) {
22
31
  this.ensureInitialized();
23
- const user = this.authUserRepository.findByUsername(input.username.trim());
32
+ const now = new Date();
33
+ const username = this.normalizeUsername(input.username);
34
+ const attempt = this.readLoginAttempt(username, now);
35
+ this.ensureCaptchaSatisfied(input, attempt, now);
36
+ const user = this.authUserRepository.findByUsername(username);
24
37
  if (!user || !verifyPassword(input.password, user.passwordHash)) {
25
- throw new AppError({
26
- statusCode: 401,
27
- errorCode: "INVALID_CREDENTIALS",
28
- detail: "用户名或密码错误"
29
- });
38
+ const nextAttempt = this.recordFailedLogin(username, attempt, now);
39
+ if (nextAttempt.challenge) {
40
+ throw this.createInvalidCredentialsError(nextAttempt.challenge);
41
+ }
42
+ throw this.createInvalidCredentialsError();
30
43
  }
44
+ this.authLoginAttemptRepository.deleteByUsername(username);
31
45
  const result = {
32
46
  ...this.issueTokenPair(user.id),
33
47
  user: {
@@ -167,5 +181,152 @@ export class AuthService {
167
181
  expiresIn: this.config.accessTokenTtlSeconds
168
182
  };
169
183
  }
184
+ normalizeUsername(username) {
185
+ return username.trim();
186
+ }
187
+ normalizeCaptchaCode(code) {
188
+ return code?.trim().replace(/\s+/g, "").toUpperCase() ?? "";
189
+ }
190
+ readLoginAttempt(username, now) {
191
+ const attempt = this.authLoginAttemptRepository.findByUsername(username);
192
+ if (!attempt) {
193
+ return null;
194
+ }
195
+ if (!attempt.captchaExpiresAt || Date.parse(attempt.captchaExpiresAt) > now.getTime()) {
196
+ return attempt;
197
+ }
198
+ const nextAttempt = {
199
+ ...attempt,
200
+ captchaId: null,
201
+ captchaCodeHash: null,
202
+ captchaExpiresAt: null,
203
+ updatedAt: nowIso(now)
204
+ };
205
+ this.authLoginAttemptRepository.upsert(nextAttempt);
206
+ return nextAttempt;
207
+ }
208
+ ensureCaptchaSatisfied(input, attempt, now) {
209
+ if (!attempt || !this.isCaptchaRequired(attempt)) {
210
+ return;
211
+ }
212
+ const normalizedCaptchaCode = this.normalizeCaptchaCode(input.captchaCode);
213
+ if (!input.captchaId || normalizedCaptchaCode.length === 0) {
214
+ const nextChallenge = this.rotateCaptchaChallenge(attempt, now);
215
+ throw this.createCaptchaError("CAPTCHA_REQUIRED", "请先完成图形验证码", nextChallenge.challenge);
216
+ }
217
+ if (!attempt.captchaId ||
218
+ !attempt.captchaCodeHash ||
219
+ input.captchaId !== attempt.captchaId ||
220
+ hashToken(normalizedCaptchaCode) !== attempt.captchaCodeHash) {
221
+ const nextChallenge = this.rotateCaptchaChallenge(attempt, now);
222
+ throw this.createCaptchaError("CAPTCHA_INVALID", "图形验证码错误,请重试", nextChallenge.challenge);
223
+ }
224
+ }
225
+ recordFailedLogin(username, attempt, now) {
226
+ const timestamp = nowIso(now);
227
+ const nextAttempt = {
228
+ username,
229
+ failedAttemptCount: Math.min((attempt?.failedAttemptCount ?? 0) + 1, LOGIN_CAPTCHA_THRESHOLD),
230
+ captchaId: attempt?.captchaId ?? null,
231
+ captchaCodeHash: attempt?.captchaCodeHash ?? null,
232
+ captchaExpiresAt: attempt?.captchaExpiresAt ?? null,
233
+ createdAt: attempt?.createdAt ?? timestamp,
234
+ updatedAt: timestamp
235
+ };
236
+ if (!this.isCaptchaRequired(nextAttempt)) {
237
+ nextAttempt.captchaId = null;
238
+ nextAttempt.captchaCodeHash = null;
239
+ nextAttempt.captchaExpiresAt = null;
240
+ this.authLoginAttemptRepository.upsert(nextAttempt);
241
+ return {
242
+ record: nextAttempt,
243
+ challenge: null
244
+ };
245
+ }
246
+ return this.rotateCaptchaChallenge(nextAttempt, now);
247
+ }
248
+ rotateCaptchaChallenge(attempt, now) {
249
+ const captchaCode = this.createCaptchaCode();
250
+ const timestamp = nowIso(now);
251
+ const nextAttempt = {
252
+ username: attempt.username,
253
+ failedAttemptCount: Math.max(attempt.failedAttemptCount, LOGIN_CAPTCHA_THRESHOLD),
254
+ captchaId: createId(),
255
+ captchaCodeHash: hashToken(captchaCode),
256
+ captchaExpiresAt: addSeconds(now, LOGIN_CAPTCHA_TTL_SECONDS),
257
+ createdAt: attempt.createdAt,
258
+ updatedAt: timestamp
259
+ };
260
+ this.authLoginAttemptRepository.upsert(nextAttempt);
261
+ return {
262
+ record: nextAttempt,
263
+ challenge: this.toCaptchaChallenge(nextAttempt, captchaCode)
264
+ };
265
+ }
266
+ toCaptchaChallenge(attempt, captchaCode) {
267
+ return {
268
+ captchaId: attempt.captchaId ?? "",
269
+ imageDataUrl: this.buildCaptchaImageDataUrl(captchaCode)
270
+ };
271
+ }
272
+ createInvalidCredentialsError(challenge) {
273
+ return new AppError({
274
+ statusCode: 401,
275
+ errorCode: "INVALID_CREDENTIALS",
276
+ detail: challenge ? "用户名或密码错误,请完成图形验证码后重试" : "用户名或密码错误",
277
+ data: challenge
278
+ ? {
279
+ captcha: challenge
280
+ }
281
+ : undefined
282
+ });
283
+ }
284
+ createCaptchaError(errorCode, detail, challenge) {
285
+ return new AppError({
286
+ statusCode: 400,
287
+ errorCode,
288
+ detail,
289
+ field: "captchaCode",
290
+ data: {
291
+ captcha: challenge
292
+ }
293
+ });
294
+ }
295
+ isCaptchaRequired(attempt) {
296
+ return (attempt?.failedAttemptCount ?? 0) >= LOGIN_CAPTCHA_THRESHOLD;
297
+ }
298
+ createCaptchaCode() {
299
+ let code = "";
300
+ for (let index = 0; index < LOGIN_CAPTCHA_LENGTH; index += 1) {
301
+ code += LOGIN_CAPTCHA_CHARS[randomInt(0, LOGIN_CAPTCHA_CHARS.length)];
302
+ }
303
+ return code;
304
+ }
305
+ buildCaptchaImageDataUrl(code) {
306
+ const svg = this.buildCaptchaSvg(code);
307
+ return `data:image/svg+xml;base64,${Buffer.from(svg, "utf8").toString("base64")}`;
308
+ }
309
+ buildCaptchaSvg(code) {
310
+ const lines = Array.from({ length: 4 }, () => `<line x1="${randomInt(0, LOGIN_CAPTCHA_WIDTH)}" y1="${randomInt(0, LOGIN_CAPTCHA_HEIGHT)}" x2="${randomInt(0, LOGIN_CAPTCHA_WIDTH)}" y2="${randomInt(0, LOGIN_CAPTCHA_HEIGHT)}" stroke="rgba(14,165,233,0.45)" stroke-width="${randomInt(1, 3)}" />`).join("");
311
+ const dots = Array.from({ length: 16 }, () => `<circle cx="${randomInt(4, LOGIN_CAPTCHA_WIDTH - 4)}" cy="${randomInt(4, LOGIN_CAPTCHA_HEIGHT - 4)}" r="${randomInt(1, 3)}" fill="rgba(148,163,184,0.45)" />`).join("");
312
+ const chars = code
313
+ .split("")
314
+ .map((char, index) => {
315
+ const x = 18 + index * 26 + randomInt(-2, 3);
316
+ const y = 31 + randomInt(-2, 4);
317
+ const rotate = randomInt(-22, 23);
318
+ return `<text x="${x}" y="${y}" transform="rotate(${rotate} ${x} ${y})" font-size="25" font-family="monospace" font-weight="700" fill="#f8fafc">${char}</text>`;
319
+ })
320
+ .join("");
321
+ return `
322
+ <svg xmlns="http://www.w3.org/2000/svg" width="${LOGIN_CAPTCHA_WIDTH}" height="${LOGIN_CAPTCHA_HEIGHT}" viewBox="0 0 ${LOGIN_CAPTCHA_WIDTH} ${LOGIN_CAPTCHA_HEIGHT}" role="img" aria-label="login captcha">
323
+ <rect width="100%" height="100%" rx="8" fill="#0f172a" />
324
+ <rect x="1" y="1" width="${LOGIN_CAPTCHA_WIDTH - 2}" height="${LOGIN_CAPTCHA_HEIGHT - 2}" rx="7" fill="none" stroke="rgba(56,189,248,0.35)" />
325
+ ${lines}
326
+ ${dots}
327
+ ${chars}
328
+ </svg>
329
+ `.trim();
330
+ }
170
331
  }
171
332
  //# sourceMappingURL=auth-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-service.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth-service.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function resolveButlerCodexBackgroundModel(preferredModel: string, sourceCodexHomeDir: string | null): string | null;
@@ -0,0 +1,36 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ const CODEX_MODEL_PROVIDER_PATTERN = /^\s*model_provider\s*=\s*"([^"]+)"/m;
5
+ export function resolveButlerCodexBackgroundModel(preferredModel, sourceCodexHomeDir) {
6
+ const provider = readCodexModelProvider(sourceCodexHomeDir);
7
+ // 当前 api 供应商下,gpt-5.1-codex-mini 会出现空完成/502,后台 Butler 任务不能再强行覆盖模型。
8
+ if (provider === "api") {
9
+ return null;
10
+ }
11
+ return preferredModel;
12
+ }
13
+ function readCodexModelProvider(sourceCodexHomeDir) {
14
+ const homeDir = resolveSourceCodexHomeDir(sourceCodexHomeDir);
15
+ const configPath = path.join(homeDir, "config.toml");
16
+ if (!fs.existsSync(configPath)) {
17
+ return null;
18
+ }
19
+ try {
20
+ const content = fs.readFileSync(configPath, "utf8");
21
+ const matched = content.match(CODEX_MODEL_PROVIDER_PATTERN);
22
+ const provider = matched?.[1]?.trim() ?? "";
23
+ return provider.length > 0 ? provider : null;
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ function resolveSourceCodexHomeDir(sourceCodexHomeDir) {
30
+ const configured = sourceCodexHomeDir?.trim();
31
+ if (configured) {
32
+ return path.resolve(configured);
33
+ }
34
+ return path.resolve(path.join(os.homedir(), ".codex"));
35
+ }
36
+ //# sourceMappingURL=butler-codex-model-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"butler-codex-model-policy.js","sourceRoot":"","sources":["../../../../src/modules/butler/butler-codex-model-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,4BAA4B,GAAG,qCAAqC,CAAC;AAE3E,MAAM,UAAU,iCAAiC,CAC/C,cAAsB,EACtB,kBAAiC;IAEjC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,kBAAkB,CAAC,CAAC;IAE5D,mEAAmE;IACnE,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,sBAAsB,CAAC,kBAAiC;IAC/D,MAAM,OAAO,GAAG,yBAAyB,CAAC,kBAAkB,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAErD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC5C,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,kBAAiC;IAClE,MAAM,UAAU,GAAG,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAE9C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { ButlerControlSession, SessionListItem } from "../../types/domain.js";
1
+ import type { ButlerControlSession, ButlerControlSessionPurpose, SessionListItem } from "../../types/domain.js";
2
2
  import type { ButlerControlSessionRepository } from "../../storage/repositories/butler-control-session-repository.js";
3
3
  import { type ButlerProfileService } from "./butler-profile-service.js";
4
4
  import type { ButlerAuthService } from "./butler-auth-service.js";
@@ -16,9 +16,13 @@ export interface StartButlerControlSessionInput {
16
16
  model?: string | null;
17
17
  reasoningLevel?: string | null;
18
18
  permissionMode?: string | null;
19
+ purpose?: ButlerControlSessionPurpose;
20
+ title?: string | null;
21
+ sourceItemId?: string | null;
19
22
  }
20
23
  export interface SendButlerControlMessageInput extends StartButlerControlSessionInput {
21
24
  content?: string;
25
+ controlSessionId?: string | null;
22
26
  }
23
27
  export declare class ButlerControlSessionService {
24
28
  private readonly butlerProfileService;
@@ -33,6 +37,8 @@ export declare class ButlerControlSessionService {
33
37
  private readonly sourceCodexHomeDir;
34
38
  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">, skillManagerService: Pick<SkillManagerService, "getOverview" | "importUnmanagedSkill">, codexHomeDir?: string | null, sourceCodexHomeDir?: string | null);
35
39
  getCurrentSession(userId: string): ButlerControlSessionView | null;
40
+ getSession(controlSessionId: string, userId: string): ButlerControlSessionView | null;
41
+ listSessions(userId: string): ButlerControlSessionView[];
36
42
  resetCurrentSession(): void;
37
43
  startSession(userId: string, input?: StartButlerControlSessionInput): Promise<ButlerControlSessionView>;
38
44
  resumeCurrentSession(userId: string): Promise<ButlerControlSessionView & {
@@ -50,8 +56,14 @@ export declare class ButlerControlSessionService {
50
56
  message: Awaited<ReturnType<SessionLiveRuntimeService["sendLiveMessage"]>>["message"];
51
57
  }>;
52
58
  private requireCurrentSession;
59
+ private requireSessionById;
53
60
  private toView;
54
61
  private prepareWorkspace;
55
62
  private syncWorkspaceContext;
56
63
  private markFailed;
64
+ updateSessionStatusBySessionId(input: {
65
+ sessionId: string;
66
+ status: ButlerControlSession["status"];
67
+ lastSummary?: string | null;
68
+ }): ButlerControlSession | null;
57
69
  }