@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.
- package/README.md +13 -0
- package/bin/codingns.mjs +880 -9
- package/dist/public/assets/{TerminalPage-Dfw1QUqW.js → TerminalPage-D00S4KM6.js} +19 -19
- package/dist/public/assets/index-BlOinYqR.js +122 -0
- package/dist/public/assets/index-Dg_7g6lA.css +1 -0
- package/dist/public/index.html +2 -2
- package/dist/server/config/env.d.ts +2 -0
- package/dist/server/config/env.js +35 -0
- package/dist/server/config/env.js.map +1 -1
- package/dist/server/config/opencode-base-url-resolver.d.ts +7 -0
- package/dist/server/config/opencode-base-url-resolver.js +48 -11
- package/dist/server/config/opencode-base-url-resolver.js.map +1 -1
- package/dist/server/config/opencode-system-probe-helper-client.d.ts +4 -0
- package/dist/server/config/opencode-system-probe-helper-client.js +29 -0
- package/dist/server/config/opencode-system-probe-helper-client.js.map +1 -1
- package/dist/server/config/opencode-system-probe-helper-process.d.ts +12 -0
- package/dist/server/config/opencode-system-probe-helper-process.js +34 -7
- package/dist/server/config/opencode-system-probe-helper-process.js.map +1 -1
- package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +144 -0
- package/dist/server/modules/assistant-capability/assistant-capability-controller.js +242 -1
- package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
- package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +133 -2
- package/dist/server/modules/assistant-capability/assistant-capability-service.js +395 -2
- package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
- package/dist/server/modules/auth/auth-service.d.ts +18 -1
- package/dist/server/modules/auth/auth-service.js +168 -7
- package/dist/server/modules/auth/auth-service.js.map +1 -1
- package/dist/server/modules/butler/butler-codex-model-policy.d.ts +1 -0
- package/dist/server/modules/butler/butler-codex-model-policy.js +36 -0
- package/dist/server/modules/butler/butler-codex-model-policy.js.map +1 -0
- package/dist/server/modules/butler/butler-control-session-service.d.ts +13 -1
- package/dist/server/modules/butler/butler-control-session-service.js +55 -231
- package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
- package/dist/server/modules/butler/butler-controller.d.ts +17 -0
- package/dist/server/modules/butler/butler-controller.js +20 -1
- package/dist/server/modules/butler/butler-controller.js.map +1 -1
- package/dist/server/modules/butler/butler-follow-up-service.js +7 -3
- package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
- package/dist/server/modules/butler/butler-inbox-analysis-service.d.ts +36 -0
- package/dist/server/modules/butler/butler-inbox-analysis-service.js +375 -0
- package/dist/server/modules/butler/butler-inbox-analysis-service.js.map +1 -0
- package/dist/server/modules/butler/butler-inbox-instruction-adapter.d.ts +23 -0
- package/dist/server/modules/butler/butler-inbox-instruction-adapter.js +97 -0
- package/dist/server/modules/butler/butler-inbox-instruction-adapter.js.map +1 -0
- package/dist/server/modules/butler/butler-inbox-service.d.ts +39 -2
- package/dist/server/modules/butler/butler-inbox-service.js +392 -2
- package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
- package/dist/server/modules/butler/butler-session-service.d.ts +8 -0
- package/dist/server/modules/butler/butler-session-service.js +205 -53
- package/dist/server/modules/butler/butler-session-service.js.map +1 -1
- package/dist/server/modules/butler/butler-session-summary-service.d.ts +1 -0
- package/dist/server/modules/butler/butler-session-summary-service.js +48 -23
- package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
- package/dist/server/modules/butler/butler-workspace-context.d.ts +13 -0
- package/dist/server/modules/butler/butler-workspace-context.js +234 -0
- package/dist/server/modules/butler/butler-workspace-context.js.map +1 -0
- package/dist/server/modules/client/client-controller.d.ts +6 -0
- package/dist/server/modules/client/client-controller.js +30 -8
- package/dist/server/modules/client/client-controller.js.map +1 -1
- package/dist/server/modules/client/client-service.d.ts +22 -10
- package/dist/server/modules/client/client-service.js +77 -100
- package/dist/server/modules/client/client-service.js.map +1 -1
- package/dist/server/modules/client/npm-global-package-service.d.ts +21 -0
- package/dist/server/modules/client/npm-global-package-service.js +210 -0
- package/dist/server/modules/client/npm-global-package-service.js.map +1 -0
- package/dist/server/modules/client/service-update-task-service.d.ts +15 -0
- package/dist/server/modules/client/service-update-task-service.js +147 -0
- package/dist/server/modules/client/service-update-task-service.js.map +1 -0
- package/dist/server/modules/client/service-update-types.d.ts +30 -0
- package/dist/server/modules/client/service-update-types.js +2 -0
- package/dist/server/modules/client/service-update-types.js.map +1 -0
- package/dist/server/modules/debug-target/debug-target-controller.d.ts +13 -0
- package/dist/server/modules/debug-target/debug-target-controller.js +77 -2
- package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -1
- package/dist/server/modules/debug-target/debug-target-service.d.ts +11 -2
- package/dist/server/modules/debug-target/debug-target-service.js +138 -3
- package/dist/server/modules/debug-target/debug-target-service.js.map +1 -1
- package/dist/server/modules/git/git-command-helper-client.d.ts +2 -0
- package/dist/server/modules/git/git-command-helper-client.js +52 -3
- package/dist/server/modules/git/git-command-helper-client.js.map +1 -1
- package/dist/server/modules/git/git-command-helper-process.js +62 -9
- package/dist/server/modules/git/git-command-helper-process.js.map +1 -1
- package/dist/server/modules/git/git-command-runner.d.ts +1 -0
- package/dist/server/modules/git/git-command-runner.js +25 -0
- package/dist/server/modules/git/git-command-runner.js.map +1 -1
- package/dist/server/modules/git/git-controller.js +8 -7
- package/dist/server/modules/git/git-controller.js.map +1 -1
- package/dist/server/modules/git/git-read-service.d.ts +7 -7
- package/dist/server/modules/git/git-read-service.js +41 -24
- package/dist/server/modules/git/git-read-service.js.map +1 -1
- package/dist/server/modules/model-switch/cc-switch-adapter.d.ts +36 -0
- package/dist/server/modules/model-switch/cc-switch-adapter.js +321 -0
- package/dist/server/modules/model-switch/cc-switch-adapter.js.map +1 -0
- package/dist/server/modules/model-switch/model-switch-controller.d.ts +11 -0
- package/dist/server/modules/model-switch/model-switch-controller.js +30 -0
- package/dist/server/modules/model-switch/model-switch-controller.js.map +1 -0
- package/dist/server/modules/model-switch/model-switch-service.d.ts +16 -0
- package/dist/server/modules/model-switch/model-switch-service.js +29 -0
- package/dist/server/modules/model-switch/model-switch-service.js.map +1 -0
- package/dist/server/modules/preferences/profile-service.d.ts +1 -0
- package/dist/server/modules/preferences/profile-service.js +9 -0
- package/dist/server/modules/preferences/profile-service.js.map +1 -1
- package/dist/server/modules/provider/codex-model-options.js +2 -3
- package/dist/server/modules/provider/codex-model-options.js.map +1 -1
- package/dist/server/modules/provider/opencode-model-options.js +2 -3
- package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +9 -4
- package/dist/server/modules/provider/provider-discovery-helper-client.js +87 -11
- package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-process.js +52 -47
- package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-runtime.d.ts +4 -0
- package/dist/server/modules/provider/provider-discovery-runtime.js +65 -0
- package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -0
- package/dist/server/modules/sessions/codex-app-server-helper-process.js +3 -0
- package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
- package/dist/server/modules/sessions/session-activity-authority-service.d.ts +3 -1
- package/dist/server/modules/sessions/session-activity-authority-service.js +3 -0
- package/dist/server/modules/sessions/session-activity-authority-service.js.map +1 -1
- package/dist/server/modules/sessions/session-activity-inspector.d.ts +1 -1
- package/dist/server/modules/sessions/session-activity-inspector.js +43 -16
- package/dist/server/modules/sessions/session-activity-inspector.js.map +1 -1
- package/dist/server/modules/sessions/session-controller.d.ts +3 -3
- package/dist/server/modules/sessions/session-controller.js +3 -3
- package/dist/server/modules/sessions/session-controller.js.map +1 -1
- package/dist/server/modules/sessions/session-history-service.d.ts +8 -2
- package/dist/server/modules/sessions/session-history-service.js +473 -65
- package/dist/server/modules/sessions/session-history-service.js.map +1 -1
- package/dist/server/modules/sessions/session-live-runtime-service.d.ts +9 -3
- package/dist/server/modules/sessions/session-live-runtime-service.js +114 -34
- package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
- package/dist/server/modules/sessions/session-message-attachment-service.d.ts +8 -8
- package/dist/server/modules/sessions/session-message-attachment-service.js +25 -34
- package/dist/server/modules/sessions/session-message-attachment-service.js.map +1 -1
- package/dist/server/modules/sessions/session-provider-error-mapper.js +7 -0
- package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
- package/dist/server/modules/skills/builtin-skill-service.d.ts +12 -0
- package/dist/server/modules/skills/builtin-skill-service.js +49 -0
- package/dist/server/modules/skills/builtin-skill-service.js.map +1 -0
- package/dist/server/modules/skills/builtin-skills/codingns-assistant/SKILL.md +75 -0
- package/dist/server/modules/skills/builtin-skills/codingns-assistant/agents/openai.yaml +4 -0
- package/dist/server/modules/skills/builtin-skills/codingns-assistant/references/cli-workflow.md +130 -0
- package/dist/server/modules/skills/skill-manager-service.d.ts +7 -0
- package/dist/server/modules/skills/skill-manager-service.js +98 -0
- package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
- package/dist/server/modules/tailscale/tailscale-helper-client.d.ts +1 -0
- package/dist/server/modules/tailscale/tailscale-helper-client.js +12 -0
- package/dist/server/modules/tailscale/tailscale-helper-client.js.map +1 -1
- package/dist/server/modules/tailscale/tailscale-manager.js +5 -1
- package/dist/server/modules/tailscale/tailscale-manager.js.map +1 -1
- package/dist/server/modules/tasks/task-helper-client.d.ts +5 -0
- package/dist/server/modules/tasks/task-helper-client.js +45 -0
- package/dist/server/modules/tasks/task-helper-client.js.map +1 -1
- package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +10 -3
- package/dist/server/modules/tasks/task-helper-process-handlers.js +7 -5
- package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -1
- package/dist/server/modules/tasks/task-helper-process.js +11 -1
- package/dist/server/modules/tasks/task-helper-process.js.map +1 -1
- package/dist/server/modules/tasks/task-lane-executors.js +5 -2
- package/dist/server/modules/tasks/task-lane-executors.js.map +1 -1
- package/dist/server/modules/tasks/task-types.d.ts +3 -0
- package/dist/server/modules/tasks/task-types.js +4 -1
- package/dist/server/modules/tasks/task-types.js.map +1 -1
- package/dist/server/modules/terminal/command-template-service.d.ts +2 -2
- package/dist/server/modules/terminal/command-template-service.js +14 -5
- package/dist/server/modules/terminal/command-template-service.js.map +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js.map +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js +160 -11
- package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js.map +1 -1
- package/dist/server/modules/terminal/template-port-runtime.d.ts +13 -2
- package/dist/server/modules/terminal/template-port-runtime.js +266 -44
- package/dist/server/modules/terminal/template-port-runtime.js.map +1 -1
- package/dist/server/modules/terminal/terminal-service.d.ts +4 -0
- package/dist/server/modules/terminal/terminal-service.js +65 -4
- package/dist/server/modules/terminal/terminal-service.js.map +1 -1
- package/dist/server/modules/workbench/workbench-service.js +3 -3
- package/dist/server/modules/workbench/workbench-service.js.map +1 -1
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +1 -0
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +118 -39
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
- package/dist/server/modules/workspace/workspace-code-composition.d.ts +1 -0
- package/dist/server/modules/workspace/workspace-code-composition.js +277 -2
- package/dist/server/modules/workspace/workspace-code-composition.js.map +1 -1
- package/dist/server/modules/workspace/workspace-service.js +54 -17
- package/dist/server/modules/workspace/workspace-service.js.map +1 -1
- package/dist/server/modules/worktree/worktree-cleanup-service.d.ts +1 -1
- package/dist/server/modules/worktree/worktree-cleanup-service.js +22 -17
- package/dist/server/modules/worktree/worktree-cleanup-service.js.map +1 -1
- package/dist/server/modules/worktree/worktree-controller.js +6 -5
- package/dist/server/modules/worktree/worktree-controller.js.map +1 -1
- package/dist/server/modules/worktree/worktree-manager.d.ts +1 -1
- package/dist/server/modules/worktree/worktree-manager.js +26 -19
- package/dist/server/modules/worktree/worktree-manager.js.map +1 -1
- package/dist/server/modules/worktree/worktree-merge-service.d.ts +2 -2
- package/dist/server/modules/worktree/worktree-merge-service.js +34 -27
- package/dist/server/modules/worktree/worktree-merge-service.js.map +1 -1
- package/dist/server/modules/worktree/worktree-sync-service.d.ts +1 -1
- package/dist/server/modules/worktree/worktree-sync-service.js +5 -3
- package/dist/server/modules/worktree/worktree-sync-service.js.map +1 -1
- package/dist/server/routes/assistant.js +24 -0
- package/dist/server/routes/assistant.js.map +1 -1
- package/dist/server/routes/butler.js +4 -0
- package/dist/server/routes/butler.js.map +1 -1
- package/dist/server/routes/client.js +2 -0
- package/dist/server/routes/client.js.map +1 -1
- package/dist/server/routes/sessions.js +1 -1
- package/dist/server/routes/sessions.js.map +1 -1
- package/dist/server/routes/system.d.ts +2 -1
- package/dist/server/routes/system.js +3 -1
- package/dist/server/routes/system.js.map +1 -1
- package/dist/server/server/create-server.d.ts +4 -0
- package/dist/server/server/create-server.js +67 -8
- package/dist/server/server/create-server.js.map +1 -1
- package/dist/server/shared/errors/app-error.d.ts +2 -0
- package/dist/server/shared/errors/app-error.js +2 -0
- package/dist/server/shared/errors/app-error.js.map +1 -1
- package/dist/server/shared/http/error-handler.d.ts +2 -1
- package/dist/server/shared/http/error-handler.js +3 -2
- package/dist/server/shared/http/error-handler.js.map +1 -1
- package/dist/server/shared/http/request-abort.d.ts +2 -0
- package/dist/server/shared/http/request-abort.js +38 -0
- package/dist/server/shared/http/request-abort.js.map +1 -0
- package/dist/server/storage/repositories/auth-login-attempt-repository.d.ts +9 -0
- package/dist/server/storage/repositories/auth-login-attempt-repository.js +59 -0
- package/dist/server/storage/repositories/auth-login-attempt-repository.js.map +1 -0
- package/dist/server/storage/repositories/butler-control-session-repository.d.ts +3 -0
- package/dist/server/storage/repositories/butler-control-session-repository.js +80 -4
- package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
- package/dist/server/storage/repositories/butler-inbox-item-repository.js +54 -3
- package/dist/server/storage/repositories/butler-inbox-item-repository.js.map +1 -1
- package/dist/server/storage/repositories/terminal-instance-repository.js +1 -1
- package/dist/server/storage/repositories/terminal-instance-repository.js.map +1 -1
- package/dist/server/storage/repositories/user-preference-profile-repository.js +6 -3
- package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -1
- package/dist/server/storage/sqlite/client.js +127 -0
- package/dist/server/storage/sqlite/client.js.map +1 -1
- package/dist/server/storage/sqlite/schema.sql +19 -1
- package/dist/server/types/domain.d.ts +37 -1
- package/dist/server/ws/workbench-ws-hub.d.ts +1 -0
- package/dist/server/ws/workbench-ws-hub.js +25 -3
- package/dist/server/ws/workbench-ws-hub.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +23 -0
- package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +162 -0
- package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +89 -33
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +18 -2
- package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +3 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +238 -53
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js +1 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +6 -2
- package/node_modules/@codingns/session-sync-core/dist/types.d.ts +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.mjs +33 -0
- package/dist/public/assets/index-DR2rPNi7.css +0 -1
- 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
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
}
|