@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.
Files changed (105) hide show
  1. package/dist/delegator/admission.d.ts +8 -15
  2. package/dist/delegator/admission.d.ts.map +1 -1
  3. package/dist/delegator/admission.js +15 -36
  4. package/dist/delegator/admission.js.map +1 -1
  5. package/dist/delegator/bin/client.d.ts +8 -9
  6. package/dist/delegator/bin/client.d.ts.map +1 -1
  7. package/dist/delegator/bin/client.js +3 -1
  8. package/dist/delegator/bin/client.js.map +1 -1
  9. package/dist/delegator/bin/daemon.js +9 -9
  10. package/dist/delegator/bin/daemon.js.map +1 -1
  11. package/dist/delegator/config.d.ts +24 -28
  12. package/dist/delegator/config.d.ts.map +1 -1
  13. package/dist/delegator/config.js +24 -23
  14. package/dist/delegator/config.js.map +1 -1
  15. package/dist/delegator/environment-builder.d.ts +37 -0
  16. package/dist/delegator/environment-builder.d.ts.map +1 -0
  17. package/dist/delegator/environment-builder.js +67 -0
  18. package/dist/delegator/environment-builder.js.map +1 -0
  19. package/dist/delegator/executor-client.js +1 -1
  20. package/dist/delegator/executor-client.js.map +1 -1
  21. package/dist/delegator/index.d.ts +5 -4
  22. package/dist/delegator/index.d.ts.map +1 -1
  23. package/dist/delegator/index.js +4 -3
  24. package/dist/delegator/index.js.map +1 -1
  25. package/dist/delegator/resource-adapters/fs-adapter.d.ts +8 -0
  26. package/dist/delegator/resource-adapters/fs-adapter.d.ts.map +1 -0
  27. package/dist/delegator/resource-adapters/fs-adapter.js +14 -0
  28. package/dist/delegator/resource-adapters/fs-adapter.js.map +1 -0
  29. package/dist/delegator/resource-adapters/index.d.ts +4 -0
  30. package/dist/delegator/resource-adapters/index.d.ts.map +1 -0
  31. package/dist/delegator/resource-adapters/index.js +3 -0
  32. package/dist/delegator/resource-adapters/index.js.map +1 -0
  33. package/dist/delegator/resource-adapters/registry.d.ts +8 -0
  34. package/dist/delegator/resource-adapters/registry.d.ts.map +1 -0
  35. package/dist/delegator/resource-adapters/registry.js +17 -0
  36. package/dist/delegator/resource-adapters/registry.js.map +1 -0
  37. package/dist/delegator/resource-adapters/types.d.ts +7 -0
  38. package/dist/delegator/resource-adapters/types.d.ts.map +1 -0
  39. package/dist/delegator/resource-adapters/types.js +2 -0
  40. package/dist/delegator/resource-adapters/types.js.map +1 -0
  41. package/dist/delegator/service.d.ts +7 -21
  42. package/dist/delegator/service.d.ts.map +1 -1
  43. package/dist/delegator/service.js +69 -72
  44. package/dist/delegator/service.js.map +1 -1
  45. package/dist/executor/a2a-adapter.d.ts +14 -0
  46. package/dist/executor/a2a-adapter.d.ts.map +1 -0
  47. package/dist/executor/a2a-adapter.js +66 -0
  48. package/dist/executor/a2a-adapter.js.map +1 -0
  49. package/dist/executor/config.d.ts +6 -6
  50. package/dist/executor/config.d.ts.map +1 -1
  51. package/dist/executor/config.js +1 -0
  52. package/dist/executor/config.js.map +1 -1
  53. package/dist/executor/index.d.ts +2 -1
  54. package/dist/executor/index.d.ts.map +1 -1
  55. package/dist/executor/index.js +1 -2
  56. package/dist/executor/index.js.map +1 -1
  57. package/dist/executor/service.d.ts +3 -14
  58. package/dist/executor/service.d.ts.map +1 -1
  59. package/dist/executor/service.js +13 -55
  60. package/dist/executor/service.js.map +1 -1
  61. package/dist/executor/workspace-manager.d.ts +0 -10
  62. package/dist/executor/workspace-manager.d.ts.map +1 -1
  63. package/dist/executor/workspace-manager.js +8 -27
  64. package/dist/executor/workspace-manager.js.map +1 -1
  65. package/dist/index.d.ts +4 -3
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +8 -22
  68. package/dist/index.js.map +1 -1
  69. package/dist/listener/http-listener.d.ts +18 -0
  70. package/dist/listener/http-listener.d.ts.map +1 -0
  71. package/dist/listener/http-listener.js +80 -0
  72. package/dist/listener/http-listener.js.map +1 -0
  73. package/dist/listener/index.d.ts +6 -0
  74. package/dist/listener/index.d.ts.map +1 -0
  75. package/dist/listener/index.js +6 -0
  76. package/dist/listener/index.js.map +1 -0
  77. package/dist/listener/websocket-tunnel-listener.d.ts +36 -0
  78. package/dist/listener/websocket-tunnel-listener.d.ts.map +1 -0
  79. package/dist/listener/websocket-tunnel-listener.js +187 -0
  80. package/dist/listener/websocket-tunnel-listener.js.map +1 -0
  81. package/dist/server/express/awcp-executor-handler.d.ts +11 -11
  82. package/dist/server/express/awcp-executor-handler.d.ts.map +1 -1
  83. package/dist/server/express/awcp-executor-handler.js +43 -81
  84. package/dist/server/express/awcp-executor-handler.js.map +1 -1
  85. package/dist/utils/fs-helpers.d.ts +17 -0
  86. package/dist/utils/fs-helpers.d.ts.map +1 -0
  87. package/dist/utils/fs-helpers.js +34 -0
  88. package/dist/utils/fs-helpers.js.map +1 -0
  89. package/dist/utils/index.d.ts +8 -0
  90. package/dist/utils/index.d.ts.map +1 -0
  91. package/dist/utils/index.js +8 -0
  92. package/dist/utils/index.js.map +1 -0
  93. package/dist/utils/resolve-workdir.d.ts +21 -0
  94. package/dist/utils/resolve-workdir.d.ts.map +1 -0
  95. package/dist/utils/resolve-workdir.js +30 -0
  96. package/dist/utils/resolve-workdir.js.map +1 -0
  97. package/package.json +7 -3
  98. package/dist/delegator/export-manager.d.ts +0 -27
  99. package/dist/delegator/export-manager.d.ts.map +0 -1
  100. package/dist/delegator/export-manager.js +0 -85
  101. package/dist/delegator/export-manager.js.map +0 -1
  102. package/dist/delegator/export-view.d.ts +0 -43
  103. package/dist/delegator/export-view.d.ts.map +0 -1
  104. package/dist/delegator/export-view.js +0 -108
  105. 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":"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"}
