@ashx-j/lunr 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/builtin-extensions/index.d.ts.map +1 -1
  2. package/dist/builtin-extensions/index.js +3 -6
  3. package/dist/builtin-extensions/index.js.map +1 -1
  4. package/dist/builtin-extensions/lunr-todos.d.ts +7 -6
  5. package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
  6. package/dist/builtin-extensions/lunr-todos.js +24 -11
  7. package/dist/builtin-extensions/lunr-todos.js.map +1 -1
  8. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  9. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +9 -5
  10. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  11. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  12. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +31 -3
  13. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  14. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts +1 -0
  15. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  16. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +14 -4
  17. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  18. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  19. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +4 -3
  20. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +12 -1
  23. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +3 -0
  25. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  27. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +8 -0
  28. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  29. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +22 -2
  30. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  31. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  32. package/dist/builtin-extensions/pi-web-access/index.js +38 -230
  33. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  34. package/dist/builtin-extensions/pi-web-access/render-search-chrome.d.ts +35 -0
  35. package/dist/builtin-extensions/pi-web-access/render-search-chrome.d.ts.map +1 -0
  36. package/dist/builtin-extensions/pi-web-access/render-search-chrome.js +93 -0
  37. package/dist/builtin-extensions/pi-web-access/render-search-chrome.js.map +1 -0
  38. package/dist/bun/cli.d.ts.map +1 -1
  39. package/dist/bun/cli.js +1 -0
  40. package/dist/bun/cli.js.map +1 -1
  41. package/dist/catalog/models.json +1 -1
  42. package/dist/catalog/providers/cerebras.json +1 -1
  43. package/dist/catalog/providers/cloudflare-ai-gateway.json +1 -1
  44. package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
  45. package/dist/catalog/providers/huggingface.json +1 -1
  46. package/dist/catalog/providers/opencode-go.json +1 -1
  47. package/dist/catalog/providers/openrouter.json +1 -1
  48. package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
  49. package/dist/catalog/publication.json +3 -3
  50. package/dist/cli.d.ts.map +1 -1
  51. package/dist/cli.js +4 -1
  52. package/dist/cli.js.map +1 -1
  53. package/dist/core/context-breakdown.d.ts +21 -1
  54. package/dist/core/context-breakdown.d.ts.map +1 -1
  55. package/dist/core/context-breakdown.js +58 -2
  56. package/dist/core/context-breakdown.js.map +1 -1
  57. package/dist/core/extensions/host-static.d.ts +2 -0
  58. package/dist/core/extensions/host-static.d.ts.map +1 -0
  59. package/dist/core/extensions/host-static.js +15 -0
  60. package/dist/core/extensions/host-static.js.map +1 -0
  61. package/dist/core/extensions/loader.d.ts +10 -0
  62. package/dist/core/extensions/loader.d.ts.map +1 -1
  63. package/dist/core/extensions/loader.js +75 -34
  64. package/dist/core/extensions/loader.js.map +1 -1
  65. package/dist/core/official-catalog.d.ts.map +1 -1
  66. package/dist/core/official-catalog.js +11 -4
  67. package/dist/core/official-catalog.js.map +1 -1
  68. package/dist/core/package-manager.d.ts +3 -0
  69. package/dist/core/package-manager.d.ts.map +1 -1
  70. package/dist/core/package-manager.js +11 -5
  71. package/dist/core/package-manager.js.map +1 -1
  72. package/dist/core/permission-mode-control.d.ts +27 -0
  73. package/dist/core/permission-mode-control.d.ts.map +1 -0
  74. package/dist/core/permission-mode-control.js +39 -0
  75. package/dist/core/permission-mode-control.js.map +1 -0
  76. package/dist/core/resource-loader.d.ts +4 -1
  77. package/dist/core/resource-loader.d.ts.map +1 -1
  78. package/dist/core/resource-loader.js +13 -5
  79. package/dist/core/resource-loader.js.map +1 -1
  80. package/dist/core/settings-manager.d.ts.map +1 -1
  81. package/dist/core/settings-manager.js.map +1 -1
  82. package/dist/core/slash-commands.d.ts.map +1 -1
  83. package/dist/core/slash-commands.js +0 -1
  84. package/dist/core/slash-commands.js.map +1 -1
  85. package/dist/core/timings.d.ts +1 -0
  86. package/dist/core/timings.d.ts.map +1 -1
  87. package/dist/core/timings.js +6 -1
  88. package/dist/core/timings.js.map +1 -1
  89. package/dist/core/tools/read.d.ts.map +1 -1
  90. package/dist/core/tools/read.js +14 -20
  91. package/dist/core/tools/read.js.map +1 -1
  92. package/dist/core/tools/render-utils.d.ts +2 -0
  93. package/dist/core/tools/render-utils.d.ts.map +1 -1
  94. package/dist/core/tools/render-utils.js +10 -0
  95. package/dist/core/tools/render-utils.js.map +1 -1
  96. package/dist/main.d.ts +8 -0
  97. package/dist/main.d.ts.map +1 -1
  98. package/dist/main.js +63 -16
  99. package/dist/main.js.map +1 -1
  100. package/dist/migrations.d.ts.map +1 -1
  101. package/dist/migrations.js +3 -0
  102. package/dist/migrations.js.map +1 -1
  103. package/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  104. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  105. package/dist/modes/interactive/components/assistant-message.js +1 -0
  106. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  107. package/dist/modes/interactive/components/context-view.d.ts.map +1 -1
  108. package/dist/modes/interactive/components/context-view.js +3 -1
  109. package/dist/modes/interactive/components/context-view.js.map +1 -1
  110. package/dist/modes/interactive/components/plan-message.d.ts +17 -0
  111. package/dist/modes/interactive/components/plan-message.d.ts.map +1 -0
  112. package/dist/modes/interactive/components/plan-message.js +43 -0
  113. package/dist/modes/interactive/components/plan-message.js.map +1 -0
  114. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  115. package/dist/modes/interactive/components/settings-selector.js +1 -1
  116. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  117. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  118. package/dist/modes/interactive/components/tool-execution.js +3 -1
  119. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  120. package/dist/modes/interactive/components/usage-view.d.ts +4 -25
  121. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  122. package/dist/modes/interactive/components/usage-view.js +17 -69
  123. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  124. package/dist/modes/interactive/components/user-message.d.ts +1 -0
  125. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  126. package/dist/modes/interactive/components/user-message.js +1 -0
  127. package/dist/modes/interactive/components/user-message.js.map +1 -1
  128. package/dist/modes/interactive/interactive-mode.d.ts +23 -6
  129. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  130. package/dist/modes/interactive/interactive-mode.js +267 -148
  131. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  132. package/dist/modes/interactive/smooth-streaming.d.ts +39 -6
  133. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  134. package/dist/modes/interactive/smooth-streaming.js +160 -73
  135. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  136. package/dist/utils/clipboard-image.d.ts.map +1 -1
  137. package/dist/utils/clipboard-image.js +7 -3
  138. package/dist/utils/clipboard-image.js.map +1 -1
  139. package/docs/terminal-setup.md +13 -0
  140. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  141. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  142. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  143. package/examples/extensions/gondolin/package-lock.json +2 -2
  144. package/examples/extensions/gondolin/package.json +1 -1
  145. package/examples/extensions/sandbox/package-lock.json +2 -2
  146. package/examples/extensions/sandbox/package.json +1 -1
  147. package/examples/extensions/with-deps/package-lock.json +2 -2
  148. package/examples/extensions/with-deps/package.json +1 -1
  149. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension loader - loads TypeScript extension modules using jiti.\n *\n */\n\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport * as _bundledPiAgentCore from \"@ashx-j/lunr-agent\";\nimport * as _bundledPiAiCompat from \"@ashx-j/lunr-ai/compat\";\nimport * as _bundledPiAiOauth from \"@ashx-j/lunr-ai/oauth\";\nimport * as _bundledPiAiProviders from \"@ashx-j/lunr-ai/providers/all\";\nimport type { KeyId } from \"@ashx-j/lunr-tui\";\nimport * as _bundledPiTui from \"@ashx-j/lunr-tui\";\nimport { createJiti } from \"jiti/static\";\n// Static imports of packages that extensions may use.\n// These MUST be static so Bun bundles them into the compiled binary.\n// The virtualModules option then makes them available to extensions.\nimport * as _bundledTypebox from \"typebox\";\nimport * as _bundledTypeboxCompile from \"typebox/compile\";\nimport * as _bundledTypeboxValue from \"typebox/value\";\nimport { CONFIG_DIR_NAME, getAgentDir, isBunBinary } from \"../../config.ts\";\n// NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,\n// avoiding a circular dependency. Extensions can import from @ashx-j/lunr.\nimport * as _bundledPiCodingAgent from \"../../index.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport { createEventBus, type EventBus } from \"../event-bus.ts\";\nimport type { ExecOptions } from \"../exec.ts\";\nimport { execCommand } from \"../exec.ts\";\nimport { createSyntheticSourceInfo } from \"../source-info.ts\";\nimport { time } from \"../timings.ts\";\nimport type {\n\tEntryRenderer,\n\tExtension,\n\tExtensionAPI,\n\tExtensionFactory,\n\tExtensionRuntime,\n\tLoadExtensionsResult,\n\tMessageRenderer,\n\tProviderConfig,\n\tRegisteredCommand,\n\tToolDefinition,\n} from \"./types.ts\";\n\n/** Modules available to extensions via virtualModules (for compiled Bun binary) */\nconst VIRTUAL_MODULES: Record<string, unknown> = {\n\ttypebox: _bundledTypebox,\n\t\"typebox/compile\": _bundledTypeboxCompile,\n\t\"typebox/value\": _bundledTypeboxValue,\n\t\"@sinclair/typebox\": _bundledTypebox,\n\t\"@sinclair/typebox/compile\": _bundledTypeboxCompile,\n\t\"@sinclair/typebox/value\": _bundledTypeboxValue,\n\t\"@ashx-j/lunr-agent\": _bundledPiAgentCore,\n\t\"@ashx-j/lunr-tui\": _bundledPiTui,\n\t// Extensions resolve the pi-ai root to the compat entrypoint (a strict\n\t// superset of the core entrypoint): existing extensions using the old\n\t// global API keep working at runtime until compat is removed.\n\t\"@ashx-j/lunr-ai\": _bundledPiAiCompat,\n\t\"@ashx-j/lunr-ai/compat\": _bundledPiAiCompat,\n\t\"@ashx-j/lunr-ai/oauth\": _bundledPiAiOauth,\n\t\"@ashx-j/lunr-ai/providers/all\": _bundledPiAiProviders,\n\t\"@ashx-j/lunr\": _bundledPiCodingAgent,\n\t\"@mariozechner/pi-agent-core\": _bundledPiAgentCore,\n\t\"@mariozechner/pi-tui\": _bundledPiTui,\n\t\"@mariozechner/pi-ai\": _bundledPiAiCompat,\n\t\"@mariozechner/pi-ai/compat\": _bundledPiAiCompat,\n\t\"@mariozechner/pi-ai/oauth\": _bundledPiAiOauth,\n\t\"@mariozechner/pi-ai/providers/all\": _bundledPiAiProviders,\n\t\"@mariozechner/pi-coding-agent\": _bundledPiCodingAgent,\n};\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Get aliases for jiti (used in Node.js/development mode).\n * In Bun binary mode, virtualModules is used instead.\n */\nlet _aliases: Record<string, string> | null = null;\n\nfunction getAliases(): Record<string, string> {\n\tif (_aliases) return _aliases;\n\n\tconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\tconst packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\n\tconst typeboxEntry = require.resolve(\"typebox\");\n\tconst typeboxCompileEntry = require.resolve(\"typebox/compile\");\n\tconst typeboxValueEntry = require.resolve(\"typebox/value\");\n\n\tconst packagesRoot = path.resolve(__dirname, \"../../../../\");\n\tconst resolveWorkspaceOrImport = (workspaceRelativePath: string, specifier: string): string => {\n\t\tconst workspacePath = path.join(packagesRoot, workspaceRelativePath);\n\t\tif (fs.existsSync(workspacePath)) {\n\t\t\treturn workspacePath;\n\t\t}\n\t\treturn fileURLToPath(import.meta.resolve(specifier));\n\t};\n\n\tconst piCodingAgentEntry = packageIndex;\n\tconst piAgentCoreEntry = resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@ashx-j/lunr-agent\");\n\tconst piTuiEntry = resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@ashx-j/lunr-tui\");\n\t// Extensions resolve the pi-ai root to the compat entrypoint (a strict\n\t// superset of the core entrypoint): existing extensions using the old\n\t// global API keep working at runtime until compat is removed.\n\tconst piAiCompatEntry = resolveWorkspaceOrImport(\"ai/dist/compat.js\", \"@ashx-j/lunr-ai/compat\");\n\tconst piAiOauthEntry = resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@ashx-j/lunr-ai/oauth\");\n\tconst piAiProvidersEntry = resolveWorkspaceOrImport(\n\t\t\"ai/dist/providers/all.js\",\n\t\t\"@ashx-j/lunr-ai/providers/all\",\n\t);\n\n\t_aliases = {\n\t\t\"@ashx-j/lunr\": piCodingAgentEntry,\n\t\t\"@ashx-j/lunr-agent\": piAgentCoreEntry,\n\t\t\"@ashx-j/lunr-tui\": piTuiEntry,\n\t\t\"@ashx-j/lunr-ai/providers/all\": piAiProvidersEntry,\n\t\t\"@ashx-j/lunr-ai/compat\": piAiCompatEntry,\n\t\t\"@ashx-j/lunr-ai/oauth\": piAiOauthEntry,\n\t\t\"@ashx-j/lunr-ai\": piAiCompatEntry,\n\t\t\"@mariozechner/pi-coding-agent\": piCodingAgentEntry,\n\t\t\"@mariozechner/pi-agent-core\": piAgentCoreEntry,\n\t\t\"@mariozechner/pi-tui\": piTuiEntry,\n\t\t\"@mariozechner/pi-ai/providers/all\": piAiProvidersEntry,\n\t\t\"@mariozechner/pi-ai/compat\": piAiCompatEntry,\n\t\t\"@mariozechner/pi-ai/oauth\": piAiOauthEntry,\n\t\t\"@mariozechner/pi-ai\": piAiCompatEntry,\n\t\ttypebox: typeboxEntry,\n\t\t\"typebox/compile\": typeboxCompileEntry,\n\t\t\"typebox/value\": typeboxValueEntry,\n\t\t\"@sinclair/typebox\": typeboxEntry,\n\t\t\"@sinclair/typebox/compile\": typeboxCompileEntry,\n\t\t\"@sinclair/typebox/value\": typeboxValueEntry,\n\t};\n\n\treturn _aliases;\n}\n\ntype HandlerFn = (...args: unknown[]) => Promise<unknown>;\n\nlet extensionCacheCwd: string | undefined;\nlet extensionCacheGeneration = 0;\nconst extensionCache = new Map<string, ExtensionFactory>();\n\ninterface ExtensionCacheToken {\n\tcwd: string;\n\tgeneration: number;\n}\n\nexport function clearExtensionCache(): void {\n\textensionCache.clear();\n\textensionCacheCwd = undefined;\n\textensionCacheGeneration++;\n}\n\nfunction useExtensionCacheCwd(cwd: string): ExtensionCacheToken {\n\tconst resolvedCwd = resolvePath(cwd);\n\tif (extensionCacheCwd !== undefined && extensionCacheCwd !== resolvedCwd) {\n\t\tclearExtensionCache();\n\t}\n\textensionCacheCwd = resolvedCwd;\n\treturn { cwd: resolvedCwd, generation: extensionCacheGeneration };\n}\n\n/**\n * Create a runtime with throwing stubs for action methods.\n * Runner.bindCore() replaces these with real implementations.\n */\nexport function createExtensionRuntime(): ExtensionRuntime {\n\tconst notInitialized = () => {\n\t\tthrow new Error(\"Extension runtime not initialized. Action methods cannot be called during extension loading.\");\n\t};\n\tconst state: { staleMessage?: string } = {};\n\tconst assertActive = () => {\n\t\tif (state.staleMessage) {\n\t\t\tthrow new Error(state.staleMessage);\n\t\t}\n\t};\n\n\tconst runtime: ExtensionRuntime = {\n\t\tsendMessage: notInitialized,\n\t\tsendUserMessage: notInitialized,\n\t\tappendEntry: notInitialized,\n\t\tsetSessionName: notInitialized,\n\t\tgetSessionName: notInitialized,\n\t\tsetLabel: notInitialized,\n\t\tgetActiveTools: notInitialized,\n\t\tgetAllTools: notInitialized,\n\t\tsetActiveTools: notInitialized,\n\t\t// registerTool() is valid during extension load; refresh is only needed post-bind.\n\t\trefreshTools: () => {},\n\t\tgetCommands: notInitialized,\n\t\tsetModel: () => Promise.reject(new Error(\"Extension runtime not initialized\")),\n\t\tgetThinkingLevel: notInitialized,\n\t\tsetThinkingLevel: notInitialized,\n\t\tflagValues: new Map(),\n\t\tpendingProviderRegistrations: [],\n\t\tassertActive,\n\t\tinvalidate: (message) => {\n\t\t\tstate.staleMessage ??=\n\t\t\t\tmessage ??\n\t\t\t\t\"This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().\";\n\t\t},\n\t\t// Pre-bind: queue registrations so bindCore() can flush them once the\n\t\t// model registry is available. bindCore() replaces both with direct calls.\n\t\tregisterProvider: (name, config, extensionPath = \"<unknown>\") => {\n\t\t\truntime.pendingProviderRegistrations.push({ name, config, extensionPath });\n\t\t},\n\t\tunregisterProvider: (name) => {\n\t\t\truntime.pendingProviderRegistrations = runtime.pendingProviderRegistrations.filter((r) => r.name !== name);\n\t\t},\n\t};\n\n\treturn runtime;\n}\n\n/**\n * Create the ExtensionAPI for an extension.\n * Registration methods write to the extension object.\n * Action methods delegate to the shared runtime.\n */\nfunction createExtensionAPI(\n\textension: Extension,\n\truntime: ExtensionRuntime,\n\tcwd: string,\n\teventBus: EventBus,\n): ExtensionAPI {\n\tconst api = {\n\t\t// Registration methods - write to extension\n\t\ton(event: string, handler: HandlerFn): void {\n\t\t\truntime.assertActive();\n\t\t\tconst list = extension.handlers.get(event) ?? [];\n\t\t\tlist.push(handler);\n\t\t\textension.handlers.set(event, list);\n\t\t},\n\n\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\truntime.assertActive();\n\t\t\textension.tools.set(tool.name, {\n\t\t\t\tdefinition: tool,\n\t\t\t\tsourceInfo: extension.sourceInfo,\n\t\t\t});\n\t\t\truntime.refreshTools();\n\t\t},\n\n\t\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\" | \"sourceInfo\">): void {\n\t\t\truntime.assertActive();\n\t\t\textension.commands.set(name, {\n\t\t\t\tname,\n\t\t\t\tsourceInfo: extension.sourceInfo,\n\t\t\t\t...options,\n\t\t\t});\n\t\t},\n\n\t\tregisterShortcut(\n\t\t\tshortcut: KeyId,\n\t\t\toptions: {\n\t\t\t\tdescription?: string;\n\t\t\t\thandler: (ctx: import(\"./types.ts\").ExtensionContext) => Promise<void> | void;\n\t\t\t},\n\t\t): void {\n\t\t\truntime.assertActive();\n\t\t\textension.shortcuts.set(shortcut, { shortcut, extensionPath: extension.path, ...options });\n\t\t},\n\n\t\tregisterFlag(\n\t\t\tname: string,\n\t\t\toptions: { description?: string; type: \"boolean\" | \"string\"; default?: boolean | string },\n\t\t): void {\n\t\t\truntime.assertActive();\n\t\t\textension.flags.set(name, { name, extensionPath: extension.path, ...options });\n\t\t\tif (options.default !== undefined && !runtime.flagValues.has(name)) {\n\t\t\t\truntime.flagValues.set(name, options.default);\n\t\t\t}\n\t\t},\n\n\t\tregisterMessageRenderer<T>(customType: string, renderer: MessageRenderer<T>): void {\n\t\t\truntime.assertActive();\n\t\t\textension.messageRenderers.set(customType, renderer as MessageRenderer);\n\t\t},\n\n\t\tregisterEntryRenderer<T>(customType: string, renderer: EntryRenderer<T>): void {\n\t\t\truntime.assertActive();\n\t\t\textension.entryRenderers ??= new Map();\n\t\t\textension.entryRenderers.set(customType, renderer as EntryRenderer);\n\t\t},\n\n\t\t// Flag access - checks extension registered it, reads from runtime\n\t\tgetFlag(name: string): boolean | string | undefined {\n\t\t\truntime.assertActive();\n\t\t\tif (!extension.flags.has(name)) return undefined;\n\t\t\treturn runtime.flagValues.get(name);\n\t\t},\n\n\t\t// Action methods - delegate to shared runtime\n\t\tsendMessage(message, options): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.sendMessage(message, options);\n\t\t},\n\n\t\tsendUserMessage(content, options): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.sendUserMessage(content, options);\n\t\t},\n\n\t\tappendEntry(customType: string, data?: unknown): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.appendEntry(customType, data);\n\t\t},\n\n\t\tsetSessionName(name: string): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setSessionName(name);\n\t\t},\n\n\t\tgetSessionName(): string | undefined {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getSessionName();\n\t\t},\n\n\t\tsetLabel(entryId: string, label: string | undefined): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setLabel(entryId, label);\n\t\t},\n\n\t\texec(command: string, args: string[], options?: ExecOptions) {\n\t\t\truntime.assertActive();\n\t\t\treturn execCommand(command, args, options?.cwd ?? cwd, options);\n\t\t},\n\n\t\tgetActiveTools(): string[] {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getActiveTools();\n\t\t},\n\n\t\tgetAllTools() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getAllTools();\n\t\t},\n\n\t\tsetActiveTools(toolNames: string[]): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setActiveTools(toolNames);\n\t\t},\n\n\t\tgetCommands() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getCommands();\n\t\t},\n\n\t\tsetModel(model) {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.setModel(model);\n\t\t},\n\n\t\tgetThinkingLevel() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getThinkingLevel();\n\t\t},\n\n\t\tsetThinkingLevel(level) {\n\t\t\truntime.assertActive();\n\t\t\truntime.setThinkingLevel(level);\n\t\t},\n\n\t\tregisterProvider(name: string, config: ProviderConfig) {\n\t\t\truntime.assertActive();\n\t\t\truntime.registerProvider(name, config, extension.path);\n\t\t},\n\n\t\tunregisterProvider(name: string) {\n\t\t\truntime.assertActive();\n\t\t\truntime.unregisterProvider(name, extension.path);\n\t\t},\n\n\t\tevents: eventBus,\n\t} as ExtensionAPI;\n\n\treturn api;\n}\n\nfunction isCurrentCacheToken(cacheToken: ExtensionCacheToken | undefined): cacheToken is ExtensionCacheToken {\n\treturn (\n\t\tcacheToken !== undefined &&\n\t\textensionCacheCwd === cacheToken.cwd &&\n\t\textensionCacheGeneration === cacheToken.generation\n\t);\n}\n\nasync function loadExtensionModule(extensionPath: string, cacheToken?: ExtensionCacheToken) {\n\tif (isCurrentCacheToken(cacheToken)) {\n\t\tconst cachedFactory = extensionCache.get(extensionPath);\n\t\tif (cachedFactory) {\n\t\t\treturn cachedFactory;\n\t\t}\n\t}\n\n\tconst jiti = createJiti(import.meta.url, {\n\t\tmoduleCache: false,\n\t\t// In Bun binary: use virtualModules for bundled packages (no filesystem resolution)\n\t\t// Also disable tryNative so jiti handles ALL imports (not just the entry point)\n\t\t// In Node.js/dev: use aliases to resolve to node_modules paths\n\t\t...(isBunBinary ? { virtualModules: VIRTUAL_MODULES, tryNative: false } : { alias: getAliases() }),\n\t});\n\n\tconst module = await jiti.import(extensionPath, { default: true });\n\tconst factory = module as ExtensionFactory;\n\tif (typeof factory !== \"function\") {\n\t\treturn undefined;\n\t}\n\tif (isCurrentCacheToken(cacheToken)) {\n\t\textensionCache.set(extensionPath, factory);\n\t}\n\treturn factory;\n}\n\n/**\n * Create an Extension object with empty collections.\n */\nfunction createExtension(extensionPath: string, resolvedPath: string): Extension {\n\tconst source =\n\t\textensionPath.startsWith(\"<\") && extensionPath.endsWith(\">\")\n\t\t\t? extensionPath.slice(1, -1).split(\":\")[0] || \"temporary\"\n\t\t\t: \"local\";\n\tconst baseDir = extensionPath.startsWith(\"<\") ? undefined : path.dirname(resolvedPath);\n\n\treturn {\n\t\tpath: extensionPath,\n\t\tresolvedPath,\n\t\tsourceInfo: createSyntheticSourceInfo(extensionPath, { source, baseDir }),\n\t\thandlers: new Map(),\n\t\ttools: new Map(),\n\t\tmessageRenderers: new Map(),\n\t\tentryRenderers: new Map(),\n\t\tcommands: new Map(),\n\t\tflags: new Map(),\n\t\tshortcuts: new Map(),\n\t};\n}\n\nasync function loadExtension(\n\textensionPath: string,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n\tcacheToken?: ExtensionCacheToken,\n): Promise<{ extension: Extension | null; error: string | null }> {\n\tconst resolvedPath = resolvePath(extensionPath, cwd, { normalizeUnicodeSpaces: true });\n\n\ttry {\n\t\tconst factory = await loadExtensionModule(resolvedPath, cacheToken);\n\t\ttime(`${extensionPath} module import`, \"extensions\");\n\t\tif (!factory) {\n\t\t\treturn { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };\n\t\t}\n\n\t\tconst extension = createExtension(extensionPath, resolvedPath);\n\t\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\t\tawait factory(api);\n\t\ttime(`${extensionPath} factory`, \"extensions\");\n\n\t\treturn { extension, error: null };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn { extension: null, error: `Failed to load extension: ${message}` };\n\t}\n}\n\n/**\n * Create an Extension from an inline factory function.\n */\nexport async function loadExtensionFromFactory(\n\tfactory: ExtensionFactory,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n\textensionPath = \"<inline>\",\n): Promise<Extension> {\n\tconst extension = createExtension(extensionPath, extensionPath);\n\tconst resolvedCwd = resolvePath(cwd);\n\tconst api = createExtensionAPI(extension, runtime, resolvedCwd, eventBus);\n\tawait factory(api);\n\ttime(`${extensionPath} factory`, \"extensions\");\n\treturn extension;\n}\n\n/**\n * Load extensions from paths.\n */\nasync function loadExtensionsInternal(\n\tpaths: string[],\n\tcwd: string,\n\teventBus?: EventBus,\n\truntime?: ExtensionRuntime,\n\tuseCache = false,\n): Promise<LoadExtensionsResult> {\n\tconst extensions: Extension[] = [];\n\tconst errors: Array<{ path: string; error: string }> = [];\n\tconst cacheToken = useCache ? useExtensionCacheCwd(cwd) : undefined;\n\tconst resolvedCwd = cacheToken?.cwd ?? resolvePath(cwd);\n\tconst resolvedEventBus = eventBus ?? createEventBus();\n\tconst resolvedRuntime = runtime ?? createExtensionRuntime();\n\n\tfor (const extPath of paths) {\n\t\tconst { extension, error } = await loadExtension(\n\t\t\textPath,\n\t\t\tresolvedCwd,\n\t\t\tresolvedEventBus,\n\t\t\tresolvedRuntime,\n\t\t\tcacheToken,\n\t\t);\n\n\t\tif (error) {\n\t\t\terrors.push({ path: extPath, error });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (extension) {\n\t\t\textensions.push(extension);\n\t\t}\n\t}\n\n\treturn {\n\t\textensions,\n\t\terrors,\n\t\truntime: resolvedRuntime,\n\t};\n}\n\nexport async function loadExtensions(\n\tpaths: string[],\n\tcwd: string,\n\teventBus?: EventBus,\n\truntime?: ExtensionRuntime,\n): Promise<LoadExtensionsResult> {\n\treturn loadExtensionsInternal(paths, cwd, eventBus, runtime);\n}\n\nexport async function loadExtensionsCached(\n\tpaths: string[],\n\tcwd: string,\n\teventBus?: EventBus,\n\truntime?: ExtensionRuntime,\n): Promise<LoadExtensionsResult> {\n\treturn loadExtensionsInternal(paths, cwd, eventBus, runtime, true);\n}\n\ninterface PiManifest {\n\textensions?: string[];\n\tthemes?: string[];\n\tskills?: string[];\n\tprompts?: string[];\n}\n\nfunction readPiManifest(packageJsonPath: string): PiManifest | null {\n\ttry {\n\t\tconst content = fs.readFileSync(packageJsonPath, \"utf-8\");\n\t\tconst pkg = JSON.parse(content);\n\t\tif (pkg.pi && typeof pkg.pi === \"object\") {\n\t\t\treturn pkg.pi as PiManifest;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isExtensionFile(name: string): boolean {\n\treturn name.endsWith(\".ts\") || name.endsWith(\".js\");\n}\n\n/**\n * Resolve extension entry points from a directory.\n *\n * Checks for:\n * 1. package.json with \"pi.extensions\" field -> returns declared paths\n * 2. index.ts or index.js -> returns the index file\n *\n * Returns resolved paths or null if no entry points found.\n */\nfunction resolveExtensionEntries(dir: string): string[] | null {\n\t// Check for package.json with \"pi\" field first\n\tconst packageJsonPath = path.join(dir, \"package.json\");\n\tif (fs.existsSync(packageJsonPath)) {\n\t\tconst manifest = readPiManifest(packageJsonPath);\n\t\tif (manifest?.extensions?.length) {\n\t\t\tconst entries: string[] = [];\n\t\t\tfor (const extPath of manifest.extensions) {\n\t\t\t\tconst resolvedExtPath = path.resolve(dir, extPath);\n\t\t\t\tif (fs.existsSync(resolvedExtPath)) {\n\t\t\t\t\tentries.push(resolvedExtPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entries.length > 0) {\n\t\t\t\treturn entries;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check for index.ts or index.js\n\tconst indexTs = path.join(dir, \"index.ts\");\n\tconst indexJs = path.join(dir, \"index.js\");\n\tif (fs.existsSync(indexTs)) {\n\t\treturn [indexTs];\n\t}\n\tif (fs.existsSync(indexJs)) {\n\t\treturn [indexJs];\n\t}\n\n\treturn null;\n}\n\n/**\n * Discover extensions in a directory.\n *\n * Discovery rules:\n * 1. Direct files: `extensions/*.ts` or `*.js` → load\n * 2. Subdirectory with index: `extensions/* /index.ts` or `index.js` → load\n * 3. Subdirectory with package.json: `extensions/* /package.json` with \"pi\" field → load what it declares\n *\n * No recursion beyond one level. Complex packages must use package.json manifest.\n */\nfunction discoverExtensionsInDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\n\tconst discovered: string[] = [];\n\n\ttry {\n\t\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst entryPath = path.join(dir, entry.name);\n\n\t\t\t// 1. Direct files: *.ts or *.js\n\t\t\tif ((entry.isFile() || entry.isSymbolicLink()) && isExtensionFile(entry.name)) {\n\t\t\t\tdiscovered.push(entryPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// 2 & 3. Subdirectories\n\t\t\tif (entry.isDirectory() || entry.isSymbolicLink()) {\n\t\t\t\tconst entries = resolveExtensionEntries(entryPath);\n\t\t\t\tif (entries) {\n\t\t\t\t\tdiscovered.push(...entries);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn discovered;\n}\n\n/**\n * Discover and load extensions from standard locations.\n */\nexport async function discoverAndLoadExtensions(\n\tconfiguredPaths: string[],\n\tcwd: string,\n\tagentDir: string = getAgentDir(),\n\teventBus?: EventBus,\n): Promise<LoadExtensionsResult> {\n\tconst resolvedCwd = resolvePath(cwd);\n\tconst resolvedAgentDir = resolvePath(agentDir);\n\tconst allPaths: string[] = [];\n\tconst seen = new Set<string>();\n\n\tconst addPaths = (paths: string[]) => {\n\t\tfor (const p of paths) {\n\t\t\tconst resolved = path.resolve(p);\n\t\t\tif (!seen.has(resolved)) {\n\t\t\t\tseen.add(resolved);\n\t\t\t\tallPaths.push(p);\n\t\t\t}\n\t\t}\n\t};\n\n\t// 1. Project-local extensions: cwd/${CONFIG_DIR_NAME}/extensions/\n\tconst localExtDir = path.join(resolvedCwd, CONFIG_DIR_NAME, \"extensions\");\n\taddPaths(discoverExtensionsInDir(localExtDir));\n\n\t// 2. Global extensions: agentDir/extensions/\n\tconst globalExtDir = path.join(resolvedAgentDir, \"extensions\");\n\taddPaths(discoverExtensionsInDir(globalExtDir));\n\n\t// 3. Explicitly configured paths\n\tfor (const p of configuredPaths) {\n\t\tconst resolved = resolvePath(p, resolvedCwd, { normalizeUnicodeSpaces: true });\n\t\tif (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {\n\t\t\t// Check for package.json with pi manifest or index.ts\n\t\t\tconst entries = resolveExtensionEntries(resolved);\n\t\t\tif (entries) {\n\t\t\t\taddPaths(entries);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// No explicit entries - discover individual files in directory\n\t\t\taddPaths(discoverExtensionsInDir(resolved));\n\t\t\tcontinue;\n\t\t}\n\n\t\taddPaths([resolved]);\n\t}\n\n\treturn loadExtensions(allPaths, resolvedCwd, eventBus);\n}\n"]}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension loader - loads TypeScript extension modules using jiti.\n *\n */\n\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport * as _bundledPiAgentCore from \"@ashx-j/lunr-agent\";\nimport * as _bundledPiAiCompat from \"@ashx-j/lunr-ai/compat\";\nimport * as _bundledPiAiOauth from \"@ashx-j/lunr-ai/oauth\";\nimport type { KeyId } from \"@ashx-j/lunr-tui\";\nimport * as _bundledPiTui from \"@ashx-j/lunr-tui\";\n// Static imports of packages that extensions may use.\n// jiti/static, providers/all, and the public barrel stay off the Node first-paint\n// graph. Bun registers those via host-static.ts (imported from bun/cli.ts).\nimport * as _bundledTypebox from \"typebox\";\nimport * as _bundledTypeboxCompile from \"typebox/compile\";\nimport * as _bundledTypeboxValue from \"typebox/value\";\nimport { CONFIG_DIR_NAME, getAgentDir, isBunBinary } from \"../../config.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport { createEventBus, type EventBus } from \"../event-bus.ts\";\nimport type { ExecOptions } from \"../exec.ts\";\nimport { execCommand } from \"../exec.ts\";\nimport { createSyntheticSourceInfo } from \"../source-info.ts\";\nimport { time } from \"../timings.ts\";\nimport type {\n\tEntryRenderer,\n\tExtension,\n\tExtensionAPI,\n\tExtensionFactory,\n\tExtensionRuntime,\n\tLoadExtensionsResult,\n\tMessageRenderer,\n\tProviderConfig,\n\tRegisteredCommand,\n\tToolDefinition,\n} from \"./types.ts\";\n\ntype CreateJiti = typeof import(\"jiti/static\").createJiti;\n\ninterface BunExtensionHost {\n\tcreateJiti: CreateJiti;\n\tprovidersAll: unknown;\n\tcodingAgent: unknown;\n}\n\nlet bunExtensionHost: BunExtensionHost | undefined;\nlet createJitiFn: CreateJiti | undefined;\nlet lazyProvidersAll: unknown;\nlet lazyCodingAgent: unknown;\n\n/** Register host modules that must stay static for the Bun binary. */\nexport function registerBunExtensionHost(host: BunExtensionHost): void {\n\tbunExtensionHost = host;\n\tcreateJitiFn = host.createJiti;\n\tlazyProvidersAll = host.providersAll;\n\tlazyCodingAgent = host.codingAgent;\n}\n\nfunction scopedHostKeys(earendil: string, ashxj: string, value: unknown): Record<string, unknown> {\n\treturn {\n\t\t[earendil]: value,\n\t\t[ashxj]: value,\n\t};\n}\n\nfunction virtualModules(): Record<string, unknown> {\n\treturn {\n\t\ttypebox: _bundledTypebox,\n\t\t\"typebox/compile\": _bundledTypeboxCompile,\n\t\t\"typebox/value\": _bundledTypeboxValue,\n\t\t\"@sinclair/typebox\": _bundledTypebox,\n\t\t\"@sinclair/typebox/compile\": _bundledTypeboxCompile,\n\t\t\"@sinclair/typebox/value\": _bundledTypeboxValue,\n\t\t...scopedHostKeys(\"@ashx-j/lunr-agent\", \"@ashx-j/lunr-agent\", _bundledPiAgentCore),\n\t\t...scopedHostKeys(\"@ashx-j/lunr-tui\", \"@ashx-j/lunr-tui\", _bundledPiTui),\n\t\t// Extensions resolve the pi-ai root to the compat entrypoint (a strict\n\t\t// superset of the core entrypoint): existing extensions using the old\n\t\t// global API keep working at runtime until compat is removed.\n\t\t...scopedHostKeys(\"@ashx-j/lunr-ai\", \"@ashx-j/lunr-ai\", _bundledPiAiCompat),\n\t\t...scopedHostKeys(\"@ashx-j/lunr-ai/compat\", \"@ashx-j/lunr-ai/compat\", _bundledPiAiCompat),\n\t\t...scopedHostKeys(\"@ashx-j/lunr-ai/oauth\", \"@ashx-j/lunr-ai/oauth\", _bundledPiAiOauth),\n\t\t...scopedHostKeys(\n\t\t\t\"@ashx-j/lunr-ai/providers/all\",\n\t\t\t\"@ashx-j/lunr-ai/providers/all\",\n\t\t\tlazyProvidersAll,\n\t\t),\n\t\t...scopedHostKeys(\"@ashx-j/lunr\", \"@ashx-j/lunr\", lazyCodingAgent),\n\t\t\"@mariozechner/pi-agent-core\": _bundledPiAgentCore,\n\t\t\"@mariozechner/pi-tui\": _bundledPiTui,\n\t\t\"@mariozechner/pi-ai\": _bundledPiAiCompat,\n\t\t\"@mariozechner/pi-ai/compat\": _bundledPiAiCompat,\n\t\t\"@mariozechner/pi-ai/oauth\": _bundledPiAiOauth,\n\t\t\"@mariozechner/pi-ai/providers/all\": lazyProvidersAll,\n\t\t\"@mariozechner/pi-coding-agent\": lazyCodingAgent,\n\t};\n}\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Get aliases for jiti (used in Node.js/development mode).\n * In Bun binary mode, virtualModules is used instead.\n */\nlet _aliases: Record<string, string> | null = null;\n\nfunction getAliases(): Record<string, string> {\n\tif (_aliases) return _aliases;\n\n\tconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\tconst packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\n\tconst typeboxEntry = require.resolve(\"typebox\");\n\tconst typeboxCompileEntry = require.resolve(\"typebox/compile\");\n\tconst typeboxValueEntry = require.resolve(\"typebox/value\");\n\n\tconst packagesRoot = path.resolve(__dirname, \"../../../../\");\n\tconst resolveWorkspaceOrImport = (workspaceRelativePath: string, specifier: string): string => {\n\t\tconst workspacePath = path.join(packagesRoot, workspaceRelativePath);\n\t\tif (fs.existsSync(workspacePath)) {\n\t\t\treturn workspacePath;\n\t\t}\n\t\treturn fileURLToPath(import.meta.resolve(specifier));\n\t};\n\n\tconst piCodingAgentEntry = packageIndex;\n\tconst piAgentCoreEntry = resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@ashx-j/lunr-agent\");\n\tconst piTuiEntry = resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@ashx-j/lunr-tui\");\n\t// Extensions resolve the pi-ai root to the compat entrypoint (a strict\n\t// superset of the core entrypoint): existing extensions using the old\n\t// global API keep working at runtime until compat is removed.\n\tconst piAiCompatEntry = resolveWorkspaceOrImport(\"ai/dist/compat.js\", \"@ashx-j/lunr-ai/compat\");\n\tconst piAiOauthEntry = resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@ashx-j/lunr-ai/oauth\");\n\tconst piAiProvidersEntry = resolveWorkspaceOrImport(\n\t\t\"ai/dist/providers/all.js\",\n\t\t\"@ashx-j/lunr-ai/providers/all\",\n\t);\n\n\t_aliases = {\n\t\t\"@ashx-j/lunr\": piCodingAgentEntry,\n\t\t\"@ashx-j/lunr-agent\": piAgentCoreEntry,\n\t\t\"@ashx-j/lunr-tui\": piTuiEntry,\n\t\t\"@ashx-j/lunr-ai/providers/all\": piAiProvidersEntry,\n\t\t\"@ashx-j/lunr-ai/compat\": piAiCompatEntry,\n\t\t\"@ashx-j/lunr-ai/oauth\": piAiOauthEntry,\n\t\t\"@ashx-j/lunr-ai\": piAiCompatEntry,\n\t\t\"@ashx-j/lunr\": piCodingAgentEntry,\n\t\t\"@ashx-j/lunr-agent\": piAgentCoreEntry,\n\t\t\"@ashx-j/lunr-tui\": piTuiEntry,\n\t\t\"@ashx-j/lunr-ai/providers/all\": piAiProvidersEntry,\n\t\t\"@ashx-j/lunr-ai/compat\": piAiCompatEntry,\n\t\t\"@ashx-j/lunr-ai/oauth\": piAiOauthEntry,\n\t\t\"@ashx-j/lunr-ai\": piAiCompatEntry,\n\t\t\"@mariozechner/pi-coding-agent\": piCodingAgentEntry,\n\t\t\"@mariozechner/pi-agent-core\": piAgentCoreEntry,\n\t\t\"@mariozechner/pi-tui\": piTuiEntry,\n\t\t\"@mariozechner/pi-ai/providers/all\": piAiProvidersEntry,\n\t\t\"@mariozechner/pi-ai/compat\": piAiCompatEntry,\n\t\t\"@mariozechner/pi-ai/oauth\": piAiOauthEntry,\n\t\t\"@mariozechner/pi-ai\": piAiCompatEntry,\n\t\ttypebox: typeboxEntry,\n\t\t\"typebox/compile\": typeboxCompileEntry,\n\t\t\"typebox/value\": typeboxValueEntry,\n\t\t\"@sinclair/typebox\": typeboxEntry,\n\t\t\"@sinclair/typebox/compile\": typeboxCompileEntry,\n\t\t\"@sinclair/typebox/value\": typeboxValueEntry,\n\t};\n\n\treturn _aliases;\n}\n\nexport function getExtensionAliasesForTest(): Record<string, string> {\n\t_aliases = null;\n\treturn getAliases();\n}\n\ntype HandlerFn = (...args: unknown[]) => Promise<unknown>;\n\nlet extensionCacheCwd: string | undefined;\nlet extensionCacheGeneration = 0;\nconst extensionCache = new Map<string, ExtensionFactory>();\n\ninterface ExtensionCacheToken {\n\tcwd: string;\n\tgeneration: number;\n}\n\nexport function clearExtensionCache(): void {\n\textensionCache.clear();\n\textensionCacheCwd = undefined;\n\textensionCacheGeneration++;\n}\n\nfunction useExtensionCacheCwd(cwd: string): ExtensionCacheToken {\n\tconst resolvedCwd = resolvePath(cwd);\n\tif (extensionCacheCwd !== undefined && extensionCacheCwd !== resolvedCwd) {\n\t\tclearExtensionCache();\n\t}\n\textensionCacheCwd = resolvedCwd;\n\treturn { cwd: resolvedCwd, generation: extensionCacheGeneration };\n}\n\n/**\n * Create a runtime with throwing stubs for action methods.\n * Runner.bindCore() replaces these with real implementations.\n */\nexport function createExtensionRuntime(): ExtensionRuntime {\n\tconst notInitialized = () => {\n\t\tthrow new Error(\"Extension runtime not initialized. Action methods cannot be called during extension loading.\");\n\t};\n\tconst state: { staleMessage?: string } = {};\n\tconst assertActive = () => {\n\t\tif (state.staleMessage) {\n\t\t\tthrow new Error(state.staleMessage);\n\t\t}\n\t};\n\n\tconst runtime: ExtensionRuntime = {\n\t\tsendMessage: notInitialized,\n\t\tsendUserMessage: notInitialized,\n\t\tappendEntry: notInitialized,\n\t\tsetSessionName: notInitialized,\n\t\tgetSessionName: notInitialized,\n\t\tsetLabel: notInitialized,\n\t\tgetActiveTools: notInitialized,\n\t\tgetAllTools: notInitialized,\n\t\tsetActiveTools: notInitialized,\n\t\t// registerTool() is valid during extension load; refresh is only needed post-bind.\n\t\trefreshTools: () => {},\n\t\tgetCommands: notInitialized,\n\t\tsetModel: () => Promise.reject(new Error(\"Extension runtime not initialized\")),\n\t\tgetThinkingLevel: notInitialized,\n\t\tsetThinkingLevel: notInitialized,\n\t\tflagValues: new Map(),\n\t\tpendingProviderRegistrations: [],\n\t\tassertActive,\n\t\tinvalidate: (message) => {\n\t\t\tstate.staleMessage ??=\n\t\t\t\tmessage ??\n\t\t\t\t\"This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().\";\n\t\t},\n\t\t// Pre-bind: queue registrations so bindCore() can flush them once the\n\t\t// model registry is available. bindCore() replaces both with direct calls.\n\t\tregisterProvider: (name, config, extensionPath = \"<unknown>\") => {\n\t\t\truntime.pendingProviderRegistrations.push({ name, config, extensionPath });\n\t\t},\n\t\tunregisterProvider: (name) => {\n\t\t\truntime.pendingProviderRegistrations = runtime.pendingProviderRegistrations.filter((r) => r.name !== name);\n\t\t},\n\t};\n\n\treturn runtime;\n}\n\n/**\n * Create the ExtensionAPI for an extension.\n * Registration methods write to the extension object.\n * Action methods delegate to the shared runtime.\n */\nfunction createExtensionAPI(\n\textension: Extension,\n\truntime: ExtensionRuntime,\n\tcwd: string,\n\teventBus: EventBus,\n): ExtensionAPI {\n\tconst api = {\n\t\t// Registration methods - write to extension\n\t\ton(event: string, handler: HandlerFn): void {\n\t\t\truntime.assertActive();\n\t\t\tconst list = extension.handlers.get(event) ?? [];\n\t\t\tlist.push(handler);\n\t\t\textension.handlers.set(event, list);\n\t\t},\n\n\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\truntime.assertActive();\n\t\t\textension.tools.set(tool.name, {\n\t\t\t\tdefinition: tool,\n\t\t\t\tsourceInfo: extension.sourceInfo,\n\t\t\t});\n\t\t\truntime.refreshTools();\n\t\t},\n\n\t\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\" | \"sourceInfo\">): void {\n\t\t\truntime.assertActive();\n\t\t\textension.commands.set(name, {\n\t\t\t\tname,\n\t\t\t\tsourceInfo: extension.sourceInfo,\n\t\t\t\t...options,\n\t\t\t});\n\t\t},\n\n\t\tregisterShortcut(\n\t\t\tshortcut: KeyId,\n\t\t\toptions: {\n\t\t\t\tdescription?: string;\n\t\t\t\thandler: (ctx: import(\"./types.ts\").ExtensionContext) => Promise<void> | void;\n\t\t\t},\n\t\t): void {\n\t\t\truntime.assertActive();\n\t\t\textension.shortcuts.set(shortcut, { shortcut, extensionPath: extension.path, ...options });\n\t\t},\n\n\t\tregisterFlag(\n\t\t\tname: string,\n\t\t\toptions: { description?: string; type: \"boolean\" | \"string\"; default?: boolean | string },\n\t\t): void {\n\t\t\truntime.assertActive();\n\t\t\textension.flags.set(name, { name, extensionPath: extension.path, ...options });\n\t\t\tif (options.default !== undefined && !runtime.flagValues.has(name)) {\n\t\t\t\truntime.flagValues.set(name, options.default);\n\t\t\t}\n\t\t},\n\n\t\tregisterMessageRenderer<T>(customType: string, renderer: MessageRenderer<T>): void {\n\t\t\truntime.assertActive();\n\t\t\textension.messageRenderers.set(customType, renderer as MessageRenderer);\n\t\t},\n\n\t\tregisterEntryRenderer<T>(customType: string, renderer: EntryRenderer<T>): void {\n\t\t\truntime.assertActive();\n\t\t\textension.entryRenderers ??= new Map();\n\t\t\textension.entryRenderers.set(customType, renderer as EntryRenderer);\n\t\t},\n\n\t\t// Flag access - checks extension registered it, reads from runtime\n\t\tgetFlag(name: string): boolean | string | undefined {\n\t\t\truntime.assertActive();\n\t\t\tif (!extension.flags.has(name)) return undefined;\n\t\t\treturn runtime.flagValues.get(name);\n\t\t},\n\n\t\t// Action methods - delegate to shared runtime\n\t\tsendMessage(message, options): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.sendMessage(message, options);\n\t\t},\n\n\t\tsendUserMessage(content, options): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.sendUserMessage(content, options);\n\t\t},\n\n\t\tappendEntry(customType: string, data?: unknown): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.appendEntry(customType, data);\n\t\t},\n\n\t\tsetSessionName(name: string): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setSessionName(name);\n\t\t},\n\n\t\tgetSessionName(): string | undefined {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getSessionName();\n\t\t},\n\n\t\tsetLabel(entryId: string, label: string | undefined): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setLabel(entryId, label);\n\t\t},\n\n\t\texec(command: string, args: string[], options?: ExecOptions) {\n\t\t\truntime.assertActive();\n\t\t\treturn execCommand(command, args, options?.cwd ?? cwd, options);\n\t\t},\n\n\t\tgetActiveTools(): string[] {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getActiveTools();\n\t\t},\n\n\t\tgetAllTools() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getAllTools();\n\t\t},\n\n\t\tsetActiveTools(toolNames: string[]): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setActiveTools(toolNames);\n\t\t},\n\n\t\tgetCommands() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getCommands();\n\t\t},\n\n\t\tsetModel(model) {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.setModel(model);\n\t\t},\n\n\t\tgetThinkingLevel() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getThinkingLevel();\n\t\t},\n\n\t\tsetThinkingLevel(level) {\n\t\t\truntime.assertActive();\n\t\t\truntime.setThinkingLevel(level);\n\t\t},\n\n\t\tregisterProvider(name: string, config: ProviderConfig) {\n\t\t\truntime.assertActive();\n\t\t\truntime.registerProvider(name, config, extension.path);\n\t\t},\n\n\t\tunregisterProvider(name: string) {\n\t\t\truntime.assertActive();\n\t\t\truntime.unregisterProvider(name, extension.path);\n\t\t},\n\n\t\tevents: eventBus,\n\t} as ExtensionAPI;\n\n\treturn api;\n}\n\nfunction isCurrentCacheToken(cacheToken: ExtensionCacheToken | undefined): cacheToken is ExtensionCacheToken {\n\treturn (\n\t\tcacheToken !== undefined &&\n\t\textensionCacheCwd === cacheToken.cwd &&\n\t\textensionCacheGeneration === cacheToken.generation\n\t);\n}\n\nasync function ensureExtensionHost(): Promise<CreateJiti> {\n\tif (createJitiFn) return createJitiFn;\n\tif (isBunBinary && bunExtensionHost) {\n\t\treturn bunExtensionHost.createJiti;\n\t}\n\tconst [{ createJiti }, providersAll, codingAgent] = await Promise.all([\n\t\timport(\"jiti/static\"),\n\t\timport(\"@ashx-j/lunr-ai/providers/all\"),\n\t\timport(\"../../index.ts\"),\n\t]);\n\tcreateJitiFn = createJiti;\n\tlazyProvidersAll = providersAll;\n\tlazyCodingAgent = codingAgent;\n\treturn createJiti;\n}\n\nasync function loadExtensionModule(extensionPath: string, cacheToken?: ExtensionCacheToken) {\n\tif (isCurrentCacheToken(cacheToken)) {\n\t\tconst cachedFactory = extensionCache.get(extensionPath);\n\t\tif (cachedFactory) {\n\t\t\treturn cachedFactory;\n\t\t}\n\t}\n\n\tconst createJiti = await ensureExtensionHost();\n\tconst jiti = createJiti(import.meta.url, {\n\t\tmoduleCache: false,\n\t\t// In Bun binary: use virtualModules for bundled packages (no filesystem resolution)\n\t\t// Also disable tryNative so jiti handles ALL imports (not just the entry point)\n\t\t// In Node.js/dev: use aliases to resolve to node_modules paths\n\t\t...(isBunBinary ? { virtualModules: virtualModules(), tryNative: false } : { alias: getAliases() }),\n\t});\n\n\tconst module = await jiti.import(extensionPath, { default: true });\n\tconst factory = module as ExtensionFactory;\n\tif (typeof factory !== \"function\") {\n\t\treturn undefined;\n\t}\n\tif (isCurrentCacheToken(cacheToken)) {\n\t\textensionCache.set(extensionPath, factory);\n\t}\n\treturn factory;\n}\n\n/**\n * Create an Extension object with empty collections.\n */\nfunction createExtension(extensionPath: string, resolvedPath: string): Extension {\n\tconst source =\n\t\textensionPath.startsWith(\"<\") && extensionPath.endsWith(\">\")\n\t\t\t? extensionPath.slice(1, -1).split(\":\")[0] || \"temporary\"\n\t\t\t: \"local\";\n\tconst baseDir = extensionPath.startsWith(\"<\") ? undefined : path.dirname(resolvedPath);\n\n\treturn {\n\t\tpath: extensionPath,\n\t\tresolvedPath,\n\t\tsourceInfo: createSyntheticSourceInfo(extensionPath, { source, baseDir }),\n\t\thandlers: new Map(),\n\t\ttools: new Map(),\n\t\tmessageRenderers: new Map(),\n\t\tentryRenderers: new Map(),\n\t\tcommands: new Map(),\n\t\tflags: new Map(),\n\t\tshortcuts: new Map(),\n\t};\n}\n\nasync function loadExtension(\n\textensionPath: string,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n\tcacheToken?: ExtensionCacheToken,\n): Promise<{ extension: Extension | null; error: string | null }> {\n\tconst resolvedPath = resolvePath(extensionPath, cwd, { normalizeUnicodeSpaces: true });\n\n\ttry {\n\t\tconst factory = await loadExtensionModule(resolvedPath, cacheToken);\n\t\ttime(`${extensionPath} module import`, \"extensions\");\n\t\tif (!factory) {\n\t\t\treturn { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };\n\t\t}\n\n\t\tconst extension = createExtension(extensionPath, resolvedPath);\n\t\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\t\tawait factory(api);\n\t\ttime(`${extensionPath} factory`, \"extensions\");\n\n\t\treturn { extension, error: null };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn { extension: null, error: `Failed to load extension: ${message}` };\n\t}\n}\n\n/**\n * Create an Extension from an inline factory function.\n */\nexport async function loadExtensionFromFactory(\n\tfactory: ExtensionFactory,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n\textensionPath = \"<inline>\",\n): Promise<Extension> {\n\tconst extension = createExtension(extensionPath, extensionPath);\n\tconst resolvedCwd = resolvePath(cwd);\n\tconst api = createExtensionAPI(extension, runtime, resolvedCwd, eventBus);\n\tawait factory(api);\n\ttime(`${extensionPath} factory`, \"extensions\");\n\treturn extension;\n}\n\n/**\n * Load extensions from paths.\n */\nasync function loadExtensionsInternal(\n\tpaths: string[],\n\tcwd: string,\n\teventBus?: EventBus,\n\truntime?: ExtensionRuntime,\n\tuseCache = false,\n): Promise<LoadExtensionsResult> {\n\tconst extensions: Extension[] = [];\n\tconst errors: Array<{ path: string; error: string }> = [];\n\tconst cacheToken = useCache ? useExtensionCacheCwd(cwd) : undefined;\n\tconst resolvedCwd = cacheToken?.cwd ?? resolvePath(cwd);\n\tconst resolvedEventBus = eventBus ?? createEventBus();\n\tconst resolvedRuntime = runtime ?? createExtensionRuntime();\n\n\tfor (const extPath of paths) {\n\t\tconst { extension, error } = await loadExtension(\n\t\t\textPath,\n\t\t\tresolvedCwd,\n\t\t\tresolvedEventBus,\n\t\t\tresolvedRuntime,\n\t\t\tcacheToken,\n\t\t);\n\n\t\tif (error) {\n\t\t\terrors.push({ path: extPath, error });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (extension) {\n\t\t\textensions.push(extension);\n\t\t}\n\t}\n\n\treturn {\n\t\textensions,\n\t\terrors,\n\t\truntime: resolvedRuntime,\n\t};\n}\n\nexport async function loadExtensions(\n\tpaths: string[],\n\tcwd: string,\n\teventBus?: EventBus,\n\truntime?: ExtensionRuntime,\n): Promise<LoadExtensionsResult> {\n\treturn loadExtensionsInternal(paths, cwd, eventBus, runtime);\n}\n\nexport async function loadExtensionsCached(\n\tpaths: string[],\n\tcwd: string,\n\teventBus?: EventBus,\n\truntime?: ExtensionRuntime,\n): Promise<LoadExtensionsResult> {\n\treturn loadExtensionsInternal(paths, cwd, eventBus, runtime, true);\n}\n\ninterface PiManifest {\n\textensions?: string[];\n\tthemes?: string[];\n\tskills?: string[];\n\tprompts?: string[];\n}\n\nfunction readPiManifest(packageJsonPath: string): PiManifest | null {\n\ttry {\n\t\tconst content = fs.readFileSync(packageJsonPath, \"utf-8\");\n\t\tconst pkg = JSON.parse(content);\n\t\tif (pkg.pi && typeof pkg.pi === \"object\") {\n\t\t\treturn pkg.pi as PiManifest;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isExtensionFile(name: string): boolean {\n\treturn name.endsWith(\".ts\") || name.endsWith(\".js\");\n}\n\n/**\n * Resolve extension entry points from a directory.\n *\n * Checks for:\n * 1. package.json with \"pi.extensions\" field -> returns declared paths\n * 2. index.ts or index.js -> returns the index file\n *\n * Returns resolved paths or null if no entry points found.\n */\nfunction resolveExtensionEntries(dir: string): string[] | null {\n\t// Check for package.json with \"pi\" field first\n\tconst packageJsonPath = path.join(dir, \"package.json\");\n\tif (fs.existsSync(packageJsonPath)) {\n\t\tconst manifest = readPiManifest(packageJsonPath);\n\t\tif (manifest?.extensions?.length) {\n\t\t\tconst entries: string[] = [];\n\t\t\tfor (const extPath of manifest.extensions) {\n\t\t\t\tconst resolvedExtPath = path.resolve(dir, extPath);\n\t\t\t\tif (fs.existsSync(resolvedExtPath)) {\n\t\t\t\t\tentries.push(resolvedExtPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entries.length > 0) {\n\t\t\t\treturn entries;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check for index.ts or index.js\n\tconst indexTs = path.join(dir, \"index.ts\");\n\tconst indexJs = path.join(dir, \"index.js\");\n\tif (fs.existsSync(indexTs)) {\n\t\treturn [indexTs];\n\t}\n\tif (fs.existsSync(indexJs)) {\n\t\treturn [indexJs];\n\t}\n\n\treturn null;\n}\n\n/**\n * Discover extensions in a directory.\n *\n * Discovery rules:\n * 1. Direct files: `extensions/*.ts` or `*.js` → load\n * 2. Subdirectory with index: `extensions/* /index.ts` or `index.js` → load\n * 3. Subdirectory with package.json: `extensions/* /package.json` with \"pi\" field → load what it declares\n *\n * No recursion beyond one level. Complex packages must use package.json manifest.\n */\nfunction discoverExtensionsInDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\n\tconst discovered: string[] = [];\n\n\ttry {\n\t\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst entryPath = path.join(dir, entry.name);\n\n\t\t\t// 1. Direct files: *.ts or *.js\n\t\t\tif ((entry.isFile() || entry.isSymbolicLink()) && isExtensionFile(entry.name)) {\n\t\t\t\tdiscovered.push(entryPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// 2 & 3. Subdirectories\n\t\t\tif (entry.isDirectory() || entry.isSymbolicLink()) {\n\t\t\t\tconst entries = resolveExtensionEntries(entryPath);\n\t\t\t\tif (entries) {\n\t\t\t\t\tdiscovered.push(...entries);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn discovered;\n}\n\n/**\n * Discover and load extensions from standard locations.\n */\nexport async function discoverAndLoadExtensions(\n\tconfiguredPaths: string[],\n\tcwd: string,\n\tagentDir: string = getAgentDir(),\n\teventBus?: EventBus,\n): Promise<LoadExtensionsResult> {\n\tconst resolvedCwd = resolvePath(cwd);\n\tconst resolvedAgentDir = resolvePath(agentDir);\n\tconst allPaths: string[] = [];\n\tconst seen = new Set<string>();\n\n\tconst addPaths = (paths: string[]) => {\n\t\tfor (const p of paths) {\n\t\t\tconst resolved = path.resolve(p);\n\t\t\tif (!seen.has(resolved)) {\n\t\t\t\tseen.add(resolved);\n\t\t\t\tallPaths.push(p);\n\t\t\t}\n\t\t}\n\t};\n\n\t// 1. Project-local extensions: cwd/${CONFIG_DIR_NAME}/extensions/\n\tconst localExtDir = path.join(resolvedCwd, CONFIG_DIR_NAME, \"extensions\");\n\taddPaths(discoverExtensionsInDir(localExtDir));\n\n\t// 2. Global extensions: agentDir/extensions/\n\tconst globalExtDir = path.join(resolvedAgentDir, \"extensions\");\n\taddPaths(discoverExtensionsInDir(globalExtDir));\n\n\t// 3. Explicitly configured paths\n\tfor (const p of configuredPaths) {\n\t\tconst resolved = resolvePath(p, resolvedCwd, { normalizeUnicodeSpaces: true });\n\t\tif (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {\n\t\t\t// Check for package.json with pi manifest or index.ts\n\t\t\tconst entries = resolveExtensionEntries(resolved);\n\t\t\tif (entries) {\n\t\t\t\taddPaths(entries);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// No explicit entries - discover individual files in directory\n\t\t\taddPaths(discoverExtensionsInDir(resolved));\n\t\t\tcontinue;\n\t\t}\n\n\t\taddPaths([resolved]);\n\t}\n\n\treturn loadExtensions(allPaths, resolvedCwd, eventBus);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"official-catalog.d.ts","sourceRoot":"","sources":["../../src/core/official-catalog.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Api, Model, ThinkingLevelMap } from \"@ashx-j/lunr-ai\";\nimport { getAgentDir, getPackageDir, VERSION } from \"../config.ts\";\nimport { getPiUserAgent } from \"../utils/pi-user-agent.ts\";\n\n/** Directory on GitHub raw (`providers.json` + `providers/{id}.json`). Override with `LUNR_OFFICIAL_CATALOG_URL`. */\nexport const OFFICIAL_CATALOG_DEFAULT_URL = \"https://raw.githubusercontent.com/ashx-j/lunR/master/catalog\";\nexport const OFFICIAL_CATALOG_TIMEOUT_MS = 4000;\nexport const OFFICIAL_CATALOG_CACHE_FILENAME = \"official-catalog-cache.json\";\n\nconst THINKING_LEVEL_KEYS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nconst META_KEYS = new Set([\"version\", \"updatedAt\", \"generatedAt\", \"sourceCommit\", \"providerCount\", \"modelCount\"]);\n\nexport interface OfficialModelCost {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n}\n\nexport interface OfficialModelEntry {\n\tid: string;\n\tname: string;\n\tapi: Api;\n\tprovider: string;\n\tbaseUrl: string;\n\treasoning: boolean;\n\tinput: (\"text\" | \"image\")[];\n\tcost: OfficialModelCost;\n\tcontextWindow: number;\n\tmaxTokens: number;\n\tcompat?: Model<Api>[\"compat\"];\n\tthinkingLevelMap?: ThinkingLevelMap;\n\theaders?: Record<string, string>;\n}\n\nexport interface OfficialCatalogFile {\n\tversion: number;\n\tupdatedAt: string;\n\tmodels: OfficialModelEntry[];\n}\n\nexport type OfficialCatalogSource = \"github\" | \"cache\" | \"bundled\";\n\nexport interface OfficialCatalogLoadResult {\n\tcatalog: OfficialCatalogFile;\n\tsource: OfficialCatalogSource;\n}\n\n/** Seed shipped in-repo; used when the JSON file cannot be read. */\nexport const BUNDLED_OFFICIAL_CATALOG: OfficialCatalogFile = {\n\tversion: 1,\n\tupdatedAt: \"2026-08-15T00:00:00Z\",\n\tmodels: [\n\t\t{\n\t\t\tid: \"grok-4.6\",\n\t\t\tname: \"Grok 4.6\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"xai\",\n\t\t\tbaseUrl: \"https://api.x.ai/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\", \"image\"],\n\t\t\tcost: { input: 2, output: 6, cacheRead: 0.5, cacheWrite: 0 },\n\t\t\tcontextWindow: 500000,\n\t\t\tmaxTokens: 500000,\n\t\t},\n\t],\n};\n\nexport function officialCatalogCachePath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, OFFICIAL_CATALOG_CACHE_FILENAME);\n}\n\n/** Base URL (no trailing slash). `LUNR_OFFICIAL_CATALOG_URL` overrides the directory, not a single file. */\nexport function officialCatalogBaseUrl(override?: string): string {\n\tconst raw = (override ?? process.env.LUNR_OFFICIAL_CATALOG_URL)?.trim() || OFFICIAL_CATALOG_DEFAULT_URL;\n\treturn raw.replace(/\\/+$/, \"\");\n}\n\n/** @deprecated Use officialCatalogBaseUrl. Kept as an alias for the directory base. */\nexport function officialCatalogUrl(): string {\n\treturn officialCatalogBaseUrl();\n}\n\nexport function officialCatalogUrlFor(path: string, base?: string): string {\n\tconst normalized = path.replace(/^\\/+/, \"\");\n\treturn `${officialCatalogBaseUrl(base)}/${normalized}`;\n}\n\nexport function modelKey(provider: string, id: string): string {\n\treturn `${provider}/${id}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tif (typeof value === \"string\" && value.trim()) {\n\t\tconst parsed = Number(value);\n\t\tif (Number.isFinite(parsed)) return parsed;\n\t}\n\treturn undefined;\n}\n\nfunction parseCost(value: unknown): OfficialModelCost | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst input = asFiniteNumber(value.input);\n\tconst output = asFiniteNumber(value.output);\n\tif (input === undefined || output === undefined) return undefined;\n\treturn {\n\t\tinput,\n\t\toutput,\n\t\tcacheRead: asFiniteNumber(value.cacheRead) ?? 0,\n\t\tcacheWrite: asFiniteNumber(value.cacheWrite) ?? 0,\n\t};\n}\n\nfunction parseInput(value: unknown): (\"text\" | \"image\")[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst input: (\"text\" | \"image\")[] = [];\n\tfor (const entry of value) {\n\t\tif (entry === \"text\" || entry === \"image\") input.push(entry);\n\t}\n\treturn input.length > 0 ? input : undefined;\n}\n\nfunction parseThinkingLevelMap(value: unknown): ThinkingLevelMap | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst map: ThinkingLevelMap = {};\n\tlet any = false;\n\tfor (const level of THINKING_LEVEL_KEYS) {\n\t\tconst mapped = value[level];\n\t\tif (mapped === null || typeof mapped === \"string\") {\n\t\t\tmap[level] = mapped;\n\t\t\tany = true;\n\t\t}\n\t}\n\treturn any ? map : undefined;\n}\n\nfunction parseHeaders(value: unknown): Record<string, string> | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst headers: Record<string, string> = {};\n\tfor (const [name, headerValue] of Object.entries(value)) {\n\t\tif (typeof headerValue === \"string\") headers[name] = headerValue;\n\t}\n\treturn Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction parseOfficialEntry(value: unknown): OfficialModelEntry | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst id = typeof value.id === \"string\" ? value.id.trim() : \"\";\n\tconst provider = typeof value.provider === \"string\" ? value.provider.trim() : \"\";\n\tif (!id || !provider) return undefined;\n\tconst api = typeof value.api === \"string\" && value.api.trim() ? value.api.trim() : \"openai-completions\";\n\tconst name = typeof value.name === \"string\" && value.name.trim() ? value.name.trim() : id;\n\tconst baseUrl = typeof value.baseUrl === \"string\" ? value.baseUrl.trim() : \"\";\n\tconst cost = parseCost(value.cost) ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\tconst input = parseInput(value.input) ?? [\"text\"];\n\tconst compat = isRecord(value.compat) ? (value.compat as Model<Api>[\"compat\"]) : undefined;\n\tconst thinkingLevelMap = parseThinkingLevelMap(value.thinkingLevelMap);\n\tconst headers = parseHeaders(value.headers);\n\treturn {\n\t\tid,\n\t\tname,\n\t\tapi: api as Api,\n\t\tprovider,\n\t\tbaseUrl,\n\t\treasoning: value.reasoning === true,\n\t\tinput,\n\t\tcost,\n\t\tcontextWindow: asFiniteNumber(value.contextWindow) ?? 128000,\n\t\tmaxTokens: asFiniteNumber(value.maxTokens) ?? 8192,\n\t\t...(compat ? { compat } : {}),\n\t\t...(thinkingLevelMap ? { thinkingLevelMap } : {}),\n\t\t...(headers ? { headers } : {}),\n\t};\n}\n\nfunction catalogFile(models: OfficialModelEntry[], value?: Record<string, unknown>): OfficialCatalogFile {\n\tconst version = value ? (asFiniteNumber(value.version) ?? 1) : 1;\n\tconst updatedAt = value && typeof value.updatedAt === \"string\" && value.updatedAt.trim() ? value.updatedAt : \"\";\n\treturn { version, updatedAt, models };\n}\n\nfunction parseKeyedCatalog(value: Record<string, unknown>): OfficialCatalogFile | undefined {\n\tconst models: OfficialModelEntry[] = [];\n\tfor (const [key, entry] of Object.entries(value)) {\n\t\tif (META_KEYS.has(key) || !isRecord(entry)) continue;\n\t\tif (typeof entry.id === \"string\") {\n\t\t\tconst parsed = parseOfficialEntry(entry);\n\t\t\tif (parsed) models.push(parsed);\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const [modelId, model] of Object.entries(entry)) {\n\t\t\tif (!isRecord(model)) continue;\n\t\t\tconst parsed = parseOfficialEntry({\n\t\t\t\t...model,\n\t\t\t\tid: typeof model.id === \"string\" && model.id.trim() ? model.id : modelId,\n\t\t\t\tprovider: typeof model.provider === \"string\" && model.provider.trim() ? model.provider : key,\n\t\t\t});\n\t\t\tif (parsed) models.push(parsed);\n\t\t}\n\t}\n\treturn models.length > 0 ? catalogFile(models, value) : undefined;\n}\n\n/** Parse an official catalog document. Returns undefined on a bad shape (never throws). */\nexport function parseOfficialCatalog(value: unknown): OfficialCatalogFile | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (Array.isArray(value.models)) {\n\t\tconst models: OfficialModelEntry[] = [];\n\t\tfor (const entry of value.models) {\n\t\t\tconst parsed = parseOfficialEntry(entry);\n\t\t\tif (parsed) models.push(parsed);\n\t\t}\n\t\treturn catalogFile(models, value);\n\t}\n\tif (\"models\" in value) return undefined;\n\treturn parseKeyedCatalog(value);\n}\n\nfunction parseProviderIndex(value: unknown): string[] | undefined {\n\tif (!Array.isArray(value) || !value.every((entry) => typeof entry === \"string\")) return undefined;\n\treturn value;\n}\n\nfunction readCatalogFile(path: string): OfficialCatalogFile | undefined {\n\ttry {\n\t\tif (!existsSync(path)) return undefined;\n\t\treturn parseOfficialCatalog(JSON.parse(readFileSync(path, \"utf-8\")));\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction bundledCatalogCandidates(): string[] {\n\tconst here = dirname(fileURLToPath(import.meta.url));\n\tconst packageDir = getPackageDir();\n\treturn [\n\t\tjoin(packageDir, \"dist\", \"catalog\", \"models.json\"),\n\t\tjoin(packageDir, \"..\", \"..\", \"catalog\", \"models.json\"),\n\t\tjoin(here, \"../../../../catalog/models.json\"),\n\t\tjoin(packageDir, \"catalog\", \"models.json\"),\n\t\tjoin(here, \"../catalog/models.json\"),\n\t\tjoin(here, \"models.json\"),\n\t\tjoin(packageDir, \"dist\", \"catalog\", \"official-models.json\"),\n\t\tjoin(packageDir, \"..\", \"..\", \"catalog\", \"official-models.json\"),\n\t\tjoin(here, \"../../../../catalog/official-models.json\"),\n\t\tjoin(here, \"official-models.json\"),\n\t\tjoin(here, \"../catalog/official-models.json\"),\n\t];\n}\n\nexport function loadBundledOfficialCatalog(): OfficialCatalogFile {\n\tfor (const path of bundledCatalogCandidates()) {\n\t\tconst parsed = readCatalogFile(path);\n\t\tif (parsed) return parsed;\n\t}\n\treturn BUNDLED_OFFICIAL_CATALOG;\n}\n\nexport function loadCachedOfficialCatalog(cachePath?: string): OfficialCatalogFile | undefined {\n\tif (!cachePath) return undefined;\n\treturn readCatalogFile(cachePath);\n}\n\nexport function writeOfficialCatalogCache(catalog: OfficialCatalogFile, cachePath: string): void {\n\ttry {\n\t\tmkdirSync(dirname(cachePath), { recursive: true, mode: 0o700 });\n\t\twriteFileSync(cachePath, `${JSON.stringify(catalog, null, 2)}\\n`, \"utf-8\");\n\t} catch {\n\t\t// Cache is best-effort.\n\t}\n}\n\nexport function officialModelsByProvider(catalog: OfficialCatalogFile): Map<string, OfficialModelEntry[]> {\n\tconst byProvider = new Map<string, OfficialModelEntry[]>();\n\tfor (const model of catalog.models) {\n\t\tconst list = byProvider.get(model.provider) ?? [];\n\t\tlist.push(model);\n\t\tbyProvider.set(model.provider, list);\n\t}\n\treturn byProvider;\n}\n\n/** Replace or add per-provider rows. Existing providers not in `replacements` are kept. */\nexport function mergeOfficialCatalogByProvider(\n\tbase: OfficialCatalogFile,\n\treplacements: ReadonlyMap<string, OfficialModelEntry[]>,\n\tupdatedAt?: string,\n): OfficialCatalogFile {\n\tconst byProvider = officialModelsByProvider(base);\n\tfor (const [providerId, models] of replacements) {\n\t\tbyProvider.set(providerId, models);\n\t}\n\treturn {\n\t\tversion: base.version || 1,\n\t\tupdatedAt: updatedAt ?? new Date().toISOString(),\n\t\tmodels: [...byProvider.values()].flat(),\n\t};\n}\n\n/** Bundled as the floor; cache rows win per provider. */\nexport function officialCatalogBase(bundled: OfficialCatalogFile, cachePath?: string): OfficialCatalogFile {\n\tconst cached = loadCachedOfficialCatalog(cachePath);\n\tif (!cached) return bundled;\n\treturn mergeOfficialCatalogByProvider(bundled, officialModelsByProvider(cached), cached.updatedAt);\n}\n\n/** A completed GitHub overlay must not be replaced by cache/bundled. */\nexport function preferOfficialCatalog(\n\tprevious: OfficialCatalogLoadResult | undefined,\n\tnext: OfficialCatalogLoadResult,\n): OfficialCatalogLoadResult {\n\tif (next.source === \"github\") return next;\n\tif (previous?.source === \"github\") return previous;\n\treturn next;\n}\n\nexport function officialModelKeys(catalog: OfficialCatalogFile): Set<string> {\n\treturn new Set(catalog.models.map((model) => modelKey(model.provider, model.id)));\n}\n\nconst ZERO_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\nexport function officialEntryToModel(entry: OfficialModelEntry, template?: Model<Api>): Model<Api> {\n\treturn {\n\t\tid: entry.id,\n\t\tname: entry.name,\n\t\tapi: entry.api || template?.api || \"openai-completions\",\n\t\tprovider: entry.provider,\n\t\tbaseUrl: entry.baseUrl || template?.baseUrl || \"\",\n\t\treasoning: entry.reasoning,\n\t\tinput: entry.input.length > 0 ? entry.input : (template?.input ?? [\"text\"]),\n\t\tcost: entry.cost ?? template?.cost ?? ZERO_COST,\n\t\tcontextWindow: entry.contextWindow,\n\t\tmaxTokens: entry.maxTokens,\n\t\tcompat: entry.compat ?? template?.compat,\n\t\tthinkingLevelMap: entry.thinkingLevelMap ?? template?.thinkingLevelMap,\n\t\theaders: entry.headers ?? template?.headers,\n\t};\n}\n\nexport interface LoadOfficialCatalogOptions {\n\tallowNetwork?: boolean;\n\tcachePath?: string;\n\tbundled?: OfficialCatalogFile;\n\t/** Catalog directory base (not a single-file URL). */\n\turl?: string;\n\ttimeoutMs?: number;\n\tsignal?: AbortSignal;\n\tfetchImpl?: typeof fetch;\n\t/** Stored-credential provider ids. Only these shards are fetched. */\n\tproviderIds?: readonly string[];\n}\n\nfunction fallbackCatalog(bundled: OfficialCatalogFile, cachePath?: string): OfficialCatalogLoadResult {\n\tconst cached = loadCachedOfficialCatalog(cachePath);\n\tif (cached) return { catalog: cached, source: \"cache\" };\n\tif (bundled.models.length > 0) return { catalog: bundled, source: \"bundled\" };\n\treturn { catalog: BUNDLED_OFFICIAL_CATALOG, source: \"bundled\" };\n}\n\nasync function fetchJson(\n\turl: string,\n\toptions: {\n\t\ttimeoutMs: number;\n\t\tsignal?: AbortSignal;\n\t\tfetchImpl: typeof fetch;\n\t\theaders: Record<string, string>;\n\t},\n): Promise<{ ok: true; value: unknown } | { ok: false; status?: number }> {\n\tconst controller = new AbortController();\n\tconst timer = setTimeout(() => controller.abort(), options.timeoutMs);\n\tconst onParentAbort = () => controller.abort();\n\toptions.signal?.addEventListener(\"abort\", onParentAbort, { once: true });\n\tif (options.signal?.aborted) controller.abort();\n\ttry {\n\t\tconst abortError = () => {\n\t\t\tconst error = new Error(\"The operation was aborted\");\n\t\t\terror.name = \"AbortError\";\n\t\t\treturn error;\n\t\t};\n\t\tconst response = await Promise.race([\n\t\t\toptions.fetchImpl(url, {\n\t\t\t\theaders: options.headers,\n\t\t\t\tsignal: controller.signal,\n\t\t\t}),\n\t\t\tnew Promise<never>((_, reject) => {\n\t\t\t\tcontroller.signal.addEventListener(\"abort\", () => reject(abortError()), { once: true });\n\t\t\t\tif (controller.signal.aborted) reject(abortError());\n\t\t\t}),\n\t\t]);\n\t\tif (!response.ok) return { ok: false, status: response.status };\n\t\treturn { ok: true, value: await response.json() };\n\t} catch {\n\t\treturn { ok: false };\n\t} finally {\n\t\tclearTimeout(timer);\n\t\toptions.signal?.removeEventListener(\"abort\", onParentAbort);\n\t}\n}\n\n/**\n * Load the official overlay. Network only when allowNetwork is true.\n * Fetches providers.json, then providers/{id}.json for stored-credential providers.\n * Successful shards replace that provider only; failed shards keep cache/bundled rows.\n * All requested shards failed → cache, then bundled. Never writes a worse cache. Never throws.\n */\nexport async function loadOfficialCatalog(\n\toptions: LoadOfficialCatalogOptions = {},\n): Promise<OfficialCatalogLoadResult> {\n\tconst bundled = options.bundled ?? loadBundledOfficialCatalog();\n\tconst cachePath = options.cachePath;\n\tif (!options.allowNetwork) {\n\t\treturn fallbackCatalog(bundled, cachePath);\n\t}\n\n\tconst timeoutMs = options.timeoutMs ?? OFFICIAL_CATALOG_TIMEOUT_MS;\n\tconst fetchImpl = options.fetchImpl ?? fetch;\n\tconst headers = {\n\t\taccept: \"application/json\",\n\t\t\"User-Agent\": getPiUserAgent(VERSION),\n\t};\n\tconst fetchOptions = { timeoutMs, signal: options.signal, fetchImpl, headers };\n\tconst base = options.url ?? officialCatalogBaseUrl();\n\n\ttry {\n\t\tconst indexResult = await fetchJson(officialCatalogUrlFor(\"providers.json\", base), fetchOptions);\n\t\tif (!indexResult.ok) return fallbackCatalog(bundled, cachePath);\n\t\tconst index = parseProviderIndex(indexResult.value);\n\t\tif (!index) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst wanted = new Set(index);\n\t\tconst requested = options.providerIds ?? [];\n\t\tconst shardIds = requested.filter((providerId) => wanted.has(providerId));\n\t\tif (shardIds.length === 0) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst replacements = new Map<string, OfficialModelEntry[]>();\n\t\tawait Promise.all(\n\t\t\tshardIds.map(async (providerId) => {\n\t\t\t\tconst result = await fetchJson(\n\t\t\t\t\tofficialCatalogUrlFor(`providers/${encodeURIComponent(providerId)}.json`, base),\n\t\t\t\t\tfetchOptions,\n\t\t\t\t);\n\t\t\t\tif (!result.ok) return;\n\t\t\t\tconst parsed = parseOfficialCatalog(result.value);\n\t\t\t\tif (!parsed || parsed.models.length === 0) return;\n\t\t\t\treplacements.set(providerId, parsed.models);\n\t\t\t}),\n\t\t);\n\t\tif (replacements.size === 0) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst catalog = mergeOfficialCatalogByProvider(officialCatalogBase(bundled, cachePath), replacements);\n\t\tif (cachePath) writeOfficialCatalogCache(catalog, cachePath);\n\t\treturn { catalog, source: \"github\" };\n\t} catch {\n\t\treturn fallbackCatalog(bundled, cachePath);\n\t}\n}\n"]}
