codex-channel-bgos 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/attachment-bridge.d.ts.map +1 -1
- package/dist/attachment-bridge.js +33 -8
- package/dist/attachment-bridge.js.map +1 -1
- package/dist/attachment-guard.d.ts +66 -0
- package/dist/attachment-guard.d.ts.map +1 -0
- package/dist/attachment-guard.js +290 -0
- package/dist/attachment-guard.js.map +1 -0
- package/dist/bgos-api.d.ts.map +1 -1
- package/dist/bgos-api.js +7 -0
- package/dist/bgos-api.js.map +1 -1
- package/dist/capabilities.d.ts +8 -0
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +9 -0
- package/dist/capabilities.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment-bridge.d.ts","sourceRoot":"","sources":["../src/attachment-bridge.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"attachment-bridge.d.ts","sourceRoot":"","sources":["../src/attachment-bridge.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAe7C;;;kEAGkE;AAClE,eAAO,MAAM,YAAY,QAAa,CAAC;AAEvC;;wDAEwD;AACxD,MAAM,WAAW,qBAAqB;IACpC,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;2EACuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,gEAAgE;AAChE,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAiCtE;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,qBAAqB,GACzB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA+ExE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,mBAAmB,CAAC,CAyD9B"}
|
|
@@ -18,8 +18,9 @@
|
|
|
18
18
|
import { createWriteStream, promises as fsp, } from "node:fs";
|
|
19
19
|
import { tmpdir } from "node:os";
|
|
20
20
|
import { extname, join } from "node:path";
|
|
21
|
-
import { Readable } from "node:stream";
|
|
21
|
+
import { Readable, Transform } from "node:stream";
|
|
22
22
|
import { pipeline } from "node:stream/promises";
|
|
23
|
+
import { MAX_ATTACHMENT_BYTES, AttachmentSizeError, assertDeclaredSizeOk, decodeBase64Capped, fetchAttachmentGuarded, } from "./attachment-guard.js";
|
|
23
24
|
import { classifyMedia, sniffImageDimensions, toInlineDataUri, } from "./media-classify.js";
|
|
24
25
|
import { resolveAllowedMediaPath } from "./media-guard.js";
|
|
25
26
|
/** Threshold below which we inline base64 in a single POST. Mirrors the
|
|
@@ -57,7 +58,8 @@ function decodeDataUri(dataUri) {
|
|
|
57
58
|
// to support them - agents would have to re-encode anyway).
|
|
58
59
|
throw new Error("invalid data URI: only base64 encoding supported");
|
|
59
60
|
}
|
|
60
|
-
|
|
61
|
+
// Capped decode so a hostile backend cannot force a giant allocation.
|
|
62
|
+
return decodeBase64Capped(payload);
|
|
61
63
|
}
|
|
62
64
|
/**
|
|
63
65
|
* Download a BGOS attachment to a local tempfile and return its path +
|
|
@@ -78,8 +80,8 @@ export async function ingestBgosAttachment(att) {
|
|
|
78
80
|
.slice(2, 10)}${ext}`;
|
|
79
81
|
const localPath = join(tmpdir(), baseName);
|
|
80
82
|
if (att.fileData) {
|
|
81
|
-
// Inline base64
|
|
82
|
-
await fsp.writeFile(localPath,
|
|
83
|
+
// Inline base64; write directly under a size cap.
|
|
84
|
+
await fsp.writeFile(localPath, decodeBase64Capped(att.fileData));
|
|
83
85
|
return { localPath, kind, mimeType };
|
|
84
86
|
}
|
|
85
87
|
if (att.dataUri) {
|
|
@@ -87,18 +89,41 @@ export async function ingestBgosAttachment(att) {
|
|
|
87
89
|
return { localPath, kind, mimeType };
|
|
88
90
|
}
|
|
89
91
|
if (att.url) {
|
|
90
|
-
// Presigned S3 URL
|
|
91
|
-
//
|
|
92
|
-
|
|
92
|
+
// Presigned S3 URL. SECURITY: att.url is server-controlled, so validate it
|
|
93
|
+
// against SSRF (no loopback / link-local / RFC1918 / cloud-metadata; every
|
|
94
|
+
// redirect hop re-checked) BEFORE fetching, and stream to disk under a hard
|
|
95
|
+
// byte cap so a hostile backend cannot fill the disk.
|
|
96
|
+
const res = await fetchAttachmentGuarded(att.url);
|
|
93
97
|
if (!res.ok) {
|
|
94
98
|
throw new Error(`download failed: HTTP ${res.status} for ${fileName}`);
|
|
95
99
|
}
|
|
96
100
|
if (!res.body)
|
|
97
101
|
throw new Error(`download produced no body for ${fileName}`);
|
|
102
|
+
// Reject an oversized declared length up front; the counting stream below
|
|
103
|
+
// is the real cap for a lying/absent Content-Length.
|
|
104
|
+
assertDeclaredSizeOk(res.headers.get("content-length"));
|
|
105
|
+
let received = 0;
|
|
106
|
+
const capStream = new Transform({
|
|
107
|
+
transform(chunk, _enc, cb) {
|
|
108
|
+
received += chunk.length;
|
|
109
|
+
if (received > MAX_ATTACHMENT_BYTES) {
|
|
110
|
+
cb(new AttachmentSizeError(`attachment ${fileName} exceeded the ${MAX_ATTACHMENT_BYTES} byte cap`));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
cb(null, chunk);
|
|
114
|
+
},
|
|
115
|
+
});
|
|
98
116
|
// Node 18+ supports converting a fetch ReadableStream to a Node
|
|
99
117
|
// Readable via Readable.fromWeb. The any-cast keeps the typecheck
|
|
100
118
|
// narrow (lib.dom.d.ts inclusion varies by tsconfig).
|
|
101
|
-
|
|
119
|
+
try {
|
|
120
|
+
await pipeline(Readable.fromWeb(res.body), capStream, createWriteStream(localPath));
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
// Remove any partial file so a capped/failed download leaves no litter.
|
|
124
|
+
await fsp.unlink(localPath).catch(() => { });
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
102
127
|
return { localPath, kind, mimeType };
|
|
103
128
|
}
|
|
104
129
|
if (att.s3Key) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment-bridge.js","sourceRoot":"","sources":["../src/attachment-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,iBAAiB,EACjB,QAAQ,IAAI,GAAG,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"attachment-bridge.js","sourceRoot":"","sources":["../src/attachment-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** Hard cap on bytes pulled from a single server-supplied attachment. */
|
|
2
|
+
export declare const MAX_ATTACHMENT_BYTES: number;
|
|
3
|
+
/** Thrown when a server-supplied attachment URL is unsafe (SSRF guard). */
|
|
4
|
+
export declare class AttachmentUrlError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
/** Thrown when a server-supplied attachment exceeds the byte cap. */
|
|
8
|
+
export declare class AttachmentSizeError extends Error {
|
|
9
|
+
constructor(message: string);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Canonicalize a numeral-encoded IPv4 host (a bare decimal/hex/octal integer,
|
|
13
|
+
* or a dotted form with 1 to 4 parts, e.g. "2130706433", "0x7f000001",
|
|
14
|
+
* "0177.0.0.1", "127.1") into dotted-quad notation, per the same numeral
|
|
15
|
+
* rules a raw socket connect (or a permissive DNS/HTTP client) would apply.
|
|
16
|
+
* Returns:
|
|
17
|
+
* - the canonical "a.b.c.d" string when the host is a valid numeral form;
|
|
18
|
+
* - null when the host is not numeral shaped at all (an ordinary name);
|
|
19
|
+
* - "ambiguous" when the host LOOKS numeral shaped but fails to parse
|
|
20
|
+
* cleanly. Callers must fail closed (treat "ambiguous" as unsafe).
|
|
21
|
+
* Pure.
|
|
22
|
+
*/
|
|
23
|
+
export declare function canonicalizeNumericIPv4(host: string): string | null | "ambiguous";
|
|
24
|
+
/**
|
|
25
|
+
* True when an IPv4/IPv6 literal is loopback, link-local, private (RFC1918),
|
|
26
|
+
* carrier-grade NAT, unique-local, unspecified, or a known cloud-metadata
|
|
27
|
+
* address. Malformed input is treated as unsafe (fail closed). Pure.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isPrivateOrReservedIp(ip: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* True when a hostname must be refused before any DNS lookup: literal loopback
|
|
32
|
+
* names, `.localhost` / `.local` (mDNS), an empty host, or a private/reserved
|
|
33
|
+
* IP literal. Pure.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isBlockedHostname(host: string): boolean;
|
|
36
|
+
/** Injectable DNS resolver (for tests). Returns candidate addresses. */
|
|
37
|
+
export type AttachmentResolver = (host: string) => Promise<Array<{
|
|
38
|
+
address: string;
|
|
39
|
+
}>>;
|
|
40
|
+
/**
|
|
41
|
+
* Validate a server-supplied download URL against SSRF: http/https only, and
|
|
42
|
+
* neither the literal host nor any DNS-resolved address may be loopback,
|
|
43
|
+
* link-local, private, CGNAT, unique-local, or cloud-metadata. Returns the
|
|
44
|
+
* parsed URL on success; throws AttachmentUrlError otherwise. The resolver is
|
|
45
|
+
* injectable so the classification logic is unit-testable without a network.
|
|
46
|
+
*/
|
|
47
|
+
export declare function assertSafeDownloadUrl(raw: string, resolver?: AttachmentResolver): Promise<URL>;
|
|
48
|
+
/**
|
|
49
|
+
* Fetch a server-supplied URL with SSRF protection, re-validating every
|
|
50
|
+
* redirect hop (a public host must not 30x-redirect into a private one).
|
|
51
|
+
* Returns the terminal Response (body still unread) so the caller can stream it
|
|
52
|
+
* under a byte cap. Bounded to a few hops.
|
|
53
|
+
*/
|
|
54
|
+
export declare function fetchAttachmentGuarded(raw: string, resolver?: AttachmentResolver, fetchImpl?: typeof fetch): Promise<Response>;
|
|
55
|
+
/**
|
|
56
|
+
* Reject an already-declared Content-Length that exceeds the cap. Returns the
|
|
57
|
+
* parsed length (or null when absent/unparseable). Pure.
|
|
58
|
+
*/
|
|
59
|
+
export declare function assertDeclaredSizeOk(contentLength: string | null, cap?: number): number | null;
|
|
60
|
+
/**
|
|
61
|
+
* Decode a base64 payload with an up-front size cap so a hostile inline body
|
|
62
|
+
* cannot force a multi-hundred-MB allocation. Throws AttachmentSizeError when
|
|
63
|
+
* the decoded size would exceed the cap. Pure.
|
|
64
|
+
*/
|
|
65
|
+
export declare function decodeBase64Capped(b64: string, cap?: number): Buffer;
|
|
66
|
+
//# sourceMappingURL=attachment-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-guard.d.ts","sourceRoot":"","sources":["../src/attachment-guard.ts"],"names":[],"mappings":"AAuBA,yEAAyE;AACzE,eAAO,MAAM,oBAAoB,QAAoB,CAAC;AAEtD,2EAA2E;AAC3E,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,qEAAqE;AACrE,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AA0BD;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,WAAW,CA4BjF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAiCzD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkBvD;AAED,wEAAwE;AACxE,MAAM,MAAM,kBAAkB,GAAG,CAC/B,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAKzC;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,kBAAoC,GAC7C,OAAO,CAAC,GAAG,CAAC,CAwCd;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,kBAAoC,EAC9C,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,QAAQ,CAAC,CAgBnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,GAAG,SAAuB,GACzB,MAAM,GAAG,IAAI,CAUf;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,GAAG,SAAuB,GACzB,MAAM,CASR"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inbound-attachment safety guard (SSRF + resource-exhaustion).
|
|
3
|
+
*
|
|
4
|
+
* SECURITY: `ingestBgosAttachment` (attachment-bridge.ts) turns a BGOS
|
|
5
|
+
* `inbound_message` `files[]` entry into a local temp file. The `url`,
|
|
6
|
+
* `fileData`, and `dataUri` fields are all set by the BGOS backend, and the
|
|
7
|
+
* threat model treats a compromised or MITM'd backend as an in-scope adversary.
|
|
8
|
+
* Without a guard, a hostile backend could:
|
|
9
|
+
* - point `url` at http://169.254.169.254/ (cloud metadata), http://127.0.0.1
|
|
10
|
+
* (a local service), or an RFC1918 host, making the victim daemon issue
|
|
11
|
+
* arbitrary internal requests (blind/read SSRF);
|
|
12
|
+
* - stream an unbounded body (or send a multi-hundred-MB base64 `fileData`)
|
|
13
|
+
* to exhaust the host's disk or memory.
|
|
14
|
+
*
|
|
15
|
+
* This module holds the PURE, unit-tested predicates (IP + hostname
|
|
16
|
+
* classification, capped base64 decode) plus the redirect-revalidating fetch
|
|
17
|
+
* used at the boundary. The byte cap matches BGOS's largest outbound media
|
|
18
|
+
* ceiling (video, 100 MB) so a legitimate attachment is never rejected while an
|
|
19
|
+
* unbounded stream is stopped. No em/en dashes (this file feeds no prompt, but
|
|
20
|
+
* the repo convention is ASCII-only).
|
|
21
|
+
*/
|
|
22
|
+
import { lookup as dnsLookup } from "node:dns/promises";
|
|
23
|
+
/** Hard cap on bytes pulled from a single server-supplied attachment. */
|
|
24
|
+
export const MAX_ATTACHMENT_BYTES = 100 * 1024 * 1024;
|
|
25
|
+
/** Thrown when a server-supplied attachment URL is unsafe (SSRF guard). */
|
|
26
|
+
export class AttachmentUrlError extends Error {
|
|
27
|
+
constructor(message) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = "AttachmentUrlError";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Thrown when a server-supplied attachment exceeds the byte cap. */
|
|
33
|
+
export class AttachmentSizeError extends Error {
|
|
34
|
+
constructor(message) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.name = "AttachmentSizeError";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Parse a single IPv4 numeral component per the same rules a numeric-address
|
|
41
|
+
* evasion relies on: a 0x/0X prefix is hexadecimal, a bare leading zero (with
|
|
42
|
+
* more digits after it) is octal, anything else is decimal. Returns null when
|
|
43
|
+
* the token is not a valid numeral in its implied radix. Pure.
|
|
44
|
+
*/
|
|
45
|
+
function parseIpv4Component(part) {
|
|
46
|
+
if (part === "")
|
|
47
|
+
return null;
|
|
48
|
+
let radix = 10;
|
|
49
|
+
let digits = part;
|
|
50
|
+
if (digits.length > 1 && digits[0] === "0" && (digits[1] === "x" || digits[1] === "X")) {
|
|
51
|
+
radix = 16;
|
|
52
|
+
digits = digits.slice(2);
|
|
53
|
+
}
|
|
54
|
+
else if (digits.length > 1 && digits[0] === "0") {
|
|
55
|
+
radix = 8;
|
|
56
|
+
digits = digits.slice(1);
|
|
57
|
+
}
|
|
58
|
+
if (digits === "")
|
|
59
|
+
return 0;
|
|
60
|
+
const pattern = radix === 16 ? /^[0-9a-fA-F]+$/ : radix === 8 ? /^[0-7]+$/ : /^[0-9]+$/;
|
|
61
|
+
if (!pattern.test(digits))
|
|
62
|
+
return null;
|
|
63
|
+
const value = parseInt(digits, radix);
|
|
64
|
+
return Number.isSafeInteger(value) ? value : null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Canonicalize a numeral-encoded IPv4 host (a bare decimal/hex/octal integer,
|
|
68
|
+
* or a dotted form with 1 to 4 parts, e.g. "2130706433", "0x7f000001",
|
|
69
|
+
* "0177.0.0.1", "127.1") into dotted-quad notation, per the same numeral
|
|
70
|
+
* rules a raw socket connect (or a permissive DNS/HTTP client) would apply.
|
|
71
|
+
* Returns:
|
|
72
|
+
* - the canonical "a.b.c.d" string when the host is a valid numeral form;
|
|
73
|
+
* - null when the host is not numeral shaped at all (an ordinary name);
|
|
74
|
+
* - "ambiguous" when the host LOOKS numeral shaped but fails to parse
|
|
75
|
+
* cleanly. Callers must fail closed (treat "ambiguous" as unsafe).
|
|
76
|
+
* Pure.
|
|
77
|
+
*/
|
|
78
|
+
export function canonicalizeNumericIPv4(host) {
|
|
79
|
+
// Only characters a numeral IPv4 form can use; anything else (a real DNS
|
|
80
|
+
// label with letters outside a-f) is an ordinary hostname, not a candidate.
|
|
81
|
+
if (!/^[0-9a-fA-FxX.]+$/.test(host))
|
|
82
|
+
return null;
|
|
83
|
+
if (!/\d/.test(host))
|
|
84
|
+
return null; // no digit at all -> not numeral shaped
|
|
85
|
+
const parts = host.split(".");
|
|
86
|
+
if (parts.length === 0 || parts.length > 4)
|
|
87
|
+
return null;
|
|
88
|
+
if (parts.some((p) => p === ""))
|
|
89
|
+
return "ambiguous";
|
|
90
|
+
const numbers = [];
|
|
91
|
+
for (const part of parts) {
|
|
92
|
+
const n = parseIpv4Component(part);
|
|
93
|
+
if (n === null)
|
|
94
|
+
return "ambiguous";
|
|
95
|
+
numbers.push(n);
|
|
96
|
+
}
|
|
97
|
+
// All but the last component must fit a single octet; the last absorbs
|
|
98
|
+
// the remaining bits (so "127.1" folds to 127.0.0.1).
|
|
99
|
+
for (let i = 0; i < numbers.length - 1; i++) {
|
|
100
|
+
if (numbers[i] > 255)
|
|
101
|
+
return "ambiguous";
|
|
102
|
+
}
|
|
103
|
+
const last = numbers[numbers.length - 1];
|
|
104
|
+
const maxLast = 256 ** (5 - numbers.length) - 1;
|
|
105
|
+
if (last > maxLast || last < 0)
|
|
106
|
+
return "ambiguous";
|
|
107
|
+
let value = last;
|
|
108
|
+
for (let i = 0; i < numbers.length - 1; i++) {
|
|
109
|
+
value += numbers[i] * 256 ** (3 - i);
|
|
110
|
+
}
|
|
111
|
+
const bytes = [(value >>> 24) & 0xff, (value >>> 16) & 0xff, (value >>> 8) & 0xff, value & 0xff];
|
|
112
|
+
return bytes.join(".");
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* True when an IPv4/IPv6 literal is loopback, link-local, private (RFC1918),
|
|
116
|
+
* carrier-grade NAT, unique-local, unspecified, or a known cloud-metadata
|
|
117
|
+
* address. Malformed input is treated as unsafe (fail closed). Pure.
|
|
118
|
+
*/
|
|
119
|
+
export function isPrivateOrReservedIp(ip) {
|
|
120
|
+
const addr = ip.trim().toLowerCase().replace(/^\[|\]$/g, "");
|
|
121
|
+
if (!addr)
|
|
122
|
+
return true;
|
|
123
|
+
// IPv4-mapped IPv6 (e.g. ::ffff:127.0.0.1) collapses to its v4 tail.
|
|
124
|
+
const v4 = addr.startsWith("::ffff:") ? addr.slice("::ffff:".length) : addr;
|
|
125
|
+
// A numeral-encoded IPv4 host (decimal integer, 0x-hex, octal, or a short
|
|
126
|
+
// dotted form like "127.1") must be canonicalized before classification;
|
|
127
|
+
// otherwise "2130706433" (127.0.0.1) or "0x7f000001" slips past the plain
|
|
128
|
+
// dotted-quad regex below untouched. A host that looks numeral shaped but
|
|
129
|
+
// fails to parse cleanly is unsafe (fail closed).
|
|
130
|
+
const canon = canonicalizeNumericIPv4(v4);
|
|
131
|
+
if (canon === "ambiguous")
|
|
132
|
+
return true;
|
|
133
|
+
const dotted = canon ?? v4;
|
|
134
|
+
const m = dotted.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
|
|
135
|
+
if (m) {
|
|
136
|
+
const o = m.slice(1, 5).map(Number);
|
|
137
|
+
if (o.some((x) => x > 255))
|
|
138
|
+
return true; // malformed octet -> unsafe
|
|
139
|
+
const [a, b] = o;
|
|
140
|
+
if (a === 0)
|
|
141
|
+
return true; // 0.0.0.0/8 unspecified
|
|
142
|
+
if (a === 127)
|
|
143
|
+
return true; // loopback
|
|
144
|
+
if (a === 10)
|
|
145
|
+
return true; // RFC1918
|
|
146
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
147
|
+
return true; // RFC1918
|
|
148
|
+
if (a === 192 && b === 168)
|
|
149
|
+
return true; // RFC1918
|
|
150
|
+
if (a === 169 && b === 254)
|
|
151
|
+
return true; // link-local incl 169.254.169.254
|
|
152
|
+
if (a === 100 && b >= 64 && b <= 127)
|
|
153
|
+
return true; // CGNAT 100.64.0.0/10
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
// IPv6 forms.
|
|
157
|
+
if (addr === "::" || addr === "::1")
|
|
158
|
+
return true; // unspecified / loopback
|
|
159
|
+
if (addr.startsWith("fe80"))
|
|
160
|
+
return true; // link-local fe80::/10
|
|
161
|
+
if (addr.startsWith("fc") || addr.startsWith("fd"))
|
|
162
|
+
return true; // ULA fc00::/7
|
|
163
|
+
if (addr.startsWith("::ffff:"))
|
|
164
|
+
return true; // mapped form we did not decode -> unsafe
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* True when a hostname must be refused before any DNS lookup: literal loopback
|
|
169
|
+
* names, `.localhost` / `.local` (mDNS), an empty host, or a private/reserved
|
|
170
|
+
* IP literal. Pure.
|
|
171
|
+
*/
|
|
172
|
+
export function isBlockedHostname(host) {
|
|
173
|
+
const h = host
|
|
174
|
+
.trim()
|
|
175
|
+
.toLowerCase()
|
|
176
|
+
.replace(/\.$/, "")
|
|
177
|
+
.replace(/^\[|\]$/g, "");
|
|
178
|
+
if (!h)
|
|
179
|
+
return true;
|
|
180
|
+
if (h === "localhost" || h.endsWith(".localhost"))
|
|
181
|
+
return true;
|
|
182
|
+
if (h === "ip6-localhost" || h === "ip6-loopback")
|
|
183
|
+
return true;
|
|
184
|
+
if (h.endsWith(".local"))
|
|
185
|
+
return true; // mDNS
|
|
186
|
+
// IP literal? Dotted-quad, IPv6 (contains a colon), or a numeral-encoded
|
|
187
|
+
// form (decimal integer, 0x-hex, octal, short dotted like "127.1") that
|
|
188
|
+
// canonicalizes to an IPv4 address, or an ambiguous numeral that fails to
|
|
189
|
+
// canonicalize cleanly (fail closed rather than falling through as a name).
|
|
190
|
+
if (/^[0-9.]+$/.test(h) || h.includes(":") || canonicalizeNumericIPv4(h) !== null) {
|
|
191
|
+
return isPrivateOrReservedIp(h);
|
|
192
|
+
}
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
const defaultResolver = (host) => dnsLookup(host, { all: true });
|
|
196
|
+
/**
|
|
197
|
+
* Validate a server-supplied download URL against SSRF: http/https only, and
|
|
198
|
+
* neither the literal host nor any DNS-resolved address may be loopback,
|
|
199
|
+
* link-local, private, CGNAT, unique-local, or cloud-metadata. Returns the
|
|
200
|
+
* parsed URL on success; throws AttachmentUrlError otherwise. The resolver is
|
|
201
|
+
* injectable so the classification logic is unit-testable without a network.
|
|
202
|
+
*/
|
|
203
|
+
export async function assertSafeDownloadUrl(raw, resolver = defaultResolver) {
|
|
204
|
+
let u;
|
|
205
|
+
try {
|
|
206
|
+
u = new URL(raw);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
throw new AttachmentUrlError("malformed attachment URL");
|
|
210
|
+
}
|
|
211
|
+
if (u.protocol !== "https:" && u.protocol !== "http:") {
|
|
212
|
+
throw new AttachmentUrlError(`unsupported attachment URL scheme: ${u.protocol}`);
|
|
213
|
+
}
|
|
214
|
+
const host = u.hostname;
|
|
215
|
+
if (isBlockedHostname(host)) {
|
|
216
|
+
throw new AttachmentUrlError(`refusing to fetch attachment from a private or reserved host: ${host}`);
|
|
217
|
+
}
|
|
218
|
+
const bare = host.replace(/^\[|\]$/g, "");
|
|
219
|
+
const isIpLiteral = /^[0-9.]+$/.test(bare) || bare.includes(":") || canonicalizeNumericIPv4(bare) !== null;
|
|
220
|
+
if (!isIpLiteral) {
|
|
221
|
+
let addrs;
|
|
222
|
+
try {
|
|
223
|
+
addrs = await resolver(host);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
throw new AttachmentUrlError(`could not resolve attachment host: ${host}`);
|
|
227
|
+
}
|
|
228
|
+
if (!addrs || addrs.length === 0) {
|
|
229
|
+
throw new AttachmentUrlError(`attachment host did not resolve: ${host}`);
|
|
230
|
+
}
|
|
231
|
+
for (const a of addrs) {
|
|
232
|
+
if (isPrivateOrReservedIp(a.address)) {
|
|
233
|
+
throw new AttachmentUrlError(`attachment host ${host} resolves to a private or reserved address ${a.address}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return u;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Fetch a server-supplied URL with SSRF protection, re-validating every
|
|
241
|
+
* redirect hop (a public host must not 30x-redirect into a private one).
|
|
242
|
+
* Returns the terminal Response (body still unread) so the caller can stream it
|
|
243
|
+
* under a byte cap. Bounded to a few hops.
|
|
244
|
+
*/
|
|
245
|
+
export async function fetchAttachmentGuarded(raw, resolver = defaultResolver, fetchImpl = fetch) {
|
|
246
|
+
let current = (await assertSafeDownloadUrl(raw, resolver)).toString();
|
|
247
|
+
for (let hop = 0; hop < 5; hop++) {
|
|
248
|
+
const res = await fetchImpl(current, { redirect: "manual" });
|
|
249
|
+
if (res.status >= 300 && res.status < 400) {
|
|
250
|
+
const loc = res.headers.get("location");
|
|
251
|
+
if (!loc) {
|
|
252
|
+
throw new AttachmentUrlError("attachment redirect had no Location");
|
|
253
|
+
}
|
|
254
|
+
const next = new URL(loc, current).toString();
|
|
255
|
+
current = (await assertSafeDownloadUrl(next, resolver)).toString();
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
return res;
|
|
259
|
+
}
|
|
260
|
+
throw new AttachmentUrlError("attachment exceeded the redirect limit");
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Reject an already-declared Content-Length that exceeds the cap. Returns the
|
|
264
|
+
* parsed length (or null when absent/unparseable). Pure.
|
|
265
|
+
*/
|
|
266
|
+
export function assertDeclaredSizeOk(contentLength, cap = MAX_ATTACHMENT_BYTES) {
|
|
267
|
+
if (contentLength == null || contentLength === "")
|
|
268
|
+
return null;
|
|
269
|
+
const n = Number(contentLength);
|
|
270
|
+
if (!Number.isFinite(n) || n < 0)
|
|
271
|
+
return null;
|
|
272
|
+
if (n > cap) {
|
|
273
|
+
throw new AttachmentSizeError(`attachment declares ${n} bytes, over the ${cap} byte cap`);
|
|
274
|
+
}
|
|
275
|
+
return n;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Decode a base64 payload with an up-front size cap so a hostile inline body
|
|
279
|
+
* cannot force a multi-hundred-MB allocation. Throws AttachmentSizeError when
|
|
280
|
+
* the decoded size would exceed the cap. Pure.
|
|
281
|
+
*/
|
|
282
|
+
export function decodeBase64Capped(b64, cap = MAX_ATTACHMENT_BYTES) {
|
|
283
|
+
// 4 base64 chars decode to 3 bytes; this bounds size without allocating.
|
|
284
|
+
const approxBytes = Math.floor((b64.length * 3) / 4);
|
|
285
|
+
if (approxBytes > cap) {
|
|
286
|
+
throw new AttachmentSizeError(`inline attachment (~${approxBytes} bytes) exceeds the ${cap} byte cap`);
|
|
287
|
+
}
|
|
288
|
+
return Buffer.from(b64, "base64");
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=attachment-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-guard.js","sourceRoot":"","sources":["../src/attachment-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAExD,yEAAyE;AACzE,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAEtD,2EAA2E;AAC3E,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,qEAAqE;AACrE,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACvF,KAAK,GAAG,EAAE,CAAC;QACX,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAClD,KAAK,GAAG,CAAC,CAAC;QACV,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;IACxF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,yEAAyE;IACzE,4EAA4E;IAC5E,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,wCAAwC;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAAE,OAAO,WAAW,CAAC;IACpD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,WAAW,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,uEAAuE;IACvE,sDAAsD;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;YAAE,OAAO,WAAW,CAAC;IAC3C,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,IAAI,GAAG,OAAO,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IACnD,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;IACjG,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAU;IAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,qEAAqE;IACrE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,0EAA0E;IAC1E,kDAAkD;IAClD,MAAM,KAAK,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACvE,IAAI,CAAC,EAAE,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,4BAA4B;QACrE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,wBAAwB;QAClD,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC,WAAW;QACvC,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC,CAAC,UAAU;QACrC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC,CAAC,UAAU;QAC5D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC,UAAU;QACnD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC,kCAAkC;QAC3E,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC,sBAAsB;QACzE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,cAAc;IACd,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC,CAAC,yBAAyB;IAC3E,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,uBAAuB;IACjE,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,eAAe;IAChF,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,0CAA0C;IACvF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,CAAC,GAAG,IAAI;SACX,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,CAAC,KAAK,eAAe,IAAI,CAAC,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,OAAO;IAC9C,yEAAyE;IACzE,wEAAwE;IACxE,0EAA0E;IAC1E,4EAA4E;IAC5E,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,uBAAuB,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClF,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,MAAM,eAAe,GAAuB,CAAC,IAAI,EAAE,EAAE,CACnD,SAAS,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAW,EACX,WAA+B,eAAe;IAE9C,IAAI,CAAM,CAAC;IACX,IAAI,CAAC;QACH,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACtD,MAAM,IAAI,kBAAkB,CAC1B,sCAAsC,CAAC,CAAC,QAAQ,EAAE,CACnD,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC;IACxB,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,kBAAkB,CAC1B,iEAAiE,IAAI,EAAE,CACxE,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,WAAW,GACf,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IACzF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,IAAI,KAAiC,CAAC;QACtC,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,kBAAkB,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,kBAAkB,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,kBAAkB,CAC1B,mBAAmB,IAAI,8CAA8C,CAAC,CAAC,OAAO,EAAE,CACjF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAW,EACX,WAA+B,eAAe,EAC9C,YAA0B,KAAK;IAE/B,IAAI,OAAO,GAAG,CAAC,MAAM,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7D,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,kBAAkB,CAAC,qCAAqC,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC9C,OAAO,GAAG,CAAC,MAAM,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACnE,SAAS;QACX,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,IAAI,kBAAkB,CAAC,wCAAwC,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,aAA4B,EAC5B,GAAG,GAAG,oBAAoB;IAE1B,IAAI,aAAa,IAAI,IAAI,IAAI,aAAa,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACZ,MAAM,IAAI,mBAAmB,CAC3B,uBAAuB,CAAC,oBAAoB,GAAG,WAAW,CAC3D,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,GAAG,GAAG,oBAAoB;IAE1B,yEAAyE;IACzE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,IAAI,WAAW,GAAG,GAAG,EAAE,CAAC;QACtB,MAAM,IAAI,mBAAmB,CAC3B,uBAAuB,WAAW,uBAAuB,GAAG,WAAW,CACxE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/bgos-api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bgos-api.d.ts","sourceRoot":"","sources":["../src/bgos-api.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;;;GAOG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;gBAEzB,GAAG,EAAE,YAAY;IAwB7B;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,YAAY,EAAE,MAAM,CAAC;YACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;YAC3B,IAAI,EAAE,MAAM,CAAC;YACb;wEAC4D;YAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;SACxB,CAAC,CAAC;KACJ,CAAC;IAKF;;;;;;;;;;OAUG;IACG,eAAe,CAAC,OAAO,SAAU,GAAG,OAAO,CAAC;QAChD,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;
|
|
1
|
+
{"version":3,"file":"bgos-api.d.ts","sourceRoot":"","sources":["../src/bgos-api.ts"],"names":[],"mappings":"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"}
|
package/dist/bgos-api.js
CHANGED
|
@@ -46,8 +46,15 @@ export class BgosApi {
|
|
|
46
46
|
* endpoint) throws, and the caller keeps the bundled fallback.
|
|
47
47
|
*/
|
|
48
48
|
async getCapabilities(channel = "codex") {
|
|
49
|
+
// SECURITY: cap the response size at the transport layer. The canon is a
|
|
50
|
+
// few KB and is written to AGENTS.md for a shell-capable agent, so a
|
|
51
|
+
// compromised or MITM'd backend must not be able to stream a giant body
|
|
52
|
+
// (disk/memory DoS). axios rejects past maxContentLength and the caller
|
|
53
|
+
// keeps the bundled fallback.
|
|
49
54
|
const r = await this.http.get("integrations/capabilities", {
|
|
50
55
|
params: { channel },
|
|
56
|
+
maxContentLength: 1024 * 1024,
|
|
57
|
+
maxBodyLength: 1024 * 1024,
|
|
51
58
|
});
|
|
52
59
|
return r.data;
|
|
53
60
|
}
|
package/dist/bgos-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bgos-api.js","sourceRoot":"","sources":["../src/bgos-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAElD,OAAO,EACL,mBAAmB,GASpB,MAAM,YAAY,CAAC;AAIpB;;;;;;;GAOG;AACH,MAAM,OAAO,OAAO;IACD,IAAI,CAAgB;IAErC,YAAY,GAAiB;QAC3B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;YACvB,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,SAAS;YAChC,OAAO,EAAE;gBACP,gBAAgB,EAAE,GAAG,CAAC,YAAY;gBAClC,cAAc,EAAE,kBAAkB;aACnC;YACD,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EACR,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBAClC,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,mBAAmB,CACrB,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,0BAA0B,CAC1D,CACF,CAAC;YACJ,CAAC;YACD,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM;QAcV,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,eAAe,CAAC,OAAO,GAAG,OAAO;QAOrC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE;YACzD,MAAM,EAAE,EAAE,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"bgos-api.js","sourceRoot":"","sources":["../src/bgos-api.ts"],"names":[],"mappings":"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"}
|
package/dist/capabilities.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
/** The bundled, offline fallback shipped with the daemon. */
|
|
2
2
|
export declare const BUNDLED_CAPABILITIES = "# BGOS Channel, Agent Capabilities\n\nYou are reachable from the BGOS chat app. Your text reply is delivered to the\nuser as a chat message. A few markers let you use richer BGOS features. Put each\nmarker on its own line. The daemon strips markers from the visible text.\n\n## Markdown\nSupported: **bold**, *italic*, `inline code`, fenced code blocks, [links](url),\n# / ## / ### headings, ordered and unordered lists, > blockquotes.\nNOT supported: tables (they do not lay out on mobile), inline images via\n (use MEDIA: instead), strikethrough. Do not escape punctuation; this\nis not Telegram MarkdownV2.\n\n## Sending files, images, videos (you to user)\nPut `MEDIA:/absolute/path/to/file` on its own line. The daemon infers the type\nfrom the extension and uploads it (inline under 500 KB, presigned S3 otherwise).\nCaps: image 10 MB, video 100 MB, audio 25 MB, document 25 MB. Multiple MEDIA:\nlines send multiple files in one bubble. Surrounding sentences remain visible.\n\n## Inline option buttons (non-blocking)\nOffer up to 6 tappable choices. The user can still type instead.\n[[BGOS_BUTTONS]]\nYes, ship it | ship\nHold off | hold\n[[/BGOS_BUTTONS]]\nEach line is `Label | value`. The value comes back to you as the user's next\nmessage when they tap. Any text before the block is the question.\n\n## ask_user_input (blocking questions)\nAsk 1 to 4 questions the user must answer before continuing.\n[[BGOS_ASK]]\nQ: Which environment?\nStaging | staging\nProduction | prod\nQ: Proceed now?\nnoskip\nYes | yes\n[[/BGOS_ASK]]\nOptions are `Label | value`. Add `noskip` to require an answer, `nofreetext`\nto disallow a typed answer. Each answer arrives as your next message.\n\n## Status line\nShow a short working status with `STATUS: <text>` on its own line (for example\n`STATUS: running tests`). An empty `STATUS:` clears it.\n\n## Tool activity (automatic)\nYour shell commands, file edits, MCP tool calls, and web searches are shown to\nthe user as a live tool-progress card automatically. You do not need to report\nthem.\n\n## Files the user sends you\nImages are attached to your input directly. Other files are downloaded and their\nabsolute path is given to you inline as `[File attached: /path (mime)]`; read\nthem from disk as needed.\n\n## Slash commands\n`/new` starts a fresh conversation (your thread is reset). `/retry` re-runs the\nuser's last message. `/status` shows daemon health. These are handled by the\ndaemon; you will not see them.\n\n## Not supported here\nNo group chats, threads, or message editing. Dangerous-command approval prompts\nare not surfaced to BGOS in this version; run within your sandbox.\n";
|
|
3
|
+
/**
|
|
4
|
+
* Upper bound on an accepted served canon. The real canon is a few KB; this is
|
|
5
|
+
* ~50x headroom. SECURITY: the served text is written to AGENTS.md and read by
|
|
6
|
+
* a shell-capable Codex agent, so a compromised or MITM'd backend returning a
|
|
7
|
+
* multi-MB body would be both a disk/memory-DoS and an unbounded prompt-injection
|
|
8
|
+
* surface. Over the cap we fall back to the bundled copy.
|
|
9
|
+
*/
|
|
10
|
+
export declare const MAX_CANON_BYTES: number;
|
|
3
11
|
/** Shape of GET /integrations/capabilities?channel=codex. */
|
|
4
12
|
export interface ServedCapabilities {
|
|
5
13
|
channel: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAiBA,6DAA6D;AAC7D,eAAO,MAAM,oBAAoB,ymFAAmB,CAAC;AAErD,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGxE;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,GAAE,MAA6B,GACrC,kBAAkB,
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAiBA,6DAA6D;AAC7D,eAAO,MAAM,oBAAoB,ymFAAmB,CAAC;AAErD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAAa,CAAC;AAE1C,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGxE;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,GAAE,MAA6B,GACrC,kBAAkB,CAWpB"}
|
package/dist/capabilities.js
CHANGED
|
@@ -16,6 +16,14 @@
|
|
|
16
16
|
import { BGOS_AGENT_HINTS } from "./agent-hints.js";
|
|
17
17
|
/** The bundled, offline fallback shipped with the daemon. */
|
|
18
18
|
export const BUNDLED_CAPABILITIES = BGOS_AGENT_HINTS;
|
|
19
|
+
/**
|
|
20
|
+
* Upper bound on an accepted served canon. The real canon is a few KB; this is
|
|
21
|
+
* ~50x headroom. SECURITY: the served text is written to AGENTS.md and read by
|
|
22
|
+
* a shell-capable Codex agent, so a compromised or MITM'd backend returning a
|
|
23
|
+
* multi-MB body would be both a disk/memory-DoS and an unbounded prompt-injection
|
|
24
|
+
* surface. Over the cap we fall back to the bundled copy.
|
|
25
|
+
*/
|
|
26
|
+
export const MAX_CANON_BYTES = 256 * 1024;
|
|
19
27
|
/**
|
|
20
28
|
* Whether a payload looks like a real BGOS capability canon. The served text
|
|
21
29
|
* opens with "# BGOS Channel Agent Capabilities" and the bundled copy with
|
|
@@ -36,6 +44,7 @@ export function pickCapabilitiesText(fetched, bundled = BUNDLED_CAPABILITIES) {
|
|
|
36
44
|
const served = fetched?.text;
|
|
37
45
|
if (typeof served === "string" &&
|
|
38
46
|
served.trim().length > 0 &&
|
|
47
|
+
served.length <= MAX_CANON_BYTES &&
|
|
39
48
|
hasCanonMarkers(served)) {
|
|
40
49
|
return { text: served, source: "backend" };
|
|
41
50
|
}
|
package/dist/capabilities.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC;AAW1C;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAA+B;IAC7D,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AAC9E,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA8C,EAC9C,UAAkB,oBAAoB;IAEtC,MAAM,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC;IAC7B,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACxB,MAAM,CAAC,MAAM,IAAI,eAAe;QAChC,eAAe,CAAC,MAAM,CAAC,EACvB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC9C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codex-channel-bgos",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "BGOS channel adapter for OpenAI Codex: pair, WS + REST client, Codex SDK host, outbound modalities, one-paste connect",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|