@averyyy/pi-ai 0.85.1-piclient.7 → 0.85.1-piclient.9

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.
@@ -0,0 +1,3 @@
1
+ /** Devin's shared API base URL, kept separate from the Node-only wire protocol. */
2
+ export declare const DEVIN_BASE_URL = "https://server.codeium.com";
3
+ //# sourceMappingURL=devin-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devin-constants.d.ts","sourceRoot":"","sources":["../../src/api/devin-constants.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,cAAc,+BAA+B,CAAC","sourcesContent":["/** Devin's shared API base URL, kept separate from the Node-only wire protocol. */\nexport const DEVIN_BASE_URL = \"https://server.codeium.com\";\n"]}
@@ -0,0 +1,3 @@
1
+ /** Devin's shared API base URL, kept separate from the Node-only wire protocol. */
2
+ export const DEVIN_BASE_URL = "https://server.codeium.com";
3
+ //# sourceMappingURL=devin-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devin-constants.js","sourceRoot":"","sources":["../../src/api/devin-constants.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,cAAc,GAAG,4BAA4B,CAAC","sourcesContent":["/** Devin's shared API base URL, kept separate from the Node-only wire protocol. */\nexport const DEVIN_BASE_URL = \"https://server.codeium.com\";\n"]}
@@ -1,4 +1,5 @@
1
- export declare const DEVIN_BASE_URL = "https://server.codeium.com";
1
+ import { DEVIN_BASE_URL } from "./devin-constants.ts";
2
+ export { DEVIN_BASE_URL };
2
3
  /** Protocol client identity required by Devin Local; no installed CLI dependency. */
