@geminixiang/mikan 1.0.0-beta.84 → 1.0.0-beta.86

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 (289) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +10 -10
  3. package/dist/adapters/commands/session-view.js +1 -1
  4. package/dist/adapters/commands/session-view.js.map +1 -1
  5. package/dist/adapters/discord/bot.d.ts.map +1 -1
  6. package/dist/adapters/discord/bot.js +1 -8
  7. package/dist/adapters/discord/bot.js.map +1 -1
  8. package/dist/adapters/github/activity.d.ts +3 -0
  9. package/dist/adapters/github/activity.d.ts.map +1 -0
  10. package/dist/adapters/github/activity.js +154 -0
  11. package/dist/adapters/github/activity.js.map +1 -0
  12. package/dist/adapters/github/bot.d.ts +10 -20
  13. package/dist/adapters/github/bot.d.ts.map +1 -1
  14. package/dist/adapters/github/bot.js +119 -342
  15. package/dist/adapters/github/bot.js.map +1 -1
  16. package/dist/adapters/github/client.d.ts +9 -19
  17. package/dist/adapters/github/client.d.ts.map +1 -1
  18. package/dist/adapters/github/client.js +28 -104
  19. package/dist/adapters/github/client.js.map +1 -1
  20. package/dist/adapters/github/context.d.ts.map +1 -1
  21. package/dist/adapters/github/context.js +29 -20
  22. package/dist/adapters/github/context.js.map +1 -1
  23. package/dist/adapters/github/github-ops.d.ts +2 -10
  24. package/dist/adapters/github/github-ops.d.ts.map +1 -1
  25. package/dist/adapters/github/github-ops.js +28 -91
  26. package/dist/adapters/github/github-ops.js.map +1 -1
  27. package/dist/adapters/github/policy.d.ts +19 -0
  28. package/dist/adapters/github/policy.d.ts.map +1 -0
  29. package/dist/adapters/github/policy.js +79 -0
  30. package/dist/adapters/github/policy.js.map +1 -0
  31. package/dist/adapters/github/tool-pack.d.ts +2 -2
  32. package/dist/adapters/github/tool-pack.d.ts.map +1 -1
  33. package/dist/adapters/github/tool-pack.js +4 -9
  34. package/dist/adapters/github/tool-pack.js.map +1 -1
  35. package/dist/adapters/github/tools/checks.d.ts.map +1 -1
  36. package/dist/adapters/github/tools/checks.js +6 -8
  37. package/dist/adapters/github/tools/checks.js.map +1 -1
  38. package/dist/adapters/github/tools/pr.d.ts.map +1 -1
  39. package/dist/adapters/github/tools/pr.js +7 -9
  40. package/dist/adapters/github/tools/pr.js.map +1 -1
  41. package/dist/adapters/github/types.d.ts +66 -67
  42. package/dist/adapters/github/types.d.ts.map +1 -1
  43. package/dist/adapters/github/types.js.map +1 -1
  44. package/dist/adapters/github/webhook.d.ts +2 -1
  45. package/dist/adapters/github/webhook.d.ts.map +1 -1
  46. package/dist/adapters/github/webhook.js +46 -4
  47. package/dist/adapters/github/webhook.js.map +1 -1
  48. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  49. package/dist/adapters/progressive-renderer.js +3 -0
  50. package/dist/adapters/progressive-renderer.js.map +1 -1
  51. package/dist/adapters/shared.d.ts +3 -1
  52. package/dist/adapters/shared.d.ts.map +1 -1
  53. package/dist/adapters/shared.js +45 -23
  54. package/dist/adapters/shared.js.map +1 -1
  55. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  56. package/dist/adapters/slack/blocks.js +65 -2
  57. package/dist/adapters/slack/blocks.js.map +1 -1
  58. package/dist/adapters/slack/bot.d.ts +4 -0
  59. package/dist/adapters/slack/bot.d.ts.map +1 -1
  60. package/dist/adapters/slack/bot.js +84 -36
  61. package/dist/adapters/slack/bot.js.map +1 -1
  62. package/dist/adapters/slack/jev-context.js +2 -2
  63. package/dist/adapters/slack/jev-context.js.map +1 -1
  64. package/dist/adapters/slack/response-lifecycle.js +2 -2
  65. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  66. package/dist/adapters/slack/task-status.d.ts +3 -2
  67. package/dist/adapters/slack/task-status.d.ts.map +1 -1
  68. package/dist/adapters/slack/task-status.js +12 -15
  69. package/dist/adapters/slack/task-status.js.map +1 -1
  70. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  71. package/dist/adapters/telegram/bot.js +1 -8
  72. package/dist/adapters/telegram/bot.js.map +1 -1
  73. package/dist/adapters/web/admin/portal.js +1 -1
  74. package/dist/adapters/web/admin/portal.js.map +1 -1
  75. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -1
  76. package/dist/adapters/web/admin/provider-models.js +10 -3
  77. package/dist/adapters/web/admin/provider-models.js.map +1 -1
  78. package/dist/adapters/web/login/portal.js +6 -1
  79. package/dist/adapters/web/login/portal.js.map +1 -1
  80. package/dist/adapters/web/server.d.ts.map +1 -1
  81. package/dist/adapters/web/server.js +5 -3
  82. package/dist/adapters/web/server.js.map +1 -1
  83. package/dist/adapters/web/session-view/portal.d.ts +2 -1
  84. package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
  85. package/dist/adapters/web/session-view/portal.js +18 -27
  86. package/dist/adapters/web/session-view/portal.js.map +1 -1
  87. package/dist/cli/boot.d.ts.map +1 -1
  88. package/dist/cli/boot.js +4 -6
  89. package/dist/cli/boot.js.map +1 -1
  90. package/dist/cli/migrate.d.ts +3 -0
  91. package/dist/cli/migrate.d.ts.map +1 -0
  92. package/dist/cli/migrate.js +74 -0
  93. package/dist/cli/migrate.js.map +1 -0
  94. package/dist/cli/office.d.ts.map +1 -1
  95. package/dist/cli/office.js +8 -129
  96. package/dist/cli/office.js.map +1 -1
  97. package/dist/cli/onboard.d.ts +0 -1
  98. package/dist/cli/onboard.d.ts.map +1 -1
  99. package/dist/cli/onboard.js +4 -7
  100. package/dist/cli/onboard.js.map +1 -1
  101. package/dist/cli/types.d.ts +2 -3
  102. package/dist/cli/types.d.ts.map +1 -1
  103. package/dist/cli/types.js.map +1 -1
  104. package/dist/env-manifest.d.ts.map +1 -1
  105. package/dist/env-manifest.js +24 -22
  106. package/dist/env-manifest.js.map +1 -1
  107. package/dist/events/index.d.ts +3 -13
  108. package/dist/events/index.d.ts.map +1 -1
  109. package/dist/events/index.js +12 -58
  110. package/dist/events/index.js.map +1 -1
  111. package/dist/events/scheduler.d.ts.map +1 -1
  112. package/dist/events/scheduler.js +3 -0
  113. package/dist/events/scheduler.js.map +1 -1
  114. package/dist/file-guards.d.ts +7 -0
  115. package/dist/file-guards.d.ts.map +1 -1
  116. package/dist/file-guards.js +63 -1
  117. package/dist/file-guards.js.map +1 -1
  118. package/dist/harness/budget-stop.d.ts +3 -0
  119. package/dist/harness/budget-stop.d.ts.map +1 -0
  120. package/dist/harness/budget-stop.js +36 -0
  121. package/dist/harness/budget-stop.js.map +1 -0
  122. package/dist/harness/execution-resolver.d.ts.map +1 -1
  123. package/dist/harness/execution-resolver.js +5 -9
  124. package/dist/harness/execution-resolver.js.map +1 -1
  125. package/dist/harness/mcp.d.ts.map +1 -1
  126. package/dist/harness/mcp.js +75 -31
  127. package/dist/harness/mcp.js.map +1 -1
  128. package/dist/harness/models.js +2 -2
  129. package/dist/harness/models.js.map +1 -1
  130. package/dist/harness/open-connector.d.ts +0 -9
  131. package/dist/harness/open-connector.d.ts.map +1 -1
  132. package/dist/harness/open-connector.js +15 -69
  133. package/dist/harness/open-connector.js.map +1 -1
  134. package/dist/harness/presenter.d.ts.map +1 -1
  135. package/dist/harness/presenter.js +33 -2
  136. package/dist/harness/presenter.js.map +1 -1
  137. package/dist/harness/prompt.d.ts +1 -1
  138. package/dist/harness/prompt.d.ts.map +1 -1
  139. package/dist/harness/prompt.js +14 -32
  140. package/dist/harness/prompt.js.map +1 -1
  141. package/dist/harness/run-events.d.ts.map +1 -1
  142. package/dist/harness/run-events.js +6 -1
  143. package/dist/harness/run-events.js.map +1 -1
  144. package/dist/harness/runner.d.ts.map +1 -1
  145. package/dist/harness/runner.js +6 -9
  146. package/dist/harness/runner.js.map +1 -1
  147. package/dist/harness/session.d.ts.map +1 -1
  148. package/dist/harness/session.js +6 -0
  149. package/dist/harness/session.js.map +1 -1
  150. package/dist/harness/tools/event.d.ts.map +1 -1
  151. package/dist/harness/tools/event.js +19 -2
  152. package/dist/harness/tools/event.js.map +1 -1
  153. package/dist/harness/tools/generate-image.d.ts.map +1 -1
  154. package/dist/harness/tools/generate-image.js +17 -3
  155. package/dist/harness/tools/generate-image.js.map +1 -1
  156. package/dist/harness/tools/jev-browser.d.ts +1 -2
  157. package/dist/harness/tools/jev-browser.d.ts.map +1 -1
  158. package/dist/harness/tools/jev-browser.js +75 -50
  159. package/dist/harness/tools/jev-browser.js.map +1 -1
  160. package/dist/harness/types.d.ts +16 -0
  161. package/dist/harness/types.d.ts.map +1 -1
  162. package/dist/harness/types.js.map +1 -1
  163. package/dist/index.d.ts +2 -3
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +2 -3
  166. package/dist/index.js.map +1 -1
  167. package/dist/main.js +40 -93
  168. package/dist/main.js.map +1 -1
  169. package/dist/memory-capture/index.d.ts.map +1 -1
  170. package/dist/memory-capture/index.js +3 -3
  171. package/dist/memory-capture/index.js.map +1 -1
  172. package/dist/migrations/actor-vaults.d.ts +3 -0
  173. package/dist/migrations/actor-vaults.d.ts.map +1 -0
  174. package/dist/migrations/actor-vaults.js +43 -0
  175. package/dist/migrations/actor-vaults.js.map +1 -0
  176. package/dist/migrations/conversation-settings.d.ts +3 -0
  177. package/dist/migrations/conversation-settings.d.ts.map +1 -0
  178. package/dist/migrations/conversation-settings.js +31 -0
  179. package/dist/migrations/conversation-settings.js.map +1 -0
  180. package/dist/migrations/index.d.ts +14 -0
  181. package/dist/migrations/index.d.ts.map +1 -0
  182. package/dist/migrations/index.js +99 -0
  183. package/dist/migrations/index.js.map +1 -0
  184. package/dist/migrations/models-json.d.ts +3 -0
  185. package/dist/migrations/models-json.d.ts.map +1 -0
  186. package/dist/migrations/models-json.js +18 -0
  187. package/dist/migrations/models-json.js.map +1 -0
  188. package/dist/migrations/office-layout.d.ts +4 -0
  189. package/dist/migrations/office-layout.d.ts.map +1 -0
  190. package/dist/migrations/office-layout.js +94 -0
  191. package/dist/migrations/office-layout.js.map +1 -0
  192. package/dist/migrations/office-sessions.d.ts +3 -0
  193. package/dist/migrations/office-sessions.d.ts.map +1 -0
  194. package/dist/migrations/office-sessions.js +70 -0
  195. package/dist/migrations/office-sessions.js.map +1 -0
  196. package/dist/migrations/sandbox-containers.d.ts +3 -0
  197. package/dist/migrations/sandbox-containers.d.ts.map +1 -0
  198. package/dist/migrations/sandbox-containers.js +36 -0
  199. package/dist/migrations/sandbox-containers.js.map +1 -0
  200. package/dist/{sessions/migrate-common.d.ts → migrations/session-files.d.ts} +1 -2
  201. package/dist/migrations/session-files.d.ts.map +1 -0
  202. package/dist/{sessions/migrate-common.js → migrations/session-files.js} +2 -2
  203. package/dist/migrations/session-files.js.map +1 -0
  204. package/dist/{sessions/migrate-v3.d.ts → migrations/sessions-v3.d.ts} +4 -3
  205. package/dist/migrations/sessions-v3.d.ts.map +1 -0
  206. package/dist/{sessions/migrate-v3.js → migrations/sessions-v3.js} +14 -4
  207. package/dist/migrations/sessions-v3.js.map +1 -0
  208. package/dist/migrations/types.d.ts +30 -0
  209. package/dist/migrations/types.d.ts.map +1 -0
  210. package/dist/migrations/types.js +2 -0
  211. package/dist/migrations/types.js.map +1 -0
  212. package/dist/migrations/workspace-events.d.ts +3 -0
  213. package/dist/migrations/workspace-events.d.ts.map +1 -0
  214. package/dist/migrations/workspace-events.js +43 -0
  215. package/dist/migrations/workspace-events.js.map +1 -0
  216. package/dist/office/index.d.ts +2 -24
  217. package/dist/office/index.d.ts.map +1 -1
  218. package/dist/office/index.js +15 -579
  219. package/dist/office/index.js.map +1 -1
  220. package/dist/office/types.d.ts +0 -10
  221. package/dist/office/types.d.ts.map +1 -1
  222. package/dist/office/types.js.map +1 -1
  223. package/dist/runtime/conversation-runtime.js +12 -12
  224. package/dist/runtime/conversation-runtime.js.map +1 -1
  225. package/dist/sandbox/identity.d.ts +2 -3
  226. package/dist/sandbox/identity.d.ts.map +1 -1
  227. package/dist/sandbox/identity.js +6 -13
  228. package/dist/sandbox/identity.js.map +1 -1
  229. package/dist/sandbox/layout.d.ts +0 -2
  230. package/dist/sandbox/layout.d.ts.map +1 -1
  231. package/dist/sandbox/layout.js +2 -2
  232. package/dist/sandbox/layout.js.map +1 -1
  233. package/dist/sandbox/provisioner.d.ts +4 -38
  234. package/dist/sandbox/provisioner.d.ts.map +1 -1
  235. package/dist/sandbox/provisioner.js +32 -456
  236. package/dist/sandbox/provisioner.js.map +1 -1
  237. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  238. package/dist/sessions/chat-history-sync.js +28 -40
  239. package/dist/sessions/chat-history-sync.js.map +1 -1
  240. package/dist/sessions/session-store.d.ts.map +1 -1
  241. package/dist/sessions/session-store.js +1 -8
  242. package/dist/sessions/session-store.js.map +1 -1
  243. package/dist/sessions/store.d.ts +2 -3
  244. package/dist/sessions/store.d.ts.map +1 -1
  245. package/dist/sessions/store.js +8 -14
  246. package/dist/sessions/store.js.map +1 -1
  247. package/dist/sessions/types.d.ts +6 -15
  248. package/dist/sessions/types.d.ts.map +1 -1
  249. package/dist/sessions/types.js.map +1 -1
  250. package/dist/settings/index.d.ts +0 -48
  251. package/dist/settings/index.d.ts.map +1 -1
  252. package/dist/settings/index.js +6 -37
  253. package/dist/settings/index.js.map +1 -1
  254. package/dist/types.d.ts +0 -29
  255. package/dist/types.d.ts.map +1 -1
  256. package/dist/types.js.map +1 -1
  257. package/dist/vault/index.d.ts +0 -7
  258. package/dist/vault/index.d.ts.map +1 -1
  259. package/dist/vault/index.js +1 -36
  260. package/dist/vault/index.js.map +1 -1
  261. package/package.json +8 -6
  262. package/dist/adapters/github/repo.d.ts +0 -8
  263. package/dist/adapters/github/repo.d.ts.map +0 -1
  264. package/dist/adapters/github/repo.js +0 -92
  265. package/dist/adapters/github/repo.js.map +0 -1
  266. package/dist/adapters/github/tools/sync.d.ts +0 -13
  267. package/dist/adapters/github/tools/sync.d.ts.map +0 -1
  268. package/dist/adapters/github/tools/sync.js +0 -29
  269. package/dist/adapters/github/tools/sync.js.map +0 -1
  270. package/dist/cli/sandbox.d.ts +0 -3
  271. package/dist/cli/sandbox.d.ts.map +0 -1
  272. package/dist/cli/sandbox.js +0 -80
  273. package/dist/cli/sandbox.js.map +0 -1
  274. package/dist/cli/sessions.d.ts +0 -2
  275. package/dist/cli/sessions.d.ts.map +0 -1
  276. package/dist/cli/sessions.js +0 -78
  277. package/dist/cli/sessions.js.map +0 -1
  278. package/dist/sessions/migrate-common.d.ts.map +0 -1
  279. package/dist/sessions/migrate-common.js.map +0 -1
  280. package/dist/sessions/migrate-pi-084.d.ts +0 -7
  281. package/dist/sessions/migrate-pi-084.d.ts.map +0 -1
  282. package/dist/sessions/migrate-pi-084.js +0 -293
  283. package/dist/sessions/migrate-pi-084.js.map +0 -1
  284. package/dist/sessions/migrate-v3.d.ts.map +0 -1
  285. package/dist/sessions/migrate-v3.js.map +0 -1
  286. package/dist/settings/migrate.d.ts +0 -16
  287. package/dist/settings/migrate.d.ts.map +0 -1
  288. package/dist/settings/migrate.js +0 -70
  289. package/dist/settings/migrate.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/harness/models.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n createProvider,\n type Api,\n type AuthResult,\n type Model,\n type Models,\n type MutableModels,\n type Provider,\n type ProviderStreams,\n} from \"@earendil-works/pi-ai\";\nimport { builtinModels } from \"@earendil-works/pi-ai/providers/all\";\nimport { anthropicMessagesApi } from \"@earendil-works/pi-ai/api/anthropic-messages.lazy\";\nimport { azureOpenAIResponsesApi } from \"@earendil-works/pi-ai/api/azure-openai-responses.lazy\";\nimport { googleGenerativeAIApi } from \"@earendil-works/pi-ai/api/google-generative-ai.lazy\";\nimport { mistralConversationsApi } from \"@earendil-works/pi-ai/api/mistral-conversations.lazy\";\nimport { openAICompletionsApi } from \"@earendil-works/pi-ai/api/openai-completions.lazy\";\nimport { openAIResponsesApi } from \"@earendil-works/pi-ai/api/openai-responses.lazy\";\nimport { readJsonFileIfExists } from \"../file-guards.js\";\nimport type { CreateMikanModelsOptions } from \"./types.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst CUSTOM_API_STREAMS: Record<string, () => ProviderStreams> = {\n \"anthropic-messages\": anthropicMessagesApi,\n \"azure-openai-responses\": azureOpenAIResponsesApi,\n \"google-generative-ai\": googleGenerativeAIApi,\n \"mistral-conversations\": mistralConversationsApi,\n \"openai-completions\": openAICompletionsApi,\n \"openai-responses\": openAIResponsesApi,\n};\n\nconst DEFAULT_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\nconst DEFAULT_CONTEXT_WINDOW = 128000;\nconst DEFAULT_MAX_TOKENS = 16384;\n\ninterface CustomModelConfig {\n id: string;\n name?: string;\n api?: string;\n baseUrl?: string;\n reasoning?: boolean;\n input?: (\"text\" | \"image\")[];\n cost?: { input: number; output: number; cacheRead: number; cacheWrite: number };\n contextWindow?: number;\n maxTokens?: number;\n maxOutputTokens?: number;\n thinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n headers?: Record<string, string>;\n compat?: unknown;\n}\n\ninterface CustomProviderConfig {\n name?: string;\n api?: string;\n baseUrl?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n compat?: unknown;\n models?: CustomModelConfig[];\n}\n\ninterface ModelsJsonConfig {\n providers?: Record<string, CustomProviderConfig>;\n}\n\nexport function defaultModelsJsonPath(): string {\n return join(homedir(), \".mikan\", \"models.json\");\n}\n\nfunction isModelsJsonConfig(parsed: unknown): parsed is ModelsJsonConfig {\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"models.json must be a JSON object\");\n }\n const providers = (parsed as { providers?: unknown }).providers;\n if (providers === undefined) return true;\n if (!providers || typeof providers !== \"object\" || Array.isArray(providers)) {\n throw new Error('models.json \"providers\" must be an object');\n }\n for (const [name, config] of Object.entries(providers)) {\n if (!config || typeof config !== \"object\") {\n throw new Error(`models.json provider \"${name}\" must be an object`);\n }\n const models = (config as CustomProviderConfig).models;\n if (models !== undefined) {\n if (!Array.isArray(models)) {\n throw new Error(`models.json provider \"${name}\" models must be an array`);\n }\n const api = (config as CustomProviderConfig).api;\n if (typeof api !== \"string\" || !(api in CUSTOM_API_STREAMS)) {\n throw new Error(\n `models.json provider \"${name}\" needs an \"api\" of: ${Object.keys(CUSTOM_API_STREAMS).join(\", \")}`,\n );\n }\n for (const model of models) {\n if (!model || typeof model !== \"object\" || typeof model.id !== \"string\") {\n throw new Error(`models.json provider \"${name}\" has a model without a string \"id\"`);\n }\n }\n }\n }\n return true;\n}\n\nfunction envVarNameFor(providerName: string): string {\n return `${providerName.replace(/[^a-zA-Z0-9]+/g, \"_\").toUpperCase()}_API_KEY`;\n}\n\nfunction applyModelsJson(\n models: ReturnType<typeof builtinModels>,\n modelsJsonPath: string,\n): string | undefined {\n try {\n const config = readJsonFileIfExists(\n modelsJsonPath,\n isModelsJsonConfig,\n (detail) => `models.json is invalid: ${detail}`,\n );\n for (const [providerName, providerConfig] of Object.entries(config?.providers ?? {})) {\n if (providerConfig.models && providerConfig.models.length > 0) {\n models.setProvider(buildCustomProvider(providerName, providerConfig));\n } else if (providerConfig.baseUrl || providerConfig.compat) {\n const builtin = models.getProvider(providerName);\n if (builtin) {\n models.setProvider(overrideBuiltinProvider(builtin, providerConfig));\n }\n }\n }\n return undefined;\n } catch (err) {\n return `Failed to load ${modelsJsonPath}: ${errorMessage(err)}`;\n }\n}\n\nfunction buildCustomProvider(providerName: string, config: CustomProviderConfig): Provider {\n const api = config.api!;\n const displayName = config.name ?? providerName;\n const envVar = envVarNameFor(providerName);\n const models = (config.models ?? []).map((modelConfig): Model<Api> => {\n const model: Model<Api> = {\n id: modelConfig.id,\n name: modelConfig.name ?? modelConfig.id,\n api: (modelConfig.api ?? api) as Api,\n provider: providerName,\n baseUrl: modelConfig.baseUrl ?? config.baseUrl ?? \"\",\n reasoning: modelConfig.reasoning ?? false,\n input: modelConfig.input ?? [\"text\"],\n cost: modelConfig.cost ?? DEFAULT_COST,\n contextWindow: modelConfig.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n maxTokens: modelConfig.maxTokens ?? modelConfig.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\n };\n if (modelConfig.thinkingLevelMap) model.thinkingLevelMap = modelConfig.thinkingLevelMap;\n if (modelConfig.headers ?? config.headers) {\n model.headers = { ...config.headers, ...modelConfig.headers };\n }\n const compat = modelConfig.compat ?? config.compat;\n if (compat) model.compat = compat as Model<Api>[\"compat\"];\n return model;\n });\n\n return createProvider({\n id: providerName,\n name: displayName,\n baseUrl: config.baseUrl,\n headers: config.headers,\n auth: {\n apiKey: {\n name: `${displayName} API key`,\n resolve: async ({ ctx, credential }) => {\n const key =\n (credential?.type === \"api_key\" ? credential.key : undefined) ??\n config.apiKey ??\n (await ctx.env(envVar));\n if (!key) return undefined;\n const source = config.apiKey ? \"models.json\" : envVar;\n return { auth: { apiKey: key }, source };\n },\n },\n },\n models,\n api: CUSTOM_API_STREAMS[api]!(),\n });\n}\n\nfunction overrideBuiltinProvider(provider: Provider, config: CustomProviderConfig): Provider {\n const models = provider.getModels().map((model): Model<Api> => {\n const overridden: Model<Api> = Object.assign({}, model);\n if (config.baseUrl) overridden.baseUrl = config.baseUrl;\n if (config.compat) overridden.compat = config.compat as Model<Api>[\"compat\"];\n return overridden;\n });\n return {\n ...provider,\n getModels: () => models,\n };\n}\n\nexport class MikanModels {\n readonly models: Models;\n private loadError: string | undefined;\n\n private constructor(models: MutableModels, loadError: string | undefined) {\n this.models = models;\n this.loadError = loadError;\n }\n\n static create(options: CreateMikanModelsOptions = {}): MikanModels {\n const modelsJsonPath = options.modelsJsonPath ?? defaultModelsJsonPath();\n const models = builtinModels();\n const loadError = applyModelsJson(models, modelsJsonPath);\n return new MikanModels(models, loadError);\n }\n\n getError(): string | undefined {\n return this.loadError;\n }\n\n getAll(): Model<Api>[] {\n return [...this.models.getModels()];\n }\n\n find(provider: string, modelId: string): Model<Api> | undefined {\n return this.models.getModel(provider, modelId);\n }\n\n resolve(provider: string, modelId: string): Model<Api> {\n const model = this.find(provider, modelId);\n if (model) return model;\n throw new Error(\n `Unknown model \"${provider}/${modelId}\". Configure it in pi models.json or choose a registered model.`,\n );\n }\n\n async getAvailable(): Promise<Model<Api>[]> {\n const available = await Promise.all(\n this.models.getProviders().map(async (provider) => {\n try {\n return await this.models.getAvailable(provider.id);\n } catch {\n return [];\n }\n }),\n );\n return available.flat();\n }\n\n getAuth(model: Model<Api>): Promise<AuthResult | undefined> {\n return this.models.getAuth(model);\n }\n\n async getApiKeyForProvider(provider: string): Promise<string | undefined> {\n try {\n const auth = await this.models.getAuth(provider);\n return auth?.auth.apiKey;\n } catch {\n return undefined;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/harness/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,cAAc,GAQf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,uDAAuD,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AAC5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sDAAsD,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,kBAAkB,GAA0C;IAChE,oBAAoB,EAAE,oBAAoB;IAC1C,wBAAwB,EAAE,uBAAuB;IACjD,sBAAsB,EAAE,qBAAqB;IAC7C,uBAAuB,EAAE,uBAAuB;IAChD,oBAAoB,EAAE,oBAAoB;IAC1C,kBAAkB,EAAE,kBAAkB;CACvC,CAAC;AAEF,MAAM,YAAY,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;AAC1E,MAAM,sBAAsB,GAAG,MAAM,CAAC;AACtC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAgCjC,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAe;IACzC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,SAAS,GAAI,MAAkC,CAAC,SAAS,CAAC;IAChE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,qBAAqB,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,MAAM,GAAI,MAA+B,CAAC,MAAM,CAAC;QACvD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,2BAA2B,CAAC,CAAC;YAC5E,CAAC;YACD,MAAM,GAAG,GAAI,MAA+B,CAAC,GAAG,CAAC;YACjD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,wBAAwB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClG,CAAC;YACJ,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;oBACxE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,qCAAqC,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,YAAoB;IACzC,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC;AAChF,CAAC;AAED,SAAS,eAAe,CACtB,MAAwC,EACxC,cAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,oBAAoB,CACjC,cAAc,EACd,kBAAkB,EAClB,CAAC,MAAM,EAAE,EAAE,CAAC,2BAA2B,MAAM,EAAE,CAChD,CAAC;QACF,KAAK,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;YACrF,IAAI,cAAc,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9D,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;YACxE,CAAC;iBAAM,IAAI,cAAc,CAAC,OAAO,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;gBAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;gBACjD,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,kBAAkB,cAAc,KAAK,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,YAAoB,EAAE,MAA4B;IAC7E,MAAM,GAAG,GAAG,MAAM,CAAC,GAAI,CAAC;IACxB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,YAAY,CAAC;IAChD,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAc,EAAE;QACnE,MAAM,KAAK,GAAe;YACxB,EAAE,EAAE,WAAW,CAAC,EAAE;YAClB,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE;YACxC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,IAAI,GAAG,CAAQ;YACpC,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE;YACpD,SAAS,EAAE,WAAW,CAAC,SAAS,IAAI,KAAK;YACzC,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC;YACpC,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,YAAY;YACtC,aAAa,EAAE,WAAW,CAAC,aAAa,IAAI,sBAAsB;YAClE,SAAS,EAAE,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,eAAe,IAAI,kBAAkB;SACtF,CAAC;QACF,IAAI,WAAW,CAAC,gBAAgB;YAAE,KAAK,CAAC,gBAAgB,GAAG,WAAW,CAAC,gBAAgB,CAAC;QACxF,IAAI,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,KAAK,CAAC,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;QAChE,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QACnD,IAAI,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,MAA8B,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;QACpB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE;YACJ,MAAM,EAAE;gBACN,IAAI,EAAE,GAAG,WAAW,UAAU;gBAC9B,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE;oBACrC,MAAM,GAAG,GACP,CAAC,UAAU,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;wBAC7D,MAAM,CAAC,MAAM;wBACb,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC1B,IAAI,CAAC,GAAG;wBAAE,OAAO,SAAS,CAAC;oBAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;oBACtD,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC;gBAC3C,CAAC;aACF;SACF;QACD,MAAM;QACN,GAAG,EAAE,kBAAkB,CAAC,GAAG,CAAE,EAAE;KAChC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAkB,EAAE,MAA4B;IAC/E,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAc,EAAE;QAC5D,MAAM,UAAU,GAAe,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,OAAO;YAAE,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QACxD,IAAI,MAAM,CAAC,MAAM;YAAE,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,MAA8B,CAAC;QAC7E,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,OAAO;QACL,GAAG,QAAQ;QACX,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,WAAW;IAItB,YAAoB,MAAqB,EAAE,SAA6B;QACtE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,OAAO,GAA6B,EAAE;QAClD,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,qBAAqB,EAAE,CAAC;QACzE,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC1D,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,QAAgB,EAAE,OAAe;QACpC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,QAAgB,EAAE,OAAe;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,kBAAkB,QAAQ,IAAI,OAAO,iEAAiE,CACvG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,KAAiB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,QAAgB;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjD,OAAO,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF","sourcesContent":["import { effectiveStateDir } from \"../cli/arg-grammar.js\";\nimport { join } from \"node:path\";\nimport {\n createProvider,\n type Api,\n type AuthResult,\n type Model,\n type Models,\n type MutableModels,\n type Provider,\n type ProviderStreams,\n} from \"@earendil-works/pi-ai\";\nimport { builtinModels } from \"@earendil-works/pi-ai/providers/all\";\nimport { anthropicMessagesApi } from \"@earendil-works/pi-ai/api/anthropic-messages.lazy\";\nimport { azureOpenAIResponsesApi } from \"@earendil-works/pi-ai/api/azure-openai-responses.lazy\";\nimport { googleGenerativeAIApi } from \"@earendil-works/pi-ai/api/google-generative-ai.lazy\";\nimport { mistralConversationsApi } from \"@earendil-works/pi-ai/api/mistral-conversations.lazy\";\nimport { openAICompletionsApi } from \"@earendil-works/pi-ai/api/openai-completions.lazy\";\nimport { openAIResponsesApi } from \"@earendil-works/pi-ai/api/openai-responses.lazy\";\nimport { readJsonFileIfExists } from \"../file-guards.js\";\nimport type { CreateMikanModelsOptions } from \"./types.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst CUSTOM_API_STREAMS: Record<string, () => ProviderStreams> = {\n \"anthropic-messages\": anthropicMessagesApi,\n \"azure-openai-responses\": azureOpenAIResponsesApi,\n \"google-generative-ai\": googleGenerativeAIApi,\n \"mistral-conversations\": mistralConversationsApi,\n \"openai-completions\": openAICompletionsApi,\n \"openai-responses\": openAIResponsesApi,\n};\n\nconst DEFAULT_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\nconst DEFAULT_CONTEXT_WINDOW = 128000;\nconst DEFAULT_MAX_TOKENS = 16384;\n\ninterface CustomModelConfig {\n id: string;\n name?: string;\n api?: string;\n baseUrl?: string;\n reasoning?: boolean;\n input?: (\"text\" | \"image\")[];\n cost?: { input: number; output: number; cacheRead: number; cacheWrite: number };\n contextWindow?: number;\n maxTokens?: number;\n maxOutputTokens?: number;\n thinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n headers?: Record<string, string>;\n compat?: unknown;\n}\n\ninterface CustomProviderConfig {\n name?: string;\n api?: string;\n baseUrl?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n compat?: unknown;\n models?: CustomModelConfig[];\n}\n\ninterface ModelsJsonConfig {\n providers?: Record<string, CustomProviderConfig>;\n}\n\nexport function defaultModelsJsonPath(): string {\n return join(effectiveStateDir(), \"models.json\");\n}\n\nfunction isModelsJsonConfig(parsed: unknown): parsed is ModelsJsonConfig {\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"models.json must be a JSON object\");\n }\n const providers = (parsed as { providers?: unknown }).providers;\n if (providers === undefined) return true;\n if (!providers || typeof providers !== \"object\" || Array.isArray(providers)) {\n throw new Error('models.json \"providers\" must be an object');\n }\n for (const [name, config] of Object.entries(providers)) {\n if (!config || typeof config !== \"object\") {\n throw new Error(`models.json provider \"${name}\" must be an object`);\n }\n const models = (config as CustomProviderConfig).models;\n if (models !== undefined) {\n if (!Array.isArray(models)) {\n throw new Error(`models.json provider \"${name}\" models must be an array`);\n }\n const api = (config as CustomProviderConfig).api;\n if (typeof api !== \"string\" || !(api in CUSTOM_API_STREAMS)) {\n throw new Error(\n `models.json provider \"${name}\" needs an \"api\" of: ${Object.keys(CUSTOM_API_STREAMS).join(\", \")}`,\n );\n }\n for (const model of models) {\n if (!model || typeof model !== \"object\" || typeof model.id !== \"string\") {\n throw new Error(`models.json provider \"${name}\" has a model without a string \"id\"`);\n }\n }\n }\n }\n return true;\n}\n\nfunction envVarNameFor(providerName: string): string {\n return `${providerName.replace(/[^a-zA-Z0-9]+/g, \"_\").toUpperCase()}_API_KEY`;\n}\n\nfunction applyModelsJson(\n models: ReturnType<typeof builtinModels>,\n modelsJsonPath: string,\n): string | undefined {\n try {\n const config = readJsonFileIfExists(\n modelsJsonPath,\n isModelsJsonConfig,\n (detail) => `models.json is invalid: ${detail}`,\n );\n for (const [providerName, providerConfig] of Object.entries(config?.providers ?? {})) {\n if (providerConfig.models && providerConfig.models.length > 0) {\n models.setProvider(buildCustomProvider(providerName, providerConfig));\n } else if (providerConfig.baseUrl || providerConfig.compat) {\n const builtin = models.getProvider(providerName);\n if (builtin) {\n models.setProvider(overrideBuiltinProvider(builtin, providerConfig));\n }\n }\n }\n return undefined;\n } catch (err) {\n return `Failed to load ${modelsJsonPath}: ${errorMessage(err)}`;\n }\n}\n\nfunction buildCustomProvider(providerName: string, config: CustomProviderConfig): Provider {\n const api = config.api!;\n const displayName = config.name ?? providerName;\n const envVar = envVarNameFor(providerName);\n const models = (config.models ?? []).map((modelConfig): Model<Api> => {\n const model: Model<Api> = {\n id: modelConfig.id,\n name: modelConfig.name ?? modelConfig.id,\n api: (modelConfig.api ?? api) as Api,\n provider: providerName,\n baseUrl: modelConfig.baseUrl ?? config.baseUrl ?? \"\",\n reasoning: modelConfig.reasoning ?? false,\n input: modelConfig.input ?? [\"text\"],\n cost: modelConfig.cost ?? DEFAULT_COST,\n contextWindow: modelConfig.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n maxTokens: modelConfig.maxTokens ?? modelConfig.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\n };\n if (modelConfig.thinkingLevelMap) model.thinkingLevelMap = modelConfig.thinkingLevelMap;\n if (modelConfig.headers ?? config.headers) {\n model.headers = { ...config.headers, ...modelConfig.headers };\n }\n const compat = modelConfig.compat ?? config.compat;\n if (compat) model.compat = compat as Model<Api>[\"compat\"];\n return model;\n });\n\n return createProvider({\n id: providerName,\n name: displayName,\n baseUrl: config.baseUrl,\n headers: config.headers,\n auth: {\n apiKey: {\n name: `${displayName} API key`,\n resolve: async ({ ctx, credential }) => {\n const key =\n (credential?.type === \"api_key\" ? credential.key : undefined) ??\n config.apiKey ??\n (await ctx.env(envVar));\n if (!key) return undefined;\n const source = config.apiKey ? \"models.json\" : envVar;\n return { auth: { apiKey: key }, source };\n },\n },\n },\n models,\n api: CUSTOM_API_STREAMS[api]!(),\n });\n}\n\nfunction overrideBuiltinProvider(provider: Provider, config: CustomProviderConfig): Provider {\n const models = provider.getModels().map((model): Model<Api> => {\n const overridden: Model<Api> = Object.assign({}, model);\n if (config.baseUrl) overridden.baseUrl = config.baseUrl;\n if (config.compat) overridden.compat = config.compat as Model<Api>[\"compat\"];\n return overridden;\n });\n return {\n ...provider,\n getModels: () => models,\n };\n}\n\nexport class MikanModels {\n readonly models: Models;\n private loadError: string | undefined;\n\n private constructor(models: MutableModels, loadError: string | undefined) {\n this.models = models;\n this.loadError = loadError;\n }\n\n static create(options: CreateMikanModelsOptions = {}): MikanModels {\n const modelsJsonPath = options.modelsJsonPath ?? defaultModelsJsonPath();\n const models = builtinModels();\n const loadError = applyModelsJson(models, modelsJsonPath);\n return new MikanModels(models, loadError);\n }\n\n getError(): string | undefined {\n return this.loadError;\n }\n\n getAll(): Model<Api>[] {\n return [...this.models.getModels()];\n }\n\n find(provider: string, modelId: string): Model<Api> | undefined {\n return this.models.getModel(provider, modelId);\n }\n\n resolve(provider: string, modelId: string): Model<Api> {\n const model = this.find(provider, modelId);\n if (model) return model;\n throw new Error(\n `Unknown model \"${provider}/${modelId}\". Configure it in pi models.json or choose a registered model.`,\n );\n }\n\n async getAvailable(): Promise<Model<Api>[]> {\n const available = await Promise.all(\n this.models.getProviders().map(async (provider) => {\n try {\n return await this.models.getAvailable(provider.id);\n } catch {\n return [];\n }\n }),\n );\n return available.flat();\n }\n\n getAuth(model: Model<Api>): Promise<AuthResult | undefined> {\n return this.models.getAuth(model);\n }\n\n async getApiKeyForProvider(provider: string): Promise<string | undefined> {\n try {\n const auth = await this.models.getAuth(provider);\n return auth?.auth.apiKey;\n } catch {\n return undefined;\n }\n }\n}\n"]}
