@awcp/sdk 0.0.0-dev-202601300724
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/delegator/admission.d.ts +49 -0
- package/dist/delegator/admission.d.ts.map +1 -0
- package/dist/delegator/admission.js +117 -0
- package/dist/delegator/admission.js.map +1 -0
- package/dist/delegator/bin/client.d.ts +102 -0
- package/dist/delegator/bin/client.d.ts.map +1 -0
- package/dist/delegator/bin/client.js +116 -0
- package/dist/delegator/bin/client.js.map +1 -0
- package/dist/delegator/bin/daemon.d.ts +78 -0
- package/dist/delegator/bin/daemon.d.ts.map +1 -0
- package/dist/delegator/bin/daemon.js +245 -0
- package/dist/delegator/bin/daemon.js.map +1 -0
- package/dist/delegator/config.d.ts +168 -0
- package/dist/delegator/config.d.ts.map +1 -0
- package/dist/delegator/config.js +54 -0
- package/dist/delegator/config.js.map +1 -0
- package/dist/delegator/executor-client.d.ts +36 -0
- package/dist/delegator/executor-client.d.ts.map +1 -0
- package/dist/delegator/executor-client.js +77 -0
- package/dist/delegator/executor-client.js.map +1 -0
- package/dist/delegator/export-view.d.ts +43 -0
- package/dist/delegator/export-view.d.ts.map +1 -0
- package/dist/delegator/export-view.js +108 -0
- package/dist/delegator/export-view.js.map +1 -0
- package/dist/delegator/index.d.ts +8 -0
- package/dist/delegator/index.d.ts.map +1 -0
- package/dist/delegator/index.js +11 -0
- package/dist/delegator/index.js.map +1 -0
- package/dist/delegator/service.d.ts +120 -0
- package/dist/delegator/service.d.ts.map +1 -0
- package/dist/delegator/service.js +323 -0
- package/dist/delegator/service.js.map +1 -0
- package/dist/executor/config.d.ts +126 -0
- package/dist/executor/config.d.ts.map +1 -0
- package/dist/executor/config.js +38 -0
- package/dist/executor/config.js.map +1 -0
- package/dist/executor/delegator-client.d.ts +18 -0
- package/dist/executor/delegator-client.d.ts.map +1 -0
- package/dist/executor/delegator-client.js +37 -0
- package/dist/executor/delegator-client.js.map +1 -0
- package/dist/executor/index.d.ts +5 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +7 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/executor/policy.d.ts +55 -0
- package/dist/executor/policy.d.ts.map +1 -0
- package/dist/executor/policy.js +100 -0
- package/dist/executor/policy.js.map +1 -0
- package/dist/executor/service.d.ts +84 -0
- package/dist/executor/service.d.ts.map +1 -0
- package/dist/executor/service.js +322 -0
- package/dist/executor/service.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/server/express/awcp-delegator-handler.d.ts +67 -0
- package/dist/server/express/awcp-delegator-handler.d.ts.map +1 -0
- package/dist/server/express/awcp-delegator-handler.js +99 -0
- package/dist/server/express/awcp-delegator-handler.js.map +1 -0
- package/dist/server/express/awcp-executor-handler.d.ts +47 -0
- package/dist/server/express/awcp-executor-handler.d.ts.map +1 -0
- package/dist/server/express/awcp-executor-handler.js +104 -0
- package/dist/server/express/awcp-executor-handler.js.map +1 -0
- package/dist/server/express/index.d.ts +6 -0
- package/dist/server/express/index.d.ts.map +1 -0
- package/dist/server/express/index.js +8 -0
- package/dist/server/express/index.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegator Daemon Process
|
|
3
|
+
*
|
|
4
|
+
* Runs the Delegator as an independent daemon process that can be accessed
|
|
5
|
+
* by multiple clients (MCP, CLI, HTTP API, etc.)
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx delegator-daemon --port 3100 --config delegator.json
|
|
9
|
+
*
|
|
10
|
+
* Or programmatically:
|
|
11
|
+
* import { startDelegatorDaemon } from '@awcp/sdk/delegator/bin/daemon';
|
|
12
|
+
* await startDelegatorDaemon({ port: 3100, config: myConfig });
|
|
13
|
+
*/
|
|
14
|
+
import { createServer } from 'node:http';
|
|
15
|
+
import express, { json } from 'express';
|
|
16
|
+
import { DelegatorService } from '../service.js';
|
|
17
|
+
import { AwcpError } from '@awcp/core';
|
|
18
|
+
/**
|
|
19
|
+
* Start the Delegator Daemon
|
|
20
|
+
*
|
|
21
|
+
* This starts an HTTP server that provides:
|
|
22
|
+
* - POST /delegate - Create a new delegation
|
|
23
|
+
* - GET /delegations - List all delegations
|
|
24
|
+
* - GET /delegation/:id - Get delegation status
|
|
25
|
+
* - DELETE /delegation/:id - Cancel a delegation
|
|
26
|
+
* - POST /callback - Receive messages from Executor
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const daemon = await startDelegatorDaemon({
|
|
31
|
+
* port: 3100,
|
|
32
|
+
* delegator: {
|
|
33
|
+
* export: { baseDir: '/tmp/awcp/exports' },
|
|
34
|
+
* ssh: { host: 'localhost', user: 'awcp' },
|
|
35
|
+
* },
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* // Create delegation via HTTP
|
|
39
|
+
* const response = await fetch('http://localhost:3100/delegate', {
|
|
40
|
+
* method: 'POST',
|
|
41
|
+
* headers: { 'Content-Type': 'application/json' },
|
|
42
|
+
* body: JSON.stringify({
|
|
43
|
+
* executorUrl: 'http://executor:4001/awcp',
|
|
44
|
+
* localDir: '/path/to/project',
|
|
45
|
+
* task: { description: 'Fix bug', prompt: '...' },
|
|
46
|
+
* }),
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* // Stop daemon
|
|
50
|
+
* await daemon.stop();
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export async function startDelegatorDaemon(config) {
|
|
54
|
+
const port = config.port ?? 3100;
|
|
55
|
+
const host = config.host ?? 'localhost';
|
|
56
|
+
const baseUrl = `http://${host}:${port}`;
|
|
57
|
+
const app = express();
|
|
58
|
+
app.use(json());
|
|
59
|
+
// Create service with callback URL pointing to this daemon
|
|
60
|
+
const serviceOptions = {
|
|
61
|
+
config: config.delegator,
|
|
62
|
+
callbackUrl: `${baseUrl}/callback`,
|
|
63
|
+
};
|
|
64
|
+
const service = new DelegatorService(serviceOptions);
|
|
65
|
+
// ============================================
|
|
66
|
+
// API Routes
|
|
67
|
+
// ============================================
|
|
68
|
+
/**
|
|
69
|
+
* POST /delegate - Create a new delegation
|
|
70
|
+
*
|
|
71
|
+
* Body:
|
|
72
|
+
* {
|
|
73
|
+
* executorUrl: string,
|
|
74
|
+
* localDir: string,
|
|
75
|
+
* task: { description: string, prompt: string },
|
|
76
|
+
* ttlSeconds?: number,
|
|
77
|
+
* accessMode?: 'ro' | 'rw'
|
|
78
|
+
* }
|
|
79
|
+
*
|
|
80
|
+
* Response:
|
|
81
|
+
* { delegationId: string }
|
|
82
|
+
*/
|
|
83
|
+
app.post('/delegate', async (req, res) => {
|
|
84
|
+
try {
|
|
85
|
+
const { executorUrl, localDir, task, ttlSeconds, accessMode } = req.body;
|
|
86
|
+
if (!executorUrl || !localDir || !task) {
|
|
87
|
+
res.status(400).json({
|
|
88
|
+
error: 'Missing required fields: executorUrl, localDir, task',
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const delegationId = await service.delegate({
|
|
93
|
+
executorUrl,
|
|
94
|
+
localDir,
|
|
95
|
+
task,
|
|
96
|
+
ttlSeconds,
|
|
97
|
+
accessMode,
|
|
98
|
+
});
|
|
99
|
+
res.json({ delegationId });
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error('[Delegator Daemon] Error creating delegation:', error);
|
|
103
|
+
if (error instanceof AwcpError) {
|
|
104
|
+
res.status(400).json({
|
|
105
|
+
error: error.message,
|
|
106
|
+
code: error.code,
|
|
107
|
+
hint: error.hint,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
res.status(500).json({
|
|
112
|
+
error: error instanceof Error ? error.message : 'Failed to create delegation',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
/**
|
|
118
|
+
* GET /delegations - List all delegations
|
|
119
|
+
*/
|
|
120
|
+
app.get('/delegations', (_req, res) => {
|
|
121
|
+
res.json(service.getStatus());
|
|
122
|
+
});
|
|
123
|
+
/**
|
|
124
|
+
* GET /delegation/:id - Get delegation status
|
|
125
|
+
*/
|
|
126
|
+
app.get('/delegation/:id', (req, res) => {
|
|
127
|
+
const delegation = service.getDelegation(req.params.id);
|
|
128
|
+
if (!delegation) {
|
|
129
|
+
res.status(404).json({ error: 'Delegation not found' });
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
res.json(delegation);
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* DELETE /delegation/:id - Cancel a delegation
|
|
136
|
+
*/
|
|
137
|
+
app.delete('/delegation/:id', async (req, res) => {
|
|
138
|
+
try {
|
|
139
|
+
await service.cancel(req.params.id);
|
|
140
|
+
res.json({ ok: true });
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
res.status(400).json({
|
|
144
|
+
error: error instanceof Error ? error.message : 'Failed to cancel',
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
/**
|
|
149
|
+
* POST /callback - Receive messages from Executor
|
|
150
|
+
*
|
|
151
|
+
* This endpoint receives ACCEPT, DONE, and ERROR messages from Executors.
|
|
152
|
+
*/
|
|
153
|
+
app.post('/callback', async (req, res) => {
|
|
154
|
+
try {
|
|
155
|
+
await service.handleMessage(req.body);
|
|
156
|
+
res.json({ ok: true });
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error('[Delegator Daemon] Error handling callback:', error);
|
|
160
|
+
res.status(500).json({
|
|
161
|
+
error: error instanceof Error ? error.message : 'Internal error',
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
/**
|
|
166
|
+
* GET /health - Health check
|
|
167
|
+
*/
|
|
168
|
+
app.get('/health', (_req, res) => {
|
|
169
|
+
res.json({ status: 'ok' });
|
|
170
|
+
});
|
|
171
|
+
// Start server
|
|
172
|
+
const server = createServer(app);
|
|
173
|
+
await new Promise((resolve, reject) => {
|
|
174
|
+
server.listen(port, host, () => {
|
|
175
|
+
console.log(`[Delegator Daemon] Listening on ${baseUrl}`);
|
|
176
|
+
resolve();
|
|
177
|
+
});
|
|
178
|
+
server.on('error', reject);
|
|
179
|
+
});
|
|
180
|
+
return {
|
|
181
|
+
stop: async () => {
|
|
182
|
+
await new Promise((resolve, reject) => {
|
|
183
|
+
server.close((err) => {
|
|
184
|
+
if (err)
|
|
185
|
+
reject(err);
|
|
186
|
+
else
|
|
187
|
+
resolve();
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
console.log('[Delegator Daemon] Stopped');
|
|
191
|
+
},
|
|
192
|
+
service,
|
|
193
|
+
url: baseUrl,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* CLI entry point
|
|
198
|
+
*/
|
|
199
|
+
export async function main() {
|
|
200
|
+
// Parse command line arguments
|
|
201
|
+
const args = process.argv.slice(2);
|
|
202
|
+
let port = 3100;
|
|
203
|
+
let configPath;
|
|
204
|
+
for (let i = 0; i < args.length; i++) {
|
|
205
|
+
if (args[i] === '--port' && args[i + 1]) {
|
|
206
|
+
port = parseInt(args[i + 1], 10);
|
|
207
|
+
i++;
|
|
208
|
+
}
|
|
209
|
+
else if (args[i] === '--config' && args[i + 1]) {
|
|
210
|
+
configPath = args[i + 1];
|
|
211
|
+
i++;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (!configPath) {
|
|
215
|
+
console.error('Usage: delegator-daemon --port 3100 --config <config.json>');
|
|
216
|
+
console.error('');
|
|
217
|
+
console.error('Config file should contain:');
|
|
218
|
+
console.error(JSON.stringify({
|
|
219
|
+
export: { baseDir: '/tmp/awcp/exports' },
|
|
220
|
+
ssh: { host: 'localhost', user: 'awcp' },
|
|
221
|
+
}, null, 2));
|
|
222
|
+
process.exit(1);
|
|
223
|
+
}
|
|
224
|
+
// Load config
|
|
225
|
+
const fs = await import('node:fs/promises');
|
|
226
|
+
const configContent = await fs.readFile(configPath, 'utf-8');
|
|
227
|
+
const delegatorConfig = JSON.parse(configContent);
|
|
228
|
+
// Start daemon
|
|
229
|
+
const daemon = await startDelegatorDaemon({
|
|
230
|
+
port,
|
|
231
|
+
delegator: delegatorConfig,
|
|
232
|
+
});
|
|
233
|
+
// Handle shutdown
|
|
234
|
+
process.on('SIGINT', async () => {
|
|
235
|
+
console.log('\n[Delegator Daemon] Shutting down...');
|
|
236
|
+
await daemon.stop();
|
|
237
|
+
process.exit(0);
|
|
238
|
+
});
|
|
239
|
+
process.on('SIGTERM', async () => {
|
|
240
|
+
await daemon.stop();
|
|
241
|
+
process.exit(0);
|
|
242
|
+
});
|
|
243
|
+
console.log(`[Delegator Daemon] Ready. API available at ${daemon.url}`);
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/delegator/bin/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAgC,MAAM,eAAe,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA0BvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAoB;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;IACxC,MAAM,OAAO,GAAG,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC;IAEzC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAEhB,2DAA2D;IAC3D,MAAM,cAAc,GAA4B;QAC9C,MAAM,EAAE,MAAM,CAAC,SAAS;QACxB,WAAW,EAAE,GAAG,OAAO,WAAW;KACnC,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAErD,+CAA+C;IAC/C,aAAa;IACb,+CAA+C;IAE/C;;;;;;;;;;;;;;OAcG;IACH,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAEzE,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,sDAAsD;iBAC9D,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC;gBAC1C,WAAW;gBACX,QAAQ;gBACR,IAAI;gBACJ,UAAU;gBACV,UAAU;aACX,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;YAEtE,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;gBAC/B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,KAAK,CAAC,OAAO;oBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B;iBAC9E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACpC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,GAAG,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC/C,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB;aACnE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;;OAIG;IACH,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;YACpE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB;aACjE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,eAAe;IACf,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAEjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC7B,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;YAC1D,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACnB,IAAI,GAAG;wBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;wBAChB,OAAO,EAAE,CAAC;gBACjB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO;QACP,GAAG,EAAE,OAAO;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,+BAA+B;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,UAA8B,CAAC;IAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YAClC,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACjD,UAAU,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3B,MAAM,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE;YACxC,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE;SACzC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,cAAc;IACd,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAoB,CAAC;IAErE,eAAe;IACf,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;QACxC,IAAI;QACJ,SAAS,EAAE,eAAe;KAC3B,CAAC,CAAC;IAEH,kBAAkB;IAClB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,8CAA8C,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWCP Delegator Configuration
|
|
3
|
+
*
|
|
4
|
+
* Configuration for enabling AWCP Delegator functionality.
|
|
5
|
+
*/
|
|
6
|
+
import type { Delegation, AccessMode } from '@awcp/core';
|
|
7
|
+
/**
|
|
8
|
+
* Export view configuration
|
|
9
|
+
*/
|
|
10
|
+
export interface ExportConfig {
|
|
11
|
+
/** Base directory for export views, e.g., '/tmp/awcp/exports' */
|
|
12
|
+
baseDir: string;
|
|
13
|
+
/** Strategy for creating export view (default: 'symlink') */
|
|
14
|
+
strategy?: 'symlink' | 'bind' | 'worktree';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* SSH configuration for credential generation
|
|
18
|
+
*/
|
|
19
|
+
export interface SshConfig {
|
|
20
|
+
/** SSH server host that Executor will connect to */
|
|
21
|
+
host: string;
|
|
22
|
+
/** SSH server port (default: 22) */
|
|
23
|
+
port?: number;
|
|
24
|
+
/** SSH user for Executor connections */
|
|
25
|
+
user: string;
|
|
26
|
+
/** Directory to store temporary keys (default: '/tmp/awcp/keys') */
|
|
27
|
+
keyDir?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Admission control configuration
|
|
31
|
+
*/
|
|
32
|
+
export interface AdmissionConfig {
|
|
33
|
+
/** Maximum total bytes allowed (default: 100MB) */
|
|
34
|
+
maxTotalBytes?: number;
|
|
35
|
+
/** Maximum file count allowed (default: 10000) */
|
|
36
|
+
maxFileCount?: number;
|
|
37
|
+
/** Maximum single file size (default: 50MB) */
|
|
38
|
+
maxSingleFileBytes?: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Default values for delegations
|
|
42
|
+
*/
|
|
43
|
+
export interface DelegationDefaults {
|
|
44
|
+
/** Default TTL in seconds (default: 3600) */
|
|
45
|
+
ttlSeconds?: number;
|
|
46
|
+
/** Default access mode (default: 'rw') */
|
|
47
|
+
accessMode?: AccessMode;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Lifecycle hooks for Delegator events
|
|
51
|
+
*/
|
|
52
|
+
export interface DelegatorHooks {
|
|
53
|
+
/** Called when delegation is created and INVITE sent */
|
|
54
|
+
onDelegationCreated?: (delegation: Delegation) => void;
|
|
55
|
+
/** Called when Executor accepts and task starts */
|
|
56
|
+
onDelegationStarted?: (delegation: Delegation) => void;
|
|
57
|
+
/** Called when task completes successfully */
|
|
58
|
+
onDelegationCompleted?: (delegation: Delegation) => void;
|
|
59
|
+
/** Called on error or rejection */
|
|
60
|
+
onError?: (delegationId: string, error: Error) => void;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* AWCP Delegator Configuration
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const delegatorConfig: DelegatorConfig = {
|
|
68
|
+
* export: {
|
|
69
|
+
* baseDir: '/tmp/awcp/exports',
|
|
70
|
+
* },
|
|
71
|
+
* ssh: {
|
|
72
|
+
* host: 'my-host.example.com',
|
|
73
|
+
* port: 22,
|
|
74
|
+
* user: 'awcp',
|
|
75
|
+
* },
|
|
76
|
+
* };
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export interface DelegatorConfig {
|
|
80
|
+
/**
|
|
81
|
+
* Export view configuration (required)
|
|
82
|
+
*
|
|
83
|
+
* Specifies how workspaces are exported for Executor access.
|
|
84
|
+
*/
|
|
85
|
+
export: ExportConfig;
|
|
86
|
+
/**
|
|
87
|
+
* SSH configuration (required)
|
|
88
|
+
*
|
|
89
|
+
* Specifies SSH server details for SSHFS connections.
|
|
90
|
+
*/
|
|
91
|
+
ssh: SshConfig;
|
|
92
|
+
/**
|
|
93
|
+
* Admission control (optional)
|
|
94
|
+
*
|
|
95
|
+
* Limits for workspace size to prevent network issues.
|
|
96
|
+
*/
|
|
97
|
+
admission?: AdmissionConfig;
|
|
98
|
+
/**
|
|
99
|
+
* Default values for delegations (optional)
|
|
100
|
+
*/
|
|
101
|
+
defaults?: DelegationDefaults;
|
|
102
|
+
/**
|
|
103
|
+
* Lifecycle hooks (optional)
|
|
104
|
+
*/
|
|
105
|
+
hooks?: DelegatorHooks;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Default configuration values
|
|
109
|
+
*/
|
|
110
|
+
export declare const DEFAULT_DELEGATOR_CONFIG: {
|
|
111
|
+
readonly ssh: {
|
|
112
|
+
readonly port: 22;
|
|
113
|
+
readonly keyDir: "/tmp/awcp/keys";
|
|
114
|
+
};
|
|
115
|
+
readonly export: {
|
|
116
|
+
readonly strategy: "symlink";
|
|
117
|
+
};
|
|
118
|
+
readonly admission: {
|
|
119
|
+
readonly maxTotalBytes: number;
|
|
120
|
+
readonly maxFileCount: 10000;
|
|
121
|
+
readonly maxSingleFileBytes: number;
|
|
122
|
+
};
|
|
123
|
+
readonly defaults: {
|
|
124
|
+
readonly ttlSeconds: 3600;
|
|
125
|
+
readonly accessMode: AccessMode;
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Resolved SSH config with all fields
|
|
130
|
+
*/
|
|
131
|
+
export interface ResolvedSshConfig {
|
|
132
|
+
host: string;
|
|
133
|
+
port: number;
|
|
134
|
+
user: string;
|
|
135
|
+
keyDir: string;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Resolved admission config with all fields
|
|
139
|
+
*/
|
|
140
|
+
export interface ResolvedAdmissionConfig {
|
|
141
|
+
maxTotalBytes: number;
|
|
142
|
+
maxFileCount: number;
|
|
143
|
+
maxSingleFileBytes: number;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Resolved defaults with all fields
|
|
147
|
+
*/
|
|
148
|
+
export interface ResolvedDelegationDefaults {
|
|
149
|
+
ttlSeconds: number;
|
|
150
|
+
accessMode: AccessMode;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Resolved configuration with all defaults applied
|
|
154
|
+
*/
|
|
155
|
+
export interface ResolvedDelegatorConfig {
|
|
156
|
+
export: ExportConfig & {
|
|
157
|
+
strategy: 'symlink' | 'bind' | 'worktree';
|
|
158
|
+
};
|
|
159
|
+
ssh: ResolvedSshConfig;
|
|
160
|
+
admission: ResolvedAdmissionConfig;
|
|
161
|
+
defaults: ResolvedDelegationDefaults;
|
|
162
|
+
hooks: DelegatorHooks;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Merge user config with defaults
|
|
166
|
+
*/
|
|
167
|
+
export declare function resolveDelegatorConfig(config: DelegatorConfig): ResolvedDelegatorConfig;
|
|
168
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/delegator/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWCP Delegator Configuration
|
|
3
|
+
*
|
|
4
|
+
* Configuration for enabling AWCP Delegator functionality.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Default configuration values
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_DELEGATOR_CONFIG = {
|
|
10
|
+
ssh: {
|
|
11
|
+
port: 22,
|
|
12
|
+
keyDir: '/tmp/awcp/keys',
|
|
13
|
+
},
|
|
14
|
+
export: {
|
|
15
|
+
strategy: 'symlink',
|
|
16
|
+
},
|
|
17
|
+
admission: {
|
|
18
|
+
maxTotalBytes: 100 * 1024 * 1024, // 100MB
|
|
19
|
+
maxFileCount: 10000,
|
|
20
|
+
maxSingleFileBytes: 50 * 1024 * 1024, // 50MB
|
|
21
|
+
},
|
|
22
|
+
defaults: {
|
|
23
|
+
ttlSeconds: 3600,
|
|
24
|
+
accessMode: 'rw',
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Merge user config with defaults
|
|
29
|
+
*/
|
|
30
|
+
export function resolveDelegatorConfig(config) {
|
|
31
|
+
return {
|
|
32
|
+
export: {
|
|
33
|
+
baseDir: config.export.baseDir,
|
|
34
|
+
strategy: config.export.strategy ?? DEFAULT_DELEGATOR_CONFIG.export.strategy,
|
|
35
|
+
},
|
|
36
|
+
ssh: {
|
|
37
|
+
host: config.ssh.host,
|
|
38
|
+
port: config.ssh.port ?? DEFAULT_DELEGATOR_CONFIG.ssh.port,
|
|
39
|
+
user: config.ssh.user,
|
|
40
|
+
keyDir: config.ssh.keyDir ?? DEFAULT_DELEGATOR_CONFIG.ssh.keyDir,
|
|
41
|
+
},
|
|
42
|
+
admission: {
|
|
43
|
+
maxTotalBytes: config.admission?.maxTotalBytes ?? DEFAULT_DELEGATOR_CONFIG.admission.maxTotalBytes,
|
|
44
|
+
maxFileCount: config.admission?.maxFileCount ?? DEFAULT_DELEGATOR_CONFIG.admission.maxFileCount,
|
|
45
|
+
maxSingleFileBytes: config.admission?.maxSingleFileBytes ?? DEFAULT_DELEGATOR_CONFIG.admission.maxSingleFileBytes,
|
|
46
|
+
},
|
|
47
|
+
defaults: {
|
|
48
|
+
ttlSeconds: config.defaults?.ttlSeconds ?? DEFAULT_DELEGATOR_CONFIG.defaults.ttlSeconds,
|
|
49
|
+
accessMode: config.defaults?.accessMode ?? DEFAULT_DELEGATOR_CONFIG.defaults.accessMode,
|
|
50
|
+
},
|
|
51
|
+
hooks: config.hooks ?? {},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/delegator/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkHH;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,GAAG,EAAE;QACH,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,gBAAgB;KACzB;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,SAAkB;KAC7B;IACD,SAAS,EAAE;QACT,aAAa,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ;QAC1C,YAAY,EAAE,KAAK;QACnB,kBAAkB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;KAC9C;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAkB;KAC/B;CACO,CAAC;AAwCX;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAuB;IAC5D,OAAO;QACL,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;YAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,wBAAwB,CAAC,MAAM,CAAC,QAAQ;SAC7E;QACD,GAAG,EAAE;YACH,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI;YACrB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,wBAAwB,CAAC,GAAG,CAAC,IAAI;YAC1D,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI;YACrB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,MAAM;SACjE;QACD,SAAS,EAAE;YACT,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,aAAa,IAAI,wBAAwB,CAAC,SAAS,CAAC,aAAa;YAClG,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,YAAY,IAAI,wBAAwB,CAAC,SAAS,CAAC,YAAY;YAC/F,kBAAkB,EAAE,MAAM,CAAC,SAAS,EAAE,kBAAkB,IAAI,wBAAwB,CAAC,SAAS,CAAC,kBAAkB;SAClH;QACD,QAAQ,EAAE;YACR,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,IAAI,wBAAwB,CAAC,QAAQ,CAAC,UAAU;YACvF,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,IAAI,wBAAwB,CAAC,QAAQ,CAAC,UAAU;SACxF;QACD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client for sending AWCP messages to Executor
|
|
3
|
+
*/
|
|
4
|
+
import type { AwcpMessage, AcceptMessage, ErrorMessage } from '@awcp/core';
|
|
5
|
+
/**
|
|
6
|
+
* Response from Executor for INVITE message
|
|
7
|
+
*/
|
|
8
|
+
export type InviteResponse = AcceptMessage | ErrorMessage;
|
|
9
|
+
/**
|
|
10
|
+
* Client for sending AWCP messages to Executor daemon
|
|
11
|
+
*/
|
|
12
|
+
export declare class ExecutorClient {
|
|
13
|
+
private timeout;
|
|
14
|
+
private callbackUrl;
|
|
15
|
+
constructor(options: {
|
|
16
|
+
timeout?: number;
|
|
17
|
+
callbackUrl: string;
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* Send INVITE to Executor and get ACCEPT/ERROR response
|
|
21
|
+
*/
|
|
22
|
+
sendInvite(executorUrl: string, message: AwcpMessage): Promise<InviteResponse>;
|
|
23
|
+
/**
|
|
24
|
+
* Send START to Executor (async, no response expected)
|
|
25
|
+
*/
|
|
26
|
+
sendStart(executorUrl: string, message: AwcpMessage): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Request Executor to cancel a delegation (waits for unmount to complete)
|
|
29
|
+
*/
|
|
30
|
+
sendCancel(executorUrl: string, delegationId: string): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Internal send method
|
|
33
|
+
*/
|
|
34
|
+
private send;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=executor-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-client.d.ts","sourceRoot":"","sources":["../../src/delegator/executor-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3E;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAE1D;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAK9D;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IAMpF;;OAEG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzE;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB1E;;OAEG;YACW,IAAI;CA2BnB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client for sending AWCP messages to Executor
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Client for sending AWCP messages to Executor daemon
|
|
6
|
+
*/
|
|
7
|
+
export class ExecutorClient {
|
|
8
|
+
timeout;
|
|
9
|
+
callbackUrl;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.timeout = options.timeout ?? 30000;
|
|
12
|
+
this.callbackUrl = options.callbackUrl;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Send INVITE to Executor and get ACCEPT/ERROR response
|
|
16
|
+
*/
|
|
17
|
+
async sendInvite(executorUrl, message) {
|
|
18
|
+
const response = await this.send(executorUrl, message);
|
|
19
|
+
const data = await response.json();
|
|
20
|
+
return data;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Send START to Executor (async, no response expected)
|
|
24
|
+
*/
|
|
25
|
+
async sendStart(executorUrl, message) {
|
|
26
|
+
await this.send(executorUrl, message);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Request Executor to cancel a delegation (waits for unmount to complete)
|
|
30
|
+
*/
|
|
31
|
+
async sendCancel(executorUrl, delegationId) {
|
|
32
|
+
const cancelUrl = executorUrl.replace(/\/$/, '') + `/cancel/${delegationId}`;
|
|
33
|
+
const controller = new AbortController();
|
|
34
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
35
|
+
try {
|
|
36
|
+
const response = await fetch(cancelUrl, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: { 'Content-Type': 'application/json' },
|
|
39
|
+
signal: controller.signal,
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok && response.status !== 404) {
|
|
42
|
+
const text = await response.text().catch(() => '');
|
|
43
|
+
throw new Error(`Failed to cancel delegation: ${response.status}${text ? ` - ${text}` : ''}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
clearTimeout(timeoutId);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Internal send method
|
|
52
|
+
*/
|
|
53
|
+
async send(executorUrl, message) {
|
|
54
|
+
const controller = new AbortController();
|
|
55
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
56
|
+
try {
|
|
57
|
+
const response = await fetch(executorUrl, {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
headers: {
|
|
60
|
+
'Content-Type': 'application/json',
|
|
61
|
+
'X-AWCP-Callback-URL': this.callbackUrl,
|
|
62
|
+
},
|
|
63
|
+
body: JSON.stringify(message),
|
|
64
|
+
signal: controller.signal,
|
|
65
|
+
});
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
const text = await response.text().catch(() => '');
|
|
68
|
+
throw new Error(`Failed to send ${message.type} to executor: ${response.status} ${response.statusText}${text ? ` - ${text}` : ''}`);
|
|
69
|
+
}
|
|
70
|
+
return response;
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
clearTimeout(timeoutId);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=executor-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-client.js","sourceRoot":"","sources":["../../src/delegator/executor-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export view configuration
|
|
3
|
+
*/
|
|
4
|
+
export interface ExportConfig {
|
|
5
|
+
/** Base directory for export views (default: /tmp/awcp/exports) */
|
|
6
|
+
baseDir?: string;
|
|
7
|
+
/** Strategy for creating export view */
|
|
8
|
+
strategy?: 'symlink' | 'bind' | 'worktree';
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Export View Manager
|
|
12
|
+
*
|
|
13
|
+
* Creates isolated export views for each delegation.
|
|
14
|
+
* This prevents exposing real paths and enables cleanup.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ExportViewManager {
|
|
17
|
+
private config;
|
|
18
|
+
private exports;
|
|
19
|
+
constructor(config?: ExportConfig);
|
|
20
|
+
/**
|
|
21
|
+
* Create an export view for a delegation
|
|
22
|
+
*
|
|
23
|
+
* @returns The path to the export view (with trailing slash for SSHFS symlink compatibility)
|
|
24
|
+
*/
|
|
25
|
+
create(delegationId: string, localDir: string): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Cleanup an export view
|
|
28
|
+
*/
|
|
29
|
+
cleanup(delegationId: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Get the export path for a delegation
|
|
32
|
+
*/
|
|
33
|
+
getExportPath(delegationId: string): string | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Cleanup all export views
|
|
36
|
+
*/
|
|
37
|
+
cleanupAll(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Cleanup stale export directories from previous runs
|
|
40
|
+
*/
|
|
41
|
+
cleanupStaleExports(): Promise<number>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=export-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-view.d.ts","sourceRoot":"","sources":["../../src/delegator/export-view.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;CAC5C;AAOD;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAA6B;gBAEhC,MAAM,CAAC,EAAE,YAAY;IAIjC;;;;OAIG;IACG,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmCrE;;OAEG;IACG,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBlD;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;CAsB7C"}
|