agent-tower 0.1.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.
- package/dist/app.d.ts +2 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +62 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +131 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/container.d.ts +11 -0
- package/dist/core/container.d.ts.map +1 -0
- package/dist/core/container.js +66 -0
- package/dist/core/container.js.map +1 -0
- package/dist/core/event-bus.d.ts +58 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +29 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +36 -0
- package/dist/errors.js.map +1 -0
- package/dist/executors/base.executor.d.ts +160 -0
- package/dist/executors/base.executor.d.ts.map +1 -0
- package/dist/executors/base.executor.js +122 -0
- package/dist/executors/base.executor.js.map +1 -0
- package/dist/executors/claude-code.executor.d.ts +78 -0
- package/dist/executors/claude-code.executor.d.ts.map +1 -0
- package/dist/executors/claude-code.executor.js +160 -0
- package/dist/executors/claude-code.executor.js.map +1 -0
- package/dist/executors/command-builder.d.ts +64 -0
- package/dist/executors/command-builder.d.ts.map +1 -0
- package/dist/executors/command-builder.js +144 -0
- package/dist/executors/command-builder.js.map +1 -0
- package/dist/executors/cursor-agent.executor.d.ts +57 -0
- package/dist/executors/cursor-agent.executor.d.ts.map +1 -0
- package/dist/executors/cursor-agent.executor.js +109 -0
- package/dist/executors/cursor-agent.executor.js.map +1 -0
- package/dist/executors/default-profiles.json +29 -0
- package/dist/executors/execution-env.d.ts +64 -0
- package/dist/executors/execution-env.d.ts.map +1 -0
- package/dist/executors/execution-env.js +97 -0
- package/dist/executors/execution-env.js.map +1 -0
- package/dist/executors/gemini-cli.executor.d.ts +55 -0
- package/dist/executors/gemini-cli.executor.d.ts.map +1 -0
- package/dist/executors/gemini-cli.executor.js +117 -0
- package/dist/executors/gemini-cli.executor.js.map +1 -0
- package/dist/executors/index.d.ts +49 -0
- package/dist/executors/index.d.ts.map +1 -0
- package/dist/executors/index.js +95 -0
- package/dist/executors/index.js.map +1 -0
- package/dist/executors/profiles.d.ts +61 -0
- package/dist/executors/profiles.d.ts.map +1 -0
- package/dist/executors/profiles.js +192 -0
- package/dist/executors/profiles.js.map +1 -0
- package/dist/git/git-cli.d.ts +59 -0
- package/dist/git/git-cli.d.ts.map +1 -0
- package/dist/git/git-cli.js +156 -0
- package/dist/git/git-cli.js.map +1 -0
- package/dist/git/worktree.manager.d.ts +166 -0
- package/dist/git/worktree.manager.d.ts.map +1 -0
- package/dist/git/worktree.manager.js +481 -0
- package/dist/git/worktree.manager.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/context.d.ts +15 -0
- package/dist/mcp/context.d.ts.map +1 -0
- package/dist/mcp/context.js +19 -0
- package/dist/mcp/context.js.map +1 -0
- package/dist/mcp/http-client.d.ts +46 -0
- package/dist/mcp/http-client.d.ts.map +1 -0
- package/dist/mcp/http-client.js +100 -0
- package/dist/mcp/http-client.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +36 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +32 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/projects.d.ts +7 -0
- package/dist/mcp/tools/projects.d.ts.map +1 -0
- package/dist/mcp/tools/projects.js +12 -0
- package/dist/mcp/tools/projects.js.map +1 -0
- package/dist/mcp/tools/sessions.d.ts +7 -0
- package/dist/mcp/tools/sessions.d.ts.map +1 -0
- package/dist/mcp/tools/sessions.js +22 -0
- package/dist/mcp/tools/sessions.js.map +1 -0
- package/dist/mcp/tools/tasks.d.ts +7 -0
- package/dist/mcp/tools/tasks.d.ts.map +1 -0
- package/dist/mcp/tools/tasks.js +68 -0
- package/dist/mcp/tools/tasks.js.map +1 -0
- package/dist/mcp/tools/workspaces.d.ts +7 -0
- package/dist/mcp/tools/workspaces.d.ts.map +1 -0
- package/dist/mcp/tools/workspaces.js +45 -0
- package/dist/mcp/tools/workspaces.js.map +1 -0
- package/dist/mcp/types.d.ts +109 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +55 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/middleware/tunnel-auth.d.ts +13 -0
- package/dist/middleware/tunnel-auth.d.ts.map +1 -0
- package/dist/middleware/tunnel-auth.js +39 -0
- package/dist/middleware/tunnel-auth.js.map +1 -0
- package/dist/output/__tests__/claude-code-parser-token.test.d.ts +2 -0
- package/dist/output/__tests__/claude-code-parser-token.test.d.ts.map +1 -0
- package/dist/output/__tests__/claude-code-parser-token.test.js +233 -0
- package/dist/output/__tests__/claude-code-parser-token.test.js.map +1 -0
- package/dist/output/__tests__/cursor-agent-parser-token.test.d.ts +2 -0
- package/dist/output/__tests__/cursor-agent-parser-token.test.d.ts.map +1 -0
- package/dist/output/__tests__/cursor-agent-parser-token.test.js +95 -0
- package/dist/output/__tests__/cursor-agent-parser-token.test.js.map +1 -0
- package/dist/output/__tests__/msg-store-token.test.d.ts +2 -0
- package/dist/output/__tests__/msg-store-token.test.d.ts.map +1 -0
- package/dist/output/__tests__/msg-store-token.test.js +38 -0
- package/dist/output/__tests__/msg-store-token.test.js.map +1 -0
- package/dist/output/claude-code-parser.d.ts +96 -0
- package/dist/output/claude-code-parser.d.ts.map +1 -0
- package/dist/output/claude-code-parser.js +498 -0
- package/dist/output/claude-code-parser.js.map +1 -0
- package/dist/output/cursor-agent-parser.d.ts +87 -0
- package/dist/output/cursor-agent-parser.d.ts.map +1 -0
- package/dist/output/cursor-agent-parser.js +476 -0
- package/dist/output/cursor-agent-parser.js.map +1 -0
- package/dist/output/index.d.ts +9 -0
- package/dist/output/index.d.ts.map +1 -0
- package/dist/output/index.js +13 -0
- package/dist/output/index.js.map +1 -0
- package/dist/output/msg-store.d.ts +110 -0
- package/dist/output/msg-store.d.ts.map +1 -0
- package/dist/output/msg-store.js +274 -0
- package/dist/output/msg-store.js.map +1 -0
- package/dist/output/types.d.ts +90 -0
- package/dist/output/types.d.ts.map +1 -0
- package/dist/output/types.js +93 -0
- package/dist/output/types.js.map +1 -0
- package/dist/output/utils/ansi.d.ts +8 -0
- package/dist/output/utils/ansi.d.ts.map +1 -0
- package/dist/output/utils/ansi.js +17 -0
- package/dist/output/utils/ansi.js.map +1 -0
- package/dist/output/utils/patch.d.ts +57 -0
- package/dist/output/utils/patch.d.ts.map +1 -0
- package/dist/output/utils/patch.js +113 -0
- package/dist/output/utils/patch.js.map +1 -0
- package/dist/pipeline/agent-pipeline.d.ts +28 -0
- package/dist/pipeline/agent-pipeline.d.ts.map +1 -0
- package/dist/pipeline/agent-pipeline.js +76 -0
- package/dist/pipeline/agent-pipeline.js.map +1 -0
- package/dist/routes/attachments.d.ts +3 -0
- package/dist/routes/attachments.d.ts.map +1 -0
- package/dist/routes/attachments.js +141 -0
- package/dist/routes/attachments.js.map +1 -0
- package/dist/routes/demo.d.ts +3 -0
- package/dist/routes/demo.d.ts.map +1 -0
- package/dist/routes/demo.js +152 -0
- package/dist/routes/demo.js.map +1 -0
- package/dist/routes/files.d.ts +3 -0
- package/dist/routes/files.d.ts.map +1 -0
- package/dist/routes/files.js +313 -0
- package/dist/routes/files.js.map +1 -0
- package/dist/routes/filesystem.d.ts +3 -0
- package/dist/routes/filesystem.d.ts.map +1 -0
- package/dist/routes/filesystem.js +126 -0
- package/dist/routes/filesystem.js.map +1 -0
- package/dist/routes/git.d.ts +3 -0
- package/dist/routes/git.d.ts.map +1 -0
- package/dist/routes/git.js +170 -0
- package/dist/routes/git.js.map +1 -0
- package/dist/routes/index.d.ts +3 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +45 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/notifications.d.ts +10 -0
- package/dist/routes/notifications.d.ts.map +1 -0
- package/dist/routes/notifications.js +54 -0
- package/dist/routes/notifications.js.map +1 -0
- package/dist/routes/profiles.d.ts +12 -0
- package/dist/routes/profiles.d.ts.map +1 -0
- package/dist/routes/profiles.js +76 -0
- package/dist/routes/profiles.js.map +1 -0
- package/dist/routes/projects.d.ts +3 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +94 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/sessions.d.ts +12 -0
- package/dist/routes/sessions.d.ts.map +1 -0
- package/dist/routes/sessions.js +109 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/system.d.ts +3 -0
- package/dist/routes/system.d.ts.map +1 -0
- package/dist/routes/system.js +42 -0
- package/dist/routes/system.js.map +1 -0
- package/dist/routes/tasks.d.ts +3 -0
- package/dist/routes/tasks.d.ts.map +1 -0
- package/dist/routes/tasks.js +136 -0
- package/dist/routes/tasks.js.map +1 -0
- package/dist/routes/terminals.d.ts +3 -0
- package/dist/routes/terminals.d.ts.map +1 -0
- package/dist/routes/terminals.js +54 -0
- package/dist/routes/terminals.js.map +1 -0
- package/dist/routes/tunnel.d.ts +3 -0
- package/dist/routes/tunnel.d.ts.map +1 -0
- package/dist/routes/tunnel.js +36 -0
- package/dist/routes/tunnel.js.map +1 -0
- package/dist/routes/workspaces.d.ts +3 -0
- package/dist/routes/workspaces.d.ts.map +1 -0
- package/dist/routes/workspaces.js +171 -0
- package/dist/routes/workspaces.js.map +1 -0
- package/dist/services/commit-message.service.d.ts +32 -0
- package/dist/services/commit-message.service.d.ts.map +1 -0
- package/dist/services/commit-message.service.js +202 -0
- package/dist/services/commit-message.service.js.map +1 -0
- package/dist/services/notifications/feishu-channel.d.ts +9 -0
- package/dist/services/notifications/feishu-channel.d.ts.map +1 -0
- package/dist/services/notifications/feishu-channel.js +51 -0
- package/dist/services/notifications/feishu-channel.js.map +1 -0
- package/dist/services/notifications/index.d.ts +3 -0
- package/dist/services/notifications/index.d.ts.map +1 -0
- package/dist/services/notifications/index.js +2 -0
- package/dist/services/notifications/index.js.map +1 -0
- package/dist/services/notifications/notification.service.d.ts +10 -0
- package/dist/services/notifications/notification.service.d.ts.map +1 -0
- package/dist/services/notifications/notification.service.js +85 -0
- package/dist/services/notifications/notification.service.js.map +1 -0
- package/dist/services/notifications/os-channel.d.ts +8 -0
- package/dist/services/notifications/os-channel.d.ts.map +1 -0
- package/dist/services/notifications/os-channel.js +38 -0
- package/dist/services/notifications/os-channel.js.map +1 -0
- package/dist/services/notifications/types.d.ts +11 -0
- package/dist/services/notifications/types.d.ts.map +1 -0
- package/dist/services/notifications/types.js +2 -0
- package/dist/services/notifications/types.js.map +1 -0
- package/dist/services/project.service.d.ts +91 -0
- package/dist/services/project.service.d.ts.map +1 -0
- package/dist/services/project.service.js +138 -0
- package/dist/services/project.service.js.map +1 -0
- package/dist/services/session-manager.d.ts +164 -0
- package/dist/services/session-manager.d.ts.map +1 -0
- package/dist/services/session-manager.js +569 -0
- package/dist/services/session-manager.js.map +1 -0
- package/dist/services/task.service.d.ts +179 -0
- package/dist/services/task.service.d.ts.map +1 -0
- package/dist/services/task.service.js +281 -0
- package/dist/services/task.service.js.map +1 -0
- package/dist/services/terminal-manager.d.ts +64 -0
- package/dist/services/terminal-manager.d.ts.map +1 -0
- package/dist/services/terminal-manager.js +217 -0
- package/dist/services/terminal-manager.js.map +1 -0
- package/dist/services/tunnel.service.d.ts +16 -0
- package/dist/services/tunnel.service.d.ts.map +1 -0
- package/dist/services/tunnel.service.js +77 -0
- package/dist/services/tunnel.service.js.map +1 -0
- package/dist/services/workspace.service.d.ts +219 -0
- package/dist/services/workspace.service.d.ts.map +1 -0
- package/dist/services/workspace.service.js +351 -0
- package/dist/services/workspace.service.js.map +1 -0
- package/dist/socket/events.d.ts +2 -0
- package/dist/socket/events.d.ts.map +1 -0
- package/dist/socket/events.js +3 -0
- package/dist/socket/events.js.map +1 -0
- package/dist/socket/index.d.ts +20 -0
- package/dist/socket/index.d.ts.map +1 -0
- package/dist/socket/index.js +77 -0
- package/dist/socket/index.js.map +1 -0
- package/dist/socket/middleware/auth.d.ts +13 -0
- package/dist/socket/middleware/auth.d.ts.map +1 -0
- package/dist/socket/middleware/auth.js +29 -0
- package/dist/socket/middleware/auth.js.map +1 -0
- package/dist/socket/middleware/error-handler.d.ts +11 -0
- package/dist/socket/middleware/error-handler.d.ts.map +1 -0
- package/dist/socket/middleware/error-handler.js +39 -0
- package/dist/socket/middleware/error-handler.js.map +1 -0
- package/dist/socket/middleware/index.d.ts +3 -0
- package/dist/socket/middleware/index.d.ts.map +1 -0
- package/dist/socket/middleware/index.js +3 -0
- package/dist/socket/middleware/index.js.map +1 -0
- package/dist/socket/rooms.d.ts +30 -0
- package/dist/socket/rooms.d.ts.map +1 -0
- package/dist/socket/rooms.js +39 -0
- package/dist/socket/rooms.js.map +1 -0
- package/dist/socket/socket-gateway.d.ts +21 -0
- package/dist/socket/socket-gateway.d.ts.map +1 -0
- package/dist/socket/socket-gateway.js +173 -0
- package/dist/socket/socket-gateway.js.map +1 -0
- package/dist/types/index.d.ts +41 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +41 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +12 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +25 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/web/assets/AgentDemoPage-WdWEQtyU.js +1 -0
- package/dist/web/assets/DemoPage-C4Z_ftHI.js +4 -0
- package/dist/web/assets/NotificationSettingsPage-FrLfgt9y.js +1 -0
- package/dist/web/assets/ProfileSettingsPage-Cs93rTRr.js +3 -0
- package/dist/web/assets/ProjectKanbanPage-BmlRVfzo.js +75 -0
- package/dist/web/assets/ProjectKanbanPage-G5OQeJvU.css +1 -0
- package/dist/web/assets/api-client-CEBkg5lt.js +1 -0
- package/dist/web/assets/circle-alert-BEozlsMd.js +1 -0
- package/dist/web/assets/code-block-OCS4YCEC-CGgYYS4A.js +2 -0
- package/dist/web/assets/folder-picker-BP3x3phB.js +1 -0
- package/dist/web/assets/index-BuAijQvi.js +13 -0
- package/dist/web/assets/index-CxV866Yg.css +1 -0
- package/dist/web/assets/loader-circle-yEIqsdJ1.js +1 -0
- package/dist/web/assets/mermaid-NOHMQCX5-CIqtI2jF.js +123 -0
- package/dist/web/assets/mermaid-NOHMQCX5-lI9o3AWT.css +1 -0
- package/dist/web/assets/modal-BoX2RXaV.js +1 -0
- package/dist/web/assets/query-keys-BD_s_Etj.js +1 -0
- package/dist/web/assets/use-profiles-Rh8rBsAt.js +1 -0
- package/dist/web/index.html +14 -0
- package/dist/web/vite.svg +1 -0
- package/node_modules/@agent-tower/shared/dist/dev-port.d.ts +12 -0
- package/node_modules/@agent-tower/shared/dist/dev-port.d.ts.map +1 -0
- package/node_modules/@agent-tower/shared/dist/dev-port.js +31 -0
- package/node_modules/@agent-tower/shared/dist/dev-port.js.map +1 -0
- package/node_modules/@agent-tower/shared/dist/index.d.ts +5 -0
- package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -0
- package/node_modules/@agent-tower/shared/dist/index.js +5 -0
- package/node_modules/@agent-tower/shared/dist/index.js.map +1 -0
- package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts +72 -0
- package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts.map +1 -0
- package/node_modules/@agent-tower/shared/dist/log-adapter.js +144 -0
- package/node_modules/@agent-tower/shared/dist/log-adapter.js.map +1 -0
- package/node_modules/@agent-tower/shared/dist/socket/events.d.ts +133 -0
- package/node_modules/@agent-tower/shared/dist/socket/events.d.ts.map +1 -0
- package/node_modules/@agent-tower/shared/dist/socket/events.js +32 -0
- package/node_modules/@agent-tower/shared/dist/socket/events.js.map +1 -0
- package/node_modules/@agent-tower/shared/dist/socket/index.d.ts +2 -0
- package/node_modules/@agent-tower/shared/dist/socket/index.d.ts.map +1 -0
- package/node_modules/@agent-tower/shared/dist/socket/index.js +2 -0
- package/node_modules/@agent-tower/shared/dist/socket/index.js.map +1 -0
- package/node_modules/@agent-tower/shared/dist/types.d.ts +168 -0
- package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -0
- package/node_modules/@agent-tower/shared/dist/types.js +53 -0
- package/node_modules/@agent-tower/shared/dist/types.js.map +1 -0
- package/node_modules/@agent-tower/shared/package.json +38 -0
- package/package.json +46 -0
- package/prisma/schema.prisma +130 -0
- package/scripts/postinstall.js +120 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 房间名称生成工具
|
|
3
|
+
* 统一管理房间命名规则
|
|
4
|
+
*/
|
|
5
|
+
export declare const getRoomName: {
|
|
6
|
+
/**
|
|
7
|
+
* 看板房间
|
|
8
|
+
* 用于看板内的实时协作
|
|
9
|
+
*/
|
|
10
|
+
board: (boardId: string) => string;
|
|
11
|
+
/**
|
|
12
|
+
* 用户私人房间
|
|
13
|
+
* 用于接收个人通知
|
|
14
|
+
*/
|
|
15
|
+
user: (userId: string) => string;
|
|
16
|
+
/**
|
|
17
|
+
* 项目房间(可选)
|
|
18
|
+
* 用于项目级别的广播
|
|
19
|
+
*/
|
|
20
|
+
project: (projectId: string) => string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* 从房间名称解析 ID
|
|
24
|
+
*/
|
|
25
|
+
export declare const parseRoomName: {
|
|
26
|
+
board: (roomName: string) => string | null;
|
|
27
|
+
user: (roomName: string) => string | null;
|
|
28
|
+
project: (roomName: string) => string | null;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=rooms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../../src/socket/rooms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,WAAW;IACtB;;;OAGG;qBACc,MAAM;IAEvB;;;OAGG;mBACY,MAAM;IAErB;;;OAGG;yBACkB,MAAM;CAC5B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;sBACN,MAAM,KAAG,MAAM,GAAG,IAAI;qBAKvB,MAAM,KAAG,MAAM,GAAG,IAAI;wBAKnB,MAAM,KAAG,MAAM,GAAG,IAAI;CAI3C,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 房间名称生成工具
|
|
3
|
+
* 统一管理房间命名规则
|
|
4
|
+
*/
|
|
5
|
+
export const getRoomName = {
|
|
6
|
+
/**
|
|
7
|
+
* 看板房间
|
|
8
|
+
* 用于看板内的实时协作
|
|
9
|
+
*/
|
|
10
|
+
board: (boardId) => `board:${boardId}`,
|
|
11
|
+
/**
|
|
12
|
+
* 用户私人房间
|
|
13
|
+
* 用于接收个人通知
|
|
14
|
+
*/
|
|
15
|
+
user: (userId) => `user:${userId}`,
|
|
16
|
+
/**
|
|
17
|
+
* 项目房间(可选)
|
|
18
|
+
* 用于项目级别的广播
|
|
19
|
+
*/
|
|
20
|
+
project: (projectId) => `project:${projectId}`,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* 从房间名称解析 ID
|
|
24
|
+
*/
|
|
25
|
+
export const parseRoomName = {
|
|
26
|
+
board: (roomName) => {
|
|
27
|
+
const match = roomName.match(/^board:(.+)$/);
|
|
28
|
+
return match ? match[1] : null;
|
|
29
|
+
},
|
|
30
|
+
user: (roomName) => {
|
|
31
|
+
const match = roomName.match(/^user:(.+)$/);
|
|
32
|
+
return match ? match[1] : null;
|
|
33
|
+
},
|
|
34
|
+
project: (roomName) => {
|
|
35
|
+
const match = roomName.match(/^project:(.+)$/);
|
|
36
|
+
return match ? match[1] : null;
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=rooms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rooms.js","sourceRoot":"","sources":["../../src/socket/rooms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB;;;OAGG;IACH,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,SAAS,OAAO,EAAE;IAE9C;;;OAGG;IACH,IAAI,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,QAAQ,MAAM,EAAE;IAE1C;;;OAGG;IACH,OAAO,EAAE,CAAC,SAAiB,EAAE,EAAE,CAAC,WAAW,SAAS,EAAE;CACvD,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,CAAC,QAAgB,EAAiB,EAAE;QACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;QAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAChC,CAAC;IAED,IAAI,EAAE,CAAC,QAAgB,EAAiB,EAAE;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;QAC3C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAChC,CAAC;IAED,OAAO,EAAE,CAAC,QAAgB,EAAiB,EAAE;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAChC,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Namespace, Socket } from 'socket.io';
|
|
2
|
+
import type { EventBus } from '../core/event-bus.js';
|
|
3
|
+
import type { SessionManager } from '../services/session-manager.js';
|
|
4
|
+
import type { TerminalManager } from '../services/terminal-manager.js';
|
|
5
|
+
import { type AgentStatusPayload } from './events.js';
|
|
6
|
+
export declare class SocketGateway {
|
|
7
|
+
private readonly nsp;
|
|
8
|
+
private readonly eventBus;
|
|
9
|
+
private readonly sessionManager;
|
|
10
|
+
private readonly terminalManager;
|
|
11
|
+
private cleanups;
|
|
12
|
+
constructor(nsp: Namespace, eventBus: EventBus, sessionManager: SessionManager, terminalManager: TerminalManager);
|
|
13
|
+
destroy(): void;
|
|
14
|
+
register(socket: Socket): void;
|
|
15
|
+
private registerEventBusForwarders;
|
|
16
|
+
broadcastAgentStatus(payload: AgentStatusPayload): void;
|
|
17
|
+
private handleSubscribe;
|
|
18
|
+
private handleUnsubscribe;
|
|
19
|
+
private buildRoom;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=socket-gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-gateway.d.ts","sourceRoot":"","sources":["../../src/socket/socket-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAUL,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AAErB,qBAAa,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe;IANlC,OAAO,CAAC,QAAQ,CAAyB;gBAGtB,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,eAAe;IAKnD,OAAO,IAAI,IAAI;IAOf,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAsD9B,OAAO,CAAC,0BAA0B;IAqElC,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAKvD,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,SAAS;CAelB"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { ClientEvents, ServerEvents, } from './events.js';
|
|
2
|
+
export class SocketGateway {
|
|
3
|
+
nsp;
|
|
4
|
+
eventBus;
|
|
5
|
+
sessionManager;
|
|
6
|
+
terminalManager;
|
|
7
|
+
cleanups = [];
|
|
8
|
+
constructor(nsp, eventBus, sessionManager, terminalManager) {
|
|
9
|
+
this.nsp = nsp;
|
|
10
|
+
this.eventBus = eventBus;
|
|
11
|
+
this.sessionManager = sessionManager;
|
|
12
|
+
this.terminalManager = terminalManager;
|
|
13
|
+
this.registerEventBusForwarders();
|
|
14
|
+
}
|
|
15
|
+
destroy() {
|
|
16
|
+
for (const cleanup of this.cleanups) {
|
|
17
|
+
cleanup();
|
|
18
|
+
}
|
|
19
|
+
this.cleanups = [];
|
|
20
|
+
}
|
|
21
|
+
register(socket) {
|
|
22
|
+
// --- Subscribe / Unsubscribe ---
|
|
23
|
+
socket.on(ClientEvents.SUBSCRIBE, (payload, ack) => {
|
|
24
|
+
this.handleSubscribe(socket, payload, ack);
|
|
25
|
+
});
|
|
26
|
+
socket.on(ClientEvents.UNSUBSCRIBE, (payload, ack) => {
|
|
27
|
+
this.handleUnsubscribe(socket, payload, ack);
|
|
28
|
+
});
|
|
29
|
+
// --- Agent session I/O ---
|
|
30
|
+
socket.on(ClientEvents.INPUT, (payload) => {
|
|
31
|
+
if (!payload?.sessionId || typeof payload.data !== 'string')
|
|
32
|
+
return;
|
|
33
|
+
try {
|
|
34
|
+
this.sessionManager.writeInput(payload.sessionId, payload.data);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.error(`[SocketGateway] INPUT error for session ${payload.sessionId}:`, err);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
socket.on(ClientEvents.RESIZE, (payload) => {
|
|
41
|
+
if (!payload?.sessionId || typeof payload.cols !== 'number' || typeof payload.rows !== 'number')
|
|
42
|
+
return;
|
|
43
|
+
try {
|
|
44
|
+
this.sessionManager.resize(payload.sessionId, payload.cols, payload.rows);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
console.error(`[SocketGateway] RESIZE error for session ${payload.sessionId}:`, err);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// --- Standalone terminal I/O ---
|
|
51
|
+
socket.on(ClientEvents.TERMINAL_INPUT, (payload) => {
|
|
52
|
+
if (!payload?.terminalId || typeof payload.data !== 'string')
|
|
53
|
+
return;
|
|
54
|
+
try {
|
|
55
|
+
this.terminalManager.write(payload.terminalId, payload.data);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
console.error(`[SocketGateway] TERMINAL_INPUT error for terminal ${payload.terminalId}:`, err);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
socket.on(ClientEvents.TERMINAL_RESIZE, (payload) => {
|
|
62
|
+
if (!payload?.terminalId || typeof payload.cols !== 'number' || typeof payload.rows !== 'number')
|
|
63
|
+
return;
|
|
64
|
+
try {
|
|
65
|
+
this.terminalManager.resize(payload.terminalId, payload.cols, payload.rows);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
console.error(`[SocketGateway] TERMINAL_RESIZE error for terminal ${payload.terminalId}:`, err);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
// --- Socket disconnect: clean up owned terminals ---
|
|
72
|
+
socket.on('disconnect', () => {
|
|
73
|
+
this.terminalManager.cleanupBySocket(socket.id);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
registerEventBusForwarders() {
|
|
77
|
+
// --- Session events (unchanged) ---
|
|
78
|
+
const onStdout = ({ sessionId, data }) => {
|
|
79
|
+
this.nsp.to(`session:${sessionId}`).emit(ServerEvents.SESSION_STDOUT, { sessionId, data });
|
|
80
|
+
};
|
|
81
|
+
const onPatch = ({ sessionId, patch }) => {
|
|
82
|
+
this.nsp.to(`session:${sessionId}`).emit(ServerEvents.SESSION_PATCH, { sessionId, patch });
|
|
83
|
+
};
|
|
84
|
+
const onSessionId = ({ sessionId, agentSessionId }) => {
|
|
85
|
+
this.nsp.to(`session:${sessionId}`).emit(ServerEvents.SESSION_ID, { sessionId, agentSessionId });
|
|
86
|
+
};
|
|
87
|
+
const onExit = ({ sessionId, exitCode }) => {
|
|
88
|
+
this.nsp.to(`session:${sessionId}`).emit(ServerEvents.SESSION_EXIT, {
|
|
89
|
+
sessionId,
|
|
90
|
+
exitCode: typeof exitCode === 'number' ? exitCode : 0,
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
const onSessionCompleted = ({ sessionId, status }) => {
|
|
94
|
+
this.nsp.to(`session:${sessionId}`).emit(ServerEvents.SESSION_COMPLETED, {
|
|
95
|
+
sessionId,
|
|
96
|
+
status,
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
const onTask = ({ taskId, projectId, status }) => {
|
|
100
|
+
const payload = { taskId, projectId, status };
|
|
101
|
+
this.nsp.to(`task:${taskId}`).emit(ServerEvents.TASK_UPDATED, payload);
|
|
102
|
+
// 同时广播到 project room,让看板实时更新
|
|
103
|
+
this.nsp.to(`project:${projectId}`).emit(ServerEvents.TASK_UPDATED, payload);
|
|
104
|
+
};
|
|
105
|
+
const onTaskDeleted = ({ taskId, projectId }) => {
|
|
106
|
+
const payload = { taskId, projectId };
|
|
107
|
+
this.nsp.to(`task:${taskId}`).emit(ServerEvents.TASK_DELETED, payload);
|
|
108
|
+
this.nsp.to(`project:${projectId}`).emit(ServerEvents.TASK_DELETED, payload);
|
|
109
|
+
};
|
|
110
|
+
// --- Terminal events (new) ---
|
|
111
|
+
const onTerminalStdout = ({ terminalId, data }) => {
|
|
112
|
+
this.nsp.to(`terminal:${terminalId}`).emit(ServerEvents.TERMINAL_STDOUT, { terminalId, data });
|
|
113
|
+
};
|
|
114
|
+
const onTerminalExit = ({ terminalId, exitCode }) => {
|
|
115
|
+
this.nsp.to(`terminal:${terminalId}`).emit(ServerEvents.TERMINAL_EXIT, {
|
|
116
|
+
terminalId,
|
|
117
|
+
exitCode: typeof exitCode === 'number' ? exitCode : 0,
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
this.eventBus.on('session:stdout', onStdout);
|
|
121
|
+
this.eventBus.on('session:patch', onPatch);
|
|
122
|
+
this.eventBus.on('session:sessionId', onSessionId);
|
|
123
|
+
this.eventBus.on('session:exit', onExit);
|
|
124
|
+
this.eventBus.on('session:completed', onSessionCompleted);
|
|
125
|
+
this.eventBus.on('task:updated', onTask);
|
|
126
|
+
this.eventBus.on('task:deleted', onTaskDeleted);
|
|
127
|
+
this.eventBus.on('terminal:stdout', onTerminalStdout);
|
|
128
|
+
this.eventBus.on('terminal:exit', onTerminalExit);
|
|
129
|
+
this.cleanups.push(() => this.eventBus.off('session:stdout', onStdout), () => this.eventBus.off('session:patch', onPatch), () => this.eventBus.off('session:sessionId', onSessionId), () => this.eventBus.off('session:exit', onExit), () => this.eventBus.off('session:completed', onSessionCompleted), () => this.eventBus.off('task:updated', onTask), () => this.eventBus.off('task:deleted', onTaskDeleted), () => this.eventBus.off('terminal:stdout', onTerminalStdout), () => this.eventBus.off('terminal:exit', onTerminalExit));
|
|
130
|
+
}
|
|
131
|
+
broadcastAgentStatus(payload) {
|
|
132
|
+
this.nsp.to(`agent:${payload.agentId}`).emit(ServerEvents.AGENT_STATUS_CHANGED, payload);
|
|
133
|
+
this.nsp.to('agent:all').emit(ServerEvents.AGENT_STATUS_CHANGED, payload);
|
|
134
|
+
}
|
|
135
|
+
handleSubscribe(socket, payload, ack) {
|
|
136
|
+
const room = this.buildRoom(payload);
|
|
137
|
+
socket.join(room);
|
|
138
|
+
if (payload.topic === 'session' && payload.id) {
|
|
139
|
+
socket.emit(ServerEvents.SESSION_SUBSCRIBED, { sessionId: payload.id });
|
|
140
|
+
}
|
|
141
|
+
if (payload.topic === 'terminal' && payload.id) {
|
|
142
|
+
socket.emit(ServerEvents.TERMINAL_SUBSCRIBED, { terminalId: payload.id });
|
|
143
|
+
}
|
|
144
|
+
ack?.({ success: true });
|
|
145
|
+
}
|
|
146
|
+
handleUnsubscribe(socket, payload, ack) {
|
|
147
|
+
const room = this.buildRoom(payload);
|
|
148
|
+
socket.leave(room);
|
|
149
|
+
if (payload.topic === 'session' && payload.id) {
|
|
150
|
+
socket.emit(ServerEvents.SESSION_UNSUBSCRIBED, { sessionId: payload.id });
|
|
151
|
+
}
|
|
152
|
+
if (payload.topic === 'terminal' && payload.id) {
|
|
153
|
+
socket.emit(ServerEvents.TERMINAL_UNSUBSCRIBED, { terminalId: payload.id });
|
|
154
|
+
}
|
|
155
|
+
ack?.({ success: true });
|
|
156
|
+
}
|
|
157
|
+
buildRoom(payload) {
|
|
158
|
+
if (payload.topic === 'session') {
|
|
159
|
+
return payload.id ? `session:${payload.id}` : 'session:all';
|
|
160
|
+
}
|
|
161
|
+
if (payload.topic === 'task') {
|
|
162
|
+
return payload.id ? `task:${payload.id}` : 'task:all';
|
|
163
|
+
}
|
|
164
|
+
if (payload.topic === 'terminal') {
|
|
165
|
+
return payload.id ? `terminal:${payload.id}` : 'terminal:all';
|
|
166
|
+
}
|
|
167
|
+
if (payload.topic === 'project') {
|
|
168
|
+
return payload.id ? `project:${payload.id}` : 'project:all';
|
|
169
|
+
}
|
|
170
|
+
return payload.id ? `agent:${payload.id}` : 'agent:all';
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=socket-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-gateway.js","sourceRoot":"","sources":["../../src/socket/socket-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export declare enum TaskStatus {
|
|
2
|
+
TODO = "TODO",
|
|
3
|
+
IN_PROGRESS = "IN_PROGRESS",
|
|
4
|
+
IN_REVIEW = "IN_REVIEW",
|
|
5
|
+
DONE = "DONE",
|
|
6
|
+
CANCELLED = "CANCELLED"
|
|
7
|
+
}
|
|
8
|
+
export declare enum WorkspaceStatus {
|
|
9
|
+
ACTIVE = "ACTIVE",
|
|
10
|
+
MERGED = "MERGED",
|
|
11
|
+
ABANDONED = "ABANDONED"
|
|
12
|
+
}
|
|
13
|
+
export declare enum AgentType {
|
|
14
|
+
CLAUDE_CODE = "CLAUDE_CODE",
|
|
15
|
+
GEMINI_CLI = "GEMINI_CLI",
|
|
16
|
+
CURSOR_AGENT = "CURSOR_AGENT"
|
|
17
|
+
}
|
|
18
|
+
export declare enum SessionStatus {
|
|
19
|
+
PENDING = "PENDING",
|
|
20
|
+
RUNNING = "RUNNING",
|
|
21
|
+
COMPLETED = "COMPLETED",
|
|
22
|
+
FAILED = "FAILED",
|
|
23
|
+
CANCELLED = "CANCELLED"
|
|
24
|
+
}
|
|
25
|
+
export declare enum SessionPurpose {
|
|
26
|
+
/** 正常用户交互会话 */
|
|
27
|
+
CHAT = "CHAT",
|
|
28
|
+
/** 内部:生成 commit message */
|
|
29
|
+
COMMIT_MSG = "COMMIT_MSG"
|
|
30
|
+
}
|
|
31
|
+
export interface AgentAvailability {
|
|
32
|
+
available: boolean;
|
|
33
|
+
version?: string;
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface ExecutorConfig {
|
|
37
|
+
workingDir: string;
|
|
38
|
+
prompt: string;
|
|
39
|
+
env?: Record<string, string>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,oBAAY,UAAU;IACpB,IAAI,SAAS;IACb,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,IAAI,SAAS;IACb,SAAS,cAAc;CACxB;AAGD,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,SAAS,cAAc;CACxB;AAGD,oBAAY,SAAS;IACnB,WAAW,gBAAgB;IAC3B,UAAU,eAAe;IACzB,YAAY,iBAAiB;CAC9B;AAGD,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,SAAS,cAAc;CACxB;AAGD,oBAAY,cAAc;IACxB,eAAe;IACf,IAAI,SAAS;IACb,2BAA2B;IAC3B,UAAU,eAAe;CAC1B;AAGD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// 任务状态
|
|
2
|
+
export var TaskStatus;
|
|
3
|
+
(function (TaskStatus) {
|
|
4
|
+
TaskStatus["TODO"] = "TODO";
|
|
5
|
+
TaskStatus["IN_PROGRESS"] = "IN_PROGRESS";
|
|
6
|
+
TaskStatus["IN_REVIEW"] = "IN_REVIEW";
|
|
7
|
+
TaskStatus["DONE"] = "DONE";
|
|
8
|
+
TaskStatus["CANCELLED"] = "CANCELLED";
|
|
9
|
+
})(TaskStatus || (TaskStatus = {}));
|
|
10
|
+
// 工作空间状态
|
|
11
|
+
export var WorkspaceStatus;
|
|
12
|
+
(function (WorkspaceStatus) {
|
|
13
|
+
WorkspaceStatus["ACTIVE"] = "ACTIVE";
|
|
14
|
+
WorkspaceStatus["MERGED"] = "MERGED";
|
|
15
|
+
WorkspaceStatus["ABANDONED"] = "ABANDONED";
|
|
16
|
+
})(WorkspaceStatus || (WorkspaceStatus = {}));
|
|
17
|
+
// AI 代理类型
|
|
18
|
+
export var AgentType;
|
|
19
|
+
(function (AgentType) {
|
|
20
|
+
AgentType["CLAUDE_CODE"] = "CLAUDE_CODE";
|
|
21
|
+
AgentType["GEMINI_CLI"] = "GEMINI_CLI";
|
|
22
|
+
AgentType["CURSOR_AGENT"] = "CURSOR_AGENT";
|
|
23
|
+
})(AgentType || (AgentType = {}));
|
|
24
|
+
// 会话状态
|
|
25
|
+
export var SessionStatus;
|
|
26
|
+
(function (SessionStatus) {
|
|
27
|
+
SessionStatus["PENDING"] = "PENDING";
|
|
28
|
+
SessionStatus["RUNNING"] = "RUNNING";
|
|
29
|
+
SessionStatus["COMPLETED"] = "COMPLETED";
|
|
30
|
+
SessionStatus["FAILED"] = "FAILED";
|
|
31
|
+
SessionStatus["CANCELLED"] = "CANCELLED";
|
|
32
|
+
})(SessionStatus || (SessionStatus = {}));
|
|
33
|
+
// 会话用途
|
|
34
|
+
export var SessionPurpose;
|
|
35
|
+
(function (SessionPurpose) {
|
|
36
|
+
/** 正常用户交互会话 */
|
|
37
|
+
SessionPurpose["CHAT"] = "CHAT";
|
|
38
|
+
/** 内部:生成 commit message */
|
|
39
|
+
SessionPurpose["COMMIT_MSG"] = "COMMIT_MSG";
|
|
40
|
+
})(SessionPurpose || (SessionPurpose = {}));
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO;AACP,MAAM,CAAN,IAAY,UAMX;AAND,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,yCAA2B,CAAA;IAC3B,qCAAuB,CAAA;IACvB,2BAAa,CAAA;IACb,qCAAuB,CAAA;AACzB,CAAC,EANW,UAAU,KAAV,UAAU,QAMrB;AAED,SAAS;AACT,MAAM,CAAN,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,oCAAiB,CAAA;IACjB,0CAAuB,CAAA;AACzB,CAAC,EAJW,eAAe,KAAf,eAAe,QAI1B;AAED,UAAU;AACV,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,wCAA2B,CAAA;IAC3B,sCAAyB,CAAA;IACzB,0CAA6B,CAAA;AAC/B,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED,OAAO;AACP,MAAM,CAAN,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;IACnB,wCAAuB,CAAA;IACvB,kCAAiB,CAAA;IACjB,wCAAuB,CAAA;AACzB,CAAC,EANW,aAAa,KAAb,aAAa,QAMxB;AAED,OAAO;AACP,MAAM,CAAN,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,eAAe;IACf,+BAAa,CAAA;IACb,2BAA2B;IAC3B,2CAAyB,CAAA;AAC3B,CAAC,EALW,cAAc,KAAd,cAAc,QAKzB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import pkg from '@prisma/client';
|
|
2
|
+
export declare const prisma: pkg.PrismaClient<pkg.Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
|
|
3
|
+
export declare function execAsync(command: string): Promise<{
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
}>;
|
|
7
|
+
/**
|
|
8
|
+
* 查找可执行文件路径
|
|
9
|
+
* 类似于 Unix 的 which 命令
|
|
10
|
+
*/
|
|
11
|
+
export declare function which(command: string): Promise<string | null>;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,gBAAgB,CAAC;AAGjC,eAAO,MAAM,MAAM,+GAAqB,CAAC;AAEzC,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAK7C;AAED;;;GAGG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASnE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import pkg from '@prisma/client';
|
|
2
|
+
const { PrismaClient } = pkg;
|
|
3
|
+
export const prisma = new PrismaClient();
|
|
4
|
+
export async function execAsync(command) {
|
|
5
|
+
const { exec } = await import('child_process');
|
|
6
|
+
const { promisify } = await import('util');
|
|
7
|
+
const execPromise = promisify(exec);
|
|
8
|
+
return execPromise(command);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 查找可执行文件路径
|
|
12
|
+
* 类似于 Unix 的 which 命令
|
|
13
|
+
*/
|
|
14
|
+
export async function which(command) {
|
|
15
|
+
try {
|
|
16
|
+
const whichCmd = process.platform === 'win32' ? 'where' : 'which';
|
|
17
|
+
const { stdout } = await execAsync(`${whichCmd} ${command}`);
|
|
18
|
+
const path = stdout.trim().split('\n')[0]; // 取第一个结果
|
|
19
|
+
return path || null;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACjC,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;AAE7B,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAe;IAEf,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAe;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QACpD,OAAO,IAAI,IAAI,IAAI,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as b,r as s,j as e,L as W}from"./index-BuAijQvi.js";import{a as f,B as y}from"./api-client-CEBkg5lt.js";import{u as Q,a as X,b as L,c as Y,d as Z,e as ee,S as te,f as se,T as ne,P as re,G as ae,h as le}from"./mermaid-NOHMQCX5-CIqtI2jF.js";import{d as ie}from"./use-profiles-Rh8rBsAt.js";import"./query-keys-BD_s_Etj.js";const oe=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8",key:"7n84p3"}]],ce=b("at-sign",oe);const de=[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]],xe=b("chevron-up",de);const me=[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]],ue=b("hash",me);const pe=[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]],he=b("send",pe),ge=!0;function ye(){const[w,_]=s.useState([]),[l,S]=s.useState(""),[d,k]=s.useState("DEFAULT"),[i,A]=s.useState(""),[r,D]=s.useState(null),[a,o]=s.useState("idle"),[h,E]=s.useState(!1),[x,j]=s.useState(""),$=s.useRef(null),C=s.useRef(null),m=s.useRef(null),{data:u}=ie(l),H=u?Object.keys(u):["DEFAULT"],U=t=>{S(t),k("DEFAULT")},F=s.useCallback(t=>{o(t===0?"stopped":"error")},[]),M=s.useCallback(t=>{console.error("Agent error:",t),o("error")},[]),{isConnected:p,isAttached:g,logs:v,entries:V,agentSessionId:I,attach:z,clearLogs:P}=Q({sessionId:r||"",onExit:F,onError:M}),{todos:R}=X(V);s.useEffect(()=>{f.get("/demo/agents").then(t=>{_(t.agents);const n=t.agents.find(N=>N.available);n&&S(n.type)})},[]),s.useEffect(()=>{$.current?.scrollToBottom("smooth")},[v]),s.useEffect(()=>{console.log(`[AgentDemoPage:useEffect] t=${Date.now()} sessionId=${r} isConnected=${p} isAttached=${g}`),r&&p&&!g&&(console.log(`[AgentDemoPage:useEffect] t=${Date.now()} calling attach()`),z())},[r,p,g,z]);const B=t=>{if(j(t.target.value),m.current){m.current.style.height="auto";const N=Math.min(m.current.scrollHeight,210);m.current.style.height=`${N}px`}},G=async()=>{if(!l||!i.trim())return;const t=Date.now();console.log(`[AgentDemoPage:handleStart] t=${t} starting...`),o("starting"),P();try{const n=await f.post("/demo/start",{agentType:l,prompt:i.trim(),variant:d});ge&&console.log(`[AgentDemoPage:handleStart] t=${Date.now()} apiTime=${Date.now()-t}ms sessionId=${n.sessionId}`),D(n.sessionId),o("running")}catch(n){console.error("Start failed:",n),o("error")}},T=async()=>{if(!r||!x.trim())return;const t=x.trim();j("");try{await f.post(`/demo/${r}/message`,{message:t})}catch(n){console.error("Send failed:",n)}},O=async()=>{if(r)try{await f.post(`/demo/${r}/stop`),o("stopped")}catch(t){console.error("Stop failed:",t)}},K=()=>{D(null),o("idle"),A(""),j(""),P()},q=a==="running",c=r!==null,J=w.find(t=>t.type===l);return e.jsxs("div",{className:"flex flex-col h-full bg-white",children:[e.jsxs("div",{className:"px-8 py-5 border-b border-neutral-100 bg-white transition-all duration-300",children:[e.jsxs("div",{className:"flex items-center flex-wrap gap-3",children:[e.jsxs("div",{className:"flex items-baseline gap-2",children:[e.jsx("span",{className:"text-base font-medium text-blue-600",children:"Agent Demo"}),e.jsx("span",{className:"text-neutral-300 text-sm",children:"/"}),e.jsx("span",{className:"text-xl font-bold text-neutral-900 tracking-tight",children:c?i.slice(0,50)+(i.length>50?"...":""):"新会话"})]}),e.jsxs("div",{className:"flex items-center",children:[a==="running"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-blue-50 text-blue-700 rounded-full text-xs font-medium border border-blue-100",children:[e.jsx(L,{className:"w-3.5 h-3.5 animate-pulse"}),e.jsx("span",{children:"Running"})]}),a==="stopped"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-emerald-50 text-emerald-700 rounded-full text-xs font-medium border border-emerald-100",children:[e.jsx(Y,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:"Done"})]}),a==="idle"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-neutral-100 text-neutral-600 rounded-full text-xs font-medium border border-neutral-200",children:[e.jsx(Z,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:"Idle"})]}),a==="starting"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-amber-50 text-amber-700 rounded-full text-xs font-medium border border-amber-100",children:[e.jsx(L,{className:"w-3.5 h-3.5 animate-spin"}),e.jsx("span",{children:"Starting..."})]}),a==="error"&&e.jsx("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-red-50 text-red-700 rounded-full text-xs font-medium border border-red-100",children:e.jsx("span",{children:"Error"})})]})]}),c&&e.jsxs("div",{className:"mt-1.5 flex items-start gap-2 group max-w-4xl",children:[e.jsx("div",{className:`text-sm text-neutral-600 leading-relaxed cursor-pointer transition-all ${h?"":"truncate"}`,onClick:()=>E(!h),children:i}),e.jsx("button",{onClick:()=>E(!h),className:"mt-0.5 text-neutral-400 opacity-0 group-hover:opacity-100 hover:text-neutral-600 transition-opacity",children:h?e.jsx(xe,{size:14}):e.jsx(ee,{size:14})})]}),e.jsxs("div",{className:"flex items-center gap-6 mt-3",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:"Agent"}),e.jsx("div",{className:"flex items-center gap-1.5 text-neutral-900 font-medium bg-neutral-50 px-2 py-1 rounded border border-neutral-100",children:J?.name||l||"未选择"})]}),d!=="DEFAULT"&&e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:"Variant"}),e.jsx("div",{className:"flex items-center gap-1.5 text-neutral-700 font-medium bg-blue-50 px-2 py-1 rounded border border-blue-100",children:d})]}),I&&e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:"Session"}),e.jsxs("div",{className:"flex items-center gap-1.5 text-neutral-700 font-mono bg-neutral-50 px-2 py-1 rounded border border-neutral-100",children:[I.slice(0,8),"..."]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:"连接"}),e.jsx("div",{className:`flex items-center gap-1.5 font-medium px-2 py-1 rounded border ${p?"text-emerald-700 bg-emerald-50 border-emerald-100":"text-neutral-500 bg-neutral-50 border-neutral-100"}`,children:p?g?"已连接":"连接中...":"未连接"})]}),c&&e.jsx(y,{variant:"outline",size:"sm",onClick:K,className:"ml-auto",children:"新会话"}),e.jsxs(W,{to:"/settings/profiles",className:`flex items-center gap-1.5 text-xs text-neutral-500 hover:text-neutral-900 transition-colors ${c?"":"ml-auto"}`,children:[e.jsx(te,{size:14}),e.jsx("span",{children:"Profiles 设置"})]})]})]}),e.jsx("div",{ref:C,className:"flex-1 overflow-y-auto px-8 py-6",children:c?e.jsx("div",{className:"min-h-[200px]",children:v.length===0?e.jsx("div",{className:"text-neutral-400 text-center py-8",children:"等待 Agent 响应..."}):e.jsx(se,{ref:$,logs:v,scrollElementRef:C})}):e.jsxs("div",{className:"max-w-2xl mx-auto space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold mb-3 text-neutral-900",children:"选择 Agent"}),e.jsx("div",{className:"flex gap-2 flex-wrap",children:w.map(t=>e.jsxs(y,{variant:l===t.type?"default":"outline",disabled:!t.available,onClick:()=>U(t.type),children:[t.name,t.available&&t.version&&` (${t.version})`,!t.available&&" (不可用)"]},t.type))})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold mb-3 text-neutral-900",children:"配置变体 (Profile Variant)"}),e.jsx("div",{className:"flex gap-2 flex-wrap",children:H.map(t=>e.jsx("button",{onClick:()=>k(t),className:`px-3 py-1.5 rounded-full text-sm font-medium border transition-colors ${d===t?"bg-neutral-900 text-white border-neutral-900":"bg-white text-neutral-600 border-neutral-200 hover:border-neutral-400"}`,children:t},t))}),u&&u[d]&&e.jsx("p",{className:"mt-2 text-xs text-neutral-500 font-mono",children:Object.entries(u[d]).map(([t,n])=>`${t}: ${JSON.stringify(n)}`).join(", ")})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold mb-3 text-neutral-900",children:"输入任务"}),e.jsxs("div",{className:"relative border border-neutral-200 rounded-xl shadow-sm bg-white focus-within:ring-1 focus-within:ring-neutral-300 focus-within:border-neutral-300 transition-all duration-200",children:[e.jsx("textarea",{value:i,onChange:t=>A(t.target.value),rows:4,placeholder:"描述你想让 Agent 完成的任务...",className:"w-full px-4 py-3 bg-transparent border-none focus:outline-none focus:ring-0 resize-none text-neutral-900 placeholder-neutral-400 leading-relaxed text-sm"}),e.jsx("div",{className:"flex items-center justify-end px-3 pb-3 pt-1",children:e.jsx(y,{onClick:G,disabled:a==="starting"||!l||!i.trim(),children:a==="starting"?"启动中...":"开始"})})]})]})]})}),c&&R.length>0&&e.jsx("div",{className:"px-8 py-2 bg-white border-t border-neutral-100",children:e.jsx(ne,{todos:R})}),c&&e.jsx("div",{className:"px-8 py-6 border-t border-neutral-100 bg-white",children:e.jsxs("div",{className:"relative border border-neutral-200 rounded-xl shadow-sm bg-white focus-within:ring-1 focus-within:ring-neutral-300 focus-within:border-neutral-300 transition-all duration-200",children:[e.jsx("textarea",{ref:m,value:x,onChange:B,rows:3,placeholder:"发送消息给 Agent...",className:"w-full px-4 py-3 bg-transparent border-none focus:outline-none focus:ring-0 resize-none text-neutral-900 placeholder-neutral-400 leading-relaxed text-sm scrollbar-thin scrollbar-thumb-neutral-200 scrollbar-track-transparent",style:{minHeight:"80px",maxHeight:"210px"},onKeyDown:t=>{t.key==="Enter"&&!t.shiftKey&&!t.repeat&&!t.nativeEvent.isComposing&&t.nativeEvent.keyCode!==229&&(t.preventDefault(),T())}}),e.jsxs("div",{className:"flex items-center justify-between px-3 pb-3 pt-1 border-t border-transparent",children:[e.jsxs("div",{className:"flex items-center gap-1 text-neutral-400",children:[e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Attach File",children:e.jsx(re,{size:18})}),e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Mention",children:e.jsx(ce,{size:18})}),e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Reference Issue",children:e.jsx(ue,{size:18})}),e.jsx("div",{className:"w-px h-4 bg-neutral-200 mx-1"}),e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Search Web",children:e.jsx(ae,{size:18})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[q&&e.jsxs("button",{onClick:O,className:"flex items-center gap-2 px-3 py-2 text-xs font-semibold text-red-600 bg-red-50 hover:bg-red-100 rounded-lg transition-colors",children:[e.jsx(le,{size:12,fill:"currentColor"}),e.jsx("span",{children:"Stop"})]}),e.jsxs("button",{onClick:T,disabled:!x.trim(),className:`flex items-center gap-2 px-3 py-2 text-xs font-semibold rounded-lg transition-all ${x.trim()?"bg-neutral-900 text-white hover:bg-black shadow-sm":"bg-neutral-100 text-neutral-400 cursor-not-allowed"}`,children:[e.jsx("span",{children:"Send"}),e.jsx(he,{size:14})]})]})]})]})})]})}export{ye as AgentDemoPage};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{r as n,s as E,S as d,C as k,j as s}from"./index-BuAijQvi.js";import{c as _,a as R,B}from"./api-client-CEBkg5lt.js";function T(I){const{sessionId:a,onOutput:x,onExit:b,onError:u}=I,[j,c]=n.useState(()=>E.isConnected()),[v,m]=n.useState(!1),r=n.useRef({onOutput:x,onExit:b,onError:u});r.current={onOutput:x,onExit:b,onError:u},n.useEffect(()=>{const t=E.getSocket();c(t.connected);const i=()=>c(!0),p=()=>{c(!1),m(!1)},O=l=>{l.sessionId===a&&r.current.onOutput?.(l.data)},h=l=>{l.sessionId===a&&(m(!1),r.current.onExit?.(l.exitCode))},g=l=>{l.sessionId===a&&r.current.onError?.(l.message)},N=l=>{l.sessionId===a&&m(!0)},C=l=>{l.sessionId===a&&m(!1)};return t.on("connect",i),t.on("disconnect",p),t.on(d.SESSION_STDOUT,O),t.on(d.SESSION_EXIT,h),t.on(d.SESSION_ERROR,g),t.on(d.SESSION_SUBSCRIBED,N),t.on(d.SESSION_UNSUBSCRIBED,C),c(t.connected),()=>{t.off("connect",i),t.off("disconnect",p),t.off(d.SESSION_STDOUT,O),t.off(d.SESSION_EXIT,h),t.off(d.SESSION_ERROR,g),t.off(d.SESSION_SUBSCRIBED,N),t.off(d.SESSION_UNSUBSCRIBED,C),t.emit(k.UNSUBSCRIBE,{topic:"session",id:a})}},[a]);const y=n.useCallback(()=>new Promise(t=>{const i=E.getSocket();if(!i.connected){t(!1);return}i.emit(k.SUBSCRIBE,{topic:"session",id:a},p=>{t(p.success)})}),[a]),w=n.useCallback(()=>{E.getSocket().emit(k.UNSUBSCRIBE,{topic:"session",id:a})},[a]),S=n.useCallback(t=>{E.getSocket().emit(k.INPUT,{sessionId:a,data:t})},[a]),D=n.useCallback((t,i)=>{E.getSocket().emit(k.RESIZE,{sessionId:a,cols:t,rows:i})},[a]);return{isConnected:j,isAttached:v,attach:y,detach:w,sendInput:S,resize:D}}function U({className:I,...a}){return s.jsx("div",{"data-slot":"card",className:_("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",I),...a})}function P(){const[I,a]=n.useState([]),[x,b]=n.useState(""),[u,j]=n.useState(""),[c,v]=n.useState(null),[m,r]=n.useState([]),[y,w]=n.useState(!1),[S,D]=n.useState(""),t=n.useRef(null),i=n.useCallback(e=>{r(o=>{const f=o[o.length-1];return f&&f.role==="agent"?[...o.slice(0,-1),{...f,content:f.content+e}]:[...o,{role:"agent",content:e,timestamp:new Date}]})},[]),p=n.useCallback(e=>{r(o=>[...o,{role:"agent",content:`
|
|
2
|
+
[进程退出,退出码: ${e}]`,timestamp:new Date}]),v(null)},[]),O=n.useCallback(e=>{r(o=>[...o,{role:"agent",content:`
|
|
3
|
+
[错误: ${e}]`,timestamp:new Date}])},[]),{isConnected:h,isAttached:g,attach:N}=T({sessionId:c||"",onOutput:i,onExit:p,onError:O});n.useEffect(()=>{R.get("/demo/agents").then(e=>{a(e.agents);const o=e.agents.find(f=>f.available);o&&b(o.type)})},[]),n.useEffect(()=>{t.current?.scrollIntoView({behavior:"smooth"})},[m]),n.useEffect(()=>{c&&h&&!g&&N()},[c,h,g,N]);const C=async()=>{if(!(!x||!u.trim())){w(!0),r([{role:"user",content:u,timestamp:new Date}]);try{const e=await R.post("/demo/start",{agentType:x,prompt:u.trim()});v(e.sessionId),j("")}catch(e){r(o=>[...o,{role:"agent",content:`启动失败: ${e instanceof Error?e.message:"未知错误"}`,timestamp:new Date}])}finally{w(!1)}}},l=async()=>{if(!c||!S.trim())return;const e=S.trim();r(o=>[...o,{role:"user",content:e,timestamp:new Date}]),D("");try{await R.post(`/demo/${c}/message`,{message:e})}catch(o){r(f=>[...f,{role:"agent",content:`发送失败: ${o instanceof Error?o.message:"未知错误"}`,timestamp:new Date}])}},A=async()=>{if(c)try{await R.post(`/demo/${c}/stop`),r(e=>[...e,{role:"agent",content:`
|
|
4
|
+
[会话已停止]`,timestamp:new Date}]),v(null)}catch(e){console.error("Stop failed:",e)}};return s.jsxs("div",{className:"flex flex-col h-full max-w-4xl mx-auto p-4 gap-4",children:[s.jsx("h1",{className:"text-2xl font-bold",children:"Agent 交互演示"}),!c&&s.jsxs(U,{className:"p-4",children:[s.jsx("h2",{className:"text-lg font-semibold mb-3",children:"选择 Agent"}),s.jsx("div",{className:"flex gap-2 flex-wrap mb-4",children:I.map(e=>s.jsxs(B,{variant:x===e.type?"default":"outline",disabled:!e.available,onClick:()=>b(e.type),children:[e.name,e.available&&e.version&&` (${e.version})`,!e.available&&" (不可用)"]},e.type))}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("input",{type:"text",value:u,onChange:e=>j(e.target.value),onKeyDown:e=>e.key==="Enter"&&!e.nativeEvent.isComposing&&e.nativeEvent.keyCode!==229&&C(),placeholder:"输入你的问题或任务...",className:"flex-1 px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"}),s.jsx(B,{onClick:C,disabled:y||!x||!u.trim(),children:y?"启动中...":"开始"})]})]}),s.jsxs(U,{className:"flex-1 p-4 overflow-hidden flex flex-col",children:[s.jsxs("div",{className:"flex justify-between items-center mb-3",children:[s.jsx("h2",{className:"text-lg font-semibold",children:"对话"}),c&&s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-sm text-gray-500",children:h?g?"已连接":"连接中...":"未连接"}),s.jsx(B,{variant:"outline",size:"sm",onClick:A,children:"停止"})]})]}),s.jsxs("div",{className:"flex-1 overflow-y-auto space-y-3",children:[m.length===0?s.jsx("div",{className:"text-gray-400 text-center py-8",children:"选择 Agent 并输入问题开始对话"}):m.map((e,o)=>s.jsxs("div",{className:`p-3 rounded-lg ${e.role==="user"?"bg-blue-100 ml-8":"bg-gray-100 mr-8"}`,children:[s.jsx("div",{className:"text-xs text-gray-500 mb-1",children:e.role==="user"?"你":"Agent"}),s.jsx("pre",{className:"whitespace-pre-wrap font-mono text-sm",children:e.content})]},o)),s.jsx("div",{ref:t})]}),c&&s.jsxs("div",{className:"flex gap-2 mt-3 pt-3 border-t",children:[s.jsx("input",{type:"text",value:S,onChange:e=>D(e.target.value),onKeyDown:e=>e.key==="Enter"&&!e.repeat&&!e.nativeEvent.isComposing&&e.nativeEvent.keyCode!==229&&l(),placeholder:"发送后续消息...",className:"flex-1 px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"}),s.jsx(B,{onClick:l,disabled:!S.trim(),children:"发送"})]})]})]})}export{P as DemoPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as j,u as S,r as a,j as e}from"./index-BuAijQvi.js";import{u as E,a as y,q as N}from"./query-keys-BD_s_Etj.js";import{a as x,B as g}from"./api-client-CEBkg5lt.js";import{L as I}from"./loader-circle-yEIqsdJ1.js";import{C as P}from"./circle-alert-BEozlsMd.js";const q=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],z=j("circle-check",q);const R=[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]],L=j("link",R);function B(){return E({queryKey:N.notifications.settings,queryFn:()=>x.get("/notifications/settings")})}function A(){const s=S();return y({mutationFn:c=>x.put("/notifications/settings",c),onSuccess:()=>{s.invalidateQueries({queryKey:N.notifications.settings})}})}function F(){return y({mutationFn:s=>x.post("/notifications/test",s)})}const _=[{value:"none",label:"无"},{value:"feishu",label:"飞书"}];function $(){const{data:s,isLoading:c}=B(),r=A(),l=F(),[n,p]=a.useState({webhookUrl:"",baseUrl:"",titleTemplate:"",bodyTemplate:""}),[u,h]=a.useState(!1),[f,i]=a.useState("idle"),d=a.useRef(void 0);if(a.useEffect(()=>{s&&!u&&p({webhookUrl:s.feishuWebhookUrl??"",baseUrl:s.thirdPartyBaseUrl??"",titleTemplate:s.taskInReviewTitleTemplate??"",bodyTemplate:s.taskInReviewBodyTemplate??""})},[s,u]),a.useEffect(()=>(l.isSuccess?(i("success"),d.current=setTimeout(()=>i("idle"),3e3)):l.isError&&(i("error"),d.current=setTimeout(()=>i("idle"),5e3)),()=>clearTimeout(d.current)),[l.isSuccess,l.isError]),c)return e.jsx("div",{className:"p-6 text-sm text-neutral-400",children:"加载中..."});const m=s?.osNotificationEnabled??!0,b=s?.thirdPartyChannel??"none",o=(t,C)=>{p(U=>({...U,[t]:C})),h(!0)},k=()=>{r.mutate({osNotificationEnabled:!m})},v=t=>{r.mutate({thirdPartyChannel:t})},T=()=>{r.mutate({feishuWebhookUrl:n.webhookUrl.trim()||null,thirdPartyBaseUrl:n.baseUrl.trim()||null,taskInReviewTitleTemplate:n.titleTemplate.trim()||"Agent Tower",taskInReviewBodyTemplate:n.bodyTemplate.trim()||'✅ "{taskTitle}" 已完成,等待审查'},{onSuccess:()=>h(!1)})},w=()=>{n.webhookUrl.trim()&&l.mutate({channel:"feishu",webhookUrl:n.webhookUrl.trim(),baseUrl:n.baseUrl.trim()||void 0})};return e.jsxs("div",{className:"px-10 py-6 mx-auto w-full max-w-3xl space-y-8",children:[e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:"系统通知"}),e.jsx("p",{className:"text-[12px] text-neutral-400 mb-3",children:"任务完成时弹出桌面通知"}),e.jsx("button",{onClick:k,className:`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${m?"bg-neutral-900":"bg-neutral-200"}`,children:e.jsx("span",{className:`inline-block h-3.5 w-3.5 rounded-full bg-white transition-transform ${m?"translate-x-[18px]":"translate-x-[3px]"}`})})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:"第三方通知"}),e.jsx("p",{className:"text-[12px] text-neutral-400 mb-3",children:"选择一个第三方渠道接收通知"}),e.jsx("select",{value:b,onChange:t=>v(t.target.value),className:"px-3 py-1.5 border border-neutral-200 rounded-lg text-sm text-neutral-700 focus:outline-none focus:ring-1 focus:ring-neutral-300 bg-white",children:_.map(t=>e.jsx("option",{value:t.value,children:t.label},t.value))}),b==="feishu"&&e.jsxs("div",{className:"mt-4 space-y-4",children:[e.jsxs("div",{className:"p-4 border border-neutral-100 rounded-lg space-y-3",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"flex items-center gap-1 text-[13px] font-medium text-neutral-700 mb-1",children:[e.jsx(L,{size:12}),"Webhook URL"]}),e.jsx("input",{type:"text",value:n.webhookUrl,onChange:t=>o("webhookUrl",t.target.value),placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/...",className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm font-mono focus:outline-none focus:ring-1 focus:ring-neutral-300"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(g,{size:"sm",variant:"outline",onClick:w,disabled:!n.webhookUrl.trim()||l.isPending,children:[l.isPending&&e.jsx(I,{size:12,className:"animate-spin mr-1"}),"测试发送"]}),f==="success"&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-green-600",children:[e.jsx(z,{size:12}),"发送成功"]}),f==="error"&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-red-500",children:[e.jsx(P,{size:12}),"发送失败"]})]})]}),e.jsx("div",{className:"p-4 border border-neutral-100 rounded-lg space-y-3",children:e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:"跳转地址(用于生成任务链接)"}),e.jsx("input",{type:"text",value:n.baseUrl,onChange:t=>o("baseUrl",t.target.value),placeholder:"http://localhost:5173",className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm font-mono focus:outline-none focus:ring-1 focus:ring-neutral-300"}),e.jsxs("p",{className:"text-[11px] text-neutral-400 mt-1",children:['通知卡片中的"查看任务"按钮将跳转到 ',"{baseUrl}/projects/{projectId}/tasks/{taskId}"]})]})})]})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:"通知模板"}),e.jsxs("p",{className:"text-[12px] text-neutral-400 mb-3",children:["支持变量: ","{taskTitle}",", ","{taskId}",", ","{projectId}",", ","{projectName}",", ","{status}"]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:"标题模板"}),e.jsx("input",{type:"text",value:n.titleTemplate,onChange:t=>o("titleTemplate",t.target.value),placeholder:"Agent Tower",className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm focus:outline-none focus:ring-1 focus:ring-neutral-300"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:"内容模板"}),e.jsx("textarea",{value:n.bodyTemplate,onChange:t=>o("bodyTemplate",t.target.value),placeholder:'✅ "{taskTitle}" 已完成,等待审查',rows:2,className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm focus:outline-none focus:ring-1 focus:ring-neutral-300 resize-none"})]})]})]}),u&&e.jsx("div",{className:"sticky bottom-6 flex justify-end",children:e.jsx(g,{size:"sm",onClick:T,disabled:r.isPending,children:r.isPending?"保存中...":"保存所有更改"})})]})}export{$ as NotificationSettingsPage};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{c as P,r as o,j as e}from"./index-BuAijQvi.js";import{u as J,a as V,b as $,c as I}from"./use-profiles-Rh8rBsAt.js";import{B as N}from"./api-client-CEBkg5lt.js";import{P as M,T as z,M as A}from"./modal-BoX2RXaV.js";import"./query-keys-BD_s_Etj.js";const D=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],U=P("pencil",D);function _(i){return Object.entries(i).map(([c,u])=>`${c}: ${JSON.stringify(u)}`).join(", ")}const g={CLAUDE_CODE:"Claude Code",GEMINI_CLI:"Gemini CLI",CURSOR_AGENT:"Cursor Agent"};function q(){const{data:i,isLoading:c}=J(),{data:u}=V(),d=$(),v=I(),[r,a]=o.useState(null),[f,x]=o.useState(""),[m,p]=o.useState(""),[h,l]=o.useState(""),C=(t,s,n)=>{a({agentType:t,variant:s,config:n,isNew:!1}),p(s),x(JSON.stringify(n,null,2)),l("")},S=t=>{a({agentType:t,variant:"",config:{},isNew:!0}),p(""),x(`{
|
|
2
|
+
|
|
3
|
+
}`),l("")},E=()=>{if(!(!r||!m.trim()))try{const t=JSON.parse(f);l(""),d.mutate({agentType:r.agentType,variant:m.trim().toUpperCase(),config:t},{onSuccess:()=>a(null)})}catch{l("JSON 格式错误")}},y=(t,s)=>{confirm(`确定删除 ${t} / ${s}?`)&&v.mutate({agentType:t,variant:s})},w=(t,s)=>!!u?.executors[t]?.[s];if(c)return e.jsx("div",{className:"p-6 text-sm text-neutral-400",children:"加载中..."});const O=i?.executors??{};return e.jsxs("div",{className:"px-10 py-6 mx-auto w-full max-w-3xl",children:[Object.entries(O).map(([t,s])=>e.jsxs("div",{className:"mb-6",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900",children:g[t]??t}),e.jsxs("button",{onClick:()=>S(t),className:"flex items-center gap-1 text-xs text-neutral-400 hover:text-neutral-900 transition-colors",children:[e.jsx(M,{size:12}),e.jsx("span",{children:"新增"})]})]}),e.jsx("div",{className:"border border-neutral-100 rounded-lg overflow-hidden",children:Object.entries(s).map(([n,b],k,L)=>{const j=w(t,n);return e.jsxs("div",{className:`flex items-center gap-3 px-4 py-2.5 hover:bg-neutral-50 transition-colors group ${k<L.length-1?"border-b border-neutral-100":""}`,children:[e.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-[11px] font-semibold tracking-wide ${n==="DEFAULT"?"bg-blue-50 text-blue-600":"bg-neutral-50 text-neutral-600"}`,children:n}),e.jsx("span",{className:"flex-1 text-[12px] text-neutral-400 font-mono truncate",children:_(b)}),j&&e.jsx("span",{className:"text-[11px] text-neutral-300 font-medium",children:"内置"}),e.jsxs("div",{className:"flex items-center gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity",children:[e.jsx("button",{onClick:()=>C(t,n,b),className:"p-1 text-neutral-300 hover:text-neutral-700 rounded transition-colors",children:e.jsx(U,{size:13})}),!j&&e.jsx("button",{onClick:()=>y(t,n),className:"p-1 text-neutral-300 hover:text-red-500 rounded transition-colors",children:e.jsx(z,{size:13})})]})]},n)})})]},t)),e.jsx(A,{isOpen:!!r,onClose:()=>a(null),title:r?.isNew?`新增 Variant — ${g[r.agentType]??r.agentType}`:`编辑 ${r?.variant}`,action:e.jsxs(e.Fragment,{children:[e.jsx(N,{variant:"outline",onClick:()=>a(null),children:"取消"}),e.jsx(N,{onClick:E,disabled:d.isPending,children:d.isPending?"保存中...":"保存"})]}),children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:"Variant 名称"}),e.jsx("input",{type:"text",value:m,onChange:t=>p(t.target.value),disabled:!r?.isNew,placeholder:"例如: CUSTOM",className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm focus:outline-none focus:ring-1 focus:ring-neutral-300 disabled:bg-neutral-50 disabled:text-neutral-500 font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:"配置 (JSON)"}),e.jsx("textarea",{value:f,onChange:t=>{x(t.target.value),l("")},rows:6,className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm font-mono focus:outline-none focus:ring-1 focus:ring-neutral-300 resize-none"}),h&&e.jsx("p",{className:"mt-1 text-xs text-red-500",children:h})]})]})})]})}export{q as ProfileSettingsPage};
|