@keystrokehq/keystroke 0.1.82 → 0.1.84

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.
Files changed (79) hide show
  1. package/dist/action.d.cts +2 -2
  2. package/dist/action.d.mts +2 -2
  3. package/dist/agent-types.cjs +1 -1
  4. package/dist/agent-types.d.cts +2 -2
  5. package/dist/agent-types.d.mts +2 -2
  6. package/dist/agent-types.mjs +1 -1
  7. package/dist/agent.cjs +70 -55
  8. package/dist/agent.cjs.map +1 -1
  9. package/dist/agent.d.cts +6 -6
  10. package/dist/agent.d.mts +6 -6
  11. package/dist/agent.mjs +19 -6
  12. package/dist/agent.mjs.map +1 -1
  13. package/dist/app.d.cts +2 -2
  14. package/dist/app.d.mts +2 -2
  15. package/dist/config.d.cts +1 -1
  16. package/dist/config.d.mts +1 -1
  17. package/dist/{context-compaction-Bxp4WK2B-9Roa_Go7.cjs → context-compaction-D2_B1nky-B5P-jcVq.cjs} +27 -5
  18. package/dist/context-compaction-D2_B1nky-B5P-jcVq.cjs.map +1 -0
  19. package/dist/{context-compaction-Bxp4WK2B-BJw7-xJn.mjs → context-compaction-D2_B1nky-BH4LYEIR.mjs} +16 -6
  20. package/dist/context-compaction-D2_B1nky-BH4LYEIR.mjs.map +1 -0
  21. package/dist/credentials.d.cts +1 -1
  22. package/dist/credentials.d.mts +1 -1
  23. package/dist/{dist-BBUHIiCy.cjs → dist-BBtHuSHr.cjs} +8 -2
  24. package/dist/{dist-BBUHIiCy.cjs.map → dist-BBtHuSHr.cjs.map} +1 -1
  25. package/dist/{dist-6IeP9zFU.mjs → dist-BZIQEsLI.mjs} +2 -2
  26. package/dist/{dist-6IeP9zFU.mjs.map → dist-BZIQEsLI.mjs.map} +1 -1
  27. package/dist/{dist-DI5TEUn3.cjs → dist-CIuy_U4W.cjs} +2 -2
  28. package/dist/{dist-DI5TEUn3.cjs.map → dist-CIuy_U4W.cjs.map} +1 -1
  29. package/dist/{dist-D6MVcMP4.mjs → dist-DpHlMye4.mjs} +3 -3
  30. package/dist/{dist-D6MVcMP4.mjs.map → dist-DpHlMye4.mjs.map} +1 -1
  31. package/dist/{index-C0ti6AGs.d.mts → index-BGruu2-9.d.mts} +9 -8
  32. package/dist/index-BGruu2-9.d.mts.map +1 -0
  33. package/dist/{index-Cy8K1nkq.d.cts → index-BS9GVhZL.d.cts} +9 -8
  34. package/dist/index-BS9GVhZL.d.cts.map +1 -0
  35. package/dist/{index-C6-1mYWX.d.mts → index-BUWzkui_.d.mts} +2 -2
  36. package/dist/{index-BtzNM6b1.d.cts.map → index-BUWzkui_.d.mts.map} +1 -1
  37. package/dist/{index-2fQM4f2x.d.cts → index-BZBfoxTW.d.mts} +3 -3
  38. package/dist/{index-2fQM4f2x.d.cts.map → index-BZBfoxTW.d.mts.map} +1 -1
  39. package/dist/{index-dzoGze6j.d.cts → index-BiuxubmU.d.cts} +2 -2
  40. package/dist/{index-DJMl6DSu.d.mts.map → index-BiuxubmU.d.cts.map} +1 -1
  41. package/dist/{index-BJ6ZvEun.d.mts → index-BuDJO13c.d.cts} +3 -3
  42. package/dist/{index-BJ6ZvEun.d.mts.map → index-BuDJO13c.d.cts.map} +1 -1
  43. package/dist/{index-DJMl6DSu.d.mts → index-C05t3LuY.d.mts} +2 -2
  44. package/dist/{index-dzoGze6j.d.cts.map → index-C05t3LuY.d.mts.map} +1 -1
  45. package/dist/{index-BtzNM6b1.d.cts → index-CsBKCcPQ.d.cts} +2 -2
  46. package/dist/{index-C6-1mYWX.d.mts.map → index-CsBKCcPQ.d.cts.map} +1 -1
  47. package/dist/{index-Bnrig0bt.d.cts → index-DJh_wp_7.d.cts} +2 -2
  48. package/dist/{index-Bnrig0bt.d.cts.map → index-DJh_wp_7.d.cts.map} +1 -1
  49. package/dist/{index-BGDEj1cq.d.mts → index-dDHyyZ6y.d.cts} +2 -2
  50. package/dist/{index-BGDEj1cq.d.cts.map → index-dDHyyZ6y.d.cts.map} +1 -1
  51. package/dist/{index-BGDEj1cq.d.cts → index-dDHyyZ6y.d.mts} +2 -2
  52. package/dist/{index-BGDEj1cq.d.mts.map → index-dDHyyZ6y.d.mts.map} +1 -1
  53. package/dist/{index-DagBDW8r.d.mts → index-vqmxOMVm.d.mts} +2 -2
  54. package/dist/{index-DagBDW8r.d.mts.map → index-vqmxOMVm.d.mts.map} +1 -1
  55. package/dist/sandbox.d.cts +2 -2
  56. package/dist/sandbox.d.mts +2 -2
  57. package/dist/{schemas-B9dXuD9C-bgRI3JRS.d.mts → schemas-lSbMfQRy-C2bvPXJf.d.mts} +9 -5
  58. package/dist/schemas-lSbMfQRy-C2bvPXJf.d.mts.map +1 -0
  59. package/dist/{schemas-B9dXuD9C-DRGMFsVP.d.cts → schemas-lSbMfQRy-poeBiwCM.d.cts} +9 -5
  60. package/dist/schemas-lSbMfQRy-poeBiwCM.d.cts.map +1 -0
  61. package/dist/{token-A3WLmCKE.cjs → token-BeAAlWuP.cjs} +2 -2
  62. package/dist/{token-A3WLmCKE.cjs.map → token-BeAAlWuP.cjs.map} +1 -1
  63. package/dist/{token-BmCWLwTZ.mjs → token-DOaX-fFI.mjs} +2 -2
  64. package/dist/{token-BmCWLwTZ.mjs.map → token-DOaX-fFI.mjs.map} +1 -1
  65. package/dist/trigger.cjs +1 -1
  66. package/dist/trigger.d.cts +3 -3
  67. package/dist/trigger.d.mts +3 -3
  68. package/dist/trigger.mjs +1 -1
  69. package/dist/workflow.cjs +1 -1
  70. package/dist/workflow.d.cts +2 -2
  71. package/dist/workflow.d.mts +2 -2
  72. package/dist/workflow.mjs +1 -1
  73. package/package.json +3 -3
  74. package/dist/context-compaction-Bxp4WK2B-9Roa_Go7.cjs.map +0 -1
  75. package/dist/context-compaction-Bxp4WK2B-BJw7-xJn.mjs.map +0 -1
  76. package/dist/index-C0ti6AGs.d.mts.map +0 -1
  77. package/dist/index-Cy8K1nkq.d.cts.map +0 -1
  78. package/dist/schemas-B9dXuD9C-DRGMFsVP.d.cts.map +0 -1
  79. package/dist/schemas-B9dXuD9C-bgRI3JRS.d.mts.map +0 -1
package/dist/app.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { T as ResolvedCredentials, o as Credential } from "./index-BGDEj1cq.cjs";
2
- import { c as WorkflowActionDefinition, n as ActionDefinitionInput } from "./index-Bnrig0bt.cjs";
1
+ import { T as ResolvedCredentials, o as Credential } from "./index-dDHyyZ6y.cjs";
2
+ import { c as WorkflowActionDefinition, n as ActionDefinitionInput } from "./index-DJh_wp_7.cjs";
3
3
  import { z } from "zod";
4
4
 
5
5
  //#region ../app/dist/index.d.mts
package/dist/app.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { T as ResolvedCredentials, o as Credential } from "./index-BGDEj1cq.mjs";
2
- import { c as WorkflowActionDefinition, n as ActionDefinitionInput } from "./index-DagBDW8r.mjs";
1
+ import { T as ResolvedCredentials, o as Credential } from "./index-dDHyyZ6y.mjs";
2
+ import { c as WorkflowActionDefinition, n as ActionDefinitionInput } from "./index-vqmxOMVm.mjs";
3
3
  import { z } from "zod";
4
4
 
5
5
  //#region ../app/dist/index.d.mts
package/dist/config.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { S as OAuthTokenRefreshRegistry } from "./index-BGDEj1cq.cjs";
1
+ import { S as OAuthTokenRefreshRegistry } from "./index-dDHyyZ6y.cjs";
2
2
  import { Context, Hono } from "hono";
3
3
 
4
4
  //#region ../oauth/dist/index.d.mts
package/dist/config.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { S as OAuthTokenRefreshRegistry } from "./index-BGDEj1cq.mjs";
1
+ import { S as OAuthTokenRefreshRegistry } from "./index-dDHyyZ6y.mjs";
2
2
  import { Context, Hono } from "hono";
3
3
 
4
4
  //#region ../oauth/dist/index.d.mts
@@ -1,8 +1,8 @@
1
1
  const require_dist = require("./dist-WQXy4GAY.cjs");
2
- const require_dist$1 = require("./dist-BBUHIiCy.cjs");
2
+ const require_dist$1 = require("./dist-BBtHuSHr.cjs");
3
3
  let zod = require("zod");
4
4
  let node_async_hooks = require("node:async_hooks");
