@code-yeongyu/senpi-ai 2026.9.10 → 2026.9.11
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/api/devin-agent/discovery.d.ts +17 -0
- package/dist/api/devin-agent/discovery.d.ts.map +1 -0
- package/dist/api/devin-agent/discovery.js +90 -0
- package/dist/api/devin-agent/discovery.js.map +1 -0
- package/dist/api/devin-agent/frames.d.ts +23 -0
- package/dist/api/devin-agent/frames.d.ts.map +1 -0
- package/dist/api/devin-agent/frames.js +71 -0
- package/dist/api/devin-agent/frames.js.map +1 -0
- package/dist/api/devin-agent/gen/cascade_pb.d.ts +873 -0
- package/dist/api/devin-agent/gen/cascade_pb.d.ts.map +1 -0
- package/dist/api/devin-agent/gen/cascade_pb.js +303 -0
- package/dist/api/devin-agent/gen/cascade_pb.js.map +1 -0
- package/dist/api/devin-agent/metadata.d.ts +12 -0
- package/dist/api/devin-agent/metadata.d.ts.map +1 -0
- package/dist/api/devin-agent/metadata.js +35 -0
- package/dist/api/devin-agent/metadata.js.map +1 -0
- package/dist/api/devin-agent/paths.d.ts +23 -0
- package/dist/api/devin-agent/paths.d.ts.map +1 -0
- package/dist/api/devin-agent/paths.js +23 -0
- package/dist/api/devin-agent/paths.js.map +1 -0
- package/dist/api/devin-agent/request.d.ts +24 -0
- package/dist/api/devin-agent/request.d.ts.map +1 -0
- package/dist/api/devin-agent/request.js +116 -0
- package/dist/api/devin-agent/request.js.map +1 -0
- package/dist/api/devin-agent/stream-state.d.ts +20 -0
- package/dist/api/devin-agent/stream-state.d.ts.map +1 -0
- package/dist/api/devin-agent/stream-state.js +153 -0
- package/dist/api/devin-agent/stream-state.js.map +1 -0
- package/dist/api/devin-agent/types.d.ts +12 -0
- package/dist/api/devin-agent/types.d.ts.map +1 -0
- package/dist/api/devin-agent/types.js +3 -0
- package/dist/api/devin-agent/types.js.map +1 -0
- package/dist/api/devin-agent/wire.d.ts +6 -0
- package/dist/api/devin-agent/wire.d.ts.map +1 -0
- package/dist/api/devin-agent/wire.js +6 -0
- package/dist/api/devin-agent/wire.js.map +1 -0
- package/dist/api/devin-agent.d.ts +14 -0
- package/dist/api/devin-agent.d.ts.map +1 -0
- package/dist/api/devin-agent.js +162 -0
- package/dist/api/devin-agent.js.map +1 -0
- package/dist/api/devin-agent.lazy.d.ts +5 -0
- package/dist/api/devin-agent.lazy.d.ts.map +1 -0
- package/dist/api/devin-agent.lazy.js +23 -0
- package/dist/api/devin-agent.lazy.js.map +1 -0
- package/dist/auth/oauth/devin-callback.d.ts +25 -0
- package/dist/auth/oauth/devin-callback.d.ts.map +1 -0
- package/dist/auth/oauth/devin-callback.js +124 -0
- package/dist/auth/oauth/devin-callback.js.map +1 -0
- package/dist/auth/oauth/devin-token.d.ts +18 -0
- package/dist/auth/oauth/devin-token.d.ts.map +1 -0
- package/dist/auth/oauth/devin-token.js +101 -0
- package/dist/auth/oauth/devin-token.js.map +1 -0
- package/dist/auth/oauth/devin.d.ts +14 -0
- package/dist/auth/oauth/devin.d.ts.map +1 -0
- package/dist/auth/oauth/devin.js +111 -0
- package/dist/auth/oauth/devin.js.map +1 -0
- package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
- package/dist/auth/oauth/kimi-coding.js +5 -1
- package/dist/auth/oauth/kimi-coding.js.map +1 -1
- package/dist/auth/oauth/kimi-identity.d.ts +24 -0
- package/dist/auth/oauth/kimi-identity.d.ts.map +1 -0
- package/dist/auth/oauth/kimi-identity.js +86 -0
- package/dist/auth/oauth/kimi-identity.js.map +1 -0
- package/dist/auth/oauth/load.d.ts +2 -0
- package/dist/auth/oauth/load.d.ts.map +1 -1
- package/dist/auth/oauth/load.js +5 -0
- package/dist/auth/oauth/load.js.map +1 -1
- package/dist/auth/pool/slots.d.ts +51 -4
- package/dist/auth/pool/slots.d.ts.map +1 -1
- package/dist/auth/pool/slots.js +196 -7
- package/dist/auth/pool/slots.js.map +1 -1
- package/dist/auth/resolve.d.ts +8 -0
- package/dist/auth/resolve.d.ts.map +1 -1
- package/dist/auth/resolve.js +10 -0
- package/dist/auth/resolve.js.map +1 -1
- package/dist/auth/types.d.ts +9 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/bun-oauth.d.ts.map +1 -1
- package/dist/bun-oauth.js +2 -0
- package/dist/bun-oauth.js.map +1 -1
- package/dist/compat.d.ts +1 -0
- package/dist/compat.d.ts.map +1 -1
- package/dist/compat.js +3 -0
- package/dist/compat.js.map +1 -1
- package/dist/image-models.generated.js +4 -4
- package/dist/image-models.generated.js.map +1 -1
- package/dist/models.d.ts +1 -1
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +14 -5
- package/dist/models.js.map +1 -1
- package/dist/providers/all.d.ts.map +1 -1
- package/dist/providers/all.js +2 -0
- package/dist/providers/all.js.map +1 -1
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/amazon-bedrock.json +1 -1
- package/dist/providers/data/baseten.json +1 -1
- package/dist/providers/data/fireworks.json +1 -1
- package/dist/providers/data/huggingface.json +1 -1
- package/dist/providers/data/opencode-go.json +1 -1
- package/dist/providers/data/opengateway.json +1 -1
- package/dist/providers/data/openrouter.json +1 -1
- package/dist/providers/data/venice.json +1 -1
- package/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/dist/providers/devin.d.ts +12 -0
- package/dist/providers/devin.d.ts.map +1 -0
- package/dist/providers/devin.js +62 -0
- package/dist/providers/devin.js.map +1 -0
- package/dist/providers/devin.models.d.ts +10 -0
- package/dist/providers/devin.models.d.ts.map +1 -0
- package/dist/providers/devin.models.js +28 -0
- package/dist/providers/devin.models.js.map +1 -0
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +4 -0
- package/dist/utils/retry.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cascade model discovery.
|
|
3
|
+
*
|
|
4
|
+
* `GetCliModelConfigs` is credential-scoped: it reports the models the signed-in
|
|
5
|
+
* account may actually use, which differs per plan and per rollout. A failed or
|
|
6
|
+
* empty response therefore returns undefined so callers KEEP their static seed
|
|
7
|
+
* instead of publishing an empty catalog.
|
|
8
|
+
*/
|
|
9
|
+
import type { Model } from "../../types.ts";
|
|
10
|
+
export interface DevinDiscoveryOptions {
|
|
11
|
+
apiKey: string | undefined;
|
|
12
|
+
baseUrl?: string;
|
|
13
|
+
timeoutMs?: number;
|
|
14
|
+
signal?: AbortSignal;
|
|
15
|
+
}
|
|
16
|
+
export declare function fetchDevinModels(options: DevinDiscoveryOptions): Promise<Model<"devin-agent">[] | undefined>;
|
|
17
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAS5C,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,SAAS,CAAC,CAgClH"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cascade model discovery.
|
|
3
|
+
*
|
|
4
|
+
* `GetCliModelConfigs` is credential-scoped: it reports the models the signed-in
|
|
5
|
+
* account may actually use, which differs per plan and per rollout. A failed or
|
|
6
|
+
* empty response therefore returns undefined so callers KEEP their static seed
|
|
7
|
+
* instead of publishing an empty catalog.
|
|
8
|
+
*/
|
|
9
|
+
import { create, fromBinary, toBinary } from "@bufbuild/protobuf";
|
|
10
|
+
import { GetCliModelConfigsRequestSchema, GetCliModelConfigsResponseSchema } from "./gen/cascade_pb.js";
|
|
11
|
+
import { devinCliMetadata, normalizeDevinSessionToken } from "./metadata.js";
|
|
12
|
+
import { DEVIN_CLI_MODEL_CONFIGS_PATH, DEVIN_DEFAULT_BASE_URL } from "./paths.js";
|
|
13
|
+
const DISCOVERY_TIMEOUT_MS = 5_000;
|
|
14
|
+
const DEFAULT_CONTEXT_WINDOW = 200_000;
|
|
15
|
+
const DEFAULT_MAX_TOKENS = 128_000;
|
|
16
|
+
export async function fetchDevinModels(options) {
|
|
17
|
+
const baseUrl = options.baseUrl ?? DEVIN_DEFAULT_BASE_URL;
|
|
18
|
+
const controller = new AbortController();
|
|
19
|
+
const onAbort = () => controller.abort();
|
|
20
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
21
|
+
const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? DISCOVERY_TIMEOUT_MS);
|
|
22
|
+
try {
|
|
23
|
+
const request = create(GetCliModelConfigsRequestSchema, { metadata: devinCliMetadata(options.apiKey) });
|
|
24
|
+
const payload = toUnaryFrame(request);
|
|
25
|
+
const response = await fetch(baseUrl + DEVIN_CLI_MODEL_CONFIGS_PATH, {
|
|
26
|
+
method: "POST",
|
|
27
|
+
headers: {
|
|
28
|
+
"content-type": "application/connect+proto",
|
|
29
|
+
"connect-protocol-version": "1",
|
|
30
|
+
authorization: `Bearer ${normalizeDevinSessionToken(options.apiKey)}`,
|
|
31
|
+
},
|
|
32
|
+
body: payload,
|
|
33
|
+
signal: controller.signal,
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok)
|
|
36
|
+
return undefined;
|
|
37
|
+
const body = new Uint8Array(await response.arrayBuffer());
|
|
38
|
+
const decoded = decodeUnary(body);
|
|
39
|
+
if (!decoded)
|
|
40
|
+
return undefined;
|
|
41
|
+
const models = decoded.clientModelConfigs.filter(usable).map(toModel);
|
|
42
|
+
return models.length > 0 ? models : undefined;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
clearTimeout(timeout);
|
|
49
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function usable(config) {
|
|
53
|
+
return config.modelUid.length > 0 && !config.disabled;
|
|
54
|
+
}
|
|
55
|
+
function toModel(config) {
|
|
56
|
+
return {
|
|
57
|
+
id: config.modelUid,
|
|
58
|
+
name: config.label || config.modelUid,
|
|
59
|
+
api: "devin-agent",
|
|
60
|
+
provider: "devin",
|
|
61
|
+
baseUrl: DEVIN_DEFAULT_BASE_URL,
|
|
62
|
+
reasoning: true,
|
|
63
|
+
input: config.supportsImages ? ["text", "image"] : ["text"],
|
|
64
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
65
|
+
contextWindow: DEFAULT_CONTEXT_WINDOW,
|
|
66
|
+
maxTokens: config.maxTokens > 0 ? config.maxTokens : DEFAULT_MAX_TOKENS,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** Unary Connect bodies use the same 5-byte prefix, uncompressed. */
|
|
70
|
+
function toUnaryFrame(message) {
|
|
71
|
+
const payload = toBinary(GetCliModelConfigsRequestSchema, message);
|
|
72
|
+
const frame = new Uint8Array(5 + payload.byteLength);
|
|
73
|
+
new DataView(frame.buffer).setUint32(1, payload.byteLength, false);
|
|
74
|
+
frame.set(payload, 5);
|
|
75
|
+
return frame;
|
|
76
|
+
}
|
|
77
|
+
function decodeUnary(body) {
|
|
78
|
+
if (body.byteLength < 5)
|
|
79
|
+
return undefined;
|
|
80
|
+
const view = new DataView(body.buffer, body.byteOffset, body.byteLength);
|
|
81
|
+
const length = view.getUint32(1, false);
|
|
82
|
+
const payload = body.subarray(5, 5 + length);
|
|
83
|
+
try {
|
|
84
|
+
return fromBinary(GetCliModelConfigsResponseSchema, payload);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/api/devin-agent/discovery.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cascade model discovery.\n *\n * `GetCliModelConfigs` is credential-scoped: it reports the models the signed-in\n * account may actually use, which differs per plan and per rollout. A failed or\n * empty response therefore returns undefined so callers KEEP their static seed\n * instead of publishing an empty catalog.\n */\n\nimport { create, fromBinary, toBinary } from \"@bufbuild/protobuf\";\nimport type { Model } from \"../../types.ts\";\nimport { GetCliModelConfigsRequestSchema, GetCliModelConfigsResponseSchema } from \"./gen/cascade_pb.ts\";\nimport { devinCliMetadata, normalizeDevinSessionToken } from \"./metadata.ts\";\nimport { DEVIN_CLI_MODEL_CONFIGS_PATH, DEVIN_DEFAULT_BASE_URL } from \"./paths.ts\";\n\nconst DISCOVERY_TIMEOUT_MS = 5_000;\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst DEFAULT_MAX_TOKENS = 128_000;\n\nexport interface DevinDiscoveryOptions {\n\tapiKey: string | undefined;\n\tbaseUrl?: string;\n\ttimeoutMs?: number;\n\tsignal?: AbortSignal;\n}\n\nexport async function fetchDevinModels(options: DevinDiscoveryOptions): Promise<Model<\"devin-agent\">[] | undefined> {\n\tconst baseUrl = options.baseUrl ?? DEVIN_DEFAULT_BASE_URL;\n\tconst controller = new AbortController();\n\tconst onAbort = () => controller.abort();\n\toptions.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\tconst timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? DISCOVERY_TIMEOUT_MS);\n\n\ttry {\n\t\tconst request = create(GetCliModelConfigsRequestSchema, { metadata: devinCliMetadata(options.apiKey) });\n\t\tconst payload = toUnaryFrame(request);\n\t\tconst response = await fetch(baseUrl + DEVIN_CLI_MODEL_CONFIGS_PATH, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"content-type\": \"application/connect+proto\",\n\t\t\t\t\"connect-protocol-version\": \"1\",\n\t\t\t\tauthorization: `Bearer ${normalizeDevinSessionToken(options.apiKey)}`,\n\t\t\t},\n\t\t\tbody: payload,\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tif (!response.ok) return undefined;\n\t\tconst body = new Uint8Array(await response.arrayBuffer());\n\t\tconst decoded = decodeUnary(body);\n\t\tif (!decoded) return undefined;\n\t\tconst models = decoded.clientModelConfigs.filter(usable).map(toModel);\n\t\treturn models.length > 0 ? models : undefined;\n\t} catch {\n\t\treturn undefined;\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t}\n}\n\nfunction usable(config: { modelUid: string; disabled: boolean }): boolean {\n\treturn config.modelUid.length > 0 && !config.disabled;\n}\n\nfunction toModel(config: {\n\tmodelUid: string;\n\tlabel: string;\n\tmaxTokens: number;\n\tsupportsImages: boolean;\n}): Model<\"devin-agent\"> {\n\treturn {\n\t\tid: config.modelUid,\n\t\tname: config.label || config.modelUid,\n\t\tapi: \"devin-agent\",\n\t\tprovider: \"devin\",\n\t\tbaseUrl: DEVIN_DEFAULT_BASE_URL,\n\t\treasoning: true,\n\t\tinput: config.supportsImages ? [\"text\", \"image\"] : [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: DEFAULT_CONTEXT_WINDOW,\n\t\tmaxTokens: config.maxTokens > 0 ? config.maxTokens : DEFAULT_MAX_TOKENS,\n\t};\n}\n\n/** Unary Connect bodies use the same 5-byte prefix, uncompressed. */\nfunction toUnaryFrame(\n\tmessage: ReturnType<typeof create<typeof GetCliModelConfigsRequestSchema>>,\n): Uint8Array<ArrayBuffer> {\n\tconst payload = toBinary(GetCliModelConfigsRequestSchema, message);\n\tconst frame = new Uint8Array(5 + payload.byteLength);\n\tnew DataView(frame.buffer).setUint32(1, payload.byteLength, false);\n\tframe.set(payload, 5);\n\treturn frame;\n}\n\nfunction decodeUnary(\n\tbody: Uint8Array,\n): ReturnType<typeof fromBinary<typeof GetCliModelConfigsResponseSchema>> | undefined {\n\tif (body.byteLength < 5) return undefined;\n\tconst view = new DataView(body.buffer, body.byteOffset, body.byteLength);\n\tconst length = view.getUint32(1, false);\n\tconst payload = body.subarray(5, 5 + length);\n\ttry {\n\t\treturn fromBinary(GetCliModelConfigsResponseSchema, payload);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connect streaming frame codec.
|
|
3
|
+
*
|
|
4
|
+
* Each frame is a 5-byte prefix - one flag byte plus a big-endian payload
|
|
5
|
+
* length - followed by the payload. Requests are gzipped (flag 0x01); the final
|
|
6
|
+
* response frame carries JSON trailers (flag 0x02) instead of a message.
|
|
7
|
+
*/
|
|
8
|
+
import { type DescMessage, type MessageShape } from "@bufbuild/protobuf";
|
|
9
|
+
export interface DevinFrame<TSchema extends DescMessage> {
|
|
10
|
+
/** Decoded message, absent on the end-of-stream trailer frame. */
|
|
11
|
+
message?: MessageShape<TSchema>;
|
|
12
|
+
/** Raw trailer JSON, present only on the end-of-stream frame. */
|
|
13
|
+
trailer?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Encodes one request message as a single gzipped Connect frame. */
|
|
16
|
+
export declare function encodeDevinFrame<TSchema extends DescMessage>(schema: TSchema, message: MessageShape<TSchema>): Uint8Array<ArrayBuffer>;
|
|
17
|
+
/**
|
|
18
|
+
* Decodes a Connect frame stream. Yields one entry per frame in arrival order
|
|
19
|
+
* so callers can map deltas as they land; the trailer frame yields its raw JSON
|
|
20
|
+
* instead of a message.
|
|
21
|
+
*/
|
|
22
|
+
export declare function decodeDevinFrames<TSchema extends DescMessage>(body: ReadableStream<Uint8Array>, schema: TSchema): AsyncGenerator<DevinFrame<TSchema>>;
|
|
23
|
+
//# sourceMappingURL=frames.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/frames.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,KAAK,WAAW,EAAc,KAAK,YAAY,EAAY,MAAM,oBAAoB,CAAC;AAG/F,MAAM,WAAW,UAAU,CAAC,OAAO,SAAS,WAAW;IACtD,kEAAkE;IAClE,OAAO,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAChC,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,OAAO,SAAS,WAAW,EAC3D,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAC5B,UAAU,CAAC,WAAW,CAAC,CAOzB;AAED;;;;GAIG;AACH,wBAAuB,iBAAiB,CAAC,OAAO,SAAS,WAAW,EACnE,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,MAAM,EAAE,OAAO,GACb,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CA4BrC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connect streaming frame codec.
|
|
3
|
+
*
|
|
4
|
+
* Each frame is a 5-byte prefix - one flag byte plus a big-endian payload
|
|
5
|
+
* length - followed by the payload. Requests are gzipped (flag 0x01); the final
|
|
6
|
+
* response frame carries JSON trailers (flag 0x02) instead of a message.
|
|
7
|
+
*/
|
|
8
|
+
import { gunzipSync, gzipSync } from "node:zlib";
|
|
9
|
+
import { fromBinary, toBinary } from "@bufbuild/protobuf";
|
|
10
|
+
import { DEVIN_COMPRESSED_FLAG, DEVIN_MAX_FRAME_PAYLOAD, DEVIN_TRAILER_FLAG } from "./paths.js";
|
|
11
|
+
/** Encodes one request message as a single gzipped Connect frame. */
|
|
12
|
+
export function encodeDevinFrame(schema, message) {
|
|
13
|
+
const payload = gzipSync(toBinary(schema, message));
|
|
14
|
+
const frame = new Uint8Array(5 + payload.byteLength);
|
|
15
|
+
frame[0] = DEVIN_COMPRESSED_FLAG;
|
|
16
|
+
new DataView(frame.buffer).setUint32(1, payload.byteLength, false);
|
|
17
|
+
frame.set(payload, 5);
|
|
18
|
+
return frame;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Decodes a Connect frame stream. Yields one entry per frame in arrival order
|
|
22
|
+
* so callers can map deltas as they land; the trailer frame yields its raw JSON
|
|
23
|
+
* instead of a message.
|
|
24
|
+
*/
|
|
25
|
+
export async function* decodeDevinFrames(body, schema) {
|
|
26
|
+
let pending = new Uint8Array(0);
|
|
27
|
+
const reader = body.getReader();
|
|
28
|
+
try {
|
|
29
|
+
for (;;) {
|
|
30
|
+
const { done, value } = await reader.read();
|
|
31
|
+
if (value && value.byteLength > 0)
|
|
32
|
+
pending = append(pending, value);
|
|
33
|
+
while (pending.byteLength >= 5) {
|
|
34
|
+
const view = new DataView(pending.buffer, pending.byteOffset, pending.byteLength);
|
|
35
|
+
const length = view.getUint32(1, false);
|
|
36
|
+
if (length > DEVIN_MAX_FRAME_PAYLOAD) {
|
|
37
|
+
throw new Error(`Devin Connect frame length ${length} exceeds the ${DEVIN_MAX_FRAME_PAYLOAD}-byte cap`);
|
|
38
|
+
}
|
|
39
|
+
if (pending.byteLength < 5 + length)
|
|
40
|
+
break;
|
|
41
|
+
const flags = pending[0] ?? 0;
|
|
42
|
+
const raw = pending.subarray(5, 5 + length);
|
|
43
|
+
const payload = (flags & DEVIN_COMPRESSED_FLAG) === 0 ? copyOf(raw) : copyOf(gunzipSync(raw));
|
|
44
|
+
pending = pending.subarray(5 + length);
|
|
45
|
+
yield (flags & DEVIN_TRAILER_FLAG) === 0
|
|
46
|
+
? { message: fromBinary(schema, payload) }
|
|
47
|
+
: { trailer: new TextDecoder().decode(payload) };
|
|
48
|
+
}
|
|
49
|
+
if (done)
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
reader.releaseLock();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** protobuf-es requires an ArrayBuffer-backed view; Node buffers may be shared. */
|
|
58
|
+
function copyOf(source) {
|
|
59
|
+
const out = new Uint8Array(source.byteLength);
|
|
60
|
+
out.set(source);
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
function append(head, tail) {
|
|
64
|
+
if (head.byteLength === 0)
|
|
65
|
+
return tail;
|
|
66
|
+
const out = new Uint8Array(head.byteLength + tail.byteLength);
|
|
67
|
+
out.set(head, 0);
|
|
68
|
+
out.set(tail, head.byteLength);
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=frames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frames.js","sourceRoot":"","sources":["../../../src/api/devin-agent/frames.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Connect streaming frame codec.\n *\n * Each frame is a 5-byte prefix - one flag byte plus a big-endian payload\n * length - followed by the payload. Requests are gzipped (flag 0x01); the final\n * response frame carries JSON trailers (flag 0x02) instead of a message.\n */\n\nimport { gunzipSync, gzipSync } from \"node:zlib\";\nimport { type DescMessage, fromBinary, type MessageShape, toBinary } from \"@bufbuild/protobuf\";\nimport { DEVIN_COMPRESSED_FLAG, DEVIN_MAX_FRAME_PAYLOAD, DEVIN_TRAILER_FLAG } from \"./paths.ts\";\n\nexport interface DevinFrame<TSchema extends DescMessage> {\n\t/** Decoded message, absent on the end-of-stream trailer frame. */\n\tmessage?: MessageShape<TSchema>;\n\t/** Raw trailer JSON, present only on the end-of-stream frame. */\n\ttrailer?: string;\n}\n\n/** Encodes one request message as a single gzipped Connect frame. */\nexport function encodeDevinFrame<TSchema extends DescMessage>(\n\tschema: TSchema,\n\tmessage: MessageShape<TSchema>,\n): Uint8Array<ArrayBuffer> {\n\tconst payload = gzipSync(toBinary(schema, message));\n\tconst frame = new Uint8Array(5 + payload.byteLength);\n\tframe[0] = DEVIN_COMPRESSED_FLAG;\n\tnew DataView(frame.buffer).setUint32(1, payload.byteLength, false);\n\tframe.set(payload, 5);\n\treturn frame;\n}\n\n/**\n * Decodes a Connect frame stream. Yields one entry per frame in arrival order\n * so callers can map deltas as they land; the trailer frame yields its raw JSON\n * instead of a message.\n */\nexport async function* decodeDevinFrames<TSchema extends DescMessage>(\n\tbody: ReadableStream<Uint8Array>,\n\tschema: TSchema,\n): AsyncGenerator<DevinFrame<TSchema>> {\n\tlet pending: Uint8Array<ArrayBufferLike> = new Uint8Array(0);\n\tconst reader = body.getReader();\n\ttry {\n\t\tfor (;;) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (value && value.byteLength > 0) pending = append(pending, value);\n\t\t\twhile (pending.byteLength >= 5) {\n\t\t\t\tconst view = new DataView(pending.buffer, pending.byteOffset, pending.byteLength);\n\t\t\t\tconst length = view.getUint32(1, false);\n\t\t\t\tif (length > DEVIN_MAX_FRAME_PAYLOAD) {\n\t\t\t\t\tthrow new Error(`Devin Connect frame length ${length} exceeds the ${DEVIN_MAX_FRAME_PAYLOAD}-byte cap`);\n\t\t\t\t}\n\t\t\t\tif (pending.byteLength < 5 + length) break;\n\t\t\t\tconst flags = pending[0] ?? 0;\n\t\t\t\tconst raw = pending.subarray(5, 5 + length);\n\t\t\t\tconst payload: Uint8Array<ArrayBuffer> =\n\t\t\t\t\t(flags & DEVIN_COMPRESSED_FLAG) === 0 ? copyOf(raw) : copyOf(gunzipSync(raw));\n\t\t\t\tpending = pending.subarray(5 + length);\n\t\t\t\tyield (flags & DEVIN_TRAILER_FLAG) === 0\n\t\t\t\t\t? { message: fromBinary(schema, payload) }\n\t\t\t\t\t: { trailer: new TextDecoder().decode(payload) };\n\t\t\t}\n\t\t\tif (done) break;\n\t\t}\n\t} finally {\n\t\treader.releaseLock();\n\t}\n}\n\n/** protobuf-es requires an ArrayBuffer-backed view; Node buffers may be shared. */\nfunction copyOf(source: Uint8Array<ArrayBufferLike>): Uint8Array<ArrayBuffer> {\n\tconst out = new Uint8Array(source.byteLength);\n\tout.set(source);\n\treturn out;\n}\n\nfunction append(head: Uint8Array<ArrayBufferLike>, tail: Uint8Array<ArrayBufferLike>): Uint8Array<ArrayBufferLike> {\n\tif (head.byteLength === 0) return tail;\n\tconst out = new Uint8Array(head.byteLength + tail.byteLength);\n\tout.set(head, 0);\n\tout.set(tail, head.byteLength);\n\treturn out;\n}\n"]}
|