@@ -1,12 +1,3 @@
1
- import type { OfficeKey } from "../types.js";
2
1
  import type { EnsureDefaultOpenConnectorOptions } from "./types.js";
3
2
  export declare function ensureDefaultOpenConnector({ office, platformWorkspaceId, defaultServer, signal, fetch: fetchFn, }: EnsureDefaultOpenConnectorOptions): Promise<void>;
4
- export interface LegacyTokenMigrationReport {
5
- migrated: OfficeKey[];
6
- skipped: {
7
- key: OfficeKey;
8
- reason: string;
9
- }[];
10
- }
11
- export declare function migrateLegacyOpenConnectorTokens(stateDir: string, defaultUrl: string, workspaceRoot?: string): LegacyTokenMigrationReport;
12
3
  //# sourceMappingURL=open-connector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"open-connector.d.ts","sourceRoot":"","sources":["../../src/harness/open-connector.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,iCAAiC,EAAmB,MAAM,YAAY,CAAC;AAkGrF,wBAAsB,0BAA0B,CAAC,EAC/C,MAAM,EACN,mBAAmB,EACnB,aAAa,EACb,MAAM,EACN,KAAK,EAAE,OAA0B,GAClC,EAAE,iCAAiC,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BnD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,OAAO,EAAE;QAAE,GAAG,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/C;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,aAAa,SAA8B,GAC1C,0BAA0B,CAgD5B"}
