@tomflow/proflow-agent-gateway 0.1.14 → 0.1.16

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @tomflow/proflow-agent-gateway
2
2
 
3
+ ## 0.1.16
4
+
5
+ ### Patch Changes
6
+
7
+ - Release the verified Real-3 B1 task recovery, exact execution identity, durable observer resume, bounded gateway error, and matching Agent Action contract fixes.
8
+
9
+ ## 0.1.15
10
+
11
+ ### Patch Changes
12
+
13
+ - Add professional setup orchestration, Provider FAST/THINK input, recoverable managed Dev Tunnel provisioning, Browser installation guidance, and precise status diagnostics.
14
+
3
15
  ## 0.1.14
4
16
 
5
17
  ### Patch Changes
@@ -6,7 +6,7 @@ export declare const behaviorAdapter: {
6
6
  ok: true;
7
7
  status: "SUCCEEDED";
8
8
  moduleRef: "agent-gateway";
9
- moduleVersion: "0.1.14";
9
+ moduleVersion: "0.1.16";
10
10
  data: {
11
11
  localBaseUrl: string;
12
12
  publicBaseUrl?: string;
@@ -20,7 +20,7 @@ export declare const behaviorAdapter: {
20
20
  readonly ok: true;
21
21
  readonly status: "SUCCEEDED";
22
22
  readonly moduleRef: "agent-gateway";
23
- readonly moduleVersion: "0.1.14";
23
+ readonly moduleVersion: "0.1.16";
24
24
  };
25
25
  observedEffects: string[];
26
26
  }>;
@@ -30,7 +30,7 @@ export declare const behaviorAdapter: {
30
30
  ok: true;
31
31
  status: "SUCCEEDED";
32
32
  moduleRef: "agent-gateway";
33
- moduleVersion: "0.1.14";
33
+ moduleVersion: "0.1.16";
34
34
  data: {
35
35
  setupStatus: "BLOCKED" | "READY";
36
36
  runtimeStatus: "RUNNING" | "STOPPED";
@@ -51,7 +51,7 @@ export declare const behaviorAdapter: {
51
51
  ok: true;
52
52
  status: "SUCCEEDED";
53
53
  moduleRef: "agent-gateway";
54
- moduleVersion: "0.1.14";
54
+ moduleVersion: "0.1.16";
55
55
  data: {
56
56
  localBaseUrl: string;
57
57
  publicBaseUrl?: string;
@@ -66,7 +66,7 @@ export declare const behaviorAdapter: {
66
66
  ok: true;
67
67
  status: "SUCCEEDED";
68
68
  moduleRef: "agent-gateway";
69
- moduleVersion: "0.1.14";
69
+ moduleVersion: "0.1.16";
70
70
  data: {
71
71
  docs: string;
72
72
  };
@@ -79,7 +79,7 @@ export declare const behaviorAdapter: {
79
79
  ok: true;
80
80
  status: "SUCCEEDED";
81
81
  moduleRef: "agent-gateway";
82
- moduleVersion: "0.1.14";
82
+ moduleVersion: "0.1.16";
83
83
  data: {
84
84
  host: string;
85
85
  port: number;
@@ -90,7 +90,7 @@ export declare const behaviorAdapter: {
90
90
  result: {
91
91
  contract: "deployment.result.v1";
92
92
  moduleRef: "agent-gateway";
93
- moduleVersion: "0.1.14";
93
+ moduleVersion: "0.1.16";
94
94
  ok: false;
95
95
  status: "FAILED";
96
96
  error: {
@@ -107,7 +107,7 @@ export declare const behaviorAdapter: {
107
107
  readonly ok: true;
108
108
  readonly status: "SUCCEEDED";
109
109
  readonly moduleRef: "agent-gateway";
110
- readonly moduleVersion: "0.1.14";
110
+ readonly moduleVersion: "0.1.16";
111
111
  };
112
112
  observedEffects: string[];
113
113
  } | {
@@ -116,11 +116,11 @@ export declare const behaviorAdapter: {
116
116
  readonly ok: true;
117
117
  readonly status: "SUCCEEDED";
118
118
  readonly moduleRef: "agent-gateway";
119
- readonly moduleVersion: "0.1.14";
119
+ readonly moduleVersion: "0.1.16";
120
120
  } | {
121
121
  contract: "deployment.result.v1";
122
122
  moduleRef: "agent-gateway";
123
- moduleVersion: "0.1.14";
123
+ moduleVersion: "0.1.16";
124
124
  ok: false;
125
125
  status: "FAILED";
126
126
  error: {
@@ -25,19 +25,31 @@ async function readOwnFacts(context) {
25
25
  const localBaseUrl = factString(facts, "localBaseUrl");
26
26
  return localBaseUrl ? { localBaseUrl } : undefined;
27
27
  }
28
- async function dependencies(context) {
28
+ async function dependencyObservation(context) {
29
29
  const tunnel = await readModuleSharedFacts(context, "dev-tunnel");
30
30
  const host = await readModuleSharedFacts(context, "platform-host");
31
31
  const publicBaseUrl = factString(tunnel, "publicBaseUrl");
32
32
  const downstreamBaseUrl = factString(host, "endpoint");
33
33
  const downstreamCredentialFile = factString(host, "gatewayTransportCredentialFile");
34
34
  const stateRoot = factString(host, "stateRoot");
35
- return publicBaseUrl &&
36
- downstreamBaseUrl &&
37
- downstreamCredentialFile &&
38
- stateRoot
39
- ? { publicBaseUrl, downstreamBaseUrl, downstreamCredentialFile, stateRoot }
35
+ const missing = [
36
+ ...(!publicBaseUrl ? ["dev-tunnel"] : []),
37
+ ...(!downstreamBaseUrl || !downstreamCredentialFile || !stateRoot
38
+ ? ["platform-host"]
39
+ : []),
40
+ ];
41
+ const value = publicBaseUrl && downstreamBaseUrl && downstreamCredentialFile && stateRoot
42
+ ? {
43
+ publicBaseUrl,
44
+ downstreamBaseUrl,
45
+ downstreamCredentialFile,
46
+ stateRoot,
47
+ }
40
48
  : undefined;
49
+ return { value, missing };
50
+ }
51
+ async function dependencies(context) {
52
+ return (await dependencyObservation(context)).value;
41
53
  }
42
54
  async function running(context) {
43
55
  const own = await readOwnFacts(context);
@@ -96,7 +108,8 @@ export const behaviorAdapter = {
96
108
  };
97
109
  },
98
110
  status: async (context) => {
99
- const ready = await dependencies(context);
111
+ const dependency = await dependencyObservation(context);
112
+ const ready = dependency.value;
100
113
  return {
101
114
  result: {
102
115
  ...base,
@@ -112,9 +125,11 @@ export const behaviorAdapter = {
112
125
  {
113
126
  scope: "SETUP",
114
127
  code: "UPSTREAM_NOT_READY",
115
- message: "等待 dev-tunnel 发布公开 HTTPS 地址,并等待 platform-host 发布下游端点与传输凭据",
116
- relatedModuleRefs: ["dev-tunnel", "platform-host"],
117
- nextCommand: "platform setup --module dev-tunnel",
128
+ message: `等待 ${dependency.missing.join("、")} 完成前置配置`,
129
+ relatedModuleRefs: dependency.missing,
130
+ nextCommand: dependency.missing[0] === "dev-tunnel"
131
+ ? "platform setup --module dev-tunnel"
132
+ : "platform setup",
118
133
  },
119
134
  ],
120
135
  }),
@@ -123,18 +138,21 @@ export const behaviorAdapter = {
123
138
  observedEffects: [],
124
139
  };
125
140
  },
126
- setup: async (context) => ({
127
- result: {
128
- ...base,
129
- data: {
130
- ...(await ownFacts(context)),
131
- ...((await dependencies(context)) === undefined
132
- ? { waitingFor: ["dev-tunnel", "platform-host"] }
133
- : {}),
141
+ setup: async (context) => {
142
+ const dependency = await dependencyObservation(context);
143
+ return {
144
+ result: {
145
+ ...base,
146
+ data: {
147
+ ...(await ownFacts(context)),
148
+ ...(dependency.value === undefined
149
+ ? { waitingFor: dependency.missing }
150
+ : {}),
151
+ },
134
152
  },
135
- },
136
- observedEffects: [],
137
- }),
153
+ observedEffects: [],
154
+ };
155
+ },
138
156
  docs: async (_context) => ({
139
157
  result: {
140
158
  ...base,
@@ -3,7 +3,7 @@ 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.14";
6
+ readonly moduleVersion: "0.1.16";
7
7
  readonly kind: "service";
8
8
  readonly templateVersion: "1.0.0";
9
9
  readonly platformCompatibility: ">=1.0.0 <2.0.0";
@@ -3,7 +3,7 @@ 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.14",
6
+ moduleVersion: "0.1.16",
7
7
  kind: "service",
8
8
  templateVersion: "1.0.0",
9
9
  platformCompatibility: ">=1.0.0 <2.0.0",
@@ -1,7 +1,65 @@
1
1
  import { createHash, timingSafeEqual } from "node:crypto";
2
2
  import { readFile, stat } from "node:fs/promises";
3
3
  import { resolve } from "node:path";
4
- import { createAgentGateway } from "./index.js";
4
+ import { AgentGatewayError, createAgentGateway } from "./index.js";
5
+ const MAX_DOWNSTREAM_ERROR_BYTES = 8_192;
6
+ const safeDownstreamErrorCodes = new Set([
7
+ "INVALID_REQUEST",
8
+ "ROLE_OPERATION_DENIED",
9
+ "TASK_ROLE_BINDING_REQUIRED",
10
+ "TASK_WORKER_BINDING_MISMATCH",
11
+ "ROLE_NOT_TASK_PARTICIPANT",
12
+ "WORKER_IDENTITY_INVALID",
13
+ "WORKER_MISMATCH",
14
+ "TASK_TERMINAL",
15
+ "EXECUTION_TASK_NOT_ACTIVE",
16
+ "EXECUTION_NODE_NOT_CURRENT",
17
+ "EXECUTION_NODE_NOT_RUNNING",
18
+ "EXECUTION_GENERATION_MISMATCH",
19
+ "EXECUTION_ROLE_SCOPE_MISMATCH",
20
+ "EXECUTION_WORKER_SCOPE_MISMATCH",
21
+ ]);
22
+ async function boundedDownstreamErrorCode(response) {
23
+ if (!response.body)
24
+ return null;
25
+ const reader = response.body.getReader();
26
+ const chunks = [];
27
+ let bytes = 0;
28
+ try {
29
+ while (true) {
30
+ const next = await reader.read();
31
+ if (next.done)
32
+ break;
33
+ bytes += next.value.byteLength;
34
+ if (bytes > MAX_DOWNSTREAM_ERROR_BYTES) {
35
+ await reader.cancel();
36
+ return null;
37
+ }
38
+ chunks.push(next.value);
39
+ }
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ const merged = new Uint8Array(bytes);
45
+ let offset = 0;
46
+ for (const chunk of chunks) {
47
+ merged.set(chunk, offset);
48
+ offset += chunk.byteLength;
49
+ }
50
+ try {
51
+ const value = JSON.parse(new TextDecoder().decode(merged));
52
+ if (typeof value !== "object" || value === null || Array.isArray(value))
53
+ return null;
54
+ const code = Reflect.get(value, "error");
55
+ return typeof code === "string" && safeDownstreamErrorCodes.has(code)
56
+ ? code
57
+ : null;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
5
63
  function record(value, name) {
6
64
  if (typeof value !== "object" || value === null || Array.isArray(value))
7
65
  throw new TypeError(`${name} must be an object`);
@@ -92,21 +150,41 @@ export async function createAgentGatewayProcess(input) {
92
150
  const downstreamCredential = input.config.downstreamCredentialFile
93
151
  ? await readDownstreamCredential(input.config.downstreamCredentialFile)
94
152
  : undefined;
95
- const response = await fetchImplementation(`${input.config.downstreamBaseUrl}${path}`, {
96
- method: body === undefined ? "GET" : "POST",
97
- headers: {
98
- ...(body === undefined ? {} : { "content-type": "application/json" }),
99
- ...(downstreamCredential
100
- ? { authorization: `Bearer ${downstreamCredential}` }
101
- : {}),
102
- },
103
- ...(body === undefined ? {} : { body: JSON.stringify(body) }),
104
- ...(signal ? { signal } : {}),
105
- });
106
- if (!response.ok)
107
- throw Object.assign(new Error("DOWNSTREAM_UNAVAILABLE"), {
153
+ let response;
154
+ try {
155
+ response = await fetchImplementation(`${input.config.downstreamBaseUrl}${path}`, {
156
+ method: body === undefined ? "GET" : "POST",
157
+ headers: {
158
+ ...(body === undefined
159
+ ? {}
160
+ : { "content-type": "application/json" }),
161
+ ...(downstreamCredential
162
+ ? { authorization: `Bearer ${downstreamCredential}` }
163
+ : {}),
164
+ },
165
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
166
+ ...(signal ? { signal } : {}),
167
+ });
168
+ }
169
+ catch {
170
+ throw Object.assign(new AgentGatewayError(signal?.aborted
171
+ ? "OPENAI_ACTION_TIMEOUT"
172
+ : "OWNER_SERVICE_UNAVAILABLE"), { httpStatus: signal?.aborted ? 504 : 503 });
173
+ }
174
+ if (!response.ok) {
175
+ const downstreamCode = await boundedDownstreamErrorCode(response);
176
+ const code = response.status >= 500 || response.status === 401
177
+ ? "OWNER_SERVICE_UNAVAILABLE"
178
+ : (downstreamCode ??
179
+ (response.status === 400
180
+ ? "INVALID_REQUEST"
181
+ : response.status === 403
182
+ ? "ROLE_OPERATION_DENIED"
183
+ : "DOWNSTREAM_UNAVAILABLE"));
184
+ throw Object.assign(new AgentGatewayError(code), {
108
185
  httpStatus: response.status,
109
186
  });
187
+ }
110
188
  return response.json();
111
189
  };
112
190
  const gateway = await createAgentGateway({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tomflow/proflow-agent-gateway",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -28,15 +28,15 @@
28
28
  "@tomflow/proflow-module-contract": "^0.1.13"
29
29
  },
30
30
  "devDependencies": {
31
- "@tomflow/proflow-task-migration-runner": "^0.1.11",
32
- "@tomflow/proflow-execution-local": "^0.1.13",
33
- "@tomflow/proflow-agent-runtime": "^0.1.10",
34
- "@tomflow/proflow-platform-host": "^0.1.14",
35
- "@tomflow/proflow-execution-runtime": "^0.1.15",
36
- "@tomflow/proflow-execution-browser-extension": "^0.1.14",
31
+ "@tomflow/proflow-agent-runtime": "^0.1.13",
32
+ "@tomflow/proflow-deployment-conformance": "^0.1.13",
33
+ "@tomflow/proflow-execution-browser-extension": "^0.1.45",
34
+ "@tomflow/proflow-execution-runtime": "^0.1.18",
35
+ "@tomflow/proflow-task-orchestration": "^0.1.11",
37
36
  "@tomflow/proflow-task-store-sqlite": "^0.1.11",
38
- "@tomflow/proflow-task-orchestration": "^0.1.9",
39
- "@tomflow/proflow-deployment-conformance": "^0.1.12"
37
+ "@tomflow/proflow-task-migration-runner": "^0.1.11",
38
+ "@tomflow/proflow-execution-local": "^0.1.15",
39
+ "@tomflow/proflow-platform-host": "^0.1.19"
40
40
  },
41
41
  "description": "The sole Custom GPT Actions HTTP ingress and OpenAI transport anti-corruption layer.",
42
42
  "keywords": [
@@ -3,7 +3,7 @@
3
3
  "contractVersion": "1.0.0",
4
4
  "moduleRef": "agent-gateway",
5
5
  "packageName": "@tomflow/proflow-agent-gateway",
6
- "moduleVersion": "0.1.14",
6
+ "moduleVersion": "0.1.16",
7
7
  "kind": "service",
8
8
  "templateVersion": "1.0.0",
9
9
  "platformCompatibility": ">=1.0.0 <2.0.0",