agent-embassy 1.0.0
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 +61 -0
- package/CONTRIBUTING.md +122 -0
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/README.zh-CN.md +185 -0
- package/SECURITY.md +224 -0
- package/assets/live-dashboard/app.css +1610 -0
- package/assets/mark-seal.svg +7 -0
- package/assets/mark.svg +7 -0
- package/assets/social-preview.png +0 -0
- package/assets/vendor/react/LICENSE +21 -0
- package/assets/vendor/react/react-dom.production.min.js +267 -0
- package/assets/vendor/react/react.production.min.js +31 -0
- package/dist/src/errors.d.ts +5 -0
- package/dist/src/errors.js +11 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/gateway/claude-compatibility-scratch.d.ts +18 -0
- package/dist/src/gateway/claude-compatibility-scratch.js +158 -0
- package/dist/src/gateway/claude-compatibility-scratch.js.map +1 -0
- package/dist/src/gateway/claude-helper-client.d.ts +43 -0
- package/dist/src/gateway/claude-helper-client.js +212 -0
- package/dist/src/gateway/claude-helper-client.js.map +1 -0
- package/dist/src/gateway/claude-helper-protocol.d.ts +172 -0
- package/dist/src/gateway/claude-helper-protocol.js +373 -0
- package/dist/src/gateway/claude-helper-protocol.js.map +1 -0
- package/dist/src/gateway/claude-helper-supervisor.d.ts +74 -0
- package/dist/src/gateway/claude-helper-supervisor.js +497 -0
- package/dist/src/gateway/claude-helper-supervisor.js.map +1 -0
- package/dist/src/gateway/claude-helper.d.ts +1 -0
- package/dist/src/gateway/claude-helper.js +269 -0
- package/dist/src/gateway/claude-helper.js.map +1 -0
- package/dist/src/gateway/claude-peer.d.ts +273 -0
- package/dist/src/gateway/claude-peer.js +2359 -0
- package/dist/src/gateway/claude-peer.js.map +1 -0
- package/dist/src/gateway/claude-runtime.d.ts +40 -0
- package/dist/src/gateway/claude-runtime.js +302 -0
- package/dist/src/gateway/claude-runtime.js.map +1 -0
- package/dist/src/gateway/cli-copy.d.ts +8 -0
- package/dist/src/gateway/cli-copy.en.d.ts +13 -0
- package/dist/src/gateway/cli-copy.en.js +43 -0
- package/dist/src/gateway/cli-copy.en.js.map +1 -0
- package/dist/src/gateway/cli-copy.js +19 -0
- package/dist/src/gateway/cli-copy.js.map +1 -0
- package/dist/src/gateway/cli-copy.zh-CN.d.ts +13 -0
- package/dist/src/gateway/cli-copy.zh-CN.js +43 -0
- package/dist/src/gateway/cli-copy.zh-CN.js.map +1 -0
- package/dist/src/gateway/cli.d.ts +44 -0
- package/dist/src/gateway/cli.js +969 -0
- package/dist/src/gateway/cli.js.map +1 -0
- package/dist/src/gateway/codex-app-server.d.ts +310 -0
- package/dist/src/gateway/codex-app-server.js +1746 -0
- package/dist/src/gateway/codex-app-server.js.map +1 -0
- package/dist/src/gateway/codex-local-transport.d.ts +81 -0
- package/dist/src/gateway/codex-local-transport.js +617 -0
- package/dist/src/gateway/codex-local-transport.js.map +1 -0
- package/dist/src/gateway/codex-registration-generation.d.ts +5 -0
- package/dist/src/gateway/codex-registration-generation.js +19 -0
- package/dist/src/gateway/codex-registration-generation.js.map +1 -0
- package/dist/src/gateway/codex-registration-succession.d.ts +209 -0
- package/dist/src/gateway/codex-registration-succession.js +588 -0
- package/dist/src/gateway/codex-registration-succession.js.map +1 -0
- package/dist/src/gateway/compatibility.d.ts +70 -0
- package/dist/src/gateway/compatibility.js +252 -0
- package/dist/src/gateway/compatibility.js.map +1 -0
- package/dist/src/gateway/config.d.ts +24 -0
- package/dist/src/gateway/config.js +130 -0
- package/dist/src/gateway/config.js.map +1 -0
- package/dist/src/gateway/control.d.ts +308 -0
- package/dist/src/gateway/control.js +1573 -0
- package/dist/src/gateway/control.js.map +1 -0
- package/dist/src/gateway/dashboard-copy.d.ts +7 -0
- package/dist/src/gateway/dashboard-copy.en.d.ts +506 -0
- package/dist/src/gateway/dashboard-copy.en.js +507 -0
- package/dist/src/gateway/dashboard-copy.en.js.map +1 -0
- package/dist/src/gateway/dashboard-copy.js +516 -0
- package/dist/src/gateway/dashboard-copy.js.map +1 -0
- package/dist/src/gateway/dashboard-copy.zh-CN.d.ts +506 -0
- package/dist/src/gateway/dashboard-copy.zh-CN.js +507 -0
- package/dist/src/gateway/dashboard-copy.zh-CN.js.map +1 -0
- package/dist/src/gateway/dashboard-model.d.ts +207 -0
- package/dist/src/gateway/dashboard-model.js +720 -0
- package/dist/src/gateway/dashboard-model.js.map +1 -0
- package/dist/src/gateway/dashboard.d.ts +26 -0
- package/dist/src/gateway/dashboard.js +941 -0
- package/dist/src/gateway/dashboard.js.map +1 -0
- package/dist/src/gateway/delivery-machine.d.ts +235 -0
- package/dist/src/gateway/delivery-machine.js +540 -0
- package/dist/src/gateway/delivery-machine.js.map +1 -0
- package/dist/src/gateway/instance-lease.d.ts +21 -0
- package/dist/src/gateway/instance-lease.js +549 -0
- package/dist/src/gateway/instance-lease.js.map +1 -0
- package/dist/src/gateway/live-dashboard-app/app.js +2914 -0
- package/dist/src/gateway/live-dashboard-assets.d.ts +10 -0
- package/dist/src/gateway/live-dashboard-assets.js +73 -0
- package/dist/src/gateway/live-dashboard-assets.js.map +1 -0
- package/dist/src/gateway/live-dashboard-bootstrap.d.ts +36 -0
- package/dist/src/gateway/live-dashboard-bootstrap.js +176 -0
- package/dist/src/gateway/live-dashboard-bootstrap.js.map +1 -0
- package/dist/src/gateway/live-dashboard-command.d.ts +54 -0
- package/dist/src/gateway/live-dashboard-command.js +324 -0
- package/dist/src/gateway/live-dashboard-command.js.map +1 -0
- package/dist/src/gateway/live-dashboard-http.d.ts +41 -0
- package/dist/src/gateway/live-dashboard-http.js +445 -0
- package/dist/src/gateway/live-dashboard-http.js.map +1 -0
- package/dist/src/gateway/live-dashboard-protocol.d.ts +38 -0
- package/dist/src/gateway/live-dashboard-protocol.js +156 -0
- package/dist/src/gateway/live-dashboard-protocol.js.map +1 -0
- package/dist/src/gateway/live-dashboard-server.d.ts +33 -0
- package/dist/src/gateway/live-dashboard-server.js +130 -0
- package/dist/src/gateway/live-dashboard-server.js.map +1 -0
- package/dist/src/gateway/live-dashboard-stream.d.ts +46 -0
- package/dist/src/gateway/live-dashboard-stream.js +233 -0
- package/dist/src/gateway/live-dashboard-stream.js.map +1 -0
- package/dist/src/gateway/live-dashboard.d.ts +31 -0
- package/dist/src/gateway/live-dashboard.js +190 -0
- package/dist/src/gateway/live-dashboard.js.map +1 -0
- package/dist/src/gateway/locale.d.ts +4 -0
- package/dist/src/gateway/locale.js +10 -0
- package/dist/src/gateway/locale.js.map +1 -0
- package/dist/src/gateway/progress-watch-machine.d.ts +97 -0
- package/dist/src/gateway/progress-watch-machine.js +172 -0
- package/dist/src/gateway/progress-watch-machine.js.map +1 -0
- package/dist/src/gateway/providers.d.ts +287 -0
- package/dist/src/gateway/providers.js +2451 -0
- package/dist/src/gateway/providers.js.map +1 -0
- package/dist/src/gateway/server.d.ts +57 -0
- package/dist/src/gateway/server.js +264 -0
- package/dist/src/gateway/server.js.map +1 -0
- package/dist/src/gateway/service.d.ts +449 -0
- package/dist/src/gateway/service.js +4831 -0
- package/dist/src/gateway/service.js.map +1 -0
- package/dist/src/gateway/store.d.ts +340 -0
- package/dist/src/gateway/store.js +4047 -0
- package/dist/src/gateway/store.js.map +1 -0
- package/dist/src/gateway/types.d.ts +514 -0
- package/dist/src/gateway/types.js +414 -0
- package/dist/src/gateway/types.js.map +1 -0
- package/dist/src/mutex.d.ts +4 -0
- package/dist/src/mutex.js +23 -0
- package/dist/src/mutex.js.map +1 -0
- package/docs/DESIGN.md +134 -0
- package/docs/GATEWAY-ARCHITECTURE.md +858 -0
- package/package.json +80 -0
- package/skills/embassy-peer/SKILL.md +198 -0
- package/skills/embassy-peer/agents/openai.yaml +4 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export declare const compatibilityPolicies: readonly ["observed", "strict"];
|
|
2
|
+
export type CompatibilityPolicy = (typeof compatibilityPolicies)[number];
|
|
3
|
+
export declare const compatibilitySurfaces: readonly ["claude", "codex"];
|
|
4
|
+
export type CompatibilitySurface = (typeof compatibilitySurfaces)[number];
|
|
5
|
+
/** Exact upstream builds exercised by this release's deterministic suite. */
|
|
6
|
+
export declare const certifiedCompatibilityVersions: Readonly<{
|
|
7
|
+
claude: readonly string[];
|
|
8
|
+
codex: readonly string[];
|
|
9
|
+
}>;
|
|
10
|
+
export declare const compatibilityTiers: readonly ["certified", "schema_attested", "incompatible"];
|
|
11
|
+
export type CompatibilityTier = (typeof compatibilityTiers)[number];
|
|
12
|
+
export declare const compatibilityProbeNames: {
|
|
13
|
+
readonly claude: readonly ["launcher", "version", "registry_schema", "messaging_socket", "protocol_constants"];
|
|
14
|
+
readonly codex: readonly ["installation", "control_socket", "initialize", "thread_list"];
|
|
15
|
+
};
|
|
16
|
+
export type CompatibilityProbeName = (typeof compatibilityProbeNames)[CompatibilitySurface][number];
|
|
17
|
+
export type CompatibilityProbeResult = Readonly<{
|
|
18
|
+
name: CompatibilityProbeName;
|
|
19
|
+
outcome: "pass" | "fail";
|
|
20
|
+
safeErrorCode?: string;
|
|
21
|
+
}>;
|
|
22
|
+
export declare const compatibilityCertificationDepths: readonly ["wire", "thread_ops", "turn"];
|
|
23
|
+
export type CompatibilityCertificationDepth = (typeof compatibilityCertificationDepths)[number];
|
|
24
|
+
export type CompatibilityCertification = Readonly<{
|
|
25
|
+
depth: CompatibilityCertificationDepth;
|
|
26
|
+
outcome: "pass" | "fail";
|
|
27
|
+
certifiedAt: string;
|
|
28
|
+
safeErrorCode?: string;
|
|
29
|
+
}>;
|
|
30
|
+
export type CompatibilityAttestation = Readonly<{
|
|
31
|
+
schemaVersion: 1;
|
|
32
|
+
surface: CompatibilitySurface;
|
|
33
|
+
version: string;
|
|
34
|
+
tier: CompatibilityTier;
|
|
35
|
+
checkedAt: string;
|
|
36
|
+
probes: readonly CompatibilityProbeResult[];
|
|
37
|
+
certification?: CompatibilityCertification;
|
|
38
|
+
safeErrorCode?: string;
|
|
39
|
+
}>;
|
|
40
|
+
export type CompatibilitySurfaceObservation = Readonly<{
|
|
41
|
+
surface: CompatibilitySurface;
|
|
42
|
+
version: string;
|
|
43
|
+
}>;
|
|
44
|
+
export type CompatibilityCheckReport = Readonly<{
|
|
45
|
+
policy: CompatibilityPolicy;
|
|
46
|
+
compatible: boolean;
|
|
47
|
+
surfaces: readonly CompatibilityAttestation[];
|
|
48
|
+
}>;
|
|
49
|
+
export type CompatibilityCertificationReport = Readonly<{
|
|
50
|
+
policy: CompatibilityPolicy;
|
|
51
|
+
certified: boolean;
|
|
52
|
+
withTurn: boolean;
|
|
53
|
+
surfaces: readonly CompatibilityAttestation[];
|
|
54
|
+
}>;
|
|
55
|
+
export declare function isCompatibilityVersion(value: unknown): value is string;
|
|
56
|
+
export declare function sharesCompatibilityMajor(left: string, right: string): boolean;
|
|
57
|
+
export declare function evaluateCompatibilityAttestation(input: Readonly<{
|
|
58
|
+
surface: CompatibilitySurface;
|
|
59
|
+
version: string;
|
|
60
|
+
checkedAt: string;
|
|
61
|
+
policy: CompatibilityPolicy;
|
|
62
|
+
certifiedVersions: readonly string[];
|
|
63
|
+
probes: readonly CompatibilityProbeResult[];
|
|
64
|
+
}>): CompatibilityAttestation;
|
|
65
|
+
export declare function isCompatibilityAttestation(value: unknown): value is CompatibilityAttestation;
|
|
66
|
+
export declare function isCompatibilityCertification(value: unknown): value is CompatibilityCertification;
|
|
67
|
+
export declare function attachCompatibilityCertification(attestation: CompatibilityAttestation, certification: CompatibilityCertification): CompatibilityAttestation;
|
|
68
|
+
export declare function compatibilityCacheKey(attestation: Pick<CompatibilityAttestation, "surface" | "version">): string;
|
|
69
|
+
export declare function isCompatibilityCheckReport(value: unknown): value is CompatibilityCheckReport;
|
|
70
|
+
export declare function isCompatibilityCertificationReport(value: unknown): value is CompatibilityCertificationReport;
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { BridgeError } from "../errors.js";
|
|
2
|
+
export const compatibilityPolicies = ["observed", "strict"];
|
|
3
|
+
export const compatibilitySurfaces = ["claude", "codex"];
|
|
4
|
+
/** Exact upstream builds exercised by this release's deterministic suite. */
|
|
5
|
+
export const certifiedCompatibilityVersions = Object.freeze({
|
|
6
|
+
claude: Object.freeze(["2.1.224", "2.1.225", "2.1.226"]),
|
|
7
|
+
codex: Object.freeze(["0.147.0"]),
|
|
8
|
+
});
|
|
9
|
+
export const compatibilityTiers = [
|
|
10
|
+
"certified",
|
|
11
|
+
"schema_attested",
|
|
12
|
+
"incompatible",
|
|
13
|
+
];
|
|
14
|
+
export const compatibilityProbeNames = {
|
|
15
|
+
claude: [
|
|
16
|
+
"launcher",
|
|
17
|
+
"version",
|
|
18
|
+
"registry_schema",
|
|
19
|
+
"messaging_socket",
|
|
20
|
+
"protocol_constants",
|
|
21
|
+
],
|
|
22
|
+
codex: [
|
|
23
|
+
"installation",
|
|
24
|
+
"control_socket",
|
|
25
|
+
"initialize",
|
|
26
|
+
"thread_list",
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
export const compatibilityCertificationDepths = [
|
|
30
|
+
"wire",
|
|
31
|
+
"thread_ops",
|
|
32
|
+
"turn",
|
|
33
|
+
];
|
|
34
|
+
const VERSION_PATTERN = /^[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}$/;
|
|
35
|
+
const SAFE_CODE_PATTERN = /^[A-Z][A-Z0-9_]{0,63}$/;
|
|
36
|
+
function versionDriftCode(surface) {
|
|
37
|
+
return surface === "claude" ? "CLAUDE_VERSION_DRIFT" : "CODEX_VERSION_DRIFT";
|
|
38
|
+
}
|
|
39
|
+
function requiredProbeNames(surface) {
|
|
40
|
+
return compatibilityProbeNames[surface];
|
|
41
|
+
}
|
|
42
|
+
function versionMajor(version) {
|
|
43
|
+
if (!VERSION_PATTERN.test(version)) {
|
|
44
|
+
throw new BridgeError("COMPAT_VERSION_INVALID", "Compatibility versions must use bounded numeric semantic version syntax.");
|
|
45
|
+
}
|
|
46
|
+
return Number(version.slice(0, version.indexOf(".")));
|
|
47
|
+
}
|
|
48
|
+
export function isCompatibilityVersion(value) {
|
|
49
|
+
return typeof value === "string" && VERSION_PATTERN.test(value);
|
|
50
|
+
}
|
|
51
|
+
export function sharesCompatibilityMajor(left, right) {
|
|
52
|
+
return (isCompatibilityVersion(left) &&
|
|
53
|
+
isCompatibilityVersion(right) &&
|
|
54
|
+
versionMajor(left) === versionMajor(right));
|
|
55
|
+
}
|
|
56
|
+
function normalizeProbes(surface, probes) {
|
|
57
|
+
const required = requiredProbeNames(surface);
|
|
58
|
+
if (probes.length !== required.length ||
|
|
59
|
+
probes.some((probe, index) => probe.name !== required[index] ||
|
|
60
|
+
(probe.outcome !== "pass" && probe.outcome !== "fail") ||
|
|
61
|
+
(probe.safeErrorCode !== undefined &&
|
|
62
|
+
!SAFE_CODE_PATTERN.test(probe.safeErrorCode)) ||
|
|
63
|
+
(probe.outcome === "pass" && probe.safeErrorCode !== undefined) ||
|
|
64
|
+
(probe.outcome === "fail" && probe.safeErrorCode === undefined))) {
|
|
65
|
+
throw new BridgeError("COMPAT_PROBE_SET_INVALID", "Compatibility probes must contain the exact ordered surface probe set.");
|
|
66
|
+
}
|
|
67
|
+
return probes.map((probe) => Object.freeze({ ...probe }));
|
|
68
|
+
}
|
|
69
|
+
export function evaluateCompatibilityAttestation(input) {
|
|
70
|
+
const observedAt = Date.parse(input.checkedAt);
|
|
71
|
+
if (!Number.isFinite(observedAt) ||
|
|
72
|
+
new Date(observedAt).toISOString() !== input.checkedAt) {
|
|
73
|
+
throw new BridgeError("COMPAT_TIMESTAMP_INVALID", "Compatibility evidence requires a valid timestamp.");
|
|
74
|
+
}
|
|
75
|
+
const versionMajorNumber = versionMajor(input.version);
|
|
76
|
+
const certified = new Set(input.certifiedVersions);
|
|
77
|
+
if (certified.size !== input.certifiedVersions.length ||
|
|
78
|
+
input.certifiedVersions.length === 0 ||
|
|
79
|
+
input.certifiedVersions.some((version) => !VERSION_PATTERN.test(version))) {
|
|
80
|
+
throw new BridgeError("COMPAT_CERTIFIED_SET_INVALID", "The certified version inventory must be nonempty, unique, and bounded.");
|
|
81
|
+
}
|
|
82
|
+
const normalizedProbes = normalizeProbes(input.surface, input.probes);
|
|
83
|
+
const failed = normalizedProbes.find((probe) => probe.outcome === "fail");
|
|
84
|
+
const certifiedVersion = certified.has(input.version);
|
|
85
|
+
const certifiedMajors = new Set(input.certifiedVersions.map((version) => versionMajor(version)));
|
|
86
|
+
const majorCompatible = certifiedMajors.has(versionMajorNumber);
|
|
87
|
+
let tier;
|
|
88
|
+
let safeErrorCode;
|
|
89
|
+
if (failed !== undefined) {
|
|
90
|
+
tier = "incompatible";
|
|
91
|
+
safeErrorCode = failed.safeErrorCode;
|
|
92
|
+
}
|
|
93
|
+
else if (certifiedVersion) {
|
|
94
|
+
tier = "certified";
|
|
95
|
+
}
|
|
96
|
+
else if (input.policy === "observed" && majorCompatible) {
|
|
97
|
+
tier = "schema_attested";
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
tier = "incompatible";
|
|
101
|
+
safeErrorCode = versionDriftCode(input.surface);
|
|
102
|
+
}
|
|
103
|
+
return Object.freeze({
|
|
104
|
+
schemaVersion: 1,
|
|
105
|
+
surface: input.surface,
|
|
106
|
+
version: input.version,
|
|
107
|
+
tier,
|
|
108
|
+
checkedAt: new Date(observedAt).toISOString(),
|
|
109
|
+
probes: normalizedProbes,
|
|
110
|
+
...(safeErrorCode === undefined ? {} : { safeErrorCode }),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
export function isCompatibilityAttestation(value) {
|
|
114
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
const candidate = value;
|
|
118
|
+
const keys = Object.keys(candidate);
|
|
119
|
+
const expected = new Set([
|
|
120
|
+
"schemaVersion",
|
|
121
|
+
"surface",
|
|
122
|
+
"version",
|
|
123
|
+
"tier",
|
|
124
|
+
"checkedAt",
|
|
125
|
+
"probes",
|
|
126
|
+
...(candidate.certification === undefined ? [] : ["certification"]),
|
|
127
|
+
...(candidate.safeErrorCode === undefined ? [] : ["safeErrorCode"]),
|
|
128
|
+
]);
|
|
129
|
+
if (keys.length !== expected.size || keys.some((key) => !expected.has(key))) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
if (candidate.schemaVersion !== 1 ||
|
|
133
|
+
!compatibilitySurfaces.includes(candidate.surface) ||
|
|
134
|
+
typeof candidate.version !== "string" ||
|
|
135
|
+
!VERSION_PATTERN.test(candidate.version) ||
|
|
136
|
+
!compatibilityTiers.includes(candidate.tier) ||
|
|
137
|
+
typeof candidate.checkedAt !== "string" ||
|
|
138
|
+
!Number.isFinite(Date.parse(candidate.checkedAt)) ||
|
|
139
|
+
new Date(Date.parse(candidate.checkedAt)).toISOString() !==
|
|
140
|
+
candidate.checkedAt ||
|
|
141
|
+
!Array.isArray(candidate.probes) ||
|
|
142
|
+
(candidate.certification !== undefined &&
|
|
143
|
+
!isCompatibilityCertification(candidate.certification)) ||
|
|
144
|
+
(candidate.safeErrorCode !== undefined &&
|
|
145
|
+
(typeof candidate.safeErrorCode !== "string" ||
|
|
146
|
+
!SAFE_CODE_PATTERN.test(candidate.safeErrorCode)))) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const normalized = normalizeProbes(candidate.surface, candidate.probes);
|
|
151
|
+
const failed = normalized.find((probe) => probe.outcome === "fail");
|
|
152
|
+
if (candidate.tier === "incompatible") {
|
|
153
|
+
return (candidate.safeErrorCode ===
|
|
154
|
+
(failed?.safeErrorCode ??
|
|
155
|
+
versionDriftCode(candidate.surface)));
|
|
156
|
+
}
|
|
157
|
+
return failed === undefined && candidate.safeErrorCode === undefined;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export function isCompatibilityCertification(value) {
|
|
164
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
const candidate = value;
|
|
168
|
+
const expected = new Set([
|
|
169
|
+
"depth",
|
|
170
|
+
"outcome",
|
|
171
|
+
"certifiedAt",
|
|
172
|
+
...(candidate.safeErrorCode === undefined ? [] : ["safeErrorCode"]),
|
|
173
|
+
]);
|
|
174
|
+
const parsedAt = typeof candidate.certifiedAt === "string"
|
|
175
|
+
? Date.parse(candidate.certifiedAt)
|
|
176
|
+
: Number.NaN;
|
|
177
|
+
return (Object.keys(candidate).length === expected.size &&
|
|
178
|
+
Object.keys(candidate).every((key) => expected.has(key)) &&
|
|
179
|
+
compatibilityCertificationDepths.includes(candidate.depth) &&
|
|
180
|
+
(candidate.outcome === "pass" || candidate.outcome === "fail") &&
|
|
181
|
+
Number.isFinite(parsedAt) &&
|
|
182
|
+
new Date(parsedAt).toISOString() === candidate.certifiedAt &&
|
|
183
|
+
(candidate.safeErrorCode === undefined ||
|
|
184
|
+
(typeof candidate.safeErrorCode === "string" &&
|
|
185
|
+
SAFE_CODE_PATTERN.test(candidate.safeErrorCode))) &&
|
|
186
|
+
(candidate.outcome === "pass") ===
|
|
187
|
+
(candidate.safeErrorCode === undefined));
|
|
188
|
+
}
|
|
189
|
+
export function attachCompatibilityCertification(attestation, certification) {
|
|
190
|
+
if (!isCompatibilityAttestation(attestation) ||
|
|
191
|
+
!isCompatibilityCertification(certification)) {
|
|
192
|
+
throw new BridgeError("COMPAT_CERTIFICATION_INVALID", "Compatibility certification must attach to one compatible attested surface.");
|
|
193
|
+
}
|
|
194
|
+
return Object.freeze({
|
|
195
|
+
...attestation,
|
|
196
|
+
certification: Object.freeze({ ...certification }),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
export function compatibilityCacheKey(attestation) {
|
|
200
|
+
return `${attestation.surface}\0${attestation.version}`;
|
|
201
|
+
}
|
|
202
|
+
export function isCompatibilityCheckReport(value) {
|
|
203
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
const candidate = value;
|
|
207
|
+
if (Object.keys(candidate).length !== 3 ||
|
|
208
|
+
!Object.hasOwn(candidate, "policy") ||
|
|
209
|
+
!Object.hasOwn(candidate, "compatible") ||
|
|
210
|
+
!Object.hasOwn(candidate, "surfaces") ||
|
|
211
|
+
!compatibilityPolicies.includes(candidate.policy) ||
|
|
212
|
+
typeof candidate.compatible !== "boolean" ||
|
|
213
|
+
!Array.isArray(candidate.surfaces) ||
|
|
214
|
+
candidate.surfaces.length !== compatibilitySurfaces.length ||
|
|
215
|
+
!candidate.surfaces.every(isCompatibilityAttestation)) {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
const surfaces = candidate.surfaces;
|
|
219
|
+
return (surfaces.every((attestation, index) => attestation.surface === compatibilitySurfaces[index]) &&
|
|
220
|
+
candidate.compatible ===
|
|
221
|
+
surfaces.every((attestation) => attestation.tier !== "incompatible"));
|
|
222
|
+
}
|
|
223
|
+
export function isCompatibilityCertificationReport(value) {
|
|
224
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
const candidate = value;
|
|
228
|
+
if (Object.keys(candidate).length !== 4 ||
|
|
229
|
+
!Object.hasOwn(candidate, "policy") ||
|
|
230
|
+
!Object.hasOwn(candidate, "certified") ||
|
|
231
|
+
!Object.hasOwn(candidate, "withTurn") ||
|
|
232
|
+
!Object.hasOwn(candidate, "surfaces") ||
|
|
233
|
+
!compatibilityPolicies.includes(candidate.policy) ||
|
|
234
|
+
typeof candidate.certified !== "boolean" ||
|
|
235
|
+
typeof candidate.withTurn !== "boolean" ||
|
|
236
|
+
!Array.isArray(candidate.surfaces) ||
|
|
237
|
+
candidate.surfaces.length !== compatibilitySurfaces.length ||
|
|
238
|
+
!candidate.surfaces.every(isCompatibilityAttestation)) {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
const surfaces = candidate.surfaces;
|
|
242
|
+
return (surfaces.every((attestation, index) => attestation.surface === compatibilitySurfaces[index] &&
|
|
243
|
+
attestation.certification !== undefined &&
|
|
244
|
+
(attestation.surface === "claude"
|
|
245
|
+
? attestation.certification.depth === "wire"
|
|
246
|
+
: candidate.withTurn
|
|
247
|
+
? attestation.certification.depth === "turn"
|
|
248
|
+
: attestation.certification.depth === "thread_ops")) &&
|
|
249
|
+
candidate.certified ===
|
|
250
|
+
surfaces.every((attestation) => attestation.certification?.outcome === "pass"));
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=compatibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../../../src/gateway/compatibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type GatewayInboundMode, type GatewayStoreLimits } from "./types.js";
|
|
2
|
+
import { type CompatibilityPolicy } from "./compatibility.js";
|
|
3
|
+
export declare const gatewayDeliveryNoticeModes: readonly ["merged", "verbose", "quiet"];
|
|
4
|
+
export type GatewayDeliveryNoticeMode = (typeof gatewayDeliveryNoticeModes)[number];
|
|
5
|
+
export type GatewayConfig = {
|
|
6
|
+
stateDir: string;
|
|
7
|
+
controlSocketPath: string;
|
|
8
|
+
allowedHosts: readonly string[];
|
|
9
|
+
/** Global fail-closed switch for Claude-to-Codex `STEER:` delivery. */
|
|
10
|
+
steeringEnabled: boolean;
|
|
11
|
+
/** Global fail-closed switch for opt-in, owner-ended progress watches. */
|
|
12
|
+
trackingEnabled?: boolean;
|
|
13
|
+
/** Claude-to-Codex sender consent. Only an explicit CLI opt-out is open. */
|
|
14
|
+
inboundMode: GatewayInboundMode;
|
|
15
|
+
/** One sender-visible progress notice is due this long after enqueue. */
|
|
16
|
+
stallNoticeMs: number;
|
|
17
|
+
/** Native Claude sender notice policy; omitted injected configs mean merged. */
|
|
18
|
+
deliveryNotices?: GatewayDeliveryNoticeMode;
|
|
19
|
+
/** Unknown patch/minor compatibility policy; defaults to bounded observation. */
|
|
20
|
+
compatibilityPolicy?: CompatibilityPolicy;
|
|
21
|
+
limits: GatewayStoreLimits;
|
|
22
|
+
};
|
|
23
|
+
export declare function defaultGatewayStateDir(env?: NodeJS.ProcessEnv): string;
|
|
24
|
+
export declare function loadGatewayConfig(env?: NodeJS.ProcessEnv): GatewayConfig;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { BridgeError } from "../errors.js";
|
|
4
|
+
import { gatewayPublicSnapshotLimits, } from "./types.js";
|
|
5
|
+
import { PROGRESS_WATCH_DEFAULT_CAPACITY, PROGRESS_WATCH_HARD_CAPACITY, } from "./progress-watch-machine.js";
|
|
6
|
+
import { compatibilityPolicies, } from "./compatibility.js";
|
|
7
|
+
export const gatewayDeliveryNoticeModes = [
|
|
8
|
+
"merged",
|
|
9
|
+
"verbose",
|
|
10
|
+
"quiet",
|
|
11
|
+
];
|
|
12
|
+
const HOST_PATTERN = /^[a-z0-9](?:[a-z0-9.-]{0,61}[a-z0-9])?$/;
|
|
13
|
+
const MAX_CONFIGURED_STATE_BUDGET = 7 * 1024 * 1024;
|
|
14
|
+
function boundedInteger(name, value, fallback, minimum, maximum) {
|
|
15
|
+
if (value === undefined)
|
|
16
|
+
return fallback;
|
|
17
|
+
if (!/^\d+$/.test(value)) {
|
|
18
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", `${name} must be an integer from ${minimum} through ${maximum}.`);
|
|
19
|
+
}
|
|
20
|
+
const parsed = Number.parseInt(value, 10);
|
|
21
|
+
if (!Number.isSafeInteger(parsed) || parsed < minimum || parsed > maximum) {
|
|
22
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", `${name} must be an integer from ${minimum} through ${maximum}.`);
|
|
23
|
+
}
|
|
24
|
+
return parsed;
|
|
25
|
+
}
|
|
26
|
+
export function defaultGatewayStateDir(env = process.env) {
|
|
27
|
+
if ((env.EMBASSY_STATE_DIR !== undefined &&
|
|
28
|
+
!path.isAbsolute(env.EMBASSY_STATE_DIR)) ||
|
|
29
|
+
(env.XDG_STATE_HOME !== undefined &&
|
|
30
|
+
!path.isAbsolute(env.XDG_STATE_HOME))) {
|
|
31
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "Inherited Embassy and XDG state roots must be absolute paths.");
|
|
32
|
+
}
|
|
33
|
+
return (env.EMBASSY_STATE_DIR ??
|
|
34
|
+
(env.XDG_STATE_HOME
|
|
35
|
+
? path.join(env.XDG_STATE_HOME, "agent-embassy")
|
|
36
|
+
: path.join(os.homedir(), ".local", "state", "agent-embassy")));
|
|
37
|
+
}
|
|
38
|
+
function parseAllowedHosts(value) {
|
|
39
|
+
const hosts = (value ?? "this-mac")
|
|
40
|
+
.split(",")
|
|
41
|
+
.map((host) => host.trim())
|
|
42
|
+
.filter(Boolean);
|
|
43
|
+
if (hosts.length === 0 ||
|
|
44
|
+
hosts.length > 32 ||
|
|
45
|
+
hosts.some((host) => !HOST_PATTERN.test(host)) ||
|
|
46
|
+
new Set(hosts).size !== hosts.length) {
|
|
47
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "EMBASSY_HOSTS must contain 1 through 32 unique lowercase ASCII host aliases separated by commas.");
|
|
48
|
+
}
|
|
49
|
+
return Object.freeze([...hosts]);
|
|
50
|
+
}
|
|
51
|
+
function enabledByDefault(name, value) {
|
|
52
|
+
if (value === undefined || value === "1")
|
|
53
|
+
return true;
|
|
54
|
+
if (value === "0")
|
|
55
|
+
return false;
|
|
56
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", `${name} must be exactly 1 or 0 when set.`);
|
|
57
|
+
}
|
|
58
|
+
function deliveryNoticeMode(value) {
|
|
59
|
+
const candidate = value ?? "merged";
|
|
60
|
+
if (gatewayDeliveryNoticeModes.includes(candidate)) {
|
|
61
|
+
return candidate;
|
|
62
|
+
}
|
|
63
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "EMBASSY_DELIVERY_NOTICES must be exactly merged, verbose, or quiet.");
|
|
64
|
+
}
|
|
65
|
+
function compatibilityPolicy(value) {
|
|
66
|
+
const candidate = value ?? "observed";
|
|
67
|
+
if (compatibilityPolicies.includes(candidate)) {
|
|
68
|
+
return candidate;
|
|
69
|
+
}
|
|
70
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "EMBASSY_COMPAT_POLICY must be exactly observed or strict.");
|
|
71
|
+
}
|
|
72
|
+
export function loadGatewayConfig(env = process.env) {
|
|
73
|
+
const stateDir = path.resolve(defaultGatewayStateDir(env));
|
|
74
|
+
const controlSocketPath = path.join(stateDir, "control.sock");
|
|
75
|
+
if (Buffer.byteLength(controlSocketPath) > 100) {
|
|
76
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "The gateway state path is too long for a portable private Unix-domain control socket.");
|
|
77
|
+
}
|
|
78
|
+
const messageDeadlineMs = boundedInteger("EMBASSY_MESSAGE_DEADLINE_MS", env.EMBASSY_MESSAGE_DEADLINE_MS, 300_000, 1_000, 3_600_000);
|
|
79
|
+
const stallNoticeMs = Math.floor(messageDeadlineMs / 2);
|
|
80
|
+
const limits = {
|
|
81
|
+
maxRoutes: boundedInteger("EMBASSY_MAX_ROUTES", env.EMBASSY_MAX_ROUTES, 128, 2, gatewayPublicSnapshotLimits.routes),
|
|
82
|
+
maxPairs: boundedInteger("EMBASSY_MAX_PAIRS", env.EMBASSY_MAX_PAIRS, 128, 1, gatewayPublicSnapshotLimits.pairs),
|
|
83
|
+
maxWatches: boundedInteger("EMBASSY_MAX_WATCHES", env.EMBASSY_MAX_WATCHES, PROGRESS_WATCH_DEFAULT_CAPACITY, 1, PROGRESS_WATCH_HARD_CAPACITY),
|
|
84
|
+
eventCapacity: boundedInteger("EMBASSY_EVENT_CAPACITY", env.EMBASSY_EVENT_CAPACITY, 500, 10, gatewayPublicSnapshotLimits.messages),
|
|
85
|
+
eventTtlMs: boundedInteger("EMBASSY_EVENT_TTL_MS", env.EMBASSY_EVENT_TTL_MS, 86_400_000, 60_000, 604_800_000),
|
|
86
|
+
dedupeCapacity: boundedInteger("EMBASSY_DEDUPE_CAPACITY", env.EMBASSY_DEDUPE_CAPACITY, 2_000, 10, 100_000),
|
|
87
|
+
dedupeTtlMs: boundedInteger("EMBASSY_DEDUPE_TTL_MS", env.EMBASSY_DEDUPE_TTL_MS, 300_000, 1_000, 86_400_000),
|
|
88
|
+
maxQueueMessages: boundedInteger("EMBASSY_MAX_QUEUE_MESSAGES", env.EMBASSY_MAX_QUEUE_MESSAGES, 100, 1, 10_000),
|
|
89
|
+
maxQueueMessagesPerRoute: boundedInteger("EMBASSY_MAX_QUEUE_PER_ROUTE", env.EMBASSY_MAX_QUEUE_PER_ROUTE, 20, 1, 1_000),
|
|
90
|
+
maxInFlightMessages: boundedInteger("EMBASSY_MAX_IN_FLIGHT", env.EMBASSY_MAX_IN_FLIGHT, 16, 1, 1_000),
|
|
91
|
+
maxQueueBytes: boundedInteger("EMBASSY_MAX_QUEUE_BYTES", env.EMBASSY_MAX_QUEUE_BYTES, 1_048_576, 1_024, 67_108_864),
|
|
92
|
+
maxMessageBytes: boundedInteger("EMBASSY_MAX_MESSAGE_BYTES", env.EMBASSY_MAX_MESSAGE_BYTES, 16_384, 1, 1_048_576),
|
|
93
|
+
messageDeadlineMs,
|
|
94
|
+
maxHopCount: boundedInteger("EMBASSY_MAX_HOPS", env.EMBASSY_MAX_HOPS, 2, 0, 16),
|
|
95
|
+
rateLimitPerRoute: boundedInteger("EMBASSY_RATE_LIMIT", env.EMBASSY_RATE_LIMIT, 30, 1, 10_000),
|
|
96
|
+
rateWindowMs: boundedInteger("EMBASSY_RATE_WINDOW_MS", env.EMBASSY_RATE_WINDOW_MS, 60_000, 1_000, 3_600_000),
|
|
97
|
+
};
|
|
98
|
+
if (limits.maxMessageBytes > limits.maxQueueBytes) {
|
|
99
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "EMBASSY_MAX_MESSAGE_BYTES cannot exceed EMBASSY_MAX_QUEUE_BYTES.");
|
|
100
|
+
}
|
|
101
|
+
if (limits.maxQueueMessagesPerRoute > limits.maxQueueMessages) {
|
|
102
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "EMBASSY_MAX_QUEUE_PER_ROUTE cannot exceed EMBASSY_MAX_QUEUE_MESSAGES.");
|
|
103
|
+
}
|
|
104
|
+
if (limits.maxInFlightMessages > limits.maxQueueMessages) {
|
|
105
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "EMBASSY_MAX_IN_FLIGHT cannot exceed EMBASSY_MAX_QUEUE_MESSAGES.");
|
|
106
|
+
}
|
|
107
|
+
const conservativeStateBudget = limits.eventCapacity * 512 +
|
|
108
|
+
limits.dedupeCapacity * 384 +
|
|
109
|
+
limits.maxRoutes * 1_024 +
|
|
110
|
+
limits.maxPairs * 512 +
|
|
111
|
+
(limits.maxWatches ?? PROGRESS_WATCH_DEFAULT_CAPACITY) * 768 +
|
|
112
|
+
limits.maxQueueMessages * 512 +
|
|
113
|
+
limits.maxRoutes * 256;
|
|
114
|
+
if (conservativeStateBudget > MAX_CONFIGURED_STATE_BUDGET) {
|
|
115
|
+
throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "The combined gateway route, event, dedupe, and queue capacities exceed the durable state byte budget.");
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
stateDir,
|
|
119
|
+
controlSocketPath,
|
|
120
|
+
allowedHosts: parseAllowedHosts(env.EMBASSY_HOSTS),
|
|
121
|
+
steeringEnabled: enabledByDefault("EMBASSY_STEERING_ENABLED", env.EMBASSY_STEERING_ENABLED),
|
|
122
|
+
trackingEnabled: enabledByDefault("EMBASSY_TRACKING_ENABLED", env.EMBASSY_TRACKING_ENABLED),
|
|
123
|
+
inboundMode: "paired",
|
|
124
|
+
stallNoticeMs,
|
|
125
|
+
deliveryNotices: deliveryNoticeMode(env.EMBASSY_DELIVERY_NOTICES),
|
|
126
|
+
compatibilityPolicy: compatibilityPolicy(env.EMBASSY_COMPAT_POLICY),
|
|
127
|
+
limits,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/gateway/config.ts"],"names":[],"mappings":"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"}
|