@tomflow/proflow-agent-gateway 0.1.3 → 0.1.5
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/CONFIGURATION.md +26 -0
- package/dist/deployment/adapter.d.ts +38 -106
- package/dist/deployment/adapter.js +42 -109
- package/dist/deployment/descriptor.d.ts +5 -2
- package/dist/deployment/descriptor.js +29 -7
- package/dist/src/cli.js +1 -19
- package/package.json +14 -21
- package/proflow.module.json +6 -2
- package/CHANGELOG.md +0 -19
package/CONFIGURATION.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# agent-gateway configuration
|
|
2
|
+
|
|
3
|
+
Canonical public config: `.proflow/config/agent-gateway.json`
|
|
4
|
+
|
|
5
|
+
This file is Workspace-owned data. `platform uninstall` does not delete it. Values are JSON strings. Raw secrets must not be stored here; `secretRef` fields contain opaque references only.
|
|
6
|
+
|
|
7
|
+
## Fields
|
|
8
|
+
|
|
9
|
+
| Key | Type | Required | Sensitive | Source | Meaning |
|
|
10
|
+
|---|---|---:|---:|---|---|
|
|
11
|
+
| `localBaseUrl` | `url` | yes | no | User or owning external/runtime Module supplies the reachable endpoint URL. | Loopback HTTP listener URL owned by Agent Gateway and targeted by the public ingress resource |
|
|
12
|
+
| `publicBaseUrl` | `url` | yes | no | User or owning external/runtime Module supplies the reachable endpoint URL. | Public HTTPS URL supplied by the dev-tunnel resource |
|
|
13
|
+
| `downstreamCredentialFile` | `path` | yes | yes | User or owning Module supplies an absolute/local path that exists on this Workspace. | File containing the dedicated Gateway-to-platform-host transport credential |
|
|
14
|
+
| `publicIngressModuleRef` | `moduleRef` | no | no | Another installed ProFlow Module reference selected from `platform docs` / Module topology. | External resource module governing the public ingress |
|
|
15
|
+
|
|
16
|
+
## Materialize
|
|
17
|
+
|
|
18
|
+
Create or update the canonical JSON object at:
|
|
19
|
+
|
|
20
|
+
`.proflow/config/agent-gateway.json`
|
|
21
|
+
|
|
22
|
+
Use only declared keys and string values. Do not create a second Platform configuration database.
|
|
23
|
+
|
|
24
|
+
## Base completion check
|
|
25
|
+
|
|
26
|
+
Run `platform modules`. This Module should no longer report required keys in `missingConfig`. `platform start` performs the authoritative Module-owned validation before starting anything.
|
|
@@ -13,14 +13,14 @@ type GatewayProcess = {
|
|
|
13
13
|
}>;
|
|
14
14
|
status(): unknown;
|
|
15
15
|
};
|
|
16
|
-
export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
16
|
+
export declare function createBehaviorAdapter(service?: GatewayProcess, config?: Record<string, string>, configValid?: boolean): {
|
|
17
17
|
describe: () => {
|
|
18
18
|
result: {
|
|
19
19
|
readonly contract: "deployment.result.v1";
|
|
20
20
|
readonly ok: true;
|
|
21
21
|
readonly status: "SUCCEEDED";
|
|
22
22
|
readonly moduleRef: "agent-gateway";
|
|
23
|
-
readonly moduleVersion: "0.1.
|
|
23
|
+
readonly moduleVersion: "0.1.5";
|
|
24
24
|
};
|
|
25
25
|
observedEffects: never[];
|
|
26
26
|
};
|
|
@@ -30,49 +30,22 @@ export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
|
30
30
|
readonly ok: true;
|
|
31
31
|
readonly status: "SUCCEEDED";
|
|
32
32
|
readonly moduleRef: "agent-gateway";
|
|
33
|
-
readonly moduleVersion: "0.1.
|
|
33
|
+
readonly moduleVersion: "0.1.5";
|
|
34
34
|
};
|
|
35
35
|
observedEffects: never[];
|
|
36
36
|
};
|
|
37
37
|
status: () => Promise<{
|
|
38
38
|
result: {
|
|
39
|
-
readonly contract: "deployment.result.v1";
|
|
40
|
-
readonly moduleRef: "agent-gateway";
|
|
41
|
-
readonly moduleVersion: "0.1.3";
|
|
42
|
-
readonly ok: false;
|
|
43
|
-
readonly status: "ACTION_REQUIRED";
|
|
44
|
-
readonly actionRequired: {
|
|
45
|
-
readonly action: "compose-gateway";
|
|
46
|
-
readonly description: "Provide owner ports and process configuration";
|
|
47
|
-
};
|
|
48
|
-
} | {
|
|
49
39
|
contract: "deployment.result.v1";
|
|
50
40
|
ok: true;
|
|
51
41
|
status: "SUCCEEDED";
|
|
52
42
|
moduleRef: "agent-gateway";
|
|
53
|
-
moduleVersion: "0.1.
|
|
54
|
-
data:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
message: string;
|
|
59
|
-
}[];
|
|
60
|
-
} | {
|
|
61
|
-
contract: "deployment.result.v1";
|
|
62
|
-
moduleRef: "agent-gateway";
|
|
63
|
-
moduleVersion: "0.1.3";
|
|
64
|
-
ok: false;
|
|
65
|
-
status: "ACTION_REQUIRED";
|
|
66
|
-
actionRequired: {
|
|
67
|
-
action: string;
|
|
68
|
-
description: string;
|
|
43
|
+
moduleVersion: "0.1.5";
|
|
44
|
+
data: {
|
|
45
|
+
configStatus: "INCOMPLETE" | "INVALID" | "READY";
|
|
46
|
+
missingConfig?: string[] | undefined;
|
|
47
|
+
runtimeStatus: "FAILED" | "RUNNING" | "STOPPED" | "UNKNOWN";
|
|
69
48
|
};
|
|
70
|
-
data: unknown;
|
|
71
|
-
checks: {
|
|
72
|
-
id: string;
|
|
73
|
-
status: "FAIL" | "PASS";
|
|
74
|
-
message: string;
|
|
75
|
-
}[];
|
|
76
49
|
};
|
|
77
50
|
observedEffects: never[];
|
|
78
51
|
}>;
|
|
@@ -82,7 +55,7 @@ export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
|
82
55
|
ok: true;
|
|
83
56
|
status: "SUCCEEDED";
|
|
84
57
|
moduleRef: "agent-gateway";
|
|
85
|
-
moduleVersion: "0.1.
|
|
58
|
+
moduleVersion: "0.1.5";
|
|
86
59
|
checks: {
|
|
87
60
|
id: string;
|
|
88
61
|
status: "FAIL" | "PASS";
|
|
@@ -91,7 +64,7 @@ export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
|
91
64
|
} | {
|
|
92
65
|
contract: "deployment.result.v1";
|
|
93
66
|
moduleRef: "agent-gateway";
|
|
94
|
-
moduleVersion: "0.1.
|
|
67
|
+
moduleVersion: "0.1.5";
|
|
95
68
|
ok: false;
|
|
96
69
|
status: "ACTION_REQUIRED";
|
|
97
70
|
actionRequired: {
|
|
@@ -106,7 +79,7 @@ export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
|
106
79
|
} | {
|
|
107
80
|
contract: "deployment.result.v1";
|
|
108
81
|
moduleRef: "agent-gateway";
|
|
109
|
-
moduleVersion: "0.1.
|
|
82
|
+
moduleVersion: "0.1.5";
|
|
110
83
|
ok: false;
|
|
111
84
|
status: "ACTION_REQUIRED";
|
|
112
85
|
actionRequired: {
|
|
@@ -127,7 +100,7 @@ export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
|
127
100
|
readonly ok: true;
|
|
128
101
|
readonly status: "SUCCEEDED";
|
|
129
102
|
readonly moduleRef: "agent-gateway";
|
|
130
|
-
readonly moduleVersion: "0.1.
|
|
103
|
+
readonly moduleVersion: "0.1.5";
|
|
131
104
|
};
|
|
132
105
|
observedEffects: never[];
|
|
133
106
|
};
|
|
@@ -137,7 +110,7 @@ export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
|
137
110
|
ok: true;
|
|
138
111
|
status: "SUCCEEDED";
|
|
139
112
|
moduleRef: "agent-gateway";
|
|
140
|
-
moduleVersion: "0.1.
|
|
113
|
+
moduleVersion: "0.1.5";
|
|
141
114
|
data: {
|
|
142
115
|
host: string;
|
|
143
116
|
port: number;
|
|
@@ -145,7 +118,7 @@ export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
|
145
118
|
} | {
|
|
146
119
|
contract: "deployment.result.v1";
|
|
147
120
|
moduleRef: "agent-gateway";
|
|
148
|
-
moduleVersion: "0.1.
|
|
121
|
+
moduleVersion: "0.1.5";
|
|
149
122
|
status: "ACTION_REQUIRED";
|
|
150
123
|
ok: boolean;
|
|
151
124
|
actionRequired: {
|
|
@@ -161,11 +134,11 @@ export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
|
161
134
|
readonly ok: true;
|
|
162
135
|
readonly status: "SUCCEEDED";
|
|
163
136
|
readonly moduleRef: "agent-gateway";
|
|
164
|
-
readonly moduleVersion: "0.1.
|
|
137
|
+
readonly moduleVersion: "0.1.5";
|
|
165
138
|
} | {
|
|
166
139
|
readonly contract: "deployment.result.v1";
|
|
167
140
|
readonly moduleRef: "agent-gateway";
|
|
168
|
-
readonly moduleVersion: "0.1.
|
|
141
|
+
readonly moduleVersion: "0.1.5";
|
|
169
142
|
readonly ok: false;
|
|
170
143
|
readonly status: "ACTION_REQUIRED";
|
|
171
144
|
readonly actionRequired: {
|
|
@@ -181,7 +154,7 @@ export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
|
181
154
|
readonly ok: true;
|
|
182
155
|
readonly status: "SUCCEEDED";
|
|
183
156
|
readonly moduleRef: "agent-gateway";
|
|
184
|
-
readonly moduleVersion: "0.1.
|
|
157
|
+
readonly moduleVersion: "0.1.5";
|
|
185
158
|
};
|
|
186
159
|
observedEffects: string[];
|
|
187
160
|
}>;
|
|
@@ -191,7 +164,7 @@ export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
|
191
164
|
ok: true;
|
|
192
165
|
status: "SUCCEEDED";
|
|
193
166
|
moduleRef: "agent-gateway";
|
|
194
|
-
moduleVersion: "0.1.
|
|
167
|
+
moduleVersion: "0.1.5";
|
|
195
168
|
data: {
|
|
196
169
|
host: string;
|
|
197
170
|
port: number;
|
|
@@ -199,7 +172,7 @@ export declare function createBehaviorAdapter(service?: GatewayProcess): {
|
|
|
199
172
|
} | {
|
|
200
173
|
contract: "deployment.result.v1";
|
|
201
174
|
moduleRef: "agent-gateway";
|
|
202
|
-
moduleVersion: "0.1.
|
|
175
|
+
moduleVersion: "0.1.5";
|
|
203
176
|
status: "ACTION_REQUIRED";
|
|
204
177
|
ok: boolean;
|
|
205
178
|
actionRequired: {
|
|
@@ -217,7 +190,7 @@ export declare const behaviorAdapter: {
|
|
|
217
190
|
readonly ok: true;
|
|
218
191
|
readonly status: "SUCCEEDED";
|
|
219
192
|
readonly moduleRef: "agent-gateway";
|
|
220
|
-
readonly moduleVersion: "0.1.
|
|
193
|
+
readonly moduleVersion: "0.1.5";
|
|
221
194
|
};
|
|
222
195
|
observedEffects: never[];
|
|
223
196
|
};
|
|
@@ -227,49 +200,22 @@ export declare const behaviorAdapter: {
|
|
|
227
200
|
readonly ok: true;
|
|
228
201
|
readonly status: "SUCCEEDED";
|
|
229
202
|
readonly moduleRef: "agent-gateway";
|
|
230
|
-
readonly moduleVersion: "0.1.
|
|
203
|
+
readonly moduleVersion: "0.1.5";
|
|
231
204
|
};
|
|
232
205
|
observedEffects: never[];
|
|
233
206
|
};
|
|
234
207
|
status: () => Promise<{
|
|
235
208
|
result: {
|
|
236
|
-
readonly contract: "deployment.result.v1";
|
|
237
|
-
readonly moduleRef: "agent-gateway";
|
|
238
|
-
readonly moduleVersion: "0.1.3";
|
|
239
|
-
readonly ok: false;
|
|
240
|
-
readonly status: "ACTION_REQUIRED";
|
|
241
|
-
readonly actionRequired: {
|
|
242
|
-
readonly action: "compose-gateway";
|
|
243
|
-
readonly description: "Provide owner ports and process configuration";
|
|
244
|
-
};
|
|
245
|
-
} | {
|
|
246
209
|
contract: "deployment.result.v1";
|
|
247
210
|
ok: true;
|
|
248
211
|
status: "SUCCEEDED";
|
|
249
212
|
moduleRef: "agent-gateway";
|
|
250
|
-
moduleVersion: "0.1.
|
|
251
|
-
data:
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
message: string;
|
|
256
|
-
}[];
|
|
257
|
-
} | {
|
|
258
|
-
contract: "deployment.result.v1";
|
|
259
|
-
moduleRef: "agent-gateway";
|
|
260
|
-
moduleVersion: "0.1.3";
|
|
261
|
-
ok: false;
|
|
262
|
-
status: "ACTION_REQUIRED";
|
|
263
|
-
actionRequired: {
|
|
264
|
-
action: string;
|
|
265
|
-
description: string;
|
|
213
|
+
moduleVersion: "0.1.5";
|
|
214
|
+
data: {
|
|
215
|
+
configStatus: "INCOMPLETE" | "INVALID" | "READY";
|
|
216
|
+
missingConfig?: string[] | undefined;
|
|
217
|
+
runtimeStatus: "FAILED" | "RUNNING" | "STOPPED" | "UNKNOWN";
|
|
266
218
|
};
|
|
267
|
-
data: unknown;
|
|
268
|
-
checks: {
|
|
269
|
-
id: string;
|
|
270
|
-
status: "FAIL" | "PASS";
|
|
271
|
-
message: string;
|
|
272
|
-
}[];
|
|
273
219
|
};
|
|
274
220
|
observedEffects: never[];
|
|
275
221
|
}>;
|
|
@@ -279,7 +225,7 @@ export declare const behaviorAdapter: {
|
|
|
279
225
|
ok: true;
|
|
280
226
|
status: "SUCCEEDED";
|
|
281
227
|
moduleRef: "agent-gateway";
|
|
282
|
-
moduleVersion: "0.1.
|
|
228
|
+
moduleVersion: "0.1.5";
|
|
283
229
|
checks: {
|
|
284
230
|
id: string;
|
|
285
231
|
status: "FAIL" | "PASS";
|
|
@@ -288,7 +234,7 @@ export declare const behaviorAdapter: {
|
|
|
288
234
|
} | {
|
|
289
235
|
contract: "deployment.result.v1";
|
|
290
236
|
moduleRef: "agent-gateway";
|
|
291
|
-
moduleVersion: "0.1.
|
|
237
|
+
moduleVersion: "0.1.5";
|
|
292
238
|
ok: false;
|
|
293
239
|
status: "ACTION_REQUIRED";
|
|
294
240
|
actionRequired: {
|
|
@@ -303,7 +249,7 @@ export declare const behaviorAdapter: {
|
|
|
303
249
|
} | {
|
|
304
250
|
contract: "deployment.result.v1";
|
|
305
251
|
moduleRef: "agent-gateway";
|
|
306
|
-
moduleVersion: "0.1.
|
|
252
|
+
moduleVersion: "0.1.5";
|
|
307
253
|
ok: false;
|
|
308
254
|
status: "ACTION_REQUIRED";
|
|
309
255
|
actionRequired: {
|
|
@@ -324,7 +270,7 @@ export declare const behaviorAdapter: {
|
|
|
324
270
|
readonly ok: true;
|
|
325
271
|
readonly status: "SUCCEEDED";
|
|
326
272
|
readonly moduleRef: "agent-gateway";
|
|
327
|
-
readonly moduleVersion: "0.1.
|
|
273
|
+
readonly moduleVersion: "0.1.5";
|
|
328
274
|
};
|
|
329
275
|
observedEffects: never[];
|
|
330
276
|
};
|
|
@@ -334,7 +280,7 @@ export declare const behaviorAdapter: {
|
|
|
334
280
|
ok: true;
|
|
335
281
|
status: "SUCCEEDED";
|
|
336
282
|
moduleRef: "agent-gateway";
|
|
337
|
-
moduleVersion: "0.1.
|
|
283
|
+
moduleVersion: "0.1.5";
|
|
338
284
|
data: {
|
|
339
285
|
host: string;
|
|
340
286
|
port: number;
|
|
@@ -342,7 +288,7 @@ export declare const behaviorAdapter: {
|
|
|
342
288
|
} | {
|
|
343
289
|
contract: "deployment.result.v1";
|
|
344
290
|
moduleRef: "agent-gateway";
|
|
345
|
-
moduleVersion: "0.1.
|
|
291
|
+
moduleVersion: "0.1.5";
|
|
346
292
|
status: "ACTION_REQUIRED";
|
|
347
293
|
ok: boolean;
|
|
348
294
|
actionRequired: {
|
|
@@ -358,11 +304,11 @@ export declare const behaviorAdapter: {
|
|
|
358
304
|
readonly ok: true;
|
|
359
305
|
readonly status: "SUCCEEDED";
|
|
360
306
|
readonly moduleRef: "agent-gateway";
|
|
361
|
-
readonly moduleVersion: "0.1.
|
|
307
|
+
readonly moduleVersion: "0.1.5";
|
|
362
308
|
} | {
|
|
363
309
|
readonly contract: "deployment.result.v1";
|
|
364
310
|
readonly moduleRef: "agent-gateway";
|
|
365
|
-
readonly moduleVersion: "0.1.
|
|
311
|
+
readonly moduleVersion: "0.1.5";
|
|
366
312
|
readonly ok: false;
|
|
367
313
|
readonly status: "ACTION_REQUIRED";
|
|
368
314
|
readonly actionRequired: {
|
|
@@ -378,7 +324,7 @@ export declare const behaviorAdapter: {
|
|
|
378
324
|
readonly ok: true;
|
|
379
325
|
readonly status: "SUCCEEDED";
|
|
380
326
|
readonly moduleRef: "agent-gateway";
|
|
381
|
-
readonly moduleVersion: "0.1.
|
|
327
|
+
readonly moduleVersion: "0.1.5";
|
|
382
328
|
};
|
|
383
329
|
observedEffects: string[];
|
|
384
330
|
}>;
|
|
@@ -388,7 +334,7 @@ export declare const behaviorAdapter: {
|
|
|
388
334
|
ok: true;
|
|
389
335
|
status: "SUCCEEDED";
|
|
390
336
|
moduleRef: "agent-gateway";
|
|
391
|
-
moduleVersion: "0.1.
|
|
337
|
+
moduleVersion: "0.1.5";
|
|
392
338
|
data: {
|
|
393
339
|
host: string;
|
|
394
340
|
port: number;
|
|
@@ -396,7 +342,7 @@ export declare const behaviorAdapter: {
|
|
|
396
342
|
} | {
|
|
397
343
|
contract: "deployment.result.v1";
|
|
398
344
|
moduleRef: "agent-gateway";
|
|
399
|
-
moduleVersion: "0.1.
|
|
345
|
+
moduleVersion: "0.1.5";
|
|
400
346
|
status: "ACTION_REQUIRED";
|
|
401
347
|
ok: boolean;
|
|
402
348
|
actionRequired: {
|
|
@@ -407,20 +353,6 @@ export declare const behaviorAdapter: {
|
|
|
407
353
|
observedEffects: string[];
|
|
408
354
|
}>;
|
|
409
355
|
};
|
|
410
|
-
export declare function createServiceProcessBinding(input: {
|
|
411
|
-
moduleRef: string;
|
|
412
|
-
config: Record<string, string>;
|
|
413
|
-
workspaceRoot: string;
|
|
414
|
-
configByModuleRef: ReadonlyMap<string, Record<string, string>>;
|
|
415
|
-
}): Promise<{
|
|
416
|
-
serviceProcess: {
|
|
417
|
-
contract: "deployment.service-process.v1";
|
|
418
|
-
bin: "proflow-agent-gateway";
|
|
419
|
-
startCommand: "start";
|
|
420
|
-
config: Record<string, unknown>;
|
|
421
|
-
};
|
|
422
|
-
behaviorAdapter: Record<string, unknown>;
|
|
423
|
-
} | undefined>;
|
|
424
356
|
export declare function createProductionBinding(input: {
|
|
425
357
|
moduleRef: string;
|
|
426
358
|
config: Record<string, string>;
|
|
@@ -428,5 +360,5 @@ export declare function createProductionBinding(input: {
|
|
|
428
360
|
configByModuleRef: ReadonlyMap<string, Record<string, string>>;
|
|
429
361
|
}): Promise<{
|
|
430
362
|
behaviorAdapter: Record<string, unknown>;
|
|
431
|
-
}
|
|
363
|
+
}>;
|
|
432
364
|
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { observeDeclaredModuleStatus } from "@tomflow/proflow-module-contract";
|
|
1
2
|
import { descriptor } from "./descriptor.js";
|
|
2
3
|
const base = {
|
|
3
4
|
contract: "deployment.result.v1",
|
|
@@ -15,38 +16,16 @@ const unbound = {
|
|
|
15
16
|
description: "Provide owner ports and process configuration",
|
|
16
17
|
},
|
|
17
18
|
};
|
|
18
|
-
export function createBehaviorAdapter(service) {
|
|
19
|
+
export function createBehaviorAdapter(service, config, configValid = true) {
|
|
19
20
|
return {
|
|
20
21
|
describe: () => ({ result: base, observedEffects: [] }),
|
|
21
22
|
preflight: () => ({ result: base, observedEffects: [] }),
|
|
22
23
|
status: async () => {
|
|
23
|
-
const processStatus = service?.status();
|
|
24
24
|
const readiness = service ? await service.readiness() : undefined;
|
|
25
25
|
const ready = readiness?.status === "READY";
|
|
26
|
+
const data = observeDeclaredModuleStatus(descriptor, config, ready ? "RUNNING" : service ? "FAILED" : "UNKNOWN", configValid);
|
|
26
27
|
return {
|
|
27
|
-
result:
|
|
28
|
-
? {
|
|
29
|
-
...(ready
|
|
30
|
-
? base
|
|
31
|
-
: {
|
|
32
|
-
...base,
|
|
33
|
-
ok: false,
|
|
34
|
-
status: "ACTION_REQUIRED",
|
|
35
|
-
actionRequired: {
|
|
36
|
-
action: "repair-gateway",
|
|
37
|
-
description: "Gateway is not READY",
|
|
38
|
-
},
|
|
39
|
-
}),
|
|
40
|
-
data: processStatus,
|
|
41
|
-
checks: [
|
|
42
|
-
{
|
|
43
|
-
id: "gateway-readiness",
|
|
44
|
-
status: ready ? "PASS" : "FAIL",
|
|
45
|
-
message: `Gateway readiness is ${readiness?.status ?? "NOT_READY"}`,
|
|
46
|
-
},
|
|
47
|
-
],
|
|
48
|
-
}
|
|
49
|
-
: unbound,
|
|
28
|
+
result: { ...base, data },
|
|
50
29
|
observedEffects: [],
|
|
51
30
|
};
|
|
52
31
|
},
|
|
@@ -136,108 +115,62 @@ export function createBehaviorAdapter(service) {
|
|
|
136
115
|
};
|
|
137
116
|
}
|
|
138
117
|
export const behaviorAdapter = createBehaviorAdapter();
|
|
139
|
-
export async function
|
|
118
|
+
export async function createProductionBinding(input) {
|
|
119
|
+
const unboundBinding = (configValid = true) => ({
|
|
120
|
+
behaviorAdapter: createBehaviorAdapter(undefined, input.config, configValid),
|
|
121
|
+
});
|
|
140
122
|
const localBaseUrl = input.config.localBaseUrl;
|
|
141
123
|
const publicBaseUrl = input.config.publicBaseUrl;
|
|
142
124
|
const downstreamCredentialFile = input.config.downstreamCredentialFile;
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
return
|
|
125
|
+
if (!localBaseUrl || !publicBaseUrl || !downstreamCredentialFile)
|
|
126
|
+
return unboundBinding();
|
|
127
|
+
let listener;
|
|
128
|
+
let publicUrl;
|
|
129
|
+
try {
|
|
130
|
+
listener = new URL(localBaseUrl);
|
|
131
|
+
publicUrl = new URL(publicBaseUrl);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return unboundBinding(false);
|
|
153
135
|
}
|
|
154
|
-
const listener = new URL(localBaseUrl);
|
|
155
136
|
if (listener.protocol !== "http:" ||
|
|
156
137
|
!new Set(["127.0.0.1", "localhost", "::1", "[::1]"]).has(listener.hostname) ||
|
|
157
|
-
listener.pathname !== "/"
|
|
158
|
-
|
|
138
|
+
listener.pathname !== "/" ||
|
|
139
|
+
publicUrl.protocol !== "https:")
|
|
140
|
+
return unboundBinding(false);
|
|
159
141
|
const port = listener.port === "" ? 80 : Number(listener.port);
|
|
160
142
|
if (!Number.isInteger(port) || port <= 0 || port > 65_535)
|
|
161
|
-
return
|
|
162
|
-
const [{ join }, { parseAgentGatewayProcessConfig }] = await Promise.all([
|
|
163
|
-
import("node:path"),
|
|
164
|
-
import("../src/process.js"),
|
|
165
|
-
]);
|
|
166
|
-
const processConfig = parseAgentGatewayProcessConfig({
|
|
167
|
-
host: listener.hostname,
|
|
168
|
-
port,
|
|
169
|
-
publicBaseUrl,
|
|
170
|
-
downstreamBaseUrl,
|
|
171
|
-
credentialFile: join(stateRoot, "agent", "secrets", "role-credentials.json"),
|
|
172
|
-
downstreamCredentialFile,
|
|
173
|
-
});
|
|
174
|
-
const probeService = {
|
|
175
|
-
async start() {
|
|
176
|
-
throw new Error("managed by Platform CLI service supervisor");
|
|
177
|
-
},
|
|
178
|
-
async stop() { },
|
|
179
|
-
async restart() {
|
|
180
|
-
throw new Error("managed by Platform CLI service supervisor");
|
|
181
|
-
},
|
|
182
|
-
async readiness() {
|
|
183
|
-
try {
|
|
184
|
-
const response = await fetch(new URL("/ready", listener));
|
|
185
|
-
return {
|
|
186
|
-
status: response.ok ? "READY" : "NOT_READY",
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
catch {
|
|
190
|
-
return { status: "NOT_READY" };
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
status: () => ({
|
|
194
|
-
endpoint: listener.href.replace(/\/$/, ""),
|
|
195
|
-
managed: true,
|
|
196
|
-
}),
|
|
197
|
-
};
|
|
198
|
-
return {
|
|
199
|
-
serviceProcess: {
|
|
200
|
-
contract: "deployment.service-process.v1",
|
|
201
|
-
bin: "proflow-agent-gateway",
|
|
202
|
-
startCommand: "start",
|
|
203
|
-
config: processConfig,
|
|
204
|
-
},
|
|
205
|
-
behaviorAdapter: createBehaviorAdapter(probeService),
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
export async function createProductionBinding(input) {
|
|
209
|
-
const localBaseUrl = input.config.localBaseUrl;
|
|
210
|
-
const publicBaseUrl = input.config.publicBaseUrl;
|
|
211
|
-
const downstreamCredentialFile = input.config.downstreamCredentialFile;
|
|
143
|
+
return unboundBinding(false);
|
|
212
144
|
const platformHost = input.configByModuleRef.get("platform-host");
|
|
213
145
|
const executionRuntime = input.configByModuleRef.get("execution-runtime");
|
|
214
146
|
const stateRoot = platformHost?.stateRoot;
|
|
215
147
|
const downstreamBaseUrl = executionRuntime?.["identity.endpoint"];
|
|
216
|
-
if (!
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
148
|
+
if (!stateRoot || !downstreamBaseUrl)
|
|
149
|
+
return unboundBinding();
|
|
150
|
+
try {
|
|
151
|
+
const downstream = new URL(downstreamBaseUrl);
|
|
152
|
+
if (downstream.protocol !== "http:" ||
|
|
153
|
+
!["localhost", "127.0.0.1", "::1"].includes(downstream.hostname))
|
|
154
|
+
return unboundBinding();
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return unboundBinding();
|
|
222
158
|
}
|
|
223
|
-
const listener = new URL(localBaseUrl);
|
|
224
|
-
if (listener.protocol !== "http:" ||
|
|
225
|
-
!new Set(["127.0.0.1", "localhost", "::1", "[::1]"]).has(listener.hostname) ||
|
|
226
|
-
listener.pathname !== "/")
|
|
227
|
-
return undefined;
|
|
228
|
-
const port = listener.port === "" ? 80 : Number(listener.port);
|
|
229
|
-
if (!Number.isInteger(port) || port <= 0 || port > 65_535)
|
|
230
|
-
return undefined;
|
|
231
159
|
const [{ join }, { createAgentGatewayProcess, parseAgentGatewayProcessConfig },] = await Promise.all([import("node:path"), import("../src/process.js")]);
|
|
232
|
-
|
|
233
|
-
|
|
160
|
+
let processConfig;
|
|
161
|
+
try {
|
|
162
|
+
processConfig = parseAgentGatewayProcessConfig({
|
|
234
163
|
host: listener.hostname,
|
|
235
164
|
port,
|
|
236
165
|
publicBaseUrl,
|
|
237
166
|
downstreamBaseUrl,
|
|
238
167
|
credentialFile: join(stateRoot, "agent", "secrets", "role-credentials.json"),
|
|
239
168
|
downstreamCredentialFile,
|
|
240
|
-
})
|
|
241
|
-
}
|
|
242
|
-
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return unboundBinding(false);
|
|
173
|
+
}
|
|
174
|
+
const service = await createAgentGatewayProcess({ config: processConfig });
|
|
175
|
+
return { behaviorAdapter: createBehaviorAdapter(service, input.config) };
|
|
243
176
|
}
|
|
@@ -3,11 +3,10 @@ export declare const descriptor: {
|
|
|
3
3
|
readonly contractVersion: "1.0.0";
|
|
4
4
|
readonly moduleRef: "agent-gateway";
|
|
5
5
|
readonly packageName: "@tomflow/proflow-agent-gateway";
|
|
6
|
-
readonly moduleVersion: "0.1.
|
|
6
|
+
readonly moduleVersion: "0.1.5";
|
|
7
7
|
readonly kind: "service";
|
|
8
8
|
readonly templateVersion: "1.0.0";
|
|
9
9
|
readonly platformCompatibility: ">=1.0.0 <2.0.0";
|
|
10
|
-
readonly installClass: "core";
|
|
11
10
|
readonly identity: {
|
|
12
11
|
readonly domain: "agent-runtime-collaboration";
|
|
13
12
|
readonly summary: "The sole Custom GPT Actions HTTP ingress and OpenAI transport anti-corruption layer.";
|
|
@@ -73,5 +72,9 @@ export declare const descriptor: {
|
|
|
73
72
|
readonly id: "overview";
|
|
74
73
|
readonly path: "./README.md";
|
|
75
74
|
readonly description: "Agent Gateway package overview";
|
|
75
|
+
}, {
|
|
76
|
+
readonly id: "configuration";
|
|
77
|
+
readonly path: "./CONFIGURATION.md";
|
|
78
|
+
readonly description: "Module configuration fields, sources and materialization instructions";
|
|
76
79
|
}];
|
|
77
80
|
};
|
|
@@ -3,23 +3,40 @@ export const descriptor = {
|
|
|
3
3
|
contractVersion: "1.0.0",
|
|
4
4
|
moduleRef: "agent-gateway",
|
|
5
5
|
packageName: "@tomflow/proflow-agent-gateway",
|
|
6
|
-
moduleVersion: "0.1.
|
|
6
|
+
moduleVersion: "0.1.5",
|
|
7
7
|
kind: "service",
|
|
8
8
|
templateVersion: "1.0.0",
|
|
9
9
|
platformCompatibility: ">=1.0.0 <2.0.0",
|
|
10
|
-
installClass: "core",
|
|
11
10
|
identity: {
|
|
12
11
|
domain: "agent-runtime-collaboration",
|
|
13
12
|
summary: "The sole Custom GPT Actions HTTP ingress and OpenAI transport anti-corruption layer.",
|
|
14
13
|
},
|
|
15
|
-
provides: [
|
|
14
|
+
provides: [
|
|
15
|
+
{
|
|
16
|
+
contractRef: "custom-gpt-actions-gateway",
|
|
17
|
+
version: "1.0.0",
|
|
18
|
+
},
|
|
19
|
+
],
|
|
16
20
|
requires: [
|
|
17
|
-
{
|
|
18
|
-
|
|
19
|
-
|
|
21
|
+
{
|
|
22
|
+
contractRef: "agent-runtime",
|
|
23
|
+
versionRange: ">=1.0.0 <2.0.0",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
contractRef: "task-orchestration",
|
|
27
|
+
versionRange: ">=1.0.0 <2.0.0",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
contractRef: "execution",
|
|
31
|
+
versionRange: ">=1.0.0 <2.0.0",
|
|
32
|
+
},
|
|
20
33
|
],
|
|
21
34
|
requirements: [
|
|
22
|
-
{
|
|
35
|
+
{
|
|
36
|
+
kind: "runtime",
|
|
37
|
+
runtime: "node",
|
|
38
|
+
versionRange: ">=24.19.0",
|
|
39
|
+
},
|
|
23
40
|
],
|
|
24
41
|
configSlots: [
|
|
25
42
|
{
|
|
@@ -84,5 +101,10 @@ export const descriptor = {
|
|
|
84
101
|
path: "./README.md",
|
|
85
102
|
description: "Agent Gateway package overview",
|
|
86
103
|
},
|
|
104
|
+
{
|
|
105
|
+
id: "configuration",
|
|
106
|
+
path: "./CONFIGURATION.md",
|
|
107
|
+
description: "Module configuration fields, sources and materialization instructions",
|
|
108
|
+
},
|
|
87
109
|
],
|
|
88
110
|
};
|
package/dist/src/cli.js
CHANGED
|
@@ -1,29 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { spawnSync } from "node:child_process";
|
|
3
2
|
import { createAgentGatewayProcess, loadAgentGatewayProcessConfig, } from "./process.js";
|
|
4
|
-
function installSelf() {
|
|
5
|
-
const executable = process.platform === "win32" ? "platform.cmd" : "platform";
|
|
6
|
-
const result = spawnSync(executable, ["install", "@tomflow/proflow-agent-gateway", "--workspace", process.cwd()], { cwd: process.cwd(), env: process.env, stdio: "inherit" });
|
|
7
|
-
if (result.error) {
|
|
8
|
-
if (result.error.code === "ENOENT") {
|
|
9
|
-
process.stderr.write("GLOBAL_PLATFORM_CLI_REQUIRED: install @tomflow/proflow-platform-cli globally before package-owned install\n");
|
|
10
|
-
process.exit(127);
|
|
11
|
-
}
|
|
12
|
-
throw result.error;
|
|
13
|
-
}
|
|
14
|
-
process.exit(result.status ?? 1);
|
|
15
|
-
}
|
|
16
3
|
async function main() {
|
|
17
4
|
const [command, configPath] = process.argv.slice(2);
|
|
18
5
|
if (command === "--help" || command === "-h") {
|
|
19
|
-
process.stdout.write("Usage: proflow-agent-gateway
|
|
6
|
+
process.stdout.write("Usage: proflow-agent-gateway start /absolute/config.json\\n");
|
|
20
7
|
process.exit(0);
|
|
21
8
|
}
|
|
22
|
-
if (command === "install") {
|
|
23
|
-
if (configPath)
|
|
24
|
-
throw new Error("Usage: proflow-agent-gateway install");
|
|
25
|
-
installSelf();
|
|
26
|
-
}
|
|
27
9
|
if (command !== "start" || !configPath)
|
|
28
10
|
throw new Error("Usage: proflow-agent-gateway start /absolute/config.json");
|
|
29
11
|
const config = await loadAgentGatewayProcessConfig(configPath);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tomflow/proflow-agent-gateway",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -19,22 +19,23 @@
|
|
|
19
19
|
"dist",
|
|
20
20
|
"proflow.module.json",
|
|
21
21
|
"conformance.json",
|
|
22
|
-
"README.md"
|
|
22
|
+
"README.md",
|
|
23
|
+
"CONFIGURATION.md"
|
|
23
24
|
],
|
|
24
25
|
"dependencies": {
|
|
25
|
-
"zod": "4.1.12"
|
|
26
|
+
"zod": "4.1.12",
|
|
27
|
+
"@tomflow/proflow-module-contract": "^0.1.3"
|
|
26
28
|
},
|
|
27
29
|
"devDependencies": {
|
|
28
|
-
"@tomflow/proflow-
|
|
29
|
-
"@tomflow/proflow-task-
|
|
30
|
-
"@tomflow/proflow-
|
|
31
|
-
"@tomflow/proflow-
|
|
32
|
-
"@tomflow/proflow-
|
|
33
|
-
"@tomflow/proflow-
|
|
34
|
-
"@tomflow/proflow-execution-runtime": "^0.1.
|
|
35
|
-
"@tomflow/proflow-
|
|
36
|
-
"@tomflow/proflow-platform-host": "^0.1.
|
|
37
|
-
"@tomflow/proflow-execution-local": "^0.1.3"
|
|
30
|
+
"@tomflow/proflow-execution-browser-extension": "^0.1.4",
|
|
31
|
+
"@tomflow/proflow-task-orchestration": "^0.1.2",
|
|
32
|
+
"@tomflow/proflow-task-store-sqlite": "^0.1.3",
|
|
33
|
+
"@tomflow/proflow-task-migration-runner": "^0.1.3",
|
|
34
|
+
"@tomflow/proflow-execution-local": "^0.1.4",
|
|
35
|
+
"@tomflow/proflow-agent-runtime": "^0.1.3",
|
|
36
|
+
"@tomflow/proflow-execution-runtime": "^0.1.6",
|
|
37
|
+
"@tomflow/proflow-deployment-conformance": "^0.1.3",
|
|
38
|
+
"@tomflow/proflow-platform-host": "^0.1.5"
|
|
38
39
|
},
|
|
39
40
|
"description": "The sole Custom GPT Actions HTTP ingress and OpenAI transport anti-corruption layer.",
|
|
40
41
|
"keywords": [
|
|
@@ -44,15 +45,7 @@
|
|
|
44
45
|
],
|
|
45
46
|
"proflow": {
|
|
46
47
|
"module": true,
|
|
47
|
-
"installClass": "core",
|
|
48
48
|
"descriptor": "./dist/deployment/descriptor.js",
|
|
49
|
-
"installRequires": [
|
|
50
|
-
"@tomflow/proflow-agent-runtime",
|
|
51
|
-
"@tomflow/proflow-dev-tunnel",
|
|
52
|
-
"@tomflow/proflow-execution-runtime",
|
|
53
|
-
"@tomflow/proflow-platform-host",
|
|
54
|
-
"@tomflow/proflow-task-orchestration"
|
|
55
|
-
],
|
|
56
49
|
"manifest": "./proflow.module.json"
|
|
57
50
|
},
|
|
58
51
|
"scripts": {
|
package/proflow.module.json
CHANGED
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
"contractVersion": "1.0.0",
|
|
4
4
|
"moduleRef": "agent-gateway",
|
|
5
5
|
"packageName": "@tomflow/proflow-agent-gateway",
|
|
6
|
-
"moduleVersion": "0.1.
|
|
6
|
+
"moduleVersion": "0.1.5",
|
|
7
7
|
"kind": "service",
|
|
8
8
|
"templateVersion": "1.0.0",
|
|
9
9
|
"platformCompatibility": ">=1.0.0 <2.0.0",
|
|
10
|
-
"installClass": "core",
|
|
11
10
|
"identity": {
|
|
12
11
|
"domain": "agent-runtime-collaboration",
|
|
13
12
|
"summary": "The sole Custom GPT Actions HTTP ingress and OpenAI transport anti-corruption layer."
|
|
@@ -101,6 +100,11 @@
|
|
|
101
100
|
"id": "overview",
|
|
102
101
|
"path": "./README.md",
|
|
103
102
|
"description": "Agent Gateway package overview"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "configuration",
|
|
106
|
+
"path": "./CONFIGURATION.md",
|
|
107
|
+
"description": "Module configuration fields, sources and materialization instructions"
|
|
104
108
|
}
|
|
105
109
|
]
|
|
106
110
|
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# @tomflow/proflow-agent-gateway
|
|
2
|
-
|
|
3
|
-
## 0.1.3
|
|
4
|
-
|
|
5
|
-
### Patch Changes
|
|
6
|
-
|
|
7
|
-
- Real-1 final remediation and black-box release closure
|
|
8
|
-
|
|
9
|
-
## 0.1.2
|
|
10
|
-
|
|
11
|
-
### Patch Changes
|
|
12
|
-
|
|
13
|
-
- Close the Real-1 global Platform control-plane contract across every published ProFlow package. Platform CLI now owns one durable global Workspace binding with canonical identity, cross-process operation locking, cwd/`--workspace` install targeting, cross-directory instance commands, whole-instance uninstall/rebind, and deterministic npm/yarn/pnpm Workspace package-manager selection. Every package-owned install entry, including newly generated Module Template packages, delegates to the Shell-global `platform` command and fails closed when that global CLI is unavailable; Deployment Conformance and the formal test plans mechanically enforce the same rule across all 24 packages.
|
|
14
|
-
|
|
15
|
-
## 0.1.1
|
|
16
|
-
|
|
17
|
-
### Patch Changes
|
|
18
|
-
|
|
19
|
-
- Close Real-1 deployment graph and Fresh Workspace bootstrap gaps: remove Contract-library runtime-provider aliases, correct Execution/Model dependency direction, materialize logical/moduleRef providers through `installRequires`, enforce repository graph validation, and keep self-install executables stable without package-manager worktree mutation.
|