5
- //#region ../agent/dist/schemas-DDyTkszQ.mjs
5
+ //#region ../agent/dist/schemas-yjoqQ6GJ.mjs
6
6
  function capabilitiesFromGatewayTags(tags) {
7
7
  const set = new Set(tags ?? []);
8
8
  return {
@@ -254,6 +254,8 @@ const ThinkingLevelSchema = zod.z.enum([
254
254
  const DEFAULT_THINKING_LEVEL = "medium";
255
255
  /** Default model for automatic context compaction when `compactionModel` is omitted. */
256
256
  const DEFAULT_COMPACTION_MODEL_ID = "deepseek/deepseek-v4-flash";
257
+ /** Default tool-loop step cap when `maxSteps` is omitted on `defineAgent`. */
258
+ const DEFAULT_MAX_STEPS = 100;
257
259
  /** Serializable subset of {@link AgentConfig} for JSON/env/CLI boundaries. */
258
260
  const AgentCreateInputSchema = zod.z.object({
259
261
  systemPrompt: zod.z.string(),
@@ -263,7 +265,12 @@ const AgentCreateInputSchema = zod.z.object({
263
265
  * `model`. When omitted, Keystroke uses {@link DEFAULT_COMPACTION_MODEL_ID}.
264
266
  */
265
267
  compactionModel: AgentModelIdSchema.optional(),
266
- thinkingLevel: ThinkingLevelSchema.optional()
268
+ thinkingLevel: ThinkingLevelSchema.optional(),
269
+ /**
270
+ * Maximum tool-loop steps per prompt. When omitted, Keystroke uses
271
+ * {@link DEFAULT_MAX_STEPS}.
272
+ */
273
+ maxSteps: zod.z.number().int().positive().optional()
267
274
  });
268
275
  function parseAgentCreateInput(input) {
269
276
  return AgentCreateInputSchema.parse(input);
@@ -271,8 +278,11 @@ function parseAgentCreateInput(input) {
271
278
  function resolveThinkingLevel(level) {
272
279
  return level ?? "medium";
273
280
  }
281
+ function resolveMaxSteps(maxSteps) {
282
+ return maxSteps ?? 100;
283
+ }
274
284
  //#endregion
275
- //#region ../agent/dist/context-compaction-Bxp4WK2B.mjs
285
+ //#region ../agent/dist/context-compaction-D2_B1nky.mjs
276
286
  /** Map every `FileUIPart` in each message, leaving other parts and non-array messages untouched. */
277
287
  async function mapMessageFileParts(messages, mapFilePart) {
278
288
  return Promise.all(messages.map(async (message) => {
@@ -830,6 +840,12 @@ Object.defineProperty(exports, "DEFAULT_COMPACTION_MODEL_ID", {
830
840
  return DEFAULT_COMPACTION_MODEL_ID;
831
841
  }
832
842
  });
843
+ Object.defineProperty(exports, "DEFAULT_MAX_STEPS", {
844
+ enumerable: true,
845
+ get: function() {
846
+ return DEFAULT_MAX_STEPS;
847
+ }
848
+ });
833
849
  Object.defineProperty(exports, "DEFAULT_THINKING_LEVEL", {
834
850
  enumerable: true,
835
851
  get: function() {
@@ -932,6 +948,12 @@ Object.defineProperty(exports, "resolveContextBudget", {
932
948
  return resolveContextBudget;
933
949
  }
934
950
  });
951
+ Object.defineProperty(exports, "resolveMaxSteps", {
952
+ enumerable: true,
953
+ get: function() {
954
+ return resolveMaxSteps;
955
+ }
956
+ });
935
957
  Object.defineProperty(exports, "resolveModelCapabilities", {
936
958
  enumerable: true,
937
959
  get: function() {
@@ -963,4 +985,4 @@ Object.defineProperty(exports, "withLlmRunContext", {
963
985
  }
964
986
  });
965
987
 
966
- //# sourceMappingURL=context-compaction-Bxp4WK2B-9Roa_Go7.cjs.map
988
+ //# sourceMappingURL=context-compaction-D2_B1nky-B5P-jcVq.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-compaction-D2_B1nky-B5P-jcVq.cjs","names":["AsyncLocalStorage","LLM_RUN_ID_HEADER","LLM_RUN_KIND_HEADER","LLM_SKIP_USAGE_HEADER","getProjectScopeId","createGateway","z","isFileUIPart","parseChatAttachmentServePath","LLM_KEY_SOURCE_HEADER","generateText","generateId"],"sources":["../../agent/dist/schemas-yjoqQ6GJ.mjs","../../agent/dist/context-compaction-D2_B1nky.mjs"],"sourcesContent":["import { LLM_RUN_ID_HEADER, LLM_RUN_KIND_HEADER, LLM_SKIP_USAGE_HEADER, modelSupportsMediaType } from \"@keystrokehq/shared\";\nimport { z } from \"zod\";\nimport { getProjectScopeId } from \"@keystrokehq/database\";\nimport { createGateway } from \"@ai-sdk/gateway\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n//#region src/define/model-capabilities.ts\nfunction capabilitiesFromGatewayTags(tags) {\n\tconst set = new Set(tags ?? []);\n\treturn {\n\t\timages: set.has(\"vision\"),\n\t\tfiles: set.has(\"file-input\")\n\t};\n}\nfunction attachmentPlaceholderText(filename, mediaType) {\n\treturn `[attachment omitted: ${filename?.trim() || mediaType} — model has no ${mediaType.startsWith(\"image/\") ? \"image\" : \"file\"} support]`;\n}\n//#endregion\n//#region src/ai/run-context.ts\nconst storage = new AsyncLocalStorage();\n/**\n* Best-effort run attribution for LLM proxy traffic. The gateway client reads\n* this to stamp run headers on each request so the platform can tag the usage\n* it records to a run. Billing never depends on it — losing the context only\n* drops the history-UI attribution.\n*/\nfunction withLlmRunContext(context, fn) {\n\treturn storage.run(context, fn);\n}\nfunction currentLlmRunContext() {\n\treturn storage.getStore();\n}\n//#endregion\n//#region src/ai/gateway-client.ts\nconst DEFAULT_GATEWAY_ORIGIN = \"https://ai-gateway.vercel.sh\";\n/**\n* Wrap `fetch` so every gateway request carries the current run's attribution\n* headers. Read at call time (not client-construction time) so the cached\n* singleton client still tags each request with its own run.\n*/\nconst runContextFetch = (input, init) => {\n\tconst run = currentLlmRunContext();\n\tif (!run) return fetch(input, init);\n\tconst headers = new Headers(init?.headers);\n\theaders.set(LLM_RUN_ID_HEADER, run.runId);\n\theaders.set(LLM_RUN_KIND_HEADER, run.runKind);\n\tif (run.skipUsage) headers.set(LLM_SKIP_USAGE_HEADER, \"1\");\n\treturn fetch(input, {\n\t\t...init,\n\t\theaders\n\t});\n};\n/** Resolve the model catalog URL for pricing metadata (via platform proxy when configured). */\nfunction resolveGatewayCatalogUrl(modelId) {\n\tconst baseUrl = resolveGatewayBaseUrl();\n\tconst apiKey = process.env.AI_GATEWAY_API_KEY?.trim();\n\tif (baseUrl && apiKey) return {\n\t\turl: `${baseUrl.replace(/\\/$/, \"\")}/models/${modelId}`,\n\t\theaders: {\n\t\t\taccept: \"application/json\",\n\t\t\tauthorization: `Bearer ${apiKey}`\n\t\t},\n\t\tcacheKey: baseUrl\n\t};\n\treturn {\n\t\turl: `${DEFAULT_GATEWAY_ORIGIN}/v1/models/${modelId}`,\n\t\theaders: { accept: \"application/json\" },\n\t\tcacheKey: DEFAULT_GATEWAY_ORIGIN\n\t};\n}\nlet cachedGateway;\nfunction resolveGatewayBaseUrl() {\n\tconst configured = process.env.AI_GATEWAY_BASE_URL?.trim();\n\tif (configured) return configured.replace(/\\/$/, \"\");\n\tconst platformUrl = process.env.PLATFORM_URL?.trim();\n\tif (!platformUrl || !process.env.AI_GATEWAY_API_KEY?.trim()) return;\n\tconst projectId = getProjectScopeId();\n\treturn `${platformUrl.replace(/\\/$/, \"\")}/internal/projects/${encodeURIComponent(projectId)}/llm`;\n}\n/** Shared AI Gateway client honoring keystroke env conventions. */\nfunction getGatewayClient(baseUrl) {\n\tconst resolvedBaseUrl = baseUrl ?? resolveGatewayBaseUrl();\n\tconst cacheKey = resolvedBaseUrl ?? DEFAULT_GATEWAY_ORIGIN;\n\tif (cachedGateway && cachedGateway.__baseUrl === cacheKey) return cachedGateway;\n\tconst apiKey = process.env.AI_GATEWAY_API_KEY?.trim();\n\tconst gateway = createGateway({\n\t\t...resolvedBaseUrl ? { baseURL: resolvedBaseUrl } : {},\n\t\t...apiKey ? { apiKey } : {},\n\t\tfetch: runContextFetch\n\t});\n\tgateway.__baseUrl = cacheKey;\n\tcachedGateway = gateway;\n\treturn gateway;\n}\n//#endregion\n//#region src/define/resolve-agent-model.ts\nconst AGENT_MODEL_ID_PATTERN = /^[a-z0-9-]+\\/.+/;\nconst AgentModelIdSchema = z.custom((value) => typeof value === \"string\" && AGENT_MODEL_ID_PATTERN.test(value), \"model must be vendor/model-id\");\nconst GatewayModelPricingSchema = z.object({\n\tinput: z.string().optional(),\n\toutput: z.string().optional(),\n\tinput_cache_read: z.string().optional(),\n\tinput_cache_write: z.string().optional()\n});\nconst GatewayModelResponseSchema = z.object({\n\tid: z.string().min(1),\n\tname: z.string().optional(),\n\ttype: z.string().optional(),\n\tcontext_window: z.number().int().positive().optional(),\n\tmax_tokens: z.number().int().positive().optional(),\n\ttags: z.array(z.string()).optional(),\n\tpricing: GatewayModelPricingSchema.optional()\n});\nfunction splitAgentModelId(modelId) {\n\tconst slash = modelId.indexOf(\"/\");\n\treturn {\n\t\tvendor: modelId.slice(0, slash),\n\t\tdirectId: modelId.slice(slash + 1)\n\t};\n}\nfunction parseGatewayModelResponse(body) {\n\tconst parsed = GatewayModelResponseSchema.safeParse(body);\n\treturn parsed.success ? parsed.data : void 0;\n}\nfunction pricePerMillion(value) {\n\tif (!value) return 0;\n\tconst perToken = Number(value);\n\tif (!Number.isFinite(perToken) || perToken <= 0) return 0;\n\treturn perToken * 1e6;\n}\nconst gatewayModelCache = /* @__PURE__ */ new Map();\nconst gatewayModelPending = /* @__PURE__ */ new Map();\nfunction gatewayModelCacheKey(modelId, catalog) {\n\treturn `${catalog.cacheKey}::${modelId}`;\n}\nfunction catalogLogContext(modelId, catalog) {\n\treturn {\n\t\tmodelId,\n\t\turl: catalog.url,\n\t\tprojectScopeId: getProjectScopeId(),\n\t\tcacheKey: gatewayModelCacheKey(modelId, catalog)\n\t};\n}\nfunction snippet(value, max = 400) {\n\tconst trimmed = value.trim();\n\treturn trimmed.length <= max ? trimmed : `${trimmed.slice(0, max)}…`;\n}\nasync function fetchGatewayModelMetadata(modelId) {\n\tconst catalog = resolveGatewayCatalogUrl(modelId);\n\tconst cacheKey = gatewayModelCacheKey(modelId, catalog);\n\tconst cached = gatewayModelCache.get(cacheKey);\n\tif (cached) {\n\t\tif (cached.status === \"found\") {\n\t\t\tconst { status: _status, ...metadata } = cached;\n\t\t\treturn metadata;\n\t\t}\n\t\tconsole.warn(\"[gateway-model] catalog lookup cache miss (missing)\", catalogLogContext(modelId, catalog));\n\t\treturn;\n\t}\n\tconst pending = gatewayModelPending.get(cacheKey);\n\tif (pending) return pending;\n\tconst request = (async () => {\n\t\ttry {\n\t\t\tconst response = await fetch(catalog.url, { headers: catalog.headers });\n\t\t\tif (!response.ok) {\n\t\t\t\tconst body = await response.text().catch(() => \"\");\n\t\t\t\tconsole.warn(\"[gateway-model] catalog HTTP error\", {\n\t\t\t\t\t...catalogLogContext(modelId, catalog),\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\tstatusText: response.statusText,\n\t\t\t\t\tbody: snippet(body)\n\t\t\t\t});\n\t\t\t\tgatewayModelCache.set(cacheKey, { status: \"missing\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst body = await response.json();\n\t\t\tconst raw = parseGatewayModelResponse(body);\n\t\t\tif (!raw || raw.type && raw.type !== \"language\") {\n\t\t\t\tconsole.warn(\"[gateway-model] catalog payload rejected\", {\n\t\t\t\t\t...catalogLogContext(modelId, catalog),\n\t\t\t\t\ttype: raw?.type,\n\t\t\t\t\tbody: snippet(JSON.stringify(body))\n\t\t\t\t});\n\t\t\t\tgatewayModelCache.set(cacheKey, { status: \"missing\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst capabilities = capabilitiesFromGatewayTags(raw.tags);\n\t\t\tconst metadata = {\n\t\t\t\tpricing: {\n\t\t\t\t\tinputPerMillion: pricePerMillion(raw.pricing?.input),\n\t\t\t\t\toutputPerMillion: pricePerMillion(raw.pricing?.output),\n\t\t\t\t\tcacheReadPerMillion: pricePerMillion(raw.pricing?.input_cache_read),\n\t\t\t\t\tcacheWritePerMillion: pricePerMillion(raw.pricing?.input_cache_write)\n\t\t\t\t},\n\t\t\t\tcapabilities,\n\t\t\t\t...raw.context_window !== void 0 ? { contextWindow: raw.context_window } : {},\n\t\t\t\t...raw.max_tokens !== void 0 ? { maxOutputTokens: raw.max_tokens } : {}\n\t\t\t};\n\t\t\tgatewayModelCache.set(cacheKey, {\n\t\t\t\tstatus: \"found\",\n\t\t\t\t...metadata\n\t\t\t});\n\t\t\treturn metadata;\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"[gateway-model] catalog fetch failed\", {\n\t\t\t\t...catalogLogContext(modelId, catalog),\n\t\t\t\terror: error instanceof Error ? error.message : String(error)\n\t\t\t});\n\t\t\tgatewayModelCache.set(cacheKey, { status: \"missing\" });\n\t\t\treturn;\n\t\t} finally {\n\t\t\tgatewayModelPending.delete(cacheKey);\n\t\t}\n\t})();\n\tgatewayModelPending.set(cacheKey, request);\n\treturn request;\n}\n/** Cached gateway catalog lookup for model multimodal capabilities. */\nasync function resolveModelCapabilities(modelId) {\n\treturn (await fetchGatewayModelMetadata(modelId))?.capabilities ?? {\n\t\timages: false,\n\t\tfiles: false\n\t};\n}\n/** Resolve a user-authored model id to an AI Gateway language model + optional pricing metadata. */\nasync function resolveAgentModel(modelId) {\n\tconst baseUrl = resolveGatewayBaseUrl();\n\tconst gateway = getGatewayClient(baseUrl);\n\tconst metadata = await fetchGatewayModelMetadata(modelId);\n\tconst pricing = metadata?.pricing;\n\tconst capabilities = metadata?.capabilities ?? {\n\t\timages: false,\n\t\tfiles: false\n\t};\n\tif (pricing === void 0) {\n\t\tconst catalog = resolveGatewayCatalogUrl(modelId);\n\t\tif (gatewayModelCache.get(gatewayModelCacheKey(modelId, catalog))?.status === \"missing\" && process.env.AI_GATEWAY_API_KEY?.trim()) {\n\t\t\tconsole.warn(\"[gateway-model] rejecting model after catalog miss\", catalogLogContext(modelId, catalog));\n\t\t\tthrow new Error(`Unknown gateway model: ${modelId}`);\n\t\t}\n\t}\n\treturn {\n\t\tlanguageModel: gateway(modelId),\n\t\tmodelId,\n\t\tprovider: \"vercel-ai-gateway\",\n\t\tcapabilities,\n\t\t...baseUrl ? { baseUrl } : {},\n\t\t...pricing ? { pricing } : {},\n\t\t...metadata?.contextWindow !== void 0 ? { contextWindow: metadata.contextWindow } : {},\n\t\t...metadata?.maxOutputTokens !== void 0 ? { maxOutputTokens: metadata.maxOutputTokens } : {}\n\t};\n}\n//#endregion\n//#region src/schemas.ts\nconst ThinkingLevelSchema = z.enum([\n\t\"provider-default\",\n\t\"none\",\n\t\"minimal\",\n\t\"low\",\n\t\"medium\",\n\t\"high\",\n\t\"xhigh\"\n]);\nconst DEFAULT_THINKING_LEVEL = \"medium\";\n/** Default model for automatic context compaction when `compactionModel` is omitted. */\nconst DEFAULT_COMPACTION_MODEL_ID = \"deepseek/deepseek-v4-flash\";\n/** Default tool-loop step cap when `maxSteps` is omitted on `defineAgent`. */\nconst DEFAULT_MAX_STEPS = 100;\n/** Serializable subset of {@link AgentConfig} for JSON/env/CLI boundaries. */\nconst AgentCreateInputSchema = z.object({\n\tsystemPrompt: z.string(),\n\tmodel: AgentModelIdSchema,\n\t/**\n\t* Optional model used only for context compaction. Same `vendor/model-id` form as\n\t* `model`. When omitted, Keystroke uses {@link DEFAULT_COMPACTION_MODEL_ID}.\n\t*/\n\tcompactionModel: AgentModelIdSchema.optional(),\n\tthinkingLevel: ThinkingLevelSchema.optional(),\n\t/**\n\t* Maximum tool-loop steps per prompt. When omitted, Keystroke uses\n\t* {@link DEFAULT_MAX_STEPS}.\n\t*/\n\tmaxSteps: z.number().int().positive().optional()\n});\nfunction parseAgentCreateInput(input) {\n\treturn AgentCreateInputSchema.parse(input);\n}\nfunction resolveThinkingLevel(level) {\n\treturn level ?? \"medium\";\n}\nfunction resolveMaxSteps(maxSteps) {\n\treturn maxSteps ?? 100;\n}\n//#endregion\nexport { ThinkingLevelSchema as a, resolveThinkingLevel as c, resolveModelCapabilities as d, splitAgentModelId as f, modelSupportsMediaType as g, attachmentPlaceholderText as h, DEFAULT_THINKING_LEVEL as i, AgentModelIdSchema as l, withLlmRunContext as m, DEFAULT_COMPACTION_MODEL_ID as n, parseAgentCreateInput as o, currentLlmRunContext as p, DEFAULT_MAX_STEPS as r, resolveMaxSteps as s, AgentCreateInputSchema as t, resolveAgentModel as u };\n\n//# sourceMappingURL=schemas-yjoqQ6GJ.mjs.map","import { f as splitAgentModelId, u as resolveAgentModel } from \"./schemas-yjoqQ6GJ.mjs\";\nimport { generateId, generateText, isFileUIPart } from \"ai\";\nimport { LLM_KEY_SOURCE_HEADER, parseChatAttachmentServePath } from \"@keystrokehq/shared\";\n//#region src/ai/map-message-file-parts.ts\n/** Map every `FileUIPart` in each message, leaving other parts and non-array messages untouched. */\nasync function mapMessageFileParts(messages, mapFilePart) {\n\treturn Promise.all(messages.map(async (message) => {\n\t\tif (!Array.isArray(message.parts)) return message;\n\t\tconst parts = await Promise.all(message.parts.map((part) => isFileUIPart(part) ? mapFilePart(part) : part));\n\t\treturn {\n\t\t\t...message,\n\t\t\tparts\n\t\t};\n\t}));\n}\n//#endregion\n//#region src/ai/placeholder-chat-attachment-messages.ts\n/**\n* Approximate model-token cost of one image attachment. Vision pricing is\n* tile-based (provider-dependent, roughly 750–1,600 tokens for a typical\n* photo), not proportional to serialized bytes — a flat per-image charge is\n* closer to reality than counting base64 chars.\n*/\nconst APPROX_ATTACHMENT_IMAGE_TOKENS = 1100;\n/**\n* Approximate model-token cost of one non-image attachment (PDFs). Page count\n* is unknown without downloading, so this assumes a short document; a giant\n* PDF under-counts, but the estimate only steers the compaction heuristic.\n*/\nconst APPROX_ATTACHMENT_FILE_TOKENS = 3e3;\nfunction isUnhydratedAttachment(part) {\n\treturn parseChatAttachmentServePath(part.url) !== null;\n}\n/**\n* Replace unhydrated chat-attachment file parts (relative serve paths) with\n* text placeholders so the messages survive `convertToModelMessages` — the AI\n* SDK's `new URL(part.url)` throws `TypeError: Invalid URL` on relative paths.\n*\n* For estimation and compaction only: the placeholder tells the compaction\n* model an attachment existed, and the real model call hydrates the actual\n* bytes via `hydrateChatAttachmentMessages` instead.\n*/\nfunction placeholderChatAttachmentMessages(messages) {\n\treturn mapMessageFileParts(messages, (part) => isUnhydratedAttachment(part) ? {\n\t\ttype: \"text\",\n\t\ttext: `[attachment: ${part.filename?.trim() || \"file\"} (${part.mediaType})]`\n\t} : part);\n}\n/**\n* Estimated token cost of the unhydrated attachments in `messages`, to add on\n* top of a char-based serialized estimate (which only sees the placeholder\n* text, not what the attachment will cost once hydrated for the model).\n*/\nfunction estimateChatAttachmentTokens(messages) {\n\tlet total = 0;\n\tfor (const message of messages) {\n\t\tif (!Array.isArray(message.parts)) continue;\n\t\tfor (const part of message.parts) {\n\t\t\tif (!isFileUIPart(part) || !isUnhydratedAttachment(part)) continue;\n\t\t\ttotal += part.mediaType.startsWith(\"image/\") ? APPROX_ATTACHMENT_IMAGE_TOKENS : APPROX_ATTACHMENT_FILE_TOKENS;\n\t\t}\n\t}\n\treturn total;\n}\n//#endregion\n//#region src/ai/context-budget.ts\n/** Soft compaction trigger as a fraction of the usable input budget. */\nconst CONTEXT_COMPACTION_SOFT_RATIO = .9;\n/**\n* Fraction of the soft limit the retained raw tail may occupy after a\n* compaction. The remainder is headroom for the summary, system prompt, and\n* tool schemas.\n*/\nconst COMPACTION_TAIL_BUDGET_RATIO = .4;\n/** Floor for reserved output + framing tokens. */\nconst MIN_OUTPUT_RESERVE = 4096;\n/** Cap so million-token models are not compacted prematurely. */\nconst MAX_OUTPUT_RESERVE = 32768;\n/** Extra framing/tool-schema overhead beyond the output reservation. */\nconst SAFETY_RESERVE = 2048;\n/**\n* Conservative fixed chars-per-token ratio. Anchored estimates only apply it\n* to the delta since the last real `input_tokens`, so a systematic error here\n* is bounded by one step's new content, not the whole transcript.\n*/\nconst DEFAULT_CHARS_PER_TOKEN = 3.5;\n/**\n* Derive the usable input budget from gateway context metadata.\n* Returns null when the model has no known context window — auto-compaction is disabled.\n*/\nfunction resolveContextBudget(resolved) {\n\tconst contextWindow = resolved.contextWindow;\n\tif (contextWindow == null || contextWindow <= 0) return null;\n\tconst catalogMax = resolved.maxOutputTokens;\n\tconst proportional = Math.floor(contextWindow * .05);\n\tconst outputReserve = Math.min(MAX_OUTPUT_RESERVE, Math.max(MIN_OUTPUT_RESERVE, catalogMax ?? proportional, proportional));\n\tconst safetyReserve = Math.min(SAFETY_RESERVE, Math.floor(contextWindow * .01));\n\tconst inputBudget = Math.max(1, contextWindow - outputReserve - safetyReserve);\n\treturn {\n\t\tcontextWindow,\n\t\toutputReserve,\n\t\tsafetyReserve,\n\t\tinputBudget,\n\t\tsoftLimit: Math.floor(inputBudget * CONTEXT_COMPACTION_SOFT_RATIO),\n\t\thardLimit: inputBudget\n\t};\n}\n/** Rough serialized size used for preflight estimation (chars ≈ JSON length). */\nfunction estimateSerializedChars(input) {\n\tlet total = 0;\n\tif (input.systemPrompt) total += input.systemPrompt.length;\n\tif (input.messages !== void 0) total += JSON.stringify(input.messages).length;\n\tif (input.tools !== void 0) total += JSON.stringify(input.tools).length;\n\treturn total;\n}\nconst DATA_URL_MEDIA_MIN_CHARS = 4096;\nfunction approxMediaTokens(mediaType) {\n\treturn typeof mediaType === \"string\" && mediaType.startsWith(\"image/\") ? APPROX_ATTACHMENT_IMAGE_TOKENS : APPROX_ATTACHMENT_FILE_TOKENS;\n}\n/**\n* Serialized message size with media content measured as flat token estimates\n* instead of chars. Vision/file pricing is tile- or page-based — counting a\n* 4 MB image's ~5.3M base64 chars would estimate ~1.5M tokens for what the\n* provider bills as ~1,100, wrongly triggering compaction on any large image.\n*/\nfunction measureMessagesForBudget(messages) {\n\tlet mediaTokens = 0;\n\treturn {\n\t\tchars: JSON.stringify(messages, (_key, value) => {\n\t\t\tif (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n\t\t\t\tmediaTokens += 3e3;\n\t\t\t\treturn \"[media]\";\n\t\t\t}\n\t\t\tif (typeof value === \"object\" && value !== null) {\n\t\t\t\tconst part = value;\n\t\t\t\tif (part.type === \"image\" && part.image !== void 0) {\n\t\t\t\t\tmediaTokens += 1100;\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"image\",\n\t\t\t\t\t\tomitted: true\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif ((part.type === \"file\" || part.type === \"media\") && part.data !== void 0) {\n\t\t\t\t\tmediaTokens += approxMediaTokens(part.mediaType);\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: part.type,\n\t\t\t\t\t\tomitted: true\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (part.type === \"Buffer\" && Array.isArray(part.data)) {\n\t\t\t\t\tmediaTokens += 3e3;\n\t\t\t\t\treturn \"[media]\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof value === \"string\" && value.length >= DATA_URL_MEDIA_MIN_CHARS && value.startsWith(\"data:\")) {\n\t\t\t\tmediaTokens += value.startsWith(\"data:image/\") ? 1100 : 3e3;\n\t\t\t\treturn \"[media]\";\n\t\t\t}\n\t\t\treturn value;\n\t\t})?.length ?? 0,\n\t\tmediaTokens\n\t};\n}\n/**\n* Per-prompt tracker: anchors on the last real `input_tokens` and estimates\n* only the delta (new content since that request), so estimation error is\n* bounded by one step's new content instead of the whole transcript. Before\n* the first completed step it falls back to a full char scan with media\n* priced at flat token constants.\n*/\nvar ContextBudgetTracker = class {\n\tbudget;\n\tanchor;\n\tlastMeasure;\n\tconstructor(budget) {\n\t\tthis.budget = budget;\n\t}\n\tget contextBudget() {\n\t\treturn this.budget;\n\t}\n\tget lastInputTokens() {\n\t\treturn this.anchor?.inputTokens;\n\t}\n\t/**\n\t* Anchor on a completed primary-model step's input token count, paired with\n\t* the measure taken by the estimate that preceded that request — future\n\t* estimates price only content added after this point.\n\t*/\n\trecordStepUsage(inputTokens) {\n\t\tif (inputTokens > 0 && this.lastMeasure) this.anchor = {\n\t\t\tinputTokens,\n\t\t\t...this.lastMeasure\n\t\t};\n\t}\n\t/** Reset after a successful compaction: the transcript the anchor priced no longer exists. */\n\tresetAfterCompaction() {\n\t\tthis.anchor = void 0;\n\t\tthis.lastMeasure = void 0;\n\t}\n\testimate(input) {\n\t\tif (!this.budget) return null;\n\t\tconst measure = measureMessagesForBudget(input.messages);\n\t\tconst overheadChars = input.overheadChars ?? estimateSerializedChars({\n\t\t\tsystemPrompt: input.systemPrompt,\n\t\t\ttools: input.tools\n\t\t});\n\t\tconst mediaTokens = measure.mediaTokens + (input.extraMessageTokens ?? 0);\n\t\tthis.lastMeasure = {\n\t\t\tchars: measure.chars,\n\t\t\tmediaTokens\n\t\t};\n\t\tconst toTokens = (chars) => Math.ceil(chars / DEFAULT_CHARS_PER_TOKEN);\n\t\tlet estimatedInputTokens;\n\t\tlet estimatedMessageTokens;\n\t\tif (this.anchor) {\n\t\t\tconst deltaTokens = toTokens(Math.max(0, measure.chars - this.anchor.chars)) + Math.max(0, mediaTokens - this.anchor.mediaTokens);\n\t\t\testimatedInputTokens = this.anchor.inputTokens + deltaTokens;\n\t\t\testimatedMessageTokens = Math.max(deltaTokens, estimatedInputTokens - toTokens(overheadChars));\n\t\t} else {\n\t\t\testimatedInputTokens = toTokens(overheadChars + measure.chars) + mediaTokens;\n\t\t\testimatedMessageTokens = toTokens(measure.chars) + mediaTokens;\n\t\t}\n\t\tconst decision = estimatedInputTokens >= this.budget.softLimit && estimatedMessageTokens > Math.floor(this.budget.softLimit * .5) ? \"compact\" : \"allow\";\n\t\treturn {\n\t\t\testimatedInputTokens,\n\t\t\testimatedMessageTokens,\n\t\t\tdecision,\n\t\t\tbudget: this.budget\n\t\t};\n\t}\n};\n//#endregion\n//#region src/ai/usage.ts\n/**\n* Key source from the platform LLM proxy's response header. Undefined when the\n* request didn't go through the proxy (standalone / direct provider).\n*/\nfunction byokFromResponseHeaders(headers) {\n\tconst value = headers?.[LLM_KEY_SOURCE_HEADER];\n\tif (value === \"byok\") return true;\n\tif (value === \"platform\") return false;\n}\nfunction llmUsageFromLanguageModelUsage(usage, resolved, options) {\n\tconst input = usage.inputTokens ?? 0;\n\tconst output = usage.outputTokens ?? 0;\n\tconst reasoning = usage.outputTokenDetails.reasoningTokens ?? 0;\n\tconst cacheRead = usage.inputTokenDetails.cacheReadTokens ?? 0;\n\tconst cacheWrite = usage.inputTokenDetails.cacheWriteTokens ?? 0;\n\tconst noCache = usage.inputTokenDetails.noCacheTokens ?? Math.max(0, input - cacheRead - cacheWrite);\n\tconst totalTokens = usage.totalTokens ?? input + output;\n\tconst pricing = resolved.pricing;\n\tconst inputCost = pricing ? noCache / 1e6 * pricing.inputPerMillion : 0;\n\tconst outputCost = pricing ? output / 1e6 * pricing.outputPerMillion : 0;\n\tconst cacheReadCost = pricing ? cacheRead / 1e6 * pricing.cacheReadPerMillion : 0;\n\tconst cacheWriteCost = pricing ? cacheWrite / 1e6 * pricing.cacheWritePerMillion : 0;\n\tconst total = inputCost + outputCost + cacheReadCost + cacheWriteCost;\n\tconst { directId } = splitAgentModelId(resolved.modelId);\n\treturn {\n\t\tlabel: resolved.modelId,\n\t\tquantity: totalTokens,\n\t\tamount: total,\n\t\t...options?.byok !== void 0 ? { byok: options.byok } : {},\n\t\t...options?.stepRef ? { stepRef: options.stepRef } : {},\n\t\tmetadata: {\n\t\t\tprovider: resolved.provider,\n\t\t\tmodel: directId,\n\t\t\t...options?.byok !== void 0 ? { keySource: options.byok ? \"byok\" : \"platform\" } : {},\n\t\t\tresponseModel: resolved.modelId,\n\t\t\tinput,\n\t\t\tnoCache,\n\t\t\toutput,\n\t\t\treasoning,\n\t\t\tcacheRead,\n\t\t\tcacheWrite,\n\t\t\tcost: {\n\t\t\t\tnoCache: inputCost,\n\t\t\t\toutput: outputCost,\n\t\t\t\tcacheRead: cacheReadCost,\n\t\t\t\tcacheWrite: cacheWriteCost,\n\t\t\t\ttotal\n\t\t\t}\n\t\t}\n\t};\n}\n/** Soft char budget for one compaction-model request (chunk recursively above this). */\nconst COMPACTION_CHUNK_CHARS = 12e4;\nconst CONTEXT_COMPACTED_EVENT_TYPE = \"context_compacted\";\nfunction resolveCompactionModelId(explicit) {\n\treturn explicit ?? \"deepseek/deepseek-v4-flash\";\n}\nconst COMPACTION_SYSTEM_PROMPT = [\n\t\"You compress long agent conversation history into a compact context summary.\",\n\t\"Preserve durable facts, decisions, IDs, file paths, unresolved tasks, and recent tool outcomes.\",\n\t\"Omit chit-chat, repeated tool dumps, and superseded drafts.\",\n\t\"Write plain prose the primary agent can continue from. Do not call tools.\",\n\t\"Respond with ONLY the summary text.\"\n].join(\"\\n\");\nfunction messageTextPreview(message) {\n\tif (typeof message.content === \"string\") return message.content;\n\tif (!Array.isArray(message.content)) return JSON.stringify(message.content);\n\treturn message.content.map((part) => {\n\t\tif (typeof part === \"object\" && part !== null && \"type\" in part) {\n\t\t\tif (part.type === \"text\" && \"text\" in part) return String(part.text);\n\t\t\tif (part.type === \"tool-call\") return `[tool-call ${part.toolName ?? \"unknown\"}]`;\n\t\t\tif (part.type === \"tool-result\") return `[tool-result ${part.toolName ?? \"unknown\"}]`;\n\t\t}\n\t\treturn JSON.stringify(part);\n\t}).join(\"\\n\");\n}\nfunction formatMessagesForCompaction(messages) {\n\treturn messages.map((message, index) => {\n\t\tconst role = message.role;\n\t\treturn `### ${index + 1}. ${role}\\n${messageTextPreview(message)}`;\n\t}).join(\"\\n\\n\");\n}\n/**\n* Split off a recent raw tail. Prefer a user-turn boundary and never start the\n* tail on an orphaned tool result (keeps tool-call / tool-result pairs intact).\n*/\nfunction splitTail(messages, retain, options) {\n\tif (messages.length <= retain) return {\n\t\tprefix: [],\n\t\ttail: messages\n\t};\n\tlet start = messages.length - retain;\n\twhile (start > 0 && messages[start]?.role === \"tool\") start -= 1;\n\tif (options?.preferUserBoundary !== false) while (start > 0 && messages[start]?.role !== \"user\") start -= 1;\n\treturn {\n\t\tprefix: messages.slice(0, start),\n\t\ttail: messages.slice(start)\n\t};\n}\n/**\n* Fraction of the soft limit the retained raw tail may occupy. Kept below the\n* compaction trigger's messages-only floor so a just-compacted context can't\n* immediately re-trigger (see COMPACTION_MIN_MESSAGE_RATIO).\n*/\nconst TAIL_BUDGET_RATIO = COMPACTION_TAIL_BUDGET_RATIO;\n/**\n* Token allowance for the summary itself: capped at the summarizer's\n* maxOutputTokens, scaled down for small budgets (summaries track content\n* size, not the cap).\n*/\nfunction summaryReserveTokens(softLimit) {\n\treturn Math.min(4096, Math.ceil(softLimit * .1));\n}\n/**\n* Choose which messages to summarize vs keep raw. Starts from the requested\n* retained tail, then shrinks it while it exceeds the tail budget — down to\n* zero, so even a single oversized latest message gets summarized instead of\n* staying protected and blowing the context window.\n*/\nfunction resolveCompactionSplit(options) {\n\tconst { messages, budget } = options;\n\tlet retain = options.retainTail;\n\tlet split = splitTail(messages, retain);\n\tif (budget) {\n\t\tconst tailBudget = Math.max(1, Math.min(Math.floor(budget.softLimit * TAIL_BUDGET_RATIO), budget.softLimit - (options.overheadTokens ?? 0) - summaryReserveTokens(budget.softLimit)));\n\t\twhile (split.tail.length > 0 && estimateSerializedCharsApprox(split.tail) > tailBudget) {\n\t\t\tretain = Math.min(retain - 1, split.tail.length - 1);\n\t\t\tif (retain <= 0) {\n\t\t\t\tsplit = {\n\t\t\t\t\tprefix: messages,\n\t\t\t\t\ttail: []\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tsplit = splitTail(messages, retain, { preferUserBoundary: false });\n\t\t}\n\t\treturn split;\n\t}\n\tif (split.prefix.length === 0 && !options.hasPriorSummary && split.tail.length > 0) return {\n\t\tprefix: messages,\n\t\ttail: []\n\t};\n\treturn split;\n}\nasync function summarizeChunk(resolved, text, priorSummary) {\n\tconst prompt = [\n\t\tpriorSummary ? `Prior summary:\\n${priorSummary}\\n` : \"\",\n\t\t\"Conversation to compress:\\n\",\n\t\ttext\n\t].filter(Boolean).join(\"\\n\");\n\tconst result = await generateText({\n\t\tmodel: resolved.languageModel,\n\t\tsystem: COMPACTION_SYSTEM_PROMPT,\n\t\tprompt,\n\t\tmaxOutputTokens: 4096,\n\t\treasoning: \"minimal\"\n\t});\n\tconst usage = llmUsageFromLanguageModelUsage(result.usage, resolved, {\n\t\tbyok: byokFromResponseHeaders(result.response?.headers),\n\t\tstepRef: `compaction:${generateId()}`\n\t});\n\tusage.label = `LLM compaction · ${resolved.modelId}`;\n\tusage.metadata = {\n\t\t...usage.metadata,\n\t\toperation: \"context_compaction\"\n\t};\n\treturn {\n\t\tsummary: result.text.trim() || priorSummary || \"(empty summary)\",\n\t\tusage\n\t};\n}\nasync function summarizeMessages(resolved, messages, priorSummary) {\n\tconst formatted = formatMessagesForCompaction(messages);\n\tif (formatted.length <= COMPACTION_CHUNK_CHARS) {\n\t\tconst chunk = await summarizeChunk(resolved, priorSummary ? `${priorSummary}\\n\\n${formatted}` : formatted, void 0);\n\t\treturn {\n\t\t\tsummary: chunk.summary,\n\t\t\tusages: [chunk.usage]\n\t\t};\n\t}\n\tconst usages = [];\n\tlet rolling = priorSummary;\n\tlet offset = 0;\n\twhile (offset < formatted.length) {\n\t\tconst chunk = await summarizeChunk(resolved, formatted.slice(offset, offset + COMPACTION_CHUNK_CHARS), rolling);\n\t\tusages.push(chunk.usage);\n\t\trolling = chunk.summary;\n\t\toffset += COMPACTION_CHUNK_CHARS;\n\t}\n\treturn {\n\t\tsummary: rolling ?? \"(empty summary)\",\n\t\tusages\n\t};\n}\nfunction summaryToModelMessage(summary) {\n\treturn {\n\t\trole: \"user\",\n\t\tcontent: [\n\t\t\t\"Context summary from earlier in this session (older messages were compacted):\",\n\t\t\t\"\",\n\t\t\tsummary\n\t\t].join(\"\\n\")\n\t};\n}\nfunction summaryToUiMessage(summary) {\n\treturn {\n\t\tid: generateId(),\n\t\trole: \"user\",\n\t\tparts: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: [\n\t\t\t\t\"Context summary from earlier in this session (older messages were compacted):\",\n\t\t\t\t\"\",\n\t\t\t\tsummary\n\t\t\t].join(\"\\n\")\n\t\t}]\n\t};\n}\n/**\n* Compact model messages with the compaction model. Retains a recent raw tail.\n* Caller supplies `compactedThroughSeq` for durable checkpoints (message event seq).\n*/\nasync function compactModelMessages(options) {\n\tconst retain = options.retainTail ?? 4;\n\tconst { prefix, tail } = resolveCompactionSplit({\n\t\tmessages: options.messages,\n\t\tretainTail: retain,\n\t\tbudget: options.budget ?? null,\n\t\thasPriorSummary: Boolean(options.priorSummary),\n\t\t...options.overheadTokens !== void 0 ? { overheadTokens: options.overheadTokens } : {}\n\t});\n\tif (prefix.length === 0 && !options.priorSummary) throw new Error(\"Nothing to compact\");\n\tconst compactedThroughSeq = typeof options.compactedThroughSeq === \"function\" ? options.compactedThroughSeq(prefix.length) : options.compactedThroughSeq;\n\tconst resolved = await resolveAgentModel(options.compactionModelId);\n\tconst { summary, usages } = await summarizeMessages(resolved, prefix.length > 0 ? prefix : [], options.priorSummary);\n\tconst primary = usages[0];\n\tlet quantity = 0;\n\tlet amount = 0;\n\tlet summaryInputTokens = 0;\n\tlet summaryOutputTokens = 0;\n\tfor (const usage of usages) {\n\t\tquantity += usage.quantity;\n\t\tamount += usage.amount;\n\t\tif (typeof usage.metadata.input === \"number\") summaryInputTokens += usage.metadata.input;\n\t\tif (typeof usage.metadata.output === \"number\") summaryOutputTokens += usage.metadata.output;\n\t}\n\tconst usage = {\n\t\t...primary,\n\t\tquantity,\n\t\tamount,\n\t\tlabel: `LLM compaction · ${resolved.modelId}`,\n\t\tmetadata: {\n\t\t\t...primary.metadata,\n\t\t\toperation: \"context_compaction\",\n\t\t\tsourceModel: options.sourceModel,\n\t\t\tcompactedThroughSeq,\n\t\t\tdurable: options.durable,\n\t\t\tcompactionChunks: usages.length,\n\t\t\tinput: summaryInputTokens || primary.metadata.input,\n\t\t\toutput: summaryOutputTokens || primary.metadata.output,\n\t\t\tcost: {\n\t\t\t\t...primary.metadata.cost ?? {},\n\t\t\t\ttotal: amount\n\t\t\t}\n\t\t}\n\t};\n\tconst checkpoint = {\n\t\tcompactedThroughSeq,\n\t\tsummary,\n\t\tcompactionModel: resolved.modelId,\n\t\tsourceModel: options.sourceModel,\n\t\tdurable: options.durable,\n\t\t...options.estimatedBeforeTokens !== void 0 ? { estimatedBeforeTokens: options.estimatedBeforeTokens } : {},\n\t\t...options.actualBeforeTokens !== void 0 ? { actualBeforeTokens: options.actualBeforeTokens } : {},\n\t\tretainedTailEstimate: estimateSerializedCharsApprox(tail),\n\t\tsummaryInputTokens: summaryInputTokens > 0 ? summaryInputTokens : void 0,\n\t\tsummaryOutputTokens: summaryOutputTokens > 0 ? summaryOutputTokens : void 0,\n\t\t...options.budget ? {\n\t\t\tcontextWindow: options.budget.contextWindow,\n\t\t\tsoftLimit: options.budget.softLimit\n\t\t} : {},\n\t\t...options.promptId !== void 0 ? { promptId: options.promptId } : {}\n\t};\n\treturn {\n\t\tmessages: [summaryToModelMessage(summary), ...tail],\n\t\tcheckpoint,\n\t\tusage\n\t};\n}\nfunction estimateSerializedCharsApprox(messages) {\n\treturn Math.ceil(JSON.stringify(messages).length / 4);\n}\n/**\n* Rebuild model-facing UI messages from a durable checkpoint + newer transcript.\n* The full transcript is unchanged; this only shapes what the model sees.\n*/\nfunction rebuildMessagesFromCheckpoint(options) {\n\tconst { checkpoint, messageEvents } = options;\n\tif (!checkpoint || !checkpoint.durable) return messageEvents.map((event) => event.message);\n\tconst suffix = messageEvents.filter((event) => event.seq > checkpoint.compactedThroughSeq).map((event) => event.message);\n\treturn [summaryToUiMessage(checkpoint.summary), ...suffix];\n}\n/** Parse a durable checkpoint from a persisted agent event payload. */\nfunction parseContextCompactionCheckpoint(payload) {\n\tif (typeof payload !== \"object\" || payload === null) return null;\n\tconst record = payload;\n\tconst checkpoint = record.type === \"context_compacted\" && typeof record.checkpoint === \"object\" && record.checkpoint !== null ? record.checkpoint : record;\n\tif (typeof checkpoint.compactedThroughSeq !== \"number\" || typeof checkpoint.summary !== \"string\" || typeof checkpoint.compactionModel !== \"string\" || typeof checkpoint.sourceModel !== \"string\" || typeof checkpoint.durable !== \"boolean\") return null;\n\treturn checkpoint;\n}\n//#endregion\nexport { resolveCompactionModelId as a, llmUsageFromLanguageModelUsage as c, resolveContextBudget as d, estimateChatAttachmentTokens as f, rebuildMessagesFromCheckpoint as i, ContextBudgetTracker as l, mapMessageFileParts as m, compactModelMessages as n, summaryToUiMessage as o, placeholderChatAttachmentMessages as p, parseContextCompactionCheckpoint as r, byokFromResponseHeaders as s, CONTEXT_COMPACTED_EVENT_TYPE as t, estimateSerializedChars as u };\n\n//# sourceMappingURL=context-compaction-D2_B1nky.mjs.map"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { D as parseChatAttachmentServePath, c as LLM_RUN_KIND_HEADER, l as LLM_SKIP_USAGE_HEADER, o as LLM_KEY_SOURCE_HEADER, s as LLM_RUN_ID_HEADER } from "./dist-Dvq8unvC.mjs";
2
- import { L as getProjectScopeId, _ as generateId, a as generateText, f as createGateway, s as isFileUIPart } from "./dist-D6MVcMP4.mjs";
2
+ import { R as getProjectScopeId, a as generateText, p as createGateway, s as isFileUIPart, v as generateId } from "./dist-DpHlMye4.mjs";
3
3
  import { z } from "zod";
4
4
  import { AsyncLocalStorage } from "node:async_hooks";
5
- //#region ../agent/dist/schemas-DDyTkszQ.mjs
5
+ //#region ../agent/dist/schemas-yjoqQ6GJ.mjs
6
6
  function capabilitiesFromGatewayTags(tags) {
7
7
  const set = new Set(tags ?? []);
8
8
  return {
@@ -254,6 +254,8 @@ const ThinkingLevelSchema = z.enum([
254
254
  const DEFAULT_THINKING_LEVEL = "medium";
255
255
  /** Default model for automatic context compaction when `compactionModel` is omitted. */
256
256
  const DEFAULT_COMPACTION_MODEL_ID = "deepseek/deepseek-v4-flash";
257
+ /** Default tool-loop step cap when `maxSteps` is omitted on `defineAgent`. */
258
+ const DEFAULT_MAX_STEPS = 100;
257
259
  /** Serializable subset of {@link AgentConfig} for JSON/env/CLI boundaries. */
258
260
  const AgentCreateInputSchema = z.object({
259
261
  systemPrompt: z.string(),
@@ -263,7 +265,12 @@ const AgentCreateInputSchema = z.object({
263
265
  * `model`. When omitted, Keystroke uses {@link DEFAULT_COMPACTION_MODEL_ID}.
264
266
  */
265
267
  compactionModel: AgentModelIdSchema.optional(),
266
- thinkingLevel: ThinkingLevelSchema.optional()
268
+ thinkingLevel: ThinkingLevelSchema.optional(),
269
+ /**
270
+ * Maximum tool-loop steps per prompt. When omitted, Keystroke uses
271
+ * {@link DEFAULT_MAX_STEPS}.
272
+ */
273
+ maxSteps: z.number().int().positive().optional()
267
274
  });
268
275
  function parseAgentCreateInput(input) {
269
276
  return AgentCreateInputSchema.parse(input);
@@ -271,8 +278,11 @@ function parseAgentCreateInput(input) {
271
278
  function resolveThinkingLevel(level) {
272
279
  return level ?? "medium";
273
280
  }
281
+ function resolveMaxSteps(maxSteps) {
282
+ return maxSteps ?? 100;
283
+ }
274
284
  //#endregion
275
- //#region ../agent/dist/context-compaction-Bxp4WK2B.mjs
285
+ //#region ../agent/dist/context-compaction-D2_B1nky.mjs
276
286
  /** Map every `FileUIPart` in each message, leaving other parts and non-array messages untouched. */
277
287
  async function mapMessageFileParts(messages, mapFilePart) {
278
288
  return Promise.all(messages.map(async (message) => {
@@ -806,6 +816,6 @@ function parseContextCompactionCheckpoint(payload) {
806
816
  return checkpoint;
807
817
  }
808
818
  //#endregion
809
- export { resolveModelCapabilities as C, withLlmRunContext as E, resolveAgentModel as S, splitAgentModelId as T, DEFAULT_THINKING_LEVEL as _, estimateSerializedChars as a, currentLlmRunContext as b, parseContextCompactionCheckpoint as c, resolveCompactionModelId as d, resolveContextBudget as f, DEFAULT_COMPACTION_MODEL_ID as g, AgentModelIdSchema as h, estimateChatAttachmentTokens as i, placeholderChatAttachmentMessages as l, AgentCreateInputSchema as m, byokFromResponseHeaders as n, llmUsageFromLanguageModelUsage as o, summaryToUiMessage as p, compactModelMessages as r, mapMessageFileParts as s, ContextBudgetTracker as t, rebuildMessagesFromCheckpoint as u, ThinkingLevelSchema as v, resolveThinkingLevel as w, parseAgentCreateInput as x, attachmentPlaceholderText as y };
819
+ export { resolveAgentModel as C, splitAgentModelId as D, resolveThinkingLevel as E, withLlmRunContext as O, parseAgentCreateInput as S, resolveModelCapabilities as T, DEFAULT_MAX_STEPS as _, estimateSerializedChars as a, attachmentPlaceholderText as b, parseContextCompactionCheckpoint as c, resolveCompactionModelId as d, resolveContextBudget as f, DEFAULT_COMPACTION_MODEL_ID as g, AgentModelIdSchema as h, estimateChatAttachmentTokens as i, placeholderChatAttachmentMessages as l, AgentCreateInputSchema as m, byokFromResponseHeaders as n, llmUsageFromLanguageModelUsage as o, summaryToUiMessage as p, compactModelMessages as r, mapMessageFileParts as s, ContextBudgetTracker as t, rebuildMessagesFromCheckpoint as u, DEFAULT_THINKING_LEVEL as v, resolveMaxSteps as w, currentLlmRunContext as x, ThinkingLevelSchema as y };
810
820
 
811
- //# sourceMappingURL=context-compaction-Bxp4WK2B-BJw7-xJn.mjs.map
821
+ //# sourceMappingURL=context-compaction-D2_B1nky-BH4LYEIR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-compaction-D2_B1nky-BH4LYEIR.mjs","names":[],"sources":["../../agent/dist/schemas-yjoqQ6GJ.mjs","../../agent/dist/context-compaction-D2_B1nky.mjs"],"sourcesContent":["import { LLM_RUN_ID_HEADER, LLM_RUN_KIND_HEADER, LLM_SKIP_USAGE_HEADER, modelSupportsMediaType } from \"@keystrokehq/shared\";\nimport { z } from \"zod\";\nimport { getProjectScopeId } from \"@keystrokehq/database\";\nimport { createGateway } from \"@ai-sdk/gateway\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n//#region src/define/model-capabilities.ts\nfunction capabilitiesFromGatewayTags(tags) {\n\tconst set = new Set(tags ?? []);\n\treturn {\n\t\timages: set.has(\"vision\"),\n\t\tfiles: set.has(\"file-input\")\n\t};\n}\nfunction attachmentPlaceholderText(filename, mediaType) {\n\treturn `[attachment omitted: ${filename?.trim() || mediaType} — model has no ${mediaType.startsWith(\"image/\") ? \"image\" : \"file\"} support]`;\n}\n//#endregion\n//#region src/ai/run-context.ts\nconst storage = new AsyncLocalStorage();\n/**\n* Best-effort run attribution for LLM proxy traffic. The gateway client reads\n* this to stamp run headers on each request so the platform can tag the usage\n* it records to a run. Billing never depends on it — losing the context only\n* drops the history-UI attribution.\n*/\nfunction withLlmRunContext(context, fn) {\n\treturn storage.run(context, fn);\n}\nfunction currentLlmRunContext() {\n\treturn storage.getStore();\n}\n//#endregion\n//#region src/ai/gateway-client.ts\nconst DEFAULT_GATEWAY_ORIGIN = \"https://ai-gateway.vercel.sh\";\n/**\n* Wrap `fetch` so every gateway request carries the current run's attribution\n* headers. Read at call time (not client-construction time) so the cached\n* singleton client still tags each request with its own run.\n*/\nconst runContextFetch = (input, init) => {\n\tconst run = currentLlmRunContext();\n\tif (!run) return fetch(input, init);\n\tconst headers = new Headers(init?.headers);\n\theaders.set(LLM_RUN_ID_HEADER, run.runId);\n\theaders.set(LLM_RUN_KIND_HEADER, run.runKind);\n\tif (run.skipUsage) headers.set(LLM_SKIP_USAGE_HEADER, \"1\");\n\treturn fetch(input, {\n\t\t...init,\n\t\theaders\n\t});\n};\n/** Resolve the model catalog URL for pricing metadata (via platform proxy when configured). */\nfunction resolveGatewayCatalogUrl(modelId) {\n\tconst baseUrl = resolveGatewayBaseUrl();\n\tconst apiKey = process.env.AI_GATEWAY_API_KEY?.trim();\n\tif (baseUrl && apiKey) return {\n\t\turl: `${baseUrl.replace(/\\/$/, \"\")}/models/${modelId}`,\n\t\theaders: {\n\t\t\taccept: \"application/json\",\n\t\t\tauthorization: `Bearer ${apiKey}`\n\t\t},\n\t\tcacheKey: baseUrl\n\t};\n\treturn {\n\t\turl: `${DEFAULT_GATEWAY_ORIGIN}/v1/models/${modelId}`,\n\t\theaders: { accept: \"application/json\" },\n\t\tcacheKey: DEFAULT_GATEWAY_ORIGIN\n\t};\n}\nlet cachedGateway;\nfunction resolveGatewayBaseUrl() {\n\tconst configured = process.env.AI_GATEWAY_BASE_URL?.trim();\n\tif (configured) return configured.replace(/\\/$/, \"\");\n\tconst platformUrl = process.env.PLATFORM_URL?.trim();\n\tif (!platformUrl || !process.env.AI_GATEWAY_API_KEY?.trim()) return;\n\tconst projectId = getProjectScopeId();\n\treturn `${platformUrl.replace(/\\/$/, \"\")}/internal/projects/${encodeURIComponent(projectId)}/llm`;\n}\n/** Shared AI Gateway client honoring keystroke env conventions. */\nfunction getGatewayClient(baseUrl) {\n\tconst resolvedBaseUrl = baseUrl ?? resolveGatewayBaseUrl();\n\tconst cacheKey = resolvedBaseUrl ?? DEFAULT_GATEWAY_ORIGIN;\n\tif (cachedGateway && cachedGateway.__baseUrl === cacheKey) return cachedGateway;\n\tconst apiKey = process.env.AI_GATEWAY_API_KEY?.trim();\n\tconst gateway = createGateway({\n\t\t...resolvedBaseUrl ? { baseURL: resolvedBaseUrl } : {},\n\t\t...apiKey ? { apiKey } : {},\n\t\tfetch: runContextFetch\n\t});\n\tgateway.__baseUrl = cacheKey;\n\tcachedGateway = gateway;\n\treturn gateway;\n}\n//#endregion\n//#region src/define/resolve-agent-model.ts\nconst AGENT_MODEL_ID_PATTERN = /^[a-z0-9-]+\\/.+/;\nconst AgentModelIdSchema = z.custom((value) => typeof value === \"string\" && AGENT_MODEL_ID_PATTERN.test(value), \"model must be vendor/model-id\");\nconst GatewayModelPricingSchema = z.object({\n\tinput: z.string().optional(),\n\toutput: z.string().optional(),\n\tinput_cache_read: z.string().optional(),\n\tinput_cache_write: z.string().optional()\n});\nconst GatewayModelResponseSchema = z.object({\n\tid: z.string().min(1),\n\tname: z.string().optional(),\n\ttype: z.string().optional(),\n\tcontext_window: z.number().int().positive().optional(),\n\tmax_tokens: z.number().int().positive().optional(),\n\ttags: z.array(z.string()).optional(),\n\tpricing: GatewayModelPricingSchema.optional()\n});\nfunction splitAgentModelId(modelId) {\n\tconst slash = modelId.indexOf(\"/\");\n\treturn {\n\t\tvendor: modelId.slice(0, slash),\n\t\tdirectId: modelId.slice(slash + 1)\n\t};\n}\nfunction parseGatewayModelResponse(body) {\n\tconst parsed = GatewayModelResponseSchema.safeParse(body);\n\treturn parsed.success ? parsed.data : void 0;\n}\nfunction pricePerMillion(value) {\n\tif (!value) return 0;\n\tconst perToken = Number(value);\n\tif (!Number.isFinite(perToken) || perToken <= 0) return 0;\n\treturn perToken * 1e6;\n}\nconst gatewayModelCache = /* @__PURE__ */ new Map();\nconst gatewayModelPending = /* @__PURE__ */ new Map();\nfunction gatewayModelCacheKey(modelId, catalog) {\n\treturn `${catalog.cacheKey}::${modelId}`;\n}\nfunction catalogLogContext(modelId, catalog) {\n\treturn {\n\t\tmodelId,\n\t\turl: catalog.url,\n\t\tprojectScopeId: getProjectScopeId(),\n\t\tcacheKey: gatewayModelCacheKey(modelId, catalog)\n\t};\n}\nfunction snippet(value, max = 400) {\n\tconst trimmed = value.trim();\n\treturn trimmed.length <= max ? trimmed : `${trimmed.slice(0, max)}…`;\n}\nasync function fetchGatewayModelMetadata(modelId) {\n\tconst catalog = resolveGatewayCatalogUrl(modelId);\n\tconst cacheKey = gatewayModelCacheKey(modelId, catalog);\n\tconst cached = gatewayModelCache.get(cacheKey);\n\tif (cached) {\n\t\tif (cached.status === \"found\") {\n\t\t\tconst { status: _status, ...metadata } = cached;\n\t\t\treturn metadata;\n\t\t}\n\t\tconsole.warn(\"[gateway-model] catalog lookup cache miss (missing)\", catalogLogContext(modelId, catalog));\n\t\treturn;\n\t}\n\tconst pending = gatewayModelPending.get(cacheKey);\n\tif (pending) return pending;\n\tconst request = (async () => {\n\t\ttry {\n\t\t\tconst response = await fetch(catalog.url, { headers: catalog.headers });\n\t\t\tif (!response.ok) {\n\t\t\t\tconst body = await response.text().catch(() => \"\");\n\t\t\t\tconsole.warn(\"[gateway-model] catalog HTTP error\", {\n\t\t\t\t\t...catalogLogContext(modelId, catalog),\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\tstatusText: response.statusText,\n\t\t\t\t\tbody: snippet(body)\n\t\t\t\t});\n\t\t\t\tgatewayModelCache.set(cacheKey, { status: \"missing\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst body = await response.json();\n\t\t\tconst raw = parseGatewayModelResponse(body);\n\t\t\tif (!raw || raw.type && raw.type !== \"language\") {\n\t\t\t\tconsole.warn(\"[gateway-model] catalog payload rejected\", {\n\t\t\t\t\t...catalogLogContext(modelId, catalog),\n\t\t\t\t\ttype: raw?.type,\n\t\t\t\t\tbody: snippet(JSON.stringify(body))\n\t\t\t\t});\n\t\t\t\tgatewayModelCache.set(cacheKey, { status: \"missing\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst capabilities = capabilitiesFromGatewayTags(raw.tags);\n\t\t\tconst metadata = {\n\t\t\t\tpricing: {\n\t\t\t\t\tinputPerMillion: pricePerMillion(raw.pricing?.input),\n\t\t\t\t\toutputPerMillion: pricePerMillion(raw.pricing?.output),\n\t\t\t\t\tcacheReadPerMillion: pricePerMillion(raw.pricing?.input_cache_read),\n\t\t\t\t\tcacheWritePerMillion: pricePerMillion(raw.pricing?.input_cache_write)\n\t\t\t\t},\n\t\t\t\tcapabilities,\n\t\t\t\t...raw.context_window !== void 0 ? { contextWindow: raw.context_window } : {},\n\t\t\t\t...raw.max_tokens !== void 0 ? { maxOutputTokens: raw.max_tokens } : {}\n\t\t\t};\n\t\t\tgatewayModelCache.set(cacheKey, {\n\t\t\t\tstatus: \"found\",\n\t\t\t\t...metadata\n\t\t\t});\n\t\t\treturn metadata;\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"[gateway-model] catalog fetch failed\", {\n\t\t\t\t...catalogLogContext(modelId, catalog),\n\t\t\t\terror: error instanceof Error ? error.message : String(error)\n\t\t\t});\n\t\t\tgatewayModelCache.set(cacheKey, { status: \"missing\" });\n\t\t\treturn;\n\t\t} finally {\n\t\t\tgatewayModelPending.delete(cacheKey);\n\t\t}\n\t})();\n\tgatewayModelPending.set(cacheKey, request);\n\treturn request;\n}\n/** Cached gateway catalog lookup for model multimodal capabilities. */\nasync function resolveModelCapabilities(modelId) {\n\treturn (await fetchGatewayModelMetadata(modelId))?.capabilities ?? {\n\t\timages: false,\n\t\tfiles: false\n\t};\n}\n/** Resolve a user-authored model id to an AI Gateway language model + optional pricing metadata. */\nasync function resolveAgentModel(modelId) {\n\tconst baseUrl = resolveGatewayBaseUrl();\n\tconst gateway = getGatewayClient(baseUrl);\n\tconst metadata = await fetchGatewayModelMetadata(modelId);\n\tconst pricing = metadata?.pricing;\n\tconst capabilities = metadata?.capabilities ?? {\n\t\timages: false,\n\t\tfiles: false\n\t};\n\tif (pricing === void 0) {\n\t\tconst catalog = resolveGatewayCatalogUrl(modelId);\n\t\tif (gatewayModelCache.get(gatewayModelCacheKey(modelId, catalog))?.status === \"missing\" && process.env.AI_GATEWAY_API_KEY?.trim()) {\n\t\t\tconsole.warn(\"[gateway-model] rejecting model after catalog miss\", catalogLogContext(modelId, catalog));\n\t\t\tthrow new Error(`Unknown gateway model: ${modelId}`);\n\t\t}\n\t}\n\treturn {\n\t\tlanguageModel: gateway(modelId),\n\t\tmodelId,\n\t\tprovider: \"vercel-ai-gateway\",\n\t\tcapabilities,\n\t\t...baseUrl ? { baseUrl } : {},\n\t\t...pricing ? { pricing } : {},\n\t\t...metadata?.contextWindow !== void 0 ? { contextWindow: metadata.contextWindow } : {},\n\t\t...metadata?.maxOutputTokens !== void 0 ? { maxOutputTokens: metadata.maxOutputTokens } : {}\n\t};\n}\n//#endregion\n//#region src/schemas.ts\nconst ThinkingLevelSchema = z.enum([\n\t\"provider-default\",\n\t\"none\",\n\t\"minimal\",\n\t\"low\",\n\t\"medium\",\n\t\"high\",\n\t\"xhigh\"\n]);\nconst DEFAULT_THINKING_LEVEL = \"medium\";\n/** Default model for automatic context compaction when `compactionModel` is omitted. */\nconst DEFAULT_COMPACTION_MODEL_ID = \"deepseek/deepseek-v4-flash\";\n/** Default tool-loop step cap when `maxSteps` is omitted on `defineAgent`. */\nconst DEFAULT_MAX_STEPS = 100;\n/** Serializable subset of {@link AgentConfig} for JSON/env/CLI boundaries. */\nconst AgentCreateInputSchema = z.object({\n\tsystemPrompt: z.string(),\n\tmodel: AgentModelIdSchema,\n\t/**\n\t* Optional model used only for context compaction. Same `vendor/model-id` form as\n\t* `model`. When omitted, Keystroke uses {@link DEFAULT_COMPACTION_MODEL_ID}.\n\t*/\n\tcompactionModel: AgentModelIdSchema.optional(),\n\tthinkingLevel: ThinkingLevelSchema.optional(),\n\t/**\n\t* Maximum tool-loop steps per prompt. When omitted, Keystroke uses\n\t* {@link DEFAULT_MAX_STEPS}.\n\t*/\n\tmaxSteps: z.number().int().positive().optional()\n});\nfunction parseAgentCreateInput(input) {\n\treturn AgentCreateInputSchema.parse(input);\n}\nfunction resolveThinkingLevel(level) {\n\treturn level ?? \"medium\";\n}\nfunction resolveMaxSteps(maxSteps) {\n\treturn maxSteps ?? 100;\n}\n//#endregion\nexport { ThinkingLevelSchema as a, resolveThinkingLevel as c, resolveModelCapabilities as d, splitAgentModelId as f, modelSupportsMediaType as g, attachmentPlaceholderText as h, DEFAULT_THINKING_LEVEL as i, AgentModelIdSchema as l, withLlmRunContext as m, DEFAULT_COMPACTION_MODEL_ID as n, parseAgentCreateInput as o, currentLlmRunContext as p, DEFAULT_MAX_STEPS as r, resolveMaxSteps as s, AgentCreateInputSchema as t, resolveAgentModel as u };\n\n//# sourceMappingURL=schemas-yjoqQ6GJ.mjs.map","import { f as splitAgentModelId, u as resolveAgentModel } from \"./schemas-yjoqQ6GJ.mjs\";\nimport { generateId, generateText, isFileUIPart } from \"ai\";\nimport { LLM_KEY_SOURCE_HEADER, parseChatAttachmentServePath } from \"@keystrokehq/shared\";\n//#region src/ai/map-message-file-parts.ts\n/** Map every `FileUIPart` in each message, leaving other parts and non-array messages untouched. */\nasync function mapMessageFileParts(messages, mapFilePart) {\n\treturn Promise.all(messages.map(async (message) => {\n\t\tif (!Array.isArray(message.parts)) return message;\n\t\tconst parts = await Promise.all(message.parts.map((part) => isFileUIPart(part) ? mapFilePart(part) : part));\n\t\treturn {\n\t\t\t...message,\n\t\t\tparts\n\t\t};\n\t}));\n}\n//#endregion\n//#region src/ai/placeholder-chat-attachment-messages.ts\n/**\n* Approximate model-token cost of one image attachment. Vision pricing is\n* tile-based (provider-dependent, roughly 750–1,600 tokens for a typical\n* photo), not proportional to serialized bytes — a flat per-image charge is\n* closer to reality than counting base64 chars.\n*/\nconst APPROX_ATTACHMENT_IMAGE_TOKENS = 1100;\n/**\n* Approximate model-token cost of one non-image attachment (PDFs). Page count\n* is unknown without downloading, so this assumes a short document; a giant\n* PDF under-counts, but the estimate only steers the compaction heuristic.\n*/\nconst APPROX_ATTACHMENT_FILE_TOKENS = 3e3;\nfunction isUnhydratedAttachment(part) {\n\treturn parseChatAttachmentServePath(part.url) !== null;\n}\n/**\n* Replace unhydrated chat-attachment file parts (relative serve paths) with\n* text placeholders so the messages survive `convertToModelMessages` — the AI\n* SDK's `new URL(part.url)` throws `TypeError: Invalid URL` on relative paths.\n*\n* For estimation and compaction only: the placeholder tells the compaction\n* model an attachment existed, and the real model call hydrates the actual\n* bytes via `hydrateChatAttachmentMessages` instead.\n*/\nfunction placeholderChatAttachmentMessages(messages) {\n\treturn mapMessageFileParts(messages, (part) => isUnhydratedAttachment(part) ? {\n\t\ttype: \"text\",\n\t\ttext: `[attachment: ${part.filename?.trim() || \"file\"} (${part.mediaType})]`\n\t} : part);\n}\n/**\n* Estimated token cost of the unhydrated attachments in `messages`, to add on\n* top of a char-based serialized estimate (which only sees the placeholder\n* text, not what the attachment will cost once hydrated for the model).\n*/\nfunction estimateChatAttachmentTokens(messages) {\n\tlet total = 0;\n\tfor (const message of messages) {\n\t\tif (!Array.isArray(message.parts)) continue;\n\t\tfor (const part of message.parts) {\n\t\t\tif (!isFileUIPart(part) || !isUnhydratedAttachment(part)) continue;\n\t\t\ttotal += part.mediaType.startsWith(\"image/\") ? APPROX_ATTACHMENT_IMAGE_TOKENS : APPROX_ATTACHMENT_FILE_TOKENS;\n\t\t}\n\t}\n\treturn total;\n}\n//#endregion\n//#region src/ai/context-budget.ts\n/** Soft compaction trigger as a fraction of the usable input budget. */\nconst CONTEXT_COMPACTION_SOFT_RATIO = .9;\n/**\n* Fraction of the soft limit the retained raw tail may occupy after a\n* compaction. The remainder is headroom for the summary, system prompt, and\n* tool schemas.\n*/\nconst COMPACTION_TAIL_BUDGET_RATIO = .4;\n/** Floor for reserved output + framing tokens. */\nconst MIN_OUTPUT_RESERVE = 4096;\n/** Cap so million-token models are not compacted prematurely. */\nconst MAX_OUTPUT_RESERVE = 32768;\n/** Extra framing/tool-schema overhead beyond the output reservation. */\nconst SAFETY_RESERVE = 2048;\n/**\n* Conservative fixed chars-per-token ratio. Anchored estimates only apply it\n* to the delta since the last real `input_tokens`, so a systematic error here\n* is bounded by one step's new content, not the whole transcript.\n*/\nconst DEFAULT_CHARS_PER_TOKEN = 3.5;\n/**\n* Derive the usable input budget from gateway context metadata.\n* Returns null when the model has no known context window — auto-compaction is disabled.\n*/\nfunction resolveContextBudget(resolved) {\n\tconst contextWindow = resolved.contextWindow;\n\tif (contextWindow == null || contextWindow <= 0) return null;\n\tconst catalogMax = resolved.maxOutputTokens;\n\tconst proportional = Math.floor(contextWindow * .05);\n\tconst outputReserve = Math.min(MAX_OUTPUT_RESERVE, Math.max(MIN_OUTPUT_RESERVE, catalogMax ?? proportional, proportional));\n\tconst safetyReserve = Math.min(SAFETY_RESERVE, Math.floor(contextWindow * .01));\n\tconst inputBudget = Math.max(1, contextWindow - outputReserve - safetyReserve);\n\treturn {\n\t\tcontextWindow,\n\t\toutputReserve,\n\t\tsafetyReserve,\n\t\tinputBudget,\n\t\tsoftLimit: Math.floor(inputBudget * CONTEXT_COMPACTION_SOFT_RATIO),\n\t\thardLimit: inputBudget\n\t};\n}\n/** Rough serialized size used for preflight estimation (chars ≈ JSON length). */\nfunction estimateSerializedChars(input) {\n\tlet total = 0;\n\tif (input.systemPrompt) total += input.systemPrompt.length;\n\tif (input.messages !== void 0) total += JSON.stringify(input.messages).length;\n\tif (input.tools !== void 0) total += JSON.stringify(input.tools).length;\n\treturn total;\n}\nconst DATA_URL_MEDIA_MIN_CHARS = 4096;\nfunction approxMediaTokens(mediaType) {\n\treturn typeof mediaType === \"string\" && mediaType.startsWith(\"image/\") ? APPROX_ATTACHMENT_IMAGE_TOKENS : APPROX_ATTACHMENT_FILE_TOKENS;\n}\n/**\n* Serialized message size with media content measured as flat token estimates\n* instead of chars. Vision/file pricing is tile- or page-based — counting a\n* 4 MB image's ~5.3M base64 chars would estimate ~1.5M tokens for what the\n* provider bills as ~1,100, wrongly triggering compaction on any large image.\n*/\nfunction measureMessagesForBudget(messages) {\n\tlet mediaTokens = 0;\n\treturn {\n\t\tchars: JSON.stringify(messages, (_key, value) => {\n\t\t\tif (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n\t\t\t\tmediaTokens += 3e3;\n\t\t\t\treturn \"[media]\";\n\t\t\t}\n\t\t\tif (typeof value === \"object\" && value !== null) {\n\t\t\t\tconst part = value;\n\t\t\t\tif (part.type === \"image\" && part.image !== void 0) {\n\t\t\t\t\tmediaTokens += 1100;\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"image\",\n\t\t\t\t\t\tomitted: true\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif ((part.type === \"file\" || part.type === \"media\") && part.data !== void 0) {\n\t\t\t\t\tmediaTokens += approxMediaTokens(part.mediaType);\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: part.type,\n\t\t\t\t\t\tomitted: true\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (part.type === \"Buffer\" && Array.isArray(part.data)) {\n\t\t\t\t\tmediaTokens += 3e3;\n\t\t\t\t\treturn \"[media]\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof value === \"string\" && value.length >= DATA_URL_MEDIA_MIN_CHARS && value.startsWith(\"data:\")) {\n\t\t\t\tmediaTokens += value.startsWith(\"data:image/\") ? 1100 : 3e3;\n\t\t\t\treturn \"[media]\";\n\t\t\t}\n\t\t\treturn value;\n\t\t})?.length ?? 0,\n\t\tmediaTokens\n\t};\n}\n/**\n* Per-prompt tracker: anchors on the last real `input_tokens` and estimates\n* only the delta (new content since that request), so estimation error is\n* bounded by one step's new content instead of the whole transcript. Before\n* the first completed step it falls back to a full char scan with media\n* priced at flat token constants.\n*/\nvar ContextBudgetTracker = class {\n\tbudget;\n\tanchor;\n\tlastMeasure;\n\tconstructor(budget) {\n\t\tthis.budget = budget;\n\t}\n\tget contextBudget() {\n\t\treturn this.budget;\n\t}\n\tget lastInputTokens() {\n\t\treturn this.anchor?.inputTokens;\n\t}\n\t/**\n\t* Anchor on a completed primary-model step's input token count, paired with\n\t* the measure taken by the estimate that preceded that request — future\n\t* estimates price only content added after this point.\n\t*/\n\trecordStepUsage(inputTokens) {\n\t\tif (inputTokens > 0 && this.lastMeasure) this.anchor = {\n\t\t\tinputTokens,\n\t\t\t...this.lastMeasure\n\t\t};\n\t}\n\t/** Reset after a successful compaction: the transcript the anchor priced no longer exists. */\n\tresetAfterCompaction() {\n\t\tthis.anchor = void 0;\n\t\tthis.lastMeasure = void 0;\n\t}\n\testimate(input) {\n\t\tif (!this.budget) return null;\n\t\tconst measure = measureMessagesForBudget(input.messages);\n\t\tconst overheadChars = input.overheadChars ?? estimateSerializedChars({\n\t\t\tsystemPrompt: input.systemPrompt,\n\t\t\ttools: input.tools\n\t\t});\n\t\tconst mediaTokens = measure.mediaTokens + (input.extraMessageTokens ?? 0);\n\t\tthis.lastMeasure = {\n\t\t\tchars: measure.chars,\n\t\t\tmediaTokens\n\t\t};\n\t\tconst toTokens = (chars) => Math.ceil(chars / DEFAULT_CHARS_PER_TOKEN);\n\t\tlet estimatedInputTokens;\n\t\tlet estimatedMessageTokens;\n\t\tif (this.anchor) {\n\t\t\tconst deltaTokens = toTokens(Math.max(0, measure.chars - this.anchor.chars)) + Math.max(0, mediaTokens - this.anchor.mediaTokens);\n\t\t\testimatedInputTokens = this.anchor.inputTokens + deltaTokens;\n\t\t\testimatedMessageTokens = Math.max(deltaTokens, estimatedInputTokens - toTokens(overheadChars));\n\t\t} else {\n\t\t\testimatedInputTokens = toTokens(overheadChars + measure.chars) + mediaTokens;\n\t\t\testimatedMessageTokens = toTokens(measure.chars) + mediaTokens;\n\t\t}\n\t\tconst decision = estimatedInputTokens >= this.budget.softLimit && estimatedMessageTokens > Math.floor(this.budget.softLimit * .5) ? \"compact\" : \"allow\";\n\t\treturn {\n\t\t\testimatedInputTokens,\n\t\t\testimatedMessageTokens,\n\t\t\tdecision,\n\t\t\tbudget: this.budget\n\t\t};\n\t}\n};\n//#endregion\n//#region src/ai/usage.ts\n/**\n* Key source from the platform LLM proxy's response header. Undefined when the\n* request didn't go through the proxy (standalone / direct provider).\n*/\nfunction byokFromResponseHeaders(headers) {\n\tconst value = headers?.[LLM_KEY_SOURCE_HEADER];\n\tif (value === \"byok\") return true;\n\tif (value === \"platform\") return false;\n}\nfunction llmUsageFromLanguageModelUsage(usage, resolved, options) {\n\tconst input = usage.inputTokens ?? 0;\n\tconst output = usage.outputTokens ?? 0;\n\tconst reasoning = usage.outputTokenDetails.reasoningTokens ?? 0;\n\tconst cacheRead = usage.inputTokenDetails.cacheReadTokens ?? 0;\n\tconst cacheWrite = usage.inputTokenDetails.cacheWriteTokens ?? 0;\n\tconst noCache = usage.inputTokenDetails.noCacheTokens ?? Math.max(0, input - cacheRead - cacheWrite);\n\tconst totalTokens = usage.totalTokens ?? input + output;\n\tconst pricing = resolved.pricing;\n\tconst inputCost = pricing ? noCache / 1e6 * pricing.inputPerMillion : 0;\n\tconst outputCost = pricing ? output / 1e6 * pricing.outputPerMillion : 0;\n\tconst cacheReadCost = pricing ? cacheRead / 1e6 * pricing.cacheReadPerMillion : 0;\n\tconst cacheWriteCost = pricing ? cacheWrite / 1e6 * pricing.cacheWritePerMillion : 0;\n\tconst total = inputCost + outputCost + cacheReadCost + cacheWriteCost;\n\tconst { directId } = splitAgentModelId(resolved.modelId);\n\treturn {\n\t\tlabel: resolved.modelId,\n\t\tquantity: totalTokens,\n\t\tamount: total,\n\t\t...options?.byok !== void 0 ? { byok: options.byok } : {},\n\t\t...options?.stepRef ? { stepRef: options.stepRef } : {},\n\t\tmetadata: {\n\t\t\tprovider: resolved.provider,\n\t\t\tmodel: directId,\n\t\t\t...options?.byok !== void 0 ? { keySource: options.byok ? \"byok\" : \"platform\" } : {},\n\t\t\tresponseModel: resolved.modelId,\n\t\t\tinput,\n\t\t\tnoCache,\n\t\t\toutput,\n\t\t\treasoning,\n\t\t\tcacheRead,\n\t\t\tcacheWrite,\n\t\t\tcost: {\n\t\t\t\tnoCache: inputCost,\n\t\t\t\toutput: outputCost,\n\t\t\t\tcacheRead: cacheReadCost,\n\t\t\t\tcacheWrite: cacheWriteCost,\n\t\t\t\ttotal\n\t\t\t}\n\t\t}\n\t};\n}\n/** Soft char budget for one compaction-model request (chunk recursively above this). */\nconst COMPACTION_CHUNK_CHARS = 12e4;\nconst CONTEXT_COMPACTED_EVENT_TYPE = \"context_compacted\";\nfunction resolveCompactionModelId(explicit) {\n\treturn explicit ?? \"deepseek/deepseek-v4-flash\";\n}\nconst COMPACTION_SYSTEM_PROMPT = [\n\t\"You compress long agent conversation history into a compact context summary.\",\n\t\"Preserve durable facts, decisions, IDs, file paths, unresolved tasks, and recent tool outcomes.\",\n\t\"Omit chit-chat, repeated tool dumps, and superseded drafts.\",\n\t\"Write plain prose the primary agent can continue from. Do not call tools.\",\n\t\"Respond with ONLY the summary text.\"\n].join(\"\\n\");\nfunction messageTextPreview(message) {\n\tif (typeof message.content === \"string\") return message.content;\n\tif (!Array.isArray(message.content)) return JSON.stringify(message.content);\n\treturn message.content.map((part) => {\n\t\tif (typeof part === \"object\" && part !== null && \"type\" in part) {\n\t\t\tif (part.type === \"text\" && \"text\" in part) return String(part.text);\n\t\t\tif (part.type === \"tool-call\") return `[tool-call ${part.toolName ?? \"unknown\"}]`;\n\t\t\tif (part.type === \"tool-result\") return `[tool-result ${part.toolName ?? \"unknown\"}]`;\n\t\t}\n\t\treturn JSON.stringify(part);\n\t}).join(\"\\n\");\n}\nfunction formatMessagesForCompaction(messages) {\n\treturn messages.map((message, index) => {\n\t\tconst role = message.role;\n\t\treturn `### ${index + 1}. ${role}\\n${messageTextPreview(message)}`;\n\t}).join(\"\\n\\n\");\n}\n/**\n* Split off a recent raw tail. Prefer a user-turn boundary and never start the\n* tail on an orphaned tool result (keeps tool-call / tool-result pairs intact).\n*/\nfunction splitTail(messages, retain, options) {\n\tif (messages.length <= retain) return {\n\t\tprefix: [],\n\t\ttail: messages\n\t};\n\tlet start = messages.length - retain;\n\twhile (start > 0 && messages[start]?.role === \"tool\") start -= 1;\n\tif (options?.preferUserBoundary !== false) while (start > 0 && messages[start]?.role !== \"user\") start -= 1;\n\treturn {\n\t\tprefix: messages.slice(0, start),\n\t\ttail: messages.slice(start)\n\t};\n}\n/**\n* Fraction of the soft limit the retained raw tail may occupy. Kept below the\n* compaction trigger's messages-only floor so a just-compacted context can't\n* immediately re-trigger (see COMPACTION_MIN_MESSAGE_RATIO).\n*/\nconst TAIL_BUDGET_RATIO = COMPACTION_TAIL_BUDGET_RATIO;\n/**\n* Token allowance for the summary itself: capped at the summarizer's\n* maxOutputTokens, scaled down for small budgets (summaries track content\n* size, not the cap).\n*/\nfunction summaryReserveTokens(softLimit) {\n\treturn Math.min(4096, Math.ceil(softLimit * .1));\n}\n/**\n* Choose which messages to summarize vs keep raw. Starts from the requested\n* retained tail, then shrinks it while it exceeds the tail budget — down to\n* zero, so even a single oversized latest message gets summarized instead of\n* staying protected and blowing the context window.\n*/\nfunction resolveCompactionSplit(options) {\n\tconst { messages, budget } = options;\n\tlet retain = options.retainTail;\n\tlet split = splitTail(messages, retain);\n\tif (budget) {\n\t\tconst tailBudget = Math.max(1, Math.min(Math.floor(budget.softLimit * TAIL_BUDGET_RATIO), budget.softLimit - (options.overheadTokens ?? 0) - summaryReserveTokens(budget.softLimit)));\n\t\twhile (split.tail.length > 0 && estimateSerializedCharsApprox(split.tail) > tailBudget) {\n\t\t\tretain = Math.min(retain - 1, split.tail.length - 1);\n\t\t\tif (retain <= 0) {\n\t\t\t\tsplit = {\n\t\t\t\t\tprefix: messages,\n\t\t\t\t\ttail: []\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tsplit = splitTail(messages, retain, { preferUserBoundary: false });\n\t\t}\n\t\treturn split;\n\t}\n\tif (split.prefix.length === 0 && !options.hasPriorSummary && split.tail.length > 0) return {\n\t\tprefix: messages,\n\t\ttail: []\n\t};\n\treturn split;\n}\nasync function summarizeChunk(resolved, text, priorSummary) {\n\tconst prompt = [\n\t\tpriorSummary ? `Prior summary:\\n${priorSummary}\\n` : \"\",\n\t\t\"Conversation to compress:\\n\",\n\t\ttext\n\t].filter(Boolean).join(\"\\n\");\n\tconst result = await generateText({\n\t\tmodel: resolved.languageModel,\n\t\tsystem: COMPACTION_SYSTEM_PROMPT,\n\t\tprompt,\n\t\tmaxOutputTokens: 4096,\n\t\treasoning: \"minimal\"\n\t});\n\tconst usage = llmUsageFromLanguageModelUsage(result.usage, resolved, {\n\t\tbyok: byokFromResponseHeaders(result.response?.headers),\n\t\tstepRef: `compaction:${generateId()}`\n\t});\n\tusage.label = `LLM compaction · ${resolved.modelId}`;\n\tusage.metadata = {\n\t\t...usage.metadata,\n\t\toperation: \"context_compaction\"\n\t};\n\treturn {\n\t\tsummary: result.text.trim() || priorSummary || \"(empty summary)\",\n\t\tusage\n\t};\n}\nasync function summarizeMessages(resolved, messages, priorSummary) {\n\tconst formatted = formatMessagesForCompaction(messages);\n\tif (formatted.length <= COMPACTION_CHUNK_CHARS) {\n\t\tconst chunk = await summarizeChunk(resolved, priorSummary ? `${priorSummary}\\n\\n${formatted}` : formatted, void 0);\n\t\treturn {\n\t\t\tsummary: chunk.summary,\n\t\t\tusages: [chunk.usage]\n\t\t};\n\t}\n\tconst usages = [];\n\tlet rolling = priorSummary;\n\tlet offset = 0;\n\twhile (offset < formatted.length) {\n\t\tconst chunk = await summarizeChunk(resolved, formatted.slice(offset, offset + COMPACTION_CHUNK_CHARS), rolling);\n\t\tusages.push(chunk.usage);\n\t\trolling = chunk.summary;\n\t\toffset += COMPACTION_CHUNK_CHARS;\n\t}\n\treturn {\n\t\tsummary: rolling ?? \"(empty summary)\",\n\t\tusages\n\t};\n}\nfunction summaryToModelMessage(summary) {\n\treturn {\n\t\trole: \"user\",\n\t\tcontent: [\n\t\t\t\"Context summary from earlier in this session (older messages were compacted):\",\n\t\t\t\"\",\n\t\t\tsummary\n\t\t].join(\"\\n\")\n\t};\n}\nfunction summaryToUiMessage(summary) {\n\treturn {\n\t\tid: generateId(),\n\t\trole: \"user\",\n\t\tparts: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: [\n\t\t\t\t\"Context summary from earlier in this session (older messages were compacted):\",\n\t\t\t\t\"\",\n\t\t\t\tsummary\n\t\t\t].join(\"\\n\")\n\t\t}]\n\t};\n}\n/**\n* Compact model messages with the compaction model. Retains a recent raw tail.\n* Caller supplies `compactedThroughSeq` for durable checkpoints (message event seq).\n*/\nasync function compactModelMessages(options) {\n\tconst retain = options.retainTail ?? 4;\n\tconst { prefix, tail } = resolveCompactionSplit({\n\t\tmessages: options.messages,\n\t\tretainTail: retain,\n\t\tbudget: options.budget ?? null,\n\t\thasPriorSummary: Boolean(options.priorSummary),\n\t\t...options.overheadTokens !== void 0 ? { overheadTokens: options.overheadTokens } : {}\n\t});\n\tif (prefix.length === 0 && !options.priorSummary) throw new Error(\"Nothing to compact\");\n\tconst compactedThroughSeq = typeof options.compactedThroughSeq === \"function\" ? options.compactedThroughSeq(prefix.length) : options.compactedThroughSeq;\n\tconst resolved = await resolveAgentModel(options.compactionModelId);\n\tconst { summary, usages } = await summarizeMessages(resolved, prefix.length > 0 ? prefix : [], options.priorSummary);\n\tconst primary = usages[0];\n\tlet quantity = 0;\n\tlet amount = 0;\n\tlet summaryInputTokens = 0;\n\tlet summaryOutputTokens = 0;\n\tfor (const usage of usages) {\n\t\tquantity += usage.quantity;\n\t\tamount += usage.amount;\n\t\tif (typeof usage.metadata.input === \"number\") summaryInputTokens += usage.metadata.input;\n\t\tif (typeof usage.metadata.output === \"number\") summaryOutputTokens += usage.metadata.output;\n\t}\n\tconst usage = {\n\t\t...primary,\n\t\tquantity,\n\t\tamount,\n\t\tlabel: `LLM compaction · ${resolved.modelId}`,\n\t\tmetadata: {\n\t\t\t...primary.metadata,\n\t\t\toperation: \"context_compaction\",\n\t\t\tsourceModel: options.sourceModel,\n\t\t\tcompactedThroughSeq,\n\t\t\tdurable: options.durable,\n\t\t\tcompactionChunks: usages.length,\n\t\t\tinput: summaryInputTokens || primary.metadata.input,\n\t\t\toutput: summaryOutputTokens || primary.metadata.output,\n\t\t\tcost: {\n\t\t\t\t...primary.metadata.cost ?? {},\n\t\t\t\ttotal: amount\n\t\t\t}\n\t\t}\n\t};\n\tconst checkpoint = {\n\t\tcompactedThroughSeq,\n\t\tsummary,\n\t\tcompactionModel: resolved.modelId,\n\t\tsourceModel: options.sourceModel,\n\t\tdurable: options.durable,\n\t\t...options.estimatedBeforeTokens !== void 0 ? { estimatedBeforeTokens: options.estimatedBeforeTokens } : {},\n\t\t...options.actualBeforeTokens !== void 0 ? { actualBeforeTokens: options.actualBeforeTokens } : {},\n\t\tretainedTailEstimate: estimateSerializedCharsApprox(tail),\n\t\tsummaryInputTokens: summaryInputTokens > 0 ? summaryInputTokens : void 0,\n\t\tsummaryOutputTokens: summaryOutputTokens > 0 ? summaryOutputTokens : void 0,\n\t\t...options.budget ? {\n\t\t\tcontextWindow: options.budget.contextWindow,\n\t\t\tsoftLimit: options.budget.softLimit\n\t\t} : {},\n\t\t...options.promptId !== void 0 ? { promptId: options.promptId } : {}\n\t};\n\treturn {\n\t\tmessages: [summaryToModelMessage(summary), ...tail],\n\t\tcheckpoint,\n\t\tusage\n\t};\n}\nfunction estimateSerializedCharsApprox(messages) {\n\treturn Math.ceil(JSON.stringify(messages).length / 4);\n}\n/**\n* Rebuild model-facing UI messages from a durable checkpoint + newer transcript.\n* The full transcript is unchanged; this only shapes what the model sees.\n*/\nfunction rebuildMessagesFromCheckpoint(options) {\n\tconst { checkpoint, messageEvents } = options;\n\tif (!checkpoint || !checkpoint.durable) return messageEvents.map((event) => event.message);\n\tconst suffix = messageEvents.filter((event) => event.seq > checkpoint.compactedThroughSeq).map((event) => event.message);\n\treturn [summaryToUiMessage(checkpoint.summary), ...suffix];\n}\n/** Parse a durable checkpoint from a persisted agent event payload. */\nfunction parseContextCompactionCheckpoint(payload) {\n\tif (typeof payload !== \"object\" || payload === null) return null;\n\tconst record = payload;\n\tconst checkpoint = record.type === \"context_compacted\" && typeof record.checkpoint === \"object\" && record.checkpoint !== null ? record.checkpoint : record;\n\tif (typeof checkpoint.compactedThroughSeq !== \"number\" || typeof checkpoint.summary !== \"string\" || typeof checkpoint.compactionModel !== \"string\" || typeof checkpoint.sourceModel !== \"string\" || typeof checkpoint.durable !== \"boolean\") return null;\n\treturn checkpoint;\n}\n//#endregion\nexport { resolveCompactionModelId as a, llmUsageFromLanguageModelUsage as c, resolveContextBudget as d, estimateChatAttachmentTokens as f, rebuildMessagesFromCheckpoint as i, ContextBudgetTracker as l, mapMessageFileParts as m, compactModelMessages as n, summaryToUiMessage as o, placeholderChatAttachmentMessages as p, parseContextCompactionCheckpoint as r, byokFromResponseHeaders as s, CONTEXT_COMPACTED_EVENT_TYPE as t, estimateSerializedChars as u };\n\n//# sourceMappingURL=context-compaction-D2_B1nky.mjs.map"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { A as credentialInputSchema, F as normalizeCredentialList, I as toCredentialRequirement, N as isCredentialInput, T as ResolvedCredentials, _ as DefineStaticCredentialInput, a as CREDENTIAL_SCOPE_TYPES, b as NormalizeCredential, c as CredentialAuthKind, d as CredentialList, f as CredentialRequirement, g as DefineOAuthCredentialInput, h as DefineCredentialInput, j as defineCredential, k as credential, m as CredentialScopeType, o as Credential, u as CredentialInput } from "./index-BGDEj1cq.cjs";
1
+ import { A as credentialInputSchema, F as normalizeCredentialList, I as toCredentialRequirement, N as isCredentialInput, T as ResolvedCredentials, _ as DefineStaticCredentialInput, a as CREDENTIAL_SCOPE_TYPES, b as NormalizeCredential, c as CredentialAuthKind, d as CredentialList, f as CredentialRequirement, g as DefineOAuthCredentialInput, h as DefineCredentialInput, j as defineCredential, k as credential, m as CredentialScopeType, o as Credential, u as CredentialInput } from "./index-dDHyyZ6y.cjs";
2
2
  export { CREDENTIAL_SCOPE_TYPES, type Credential, type CredentialAuthKind, type CredentialInput, type CredentialList, type CredentialRequirement, type CredentialScopeType, type DefineCredentialInput, type DefineOAuthCredentialInput, type DefineStaticCredentialInput, type NormalizeCredential, type ResolvedCredentials, credential, credentialInputSchema, defineCredential, isCredentialInput, normalizeCredentialList, toCredentialRequirement };
@@ -1,2 +1,2 @@
1
- import { A as credentialInputSchema, F as normalizeCredentialList, I as toCredentialRequirement, N as isCredentialInput, T as ResolvedCredentials, _ as DefineStaticCredentialInput, a as CREDENTIAL_SCOPE_TYPES, b as NormalizeCredential, c as CredentialAuthKind, d as CredentialList, f as CredentialRequirement, g as DefineOAuthCredentialInput, h as DefineCredentialInput, j as defineCredential, k as credential, m as CredentialScopeType, o as Credential, u as CredentialInput } from "./index-BGDEj1cq.mjs";
1
+ import { A as credentialInputSchema, F as normalizeCredentialList, I as toCredentialRequirement, N as isCredentialInput, T as ResolvedCredentials, _ as DefineStaticCredentialInput, a as CREDENTIAL_SCOPE_TYPES, b as NormalizeCredential, c as CredentialAuthKind, d as CredentialList, f as CredentialRequirement, g as DefineOAuthCredentialInput, h as DefineCredentialInput, j as defineCredential, k as credential, m as CredentialScopeType, o as Credential, u as CredentialInput } from "./index-dDHyyZ6y.mjs";
2
2
  export { CREDENTIAL_SCOPE_TYPES, type Credential, type CredentialAuthKind, type CredentialInput, type CredentialList, type CredentialRequirement, type CredentialScopeType, type DefineCredentialInput, type DefineOAuthCredentialInput, type DefineStaticCredentialInput, type NormalizeCredential, type ResolvedCredentials, credential, credentialInputSchema, defineCredential, isCredentialInput, normalizeCredentialList, toCredentialRequirement };
@@ -6746,7 +6746,7 @@ var require_get_vercel_oidc_token = /* @__PURE__ */ require_chunk.__commonJSMin(
6746
6746
  err = error;
6747
6747
  }
6748
6748
  try {
6749
- const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await Promise.resolve().then(() => /* @__PURE__ */ require_chunk.__toESM(require_token_util())), await Promise.resolve().then(() => /* @__PURE__ */ require_chunk.__toESM(require("./token-A3WLmCKE.cjs").default))]);
6749
+ const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await Promise.resolve().then(() => /* @__PURE__ */ require_chunk.__toESM(require_token_util())), await Promise.resolve().then(() => /* @__PURE__ */ require_chunk.__toESM(require("./token-BeAAlWuP.cjs").default))]);
6750
6750
  if (!token || isExpired(getTokenPayload(token), options?.expirationBufferMs)) {
6751
6751
  await refreshToken(options);
6752
6752
  token = getVercelOidcTokenSync();
@@ -17583,6 +17583,12 @@ Object.defineProperty(exports, "isJSONObject", {
17583
17583
  return isJSONObject;
17584
17584
  }
17585
17585
  });
17586
+ Object.defineProperty(exports, "isStepCount", {
17587
+ enumerable: true,
17588
+ get: function() {
17589
+ return isStepCount;
17590
+ }
17591
+ });
17586
17592
  Object.defineProperty(exports, "jsonSchema", {
17587
17593
  enumerable: true,
17588
17594
  get: function() {
@@ -17800,4 +17806,4 @@ Object.defineProperty(exports, "wrapLanguageModel", {
17800
17806
  }
17801
17807
  });
17802
17808
 
17803
- //# sourceMappingURL=dist-BBUHIiCy.cjs.map
17809
+ //# sourceMappingURL=dist-BBtHuSHr.cjs.map