@awcp/sdk 0.0.8 → 0.0.10
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 +8 -15
- package/dist/delegator/admission.d.ts.map +1 -1
- package/dist/delegator/admission.js +15 -36
- package/dist/delegator/admission.js.map +1 -1
- package/dist/delegator/bin/client.d.ts +8 -9
- package/dist/delegator/bin/client.d.ts.map +1 -1
- package/dist/delegator/bin/client.js +3 -1
- package/dist/delegator/bin/client.js.map +1 -1
- package/dist/delegator/bin/daemon.js +9 -9
- package/dist/delegator/bin/daemon.js.map +1 -1
- package/dist/delegator/config.d.ts +24 -28
- package/dist/delegator/config.d.ts.map +1 -1
- package/dist/delegator/config.js +24 -23
- package/dist/delegator/config.js.map +1 -1
- package/dist/delegator/environment-builder.d.ts +37 -0
- package/dist/delegator/environment-builder.d.ts.map +1 -0
- package/dist/delegator/environment-builder.js +67 -0
- package/dist/delegator/environment-builder.js.map +1 -0
- package/dist/delegator/executor-client.js +1 -1
- package/dist/delegator/executor-client.js.map +1 -1
- package/dist/delegator/index.d.ts +5 -4
- package/dist/delegator/index.d.ts.map +1 -1
- package/dist/delegator/index.js +4 -3
- package/dist/delegator/index.js.map +1 -1
- package/dist/delegator/resource-adapters/fs-adapter.d.ts +8 -0
- package/dist/delegator/resource-adapters/fs-adapter.d.ts.map +1 -0
- package/dist/delegator/resource-adapters/fs-adapter.js +14 -0
- package/dist/delegator/resource-adapters/fs-adapter.js.map +1 -0
- package/dist/delegator/resource-adapters/index.d.ts +4 -0
- package/dist/delegator/resource-adapters/index.d.ts.map +1 -0
- package/dist/delegator/resource-adapters/index.js +3 -0
- package/dist/delegator/resource-adapters/index.js.map +1 -0
- package/dist/delegator/resource-adapters/registry.d.ts +8 -0
- package/dist/delegator/resource-adapters/registry.d.ts.map +1 -0
- package/dist/delegator/resource-adapters/registry.js +17 -0
- package/dist/delegator/resource-adapters/registry.js.map +1 -0
- package/dist/delegator/resource-adapters/types.d.ts +7 -0
- package/dist/delegator/resource-adapters/types.d.ts.map +1 -0
- package/dist/delegator/resource-adapters/types.js +2 -0
- package/dist/delegator/resource-adapters/types.js.map +1 -0
- package/dist/delegator/service.d.ts +7 -21
- package/dist/delegator/service.d.ts.map +1 -1
- package/dist/delegator/service.js +69 -72
- package/dist/delegator/service.js.map +1 -1
- package/dist/executor/a2a-adapter.d.ts +14 -0
- package/dist/executor/a2a-adapter.d.ts.map +1 -0
- package/dist/executor/a2a-adapter.js +66 -0
- package/dist/executor/a2a-adapter.js.map +1 -0
- package/dist/executor/config.d.ts +6 -6
- package/dist/executor/config.d.ts.map +1 -1
- package/dist/executor/config.js +1 -0
- package/dist/executor/config.js.map +1 -1
- package/dist/executor/index.d.ts +2 -1
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +1 -2
- package/dist/executor/index.js.map +1 -1
- package/dist/executor/service.d.ts +3 -14
- package/dist/executor/service.d.ts.map +1 -1
- package/dist/executor/service.js +13 -55
- package/dist/executor/service.js.map +1 -1
- package/dist/executor/workspace-manager.d.ts +0 -10
- package/dist/executor/workspace-manager.d.ts.map +1 -1
- package/dist/executor/workspace-manager.js +8 -27
- package/dist/executor/workspace-manager.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -22
- package/dist/index.js.map +1 -1
- package/dist/listener/http-listener.d.ts +18 -0
- package/dist/listener/http-listener.d.ts.map +1 -0
- package/dist/listener/http-listener.js +80 -0
- package/dist/listener/http-listener.js.map +1 -0
- package/dist/listener/index.d.ts +6 -0
- package/dist/listener/index.d.ts.map +1 -0
- package/dist/listener/index.js +6 -0
- package/dist/listener/index.js.map +1 -0
- package/dist/listener/websocket-tunnel-listener.d.ts +36 -0
- package/dist/listener/websocket-tunnel-listener.d.ts.map +1 -0
- package/dist/listener/websocket-tunnel-listener.js +187 -0
- package/dist/listener/websocket-tunnel-listener.js.map +1 -0
- package/dist/server/express/awcp-executor-handler.d.ts +11 -11
- package/dist/server/express/awcp-executor-handler.d.ts.map +1 -1
- package/dist/server/express/awcp-executor-handler.js +43 -81
- package/dist/server/express/awcp-executor-handler.js.map +1 -1
- package/dist/utils/fs-helpers.d.ts +17 -0
- package/dist/utils/fs-helpers.d.ts.map +1 -0
- package/dist/utils/fs-helpers.js +34 -0
- package/dist/utils/fs-helpers.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/resolve-workdir.d.ts +21 -0
- package/dist/utils/resolve-workdir.d.ts.map +1 -0
- package/dist/utils/resolve-workdir.js +30 -0
- package/dist/utils/resolve-workdir.js.map +1 -0
- package/package.json +7 -3
- package/dist/delegator/export-manager.d.ts +0 -27
- package/dist/delegator/export-manager.d.ts.map +0 -1
- package/dist/delegator/export-manager.js +0 -85
- package/dist/delegator/export-manager.js.map +0 -1
- package/dist/delegator/export-view.d.ts +0 -43
- package/dist/delegator/export-view.d.ts.map +0 -1
- package/dist/delegator/export-view.js +0 -108
- package/dist/delegator/export-view.js.map +0 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Builder - builds environment directories for delegation
|
|
3
|
+
*/
|
|
4
|
+
import { mkdir, rm, writeFile } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { ResourceAdapterRegistry, FsResourceAdapter } from './resource-adapters/index.js';
|
|
7
|
+
import { cleanupStaleDirectories } from '../utils/index.js';
|
|
8
|
+
const DEFAULT_ENV_BASE = '/tmp/awcp/environments';
|
|
9
|
+
export class EnvironmentBuilder {
|
|
10
|
+
baseDir;
|
|
11
|
+
adapters;
|
|
12
|
+
environments = new Map();
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.baseDir = config?.baseDir ?? DEFAULT_ENV_BASE;
|
|
15
|
+
this.adapters = new ResourceAdapterRegistry();
|
|
16
|
+
this.adapters.register(new FsResourceAdapter());
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Build an environment directory from spec.
|
|
20
|
+
* Returns envRoot with trailing slash for SSHFS compatibility.
|
|
21
|
+
*/
|
|
22
|
+
async build(delegationId, spec) {
|
|
23
|
+
const envRoot = join(this.baseDir, delegationId);
|
|
24
|
+
await mkdir(envRoot, { recursive: true });
|
|
25
|
+
for (const resource of spec.resources) {
|
|
26
|
+
const targetPath = join(envRoot, resource.name);
|
|
27
|
+
const adapter = this.adapters.get(resource.type);
|
|
28
|
+
await adapter.materialize(resource, targetPath);
|
|
29
|
+
}
|
|
30
|
+
const manifest = {
|
|
31
|
+
version: '1',
|
|
32
|
+
delegationId,
|
|
33
|
+
createdAt: new Date().toISOString(),
|
|
34
|
+
resources: spec.resources.map(r => ({
|
|
35
|
+
name: r.name,
|
|
36
|
+
type: r.type,
|
|
37
|
+
source: r.source,
|
|
38
|
+
mode: r.mode,
|
|
39
|
+
})),
|
|
40
|
+
};
|
|
41
|
+
const awcpDir = join(envRoot, '.awcp');
|
|
42
|
+
await mkdir(awcpDir, { recursive: true });
|
|
43
|
+
await writeFile(join(awcpDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
|
|
44
|
+
const result = { envRoot: `${envRoot}/`, manifest };
|
|
45
|
+
this.environments.set(delegationId, result);
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
get(delegationId) {
|
|
49
|
+
return this.environments.get(delegationId);
|
|
50
|
+
}
|
|
51
|
+
async release(delegationId) {
|
|
52
|
+
const env = this.environments.get(delegationId);
|
|
53
|
+
if (!env)
|
|
54
|
+
return;
|
|
55
|
+
try {
|
|
56
|
+
await rm(env.envRoot, { recursive: true, force: true });
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Directory may already be removed
|
|
60
|
+
}
|
|
61
|
+
this.environments.delete(delegationId);
|
|
62
|
+
}
|
|
63
|
+
async cleanupStale() {
|
|
64
|
+
return cleanupStaleDirectories(this.baseDir, new Set(this.environments.keys()));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=environment-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-builder.js","sourceRoot":"","sources":["../../src/delegator/environment-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAuBlD,MAAM,OAAO,kBAAkB;IACrB,OAAO,CAAS;IAChB,QAAQ,CAA0B;IAClC,YAAY,GAAG,IAAI,GAAG,EAAkC,CAAC;IAEjE,YAAY,MAAiC;QAC3C,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,gBAAgB,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,YAAoB,EAAE,IAAqB;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,QAAQ,GAAwB;YACpC,OAAO,EAAE,GAAG;YACZ,YAAY;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC;SACJ,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnF,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG,EAAE,QAAQ,EAAE,CAAC;QACpD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,YAAoB;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,YAAoB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,uBAAuB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;CACF"}
|
|
@@ -40,7 +40,7 @@ export class ExecutorClient {
|
|
|
40
40
|
retries++;
|
|
41
41
|
if (retries >= this.sseMaxRetries)
|
|
42
42
|
throw error;
|
|
43
|
-
console.log(`[AWCP] SSE retry ${retries}/${this.sseMaxRetries} for ${delegationId}`);
|
|
43
|
+
console.log(`[AWCP:Client] SSE retry ${retries}/${this.sseMaxRetries} for ${delegationId}`);
|
|
44
44
|
await new Promise(r => setTimeout(r, this.sseRetryDelayMs * retries));
|
|
45
45
|
}
|
|
46
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor-client.js","sourceRoot":"","sources":["../../src/delegator/executor-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,MAAM,OAAO,cAAc;IACjB,OAAO,CAAS;IAChB,aAAa,CAAS;IACtB,eAAe,CAAS;IAEhC,YAAY,OAA+B;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC;IAC1D,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,CAAC,aAAa,CAAC,WAAmB,EAAE,YAAoB;QAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,GAAG,OAAO,eAAe,YAAY,SAAS,CAAC;QAE3D,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACzB,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,IAAI,OAAO,IAAI,IAAI,CAAC,aAAa;oBAAE,MAAM,KAAK,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"executor-client.js","sourceRoot":"","sources":["../../src/delegator/executor-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export { DelegatorService, type DelegatorServiceOptions
|
|
2
|
-
export { type DelegatorConfig, type
|
|
1
|
+
export { DelegatorService, type DelegatorServiceOptions } from './service.js';
|
|
2
|
+
export { type DelegatorConfig, type EnvironmentConfig, type AdmissionConfig, type DelegationDefaults, type DelegatorHooks, type ResolvedDelegatorConfig, DEFAULT_DELEGATOR_CONFIG, DEFAULT_ADMISSION, DEFAULT_DELEGATION, resolveDelegatorConfig, } from './config.js';
|
|
3
3
|
export { startDelegatorDaemon, type DaemonConfig, type DaemonInstance, } from './bin/daemon.js';
|
|
4
4
|
export { DelegatorDaemonClient, type DelegateRequest, type DelegateResponse, type ListDelegationsResponse, } from './bin/client.js';
|
|
5
|
-
export { AdmissionController, type
|
|
6
|
-
export {
|
|
5
|
+
export { AdmissionController, type AdmissionResult, type WorkspaceStats } from './admission.js';
|
|
6
|
+
export { EnvironmentBuilder, type EnvironmentManifest, type EnvironmentBuildResult, type EnvironmentBuilderConfig } from './environment-builder.js';
|
|
7
7
|
export { ExecutorClient, type InviteResponse } from './executor-client.js';
|
|
8
|
+
export { type ResourceAdapter, ResourceAdapterRegistry, FsResourceAdapter } from './resource-adapters/index.js';
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/delegator/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/delegator/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,KAAK,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpJ,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,KAAK,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC"}
|
package/dist/delegator/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// High-level API
|
|
2
|
-
export { DelegatorService
|
|
3
|
-
export { DEFAULT_DELEGATOR_CONFIG, resolveDelegatorConfig, } from './config.js';
|
|
2
|
+
export { DelegatorService } from './service.js';
|
|
3
|
+
export { DEFAULT_DELEGATOR_CONFIG, DEFAULT_ADMISSION, DEFAULT_DELEGATION, resolveDelegatorConfig, } from './config.js';
|
|
4
4
|
// Daemon mode
|
|
5
5
|
export { startDelegatorDaemon, } from './bin/daemon.js';
|
|
6
6
|
export { DelegatorDaemonClient, } from './bin/client.js';
|
|
7
7
|
// Utilities
|
|
8
8
|
export { AdmissionController } from './admission.js';
|
|
9
|
-
export {
|
|
9
|
+
export { EnvironmentBuilder } from './environment-builder.js';
|
|
10
10
|
export { ExecutorClient } from './executor-client.js';
|
|
11
|
+
export { ResourceAdapterRegistry, FsResourceAdapter } from './resource-adapters/index.js';
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/delegator/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/delegator/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,OAAO,EAAE,gBAAgB,EAAgC,MAAM,cAAc,CAAC;AAC9E,OAAO,EAOL,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAErB,cAAc;AACd,OAAO,EACL,oBAAoB,GAGrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,GAItB,MAAM,iBAAiB,CAAC;AAEzB,YAAY;AACZ,OAAO,EAAE,mBAAmB,EAA6C,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAwF,MAAM,0BAA0B,CAAC;AACpJ,OAAO,EAAE,cAAc,EAAuB,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAwB,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ResourceSpec } from '@awcp/core';
|
|
2
|
+
import type { ResourceAdapter } from './types.js';
|
|
3
|
+
export declare class FsResourceAdapter implements ResourceAdapter {
|
|
4
|
+
readonly type = "fs";
|
|
5
|
+
materialize(spec: ResourceSpec, targetPath: string): Promise<void>;
|
|
6
|
+
apply(sourcePath: string, targetPath: string): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=fs-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-adapter.d.ts","sourceRoot":"","sources":["../../../src/delegator/resource-adapters/fs-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,qBAAa,iBAAkB,YAAW,eAAe;IACvD,QAAQ,CAAC,IAAI,QAAQ;IAEf,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAInE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { mkdir, symlink, cp, rm } from 'node:fs/promises';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
export class FsResourceAdapter {
|
|
4
|
+
type = 'fs';
|
|
5
|
+
async materialize(spec, targetPath) {
|
|
6
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
7
|
+
await symlink(spec.source, targetPath);
|
|
8
|
+
}
|
|
9
|
+
async apply(sourcePath, targetPath) {
|
|
10
|
+
await rm(targetPath, { recursive: true, force: true });
|
|
11
|
+
await cp(sourcePath, targetPath, { recursive: true, dereference: true });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=fs-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-adapter.js","sourceRoot":"","sources":["../../../src/delegator/resource-adapters/fs-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,IAAI,CAAC;IAErB,KAAK,CAAC,WAAW,CAAC,IAAkB,EAAE,UAAkB;QACtD,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,UAAkB;QAChD,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/delegator/resource-adapters/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/delegator/resource-adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ResourceAdapter } from './types.js';
|
|
2
|
+
export declare class ResourceAdapterRegistry {
|
|
3
|
+
private adapters;
|
|
4
|
+
register(adapter: ResourceAdapter): void;
|
|
5
|
+
get(type: string): ResourceAdapter;
|
|
6
|
+
has(type: string): boolean;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/delegator/resource-adapters/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAsC;IAEtD,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAIxC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IAQlC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG3B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class ResourceAdapterRegistry {
|
|
2
|
+
adapters = new Map();
|
|
3
|
+
register(adapter) {
|
|
4
|
+
this.adapters.set(adapter.type, adapter);
|
|
5
|
+
}
|
|
6
|
+
get(type) {
|
|
7
|
+
const adapter = this.adapters.get(type);
|
|
8
|
+
if (!adapter) {
|
|
9
|
+
throw new Error(`Unknown resource type: ${type}`);
|
|
10
|
+
}
|
|
11
|
+
return adapter;
|
|
12
|
+
}
|
|
13
|
+
has(type) {
|
|
14
|
+
return this.adapters.has(type);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/delegator/resource-adapters/registry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,uBAAuB;IAC1B,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEtD,QAAQ,CAAC,OAAwB;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,IAAY;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ResourceSpec } from '@awcp/core';
|
|
2
|
+
export interface ResourceAdapter {
|
|
3
|
+
readonly type: string;
|
|
4
|
+
materialize(spec: ResourceSpec, targetPath: string): Promise<void>;
|
|
5
|
+
apply(sourcePath: string, targetPath: string): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/delegator/resource-adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/delegator/resource-adapters/types.ts"],"names":[],"mappings":""}
|
|
@@ -3,34 +3,16 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Manages the AWCP delegation protocol on the Delegator side.
|
|
5
5
|
*/
|
|
6
|
-
import { type Delegation, type
|
|
6
|
+
import { type Delegation, type AcceptMessage, type DoneMessage, type ErrorMessage, type AwcpMessage, type DelegatorServiceStatus, type DelegatorRequestHandler, type DelegateParams } from '@awcp/core';
|
|
7
7
|
import { type DelegatorConfig } from './config.js';
|
|
8
|
-
export interface DelegateParams {
|
|
9
|
-
executorUrl: string;
|
|
10
|
-
localDir: string;
|
|
11
|
-
task: TaskSpec;
|
|
12
|
-
ttlSeconds?: number;
|
|
13
|
-
accessMode?: AccessMode;
|
|
14
|
-
auth?: AuthCredential;
|
|
15
|
-
}
|
|
16
|
-
export interface DelegatorServiceStatus {
|
|
17
|
-
activeDelegations: number;
|
|
18
|
-
delegations: Array<{
|
|
19
|
-
id: string;
|
|
20
|
-
state: string;
|
|
21
|
-
executorUrl: string;
|
|
22
|
-
localDir: string;
|
|
23
|
-
createdAt: string;
|
|
24
|
-
}>;
|
|
25
|
-
}
|
|
26
8
|
export interface DelegatorServiceOptions {
|
|
27
9
|
config: DelegatorConfig;
|
|
28
10
|
}
|
|
29
|
-
export declare class DelegatorService {
|
|
11
|
+
export declare class DelegatorService implements DelegatorRequestHandler {
|
|
30
12
|
private config;
|
|
31
13
|
private transport;
|
|
32
14
|
private admissionController;
|
|
33
|
-
private
|
|
15
|
+
private environmentBuilder;
|
|
34
16
|
private executorClient;
|
|
35
17
|
private delegations;
|
|
36
18
|
private stateMachines;
|
|
@@ -52,6 +34,10 @@ export declare class DelegatorService {
|
|
|
52
34
|
waitForCompletion(delegationId: string, timeoutMs?: number): Promise<Delegation>;
|
|
53
35
|
getStatus(): DelegatorServiceStatus;
|
|
54
36
|
private cleanup;
|
|
37
|
+
/**
|
|
38
|
+
* Transition delegation state and keep delegation.state in sync
|
|
39
|
+
*/
|
|
40
|
+
private transitionState;
|
|
55
41
|
/**
|
|
56
42
|
* Validate and normalize the workspace path.
|
|
57
43
|
* - Converts relative paths to absolute paths
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/delegator/service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/delegator/service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EACL,KAAK,UAAU,EAGf,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAGhB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EASpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,eAAe,EAAwD,MAAM,aAAa,CAAC;AAKzG,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,qBAAa,gBAAiB,YAAW,uBAAuB;IAC9D,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,aAAa,CAA6C;IAClE,OAAO,CAAC,YAAY,CAA6B;gBAErC,OAAO,EAAE,uBAAuB;IAiBtC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IA4EjD,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAkD3C,qBAAqB;YAyBrB,eAAe;IAsC7B;;OAEG;YACW,WAAW;IAwBnB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B/C,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBjD,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlD,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjD,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIrD,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IA4B7F,SAAS,IAAI,sBAAsB;YAarB,OAAO;IAMrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;;;;OAKG;YACW,wBAAwB;CAiCvC"}
|
|
@@ -6,17 +6,16 @@
|
|
|
6
6
|
import { randomUUID } from 'node:crypto';
|
|
7
7
|
import * as fs from 'node:fs/promises';
|
|
8
8
|
import * as path from 'node:path';
|
|
9
|
-
import * as os from 'node:os';
|
|
10
9
|
import { DelegationStateMachine, createDelegation, applyMessageToDelegation, PROTOCOL_VERSION, AwcpError, WorkspaceTooLargeError, WorkspaceNotFoundError, WorkspaceInvalidError, } from '@awcp/core';
|
|
11
10
|
import { resolveDelegatorConfig } from './config.js';
|
|
12
11
|
import { AdmissionController } from './admission.js';
|
|
13
|
-
import {
|
|
12
|
+
import { EnvironmentBuilder } from './environment-builder.js';
|
|
14
13
|
import { ExecutorClient } from './executor-client.js';
|
|
15
14
|
export class DelegatorService {
|
|
16
15
|
config;
|
|
17
16
|
transport;
|
|
18
17
|
admissionController;
|
|
19
|
-
|
|
18
|
+
environmentBuilder;
|
|
20
19
|
executorClient;
|
|
21
20
|
delegations = new Map();
|
|
22
21
|
stateMachines = new Map();
|
|
@@ -29,31 +28,33 @@ export class DelegatorService {
|
|
|
29
28
|
maxFileCount: this.config.admission.maxFileCount,
|
|
30
29
|
maxSingleFileBytes: this.config.admission.maxSingleFileBytes,
|
|
31
30
|
});
|
|
32
|
-
this.
|
|
33
|
-
baseDir: this.config.
|
|
34
|
-
strategy: this.config.export.strategy,
|
|
31
|
+
this.environmentBuilder = new EnvironmentBuilder({
|
|
32
|
+
baseDir: this.config.environment.baseDir,
|
|
35
33
|
});
|
|
36
34
|
this.executorClient = new ExecutorClient();
|
|
37
35
|
}
|
|
38
36
|
async delegate(params) {
|
|
39
37
|
const delegationId = randomUUID();
|
|
40
|
-
// Validate and
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
// Validate and check admission for all resources
|
|
39
|
+
for (const resource of params.environment.resources) {
|
|
40
|
+
const sourcePath = await this.validateAndNormalizePath(resource.source, delegationId);
|
|
41
|
+
resource.source = sourcePath;
|
|
42
|
+
const admissionResult = await this.admissionController.check(sourcePath);
|
|
43
|
+
if (!admissionResult.allowed) {
|
|
44
|
+
throw new WorkspaceTooLargeError(admissionResult.stats ?? {}, admissionResult.hint, delegationId);
|
|
45
|
+
}
|
|
45
46
|
}
|
|
46
47
|
const ttlSeconds = params.ttlSeconds ?? this.config.defaults.ttlSeconds;
|
|
47
48
|
const accessMode = params.accessMode ?? this.config.defaults.accessMode;
|
|
48
49
|
const delegation = createDelegation({
|
|
49
50
|
id: delegationId,
|
|
50
51
|
peerUrl: params.executorUrl,
|
|
51
|
-
|
|
52
|
+
environment: params.environment,
|
|
52
53
|
task: params.task,
|
|
53
54
|
leaseConfig: { ttlSeconds, accessMode },
|
|
54
55
|
});
|
|
55
|
-
const
|
|
56
|
-
delegation.exportPath =
|
|
56
|
+
const { envRoot } = await this.environmentBuilder.build(delegationId, params.environment);
|
|
57
|
+
delegation.exportPath = envRoot;
|
|
57
58
|
const stateMachine = new DelegationStateMachine();
|
|
58
59
|
this.delegations.set(delegationId, delegation);
|
|
59
60
|
this.stateMachines.set(delegationId, stateMachine);
|
|
@@ -64,17 +65,13 @@ export class DelegatorService {
|
|
|
64
65
|
delegationId,
|
|
65
66
|
task: params.task,
|
|
66
67
|
lease: { ttlSeconds, accessMode },
|
|
67
|
-
|
|
68
|
-
exportName: `awcp/${delegationId}`,
|
|
69
|
-
},
|
|
68
|
+
environment: params.environment,
|
|
70
69
|
requirements: {
|
|
71
70
|
transport: this.transport.type,
|
|
72
71
|
},
|
|
73
72
|
...(params.auth && { auth: params.auth }),
|
|
74
73
|
};
|
|
75
|
-
|
|
76
|
-
delegation.state = stateMachine.getState();
|
|
77
|
-
delegation.updatedAt = new Date().toISOString();
|
|
74
|
+
this.transitionState(delegationId, { type: 'SEND_INVITE', message: inviteMessage });
|
|
78
75
|
try {
|
|
79
76
|
const response = await this.executorClient.sendInvite(params.executorUrl, inviteMessage);
|
|
80
77
|
if (response.type === 'ERROR') {
|
|
@@ -93,18 +90,16 @@ export class DelegatorService {
|
|
|
93
90
|
async handleAccept(message) {
|
|
94
91
|
const delegation = this.delegations.get(message.delegationId);
|
|
95
92
|
if (!delegation) {
|
|
96
|
-
console.warn(`[AWCP
|
|
93
|
+
console.warn(`[AWCP:Delegator] Unknown delegation for ACCEPT: ${message.delegationId}`);
|
|
97
94
|
return;
|
|
98
95
|
}
|
|
99
|
-
const stateMachine = this.stateMachines.get(message.delegationId);
|
|
100
96
|
const executorUrl = this.executorUrls.get(message.delegationId);
|
|
101
|
-
const result =
|
|
97
|
+
const result = this.transitionState(message.delegationId, { type: 'RECEIVE_ACCEPT', message });
|
|
102
98
|
if (!result.success) {
|
|
103
|
-
console.error(`[AWCP
|
|
99
|
+
console.error(`[AWCP:Delegator] State transition failed: ${result.error}`);
|
|
104
100
|
return;
|
|
105
101
|
}
|
|
106
102
|
const updated = applyMessageToDelegation(delegation, message);
|
|
107
|
-
updated.state = stateMachine.getState();
|
|
108
103
|
this.delegations.set(delegation.id, updated);
|
|
109
104
|
const { workDirInfo } = await this.transport.prepare({
|
|
110
105
|
delegationId: delegation.id,
|
|
@@ -122,10 +117,8 @@ export class DelegatorService {
|
|
|
122
117
|
},
|
|
123
118
|
workDir: workDirInfo,
|
|
124
119
|
};
|
|
125
|
-
|
|
126
|
-
updated.state = stateMachine.getState();
|
|
120
|
+
this.transitionState(delegation.id, { type: 'SEND_START', message: startMessage });
|
|
127
121
|
updated.activeLease = startMessage.lease;
|
|
128
|
-
updated.updatedAt = new Date().toISOString();
|
|
129
122
|
this.delegations.set(delegation.id, updated);
|
|
130
123
|
await this.executorClient.sendStart(executorUrl, startMessage);
|
|
131
124
|
this.config.hooks.onDelegationStarted?.(updated);
|
|
@@ -134,9 +127,9 @@ export class DelegatorService {
|
|
|
134
127
|
}
|
|
135
128
|
async subscribeToTaskEvents(delegationId, executorUrl) {
|
|
136
129
|
try {
|
|
137
|
-
console.log(`[AWCP
|
|
130
|
+
console.log(`[AWCP:Delegator] Subscribing to SSE for ${delegationId}`);
|
|
138
131
|
for await (const event of this.executorClient.subscribeTask(executorUrl, delegationId)) {
|
|
139
|
-
console.log(`[AWCP
|
|
132
|
+
console.log(`[AWCP:Delegator] SSE event for ${delegationId}: ${event.type}`);
|
|
140
133
|
await this.handleTaskEvent(delegationId, event);
|
|
141
134
|
if (event.type === 'done' || event.type === 'error') {
|
|
142
135
|
break;
|
|
@@ -144,7 +137,7 @@ export class DelegatorService {
|
|
|
144
137
|
}
|
|
145
138
|
}
|
|
146
139
|
catch (error) {
|
|
147
|
-
console.error(`[AWCP
|
|
140
|
+
console.error(`[AWCP:Delegator] SSE subscription error for ${delegationId}:`, error);
|
|
148
141
|
// Mark delegation as error if SSE fails and task hasn't completed
|
|
149
142
|
const delegation = this.delegations.get(delegationId);
|
|
150
143
|
if (delegation && !['completed', 'error', 'cancelled'].includes(delegation.state)) {
|
|
@@ -163,15 +156,11 @@ export class DelegatorService {
|
|
|
163
156
|
return;
|
|
164
157
|
const stateMachine = this.stateMachines.get(delegationId);
|
|
165
158
|
if (event.type === 'status' && stateMachine.getState() === 'started') {
|
|
166
|
-
|
|
167
|
-
delegation.state = stateMachine.getState();
|
|
168
|
-
delegation.updatedAt = new Date().toISOString();
|
|
169
|
-
this.delegations.set(delegationId, delegation);
|
|
159
|
+
this.transitionState(delegationId, { type: 'SETUP_COMPLETE' });
|
|
170
160
|
}
|
|
171
161
|
if (event.type === 'done') {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
await this.applyResult(delegationId, delegation.localDir, event.resultBase64);
|
|
162
|
+
if (event.resultBase64) {
|
|
163
|
+
await this.applyResult(delegationId, event.resultBase64);
|
|
175
164
|
}
|
|
176
165
|
const doneMessage = {
|
|
177
166
|
version: PROTOCOL_VERSION,
|
|
@@ -197,46 +186,46 @@ export class DelegatorService {
|
|
|
197
186
|
/**
|
|
198
187
|
* Apply result from Executor back to original workspace
|
|
199
188
|
*/
|
|
200
|
-
async applyResult(delegationId,
|
|
189
|
+
async applyResult(delegationId, resultData) {
|
|
190
|
+
const delegation = this.delegations.get(delegationId);
|
|
191
|
+
if (!delegation)
|
|
192
|
+
return;
|
|
193
|
+
const env = this.environmentBuilder.get(delegationId);
|
|
194
|
+
if (!env)
|
|
195
|
+
return;
|
|
196
|
+
const rwResources = delegation.environment.resources.filter(r => r.mode === 'rw');
|
|
197
|
+
if (rwResources.length === 0)
|
|
198
|
+
return;
|
|
201
199
|
try {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const { exec } = await import('node:child_process');
|
|
211
|
-
const { promisify } = await import('node:util');
|
|
212
|
-
const execAsync = promisify(exec);
|
|
213
|
-
// Use unzip to extract, overwriting existing files
|
|
214
|
-
await execAsync(`unzip -o "${archivePath}" -d "${localDir}"`);
|
|
215
|
-
// Cleanup temp file
|
|
216
|
-
await fs.unlink(archivePath).catch(() => { });
|
|
217
|
-
console.log(`[AWCP Delegator] Applied result to ${localDir}`);
|
|
200
|
+
if (this.transport.applyResult) {
|
|
201
|
+
await this.transport.applyResult({
|
|
202
|
+
delegationId,
|
|
203
|
+
resultData,
|
|
204
|
+
resources: rwResources.map(r => ({ name: r.name, source: r.source, mode: r.mode })),
|
|
205
|
+
});
|
|
206
|
+
console.log(`[AWCP:Delegator] Applied result for ${delegationId}`);
|
|
207
|
+
}
|
|
218
208
|
}
|
|
219
209
|
catch (error) {
|
|
220
|
-
console.error(`[AWCP
|
|
210
|
+
console.error(`[AWCP:Delegator] Failed to apply result for ${delegationId}:`, error);
|
|
221
211
|
}
|
|
222
212
|
}
|
|
223
213
|
async handleDone(message) {
|
|
224
214
|
const delegation = this.delegations.get(message.delegationId);
|
|
225
215
|
if (!delegation) {
|
|
226
|
-
console.warn(`[AWCP
|
|
216
|
+
console.warn(`[AWCP:Delegator] Unknown delegation for DONE: ${message.delegationId}`);
|
|
227
217
|
return;
|
|
228
218
|
}
|
|
229
219
|
const stateMachine = this.stateMachines.get(message.delegationId);
|
|
230
220
|
if (stateMachine.getState() === 'started') {
|
|
231
|
-
|
|
221
|
+
this.transitionState(message.delegationId, { type: 'SETUP_COMPLETE' });
|
|
232
222
|
}
|
|
233
|
-
const result =
|
|
223
|
+
const result = this.transitionState(message.delegationId, { type: 'RECEIVE_DONE', message });
|
|
234
224
|
if (!result.success) {
|
|
235
|
-
console.error(`[AWCP
|
|
225
|
+
console.error(`[AWCP:Delegator] State transition failed: ${result.error}`);
|
|
236
226
|
return;
|
|
237
227
|
}
|
|
238
228
|
const updated = applyMessageToDelegation(delegation, message);
|
|
239
|
-
updated.state = stateMachine.getState();
|
|
240
229
|
this.delegations.set(delegation.id, updated);
|
|
241
230
|
await this.cleanup(delegation.id);
|
|
242
231
|
this.config.hooks.onDelegationCompleted?.(updated);
|
|
@@ -244,13 +233,11 @@ export class DelegatorService {
|
|
|
244
233
|
async handleError(message) {
|
|
245
234
|
const delegation = this.delegations.get(message.delegationId);
|
|
246
235
|
if (!delegation) {
|
|
247
|
-
console.warn(`[AWCP
|
|
236
|
+
console.warn(`[AWCP:Delegator] Unknown delegation for ERROR: ${message.delegationId}`);
|
|
248
237
|
return;
|
|
249
238
|
}
|
|
250
|
-
|
|
251
|
-
stateMachine.transition({ type: 'RECEIVE_ERROR', message });
|
|
239
|
+
this.transitionState(message.delegationId, { type: 'RECEIVE_ERROR', message });
|
|
252
240
|
const updated = applyMessageToDelegation(delegation, message);
|
|
253
|
-
updated.state = stateMachine.getState();
|
|
254
241
|
this.delegations.set(delegation.id, updated);
|
|
255
242
|
await this.cleanup(delegation.id);
|
|
256
243
|
const error = new AwcpError(message.code, message.message, message.hint, delegation.id);
|
|
@@ -268,7 +255,7 @@ export class DelegatorService {
|
|
|
268
255
|
await this.handleError(message);
|
|
269
256
|
break;
|
|
270
257
|
default:
|
|
271
|
-
console.warn(`[AWCP
|
|
258
|
+
console.warn(`[AWCP:Delegator] Unexpected message type: ${message.type}`);
|
|
272
259
|
}
|
|
273
260
|
}
|
|
274
261
|
async cancel(delegationId) {
|
|
@@ -276,16 +263,13 @@ export class DelegatorService {
|
|
|
276
263
|
if (!delegation) {
|
|
277
264
|
throw new Error(`Unknown delegation: ${delegationId}`);
|
|
278
265
|
}
|
|
279
|
-
const stateMachine = this.stateMachines.get(delegationId);
|
|
280
266
|
const executorUrl = this.executorUrls.get(delegationId);
|
|
281
|
-
const result =
|
|
267
|
+
const result = this.transitionState(delegationId, { type: 'CANCEL' });
|
|
282
268
|
if (!result.success) {
|
|
283
269
|
throw new Error(`Cannot cancel delegation in state ${delegation.state}`);
|
|
284
270
|
}
|
|
285
271
|
await this.executorClient.sendCancel(executorUrl, delegationId).catch(console.error);
|
|
286
272
|
await this.cleanup(delegationId);
|
|
287
|
-
delegation.state = stateMachine.getState();
|
|
288
|
-
delegation.updatedAt = new Date().toISOString();
|
|
289
273
|
}
|
|
290
274
|
getDelegation(delegationId) {
|
|
291
275
|
return this.delegations.get(delegationId);
|
|
@@ -315,16 +299,29 @@ export class DelegatorService {
|
|
|
315
299
|
id: d.id,
|
|
316
300
|
state: d.state,
|
|
317
301
|
executorUrl: d.peerUrl,
|
|
318
|
-
|
|
302
|
+
environment: d.environment,
|
|
319
303
|
createdAt: d.createdAt,
|
|
320
304
|
})),
|
|
321
305
|
};
|
|
322
306
|
}
|
|
323
307
|
async cleanup(delegationId) {
|
|
324
308
|
await this.transport.cleanup(delegationId);
|
|
325
|
-
await this.
|
|
309
|
+
await this.environmentBuilder.release(delegationId);
|
|
326
310
|
this.executorUrls.delete(delegationId);
|
|
327
311
|
}
|
|
312
|
+
/**
|
|
313
|
+
* Transition delegation state and keep delegation.state in sync
|
|
314
|
+
*/
|
|
315
|
+
transitionState(delegationId, event) {
|
|
316
|
+
const sm = this.stateMachines.get(delegationId);
|
|
317
|
+
const delegation = this.delegations.get(delegationId);
|
|
318
|
+
const result = sm.transition(event);
|
|
319
|
+
if (result.success) {
|
|
320
|
+
delegation.state = sm.getState();
|
|
321
|
+
delegation.updatedAt = new Date().toISOString();
|
|
322
|
+
}
|
|
323
|
+
return result;
|
|
324
|
+
}
|
|
328
325
|
/**
|
|
329
326
|
* Validate and normalize the workspace path.
|
|
330
327
|
* - Converts relative paths to absolute paths
|