@@ -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":"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"}
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, type DelegateParams, type DelegatorServiceStatus, } from './service.js';
2
- export { type DelegatorConfig, type ExportConfig, type AdmissionConfig as DelegatorAdmissionConfig, type DelegationDefaults, type DelegatorHooks, type ResolvedDelegatorConfig, DEFAULT_DELEGATOR_CONFIG, resolveDelegatorConfig, } from './config.js';
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 AdmissionConfig, type AdmissionResult, type WorkspaceStats } from './admission.js';
6
- export { ExportManager } from './export-manager.js';
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,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,eAAe,IAAI,wBAAwB,EAChD,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,wBAAwB,EACxB,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,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACtH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
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"}
@@ -1,11 +1,12 @@
1
1
  // High-level API
2
- export { DelegatorService, } from './service.js';
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 { ExportManager } from './export-manager.js';
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,EACL,gBAAgB,GAIjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAOL,wBAAwB,EACxB,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,EAAmE,MAAM,gBAAgB,CAAC;AACtH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAuB,MAAM,sBAAsB,CAAC"}
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,4 @@
1
+ export type { ResourceAdapter } from './types.js';
2
+ export { ResourceAdapterRegistry } from './registry.js';
3
+ export { FsResourceAdapter } from './fs-adapter.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export { ResourceAdapterRegistry } from './registry.js';
2
+ export { FsResourceAdapter } from './fs-adapter.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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 TaskSpec, type AcceptMessage, type DoneMessage, type ErrorMessage, type AwcpMessage, type AccessMode, type AuthCredential } from '@awcp/core';
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 exportManager;
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;AAMH,OAAO,EACL,KAAK,UAAU,EACf,KAAK,QAAQ,EAGb,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EAWpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,eAAe,EAAwD,MAAM,aAAa,CAAC;AAKzG,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,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,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,aAAa,CAA6C;IAClE,OAAO,CAAC,YAAY,CAA6B;gBAErC,OAAO,EAAE,uBAAuB;IAkBtC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IA6EjD,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAsD3C,qBAAqB;YAyBrB,eAAe;IA0C7B;;OAEG;YACW,WAAW;IA4BnB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B/C,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBjD,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlD,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjD,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;;;;;OAKG;YACW,wBAAwB;CAiCvC"}
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 { ExportManager } from './export-manager.js';
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
- exportManager;
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.exportManager = new ExportManager({
33
- baseDir: this.config.export.baseDir,
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 normalize localDir
41
- const localDir = await this.validateAndNormalizePath(params.localDir, delegationId);
42
- const admissionResult = await this.admissionController.check(localDir);
43
- if (!admissionResult.allowed) {
44
- throw new WorkspaceTooLargeError(admissionResult.stats ?? {}, admissionResult.hint, delegationId);
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
- localDir: localDir,
52
+ environment: params.environment,
52
53
  task: params.task,
53
54
  leaseConfig: { ttlSeconds, accessMode },
54
55
  });
55
- const exportPath = await this.exportManager.allocate(delegationId, localDir);
56
- delegation.exportPath = 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
- workspace: {
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
- stateMachine.transition({ type: 'SEND_INVITE', message: inviteMessage });
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 Delegator] Unknown delegation for ACCEPT: ${message.delegationId}`);
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 = stateMachine.transition({ type: 'RECEIVE_ACCEPT', message });
97
+ const result = this.transitionState(message.delegationId, { type: 'RECEIVE_ACCEPT', message });
102
98
  if (!result.success) {
103
- console.error(`[AWCP Delegator] State transition failed: ${result.error}`);
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
- stateMachine.transition({ type: 'SEND_START', message: startMessage });
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 Delegator] Subscribing to SSE for ${delegationId}`);
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 Delegator] SSE event for ${delegationId}: ${event.type}`);
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 Delegator] SSE subscription error for ${delegationId}:`, error);
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
- stateMachine.transition({ type: 'SETUP_COMPLETE' });
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
- // Apply result back to workspace if present
173
- if (event.resultBase64 && delegation.localDir) {
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, localDir, resultBase64) {
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
- // Decode base64 to buffer
203
- const buffer = Buffer.from(resultBase64, 'base64');
204
- // Write to temp file
205
- const tempDir = path.join(os.tmpdir(), 'awcp-results');
206
- await fs.mkdir(tempDir, { recursive: true });
207
- const archivePath = path.join(tempDir, `${delegationId}-result.zip`);
208
- await fs.writeFile(archivePath, buffer);
209
- // Extract to localDir (overwriting existing files)
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 Delegator] Failed to apply result for ${delegationId}:`, error);
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 Delegator] Unknown delegation for DONE: ${message.delegationId}`);
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
- stateMachine.transition({ type: 'SETUP_COMPLETE' });
221
+ this.transitionState(message.delegationId, { type: 'SETUP_COMPLETE' });
232
222
  }
233
- const result = stateMachine.transition({ type: 'RECEIVE_DONE', message });
223
+ const result = this.transitionState(message.delegationId, { type: 'RECEIVE_DONE', message });
234
224
  if (!result.success) {
235
- console.error(`[AWCP Delegator] State transition failed: ${result.error}`);
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 Delegator] Unknown delegation for ERROR: ${message.delegationId}`);
236
+ console.warn(`[AWCP:Delegator] Unknown delegation for ERROR: ${message.delegationId}`);
248
237
  return;
249
238
  }
250
- const stateMachine = this.stateMachines.get(message.delegationId);
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 Delegator] Unexpected message type: ${message.type}`);
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 = stateMachine.transition({ type: 'CANCEL' });
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
- localDir: d.localDir,
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.exportManager.release(delegationId);
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