1
+ {"version":3,"file":"official-catalog.d.ts","sourceRoot":"","sources":["../../src/core/official-catalog.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Api, Model, ThinkingLevelMap } from \"@ashx-j/lunr-ai\";\nimport { getAgentDir, getPackageDir, VERSION } from \"../config.ts\";\nimport { getPiUserAgent } from \"../utils/pi-user-agent.ts\";\n\n/** Directory on GitHub raw (`providers.json` + `providers/{id}.json`). Override with `LUNR_OFFICIAL_CATALOG_URL`. */\nexport const OFFICIAL_CATALOG_DEFAULT_URL = \"https://raw.githubusercontent.com/ashx-j/lunR/master/catalog\";\nexport const OFFICIAL_CATALOG_TIMEOUT_MS = 4000;\nexport const OFFICIAL_CATALOG_CACHE_FILENAME = \"official-catalog-cache.json\";\n\nconst THINKING_LEVEL_KEYS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nconst META_KEYS = new Set([\"version\", \"updatedAt\", \"generatedAt\", \"sourceCommit\", \"providerCount\", \"modelCount\"]);\n\nexport interface OfficialModelCost {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n}\n\nexport interface OfficialModelEntry {\n\tid: string;\n\tname: string;\n\tapi: Api;\n\tprovider: string;\n\tbaseUrl: string;\n\treasoning: boolean;\n\tinput: (\"text\" | \"image\")[];\n\tcost: OfficialModelCost;\n\tcontextWindow: number;\n\tmaxTokens: number;\n\tcompat?: Model<Api>[\"compat\"];\n\tthinkingLevelMap?: ThinkingLevelMap;\n\theaders?: Record<string, string>;\n}\n\nexport interface OfficialCatalogFile {\n\tversion: number;\n\tupdatedAt: string;\n\tmodels: OfficialModelEntry[];\n}\n\nexport type OfficialCatalogSource = \"github\" | \"cache\" | \"bundled\";\n\nexport interface OfficialCatalogLoadResult {\n\tcatalog: OfficialCatalogFile;\n\tsource: OfficialCatalogSource;\n}\n\n/** Seed shipped in-repo; used when the JSON file cannot be read. */\nexport const BUNDLED_OFFICIAL_CATALOG: OfficialCatalogFile = {\n\tversion: 1,\n\tupdatedAt: \"2026-08-15T00:00:00Z\",\n\tmodels: [\n\t\t{\n\t\t\tid: \"grok-4.6\",\n\t\t\tname: \"Grok 4.6\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"xai\",\n\t\t\tbaseUrl: \"https://api.x.ai/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\", \"image\"],\n\t\t\tcost: { input: 2, output: 6, cacheRead: 0.5, cacheWrite: 0 },\n\t\t\tcontextWindow: 500000,\n\t\t\tmaxTokens: 500000,\n\t\t},\n\t],\n};\n\nexport function officialCatalogCachePath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, OFFICIAL_CATALOG_CACHE_FILENAME);\n}\n\n/** Base URL (no trailing slash). `LUNR_OFFICIAL_CATALOG_URL` overrides the directory, not a single file. */\nexport function officialCatalogBaseUrl(override?: string): string {\n\tconst raw = (override ?? process.env.LUNR_OFFICIAL_CATALOG_URL)?.trim() || OFFICIAL_CATALOG_DEFAULT_URL;\n\treturn raw.replace(/\\/+$/, \"\");\n}\n\n/** @deprecated Use officialCatalogBaseUrl. Kept as an alias for the directory base. */\nexport function officialCatalogUrl(): string {\n\treturn officialCatalogBaseUrl();\n}\n\nexport function officialCatalogUrlFor(path: string, base?: string): string {\n\tconst normalized = path.replace(/^\\/+/, \"\");\n\treturn `${officialCatalogBaseUrl(base)}/${normalized}`;\n}\n\nexport function modelKey(provider: string, id: string): string {\n\treturn `${provider}/${id}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tif (typeof value === \"string\" && value.trim()) {\n\t\tconst parsed = Number(value);\n\t\tif (Number.isFinite(parsed)) return parsed;\n\t}\n\treturn undefined;\n}\n\nfunction parseCost(value: unknown): OfficialModelCost | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst input = asFiniteNumber(value.input);\n\tconst output = asFiniteNumber(value.output);\n\tif (input === undefined || output === undefined) return undefined;\n\treturn {\n\t\tinput,\n\t\toutput,\n\t\tcacheRead: asFiniteNumber(value.cacheRead) ?? 0,\n\t\tcacheWrite: asFiniteNumber(value.cacheWrite) ?? 0,\n\t};\n}\n\nfunction parseInput(value: unknown): (\"text\" | \"image\")[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst input: (\"text\" | \"image\")[] = [];\n\tfor (const entry of value) {\n\t\tif (entry === \"text\" || entry === \"image\") input.push(entry);\n\t}\n\treturn input.length > 0 ? input : undefined;\n}\n\nfunction parseThinkingLevelMap(value: unknown): ThinkingLevelMap | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst map: ThinkingLevelMap = {};\n\tlet any = false;\n\tfor (const level of THINKING_LEVEL_KEYS) {\n\t\tconst mapped = value[level];\n\t\tif (mapped === null || typeof mapped === \"string\") {\n\t\t\tmap[level] = mapped;\n\t\t\tany = true;\n\t\t}\n\t}\n\treturn any ? map : undefined;\n}\n\nfunction parseHeaders(value: unknown): Record<string, string> | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst headers: Record<string, string> = {};\n\tfor (const [name, headerValue] of Object.entries(value)) {\n\t\tif (typeof headerValue === \"string\") headers[name] = headerValue;\n\t}\n\treturn Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction parseOfficialEntry(value: unknown): OfficialModelEntry | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst id = typeof value.id === \"string\" ? value.id.trim() : \"\";\n\tconst provider = typeof value.provider === \"string\" ? value.provider.trim() : \"\";\n\tif (!id || !provider) return undefined;\n\tconst api = typeof value.api === \"string\" && value.api.trim() ? value.api.trim() : \"openai-completions\";\n\tconst name = typeof value.name === \"string\" && value.name.trim() ? value.name.trim() : id;\n\tconst baseUrl = typeof value.baseUrl === \"string\" ? value.baseUrl.trim() : \"\";\n\tconst cost = parseCost(value.cost) ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\tconst input = parseInput(value.input) ?? [\"text\"];\n\tconst compat = isRecord(value.compat) ? (value.compat as Model<Api>[\"compat\"]) : undefined;\n\tconst thinkingLevelMap = parseThinkingLevelMap(value.thinkingLevelMap);\n\tconst headers = parseHeaders(value.headers);\n\treturn {\n\t\tid,\n\t\tname,\n\t\tapi: api as Api,\n\t\tprovider,\n\t\tbaseUrl,\n\t\treasoning: value.reasoning === true,\n\t\tinput,\n\t\tcost,\n\t\tcontextWindow: asFiniteNumber(value.contextWindow) ?? 128000,\n\t\tmaxTokens: asFiniteNumber(value.maxTokens) ?? 8192,\n\t\t...(compat ? { compat } : {}),\n\t\t...(thinkingLevelMap ? { thinkingLevelMap } : {}),\n\t\t...(headers ? { headers } : {}),\n\t};\n}\n\nfunction catalogFile(models: OfficialModelEntry[], value?: Record<string, unknown>): OfficialCatalogFile {\n\tconst version = value ? (asFiniteNumber(value.version) ?? 1) : 1;\n\tconst updatedAt = value && typeof value.updatedAt === \"string\" && value.updatedAt.trim() ? value.updatedAt : \"\";\n\treturn { version, updatedAt, models };\n}\n\nfunction parseKeyedCatalog(value: Record<string, unknown>): OfficialCatalogFile | undefined {\n\tconst models: OfficialModelEntry[] = [];\n\tfor (const [key, entry] of Object.entries(value)) {\n\t\tif (META_KEYS.has(key) || !isRecord(entry)) continue;\n\t\tif (typeof entry.id === \"string\") {\n\t\t\tconst parsed = parseOfficialEntry(entry);\n\t\t\tif (parsed) models.push(parsed);\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const [modelId, model] of Object.entries(entry)) {\n\t\t\tif (!isRecord(model)) continue;\n\t\t\tconst parsed = parseOfficialEntry({\n\t\t\t\t...model,\n\t\t\t\tid: typeof model.id === \"string\" && model.id.trim() ? model.id : modelId,\n\t\t\t\tprovider: typeof model.provider === \"string\" && model.provider.trim() ? model.provider : key,\n\t\t\t});\n\t\t\tif (parsed) models.push(parsed);\n\t\t}\n\t}\n\treturn models.length > 0 ? catalogFile(models, value) : undefined;\n}\n\n/** Parse an official catalog document. Returns undefined on a bad shape (never throws). */\nexport function parseOfficialCatalog(value: unknown): OfficialCatalogFile | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (Array.isArray(value.models)) {\n\t\tconst models: OfficialModelEntry[] = [];\n\t\tfor (const entry of value.models) {\n\t\t\tconst parsed = parseOfficialEntry(entry);\n\t\t\tif (parsed) models.push(parsed);\n\t\t}\n\t\treturn catalogFile(models, value);\n\t}\n\tif (\"models\" in value) return undefined;\n\treturn parseKeyedCatalog(value);\n}\n\nfunction parseProviderIndex(value: unknown): string[] | undefined {\n\tif (!Array.isArray(value) || !value.every((entry) => typeof entry === \"string\")) return undefined;\n\treturn value;\n}\n\nfunction readCatalogFile(path: string): OfficialCatalogFile | undefined {\n\ttry {\n\t\tif (!existsSync(path)) return undefined;\n\t\treturn parseOfficialCatalog(JSON.parse(readFileSync(path, \"utf-8\")));\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction bundledCatalogCandidates(): string[] {\n\tconst here = dirname(fileURLToPath(import.meta.url));\n\tconst packageDir = getPackageDir();\n\treturn [\n\t\tjoin(packageDir, \"dist\", \"catalog\", \"models.json\"),\n\t\tjoin(packageDir, \"..\", \"..\", \"catalog\", \"models.json\"),\n\t\tjoin(here, \"../../../../catalog/models.json\"),\n\t\tjoin(packageDir, \"catalog\", \"models.json\"),\n\t\tjoin(here, \"../catalog/models.json\"),\n\t\tjoin(here, \"models.json\"),\n\t\tjoin(packageDir, \"dist\", \"catalog\", \"official-models.json\"),\n\t\tjoin(packageDir, \"..\", \"..\", \"catalog\", \"official-models.json\"),\n\t\tjoin(here, \"../../../../catalog/official-models.json\"),\n\t\tjoin(here, \"official-models.json\"),\n\t\tjoin(here, \"../catalog/official-models.json\"),\n\t];\n}\n\nexport function loadBundledOfficialCatalog(): OfficialCatalogFile {\n\tfor (const path of bundledCatalogCandidates()) {\n\t\tconst parsed = readCatalogFile(path);\n\t\tif (parsed) return parsed;\n\t}\n\treturn BUNDLED_OFFICIAL_CATALOG;\n}\n\nexport function loadCachedOfficialCatalog(cachePath?: string): OfficialCatalogFile | undefined {\n\tif (!cachePath) return undefined;\n\treturn readCatalogFile(cachePath);\n}\n\nexport function writeOfficialCatalogCache(catalog: OfficialCatalogFile, cachePath: string): void {\n\ttry {\n\t\tmkdirSync(dirname(cachePath), { recursive: true, mode: 0o700 });\n\t\twriteFileSync(cachePath, `${JSON.stringify(catalog, null, 2)}\\n`, \"utf-8\");\n\t} catch {\n\t\t// Cache is best-effort.\n\t}\n}\n\nexport function officialModelsByProvider(catalog: OfficialCatalogFile): Map<string, OfficialModelEntry[]> {\n\tconst byProvider = new Map<string, OfficialModelEntry[]>();\n\tfor (const model of catalog.models) {\n\t\tconst list = byProvider.get(model.provider) ?? [];\n\t\tlist.push(model);\n\t\tbyProvider.set(model.provider, list);\n\t}\n\treturn byProvider;\n}\n\n/** Replace or add per-provider rows. Existing providers not in `replacements` are kept. */\nexport function mergeOfficialCatalogByProvider(\n\tbase: OfficialCatalogFile,\n\treplacements: ReadonlyMap<string, OfficialModelEntry[]>,\n\tupdatedAt?: string,\n): OfficialCatalogFile {\n\tconst byProvider = officialModelsByProvider(base);\n\tfor (const [providerId, models] of replacements) {\n\t\tbyProvider.set(providerId, models);\n\t}\n\treturn {\n\t\tversion: base.version || 1,\n\t\tupdatedAt: updatedAt ?? new Date().toISOString(),\n\t\tmodels: [...byProvider.values()].flat(),\n\t};\n}\n\n/** Bundled as the floor; cache rows win per provider. */\nexport function officialCatalogBase(bundled: OfficialCatalogFile, cachePath?: string): OfficialCatalogFile {\n\tconst cached = loadCachedOfficialCatalog(cachePath);\n\tif (!cached) return bundled;\n\treturn mergeOfficialCatalogByProvider(bundled, officialModelsByProvider(cached), cached.updatedAt);\n}\n\n/** A completed GitHub overlay must not be replaced by cache/bundled. */\nexport function preferOfficialCatalog(\n\tprevious: OfficialCatalogLoadResult | undefined,\n\tnext: OfficialCatalogLoadResult,\n): OfficialCatalogLoadResult {\n\tif (next.source === \"github\") return next;\n\tif (previous?.source === \"github\") return previous;\n\treturn next;\n}\n\nexport function officialModelKeys(catalog: OfficialCatalogFile): Set<string> {\n\treturn new Set(catalog.models.map((model) => modelKey(model.provider, model.id)));\n}\n\nconst ZERO_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\nexport function officialEntryToModel(entry: OfficialModelEntry, template?: Model<Api>): Model<Api> {\n\treturn {\n\t\tid: entry.id,\n\t\tname: entry.name,\n\t\tapi: entry.api || template?.api || \"openai-completions\",\n\t\tprovider: entry.provider,\n\t\tbaseUrl: entry.baseUrl || template?.baseUrl || \"\",\n\t\treasoning: entry.reasoning,\n\t\tinput: entry.input.length > 0 ? entry.input : (template?.input ?? [\"text\"]),\n\t\tcost: entry.cost ?? template?.cost ?? ZERO_COST,\n\t\tcontextWindow: entry.contextWindow,\n\t\tmaxTokens: entry.maxTokens,\n\t\tcompat: entry.compat ?? template?.compat,\n\t\tthinkingLevelMap: entry.thinkingLevelMap ?? template?.thinkingLevelMap,\n\t\theaders: entry.headers ?? template?.headers,\n\t};\n}\n\nexport interface LoadOfficialCatalogOptions {\n\tallowNetwork?: boolean;\n\tcachePath?: string;\n\tbundled?: OfficialCatalogFile;\n\t/** Catalog directory base (not a single-file URL). */\n\turl?: string;\n\ttimeoutMs?: number;\n\tsignal?: AbortSignal;\n\tfetchImpl?: typeof fetch;\n\t/** Stored-credential provider ids. Only these shards are fetched. */\n\tproviderIds?: readonly string[];\n}\n\nfunction resolveBundledCatalog(bundled?: OfficialCatalogFile): OfficialCatalogFile {\n\tif (bundled) return bundled;\n\treturn loadBundledOfficialCatalog();\n}\n\nfunction fallbackCatalog(bundled: OfficialCatalogFile | undefined, cachePath?: string): OfficialCatalogLoadResult {\n\tconst cached = loadCachedOfficialCatalog(cachePath);\n\tif (cached) return { catalog: cached, source: \"cache\" };\n\tconst resolved = resolveBundledCatalog(bundled);\n\tif (resolved.models.length > 0) return { catalog: resolved, source: \"bundled\" };\n\treturn { catalog: BUNDLED_OFFICIAL_CATALOG, source: \"bundled\" };\n}\n\nasync function fetchJson(\n\turl: string,\n\toptions: {\n\t\ttimeoutMs: number;\n\t\tsignal?: AbortSignal;\n\t\tfetchImpl: typeof fetch;\n\t\theaders: Record<string, string>;\n\t},\n): Promise<{ ok: true; value: unknown } | { ok: false; status?: number }> {\n\tconst controller = new AbortController();\n\tconst timer = setTimeout(() => controller.abort(), options.timeoutMs);\n\tconst onParentAbort = () => controller.abort();\n\toptions.signal?.addEventListener(\"abort\", onParentAbort, { once: true });\n\tif (options.signal?.aborted) controller.abort();\n\ttry {\n\t\tconst abortError = () => {\n\t\t\tconst error = new Error(\"The operation was aborted\");\n\t\t\terror.name = \"AbortError\";\n\t\t\treturn error;\n\t\t};\n\t\tconst response = await Promise.race([\n\t\t\toptions.fetchImpl(url, {\n\t\t\t\theaders: options.headers,\n\t\t\t\tsignal: controller.signal,\n\t\t\t}),\n\t\t\tnew Promise<never>((_, reject) => {\n\t\t\t\tcontroller.signal.addEventListener(\"abort\", () => reject(abortError()), { once: true });\n\t\t\t\tif (controller.signal.aborted) reject(abortError());\n\t\t\t}),\n\t\t]);\n\t\tif (!response.ok) return { ok: false, status: response.status };\n\t\treturn { ok: true, value: await response.json() };\n\t} catch {\n\t\treturn { ok: false };\n\t} finally {\n\t\tclearTimeout(timer);\n\t\toptions.signal?.removeEventListener(\"abort\", onParentAbort);\n\t}\n}\n\n/**\n * Load the official overlay. Network only when allowNetwork is true.\n * Fetches providers.json, then providers/{id}.json for stored-credential providers.\n * Successful shards replace that provider only; failed shards keep cache/bundled rows.\n * All requested shards failed → cache, then bundled. Never writes a worse cache. Never throws.\n */\nexport async function loadOfficialCatalog(\n\toptions: LoadOfficialCatalogOptions = {},\n): Promise<OfficialCatalogLoadResult> {\n\tconst cachePath = options.cachePath;\n\t// Cache-only: prefer the on-disk cache and skip parsing bundled models.json.\n\tif (!options.allowNetwork) {\n\t\treturn fallbackCatalog(options.bundled, cachePath);\n\t}\n\n\tconst bundled = resolveBundledCatalog(options.bundled);\n\tconst timeoutMs = options.timeoutMs ?? OFFICIAL_CATALOG_TIMEOUT_MS;\n\tconst fetchImpl = options.fetchImpl ?? fetch;\n\tconst headers = {\n\t\taccept: \"application/json\",\n\t\t\"User-Agent\": getPiUserAgent(VERSION),\n\t};\n\tconst fetchOptions = { timeoutMs, signal: options.signal, fetchImpl, headers };\n\tconst base = options.url ?? officialCatalogBaseUrl();\n\n\ttry {\n\t\tconst indexResult = await fetchJson(officialCatalogUrlFor(\"providers.json\", base), fetchOptions);\n\t\tif (!indexResult.ok) return fallbackCatalog(bundled, cachePath);\n\t\tconst index = parseProviderIndex(indexResult.value);\n\t\tif (!index) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst wanted = new Set(index);\n\t\tconst requested = options.providerIds ?? [];\n\t\tconst shardIds = requested.filter((providerId) => wanted.has(providerId));\n\t\tif (shardIds.length === 0) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst replacements = new Map<string, OfficialModelEntry[]>();\n\t\tawait Promise.all(\n\t\t\tshardIds.map(async (providerId) => {\n\t\t\t\tconst result = await fetchJson(\n\t\t\t\t\tofficialCatalogUrlFor(`providers/${encodeURIComponent(providerId)}.json`, base),\n\t\t\t\t\tfetchOptions,\n\t\t\t\t);\n\t\t\t\tif (!result.ok) return;\n\t\t\t\tconst parsed = parseOfficialCatalog(result.value);\n\t\t\t\tif (!parsed || parsed.models.length === 0) return;\n\t\t\t\treplacements.set(providerId, parsed.models);\n\t\t\t}),\n\t\t);\n\t\tif (replacements.size === 0) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst catalog = mergeOfficialCatalogByProvider(officialCatalogBase(bundled, cachePath), replacements);\n\t\tif (cachePath) writeOfficialCatalogCache(catalog, cachePath);\n\t\treturn { catalog, source: \"github\" };\n\t} catch {\n\t\treturn fallbackCatalog(bundled, cachePath);\n\t}\n}\n"]}
@@ -297,12 +297,18 @@ export function officialEntryToModel(entry, template) {
297
297
  headers: entry.headers ?? template?.headers,
298
298
  };
