@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,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":"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"}
@@ -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"}