@skaile/workspaces 6.16.0 → 6.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/{agent-file-refresh-76NNFB4W.js → agent-file-refresh-RZWE25KN.js} +33 -33
- package/dist/{agent-file-refresh-76NNFB4W.js.map → agent-file-refresh-RZWE25KN.js.map} +1 -1
- package/dist/ai-sdk.js +4 -4
- package/dist/{asset-feeds-ON7FYHHF.js → asset-feeds-W4A2UFNX.js} +16 -16
- package/dist/{asset-feeds-ON7FYHHF.js.map → asset-feeds-W4A2UFNX.js.map} +1 -1
- package/dist/asset-manager/catalog-deployer.js +3 -3
- package/dist/asset-manager/history.js +3 -3
- package/dist/asset-manager/index.js +8 -8
- package/dist/asset-manager/installer.js +7 -7
- package/dist/asset-manager/renderers.js +4 -4
- package/dist/bridge/harnesses/claude-sdk.js +7 -7
- package/dist/bridge/harnesses/codex.js +7 -7
- package/dist/bridge/harnesses/continue.js +8 -8
- package/dist/bridge/harnesses/echo.js +3 -3
- package/dist/bridge/harnesses/gemini.js +6 -6
- package/dist/bridge/harnesses/goose.js +8 -8
- package/dist/bridge/harnesses/omp.js +5 -5
- package/dist/bridge/harnesses/opencode.js +9 -9
- package/dist/bridge/harnesses/qwen.js +6 -6
- package/dist/bridge/index.js +13 -13
- package/dist/{chunk-BTMSHGN3.js → chunk-2QNDAGYL.js} +4 -4
- package/dist/{chunk-BTMSHGN3.js.map → chunk-2QNDAGYL.js.map} +1 -1
- package/dist/{chunk-2ZDZJ7XQ.js → chunk-3O3HWR23.js} +3 -3
- package/dist/{chunk-2ZDZJ7XQ.js.map → chunk-3O3HWR23.js.map} +1 -1
- package/dist/{chunk-G5SUWZEU.js → chunk-3ZY6W7CL.js} +4 -3
- package/dist/chunk-3ZY6W7CL.js.map +1 -0
- package/dist/{chunk-2JUCWMIS.js → chunk-4BVE6JTM.js} +9 -9
- package/dist/{chunk-2JUCWMIS.js.map → chunk-4BVE6JTM.js.map} +1 -1
- package/dist/{chunk-Z23I2JA6.js → chunk-4CVRFWEY.js} +5 -5
- package/dist/{chunk-Z23I2JA6.js.map → chunk-4CVRFWEY.js.map} +1 -1
- package/dist/{chunk-PPSSDUN6.js → chunk-4YVQGPZ5.js} +3 -3
- package/dist/{chunk-PPSSDUN6.js.map → chunk-4YVQGPZ5.js.map} +1 -1
- package/dist/{chunk-ETGC2MEM.js → chunk-52HUF3DF.js} +3 -3
- package/dist/{chunk-ETGC2MEM.js.map → chunk-52HUF3DF.js.map} +1 -1
- package/dist/{chunk-Z7HLX4V2.js → chunk-57B4DG3Y.js} +4 -4
- package/dist/{chunk-Z7HLX4V2.js.map → chunk-57B4DG3Y.js.map} +1 -1
- package/dist/{chunk-WW22FS74.js → chunk-5L3UCHBK.js} +9 -9
- package/dist/{chunk-WW22FS74.js.map → chunk-5L3UCHBK.js.map} +1 -1
- package/dist/{chunk-72DYHOO2.js → chunk-6CTRJADR.js} +5 -5
- package/dist/{chunk-72DYHOO2.js.map → chunk-6CTRJADR.js.map} +1 -1
- package/dist/{chunk-3LAJJURV.js → chunk-6O7KIJUW.js} +5 -5
- package/dist/{chunk-3LAJJURV.js.map → chunk-6O7KIJUW.js.map} +1 -1
- package/dist/{chunk-EGKCKWWE.js → chunk-6PWQJMHM.js} +3 -3
- package/dist/{chunk-EGKCKWWE.js.map → chunk-6PWQJMHM.js.map} +1 -1
- package/dist/{chunk-7IW5E6LB.js → chunk-7D46CRUU.js} +12 -12
- package/dist/{chunk-7IW5E6LB.js.map → chunk-7D46CRUU.js.map} +1 -1
- package/dist/{chunk-IG4YQ7ER.js → chunk-7IKAKXMZ.js} +3 -3
- package/dist/{chunk-IG4YQ7ER.js.map → chunk-7IKAKXMZ.js.map} +1 -1
- package/dist/{chunk-4ZNKEDYH.js → chunk-AS4SKSXJ.js} +5 -5
- package/dist/{chunk-4ZNKEDYH.js.map → chunk-AS4SKSXJ.js.map} +1 -1
- package/dist/{chunk-6KV34G6A.js → chunk-AVB7NLO6.js} +6 -6
- package/dist/{chunk-6KV34G6A.js.map → chunk-AVB7NLO6.js.map} +1 -1
- package/dist/{chunk-MG6QD7GE.js → chunk-DG7OEBLI.js} +6 -6
- package/dist/{chunk-MG6QD7GE.js.map → chunk-DG7OEBLI.js.map} +1 -1
- package/dist/{chunk-4X5WXQV7.js → chunk-DTIR5W6G.js} +3 -3
- package/dist/{chunk-4X5WXQV7.js.map → chunk-DTIR5W6G.js.map} +1 -1
- package/dist/{chunk-PRB67LCK.js → chunk-E2VPBB7C.js} +11 -11
- package/dist/{chunk-PRB67LCK.js.map → chunk-E2VPBB7C.js.map} +1 -1
- package/dist/{chunk-NAQXDTF3.js → chunk-EFCRBVHL.js} +3 -3
- package/dist/{chunk-NAQXDTF3.js.map → chunk-EFCRBVHL.js.map} +1 -1
- package/dist/{chunk-ZII54C3E.js → chunk-F6EPGAES.js} +122 -50
- package/dist/chunk-F6EPGAES.js.map +1 -0
- package/dist/{chunk-VFEZUSB6.js → chunk-FURORBXE.js} +4 -4
- package/dist/{chunk-VFEZUSB6.js.map → chunk-FURORBXE.js.map} +1 -1
- package/dist/{chunk-BRAOB37W.js → chunk-GXW4B5SE.js} +51 -17
- package/dist/chunk-GXW4B5SE.js.map +1 -0
- package/dist/{chunk-SX54OQQT.js → chunk-HTQLI3OI.js} +4 -4
- package/dist/{chunk-SX54OQQT.js.map → chunk-HTQLI3OI.js.map} +1 -1
- package/dist/{chunk-TYK752MU.js → chunk-HZU5JW2F.js} +3 -3
- package/dist/{chunk-TYK752MU.js.map → chunk-HZU5JW2F.js.map} +1 -1
- package/dist/{chunk-NJ6UCY2B.js → chunk-I46MAK4H.js} +3 -3
- package/dist/{chunk-NJ6UCY2B.js.map → chunk-I46MAK4H.js.map} +1 -1
- package/dist/{chunk-PD42JZWI.js → chunk-K7IV5FY4.js} +2 -2
- package/dist/{chunk-PD42JZWI.js.map → chunk-K7IV5FY4.js.map} +1 -1
- package/dist/{chunk-2SSG5B24.js → chunk-KNOABDPY.js} +4 -4
- package/dist/{chunk-2SSG5B24.js.map → chunk-KNOABDPY.js.map} +1 -1
- package/dist/{chunk-P6FJDT35.js → chunk-LZ6C4YMX.js} +3 -3
- package/dist/{chunk-P6FJDT35.js.map → chunk-LZ6C4YMX.js.map} +1 -1
- package/dist/{chunk-TW5AP6IF.js → chunk-MZEZCRSO.js} +5 -5
- package/dist/{chunk-TW5AP6IF.js.map → chunk-MZEZCRSO.js.map} +1 -1
- package/dist/{chunk-3UYKT62L.js → chunk-N2XZSIJW.js} +244 -19
- package/dist/chunk-N2XZSIJW.js.map +1 -0
- package/dist/{chunk-65SOXO7I.js → chunk-NZAUPFIM.js} +11 -11
- package/dist/{chunk-65SOXO7I.js.map → chunk-NZAUPFIM.js.map} +1 -1
- package/dist/{chunk-OD4N5O7V.js → chunk-OLGQHP4R.js} +3 -3
- package/dist/{chunk-OD4N5O7V.js.map → chunk-OLGQHP4R.js.map} +1 -1
- package/dist/{chunk-RPRMD7XV.js → chunk-OMV4ROIO.js} +4 -4
- package/dist/{chunk-RPRMD7XV.js.map → chunk-OMV4ROIO.js.map} +1 -1
- package/dist/{chunk-H3PY5DFL.js → chunk-PC54LSZP.js} +3 -3
- package/dist/{chunk-H3PY5DFL.js.map → chunk-PC54LSZP.js.map} +1 -1
- package/dist/{chunk-U2WPJHRA.js → chunk-QZS7E3DY.js} +4 -4
- package/dist/{chunk-U2WPJHRA.js.map → chunk-QZS7E3DY.js.map} +1 -1
- package/dist/{chunk-S3UOZBGE.js → chunk-SOAQP4BI.js} +3 -3
- package/dist/{chunk-S3UOZBGE.js.map → chunk-SOAQP4BI.js.map} +1 -1
- package/dist/{chunk-FPG36VC4.js → chunk-UIAGUME5.js} +6 -6
- package/dist/{chunk-FPG36VC4.js.map → chunk-UIAGUME5.js.map} +1 -1
- package/dist/{chunk-NNJQQYHY.js → chunk-URN4G32O.js} +2 -2
- package/dist/{chunk-NNJQQYHY.js.map → chunk-URN4G32O.js.map} +1 -1
- package/dist/{chunk-CU5WY6HN.js → chunk-VAO3XYN3.js} +3 -3
- package/dist/{chunk-CU5WY6HN.js.map → chunk-VAO3XYN3.js.map} +1 -1
- package/dist/{chunk-QUIK7L3Z.js → chunk-WNT54WWX.js} +9 -9
- package/dist/{chunk-QUIK7L3Z.js.map → chunk-WNT54WWX.js.map} +1 -1
- package/dist/{chunk-T65N4CIZ.js → chunk-XHWBSC53.js} +4 -4
- package/dist/{chunk-T65N4CIZ.js.map → chunk-XHWBSC53.js.map} +1 -1
- package/dist/{chunk-KDRA6FYE.js → chunk-YKN5S7PO.js} +9 -9
- package/dist/{chunk-KDRA6FYE.js.map → chunk-YKN5S7PO.js.map} +1 -1
- package/dist/{chunk-TVRL3IPZ.js → chunk-ZEUBZV7L.js} +3 -3
- package/dist/{chunk-TVRL3IPZ.js.map → chunk-ZEUBZV7L.js.map} +1 -1
- package/dist/{chunk-U7P22GEB.js → chunk-ZHI3YMGQ.js} +4 -4
- package/dist/{chunk-U7P22GEB.js.map → chunk-ZHI3YMGQ.js.map} +1 -1
- package/dist/{chunk-6M44OQKH.js → chunk-ZKLXJV37.js} +9 -9
- package/dist/{chunk-6M44OQKH.js.map → chunk-ZKLXJV37.js.map} +1 -1
- package/dist/{claude-code-VL6UM7BZ.js → claude-code-K3QSXJ35.js} +4 -4
- package/dist/{claude-code-VL6UM7BZ.js.map → claude-code-K3QSXJ35.js.map} +1 -1
- package/dist/cli/index.js +115 -90
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/serve-preflight.d.ts +38 -0
- package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
- package/dist/cli/src/commands/serve.d.ts +7 -6
- package/dist/cli/src/commands/serve.d.ts.map +1 -1
- package/dist/connectors/config.js +2 -2
- package/dist/connectors/index.js +16 -16
- package/dist/{connectors-7EPJRVLJ.js → connectors-SBV254SC.js} +19 -19
- package/dist/{connectors-7EPJRVLJ.js.map → connectors-SBV254SC.js.map} +1 -1
- package/dist/core/index.js +3 -3
- package/dist/core/runtime-assets.js +2 -2
- package/dist/core/src/model-endpoint-config.d.ts +12 -0
- package/dist/core/src/model-endpoint-config.d.ts.map +1 -0
- package/dist/core/src/workspace-config.d.ts +6 -0
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/workspace-config.js +1 -1
- package/dist/deploy/index.js +4 -4
- package/dist/{ensure-sources-CI3JQJST.js → ensure-sources-URRZB56T.js} +22 -22
- package/dist/{ensure-sources-CI3JQJST.js.map → ensure-sources-URRZB56T.js.map} +1 -1
- package/dist/factory-assets/connectors/box.js +16 -16
- package/dist/factory-assets/connectors/deploy.js +16 -16
- package/dist/factory-assets/connectors/devserver.js +16 -16
- package/dist/factory-assets/connectors/flow/adapter.js +16 -16
- package/dist/factory-assets/connectors/flow/contract/schema.d.ts +2 -2
- package/dist/factory-assets/connectors/flow/engine.js +4 -4
- package/dist/factory-assets/connectors/flow/run-flow.js +17 -17
- package/dist/factory-assets/connectors/flow.js +16 -16
- package/dist/factory-assets/connectors/git.js +16 -16
- package/dist/factory-assets/connectors/gmail.js +16 -16
- package/dist/factory-assets/connectors/googledrive.js +16 -16
- package/dist/factory-assets/connectors/local.js +16 -16
- package/dist/factory-assets/connectors/mattermost.js +16 -16
- package/dist/factory-assets/connectors/memory.js +16 -16
- package/dist/factory-assets/connectors/minio.js +16 -16
- package/dist/factory-assets/connectors/postgres.js +16 -16
- package/dist/factory-assets/connectors/s3.js +16 -16
- package/dist/factory-assets/connectors/sharepoint.js +16 -16
- package/dist/factory-assets/connectors/sqlite.js +16 -16
- package/dist/factory-assets/connectors/static-server.js +16 -16
- package/dist/factory-assets/connectors/tunnel.js +16 -16
- package/dist/factory-assets/connectors/webdav.js +16 -16
- package/dist/factory-assets/connectors/xstate-store.js +16 -16
- package/dist/factory-assets/connectors/xstate.js +16 -16
- package/dist/{flows-6XQAYQS4.js → flows-YGBWX46B.js} +6 -6
- package/dist/{flows-6XQAYQS4.js.map → flows-YGBWX46B.js.map} +1 -1
- package/dist/{helpers-26MR5QPO.js → helpers-5FFJORMD.js} +22 -22
- package/dist/{helpers-26MR5QPO.js.map → helpers-5FFJORMD.js.map} +1 -1
- package/dist/library/index.js +4 -4
- package/dist/{library-publish-F3AKF66O.js → library-publish-AW4525ZC.js} +39 -39
- package/dist/{library-publish-F3AKF66O.js.map → library-publish-AW4525ZC.js.map} +1 -1
- package/dist/model-endpoint/index.js +7 -7
- package/dist/model-endpoint/src/server.d.ts.map +1 -1
- package/dist/model-endpoint/src/transform.d.ts +49 -0
- package/dist/model-endpoint/src/transform.d.ts.map +1 -0
- package/dist/model-endpoint/src/types.d.ts +13 -0
- package/dist/model-endpoint/src/types.d.ts.map +1 -1
- package/dist/{open-library-FVV6GG4I.js → open-library-C254HCNL.js} +25 -25
- package/dist/{open-library-FVV6GG4I.js.map → open-library-C254HCNL.js.map} +1 -1
- package/dist/{open-registry-VX2BVMS5.js → open-registry-FI6EO2PN.js} +8 -8
- package/dist/{open-registry-VX2BVMS5.js.map → open-registry-FI6EO2PN.js.map} +1 -1
- package/dist/{paths-PIWSSUUG.js → paths-FYPFJ437.js} +6 -6
- package/dist/{paths-PIWSSUUG.js.map → paths-FYPFJ437.js.map} +1 -1
- package/dist/plugin-registry/index.js +1 -1
- package/dist/plugin-registry/src/context.d.ts +6 -0
- package/dist/plugin-registry/src/context.d.ts.map +1 -1
- package/dist/plugin-registry/src/index.d.ts +4 -3
- package/dist/plugin-registry/src/index.d.ts.map +1 -1
- package/dist/plugin-registry/src/internal.d.ts.map +1 -1
- package/dist/plugin-registry/src/model-transform.d.ts +15 -0
- package/dist/plugin-registry/src/model-transform.d.ts.map +1 -0
- package/dist/plugin-registry/src/registry.d.ts +5 -5
- package/dist/plugin-registry/src/registry.d.ts.map +1 -1
- package/dist/plugin-registry/src/targets.d.ts +17 -2
- package/dist/plugin-registry/src/targets.d.ts.map +1 -1
- package/dist/{plugin-store-MVTW6G7J.js → plugin-store-ITA3IADY.js} +7 -7
- package/dist/{plugin-store-MVTW6G7J.js.map → plugin-store-ITA3IADY.js.map} +1 -1
- package/dist/{project-GFQP4TW6.js → project-7XU7YX3Q.js} +35 -35
- package/dist/{project-GFQP4TW6.js.map → project-7XU7YX3Q.js.map} +1 -1
- package/dist/resolver/index.js +3 -3
- package/dist/runner/composition-content.js +5 -5
- package/dist/runner/index.js +26 -26
- package/dist/runner/src/external-mcp.d.ts +32 -7
- package/dist/runner/src/external-mcp.d.ts.map +1 -1
- package/dist/runner/src/model-endpoint-discovery.d.ts +18 -0
- package/dist/runner/src/model-endpoint-discovery.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +8 -8
- package/dist/sdk/bridge.js +13 -13
- package/dist/sdk/core.js +3 -3
- package/dist/sdk/flow.js +4 -4
- package/dist/sdk/index.js +26 -26
- package/dist/sdk/resolver.js +3 -3
- package/dist/sdk/runner.js +26 -26
- package/dist/sdk/transport/ws/server.js +4 -4
- package/dist/sdk/transport/ws.js +4 -4
- package/dist/sdk/transport.js +4 -4
- package/dist/{serve-preflight-XJS5OZML.js → serve-preflight-A43HQQXD.js} +81 -25
- package/dist/serve-preflight-A43HQQXD.js.map +1 -0
- package/dist/{setup-BFEBJLYF.js → setup-WD7XTLDA.js} +23 -23
- package/dist/{setup-BFEBJLYF.js.map → setup-WD7XTLDA.js.map} +1 -1
- package/dist/{skills-OCG7B5CL.js → skills-XH6OG32W.js} +5 -5
- package/dist/{skills-OCG7B5CL.js.map → skills-XH6OG32W.js.map} +1 -1
- package/dist/{source-P6JPZYWP.js → source-25TTNBDK.js} +37 -37
- package/dist/{source-P6JPZYWP.js.map → source-25TTNBDK.js.map} +1 -1
- package/dist/{source-manifest-publish-XBFHEURV.js → source-manifest-publish-QJTPZQBN.js} +39 -39
- package/dist/{source-manifest-publish-XBFHEURV.js.map → source-manifest-publish-QJTPZQBN.js.map} +1 -1
- package/dist/transport/index.js +4 -4
- package/dist/transport/ws/server.js +4 -4
- package/dist/transport/ws.js +4 -4
- package/dist/tui/index.js +26 -26
- package/dist/workspace-plugin/adapters/mcp.js +19 -19
- package/dist/workspace-plugin/adapters/omp.js +14 -14
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-3UYKT62L.js.map +0 -1
- package/dist/chunk-BRAOB37W.js.map +0 -1
- package/dist/chunk-G5SUWZEU.js.map +0 -1
- package/dist/chunk-ZII54C3E.js.map +0 -1
- package/dist/serve-preflight-XJS5OZML.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../model-endpoint/src/types.ts","../model-endpoint/src/resolve.ts","../model-endpoint/src/openai-agent.ts","../model-endpoint/src/openai-shared.ts","../model-endpoint/src/openai-chat.ts","../model-endpoint/src/openai-responses.ts","../model-endpoint/src/transform.ts","../model-endpoint/src/upstream-models.ts","../model-endpoint/src/usage-cost.ts","../model-endpoint/src/server.ts"],"names":["chunk","parseTools","item","isRecord"],"mappings":"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","file":"chunk-N2XZSIJW.js","sourcesContent":["/**\n * Shared types of the model endpoint.\n *\n * No import from pi-ai lives here, not even a type-only one: this file is part of\n * the public `.d.ts` of `@skaile/workspaces/model-endpoint`, and pi-ai is an\n * optional peer. A consumer without it must still type-check (p1007). The shapes\n * below describe what the server needs of pi-ai structurally; `server.ts` and\n * `resolve.ts` cast to pi-ai's own types at the call into pi-ai.\n */\n\nimport type { MergedAIProviderRegistry } from \"@skaile/workspaces/core/provider-registry\";\nimport type { ModelTransform } from \"@skaile/workspaces/plugin-registry\";\nimport type { AgentEvent } from \"@skaile/workspaces/types\";\n\n/** The fields of a pi-ai `Model` the endpoint sets (pi-ai's own type is assignable to it). */\nexport interface PiModel {\n /** Provider-side model id (`model_map`). */\n id: string;\n /** Logical id the caller asked for. */\n name: string;\n /** Surface of the registry entry (pi-ai `Api`). */\n api: string;\n /** Registry id of the entry. */\n provider: string;\n /** pi-ready entry endpoint. */\n baseUrl: string;\n input: Array<\"text\" | \"image\">;\n cost: { input: number; output: number; cacheRead: number; cacheWrite: number };\n reasoning: boolean;\n contextWindow: number;\n maxTokens: number;\n headers?: Record<string, string>;\n}\n\n/** Everything one upstream call needs. */\nexport interface ResolvedModel {\n /** Registry id of the entry the model routes to. */\n providerId: string;\n /** Model id the caller asked for, after `@role` / provider-prefix stripping. */\n logicalId: string;\n /** pi model: `api` = entry surface, `baseUrl` = pi-ready entry endpoint, `id` = provider-side id (`model_map`). */\n model: PiModel;\n /** Resolved credential; `undefined` only for entries with an ambient credential chain. */\n apiKey?: string;\n /** Static `entry.headers`. */\n headers?: Record<string, string>;\n}\n\n/** One request-log line sink. */\nexport type ModelEndpointLog = (line: string) => void;\n\n/**\n * pi-ai's per-surface `stream`, widened to the shape the server calls. The\n * context and the event type are pi-ai's `TranscriptContext` and\n * `AssistantMessageEventStream`.\n */\nexport type StreamFn = (\n model: PiModel,\n context: unknown,\n options?: Record<string, unknown>,\n) => AsyncIterable<unknown>;\n\n/** The parts of a pi-ai `api/<surface>` module the server calls. */\nexport interface PiApiModule {\n stream: StreamFn;\n streamSimple?: StreamFn;\n}\n\n/** Options of `startModelEndpoint`. */\nexport interface ModelEndpointOptions {\n /** Live registry view; read on every request so a `session_init` can swap it. */\n getRegistry(): MergedAIProviderRegistry;\n /** Env that credential refs and `SKAILE_AIP_<ID>_KEY` values resolve against; read per request. */\n getLookupEnv(): Record<string, string | undefined>;\n /** Roles table for `@role` selectors. */\n getRoles?(): Record<string, string> | undefined;\n /** Bearer token every request must present. */\n token: string;\n /** Bind address. Default `\"127.0.0.1\"`. */\n host?: string;\n /** Bind port. Default `0` (ephemeral). */\n port?: number;\n /**\n * Project directory pi-ai is looked up from first (`<projectDir>/node_modules`);\n * the copy next to skaile is the fallback. Default: the current directory.\n */\n projectDir?: string;\n /** Request-log sink. */\n log?: ModelEndpointLog;\n /**\n * Test seam: override pi-ai api loading. Default: dynamic import of `@earendil-works/pi-ai/api/<surface>`.\n * `streamSimple` (every pi api module exports it) is used when the request asks for reasoning:\n * only it maps a provider-neutral thinking level onto the surface's own effort field.\n */\n loadApi?(surface: string): Promise<PiApiModule>;\n /** Test seam for the `/v1/embeddings` pass-through and for the upstream calls of openai-completions chat requests. Default `globalThis.fetch`. */\n fetch?: typeof fetch;\n /**\n * The running workspace agent, read per request (the runner rebuilds its session on\n * `session_init`). `undefined` (or absent) turns the `skaile-agent` pseudo-model off:\n * it is then unknown (404 `model_not_found`) and not listed in `/v1/models`.\n */\n getAgentLoop?(): AgentLoop | undefined;\n /**\n * Pseudo-model transforms by id: `<id>/<providerId>/<model>` runs the request to `<providerId>/<model>`\n * through the transform the factory builds. Built on first use, once per endpoint; a rejected build is\n * retried on the next request. An id not in the map is no prefix: the model goes to `resolveModel` as is.\n */\n transforms?: Readonly<Record<string, () => Promise<ModelTransform>>>;\n /**\n * The ids of `transforms` that `GET /v1/models` lists (`<id>/<model>` entries and `transform_prefixes`).\n * Default: every id of `transforms`. An id of `transforms` not listed here is still a prefix, so a\n * request to it reaches its factory (which may reject), but a client discovering models never sees it.\n */\n enabledTransforms?: readonly string[];\n}\n\n/** A running endpoint. */\nexport interface ModelEndpointHandle {\n /** `http://${host}:${port}/v1` — what an OpenAI SDK takes as `baseURL`. */\n url: string;\n port: number;\n token: string;\n close(): Promise<void>;\n}\n\n/** The pseudo-model id under which the endpoint offers the running workspace agent. */\nexport const AGENT_MODEL_ID = \"skaile-agent\";\n\n/** One prompt the endpoint hands the running workspace agent. */\nexport interface AgentLoopPrompt {\n /** The text of the request's last `user` message. */\n text: string;\n /** Unique per HTTP request; the runner uses it as the prompt's sender and message id. */\n requestId: string;\n}\n\n/** One running (or queued) agent turn. */\nexport interface AgentLoopRun {\n /**\n * Wire events of this turn only, in send order, from the moment the turn takes the\n * harness. Ends after `finished`, or after `question` (a parked question ends the\n * turn without `finished`), or when the prompt ended without a harness turn (flow\n * hand-off, aborted while queued).\n */\n events: AsyncIterable<AgentEvent>;\n /** Queued: leave the queue. Running: abort the harness turn (same path as `cancel`). Idempotent. */\n abort(): Promise<void>;\n}\n\n/** The running workspace agent, as the endpoint drives it. */\nexport interface AgentLoop {\n /** Rejects with `ModelEndpointError(503, …, \"session_not_ready\")` when no live session can take a prompt. */\n prompt(prompt: AgentLoopPrompt): Promise<AgentLoopRun>;\n}\n\n/** The OpenAI error `type` values the endpoint emits. */\nexport type ModelEndpointErrorType =\n | \"invalid_request_error\"\n | \"authentication_error\"\n | \"not_found_error\"\n | \"upstream_error\"\n | \"server_error\";\n\n/**\n * A failure with a defined HTTP shape. Translators and the resolver throw it\n * so the server can render the OpenAI-style `{ error: {...} }` body without\n * each call site knowing about HTTP.\n */\nexport class ModelEndpointError extends Error {\n readonly status: number;\n readonly type: ModelEndpointErrorType;\n readonly code?: string;\n\n constructor(status: number, message: string, code?: string, type?: ModelEndpointErrorType) {\n super(message);\n this.name = \"ModelEndpointError\";\n this.status = status;\n this.type = type ?? defaultErrorType(status);\n if (code !== undefined) this.code = code;\n }\n}\n\n/** Default OpenAI `type` for an HTTP status. */\nfunction defaultErrorType(status: number): ModelEndpointErrorType {\n if (status === 401 || status === 403) return \"authentication_error\";\n if (status === 404) return \"not_found_error\";\n if (status === 502 || status === 503 || status === 504) return \"upstream_error\";\n if (status >= 500 && status !== 501) return \"server_error\";\n return \"invalid_request_error\";\n}\n","/**\n * Registry → pi `Model` + request auth.\n *\n * Reuses the registry's own resolution (`parseModelRef`, `entrySurface`,\n * `entryBaseUrl`, `entryCredentialValue`) so the endpoint routes exactly like a\n * harness does; the only logic added here is the pi-specific base-URL\n * spelling and the \"unknown model\" check `parseModelRef` does not make.\n */\n\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport {\n type AIProviderLlmEntry,\n type AIProviderSurface,\n type MergedAIProviderRegistry,\n parseModelRef,\n type ResolvedModelRef,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { entryCredentialValue } from \"../../bridge/src/provider-materialize/credential-env.js\";\nimport {\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n selectableEntries,\n} from \"../../bridge/src/provider-materialize/env-harnesses.js\";\nimport { ModelEndpointError, type ResolvedModel } from \"./types.js\";\nimport type { UpstreamModels } from \"./upstream-models.js\";\n\n/** What {@link resolveModel} reads from the live session. */\nexport interface ResolveDeps {\n registry: MergedAIProviderRegistry;\n lookupEnv: Record<string, string | undefined>;\n roles?: Record<string, string>;\n /** What the upstreams of the open entries list; read for a bare id no entry declares. */\n upstreamModels?: UpstreamModels;\n}\n\n/** Context window assumed when an entry declares no `capabilities`. */\nconst DEFAULT_CONTEXT_WINDOW = 128_000;\n/** pi requires a max-token figure; the caller's `max_tokens` overrides it per request. */\nconst DEFAULT_MAX_TOKENS = 8192;\n/** Placeholder for keyless entries: pi's OpenAI adapter refuses an empty key. */\nconst KEYLESS_PLACEHOLDER = \"unused\";\n\n/**\n * The `baseUrl` pi-ai wants for a registry endpoint — the registry's canonical\n * value, minus trailing slashes. Verified against pi-ai 1.3.0 `dist/api/*`:\n *\n * - `anthropic-messages`: `new Anthropic({ baseURL: model.baseUrl })`; the SDK\n * appends `/v1/messages`. The registry stores Anthropic as its host root\n * (`normalizeEntryBaseUrl` strips a trailing `/v1`), which is what the SDK needs.\n * - `openai-completions` / `openai-responses`: `new OpenAI({ baseURL })`; the SDK\n * appends `/chat/completions` / `/responses`. OpenAI-style presets already carry\n * their `/v1` (openai, groq, openrouter, mistral, xai); deepseek serves the\n * same paths at its host root.\n * - `google-generative-ai`: pi sets `apiVersion: \"\"` and expects the version in\n * `baseUrl`; the preset already ends in `/v1beta`.\n * - Other surfaces (azure, bedrock, vertex, codex) are passed through unverified.\n *\n * Trailing slashes are dropped because Google's client concatenates `baseUrl` and\n * the path without normalising.\n */\nfunction piBaseUrl(_surface: AIProviderSurface, registryBaseUrl: string): string {\n return registryBaseUrl.replace(/\\/+$/, \"\");\n}\n\n/**\n * Resolve a request's `model` selector to everything one upstream call needs.\n *\n * The selector is `<providerId>/<model>`, a bare model id, or `@role`\n * (see `parseModelRef`). An entry that declares models (`model_map` /\n * `capabilities`) is a closed list: ids outside it are 404, matching what\n * `/v1/models` advertises. An entry that declares none is open: `<entry>/<id>` forwards the\n * id to the provider unchanged (discovery-based presets), and a bare id reaches it only when\n * its upstream lists the id.\n */\nexport function resolveModel(selector: string, deps: ResolveDeps): ResolvedModel {\n assertKnownProviderPrefix(selector, deps);\n const parsed = parseModelRef(selector, deps.registry, deps.roles);\n if (!parsed || parsed.modelId === undefined) {\n throw new ModelEndpointError(404, `model '${selector}' not found`, \"model_not_found\");\n }\n const logicalId = parsed.modelId;\n const ref = parsed.fallback ? placeUndeclaredBareId(selector, logicalId, parsed, deps) : parsed;\n const found = selectableEntries(deps.registry).find(([id]) => id === ref.providerId);\n if (!found) {\n throw new ModelEndpointError(404, `model '${selector}' not found`, \"model_not_found\");\n }\n const [providerId, entry] = found;\n\n const declared = entryModelIds(entry);\n if (declared.length > 0 && !declared.some(([id]) => id === logicalId)) {\n throw new ModelEndpointError(\n 404,\n `model '${logicalId}' is not declared by provider '${providerId}'`,\n \"model_not_found\",\n );\n }\n\n const surface = entrySurface(entry);\n const baseUrl = entryBaseUrl(entry);\n if (!surface || !baseUrl) {\n throw new ModelEndpointError(\n 502,\n `provider '${providerId}' is incomplete: it needs a surface and a base_url`,\n \"provider_incomplete\",\n );\n }\n\n const providerModelId = ref.providerModelId ?? logicalId;\n const caps = entry.capabilities?.[logicalId];\n const model: Model<Api> = {\n id: providerModelId,\n name: logicalId,\n api: surface,\n provider: providerId,\n baseUrl: piBaseUrl(surface, baseUrl),\n input: caps?.images === false ? [\"text\"] : [\"text\", \"image\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n reasoning: true,\n contextWindow: caps?.context_window ?? DEFAULT_CONTEXT_WINDOW,\n maxTokens: DEFAULT_MAX_TOKENS,\n ...(entry.headers ? { headers: entry.headers } : {}),\n };\n\n const apiKey =\n entryCredentialValue(providerId, entry, { env: deps.lookupEnv, allowCommand: false }) ??\n (isKeyless(entry) ? KEYLESS_PLACEHOLDER : undefined);\n\n return {\n providerId,\n logicalId,\n model,\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(entry.headers ? { headers: entry.headers } : {}),\n };\n}\n\n/**\n * Whether `selector` is a bare model id no entry declares: only an upstream that lists\n * it can take it, so the caller fetches the upstream lists before {@link resolveModel}.\n */\nexport function needsUpstreamModels(selector: string, deps: ResolveDeps): boolean {\n const ref = parseModelRef(selector, deps.registry, deps.roles);\n return ref?.modelId !== undefined && ref.fallback === true;\n}\n\n/**\n * A bare id no entry declares goes to the open entry whose upstream lists it, and is 404\n * otherwise: it is a typo, and sending it to the first entry would hand that entry's\n * credential to a name nobody chose.\n */\nfunction placeUndeclaredBareId(\n selector: string,\n modelId: string,\n ref: ResolvedModelRef,\n deps: ResolveDeps,\n): ResolvedModelRef {\n const owner = selectableEntries(deps.registry).find(\n ([id, entry]) => entryModelIds(entry).length === 0 && deps.upstreamModels?.[id]?.has(modelId),\n );\n if (owner) {\n return { ...ref, providerId: owner[0], providerModelId: modelId, fallback: undefined };\n }\n const providers = selectableEntries(deps.registry).map(([id]) => id);\n throw new ModelEndpointError(\n 404,\n `model '${selector}' not found: no provider of this endpoint declares or lists '${modelId}'; name it '<provider>/<model>' (providers: ${providers.join(\", \")}) or add it to a model_map`,\n \"model_not_found\",\n );\n}\n\n/**\n * `<x>/<y>` whose `<x>` is no entry is a typo, not a vendor-scoped bare id: sent\n * upstream it would reach the first entry and fail there (or worse, succeed). It\n * is 404, unless an entry declares the whole string in its `model_map` /\n * `capabilities`. A model of an open entry is named `<entry>/<id>`\n * (`openrouter/meta-llama/x`).\n */\nfunction assertKnownProviderPrefix(selector: string, deps: ResolveDeps): void {\n let target = selector.trim();\n if (target.startsWith(\"@\")) target = deps.roles?.[target.slice(1)]?.trim() ?? \"\";\n const slash = target.indexOf(\"/\");\n if (slash <= 0 || target.startsWith(\"@\")) return;\n const entries = selectableEntries(deps.registry);\n const head = target.slice(0, slash);\n if (entries.some(([id]) => id === head)) return;\n if (\n entries.some(\n ([, entry]) => entry.model_map?.[target] !== undefined || entry.capabilities?.[target],\n )\n ) {\n return;\n }\n throw new ModelEndpointError(\n 404,\n `model '${selector}' not found: '${head}' is not a provider of this endpoint (providers: ${entries.map(([id]) => id).join(\", \")})`,\n \"model_not_found\",\n );\n}\n\n/** True when the entry names no credential at all (local runtimes such as Ollama). */\nfunction isKeyless(entry: AIProviderLlmEntry): boolean {\n return !entry.preset && (!entry.credential || entry.credential.kind === \"none\");\n}\n\n/**\n * Ids of the entries that declare no models: any `<id>/<model>` is forwarded to\n * them as is, so `/v1/models` cannot list models for them.\n */\nexport function listPassThroughProviders(registry: MergedAIProviderRegistry): string[] {\n return selectableEntries(registry)\n .filter(([, entry]) => entryModelIds(entry).length === 0)\n .map(([providerId]) => providerId);\n}\n\n/**\n * Every model a caller can name, as `/v1/models` entries: ids are\n * `<providerId>/<logicalId>` so two providers serving the same logical id stay\n * distinguishable. Bare logical ids remain accepted on request.\n */\nexport function listModels(\n registry: MergedAIProviderRegistry,\n upstreamModels: UpstreamModels = {},\n): Array<{ id: string; owned_by: string }> {\n return selectableEntries(registry).flatMap(([providerId, entry]) => {\n const ids = entryModelIds(entry).map(([logicalId]) => logicalId);\n // An open entry lists what its upstream lists.\n if (ids.length === 0) ids.push(...(upstreamModels[providerId] ?? []));\n return ids.map((logicalId) => ({ id: `${providerId}/${logicalId}`, owned_by: providerId }));\n });\n}\n","/**\n * The `skaile-agent` pseudo-model on `POST /v1/chat/completions`: the running\n * workspace agent's turn, expressed as an OpenAI chat completion.\n *\n * Mirrors `openai-chat.ts`, but its input is the agent's wire events\n * (`AgentEvent`), not pi events. The answer text is `content`; what the agent did\n * on the way (tool calls and results, non-fatal errors, retractions) is\n * `reasoning_content`, one line each.\n */\n\nimport type { AgentEvent } from \"@skaile/workspaces/types\";\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionChunkDelta,\n ChatCompletionRequest,\n ChatCompletionUsage,\n ChatFinishReason,\n ChatResponseMeta,\n} from \"./openai-chat.js\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Longest tool input, in characters, a `reasoning_content` line carries. */\nconst MAX_INPUT_CHARS = 200;\n\ntype FinishedEvent = Extract<AgentEvent, { type: \"finished\" }>;\n\n// ── request ─────────────────────────────────────────────────────────────────\n\n/**\n * The text to hand the agent: the last `user` message of the request. Earlier\n * messages (system, assistant, older user turns) are ignored because the agent\n * session keeps its own context; `tools`, `tool_choice` and the sampling\n * parameters are ignored because the agent runs its workspace tools.\n */\nexport function agentPromptText(request: ChatCompletionRequest): string {\n const messages = request.context.messages;\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message?.role !== \"user\") continue;\n if (typeof message.content === \"string\") return message.content;\n let text = \"\";\n for (const part of message.content) {\n if (part.type === \"image\") {\n throw new ModelEndpointError(400, \"skaile-agent takes text only\", \"unsupported_content\");\n }\n text += part.text;\n }\n return text;\n }\n throw new ModelEndpointError(\n 400,\n \"messages must contain a message with role 'user'\",\n \"missing_user_message\",\n );\n}\n\n// ── event → text ────────────────────────────────────────────────────────────\n\nfunction truncated(text: string): string {\n return text.length > MAX_INPUT_CHARS ? `${text.slice(0, MAX_INPUT_CHARS)}…` : text;\n}\n\n/** The `reasoning_content` line an activity event stands for; `undefined` for events that have none. */\nfunction activityLine(event: AgentEvent): string | undefined {\n switch (event.type) {\n case \"tool_call\": {\n const input = JSON.stringify(event.input);\n return `→ ${event.tool}${input === undefined ? \"\" : ` ${truncated(input)}`}\\n`;\n }\n case \"tool_result\":\n return `← ${event.tool}\\n`;\n case \"error\":\n return event.fatal ? undefined : `! ${event.message}\\n`;\n default:\n return undefined;\n }\n}\n\n/** A question as plain text: the question, then its options as a numbered list. */\nfunction questionText(event: Extract<AgentEvent, { type: \"question\" }>): string {\n const options = event.options ?? [];\n if (options.length === 0) return event.question;\n return `${event.question}\\n${options.map((option, i) => `${i + 1}. ${option}`).join(\"\\n\")}`;\n}\n\n/** Whether `event` is the last one a turn's completion needs: the turn finished or parked on a question. */\nexport function endsAgentTurn(event: AgentEvent): boolean {\n return event.type === \"finished\" || event.type === \"question\";\n}\n\nfunction toAgentUsage(finished: FinishedEvent | undefined): ChatCompletionUsage {\n const tokens = finished?.tokens;\n const prompt = tokens?.inputTokens ?? 0;\n const completion = tokens?.outputTokens ?? 0;\n const usage: ChatCompletionUsage = {\n prompt_tokens: prompt,\n completion_tokens: completion,\n total_tokens: tokens?.totalTokens ?? prompt + completion,\n prompt_tokens_details: { cached_tokens: tokens?.cacheReadTokens ?? 0 },\n };\n if (tokens?.reasoningTokens !== undefined) {\n usage.completion_tokens_details = { reasoning_tokens: tokens.reasoningTokens };\n }\n if (finished !== undefined && finished.costUsd > 0) usage.cost = finished.costUsd;\n return usage;\n}\n\n// ── non-streaming ───────────────────────────────────────────────────────────\n\n/**\n * Folds one turn's events into a chat completion. Reads `events` until the turn\n * ends (`finished` or `question`) or the iterable does. A fatal `error` becomes a\n * 502 `turn_failed`, like an upstream failure on the model path.\n */\nexport async function toAgentCompletion(\n events: AsyncIterable<AgentEvent>,\n meta: ChatResponseMeta,\n): Promise<ChatCompletion> {\n let content = \"\";\n let reasoning = \"\";\n let failure: string | undefined;\n let finished: FinishedEvent | undefined;\n for await (const event of events) {\n if (event.type === \"text\") {\n content += event.content;\n } else if (event.type === \"text_retract\") {\n // Only a suffix of what the client already holds can be taken back.\n if (event.content.length > 0 && content.endsWith(event.content)) {\n content = content.slice(0, -event.content.length);\n }\n } else if (event.type === \"error\" && event.fatal) {\n failure ??= event.message;\n } else if (event.type === \"question\") {\n content += content.length > 0 ? `\\n${questionText(event)}` : questionText(event);\n } else if (event.type === \"finished\") {\n finished = event;\n } else {\n reasoning += activityLine(event) ?? \"\";\n }\n if (endsAgentTurn(event)) break;\n }\n if (failure !== undefined) {\n throw new ModelEndpointError(502, failure, \"turn_failed\", \"upstream_error\");\n }\n return {\n id: meta.id,\n object: \"chat.completion\",\n created: meta.created,\n model: meta.model,\n choices: [\n {\n index: 0,\n message: {\n role: \"assistant\",\n content: content.length > 0 ? content : null,\n ...(reasoning.length > 0 ? { reasoning_content: reasoning } : {}),\n },\n finish_reason: \"stop\",\n },\n ],\n usage: toAgentUsage(finished),\n };\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\n/** Mutable per-stream mapper state. */\nexport interface AgentStreamState {\n readonly id: string;\n readonly created: number;\n readonly model: string;\n readonly includeUsage: boolean;\n /** Set by a fatal `error` event; the server follows the final chunks with its SSE error frame. */\n error?: string;\n /** The role chunk went out. */\n started: boolean;\n /** The closing chunk (finish reason) went out. */\n closed: boolean;\n /** Answer text went out (a question after it starts on a new line). */\n hasContent: boolean;\n}\n\nexport function createAgentStreamState(init: {\n id: string;\n created: number;\n model: string;\n includeUsage: boolean;\n}): AgentStreamState {\n return { ...init, started: false, closed: false, hasContent: false };\n}\n\nfunction chunk(\n state: AgentStreamState,\n delta: ChatCompletionChunkDelta,\n finish: ChatFinishReason | null = null,\n): ChatCompletionChunk {\n return {\n id: state.id,\n object: \"chat.completion.chunk\",\n created: state.created,\n model: state.model,\n choices: [{ index: 0, delta, finish_reason: finish }],\n };\n}\n\nfunction closingChunks(\n state: AgentStreamState,\n finished: FinishedEvent | undefined,\n): ChatCompletionChunk[] {\n state.closed = true;\n const chunks = [chunk(state, {}, \"stop\")];\n if (state.includeUsage) {\n chunks.push({\n id: state.id,\n object: \"chat.completion.chunk\",\n created: state.created,\n model: state.model,\n choices: [],\n usage: toAgentUsage(finished),\n });\n }\n return chunks;\n}\n\nfunction agentDeltas(event: AgentEvent, state: AgentStreamState): ChatCompletionChunk[] {\n switch (event.type) {\n case \"text\":\n if (event.content.length === 0) return [];\n state.hasContent = true;\n return [chunk(state, { content: event.content })];\n case \"text_retract\":\n // The bytes are out; a stream cannot take them back. Say so on the side channel.\n return [chunk(state, { reasoning_content: `~ retracted ${event.content.length} chars\\n` })];\n case \"question\": {\n const text = questionText(event);\n const content = state.hasContent ? `\\n${text}` : text;\n return [chunk(state, { content }), ...closingChunks(state, undefined)];\n }\n case \"finished\":\n return closingChunks(state, event);\n default: {\n if (event.type === \"error\" && event.fatal) {\n state.error ??= event.message;\n return [];\n }\n const line = activityLine(event);\n return line === undefined ? [] : [chunk(state, { reasoning_content: line })];\n }\n }\n}\n\n/**\n * Stateful agent-event → OpenAI chunk mapper. The role chunk goes out with the\n * first chunk of the turn; events with no OpenAI counterpart (`status`,\n * `prompt_ack`, `file_changed`, …) map to nothing.\n */\nexport function agentCompletionChunks(\n event: AgentEvent,\n state: AgentStreamState,\n): ChatCompletionChunk[] {\n const chunks = agentDeltas(event, state);\n if (chunks.length === 0 || state.started) return chunks;\n state.started = true;\n return [chunk(state, { role: \"assistant\", content: \"\" }), ...chunks];\n}\n\n/**\n * The chunks that close a stream whose events ended without `finished` or\n * `question` (the prompt ended without a harness turn: flow hand-off, aborted\n * while queued). Empty when the stream already closed.\n */\nexport function agentCompletionEnd(state: AgentStreamState): ChatCompletionChunk[] {\n if (state.closed) return [];\n const chunks = closingChunks(state, undefined);\n if (state.started) return chunks;\n state.started = true;\n return [chunk(state, { role: \"assistant\", content: \"\" }), ...chunks];\n}\n","import type {\n AssistantMessage,\n Context,\n ImageContent,\n JsonObject,\n Message,\n SamplingParams,\n ThinkingLevel,\n Tool,\n ToolResultMessage,\n Usage,\n} from \"@earendil-works/pi-ai\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Model-call options both OpenAI surfaces translate into pi `stream()` options. */\nexport interface ModelRequestOptions {\n temperature?: number;\n maxTokens?: number;\n samplingParams?: SamplingParams;\n reasoning?: ThinkingLevel;\n}\n\n/**\n * Surface-independent result of parsing an OpenAI request. Both translators\n * return this so the server can drive pi without knowing which wire format\n * the caller spoke.\n */\nexport interface ParsedModelRequest {\n model: string;\n context: Context;\n options: ModelRequestOptions;\n stream: boolean;\n includeUsage: boolean;\n}\n\nconst THINKING_LEVELS: readonly ThinkingLevel[] = [\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n];\n\n/** `400 invalid_request_error` for malformed or unsupported caller input. */\nexport function badRequest(message: string): ModelEndpointError {\n return new ModelEndpointError(400, message);\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function requireModel(body: Record<string, unknown>): string {\n if (typeof body.model !== \"string\" || body.model.length === 0) {\n throw badRequest(\"model is required\");\n }\n return body.model;\n}\n\nexport function optionalBoolean(value: unknown, field: string): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value !== \"boolean\") throw badRequest(`${field} must be a boolean`);\n return value;\n}\n\nexport function optionalNumber(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw badRequest(`${field} must be a number`);\n return value;\n}\n\nexport function optionalPositiveInt(value: unknown, field: string): number | undefined {\n const n = optionalNumber(value, field);\n if (n === undefined) return undefined;\n if (!Number.isInteger(n) || n <= 0) throw badRequest(`${field} must be a positive integer`);\n return n;\n}\n\nfunction isThinkingLevel(value: string): value is ThinkingLevel {\n return (THINKING_LEVELS as readonly string[]).includes(value);\n}\n\n/** `none` (or absent) disables reasoning; anything else must be a pi thinking level. */\nexport function parseReasoningEffort(value: unknown, field: string): ThinkingLevel | undefined {\n if (value === undefined || value === null || value === \"none\") return undefined;\n if (typeof value === \"string\" && isThinkingLevel(value)) return value;\n throw badRequest(`${field} must be one of none, ${THINKING_LEVELS.join(\", \")}`);\n}\n\n/**\n * Copies request fields pi has no named option for (top_p, seed, stop, ...)\n * into `samplingParams`, which OpenAI-compatible pi adapters merge into the\n * upstream body as-is.\n */\nexport function pickSamplingParams(\n body: Record<string, unknown>,\n keys: readonly string[],\n): SamplingParams | undefined {\n const picked: SamplingParams = {};\n for (const key of keys) {\n const value = body[key];\n if (value === undefined || value === null) continue;\n const ok =\n typeof value === \"string\" ||\n (typeof value === \"number\" && Number.isFinite(value)) ||\n (Array.isArray(value) && value.every((v) => typeof v === \"string\"));\n if (!ok) throw badRequest(`${key} has an unsupported type`);\n picked[key] = value;\n }\n return Object.keys(picked).length > 0 ? picked : undefined;\n}\n\n/** OpenAI `response_format` and the OpenRouter body extensions, forwarded verbatim through pi `samplingParams` (only OpenAI-compatible adapters apply them). */\nexport const PASSTHROUGH_OBJECT_KEYS = [\"response_format\", \"usage\", \"provider\"] as const;\n\nconst RESPONSE_FORMAT_TYPES: readonly string[] = [\"text\", \"json_object\", \"json_schema\"];\n\n/**\n * Copies the object-valued request fields `pickSamplingParams` rejects\n * (`response_format`, OpenRouter `usage` and `provider`) after checking their\n * shape, so a malformed value fails with 400 instead of reaching the upstream.\n */\nexport function pickPassthroughObjects(body: Record<string, unknown>): SamplingParams | undefined {\n const picked: SamplingParams = {};\n for (const key of PASSTHROUGH_OBJECT_KEYS) {\n const value = body[key];\n if (value === undefined || value === null) continue;\n switch (key) {\n case \"response_format\":\n if (!isRecord(value) || !RESPONSE_FORMAT_TYPES.includes(value.type as string)) {\n throw badRequest(\"response_format.type must be text, json_object or json_schema\");\n }\n if (\n value.type === \"json_schema\" &&\n (!isRecord(value.json_schema) ||\n typeof value.json_schema.name !== \"string\" ||\n value.json_schema.name.length === 0)\n ) {\n throw badRequest(\"response_format.json_schema.name is required\");\n }\n break;\n case \"usage\":\n if (!isRecord(value) || typeof value.include !== \"boolean\") {\n throw badRequest(\"usage.include must be a boolean\");\n }\n break;\n case \"provider\":\n if (!isRecord(value)) throw badRequest(\"provider must be an object\");\n break;\n }\n picked[key] = value;\n }\n return Object.keys(picked).length > 0 ? picked : undefined;\n}\n\nexport function buildOptions(parts: {\n temperature: number | undefined;\n maxTokens: number | undefined;\n samplingParams: SamplingParams | undefined;\n reasoning: ThinkingLevel | undefined;\n}): ModelRequestOptions {\n const options: ModelRequestOptions = {};\n if (parts.temperature !== undefined) options.temperature = parts.temperature;\n if (parts.maxTokens !== undefined) options.maxTokens = parts.maxTokens;\n if (parts.samplingParams !== undefined) options.samplingParams = parts.samplingParams;\n if (parts.reasoning !== undefined) options.reasoning = parts.reasoning;\n return options;\n}\n\nconst DATA_URL = /^data:([^;,]+)(?:;[^;,]*)*;base64,(.*)$/s;\n\n/**\n * Decodes a `data:` image URL into pi `ImageContent`. Remote URLs are rejected\n * on purpose: fetching caller-supplied URLs from the runner would be an SSRF\n * vector and the endpoint has no business doing I/O during translation.\n */\nexport function imageFromUrl(url: unknown, field: string): ImageContent {\n if (typeof url !== \"string\" || url.length === 0)\n throw badRequest(`${field} must be a non-empty string`);\n const match = DATA_URL.exec(url);\n if (!match) {\n throw badRequest(\n `${field}: only base64 data: image URLs are supported; http(s) image URLs are not fetched`,\n );\n }\n const mimeType = match[1] as string;\n if (!mimeType.startsWith(\"image/\"))\n throw badRequest(`${field}: data URL is not an image (${mimeType})`);\n return { type: \"image\", data: match[2] as string, mimeType };\n}\n\n/**\n * Tool `arguments` arrive as a JSON string; pi wants an object. Invalid JSON or a\n * non-object value becomes `{}` so one malformed history entry cannot fail the call.\n */\nexport function parseToolArguments(value: unknown): JsonObject {\n if (isRecord(value)) return value as JsonObject;\n if (typeof value !== \"string\" || value.trim().length === 0) return {};\n try {\n const parsed: unknown = JSON.parse(value);\n return isRecord(parsed) ? (parsed as JsonObject) : {};\n } catch {\n return {};\n }\n}\n\nexport const DEFAULT_TOOL_PARAMETERS = { type: \"object\", properties: {} } as const;\n\nexport function toPiTool(name: string, description: unknown, parameters: unknown): Tool {\n return {\n name,\n description: typeof description === \"string\" ? description : \"\",\n parameters: (isRecord(parameters) ? parameters : DEFAULT_TOOL_PARAMETERS) as Tool[\"parameters\"],\n };\n}\n\n/**\n * Applies OpenAI `tool_choice` to the tool list. pi's `stream()` has no\n * tool-choice option, so the choice is enforced by what we declare: `none`\n * declares nothing, a named function declares only that function.\n */\nexport function selectTools(\n tools: Tool[],\n choice: unknown,\n forcedName: (choice: Record<string, unknown>) => unknown,\n): Tool[] {\n if (choice === undefined || choice === null || choice === \"auto\" || choice === \"required\")\n return tools;\n if (choice === \"none\") return [];\n if (isRecord(choice)) {\n const name = forcedName(choice);\n const matched = tools.filter((tool) => tool.name === name);\n if (typeof name !== \"string\" || matched.length === 0) {\n throw badRequest(\"tool_choice references an unknown function\");\n }\n return matched;\n }\n throw badRequest(\"tool_choice is not supported\");\n}\n\nexport function buildContext(systemParts: string[], messages: Message[], tools: Tool[]): Context {\n const context: Context = { messages };\n if (systemParts.length > 0) context.systemPrompt = systemParts.join(\"\\n\\n\");\n if (tools.length > 0) context.tools = tools;\n return context;\n}\n\nexport function emptyUsage(): Usage {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\n/** OpenAI counts cache reads/writes as prompt tokens; pi reports them separately. */\nexport function promptTokens(usage: Usage): number {\n return usage.input + usage.cacheRead + usage.cacheWrite;\n}\n\nexport function totalTokens(usage: Usage): number {\n return usage.totalTokens > 0 ? usage.totalTokens : promptTokens(usage) + usage.output;\n}\n\n/**\n * An assistant turn replayed from the caller's history. It is stamped with a\n * foreign api/provider so pi treats it as cross-provider history (dropping\n * provider-specific signatures) rather than as its own output.\n */\nexport function historyAssistant(\n model: string,\n content: AssistantMessage[\"content\"],\n): AssistantMessage {\n return {\n role: \"assistant\",\n content,\n api: \"openai-completions\",\n provider: \"openai\",\n model,\n usage: emptyUsage(),\n stopReason: content.some((block) => block.type === \"toolCall\") ? \"toolUse\" : \"stop\",\n timestamp: Date.now(),\n };\n}\n\nexport function historyToolResult(\n toolCallId: string,\n toolName: string,\n text: string,\n): ToolResultMessage {\n return {\n role: \"toolResult\",\n toolCallId,\n toolName,\n content: [{ type: \"text\", text }],\n isError: false,\n timestamp: Date.now(),\n };\n}\n","import type {\n AssistantMessage,\n AssistantMessageEvent,\n ImageContent,\n Message,\n SamplingParams,\n StopReason,\n TextContent,\n Tool,\n} from \"@earendil-works/pi-ai\";\nimport {\n badRequest,\n buildContext,\n buildOptions,\n historyAssistant,\n historyToolResult,\n imageFromUrl,\n isRecord,\n optionalBoolean,\n optionalNumber,\n optionalPositiveInt,\n type ParsedModelRequest,\n parseReasoningEffort,\n parseToolArguments,\n pickPassthroughObjects,\n pickSamplingParams,\n promptTokens,\n requireModel,\n selectTools,\n toPiTool,\n totalTokens,\n} from \"./openai-shared.js\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Parsed `POST /v1/chat/completions` body, in pi terms. */\nexport type ChatCompletionRequest = ParsedModelRequest;\n\nexport type ChatFinishReason = \"stop\" | \"length\" | \"tool_calls\";\n\nexport interface ChatCompletionToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n}\n\nexport interface ChatCompletionMessage {\n role: \"assistant\";\n content: string | null;\n reasoning_content?: string;\n tool_calls?: ChatCompletionToolCall[];\n}\n\nexport interface ChatCompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details: { cached_tokens: number };\n completion_tokens_details?: { reasoning_tokens: number };\n /** Upstream-reported cost in USD (OpenRouter); absent when the upstream reported none. */\n cost?: number;\n}\n\nexport interface ChatCompletion {\n id: string;\n object: \"chat.completion\";\n created: number;\n model: string;\n choices: Array<{ index: 0; message: ChatCompletionMessage; finish_reason: ChatFinishReason }>;\n usage: ChatCompletionUsage;\n}\n\nexport interface ChatCompletionChunkDelta {\n role?: \"assistant\";\n content?: string;\n reasoning_content?: string;\n tool_calls?: Array<{ index: number } & ChatCompletionToolCall>;\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: Array<{\n index: 0;\n delta: ChatCompletionChunkDelta;\n finish_reason: ChatFinishReason | null;\n }>;\n usage?: ChatCompletionUsage;\n}\n\nexport interface ChatResponseMeta {\n id: string;\n created: number;\n model: string;\n}\n\n// ── request ─────────────────────────────────────────────────────────────────\n\nfunction textOfParts(content: unknown, field: string, allowed: readonly string[]): string {\n if (content === undefined || content === null) return \"\";\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of text parts`);\n let text = \"\";\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n if (!isRecord(part) || typeof part.type !== \"string\" || !allowed.includes(part.type)) {\n throw badRequest(`${field}[${i}]: unsupported content part`);\n }\n const value = part.type === \"refusal\" ? part.refusal : part.text;\n if (typeof value !== \"string\")\n throw badRequest(\n `${field}[${i}].${part.type === \"refusal\" ? \"refusal\" : \"text\"} must be a string`,\n );\n text += value;\n }\n return text;\n}\n\nfunction parseUserContent(\n content: unknown,\n field: string,\n): string | (TextContent | ImageContent)[] {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of content parts`);\n const parts: (TextContent | ImageContent)[] = [];\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n const partField = `${field}[${i}]`;\n if (!isRecord(part)) throw badRequest(`${partField} must be an object`);\n if (part.type === \"text\") {\n if (typeof part.text !== \"string\") throw badRequest(`${partField}.text must be a string`);\n parts.push({ type: \"text\", text: part.text });\n } else if (part.type === \"image_url\") {\n const url = isRecord(part.image_url) ? part.image_url.url : part.image_url;\n parts.push(imageFromUrl(url, `${partField}.image_url.url`));\n } else {\n throw badRequest(`${partField}: unsupported content part type \"${String(part.type)}\"`);\n }\n }\n return parts;\n}\n\nfunction parseAssistantMessage(\n raw: Record<string, unknown>,\n field: string,\n model: string,\n toolNames: Map<string, string>,\n): AssistantMessage | undefined {\n const blocks: AssistantMessage[\"content\"] = [];\n const text = textOfParts(raw.content, `${field}.content`, [\"text\", \"refusal\"]);\n if (text.length > 0) blocks.push({ type: \"text\", text });\n if (raw.tool_calls !== undefined && raw.tool_calls !== null) {\n if (!Array.isArray(raw.tool_calls)) throw badRequest(`${field}.tool_calls must be an array`);\n for (let i = 0; i < raw.tool_calls.length; i++) {\n const call: unknown = raw.tool_calls[i];\n const callField = `${field}.tool_calls[${i}]`;\n if (!isRecord(call) || !isRecord(call.function))\n throw badRequest(`${callField} must be a function tool call`);\n if (call.type !== undefined && call.type !== \"function\")\n throw badRequest(`${callField}.type must be \"function\"`);\n if (typeof call.id !== \"string\" || call.id.length === 0)\n throw badRequest(`${callField}.id is required`);\n if (typeof call.function.name !== \"string\" || call.function.name.length === 0) {\n throw badRequest(`${callField}.function.name is required`);\n }\n toolNames.set(call.id, call.function.name);\n blocks.push({\n type: \"toolCall\",\n id: call.id,\n name: call.function.name,\n arguments: parseToolArguments(call.function.arguments),\n });\n }\n }\n // An empty assistant turn carries no information and some upstreams reject it.\n return blocks.length > 0 ? historyAssistant(model, blocks) : undefined;\n}\n\nfunction parseTools(value: unknown): Tool[] {\n if (value === undefined || value === null) return [];\n if (!Array.isArray(value)) throw badRequest(\"tools must be an array\");\n const tools: Tool[] = [];\n for (let i = 0; i < value.length; i++) {\n const tool: unknown = value[i];\n if (!isRecord(tool) || tool.type !== \"function\" || !isRecord(tool.function)) {\n throw badRequest(`tools[${i}] must be {type:\"function\", function:{...}}`);\n }\n const fn = tool.function;\n if (typeof fn.name !== \"string\" || fn.name.length === 0)\n throw badRequest(`tools[${i}].function.name is required`);\n tools.push(toPiTool(fn.name, fn.description, fn.parameters));\n }\n return tools;\n}\n\nfunction mergeSamplingParams(\n ...parts: Array<SamplingParams | undefined>\n): SamplingParams | undefined {\n const merged: SamplingParams = Object.assign({}, ...parts);\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\n/**\n * Validates an OpenAI chat-completions body and maps it to a pi `Context`.\n * System/developer messages collapse into `systemPrompt`; a tool message's\n * `toolName` is recovered from the earlier assistant `tool_calls` entry with the\n * same id because pi tool results carry the tool name and OpenAI's do not.\n * Unsupported features fail loudly with 400 instead of being silently dropped.\n */\nexport function parseChatCompletionRequest(body: unknown): ChatCompletionRequest {\n if (!isRecord(body)) throw badRequest(\"request body must be a JSON object\");\n const model = requireModel(body);\n if (!Array.isArray(body.messages) || body.messages.length === 0) {\n throw badRequest(\"messages must be a non-empty array\");\n }\n if (body.n !== undefined && body.n !== null && body.n !== 1) {\n throw badRequest(\"n must be 1; multiple choices are not supported\");\n }\n\n const systemParts: string[] = [];\n const messages: Message[] = [];\n const toolNames = new Map<string, string>();\n\n for (let i = 0; i < body.messages.length; i++) {\n const raw: unknown = body.messages[i];\n const field = `messages[${i}]`;\n if (!isRecord(raw)) throw badRequest(`${field} must be an object`);\n switch (raw.role) {\n case \"system\":\n case \"developer\": {\n const text = textOfParts(raw.content, `${field}.content`, [\"text\"]);\n if (text.length > 0) systemParts.push(text);\n break;\n }\n case \"user\":\n messages.push({\n role: \"user\",\n content: parseUserContent(raw.content, `${field}.content`),\n timestamp: Date.now(),\n });\n break;\n case \"assistant\": {\n const assistant = parseAssistantMessage(raw, field, model, toolNames);\n if (assistant) messages.push(assistant);\n break;\n }\n case \"tool\": {\n if (typeof raw.tool_call_id !== \"string\" || raw.tool_call_id.length === 0) {\n throw badRequest(`${field}.tool_call_id is required`);\n }\n const text = textOfParts(raw.content, `${field}.content`, [\"text\"]);\n messages.push(\n historyToolResult(raw.tool_call_id, toolNames.get(raw.tool_call_id) ?? \"\", text),\n );\n break;\n }\n default:\n throw badRequest(`${field}.role \"${String(raw.role)}\" is not supported`);\n }\n }\n\n const tools = selectTools(parseTools(body.tools), body.tool_choice, (choice) =>\n choice.type === \"function\" && isRecord(choice.function) ? choice.function.name : undefined,\n );\n\n const options = buildOptions({\n temperature: optionalNumber(body.temperature, \"temperature\"),\n maxTokens: optionalPositiveInt(\n body.max_completion_tokens ?? body.max_tokens,\n \"max_completion_tokens\",\n ),\n samplingParams: mergeSamplingParams(\n pickSamplingParams(body, [\"top_p\", \"frequency_penalty\", \"presence_penalty\", \"seed\", \"stop\"]),\n pickPassthroughObjects(body),\n ),\n reasoning: parseReasoningEffort(body.reasoning_effort, \"reasoning_effort\"),\n });\n\n return {\n model,\n context: buildContext(systemParts, messages, tools),\n options,\n stream: optionalBoolean(body.stream, \"stream\"),\n includeUsage: isRecord(body.stream_options) && body.stream_options.include_usage === true,\n };\n}\n\n// ── response ────────────────────────────────────────────────────────────────\n\nfunction finishReason(stopReason: StopReason, errorMessage: string | undefined): ChatFinishReason {\n switch (stopReason) {\n case \"length\":\n return \"length\";\n case \"toolUse\":\n return \"tool_calls\";\n case \"error\":\n case \"aborted\":\n throw new ModelEndpointError(502, errorMessage ?? `upstream request ${stopReason}`);\n default:\n return \"stop\";\n }\n}\n\nfunction toChatUsage(usage: AssistantMessage[\"usage\"], cost?: number): ChatCompletionUsage {\n const prompt = promptTokens(usage);\n const result: ChatCompletionUsage = {\n prompt_tokens: prompt,\n completion_tokens: usage.output,\n total_tokens: totalTokens(usage),\n prompt_tokens_details: { cached_tokens: usage.cacheRead },\n };\n if (usage.reasoning !== undefined)\n result.completion_tokens_details = { reasoning_tokens: usage.reasoning };\n if (cost !== undefined) result.cost = cost;\n return result;\n}\n\n/**\n * Maps a finished pi message to a non-streaming chat completion. `error` /\n * `aborted` messages throw 502 so the caller sees an upstream failure rather\n * than an empty \"successful\" completion. `cost` is the upstream-reported USD\n * cost (pi does not surface it); it is copied into `usage.cost` when defined.\n */\nexport function toChatCompletion(\n message: AssistantMessage,\n meta: ChatResponseMeta,\n cost?: number,\n): ChatCompletion {\n const reason = finishReason(message.stopReason, message.errorMessage);\n let text = \"\";\n let thinking = \"\";\n const toolCalls: ChatCompletionToolCall[] = [];\n for (const block of message.content) {\n if (block.type === \"text\") text += block.text;\n else if (block.type === \"thinking\") thinking += block.thinking;\n else {\n toolCalls.push({\n id: block.id,\n type: \"function\",\n function: { name: block.name, arguments: JSON.stringify(block.arguments) },\n });\n }\n }\n const out: ChatCompletionMessage = { role: \"assistant\", content: text.length > 0 ? text : null };\n if (thinking.length > 0) out.reasoning_content = thinking;\n if (toolCalls.length > 0) out.tool_calls = toolCalls;\n return {\n id: meta.id,\n object: \"chat.completion\",\n created: meta.created,\n model: meta.model,\n choices: [{ index: 0, message: out, finish_reason: reason }],\n usage: toChatUsage(message.usage, cost),\n };\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\n/** Mutable per-stream mapper state; `error` is set instead of emitting a chunk on upstream failure. */\nexport interface ChatStreamState {\n readonly id: string;\n readonly created: number;\n readonly model: string;\n readonly includeUsage: boolean;\n /** Set when pi reports `error`/`aborted`; the server turns it into an SSE error event. */\n error?: string;\n /** Upstream-reported cost in USD; the server sets it before the `done` event is mapped. */\n cost?: number;\n nextToolIndex: number;\n toolIndexByContent: Map<number, number>;\n}\n\nexport function createChatStreamState(init: {\n id: string;\n created: number;\n model: string;\n includeUsage: boolean;\n}): ChatStreamState {\n return { ...init, nextToolIndex: 0, toolIndexByContent: new Map() };\n}\n\nfunction chunk(\n state: ChatStreamState,\n delta: ChatCompletionChunkDelta,\n finish: ChatFinishReason | null = null,\n): ChatCompletionChunk {\n return {\n id: state.id,\n object: \"chat.completion.chunk\",\n created: state.created,\n model: state.model,\n choices: [{ index: 0, delta, finish_reason: finish }],\n };\n}\n\n/**\n * Stateful pi-event → OpenAI chunk mapper. Tool calls are buffered and emitted as\n * a single complete chunk at `toolcall_end` because pi only knows the call id and\n * name once the call is finished; OpenAI clients accept a whole call in one delta.\n */\nexport function chatCompletionChunks(\n event: AssistantMessageEvent,\n state: ChatStreamState,\n): ChatCompletionChunk[] {\n switch (event.type) {\n case \"start\":\n return [chunk(state, { role: \"assistant\", content: \"\" })];\n case \"text_delta\":\n return event.delta.length > 0 ? [chunk(state, { content: event.delta })] : [];\n case \"thinking_delta\":\n return event.delta.length > 0 ? [chunk(state, { reasoning_content: event.delta })] : [];\n case \"toolcall_start\":\n state.toolIndexByContent.set(event.contentIndex, state.nextToolIndex++);\n return [];\n case \"toolcall_end\": {\n let index = state.toolIndexByContent.get(event.contentIndex);\n if (index === undefined) {\n index = state.nextToolIndex++;\n state.toolIndexByContent.set(event.contentIndex, index);\n }\n return [\n chunk(state, {\n tool_calls: [\n {\n index,\n id: event.toolCall.id,\n type: \"function\",\n function: {\n name: event.toolCall.name,\n arguments: JSON.stringify(event.toolCall.arguments),\n },\n },\n ],\n }),\n ];\n }\n case \"done\": {\n const chunks = [chunk(state, {}, finishReason(event.reason, undefined))];\n if (state.includeUsage) {\n chunks.push({\n id: state.id,\n object: \"chat.completion.chunk\",\n created: state.created,\n model: state.model,\n choices: [],\n usage: toChatUsage(event.message.usage, state.cost),\n });\n }\n return chunks;\n }\n case \"error\":\n state.error = event.error.errorMessage ?? `upstream request ${event.reason}`;\n return [];\n default:\n return [];\n }\n}\n","import type {\n AssistantMessage,\n AssistantMessageEvent,\n ImageContent,\n Message,\n TextContent,\n Tool,\n Usage,\n} from \"@earendil-works/pi-ai\";\nimport {\n badRequest,\n buildContext,\n buildOptions,\n historyAssistant,\n historyToolResult,\n imageFromUrl,\n isRecord,\n optionalBoolean,\n optionalNumber,\n optionalPositiveInt,\n type ParsedModelRequest,\n parseReasoningEffort,\n parseToolArguments,\n pickSamplingParams,\n promptTokens,\n requireModel,\n selectTools,\n toPiTool,\n totalTokens,\n} from \"./openai-shared.js\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Parsed `POST /v1/responses` body, in pi terms (`includeUsage` is always true: Responses always reports usage). */\nexport type ResponsesRequest = ParsedModelRequest;\n\nexport interface ResponseSummaryPart {\n type: \"summary_text\";\n text: string;\n}\n\nexport interface ResponseReasoningItem {\n type: \"reasoning\";\n id: string;\n summary: ResponseSummaryPart[];\n}\n\nexport interface ResponseMessageItem {\n type: \"message\";\n id: string;\n role: \"assistant\";\n status: \"in_progress\" | \"completed\";\n content: Array<{ type: \"output_text\"; text: string; annotations: never[] }>;\n}\n\nexport interface ResponseFunctionCallItem {\n type: \"function_call\";\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n status: \"in_progress\" | \"completed\";\n}\n\nexport type ResponseOutputItem =\n | ResponseReasoningItem\n | ResponseMessageItem\n | ResponseFunctionCallItem;\n\nexport interface ResponseUsage {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n input_tokens_details: { cached_tokens: number };\n output_tokens_details: { reasoning_tokens: number };\n}\n\nexport interface ResponseObject {\n id: string;\n object: \"response\";\n created_at: number;\n model: string;\n status: \"in_progress\" | \"completed\" | \"incomplete\";\n incomplete_details: { reason: \"max_output_tokens\" } | null;\n error: null;\n output: ResponseOutputItem[];\n usage: ResponseUsage | null;\n}\n\nexport interface ResponsesMeta {\n id: string;\n created: number;\n model: string;\n}\n\n/** One SSE event; `sequence_number` increases by one per event within a response. */\nexport interface ResponsesStreamEvent {\n type: string;\n sequence_number: number;\n [key: string]: unknown;\n}\n\n// ── request ─────────────────────────────────────────────────────────────────\n\nfunction parseParts(\n content: unknown,\n field: string,\n role: \"user\" | \"system\" | \"assistant\",\n): string | (TextContent | ImageContent)[] {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of content parts`);\n const textTypes = role === \"assistant\" ? [\"output_text\", \"text\"] : [\"input_text\", \"text\"];\n const parts: (TextContent | ImageContent)[] = [];\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n const partField = `${field}[${i}]`;\n if (!isRecord(part) || typeof part.type !== \"string\")\n throw badRequest(`${partField} must be a content part`);\n if (textTypes.includes(part.type)) {\n if (typeof part.text !== \"string\") throw badRequest(`${partField}.text must be a string`);\n parts.push({ type: \"text\", text: part.text });\n } else if (\n part.type === \"refusal\" &&\n role === \"assistant\" &&\n typeof part.refusal === \"string\"\n ) {\n parts.push({ type: \"text\", text: part.refusal });\n } else if (part.type === \"input_image\" && role === \"user\") {\n if (part.file_id !== undefined && part.file_id !== null)\n throw badRequest(`${partField}.file_id is not supported`);\n const url = isRecord(part.image_url) ? part.image_url.url : part.image_url;\n parts.push(imageFromUrl(url, `${partField}.image_url`));\n } else {\n throw badRequest(`${partField}: unsupported content part type \"${part.type}\"`);\n }\n }\n return parts;\n}\n\nfunction joinText(parts: string | (TextContent | ImageContent)[]): string {\n if (typeof parts === \"string\") return parts;\n return parts.map((part) => (part.type === \"text\" ? part.text : \"\")).join(\"\");\n}\n\nfunction parseOutputText(output: unknown, field: string): string {\n if (typeof output === \"string\") return output;\n if (output === undefined || output === null) return \"\";\n return joinText(parseParts(output, field, \"user\"));\n}\n\nfunction parseInput(input: unknown, model: string, systemParts: string[]): Message[] {\n if (typeof input === \"string\") return [{ role: \"user\", content: input, timestamp: Date.now() }];\n if (!Array.isArray(input)) throw badRequest(\"input must be a string or an array of items\");\n const messages: Message[] = [];\n const toolNames = new Map<string, string>();\n\n for (let i = 0; i < input.length; i++) {\n const item: unknown = input[i];\n const field = `input[${i}]`;\n if (!isRecord(item)) throw badRequest(`${field} must be an object`);\n const type = item.type ?? \"message\";\n switch (type) {\n case \"message\": {\n const role = item.role;\n if (role === \"system\" || role === \"developer\") {\n const text = joinText(parseParts(item.content, `${field}.content`, \"system\"));\n if (text.length > 0) systemParts.push(text);\n } else if (role === \"user\") {\n messages.push({\n role: \"user\",\n content: parseParts(item.content, `${field}.content`, \"user\"),\n timestamp: Date.now(),\n });\n } else if (role === \"assistant\") {\n const text = joinText(parseParts(item.content, `${field}.content`, \"assistant\"));\n if (text.length > 0) messages.push(historyAssistant(model, [{ type: \"text\", text }]));\n } else {\n throw badRequest(`${field}.role \"${String(role)}\" is not supported`);\n }\n break;\n }\n case \"function_call\": {\n if (typeof item.call_id !== \"string\" || item.call_id.length === 0)\n throw badRequest(`${field}.call_id is required`);\n if (typeof item.name !== \"string\" || item.name.length === 0)\n throw badRequest(`${field}.name is required`);\n toolNames.set(item.call_id, item.name);\n const call = {\n type: \"toolCall\" as const,\n id: item.call_id,\n name: item.name,\n arguments: parseToolArguments(item.arguments),\n };\n // Parallel calls arrive as consecutive items and belong to one assistant turn.\n const last = messages.at(-1);\n if (last?.role === \"assistant\") {\n last.content.push(call);\n last.stopReason = \"toolUse\";\n } else {\n messages.push(historyAssistant(model, [call]));\n }\n break;\n }\n case \"function_call_output\": {\n if (typeof item.call_id !== \"string\" || item.call_id.length === 0)\n throw badRequest(`${field}.call_id is required`);\n messages.push(\n historyToolResult(\n item.call_id,\n toolNames.get(item.call_id) ?? \"\",\n parseOutputText(item.output, `${field}.output`),\n ),\n );\n break;\n }\n case \"reasoning\":\n // Encrypted/summary reasoning from earlier turns is not replayable across providers.\n break;\n default:\n throw badRequest(`${field}.type \"${String(type)}\" is not supported`);\n }\n }\n return messages;\n}\n\nfunction parseTools(value: unknown): Tool[] {\n if (value === undefined || value === null) return [];\n if (!Array.isArray(value)) throw badRequest(\"tools must be an array\");\n const tools: Tool[] = [];\n for (let i = 0; i < value.length; i++) {\n const tool: unknown = value[i];\n if (!isRecord(tool) || tool.type !== \"function\") {\n throw badRequest(`tools[${i}]: only function tools are supported`);\n }\n if (typeof tool.name !== \"string\" || tool.name.length === 0)\n throw badRequest(`tools[${i}].name is required`);\n tools.push(toPiTool(tool.name, tool.description, tool.parameters));\n }\n return tools;\n}\n\n/**\n * Validates an OpenAI Responses body (stateless subset) and maps it to a pi `Context`.\n * `previous_response_id` is rejected because the endpoint keeps no response state.\n */\nexport function parseResponsesRequest(body: unknown): ResponsesRequest {\n if (!isRecord(body)) throw badRequest(\"request body must be a JSON object\");\n const model = requireModel(body);\n if (body.input === undefined || body.input === null) throw badRequest(\"input is required\");\n if (body.previous_response_id !== undefined && body.previous_response_id !== null) {\n throw badRequest(\"previous_response_id is not supported; the endpoint is stateless\");\n }\n\n const systemParts: string[] = [];\n if (body.instructions !== undefined && body.instructions !== null) {\n if (typeof body.instructions !== \"string\") throw badRequest(\"instructions must be a string\");\n if (body.instructions.length > 0) systemParts.push(body.instructions);\n }\n\n const messages = parseInput(body.input, model, systemParts);\n if (messages.length === 0) throw badRequest(\"input must contain at least one message\");\n\n const tools = selectTools(parseTools(body.tools), body.tool_choice, (choice) =>\n choice.type === \"function\" ? choice.name : undefined,\n );\n\n const reasoning = isRecord(body.reasoning) ? body.reasoning.effort : undefined;\n const options = buildOptions({\n temperature: optionalNumber(body.temperature, \"temperature\"),\n maxTokens: optionalPositiveInt(body.max_output_tokens, \"max_output_tokens\"),\n samplingParams: pickSamplingParams(body, [\"top_p\"]),\n reasoning: parseReasoningEffort(reasoning, \"reasoning.effort\"),\n });\n\n return {\n model,\n context: buildContext(systemParts, messages, tools),\n options,\n stream: optionalBoolean(body.stream, \"stream\"),\n includeUsage: true,\n };\n}\n\n// ── response ────────────────────────────────────────────────────────────────\n\nfunction itemId(prefix: string, responseId: string, index: number): string {\n return `${prefix}_${responseId.replace(/^resp_/, \"\")}_${index}`;\n}\n\nfunction toResponseUsage(usage: Usage): ResponseUsage {\n return {\n input_tokens: promptTokens(usage),\n output_tokens: usage.output,\n total_tokens: totalTokens(usage),\n input_tokens_details: { cached_tokens: usage.cacheRead },\n output_tokens_details: { reasoning_tokens: usage.reasoning ?? 0 },\n };\n}\n\nfunction messageItem(\n id: string,\n text: string,\n status: \"in_progress\" | \"completed\",\n): ResponseMessageItem {\n return {\n type: \"message\",\n id,\n role: \"assistant\",\n status,\n content: status === \"completed\" ? [{ type: \"output_text\", text, annotations: [] }] : [],\n };\n}\n\nfunction buildOutput(message: AssistantMessage, responseId: string): ResponseOutputItem[] {\n const output: ResponseOutputItem[] = [];\n const summaries: ResponseSummaryPart[] = [];\n let text = \"\";\n const calls: ResponseFunctionCallItem[] = [];\n for (const block of message.content) {\n if (block.type === \"thinking\") {\n if (block.thinking.length > 0) summaries.push({ type: \"summary_text\", text: block.thinking });\n } else if (block.type === \"text\") {\n text += block.text;\n } else {\n calls.push({\n type: \"function_call\",\n id: \"\",\n call_id: block.id,\n name: block.name,\n arguments: JSON.stringify(block.arguments),\n status: \"completed\",\n });\n }\n }\n if (summaries.length > 0) {\n output.push({\n type: \"reasoning\",\n id: itemId(\"rs\", responseId, output.length),\n summary: summaries,\n });\n }\n if (text.length > 0) {\n output.push(messageItem(itemId(\"msg\", responseId, output.length), text, \"completed\"));\n }\n for (const call of calls) {\n call.id = itemId(\"fc\", responseId, output.length);\n output.push(call);\n }\n return output;\n}\n\nfunction responseObject(\n meta: ResponsesMeta,\n status: ResponseObject[\"status\"],\n output: ResponseOutputItem[],\n usage: Usage | undefined,\n): ResponseObject {\n return {\n id: meta.id,\n object: \"response\",\n created_at: meta.created,\n model: meta.model,\n status,\n incomplete_details: status === \"incomplete\" ? { reason: \"max_output_tokens\" } : null,\n error: null,\n output,\n usage: usage ? toResponseUsage(usage) : null,\n };\n}\n\n/**\n * Maps a finished pi message to a non-streaming Responses object. Output order is\n * reasoning, message, then function calls. `error`/`aborted` throw 502.\n */\nexport function toResponse(message: AssistantMessage, meta: ResponsesMeta): ResponseObject {\n if (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n throw new ModelEndpointError(\n 502,\n message.errorMessage ?? `upstream request ${message.stopReason}`,\n );\n }\n const status = message.stopReason === \"length\" ? \"incomplete\" : \"completed\";\n return responseObject(meta, status, buildOutput(message, meta.id), message.usage);\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\ninterface OpenBlock {\n kind: \"message\" | \"reasoning\";\n outputIndex: number;\n itemId: string;\n text: string;\n}\n\n/** Mutable per-stream mapper state; `error` is set instead of emitting an event on upstream failure. */\nexport interface ResponsesStreamState {\n readonly id: string;\n readonly created: number;\n readonly model: string;\n /** Set when pi reports `error`/`aborted`; the server turns it into an SSE `error` event. */\n error?: string;\n sequence: number;\n nextOutputIndex: number;\n open: Map<number, OpenBlock>;\n completed: Map<number, ResponseOutputItem>;\n}\n\nexport function createResponsesStreamState(init: ResponsesMeta): ResponsesStreamState {\n return {\n ...init,\n sequence: 0,\n nextOutputIndex: 0,\n open: new Map(),\n completed: new Map(),\n };\n}\n\nfunction ev(\n state: ResponsesStreamState,\n type: string,\n fields: Record<string, unknown>,\n): ResponsesStreamEvent {\n return { type, sequence_number: state.sequence++, ...fields };\n}\n\nfunction openBlock(\n state: ResponsesStreamState,\n contentIndex: number,\n kind: OpenBlock[\"kind\"],\n): { block: OpenBlock; events: ResponsesStreamEvent[] } {\n const existing = state.open.get(contentIndex);\n if (existing) return { block: existing, events: [] };\n const outputIndex = state.nextOutputIndex++;\n const block: OpenBlock = {\n kind,\n outputIndex,\n itemId: itemId(kind === \"message\" ? \"msg\" : \"rs\", state.id, outputIndex),\n text: \"\",\n };\n state.open.set(contentIndex, block);\n if (kind === \"message\") {\n return {\n block,\n events: [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: messageItem(block.itemId, \"\", \"in_progress\"),\n }),\n ev(state, \"response.content_part.added\", {\n item_id: block.itemId,\n output_index: outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: \"\", annotations: [] },\n }),\n ],\n };\n }\n return {\n block,\n events: [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: { type: \"reasoning\", id: block.itemId, summary: [] },\n }),\n ev(state, \"response.reasoning_summary_part.added\", {\n item_id: block.itemId,\n output_index: outputIndex,\n summary_index: 0,\n part: { type: \"summary_text\", text: \"\" },\n }),\n ],\n };\n}\n\nfunction closeBlock(\n state: ResponsesStreamState,\n contentIndex: number,\n kind: OpenBlock[\"kind\"],\n finalText: string,\n): ResponsesStreamEvent[] {\n const { block, events } = openBlock(state, contentIndex, kind);\n state.open.delete(contentIndex);\n if (kind === \"message\") {\n const item = messageItem(block.itemId, finalText, \"completed\");\n state.completed.set(block.outputIndex, item);\n events.push(\n ev(state, \"response.output_text.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n text: finalText,\n }),\n ev(state, \"response.content_part.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: finalText, annotations: [] },\n }),\n ev(state, \"response.output_item.done\", { output_index: block.outputIndex, item }),\n );\n return events;\n }\n const part: ResponseSummaryPart = { type: \"summary_text\", text: finalText };\n const item: ResponseReasoningItem = { type: \"reasoning\", id: block.itemId, summary: [part] };\n state.completed.set(block.outputIndex, item);\n events.push(\n ev(state, \"response.reasoning_summary_text.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n text: finalText,\n }),\n ev(state, \"response.reasoning_summary_part.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n part,\n }),\n ev(state, \"response.output_item.done\", { output_index: block.outputIndex, item }),\n );\n return events;\n}\n\n/**\n * Stateful pi-event → Responses SSE mapper. Function calls are buffered until\n * `toolcall_end` (pi only knows call id and name then) and then emitted as a\n * complete added/arguments/done sequence. A length stop ends with\n * `response.incomplete`, everything else with `response.completed`.\n */\nexport function responsesEvents(\n event: AssistantMessageEvent,\n state: ResponsesStreamState,\n): ResponsesStreamEvent[] {\n const meta: ResponsesMeta = { id: state.id, created: state.created, model: state.model };\n switch (event.type) {\n case \"start\": {\n const response = responseObject(meta, \"in_progress\", [], undefined);\n return [\n ev(state, \"response.created\", { response }),\n ev(state, \"response.in_progress\", { response }),\n ];\n }\n case \"text_start\":\n return openBlock(state, event.contentIndex, \"message\").events;\n case \"text_delta\": {\n const { block, events } = openBlock(state, event.contentIndex, \"message\");\n block.text += event.delta;\n events.push(\n ev(state, \"response.output_text.delta\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n delta: event.delta,\n }),\n );\n return events;\n }\n case \"text_end\":\n return closeBlock(state, event.contentIndex, \"message\", event.content);\n case \"thinking_start\":\n return openBlock(state, event.contentIndex, \"reasoning\").events;\n case \"thinking_delta\": {\n const { block, events } = openBlock(state, event.contentIndex, \"reasoning\");\n block.text += event.delta;\n events.push(\n ev(state, \"response.reasoning_summary_text.delta\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n delta: event.delta,\n }),\n );\n return events;\n }\n case \"thinking_end\":\n return closeBlock(state, event.contentIndex, \"reasoning\", event.content);\n case \"toolcall_end\": {\n const outputIndex = state.nextOutputIndex++;\n const id = itemId(\"fc\", state.id, outputIndex);\n const args = JSON.stringify(event.toolCall.arguments);\n const item: ResponseFunctionCallItem = {\n type: \"function_call\",\n id,\n call_id: event.toolCall.id,\n name: event.toolCall.name,\n arguments: args,\n status: \"completed\",\n };\n state.completed.set(outputIndex, item);\n return [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: { ...item, arguments: \"\", status: \"in_progress\" },\n }),\n ev(state, \"response.function_call_arguments.delta\", {\n item_id: id,\n output_index: outputIndex,\n delta: args,\n }),\n ev(state, \"response.function_call_arguments.done\", {\n item_id: id,\n output_index: outputIndex,\n name: item.name,\n arguments: args,\n }),\n ev(state, \"response.output_item.done\", { output_index: outputIndex, item }),\n ];\n }\n case \"done\": {\n const streamed = [...state.completed.entries()]\n .sort(([a], [b]) => a - b)\n .map(([, item]) => item);\n const output = streamed.length > 0 ? streamed : buildOutput(event.message, state.id);\n const incomplete = event.reason === \"length\";\n const response = responseObject(\n meta,\n incomplete ? \"incomplete\" : \"completed\",\n output,\n event.message.usage,\n );\n return [ev(state, incomplete ? \"response.incomplete\" : \"response.completed\", { response })];\n }\n case \"error\":\n state.error = event.error.errorMessage ?? `upstream request ${event.reason}`;\n return [];\n default:\n return [];\n }\n}\n","/**\n * Model transforms on the endpoint: `<transformId>/<providerId>/<model>` runs the\n * request through a `ModelTransform` (plugin kind `modelTransform`) on its way to\n * `<providerId>/<model>` and the answer on its way back.\n *\n * Outbound, every text leaf of the pi `Context` goes through `outbound` before\n * pi-ai sees the request. Inbound, every text of the pi event stream goes through\n * `inbound`, streamed text through one `inboundStream` per content block.\n * Nothing here knows what a transform does.\n */\n\nimport type {\n AssistantMessage,\n AssistantMessageEvent,\n Context,\n ImageContent,\n Message,\n TextContent,\n ToolCall,\n} from \"@earendil-works/pi-ai\";\nimport type { ModelTransform } from \"@skaile/workspaces/plugin-registry\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** One streamed text block of a transform. */\ntype InboundStream = ReturnType<ModelTransform[\"inboundStream\"]>;\n\n/** A text mapper: `outbound` is async, `inbound` is not. */\ntype TextMap = (text: string) => string | Promise<string>;\n\n/**\n * The transform id and the rest of `model` when `model` starts with `<id>/` for\n * a configured id; `undefined` for any other model (it is no transform model).\n */\nexport function splitTransformModel(\n model: string,\n ids: ReadonlySet<string>,\n): { id: string; target: string } | undefined {\n const slash = model.indexOf(\"/\");\n if (slash < 0) return undefined;\n const id = model.slice(0, slash);\n if (!ids.has(id)) return undefined;\n const target = model.slice(slash + 1);\n if (target === \"\") {\n throw new ModelEndpointError(\n 400,\n `${id}/ needs a model: ${id}/<providerId>/<model>`,\n \"missing_model\",\n );\n }\n return { id, target };\n}\n\n/**\n * `value` with every string leaf passed through `fn`, one after another (the\n * order of the calls is the order of the text). Objects and arrays are rebuilt,\n * keys and non-string leaves are kept.\n */\nexport async function mapStrings<T>(value: T, fn: TextMap): Promise<T> {\n if (typeof value === \"string\") return (await fn(value)) as T;\n if (Array.isArray(value)) {\n const items: unknown[] = [];\n for (const item of value) items.push(await mapStrings(item, fn));\n return items as T;\n }\n if (typeof value === \"object\" && value !== null) {\n const entries: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) entries[key] = await mapStrings(item, fn);\n return entries as T;\n }\n return value;\n}\n\n// ── outbound ────────────────────────────────────────────────────────────────\n\n/**\n * A copy of `context` with every text leaf passed through `transform.outbound`:\n * the system prompt (the transform's instruction first), system messages and\n * their sections, user text, assistant text, thinking, tool-call arguments and\n * error message, tool-result text. Tool definitions are left alone. Image parts\n * are refused, since the transform cannot read them. Throws before anything is\n * sent: an `outbound` failure is 500 `transform_failed`.\n */\nexport async function transformContext(\n context: Context,\n transform: ModelTransform,\n id: string,\n): Promise<Context> {\n const out: TextMap = async (text) => {\n if (text === \"\") return text;\n try {\n return await transform.outbound(text);\n } catch (cause) {\n if (cause instanceof ModelEndpointError) throw cause;\n throw new ModelEndpointError(\n 500,\n cause instanceof Error ? cause.message : String(cause),\n \"transform_failed\",\n \"server_error\",\n );\n }\n };\n const textOnly = () =>\n new ModelEndpointError(\n 400,\n `${id}/ models take text only: remove the image or use a model without a transform`,\n \"unsupported_content\",\n );\n const parts = async (list: readonly (TextContent | ImageContent)[]): Promise<TextContent[]> => {\n const mapped: TextContent[] = [];\n for (const part of list) {\n if (part.type === \"image\") throw textOnly();\n mapped.push({ ...part, text: await out(part.text) });\n }\n return mapped;\n };\n\n const host = context.systemPrompt ? await out(context.systemPrompt) : undefined;\n const systemPrompt = transform.instruction\n ? host !== undefined\n ? `${transform.instruction}\\n\\n${host}`\n : transform.instruction\n : host;\n\n const messages: Message[] = [];\n for (const message of context.messages) {\n switch (message.role) {\n case \"system\": {\n const content =\n typeof message.content === \"string\"\n ? await out(message.content)\n : await parts(message.content);\n let sections: Record<string, string | null> | undefined;\n if (message.sections) {\n sections = {};\n for (const [name, value] of Object.entries(message.sections)) {\n sections[name] = value === null ? null : await out(value);\n }\n }\n messages.push({ ...message, content, ...(sections ? { sections } : {}) });\n break;\n }\n case \"user\":\n messages.push({\n ...message,\n content:\n typeof message.content === \"string\"\n ? await out(message.content)\n : await parts(message.content),\n });\n break;\n case \"assistant\":\n messages.push(await mapAssistant(message, out));\n break;\n case \"toolResult\":\n messages.push({ ...message, content: await parts(message.content) } as Message);\n break;\n }\n }\n\n return {\n ...(systemPrompt !== undefined ? { systemPrompt } : {}),\n messages,\n ...(context.tools ? { tools: context.tools } : {}),\n };\n}\n\n// ── inbound ─────────────────────────────────────────────────────────────────\n\n/** `message` with its text, thinking, tool-call arguments and error message passed through `fn`. */\nasync function mapAssistant<M extends AssistantMessage>(message: M, fn: TextMap): Promise<M> {\n const content: AssistantMessage[\"content\"] = [];\n for (const part of message.content) {\n if (part.type === \"text\") content.push({ ...part, text: await fn(part.text) });\n else if (part.type === \"thinking\") {\n content.push({ ...part, thinking: await fn(part.thinking) });\n } else content.push({ ...part, arguments: await mapStrings(part.arguments, fn) });\n }\n return {\n ...message,\n content,\n ...(message.errorMessage !== undefined ? { errorMessage: await fn(message.errorMessage) } : {}),\n };\n}\n\n/** The final or failed assistant message of a stream with `transform.inbound` applied to its texts. */\nexport function inboundMessage(\n message: AssistantMessage,\n transform: ModelTransform,\n): Promise<AssistantMessage> {\n return mapAssistant(message, (text) => transform.inbound(text));\n}\n\n/**\n * The pi event stream with `transform.inbound` applied to every text, in the\n * order the translators read it: deltas through one `inboundStream` per content\n * block (a held tail is released before the block's end event, or before\n * `done`/`error`), block ends, tool-call arguments, the final message and the\n * error message whole. `partial` is not rewritten: the translators never read it.\n */\nexport async function* inboundEvents(\n events: AsyncIterable<AssistantMessageEvent>,\n transform: ModelTransform,\n): AsyncIterable<AssistantMessageEvent> {\n const blocks = new Map<\n number,\n { kind: \"text_delta\" | \"thinking_delta\"; stream: InboundStream }\n >();\n const block = (index: number, kind: \"text_delta\" | \"thinking_delta\") => {\n let entry = blocks.get(index);\n if (!entry) {\n entry = { kind, stream: transform.inboundStream() };\n blocks.set(index, entry);\n }\n return entry;\n };\n /** Delta events for the tails of the blocks that never saw their end event. */\n function* leftovers(partial: AssistantMessage): Generator<AssistantMessageEvent> {\n for (const [contentIndex, { kind, stream }] of blocks) {\n const delta = stream.flush();\n if (delta !== \"\") yield { type: kind, contentIndex, delta, partial };\n }\n blocks.clear();\n }\n\n for await (const event of events) {\n switch (event.type) {\n case \"text_delta\":\n case \"thinking_delta\": {\n const delta = block(event.contentIndex, event.type).stream.push(event.delta);\n if (delta !== \"\") yield { ...event, delta };\n break;\n }\n case \"text_end\":\n case \"thinking_end\": {\n const kind = event.type === \"text_end\" ? \"text_delta\" : \"thinking_delta\";\n const tail = block(event.contentIndex, kind).stream.flush();\n blocks.delete(event.contentIndex);\n if (tail !== \"\") {\n yield {\n type: kind,\n contentIndex: event.contentIndex,\n delta: tail,\n partial: event.partial,\n };\n }\n yield { ...event, content: transform.inbound(event.content) };\n break;\n }\n case \"toolcall_end\": {\n const toolCall: ToolCall = {\n ...event.toolCall,\n arguments: await mapStrings(event.toolCall.arguments, (text) => transform.inbound(text)),\n };\n yield { ...event, toolCall };\n break;\n }\n case \"done\":\n yield* leftovers(event.message);\n yield { ...event, message: await inboundMessage(event.message, transform) };\n break;\n case \"error\":\n yield* leftovers(event.error);\n yield { ...event, error: await inboundMessage(event.error, transform) };\n break;\n default:\n yield event;\n }\n }\n}\n","/**\n * The models an entry that declares none (`model_map` / `capabilities`) serves,\n * asked of its upstream (`GET <base_url>/models`).\n *\n * `/v1/models` lists them, and a bare model id is accepted only when an upstream\n * lists it: an id nobody declares or lists is a typo, not something to send to the\n * first entry with its credential. The request carries the credential the way the\n * forwarded requests do (`credential.kind`, the preset's auth header). Best effort: an\n * upstream that does not answer, or answers in another shape, lists nothing for that\n * request, and that outcome is not remembered.\n */\n\nimport type { MergedAIProviderRegistry } from \"@skaile/workspaces/core/provider-registry\";\nimport { buildCredentialHeaders } from \"../../bridge/src/provider-catalog.js\";\nimport { entryCredentialValue } from \"../../bridge/src/provider-materialize/credential-env.js\";\nimport {\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n selectableEntries,\n} from \"../../bridge/src/provider-materialize/env-harnesses.js\";\n\n/** Longest the endpoint waits for one upstream to list its models. */\nconst LIST_TIMEOUT_MS = 5000;\n/** How long an answer of an upstream is reused. A failed listing is never kept: the next request asks again. */\nconst CACHE_TTL_MS = 60_000;\nconst ANTHROPIC_VERSION = \"2023-06-01\";\n\n/** Provider id → the model ids its upstream lists. */\nexport type UpstreamModels = Record<string, ReadonlySet<string>>;\n\n/** Remembers each upstream's successful answer for a minute, so a request does not wait for it again. */\nexport class UpstreamModelCache {\n private readonly cache = new Map<string, { at: number; ids: ReadonlySet<string> }>();\n\n async list(\n registry: MergedAIProviderRegistry,\n lookupEnv: Record<string, string | undefined>,\n fetchFn: typeof fetch,\n ): Promise<UpstreamModels> {\n const open = selectableEntries(registry).filter(\n ([, entry]) => entryModelIds(entry).length === 0,\n );\n const lists = await Promise.all(\n open.map(async ([providerId, entry]) => {\n const surface = entrySurface(entry);\n const baseUrl = entryBaseUrl(entry);\n if (!surface || !baseUrl) return [providerId, new Set<string>()] as const;\n const key = `${providerId}\\n${baseUrl}`;\n const hit = this.cache.get(key);\n if (hit && Date.now() - hit.at < CACHE_TTL_MS) return [providerId, hit.ids] as const;\n const apiKey = entryCredentialValue(providerId, entry, {\n env: lookupEnv,\n allowCommand: false,\n });\n const ids = await fetchIds(\n surface,\n baseUrl,\n buildCredentialHeaders(entry, apiKey),\n entry.headers,\n fetchFn,\n );\n if (!ids) return [providerId, new Set<string>()] as const;\n this.cache.set(key, { at: Date.now(), ids });\n return [providerId, ids] as const;\n }),\n );\n return Object.fromEntries(lists);\n }\n}\n\nasync function fetchIds(\n surface: string,\n baseUrl: string,\n credentialHeaders: Record<string, string>,\n entryHeaders: Record<string, string> | undefined,\n fetchFn: typeof fetch,\n): Promise<ReadonlySet<string> | undefined> {\n const anthropic = surface === \"anthropic-messages\";\n if (!anthropic && surface !== \"openai-completions\" && surface !== \"openai-responses\") {\n return undefined;\n }\n const url = anthropic ? `${baseUrl}/v1/models?limit=1000` : `${baseUrl}/models`;\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...entryHeaders,\n ...credentialHeaders,\n };\n if (anthropic) headers[\"anthropic-version\"] = ANTHROPIC_VERSION;\n try {\n const res = await fetchFn(url, { headers, signal: AbortSignal.timeout(LIST_TIMEOUT_MS) });\n if (!res.ok) return undefined;\n const body: unknown = await res.json();\n const data = (body as { data?: unknown } | null)?.data;\n if (!Array.isArray(data)) return undefined;\n return new Set(\n data.flatMap((item) => {\n const id = (item as { id?: unknown } | null)?.id;\n return typeof id === \"string\" && id !== \"\" ? [id] : [];\n }),\n );\n } catch {\n return undefined;\n }\n}\n","/**\n * Upstream `usage.cost` capture.\n *\n * OpenRouter reports the USD cost of a call as `usage.cost` in its response\n * (JSON body, or the last SSE usage chunk). pi-ai drops it: its usage parser\n * reads token counts only. The capture wraps the `fetch` pi uses for one\n * request and reads the cost off a copy of the upstream body.\n */\n\n/** Reads upstream `usage.cost` for the requests made through `fetch`. */\nexport interface CostCapture {\n /** Pass as pi's per-request `fetch`. */\n fetch: typeof fetch;\n /** Resolves once every captured upstream body ended; `undefined` when no cost was reported. */\n cost(): Promise<number | undefined>;\n}\n\n/** The finite `usage.cost` number of one parsed JSON payload, if it has one. */\nfunction costOf(payload: unknown): number | undefined {\n if (typeof payload !== \"object\" || payload === null || !(\"usage\" in payload)) return undefined;\n const { usage } = payload;\n if (typeof usage !== \"object\" || usage === null || !(\"cost\" in usage)) return undefined;\n const { cost } = usage;\n return typeof cost === \"number\" && Number.isFinite(cost) ? cost : undefined;\n}\n\n/** Last `usage.cost` among the `data:` lines of an SSE body; a read error yields `undefined`. */\nasync function sseCost(body: ReadableStream<Uint8Array>): Promise<number | undefined> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let pending = \"\";\n let cost: number | undefined;\n const scan = (line: string): void => {\n if (!line.startsWith(\"data:\") || !line.includes('\"cost\"')) return;\n try {\n cost = costOf(JSON.parse(line.slice(\"data:\".length))) ?? cost;\n } catch {\n // Not a JSON frame (`[DONE]` carries no cost anyway).\n }\n };\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n pending += decoder.decode(value, { stream: true });\n const lines = pending.split(\"\\n\");\n pending = lines.pop() ?? \"\";\n for (const line of lines) scan(line.endsWith(\"\\r\") ? line.slice(0, -1) : line);\n }\n scan(pending + decoder.decode());\n return cost;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Wraps `base` so the cost of each OpenAI-compatible response that goes\n * through it can be read afterwards. The caller receives the body unchanged;\n * a copy (`tee()` for SSE, `clone()` for JSON) is read on the side, so the\n * capture never delays or fails the real request.\n */\nexport function createCostCapture(base: typeof fetch = globalThis.fetch): CostCapture {\n const reads: Promise<number | undefined>[] = [];\n const capturing = (async (input, init) => {\n const response = await base(input, init);\n const type = response.headers.get(\"content-type\") ?? \"\";\n if (type.startsWith(\"text/event-stream\") && response.body) {\n const [forCaller, forCost] = response.body.tee();\n reads.push(sseCost(forCost));\n return new Response(forCaller, response);\n }\n if (type.startsWith(\"application/json\") && response.body) {\n reads.push(\n response\n .clone()\n .json()\n .then(costOf, () => undefined),\n );\n }\n return response;\n }) as typeof fetch;\n return {\n fetch: capturing,\n async cost() {\n const costs = await Promise.all(reads);\n return costs.reduce<number | undefined>((last, cost) => cost ?? last, undefined);\n },\n };\n}\n","/**\n * The loopback OpenAI-compatible HTTP server.\n *\n * Plain `node:http` so it runs identically under Node and Bun. pi-ai is\n * imported lazily inside the handlers: the package is an optional peer, and\n * merely importing `@skaile/workspaces/model-endpoint` must not fail without it.\n */\n\nimport { createHash, randomUUID, timingSafeEqual } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport type { AssistantMessage, AssistantMessageEvent } from \"@earendil-works/pi-ai\";\nimport { listenWithProbe, loadHarnessSdk, loadHarnessSdkSubpath } from \"@skaile/workspaces/core\";\nimport type { ModelTransform } from \"@skaile/workspaces/plugin-registry\";\nimport type { AgentEvent } from \"@skaile/workspaces/types\";\nimport {\n type AgentStreamState,\n agentCompletionChunks,\n agentCompletionEnd,\n agentPromptText,\n createAgentStreamState,\n endsAgentTurn,\n toAgentCompletion,\n} from \"./openai-agent.js\";\nimport {\n type ChatCompletionRequest,\n chatCompletionChunks,\n createChatStreamState,\n parseChatCompletionRequest,\n toChatCompletion,\n} from \"./openai-chat.js\";\nimport {\n createResponsesStreamState,\n parseResponsesRequest,\n responsesEvents,\n toResponse,\n} from \"./openai-responses.js\";\nimport {\n listModels,\n listPassThroughProviders,\n needsUpstreamModels,\n type ResolveDeps,\n resolveModel,\n} from \"./resolve.js\";\nimport { inboundEvents, splitTransformModel, transformContext } from \"./transform.js\";\nimport { UpstreamModelCache } from \"./upstream-models.js\";\nimport { createCostCapture } from \"./usage-cost.js\";\nimport {\n AGENT_MODEL_ID,\n type AgentLoop,\n ModelEndpointError,\n type ModelEndpointHandle,\n type ModelEndpointOptions,\n type PiApiModule,\n type ResolvedModel,\n} from \"./types.js\";\n\n/** Largest accepted request body. Chat transcripts with inline images get big. */\nconst MAX_BODY_BYTES = 10 * 1024 * 1024;\n/** Longest a response waits for the cost side-reader after the upstream answer is complete. */\nconst COST_WAIT_MS = 2000;\n/** Surfaces whose upstream serves `POST <base>/embeddings`. */\nconst EMBEDDING_SURFACES = new Set([\"openai-completions\", \"openai-responses\"]);\n\ntype GenerationRequest = ReturnType<typeof parseChatCompletionRequest>;\n\n/** Per-request facts the access log reports. */\ninterface Trace {\n target?: string;\n}\n\n/**\n * Start the endpoint. Resolves once the socket is listening.\n *\n * Registry, env and roles are read per request through the getters so a\n * session swap is visible immediately.\n */\nexport async function startModelEndpoint(\n options: ModelEndpointOptions,\n): Promise<ModelEndpointHandle> {\n if (!options.token) throw new Error(\"model endpoint requires a non-empty token\");\n const host = options.host ?? \"127.0.0.1\";\n const log = options.log ?? (() => {});\n const projectDir = options.projectDir ?? process.cwd();\n const loadApi = options.loadApi ?? ((surface: string) => defaultLoadApi(surface, projectDir));\n const tokenDigest = digest(options.token);\n const upstreamModels = new UpstreamModelCache();\n const transformIds = new Set(Object.keys(options.transforms ?? {}));\n const listedTransformIds = [...(options.enabledTransforms ?? transformIds)]\n .filter((id) => transformIds.has(id))\n .sort();\n const builtTransforms = new Map<string, Promise<ModelTransform>>();\n\n /** `model` without its transform prefix, and the transform id when it had one configured. */\n function splitModel(model: string): { target: string; id?: string } {\n return splitTransformModel(model, transformIds) ?? { target: model };\n }\n\n /**\n * The transform for `id`, built on its first use and shared by every later request. A rejected\n * build is forgotten so the next request tries again; its failure is the request's error.\n */\n async function buildTransform(\n id: string | undefined,\n ): Promise<{ id: string; transform: ModelTransform } | undefined> {\n const factory = id === undefined ? undefined : options.transforms?.[id];\n if (id === undefined || !factory) return undefined;\n let built = builtTransforms.get(id);\n if (!built) {\n built = Promise.resolve()\n .then(factory)\n .catch((cause) => {\n builtTransforms.delete(id);\n throw cause instanceof ModelEndpointError\n ? cause\n : new ModelEndpointError(500, errorText(cause), \"transform_failed\", \"server_error\");\n });\n builtTransforms.set(id, built);\n }\n return { id, transform: await built };\n }\n\n /** {@link resolveModel}, after asking the upstreams what they list when the id is a bare one no entry declares. */\n async function resolveWithUpstream(selector: string): Promise<ResolvedModel> {\n const current = deps();\n if (needsUpstreamModels(selector, current)) {\n current.upstreamModels = await upstreamModels.list(\n current.registry,\n current.lookupEnv,\n options.fetch ?? globalThis.fetch,\n );\n }\n return resolveModel(selector, current);\n }\n\n /**\n * Split off the transform prefix of `model`, resolve the rest and build the transform. Records the\n * target (`<id>/` prefix included) on `trace` once it resolves.\n */\n async function resolveTarget(\n model: string,\n trace: Trace,\n ): Promise<{\n resolved: ResolvedModel;\n transform: { id: string; transform: ModelTransform } | undefined;\n }> {\n const { target, id: transformId } = splitModel(model);\n const resolved = await resolveWithUpstream(target);\n trace.target = `${transformId ? `${transformId}/` : \"\"}${resolved.providerId}/${resolved.logicalId}`;\n return { resolved, transform: await buildTransform(transformId) };\n }\n\n const deps = (): ResolveDeps => ({\n registry: options.getRegistry(),\n lookupEnv: options.getLookupEnv(),\n roles: options.getRoles?.(),\n });\n\n /** `skaile-agent` is a chat model only: the other surfaces refuse it while it is on. */\n function rejectAgentSurface(model: string): void {\n if (model === AGENT_MODEL_ID && options.getAgentLoop?.()) {\n throw new ModelEndpointError(\n 400,\n `${AGENT_MODEL_ID} is served on /v1/chat/completions only`,\n \"agent_model_unsupported_surface\",\n );\n }\n }\n\n function authenticate(req: IncomingMessage): void {\n const match = /^Bearer\\s+(.+)$/i.exec(req.headers.authorization ?? \"\");\n // Hash both sides so the comparison is constant-time regardless of length.\n if (!match || !timingSafeEqual(digest(match[1] ?? \"\"), tokenDigest)) {\n throw new ModelEndpointError(401, \"invalid or missing bearer token\", \"invalid_api_key\");\n }\n }\n\n /**\n * Start the upstream pi stream for a parsed chat/responses request. With\n * `captureCost`, `cost()` resolves to the upstream-reported `usage.cost`\n * (OpenAI-completions upstreams only); otherwise it resolves to `undefined`.\n */\n async function startUpstream(\n request: GenerationRequest,\n resolved: ResolvedModel,\n signal: AbortSignal,\n captureCost = false,\n transform?: { id: string; transform: ModelTransform },\n ): Promise<{\n events: AsyncIterable<AssistantMessageEvent>;\n cost(): Promise<number | undefined>;\n }> {\n const pi = await loadPi(projectDir);\n const surface = resolved.model.api;\n let api: PiApiModule;\n try {\n api = await loadApi(surface);\n } catch (cause) {\n throw new ModelEndpointError(\n 501,\n `surface '${surface}' is not supported by the installed pi-ai: ${errorText(cause)}`,\n \"surface_unsupported\",\n );\n }\n const { temperature, maxTokens, samplingParams, reasoning } = request.options;\n // Only the OpenAI-completions adapter has an upstream `usage.cost`; others\n // (Google) reject a custom fetch, so it is not injected for them.\n const capture =\n captureCost && surface === \"openai-completions\"\n ? createCostCapture(options.fetch ?? globalThis.fetch)\n : undefined;\n const common = {\n ...(resolved.apiKey !== undefined ? { apiKey: resolved.apiKey } : {}),\n ...(resolved.headers ? { headers: resolved.headers } : {}),\n signal,\n ...(capture ? { fetch: capture.fetch } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined ? { maxTokens } : {}),\n ...(samplingParams !== undefined ? { samplingParams } : {}),\n };\n const context = pi.normalizeContext(\n transform\n ? await transformContext(request.context, transform.transform, transform.id)\n : request.context,\n );\n const cost = () =>\n capture ? withCeiling(capture.cost(), COST_WAIT_MS) : Promise.resolve(undefined);\n const inbound = (events: AsyncIterable<AssistantMessageEvent>) =>\n transform ? inboundEvents(events, transform.transform) : events;\n // Only `streamSimple` maps a provider-neutral thinking level onto the\n // surface's own effort field (`reasoning_effort`, Anthropic `effort`, …).\n if (reasoning !== undefined && api.streamSimple) {\n return {\n events: inbound(\n api.streamSimple(resolved.model, context, {\n ...common,\n reasoning,\n }) as AsyncIterable<AssistantMessageEvent>,\n ),\n cost,\n };\n }\n return {\n events: inbound(\n api.stream(resolved.model, context, common) as AsyncIterable<AssistantMessageEvent>,\n ),\n cost,\n };\n }\n\n async function handleChat(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const request = parseChatCompletionRequest(await readJson(req));\n const agentLoop = request.model === AGENT_MODEL_ID ? options.getAgentLoop?.() : undefined;\n if (agentLoop) return handleAgentChat(res, request, agentLoop, signal, trace);\n const { resolved, transform } = await resolveTarget(request.model, trace);\n const { events, cost } = await startUpstream(request, resolved, signal, true, transform);\n const id = `chatcmpl-${randomUUID().replaceAll(\"-\", \"\")}`;\n const created = Math.floor(Date.now() / 1000);\n\n if (!request.stream) {\n const message = await collectFinal(events);\n sendJson(\n res,\n 200,\n toChatCompletion(message, { id, created, model: request.model }, await cost()),\n );\n return;\n }\n const state = createChatStreamState({\n id,\n created,\n model: request.model,\n includeUsage: request.includeUsage,\n });\n await pipeSse(res, events, {\n frames: async (event) => {\n // The usage chunk is the one frame that carries the cost; wait for it\n // only when the caller asked for usage.\n if (event.type === \"done\" && state.includeUsage) state.cost = await cost();\n return chatCompletionChunks(event, state);\n },\n errorFrame: upstreamErrorFrame,\n terminator: \"[DONE]\",\n });\n }\n\n /**\n * The `skaile-agent` pseudo-model: hand the last user message to the running\n * workspace agent and relay its turn. A client that goes away aborts the turn.\n */\n async function handleAgentChat(\n res: ServerResponse,\n request: ChatCompletionRequest,\n loop: AgentLoop,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n trace.target = AGENT_MODEL_ID;\n const text = agentPromptText(request);\n const run = await loop.prompt({ text, requestId: randomUUID() });\n const abort = () => {\n run.abort().catch((cause) => log(`agent abort failed: ${errorText(cause)}`));\n };\n if (signal.aborted) abort();\n else signal.addEventListener(\"abort\", abort, { once: true });\n try {\n const id = `chatcmpl-${randomUUID().replaceAll(\"-\", \"\")}`;\n const created = Math.floor(Date.now() / 1000);\n if (!request.stream) {\n const completion = await toAgentCompletion(run.events, {\n id,\n created,\n model: AGENT_MODEL_ID,\n });\n sendJson(res, 200, completion);\n return;\n }\n const state = createAgentStreamState({\n id,\n created,\n model: AGENT_MODEL_ID,\n includeUsage: request.includeUsage,\n });\n await pipeAgentSse(res, run.events, state);\n } finally {\n signal.removeEventListener(\"abort\", abort);\n }\n }\n\n async function handleResponses(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const request = parseResponsesRequest(await readJson(req));\n rejectAgentSurface(request.model);\n const { resolved, transform } = await resolveTarget(request.model, trace);\n const { events } = await startUpstream(request, resolved, signal, false, transform);\n const id = `resp_${randomUUID().replaceAll(\"-\", \"\")}`;\n const created = Math.floor(Date.now() / 1000);\n\n if (!request.stream) {\n const message = await collectFinal(events);\n sendJson(res, 200, toResponse(message, { id, created, model: request.model }));\n return;\n }\n const state = createResponsesStreamState({ id, created, model: request.model });\n await pipeSse(res, events, {\n frames: (event) => responsesEvents(event, state),\n errorFrame: (message) => ({ type: \"error\", code: \"upstream_error\", message, param: null }),\n eventName: (frame) =>\n isRecord(frame) && typeof frame.type === \"string\" ? frame.type : undefined,\n });\n }\n\n async function handleEmbeddings(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const body = await readJson(req);\n if (!isRecord(body) || typeof body.model !== \"string\" || body.model === \"\") {\n throw new ModelEndpointError(400, \"`model` is required\", \"missing_model\");\n }\n rejectAgentSurface(body.model);\n const transformModel = splitTransformModel(body.model, transformIds);\n if (transformModel) {\n throw new ModelEndpointError(\n 400,\n `${transformModel.id}/ models are served on /v1/chat/completions and /v1/responses only`,\n \"transform_unsupported_surface\",\n );\n }\n const resolved = await resolveWithUpstream(body.model);\n trace.target = `${resolved.providerId}/${resolved.logicalId}`;\n if (!EMBEDDING_SURFACES.has(resolved.model.api)) {\n throw new ModelEndpointError(\n 501,\n `embeddings not supported for surface ${resolved.model.api}`,\n \"embeddings_unsupported\",\n );\n }\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n ...resolved.headers,\n };\n if (resolved.apiKey) headers.authorization = `Bearer ${resolved.apiKey}`;\n\n let upstream: Response;\n try {\n upstream = await (options.fetch ?? globalThis.fetch)(`${resolved.model.baseUrl}/embeddings`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...body, model: resolved.model.id }),\n signal,\n });\n } catch (cause) {\n if (signal.aborted) return;\n throw new ModelEndpointError(\n 502,\n `embeddings upstream unreachable: ${errorText(cause)}`,\n \"upstream_unreachable\",\n );\n }\n // fetch has already decoded the body, so content-encoding/length are not copied.\n const payload = Buffer.from(await upstream.arrayBuffer());\n res.writeHead(upstream.status, {\n \"content-type\": upstream.headers.get(\"content-type\") ?? \"application/json\",\n \"content-length\": payload.length,\n });\n res.end(payload);\n }\n\n async function dispatch(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n path: string,\n trace: Trace,\n ): Promise<void> {\n if (!path.startsWith(\"/v1/\")) throw notFound(path);\n authenticate(req);\n switch (`${req.method} ${path}`) {\n case \"GET /v1/models\": {\n const registry = options.getRegistry();\n const upstream = await upstreamModels.list(\n registry,\n options.getLookupEnv(),\n options.fetch ?? globalThis.fetch,\n );\n sendJson(res, 200, {\n object: \"list\",\n data: [\n ...listModels(registry, upstream).map((m) => ({\n id: m.id,\n object: \"model\",\n created: 0,\n owned_by: m.owned_by,\n })),\n ...listedTransformIds.flatMap((transformId) =>\n listModels(registry, upstream).map((m) => ({\n id: `${transformId}/${m.id}`,\n object: \"model\",\n created: 0,\n owned_by: m.owned_by,\n })),\n ),\n ...(options.getAgentLoop?.()\n ? [{ id: AGENT_MODEL_ID, object: \"model\", created: 0, owned_by: \"skaile\" }]\n : []),\n ],\n // Entries that declare no models forward any `<id>/<model>`, also one their upstream\n // does not list.\n pass_through_providers: listPassThroughProviders(registry),\n // Only with transforms configured, so an endpoint without any answers as it always did.\n ...(listedTransformIds.length > 0 ? { transform_prefixes: listedTransformIds } : {}),\n });\n return;\n }\n case \"POST /v1/chat/completions\":\n return handleChat(req, res, signal, trace);\n case \"POST /v1/responses\":\n return handleResponses(req, res, signal, trace);\n case \"POST /v1/embeddings\":\n return handleEmbeddings(req, res, signal, trace);\n default:\n throw notFound(path);\n }\n }\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const started = performance.now();\n const controller = new AbortController();\n // `req` 'close' fires once the body is read; the response closing early is\n // the reliable \"client went away\" signal.\n res.on(\"close\", () => {\n if (!res.writableFinished) controller.abort();\n });\n const trace: Trace = {};\n let path = req.url ?? \"/\";\n try {\n path = requestPath(req);\n await dispatch(req, res, controller.signal, path, trace);\n } catch (err) {\n if (!(err instanceof ModelEndpointError)) {\n log(\n `error ${req.method} ${path}: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`,\n );\n }\n sendError(res, err);\n } finally {\n const ms = Math.round(performance.now() - started);\n log(`${req.method} ${path} ${trace.target ?? \"-\"} ${res.statusCode} ${ms}ms`);\n }\n }\n\n const server = createServer((req, res) => {\n void handle(req, res);\n });\n try {\n await listenWithProbe(server, options.port ?? 0, host);\n } catch (err) {\n if (!(err instanceof Error && \"code\" in err && err.code === \"EADDRINUSE\")) throw err;\n // The same one-line form the WebSocket port gets (transport/ws/server.ts).\n throw Object.assign(\n new Error(\n `${host}:${options.port ?? 0} is already in use: another process listens there. Pick another port for the model endpoint (--model-endpoint <port>, or model_endpoint.port in skaile.yaml).`,\n ),\n { code: \"EADDRINUSE\" },\n );\n }\n const address = server.address() as AddressInfo;\n const hostPart = host.includes(\":\") ? `[${host}]` : host;\n return {\n url: `http://${hostPart}:${address.port}/v1`,\n port: address.port,\n token: options.token,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n server.closeAllConnections?.();\n }),\n };\n}\n\n// ── pi-ai loading ───────────────────────────────────────────────────────────\n\n/** What a pi-ai load failure says. One line; names both places pi-ai was looked for. */\nfunction piAiNotInstalled(cause: unknown): ModelEndpointError {\n return new ModelEndpointError(500, errorText(cause), \"pi_ai_not_installed\", \"server_error\");\n}\n\nconst PI_AI = \"@earendil-works/pi-ai\";\nconst PI_AI_LABEL = `the model endpoint needs ${PI_AI}, which is`;\n\n/**\n * pi-ai root, loaded on first use: from `<projectDir>/node_modules` first, then\n * next to skaile. A missing peer becomes a clear 500 that names both places.\n */\nasync function loadPi(projectDir: string): Promise<typeof import(\"@earendil-works/pi-ai\")> {\n try {\n return await loadHarnessSdk(\n PI_AI,\n projectDir,\n () => import(\"@earendil-works/pi-ai\"),\n PI_AI_LABEL,\n );\n } catch (cause) {\n throw piAiNotInstalled(cause);\n }\n}\n\n/**\n * Check that pi-ai can be loaded for `projectDir`; `skaile serve --model-endpoint`\n * runs it before its ready line.\n *\n * @returns The one-line problem (both places looked in, the install command), or `null`.\n */\nexport async function checkPiAiInstalled(projectDir: string): Promise<string | null> {\n try {\n await loadPi(projectDir);\n return null;\n } catch (err) {\n return errorText(err);\n }\n}\n\n/** Default api loader: the surface is runtime-selected per entry and pi-ai is an optional peer. */\nasync function defaultLoadApi(surface: string, projectDir: string): Promise<PiApiModule> {\n if (!/^[a-z0-9-]+$/.test(surface)) throw new Error(`invalid surface '${surface}'`);\n return loadHarnessSdkSubpath<PiApiModule>(\n PI_AI,\n `api/${surface}`,\n projectDir,\n () => import(/* @vite-ignore */ `${PI_AI}/api/${surface}`) as Promise<PiApiModule>,\n `${PI_AI} (surface ${surface})`,\n );\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\n/** Drain the stream to its final message; an `error` event becomes a 502. */\nasync function collectFinal(\n events: AsyncIterable<AssistantMessageEvent>,\n): Promise<AssistantMessage> {\n for await (const event of events) {\n if (event.type === \"done\") return event.message;\n if (event.type === \"error\") throw upstreamFailure(event.error);\n }\n throw new ModelEndpointError(\n 502,\n \"upstream ended without a final message\",\n \"upstream_incomplete\",\n );\n}\n\n/** `promise`, or `undefined` once `ms` passed: a slow cost side-reader must not hold the answer back. */\nfunction withCeiling<T>(promise: Promise<T>, ms: number): Promise<T | undefined> {\n // Not `Promise.withResolvers`: the provider/connector packages typecheck against a lib older than es2024.\n let resolve!: (value: undefined) => void;\n const timeout = new Promise<undefined>((res) => {\n resolve = res;\n });\n const timer = setTimeout(resolve, ms);\n return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));\n}\n\nfunction upstreamFailure(message: AssistantMessage): ModelEndpointError {\n return new ModelEndpointError(\n 502,\n message.errorMessage ?? `upstream ${message.stopReason}`,\n \"upstream_error\",\n );\n}\n\ninterface SsePipe {\n /** Map one pi event to wire frames. Never called with `error` events. */\n frames(event: AssistantMessageEvent): unknown[] | Promise<unknown[]>;\n /** Frame announcing a failure once the stream has started. */\n errorFrame(message: string): unknown;\n /** SSE `event:` name for a frame, when the protocol uses one. */\n eventName?(frame: unknown): string | undefined;\n /** Sentinel written after the last frame. */\n terminator?: \"[DONE]\";\n}\n\n/**\n * Relay pi events as SSE. Headers go out with the first event, not before: an\n * upstream failure that precedes it (bad credential, unknown model) then\n * surfaces as a real HTTP 502 instead of a 200 stream carrying an error.\n */\nasync function pipeSse(\n res: ServerResponse,\n events: AsyncIterable<AssistantMessageEvent>,\n pipe: SsePipe,\n): Promise<void> {\n let sse: Sse | undefined;\n const sendAll = async (frames: unknown[]) => {\n for (const frame of frames) await sse?.send(frame, pipe.eventName?.(frame));\n };\n try {\n for await (const event of events) {\n if (!sse) {\n if (event.type === \"error\") throw upstreamFailure(event.error);\n sse = openSse(res);\n }\n if (event.type === \"error\") {\n await sendAll([pipe.errorFrame(event.error.errorMessage ?? `upstream ${event.reason}`)]);\n break;\n }\n await sendAll(await pipe.frames(event));\n }\n } catch (err) {\n if (!sse) throw err;\n await sendAll([pipe.errorFrame(errorText(err))]);\n }\n if (!sse)\n throw new ModelEndpointError(502, \"upstream ended without events\", \"upstream_incomplete\");\n if (pipe.terminator) await sse.raw(pipe.terminator);\n res.end();\n}\n\n/**\n * Relay one agent turn as chat-completion SSE, the same framing `pipeSse` gives a\n * model stream. The stream opens with the first chunk; a failure before it is a real HTTP error.\n */\nasync function pipeAgentSse(\n res: ServerResponse,\n events: AsyncIterable<AgentEvent>,\n state: AgentStreamState,\n): Promise<void> {\n let sse: Sse | undefined;\n const sendAll = async (frames: unknown[]) => {\n for (const frame of frames) {\n sse ??= openSse(res);\n await sse.send(frame);\n }\n };\n try {\n for await (const event of events) {\n await sendAll(agentCompletionChunks(event, state));\n if (endsAgentTurn(event)) break;\n }\n await sendAll(agentCompletionEnd(state));\n } catch (err) {\n if (!sse) throw err;\n state.error ??= errorText(err);\n }\n // A fatal turn error follows the closing chunks, like an upstream failure on a model stream.\n if (state.error !== undefined) await sendAll([upstreamErrorFrame(state.error)]);\n await sse?.raw(\"[DONE]\");\n res.end();\n}\n\n/** SSE frame announcing a failure once a chat stream has started. */\nfunction upstreamErrorFrame(message: string): unknown {\n return { error: { message, type: \"upstream_error\" } };\n}\n\ninterface Sse {\n send(frame: unknown, eventName?: string): Promise<void>;\n raw(data: string): Promise<void>;\n}\n\nfunction openSse(res: ServerResponse): Sse {\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n });\n res.flushHeaders();\n const write = async (text: string): Promise<void> => {\n if (res.destroyed || res.writableEnded) return;\n if (res.write(text)) return;\n await new Promise<void>((resolve) => {\n const done = () => {\n res.off(\"drain\", done);\n res.off(\"close\", done);\n resolve();\n };\n res.once(\"drain\", done);\n res.once(\"close\", done);\n });\n };\n return {\n send: (frame, eventName) =>\n write(`${eventName ? `event: ${eventName}\\n` : \"\"}data: ${JSON.stringify(frame)}\\n\\n`),\n raw: (data) => write(`data: ${data}\\n\\n`),\n };\n}\n\n// ── HTTP plumbing ───────────────────────────────────────────────────────────\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n if (res.writableEnded) return;\n const payload = JSON.stringify(body);\n res.writeHead(status, {\n \"content-type\": \"application/json\",\n \"content-length\": Buffer.byteLength(payload),\n });\n res.end(payload);\n}\n\nfunction sendError(res: ServerResponse, err: unknown): void {\n if (res.writableEnded || res.destroyed) return;\n if (res.headersSent) {\n res.end();\n return;\n }\n const failure =\n err instanceof ModelEndpointError\n ? err\n : new ModelEndpointError(500, \"internal server error\", undefined, \"server_error\");\n if (failure.status === 413) res.setHeader(\"connection\", \"close\");\n sendJson(res, failure.status, {\n error: {\n message: failure.message,\n type: failure.type,\n ...(failure.code !== undefined ? { code: failure.code } : {}),\n },\n });\n}\n\nfunction notFound(path: string): ModelEndpointError {\n return new ModelEndpointError(404, `unknown route '${path}'`, undefined, \"invalid_request_error\");\n}\n\nfunction requestPath(req: IncomingMessage): string {\n if (!URL.canParse(req.url ?? \"/\", \"http://localhost\")) {\n throw new ModelEndpointError(400, \"invalid request target\");\n }\n const path = new URL(req.url ?? \"/\", \"http://localhost\").pathname;\n return path.length > 1 ? path.replace(/\\/+$/, \"\") : path;\n}\n\nasync function readJson(req: IncomingMessage): Promise<unknown> {\n const tooLarge = () =>\n new ModelEndpointError(413, `request body exceeds ${MAX_BODY_BYTES} bytes`, \"body_too_large\");\n if (Number(req.headers[\"content-length\"]) > MAX_BODY_BYTES) throw tooLarge();\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of req) {\n const buffer = chunk as Buffer;\n size += buffer.length;\n if (size > MAX_BODY_BYTES) throw tooLarge();\n chunks.push(buffer);\n }\n const text = Buffer.concat(chunks).toString(\"utf8\");\n if (text.trim() === \"\") throw new ModelEndpointError(400, \"request body is empty\", \"empty_body\");\n try {\n return JSON.parse(text);\n } catch {\n throw new ModelEndpointError(400, \"request body is not valid JSON\", \"invalid_json\");\n }\n}\n\nfunction digest(value: string): Buffer {\n return createHash(\"sha256\").update(value).digest();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction errorText(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { createSpinner } from './chunk-NESV47MF.js';
|
|
2
|
-
import { getKindRegistry } from './chunk-
|
|
3
|
-
import { logInfo, logWarn, S, logErr, TARGET_DEFAULT_HINT, logOk, colorRef, parseHarnessFilter, requireProjectConfig, agentInstanceErrorLines, reportUnknownHarnesses, deferredWarnings, warnPlaceholderBodies, warnFilesOnlyDelegates, warnStaleHarnessCopies, formatSoftDepHint, reportLegacyOmpCopies, reportProjectConfig } from './chunk-
|
|
4
|
-
import { loadAgentManifest, hashAgentFiles, verifyConventionItems, resolveAgentInstance } from './chunk-
|
|
5
|
-
import { AssetManager } from './chunk-
|
|
6
|
-
import { createCompositionContentSource, isCompilePinCurrent, compileComposition, CompositionError, loadCompileManifestFromDir, isCompositionError, resolveBinding } from './chunk-
|
|
7
|
-
import { readLock } from './chunk-
|
|
8
|
-
import { agentSourceCacheDir, SourceEntryError, effectiveAgentInstances, resolveSkWorkspaceConfig, resolveAgentDefinitionDir, AgentRefResolutionError } from './chunk-
|
|
2
|
+
import { getKindRegistry } from './chunk-QZS7E3DY.js';
|
|
3
|
+
import { logInfo, logWarn, S, logErr, TARGET_DEFAULT_HINT, logOk, colorRef, parseHarnessFilter, requireProjectConfig, agentInstanceErrorLines, reportUnknownHarnesses, deferredWarnings, warnPlaceholderBodies, warnFilesOnlyDelegates, warnStaleHarnessCopies, formatSoftDepHint, reportLegacyOmpCopies, reportProjectConfig } from './chunk-5L3UCHBK.js';
|
|
4
|
+
import { loadAgentManifest, hashAgentFiles, verifyConventionItems, resolveAgentInstance } from './chunk-F6EPGAES.js';
|
|
5
|
+
import { AssetManager } from './chunk-4BVE6JTM.js';
|
|
6
|
+
import { createCompositionContentSource, isCompilePinCurrent, compileComposition, CompositionError, loadCompileManifestFromDir, isCompositionError, resolveBinding } from './chunk-AS4SKSXJ.js';
|
|
7
|
+
import { readLock } from './chunk-ZHI3YMGQ.js';
|
|
8
|
+
import { agentSourceCacheDir, SourceEntryError, effectiveAgentInstances, resolveSkWorkspaceConfig, resolveAgentDefinitionDir, AgentRefResolutionError } from './chunk-GXW4B5SE.js';
|
|
9
9
|
import { userConfigPath, globalSkaileDir } from './chunk-L5VSIPQD.js';
|
|
10
10
|
import { parseAssetRef } from './chunk-HW4BDJPC.js';
|
|
11
11
|
import { effectiveComposes } from './chunk-LCXQ4LVP.js';
|
|
@@ -267,7 +267,7 @@ async function runRefInstall(ref, opts) {
|
|
|
267
267
|
const spinner = createSpinner();
|
|
268
268
|
spinner.start(`Installing ${ref}`);
|
|
269
269
|
try {
|
|
270
|
-
const { openCatalogSource, openLibrary } = await import('./open-library-
|
|
270
|
+
const { openCatalogSource, openLibrary } = await import('./open-library-C254HCNL.js');
|
|
271
271
|
const catalog = await openCatalogSource({ projectDir: path2.resolve(opts.projectDir) });
|
|
272
272
|
if (!supportsInstallManifest(catalog)) {
|
|
273
273
|
throw new Error(
|
|
@@ -320,7 +320,7 @@ async function runYamlInstall(opts) {
|
|
|
320
320
|
}
|
|
321
321
|
if (await reportUnknownHarnesses(projectDir) > 0) process.exit(1);
|
|
322
322
|
try {
|
|
323
|
-
const { ensureSourcesCloned } = await import('./ensure-sources-
|
|
323
|
+
const { ensureSourcesCloned } = await import('./ensure-sources-URRZB56T.js');
|
|
324
324
|
const hydrate = ensureSourcesCloned(projectDir, { quiet: true });
|
|
325
325
|
if (hydrate.cloned.length > 0) {
|
|
326
326
|
logOk(`Cloned source(s): ${hydrate.cloned.join(", ")}`);
|
|
@@ -660,5 +660,5 @@ function makeCleanCommand() {
|
|
|
660
660
|
}
|
|
661
661
|
|
|
662
662
|
export { REF_HINT, editedConventionFiles, globalProblems, makeCheckCommand, makeCleanCommand, makeInstallCommand, pinComposedAgents, reportAgentInstances, reportContentHeld, reportInferredHarnesses, reportInstalledSoftDeps, reportMoved, reportPresetExpansions, reportRelocked, reportReplaced, reportRewritten, reportStoreNotChecked, reportStoreNotCheckedForUpdates, runPointerOnlyInstall, runYamlInstall, supportsInstallManifest };
|
|
663
|
-
//# sourceMappingURL=chunk-
|
|
664
|
-
//# sourceMappingURL=chunk-
|
|
663
|
+
//# sourceMappingURL=chunk-NZAUPFIM.js.map
|
|
664
|
+
//# sourceMappingURL=chunk-NZAUPFIM.js.map
|