agentstudio 0.1.30 → 0.2.2
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/index.d.ts.map +1 -1
- package/index.js +24 -4
- package/index.js.map +1 -1
- package/package.json +2 -1
- package/public/assets/{AgentsPage-VVVyzMq0.js → AgentsPage-DgoZNP6l.js} +2 -2
- package/public/assets/{Button-B9AQtJ7x.js → Button-BHiMThm4.js} +1 -1
- package/public/assets/{ChatPage-p1JCfA2A.js → ChatPage-LoTJrT43.js} +4 -4
- package/public/assets/{CommandForm-B_beYCv3.js → CommandForm-CZRscRtm.js} +2 -2
- package/public/assets/{CommandsPage-Blc1Kt4Z.js → CommandsPage-CwEoyASk.js} +1 -1
- package/public/assets/{DashboardPage-Dokn4y-N.js → DashboardPage-BSi_T1tY.js} +1 -1
- package/public/assets/{FileBrowser-Dg9PfXOo.js → FileBrowser-Df-zwNDa.js} +4 -4
- package/public/assets/FileExplorer-BB3suHzW.js +1 -0
- package/public/assets/GeneralSettingsPage-DcGmAzci.js +1 -0
- package/public/assets/LandingPage-DPKvTTja.js +1 -0
- package/public/assets/{LoginPage-D2Ykhr7D.js → LoginPage-BPJUgLru.js} +5 -5
- package/public/assets/McpAdminSettingsPage-CZZS-pa0.js +7 -0
- package/public/assets/{McpPage-DkD9BOrP.js → McpPage-CPF7txxc.js} +1 -1
- package/public/assets/MemorySettingsPage-YenW4l-g.js +1 -0
- package/public/assets/PluginsPage-zlAB63Im.js +1 -0
- package/public/assets/{ProjectSelector-B1_umywl.js → ProjectSelector-Bq0NQ_bV.js} +1 -1
- package/public/assets/{ProjectsPage-CQ8zwJ5D.js → ProjectsPage-BMBRp4RN.js} +5 -5
- package/public/assets/ScheduledTasksPage-B_hOD6AS.js +1 -0
- package/public/assets/{SettingsLayout-CccK5RVj.js → SettingsLayout-CY9Siffq.js} +1 -1
- package/public/assets/{SkillsPage-D_LECy2S.js → SkillsPage-X-LMnwZd.js} +1 -1
- package/public/assets/{SubagentForm-D9EFQxlZ.js → SubagentForm-Cq06CQqr.js} +3 -3
- package/public/assets/SubagentsPage-DIG_rKjQ.js +1 -0
- package/public/assets/SystemInfoPage-CWgKWnQg.js +1 -0
- package/public/assets/{TelemetrySettingsPage-DMngnKDW.js → TelemetrySettingsPage-BLnMagRZ.js} +1 -1
- package/public/assets/{ToastTestPage-CafmBcnU.js → ToastTestPage-CQ0nobQd.js} +1 -1
- package/public/assets/{ToolsList-CnepUgI-.js → ToolsList-C9LELdNX.js} +1 -1
- package/public/assets/UnifiedToolSelector-Bw-E7HW4.js +1 -0
- package/public/assets/{VersionSettingsPage-D9hYO4VL.js → VersionSettingsPage-BxjDPWm0.js} +2 -2
- package/public/assets/WebSocketTunnelPage-CQWcZK_H.js +1 -0
- package/public/assets/{_basePickBy-lvDxpUoY.js → _basePickBy-D_S4EWYL.js} +1 -1
- package/public/assets/{_baseUniq-DyqfOLmW.js → _baseUniq-BmQef9o6.js} +1 -1
- package/public/assets/{agents-DmLFhp96.js → agents-D9dWnZr0.js} +1 -1
- package/public/assets/{arc-DuR7lLva.js → arc-DzCTkvPU.js} +1 -1
- package/public/assets/{architectureDiagram-VXUJARFQ-CkKlTxxx.js → architectureDiagram-VXUJARFQ-8nWlVbiO.js} +1 -1
- package/public/assets/{blockDiagram-VD42YOAC-DdR02awp.js → blockDiagram-VD42YOAC-DbHo3vzo.js} +1 -1
- package/public/assets/{c4Diagram-YG6GDRKO-MlkMVL2r.js → c4Diagram-YG6GDRKO-DqFGiZ7Y.js} +1 -1
- package/public/assets/channel-DlGw39mX.js +1 -0
- package/public/assets/{chunk-4BX2VUAB-BI02zXQl.js → chunk-4BX2VUAB-KZtUHSw3.js} +1 -1
- package/public/assets/{chunk-55IACEB6-DtWZPbH-.js → chunk-55IACEB6-DTotxzVH.js} +1 -1
- package/public/assets/{chunk-B4BG7PRW-yLeRKRZl.js → chunk-B4BG7PRW-CkjDO6x_.js} +1 -1
- package/public/assets/{chunk-DI55MBZ5-DF-5ELa5.js → chunk-DI55MBZ5-ZN0hc9BQ.js} +1 -1
- package/public/assets/{chunk-FMBD7UC4-BjJNxbrL.js → chunk-FMBD7UC4--jXmtjeY.js} +1 -1
- package/public/assets/{chunk-QN33PNHL-rs7Z3IPT.js → chunk-QN33PNHL-D-FiWiLB.js} +1 -1
- package/public/assets/{chunk-QZHKN3VN-DoIXOkrg.js → chunk-QZHKN3VN-BRs4hln6.js} +1 -1
- package/public/assets/{chunk-TZMSLE5B-xkKgCGO2.js → chunk-TZMSLE5B-BUZTflc7.js} +1 -1
- package/public/assets/classDiagram-2ON5EDUG-7Lo3C-C9.js +1 -0
- package/public/assets/classDiagram-v2-WZHVMYZB-7Lo3C-C9.js +1 -0
- package/public/assets/clone-180En6VP.js +1 -0
- package/public/assets/{cose-bilkent-S5V4N54A-BIz6tY7t.js → cose-bilkent-S5V4N54A-s2WN1XmV.js} +1 -1
- package/public/assets/{dagre-6UL2VRFP-CponDeYZ.js → dagre-6UL2VRFP-CxaKwQyB.js} +1 -1
- package/public/assets/{diagram-PSM6KHXK-D31S6iiK.js → diagram-PSM6KHXK-SU1hlbjn.js} +1 -1
- package/public/assets/{diagram-QEK2KX5R-C6RWP-cs.js → diagram-QEK2KX5R-hcM85tep.js} +1 -1
- package/public/assets/{diagram-S2PKOQOG-BKs_7af1.js → diagram-S2PKOQOG-BOmtKWhQ.js} +1 -1
- package/public/assets/{erDiagram-Q2GNP2WA-Ro9hB6-s.js → erDiagram-Q2GNP2WA-CsTay3Qr.js} +1 -1
- package/public/assets/{flowDiagram-NV44I4VS-IKSFEVlB.js → flowDiagram-NV44I4VS-QLwVU4W3.js} +1 -1
- package/public/assets/{ganttDiagram-LVOFAZNH-CPDNSzAq.js → ganttDiagram-LVOFAZNH-CEJd76u6.js} +1 -1
- package/public/assets/{gitGraphDiagram-NY62KEGX-c_yb5ztL.js → gitGraphDiagram-NY62KEGX-Cr7KuVc8.js} +1 -1
- package/public/assets/{graph-BoMdSZEp.js → graph-B12xs1JB.js} +1 -1
- package/public/assets/{index-BUj-AMWq.js → index-BFYHztzB.js} +27 -27
- package/public/assets/index-isG0t1ZM.css +1 -0
- package/public/assets/infoDiagram-F6ZHWCRC-B6PyESp0.js +2 -0
- package/public/assets/{journeyDiagram-XKPGCS4Q-D4izttrO.js → journeyDiagram-XKPGCS4Q-DSlyGZSv.js} +1 -1
- package/public/assets/{kanban-definition-3W4ZIXB7-DE7WCrea.js → kanban-definition-3W4ZIXB7-DbDLw__g.js} +1 -1
- package/public/assets/{layout-BezNHWMi.js → layout-OtboCb25.js} +1 -1
- package/public/assets/{linear-KRX5ckNK.js → linear-Bg3HtxIB.js} +1 -1
- package/public/assets/{mindmap-definition-VGOIOE7T-Dlr09KqO.js → mindmap-definition-VGOIOE7T-DZ4bp0qm.js} +1 -1
- package/public/assets/{pieDiagram-ADFJNKIX-Bbzzfu-z.js → pieDiagram-ADFJNKIX-Am2n8jc0.js} +1 -1
- package/public/assets/{quadrantDiagram-AYHSOK5B-DubsKDPG.js → quadrantDiagram-AYHSOK5B-DPm8iQzH.js} +1 -1
- package/public/assets/{requirementDiagram-UZGBJVZJ-B-rG6Gty.js → requirementDiagram-UZGBJVZJ-hVW5YE3R.js} +1 -1
- package/public/assets/{sankeyDiagram-TZEHDZUN-DU7Rgr_5.js → sankeyDiagram-TZEHDZUN-DX8gGHoq.js} +1 -1
- package/public/assets/{sequenceDiagram-WL72ISMW-BRlH6dPX.js → sequenceDiagram-WL72ISMW-Brl8T0m9.js} +1 -1
- package/public/assets/{stateDiagram-FKZM4ZOC-BeAzs0_-.js → stateDiagram-FKZM4ZOC-CxrXSnfX.js} +1 -1
- package/public/assets/stateDiagram-v2-4FDKWEC3-BJfGHaLv.js +1 -0
- package/public/assets/{table-aqcpYX4Z.js → table-D-FJ6K6j.js} +1 -1
- package/public/assets/{timeline-definition-IT6M3QCI-BU_B1RmT.js → timeline-definition-IT6M3QCI-CO6fKxuR.js} +1 -1
- package/public/assets/{tools-XV29tg8x.js → tools-zTM46-tZ.js} +1 -1
- package/public/assets/{treemap-KMMF4GRG-CP2M7QfX.js → treemap-KMMF4GRG-BsoblFM5.js} +1 -1
- package/public/assets/{ui-components-ND8WdSiV.js → ui-components-BsYwJvCF.js} +138 -123
- package/public/assets/{useAgents-COcSvqDE.js → useAgents-BlQGwXjx.js} +1 -1
- package/public/assets/{useClaudeVersions-C8b4adpW.js → useClaudeVersions-DJ6VKG1y.js} +1 -1
- package/public/assets/{useCommands-D79pjz3C.js → useCommands-DOxDeFSx.js} +1 -1
- package/public/assets/{useProjects-CP0Q5-jg.js → useProjects-cgsJNlsy.js} +1 -1
- package/public/assets/{useSessions-C2gXprHI.js → useSessions-BAxZ6l2n.js} +1 -1
- package/public/assets/{xychartDiagram-PRI3JC2R-OdQKUqyr.js → xychartDiagram-PRI3JC2R-B6g-H_PO.js} +1 -1
- package/public/index.html +5 -5
- package/routes/projects.d.ts.map +1 -1
- package/routes/projects.js +80 -1
- package/routes/projects.js.map +1 -1
- package/routes/tunnel.d.ts +10 -0
- package/routes/tunnel.d.ts.map +1 -0
- package/routes/tunnel.js +296 -0
- package/routes/tunnel.js.map +1 -0
- package/services/a2a/a2aQueryService.d.ts.map +1 -1
- package/services/a2a/a2aQueryService.js +95 -52
- package/services/a2a/a2aQueryService.js.map +1 -1
- package/services/tunnelService.d.ts +148 -0
- package/services/tunnelService.d.ts.map +1 -0
- package/services/tunnelService.js +406 -0
- package/services/tunnelService.js.map +1 -0
- package/public/assets/FileExplorer-B7BFy0Tu.js +0 -1
- package/public/assets/GeneralSettingsPage-DLSSSadp.js +0 -1
- package/public/assets/LandingPage-Ck2WpTto.js +0 -1
- package/public/assets/McpAdminSettingsPage-BAKOckWx.js +0 -7
- package/public/assets/MemorySettingsPage-CiUs5u2g.js +0 -1
- package/public/assets/PluginsPage-CkXNjZMq.js +0 -1
- package/public/assets/ScheduledTasksPage-BjSzD4T2.js +0 -1
- package/public/assets/SubagentsPage-D_sdehiT.js +0 -1
- package/public/assets/SystemInfoPage-vz5Ey9DK.js +0 -1
- package/public/assets/UnifiedToolSelector-CnFTY88B.js +0 -1
- package/public/assets/channel-DHM1jRJ0.js +0 -1
- package/public/assets/classDiagram-2ON5EDUG-BJtIba9N.js +0 -1
- package/public/assets/classDiagram-v2-WZHVMYZB-BJtIba9N.js +0 -1
- package/public/assets/clone-Bbn_OKGL.js +0 -1
- package/public/assets/index-CEBbr0XW.css +0 -1
- package/public/assets/infoDiagram-F6ZHWCRC-904Ek2Zh.js +0 -2
- package/public/assets/stateDiagram-v2-4FDKWEC3-C0c8d9Xs.js +0 -1
package/routes/tunnel.js
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tunnel Routes
|
|
4
|
+
*
|
|
5
|
+
* API endpoints for managing WebSocket tunnel connection.
|
|
6
|
+
* Allows users to configure and control the tunnel from the UI.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const express_1 = require("express");
|
|
10
|
+
const tunnelService_js_1 = require("../services/tunnelService.js");
|
|
11
|
+
const router = (0, express_1.Router)();
|
|
12
|
+
/**
|
|
13
|
+
* GET /api/tunnel/status
|
|
14
|
+
* Get current tunnel connection status
|
|
15
|
+
*/
|
|
16
|
+
router.get('/status', async (_req, res) => {
|
|
17
|
+
try {
|
|
18
|
+
const status = tunnelService_js_1.tunnelService.getStatus();
|
|
19
|
+
res.json(status);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
console.error('[Tunnel API] Error getting status:', error);
|
|
23
|
+
res.status(500).json({
|
|
24
|
+
error: 'Failed to get tunnel status',
|
|
25
|
+
details: error instanceof Error ? error.message : String(error),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* GET /api/tunnel/config
|
|
31
|
+
* Get current tunnel configuration (token is masked)
|
|
32
|
+
*/
|
|
33
|
+
router.get('/config', async (_req, res) => {
|
|
34
|
+
try {
|
|
35
|
+
const config = tunnelService_js_1.tunnelService.getConfig();
|
|
36
|
+
res.json(config);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
console.error('[Tunnel API] Error getting config:', error);
|
|
40
|
+
res.status(500).json({
|
|
41
|
+
error: 'Failed to get tunnel config',
|
|
42
|
+
details: error instanceof Error ? error.message : String(error),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
/**
|
|
47
|
+
* PUT /api/tunnel/config
|
|
48
|
+
* Update tunnel configuration
|
|
49
|
+
*
|
|
50
|
+
* Body: {
|
|
51
|
+
* enabled?: boolean,
|
|
52
|
+
* serverUrl?: string,
|
|
53
|
+
* token?: string,
|
|
54
|
+
* reconnectInterval?: number,
|
|
55
|
+
* maxReconnectAttempts?: number
|
|
56
|
+
* }
|
|
57
|
+
*/
|
|
58
|
+
router.put('/config', async (req, res) => {
|
|
59
|
+
try {
|
|
60
|
+
const newConfig = {};
|
|
61
|
+
// Validate and extract config fields
|
|
62
|
+
if (typeof req.body.enabled === 'boolean') {
|
|
63
|
+
newConfig.enabled = req.body.enabled;
|
|
64
|
+
}
|
|
65
|
+
if (typeof req.body.serverUrl === 'string' && req.body.serverUrl.trim()) {
|
|
66
|
+
newConfig.serverUrl = req.body.serverUrl.trim();
|
|
67
|
+
}
|
|
68
|
+
if (typeof req.body.token === 'string') {
|
|
69
|
+
// Allow empty token to clear it
|
|
70
|
+
newConfig.token = req.body.token.trim();
|
|
71
|
+
}
|
|
72
|
+
if (typeof req.body.reconnectInterval === 'number' && req.body.reconnectInterval > 0) {
|
|
73
|
+
newConfig.reconnectInterval = req.body.reconnectInterval;
|
|
74
|
+
}
|
|
75
|
+
if (typeof req.body.maxReconnectAttempts === 'number' && req.body.maxReconnectAttempts >= 0) {
|
|
76
|
+
newConfig.maxReconnectAttempts = req.body.maxReconnectAttempts;
|
|
77
|
+
}
|
|
78
|
+
if (req.body.protocol === 'https' || req.body.protocol === 'http') {
|
|
79
|
+
newConfig.protocol = req.body.protocol;
|
|
80
|
+
}
|
|
81
|
+
// Determine if we should reconnect
|
|
82
|
+
const shouldReconnect = 'token' in newConfig || 'serverUrl' in newConfig || 'enabled' in newConfig;
|
|
83
|
+
await tunnelService_js_1.tunnelService.updateConfig(newConfig, shouldReconnect);
|
|
84
|
+
res.json({
|
|
85
|
+
success: true,
|
|
86
|
+
config: tunnelService_js_1.tunnelService.getConfig(),
|
|
87
|
+
status: tunnelService_js_1.tunnelService.getStatus(),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error('[Tunnel API] Error updating config:', error);
|
|
92
|
+
res.status(500).json({
|
|
93
|
+
error: 'Failed to update tunnel config',
|
|
94
|
+
details: error instanceof Error ? error.message : String(error),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
/**
|
|
99
|
+
* POST /api/tunnel/connect
|
|
100
|
+
* Manually connect to the tunnel server
|
|
101
|
+
*/
|
|
102
|
+
router.post('/connect', async (_req, res) => {
|
|
103
|
+
try {
|
|
104
|
+
await tunnelService_js_1.tunnelService.connect();
|
|
105
|
+
res.json({
|
|
106
|
+
success: true,
|
|
107
|
+
status: tunnelService_js_1.tunnelService.getStatus(),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error('[Tunnel API] Error connecting:', error);
|
|
112
|
+
res.status(500).json({
|
|
113
|
+
error: 'Failed to connect tunnel',
|
|
114
|
+
details: error instanceof Error ? error.message : String(error),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
/**
|
|
119
|
+
* POST /api/tunnel/disconnect
|
|
120
|
+
* Manually disconnect from the tunnel server
|
|
121
|
+
*/
|
|
122
|
+
router.post('/disconnect', async (_req, res) => {
|
|
123
|
+
try {
|
|
124
|
+
tunnelService_js_1.tunnelService.disconnect();
|
|
125
|
+
res.json({
|
|
126
|
+
success: true,
|
|
127
|
+
status: tunnelService_js_1.tunnelService.getStatus(),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error('[Tunnel API] Error disconnecting:', error);
|
|
132
|
+
res.status(500).json({
|
|
133
|
+
error: 'Failed to disconnect tunnel',
|
|
134
|
+
details: error instanceof Error ? error.message : String(error),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
/**
|
|
139
|
+
* POST /api/tunnel/test
|
|
140
|
+
* Test tunnel connection with current configuration
|
|
141
|
+
*/
|
|
142
|
+
router.post('/test', async (_req, res) => {
|
|
143
|
+
try {
|
|
144
|
+
const result = await tunnelService_js_1.tunnelService.testConnection();
|
|
145
|
+
res.json(result);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
console.error('[Tunnel API] Error testing connection:', error);
|
|
149
|
+
res.status(500).json({
|
|
150
|
+
success: false,
|
|
151
|
+
error: error instanceof Error ? error.message : String(error),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
/**
|
|
156
|
+
* GET /api/tunnel/check-name
|
|
157
|
+
* Check if a tunnel name is available
|
|
158
|
+
*
|
|
159
|
+
* Query: { name: string }
|
|
160
|
+
*/
|
|
161
|
+
router.get('/check-name', async (req, res) => {
|
|
162
|
+
try {
|
|
163
|
+
const name = req.query.name;
|
|
164
|
+
const serverUrl = req.query.serverUrl;
|
|
165
|
+
if (!name) {
|
|
166
|
+
return res.status(400).json({
|
|
167
|
+
available: false,
|
|
168
|
+
reason: '请提供隧道名称',
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
// Update serverUrl in config before checking name
|
|
172
|
+
if (serverUrl) {
|
|
173
|
+
await tunnelService_js_1.tunnelService.saveConfig({ serverUrl });
|
|
174
|
+
}
|
|
175
|
+
const result = await tunnelService_js_1.tunnelService.checkTunnelName(name);
|
|
176
|
+
res.json(result);
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
console.error('[Tunnel API] Error checking name:', error);
|
|
180
|
+
res.status(500).json({
|
|
181
|
+
available: false,
|
|
182
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
/**
|
|
187
|
+
* POST /api/tunnel/create-tunnel
|
|
188
|
+
* Create a new tunnel and get the token
|
|
189
|
+
*
|
|
190
|
+
* Body: { name: string, autoConnect?: boolean, protocol?: 'https' | 'http' }
|
|
191
|
+
*/
|
|
192
|
+
router.post('/create-tunnel', async (req, res) => {
|
|
193
|
+
try {
|
|
194
|
+
const { name, serverUrl, autoConnect, protocol, websocketUrl, domainSuffix } = req.body;
|
|
195
|
+
if (!name || typeof name !== 'string') {
|
|
196
|
+
return res.status(400).json({
|
|
197
|
+
success: false,
|
|
198
|
+
error: '请提供隧道名称',
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
// Update serverUrl in config before creating tunnel
|
|
202
|
+
if (serverUrl) {
|
|
203
|
+
await tunnelService_js_1.tunnelService.saveConfig({ serverUrl });
|
|
204
|
+
}
|
|
205
|
+
// Validate protocol
|
|
206
|
+
const validProtocol = protocol === 'http' ? 'http' : 'https';
|
|
207
|
+
const result = await tunnelService_js_1.tunnelService.createAndSave(name.trim(), autoConnect === true, validProtocol, websocketUrl, domainSuffix);
|
|
208
|
+
if (result.success) {
|
|
209
|
+
res.json({
|
|
210
|
+
...result,
|
|
211
|
+
config: tunnelService_js_1.tunnelService.getConfig(),
|
|
212
|
+
status: tunnelService_js_1.tunnelService.getStatus(),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
res.status(400).json(result);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
console.error('[Tunnel API] Error creating tunnel:', error);
|
|
221
|
+
res.status(500).json({
|
|
222
|
+
success: false,
|
|
223
|
+
error: error instanceof Error ? error.message : String(error),
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
/**
|
|
228
|
+
* DELETE /api/tunnel/config - Delete tunnel configuration
|
|
229
|
+
* Clears all tunnel configuration and disconnects if connected
|
|
230
|
+
*/
|
|
231
|
+
router.delete('/config', async (_req, res) => {
|
|
232
|
+
try {
|
|
233
|
+
// Disconnect if connected
|
|
234
|
+
tunnelService_js_1.tunnelService.disconnect();
|
|
235
|
+
// Reset configuration to defaults
|
|
236
|
+
await tunnelService_js_1.tunnelService.saveConfig({
|
|
237
|
+
enabled: false,
|
|
238
|
+
serverUrl: 'https://agentstudio.woa.com',
|
|
239
|
+
token: '',
|
|
240
|
+
tunnelName: '',
|
|
241
|
+
domainSuffix: '',
|
|
242
|
+
websocketUrl: '',
|
|
243
|
+
protocol: 'https',
|
|
244
|
+
});
|
|
245
|
+
res.json({
|
|
246
|
+
success: true,
|
|
247
|
+
message: '隧道配置已删除',
|
|
248
|
+
config: tunnelService_js_1.tunnelService.getConfig(),
|
|
249
|
+
status: tunnelService_js_1.tunnelService.getStatus(),
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
console.error('[Tunnel API] Error deleting tunnel config:', error);
|
|
254
|
+
res.status(500).json({
|
|
255
|
+
success: false,
|
|
256
|
+
error: error instanceof Error ? error.message : String(error),
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
/**
|
|
261
|
+
* POST /api/tunnel/server-info - Get tunnel server info (proxy to avoid CORS)
|
|
262
|
+
* Fetches server info from the specified tunnel server URL
|
|
263
|
+
*/
|
|
264
|
+
router.post('/server-info', async (req, res) => {
|
|
265
|
+
try {
|
|
266
|
+
const { serverUrl } = req.body;
|
|
267
|
+
if (!serverUrl || typeof serverUrl !== 'string') {
|
|
268
|
+
return res.status(400).json({
|
|
269
|
+
success: false,
|
|
270
|
+
error: '请提供服务器地址',
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
// Normalize URL - remove trailing slashes
|
|
274
|
+
const baseUrl = serverUrl.replace(/\/+$/, '');
|
|
275
|
+
const infoUrl = `${baseUrl}/api/info`;
|
|
276
|
+
console.log(`[Tunnel API] Fetching server info from: ${infoUrl}`);
|
|
277
|
+
const response = await fetch(infoUrl);
|
|
278
|
+
if (!response.ok) {
|
|
279
|
+
throw new Error(`服务器返回错误: HTTP ${response.status}`);
|
|
280
|
+
}
|
|
281
|
+
const data = await response.json();
|
|
282
|
+
res.json({
|
|
283
|
+
success: true,
|
|
284
|
+
data,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
console.error('[Tunnel API] Error fetching server info:', error);
|
|
289
|
+
res.status(500).json({
|
|
290
|
+
success: false,
|
|
291
|
+
error: error instanceof Error ? error.message : String(error),
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
exports.default = router;
|
|
296
|
+
//# sourceMappingURL=tunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/routes/tunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a2aQueryService.d.ts","sourceRoot":"","sources":["../../../src/services/a2a/a2aQueryService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAS,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,OAAO;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4BD;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,EAC9D,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAChD,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"a2aQueryService.d.ts","sourceRoot":"","sources":["../../../src/services/a2a/a2aQueryService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAS,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,OAAO;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4BD;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,EAC9D,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAChD,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAoGjF;AAED;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,EAC9D,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,GACvC,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA4EvC"}
|
|
@@ -72,46 +72,67 @@ async function executeA2AQuery(message, images, options, onMessage) {
|
|
|
72
72
|
type: 'text',
|
|
73
73
|
text: message
|
|
74
74
|
});
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
75
|
+
// Internal function to execute the query
|
|
76
|
+
async function executeQuery(queryOptions) {
|
|
77
|
+
// Create the message generator (must be created fresh for each attempt)
|
|
78
|
+
const messageGen = createA2AMessageGenerator(messageContent);
|
|
79
|
+
let sessionId = null;
|
|
80
|
+
let fullResponse = '';
|
|
81
|
+
let tokensUsed = 0;
|
|
82
|
+
console.log(`🚀 [A2A Query] Starting one-shot query with resume=${queryOptions.resume || 'none'}`);
|
|
83
|
+
// Execute the query
|
|
84
|
+
const queryResult = (0, claude_agent_sdk_1.query)({
|
|
85
|
+
prompt: messageGen,
|
|
86
|
+
options: queryOptions
|
|
87
|
+
});
|
|
88
|
+
// Process responses
|
|
89
|
+
for await (const sdkMessage of queryResult) {
|
|
90
|
+
// Capture session ID from system init message
|
|
91
|
+
if (sdkMessage.type === 'system' && sdkMessage.subtype === 'init' && sdkMessage.session_id) {
|
|
92
|
+
sessionId = sdkMessage.session_id;
|
|
93
|
+
console.log(`📝 [A2A Query] Captured sessionId: ${sessionId}`);
|
|
94
|
+
}
|
|
95
|
+
// Also check for session_id on any message
|
|
96
|
+
if (sdkMessage.session_id && !sessionId) {
|
|
97
|
+
sessionId = sdkMessage.session_id;
|
|
98
|
+
}
|
|
99
|
+
// Extract assistant response text
|
|
100
|
+
if (sdkMessage.type === 'assistant' && sdkMessage.message?.content) {
|
|
101
|
+
for (const block of sdkMessage.message.content) {
|
|
102
|
+
if (block.type === 'text') {
|
|
103
|
+
fullResponse += block.text;
|
|
104
|
+
}
|
|
102
105
|
}
|
|
103
106
|
}
|
|
107
|
+
// Extract token usage
|
|
108
|
+
if (sdkMessage.type === 'assistant' && sdkMessage.usage) {
|
|
109
|
+
const usage = sdkMessage.usage;
|
|
110
|
+
tokensUsed = (usage.input_tokens || 0) + (usage.output_tokens || 0);
|
|
111
|
+
}
|
|
112
|
+
// Call the message callback
|
|
113
|
+
await onMessage(sdkMessage);
|
|
104
114
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
115
|
+
console.log(`✅ [A2A Query] Query completed, sessionId=${sessionId}, responseLength=${fullResponse.length}`);
|
|
116
|
+
return { sessionId, fullResponse, tokensUsed };
|
|
117
|
+
}
|
|
118
|
+
// Try with resume first, if it fails due to invalid session, retry without resume
|
|
119
|
+
try {
|
|
120
|
+
return await executeQuery(options);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
124
|
+
// Check if the error is due to invalid resume session
|
|
125
|
+
if (options.resume && (errorMessage.includes('exited with code 1') ||
|
|
126
|
+
errorMessage.includes('session') ||
|
|
127
|
+
errorMessage.includes('resume'))) {
|
|
128
|
+
console.warn(`⚠️ [A2A Query] Resume failed (session may be invalid), retrying without resume...`);
|
|
129
|
+
// Create new options without resume
|
|
130
|
+
const { resume, ...optionsWithoutResume } = options;
|
|
131
|
+
return await executeQuery(optionsWithoutResume);
|
|
109
132
|
}
|
|
110
|
-
//
|
|
111
|
-
|
|
133
|
+
// Re-throw other errors
|
|
134
|
+
throw error;
|
|
112
135
|
}
|
|
113
|
-
console.log(`✅ [A2A Query] Query completed, sessionId=${sessionId}, responseLength=${fullResponse.length}`);
|
|
114
|
-
return { sessionId, fullResponse, tokensUsed };
|
|
115
136
|
}
|
|
116
137
|
/**
|
|
117
138
|
* Execute a one-shot A2A query with SSE streaming
|
|
@@ -142,25 +163,47 @@ async function executeA2AQueryStreaming(message, images, options, onMessage) {
|
|
|
142
163
|
type: 'text',
|
|
143
164
|
text: message
|
|
144
165
|
});
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
166
|
+
// Internal function to execute the streaming query
|
|
167
|
+
async function executeStreamingQuery(queryOptions) {
|
|
168
|
+
// Create the message generator (must be created fresh for each attempt)
|
|
169
|
+
const messageGen = createA2AMessageGenerator(messageContent);
|
|
170
|
+
let sessionId = null;
|
|
171
|
+
console.log(`🚀 [A2A Query Streaming] Starting one-shot query with resume=${queryOptions.resume || 'none'}`);
|
|
172
|
+
const queryResult = (0, claude_agent_sdk_1.query)({
|
|
173
|
+
prompt: messageGen,
|
|
174
|
+
options: queryOptions
|
|
175
|
+
});
|
|
176
|
+
for await (const sdkMessage of queryResult) {
|
|
177
|
+
// Capture session ID
|
|
178
|
+
if (sdkMessage.type === 'system' && sdkMessage.subtype === 'init' && sdkMessage.session_id) {
|
|
179
|
+
sessionId = sdkMessage.session_id;
|
|
180
|
+
}
|
|
181
|
+
if (sdkMessage.session_id && !sessionId) {
|
|
182
|
+
sessionId = sdkMessage.session_id;
|
|
183
|
+
}
|
|
184
|
+
// Stream the message (synchronous callback for SSE)
|
|
185
|
+
onMessage(sdkMessage);
|
|
156
186
|
}
|
|
157
|
-
|
|
158
|
-
|
|
187
|
+
console.log(`✅ [A2A Query Streaming] Query completed, sessionId=${sessionId}`);
|
|
188
|
+
return { sessionId };
|
|
189
|
+
}
|
|
190
|
+
// Try with resume first, if it fails due to invalid session, retry without resume
|
|
191
|
+
try {
|
|
192
|
+
return await executeStreamingQuery(options);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
196
|
+
// Check if the error is due to invalid resume session
|
|
197
|
+
if (options.resume && (errorMessage.includes('exited with code 1') ||
|
|
198
|
+
errorMessage.includes('session') ||
|
|
199
|
+
errorMessage.includes('resume'))) {
|
|
200
|
+
console.warn(`⚠️ [A2A Query Streaming] Resume failed (session may be invalid), retrying without resume...`);
|
|
201
|
+
// Create new options without resume
|
|
202
|
+
const { resume, ...optionsWithoutResume } = options;
|
|
203
|
+
return await executeStreamingQuery(optionsWithoutResume);
|
|
159
204
|
}
|
|
160
|
-
//
|
|
161
|
-
|
|
205
|
+
// Re-throw other errors
|
|
206
|
+
throw error;
|
|
162
207
|
}
|
|
163
|
-
console.log(`✅ [A2A Query Streaming] Query completed, sessionId=${sessionId}`);
|
|
164
|
-
return { sessionId };
|
|
165
208
|
}
|
|
166
209
|
//# sourceMappingURL=a2aQueryService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a2aQueryService.js","sourceRoot":"","sources":["../../../src/services/a2a/a2aQueryService.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAgEH,
|
|
1
|
+
{"version":3,"file":"a2aQueryService.js","sourceRoot":"","sources":["../../../src/services/a2a/a2aQueryService.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAgEH,0CAyGC;AAYD,4DAiFC;AApQD,qEAAgE;AAuBhE;;;;;;;;GAQG;AACH,KAAK,SAAS,CAAC,CAAC,yBAAyB,CACvC,OAAsC;IAEtC,MAAM,cAAc,GAAG,OAAO,OAAO,KAAK,QAAQ;QAChD,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC5C,CAAC,CAAC,OAAO,CAAC;IAEZ,MAAM;QACJ,IAAI,EAAE,MAAe;QACrB,OAAO,EAAE;YACP,IAAI,EAAE,MAAe;YACrB,OAAO,EAAE,cAAc;SACxB;KACF,CAAC;IACF,sEAAsE;AACxE,CAAC;AAED;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,MAA8D,EAC9D,OAAwB,EACxB,SAAiD;IAEjD,6CAA6C;IAC7C,MAAM,cAAc,GAAyB,EAAE,CAAC;IAEhD,8BAA8B;IAC9B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,cAAc,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,KAAK,CAAC,SAAS;oBAC3B,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,cAAc,CAAC,IAAI,CAAC;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;KACd,CAAC,CAAC;IAEH,yCAAyC;IACzC,KAAK,UAAU,YAAY,CAAC,YAA6B;QACvD,wEAAwE;QACxE,MAAM,UAAU,GAAG,yBAAyB,CAAC,cAAc,CAAC,CAAC;QAE7D,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,OAAO,CAAC,GAAG,CAAC,sDAAsD,YAAY,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;QAEnG,oBAAoB;QACpB,MAAM,WAAW,GAAG,IAAA,wBAAK,EAAC;YACxB,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;QAEH,oBAAoB;QACpB,IAAI,KAAK,EAAE,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YAC3C,8CAA8C;YAC9C,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,OAAO,KAAK,MAAM,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC3F,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,2CAA2C;YAC3C,IAAK,UAAkB,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjD,SAAS,GAAI,UAAkB,CAAC,UAAU,CAAC;YAC7C,CAAC;YAED,kCAAkC;YAClC,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,IAAI,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;gBACnE,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oBAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC1B,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC;oBAC7B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,sBAAsB;YACtB,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,IAAK,UAAkB,CAAC,KAAK,EAAE,CAAC;gBACjE,MAAM,KAAK,GAAI,UAAkB,CAAC,KAAK,CAAC;gBACxC,UAAU,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,4BAA4B;YAC5B,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,4CAA4C,SAAS,oBAAoB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAE5G,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IACjD,CAAC;IAED,kFAAkF;IAClF,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5E,sDAAsD;QACtD,IAAI,OAAO,CAAC,MAAM,IAAI,CACpB,YAAY,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC3C,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;YAChC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAChC,EAAE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;YAElG,oCAAoC;YACpC,MAAM,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,GAAG,OAAO,CAAC;YACpD,OAAO,MAAM,YAAY,CAAC,oBAAoB,CAAC,CAAC;QAClD,CAAC;QAED,wBAAwB;QACxB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACI,KAAK,UAAU,wBAAwB,CAC5C,OAAe,EACf,MAA8D,EAC9D,OAAwB,EACxB,SAAwC;IAExC,6CAA6C;IAC7C,MAAM,cAAc,GAAyB,EAAE,CAAC;IAEhD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,cAAc,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,KAAK,CAAC,SAAS;oBAC3B,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,cAAc,CAAC,IAAI,CAAC;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;KACd,CAAC,CAAC;IAEH,mDAAmD;IACnD,KAAK,UAAU,qBAAqB,CAAC,YAA6B;QAChE,wEAAwE;QACxE,MAAM,UAAU,GAAG,yBAAyB,CAAC,cAAc,CAAC,CAAC;QAE7D,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,OAAO,CAAC,GAAG,CAAC,gEAAgE,YAAY,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;QAE7G,MAAM,WAAW,GAAG,IAAA,wBAAK,EAAC;YACxB,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;QAEH,IAAI,KAAK,EAAE,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YAC3C,qBAAqB;YACrB,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,OAAO,KAAK,MAAM,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC3F,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC;YACpC,CAAC;YACD,IAAK,UAAkB,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjD,SAAS,GAAI,UAAkB,CAAC,UAAU,CAAC;YAC7C,CAAC;YAED,oDAAoD;YACpD,SAAS,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,sDAAsD,SAAS,EAAE,CAAC,CAAC;QAE/E,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IAED,kFAAkF;IAClF,IAAI,CAAC;QACH,OAAO,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5E,sDAAsD;QACtD,IAAI,OAAO,CAAC,MAAM,IAAI,CACpB,YAAY,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC3C,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;YAChC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAChC,EAAE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;YAE5G,oCAAoC;YACpC,MAAM,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,GAAG,OAAO,CAAC;YACpD,OAAO,MAAM,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;QAC3D,CAAC;QAED,wBAAwB;QACxB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tunnel Service
|
|
3
|
+
*
|
|
4
|
+
* Manages WebSocket tunnel connection to allow external access to local Agent Studio.
|
|
5
|
+
* Uses tunely library for tunnel client functionality.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Auto-connect on startup if configured
|
|
9
|
+
* - Automatic reconnection on disconnect
|
|
10
|
+
* - Connection status tracking
|
|
11
|
+
* - Configuration persistence
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Tunnel configuration stored on disk
|
|
15
|
+
*/
|
|
16
|
+
export interface TunnelConfig {
|
|
17
|
+
/** Whether tunnel should auto-connect on startup */
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
/** Tunnel server base URL (e.g., https://agentstudio.woa.com) */
|
|
20
|
+
serverUrl: string;
|
|
21
|
+
/** WebSocket URL for tunnel connection (from server /api/info) */
|
|
22
|
+
websocketUrl?: string;
|
|
23
|
+
/** Tunnel authentication token */
|
|
24
|
+
token: string;
|
|
25
|
+
/** Tunnel name (subdomain part, e.g., "my-dev" for my-dev.tunnel) */
|
|
26
|
+
tunnelName?: string;
|
|
27
|
+
/** Domain suffix (e.g., ".agentstudio.woa.com") */
|
|
28
|
+
domainSuffix?: string;
|
|
29
|
+
/** Protocol for tunnel domain (https or http) */
|
|
30
|
+
protocol?: 'https' | 'http';
|
|
31
|
+
/** Reconnect interval in milliseconds */
|
|
32
|
+
reconnectInterval?: number;
|
|
33
|
+
/** Maximum reconnect attempts (0 = infinite) */
|
|
34
|
+
maxReconnectAttempts?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Result of checking tunnel name availability
|
|
38
|
+
*/
|
|
39
|
+
export interface TunnelCheckResult {
|
|
40
|
+
available: boolean;
|
|
41
|
+
reason?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Result of creating a tunnel token
|
|
45
|
+
*/
|
|
46
|
+
export interface TunnelCreateResult {
|
|
47
|
+
success: boolean;
|
|
48
|
+
token?: string;
|
|
49
|
+
domain?: string;
|
|
50
|
+
error?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Tunnel connection status
|
|
54
|
+
*/
|
|
55
|
+
export interface TunnelStatus {
|
|
56
|
+
/** Whether tunnel is enabled in config */
|
|
57
|
+
enabled: boolean;
|
|
58
|
+
/** Whether currently connected */
|
|
59
|
+
connected: boolean;
|
|
60
|
+
/** Assigned tunnel domain (e.g., "my-dev.tunnel") */
|
|
61
|
+
domain: string | null;
|
|
62
|
+
/** Last error message if any */
|
|
63
|
+
lastError: string | null;
|
|
64
|
+
/** Connection timestamp */
|
|
65
|
+
connectedAt: string | null;
|
|
66
|
+
/** Number of reconnect attempts */
|
|
67
|
+
reconnectCount: number;
|
|
68
|
+
/** Config source: 'port-specific' or 'default' */
|
|
69
|
+
configSource: 'port-specific' | 'default' | 'none';
|
|
70
|
+
/** Local port this tunnel forwards to */
|
|
71
|
+
localPort: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Tunnel Service singleton
|
|
75
|
+
*/
|
|
76
|
+
declare class TunnelService {
|
|
77
|
+
private client;
|
|
78
|
+
private config;
|
|
79
|
+
private status;
|
|
80
|
+
private localPort;
|
|
81
|
+
private initialized;
|
|
82
|
+
private configSource;
|
|
83
|
+
/**
|
|
84
|
+
* Initialize the tunnel service
|
|
85
|
+
* Loads config and auto-connects if enabled
|
|
86
|
+
*/
|
|
87
|
+
initialize(localPort?: number): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Load tunnel configuration from disk
|
|
90
|
+
* Priority: port-specific config > default config
|
|
91
|
+
*/
|
|
92
|
+
loadConfig(): Promise<TunnelConfig>;
|
|
93
|
+
/**
|
|
94
|
+
* Save tunnel configuration to disk
|
|
95
|
+
* Always saves to port-specific config file
|
|
96
|
+
*/
|
|
97
|
+
saveConfig(config: Partial<TunnelConfig>): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Get current tunnel configuration
|
|
100
|
+
*/
|
|
101
|
+
getConfig(): TunnelConfig;
|
|
102
|
+
/**
|
|
103
|
+
* Get current tunnel status
|
|
104
|
+
*/
|
|
105
|
+
getStatus(): TunnelStatus;
|
|
106
|
+
/**
|
|
107
|
+
* Connect to the tunnel server
|
|
108
|
+
*/
|
|
109
|
+
connect(): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Disconnect from the tunnel server
|
|
112
|
+
*/
|
|
113
|
+
disconnect(): void;
|
|
114
|
+
/**
|
|
115
|
+
* Update configuration and optionally reconnect
|
|
116
|
+
*/
|
|
117
|
+
updateConfig(newConfig: Partial<TunnelConfig>, reconnect?: boolean): Promise<void>;
|
|
118
|
+
/**
|
|
119
|
+
* Test tunnel connection with current config
|
|
120
|
+
*/
|
|
121
|
+
testConnection(): Promise<{
|
|
122
|
+
success: boolean;
|
|
123
|
+
domain?: string;
|
|
124
|
+
error?: string;
|
|
125
|
+
}>;
|
|
126
|
+
/**
|
|
127
|
+
* Check if a tunnel name is available
|
|
128
|
+
* @param name The tunnel name to check (e.g., "my-dev")
|
|
129
|
+
*/
|
|
130
|
+
checkTunnelName(name: string): Promise<TunnelCheckResult>;
|
|
131
|
+
/**
|
|
132
|
+
* Create a tunnel and get the token
|
|
133
|
+
* @param name The tunnel name to create (e.g., "my-dev")
|
|
134
|
+
*/
|
|
135
|
+
createTunnel(name: string): Promise<TunnelCreateResult>;
|
|
136
|
+
/**
|
|
137
|
+
* Create tunnel and save config in one step
|
|
138
|
+
* @param name The tunnel name to create
|
|
139
|
+
* @param autoConnect Whether to enable auto-connect
|
|
140
|
+
* @param protocol The protocol to use (https or http)
|
|
141
|
+
* @param websocketUrl The WebSocket URL from server info
|
|
142
|
+
* @param domainSuffix The domain suffix (e.g., ".agentstudio.woa.com")
|
|
143
|
+
*/
|
|
144
|
+
createAndSave(name: string, autoConnect?: boolean, protocol?: 'https' | 'http', websocketUrl?: string, domainSuffix?: string): Promise<TunnelCreateResult>;
|
|
145
|
+
}
|
|
146
|
+
export declare const tunnelService: TunnelService;
|
|
147
|
+
export {};
|
|
148
|
+
//# sourceMappingURL=tunnelService.d.ts.map
|