@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,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admission control configuration
|
|
3
|
+
*/
|
|
4
|
+
export interface AdmissionConfig {
|
|
5
|
+
/** Maximum total bytes allowed (default: 100MB) */
|
|
6
|
+
maxTotalBytes?: number;
|
|
7
|
+
/** Maximum file count allowed (default: 10000) */
|
|
8
|
+
maxFileCount?: number;
|
|
9
|
+
/** Maximum single file size (default: 50MB) */
|
|
10
|
+
maxSingleFileBytes?: number;
|
|
11
|
+
/** Custom check function */
|
|
12
|
+
customCheck?: (localDir: string) => Promise<AdmissionResult>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Workspace statistics
|
|
16
|
+
*/
|
|
17
|
+
export interface WorkspaceStats {
|
|
18
|
+
estimatedBytes?: number;
|
|
19
|
+
fileCount?: number;
|
|
20
|
+
largestFileBytes?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Admission check result
|
|
24
|
+
*/
|
|
25
|
+
export interface AdmissionResult {
|
|
26
|
+
allowed: boolean;
|
|
27
|
+
stats?: WorkspaceStats;
|
|
28
|
+
hint?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Admission Controller
|
|
32
|
+
*
|
|
33
|
+
* Performs preflight checks on workspace before allowing delegation.
|
|
34
|
+
* This protects the network from being overwhelmed by large workspaces.
|
|
35
|
+
*/
|
|
36
|
+
export declare class AdmissionController {
|
|
37
|
+
private config;
|
|
38
|
+
constructor(config?: AdmissionConfig);
|
|
39
|
+
/**
|
|
40
|
+
* Check if a workspace is suitable for delegation
|
|
41
|
+
*/
|
|
42
|
+
check(localDir: string): Promise<AdmissionResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Estimate workspace statistics by recursively scanning the directory
|
|
45
|
+
*/
|
|
46
|
+
private estimateWorkspaceStats;
|
|
47
|
+
private formatBytes;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=admission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../../src/delegator/admission.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AASD;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,CAAC,EAAE,eAAe;IAIpC;;OAEG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAiDvD;;OAEG;YACW,sBAAsB;IA0CpC,OAAO,CAAC,WAAW;CAMpB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { stat, readdir } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Default thresholds
|
|
5
|
+
*/
|
|
6
|
+
const DEFAULT_MAX_TOTAL_BYTES = 100 * 1024 * 1024; // 100MB
|
|
7
|
+
const DEFAULT_MAX_FILE_COUNT = 10000;
|
|
8
|
+
const DEFAULT_MAX_SINGLE_FILE_BYTES = 50 * 1024 * 1024; // 50MB
|
|
9
|
+
/**
|
|
10
|
+
* Admission Controller
|
|
11
|
+
*
|
|
12
|
+
* Performs preflight checks on workspace before allowing delegation.
|
|
13
|
+
* This protects the network from being overwhelmed by large workspaces.
|
|
14
|
+
*/
|
|
15
|
+
export class AdmissionController {
|
|
16
|
+
config;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.config = config ?? {};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if a workspace is suitable for delegation
|
|
22
|
+
*/
|
|
23
|
+
async check(localDir) {
|
|
24
|
+
// If custom check is provided, use it
|
|
25
|
+
if (this.config.customCheck) {
|
|
26
|
+
return this.config.customCheck(localDir);
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const stats = await this.estimateWorkspaceStats(localDir);
|
|
30
|
+
const maxTotal = this.config.maxTotalBytes ?? DEFAULT_MAX_TOTAL_BYTES;
|
|
31
|
+
const maxCount = this.config.maxFileCount ?? DEFAULT_MAX_FILE_COUNT;
|
|
32
|
+
const maxSingle = this.config.maxSingleFileBytes ?? DEFAULT_MAX_SINGLE_FILE_BYTES;
|
|
33
|
+
// Check total size
|
|
34
|
+
if (stats.estimatedBytes && stats.estimatedBytes > maxTotal) {
|
|
35
|
+
return {
|
|
36
|
+
allowed: false,
|
|
37
|
+
stats,
|
|
38
|
+
hint: `Workspace size (${this.formatBytes(stats.estimatedBytes)}) exceeds limit (${this.formatBytes(maxTotal)}). Consider selecting a smaller subdirectory.`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Check file count
|
|
42
|
+
if (stats.fileCount && stats.fileCount > maxCount) {
|
|
43
|
+
return {
|
|
44
|
+
allowed: false,
|
|
45
|
+
stats,
|
|
46
|
+
hint: `File count (${stats.fileCount}) exceeds limit (${maxCount}). Consider excluding node_modules, build artifacts, or data directories.`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Check largest file
|
|
50
|
+
if (stats.largestFileBytes && stats.largestFileBytes > maxSingle) {
|
|
51
|
+
return {
|
|
52
|
+
allowed: false,
|
|
53
|
+
stats,
|
|
54
|
+
hint: `Largest file (${this.formatBytes(stats.largestFileBytes)}) exceeds limit (${this.formatBytes(maxSingle)}). Consider excluding large binary files.`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return { allowed: true, stats };
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// If we can't check, allow it (fail open for usability)
|
|
61
|
+
// Real implementations may want to fail closed
|
|
62
|
+
console.warn('Admission check failed, allowing by default:', error);
|
|
63
|
+
return { allowed: true };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Estimate workspace statistics by recursively scanning the directory
|
|
68
|
+
*/
|
|
69
|
+
async estimateWorkspaceStats(localDir) {
|
|
70
|
+
let totalBytes = 0;
|
|
71
|
+
let fileCount = 0;
|
|
72
|
+
let largestFileBytes = 0;
|
|
73
|
+
const scanDir = async (dir) => {
|
|
74
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
const fullPath = join(dir, entry.name);
|
|
77
|
+
if (entry.isDirectory()) {
|
|
78
|
+
// Skip common large directories that shouldn't be delegated
|
|
79
|
+
if (entry.name === 'node_modules' || entry.name === '.git') {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
await scanDir(fullPath);
|
|
83
|
+
}
|
|
84
|
+
else if (entry.isFile()) {
|
|
85
|
+
try {
|
|
86
|
+
const fileStat = await stat(fullPath);
|
|
87
|
+
const size = fileStat.size;
|
|
88
|
+
totalBytes += size;
|
|
89
|
+
fileCount++;
|
|
90
|
+
if (size > largestFileBytes) {
|
|
91
|
+
largestFileBytes = size;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Skip files we can't stat (permission issues, etc.)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
await scanDir(localDir);
|
|
101
|
+
return {
|
|
102
|
+
estimatedBytes: totalBytes,
|
|
103
|
+
fileCount,
|
|
104
|
+
largestFileBytes,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
formatBytes(bytes) {
|
|
108
|
+
if (bytes < 1024)
|
|
109
|
+
return `${bytes}B`;
|
|
110
|
+
if (bytes < 1024 * 1024)
|
|
111
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
112
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
113
|
+
return `${(bytes / 1024 / 1024).toFixed(1)}MB`;
|
|
114
|
+
return `${(bytes / 1024 / 1024 / 1024).toFixed(1)}GB`;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=admission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admission.js","sourceRoot":"","sources":["../../src/delegator/admission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAkCjC;;GAEG;AACH,MAAM,uBAAuB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AAC3D,MAAM,sBAAsB,GAAG,KAAK,CAAC;AACrC,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAE/D;;;;;GAKG;AACH,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAkB;IAEhC,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,QAAgB;QAC1B,sCAAsC;QACtC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YAE1D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,uBAAuB,CAAC;YACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,sBAAsB,CAAC;YACpE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,6BAA6B,CAAC;YAElF,mBAAmB;YACnB,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,GAAG,QAAQ,EAAE,CAAC;gBAC5D,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK;oBACL,IAAI,EAAE,mBAAmB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,+CAA+C;iBAC7J,CAAC;YACJ,CAAC;YAED,mBAAmB;YACnB,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC;gBAClD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK;oBACL,IAAI,EAAE,eAAe,KAAK,CAAC,SAAS,oBAAoB,QAAQ,2EAA2E;iBAC5I,CAAC;YACJ,CAAC;YAED,qBAAqB;YACrB,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,GAAG,SAAS,EAAE,CAAC;gBACjE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK;oBACL,IAAI,EAAE,iBAAiB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAgB,CAAC,oBAAoB,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,2CAA2C;iBAC1J,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wDAAwD;YACxD,+CAA+C;YAC/C,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;YACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB,CAAC,QAAgB;QACnD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,gBAAgB,GAAG,CAAC,CAAC;QAEzB,MAAM,OAAO,GAAG,KAAK,EAAE,GAAW,EAAiB,EAAE;YACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,4DAA4D;oBAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC3D,SAAS;oBACX,CAAC;oBACD,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC1B,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;wBACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;wBAC3B,UAAU,IAAI,IAAI,CAAC;wBACnB,SAAS,EAAE,CAAC;wBACZ,IAAI,IAAI,GAAG,gBAAgB,EAAE,CAAC;4BAC5B,gBAAgB,GAAG,IAAI,CAAC;wBAC1B,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,qDAAqD;oBACvD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;QAExB,OAAO;YACL,cAAc,EAAE,UAAU;YAC1B,SAAS;YACT,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,IAAI,KAAK,GAAG,IAAI;YAAE,OAAO,GAAG,KAAK,GAAG,CAAC;QACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;YAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;YAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;CACF"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegator Daemon Client
|
|
3
|
+
*
|
|
4
|
+
* HTTP client for interacting with a running Delegator Daemon.
|
|
5
|
+
* Use this from MCP servers, CLI tools, or other applications.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { DelegatorDaemonClient } from '@awcp/sdk/delegator/bin/client';
|
|
10
|
+
*
|
|
11
|
+
* const client = new DelegatorDaemonClient('http://localhost:3100');
|
|
12
|
+
*
|
|
13
|
+
* // Create delegation
|
|
14
|
+
* const result = await client.delegate({
|
|
15
|
+
* executorUrl: 'http://executor:4001/awcp',
|
|
16
|
+
* localDir: '/path/to/project',
|
|
17
|
+
* task: { description: 'Fix bug', prompt: '...' },
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // Check status
|
|
21
|
+
* const delegation = await client.getDelegation(result.delegationId);
|
|
22
|
+
*
|
|
23
|
+
* // List all
|
|
24
|
+
* const all = await client.listDelegations();
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
import type { Delegation, TaskSpec, AccessMode, AuthCredential } from '@awcp/core';
|
|
28
|
+
/**
|
|
29
|
+
* Parameters for creating a delegation
|
|
30
|
+
*/
|
|
31
|
+
export interface DelegateRequest {
|
|
32
|
+
/** URL of the Executor's AWCP endpoint */
|
|
33
|
+
executorUrl: string;
|
|
34
|
+
/** Local directory to delegate */
|
|
35
|
+
localDir: string;
|
|
36
|
+
/** Task specification */
|
|
37
|
+
task: TaskSpec;
|
|
38
|
+
/** TTL in seconds (uses default if not specified) */
|
|
39
|
+
ttlSeconds?: number;
|
|
40
|
+
/** Access mode (uses default if not specified) */
|
|
41
|
+
accessMode?: AccessMode;
|
|
42
|
+
/**
|
|
43
|
+
* Optional authentication for paid/restricted Executor services.
|
|
44
|
+
* This will be included in the INVITE message.
|
|
45
|
+
*/
|
|
46
|
+
auth?: AuthCredential;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Response from creating a delegation
|
|
50
|
+
*/
|
|
51
|
+
export interface DelegateResponse {
|
|
52
|
+
delegationId: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* List delegations response
|
|
56
|
+
*/
|
|
57
|
+
export interface ListDelegationsResponse {
|
|
58
|
+
activeDelegations: number;
|
|
59
|
+
delegations: Array<{
|
|
60
|
+
id: string;
|
|
61
|
+
state: string;
|
|
62
|
+
executorUrl: string;
|
|
63
|
+
localDir: string;
|
|
64
|
+
createdAt: string;
|
|
65
|
+
}>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* HTTP client for Delegator Daemon
|
|
69
|
+
*/
|
|
70
|
+
export declare class DelegatorDaemonClient {
|
|
71
|
+
private baseUrl;
|
|
72
|
+
private timeout;
|
|
73
|
+
constructor(daemonUrl: string, options?: {
|
|
74
|
+
timeout?: number;
|
|
75
|
+
});
|
|
76
|
+
/**
|
|
77
|
+
* Create a new delegation
|
|
78
|
+
*/
|
|
79
|
+
delegate(params: DelegateRequest): Promise<DelegateResponse>;
|
|
80
|
+
/**
|
|
81
|
+
* Get a delegation by ID
|
|
82
|
+
*/
|
|
83
|
+
getDelegation(delegationId: string): Promise<Delegation>;
|
|
84
|
+
/**
|
|
85
|
+
* List all delegations
|
|
86
|
+
*/
|
|
87
|
+
listDelegations(): Promise<ListDelegationsResponse>;
|
|
88
|
+
/**
|
|
89
|
+
* Cancel a delegation
|
|
90
|
+
*/
|
|
91
|
+
cancelDelegation(delegationId: string): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Wait for a delegation to complete
|
|
94
|
+
*/
|
|
95
|
+
waitForCompletion(delegationId: string, pollIntervalMs?: number, timeoutMs?: number): Promise<Delegation>;
|
|
96
|
+
/**
|
|
97
|
+
* Health check
|
|
98
|
+
*/
|
|
99
|
+
health(): Promise<boolean>;
|
|
100
|
+
private request;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/delegator/bin/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEnF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;gBAEZ,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAK7D;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQlE;;OAEG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAI9D;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAIzD;;OAEG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D;;OAEG;IACG,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,cAAc,GAAE,MAAa,EAC7B,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,UAAU,CAAC;IAoBtB;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;YASlB,OAAO;CA+BtB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegator Daemon Client
|
|
3
|
+
*
|
|
4
|
+
* HTTP client for interacting with a running Delegator Daemon.
|
|
5
|
+
* Use this from MCP servers, CLI tools, or other applications.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { DelegatorDaemonClient } from '@awcp/sdk/delegator/bin/client';
|
|
10
|
+
*
|
|
11
|
+
* const client = new DelegatorDaemonClient('http://localhost:3100');
|
|
12
|
+
*
|
|
13
|
+
* // Create delegation
|
|
14
|
+
* const result = await client.delegate({
|
|
15
|
+
* executorUrl: 'http://executor:4001/awcp',
|
|
16
|
+
* localDir: '/path/to/project',
|
|
17
|
+
* task: { description: 'Fix bug', prompt: '...' },
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // Check status
|
|
21
|
+
* const delegation = await client.getDelegation(result.delegationId);
|
|
22
|
+
*
|
|
23
|
+
* // List all
|
|
24
|
+
* const all = await client.listDelegations();
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* HTTP client for Delegator Daemon
|
|
29
|
+
*/
|
|
30
|
+
export class DelegatorDaemonClient {
|
|
31
|
+
baseUrl;
|
|
32
|
+
timeout;
|
|
33
|
+
constructor(daemonUrl, options) {
|
|
34
|
+
this.baseUrl = daemonUrl.replace(/\/$/, '');
|
|
35
|
+
this.timeout = options?.timeout ?? 30000;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a new delegation
|
|
39
|
+
*/
|
|
40
|
+
async delegate(params) {
|
|
41
|
+
const response = await this.request('/delegate', {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
body: params,
|
|
44
|
+
});
|
|
45
|
+
return response;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get a delegation by ID
|
|
49
|
+
*/
|
|
50
|
+
async getDelegation(delegationId) {
|
|
51
|
+
return this.request(`/delegation/${delegationId}`);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* List all delegations
|
|
55
|
+
*/
|
|
56
|
+
async listDelegations() {
|
|
57
|
+
return this.request('/delegations');
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Cancel a delegation
|
|
61
|
+
*/
|
|
62
|
+
async cancelDelegation(delegationId) {
|
|
63
|
+
await this.request(`/delegation/${delegationId}`, { method: 'DELETE' });
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Wait for a delegation to complete
|
|
67
|
+
*/
|
|
68
|
+
async waitForCompletion(delegationId, pollIntervalMs = 1000, timeoutMs = 60000) {
|
|
69
|
+
const startTime = Date.now();
|
|
70
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
71
|
+
const delegation = await this.getDelegation(delegationId);
|
|
72
|
+
if (delegation.state === 'completed' ||
|
|
73
|
+
delegation.state === 'error' ||
|
|
74
|
+
delegation.state === 'cancelled') {
|
|
75
|
+
return delegation;
|
|
76
|
+
}
|
|
77
|
+
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
78
|
+
}
|
|
79
|
+
throw new Error(`Timeout waiting for delegation ${delegationId} to complete`);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Health check
|
|
83
|
+
*/
|
|
84
|
+
async health() {
|
|
85
|
+
try {
|
|
86
|
+
await this.request('/health');
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async request(path, options) {
|
|
94
|
+
const controller = new AbortController();
|
|
95
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
96
|
+
try {
|
|
97
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
98
|
+
method: options?.method ?? 'GET',
|
|
99
|
+
headers: options?.body ? { 'Content-Type': 'application/json' } : {},
|
|
100
|
+
body: options?.body ? JSON.stringify(options.body) : undefined,
|
|
101
|
+
signal: controller.signal,
|
|
102
|
+
});
|
|
103
|
+
if (!response.ok) {
|
|
104
|
+
const errorBody = await response.json().catch(() => ({}));
|
|
105
|
+
const message = errorBody.error ?? `HTTP ${response.status}: ${response.statusText}`;
|
|
106
|
+
const hint = errorBody.hint;
|
|
107
|
+
throw new Error(hint ? `${message} - ${hint}` : message);
|
|
108
|
+
}
|
|
109
|
+
return response.json();
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
clearTimeout(timeoutId);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/delegator/bin/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
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 { DelegatorService } from '../service.js';
|
|
15
|
+
import type { DelegatorConfig } from '../config.js';
|
|
16
|
+
/**
|
|
17
|
+
* Daemon configuration
|
|
18
|
+
*/
|
|
19
|
+
export interface DaemonConfig {
|
|
20
|
+
/** Port to listen on (default: 3100) */
|
|
21
|
+
port?: number;
|
|
22
|
+
/** Host to bind to (default: 'localhost') */
|
|
23
|
+
host?: string;
|
|
24
|
+
/** Delegator configuration */
|
|
25
|
+
delegator: DelegatorConfig;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Running daemon instance
|
|
29
|
+
*/
|
|
30
|
+
export interface DaemonInstance {
|
|
31
|
+
/** Stop the daemon */
|
|
32
|
+
stop: () => Promise<void>;
|
|
33
|
+
/** Get the service instance */
|
|
34
|
+
service: DelegatorService;
|
|
35
|
+
/** Get the base URL */
|
|
36
|
+
url: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Start the Delegator Daemon
|
|
40
|
+
*
|
|
41
|
+
* This starts an HTTP server that provides:
|
|
42
|
+
* - POST /delegate - Create a new delegation
|
|
43
|
+
* - GET /delegations - List all delegations
|
|
44
|
+
* - GET /delegation/:id - Get delegation status
|
|
45
|
+
* - DELETE /delegation/:id - Cancel a delegation
|
|
46
|
+
* - POST /callback - Receive messages from Executor
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const daemon = await startDelegatorDaemon({
|
|
51
|
+
* port: 3100,
|
|
52
|
+
* delegator: {
|
|
53
|
+
* export: { baseDir: '/tmp/awcp/exports' },
|
|
54
|
+
* ssh: { host: 'localhost', user: 'awcp' },
|
|
55
|
+
* },
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* // Create delegation via HTTP
|
|
59
|
+
* const response = await fetch('http://localhost:3100/delegate', {
|
|
60
|
+
* method: 'POST',
|
|
61
|
+
* headers: { 'Content-Type': 'application/json' },
|
|
62
|
+
* body: JSON.stringify({
|
|
63
|
+
* executorUrl: 'http://executor:4001/awcp',
|
|
64
|
+
* localDir: '/path/to/project',
|
|
65
|
+
* task: { description: 'Fix bug', prompt: '...' },
|
|
66
|
+
* }),
|
|
67
|
+
* });
|
|
68
|
+
*
|
|
69
|
+
* // Stop daemon
|
|
70
|
+
* await daemon.stop();
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function startDelegatorDaemon(config: DaemonConfig): Promise<DaemonInstance>;
|
|
74
|
+
/**
|
|
75
|
+
* CLI entry point
|
|
76
|
+
*/
|
|
77
|
+
export declare function main(): Promise<void>;
|
|
78
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/delegator/bin/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,gBAAgB,EAAgC,MAAM,eAAe,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sBAAsB;IACtB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,+BAA+B;IAC/B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAwJxF;AAED;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAmD1C"}
|