3
4
  export declare function buildMetadata(input: {
4
5
  apiKey: string;
@@ -1 +1 @@
1
- {"version":3,"file":"devin-metadata.d.ts","sourceRoot":"","sources":["../../src/api/devin-metadata.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,+BAA+B,CAAC;AAE3D,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,CAoBT","sourcesContent":["import { encodeMessage, encodeString, encodeTimestampBody, encodeVarintField } from \"./devin-wire.ts\";\n\nexport const DEVIN_BASE_URL = \"https://server.codeium.com\";\n\n/** Protocol client identity required by Devin Local; no installed CLI dependency. */\nexport function buildMetadata(input: {\n\tapiKey: string;\n\tuserJwt?: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tdiscovery?: boolean;\n}): Buffer {\n\tconst name = input.discovery ? \"chisel\" : \"devin-cli\";\n\tconst version = input.discovery ? \"0.0.0-dev\" : \"3000.6.2\";\n\tconst token = input.apiKey.startsWith(\"devin-session-token$\") ? input.apiKey : `devin-session-token$${input.apiKey}`;\n\treturn Buffer.concat([\n\t\tencodeString(1, name),\n\t\tencodeString(2, version),\n\t\tencodeString(3, token),\n\t\tencodeString(4, \"en\"),\n\t\tencodeString(5, process.platform === \"win32\" ? \"windows\" : process.platform),\n\t\tencodeString(7, version),\n\t\tencodeVarintField(9, input.requestId),\n\t\tencodeString(10, input.sessionId),\n\t\tencodeString(12, \"chisel\"),\n\t\tencodeMessage(16, encodeTimestampBody()),\n\t\t...(input.userJwt ? [encodeString(21, input.userJwt)] : []),\n\t\tencodeString(25, input.triggerId),\n\t\tencodeString(28, \"chisel\"),\n\t\t...[3, 4, 6, 7, 8].map((value) => encodeVarintField(30, value)),\n\t]);\n}\n"]}
1
+ {"version":3,"file":"devin-metadata.d.ts","sourceRoot":"","sources":["../../src/api/devin-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,CAoBT","sourcesContent":["import { DEVIN_BASE_URL } from \"./devin-constants.ts\";\nimport { encodeMessage, encodeString, encodeTimestampBody, encodeVarintField } from \"./devin-wire.ts\";\n\nexport { DEVIN_BASE_URL };\n\n/** Protocol client identity required by Devin Local; no installed CLI dependency. */\nexport function buildMetadata(input: {\n\tapiKey: string;\n\tuserJwt?: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tdiscovery?: boolean;\n}): Buffer {\n\tconst name = input.discovery ? \"chisel\" : \"devin-cli\";\n\tconst version = input.discovery ? \"0.0.0-dev\" : \"3000.6.2\";\n\tconst token = input.apiKey.startsWith(\"devin-session-token$\") ? input.apiKey : `devin-session-token$${input.apiKey}`;\n\treturn Buffer.concat([\n\t\tencodeString(1, name),\n\t\tencodeString(2, version),\n\t\tencodeString(3, token),\n\t\tencodeString(4, \"en\"),\n\t\tencodeString(5, process.platform === \"win32\" ? \"windows\" : process.platform),\n\t\tencodeString(7, version),\n\t\tencodeVarintField(9, input.requestId),\n\t\tencodeString(10, input.sessionId),\n\t\tencodeString(12, \"chisel\"),\n\t\tencodeMessage(16, encodeTimestampBody()),\n\t\t...(input.userJwt ? [encodeString(21, input.userJwt)] : []),\n\t\tencodeString(25, input.triggerId),\n\t\tencodeString(28, \"chisel\"),\n\t\t...[3, 4, 6, 7, 8].map((value) => encodeVarintField(30, value)),\n\t]);\n}\n"]}
@@ -1,5 +1,6 @@
1
+ import { DEVIN_BASE_URL } from "./devin-constants.js";
1
2
  import { encodeMessage, encodeString, encodeTimestampBody, encodeVarintField } from "./devin-wire.js";
2
- export const DEVIN_BASE_URL = "https://server.codeium.com";
3
+ export { DEVIN_BASE_URL };
3
4
  /** Protocol client identity required by Devin Local; no installed CLI dependency. */
4
5
  export function buildMetadata(input) {
5
6
  const name = input.discovery ? "chisel" : "devin-cli";
@@ -1 +1 @@
1
- {"version":3,"file":"devin-metadata.js","sourceRoot":"","sources":["../../src/api/devin-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEtG,MAAM,CAAC,MAAM,cAAc,GAAG,4BAA4B,CAAC;AAE3D,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,KAO7B,EAAU;IACV,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;IACtD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,KAAK,CAAC,MAAM,EAAE,CAAC;IACrH,OAAO,MAAM,CAAC,MAAM,CAAC;QACpB,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC;QACrB,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;QACxB,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC;QACtB,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC;QACrB,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC5E,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;QACxB,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;QACrC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC;QACjC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC;QAC1B,aAAa,CAAC,EAAE,EAAE,mBAAmB,EAAE,CAAC;QACxC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC;QACjC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC;QAC1B,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;KAC/D,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { encodeMessage, encodeString, encodeTimestampBody, encodeVarintField } from \"./devin-wire.ts\";\n\nexport const DEVIN_BASE_URL = \"https://server.codeium.com\";\n\n/** Protocol client identity required by Devin Local; no installed CLI dependency. */\nexport function buildMetadata(input: {\n\tapiKey: string;\n\tuserJwt?: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tdiscovery?: boolean;\n}): Buffer {\n\tconst name = input.discovery ? \"chisel\" : \"devin-cli\";\n\tconst version = input.discovery ? \"0.0.0-dev\" : \"3000.6.2\";\n\tconst token = input.apiKey.startsWith(\"devin-session-token$\") ? input.apiKey : `devin-session-token$${input.apiKey}`;\n\treturn Buffer.concat([\n\t\tencodeString(1, name),\n\t\tencodeString(2, version),\n\t\tencodeString(3, token),\n\t\tencodeString(4, \"en\"),\n\t\tencodeString(5, process.platform === \"win32\" ? \"windows\" : process.platform),\n\t\tencodeString(7, version),\n\t\tencodeVarintField(9, input.requestId),\n\t\tencodeString(10, input.sessionId),\n\t\tencodeString(12, \"chisel\"),\n\t\tencodeMessage(16, encodeTimestampBody()),\n\t\t...(input.userJwt ? [encodeString(21, input.userJwt)] : []),\n\t\tencodeString(25, input.triggerId),\n\t\tencodeString(28, \"chisel\"),\n\t\t...[3, 4, 6, 7, 8].map((value) => encodeVarintField(30, value)),\n\t]);\n}\n"]}
1
+ {"version":3,"file":"devin-metadata.js","sourceRoot":"","sources":["../../src/api/devin-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEtG,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,KAO7B,EAAU;IACV,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;IACtD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,KAAK,CAAC,MAAM,EAAE,CAAC;IACrH,OAAO,MAAM,CAAC,MAAM,CAAC;QACpB,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC;QACrB,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;QACxB,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC;QACtB,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC;QACrB,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC5E,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;QACxB,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;QACrC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC;QACjC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC;QAC1B,aAAa,CAAC,EAAE,EAAE,mBAAmB,EAAE,CAAC;QACxC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC;QACjC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC;QAC1B,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;KAC/D,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { DEVIN_BASE_URL } from \"./devin-constants.ts\";\nimport { encodeMessage, encodeString, encodeTimestampBody, encodeVarintField } from \"./devin-wire.ts\";\n\nexport { DEVIN_BASE_URL };\n\n/** Protocol client identity required by Devin Local; no installed CLI dependency. */\nexport function buildMetadata(input: {\n\tapiKey: string;\n\tuserJwt?: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tdiscovery?: boolean;\n}): Buffer {\n\tconst name = input.discovery ? \"chisel\" : \"devin-cli\";\n\tconst version = input.discovery ? \"0.0.0-dev\" : \"3000.6.2\";\n\tconst token = input.apiKey.startsWith(\"devin-session-token$\") ? input.apiKey : `devin-session-token$${input.apiKey}`;\n\treturn Buffer.concat([\n\t\tencodeString(1, name),\n\t\tencodeString(2, version),\n\t\tencodeString(3, token),\n\t\tencodeString(4, \"en\"),\n\t\tencodeString(5, process.platform === \"win32\" ? \"windows\" : process.platform),\n\t\tencodeString(7, version),\n\t\tencodeVarintField(9, input.requestId),\n\t\tencodeString(10, input.sessionId),\n\t\tencodeString(12, \"chisel\"),\n\t\tencodeMessage(16, encodeTimestampBody()),\n\t\t...(input.userJwt ? [encodeString(21, input.userJwt)] : []),\n\t\tencodeString(25, input.triggerId),\n\t\tencodeString(28, \"chisel\"),\n\t\t...[3, 4, 6, 7, 8].map((value) => encodeVarintField(30, value)),\n\t]);\n}\n"]}
@@ -26,7 +26,6 @@ export type CloudChatEvent = {
26
26
  kind: "usage";
27
27
  promptTokens?: number;
28
28
  completionTokens?: number;
29
- totalTokens?: number;
30
29
  cachedInputTokens?: number;
31
30
  cacheCreationInputTokens?: number;
32
31
  };
@@ -1 +1 @@
1
- {"version":3,"file":"devin-stream.d.ts","sourceRoot":"","sources":["../../src/api/devin-stream.ts"],"names":[],"mappings":"AA0BA,OAAO,EACN,KAAK,GAAG,EAER,KAAK,2BAA2B,EAChC,KAAK,OAAO,EAEZ,KAAK,KAAK,EACV,KAAK,mBAAmB,EACxB,MAAM,aAAa,CAAC;AAqBrB,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB,CAAA;CAAE,GAC/E;IACA,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AA0WL,wBAAgB,WAAW,CAC1B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,2BAA2B,CA8N7B","sourcesContent":["/*\nMIT License\n\nCopyright (c) 2026 Kashyab Ambarani\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\nimport { randomUUID } from \"node:crypto\";\nimport * as zlib from \"node:zlib\";\nimport {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\ttype SimpleStreamOptions,\n} from \"../index.ts\";\nimport { type ChatHistoryItem, type ContentPart, mapContextToChat, type ToolDef } from \"./devin-context-map.ts\";\nimport { mintUserJwt } from \"./devin-jwt.ts\";\nimport { buildMetadata } from \"./devin-metadata.ts\";\n\nimport { type ChatThinking, packThinkingSignature, unpackThinkingSignature } from \"./devin-thinking.ts\";\nimport {\n\tencodeFixed64Field,\n\tencodeMessage,\n\tencodeString,\n\tencodeVarintField,\n\tframeConnectStream,\n\titerFields,\n} from \"./devin-wire.ts\";\n\nconst SOURCE_BY_ROLE: Record<string, number> = {\n\tuser: 1,\n\tassistant: 2,\n\ttool: 4,\n};\n\nexport type CloudChatEvent =\n\t| { kind: \"text\"; text: string }\n\t| { kind: \"reasoning\"; text: string }\n\t| { kind: \"reasoning_signature\"; signature: string; signatureType?: string }\n\t| { kind: \"reasoning_redacted\" }\n\t| { kind: \"tool_call_start\"; id: string; name: string }\n\t| { kind: \"tool_call_args\"; argsDelta: string; id?: string }\n\t| { kind: \"finish\"; reason: \"stop\" | \"tool_calls\" | \"length\" | \"content_filter\" }\n\t| {\n\t\t\tkind: \"usage\";\n\t\t\tpromptTokens?: number;\n\t\t\tcompletionTokens?: number;\n\t\t\ttotalTokens?: number;\n\t\t\tcachedInputTokens?: number;\n\t\t\tcacheCreationInputTokens?: number;\n\t };\n\nfunction normalizeContent(content: string | ContentPart[]): ContentPart[] {\n\tif (typeof content === \"string\") return [{ type: \"text\", text: content }];\n\treturn content;\n}\n\nfunction encodeImageData(img: { mimeType?: string; base64Data?: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, img.base64Data ?? \"\"), encodeString(2, img.mimeType ?? \"image/png\")]);\n}\n\nfunction encodeChatToolCall(tc: { id: string; name: string; arguments: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, tc.id), encodeString(2, tc.name), encodeString(3, tc.arguments)]);\n}\n\nfunction encodeChatMessagePrompt(\n\tcontent: ContentPart[],\n\tsource: number,\n\topts?: {\n\t\ttoolCallId?: string;\n\t\ttoolCalls?: Array<{ id: string; name: string; arguments: string }>;\n\t\tthinking?: ChatThinking;\n\t},\n): Buffer {\n\tconst text = content\n\t\t.filter((part) => part.type === \"text\")\n\t\t.map((part) => part.text ?? \"\")\n\t\t.join(\"\\n\");\n\tconst parts: Buffer[] = [encodeVarintField(2, source), encodeString(3, text), encodeVarintField(5, 1)];\n\tif (opts?.toolCallId) parts.push(encodeString(7, opts.toolCallId));\n\tfor (const tc of opts?.toolCalls ?? []) parts.push(encodeMessage(6, encodeChatToolCall(tc)));\n\tfor (const img of content.filter((part) => part.type === \"image\")) {\n\t\tparts.push(encodeMessage(10, encodeImageData(img)));\n\t}\n\t// 11 thinking / 12 signature / 13 thinking_redacted / 18 signature_type — the\n\t// same quartet the Devin CLI replays so the model keeps its own reasoning.\n\tif (opts?.thinking) {\n\t\tparts.push(encodeString(11, opts.thinking.text));\n\t\tparts.push(encodeString(12, opts.thinking.signature));\n\t\tif (opts.thinking.redacted) parts.push(encodeVarintField(13, 1));\n\t\tif (opts.thinking.signatureType) parts.push(encodeString(18, opts.thinking.signatureType));\n\t}\n\treturn Buffer.concat(parts);\n}\n\n/** Mirrors the Devin CLI: num_completions / max_tokens / max_newlines plus\n * temperature / top_k / top_p, and nothing else. */\nfunction encodeCompletionConfiguration(maxOutputTokens?: number, temperature?: number): Buffer {\n\treturn Buffer.concat([\n\t\tencodeVarintField(1, 1),\n\t\tencodeVarintField(2, maxOutputTokens ?? 128_000),\n\t\tencodeVarintField(3, 400),\n\t\tencodeFixed64Field(5, temperature ?? 1.0),\n\t\tencodeVarintField(7, 40),\n\t\tencodeFixed64Field(8, 0.95),\n\t]);\n}\n\n/** CortexTrajectoryReference: cascade trajectory, user-input step. */\nfunction encodeTrajectoryReference(trajectoryId: string): Buffer {\n\treturn Buffer.concat([encodeString(1, trajectoryId), encodeVarintField(3, 4), encodeVarintField(4, 14)]);\n}\n\nfunction encodeToolDef(tool: ToolDef): Buffer {\n\tconst description = tool.description;\n\treturn Buffer.concat([\n\t\tencodeString(1, tool.name),\n\t\tencodeString(2, description),\n\t\tencodeString(3, JSON.stringify(tool.parameters ?? {})),\n\t]);\n}\n\nfunction buildGetChatMessageRequest(args: {\n\tapiKey: string;\n\tuserJwt: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tcascadeId: string;\n\ttrajectoryId: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tmaxOutputTokens?: number;\n\ttemperature?: number;\n}): Buffer {\n\tconst metadata = buildMetadata({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt: args.userJwt,\n\t\tsessionId: args.sessionId,\n\t\trequestId: args.requestId,\n\t\ttriggerId: args.triggerId,\n\t});\n\tconst prompts = args.messages.map((message) =>\n\t\tencodeMessage(\n\t\t\t3,\n\t\t\tencodeChatMessagePrompt(normalizeContent(message.content), SOURCE_BY_ROLE[message.role], {\n\t\t\t\ttoolCallId: message.role === \"tool\" ? message.tool_call_id : undefined,\n\t\t\t\ttoolCalls: message.role === \"assistant\" ? message.tool_calls : undefined,\n\t\t\t\tthinking: message.role === \"assistant\" ? message.thinking : undefined,\n\t\t\t}),\n\t\t),\n\t);\n\treturn Buffer.concat([\n\t\tencodeMessage(1, metadata),\n\t\t// 2 prompt — the server's system slot, same place the Devin CLI puts its own\n\t\t// system prompt. Collapsing it into the first user turn is not equivalent.\n\t\t...(args.systemPrompt ? [encodeString(2, args.systemPrompt)] : []),\n\t\t...prompts,\n\t\tencodeVarintField(7, 5),\n\t\tencodeMessage(8, encodeCompletionConfiguration(args.maxOutputTokens, args.temperature)),\n\t\t...(args.tools ?? []).map((tool) => encodeMessage(10, encodeToolDef(tool))),\n\t\tencodeMessage(15, encodeTrajectoryReference(args.trajectoryId)),\n\t\tencodeString(16, args.cascadeId),\n\t\tencodeVarintField(20, 1),\n\t\tencodeString(21, args.modelUid),\n\t]);\n}\n\nfunction* decodeChatFrame(proto: Buffer): Generator<CloudChatEvent> {\n\tlet signature: string | undefined;\n\tlet signatureType: string | undefined;\n\tfor (const field of iterFields(proto)) {\n\t\tif (field.num === 3 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"text\", text };\n\t\t} else if (field.num === 9 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"reasoning\", text };\n\t\t} else if (field.num === 11 && field.wire === 0) {\n\t\t\t// GetChatMessageResponse.thinking_redacted\n\t\t\tif (Number(field.value) !== 0) yield { kind: \"reasoning_redacted\" };\n\t\t} else if (field.num === 10 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signature = text;\n\t\t} else if (field.num === 21 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signatureType = text;\n\t\t} else if (field.num === 6 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tlet id: string | undefined;\n\t\t\tlet name: string | undefined;\n\t\t\tlet argsDelta: string | undefined;\n\t\t\tfor (const inner of iterFields(field.value)) {\n\t\t\t\tif (inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\t\tconst text = inner.value.toString(\"utf8\");\n\t\t\t\t\tif (inner.num === 1) id = text;\n\t\t\t\t\telse if (inner.num === 2) name = text;\n\t\t\t\t\telse if (inner.num === 3) argsDelta = text;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (id !== undefined && name !== undefined) yield { kind: \"tool_call_start\", id, name };\n\t\t\tif (argsDelta !== undefined) yield { kind: \"tool_call_args\", argsDelta, ...(id ? { id } : {}) };\n\t\t} else if (field.num === 5 && field.wire === 0) {\n\t\t\tconst value = Number(field.value);\n\t\t\tlet reason: Extract<CloudChatEvent, { kind: \"finish\" }>[\"reason\"] = \"stop\";\n\t\t\tif (value === 10) reason = \"tool_calls\";\n\t\t\telse if (value === 11) reason = \"content_filter\";\n\t\t\telse if ([1, 3, 5, 9].includes(value)) reason = \"length\";\n\t\t\telse if (![0, 2, 4, 6, 8, 12].includes(value)) throw new Error(`Devin returned failure stop reason ${value}`);\n\t\t\tyield { kind: \"finish\", reason };\n\t\t} else if (field.num === 28 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst usage = decodeUsage(field.value);\n\t\t\tif (usage) yield usage;\n\t\t}\n\t}\n\t// The signature trails the thinking text, so it is yielded once the frame is\n\t// fully read and gets attached to the block that is already closed.\n\tif (signature !== undefined || signatureType !== undefined)\n\t\tyield { kind: \"reasoning_signature\", signature: signature ?? \"\", signatureType };\n}\n\nfunction decodeUsage(buf: Buffer): CloudChatEvent | null {\n\tlet promptTokens: number | undefined;\n\tlet completionTokens: number | undefined;\n\tlet cachedInputTokens: number | undefined;\n\tlet cacheCreationInputTokens: number | undefined;\n\tfor (const field of iterFields(buf)) {\n\t\tif (field.num !== 2 || field.wire !== 2 || !Buffer.isBuffer(field.value)) continue;\n\t\tlet metric: string | undefined;\n\t\tlet value: number | undefined;\n\t\tfor (const inner of iterFields(field.value)) {\n\t\t\tif (inner.num === 5 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tmetric = inner.value.toString(\"utf8\");\n\t\t\t} else if (inner.num === 4 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tfor (const dim of iterFields(inner.value)) {\n\t\t\t\t\tif (dim.num === 2 && dim.wire === 5 && Buffer.isBuffer(dim.value)) {\n\t\t\t\t\t\tvalue = dim.value.readFloatLE(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!metric || value === undefined || !Number.isFinite(value)) continue;\n\t\tconst n = Math.round(value);\n\t\tif (metric === \"input_tokens\") promptTokens = n;\n\t\telse if (metric === \"output_tokens\") completionTokens = n;\n\t\telse if (metric === \"cache_read_input_tokens\") cachedInputTokens = n;\n\t\telse if (metric === \"cache_creation_input_tokens\") cacheCreationInputTokens = n;\n\t}\n\tif (promptTokens === undefined && completionTokens === undefined) return null;\n\treturn {\n\t\tkind: \"usage\",\n\t\tpromptTokens,\n\t\tcompletionTokens,\n\t\ttotalTokens:\n\t\t\t(promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cacheCreationInputTokens ?? 0),\n\t\tcachedInputTokens,\n\t\tcacheCreationInputTokens,\n\t};\n}\n\nasync function* streamChatEvents(args: {\n\tapiKey: string;\n\thost: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tmaxOutputTokens?: number;\n\tsignal?: AbortSignal;\n\tsessionId?: string;\n\tfetchImpl: typeof fetch;\n\ttemperature?: number;\n}): AsyncGenerator<CloudChatEvent> {\n\tconst host = args.host.replace(/\\/$/, \"\");\n\tconst userJwt = await mintUserJwt(args.apiKey, host, args.signal, args.fetchImpl);\n\tconst sessionId = args.sessionId ?? randomUUID();\n\tconst ids = { sessionId, cascadeId: sessionId, trajectoryId: sessionId };\n\tconst proto = buildGetChatMessageRequest({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt,\n\t\tmodelUid: args.modelUid,\n\t\tsystemPrompt: args.systemPrompt,\n\t\tmessages: args.messages,\n\t\ttools: args.tools,\n\t\tcascadeId: ids.cascadeId,\n\t\ttrajectoryId: ids.trajectoryId,\n\t\tsessionId: ids.sessionId,\n\t\trequestId: BigInt(Date.now()),\n\t\ttriggerId: randomUUID(),\n\t\tmaxOutputTokens: args.maxOutputTokens,\n\t\ttemperature: args.temperature,\n\t});\n\n\tconst resp = await args.fetchImpl(`${host}/exa.api_server_pb.ApiServerService/GetChatMessage`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/connect+proto\",\n\t\t\t\"Connect-Protocol-Version\": \"1\",\n\t\t\t\"Connect-Content-Encoding\": \"gzip\",\n\t\t\t\"Connect-Accept-Encoding\": \"gzip\",\n\t\t},\n\t\tbody: new Uint8Array(frameConnectStream(proto, true)),\n\t\tsignal: args.signal,\n\t});\n\tif (!resp.ok) {\n\t\tthrow new Error(`Devin GetChatMessage failed (HTTP ${resp.status})`);\n\t}\n\tif (!resp.body) throw new Error(\"GetChatMessage returned an empty body\");\n\n\tconst reader = resp.body.getReader();\n\t// reader.closed rejects with the stream's storedError when the socket dies\n\t// mid-response; nothing awaits it -> unhandledRejection crashes the process.\n\tvoid reader.closed.catch(() => {});\n\tconst queue: Buffer[] = [];\n\tlet queued = 0;\n\tlet sawEos = false;\n\tlet trailerError: string | null = null;\n\n\tconst peek = (n: number): Buffer | null => {\n\t\tif (queued < n) return null;\n\t\tif (queue.length === 1 && queue[0].length >= n) return queue[0].subarray(0, n);\n\t\tconst parts: Buffer[] = [];\n\t\tlet remaining = n;\n\t\tfor (const chunk of queue) {\n\t\t\tif (remaining <= 0) break;\n\t\t\tif (chunk.length <= remaining) {\n\t\t\t\tparts.push(chunk);\n\t\t\t\tremaining -= chunk.length;\n\t\t\t} else {\n\t\t\t\tparts.push(chunk.subarray(0, remaining));\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t\treturn Buffer.concat(parts, n);\n\t};\n\n\tconst drop = (n: number): void => {\n\t\tqueued -= n;\n\t\tlet remaining = n;\n\t\twhile (remaining > 0 && queue.length > 0) {\n\t\t\tconst head = queue[0];\n\t\t\tif (head.length <= remaining) {\n\t\t\t\tqueue.shift();\n\t\t\t\tremaining -= head.length;\n\t\t\t} else {\n\t\t\t\tqueue[0] = head.subarray(remaining);\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t};\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { value, done } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tif (value) {\n\t\t\t\tqueue.push(Buffer.from(value));\n\t\t\t\tqueued += value.length;\n\t\t\t}\n\t\t\twhile (queued >= 5) {\n\t\t\t\tconst header = peek(5);\n\t\t\t\tif (!header) break;\n\t\t\t\tconst flags = header[0];\n\t\t\t\tconst len = header.readUInt32BE(1);\n\t\t\t\tif (flags & ~3) throw new Error(\"Invalid Devin Connect frame flags\");\n\t\t\t\tif (len > 16 * 1024 * 1024) throw new Error(\"Devin Connect frame exceeds 16 MiB\");\n\t\t\t\tif (queued < 5 + len) break;\n\t\t\t\tdrop(5);\n\t\t\t\tconst raw = peek(len) ?? Buffer.alloc(0);\n\t\t\t\tdrop(len);\n\t\t\t\tlet payload = raw;\n\t\t\t\tif (flags & 0x01) payload = zlib.gunzipSync(raw, { maxOutputLength: 16 * 1024 * 1024 });\n\t\t\t\tif (sawEos) throw new Error(\"Devin returned data after its EOS trailer\");\n\t\t\t\tif (flags & 0x02) {\n\t\t\t\t\tsawEos = true;\n\t\t\t\t\tconst parsed = JSON.parse(payload.toString(\"utf8\")) as { error?: { code?: string; message?: string } };\n\t\t\t\t\tif (parsed.error) {\n\t\t\t\t\t\tconst detail =\n\t\t\t\t\t\t\ttypeof parsed.error.message === \"string\"\n\t\t\t\t\t\t\t\t? parsed.error.message\n\t\t\t\t\t\t\t\t\t\t.replaceAll(args.apiKey, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.replaceAll(userJwt, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.slice(0, 500)\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\ttrailerError = `Devin stream failed (${parsed.error.code ?? \"unknown\"})${detail ? `: ${detail}` : \"\"}`;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tyield* decodeChatFrame(payload);\n\t\t\t}\n\t\t}\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t\ttry {\n\t\t\t// await: on an errored stream cancel() returns a rejected promise;\n\t\t\t// `void`-ing it escapes the try/catch as an unhandled rejection.\n\t\t\tawait resp.body?.cancel();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tif (trailerError) throw new Error(trailerError);\n\tif (queued) throw new Error(\"Truncated Devin Connect frame\");\n\tif (!sawEos) throw new Error(\"Devin stream ended without an EOS trailer\");\n}\n\nexport function streamDevin(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n\tconst stream = createAssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: model.api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tlet textOpen = false;\n\t\tlet thinkingOpen = false;\n\t\tlet thinkingIndex = -1;\n\t\tlet toolId = \"\";\n\t\tconst toolStates = new Map<string, { index: number; json: string }>();\n\n\t\tconst closeText = () => {\n\t\t\tif (!textOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"text\") {\n\t\t\t\tstream.push({ type: \"text_end\", contentIndex: idx, content: block.text, partial: output });\n\t\t\t}\n\t\t\ttextOpen = false;\n\t\t};\n\t\tconst closeThinking = () => {\n\t\t\tif (!thinkingOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"thinking\") {\n\t\t\t\tstream.push({ type: \"thinking_end\", contentIndex: idx, content: block.thinking, partial: output });\n\t\t\t}\n\t\t\tthinkingOpen = false;\n\t\t};\n\t\tconst closeTool = () => {\n\t\t\tfor (const state of toolStates.values()) {\n\t\t\t\tconst block = output.content[state.index];\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst parsed: unknown = JSON.parse(state.json);\n\t\t\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\t\t\t\t\tthrow new Error(\"Invalid Devin tool arguments\");\n\t\t\t\t\tblock.arguments = parsed as Record<string, unknown>;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\ttoolCall: block,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoolStates.clear();\n\t\t};\n\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\")\n\t\t\t\tthrow new Error(\"Devin inference must use pi-server in PI_SERVER_MODE\");\n\t\t\tif (!apiKey) throw new Error(\"No Devin credentials. Run /login devin.\");\n\t\t\tconst host = model.baseUrl.replace(/\\/$/, \"\");\n\t\t\tif (options?.reasoning && model.thinkingLevelMap && model.thinkingLevelMap[options.reasoning] !== model.id)\n\t\t\t\tthrow new Error(\"Select the Devin model variant for the requested reasoning effort\");\n\t\t\tif (options?.onPayload) throw new Error(\"Devin does not support onPayload overrides\");\n\t\t\tconst modelUid = model.id;\n\t\t\tconst mapped = mapContextToChat(context, model.id);\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tfor await (const event of streamChatEvents({\n\t\t\t\tapiKey,\n\t\t\t\thost,\n\t\t\t\tmodelUid,\n\t\t\t\tsystemPrompt: mapped.systemPrompt,\n\t\t\t\tmessages: mapped.messages,\n\t\t\t\ttools: mapped.tools.length > 0 ? mapped.tools : undefined,\n\t\t\t\tmaxOutputTokens: options?.maxTokens ?? model.maxTokens,\n\t\t\t\tsignal: options?.signal\n\t\t\t\t\t? AbortSignal.any([options.signal, AbortSignal.timeout(options.timeoutMs ?? 600_000)])\n\t\t\t\t\t: AbortSignal.timeout(options?.timeoutMs ?? 600_000),\n\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\tfetchImpl: options?.fetch ?? fetch,\n\t\t\t\ttemperature: options?.temperature,\n\t\t\t})) {\n\t\t\t\tif (event.kind === \"text\") {\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\tif (!textOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"text\", text: \"\" });\n\t\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\ttextOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\tblock.text += event.text;\n\t\t\t\t\t\tstream.push({ type: \"text_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tif (!thinkingOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinking += event.text;\n\t\t\t\t\t\tstream.push({ type: \"thinking_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_signature\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = output.content[thinkingIndex];\n\t\t\t\t\tif (block?.type === \"thinking\") {\n\t\t\t\t\t\tconst previous = unpackThinkingSignature(block.thinkingSignature);\n\t\t\t\t\t\tblock.thinkingSignature = packThinkingSignature(\n\t\t\t\t\t\t\t(previous.signature ?? \"\") + event.signature,\n\t\t\t\t\t\t\tevent.signatureType ?? previous.signatureType,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_redacted\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = thinkingIndex >= 0 ? output.content[thinkingIndex] : undefined;\n\t\t\t\t\tif (block?.type === \"thinking\") block.redacted = true;\n\t\t\t\t} else if (event.kind === \"tool_call_start\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\ttoolId = event.id;\n\t\t\t\t\tconst existing = toolStates.get(toolId);\n\t\t\t\t\tif (existing) {\n\t\t\t\t\t\tconst block = output.content[existing.index];\n\t\t\t\t\t\tif (block.type !== \"toolCall\" || block.name !== event.name)\n\t\t\t\t\t\t\tthrow new Error(\"Devin changed a tool call's name\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (!toolId || !event.name) throw new Error(\"Devin returned an empty tool identity\");\n\t\t\t\t\toutput.content.push({ type: \"toolCall\", id: event.id, name: event.name, arguments: {} });\n\t\t\t\t\tconst toolIndex = output.content.length - 1;\n\t\t\t\t\ttoolStates.set(toolId, { index: toolIndex, json: \"\" });\n\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: toolIndex, partial: output });\n\t\t\t\t} else if (event.kind === \"tool_call_args\") {\n\t\t\t\t\tconst state = toolStates.get(event.id ?? toolId);\n\t\t\t\t\tif (!state) throw new Error(\"Devin tool argument delta has no matching call\");\n\t\t\t\t\tstate.json += event.argsDelta;\n\t\t\t\t\tconst block = output.content[state.index];\n\t\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tblock.arguments = JSON.parse(state.json);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// incomplete json\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\tdelta: event.argsDelta,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t} else if (event.kind === \"finish\") {\n\t\t\t\t\tif (event.reason === \"content_filter\")\n\t\t\t\t\t\tthrow new Error(\"Devin response was blocked by content filtering\");\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\toutput.stopReason =\n\t\t\t\t\t\tevent.reason === \"tool_calls\" ? \"toolUse\" : event.reason === \"length\" ? \"length\" : \"stop\";\n\t\t\t\t} else if (event.kind === \"usage\") {\n\t\t\t\t\toutput.usage.input = event.promptTokens ?? 0;\n\t\t\t\t\toutput.usage.output = event.completionTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheRead = event.cachedInputTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheWrite = event.cacheCreationInputTokens ?? 0;\n\t\t\t\t\toutput.usage.totalTokens =\n\t\t\t\t\t\tevent.totalTokens ??\n\t\t\t\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcloseText();\n\t\t\tcloseThinking();\n\t\t\tcloseTool();\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tif (!output.content.length) throw new Error(\"Devin returned an empty completion\");\n\t\t\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const) {\n\t\t\t\toutput.usage.cost[key] = (output.usage[key] * model.cost[key]) / 1_000_000;\n\t\t\t}\n\t\t\toutput.usage.cost.total =\n\t\t\t\toutput.usage.cost.input +\n\t\t\t\toutput.usage.cost.output +\n\t\t\t\toutput.usage.cost.cacheRead +\n\t\t\t\toutput.usage.cost.cacheWrite;\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason as \"stop\" | \"length\" | \"toolUse\", message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason as \"aborted\" | \"error\", error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n}\n"]}
1
+ {"version":3,"file":"devin-stream.d.ts","sourceRoot":"","sources":["../../src/api/devin-stream.ts"],"names":[],"mappings":"AA0BA,OAAO,EACN,KAAK,GAAG,EAER,KAAK,2BAA2B,EAChC,KAAK,OAAO,EAEZ,KAAK,KAAK,EACV,KAAK,mBAAmB,EACxB,MAAM,aAAa,CAAC;AAqBrB,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB,CAAA;CAAE,GAC/E;IACA,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAgXL,wBAAgB,WAAW,CAC1B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,2BAA2B,CA+N7B","sourcesContent":["/*\nMIT License\n\nCopyright (c) 2026 Kashyab Ambarani\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\nimport { randomUUID } from \"node:crypto\";\nimport * as zlib from \"node:zlib\";\nimport {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\ttype SimpleStreamOptions,\n} from \"../index.ts\";\nimport { type ChatHistoryItem, type ContentPart, mapContextToChat, type ToolDef } from \"./devin-context-map.ts\";\nimport { mintUserJwt } from \"./devin-jwt.ts\";\nimport { buildMetadata } from \"./devin-metadata.ts\";\n\nimport { type ChatThinking, packThinkingSignature, unpackThinkingSignature } from \"./devin-thinking.ts\";\nimport {\n\tencodeFixed64Field,\n\tencodeMessage,\n\tencodeString,\n\tencodeVarintField,\n\tframeConnectStream,\n\titerFields,\n} from \"./devin-wire.ts\";\n\nconst SOURCE_BY_ROLE: Record<string, number> = {\n\tuser: 1,\n\tassistant: 2,\n\ttool: 4,\n};\n\nexport type CloudChatEvent =\n\t| { kind: \"text\"; text: string }\n\t| { kind: \"reasoning\"; text: string }\n\t| { kind: \"reasoning_signature\"; signature: string; signatureType?: string }\n\t| { kind: \"reasoning_redacted\" }\n\t| { kind: \"tool_call_start\"; id: string; name: string }\n\t| { kind: \"tool_call_args\"; argsDelta: string; id?: string }\n\t| { kind: \"finish\"; reason: \"stop\" | \"tool_calls\" | \"length\" | \"content_filter\" }\n\t| {\n\t\t\tkind: \"usage\";\n\t\t\tpromptTokens?: number;\n\t\t\tcompletionTokens?: number;\n\t\t\tcachedInputTokens?: number;\n\t\t\tcacheCreationInputTokens?: number;\n\t };\n\nfunction normalizeContent(content: string | ContentPart[]): ContentPart[] {\n\tif (typeof content === \"string\") return [{ type: \"text\", text: content }];\n\treturn content;\n}\n\nfunction encodeImageData(img: { mimeType?: string; base64Data?: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, img.base64Data ?? \"\"), encodeString(2, img.mimeType ?? \"image/png\")]);\n}\n\nfunction encodeChatToolCall(tc: { id: string; name: string; arguments: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, tc.id), encodeString(2, tc.name), encodeString(3, tc.arguments)]);\n}\n\nfunction encodeChatMessagePrompt(\n\tcontent: ContentPart[],\n\tsource: number,\n\topts?: {\n\t\ttoolCallId?: string;\n\t\ttoolCalls?: Array<{ id: string; name: string; arguments: string }>;\n\t\tthinking?: ChatThinking;\n\t},\n): Buffer {\n\tconst text = content\n\t\t.filter((part) => part.type === \"text\")\n\t\t.map((part) => part.text ?? \"\")\n\t\t.join(\"\\n\");\n\tconst parts: Buffer[] = [encodeVarintField(2, source), encodeString(3, text), encodeVarintField(5, 1)];\n\tif (opts?.toolCallId) parts.push(encodeString(7, opts.toolCallId));\n\tfor (const tc of opts?.toolCalls ?? []) parts.push(encodeMessage(6, encodeChatToolCall(tc)));\n\tfor (const img of content.filter((part) => part.type === \"image\")) {\n\t\tparts.push(encodeMessage(10, encodeImageData(img)));\n\t}\n\t// 11 thinking / 12 signature / 13 thinking_redacted / 18 signature_type — the\n\t// same quartet the Devin CLI replays so the model keeps its own reasoning.\n\tif (opts?.thinking) {\n\t\tparts.push(encodeString(11, opts.thinking.text));\n\t\tparts.push(encodeString(12, opts.thinking.signature));\n\t\tif (opts.thinking.redacted) parts.push(encodeVarintField(13, 1));\n\t\tif (opts.thinking.signatureType) parts.push(encodeString(18, opts.thinking.signatureType));\n\t}\n\treturn Buffer.concat(parts);\n}\n\n/** Mirrors the Devin CLI: num_completions / max_tokens / max_newlines plus\n * temperature / top_k / top_p, and nothing else. */\nfunction encodeCompletionConfiguration(maxOutputTokens?: number, temperature?: number): Buffer {\n\treturn Buffer.concat([\n\t\tencodeVarintField(1, 1),\n\t\tencodeVarintField(2, maxOutputTokens ?? 128_000),\n\t\tencodeVarintField(3, 400),\n\t\tencodeFixed64Field(5, temperature ?? 1.0),\n\t\tencodeVarintField(7, 40),\n\t\tencodeFixed64Field(8, 0.95),\n\t]);\n}\n\n/** CortexTrajectoryReference: cascade trajectory, user-input step. */\nfunction encodeTrajectoryReference(trajectoryId: string): Buffer {\n\treturn Buffer.concat([encodeString(1, trajectoryId), encodeVarintField(3, 4), encodeVarintField(4, 14)]);\n}\n\nfunction encodeToolDef(tool: ToolDef): Buffer {\n\tconst description = tool.description;\n\treturn Buffer.concat([\n\t\tencodeString(1, tool.name),\n\t\tencodeString(2, description),\n\t\tencodeString(3, JSON.stringify(tool.parameters ?? {})),\n\t]);\n}\n\nfunction buildGetChatMessageRequest(args: {\n\tapiKey: string;\n\tuserJwt: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tcascadeId: string;\n\ttrajectoryId: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tmaxOutputTokens?: number;\n\ttemperature?: number;\n}): Buffer {\n\tconst metadata = buildMetadata({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt: args.userJwt,\n\t\tsessionId: args.sessionId,\n\t\trequestId: args.requestId,\n\t\ttriggerId: args.triggerId,\n\t});\n\tconst prompts = args.messages.map((message) =>\n\t\tencodeMessage(\n\t\t\t3,\n\t\t\tencodeChatMessagePrompt(normalizeContent(message.content), SOURCE_BY_ROLE[message.role], {\n\t\t\t\ttoolCallId: message.role === \"tool\" ? message.tool_call_id : undefined,\n\t\t\t\ttoolCalls: message.role === \"assistant\" ? message.tool_calls : undefined,\n\t\t\t\tthinking: message.role === \"assistant\" ? message.thinking : undefined,\n\t\t\t}),\n\t\t),\n\t);\n\treturn Buffer.concat([\n\t\tencodeMessage(1, metadata),\n\t\t// 2 prompt — the server's system slot, same place the Devin CLI puts its own\n\t\t// system prompt. Collapsing it into the first user turn is not equivalent.\n\t\t...(args.systemPrompt ? [encodeString(2, args.systemPrompt)] : []),\n\t\t...prompts,\n\t\tencodeVarintField(7, 5),\n\t\tencodeMessage(8, encodeCompletionConfiguration(args.maxOutputTokens, args.temperature)),\n\t\t...(args.tools ?? []).map((tool) => encodeMessage(10, encodeToolDef(tool))),\n\t\tencodeMessage(15, encodeTrajectoryReference(args.trajectoryId)),\n\t\tencodeString(16, args.cascadeId),\n\t\tencodeVarintField(20, 1),\n\t\tencodeString(21, args.modelUid),\n\t]);\n}\n\nfunction* decodeChatFrame(proto: Buffer): Generator<CloudChatEvent> {\n\tlet signature: string | undefined;\n\tlet signatureType: string | undefined;\n\tfor (const field of iterFields(proto)) {\n\t\tif (field.num === 3 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"text\", text };\n\t\t} else if (field.num === 9 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"reasoning\", text };\n\t\t} else if (field.num === 11 && field.wire === 0) {\n\t\t\t// GetChatMessageResponse.thinking_redacted\n\t\t\tif (Number(field.value) !== 0) yield { kind: \"reasoning_redacted\" };\n\t\t} else if (field.num === 10 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signature = text;\n\t\t} else if (field.num === 21 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signatureType = text;\n\t\t} else if (field.num === 6 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tlet id: string | undefined;\n\t\t\tlet name: string | undefined;\n\t\t\tlet argsDelta: string | undefined;\n\t\t\tfor (const inner of iterFields(field.value)) {\n\t\t\t\tif (inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\t\tconst text = inner.value.toString(\"utf8\");\n\t\t\t\t\tif (inner.num === 1) id = text;\n\t\t\t\t\telse if (inner.num === 2) name = text;\n\t\t\t\t\telse if (inner.num === 3) argsDelta = text;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (id !== undefined && name !== undefined) yield { kind: \"tool_call_start\", id, name };\n\t\t\tif (argsDelta !== undefined) yield { kind: \"tool_call_args\", argsDelta, ...(id ? { id } : {}) };\n\t\t} else if (field.num === 5 && field.wire === 0) {\n\t\t\tconst value = Number(field.value);\n\t\t\tlet reason: Extract<CloudChatEvent, { kind: \"finish\" }>[\"reason\"] = \"stop\";\n\t\t\tif (value === 10) reason = \"tool_calls\";\n\t\t\telse if (value === 11) reason = \"content_filter\";\n\t\t\telse if ([1, 3, 5, 9].includes(value)) reason = \"length\";\n\t\t\telse if (![0, 2, 4, 6, 8, 12].includes(value)) throw new Error(`Devin returned failure stop reason ${value}`);\n\t\t\tyield { kind: \"finish\", reason };\n\t\t} else if (field.num === 28 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst usage = decodeUsage(field.value);\n\t\t\tif (usage) yield usage;\n\t\t}\n\t}\n\t// The signature trails the thinking text, so it is yielded once the frame is\n\t// fully read and gets attached to the block that is already closed.\n\tif (signature !== undefined || signatureType !== undefined)\n\t\tyield { kind: \"reasoning_signature\", signature: signature ?? \"\", signatureType };\n}\n\nfunction decodeUsage(buf: Buffer): CloudChatEvent | null {\n\tlet promptTokens: number | undefined;\n\tlet completionTokens: number | undefined;\n\tlet cachedInputTokens: number | undefined;\n\tlet cacheCreationInputTokens: number | undefined;\n\tfor (const field of iterFields(buf)) {\n\t\tif (field.num !== 2 || field.wire !== 2 || !Buffer.isBuffer(field.value)) continue;\n\t\tlet metric: string | undefined;\n\t\tlet value: number | undefined;\n\t\tfor (const inner of iterFields(field.value)) {\n\t\t\tif (inner.num === 5 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tmetric = inner.value.toString(\"utf8\");\n\t\t\t} else if (inner.num === 4 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\t// Protobuf omits the scalar field when a present numeric metric is zero.\n\t\t\t\tvalue = 0;\n\t\t\t\tfor (const dim of iterFields(inner.value)) {\n\t\t\t\t\tif (dim.num === 2 && dim.wire === 5 && Buffer.isBuffer(dim.value)) {\n\t\t\t\t\t\tvalue = dim.value.readFloatLE(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!metric || value === undefined || !Number.isFinite(value)) continue;\n\t\tconst n = Math.round(value);\n\t\tif (metric === \"input_tokens\") promptTokens = n;\n\t\telse if (metric === \"output_tokens\") completionTokens = n;\n\t\telse if (metric === \"cached_input_tokens\" || metric === \"cache_read_input_tokens\") cachedInputTokens = n;\n\t\telse if (metric === \"cache_creation_input_tokens\") cacheCreationInputTokens = n;\n\t}\n\tif (\n\t\tpromptTokens === undefined &&\n\t\tcompletionTokens === undefined &&\n\t\tcachedInputTokens === undefined &&\n\t\tcacheCreationInputTokens === undefined\n\t)\n\t\treturn null;\n\treturn {\n\t\tkind: \"usage\",\n\t\tpromptTokens,\n\t\tcompletionTokens,\n\t\tcachedInputTokens,\n\t\tcacheCreationInputTokens,\n\t};\n}\n\nasync function* streamChatEvents(args: {\n\tapiKey: string;\n\thost: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tmaxOutputTokens?: number;\n\tsignal?: AbortSignal;\n\tsessionId?: string;\n\tfetchImpl: typeof fetch;\n\ttemperature?: number;\n}): AsyncGenerator<CloudChatEvent> {\n\tconst host = args.host.replace(/\\/$/, \"\");\n\tconst userJwt = await mintUserJwt(args.apiKey, host, args.signal, args.fetchImpl);\n\tconst sessionId = args.sessionId ?? randomUUID();\n\tconst ids = { sessionId, cascadeId: sessionId, trajectoryId: sessionId };\n\tconst proto = buildGetChatMessageRequest({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt,\n\t\tmodelUid: args.modelUid,\n\t\tsystemPrompt: args.systemPrompt,\n\t\tmessages: args.messages,\n\t\ttools: args.tools,\n\t\tcascadeId: ids.cascadeId,\n\t\ttrajectoryId: ids.trajectoryId,\n\t\tsessionId: ids.sessionId,\n\t\trequestId: BigInt(Date.now()),\n\t\ttriggerId: randomUUID(),\n\t\tmaxOutputTokens: args.maxOutputTokens,\n\t\ttemperature: args.temperature,\n\t});\n\n\tconst resp = await args.fetchImpl(`${host}/exa.api_server_pb.ApiServerService/GetChatMessage`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/connect+proto\",\n\t\t\t\"Connect-Protocol-Version\": \"1\",\n\t\t\t\"Connect-Content-Encoding\": \"gzip\",\n\t\t\t\"Connect-Accept-Encoding\": \"gzip\",\n\t\t},\n\t\tbody: new Uint8Array(frameConnectStream(proto, true)),\n\t\tsignal: args.signal,\n\t});\n\tif (!resp.ok) {\n\t\tthrow new Error(`Devin GetChatMessage failed (HTTP ${resp.status})`);\n\t}\n\tif (!resp.body) throw new Error(\"GetChatMessage returned an empty body\");\n\n\tconst reader = resp.body.getReader();\n\t// reader.closed rejects with the stream's storedError when the socket dies\n\t// mid-response; nothing awaits it -> unhandledRejection crashes the process.\n\tvoid reader.closed.catch(() => {});\n\tconst queue: Buffer[] = [];\n\tlet queued = 0;\n\tlet sawEos = false;\n\tlet trailerError: string | null = null;\n\n\tconst peek = (n: number): Buffer | null => {\n\t\tif (queued < n) return null;\n\t\tif (queue.length === 1 && queue[0].length >= n) return queue[0].subarray(0, n);\n\t\tconst parts: Buffer[] = [];\n\t\tlet remaining = n;\n\t\tfor (const chunk of queue) {\n\t\t\tif (remaining <= 0) break;\n\t\t\tif (chunk.length <= remaining) {\n\t\t\t\tparts.push(chunk);\n\t\t\t\tremaining -= chunk.length;\n\t\t\t} else {\n\t\t\t\tparts.push(chunk.subarray(0, remaining));\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t\treturn Buffer.concat(parts, n);\n\t};\n\n\tconst drop = (n: number): void => {\n\t\tqueued -= n;\n\t\tlet remaining = n;\n\t\twhile (remaining > 0 && queue.length > 0) {\n\t\t\tconst head = queue[0];\n\t\t\tif (head.length <= remaining) {\n\t\t\t\tqueue.shift();\n\t\t\t\tremaining -= head.length;\n\t\t\t} else {\n\t\t\t\tqueue[0] = head.subarray(remaining);\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t};\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { value, done } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tif (value) {\n\t\t\t\tqueue.push(Buffer.from(value));\n\t\t\t\tqueued += value.length;\n\t\t\t}\n\t\t\twhile (queued >= 5) {\n\t\t\t\tconst header = peek(5);\n\t\t\t\tif (!header) break;\n\t\t\t\tconst flags = header[0];\n\t\t\t\tconst len = header.readUInt32BE(1);\n\t\t\t\tif (flags & ~3) throw new Error(\"Invalid Devin Connect frame flags\");\n\t\t\t\tif (len > 16 * 1024 * 1024) throw new Error(\"Devin Connect frame exceeds 16 MiB\");\n\t\t\t\tif (queued < 5 + len) break;\n\t\t\t\tdrop(5);\n\t\t\t\tconst raw = peek(len) ?? Buffer.alloc(0);\n\t\t\t\tdrop(len);\n\t\t\t\tlet payload = raw;\n\t\t\t\tif (flags & 0x01) payload = zlib.gunzipSync(raw, { maxOutputLength: 16 * 1024 * 1024 });\n\t\t\t\tif (sawEos) throw new Error(\"Devin returned data after its EOS trailer\");\n\t\t\t\tif (flags & 0x02) {\n\t\t\t\t\tsawEos = true;\n\t\t\t\t\tconst parsed = JSON.parse(payload.toString(\"utf8\")) as { error?: { code?: string; message?: string } };\n\t\t\t\t\tif (parsed.error) {\n\t\t\t\t\t\tconst detail =\n\t\t\t\t\t\t\ttypeof parsed.error.message === \"string\"\n\t\t\t\t\t\t\t\t? parsed.error.message\n\t\t\t\t\t\t\t\t\t\t.replaceAll(args.apiKey, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.replaceAll(userJwt, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.slice(0, 500)\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\ttrailerError = `Devin stream failed (${parsed.error.code ?? \"unknown\"})${detail ? `: ${detail}` : \"\"}`;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tyield* decodeChatFrame(payload);\n\t\t\t}\n\t\t}\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t\ttry {\n\t\t\t// await: on an errored stream cancel() returns a rejected promise;\n\t\t\t// `void`-ing it escapes the try/catch as an unhandled rejection.\n\t\t\tawait resp.body?.cancel();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tif (trailerError) throw new Error(trailerError);\n\tif (queued) throw new Error(\"Truncated Devin Connect frame\");\n\tif (!sawEos) throw new Error(\"Devin stream ended without an EOS trailer\");\n}\n\nexport function streamDevin(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n\tconst stream = createAssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: model.api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tlet textOpen = false;\n\t\tlet thinkingOpen = false;\n\t\tlet thinkingIndex = -1;\n\t\tlet toolId = \"\";\n\t\tconst toolStates = new Map<string, { index: number; json: string }>();\n\n\t\tconst closeText = () => {\n\t\t\tif (!textOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"text\") {\n\t\t\t\tstream.push({ type: \"text_end\", contentIndex: idx, content: block.text, partial: output });\n\t\t\t}\n\t\t\ttextOpen = false;\n\t\t};\n\t\tconst closeThinking = () => {\n\t\t\tif (!thinkingOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"thinking\") {\n\t\t\t\tstream.push({ type: \"thinking_end\", contentIndex: idx, content: block.thinking, partial: output });\n\t\t\t}\n\t\t\tthinkingOpen = false;\n\t\t};\n\t\tconst closeTool = () => {\n\t\t\tfor (const state of toolStates.values()) {\n\t\t\t\tconst block = output.content[state.index];\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst parsed: unknown = JSON.parse(state.json);\n\t\t\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\t\t\t\t\tthrow new Error(\"Invalid Devin tool arguments\");\n\t\t\t\t\tblock.arguments = parsed as Record<string, unknown>;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\ttoolCall: block,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoolStates.clear();\n\t\t};\n\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\")\n\t\t\t\tthrow new Error(\"Devin inference must use pi-server in PI_SERVER_MODE\");\n\t\t\tif (!apiKey) throw new Error(\"No Devin credentials. Run /login devin.\");\n\t\t\tconst host = model.baseUrl.replace(/\\/$/, \"\");\n\t\t\tif (options?.reasoning && model.thinkingLevelMap && model.thinkingLevelMap[options.reasoning] !== model.id)\n\t\t\t\tthrow new Error(\"Select the Devin model variant for the requested reasoning effort\");\n\t\t\tif (options?.onPayload) throw new Error(\"Devin does not support onPayload overrides\");\n\t\t\tconst modelUid = model.id;\n\t\t\tconst mapped = mapContextToChat(context, model.id);\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tfor await (const event of streamChatEvents({\n\t\t\t\tapiKey,\n\t\t\t\thost,\n\t\t\t\tmodelUid,\n\t\t\t\tsystemPrompt: mapped.systemPrompt,\n\t\t\t\tmessages: mapped.messages,\n\t\t\t\ttools: mapped.tools.length > 0 ? mapped.tools : undefined,\n\t\t\t\tmaxOutputTokens: options?.maxTokens ?? model.maxTokens,\n\t\t\t\tsignal: options?.signal\n\t\t\t\t\t? AbortSignal.any([options.signal, AbortSignal.timeout(options.timeoutMs ?? 600_000)])\n\t\t\t\t\t: AbortSignal.timeout(options?.timeoutMs ?? 600_000),\n\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\tfetchImpl: options?.fetch ?? fetch,\n\t\t\t\ttemperature: options?.temperature,\n\t\t\t})) {\n\t\t\t\tif (event.kind === \"text\") {\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\tif (!textOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"text\", text: \"\" });\n\t\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\ttextOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\tblock.text += event.text;\n\t\t\t\t\t\tstream.push({ type: \"text_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tif (!thinkingOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinking += event.text;\n\t\t\t\t\t\tstream.push({ type: \"thinking_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_signature\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = output.content[thinkingIndex];\n\t\t\t\t\tif (block?.type === \"thinking\") {\n\t\t\t\t\t\tconst previous = unpackThinkingSignature(block.thinkingSignature);\n\t\t\t\t\t\tblock.thinkingSignature = packThinkingSignature(\n\t\t\t\t\t\t\t(previous.signature ?? \"\") + event.signature,\n\t\t\t\t\t\t\tevent.signatureType ?? previous.signatureType,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_redacted\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = thinkingIndex >= 0 ? output.content[thinkingIndex] : undefined;\n\t\t\t\t\tif (block?.type === \"thinking\") block.redacted = true;\n\t\t\t\t} else if (event.kind === \"tool_call_start\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\ttoolId = event.id;\n\t\t\t\t\tconst existing = toolStates.get(toolId);\n\t\t\t\t\tif (existing) {\n\t\t\t\t\t\tconst block = output.content[existing.index];\n\t\t\t\t\t\tif (block.type !== \"toolCall\" || block.name !== event.name)\n\t\t\t\t\t\t\tthrow new Error(\"Devin changed a tool call's name\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (!toolId || !event.name) throw new Error(\"Devin returned an empty tool identity\");\n\t\t\t\t\toutput.content.push({ type: \"toolCall\", id: event.id, name: event.name, arguments: {} });\n\t\t\t\t\tconst toolIndex = output.content.length - 1;\n\t\t\t\t\ttoolStates.set(toolId, { index: toolIndex, json: \"\" });\n\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: toolIndex, partial: output });\n\t\t\t\t} else if (event.kind === \"tool_call_args\") {\n\t\t\t\t\tconst state = toolStates.get(event.id ?? toolId);\n\t\t\t\t\tif (!state) throw new Error(\"Devin tool argument delta has no matching call\");\n\t\t\t\t\tstate.json += event.argsDelta;\n\t\t\t\t\tconst block = output.content[state.index];\n\t\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tblock.arguments = JSON.parse(state.json);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// incomplete json\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\tdelta: event.argsDelta,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t} else if (event.kind === \"finish\") {\n\t\t\t\t\tif (event.reason === \"content_filter\")\n\t\t\t\t\t\tthrow new Error(\"Devin response was blocked by content filtering\");\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\toutput.stopReason =\n\t\t\t\t\t\tevent.reason === \"tool_calls\" ? \"toolUse\" : event.reason === \"length\" ? \"length\" : \"stop\";\n\t\t\t\t} else if (event.kind === \"usage\") {\n\t\t\t\t\t// Metrics are reported counts, not deltas. Absent fields retain earlier reports.\n\t\t\t\t\tif (event.promptTokens !== undefined) output.usage.input = event.promptTokens;\n\t\t\t\t\tif (event.completionTokens !== undefined) output.usage.output = event.completionTokens;\n\t\t\t\t\tif (event.cachedInputTokens !== undefined) output.usage.cacheRead = event.cachedInputTokens;\n\t\t\t\t\tif (event.cacheCreationInputTokens !== undefined)\n\t\t\t\t\t\toutput.usage.cacheWrite = event.cacheCreationInputTokens;\n\t\t\t\t\toutput.usage.totalTokens =\n\t\t\t\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcloseText();\n\t\t\tcloseThinking();\n\t\t\tcloseTool();\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tif (!output.content.length) throw new Error(\"Devin returned an empty completion\");\n\t\t\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const) {\n\t\t\t\toutput.usage.cost[key] = (output.usage[key] * model.cost[key]) / 1_000_000;\n\t\t\t}\n\t\t\toutput.usage.cost.total =\n\t\t\t\toutput.usage.cost.input +\n\t\t\t\toutput.usage.cost.output +\n\t\t\t\toutput.usage.cost.cacheRead +\n\t\t\t\toutput.usage.cost.cacheWrite;\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason as \"stop\" | \"length\" | \"toolUse\", message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason as \"aborted\" | \"error\", error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n}\n"]}
@@ -211,6 +211,8 @@ function decodeUsage(buf) {
211
211
  metric = inner.value.toString("utf8");
212
212
  }
213
213
  else if (inner.num === 4 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {
214
+ // Protobuf omits the scalar field when a present numeric metric is zero.
215
+ value = 0;
214
216
  for (const dim of iterFields(inner.value)) {
215
217
  if (dim.num === 2 && dim.wire === 5 && Buffer.isBuffer(dim.value)) {
216
218
  value = dim.value.readFloatLE(0);
@@ -225,18 +227,20 @@ function decodeUsage(buf) {
225
227
  promptTokens = n;
226
228
  else if (metric === "output_tokens")
227
229
  completionTokens = n;
228
- else if (metric === "cache_read_input_tokens")
230
+ else if (metric === "cached_input_tokens" || metric === "cache_read_input_tokens")
229
231
  cachedInputTokens = n;
230
232
  else if (metric === "cache_creation_input_tokens")
231
233
  cacheCreationInputTokens = n;
232
234
  }
233
- if (promptTokens === undefined && completionTokens === undefined)
235
+ if (promptTokens === undefined &&
236
+ completionTokens === undefined &&
237
+ cachedInputTokens === undefined &&
238
+ cacheCreationInputTokens === undefined)
234
239
  return null;
235
240
  return {
236
241
  kind: "usage",
237
242
  promptTokens,
238
243
  completionTokens,
239
- totalTokens: (promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cacheCreationInputTokens ?? 0),
240
244
  cachedInputTokens,
241
245
  cacheCreationInputTokens,
242
246
  };
@@ -586,13 +590,17 @@ export function streamDevin(model, context, options) {
586
590
  event.reason === "tool_calls" ? "toolUse" : event.reason === "length" ? "length" : "stop";
587
591
  }
588
592
  else if (event.kind === "usage") {
589
- output.usage.input = event.promptTokens ?? 0;
590
- output.usage.output = event.completionTokens ?? 0;
591
- output.usage.cacheRead = event.cachedInputTokens ?? 0;
592
- output.usage.cacheWrite = event.cacheCreationInputTokens ?? 0;
593
+ // Metrics are reported counts, not deltas. Absent fields retain earlier reports.
594
+ if (event.promptTokens !== undefined)
595
+ output.usage.input = event.promptTokens;
596
+ if (event.completionTokens !== undefined)
597
+ output.usage.output = event.completionTokens;
598
+ if (event.cachedInputTokens !== undefined)
599
+ output.usage.cacheRead = event.cachedInputTokens;
600
+ if (event.cacheCreationInputTokens !== undefined)
601
+ output.usage.cacheWrite = event.cacheCreationInputTokens;
593
602
  output.usage.totalTokens =
594
- event.totalTokens ??
595
- output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
603
+ output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
596
604
  }
597
605
  }
598
606
  closeText();
@@ -1 +1 @@
1
- {"version":3,"file":"devin-stream.js","sourceRoot":"","sources":["../../src/api/devin-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;EAuBE;AACF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAKN,iCAAiC,GAGjC,MAAM,aAAa,CAAC;AACrB,OAAO,EAA0C,gBAAgB,EAAgB,MAAM,wBAAwB,CAAC;AAChH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAqB,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACxG,OAAO,EACN,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,GACV,MAAM,iBAAiB,CAAC;AAEzB,MAAM,cAAc,GAA2B;IAC9C,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;CACP,CAAC;AAmBF,SAAS,gBAAgB,CAAC,OAA+B,EAAiB;IACzE,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1E,OAAO,OAAO,CAAC;AAAA,CACf;AAED,SAAS,eAAe,CAAC,GAA+C,EAAU;IACjF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;AAAA,CAC5G;AAED,SAAS,kBAAkB,CAAC,EAAmD,EAAU;IACxF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAAA,CACxG;AAED,SAAS,uBAAuB,CAC/B,OAAsB,EACtB,MAAc,EACd,IAIC,EACQ;IACT,MAAM,IAAI,GAAG,OAAO;SAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;SACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;SAC9B,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,KAAK,GAAa,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvG,IAAI,IAAI,EAAE,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACnE,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,SAAS,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7F,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,gFAA8E;IAC9E,2EAA2E;IAC3E,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa;YAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAAA,CAC5B;AAED;oDACoD;AACpD,SAAS,6BAA6B,CAAC,eAAwB,EAAE,WAAoB,EAAU;IAC9F,OAAO,MAAM,CAAC,MAAM,CAAC;QACpB,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;QACvB,iBAAiB,CAAC,CAAC,EAAE,eAAe,IAAI,OAAO,CAAC;QAChD,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC;QACzB,kBAAkB,CAAC,CAAC,EAAE,WAAW,IAAI,GAAG,CAAC;QACzC,iBAAiB,CAAC,CAAC,EAAE,EAAE,CAAC;QACxB,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC;KAC3B,CAAC,CAAC;AAAA,CACH;AAED,sEAAsE;AACtE,SAAS,yBAAyB,CAAC,YAAoB,EAAU;IAChE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAAA,CACzG;AAED,SAAS,aAAa,CAAC,IAAa,EAAU;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC;QACpB,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;QAC1B,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC;QAC5B,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;KACtD,CAAC,CAAC;AAAA,CACH;AAED,SAAS,0BAA0B,CAAC,IAcnC,EAAU;IACV,MAAM,QAAQ,GAAG,aAAa,CAAC;QAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;KACzB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7C,aAAa,CACZ,CAAC,EACD,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACxF,UAAU,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;QACtE,SAAS,EAAE,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACxE,QAAQ,EAAE,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACrE,CAAC,CACF,CACD,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;QACpB,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC;QAC1B,+EAA6E;QAC7E,2EAA2E;QAC3E,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,OAAO;QACV,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;QACvB,aAAa,CAAC,CAAC,EAAE,6BAA6B,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACvF,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,aAAa,CAAC,EAAE,EAAE,yBAAyB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/D,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;QAChC,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC;QACxB,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;KAC/B,CAAC,CAAC;AAAA,CACH;AAED,QAAQ,CAAC,CAAC,eAAe,CAAC,KAAa,EAA6B;IACnE,IAAI,SAA6B,CAAC;IAClC,IAAI,aAAiC,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,IAAI;gBAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACxC,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAChF,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,IAAI;gBAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC7C,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACjD,2CAA2C;YAC3C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;QACrE,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACjF,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,IAAI;gBAAE,SAAS,GAAG,IAAI,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACjF,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,IAAI;gBAAE,aAAa,GAAG,IAAI,CAAC;QAChC,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAChF,IAAI,EAAsB,CAAC;YAC3B,IAAI,IAAwB,CAAC;YAC7B,IAAI,SAA6B,CAAC;YAClC,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC1C,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC;wBAAE,EAAE,GAAG,IAAI,CAAC;yBAC1B,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC;wBAAE,IAAI,GAAG,IAAI,CAAC;yBACjC,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC;wBAAE,SAAS,GAAG,IAAI,CAAC;gBAC5C,CAAC;YACF,CAAC;YACD,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YACxF,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACjG,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,MAAM,GAA0D,MAAM,CAAC;YAC3E,IAAI,KAAK,KAAK,EAAE;gBAAE,MAAM,GAAG,YAAY,CAAC;iBACnC,IAAI,KAAK,KAAK,EAAE;gBAAE,MAAM,GAAG,gBAAgB,CAAC;iBAC5C,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,MAAM,GAAG,QAAQ,CAAC;iBACpD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;YAC9G,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACjF,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,KAAK;gBAAE,MAAM,KAAK,CAAC;QACxB,CAAC;IACF,CAAC;IACD,6EAA6E;IAC7E,oEAAoE;IACpE,IAAI,SAAS,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS;QACzD,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC;AAAA,CAClF;AAED,SAAS,WAAW,CAAC,GAAW,EAAyB;IACxD,IAAI,YAAgC,CAAC;IACrC,IAAI,gBAAoC,CAAC;IACzC,IAAI,iBAAqC,CAAC;IAC1C,IAAI,wBAA4C,CAAC;IACjD,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,SAAS;QACnF,IAAI,MAA0B,CAAC;QAC/B,IAAI,KAAyB,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzE,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;iBAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChF,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC3C,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;wBACnE,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;oBAClC,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACxE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,cAAc;YAAE,YAAY,GAAG,CAAC,CAAC;aAC3C,IAAI,MAAM,KAAK,eAAe;YAAE,gBAAgB,GAAG,CAAC,CAAC;aACrD,IAAI,MAAM,KAAK,yBAAyB;YAAE,iBAAiB,GAAG,CAAC,CAAC;aAChE,IAAI,MAAM,KAAK,6BAA6B;YAAE,wBAAwB,GAAG,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,IAAI,gBAAgB,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC9E,OAAO;QACN,IAAI,EAAE,OAAO;QACb,YAAY;QACZ,gBAAgB;QAChB,WAAW,EACV,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,CAAC;QAC3G,iBAAiB;QACjB,wBAAwB;KACxB,CAAC;AAAA,CACF;AAED,KAAK,SAAS,CAAC,CAAC,gBAAgB,CAAC,IAYhC,EAAkC;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,UAAU,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IACzE,MAAM,KAAK,GAAG,0BAA0B,CAAC;QACxC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,SAAS,EAAE,UAAU,EAAE;QACvB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,WAAW,EAAE,IAAI,CAAC,WAAW;KAC7B,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,oDAAoD,EAAE;QAC9F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACR,cAAc,EAAE,2BAA2B;YAC3C,0BAA0B,EAAE,GAAG;YAC/B,0BAA0B,EAAE,MAAM;YAClC,yBAAyB,EAAE,MAAM;SACjC;QACD,IAAI,EAAE,IAAI,UAAU,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,EAAE,IAAI,CAAC,MAAM;KACnB,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAEzE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACrC,2EAA2E;IAC3E,6EAA6E;IAC7E,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,YAAY,GAAkB,IAAI,CAAC;IAEvC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAiB,EAAE,CAAC;QAC1C,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC3B,IAAI,SAAS,IAAI,CAAC;gBAAE,MAAM;YAC1B,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACP,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;gBACzC,SAAS,GAAG,CAAC,CAAC;YACf,CAAC;QACF,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAAA,CAC/B,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,CAAS,EAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,CAAC;QACZ,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,OAAO,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;gBAC9B,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACP,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpC,SAAS,GAAG,CAAC,CAAC;YACf,CAAC;QACF,CAAC;IAAA,CACD,CAAC;IAEF,IAAI,CAAC;QACJ,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,IAAI,KAAK,EAAE,CAAC;gBACX,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;YACxB,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACvB,IAAI,CAAC,MAAM;oBAAE,MAAM;gBACnB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBACnC,IAAI,KAAK,GAAG,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBACrE,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBAClF,IAAI,MAAM,GAAG,CAAC,GAAG,GAAG;oBAAE,MAAM;gBAC5B,IAAI,CAAC,CAAC,CAAC,CAAC;gBACR,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACV,IAAI,OAAO,GAAG,GAAG,CAAC;gBAClB,IAAI,KAAK,GAAG,IAAI;oBAAE,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,eAAe,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;gBACxF,IAAI,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBACzE,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC;oBAClB,MAAM,GAAG,IAAI,CAAC;oBACd,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAoD,CAAC;oBACvG,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBAClB,MAAM,MAAM,GACX,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ;4BACvC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;iCACnB,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;iCACrC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC;iCACjC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;4BAChB,CAAC,CAAC,EAAE,CAAC;wBACP,YAAY,GAAG,wBAAwB,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oBACxG,CAAC;oBACD,SAAS;gBACV,CAAC;gBACD,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;QACF,CAAC;IACF,CAAC;YAAS,CAAC;QACV,IAAI,CAAC;YACJ,MAAM,CAAC,WAAW,EAAE,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;QACD,IAAI,CAAC;YACJ,mEAAmE;YACnE,iEAAiE;YACjE,MAAM,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;IACF,CAAC;IAED,IAAI,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAAA,CAC1E;AAED,MAAM,UAAU,WAAW,CAC1B,KAAiB,EACjB,OAAgB,EAChB,OAA6B,EACC;IAC9B,MAAM,MAAM,GAAG,iCAAiC,EAAE,CAAC;IAEnD,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,MAAM,GAAqB;YAChC,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,EAAE;YACX,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,KAAK,EAAE;gBACN,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;aACpE;YACD,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC;QAEF,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2C,CAAC;QAEtE,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,QAAQ,GAAG,KAAK,CAAC;QAAA,CACjB,CAAC;QACF,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,YAAY;gBAAE,OAAO;YAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACpG,CAAC;YACD,YAAY,GAAG,KAAK,CAAC;QAAA,CACrB,CAAC;QACF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;YACvB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC/B,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC/C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;wBACjE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;oBACjD,KAAK,CAAC,SAAS,GAAG,MAAiC,CAAC;oBACpD,MAAM,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,cAAc;wBACpB,YAAY,EAAE,KAAK,CAAC,KAAK;wBACzB,QAAQ,EAAE,KAAK;wBACf,OAAO,EAAE,MAAM;qBACf,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YACD,UAAU,CAAC,KAAK,EAAE,CAAC;QAAA,CACnB,CAAC;QAEF,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;YAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM;gBACxC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACxE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,OAAO,EAAE,SAAS,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,EAAE;gBACzG,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACtF,IAAI,OAAO,EAAE,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YACtF,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAEhD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,gBAAgB,CAAC;gBAC1C,MAAM;gBACN,IAAI;gBACJ,QAAQ;gBACR,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBACzD,eAAe,EAAE,OAAO,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS;gBACtD,MAAM,EAAE,OAAO,EAAE,MAAM;oBACtB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC;oBACtF,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC;gBACrD,SAAS,EAAE,OAAO,EAAE,SAAS;gBAC7B,SAAS,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK;gBAClC,WAAW,EAAE,OAAO,EAAE,WAAW;aACjC,CAAC,EAAE,CAAC;gBACJ,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC3B,aAAa,EAAE,CAAC;oBAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACf,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;wBAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;wBAC9F,QAAQ,GAAG,IAAI,CAAC;oBACjB,CAAC;oBACD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;oBACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBAClC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC3B,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;wBACzB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC5F,CAAC;gBACF,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACvC,SAAS,EAAE,CAAC;oBACZ,IAAI,CAAC,YAAY,EAAE,CAAC;wBACnB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;wBACxD,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;wBAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;wBAClG,YAAY,GAAG,IAAI,CAAC;oBACrB,CAAC;oBACD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;oBACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBAClC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;wBAC/B,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC;wBAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBAChG,CAAC;gBACF,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;oBACjD,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;wBACvB,SAAS,EAAE,CAAC;wBACZ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;wBACxD,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;wBAC1C,YAAY,GAAG,IAAI,CAAC;wBACpB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBACvF,CAAC;oBACD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;oBAC5C,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;wBAChC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;wBAClE,KAAK,CAAC,iBAAiB,GAAG,qBAAqB,CAC9C,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,EAC5C,KAAK,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAC7C,CAAC;oBACH,CAAC;gBACF,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;oBAChD,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;wBACvB,SAAS,EAAE,CAAC;wBACZ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;wBACxD,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;wBAC1C,YAAY,GAAG,IAAI,CAAC;wBACpB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBACvF,CAAC;oBACD,MAAM,KAAK,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC7E,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU;wBAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACvD,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;oBAC7C,SAAS,EAAE,CAAC;oBACZ,aAAa,EAAE,CAAC;oBAChB,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC;oBAClB,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACxC,IAAI,QAAQ,EAAE,CAAC;wBACd,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;wBAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;4BACzD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;wBACrD,SAAS;oBACV,CAAC;oBACD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI;wBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;oBACrF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;oBACzF,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC5C,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBACvD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACnF,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC,CAAC;oBACjD,IAAI,CAAC,KAAK;wBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;oBAC9E,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC;oBAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;wBAC/B,IAAI,CAAC;4BACJ,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC1C,CAAC;wBAAC,MAAM,CAAC;4BACR,kBAAkB;wBACnB,CAAC;oBACF,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,gBAAgB;wBACtB,YAAY,EAAE,KAAK,CAAC,KAAK;wBACzB,KAAK,EAAE,KAAK,CAAC,SAAS;wBACtB,OAAO,EAAE,MAAM;qBACf,CAAC,CAAC;gBACJ,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACpC,IAAI,KAAK,CAAC,MAAM,KAAK,gBAAgB;wBACpC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;oBACpE,SAAS,EAAE,CAAC;oBACZ,aAAa,EAAE,CAAC;oBAChB,MAAM,CAAC,UAAU;wBAChB,KAAK,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC5F,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACnC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;oBAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;oBAClD,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC;oBACtD,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,wBAAwB,IAAI,CAAC,CAAC;oBAC9D,MAAM,CAAC,KAAK,CAAC,WAAW;wBACvB,KAAK,CAAC,WAAW;4BACjB,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC9F,CAAC;YACF,CAAC;YAED,SAAS,EAAE,CAAC;YACZ,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAClF,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAU,EAAE,CAAC;gBAC3E,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;YAC5E,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;oBACvB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM;oBACxB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS;oBAC3B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,UAA2C,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3G,MAAM,CAAC,GAAG,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,UAAU,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;YACnE,MAAM,CAAC,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,UAAiC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAChG,MAAM,CAAC,GAAG,EAAE,CAAC;QACd,CAAC;IAAA,CACD,CAAC,EAAE,CAAC;IAEL,OAAO,MAAM,CAAC;AAAA,CACd","sourcesContent":["/*\nMIT License\n\nCopyright (c) 2026 Kashyab Ambarani\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\nimport { randomUUID } from \"node:crypto\";\nimport * as zlib from \"node:zlib\";\nimport {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\ttype SimpleStreamOptions,\n} from \"../index.ts\";\nimport { type ChatHistoryItem, type ContentPart, mapContextToChat, type ToolDef } from \"./devin-context-map.ts\";\nimport { mintUserJwt } from \"./devin-jwt.ts\";\nimport { buildMetadata } from \"./devin-metadata.ts\";\n\nimport { type ChatThinking, packThinkingSignature, unpackThinkingSignature } from \"./devin-thinking.ts\";\nimport {\n\tencodeFixed64Field,\n\tencodeMessage,\n\tencodeString,\n\tencodeVarintField,\n\tframeConnectStream,\n\titerFields,\n} from \"./devin-wire.ts\";\n\nconst SOURCE_BY_ROLE: Record<string, number> = {\n\tuser: 1,\n\tassistant: 2,\n\ttool: 4,\n};\n\nexport type CloudChatEvent =\n\t| { kind: \"text\"; text: string }\n\t| { kind: \"reasoning\"; text: string }\n\t| { kind: \"reasoning_signature\"; signature: string; signatureType?: string }\n\t| { kind: \"reasoning_redacted\" }\n\t| { kind: \"tool_call_start\"; id: string; name: string }\n\t| { kind: \"tool_call_args\"; argsDelta: string; id?: string }\n\t| { kind: \"finish\"; reason: \"stop\" | \"tool_calls\" | \"length\" | \"content_filter\" }\n\t| {\n\t\t\tkind: \"usage\";\n\t\t\tpromptTokens?: number;\n\t\t\tcompletionTokens?: number;\n\t\t\ttotalTokens?: number;\n\t\t\tcachedInputTokens?: number;\n\t\t\tcacheCreationInputTokens?: number;\n\t };\n\nfunction normalizeContent(content: string | ContentPart[]): ContentPart[] {\n\tif (typeof content === \"string\") return [{ type: \"text\", text: content }];\n\treturn content;\n}\n\nfunction encodeImageData(img: { mimeType?: string; base64Data?: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, img.base64Data ?? \"\"), encodeString(2, img.mimeType ?? \"image/png\")]);\n}\n\nfunction encodeChatToolCall(tc: { id: string; name: string; arguments: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, tc.id), encodeString(2, tc.name), encodeString(3, tc.arguments)]);\n}\n\nfunction encodeChatMessagePrompt(\n\tcontent: ContentPart[],\n\tsource: number,\n\topts?: {\n\t\ttoolCallId?: string;\n\t\ttoolCalls?: Array<{ id: string; name: string; arguments: string }>;\n\t\tthinking?: ChatThinking;\n\t},\n): Buffer {\n\tconst text = content\n\t\t.filter((part) => part.type === \"text\")\n\t\t.map((part) => part.text ?? \"\")\n\t\t.join(\"\\n\");\n\tconst parts: Buffer[] = [encodeVarintField(2, source), encodeString(3, text), encodeVarintField(5, 1)];\n\tif (opts?.toolCallId) parts.push(encodeString(7, opts.toolCallId));\n\tfor (const tc of opts?.toolCalls ?? []) parts.push(encodeMessage(6, encodeChatToolCall(tc)));\n\tfor (const img of content.filter((part) => part.type === \"image\")) {\n\t\tparts.push(encodeMessage(10, encodeImageData(img)));\n\t}\n\t// 11 thinking / 12 signature / 13 thinking_redacted / 18 signature_type — the\n\t// same quartet the Devin CLI replays so the model keeps its own reasoning.\n\tif (opts?.thinking) {\n\t\tparts.push(encodeString(11, opts.thinking.text));\n\t\tparts.push(encodeString(12, opts.thinking.signature));\n\t\tif (opts.thinking.redacted) parts.push(encodeVarintField(13, 1));\n\t\tif (opts.thinking.signatureType) parts.push(encodeString(18, opts.thinking.signatureType));\n\t}\n\treturn Buffer.concat(parts);\n}\n\n/** Mirrors the Devin CLI: num_completions / max_tokens / max_newlines plus\n * temperature / top_k / top_p, and nothing else. */\nfunction encodeCompletionConfiguration(maxOutputTokens?: number, temperature?: number): Buffer {\n\treturn Buffer.concat([\n\t\tencodeVarintField(1, 1),\n\t\tencodeVarintField(2, maxOutputTokens ?? 128_000),\n\t\tencodeVarintField(3, 400),\n\t\tencodeFixed64Field(5, temperature ?? 1.0),\n\t\tencodeVarintField(7, 40),\n\t\tencodeFixed64Field(8, 0.95),\n\t]);\n}\n\n/** CortexTrajectoryReference: cascade trajectory, user-input step. */\nfunction encodeTrajectoryReference(trajectoryId: string): Buffer {\n\treturn Buffer.concat([encodeString(1, trajectoryId), encodeVarintField(3, 4), encodeVarintField(4, 14)]);\n}\n\nfunction encodeToolDef(tool: ToolDef): Buffer {\n\tconst description = tool.description;\n\treturn Buffer.concat([\n\t\tencodeString(1, tool.name),\n\t\tencodeString(2, description),\n\t\tencodeString(3, JSON.stringify(tool.parameters ?? {})),\n\t]);\n}\n\nfunction buildGetChatMessageRequest(args: {\n\tapiKey: string;\n\tuserJwt: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tcascadeId: string;\n\ttrajectoryId: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tmaxOutputTokens?: number;\n\ttemperature?: number;\n}): Buffer {\n\tconst metadata = buildMetadata({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt: args.userJwt,\n\t\tsessionId: args.sessionId,\n\t\trequestId: args.requestId,\n\t\ttriggerId: args.triggerId,\n\t});\n\tconst prompts = args.messages.map((message) =>\n\t\tencodeMessage(\n\t\t\t3,\n\t\t\tencodeChatMessagePrompt(normalizeContent(message.content), SOURCE_BY_ROLE[message.role], {\n\t\t\t\ttoolCallId: message.role === \"tool\" ? message.tool_call_id : undefined,\n\t\t\t\ttoolCalls: message.role === \"assistant\" ? message.tool_calls : undefined,\n\t\t\t\tthinking: message.role === \"assistant\" ? message.thinking : undefined,\n\t\t\t}),\n\t\t),\n\t);\n\treturn Buffer.concat([\n\t\tencodeMessage(1, metadata),\n\t\t// 2 prompt — the server's system slot, same place the Devin CLI puts its own\n\t\t// system prompt. Collapsing it into the first user turn is not equivalent.\n\t\t...(args.systemPrompt ? [encodeString(2, args.systemPrompt)] : []),\n\t\t...prompts,\n\t\tencodeVarintField(7, 5),\n\t\tencodeMessage(8, encodeCompletionConfiguration(args.maxOutputTokens, args.temperature)),\n\t\t...(args.tools ?? []).map((tool) => encodeMessage(10, encodeToolDef(tool))),\n\t\tencodeMessage(15, encodeTrajectoryReference(args.trajectoryId)),\n\t\tencodeString(16, args.cascadeId),\n\t\tencodeVarintField(20, 1),\n\t\tencodeString(21, args.modelUid),\n\t]);\n}\n\nfunction* decodeChatFrame(proto: Buffer): Generator<CloudChatEvent> {\n\tlet signature: string | undefined;\n\tlet signatureType: string | undefined;\n\tfor (const field of iterFields(proto)) {\n\t\tif (field.num === 3 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"text\", text };\n\t\t} else if (field.num === 9 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"reasoning\", text };\n\t\t} else if (field.num === 11 && field.wire === 0) {\n\t\t\t// GetChatMessageResponse.thinking_redacted\n\t\t\tif (Number(field.value) !== 0) yield { kind: \"reasoning_redacted\" };\n\t\t} else if (field.num === 10 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signature = text;\n\t\t} else if (field.num === 21 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signatureType = text;\n\t\t} else if (field.num === 6 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tlet id: string | undefined;\n\t\t\tlet name: string | undefined;\n\t\t\tlet argsDelta: string | undefined;\n\t\t\tfor (const inner of iterFields(field.value)) {\n\t\t\t\tif (inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\t\tconst text = inner.value.toString(\"utf8\");\n\t\t\t\t\tif (inner.num === 1) id = text;\n\t\t\t\t\telse if (inner.num === 2) name = text;\n\t\t\t\t\telse if (inner.num === 3) argsDelta = text;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (id !== undefined && name !== undefined) yield { kind: \"tool_call_start\", id, name };\n\t\t\tif (argsDelta !== undefined) yield { kind: \"tool_call_args\", argsDelta, ...(id ? { id } : {}) };\n\t\t} else if (field.num === 5 && field.wire === 0) {\n\t\t\tconst value = Number(field.value);\n\t\t\tlet reason: Extract<CloudChatEvent, { kind: \"finish\" }>[\"reason\"] = \"stop\";\n\t\t\tif (value === 10) reason = \"tool_calls\";\n\t\t\telse if (value === 11) reason = \"content_filter\";\n\t\t\telse if ([1, 3, 5, 9].includes(value)) reason = \"length\";\n\t\t\telse if (![0, 2, 4, 6, 8, 12].includes(value)) throw new Error(`Devin returned failure stop reason ${value}`);\n\t\t\tyield { kind: \"finish\", reason };\n\t\t} else if (field.num === 28 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst usage = decodeUsage(field.value);\n\t\t\tif (usage) yield usage;\n\t\t}\n\t}\n\t// The signature trails the thinking text, so it is yielded once the frame is\n\t// fully read and gets attached to the block that is already closed.\n\tif (signature !== undefined || signatureType !== undefined)\n\t\tyield { kind: \"reasoning_signature\", signature: signature ?? \"\", signatureType };\n}\n\nfunction decodeUsage(buf: Buffer): CloudChatEvent | null {\n\tlet promptTokens: number | undefined;\n\tlet completionTokens: number | undefined;\n\tlet cachedInputTokens: number | undefined;\n\tlet cacheCreationInputTokens: number | undefined;\n\tfor (const field of iterFields(buf)) {\n\t\tif (field.num !== 2 || field.wire !== 2 || !Buffer.isBuffer(field.value)) continue;\n\t\tlet metric: string | undefined;\n\t\tlet value: number | undefined;\n\t\tfor (const inner of iterFields(field.value)) {\n\t\t\tif (inner.num === 5 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tmetric = inner.value.toString(\"utf8\");\n\t\t\t} else if (inner.num === 4 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tfor (const dim of iterFields(inner.value)) {\n\t\t\t\t\tif (dim.num === 2 && dim.wire === 5 && Buffer.isBuffer(dim.value)) {\n\t\t\t\t\t\tvalue = dim.value.readFloatLE(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!metric || value === undefined || !Number.isFinite(value)) continue;\n\t\tconst n = Math.round(value);\n\t\tif (metric === \"input_tokens\") promptTokens = n;\n\t\telse if (metric === \"output_tokens\") completionTokens = n;\n\t\telse if (metric === \"cache_read_input_tokens\") cachedInputTokens = n;\n\t\telse if (metric === \"cache_creation_input_tokens\") cacheCreationInputTokens = n;\n\t}\n\tif (promptTokens === undefined && completionTokens === undefined) return null;\n\treturn {\n\t\tkind: \"usage\",\n\t\tpromptTokens,\n\t\tcompletionTokens,\n\t\ttotalTokens:\n\t\t\t(promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cacheCreationInputTokens ?? 0),\n\t\tcachedInputTokens,\n\t\tcacheCreationInputTokens,\n\t};\n}\n\nasync function* streamChatEvents(args: {\n\tapiKey: string;\n\thost: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tmaxOutputTokens?: number;\n\tsignal?: AbortSignal;\n\tsessionId?: string;\n\tfetchImpl: typeof fetch;\n\ttemperature?: number;\n}): AsyncGenerator<CloudChatEvent> {\n\tconst host = args.host.replace(/\\/$/, \"\");\n\tconst userJwt = await mintUserJwt(args.apiKey, host, args.signal, args.fetchImpl);\n\tconst sessionId = args.sessionId ?? randomUUID();\n\tconst ids = { sessionId, cascadeId: sessionId, trajectoryId: sessionId };\n\tconst proto = buildGetChatMessageRequest({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt,\n\t\tmodelUid: args.modelUid,\n\t\tsystemPrompt: args.systemPrompt,\n\t\tmessages: args.messages,\n\t\ttools: args.tools,\n\t\tcascadeId: ids.cascadeId,\n\t\ttrajectoryId: ids.trajectoryId,\n\t\tsessionId: ids.sessionId,\n\t\trequestId: BigInt(Date.now()),\n\t\ttriggerId: randomUUID(),\n\t\tmaxOutputTokens: args.maxOutputTokens,\n\t\ttemperature: args.temperature,\n\t});\n\n\tconst resp = await args.fetchImpl(`${host}/exa.api_server_pb.ApiServerService/GetChatMessage`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/connect+proto\",\n\t\t\t\"Connect-Protocol-Version\": \"1\",\n\t\t\t\"Connect-Content-Encoding\": \"gzip\",\n\t\t\t\"Connect-Accept-Encoding\": \"gzip\",\n\t\t},\n\t\tbody: new Uint8Array(frameConnectStream(proto, true)),\n\t\tsignal: args.signal,\n\t});\n\tif (!resp.ok) {\n\t\tthrow new Error(`Devin GetChatMessage failed (HTTP ${resp.status})`);\n\t}\n\tif (!resp.body) throw new Error(\"GetChatMessage returned an empty body\");\n\n\tconst reader = resp.body.getReader();\n\t// reader.closed rejects with the stream's storedError when the socket dies\n\t// mid-response; nothing awaits it -> unhandledRejection crashes the process.\n\tvoid reader.closed.catch(() => {});\n\tconst queue: Buffer[] = [];\n\tlet queued = 0;\n\tlet sawEos = false;\n\tlet trailerError: string | null = null;\n\n\tconst peek = (n: number): Buffer | null => {\n\t\tif (queued < n) return null;\n\t\tif (queue.length === 1 && queue[0].length >= n) return queue[0].subarray(0, n);\n\t\tconst parts: Buffer[] = [];\n\t\tlet remaining = n;\n\t\tfor (const chunk of queue) {\n\t\t\tif (remaining <= 0) break;\n\t\t\tif (chunk.length <= remaining) {\n\t\t\t\tparts.push(chunk);\n\t\t\t\tremaining -= chunk.length;\n\t\t\t} else {\n\t\t\t\tparts.push(chunk.subarray(0, remaining));\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t\treturn Buffer.concat(parts, n);\n\t};\n\n\tconst drop = (n: number): void => {\n\t\tqueued -= n;\n\t\tlet remaining = n;\n\t\twhile (remaining > 0 && queue.length > 0) {\n\t\t\tconst head = queue[0];\n\t\t\tif (head.length <= remaining) {\n\t\t\t\tqueue.shift();\n\t\t\t\tremaining -= head.length;\n\t\t\t} else {\n\t\t\t\tqueue[0] = head.subarray(remaining);\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t};\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { value, done } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tif (value) {\n\t\t\t\tqueue.push(Buffer.from(value));\n\t\t\t\tqueued += value.length;\n\t\t\t}\n\t\t\twhile (queued >= 5) {\n\t\t\t\tconst header = peek(5);\n\t\t\t\tif (!header) break;\n\t\t\t\tconst flags = header[0];\n\t\t\t\tconst len = header.readUInt32BE(1);\n\t\t\t\tif (flags & ~3) throw new Error(\"Invalid Devin Connect frame flags\");\n\t\t\t\tif (len > 16 * 1024 * 1024) throw new Error(\"Devin Connect frame exceeds 16 MiB\");\n\t\t\t\tif (queued < 5 + len) break;\n\t\t\t\tdrop(5);\n\t\t\t\tconst raw = peek(len) ?? Buffer.alloc(0);\n\t\t\t\tdrop(len);\n\t\t\t\tlet payload = raw;\n\t\t\t\tif (flags & 0x01) payload = zlib.gunzipSync(raw, { maxOutputLength: 16 * 1024 * 1024 });\n\t\t\t\tif (sawEos) throw new Error(\"Devin returned data after its EOS trailer\");\n\t\t\t\tif (flags & 0x02) {\n\t\t\t\t\tsawEos = true;\n\t\t\t\t\tconst parsed = JSON.parse(payload.toString(\"utf8\")) as { error?: { code?: string; message?: string } };\n\t\t\t\t\tif (parsed.error) {\n\t\t\t\t\t\tconst detail =\n\t\t\t\t\t\t\ttypeof parsed.error.message === \"string\"\n\t\t\t\t\t\t\t\t? parsed.error.message\n\t\t\t\t\t\t\t\t\t\t.replaceAll(args.apiKey, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.replaceAll(userJwt, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.slice(0, 500)\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\ttrailerError = `Devin stream failed (${parsed.error.code ?? \"unknown\"})${detail ? `: ${detail}` : \"\"}`;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tyield* decodeChatFrame(payload);\n\t\t\t}\n\t\t}\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t\ttry {\n\t\t\t// await: on an errored stream cancel() returns a rejected promise;\n\t\t\t// `void`-ing it escapes the try/catch as an unhandled rejection.\n\t\t\tawait resp.body?.cancel();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tif (trailerError) throw new Error(trailerError);\n\tif (queued) throw new Error(\"Truncated Devin Connect frame\");\n\tif (!sawEos) throw new Error(\"Devin stream ended without an EOS trailer\");\n}\n\nexport function streamDevin(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n\tconst stream = createAssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: model.api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tlet textOpen = false;\n\t\tlet thinkingOpen = false;\n\t\tlet thinkingIndex = -1;\n\t\tlet toolId = \"\";\n\t\tconst toolStates = new Map<string, { index: number; json: string }>();\n\n\t\tconst closeText = () => {\n\t\t\tif (!textOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"text\") {\n\t\t\t\tstream.push({ type: \"text_end\", contentIndex: idx, content: block.text, partial: output });\n\t\t\t}\n\t\t\ttextOpen = false;\n\t\t};\n\t\tconst closeThinking = () => {\n\t\t\tif (!thinkingOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"thinking\") {\n\t\t\t\tstream.push({ type: \"thinking_end\", contentIndex: idx, content: block.thinking, partial: output });\n\t\t\t}\n\t\t\tthinkingOpen = false;\n\t\t};\n\t\tconst closeTool = () => {\n\t\t\tfor (const state of toolStates.values()) {\n\t\t\t\tconst block = output.content[state.index];\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst parsed: unknown = JSON.parse(state.json);\n\t\t\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\t\t\t\t\tthrow new Error(\"Invalid Devin tool arguments\");\n\t\t\t\t\tblock.arguments = parsed as Record<string, unknown>;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\ttoolCall: block,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoolStates.clear();\n\t\t};\n\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\")\n\t\t\t\tthrow new Error(\"Devin inference must use pi-server in PI_SERVER_MODE\");\n\t\t\tif (!apiKey) throw new Error(\"No Devin credentials. Run /login devin.\");\n\t\t\tconst host = model.baseUrl.replace(/\\/$/, \"\");\n\t\t\tif (options?.reasoning && model.thinkingLevelMap && model.thinkingLevelMap[options.reasoning] !== model.id)\n\t\t\t\tthrow new Error(\"Select the Devin model variant for the requested reasoning effort\");\n\t\t\tif (options?.onPayload) throw new Error(\"Devin does not support onPayload overrides\");\n\t\t\tconst modelUid = model.id;\n\t\t\tconst mapped = mapContextToChat(context, model.id);\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tfor await (const event of streamChatEvents({\n\t\t\t\tapiKey,\n\t\t\t\thost,\n\t\t\t\tmodelUid,\n\t\t\t\tsystemPrompt: mapped.systemPrompt,\n\t\t\t\tmessages: mapped.messages,\n\t\t\t\ttools: mapped.tools.length > 0 ? mapped.tools : undefined,\n\t\t\t\tmaxOutputTokens: options?.maxTokens ?? model.maxTokens,\n\t\t\t\tsignal: options?.signal\n\t\t\t\t\t? AbortSignal.any([options.signal, AbortSignal.timeout(options.timeoutMs ?? 600_000)])\n\t\t\t\t\t: AbortSignal.timeout(options?.timeoutMs ?? 600_000),\n\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\tfetchImpl: options?.fetch ?? fetch,\n\t\t\t\ttemperature: options?.temperature,\n\t\t\t})) {\n\t\t\t\tif (event.kind === \"text\") {\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\tif (!textOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"text\", text: \"\" });\n\t\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\ttextOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\tblock.text += event.text;\n\t\t\t\t\t\tstream.push({ type: \"text_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tif (!thinkingOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinking += event.text;\n\t\t\t\t\t\tstream.push({ type: \"thinking_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_signature\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = output.content[thinkingIndex];\n\t\t\t\t\tif (block?.type === \"thinking\") {\n\t\t\t\t\t\tconst previous = unpackThinkingSignature(block.thinkingSignature);\n\t\t\t\t\t\tblock.thinkingSignature = packThinkingSignature(\n\t\t\t\t\t\t\t(previous.signature ?? \"\") + event.signature,\n\t\t\t\t\t\t\tevent.signatureType ?? previous.signatureType,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_redacted\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = thinkingIndex >= 0 ? output.content[thinkingIndex] : undefined;\n\t\t\t\t\tif (block?.type === \"thinking\") block.redacted = true;\n\t\t\t\t} else if (event.kind === \"tool_call_start\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\ttoolId = event.id;\n\t\t\t\t\tconst existing = toolStates.get(toolId);\n\t\t\t\t\tif (existing) {\n\t\t\t\t\t\tconst block = output.content[existing.index];\n\t\t\t\t\t\tif (block.type !== \"toolCall\" || block.name !== event.name)\n\t\t\t\t\t\t\tthrow new Error(\"Devin changed a tool call's name\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (!toolId || !event.name) throw new Error(\"Devin returned an empty tool identity\");\n\t\t\t\t\toutput.content.push({ type: \"toolCall\", id: event.id, name: event.name, arguments: {} });\n\t\t\t\t\tconst toolIndex = output.content.length - 1;\n\t\t\t\t\ttoolStates.set(toolId, { index: toolIndex, json: \"\" });\n\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: toolIndex, partial: output });\n\t\t\t\t} else if (event.kind === \"tool_call_args\") {\n\t\t\t\t\tconst state = toolStates.get(event.id ?? toolId);\n\t\t\t\t\tif (!state) throw new Error(\"Devin tool argument delta has no matching call\");\n\t\t\t\t\tstate.json += event.argsDelta;\n\t\t\t\t\tconst block = output.content[state.index];\n\t\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tblock.arguments = JSON.parse(state.json);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// incomplete json\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\tdelta: event.argsDelta,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t} else if (event.kind === \"finish\") {\n\t\t\t\t\tif (event.reason === \"content_filter\")\n\t\t\t\t\t\tthrow new Error(\"Devin response was blocked by content filtering\");\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\toutput.stopReason =\n\t\t\t\t\t\tevent.reason === \"tool_calls\" ? \"toolUse\" : event.reason === \"length\" ? \"length\" : \"stop\";\n\t\t\t\t} else if (event.kind === \"usage\") {\n\t\t\t\t\toutput.usage.input = event.promptTokens ?? 0;\n\t\t\t\t\toutput.usage.output = event.completionTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheRead = event.cachedInputTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheWrite = event.cacheCreationInputTokens ?? 0;\n\t\t\t\t\toutput.usage.totalTokens =\n\t\t\t\t\t\tevent.totalTokens ??\n\t\t\t\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcloseText();\n\t\t\tcloseThinking();\n\t\t\tcloseTool();\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tif (!output.content.length) throw new Error(\"Devin returned an empty completion\");\n\t\t\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const) {\n\t\t\t\toutput.usage.cost[key] = (output.usage[key] * model.cost[key]) / 1_000_000;\n\t\t\t}\n\t\t\toutput.usage.cost.total =\n\t\t\t\toutput.usage.cost.input +\n\t\t\t\toutput.usage.cost.output +\n\t\t\t\toutput.usage.cost.cacheRead +\n\t\t\t\toutput.usage.cost.cacheWrite;\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason as \"stop\" | \"length\" | \"toolUse\", message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason as \"aborted\" | \"error\", error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n}\n"]}
1
+ {"version":3,"file":"devin-stream.js","sourceRoot":"","sources":["../../src/api/devin-stream.ts"],"names":[],"mappings":"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","sourcesContent":["/*\nMIT License\n\nCopyright (c) 2026 Kashyab Ambarani\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\nimport { randomUUID } from \"node:crypto\";\nimport * as zlib from \"node:zlib\";\nimport {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\ttype SimpleStreamOptions,\n} from \"../index.ts\";\nimport { type ChatHistoryItem, type ContentPart, mapContextToChat, type ToolDef } from \"./devin-context-map.ts\";\nimport { mintUserJwt } from \"./devin-jwt.ts\";\nimport { buildMetadata } from \"./devin-metadata.ts\";\n\nimport { type ChatThinking, packThinkingSignature, unpackThinkingSignature } from \"./devin-thinking.ts\";\nimport {\n\tencodeFixed64Field,\n\tencodeMessage,\n\tencodeString,\n\tencodeVarintField,\n\tframeConnectStream,\n\titerFields,\n} from \"./devin-wire.ts\";\n\nconst SOURCE_BY_ROLE: Record<string, number> = {\n\tuser: 1,\n\tassistant: 2,\n\ttool: 4,\n};\n\nexport type CloudChatEvent =\n\t| { kind: \"text\"; text: string }\n\t| { kind: \"reasoning\"; text: string }\n\t| { kind: \"reasoning_signature\"; signature: string; signatureType?: string }\n\t| { kind: \"reasoning_redacted\" }\n\t| { kind: \"tool_call_start\"; id: string; name: string }\n\t| { kind: \"tool_call_args\"; argsDelta: string; id?: string }\n\t| { kind: \"finish\"; reason: \"stop\" | \"tool_calls\" | \"length\" | \"content_filter\" }\n\t| {\n\t\t\tkind: \"usage\";\n\t\t\tpromptTokens?: number;\n\t\t\tcompletionTokens?: number;\n\t\t\tcachedInputTokens?: number;\n\t\t\tcacheCreationInputTokens?: number;\n\t };\n\nfunction normalizeContent(content: string | ContentPart[]): ContentPart[] {\n\tif (typeof content === \"string\") return [{ type: \"text\", text: content }];\n\treturn content;\n}\n\nfunction encodeImageData(img: { mimeType?: string; base64Data?: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, img.base64Data ?? \"\"), encodeString(2, img.mimeType ?? \"image/png\")]);\n}\n\nfunction encodeChatToolCall(tc: { id: string; name: string; arguments: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, tc.id), encodeString(2, tc.name), encodeString(3, tc.arguments)]);\n}\n\nfunction encodeChatMessagePrompt(\n\tcontent: ContentPart[],\n\tsource: number,\n\topts?: {\n\t\ttoolCallId?: string;\n\t\ttoolCalls?: Array<{ id: string; name: string; arguments: string }>;\n\t\tthinking?: ChatThinking;\n\t},\n): Buffer {\n\tconst text = content\n\t\t.filter((part) => part.type === \"text\")\n\t\t.map((part) => part.text ?? \"\")\n\t\t.join(\"\\n\");\n\tconst parts: Buffer[] = [encodeVarintField(2, source), encodeString(3, text), encodeVarintField(5, 1)];\n\tif (opts?.toolCallId) parts.push(encodeString(7, opts.toolCallId));\n\tfor (const tc of opts?.toolCalls ?? []) parts.push(encodeMessage(6, encodeChatToolCall(tc)));\n\tfor (const img of content.filter((part) => part.type === \"image\")) {\n\t\tparts.push(encodeMessage(10, encodeImageData(img)));\n\t}\n\t// 11 thinking / 12 signature / 13 thinking_redacted / 18 signature_type — the\n\t// same quartet the Devin CLI replays so the model keeps its own reasoning.\n\tif (opts?.thinking) {\n\t\tparts.push(encodeString(11, opts.thinking.text));\n\t\tparts.push(encodeString(12, opts.thinking.signature));\n\t\tif (opts.thinking.redacted) parts.push(encodeVarintField(13, 1));\n\t\tif (opts.thinking.signatureType) parts.push(encodeString(18, opts.thinking.signatureType));\n\t}\n\treturn Buffer.concat(parts);\n}\n\n/** Mirrors the Devin CLI: num_completions / max_tokens / max_newlines plus\n * temperature / top_k / top_p, and nothing else. */\nfunction encodeCompletionConfiguration(maxOutputTokens?: number, temperature?: number): Buffer {\n\treturn Buffer.concat([\n\t\tencodeVarintField(1, 1),\n\t\tencodeVarintField(2, maxOutputTokens ?? 128_000),\n\t\tencodeVarintField(3, 400),\n\t\tencodeFixed64Field(5, temperature ?? 1.0),\n\t\tencodeVarintField(7, 40),\n\t\tencodeFixed64Field(8, 0.95),\n\t]);\n}\n\n/** CortexTrajectoryReference: cascade trajectory, user-input step. */\nfunction encodeTrajectoryReference(trajectoryId: string): Buffer {\n\treturn Buffer.concat([encodeString(1, trajectoryId), encodeVarintField(3, 4), encodeVarintField(4, 14)]);\n}\n\nfunction encodeToolDef(tool: ToolDef): Buffer {\n\tconst description = tool.description;\n\treturn Buffer.concat([\n\t\tencodeString(1, tool.name),\n\t\tencodeString(2, description),\n\t\tencodeString(3, JSON.stringify(tool.parameters ?? {})),\n\t]);\n}\n\nfunction buildGetChatMessageRequest(args: {\n\tapiKey: string;\n\tuserJwt: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tcascadeId: string;\n\ttrajectoryId: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tmaxOutputTokens?: number;\n\ttemperature?: number;\n}): Buffer {\n\tconst metadata = buildMetadata({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt: args.userJwt,\n\t\tsessionId: args.sessionId,\n\t\trequestId: args.requestId,\n\t\ttriggerId: args.triggerId,\n\t});\n\tconst prompts = args.messages.map((message) =>\n\t\tencodeMessage(\n\t\t\t3,\n\t\t\tencodeChatMessagePrompt(normalizeContent(message.content), SOURCE_BY_ROLE[message.role], {\n\t\t\t\ttoolCallId: message.role === \"tool\" ? message.tool_call_id : undefined,\n\t\t\t\ttoolCalls: message.role === \"assistant\" ? message.tool_calls : undefined,\n\t\t\t\tthinking: message.role === \"assistant\" ? message.thinking : undefined,\n\t\t\t}),\n\t\t),\n\t);\n\treturn Buffer.concat([\n\t\tencodeMessage(1, metadata),\n\t\t// 2 prompt — the server's system slot, same place the Devin CLI puts its own\n\t\t// system prompt. Collapsing it into the first user turn is not equivalent.\n\t\t...(args.systemPrompt ? [encodeString(2, args.systemPrompt)] : []),\n\t\t...prompts,\n\t\tencodeVarintField(7, 5),\n\t\tencodeMessage(8, encodeCompletionConfiguration(args.maxOutputTokens, args.temperature)),\n\t\t...(args.tools ?? []).map((tool) => encodeMessage(10, encodeToolDef(tool))),\n\t\tencodeMessage(15, encodeTrajectoryReference(args.trajectoryId)),\n\t\tencodeString(16, args.cascadeId),\n\t\tencodeVarintField(20, 1),\n\t\tencodeString(21, args.modelUid),\n\t]);\n}\n\nfunction* decodeChatFrame(proto: Buffer): Generator<CloudChatEvent> {\n\tlet signature: string | undefined;\n\tlet signatureType: string | undefined;\n\tfor (const field of iterFields(proto)) {\n\t\tif (field.num === 3 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"text\", text };\n\t\t} else if (field.num === 9 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"reasoning\", text };\n\t\t} else if (field.num === 11 && field.wire === 0) {\n\t\t\t// GetChatMessageResponse.thinking_redacted\n\t\t\tif (Number(field.value) !== 0) yield { kind: \"reasoning_redacted\" };\n\t\t} else if (field.num === 10 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signature = text;\n\t\t} else if (field.num === 21 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signatureType = text;\n\t\t} else if (field.num === 6 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tlet id: string | undefined;\n\t\t\tlet name: string | undefined;\n\t\t\tlet argsDelta: string | undefined;\n\t\t\tfor (const inner of iterFields(field.value)) {\n\t\t\t\tif (inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\t\tconst text = inner.value.toString(\"utf8\");\n\t\t\t\t\tif (inner.num === 1) id = text;\n\t\t\t\t\telse if (inner.num === 2) name = text;\n\t\t\t\t\telse if (inner.num === 3) argsDelta = text;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (id !== undefined && name !== undefined) yield { kind: \"tool_call_start\", id, name };\n\t\t\tif (argsDelta !== undefined) yield { kind: \"tool_call_args\", argsDelta, ...(id ? { id } : {}) };\n\t\t} else if (field.num === 5 && field.wire === 0) {\n\t\t\tconst value = Number(field.value);\n\t\t\tlet reason: Extract<CloudChatEvent, { kind: \"finish\" }>[\"reason\"] = \"stop\";\n\t\t\tif (value === 10) reason = \"tool_calls\";\n\t\t\telse if (value === 11) reason = \"content_filter\";\n\t\t\telse if ([1, 3, 5, 9].includes(value)) reason = \"length\";\n\t\t\telse if (![0, 2, 4, 6, 8, 12].includes(value)) throw new Error(`Devin returned failure stop reason ${value}`);\n\t\t\tyield { kind: \"finish\", reason };\n\t\t} else if (field.num === 28 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst usage = decodeUsage(field.value);\n\t\t\tif (usage) yield usage;\n\t\t}\n\t}\n\t// The signature trails the thinking text, so it is yielded once the frame is\n\t// fully read and gets attached to the block that is already closed.\n\tif (signature !== undefined || signatureType !== undefined)\n\t\tyield { kind: \"reasoning_signature\", signature: signature ?? \"\", signatureType };\n}\n\nfunction decodeUsage(buf: Buffer): CloudChatEvent | null {\n\tlet promptTokens: number | undefined;\n\tlet completionTokens: number | undefined;\n\tlet cachedInputTokens: number | undefined;\n\tlet cacheCreationInputTokens: number | undefined;\n\tfor (const field of iterFields(buf)) {\n\t\tif (field.num !== 2 || field.wire !== 2 || !Buffer.isBuffer(field.value)) continue;\n\t\tlet metric: string | undefined;\n\t\tlet value: number | undefined;\n\t\tfor (const inner of iterFields(field.value)) {\n\t\t\tif (inner.num === 5 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tmetric = inner.value.toString(\"utf8\");\n\t\t\t} else if (inner.num === 4 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\t// Protobuf omits the scalar field when a present numeric metric is zero.\n\t\t\t\tvalue = 0;\n\t\t\t\tfor (const dim of iterFields(inner.value)) {\n\t\t\t\t\tif (dim.num === 2 && dim.wire === 5 && Buffer.isBuffer(dim.value)) {\n\t\t\t\t\t\tvalue = dim.value.readFloatLE(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!metric || value === undefined || !Number.isFinite(value)) continue;\n\t\tconst n = Math.round(value);\n\t\tif (metric === \"input_tokens\") promptTokens = n;\n\t\telse if (metric === \"output_tokens\") completionTokens = n;\n\t\telse if (metric === \"cached_input_tokens\" || metric === \"cache_read_input_tokens\") cachedInputTokens = n;\n\t\telse if (metric === \"cache_creation_input_tokens\") cacheCreationInputTokens = n;\n\t}\n\tif (\n\t\tpromptTokens === undefined &&\n\t\tcompletionTokens === undefined &&\n\t\tcachedInputTokens === undefined &&\n\t\tcacheCreationInputTokens === undefined\n\t)\n\t\treturn null;\n\treturn {\n\t\tkind: \"usage\",\n\t\tpromptTokens,\n\t\tcompletionTokens,\n\t\tcachedInputTokens,\n\t\tcacheCreationInputTokens,\n\t};\n}\n\nasync function* streamChatEvents(args: {\n\tapiKey: string;\n\thost: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tmaxOutputTokens?: number;\n\tsignal?: AbortSignal;\n\tsessionId?: string;\n\tfetchImpl: typeof fetch;\n\ttemperature?: number;\n}): AsyncGenerator<CloudChatEvent> {\n\tconst host = args.host.replace(/\\/$/, \"\");\n\tconst userJwt = await mintUserJwt(args.apiKey, host, args.signal, args.fetchImpl);\n\tconst sessionId = args.sessionId ?? randomUUID();\n\tconst ids = { sessionId, cascadeId: sessionId, trajectoryId: sessionId };\n\tconst proto = buildGetChatMessageRequest({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt,\n\t\tmodelUid: args.modelUid,\n\t\tsystemPrompt: args.systemPrompt,\n\t\tmessages: args.messages,\n\t\ttools: args.tools,\n\t\tcascadeId: ids.cascadeId,\n\t\ttrajectoryId: ids.trajectoryId,\n\t\tsessionId: ids.sessionId,\n\t\trequestId: BigInt(Date.now()),\n\t\ttriggerId: randomUUID(),\n\t\tmaxOutputTokens: args.maxOutputTokens,\n\t\ttemperature: args.temperature,\n\t});\n\n\tconst resp = await args.fetchImpl(`${host}/exa.api_server_pb.ApiServerService/GetChatMessage`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/connect+proto\",\n\t\t\t\"Connect-Protocol-Version\": \"1\",\n\t\t\t\"Connect-Content-Encoding\": \"gzip\",\n\t\t\t\"Connect-Accept-Encoding\": \"gzip\",\n\t\t},\n\t\tbody: new Uint8Array(frameConnectStream(proto, true)),\n\t\tsignal: args.signal,\n\t});\n\tif (!resp.ok) {\n\t\tthrow new Error(`Devin GetChatMessage failed (HTTP ${resp.status})`);\n\t}\n\tif (!resp.body) throw new Error(\"GetChatMessage returned an empty body\");\n\n\tconst reader = resp.body.getReader();\n\t// reader.closed rejects with the stream's storedError when the socket dies\n\t// mid-response; nothing awaits it -> unhandledRejection crashes the process.\n\tvoid reader.closed.catch(() => {});\n\tconst queue: Buffer[] = [];\n\tlet queued = 0;\n\tlet sawEos = false;\n\tlet trailerError: string | null = null;\n\n\tconst peek = (n: number): Buffer | null => {\n\t\tif (queued < n) return null;\n\t\tif (queue.length === 1 && queue[0].length >= n) return queue[0].subarray(0, n);\n\t\tconst parts: Buffer[] = [];\n\t\tlet remaining = n;\n\t\tfor (const chunk of queue) {\n\t\t\tif (remaining <= 0) break;\n\t\t\tif (chunk.length <= remaining) {\n\t\t\t\tparts.push(chunk);\n\t\t\t\tremaining -= chunk.length;\n\t\t\t} else {\n\t\t\t\tparts.push(chunk.subarray(0, remaining));\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t\treturn Buffer.concat(parts, n);\n\t};\n\n\tconst drop = (n: number): void => {\n\t\tqueued -= n;\n\t\tlet remaining = n;\n\t\twhile (remaining > 0 && queue.length > 0) {\n\t\t\tconst head = queue[0];\n\t\t\tif (head.length <= remaining) {\n\t\t\t\tqueue.shift();\n\t\t\t\tremaining -= head.length;\n\t\t\t} else {\n\t\t\t\tqueue[0] = head.subarray(remaining);\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t};\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { value, done } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tif (value) {\n\t\t\t\tqueue.push(Buffer.from(value));\n\t\t\t\tqueued += value.length;\n\t\t\t}\n\t\t\twhile (queued >= 5) {\n\t\t\t\tconst header = peek(5);\n\t\t\t\tif (!header) break;\n\t\t\t\tconst flags = header[0];\n\t\t\t\tconst len = header.readUInt32BE(1);\n\t\t\t\tif (flags & ~3) throw new Error(\"Invalid Devin Connect frame flags\");\n\t\t\t\tif (len > 16 * 1024 * 1024) throw new Error(\"Devin Connect frame exceeds 16 MiB\");\n\t\t\t\tif (queued < 5 + len) break;\n\t\t\t\tdrop(5);\n\t\t\t\tconst raw = peek(len) ?? Buffer.alloc(0);\n\t\t\t\tdrop(len);\n\t\t\t\tlet payload = raw;\n\t\t\t\tif (flags & 0x01) payload = zlib.gunzipSync(raw, { maxOutputLength: 16 * 1024 * 1024 });\n\t\t\t\tif (sawEos) throw new Error(\"Devin returned data after its EOS trailer\");\n\t\t\t\tif (flags & 0x02) {\n\t\t\t\t\tsawEos = true;\n\t\t\t\t\tconst parsed = JSON.parse(payload.toString(\"utf8\")) as { error?: { code?: string; message?: string } };\n\t\t\t\t\tif (parsed.error) {\n\t\t\t\t\t\tconst detail =\n\t\t\t\t\t\t\ttypeof parsed.error.message === \"string\"\n\t\t\t\t\t\t\t\t? parsed.error.message\n\t\t\t\t\t\t\t\t\t\t.replaceAll(args.apiKey, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.replaceAll(userJwt, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.slice(0, 500)\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\ttrailerError = `Devin stream failed (${parsed.error.code ?? \"unknown\"})${detail ? `: ${detail}` : \"\"}`;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tyield* decodeChatFrame(payload);\n\t\t\t}\n\t\t}\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t\ttry {\n\t\t\t// await: on an errored stream cancel() returns a rejected promise;\n\t\t\t// `void`-ing it escapes the try/catch as an unhandled rejection.\n\t\t\tawait resp.body?.cancel();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tif (trailerError) throw new Error(trailerError);\n\tif (queued) throw new Error(\"Truncated Devin Connect frame\");\n\tif (!sawEos) throw new Error(\"Devin stream ended without an EOS trailer\");\n}\n\nexport function streamDevin(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n\tconst stream = createAssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: model.api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tlet textOpen = false;\n\t\tlet thinkingOpen = false;\n\t\tlet thinkingIndex = -1;\n\t\tlet toolId = \"\";\n\t\tconst toolStates = new Map<string, { index: number; json: string }>();\n\n\t\tconst closeText = () => {\n\t\t\tif (!textOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"text\") {\n\t\t\t\tstream.push({ type: \"text_end\", contentIndex: idx, content: block.text, partial: output });\n\t\t\t}\n\t\t\ttextOpen = false;\n\t\t};\n\t\tconst closeThinking = () => {\n\t\t\tif (!thinkingOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"thinking\") {\n\t\t\t\tstream.push({ type: \"thinking_end\", contentIndex: idx, content: block.thinking, partial: output });\n\t\t\t}\n\t\t\tthinkingOpen = false;\n\t\t};\n\t\tconst closeTool = () => {\n\t\t\tfor (const state of toolStates.values()) {\n\t\t\t\tconst block = output.content[state.index];\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst parsed: unknown = JSON.parse(state.json);\n\t\t\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\t\t\t\t\tthrow new Error(\"Invalid Devin tool arguments\");\n\t\t\t\t\tblock.arguments = parsed as Record<string, unknown>;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\ttoolCall: block,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoolStates.clear();\n\t\t};\n\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\")\n\t\t\t\tthrow new Error(\"Devin inference must use pi-server in PI_SERVER_MODE\");\n\t\t\tif (!apiKey) throw new Error(\"No Devin credentials. Run /login devin.\");\n\t\t\tconst host = model.baseUrl.replace(/\\/$/, \"\");\n\t\t\tif (options?.reasoning && model.thinkingLevelMap && model.thinkingLevelMap[options.reasoning] !== model.id)\n\t\t\t\tthrow new Error(\"Select the Devin model variant for the requested reasoning effort\");\n\t\t\tif (options?.onPayload) throw new Error(\"Devin does not support onPayload overrides\");\n\t\t\tconst modelUid = model.id;\n\t\t\tconst mapped = mapContextToChat(context, model.id);\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tfor await (const event of streamChatEvents({\n\t\t\t\tapiKey,\n\t\t\t\thost,\n\t\t\t\tmodelUid,\n\t\t\t\tsystemPrompt: mapped.systemPrompt,\n\t\t\t\tmessages: mapped.messages,\n\t\t\t\ttools: mapped.tools.length > 0 ? mapped.tools : undefined,\n\t\t\t\tmaxOutputTokens: options?.maxTokens ?? model.maxTokens,\n\t\t\t\tsignal: options?.signal\n\t\t\t\t\t? AbortSignal.any([options.signal, AbortSignal.timeout(options.timeoutMs ?? 600_000)])\n\t\t\t\t\t: AbortSignal.timeout(options?.timeoutMs ?? 600_000),\n\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\tfetchImpl: options?.fetch ?? fetch,\n\t\t\t\ttemperature: options?.temperature,\n\t\t\t})) {\n\t\t\t\tif (event.kind === \"text\") {\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\tif (!textOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"text\", text: \"\" });\n\t\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\ttextOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\tblock.text += event.text;\n\t\t\t\t\t\tstream.push({ type: \"text_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tif (!thinkingOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinking += event.text;\n\t\t\t\t\t\tstream.push({ type: \"thinking_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_signature\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = output.content[thinkingIndex];\n\t\t\t\t\tif (block?.type === \"thinking\") {\n\t\t\t\t\t\tconst previous = unpackThinkingSignature(block.thinkingSignature);\n\t\t\t\t\t\tblock.thinkingSignature = packThinkingSignature(\n\t\t\t\t\t\t\t(previous.signature ?? \"\") + event.signature,\n\t\t\t\t\t\t\tevent.signatureType ?? previous.signatureType,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_redacted\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = thinkingIndex >= 0 ? output.content[thinkingIndex] : undefined;\n\t\t\t\t\tif (block?.type === \"thinking\") block.redacted = true;\n\t\t\t\t} else if (event.kind === \"tool_call_start\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\ttoolId = event.id;\n\t\t\t\t\tconst existing = toolStates.get(toolId);\n\t\t\t\t\tif (existing) {\n\t\t\t\t\t\tconst block = output.content[existing.index];\n\t\t\t\t\t\tif (block.type !== \"toolCall\" || block.name !== event.name)\n\t\t\t\t\t\t\tthrow new Error(\"Devin changed a tool call's name\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (!toolId || !event.name) throw new Error(\"Devin returned an empty tool identity\");\n\t\t\t\t\toutput.content.push({ type: \"toolCall\", id: event.id, name: event.name, arguments: {} });\n\t\t\t\t\tconst toolIndex = output.content.length - 1;\n\t\t\t\t\ttoolStates.set(toolId, { index: toolIndex, json: \"\" });\n\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: toolIndex, partial: output });\n\t\t\t\t} else if (event.kind === \"tool_call_args\") {\n\t\t\t\t\tconst state = toolStates.get(event.id ?? toolId);\n\t\t\t\t\tif (!state) throw new Error(\"Devin tool argument delta has no matching call\");\n\t\t\t\t\tstate.json += event.argsDelta;\n\t\t\t\t\tconst block = output.content[state.index];\n\t\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tblock.arguments = JSON.parse(state.json);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// incomplete json\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\tdelta: event.argsDelta,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t} else if (event.kind === \"finish\") {\n\t\t\t\t\tif (event.reason === \"content_filter\")\n\t\t\t\t\t\tthrow new Error(\"Devin response was blocked by content filtering\");\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\toutput.stopReason =\n\t\t\t\t\t\tevent.reason === \"tool_calls\" ? \"toolUse\" : event.reason === \"length\" ? \"length\" : \"stop\";\n\t\t\t\t} else if (event.kind === \"usage\") {\n\t\t\t\t\t// Metrics are reported counts, not deltas. Absent fields retain earlier reports.\n\t\t\t\t\tif (event.promptTokens !== undefined) output.usage.input = event.promptTokens;\n\t\t\t\t\tif (event.completionTokens !== undefined) output.usage.output = event.completionTokens;\n\t\t\t\t\tif (event.cachedInputTokens !== undefined) output.usage.cacheRead = event.cachedInputTokens;\n\t\t\t\t\tif (event.cacheCreationInputTokens !== undefined)\n\t\t\t\t\t\toutput.usage.cacheWrite = event.cacheCreationInputTokens;\n\t\t\t\t\toutput.usage.totalTokens =\n\t\t\t\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcloseText();\n\t\t\tcloseThinking();\n\t\t\tcloseTool();\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tif (!output.content.length) throw new Error(\"Devin returned an empty completion\");\n\t\t\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const) {\n\t\t\t\toutput.usage.cost[key] = (output.usage[key] * model.cost[key]) / 1_000_000;\n\t\t\t}\n\t\t\toutput.usage.cost.total =\n\t\t\t\toutput.usage.cost.input +\n\t\t\t\toutput.usage.cost.output +\n\t\t\t\toutput.usage.cost.cacheRead +\n\t\t\t\toutput.usage.cost.cacheWrite;\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason as \"stop\" | \"length\" | \"toolUse\", message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason as \"aborted\" | \"error\", error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n}\n"]}
@@ -1 +1 @@
1
- {"schemaVersion":3,"generatedAt":"2026-09-16T01:52:51.772Z","structureHash":"4fdb275b14dde95f461ae68e7790c8a557263f228e3f431a68ff9a7ccb0af450","files":{"amazon-bedrock.json":"843ede349a0435b8a4228733dfde8cff3baea7c134cb46fe7409ceef1b424f9c","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"c0e1cfcef8531b5d0852c0e74790290f130dbcb4591b6578bb0d8a4b464231c0","azure-openai-responses.json":"2f42741e47dbebd8491cf40bff1de313fc2221f55e16bc02fd6e5d50b5f8fefe","baseten.json":"d155c434294b5167244cffb6dea6793f9669e91e8ab65b564f9510d81b330e37","cerebras.json":"9eaa554e1b02f3665f8f63e6432d253bf81351af7c72001054dd8108aa528a52","cloudflare-ai-gateway.json":"eb2bf274394a157714072a2726675fbdfd2cc370e359b6665fa6aca409617089","cloudflare-workers-ai.json":"07ef63208ff7517fd1a80962f18143e21de399640423329490b157f459ccf995","deepseek.json":"8cc5e02a8eb3f1ead25da01d6ebac7dbd9aa5134c561026de2076cc990eb3349","fireworks.json":"f393e2f9d3ba8b00b39911ac7a688c96ad79b549ba8b9ec9403398e0eee75d29","github-copilot.json":"5ddbd26a51c3d60975dfc41c685f65ee0964b94352379f9f3dac77715f389004","google-vertex.json":"e1631109172dc1f7d7977570420a5bb86258bdd1088427e244a2c51545c4f24d","google.json":"7619bf03edd2a7acb06a2274a14b13c3a61354288abe029a758401d4de36a8fd","groq.json":"e4728fd72e358cd8f25e9a518e9b49a521ef44523d3debe38a7db9e0663c4077","huggingface.json":"a488b6f175b382277ccf7d487f877ef0c698994576bb55d2410838bf9c8c7c41","kimi-coding.json":"202d4b9a3e3327cebb01626fb1818f92627e59800f27858902c4ce69105f0bd7","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"e3a109306644bf2f2fa38fece50b2d3ce1dbe3b87b1f1b9e2d70cce7eb5c0ea1","moonshotai-cn.json":"63f77de8782dce6a8d4649b6075ee04c9732863ae85561e0867871220c558bde","moonshotai.json":"2a8dfb97eb905e991c22081dc09bd4a61c05b7fa9ac0d5c72d6930f601f490f1","nvidia.json":"7459d845fd752fb70a9be5a28be44dc5e2873fbd788e9c931d3200731db42ba9","openai-codex.json":"a10bfcfd34db6bcb98d8ee46175e154cab30530a137dbf31ac1434020ed3ffdd","openai.json":"775d3b7d95d14b741d0b287b1153d40f051a9ea03035a82b487889acc7fa69e2","opencode-go.json":"274c4fb1a4e99c286860174700b0b38997df62839efd2b76a8884db1d8dc331a","opencode.json":"7b878f5fb48e9fce68af0c3b507ddafd88a07b5ec7a8c06e9b99cf85b27324ac","openrouter.json":"c0548c18afe6f3dcc687a04e1f9508f285660238620fdd8208ce4498e64e7dd5","qwen-token-plan-cn.json":"f8f100c10968e3abcf444964452a5738d8408f08d0b18859187a034d3e573b00","qwen-token-plan-individual.json":"eb040e78595853e980011308b1bf9caacae6dc8a91abbac5ffebd402515dd2a6","qwen-token-plan.json":"f5dad46166a7c55fc7b6161cfb477c282d3f64fa301d3f472cc47f6a7e4889ec","together.json":"927c707d06f2236cdab13f14c870fb58bce0614ba7287bbcd57cc9fd66d191ed","vercel-ai-gateway.json":"757a80635ca95df93867b5993c181e9128a3f2e039c8831a7fde69f6b3fff171","xai.json":"037bde3de5ea72814c3f0b79da8b244c89feb708cc0cbf8596cdfac7682477b6","xiaomi-token-plan-ams.json":"a36446cb9e3cb4f7054617676fd711092245a74f703ba89573f21d2673b85fa8","xiaomi-token-plan-cn.json":"c295dadf4097b5d86af15e924fb2a1a6342bae9e0a9a5839c9fca216308c51e5","xiaomi-token-plan-sgp.json":"93d359575c2348c97d79a2b14e1e9437199bd4aee948d58611b3fbab75cd9fb3","xiaomi.json":"f06f1011d606d22311b1f4c50eb36d38b8cd99abf5760faee657d5559e87452b","zai-coding-cn.json":"d3c969020a7ab978497837a3301c7bca364d704082832221cfe61e6596333e56","zai.json":"f42790c77fb4681a656897a9d860b939916c0ddf979a5f16856bce9573cdf64e"}}
1
+ {"schemaVersion":3,"generatedAt":"2026-09-16T03:22:14.588Z","structureHash":"4fdb275b14dde95f461ae68e7790c8a557263f228e3f431a68ff9a7ccb0af450","files":{"amazon-bedrock.json":"843ede349a0435b8a4228733dfde8cff3baea7c134cb46fe7409ceef1b424f9c","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"c0e1cfcef8531b5d0852c0e74790290f130dbcb4591b6578bb0d8a4b464231c0","azure-openai-responses.json":"2f42741e47dbebd8491cf40bff1de313fc2221f55e16bc02fd6e5d50b5f8fefe","baseten.json":"d155c434294b5167244cffb6dea6793f9669e91e8ab65b564f9510d81b330e37","cerebras.json":"9eaa554e1b02f3665f8f63e6432d253bf81351af7c72001054dd8108aa528a52","cloudflare-ai-gateway.json":"eb2bf274394a157714072a2726675fbdfd2cc370e359b6665fa6aca409617089","cloudflare-workers-ai.json":"07ef63208ff7517fd1a80962f18143e21de399640423329490b157f459ccf995","deepseek.json":"8cc5e02a8eb3f1ead25da01d6ebac7dbd9aa5134c561026de2076cc990eb3349","fireworks.json":"f393e2f9d3ba8b00b39911ac7a688c96ad79b549ba8b9ec9403398e0eee75d29","github-copilot.json":"5ddbd26a51c3d60975dfc41c685f65ee0964b94352379f9f3dac77715f389004","google-vertex.json":"e1631109172dc1f7d7977570420a5bb86258bdd1088427e244a2c51545c4f24d","google.json":"7619bf03edd2a7acb06a2274a14b13c3a61354288abe029a758401d4de36a8fd","groq.json":"e4728fd72e358cd8f25e9a518e9b49a521ef44523d3debe38a7db9e0663c4077","huggingface.json":"a488b6f175b382277ccf7d487f877ef0c698994576bb55d2410838bf9c8c7c41","kimi-coding.json":"202d4b9a3e3327cebb01626fb1818f92627e59800f27858902c4ce69105f0bd7","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"e3a109306644bf2f2fa38fece50b2d3ce1dbe3b87b1f1b9e2d70cce7eb5c0ea1","moonshotai-cn.json":"63f77de8782dce6a8d4649b6075ee04c9732863ae85561e0867871220c558bde","moonshotai.json":"2a8dfb97eb905e991c22081dc09bd4a61c05b7fa9ac0d5c72d6930f601f490f1","nvidia.json":"7459d845fd752fb70a9be5a28be44dc5e2873fbd788e9c931d3200731db42ba9","openai-codex.json":"a10bfcfd34db6bcb98d8ee46175e154cab30530a137dbf31ac1434020ed3ffdd","openai.json":"775d3b7d95d14b741d0b287b1153d40f051a9ea03035a82b487889acc7fa69e2","opencode-go.json":"274c4fb1a4e99c286860174700b0b38997df62839efd2b76a8884db1d8dc331a","opencode.json":"7b878f5fb48e9fce68af0c3b507ddafd88a07b5ec7a8c06e9b99cf85b27324ac","openrouter.json":"c0548c18afe6f3dcc687a04e1f9508f285660238620fdd8208ce4498e64e7dd5","qwen-token-plan-cn.json":"f8f100c10968e3abcf444964452a5738d8408f08d0b18859187a034d3e573b00","qwen-token-plan-individual.json":"eb040e78595853e980011308b1bf9caacae6dc8a91abbac5ffebd402515dd2a6","qwen-token-plan.json":"f5dad46166a7c55fc7b6161cfb477c282d3f64fa301d3f472cc47f6a7e4889ec","together.json":"927c707d06f2236cdab13f14c870fb58bce0614ba7287bbcd57cc9fd66d191ed","vercel-ai-gateway.json":"757a80635ca95df93867b5993c181e9128a3f2e039c8831a7fde69f6b3fff171","xai.json":"037bde3de5ea72814c3f0b79da8b244c89feb708cc0cbf8596cdfac7682477b6","xiaomi-token-plan-ams.json":"a36446cb9e3cb4f7054617676fd711092245a74f703ba89573f21d2673b85fa8","xiaomi-token-plan-cn.json":"c295dadf4097b5d86af15e924fb2a1a6342bae9e0a9a5839c9fca216308c51e5","xiaomi-token-plan-sgp.json":"93d359575c2348c97d79a2b14e1e9437199bd4aee948d58611b3fbab75cd9fb3","xiaomi.json":"f06f1011d606d22311b1f4c50eb36d38b8cd99abf5760faee657d5559e87452b","zai-coding-cn.json":"d3c969020a7ab978497837a3301c7bca364d704082832221cfe61e6596333e56","zai.json":"f42790c77fb4681a656897a9d860b939916c0ddf979a5f16856bce9573cdf64e"}}
@@ -1 +1 @@
1
- {"version":3,"file":"devin.d.ts","sourceRoot":"","sources":["../../src/providers/devin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG7C,eAAO,MAAM,QAAQ,6CAAkC,CAAC;AAExD,6EAA6E;AAC7E,wBAAgB,aAAa,IAAI,QAAQ,CAAC,OAAO,CAAC,CAqCjD","sourcesContent":["import { lazyApi } from \"../api/lazy.ts\";\nimport { lazyOAuth } from \"../auth/helpers.ts\";\nimport { loadDevinOAuth, loadDevinRuntime } from \"../auth/oauth/load.ts\";\nimport type { Provider } from \"../models.ts\";\nimport type { Model } from \"../types.ts\";\n\nexport const devinApi = () => lazyApi(loadDevinRuntime);\n\n/** Devin Pro's account-owned model catalog and native subscription login. */\nexport function devinProvider(): Provider<\"devin\"> {\n\tlet models: Model<\"devin\">[] = [];\n\tconst streams = devinApi();\n\treturn {\n\t\tid: \"devin\",\n\t\tname: \"Devin Pro\",\n\t\tauth: { oauth: lazyOAuth({ name: \"Devin Pro\", isSubscription: true, load: loadDevinOAuth }) },\n\t\tgetModels: () => models,\n\t\trefreshModels: async (context) => {\n\t\t\tif (context.stored) {\n\t\t\t\tconst restored = context.stored.models.filter(\n\t\t\t\t\t(model) => model.provider === \"devin\" && model.api === \"devin\",\n\t\t\t\t) as Model<\"devin\">[];\n\t\t\t\tif (\n\t\t\t\t\t!(await context.publish({\n\t\t\t\t\t\tupdate: () => {\n\t\t\t\t\t\t\tmodels = restored;\n\t\t\t\t\t\t},\n\t\t\t\t\t}))\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!context.allowNetwork || context.credential?.type !== \"oauth\") return;\n\t\t\tconst refreshed = await (await loadDevinRuntime()).discoverDevinModels(\n\t\t\t\tcontext.credential.access,\n\t\t\t\tcontext.signal,\n\t\t\t);\n\t\t\tawait context.publish({\n\t\t\t\tpersist: { models: refreshed, checkedAt: Date.now() },\n\t\t\t\tupdate: () => {\n\t\t\t\t\tmodels = refreshed;\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tstream: (model, context, options) => streams.stream(model, context, options),\n\t\tstreamSimple: (model, context, options) => streams.streamSimple(model, context, options),\n\t};\n}\n"]}
1
+ {"version":3,"file":"devin.d.ts","sourceRoot":"","sources":["../../src/providers/devin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG7C,eAAO,MAAM,QAAQ,6CAAkC,CAAC;AA6FxD,6EAA6E;AAC7E,wBAAgB,aAAa,IAAI,QAAQ,CAAC,OAAO,CAAC,CAuCjD","sourcesContent":["import { DEVIN_BASE_URL } from \"../api/devin-constants.ts\";\nimport { lazyApi } from \"../api/lazy.ts\";\nimport { lazyOAuth } from \"../auth/helpers.ts\";\nimport { loadDevinOAuth, loadDevinRuntime } from \"../auth/oauth/load.ts\";\nimport type { Provider } from \"../models.ts\";\nimport type { Model } from \"../types.ts\";\n\nexport const devinApi = () => lazyApi(loadDevinRuntime);\n\n/**\n * Known model definitions used until an account catalog has been discovered.\n * Live Devin discovery remains authoritative and replaces this small fallback.\n */\nconst fallbackModels: Model<\"devin\">[] = [\n\t{\n\t\tid: \"claude-opus-5-max\",\n\t\tname: \"Claude Opus 5 Max\",\n\t\tprovider: \"devin\",\n\t\tapi: \"devin\",\n\t\tbaseUrl: DEVIN_BASE_URL,\n\t\treasoning: true,\n\t\tthinkingLevelMap: {\n\t\t\toff: null,\n\t\t\tminimal: null,\n\t\t\tlow: null,\n\t\t\tmedium: null,\n\t\t\thigh: null,\n\t\t\txhigh: null,\n\t\t\tmax: \"claude-opus-5-max\",\n\t\t},\n\t\tinput: [\"text\", \"image\"],\n\t\tcontextWindow: 1_000_000,\n\t\tmaxTokens: 128_000,\n\t\tcost: { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 0 },\n\t},\n\t{\n\t\tid: \"swe-2-high\",\n\t\tname: \"SWE-2 High\",\n\t\tprovider: \"devin\",\n\t\tapi: \"devin\",\n\t\tbaseUrl: DEVIN_BASE_URL,\n\t\treasoning: true,\n\t\tthinkingLevelMap: {\n\t\t\toff: null,\n\t\t\tminimal: null,\n\t\t\tlow: null,\n\t\t\tmedium: null,\n\t\t\thigh: \"swe-2-high\",\n\t\t\txhigh: null,\n\t\t\tmax: null,\n\t\t},\n\t\tinput: [\"text\", \"image\"],\n\t\tcontextWindow: 262_000,\n\t\tmaxTokens: 128_000,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t},\n\t{\n\t\tid: \"swe-2-max\",\n\t\tname: \"SWE-2 Max\",\n\t\tprovider: \"devin\",\n\t\tapi: \"devin\",\n\t\tbaseUrl: DEVIN_BASE_URL,\n\t\treasoning: true,\n\t\tthinkingLevelMap: {\n\t\t\toff: null,\n\t\t\tminimal: null,\n\t\t\tlow: null,\n\t\t\tmedium: null,\n\t\t\thigh: null,\n\t\t\txhigh: null,\n\t\t\tmax: \"swe-2-max\",\n\t\t},\n\t\tinput: [\"text\", \"image\"],\n\t\tcontextWindow: 262_000,\n\t\tmaxTokens: 128_000,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t},\n\t{\n\t\tid: \"swe-2-medium\",\n\t\tname: \"SWE-2 Medium\",\n\t\tprovider: \"devin\",\n\t\tapi: \"devin\",\n\t\tbaseUrl: DEVIN_BASE_URL,\n\t\treasoning: true,\n\t\tthinkingLevelMap: {\n\t\t\toff: null,\n\t\t\tminimal: null,\n\t\t\tlow: null,\n\t\t\tmedium: \"swe-2-medium\",\n\t\t\thigh: null,\n\t\t\txhigh: null,\n\t\t\tmax: null,\n\t\t},\n\t\tinput: [\"text\", \"image\"],\n\t\tcontextWindow: 262_000,\n\t\tmaxTokens: 128_000,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t},\n];\n\n/** Devin Pro's account-owned model catalog and native subscription login. */\nexport function devinProvider(): Provider<\"devin\"> {\n\tlet models: Model<\"devin\">[] = [...fallbackModels];\n\tconst streams = devinApi();\n\treturn {\n\t\tid: \"devin\",\n\t\tname: \"Devin Pro\",\n\t\tauth: { oauth: lazyOAuth({ name: \"Devin Pro\", isSubscription: true, load: loadDevinOAuth }) },\n\t\tgetModels: () => models,\n\t\trefreshModels: async (context) => {\n\t\t\tif (context.stored) {\n\t\t\t\tconst restored = context.stored.models.filter(\n\t\t\t\t\t(model) => model.provider === \"devin\" && model.api === \"devin\",\n\t\t\t\t) as Model<\"devin\">[];\n\t\t\t\tconst restoredIds = new Set(restored.map((model) => model.id));\n\t\t\t\tconst restoredWithFallback = [...restored, ...fallbackModels.filter((model) => !restoredIds.has(model.id))];\n\t\t\t\tif (\n\t\t\t\t\t!(await context.publish({\n\t\t\t\t\t\tupdate: () => {\n\t\t\t\t\t\t\tmodels = restoredWithFallback;\n\t\t\t\t\t\t},\n\t\t\t\t\t}))\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!context.allowNetwork || context.credential?.type !== \"oauth\") return;\n\t\t\tconst refreshed = await (await loadDevinRuntime()).discoverDevinModels(\n\t\t\t\tcontext.credential.access,\n\t\t\t\tcontext.signal,\n\t\t\t);\n\t\t\tawait context.publish({\n\t\t\t\tpersist: { models: refreshed, checkedAt: Date.now() },\n\t\t\t\tupdate: () => {\n\t\t\t\t\tmodels = refreshed;\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tstream: (model, context, options) => streams.stream(model, context, options),\n\t\tstreamSimple: (model, context, options) => streams.streamSimple(model, context, options),\n\t};\n}\n"]}
@@ -1,10 +1,101 @@
1
+ import { DEVIN_BASE_URL } from "../api/devin-constants.js";
1
2
  import { lazyApi } from "../api/lazy.js";
2
3
  import { lazyOAuth } from "../auth/helpers.js";
3
4
  import { loadDevinOAuth, loadDevinRuntime } from "../auth/oauth/load.js";
4
5
  export const devinApi = () => lazyApi(loadDevinRuntime);
6
+ /**
7
+ * Known model definitions used until an account catalog has been discovered.
8
+ * Live Devin discovery remains authoritative and replaces this small fallback.
9
+ */
10
+ const fallbackModels = [
11
+ {
12
+ id: "claude-opus-5-max",
13
+ name: "Claude Opus 5 Max",
14
+ provider: "devin",
15
+ api: "devin",
16
+ baseUrl: DEVIN_BASE_URL,
17
+ reasoning: true,
18
+ thinkingLevelMap: {
19
+ off: null,
20
+ minimal: null,
21
+ low: null,
22
+ medium: null,
23
+ high: null,
24
+ xhigh: null,
25
+ max: "claude-opus-5-max",
26
+ },
27
+ input: ["text", "image"],
28
+ contextWindow: 1_000_000,
29
+ maxTokens: 128_000,
30
+ cost: { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 0 },
31
+ },
32
+ {
33
+ id: "swe-2-high",
34
+ name: "SWE-2 High",
35
+ provider: "devin",
36
+ api: "devin",
37
+ baseUrl: DEVIN_BASE_URL,
38
+ reasoning: true,
39
+ thinkingLevelMap: {
40
+ off: null,
41
+ minimal: null,
42
+ low: null,
43
+ medium: null,
44
+ high: "swe-2-high",
45
+ xhigh: null,
46
+ max: null,
47
+ },
48
+ input: ["text", "image"],
49
+ contextWindow: 262_000,
50
+ maxTokens: 128_000,
51
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
52
+ },
53
+ {
54
+ id: "swe-2-max",
55
+ name: "SWE-2 Max",
56
+ provider: "devin",
57
+ api: "devin",
58
+ baseUrl: DEVIN_BASE_URL,
59
+ reasoning: true,
60
+ thinkingLevelMap: {
61
+ off: null,
62
+ minimal: null,
63
+ low: null,
64
+ medium: null,
65
+ high: null,
66
+ xhigh: null,
67
+ max: "swe-2-max",
68
+ },
69
+ input: ["text", "image"],
70
+ contextWindow: 262_000,
71
+ maxTokens: 128_000,
72
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
73
+ },
74
+ {
75
+ id: "swe-2-medium",
76
+ name: "SWE-2 Medium",
77
+ provider: "devin",
78
+ api: "devin",
79
+ baseUrl: DEVIN_BASE_URL,
80
+ reasoning: true,
81
+ thinkingLevelMap: {
82
+ off: null,
83
+ minimal: null,
84
+ low: null,
85
+ medium: "swe-2-medium",
86
+ high: null,
87
+ xhigh: null,
88
+ max: null,
89
+ },
90
+ input: ["text", "image"],
91
+ contextWindow: 262_000,
92
+ maxTokens: 128_000,
93
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
94
+ },
95
+ ];
5
96
  /** Devin Pro's account-owned model catalog and native subscription login. */
6
97
  export function devinProvider() {
7
- let models = [];
98
+ let models = [...fallbackModels];
8
99
  const streams = devinApi();
9
100
  return {
10
101
  id: "devin",
@@ -14,9 +105,11 @@ export function devinProvider() {
14
105
  refreshModels: async (context) => {
15
106
  if (context.stored) {
16
107
  const restored = context.stored.models.filter((model) => model.provider === "devin" && model.api === "devin");
108
+ const restoredIds = new Set(restored.map((model) => model.id));
109
+ const restoredWithFallback = [...restored, ...fallbackModels.filter((model) => !restoredIds.has(model.id))];
17
110
  if (!(await context.publish({
18
111
  update: () => {
19
- models = restored;
112
+ models = restoredWithFallback;
20
113
  },
21
114
  })))
22
115
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"devin.js","sourceRoot":"","sources":["../../src/providers/devin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzE,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAExD,6EAA6E;AAC7E,MAAM,UAAU,aAAa,GAAsB;IAClD,IAAI,MAAM,GAAqB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;IAC3B,OAAO;QACN,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;QAC7F,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM;QACvB,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAC5C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAC1C,CAAC;gBACtB,IACC,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC;oBACvB,MAAM,EAAE,GAAG,EAAE,CAAC;wBACb,MAAM,GAAG,QAAQ,CAAC;oBAAA,CAClB;iBACD,CAAC,CAAC;oBAEH,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,KAAK,OAAO;gBAAE,OAAO;YAC1E,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC,mBAAmB,CACrE,OAAO,CAAC,UAAU,CAAC,MAAM,EACzB,OAAO,CAAC,MAAM,CACd,CAAC;YACF,MAAM,OAAO,CAAC,OAAO,CAAC;gBACrB,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;gBACrD,MAAM,EAAE,GAAG,EAAE,CAAC;oBACb,MAAM,GAAG,SAAS,CAAC;gBAAA,CACnB;aACD,CAAC,CAAC;QAAA,CACH;QACD,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;QAC5E,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;KACxF,CAAC;AAAA,CACF","sourcesContent":["import { lazyApi } from \"../api/lazy.ts\";\nimport { lazyOAuth } from \"../auth/helpers.ts\";\nimport { loadDevinOAuth, loadDevinRuntime } from \"../auth/oauth/load.ts\";\nimport type { Provider } from \"../models.ts\";\nimport type { Model } from \"../types.ts\";\n\nexport const devinApi = () => lazyApi(loadDevinRuntime);\n\n/** Devin Pro's account-owned model catalog and native subscription login. */\nexport function devinProvider(): Provider<\"devin\"> {\n\tlet models: Model<\"devin\">[] = [];\n\tconst streams = devinApi();\n\treturn {\n\t\tid: \"devin\",\n\t\tname: \"Devin Pro\",\n\t\tauth: { oauth: lazyOAuth({ name: \"Devin Pro\", isSubscription: true, load: loadDevinOAuth }) },\n\t\tgetModels: () => models,\n\t\trefreshModels: async (context) => {\n\t\t\tif (context.stored) {\n\t\t\t\tconst restored = context.stored.models.filter(\n\t\t\t\t\t(model) => model.provider === \"devin\" && model.api === \"devin\",\n\t\t\t\t) as Model<\"devin\">[];\n\t\t\t\tif (\n\t\t\t\t\t!(await context.publish({\n\t\t\t\t\t\tupdate: () => {\n\t\t\t\t\t\t\tmodels = restored;\n\t\t\t\t\t\t},\n\t\t\t\t\t}))\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!context.allowNetwork || context.credential?.type !== \"oauth\") return;\n\t\t\tconst refreshed = await (await loadDevinRuntime()).discoverDevinModels(\n\t\t\t\tcontext.credential.access,\n\t\t\t\tcontext.signal,\n\t\t\t);\n\t\t\tawait context.publish({\n\t\t\t\tpersist: { models: refreshed, checkedAt: Date.now() },\n\t\t\t\tupdate: () => {\n\t\t\t\t\tmodels = refreshed;\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tstream: (model, context, options) => streams.stream(model, context, options),\n\t\tstreamSimple: (model, context, options) => streams.streamSimple(model, context, options),\n\t};\n}\n"]}
1
+ {"version":3,"file":"devin.js","sourceRoot":"","sources":["../../src/providers/devin.ts"],"names":[],"mappings":"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","sourcesContent":["import { DEVIN_BASE_URL } from \"../api/devin-constants.ts\";\nimport { lazyApi } from \"../api/lazy.ts\";\nimport { lazyOAuth } from \"../auth/helpers.ts\";\nimport { loadDevinOAuth, loadDevinRuntime } from \"../auth/oauth/load.ts\";\nimport type { Provider } from \"../models.ts\";\nimport type { Model } from \"../types.ts\";\n\nexport const devinApi = () => lazyApi(loadDevinRuntime);\n\n/**\n * Known model definitions used until an account catalog has been discovered.\n * Live Devin discovery remains authoritative and replaces this small fallback.\n */\nconst fallbackModels: Model<\"devin\">[] = [\n\t{\n\t\tid: \"claude-opus-5-max\",\n\t\tname: \"Claude Opus 5 Max\",\n\t\tprovider: \"devin\",\n\t\tapi: \"devin\",\n\t\tbaseUrl: DEVIN_BASE_URL,\n\t\treasoning: true,\n\t\tthinkingLevelMap: {\n\t\t\toff: null,\n\t\t\tminimal: null,\n\t\t\tlow: null,\n\t\t\tmedium: null,\n\t\t\thigh: null,\n\t\t\txhigh: null,\n\t\t\tmax: \"claude-opus-5-max\",\n\t\t},\n\t\tinput: [\"text\", \"image\"],\n\t\tcontextWindow: 1_000_000,\n\t\tmaxTokens: 128_000,\n\t\tcost: { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 0 },\n\t},\n\t{\n\t\tid: \"swe-2-high\",\n\t\tname: \"SWE-2 High\",\n\t\tprovider: \"devin\",\n\t\tapi: \"devin\",\n\t\tbaseUrl: DEVIN_BASE_URL,\n\t\treasoning: true,\n\t\tthinkingLevelMap: {\n\t\t\toff: null,\n\t\t\tminimal: null,\n\t\t\tlow: null,\n\t\t\tmedium: null,\n\t\t\thigh: \"swe-2-high\",\n\t\t\txhigh: null,\n\t\t\tmax: null,\n\t\t},\n\t\tinput: [\"text\", \"image\"],\n\t\tcontextWindow: 262_000,\n\t\tmaxTokens: 128_000,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t},\n\t{\n\t\tid: \"swe-2-max\",\n\t\tname: \"SWE-2 Max\",\n\t\tprovider: \"devin\",\n\t\tapi: \"devin\",\n\t\tbaseUrl: DEVIN_BASE_URL,\n\t\treasoning: true,\n\t\tthinkingLevelMap: {\n\t\t\toff: null,\n\t\t\tminimal: null,\n\t\t\tlow: null,\n\t\t\tmedium: null,\n\t\t\thigh: null,\n\t\t\txhigh: null,\n\t\t\tmax: \"swe-2-max\",\n\t\t},\n\t\tinput: [\"text\", \"image\"],\n\t\tcontextWindow: 262_000,\n\t\tmaxTokens: 128_000,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t},\n\t{\n\t\tid: \"swe-2-medium\",\n\t\tname: \"SWE-2 Medium\",\n\t\tprovider: \"devin\",\n\t\tapi: \"devin\",\n\t\tbaseUrl: DEVIN_BASE_URL,\n\t\treasoning: true,\n\t\tthinkingLevelMap: {\n\t\t\toff: null,\n\t\t\tminimal: null,\n\t\t\tlow: null,\n\t\t\tmedium: \"swe-2-medium\",\n\t\t\thigh: null,\n\t\t\txhigh: null,\n\t\t\tmax: null,\n\t\t},\n\t\tinput: [\"text\", \"image\"],\n\t\tcontextWindow: 262_000,\n\t\tmaxTokens: 128_000,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t},\n];\n\n/** Devin Pro's account-owned model catalog and native subscription login. */\nexport function devinProvider(): Provider<\"devin\"> {\n\tlet models: Model<\"devin\">[] = [...fallbackModels];\n\tconst streams = devinApi();\n\treturn {\n\t\tid: \"devin\",\n\t\tname: \"Devin Pro\",\n\t\tauth: { oauth: lazyOAuth({ name: \"Devin Pro\", isSubscription: true, load: loadDevinOAuth }) },\n\t\tgetModels: () => models,\n\t\trefreshModels: async (context) => {\n\t\t\tif (context.stored) {\n\t\t\t\tconst restored = context.stored.models.filter(\n\t\t\t\t\t(model) => model.provider === \"devin\" && model.api === \"devin\",\n\t\t\t\t) as Model<\"devin\">[];\n\t\t\t\tconst restoredIds = new Set(restored.map((model) => model.id));\n\t\t\t\tconst restoredWithFallback = [...restored, ...fallbackModels.filter((model) => !restoredIds.has(model.id))];\n\t\t\t\tif (\n\t\t\t\t\t!(await context.publish({\n\t\t\t\t\t\tupdate: () => {\n\t\t\t\t\t\t\tmodels = restoredWithFallback;\n\t\t\t\t\t\t},\n\t\t\t\t\t}))\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!context.allowNetwork || context.credential?.type !== \"oauth\") return;\n\t\t\tconst refreshed = await (await loadDevinRuntime()).discoverDevinModels(\n\t\t\t\tcontext.credential.access,\n\t\t\t\tcontext.signal,\n\t\t\t);\n\t\t\tawait context.publish({\n\t\t\t\tpersist: { models: refreshed, checkedAt: Date.now() },\n\t\t\t\tupdate: () => {\n\t\t\t\t\tmodels = refreshed;\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tstream: (model, context, options) => streams.stream(model, context, options),\n\t\tstreamSimple: (model, context, options) => streams.streamSimple(model, context, options),\n\t};\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@averyyy/pi-ai",
3
- "version": "0.85.1-piclient.7",
3
+ "version": "0.85.1-piclient.9",
4
4
  "description": "Unified LLM API with automatic model discovery and provider configuration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",