1
+ {"version":3,"file":"open-connector.d.ts","sourceRoot":"","sources":["../../src/harness/open-connector.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iCAAiC,EAAmB,MAAM,YAAY,CAAC;AAkGrF,wBAAsB,0BAA0B,CAAC,EAC/C,MAAM,EACN,mBAAmB,EACnB,aAAa,EACb,MAAM,EACN,KAAK,EAAE,OAA0B,GAClC,EAAE,iCAAiC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBnD"}
@@ -1,23 +1,10 @@
1
- import { Type } from "typebox";
2
- import { existsSync, readdirSync, rmSync } from "node:fs";
3
- import { join } from "node:path";
4
1
  import { readEnv } from "../env-manifest.js";
5
2
  import * as log from "../log.js";
6
3
  import { loadScopeMcpServers, updateConversationSettings } from "../settings/index.js";
7
- import { readJsonSchemaFileIfExists } from "../file-guards.js";
8
- import { createWorkspace, isOfficeKey, listRegisteredOffices, officeKey } from "../office/index.js";
9
- import { errorMessage, isRecord } from "../unknown-values.js";
4
+ import { isRecord } from "../unknown-values.js";
10
5
  const OPEN_CONNECTOR_SERVER = "open-connector";
11
- const LEGACY_TOKEN_FILE = "open-connector-runtime-token.json";
12
6
  const REQUEST_TIMEOUT_MS = 10_000;
13
7
  const pending = new Map();
14
- const LegacyTokenSchema = Type.Object({
15
- version: Type.Literal(1),
16
- origin: Type.String(),
17
- name: Type.String(),
18
- id: Type.String(),
19
- token: Type.String(),
20
- }, { additionalProperties: false });
21
8
  function stringArray(value, field) {
22
9
  if (!Array.isArray(value) || !value.every((item) => typeof item === "string")) {
23
10
  throw new Error(`OpenConnector returned an invalid ${field}`);
@@ -76,22 +63,29 @@ function isDeclared(office) {
76
63
  return (Object.hasOwn(scopes.global, OPEN_CONNECTOR_SERVER) ||
77
64
  Object.hasOwn(scopes.conversation, OPEN_CONNECTOR_SERVER));
78
65
  }
66
+ function runtimeTokenName(office, platformWorkspaceId) {
67
+ const { platform, conversationId } = office.address;
68
+ if (platform === "github")
69
+ return `mikan:github:${conversationId}`;
70
+ if (platform !== "slack")
71
+ return undefined;
72
+ if (platformWorkspaceId)
73
+ return `mikan:slack:${platformWorkspaceId}:${conversationId}`;
74
+ log.logWarning(`[${conversationId}] OpenConnector default skipped`, "Slack workspace ID is unavailable");
75
+ return undefined;
76
+ }
79
77
  export async function ensureDefaultOpenConnector({ office, platformWorkspaceId, defaultServer, signal, fetch: fetchFn = globalThis.fetch, }) {
80
78
  const adminToken = readEnv("OPENCONNECTOR_ADMIN_TOKEN");
81
- if (!defaultServer?.url || !adminToken || office.address.platform !== "slack")
82
- return;
83
- if (!platformWorkspaceId) {
84
- log.logWarning(`[${office.address.conversationId}] OpenConnector default skipped`, "Slack workspace ID is unavailable");
79
+ if (!defaultServer?.url || !adminToken)
85
80
  return;
86
- }
87
- if (isDeclared(office))
81
+ const name = runtimeTokenName(office, platformWorkspaceId);
82
+ if (!name || isDeclared(office))
88
83
  return;
89
84
  const inflight = pending.get(office.stateDir);
90
85
  if (inflight)
91
86
  return inflight;
92
87
  const url = defaultServer.url;
93
88
  const task = (async () => {
94
- const name = `mikan:slack:${platformWorkspaceId}:${office.address.conversationId}`;
95
89
  const token = await createRuntimeToken(new URL(url).origin, adminToken, name, fetchFn, signal);
96
90
  if (isDeclared(office))
97
91
  return;
@@ -109,52 +103,4 @@ export async function ensureDefaultOpenConnector({ office, platformWorkspaceId,
109
103
  pending.delete(office.stateDir);
110
104
  }
111
105
  }
112
- export function migrateLegacyOpenConnectorTokens(stateDir, defaultUrl, workspaceRoot = join(stateDir, "workspace")) {
113
- const origin = new URL(defaultUrl).origin;
114
- const report = { migrated: [], skipped: [] };
115
- const conversationsDir = join(stateDir, "conversations");
116
- if (!existsSync(conversationsDir))
117
- return report;
118
- const workspace = createWorkspace({ root: workspaceRoot, stateDir });
119
- const registered = new Map(listRegisteredOffices(stateDir).map((record) => [officeKey(record), record]));
120
- for (const entry of readdirSync(conversationsDir, { withFileTypes: true })) {
121
- if (!entry.isDirectory() || !isOfficeKey(entry.name))
122
- continue;
123
- const key = entry.name;
124
- const legacyPath = join(conversationsDir, key, LEGACY_TOKEN_FILE);
125
- if (!existsSync(legacyPath))
126
- continue;
127
- const record = registered.get(key);
128
- if (!record) {
129
- report.skipped.push({ key, reason: "office is not registered" });
130
- continue;
131
- }
132
- const office = workspace.office(record);
133
- if (isDeclared(office)) {
134
- report.skipped.push({ key, reason: `${OPEN_CONNECTOR_SERVER} is already declared` });
135
- continue;
136
- }
137
- let state;
138
- try {
139
- state = readJsonSchemaFileIfExists(legacyPath, LegacyTokenSchema, (detail) => `Malformed legacy token file: ${detail}`);
140
- }
141
- catch (error) {
142
- report.skipped.push({ key, reason: errorMessage(error) });
143
- continue;
144
- }
145
- if (!state)
146
- continue;
147
- if (state.origin !== origin) {
148
- report.skipped.push({ key, reason: `token origin ${state.origin} differs` });
149
- continue;
150
- }
151
- const current = loadScopeMcpServers(office).conversation;
152
- updateConversationSettings(office, {
153
- mcpServers: { ...current, [OPEN_CONNECTOR_SERVER]: defaultEntry(defaultUrl, state.token) },
154
- });
155
- rmSync(legacyPath);
156
- report.migrated.push(key);
157
- }
158
- return report;
159
- }
160
106
  //# sourceMappingURL=open-connector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"open-connector.js","sourceRoot":"","sources":["../../src/harness/open-connector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type } from \"typebox\";\nimport { existsSync, readdirSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { readEnv } from \"../env-manifest.js\";\nimport * as log from \"../log.js\";\nimport { loadScopeMcpServers, updateConversationSettings } from \"../settings/index.js\";\nimport { readJsonSchemaFileIfExists } from \"../file-guards.js\";\nimport { createWorkspace, isOfficeKey, listRegisteredOffices, officeKey } from \"../office/index.js\";\nimport type { Office } from \"../office/types.js\";\nimport type { OfficeKey } from \"../types.js\";\nimport type { EnsureDefaultOpenConnectorOptions, McpServerConfig } from \"./types.js\";\nimport { errorMessage, isRecord } from \"../unknown-values.js\";\n\nconst OPEN_CONNECTOR_SERVER = \"open-connector\";\nconst LEGACY_TOKEN_FILE = \"open-connector-runtime-token.json\";\nconst REQUEST_TIMEOUT_MS = 10_000;\nconst pending = new Map<string, Promise<void>>();\n\nconst LegacyTokenSchema = Type.Object(\n {\n version: Type.Literal(1),\n origin: Type.String(),\n name: Type.String(),\n id: Type.String(),\n token: Type.String(),\n },\n { additionalProperties: false },\n);\n\nfunction stringArray(value: unknown, field: string): string[] {\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) {\n throw new Error(`OpenConnector returned an invalid ${field}`);\n }\n return value;\n}\n\nasync function readJson(response: Response, operation: string): Promise<unknown> {\n if (!response.ok) {\n throw new Error(`OpenConnector ${operation} failed with HTTP ${response.status}`);\n }\n try {\n return await response.json();\n } catch (error) {\n throw new Error(`OpenConnector ${operation} returned invalid JSON`, { cause: error });\n }\n}\n\nfunction requestSignal(signal?: AbortSignal): AbortSignal {\n const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);\n return signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nasync function createRuntimeToken(\n origin: string,\n adminToken: string,\n name: string,\n fetchFn: typeof globalThis.fetch,\n signal?: AbortSignal,\n): Promise<string> {\n const headers = { Authorization: `Bearer ${adminToken}` };\n const policyValue = await readJson(\n await fetchFn(new URL(\"/api/runtime-policy\", origin), {\n headers,\n signal: requestSignal(signal),\n }),\n \"runtime policy request\",\n );\n if (!isRecord(policyValue) || !isRecord(policyValue.deployment)) {\n throw new Error(\"OpenConnector returned an invalid runtime policy\");\n }\n const deployment = policyValue.deployment;\n const responseValue = await readJson(\n await fetchFn(new URL(\"/api/runtime-tokens\", origin), {\n method: \"POST\",\n headers: { ...headers, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name,\n allowedActions: stringArray(deployment.allowedActions, \"allowedActions policy\"),\n blockedActions: stringArray(deployment.blockedActions, \"blockedActions policy\"),\n allowedProxies: stringArray(deployment.allowedProxies, \"allowedProxies policy\"),\n }),\n signal: requestSignal(signal),\n }),\n \"runtime token creation\",\n );\n if (\n !isRecord(responseValue) ||\n typeof responseValue.token !== \"string\" ||\n !isRecord(responseValue.record) ||\n responseValue.record.name !== name\n ) {\n throw new Error(\"OpenConnector returned an invalid runtime token\");\n }\n return responseValue.token;\n}\n\nfunction defaultEntry(url: string, token: string): McpServerConfig {\n return { url, headers: { Authorization: `Bearer ${token}` } };\n}\n\nfunction isDeclared(office: Office): boolean {\n const scopes = loadScopeMcpServers(office);\n return (\n Object.hasOwn(scopes.global, OPEN_CONNECTOR_SERVER) ||\n Object.hasOwn(scopes.conversation, OPEN_CONNECTOR_SERVER)\n );\n}\n\nexport async function ensureDefaultOpenConnector({\n office,\n platformWorkspaceId,\n defaultServer,\n signal,\n fetch: fetchFn = globalThis.fetch,\n}: EnsureDefaultOpenConnectorOptions): Promise<void> {\n const adminToken = readEnv(\"OPENCONNECTOR_ADMIN_TOKEN\");\n if (!defaultServer?.url || !adminToken || office.address.platform !== \"slack\") return;\n if (!platformWorkspaceId) {\n log.logWarning(\n `[${office.address.conversationId}] OpenConnector default skipped`,\n \"Slack workspace ID is unavailable\",\n );\n return;\n }\n if (isDeclared(office)) return;\n\n const inflight = pending.get(office.stateDir);\n if (inflight) return inflight;\n const url = defaultServer.url;\n const task = (async () => {\n const name = `mikan:slack:${platformWorkspaceId}:${office.address.conversationId}`;\n const token = await createRuntimeToken(new URL(url).origin, adminToken, name, fetchFn, signal);\n if (isDeclared(office)) return;\n const current = loadScopeMcpServers(office).conversation;\n updateConversationSettings(office, {\n mcpServers: { ...current, [OPEN_CONNECTOR_SERVER]: defaultEntry(url, token) },\n });\n log.logInfo(`[${office.address.conversationId}] Provisioned default OpenConnector token`);\n })();\n pending.set(office.stateDir, task);\n try {\n await task;\n } finally {\n pending.delete(office.stateDir);\n }\n}\n\nexport interface LegacyTokenMigrationReport {\n migrated: OfficeKey[];\n skipped: { key: OfficeKey; reason: string }[];\n}\n\nexport function migrateLegacyOpenConnectorTokens(\n stateDir: string,\n defaultUrl: string,\n workspaceRoot = join(stateDir, \"workspace\"),\n): LegacyTokenMigrationReport {\n const origin = new URL(defaultUrl).origin;\n const report: LegacyTokenMigrationReport = { migrated: [], skipped: [] };\n const conversationsDir = join(stateDir, \"conversations\");\n if (!existsSync(conversationsDir)) return report;\n const workspace = createWorkspace({ root: workspaceRoot, stateDir });\n const registered = new Map(\n listRegisteredOffices(stateDir).map((record) => [officeKey(record), record] as const),\n );\n for (const entry of readdirSync(conversationsDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || !isOfficeKey(entry.name)) continue;\n const key = entry.name;\n const legacyPath = join(conversationsDir, key, LEGACY_TOKEN_FILE);\n if (!existsSync(legacyPath)) continue;\n const record = registered.get(key);\n if (!record) {\n report.skipped.push({ key, reason: \"office is not registered\" });\n continue;\n }\n const office = workspace.office(record);\n if (isDeclared(office)) {\n report.skipped.push({ key, reason: `${OPEN_CONNECTOR_SERVER} is already declared` });\n continue;\n }\n let state;\n try {\n state = readJsonSchemaFileIfExists(\n legacyPath,\n LegacyTokenSchema,\n (detail) => `Malformed legacy token file: ${detail}`,\n );\n } catch (error) {\n report.skipped.push({ key, reason: errorMessage(error) });\n continue;\n }\n if (!state) continue;\n if (state.origin !== origin) {\n report.skipped.push({ key, reason: `token origin ${state.origin} differs` });\n continue;\n }\n const current = loadScopeMcpServers(office).conversation;\n updateConversationSettings(office, {\n mcpServers: { ...current, [OPEN_CONNECTOR_SERVER]: defaultEntry(defaultUrl, state.token) },\n });\n rmSync(legacyPath);\n report.migrated.push(key);\n }\n return report;\n}\n"]}
1
+ {"version":3,"file":"open-connector.js","sourceRoot":"","sources":["../../src/harness/open-connector.ts"],"names":[],"mappings":"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","sourcesContent":["import { readEnv } from \"../env-manifest.js\";\nimport * as log from \"../log.js\";\nimport { loadScopeMcpServers, updateConversationSettings } from \"../settings/index.js\";\nimport type { Office } from \"../office/types.js\";\nimport type { EnsureDefaultOpenConnectorOptions, McpServerConfig } from \"./types.js\";\nimport { isRecord } from \"../unknown-values.js\";\n\nconst OPEN_CONNECTOR_SERVER = \"open-connector\";\nconst REQUEST_TIMEOUT_MS = 10_000;\nconst pending = new Map<string, Promise<void>>();\n\nfunction stringArray(value: unknown, field: string): string[] {\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) {\n throw new Error(`OpenConnector returned an invalid ${field}`);\n }\n return value;\n}\n\nasync function readJson(response: Response, operation: string): Promise<unknown> {\n if (!response.ok) {\n throw new Error(`OpenConnector ${operation} failed with HTTP ${response.status}`);\n }\n try {\n return await response.json();\n } catch (error) {\n throw new Error(`OpenConnector ${operation} returned invalid JSON`, { cause: error });\n }\n}\n\nfunction requestSignal(signal?: AbortSignal): AbortSignal {\n const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);\n return signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nasync function createRuntimeToken(\n origin: string,\n adminToken: string,\n name: string,\n fetchFn: typeof globalThis.fetch,\n signal?: AbortSignal,\n): Promise<string> {\n const headers = { Authorization: `Bearer ${adminToken}` };\n const policyValue = await readJson(\n await fetchFn(new URL(\"/api/runtime-policy\", origin), {\n headers,\n signal: requestSignal(signal),\n }),\n \"runtime policy request\",\n );\n if (!isRecord(policyValue) || !isRecord(policyValue.deployment)) {\n throw new Error(\"OpenConnector returned an invalid runtime policy\");\n }\n const deployment = policyValue.deployment;\n const responseValue = await readJson(\n await fetchFn(new URL(\"/api/runtime-tokens\", origin), {\n method: \"POST\",\n headers: { ...headers, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name,\n allowedActions: stringArray(deployment.allowedActions, \"allowedActions policy\"),\n blockedActions: stringArray(deployment.blockedActions, \"blockedActions policy\"),\n allowedProxies: stringArray(deployment.allowedProxies, \"allowedProxies policy\"),\n }),\n signal: requestSignal(signal),\n }),\n \"runtime token creation\",\n );\n if (\n !isRecord(responseValue) ||\n typeof responseValue.token !== \"string\" ||\n !isRecord(responseValue.record) ||\n responseValue.record.name !== name\n ) {\n throw new Error(\"OpenConnector returned an invalid runtime token\");\n }\n return responseValue.token;\n}\n\nfunction defaultEntry(url: string, token: string): McpServerConfig {\n return { url, headers: { Authorization: `Bearer ${token}` } };\n}\n\nfunction isDeclared(office: Office): boolean {\n const scopes = loadScopeMcpServers(office);\n return (\n Object.hasOwn(scopes.global, OPEN_CONNECTOR_SERVER) ||\n Object.hasOwn(scopes.conversation, OPEN_CONNECTOR_SERVER)\n );\n}\n\nfunction runtimeTokenName(office: Office, platformWorkspaceId?: string): string | undefined {\n const { platform, conversationId } = office.address;\n if (platform === \"github\") return `mikan:github:${conversationId}`;\n if (platform !== \"slack\") return undefined;\n if (platformWorkspaceId) return `mikan:slack:${platformWorkspaceId}:${conversationId}`;\n log.logWarning(\n `[${conversationId}] OpenConnector default skipped`,\n \"Slack workspace ID is unavailable\",\n );\n return undefined;\n}\n\nexport async function ensureDefaultOpenConnector({\n office,\n platformWorkspaceId,\n defaultServer,\n signal,\n fetch: fetchFn = globalThis.fetch,\n}: EnsureDefaultOpenConnectorOptions): Promise<void> {\n const adminToken = readEnv(\"OPENCONNECTOR_ADMIN_TOKEN\");\n if (!defaultServer?.url || !adminToken) return;\n const name = runtimeTokenName(office, platformWorkspaceId);\n if (!name || isDeclared(office)) return;\n\n const inflight = pending.get(office.stateDir);\n if (inflight) return inflight;\n const url = defaultServer.url;\n const task = (async () => {\n const token = await createRuntimeToken(new URL(url).origin, adminToken, name, fetchFn, signal);\n if (isDeclared(office)) return;\n const current = loadScopeMcpServers(office).conversation;\n updateConversationSettings(office, {\n mcpServers: { ...current, [OPEN_CONNECTOR_SERVER]: defaultEntry(url, token) },\n });\n log.logInfo(`[${office.address.conversationId}] Provisioned default OpenConnector token`);\n })();\n pending.set(office.stateDir, task);\n try {\n await task;\n } finally {\n pending.delete(office.stateDir);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAG1B,eAAe,EACf,sBAAsB,EAEtB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAMtD,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,aAAa,CAAC;AA2GnF,wBAAgB,cAAc,IAAI,kBAAkB,CAEnD;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CA6CjB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAGxE;AAED,wBAAgB,yBAAyB,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzF;AAwID,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC,CAsBf;AA4ED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkG/E;AA0eD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAyBlF"}
1
+ {"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAG1B,eAAe,EACf,sBAAsB,EAEtB,kBAAkB,EAClB,yBAAyB,EAEzB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAMtD,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,aAAa,CAAC;AA6GnF,wBAAgB,cAAc,IAAI,kBAAkB,CAEnD;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CA6CjB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAGxE;AAED,wBAAgB,yBAAyB,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzF;AAwID,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC,CAsBf;AA4ED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkG/E;AAygBD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAyBlF"}
@@ -6,7 +6,8 @@ import { START_TASK_TOOL, TASK_STATUS_TOOL } from "./tools/task.js";
6
6
  import { toRunEvent, toolResultText } from "./run-events.js";
7
7
  import { REACT_TOOL } from "./tools/react.js";
8
8
  import * as log from "../log.js";
9
- import { errorMessage } from "../unknown-values.js";
9
+ import { errorMessage, isRecord } from "../unknown-values.js";
10
+ import { formatBudgetStop } from "./budget-stop.js";
10
11
  const operationSpans = new WeakMap();
11
12
  function spansFor(runState) {
12
13
  let spans = operationSpans.get(runState);
@@ -47,6 +48,7 @@ function createRunStateDefaults() {
47
48
  logCtx: null,
48
49
  queue: null,
49
50
  pendingTools: new Map(),
51
+ completedTools: [],
50
52
  toolProgress: new Map(),
51
53
  subagentProgress: new Map(),
52
54
  completedSubagentProgress: [],
@@ -428,6 +430,21 @@ function toolCategory(name, roles) {
428
430
  return "platform";
429
431
  return "function";
430
432
  }
433
+ function toolLabel(args, toolName) {
434
+ const label = isRecord(args) && typeof args.label === "string" ? args.label.trim() : "";
435
+ return label || toolName;
436
+ }
437
+ function runningTools(runState) {
438
+ const now = Date.now();
439
+ return [...runState.pendingTools.values()]
440
+ .filter((pending) => pending.toolName !== START_TASK_TOOL)
441
+ .map((pending) => ({
442
+ label: toolLabel(pending.args, pending.toolName),
443
+ toolName: pending.toolName,
444
+ durationMs: now - pending.startTime,
445
+ isError: false,
446
+ }));
447
+ }
431
448
  function observeToolStart(event, context) {
432
449
  const { runState, logCtx, baseAttrs } = context;
433
450
  const args = (event.args ?? {});
@@ -492,6 +509,12 @@ function observeToolEnd(event, context) {
492
509
  return;
493
510
  }
494
511
  const durationMs = pending ? Date.now() - pending.startTime : 0;
512
+ runState.completedTools.push({
513
+ label: toolLabel(pending?.args, event.toolName),
514
+ toolName: event.toolName,
515
+ durationMs,
516
+ isError: event.isError,
517
+ });
495
518
  const toolSpan = spansFor(runState).tools.get(event.toolCallId);
496
519
  toolSpan?.end({
497
520
  attributes: metricAttributes({
@@ -801,13 +824,21 @@ function presentRunEvent(event, context) {
801
824
  return;
802
825
  }
803
826
  case "budget_exceeded": {
804
- const text = `_Stopped: run budget exceeded (${event.reason})_`;
827
+ const text = formatBudgetStop({
828
+ reason: event.reason,
829
+ llmCalls: event.llmCalls,
830
+ durationMs: event.durationMs,
831
+ completed: context.runState.completedTools,
832
+ running: runningTools(context.runState),
833
+ });
805
834
  context.queue.enqueue(() => context.responder.respondDiagnostic(text, { style: "error" }), "budget exceeded");
806
835
  return;
807
836
  }
808
837
  case "run_started":
809
838
  case "run_ended":
810
839
  return;
840
+ default:
841
+ event;
811
842
  }
812
843
  }
813
844
  export function attachSessionEventHandlers(params) {