@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.
Files changed (69) hide show
  1. package/dist/delegator/admission.d.ts +49 -0
  2. package/dist/delegator/admission.d.ts.map +1 -0
  3. package/dist/delegator/admission.js +117 -0
  4. package/dist/delegator/admission.js.map +1 -0
  5. package/dist/delegator/bin/client.d.ts +102 -0
  6. package/dist/delegator/bin/client.d.ts.map +1 -0
  7. package/dist/delegator/bin/client.js +116 -0
  8. package/dist/delegator/bin/client.js.map +1 -0
  9. package/dist/delegator/bin/daemon.d.ts +78 -0
  10. package/dist/delegator/bin/daemon.d.ts.map +1 -0
  11. package/dist/delegator/bin/daemon.js +245 -0
  12. package/dist/delegator/bin/daemon.js.map +1 -0
  13. package/dist/delegator/config.d.ts +168 -0
  14. package/dist/delegator/config.d.ts.map +1 -0
  15. package/dist/delegator/config.js +54 -0
  16. package/dist/delegator/config.js.map +1 -0
  17. package/dist/delegator/executor-client.d.ts +36 -0
  18. package/dist/delegator/executor-client.d.ts.map +1 -0
  19. package/dist/delegator/executor-client.js +77 -0
  20. package/dist/delegator/executor-client.js.map +1 -0
  21. package/dist/delegator/export-view.d.ts +43 -0
  22. package/dist/delegator/export-view.d.ts.map +1 -0
  23. package/dist/delegator/export-view.js +108 -0
  24. package/dist/delegator/export-view.js.map +1 -0
  25. package/dist/delegator/index.d.ts +8 -0
  26. package/dist/delegator/index.d.ts.map +1 -0
  27. package/dist/delegator/index.js +11 -0
  28. package/dist/delegator/index.js.map +1 -0
  29. package/dist/delegator/service.d.ts +120 -0
  30. package/dist/delegator/service.d.ts.map +1 -0
  31. package/dist/delegator/service.js +323 -0
  32. package/dist/delegator/service.js.map +1 -0
  33. package/dist/executor/config.d.ts +126 -0
  34. package/dist/executor/config.d.ts.map +1 -0
  35. package/dist/executor/config.js +38 -0
  36. package/dist/executor/config.js.map +1 -0
  37. package/dist/executor/delegator-client.d.ts +18 -0
  38. package/dist/executor/delegator-client.d.ts.map +1 -0
  39. package/dist/executor/delegator-client.js +37 -0
  40. package/dist/executor/delegator-client.js.map +1 -0
  41. package/dist/executor/index.d.ts +5 -0
  42. package/dist/executor/index.d.ts.map +1 -0
  43. package/dist/executor/index.js +7 -0
  44. package/dist/executor/index.js.map +1 -0
  45. package/dist/executor/policy.d.ts +55 -0
  46. package/dist/executor/policy.d.ts.map +1 -0
  47. package/dist/executor/policy.js +100 -0
  48. package/dist/executor/policy.js.map +1 -0
  49. package/dist/executor/service.d.ts +84 -0
  50. package/dist/executor/service.d.ts.map +1 -0
  51. package/dist/executor/service.js +322 -0
  52. package/dist/executor/service.js.map +1 -0
  53. package/dist/index.d.ts +9 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +28 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/server/express/awcp-delegator-handler.d.ts +67 -0
  58. package/dist/server/express/awcp-delegator-handler.d.ts.map +1 -0
  59. package/dist/server/express/awcp-delegator-handler.js +99 -0
  60. package/dist/server/express/awcp-delegator-handler.js.map +1 -0
  61. package/dist/server/express/awcp-executor-handler.d.ts +47 -0
  62. package/dist/server/express/awcp-executor-handler.d.ts.map +1 -0
  63. package/dist/server/express/awcp-executor-handler.js +104 -0
  64. package/dist/server/express/awcp-executor-handler.js.map +1 -0
  65. package/dist/server/express/index.d.ts +6 -0
  66. package/dist/server/express/index.d.ts.map +1 -0
  67. package/dist/server/express/index.js +8 -0
  68. package/dist/server/express/index.js.map +1 -0
  69. 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":"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"}
@@ -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":"AAAA;;GAEG;AASH;;GAEG;AACH,MAAM,OAAO,cAAc;IACjB,OAAO,CAAS;IAChB,WAAW,CAAS;IAE5B,YAAY,OAAkD;QAC5D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,OAAoB;QACxD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAsB,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,WAAmB,EAAE,OAAoB;QACvD,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,YAAoB;QACxD,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,WAAW,YAAY,EAAE,CAAC;QAC7E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;gBACtC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,IAAI,CAAC,WAAmB,EAAE,OAAoB;QAC1D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE;gBACxC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,qBAAqB,EAAE,IAAI,CAAC,WAAW;iBACxC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM,IAAI,KAAK,CACb,kBAAkB,OAAO,CAAC,IAAI,iBAAiB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACnH,CAAC;YACJ,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;CACF"}
@@ -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"}