299
299
  }
300
+ function resolveBundledCatalog(bundled) {
301
+ if (bundled)
302
+ return bundled;
303
+ return loadBundledOfficialCatalog();
304
+ }
300
305
  function fallbackCatalog(bundled, cachePath) {
301
306
  const cached = loadCachedOfficialCatalog(cachePath);
302
307
  if (cached)
303
308
  return { catalog: cached, source: "cache" };
304
- if (bundled.models.length > 0)
305
- return { catalog: bundled, source: "bundled" };
309
+ const resolved = resolveBundledCatalog(bundled);
310
+ if (resolved.models.length > 0)
311
+ return { catalog: resolved, source: "bundled" };
306
312
  return { catalog: BUNDLED_OFFICIAL_CATALOG, source: "bundled" };
307
313
  }
308
314
  async function fetchJson(url, options) {
@@ -348,11 +354,12 @@ async function fetchJson(url, options) {
348
354
  * All requested shards failed → cache, then bundled. Never writes a worse cache. Never throws.
349
355
  */
350
356
  export async function loadOfficialCatalog(options = {}) {
351
- const bundled = options.bundled ?? loadBundledOfficialCatalog();
352
357
  const cachePath = options.cachePath;
358
+ // Cache-only: prefer the on-disk cache and skip parsing bundled models.json.
353
359
  if (!options.allowNetwork) {
354
- return fallbackCatalog(bundled, cachePath);
360
+ return fallbackCatalog(options.bundled, cachePath);
355
361
  }
362
+ const bundled = resolveBundledCatalog(options.bundled);
356
363
  const timeoutMs = options.timeoutMs ?? OFFICIAL_CATALOG_TIMEOUT_MS;
357
364
  const fetchImpl = options.fetchImpl ?? fetch;
358
365
  const headers = {
@@ -1 +1 @@
1
- {"version":3,"file":"official-catalog.js","sourceRoot":"","sources":["../../src/core/official-catalog.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Api, Model, ThinkingLevelMap } from \"@ashx-j/lunr-ai\";\nimport { getAgentDir, getPackageDir, VERSION } from \"../config.ts\";\nimport { getPiUserAgent } from \"../utils/pi-user-agent.ts\";\n\n/** Directory on GitHub raw (`providers.json` + `providers/{id}.json`). Override with `LUNR_OFFICIAL_CATALOG_URL`. */\nexport const OFFICIAL_CATALOG_DEFAULT_URL = \"https://raw.githubusercontent.com/ashx-j/lunR/master/catalog\";\nexport const OFFICIAL_CATALOG_TIMEOUT_MS = 4000;\nexport const OFFICIAL_CATALOG_CACHE_FILENAME = \"official-catalog-cache.json\";\n\nconst THINKING_LEVEL_KEYS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nconst META_KEYS = new Set([\"version\", \"updatedAt\", \"generatedAt\", \"sourceCommit\", \"providerCount\", \"modelCount\"]);\n\nexport interface OfficialModelCost {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n}\n\nexport interface OfficialModelEntry {\n\tid: string;\n\tname: string;\n\tapi: Api;\n\tprovider: string;\n\tbaseUrl: string;\n\treasoning: boolean;\n\tinput: (\"text\" | \"image\")[];\n\tcost: OfficialModelCost;\n\tcontextWindow: number;\n\tmaxTokens: number;\n\tcompat?: Model<Api>[\"compat\"];\n\tthinkingLevelMap?: ThinkingLevelMap;\n\theaders?: Record<string, string>;\n}\n\nexport interface OfficialCatalogFile {\n\tversion: number;\n\tupdatedAt: string;\n\tmodels: OfficialModelEntry[];\n}\n\nexport type OfficialCatalogSource = \"github\" | \"cache\" | \"bundled\";\n\nexport interface OfficialCatalogLoadResult {\n\tcatalog: OfficialCatalogFile;\n\tsource: OfficialCatalogSource;\n}\n\n/** Seed shipped in-repo; used when the JSON file cannot be read. */\nexport const BUNDLED_OFFICIAL_CATALOG: OfficialCatalogFile = {\n\tversion: 1,\n\tupdatedAt: \"2026-08-15T00:00:00Z\",\n\tmodels: [\n\t\t{\n\t\t\tid: \"grok-4.6\",\n\t\t\tname: \"Grok 4.6\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"xai\",\n\t\t\tbaseUrl: \"https://api.x.ai/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\", \"image\"],\n\t\t\tcost: { input: 2, output: 6, cacheRead: 0.5, cacheWrite: 0 },\n\t\t\tcontextWindow: 500000,\n\t\t\tmaxTokens: 500000,\n\t\t},\n\t],\n};\n\nexport function officialCatalogCachePath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, OFFICIAL_CATALOG_CACHE_FILENAME);\n}\n\n/** Base URL (no trailing slash). `LUNR_OFFICIAL_CATALOG_URL` overrides the directory, not a single file. */\nexport function officialCatalogBaseUrl(override?: string): string {\n\tconst raw = (override ?? process.env.LUNR_OFFICIAL_CATALOG_URL)?.trim() || OFFICIAL_CATALOG_DEFAULT_URL;\n\treturn raw.replace(/\\/+$/, \"\");\n}\n\n/** @deprecated Use officialCatalogBaseUrl. Kept as an alias for the directory base. */\nexport function officialCatalogUrl(): string {\n\treturn officialCatalogBaseUrl();\n}\n\nexport function officialCatalogUrlFor(path: string, base?: string): string {\n\tconst normalized = path.replace(/^\\/+/, \"\");\n\treturn `${officialCatalogBaseUrl(base)}/${normalized}`;\n}\n\nexport function modelKey(provider: string, id: string): string {\n\treturn `${provider}/${id}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tif (typeof value === \"string\" && value.trim()) {\n\t\tconst parsed = Number(value);\n\t\tif (Number.isFinite(parsed)) return parsed;\n\t}\n\treturn undefined;\n}\n\nfunction parseCost(value: unknown): OfficialModelCost | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst input = asFiniteNumber(value.input);\n\tconst output = asFiniteNumber(value.output);\n\tif (input === undefined || output === undefined) return undefined;\n\treturn {\n\t\tinput,\n\t\toutput,\n\t\tcacheRead: asFiniteNumber(value.cacheRead) ?? 0,\n\t\tcacheWrite: asFiniteNumber(value.cacheWrite) ?? 0,\n\t};\n}\n\nfunction parseInput(value: unknown): (\"text\" | \"image\")[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst input: (\"text\" | \"image\")[] = [];\n\tfor (const entry of value) {\n\t\tif (entry === \"text\" || entry === \"image\") input.push(entry);\n\t}\n\treturn input.length > 0 ? input : undefined;\n}\n\nfunction parseThinkingLevelMap(value: unknown): ThinkingLevelMap | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst map: ThinkingLevelMap = {};\n\tlet any = false;\n\tfor (const level of THINKING_LEVEL_KEYS) {\n\t\tconst mapped = value[level];\n\t\tif (mapped === null || typeof mapped === \"string\") {\n\t\t\tmap[level] = mapped;\n\t\t\tany = true;\n\t\t}\n\t}\n\treturn any ? map : undefined;\n}\n\nfunction parseHeaders(value: unknown): Record<string, string> | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst headers: Record<string, string> = {};\n\tfor (const [name, headerValue] of Object.entries(value)) {\n\t\tif (typeof headerValue === \"string\") headers[name] = headerValue;\n\t}\n\treturn Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction parseOfficialEntry(value: unknown): OfficialModelEntry | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst id = typeof value.id === \"string\" ? value.id.trim() : \"\";\n\tconst provider = typeof value.provider === \"string\" ? value.provider.trim() : \"\";\n\tif (!id || !provider) return undefined;\n\tconst api = typeof value.api === \"string\" && value.api.trim() ? value.api.trim() : \"openai-completions\";\n\tconst name = typeof value.name === \"string\" && value.name.trim() ? value.name.trim() : id;\n\tconst baseUrl = typeof value.baseUrl === \"string\" ? value.baseUrl.trim() : \"\";\n\tconst cost = parseCost(value.cost) ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\tconst input = parseInput(value.input) ?? [\"text\"];\n\tconst compat = isRecord(value.compat) ? (value.compat as Model<Api>[\"compat\"]) : undefined;\n\tconst thinkingLevelMap = parseThinkingLevelMap(value.thinkingLevelMap);\n\tconst headers = parseHeaders(value.headers);\n\treturn {\n\t\tid,\n\t\tname,\n\t\tapi: api as Api,\n\t\tprovider,\n\t\tbaseUrl,\n\t\treasoning: value.reasoning === true,\n\t\tinput,\n\t\tcost,\n\t\tcontextWindow: asFiniteNumber(value.contextWindow) ?? 128000,\n\t\tmaxTokens: asFiniteNumber(value.maxTokens) ?? 8192,\n\t\t...(compat ? { compat } : {}),\n\t\t...(thinkingLevelMap ? { thinkingLevelMap } : {}),\n\t\t...(headers ? { headers } : {}),\n\t};\n}\n\nfunction catalogFile(models: OfficialModelEntry[], value?: Record<string, unknown>): OfficialCatalogFile {\n\tconst version = value ? (asFiniteNumber(value.version) ?? 1) : 1;\n\tconst updatedAt = value && typeof value.updatedAt === \"string\" && value.updatedAt.trim() ? value.updatedAt : \"\";\n\treturn { version, updatedAt, models };\n}\n\nfunction parseKeyedCatalog(value: Record<string, unknown>): OfficialCatalogFile | undefined {\n\tconst models: OfficialModelEntry[] = [];\n\tfor (const [key, entry] of Object.entries(value)) {\n\t\tif (META_KEYS.has(key) || !isRecord(entry)) continue;\n\t\tif (typeof entry.id === \"string\") {\n\t\t\tconst parsed = parseOfficialEntry(entry);\n\t\t\tif (parsed) models.push(parsed);\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const [modelId, model] of Object.entries(entry)) {\n\t\t\tif (!isRecord(model)) continue;\n\t\t\tconst parsed = parseOfficialEntry({\n\t\t\t\t...model,\n\t\t\t\tid: typeof model.id === \"string\" && model.id.trim() ? model.id : modelId,\n\t\t\t\tprovider: typeof model.provider === \"string\" && model.provider.trim() ? model.provider : key,\n\t\t\t});\n\t\t\tif (parsed) models.push(parsed);\n\t\t}\n\t}\n\treturn models.length > 0 ? catalogFile(models, value) : undefined;\n}\n\n/** Parse an official catalog document. Returns undefined on a bad shape (never throws). */\nexport function parseOfficialCatalog(value: unknown): OfficialCatalogFile | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (Array.isArray(value.models)) {\n\t\tconst models: OfficialModelEntry[] = [];\n\t\tfor (const entry of value.models) {\n\t\t\tconst parsed = parseOfficialEntry(entry);\n\t\t\tif (parsed) models.push(parsed);\n\t\t}\n\t\treturn catalogFile(models, value);\n\t}\n\tif (\"models\" in value) return undefined;\n\treturn parseKeyedCatalog(value);\n}\n\nfunction parseProviderIndex(value: unknown): string[] | undefined {\n\tif (!Array.isArray(value) || !value.every((entry) => typeof entry === \"string\")) return undefined;\n\treturn value;\n}\n\nfunction readCatalogFile(path: string): OfficialCatalogFile | undefined {\n\ttry {\n\t\tif (!existsSync(path)) return undefined;\n\t\treturn parseOfficialCatalog(JSON.parse(readFileSync(path, \"utf-8\")));\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction bundledCatalogCandidates(): string[] {\n\tconst here = dirname(fileURLToPath(import.meta.url));\n\tconst packageDir = getPackageDir();\n\treturn [\n\t\tjoin(packageDir, \"dist\", \"catalog\", \"models.json\"),\n\t\tjoin(packageDir, \"..\", \"..\", \"catalog\", \"models.json\"),\n\t\tjoin(here, \"../../../../catalog/models.json\"),\n\t\tjoin(packageDir, \"catalog\", \"models.json\"),\n\t\tjoin(here, \"../catalog/models.json\"),\n\t\tjoin(here, \"models.json\"),\n\t\tjoin(packageDir, \"dist\", \"catalog\", \"official-models.json\"),\n\t\tjoin(packageDir, \"..\", \"..\", \"catalog\", \"official-models.json\"),\n\t\tjoin(here, \"../../../../catalog/official-models.json\"),\n\t\tjoin(here, \"official-models.json\"),\n\t\tjoin(here, \"../catalog/official-models.json\"),\n\t];\n}\n\nexport function loadBundledOfficialCatalog(): OfficialCatalogFile {\n\tfor (const path of bundledCatalogCandidates()) {\n\t\tconst parsed = readCatalogFile(path);\n\t\tif (parsed) return parsed;\n\t}\n\treturn BUNDLED_OFFICIAL_CATALOG;\n}\n\nexport function loadCachedOfficialCatalog(cachePath?: string): OfficialCatalogFile | undefined {\n\tif (!cachePath) return undefined;\n\treturn readCatalogFile(cachePath);\n}\n\nexport function writeOfficialCatalogCache(catalog: OfficialCatalogFile, cachePath: string): void {\n\ttry {\n\t\tmkdirSync(dirname(cachePath), { recursive: true, mode: 0o700 });\n\t\twriteFileSync(cachePath, `${JSON.stringify(catalog, null, 2)}\\n`, \"utf-8\");\n\t} catch {\n\t\t// Cache is best-effort.\n\t}\n}\n\nexport function officialModelsByProvider(catalog: OfficialCatalogFile): Map<string, OfficialModelEntry[]> {\n\tconst byProvider = new Map<string, OfficialModelEntry[]>();\n\tfor (const model of catalog.models) {\n\t\tconst list = byProvider.get(model.provider) ?? [];\n\t\tlist.push(model);\n\t\tbyProvider.set(model.provider, list);\n\t}\n\treturn byProvider;\n}\n\n/** Replace or add per-provider rows. Existing providers not in `replacements` are kept. */\nexport function mergeOfficialCatalogByProvider(\n\tbase: OfficialCatalogFile,\n\treplacements: ReadonlyMap<string, OfficialModelEntry[]>,\n\tupdatedAt?: string,\n): OfficialCatalogFile {\n\tconst byProvider = officialModelsByProvider(base);\n\tfor (const [providerId, models] of replacements) {\n\t\tbyProvider.set(providerId, models);\n\t}\n\treturn {\n\t\tversion: base.version || 1,\n\t\tupdatedAt: updatedAt ?? new Date().toISOString(),\n\t\tmodels: [...byProvider.values()].flat(),\n\t};\n}\n\n/** Bundled as the floor; cache rows win per provider. */\nexport function officialCatalogBase(bundled: OfficialCatalogFile, cachePath?: string): OfficialCatalogFile {\n\tconst cached = loadCachedOfficialCatalog(cachePath);\n\tif (!cached) return bundled;\n\treturn mergeOfficialCatalogByProvider(bundled, officialModelsByProvider(cached), cached.updatedAt);\n}\n\n/** A completed GitHub overlay must not be replaced by cache/bundled. */\nexport function preferOfficialCatalog(\n\tprevious: OfficialCatalogLoadResult | undefined,\n\tnext: OfficialCatalogLoadResult,\n): OfficialCatalogLoadResult {\n\tif (next.source === \"github\") return next;\n\tif (previous?.source === \"github\") return previous;\n\treturn next;\n}\n\nexport function officialModelKeys(catalog: OfficialCatalogFile): Set<string> {\n\treturn new Set(catalog.models.map((model) => modelKey(model.provider, model.id)));\n}\n\nconst ZERO_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\nexport function officialEntryToModel(entry: OfficialModelEntry, template?: Model<Api>): Model<Api> {\n\treturn {\n\t\tid: entry.id,\n\t\tname: entry.name,\n\t\tapi: entry.api || template?.api || \"openai-completions\",\n\t\tprovider: entry.provider,\n\t\tbaseUrl: entry.baseUrl || template?.baseUrl || \"\",\n\t\treasoning: entry.reasoning,\n\t\tinput: entry.input.length > 0 ? entry.input : (template?.input ?? [\"text\"]),\n\t\tcost: entry.cost ?? template?.cost ?? ZERO_COST,\n\t\tcontextWindow: entry.contextWindow,\n\t\tmaxTokens: entry.maxTokens,\n\t\tcompat: entry.compat ?? template?.compat,\n\t\tthinkingLevelMap: entry.thinkingLevelMap ?? template?.thinkingLevelMap,\n\t\theaders: entry.headers ?? template?.headers,\n\t};\n}\n\nexport interface LoadOfficialCatalogOptions {\n\tallowNetwork?: boolean;\n\tcachePath?: string;\n\tbundled?: OfficialCatalogFile;\n\t/** Catalog directory base (not a single-file URL). */\n\turl?: string;\n\ttimeoutMs?: number;\n\tsignal?: AbortSignal;\n\tfetchImpl?: typeof fetch;\n\t/** Stored-credential provider ids. Only these shards are fetched. */\n\tproviderIds?: readonly string[];\n}\n\nfunction fallbackCatalog(bundled: OfficialCatalogFile, cachePath?: string): OfficialCatalogLoadResult {\n\tconst cached = loadCachedOfficialCatalog(cachePath);\n\tif (cached) return { catalog: cached, source: \"cache\" };\n\tif (bundled.models.length > 0) return { catalog: bundled, source: \"bundled\" };\n\treturn { catalog: BUNDLED_OFFICIAL_CATALOG, source: \"bundled\" };\n}\n\nasync function fetchJson(\n\turl: string,\n\toptions: {\n\t\ttimeoutMs: number;\n\t\tsignal?: AbortSignal;\n\t\tfetchImpl: typeof fetch;\n\t\theaders: Record<string, string>;\n\t},\n): Promise<{ ok: true; value: unknown } | { ok: false; status?: number }> {\n\tconst controller = new AbortController();\n\tconst timer = setTimeout(() => controller.abort(), options.timeoutMs);\n\tconst onParentAbort = () => controller.abort();\n\toptions.signal?.addEventListener(\"abort\", onParentAbort, { once: true });\n\tif (options.signal?.aborted) controller.abort();\n\ttry {\n\t\tconst abortError = () => {\n\t\t\tconst error = new Error(\"The operation was aborted\");\n\t\t\terror.name = \"AbortError\";\n\t\t\treturn error;\n\t\t};\n\t\tconst response = await Promise.race([\n\t\t\toptions.fetchImpl(url, {\n\t\t\t\theaders: options.headers,\n\t\t\t\tsignal: controller.signal,\n\t\t\t}),\n\t\t\tnew Promise<never>((_, reject) => {\n\t\t\t\tcontroller.signal.addEventListener(\"abort\", () => reject(abortError()), { once: true });\n\t\t\t\tif (controller.signal.aborted) reject(abortError());\n\t\t\t}),\n\t\t]);\n\t\tif (!response.ok) return { ok: false, status: response.status };\n\t\treturn { ok: true, value: await response.json() };\n\t} catch {\n\t\treturn { ok: false };\n\t} finally {\n\t\tclearTimeout(timer);\n\t\toptions.signal?.removeEventListener(\"abort\", onParentAbort);\n\t}\n}\n\n/**\n * Load the official overlay. Network only when allowNetwork is true.\n * Fetches providers.json, then providers/{id}.json for stored-credential providers.\n * Successful shards replace that provider only; failed shards keep cache/bundled rows.\n * All requested shards failed → cache, then bundled. Never writes a worse cache. Never throws.\n */\nexport async function loadOfficialCatalog(\n\toptions: LoadOfficialCatalogOptions = {},\n): Promise<OfficialCatalogLoadResult> {\n\tconst bundled = options.bundled ?? loadBundledOfficialCatalog();\n\tconst cachePath = options.cachePath;\n\tif (!options.allowNetwork) {\n\t\treturn fallbackCatalog(bundled, cachePath);\n\t}\n\n\tconst timeoutMs = options.timeoutMs ?? OFFICIAL_CATALOG_TIMEOUT_MS;\n\tconst fetchImpl = options.fetchImpl ?? fetch;\n\tconst headers = {\n\t\taccept: \"application/json\",\n\t\t\"User-Agent\": getPiUserAgent(VERSION),\n\t};\n\tconst fetchOptions = { timeoutMs, signal: options.signal, fetchImpl, headers };\n\tconst base = options.url ?? officialCatalogBaseUrl();\n\n\ttry {\n\t\tconst indexResult = await fetchJson(officialCatalogUrlFor(\"providers.json\", base), fetchOptions);\n\t\tif (!indexResult.ok) return fallbackCatalog(bundled, cachePath);\n\t\tconst index = parseProviderIndex(indexResult.value);\n\t\tif (!index) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst wanted = new Set(index);\n\t\tconst requested = options.providerIds ?? [];\n\t\tconst shardIds = requested.filter((providerId) => wanted.has(providerId));\n\t\tif (shardIds.length === 0) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst replacements = new Map<string, OfficialModelEntry[]>();\n\t\tawait Promise.all(\n\t\t\tshardIds.map(async (providerId) => {\n\t\t\t\tconst result = await fetchJson(\n\t\t\t\t\tofficialCatalogUrlFor(`providers/${encodeURIComponent(providerId)}.json`, base),\n\t\t\t\t\tfetchOptions,\n\t\t\t\t);\n\t\t\t\tif (!result.ok) return;\n\t\t\t\tconst parsed = parseOfficialCatalog(result.value);\n\t\t\t\tif (!parsed || parsed.models.length === 0) return;\n\t\t\t\treplacements.set(providerId, parsed.models);\n\t\t\t}),\n\t\t);\n\t\tif (replacements.size === 0) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst catalog = mergeOfficialCatalogByProvider(officialCatalogBase(bundled, cachePath), replacements);\n\t\tif (cachePath) writeOfficialCatalogCache(catalog, cachePath);\n\t\treturn { catalog, source: \"github\" };\n\t} catch {\n\t\treturn fallbackCatalog(bundled, cachePath);\n\t}\n}\n"]}
1
+ {"version":3,"file":"official-catalog.js","sourceRoot":"","sources":["../../src/core/official-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,qHAAqH;AACrH,MAAM,CAAC,MAAM,4BAA4B,GAAG,8DAA8D,CAAC;AAC3G,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAChD,MAAM,CAAC,MAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAE7E,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AACjG,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC;AAsClH,oEAAoE;AACpE,MAAM,CAAC,MAAM,wBAAwB,GAAwB;IAC5D,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,sBAAsB;IACjC,MAAM,EAAE;QACP;YACC,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,oBAAoB;YACzB,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,qBAAqB;YAC9B,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YACxB,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;YAC5D,aAAa,EAAE,MAAM;YACrB,SAAS,EAAE,MAAM;SACjB;KACD;CACD,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,QAAQ,GAAW,WAAW,EAAE,EAAU;IAClF,OAAO,IAAI,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAC;AAAA,CACvD;AAED,4GAA4G;AAC5G,MAAM,UAAU,sBAAsB,CAAC,QAAiB,EAAU;IACjE,MAAM,GAAG,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,IAAI,4BAA4B,CAAC;IACxG,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAAA,CAC/B;AAED,uFAAuF;AACvF,MAAM,UAAU,kBAAkB,GAAW;IAC5C,OAAO,sBAAsB,EAAE,CAAC;AAAA,CAChC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,IAAa,EAAU;IAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;AAAA,CACvD;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,EAAU,EAAU;IAC9D,OAAO,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC;AAAA,CAC3B;AAED,SAAS,QAAQ,CAAC,KAAc,EAAoC;IACnE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAAA,CAC5E;AAED,SAAS,cAAc,CAAC,KAAc,EAAsB;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;IAC5C,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,SAAS,CAAC,KAAc,EAAiC;IACjE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAClE,OAAO;QACN,KAAK;QACL,MAAM;QACN,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;QAC/C,UAAU,EAAE,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;KACjD,CAAC;AAAA,CACF;AAED,SAAS,UAAU,CAAC,KAAc,EAAoC;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CAC5C;AAED,SAAS,qBAAqB,CAAC,KAAc,EAAgC;IAC5E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,mBAAmB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACnD,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;YACpB,GAAG,GAAG,IAAI,CAAC;QACZ,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CAC7B;AAED,SAAS,YAAY,CAAC,KAAc,EAAsC;IACzE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,IAAI,OAAO,WAAW,KAAK,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CAC7D;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAkC;IAC3E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACxG,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAC3F,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,MAA+B,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3F,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO;QACN,EAAE;QACF,IAAI;QACJ,GAAG,EAAE,GAAU;QACf,QAAQ;QACR,OAAO;QACP,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI;QACnC,KAAK;QACL,IAAI;QACJ,aAAa,EAAE,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,MAAM;QAC5D,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI;QAClD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/B,CAAC;AAAA,CACF;AAED,SAAS,WAAW,CAAC,MAA4B,EAAE,KAA+B,EAAuB;IACxG,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,KAAK,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAChH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAAA,CACtC;AAED,SAAS,iBAAiB,CAAC,KAA8B,EAAmC;IAC3F,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACrD,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,SAAS;QACV,CAAC;QACD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC;gBACjC,GAAG,KAAK;gBACR,EAAE,EAAE,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;gBACxE,QAAQ,EAAE,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;aAC5F,CAAC,CAAC;YACH,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CAClE;AAED,2FAA2F;AAC3F,MAAM,UAAU,oBAAoB,CAAC,KAAc,EAAmC;IACrF,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,MAAM,GAAyB,EAAE,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,QAAQ,IAAI,KAAK;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAAA,CAChC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAwB;IACjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAClG,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,eAAe,CAAC,IAAY,EAAmC;IACvE,IAAI,CAAC;QACJ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QACxC,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AAAA,CACD;AAED,SAAS,wBAAwB,GAAa;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,OAAO;QACN,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC;QAClD,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC;QACtD,IAAI,CAAC,IAAI,EAAE,iCAAiC,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QACzB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,sBAAsB,CAAC;QAC3D,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,sBAAsB,CAAC;QAC/D,IAAI,CAAC,IAAI,EAAE,0CAA0C,CAAC;QACtD,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,iCAAiC,CAAC;KAC7C,CAAC;AAAA,CACF;AAED,MAAM,UAAU,0BAA0B,GAAwB;IACjE,KAAK,MAAM,IAAI,IAAI,wBAAwB,EAAE,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC3B,CAAC;IACD,OAAO,wBAAwB,CAAC;AAAA,CAChC;AAED,MAAM,UAAU,yBAAyB,CAAC,SAAkB,EAAmC;IAC9F,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAAA,CAClC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAA4B,EAAE,SAAiB,EAAQ;IAChG,IAAI,CAAC;QACJ,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,aAAa,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACR,wBAAwB;IACzB,CAAC;AAAA,CACD;AAED,MAAM,UAAU,wBAAwB,CAAC,OAA4B,EAAqC;IACzG,MAAM,UAAU,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC3D,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,UAAU,CAAC;AAAA,CAClB;AAED,2FAA2F;AAC3F,MAAM,UAAU,8BAA8B,CAC7C,IAAyB,EACzB,YAAuD,EACvD,SAAkB,EACI;IACtB,MAAM,UAAU,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QACjD,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,OAAO;QACN,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC;QAC1B,SAAS,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAChD,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE;KACvC,CAAC;AAAA,CACF;AAED,yDAAyD;AACzD,MAAM,UAAU,mBAAmB,CAAC,OAA4B,EAAE,SAAkB,EAAuB;IAC1G,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,8BAA8B,CAAC,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;AAAA,CACnG;AAED,wEAAwE;AACxE,MAAM,UAAU,qBAAqB,CACpC,QAA+C,EAC/C,IAA+B,EACH;IAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,QAAQ,EAAE,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACnD,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,MAAM,UAAU,iBAAiB,CAAC,OAA4B,EAAe;IAC5E,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAAA,CAClF;AAED,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;AAEvE,MAAM,UAAU,oBAAoB,CAAC,KAAyB,EAAE,QAAqB,EAAc;IAClG,OAAO;QACN,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,QAAQ,EAAE,GAAG,IAAI,oBAAoB;QACvD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,EAAE;QACjD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3E,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ,EAAE,IAAI,IAAI,SAAS;QAC/C,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,MAAM;QACxC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,QAAQ,EAAE,gBAAgB;QACtE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE,OAAO;KAC3C,CAAC;AAAA,CACF;AAeD,SAAS,qBAAqB,CAAC,OAA6B,EAAuB;IAClF,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,0BAA0B,EAAE,CAAC;AAAA,CACpC;AAED,SAAS,eAAe,CAAC,OAAwC,EAAE,SAAkB,EAA6B;IACjH,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAChF,OAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAAA,CAChE;AAED,KAAK,UAAU,SAAS,CACvB,GAAW,EACX,OAKC,EACwE;IACzE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC/C,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;QAAE,UAAU,CAAC,KAAK,EAAE,CAAC;IAChD,IAAI,CAAC;QACJ,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACrD,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;YAC1B,OAAO,KAAK,CAAC;QAAA,CACb,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YACnC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE;gBACtB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,UAAU,CAAC,MAAM;aACzB,CAAC;YACF,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;gBACjC,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxF,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YAAA,CACpD,CAAC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACV,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC7D,CAAC;AAAA,CACD;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,OAAO,GAA+B,EAAE,EACH;IACrC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,6EAA6E;IAC7E,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC3B,OAAO,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,2BAA2B,CAAC;IACnE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC7C,MAAM,OAAO,GAAG;QACf,MAAM,EAAE,kBAAkB;QAC1B,YAAY,EAAE,cAAc,CAAC,OAAO,CAAC;KACrC,CAAC;IACF,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAErD,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;QACjG,IAAI,CAAC,WAAW,CAAC,EAAE;YAAE,OAAO,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK;YAAE,OAAO,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEtE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAgC,CAAC;QAC7D,MAAM,OAAO,CAAC,GAAG,CAChB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,SAAS,CAC7B,qBAAqB,CAAC,aAAa,kBAAkB,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,EAC/E,YAAY,CACZ,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO;YACvB,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAClD,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAAA,CAC5C,CAAC,CACF,CAAC;QACF,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAExE,MAAM,OAAO,GAAG,8BAA8B,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC;QACtG,IAAI,SAAS;YAAE,yBAAyB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;AAAA,CACD","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Api, Model, ThinkingLevelMap } from \"@ashx-j/lunr-ai\";\nimport { getAgentDir, getPackageDir, VERSION } from \"../config.ts\";\nimport { getPiUserAgent } from \"../utils/pi-user-agent.ts\";\n\n/** Directory on GitHub raw (`providers.json` + `providers/{id}.json`). Override with `LUNR_OFFICIAL_CATALOG_URL`. */\nexport const OFFICIAL_CATALOG_DEFAULT_URL = \"https://raw.githubusercontent.com/ashx-j/lunR/master/catalog\";\nexport const OFFICIAL_CATALOG_TIMEOUT_MS = 4000;\nexport const OFFICIAL_CATALOG_CACHE_FILENAME = \"official-catalog-cache.json\";\n\nconst THINKING_LEVEL_KEYS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nconst META_KEYS = new Set([\"version\", \"updatedAt\", \"generatedAt\", \"sourceCommit\", \"providerCount\", \"modelCount\"]);\n\nexport interface OfficialModelCost {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n}\n\nexport interface OfficialModelEntry {\n\tid: string;\n\tname: string;\n\tapi: Api;\n\tprovider: string;\n\tbaseUrl: string;\n\treasoning: boolean;\n\tinput: (\"text\" | \"image\")[];\n\tcost: OfficialModelCost;\n\tcontextWindow: number;\n\tmaxTokens: number;\n\tcompat?: Model<Api>[\"compat\"];\n\tthinkingLevelMap?: ThinkingLevelMap;\n\theaders?: Record<string, string>;\n}\n\nexport interface OfficialCatalogFile {\n\tversion: number;\n\tupdatedAt: string;\n\tmodels: OfficialModelEntry[];\n}\n\nexport type OfficialCatalogSource = \"github\" | \"cache\" | \"bundled\";\n\nexport interface OfficialCatalogLoadResult {\n\tcatalog: OfficialCatalogFile;\n\tsource: OfficialCatalogSource;\n}\n\n/** Seed shipped in-repo; used when the JSON file cannot be read. */\nexport const BUNDLED_OFFICIAL_CATALOG: OfficialCatalogFile = {\n\tversion: 1,\n\tupdatedAt: \"2026-08-15T00:00:00Z\",\n\tmodels: [\n\t\t{\n\t\t\tid: \"grok-4.6\",\n\t\t\tname: \"Grok 4.6\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"xai\",\n\t\t\tbaseUrl: \"https://api.x.ai/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\", \"image\"],\n\t\t\tcost: { input: 2, output: 6, cacheRead: 0.5, cacheWrite: 0 },\n\t\t\tcontextWindow: 500000,\n\t\t\tmaxTokens: 500000,\n\t\t},\n\t],\n};\n\nexport function officialCatalogCachePath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, OFFICIAL_CATALOG_CACHE_FILENAME);\n}\n\n/** Base URL (no trailing slash). `LUNR_OFFICIAL_CATALOG_URL` overrides the directory, not a single file. */\nexport function officialCatalogBaseUrl(override?: string): string {\n\tconst raw = (override ?? process.env.LUNR_OFFICIAL_CATALOG_URL)?.trim() || OFFICIAL_CATALOG_DEFAULT_URL;\n\treturn raw.replace(/\\/+$/, \"\");\n}\n\n/** @deprecated Use officialCatalogBaseUrl. Kept as an alias for the directory base. */\nexport function officialCatalogUrl(): string {\n\treturn officialCatalogBaseUrl();\n}\n\nexport function officialCatalogUrlFor(path: string, base?: string): string {\n\tconst normalized = path.replace(/^\\/+/, \"\");\n\treturn `${officialCatalogBaseUrl(base)}/${normalized}`;\n}\n\nexport function modelKey(provider: string, id: string): string {\n\treturn `${provider}/${id}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tif (typeof value === \"string\" && value.trim()) {\n\t\tconst parsed = Number(value);\n\t\tif (Number.isFinite(parsed)) return parsed;\n\t}\n\treturn undefined;\n}\n\nfunction parseCost(value: unknown): OfficialModelCost | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst input = asFiniteNumber(value.input);\n\tconst output = asFiniteNumber(value.output);\n\tif (input === undefined || output === undefined) return undefined;\n\treturn {\n\t\tinput,\n\t\toutput,\n\t\tcacheRead: asFiniteNumber(value.cacheRead) ?? 0,\n\t\tcacheWrite: asFiniteNumber(value.cacheWrite) ?? 0,\n\t};\n}\n\nfunction parseInput(value: unknown): (\"text\" | \"image\")[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst input: (\"text\" | \"image\")[] = [];\n\tfor (const entry of value) {\n\t\tif (entry === \"text\" || entry === \"image\") input.push(entry);\n\t}\n\treturn input.length > 0 ? input : undefined;\n}\n\nfunction parseThinkingLevelMap(value: unknown): ThinkingLevelMap | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst map: ThinkingLevelMap = {};\n\tlet any = false;\n\tfor (const level of THINKING_LEVEL_KEYS) {\n\t\tconst mapped = value[level];\n\t\tif (mapped === null || typeof mapped === \"string\") {\n\t\t\tmap[level] = mapped;\n\t\t\tany = true;\n\t\t}\n\t}\n\treturn any ? map : undefined;\n}\n\nfunction parseHeaders(value: unknown): Record<string, string> | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst headers: Record<string, string> = {};\n\tfor (const [name, headerValue] of Object.entries(value)) {\n\t\tif (typeof headerValue === \"string\") headers[name] = headerValue;\n\t}\n\treturn Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction parseOfficialEntry(value: unknown): OfficialModelEntry | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst id = typeof value.id === \"string\" ? value.id.trim() : \"\";\n\tconst provider = typeof value.provider === \"string\" ? value.provider.trim() : \"\";\n\tif (!id || !provider) return undefined;\n\tconst api = typeof value.api === \"string\" && value.api.trim() ? value.api.trim() : \"openai-completions\";\n\tconst name = typeof value.name === \"string\" && value.name.trim() ? value.name.trim() : id;\n\tconst baseUrl = typeof value.baseUrl === \"string\" ? value.baseUrl.trim() : \"\";\n\tconst cost = parseCost(value.cost) ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\tconst input = parseInput(value.input) ?? [\"text\"];\n\tconst compat = isRecord(value.compat) ? (value.compat as Model<Api>[\"compat\"]) : undefined;\n\tconst thinkingLevelMap = parseThinkingLevelMap(value.thinkingLevelMap);\n\tconst headers = parseHeaders(value.headers);\n\treturn {\n\t\tid,\n\t\tname,\n\t\tapi: api as Api,\n\t\tprovider,\n\t\tbaseUrl,\n\t\treasoning: value.reasoning === true,\n\t\tinput,\n\t\tcost,\n\t\tcontextWindow: asFiniteNumber(value.contextWindow) ?? 128000,\n\t\tmaxTokens: asFiniteNumber(value.maxTokens) ?? 8192,\n\t\t...(compat ? { compat } : {}),\n\t\t...(thinkingLevelMap ? { thinkingLevelMap } : {}),\n\t\t...(headers ? { headers } : {}),\n\t};\n}\n\nfunction catalogFile(models: OfficialModelEntry[], value?: Record<string, unknown>): OfficialCatalogFile {\n\tconst version = value ? (asFiniteNumber(value.version) ?? 1) : 1;\n\tconst updatedAt = value && typeof value.updatedAt === \"string\" && value.updatedAt.trim() ? value.updatedAt : \"\";\n\treturn { version, updatedAt, models };\n}\n\nfunction parseKeyedCatalog(value: Record<string, unknown>): OfficialCatalogFile | undefined {\n\tconst models: OfficialModelEntry[] = [];\n\tfor (const [key, entry] of Object.entries(value)) {\n\t\tif (META_KEYS.has(key) || !isRecord(entry)) continue;\n\t\tif (typeof entry.id === \"string\") {\n\t\t\tconst parsed = parseOfficialEntry(entry);\n\t\t\tif (parsed) models.push(parsed);\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const [modelId, model] of Object.entries(entry)) {\n\t\t\tif (!isRecord(model)) continue;\n\t\t\tconst parsed = parseOfficialEntry({\n\t\t\t\t...model,\n\t\t\t\tid: typeof model.id === \"string\" && model.id.trim() ? model.id : modelId,\n\t\t\t\tprovider: typeof model.provider === \"string\" && model.provider.trim() ? model.provider : key,\n\t\t\t});\n\t\t\tif (parsed) models.push(parsed);\n\t\t}\n\t}\n\treturn models.length > 0 ? catalogFile(models, value) : undefined;\n}\n\n/** Parse an official catalog document. Returns undefined on a bad shape (never throws). */\nexport function parseOfficialCatalog(value: unknown): OfficialCatalogFile | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (Array.isArray(value.models)) {\n\t\tconst models: OfficialModelEntry[] = [];\n\t\tfor (const entry of value.models) {\n\t\t\tconst parsed = parseOfficialEntry(entry);\n\t\t\tif (parsed) models.push(parsed);\n\t\t}\n\t\treturn catalogFile(models, value);\n\t}\n\tif (\"models\" in value) return undefined;\n\treturn parseKeyedCatalog(value);\n}\n\nfunction parseProviderIndex(value: unknown): string[] | undefined {\n\tif (!Array.isArray(value) || !value.every((entry) => typeof entry === \"string\")) return undefined;\n\treturn value;\n}\n\nfunction readCatalogFile(path: string): OfficialCatalogFile | undefined {\n\ttry {\n\t\tif (!existsSync(path)) return undefined;\n\t\treturn parseOfficialCatalog(JSON.parse(readFileSync(path, \"utf-8\")));\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction bundledCatalogCandidates(): string[] {\n\tconst here = dirname(fileURLToPath(import.meta.url));\n\tconst packageDir = getPackageDir();\n\treturn [\n\t\tjoin(packageDir, \"dist\", \"catalog\", \"models.json\"),\n\t\tjoin(packageDir, \"..\", \"..\", \"catalog\", \"models.json\"),\n\t\tjoin(here, \"../../../../catalog/models.json\"),\n\t\tjoin(packageDir, \"catalog\", \"models.json\"),\n\t\tjoin(here, \"../catalog/models.json\"),\n\t\tjoin(here, \"models.json\"),\n\t\tjoin(packageDir, \"dist\", \"catalog\", \"official-models.json\"),\n\t\tjoin(packageDir, \"..\", \"..\", \"catalog\", \"official-models.json\"),\n\t\tjoin(here, \"../../../../catalog/official-models.json\"),\n\t\tjoin(here, \"official-models.json\"),\n\t\tjoin(here, \"../catalog/official-models.json\"),\n\t];\n}\n\nexport function loadBundledOfficialCatalog(): OfficialCatalogFile {\n\tfor (const path of bundledCatalogCandidates()) {\n\t\tconst parsed = readCatalogFile(path);\n\t\tif (parsed) return parsed;\n\t}\n\treturn BUNDLED_OFFICIAL_CATALOG;\n}\n\nexport function loadCachedOfficialCatalog(cachePath?: string): OfficialCatalogFile | undefined {\n\tif (!cachePath) return undefined;\n\treturn readCatalogFile(cachePath);\n}\n\nexport function writeOfficialCatalogCache(catalog: OfficialCatalogFile, cachePath: string): void {\n\ttry {\n\t\tmkdirSync(dirname(cachePath), { recursive: true, mode: 0o700 });\n\t\twriteFileSync(cachePath, `${JSON.stringify(catalog, null, 2)}\\n`, \"utf-8\");\n\t} catch {\n\t\t// Cache is best-effort.\n\t}\n}\n\nexport function officialModelsByProvider(catalog: OfficialCatalogFile): Map<string, OfficialModelEntry[]> {\n\tconst byProvider = new Map<string, OfficialModelEntry[]>();\n\tfor (const model of catalog.models) {\n\t\tconst list = byProvider.get(model.provider) ?? [];\n\t\tlist.push(model);\n\t\tbyProvider.set(model.provider, list);\n\t}\n\treturn byProvider;\n}\n\n/** Replace or add per-provider rows. Existing providers not in `replacements` are kept. */\nexport function mergeOfficialCatalogByProvider(\n\tbase: OfficialCatalogFile,\n\treplacements: ReadonlyMap<string, OfficialModelEntry[]>,\n\tupdatedAt?: string,\n): OfficialCatalogFile {\n\tconst byProvider = officialModelsByProvider(base);\n\tfor (const [providerId, models] of replacements) {\n\t\tbyProvider.set(providerId, models);\n\t}\n\treturn {\n\t\tversion: base.version || 1,\n\t\tupdatedAt: updatedAt ?? new Date().toISOString(),\n\t\tmodels: [...byProvider.values()].flat(),\n\t};\n}\n\n/** Bundled as the floor; cache rows win per provider. */\nexport function officialCatalogBase(bundled: OfficialCatalogFile, cachePath?: string): OfficialCatalogFile {\n\tconst cached = loadCachedOfficialCatalog(cachePath);\n\tif (!cached) return bundled;\n\treturn mergeOfficialCatalogByProvider(bundled, officialModelsByProvider(cached), cached.updatedAt);\n}\n\n/** A completed GitHub overlay must not be replaced by cache/bundled. */\nexport function preferOfficialCatalog(\n\tprevious: OfficialCatalogLoadResult | undefined,\n\tnext: OfficialCatalogLoadResult,\n): OfficialCatalogLoadResult {\n\tif (next.source === \"github\") return next;\n\tif (previous?.source === \"github\") return previous;\n\treturn next;\n}\n\nexport function officialModelKeys(catalog: OfficialCatalogFile): Set<string> {\n\treturn new Set(catalog.models.map((model) => modelKey(model.provider, model.id)));\n}\n\nconst ZERO_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\nexport function officialEntryToModel(entry: OfficialModelEntry, template?: Model<Api>): Model<Api> {\n\treturn {\n\t\tid: entry.id,\n\t\tname: entry.name,\n\t\tapi: entry.api || template?.api || \"openai-completions\",\n\t\tprovider: entry.provider,\n\t\tbaseUrl: entry.baseUrl || template?.baseUrl || \"\",\n\t\treasoning: entry.reasoning,\n\t\tinput: entry.input.length > 0 ? entry.input : (template?.input ?? [\"text\"]),\n\t\tcost: entry.cost ?? template?.cost ?? ZERO_COST,\n\t\tcontextWindow: entry.contextWindow,\n\t\tmaxTokens: entry.maxTokens,\n\t\tcompat: entry.compat ?? template?.compat,\n\t\tthinkingLevelMap: entry.thinkingLevelMap ?? template?.thinkingLevelMap,\n\t\theaders: entry.headers ?? template?.headers,\n\t};\n}\n\nexport interface LoadOfficialCatalogOptions {\n\tallowNetwork?: boolean;\n\tcachePath?: string;\n\tbundled?: OfficialCatalogFile;\n\t/** Catalog directory base (not a single-file URL). */\n\turl?: string;\n\ttimeoutMs?: number;\n\tsignal?: AbortSignal;\n\tfetchImpl?: typeof fetch;\n\t/** Stored-credential provider ids. Only these shards are fetched. */\n\tproviderIds?: readonly string[];\n}\n\nfunction resolveBundledCatalog(bundled?: OfficialCatalogFile): OfficialCatalogFile {\n\tif (bundled) return bundled;\n\treturn loadBundledOfficialCatalog();\n}\n\nfunction fallbackCatalog(bundled: OfficialCatalogFile | undefined, cachePath?: string): OfficialCatalogLoadResult {\n\tconst cached = loadCachedOfficialCatalog(cachePath);\n\tif (cached) return { catalog: cached, source: \"cache\" };\n\tconst resolved = resolveBundledCatalog(bundled);\n\tif (resolved.models.length > 0) return { catalog: resolved, source: \"bundled\" };\n\treturn { catalog: BUNDLED_OFFICIAL_CATALOG, source: \"bundled\" };\n}\n\nasync function fetchJson(\n\turl: string,\n\toptions: {\n\t\ttimeoutMs: number;\n\t\tsignal?: AbortSignal;\n\t\tfetchImpl: typeof fetch;\n\t\theaders: Record<string, string>;\n\t},\n): Promise<{ ok: true; value: unknown } | { ok: false; status?: number }> {\n\tconst controller = new AbortController();\n\tconst timer = setTimeout(() => controller.abort(), options.timeoutMs);\n\tconst onParentAbort = () => controller.abort();\n\toptions.signal?.addEventListener(\"abort\", onParentAbort, { once: true });\n\tif (options.signal?.aborted) controller.abort();\n\ttry {\n\t\tconst abortError = () => {\n\t\t\tconst error = new Error(\"The operation was aborted\");\n\t\t\terror.name = \"AbortError\";\n\t\t\treturn error;\n\t\t};\n\t\tconst response = await Promise.race([\n\t\t\toptions.fetchImpl(url, {\n\t\t\t\theaders: options.headers,\n\t\t\t\tsignal: controller.signal,\n\t\t\t}),\n\t\t\tnew Promise<never>((_, reject) => {\n\t\t\t\tcontroller.signal.addEventListener(\"abort\", () => reject(abortError()), { once: true });\n\t\t\t\tif (controller.signal.aborted) reject(abortError());\n\t\t\t}),\n\t\t]);\n\t\tif (!response.ok) return { ok: false, status: response.status };\n\t\treturn { ok: true, value: await response.json() };\n\t} catch {\n\t\treturn { ok: false };\n\t} finally {\n\t\tclearTimeout(timer);\n\t\toptions.signal?.removeEventListener(\"abort\", onParentAbort);\n\t}\n}\n\n/**\n * Load the official overlay. Network only when allowNetwork is true.\n * Fetches providers.json, then providers/{id}.json for stored-credential providers.\n * Successful shards replace that provider only; failed shards keep cache/bundled rows.\n * All requested shards failed → cache, then bundled. Never writes a worse cache. Never throws.\n */\nexport async function loadOfficialCatalog(\n\toptions: LoadOfficialCatalogOptions = {},\n): Promise<OfficialCatalogLoadResult> {\n\tconst cachePath = options.cachePath;\n\t// Cache-only: prefer the on-disk cache and skip parsing bundled models.json.\n\tif (!options.allowNetwork) {\n\t\treturn fallbackCatalog(options.bundled, cachePath);\n\t}\n\n\tconst bundled = resolveBundledCatalog(options.bundled);\n\tconst timeoutMs = options.timeoutMs ?? OFFICIAL_CATALOG_TIMEOUT_MS;\n\tconst fetchImpl = options.fetchImpl ?? fetch;\n\tconst headers = {\n\t\taccept: \"application/json\",\n\t\t\"User-Agent\": getPiUserAgent(VERSION),\n\t};\n\tconst fetchOptions = { timeoutMs, signal: options.signal, fetchImpl, headers };\n\tconst base = options.url ?? officialCatalogBaseUrl();\n\n\ttry {\n\t\tconst indexResult = await fetchJson(officialCatalogUrlFor(\"providers.json\", base), fetchOptions);\n\t\tif (!indexResult.ok) return fallbackCatalog(bundled, cachePath);\n\t\tconst index = parseProviderIndex(indexResult.value);\n\t\tif (!index) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst wanted = new Set(index);\n\t\tconst requested = options.providerIds ?? [];\n\t\tconst shardIds = requested.filter((providerId) => wanted.has(providerId));\n\t\tif (shardIds.length === 0) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst replacements = new Map<string, OfficialModelEntry[]>();\n\t\tawait Promise.all(\n\t\t\tshardIds.map(async (providerId) => {\n\t\t\t\tconst result = await fetchJson(\n\t\t\t\t\tofficialCatalogUrlFor(`providers/${encodeURIComponent(providerId)}.json`, base),\n\t\t\t\t\tfetchOptions,\n\t\t\t\t);\n\t\t\t\tif (!result.ok) return;\n\t\t\t\tconst parsed = parseOfficialCatalog(result.value);\n\t\t\t\tif (!parsed || parsed.models.length === 0) return;\n\t\t\t\treplacements.set(providerId, parsed.models);\n\t\t\t}),\n\t\t);\n\t\tif (replacements.size === 0) return fallbackCatalog(bundled, cachePath);\n\n\t\tconst catalog = mergeOfficialCatalogByProvider(officialCatalogBase(bundled, cachePath), replacements);\n\t\tif (cachePath) writeOfficialCatalogCache(catalog, cachePath);\n\t\treturn { catalog, source: \"github\" };\n\t} catch {\n\t\treturn fallbackCatalog(bundled, cachePath);\n\t}\n}\n"]}
@@ -1,4 +1,7 @@
1
1
  import type { SettingsManager } from "./settings-manager.ts";
2
+ export declare const NETWORK_TIMEOUT_MS = 10000;
3
+ export declare const PACKAGE_INSTALL_TIMEOUT_MS = 30000;
4
+ export declare const SYNC_COMMAND_TIMEOUT_MS = 10000;
2
5
  export interface PathMetadata {
3
6
  source: string;
4
7
  scope: SourceScope;